Skip to content

Commit 234a144

Browse files
authored
fix: disabled check auto used for range check (#737)
* test: update test case * test: clean up
1 parent f3c5ec8 commit 234a144

File tree

7 files changed

+98
-53
lines changed

7 files changed

+98
-53
lines changed

docs/examples/debug.tsx

Lines changed: 10 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -129,9 +129,9 @@ export default () => {
129129

130130
const [value, setValue] = React.useState<Dayjs>(null);
131131
const [rangeValue, setRangeValue] = React.useState<[Dayjs, Dayjs]>(
132-
// [dayjs('2000-12-15'), dayjs('2020-12-22')],
132+
[dayjs('2024-01-15'), dayjs('2024-02-01')],
133133
// null,
134-
undefined,
134+
// undefined,
135135
);
136136

137137
const setSingleValue = (nextVal: Dayjs) => {
@@ -146,21 +146,11 @@ export default () => {
146146

147147
<br />
148148

149-
{/* <SinglePicker
149+
<SinglePicker
150150
// Shared
151151
{...sharedLocale}
152-
showTime
153-
format={(val) => val.format('YYYY-MM-DD')}
154-
// format={{
155-
// format: 'YYYY-MM-DD',
156-
// align: true,
157-
// }}
158-
presets={[
159-
{
160-
label: 'Good',
161-
value: () => dayjs().add(3, 'day'),
162-
},
163-
]}
152+
disabledDate={(date) => date.isBefore(dayjs())}
153+
open
164154
ref={singleRef}
165155
suffixIcon="🧶"
166156
onChange={(...args) => {
@@ -179,30 +169,14 @@ export default () => {
179169
onKeyDown={(e) => {
180170
console.log('🎬 KeyDown:', e);
181171
}}
182-
/> */}
172+
/>
183173
<br />
184-
<RangePicker
174+
{/* <RangePicker
185175
{...sharedLocale}
186176
value={rangeValue}
187-
disabledDate={(current, { from }) => {
188-
if (from) {
189-
return Math.abs(current.diff(from, 'days')) > 7;
190-
}
191-
192-
return false;
193-
}}
194-
changeOnBlur={false}
195-
showNow
196-
autoFocus
177+
open
178+
picker="week"
197179
panelRender={(ori) => <>2333{ori}</>}
198-
placeholder={['Start', 'End']}
199-
suffixIcon="🧶"
200-
onFocus={(_, info) => {
201-
console.log('👁️ Focus', info);
202-
}}
203-
onBlur={(_, info) => {
204-
console.log('👁️ Blur', info);
205-
}}
206180
onChange={(val, text) => {
207181
console.log('🔥 Change:', val, text);
208182
setRangeValue(val);
@@ -222,11 +196,7 @@ export default () => {
222196
info,
223197
);
224198
}}
225-
id={{
226-
start: 'inputStart',
227-
end: 'inputEnd',
228-
}}
229-
/>
199+
/> */}
230200
<br />
231201

232202
<button

src/PickerPanel/DecadePanel/index.tsx

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as React from 'react';
2-
import type { SharedPanelProps } from '../../interface';
2+
import type { DisabledDate, SharedPanelProps } from '../../interface';
33
import { formatValue, isSameDecade } from '../../utils/dateUtil';
44
import { PanelContext, useInfo } from '../context';
55
import PanelBody from '../PanelBody';
@@ -8,7 +8,8 @@ import PanelHeader from '../PanelHeader';
88
export default function DecadePanel<DateType extends object = any>(
99
props: SharedPanelProps<DateType>,
1010
) {
11-
const { prefixCls, locale, generateConfig, pickerValue, onPickerValueChange } = props;
11+
const { prefixCls, locale, generateConfig, pickerValue, disabledDate, onPickerValueChange } =
12+
props;
1213

1314
const panelPrefixCls = `${prefixCls}-decade-panel`;
1415

@@ -52,6 +53,25 @@ export default function DecadePanel<DateType extends object = any>(
5253
};
5354
};
5455

56+
// ======================== Disabled ========================
57+
const mergedDisabledDate: DisabledDate<DateType> = disabledDate
58+
? (currentDate, disabledInfo) => {
59+
// Start
60+
const baseStartDate = generateConfig.setDate(currentDate, 1);
61+
const baseStartMonth = generateConfig.setMonth(baseStartDate, 0);
62+
const baseStartYear = generateConfig.setYear(
63+
baseStartMonth,
64+
Math.floor(generateConfig.getYear(baseStartMonth) / 10) * 10,
65+
);
66+
67+
// End
68+
const baseEndYear = generateConfig.addYear(baseStartYear, 10);
69+
const baseEndDate = generateConfig.addDate(baseEndYear, -1);
70+
71+
return disabledDate(baseStartYear, disabledInfo) && disabledDate(baseEndDate, disabledInfo);
72+
}
73+
: null;
74+
5575
// ========================= Header =========================
5676
const yearNode = `${formatValue(startYearDate, {
5777
locale,
@@ -79,6 +99,7 @@ export default function DecadePanel<DateType extends object = any>(
7999
{/* Body */}
80100
<PanelBody
81101
{...props}
102+
disabledDate={mergedDisabledDate}
82103
colNum={3}
83104
rowNum={4}
84105
baseDate={baseDate}

src/PickerPanel/MonthPanel/index.tsx

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,22 @@
11
import * as React from 'react';
2+
import type { DisabledDate, SharedPanelProps } from '../../interface';
23
import { formatValue, isSameMonth } from '../../utils/dateUtil';
3-
import type { SharedPanelProps } from '../../interface';
44
import { PanelContext, useInfo } from '../context';
55
import PanelBody from '../PanelBody';
66
import PanelHeader from '../PanelHeader';
77

88
export default function MonthPanel<DateType extends object = any>(
99
props: SharedPanelProps<DateType>,
1010
) {
11-
const { prefixCls, locale, generateConfig, pickerValue, onPickerValueChange, onModeChange } =
12-
props;
11+
const {
12+
prefixCls,
13+
locale,
14+
generateConfig,
15+
pickerValue,
16+
disabledDate,
17+
onPickerValueChange,
18+
onModeChange,
19+
} = props;
1320

1421
const panelPrefixCls = `${prefixCls}-month-panel`;
1522

@@ -46,6 +53,20 @@ export default function MonthPanel<DateType extends object = any>(
4653
[`${prefixCls}-cell-today`]: isSameMonth(generateConfig, date, now),
4754
});
4855

56+
// ======================== Disabled ========================
57+
const mergedDisabledDate: DisabledDate<DateType> = disabledDate
58+
? (currentDate, disabledInfo) => {
59+
const startDate = generateConfig.setDate(currentDate, 1);
60+
const nextMonthStartDate = generateConfig.setMonth(
61+
startDate,
62+
generateConfig.getMonth(startDate) + 1,
63+
);
64+
const endDate = generateConfig.addDate(nextMonthStartDate, -1);
65+
66+
return disabledDate(startDate, disabledInfo) && disabledDate(endDate, disabledInfo);
67+
}
68+
: null;
69+
4970
// ========================= Header =========================
5071
const yearNode: React.ReactNode = (
5172
<button
@@ -81,6 +102,7 @@ export default function MonthPanel<DateType extends object = any>(
81102
{/* Body */}
82103
<PanelBody
83104
{...props}
105+
disabledDate={mergedDisabledDate}
84106
titleFormat={locale.fieldMonthFormat}
85107
colNum={3}
86108
rowNum={4}

src/PickerPanel/PanelBody.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import classNames from 'classnames';
22
import * as React from 'react';
3+
import type { DisabledDate } from '../interface';
34
import { formatValue, isInRange, isSame } from '../utils/dateUtil';
45
import { PickerHackContext, usePanelContext } from './context';
56

@@ -15,6 +16,8 @@ export interface PanelBodyProps<DateType = any> {
1516
getCellText: (date: DateType) => React.ReactNode;
1617
getCellClassName: (date: DateType) => Record<string, any>;
1718

19+
disabledDate?: DisabledDate<DateType>;
20+
1821
// Used for date panel
1922
headerCells?: React.ReactNode[];
2023

@@ -37,13 +40,14 @@ export default function PanelBody<DateType extends object = any>(props: PanelBod
3740
getCellClassName,
3841
headerCells,
3942
cellSelection = true,
43+
disabledDate,
4044
} = props;
4145

4246
const {
4347
prefixCls,
4448
panelType: type,
4549
now,
46-
disabledDate,
50+
disabledDate: contextDisabledDate,
4751
cellRender,
4852
onHover,
4953
hoverValue,
@@ -54,6 +58,8 @@ export default function PanelBody<DateType extends object = any>(props: PanelBod
5458
onSelect,
5559
} = usePanelContext<DateType>();
5660

61+
const mergedDisabledDate = disabledDate || contextDisabledDate;
62+
5763
const cellPrefixCls = `${prefixCls}-cell`;
5864

5965
// ============================= Context ==============================
@@ -76,7 +82,7 @@ export default function PanelBody<DateType extends object = any>(props: PanelBod
7682
const offset = row * colNum + col;
7783
const currentDate = getCellDate(baseDate, offset);
7884

79-
const disabled = disabledDate?.(currentDate, {
85+
const disabled = mergedDisabledDate?.(currentDate, {
8086
type: type,
8187
});
8288

src/PickerPanel/YearPanel/index.tsx

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as React from 'react';
2-
import type { SharedPanelProps } from '../../interface';
2+
import type { DisabledDate, SharedPanelProps } from '../../interface';
33
import { formatValue, isSameYear } from '../../utils/dateUtil';
44
import { PanelContext, useInfo } from '../context';
55
import PanelBody from '../PanelBody';
@@ -8,8 +8,15 @@ import PanelHeader from '../PanelHeader';
88
export default function YearPanel<DateType extends object = any>(
99
props: SharedPanelProps<DateType>,
1010
) {
11-
const { prefixCls, locale, generateConfig, pickerValue, onPickerValueChange, onModeChange } =
12-
props;
11+
const {
12+
prefixCls,
13+
locale,
14+
generateConfig,
15+
pickerValue,
16+
disabledDate,
17+
onPickerValueChange,
18+
onModeChange,
19+
} = props;
1320

1421
const panelPrefixCls = `${prefixCls}-year-panel`;
1522

@@ -44,6 +51,24 @@ export default function YearPanel<DateType extends object = any>(
4451
};
4552
};
4653

54+
// ======================== Disabled ========================
55+
const mergedDisabledDate: DisabledDate<DateType> = disabledDate
56+
? (currentDate, disabledInfo) => {
57+
// Start
58+
const startMonth = generateConfig.setMonth(currentDate, 0);
59+
const startDate = generateConfig.setDate(startMonth, 1);
60+
61+
// End
62+
const endMonth = generateConfig.setMonth(
63+
currentDate,
64+
generateConfig.getMonth(currentDate) + 1,
65+
);
66+
const enDate = generateConfig.addDate(endMonth, -1);
67+
68+
return disabledDate(startDate, disabledInfo) && disabledDate(enDate, disabledInfo);
69+
}
70+
: null;
71+
4772
// ========================= Header =========================
4873
const yearNode: React.ReactNode = (
4974
<button
@@ -85,6 +110,7 @@ export default function YearPanel<DateType extends object = any>(
85110
{/* Body */}
86111
<PanelBody
87112
{...props}
113+
disabledDate={mergedDisabledDate}
88114
titleFormat={locale.fieldYearFormat}
89115
colNum={3}
90116
rowNum={4}

src/utils/dateUtil.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,8 @@ export function isSameWeek<DateType>(
133133
date2: NullableDateType<DateType>,
134134
) {
135135
return nullableCompare(date1, date2, () => {
136-
const weekStartDate1 = getWeekStartDate(locale, generateConfig, date1);
137-
const weekStartDate2 = getWeekStartDate(locale, generateConfig, date2);
136+
const weekStartDate1 = generateConfig.locale.getWeekFirstDate(locale, date1);
137+
const weekStartDate2 = generateConfig.locale.getWeekFirstDate(locale, date2);
138138

139139
return (
140140
isSameYear(generateConfig, weekStartDate1, weekStartDate2) &&

tests/panel.spec.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ describe('Picker.Panel', () => {
264264
<DayPickerPanel
265265
mode="decade"
266266
onPanelChange={onPanelChange}
267-
disabledDate={(date) => date.year() === 1900}
267+
disabledDate={(date) => 1900 <= date.year() && date.year() <= 1909}
268268
/>,
269269
);
270270

0 commit comments

Comments
 (0)