Skip to content

Commit f303244

Browse files
authored
feat: Week range support hover style (#588)
* feat: support week range * chore: update less * test: add test case
1 parent 8dae2a1 commit f303244

File tree

4 files changed

+107
-23
lines changed

4 files changed

+107
-23
lines changed

assets/index.less

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,21 @@
203203
background: rgba(0, 0, 255, 0.3);
204204
}
205205
}
206+
207+
&-range {
208+
&-hover {
209+
.@{prefix-cls}-cell {
210+
background: rgba(0, 255, 0, 0.1);
211+
}
212+
}
213+
214+
&-start,
215+
&-end {
216+
.@{prefix-cls}-cell {
217+
background: rgba(0, 255, 0, 0.3);
218+
}
219+
}
220+
}
206221
}
207222

208223
.@{prefix-cls}-cell,

src/panels/PanelBody.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import * as React from 'react';
21
import classNames from 'classnames';
3-
import PanelContext from '../PanelContext';
2+
import * as React from 'react';
43
import type { GenerateConfig } from '../generate';
5-
import { getLastDay } from '../utils/timeUtil';
64
import type { PanelMode } from '../interface';
5+
import PanelContext from '../PanelContext';
76
import { getCellDateDisabled } from '../utils/dateUtil';
7+
import { getLastDay } from '../utils/timeUtil';
88

99
export type PanelBodyProps<DateType> = {
1010
prefixCls: string;

src/panels/WeekPanel/index.tsx

Lines changed: 60 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,76 @@
1-
import * as React from 'react';
21
import classNames from 'classnames';
3-
import DatePanel from '../DatePanel';
2+
import * as React from 'react';
43
import type { PanelSharedProps } from '../../interface';
5-
import { isSameWeek } from '../../utils/dateUtil';
4+
import PanelContext from '../../PanelContext';
5+
import RangeContext from '../../RangeContext';
6+
import { getCellDateDisabled, isInRange, isSameWeek } from '../../utils/dateUtil';
7+
import DatePanel from '../DatePanel';
68

79
export type WeekPanelProps<DateType> = PanelSharedProps<DateType>;
810

911
function WeekPanel<DateType>(props: WeekPanelProps<DateType>) {
10-
const { prefixCls, generateConfig, locale, value } = props;
12+
const { prefixCls, generateConfig, locale, value, disabledDate, onSelect } = props;
13+
14+
const { rangedValue, hoverRangedValue } = React.useContext(RangeContext);
15+
const { onDateMouseEnter, onDateMouseLeave } = React.useContext(PanelContext);
16+
17+
const rangeStart = rangedValue?.[0] || hoverRangedValue?.[0];
18+
const rangeEnd = rangedValue?.[1] || hoverRangedValue?.[1];
1119

1220
// Render additional column
1321
const cellPrefixCls = `${prefixCls}-cell`;
14-
const prefixColumn = (date: DateType) => (
15-
<td
16-
key="week"
17-
className={classNames(cellPrefixCls, `${cellPrefixCls}-week`)}
18-
>
19-
{generateConfig.locale.getWeek(locale.locale, date)}
20-
</td>
21-
);
22+
23+
const prefixColumn = (date: DateType) => {
24+
// >>> Additional check for disabled
25+
const disabled = getCellDateDisabled({
26+
cellDate: date,
27+
mode: 'week',
28+
disabledDate,
29+
generateConfig,
30+
});
31+
32+
return (
33+
<td
34+
key="week"
35+
className={classNames(cellPrefixCls, `${cellPrefixCls}-week`)}
36+
// Operation: Same as code in PanelBody
37+
onClick={() => {
38+
if (!disabled) {
39+
onSelect(date, 'mouse');
40+
}
41+
}}
42+
onMouseEnter={() => {
43+
if (!disabled && onDateMouseEnter) {
44+
onDateMouseEnter(date);
45+
}
46+
}}
47+
onMouseLeave={() => {
48+
if (!disabled && onDateMouseLeave) {
49+
onDateMouseLeave(date);
50+
}
51+
}}
52+
>
53+
{generateConfig.locale.getWeek(locale.locale, date)}
54+
</td>
55+
);
56+
};
2257

2358
// Add row className
2459
const rowPrefixCls = `${prefixCls}-week-panel-row`;
25-
const rowClassName = (date: DateType) =>
26-
classNames(rowPrefixCls, {
27-
[`${rowPrefixCls}-selected`]: isSameWeek(
28-
generateConfig,
29-
locale.locale,
30-
value,
31-
date,
32-
),
60+
61+
const rowClassName = (date: DateType) => {
62+
const isRangeStart = isSameWeek(generateConfig, locale.locale, rangeStart, date);
63+
const isRangeEnd = isSameWeek(generateConfig, locale.locale, rangeEnd, date);
64+
return classNames(rowPrefixCls, {
65+
[`${rowPrefixCls}-selected`]: isSameWeek(generateConfig, locale.locale, value, date),
66+
67+
// Patch for hover range
68+
[`${rowPrefixCls}-range-start`]: isRangeStart,
69+
[`${rowPrefixCls}-range-end`]: isRangeEnd,
70+
[`${rowPrefixCls}-range-hover`]:
71+
!isRangeStart && !isRangeEnd && isInRange(generateConfig, rangeStart, rangeEnd, date),
3372
});
73+
};
3474

3575
return (
3676
<DatePanel

tests/range.spec.tsx

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1746,4 +1746,33 @@ describe('Picker.Range', () => {
17461746
});
17471747
mock.mockRestore();
17481748
});
1749+
1750+
it('week range selection style', () => {
1751+
const { container } = render(<MomentRangePicker picker="week" />);
1752+
openPicker(container);
1753+
1754+
function findWeekCell(val: string) {
1755+
const list = document.querySelectorAll('.rc-picker-cell-week');
1756+
return Array.from(list).find((cell) => cell.textContent == val);
1757+
}
1758+
1759+
console.log(document.body.innerHTML);
1760+
1761+
// Start
1762+
fireEvent.mouseEnter(findWeekCell('35'));
1763+
fireEvent.click(findWeekCell('35'));
1764+
fireEvent.mouseLeave(findWeekCell('35'));
1765+
1766+
expect(findWeekCell('35').parentElement).toHaveClass('rc-picker-week-panel-row-range-start');
1767+
1768+
// End Hover
1769+
fireEvent.mouseEnter(findWeekCell('37'));
1770+
expect(findWeekCell('36').parentElement).toHaveClass('rc-picker-week-panel-row-range-hover');
1771+
1772+
// End Click
1773+
fireEvent.click(findWeekCell('37'));
1774+
fireEvent.mouseLeave(findWeekCell('37'));
1775+
1776+
expect(findWeekCell('37').parentElement).toHaveClass('rc-picker-week-panel-row-range-end');
1777+
});
17491778
});

0 commit comments

Comments
 (0)