Skip to content

Commit 3215fe1

Browse files
committed
line hover of ranges
1 parent bce84b1 commit 3215fe1

File tree

7 files changed

+114
-11
lines changed

7 files changed

+114
-11
lines changed

assets/index.less

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535

3636
table {
3737
text-align: center;
38+
border-collapse: collapse;
3839
}
3940
}
4041

@@ -93,9 +94,36 @@
9394
&-in-range > &-inner {
9495
background: fade(blue, 5%);
9596
}
97+
&-range-hover-start,
98+
&-range-hover-end,
99+
&-range-hover {
100+
position: relative;
101+
&::after {
102+
content: '';
103+
position: absolute;
104+
top: 3px;
105+
bottom: 0;
106+
left: 0;
107+
right: 0;
108+
border: 1px solid green;
109+
border-left: 0;
110+
border-right: 0;
111+
pointer-events: none;
112+
}
113+
}
114+
115+
&-range-hover-start::after {
116+
border-left: 1px solid green!important;
117+
}
118+
&-range-hover-end::after {
119+
border-right: 1px solid green!important;
120+
}
121+
96122
&-today > &-inner {
97123
border: 1px solid blue;
98124
}
125+
&-range-start > &-inner,
126+
&-range-end > &-inner,
99127
&-selected > &-inner {
100128
background: fade(blue, 20%);
101129
}

src/PanelContext.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ export interface PanelContextProps {
1212
panelRef?: React.Ref<HTMLDivElement>;
1313
hidePrevBtn?: boolean;
1414
hideNextBtn?: boolean;
15+
onDateMouseEnter?: (date: any) => void;
16+
onDateMouseLeave?: (date: any) => void;
1517
}
1618

1719
const PanelContext = React.createContext<PanelContextProps>({});

src/RangeContext.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as React from 'react';
2-
import { NullableDateType } from './interface';
2+
import { NullableDateType, RangeValue } from './interface';
33

44
export interface FooterSelection {
55
label: string;
@@ -13,6 +13,7 @@ interface RangeContextProps {
1313
* Panel only has one value, this is only style effect.
1414
*/
1515
rangedValue?: [NullableDateType<any>, NullableDateType<any>];
16+
hoverRangedValue?: RangeValue<any>;
1617
inRange?: boolean;
1718
panelPosition?: 'left' | 'right' | false;
1819
}

src/RangePicker.tsx

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,18 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
293293
},
294294
});
295295

296+
// ========================== Hover Range ==========================
297+
const [hoverRangedValue, setHoverRangedValue] = React.useState<
298+
RangeValue<DateType>
299+
>(null);
300+
301+
const onDateMouseEnter = (date: DateType) => {
302+
setHoverRangedValue(updateValues(selectedValue, date, activePickerIndex));
303+
};
304+
const onDateMouseLeave = () => {
305+
setHoverRangedValue(updateValues(selectedValue, null, activePickerIndex));
306+
};
307+
296308
// ============================= Modes =============================
297309
const [mergedModes, setInnerModes] = useMergedState<[PanelMode, PanelMode]>({
298310
value: mode,
@@ -591,11 +603,18 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
591603
panelPosition: 'left' | 'right' | false = false,
592604
panelProps: Partial<PickerPanelProps<DateType>> = {},
593605
) {
606+
let panelHoverRangedValue: RangeValue<DateType> = null;
607+
if (hoverRangedValue && hoverRangedValue[0] && hoverRangedValue[1]) {
608+
panelHoverRangedValue = hoverRangedValue;
609+
}
610+
594611
return (
595612
<RangeContext.Provider
596613
value={{
597614
inRange: true,
598615
panelPosition,
616+
rangedValue: selectedValue,
617+
hoverRangedValue: panelHoverRangedValue,
599618
}}
600619
>
601620
<PickerPanel<DateType>
@@ -730,6 +749,8 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
730749
operationRef,
731750
hideHeader: picker === 'time',
732751
panelRef: panelDivRef,
752+
onDateMouseEnter,
753+
onDateMouseLeave,
733754
}}
734755
>
735756
<PickerTrigger

src/panels/DatePanel/DateBody.tsx

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
} from '../../utils/dateUtil';
1111
import { Locale } from '../../interface';
1212
import RangeContext from '../../RangeContext';
13+
import PanelContext from '../../PanelContext';
1314

1415
export type DateRender<DateType> = (
1516
currentDate: DateType,
@@ -48,7 +49,8 @@ function DateBody<DateType>({
4849
dateRender,
4950
onSelect,
5051
}: DateBodyProps<DateType>) {
51-
const { rangedValue } = React.useContext(RangeContext);
52+
const { rangedValue, hoverRangedValue } = React.useContext(RangeContext);
53+
const { onDateMouseEnter, onDateMouseLeave } = React.useContext(PanelContext);
5254

5355
const datePrefixCls = `${prefixCls}-cell`;
5456
const weekFirstDay = generateConfig.locale.getWeekFirstDay(locale.locale);
@@ -95,10 +97,19 @@ function DateBody<DateType>({
9597
'YYYY-MM-DD',
9698
)}
9799
onClick={() => {
98-
if (disabled) {
99-
return;
100+
if (!disabled) {
101+
onSelect(currentDate);
102+
}
103+
}}
104+
onMouseEnter={() => {
105+
if (!disabled && onDateMouseEnter) {
106+
onDateMouseEnter(currentDate);
107+
}
108+
}}
109+
onMouseLeave={() => {
110+
if (!disabled && onDateMouseLeave) {
111+
onDateMouseLeave(currentDate);
100112
}
101-
onSelect(currentDate);
102113
}}
103114
className={classNames(datePrefixCls, {
104115
[`${datePrefixCls}-disabled`]: disabled,
@@ -123,6 +134,22 @@ function DateBody<DateType>({
123134
rangedValue && rangedValue[1],
124135
currentDate,
125136
),
137+
[`${datePrefixCls}-range-hover`]: isInRange(
138+
generateConfig,
139+
hoverRangedValue && hoverRangedValue[0],
140+
hoverRangedValue && hoverRangedValue[1],
141+
currentDate,
142+
),
143+
[`${datePrefixCls}-range-hover-start`]: isSameDate(
144+
generateConfig,
145+
hoverRangedValue && hoverRangedValue[0],
146+
currentDate,
147+
),
148+
[`${datePrefixCls}-range-hover-end`]: isSameDate(
149+
generateConfig,
150+
hoverRangedValue && hoverRangedValue[1],
151+
currentDate,
152+
),
126153
[`${datePrefixCls}-today`]: isSameDate(
127154
generateConfig,
128155
today,

src/panels/MonthPanel/MonthBody.tsx

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import classNames from 'classnames';
33
import { GenerateConfig } from '../../generate';
44
import { Locale } from '../../interface';
55
import { isSameMonth } from '../../utils/dateUtil';
6+
import PanelContext from '../../PanelContext';
67

78
export const MONTH_COL_COUNT = 3;
89
const MONTH_ROW_COUNT = 4;
@@ -33,6 +34,8 @@ function MonthBody<DateType>({
3334
monthCellRender,
3435
onSelect,
3536
}: MonthBodyProps<DateType>) {
37+
const { onDateMouseEnter, onDateMouseLeave } = React.useContext(PanelContext);
38+
3639
const monthPrefixCls = `${prefixCls}-cell`;
3740
const rows: React.ReactNode[] = [];
3841

@@ -70,10 +73,19 @@ function MonthBody<DateType>({
7073
),
7174
})}
7275
onClick={() => {
73-
if (disabled) {
74-
return;
76+
if (!disabled) {
77+
onSelect(monthDate);
78+
}
79+
}}
80+
onMouseEnter={() => {
81+
if (!disabled && onDateMouseEnter) {
82+
onDateMouseEnter(monthDate);
83+
}
84+
}}
85+
onMouseLeave={() => {
86+
if (!disabled && onDateMouseLeave) {
87+
onDateMouseLeave(monthDate);
7588
}
76-
onSelect(monthDate);
7789
}}
7890
>
7991
{monthCellRender ? (

src/panels/YearPanel/YearBody.tsx

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import classNames from 'classnames';
33
import { GenerateConfig } from '../../generate';
44
import { YEAR_DECADE_COUNT } from '.';
55
import { Locale, NullableDateType } from '../../interface';
6+
import PanelContext from '../../PanelContext';
67

78
export const YEAR_COL_COUNT = 3;
89
const YEAR_ROW_COUNT = 4;
@@ -26,6 +27,8 @@ function YearBody<DateType>({
2627
disabledDate,
2728
onSelect,
2829
}: YearBodyProps<DateType>) {
30+
const { onDateMouseEnter, onDateMouseLeave } = React.useContext(PanelContext);
31+
2932
const yearPrefixCls = `${prefixCls}-cell`;
3033
const rows: React.ReactNode[] = [];
3134

@@ -61,10 +64,19 @@ function YearBody<DateType>({
6164
currentYearNumber === valueYearNumber,
6265
})}
6366
onClick={() => {
64-
if (disabled) {
65-
return;
67+
if (!disabled) {
68+
onSelect(yearDate);
69+
}
70+
}}
71+
onMouseEnter={() => {
72+
if (!disabled && onDateMouseEnter) {
73+
onDateMouseEnter(yearDate);
74+
}
75+
}}
76+
onMouseLeave={() => {
77+
if (!disabled && onDateMouseLeave) {
78+
onDateMouseLeave(yearDate);
6679
}
67-
onSelect(yearDate);
6880
}}
6981
>
7082
<div className={`${yearPrefixCls}-inner`}>{currentYearNumber}</div>

0 commit comments

Comments
 (0)