Skip to content

Commit d02f587

Browse files
committed
feat: Year & Month range picker
1 parent 6f22c7e commit d02f587

File tree

6 files changed

+51
-9
lines changed

6 files changed

+51
-9
lines changed

examples/range.tsx

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ export default () => {
7070
</div>
7171

7272
<div style={{ margin: '0 8px' }}>
73-
<h3>Basic</h3>
73+
<h3>Focus</h3>
7474
<RangePicker<Moment>
7575
{...sharedProps}
7676
locale={zhCN}
@@ -87,11 +87,22 @@ export default () => {
8787
Focus!
8888
</button>
8989
</div>
90+
9091
<div style={{ margin: '0 8px' }}>
91-
<h3>Basic</h3>
92+
<h3>Year</h3>
9293
<RangePicker<Moment> {...sharedProps} locale={zhCN} picker="year" />
9394
</div>
9495

96+
<div style={{ margin: '0 8px' }}>
97+
<h3>Month</h3>
98+
<RangePicker<Moment> {...sharedProps} locale={zhCN} picker="month" />
99+
</div>
100+
101+
<div style={{ margin: '0 8px' }}>
102+
<h3>Week</h3>
103+
<RangePicker<Moment> {...sharedProps} locale={zhCN} picker="week" />
104+
</div>
105+
95106
<div style={{ margin: '0 8px' }}>
96107
<h3>Allow Empty</h3>
97108
<RangePicker<Moment>

src/RangePicker.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,7 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
380380
const startValue = getValue(values, 0);
381381
let endValue = getValue(values, 1);
382382

383+
// Clean up end date when start date is after end date
383384
if (
384385
startValue &&
385386
endValue &&
@@ -388,6 +389,8 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
388389
) {
389390
values = [startValue, null];
390391
endValue = null;
392+
393+
setViewDates(updateValues(viewDates, startValue, 1));
391394
}
392395

393396
setSelectedValue(values);

src/hooks/useCellClassName.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ export default function useCellClassName<DateType>({
1919
) => boolean;
2020
rangedValue?: RangeValue<DateType>;
2121
hoverRangedValue?: RangeValue<DateType>;
22-
today?: DateType;
23-
value?: DateType;
22+
today?: NullableDateType<DateType>;
23+
value?: NullableDateType<DateType>;
2424
}) {
2525
function getClassName(currentDate: DateType) {
2626
return {

src/panels/DatePanel/DateBody.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,8 @@ function DateBody<DateType>({
8181
today,
8282
value,
8383
generateConfig,
84-
rangedValue,
85-
hoverRangedValue,
84+
rangedValue: prefixColumn ? null : rangedValue,
85+
hoverRangedValue: prefixColumn ? null : hoverRangedValue,
8686
isSameCell: (current, target) =>
8787
isSameDate(generateConfig, current, target),
8888
});

src/panels/MonthPanel/MonthBody.tsx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import { GenerateConfig } from '../../generate';
44
import { Locale } from '../../interface';
55
import { isSameMonth } from '../../utils/dateUtil';
66
import PanelContext from '../../PanelContext';
7+
import RangeContext from '../../RangeContext';
8+
import useCellClassName from '../../hooks/useCellClassName';
79

810
export const MONTH_COL_COUNT = 3;
911
const MONTH_ROW_COUNT = 4;
@@ -34,10 +36,22 @@ function MonthBody<DateType>({
3436
monthCellRender,
3537
onSelect,
3638
}: MonthBodyProps<DateType>) {
39+
const { rangedValue, hoverRangedValue } = React.useContext(RangeContext);
3740
const { onDateMouseEnter, onDateMouseLeave } = React.useContext(PanelContext);
3841

3942
const monthPrefixCls = `${prefixCls}-cell`;
43+
44+
// =============================== Month ===============================
4045
const rows: React.ReactNode[] = [];
46+
const getCellClassName = useCellClassName({
47+
cellPrefixCls: monthPrefixCls,
48+
value,
49+
generateConfig,
50+
rangedValue,
51+
hoverRangedValue,
52+
isSameCell: (current, target) =>
53+
isSameMonth(generateConfig, current, target),
54+
});
4155

4256
const monthsLocale: string[] =
4357
locale.shortMonths ||
@@ -71,6 +85,7 @@ function MonthBody<DateType>({
7185
value,
7286
monthDate,
7387
),
88+
...getCellClassName(monthDate),
7489
})}
7590
onClick={() => {
7691
if (!disabled) {

src/panels/YearPanel/YearBody.tsx

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ import { GenerateConfig } from '../../generate';
44
import { YEAR_DECADE_COUNT } from '.';
55
import { Locale, NullableDateType } from '../../interface';
66
import PanelContext from '../../PanelContext';
7+
import useCellClassName from '../../hooks/useCellClassName';
8+
import { isSameYear } from '../../utils/dateUtil';
9+
import RangeContext from '../../RangeContext';
710

811
export const YEAR_COL_COUNT = 3;
912
const YEAR_ROW_COUNT = 4;
@@ -27,12 +30,23 @@ function YearBody<DateType>({
2730
disabledDate,
2831
onSelect,
2932
}: YearBodyProps<DateType>) {
33+
const { rangedValue, hoverRangedValue } = React.useContext(RangeContext);
3034
const { onDateMouseEnter, onDateMouseLeave } = React.useContext(PanelContext);
3135

3236
const yearPrefixCls = `${prefixCls}-cell`;
37+
38+
// =============================== Year ===============================
3339
const rows: React.ReactNode[] = [];
40+
const getCellClassName = useCellClassName<DateType>({
41+
cellPrefixCls: yearPrefixCls,
42+
value,
43+
generateConfig,
44+
rangedValue,
45+
hoverRangedValue,
46+
isSameCell: (current, target) =>
47+
isSameYear(generateConfig, current, target),
48+
});
3449

35-
const valueYearNumber = value ? generateConfig.getYear(value) : null;
3650
const yearNumber = generateConfig.getYear(viewDate);
3751
const startYear =
3852
Math.floor(yearNumber / YEAR_DECADE_COUNT) * YEAR_DECADE_COUNT;
@@ -60,8 +74,7 @@ function YearBody<DateType>({
6074
[`${yearPrefixCls}-disabled`]: disabled,
6175
[`${yearPrefixCls}-in-view`]:
6276
startYear <= currentYearNumber && currentYearNumber <= endYear,
63-
[`${yearPrefixCls}-selected`]:
64-
currentYearNumber === valueYearNumber,
77+
...getCellClassName(yearDate),
6578
})}
6679
onClick={() => {
6780
if (!disabled) {

0 commit comments

Comments
 (0)