Skip to content

Commit 1e172c4

Browse files
committed
fix: presets和maxDate的对比
fix: presets和maxDate的比较
1 parent ac9c87b commit 1e172c4

File tree

5 files changed

+59
-17
lines changed

5 files changed

+59
-17
lines changed

src/PickerInput/Popup/PresetPanel.tsx

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import * as React from 'react';
22
import type { ValueDate } from '../../interface';
3+
import moment from 'moment';
34

45
export interface PresetPanelProps<ValueType = any> {
56
prefixCls: string;
67
presets: ValueDate<ValueType>[];
78
onClick: (value: ValueType) => void;
89
onHover: (value: ValueType) => void;
10+
maxDate?: dateTy;
911
}
1012

1113
function executeValue<ValueType extends object>(value: ValueDate<ValueType>['value']): ValueType {
@@ -15,7 +17,7 @@ function executeValue<ValueType extends object>(value: ValueDate<ValueType>['val
1517
export default function PresetPanel<DateType extends object = any>(
1618
props: PresetPanelProps<DateType>,
1719
) {
18-
const { prefixCls, presets, onClick, onHover } = props;
20+
const { prefixCls, presets, onClick, onHover, maxDate } = props;
1921

2022
if (!presets.length) {
2123
return null;
@@ -24,22 +26,29 @@ export default function PresetPanel<DateType extends object = any>(
2426
return (
2527
<div className={`${prefixCls}-presets`}>
2628
<ul>
27-
{presets.map(({ label, value }, index) => (
28-
<li
29-
key={index}
30-
onClick={() => {
31-
onClick(executeValue(value));
32-
}}
33-
onMouseEnter={() => {
34-
onHover(executeValue(value));
35-
}}
36-
onMouseLeave={() => {
37-
onHover(null);
38-
}}
39-
>
40-
{label}
41-
</li>
42-
))}
29+
{presets.map(({ label, value }, index) => {
30+
const isDisabled = moment(value).isAfter(maxDate) || moment(value).isSame(maxDate);
31+
return (
32+
<li
33+
key={index}
34+
onClick={() => {
35+
if (!isDisabled) {
36+
onClick(executeValue(value));
37+
}
38+
}}
39+
onMouseEnter={() => {
40+
if (!isDisabled) {
41+
onHover(executeValue(value));
42+
}
43+
}}
44+
onMouseLeave={() => {
45+
onHover(null);
46+
}}
47+
>
48+
{label}
49+
</li>
50+
);
51+
})}
4352
</ul>
4453
</div>
4554
);

src/PickerInput/Popup/index.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ export interface PopupProps<DateType extends object = any, PresetValue = DateTyp
3333
needConfirm: boolean;
3434
isInvalid: (date: DateType | DateType[]) => boolean;
3535
onOk: VoidFunction;
36+
37+
maxDate?: DateType;
3638
}
3739

3840
export default function Popup<DateType extends object = any>(props: PopupProps<DateType>) {
@@ -66,6 +68,8 @@ export default function Popup<DateType extends object = any>(props: PopupProps<D
6668
defaultOpenValue,
6769
onOk,
6870
onSubmit,
71+
72+
maxDate,
6973
} = props;
7074

7175
const { prefixCls } = React.useContext(PickerContext);
@@ -144,6 +148,7 @@ export default function Popup<DateType extends object = any>(props: PopupProps<D
144148
<div className={`${prefixCls}-panel-layout`}>
145149
{/* `any` here since PresetPanel is reused for both Single & Range Picker which means return type is not stable */}
146150
<PresetPanel<any>
151+
maxDate={maxDate}
147152
prefixCls={prefixCls}
148153
presets={presets}
149154
onClick={onPresetSubmit}

src/PickerInput/RangePicker.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,7 @@ function RangePicker<DateType extends object = any>(
592592
onNow={onNow}
593593
// Render
594594
cellRender={onInternalCellRender}
595+
maxDate={maxDate}
595596
/>
596597
);
597598

src/PickerInput/SinglePicker.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -521,6 +521,7 @@ function Picker<DateType extends object = any>(
521521
onNow={onNow}
522522
// Render
523523
cellRender={onInternalCellRender}
524+
maxDate={maxDate}
524525
/>
525526
);
526527

tests/picker.spec.tsx

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1115,6 +1115,32 @@ describe('Picker.Basic', () => {
11151115
expect(onChange.mock.calls[0][0].format('YYYY-MM-DD')).toEqual('1990-09-04');
11161116
});
11171117

1118+
it('presets - disabled does not trigger', () => {
1119+
const onChange = jest.fn();
1120+
const onHover = jest.fn();
1121+
1122+
const futureDate = dayjs().add(1, 'day');
1123+
render(
1124+
<DayPicker
1125+
onChange={onChange}
1126+
onHover={onHover}
1127+
open
1128+
presets={[{ label: 'Future', value: futureDate }]}
1129+
maxDate={dayjs()} // maxDate 是今天,futureDate 是明天,禁用
1130+
/>,
1131+
);
1132+
1133+
const presetEle = document.querySelector('.rc-picker-presets li');
1134+
1135+
// Hover
1136+
fireEvent.mouseEnter(presetEle);
1137+
expect(onHover).not.toHaveBeenCalled();
1138+
1139+
// Click
1140+
fireEvent.click(presetEle);
1141+
expect(onChange).not.toHaveBeenCalled();
1142+
});
1143+
11181144
it('presets support callback', () => {
11191145
const onChange = jest.fn();
11201146
const mockPresetValue = jest.fn().mockImplementationOnce(() => getDay('2000-09-03'));

0 commit comments

Comments
 (0)