From 1e172c41bb233a315e327bd45659e26199c85a4d Mon Sep 17 00:00:00 2001 From: RoxanneF Date: Mon, 26 May 2025 14:54:51 +0800 Subject: [PATCH 01/16] =?UTF-8?q?fix:=20presets=E5=92=8CmaxDate=E7=9A=84?= =?UTF-8?q?=E5=AF=B9=E6=AF=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix: presets和maxDate的比较 --- src/PickerInput/Popup/PresetPanel.tsx | 43 ++++++++++++++++----------- src/PickerInput/Popup/index.tsx | 5 ++++ src/PickerInput/RangePicker.tsx | 1 + src/PickerInput/SinglePicker.tsx | 1 + tests/picker.spec.tsx | 26 ++++++++++++++++ 5 files changed, 59 insertions(+), 17 deletions(-) diff --git a/src/PickerInput/Popup/PresetPanel.tsx b/src/PickerInput/Popup/PresetPanel.tsx index d145cdcc5..857e3fd2c 100644 --- a/src/PickerInput/Popup/PresetPanel.tsx +++ b/src/PickerInput/Popup/PresetPanel.tsx @@ -1,11 +1,13 @@ import * as React from 'react'; import type { ValueDate } from '../../interface'; +import moment from 'moment'; export interface PresetPanelProps { prefixCls: string; presets: ValueDate[]; onClick: (value: ValueType) => void; onHover: (value: ValueType) => void; + maxDate?: dateTy; } function executeValue(value: ValueDate['value']): ValueType { @@ -15,7 +17,7 @@ function executeValue(value: ValueDate['val export default function PresetPanel( props: PresetPanelProps, ) { - const { prefixCls, presets, onClick, onHover } = props; + const { prefixCls, presets, onClick, onHover, maxDate } = props; if (!presets.length) { return null; @@ -24,22 +26,29 @@ export default function PresetPanel( return (
    - {presets.map(({ label, value }, index) => ( -
  • { - onClick(executeValue(value)); - }} - onMouseEnter={() => { - onHover(executeValue(value)); - }} - onMouseLeave={() => { - onHover(null); - }} - > - {label} -
  • - ))} + {presets.map(({ label, value }, index) => { + const isDisabled = moment(value).isAfter(maxDate) || moment(value).isSame(maxDate); + return ( +
  • { + if (!isDisabled) { + onClick(executeValue(value)); + } + }} + onMouseEnter={() => { + if (!isDisabled) { + onHover(executeValue(value)); + } + }} + onMouseLeave={() => { + onHover(null); + }} + > + {label} +
  • + ); + })}
); diff --git a/src/PickerInput/Popup/index.tsx b/src/PickerInput/Popup/index.tsx index af4eb0f43..e2a51f452 100644 --- a/src/PickerInput/Popup/index.tsx +++ b/src/PickerInput/Popup/index.tsx @@ -33,6 +33,8 @@ export interface PopupProps boolean; onOk: VoidFunction; + + maxDate?: DateType; } export default function Popup(props: PopupProps) { @@ -66,6 +68,8 @@ export default function Popup(props: PopupProps(props: PopupProps {/* `any` here since PresetPanel is reused for both Single & Range Picker which means return type is not stable */} + maxDate={maxDate} prefixCls={prefixCls} presets={presets} onClick={onPresetSubmit} diff --git a/src/PickerInput/RangePicker.tsx b/src/PickerInput/RangePicker.tsx index c509e8a00..0293119e3 100644 --- a/src/PickerInput/RangePicker.tsx +++ b/src/PickerInput/RangePicker.tsx @@ -592,6 +592,7 @@ function RangePicker( onNow={onNow} // Render cellRender={onInternalCellRender} + maxDate={maxDate} /> ); diff --git a/src/PickerInput/SinglePicker.tsx b/src/PickerInput/SinglePicker.tsx index 9fe862d84..63ac285d1 100644 --- a/src/PickerInput/SinglePicker.tsx +++ b/src/PickerInput/SinglePicker.tsx @@ -521,6 +521,7 @@ function Picker( onNow={onNow} // Render cellRender={onInternalCellRender} + maxDate={maxDate} /> ); diff --git a/tests/picker.spec.tsx b/tests/picker.spec.tsx index d6751c775..618607f04 100644 --- a/tests/picker.spec.tsx +++ b/tests/picker.spec.tsx @@ -1115,6 +1115,32 @@ describe('Picker.Basic', () => { expect(onChange.mock.calls[0][0].format('YYYY-MM-DD')).toEqual('1990-09-04'); }); + it('presets - disabled does not trigger', () => { + const onChange = jest.fn(); + const onHover = jest.fn(); + + const futureDate = dayjs().add(1, 'day'); + render( + , + ); + + const presetEle = document.querySelector('.rc-picker-presets li'); + + // Hover + fireEvent.mouseEnter(presetEle); + expect(onHover).not.toHaveBeenCalled(); + + // Click + fireEvent.click(presetEle); + expect(onChange).not.toHaveBeenCalled(); + }); + it('presets support callback', () => { const onChange = jest.fn(); const mockPresetValue = jest.fn().mockImplementationOnce(() => getDay('2000-09-03')); From 8ea1389d6dbf12fc0f35ec735d8c49bfa0201cf6 Mon Sep 17 00:00:00 2001 From: RoxanneF Date: Mon, 26 May 2025 18:35:24 +0800 Subject: [PATCH 02/16] =?UTF-8?q?fix:=20presets=E5=92=8CmaxDate=E7=9A=84?= =?UTF-8?q?=E5=AF=B9=E6=AF=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/PickerInput/Popup/PresetPanel.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PickerInput/Popup/PresetPanel.tsx b/src/PickerInput/Popup/PresetPanel.tsx index 857e3fd2c..e520dfe1a 100644 --- a/src/PickerInput/Popup/PresetPanel.tsx +++ b/src/PickerInput/Popup/PresetPanel.tsx @@ -27,7 +27,7 @@ export default function PresetPanel(
    {presets.map(({ label, value }, index) => { - const isDisabled = moment(value).isAfter(maxDate) || moment(value).isSame(maxDate); + const isDisabled = moment(value).isAfter(maxDate); return (
  • Date: Tue, 27 May 2025 20:42:25 +0800 Subject: [PATCH 03/16] =?UTF-8?q?fix:=20presets=E5=92=8CmaxDate=E7=9A=84?= =?UTF-8?q?=E5=AF=B9=E6=AF=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/PickerInput/Popup/PresetPanel.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PickerInput/Popup/PresetPanel.tsx b/src/PickerInput/Popup/PresetPanel.tsx index e520dfe1a..ca219af2e 100644 --- a/src/PickerInput/Popup/PresetPanel.tsx +++ b/src/PickerInput/Popup/PresetPanel.tsx @@ -7,7 +7,7 @@ export interface PresetPanelProps { presets: ValueDate[]; onClick: (value: ValueType) => void; onHover: (value: ValueType) => void; - maxDate?: dateTy; + maxDate?: DateType; } function executeValue(value: ValueDate['value']): ValueType { From 14591abdc754ad2ba6c451b4c29d8fd80fc1c303 Mon Sep 17 00:00:00 2001 From: RoxanneF Date: Wed, 28 May 2025 11:09:24 +0800 Subject: [PATCH 04/16] =?UTF-8?q?fix:=20presets=E5=92=8CmaxDate=E7=9A=84?= =?UTF-8?q?=E5=AF=B9=E6=AF=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/PickerInput/Popup/PresetPanel.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PickerInput/Popup/PresetPanel.tsx b/src/PickerInput/Popup/PresetPanel.tsx index ca219af2e..bce60e3ef 100644 --- a/src/PickerInput/Popup/PresetPanel.tsx +++ b/src/PickerInput/Popup/PresetPanel.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import type { ValueDate } from '../../interface'; import moment from 'moment'; -export interface PresetPanelProps { +export interface PresetPanelProps { prefixCls: string; presets: ValueDate[]; onClick: (value: ValueType) => void; From 65e65df7f17615fe7bf847129c9afe21f09d985b Mon Sep 17 00:00:00 2001 From: RoxanneF Date: Wed, 28 May 2025 14:31:49 +0800 Subject: [PATCH 05/16] =?UTF-8?q?fix:=20presets=E5=92=8CmaxDate=E7=9A=84?= =?UTF-8?q?=E5=AF=B9=E6=AF=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/PickerInput/Popup/PresetPanel.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/PickerInput/Popup/PresetPanel.tsx b/src/PickerInput/Popup/PresetPanel.tsx index bce60e3ef..64de28b9d 100644 --- a/src/PickerInput/Popup/PresetPanel.tsx +++ b/src/PickerInput/Popup/PresetPanel.tsx @@ -1,8 +1,9 @@ import * as React from 'react'; import type { ValueDate } from '../../interface'; +import type { MomentInput } from 'moment'; import moment from 'moment'; -export interface PresetPanelProps { +export interface PresetPanelProps { prefixCls: string; presets: ValueDate[]; onClick: (value: ValueType) => void; From dac6b700a6a2417e8e434ffc0a9ff14e54c2e326 Mon Sep 17 00:00:00 2001 From: RoxanneF Date: Mon, 26 May 2025 14:54:51 +0800 Subject: [PATCH 06/16] =?UTF-8?q?fix:=20presets=E5=92=8CmaxDate=E7=9A=84?= =?UTF-8?q?=E5=AF=B9=E6=AF=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix: presets和maxDate的比较 --- src/PickerInput/Popup/PresetPanel.tsx | 43 ++++++++++++++++----------- src/PickerInput/Popup/index.tsx | 4 +++ src/PickerInput/RangePicker.tsx | 1 + src/PickerInput/SinglePicker.tsx | 1 + tests/picker.spec.tsx | 26 ++++++++++++++++ 5 files changed, 58 insertions(+), 17 deletions(-) diff --git a/src/PickerInput/Popup/PresetPanel.tsx b/src/PickerInput/Popup/PresetPanel.tsx index d145cdcc5..857e3fd2c 100644 --- a/src/PickerInput/Popup/PresetPanel.tsx +++ b/src/PickerInput/Popup/PresetPanel.tsx @@ -1,11 +1,13 @@ import * as React from 'react'; import type { ValueDate } from '../../interface'; +import moment from 'moment'; export interface PresetPanelProps { prefixCls: string; presets: ValueDate[]; onClick: (value: ValueType) => void; onHover: (value: ValueType) => void; + maxDate?: dateTy; } function executeValue(value: ValueDate['value']): ValueType { @@ -15,7 +17,7 @@ function executeValue(value: ValueDate['val export default function PresetPanel( props: PresetPanelProps, ) { - const { prefixCls, presets, onClick, onHover } = props; + const { prefixCls, presets, onClick, onHover, maxDate } = props; if (!presets.length) { return null; @@ -24,22 +26,29 @@ export default function PresetPanel( return (
      - {presets.map(({ label, value }, index) => ( -
    • { - onClick(executeValue(value)); - }} - onMouseEnter={() => { - onHover(executeValue(value)); - }} - onMouseLeave={() => { - onHover(null); - }} - > - {label} -
    • - ))} + {presets.map(({ label, value }, index) => { + const isDisabled = moment(value).isAfter(maxDate) || moment(value).isSame(maxDate); + return ( +
    • { + if (!isDisabled) { + onClick(executeValue(value)); + } + }} + onMouseEnter={() => { + if (!isDisabled) { + onHover(executeValue(value)); + } + }} + onMouseLeave={() => { + onHover(null); + }} + > + {label} +
    • + ); + })}
    ); diff --git a/src/PickerInput/Popup/index.tsx b/src/PickerInput/Popup/index.tsx index b68fdf2af..32faa283a 100644 --- a/src/PickerInput/Popup/index.tsx +++ b/src/PickerInput/Popup/index.tsx @@ -45,6 +45,7 @@ export interface PopupProps; + maxDate?: DateType; } export default function Popup(props: PopupProps) { @@ -79,6 +80,8 @@ export default function Popup(props: PopupProps(props: PopupProps {/* `any` here since PresetPanel is reused for both Single & Range Picker which means return type is not stable */} + maxDate={maxDate} prefixCls={prefixCls} presets={presets} onClick={onPresetSubmit} diff --git a/src/PickerInput/RangePicker.tsx b/src/PickerInput/RangePicker.tsx index 7a0b57839..f47fd1f9c 100644 --- a/src/PickerInput/RangePicker.tsx +++ b/src/PickerInput/RangePicker.tsx @@ -621,6 +621,7 @@ function RangePicker( onNow={onNow} // Render cellRender={onInternalCellRender} + maxDate={maxDate} /> ); diff --git a/src/PickerInput/SinglePicker.tsx b/src/PickerInput/SinglePicker.tsx index c773fbd09..33187356b 100644 --- a/src/PickerInput/SinglePicker.tsx +++ b/src/PickerInput/SinglePicker.tsx @@ -534,6 +534,7 @@ function Picker( onNow={onNow} // Render cellRender={onInternalCellRender} + maxDate={maxDate} /> ); diff --git a/tests/picker.spec.tsx b/tests/picker.spec.tsx index b3a40e10f..41a15313f 100644 --- a/tests/picker.spec.tsx +++ b/tests/picker.spec.tsx @@ -1197,6 +1197,32 @@ describe('Picker.Basic', () => { expect(onChange.mock.calls[0][0].format('YYYY-MM-DD')).toEqual('1990-09-04'); }); + it('presets - disabled does not trigger', () => { + const onChange = jest.fn(); + const onHover = jest.fn(); + + const futureDate = dayjs().add(1, 'day'); + render( + , + ); + + const presetEle = document.querySelector('.rc-picker-presets li'); + + // Hover + fireEvent.mouseEnter(presetEle); + expect(onHover).not.toHaveBeenCalled(); + + // Click + fireEvent.click(presetEle); + expect(onChange).not.toHaveBeenCalled(); + }); + it('presets support callback', () => { const onChange = jest.fn(); const mockPresetValue = jest.fn().mockImplementationOnce(() => getDay('2000-09-03')); From 193a8a02790e39a0196d19a59040a244bbe97e72 Mon Sep 17 00:00:00 2001 From: RoxanneF Date: Mon, 26 May 2025 18:35:24 +0800 Subject: [PATCH 07/16] =?UTF-8?q?fix:=20presets=E5=92=8CmaxDate=E7=9A=84?= =?UTF-8?q?=E5=AF=B9=E6=AF=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/PickerInput/Popup/PresetPanel.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PickerInput/Popup/PresetPanel.tsx b/src/PickerInput/Popup/PresetPanel.tsx index 857e3fd2c..e520dfe1a 100644 --- a/src/PickerInput/Popup/PresetPanel.tsx +++ b/src/PickerInput/Popup/PresetPanel.tsx @@ -27,7 +27,7 @@ export default function PresetPanel(
      {presets.map(({ label, value }, index) => { - const isDisabled = moment(value).isAfter(maxDate) || moment(value).isSame(maxDate); + const isDisabled = moment(value).isAfter(maxDate); return (
    • Date: Tue, 27 May 2025 20:42:25 +0800 Subject: [PATCH 08/16] =?UTF-8?q?fix:=20presets=E5=92=8CmaxDate=E7=9A=84?= =?UTF-8?q?=E5=AF=B9=E6=AF=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/PickerInput/Popup/PresetPanel.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PickerInput/Popup/PresetPanel.tsx b/src/PickerInput/Popup/PresetPanel.tsx index e520dfe1a..ca219af2e 100644 --- a/src/PickerInput/Popup/PresetPanel.tsx +++ b/src/PickerInput/Popup/PresetPanel.tsx @@ -7,7 +7,7 @@ export interface PresetPanelProps { presets: ValueDate[]; onClick: (value: ValueType) => void; onHover: (value: ValueType) => void; - maxDate?: dateTy; + maxDate?: DateType; } function executeValue(value: ValueDate['value']): ValueType { From fbfa7513c2fd0de1d8293f1f113c601bc6eafd55 Mon Sep 17 00:00:00 2001 From: RoxanneF Date: Wed, 28 May 2025 11:09:24 +0800 Subject: [PATCH 09/16] =?UTF-8?q?fix:=20presets=E5=92=8CmaxDate=E7=9A=84?= =?UTF-8?q?=E5=AF=B9=E6=AF=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/PickerInput/Popup/PresetPanel.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PickerInput/Popup/PresetPanel.tsx b/src/PickerInput/Popup/PresetPanel.tsx index ca219af2e..bce60e3ef 100644 --- a/src/PickerInput/Popup/PresetPanel.tsx +++ b/src/PickerInput/Popup/PresetPanel.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import type { ValueDate } from '../../interface'; import moment from 'moment'; -export interface PresetPanelProps { +export interface PresetPanelProps { prefixCls: string; presets: ValueDate[]; onClick: (value: ValueType) => void; From 68aaf81f7282c1f37b4b4c4b6354113490d9abdd Mon Sep 17 00:00:00 2001 From: RoxanneF Date: Wed, 28 May 2025 14:31:49 +0800 Subject: [PATCH 10/16] =?UTF-8?q?fix:=20presets=E5=92=8CmaxDate=E7=9A=84?= =?UTF-8?q?=E5=AF=B9=E6=AF=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/PickerInput/Popup/PresetPanel.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/PickerInput/Popup/PresetPanel.tsx b/src/PickerInput/Popup/PresetPanel.tsx index bce60e3ef..64de28b9d 100644 --- a/src/PickerInput/Popup/PresetPanel.tsx +++ b/src/PickerInput/Popup/PresetPanel.tsx @@ -1,8 +1,9 @@ import * as React from 'react'; import type { ValueDate } from '../../interface'; +import type { MomentInput } from 'moment'; import moment from 'moment'; -export interface PresetPanelProps { +export interface PresetPanelProps { prefixCls: string; presets: ValueDate[]; onClick: (value: ValueType) => void; From 7fc89fe8b696ec2a7829f055472eb8dceae76357 Mon Sep 17 00:00:00 2001 From: RoxanneF Date: Thu, 29 May 2025 15:24:58 +0800 Subject: [PATCH 11/16] =?UTF-8?q?fix:=20presets=E5=92=8CmaxDate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/PickerInput/Popup/PresetPanel.tsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/PickerInput/Popup/PresetPanel.tsx b/src/PickerInput/Popup/PresetPanel.tsx index 64de28b9d..4f02270fe 100644 --- a/src/PickerInput/Popup/PresetPanel.tsx +++ b/src/PickerInput/Popup/PresetPanel.tsx @@ -1,9 +1,8 @@ import * as React from 'react'; import type { ValueDate } from '../../interface'; -import type { MomentInput } from 'moment'; import moment from 'moment'; -export interface PresetPanelProps { +export interface PresetPanelProps { prefixCls: string; presets: ValueDate[]; onClick: (value: ValueType) => void; @@ -28,7 +27,11 @@ export default function PresetPanel(
        {presets.map(({ label, value }, index) => { - const isDisabled = moment(value).isAfter(maxDate); + const isDisabled = + maxDate && moment.isMoment(maxDate) + ? moment(typeof value === 'function' ? value() : value).isAfter(maxDate) + : false; + return (
      • Date: Thu, 29 May 2025 15:55:07 +0800 Subject: [PATCH 12/16] =?UTF-8?q?fix:=20preset=20=E5=92=8CmaxDate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/PickerInput/Popup/index.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/PickerInput/Popup/index.tsx b/src/PickerInput/Popup/index.tsx index 6ae16449c..0a3d3c866 100644 --- a/src/PickerInput/Popup/index.tsx +++ b/src/PickerInput/Popup/index.tsx @@ -43,8 +43,6 @@ export interface PopupProps boolean; onOk: VoidFunction; - - maxDate?: DateType; onPanelMouseDown?: React.MouseEventHandler; maxDate?: DateType; } From 56184393fbe9bf8034cb398cf55b1242dff74d68 Mon Sep 17 00:00:00 2001 From: RoxanneF Date: Thu, 29 May 2025 16:00:51 +0800 Subject: [PATCH 13/16] =?UTF-8?q?fix:=20presets=E5=92=8CmaxDate=E5=AF=B9?= =?UTF-8?q?=E6=AF=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/picker.spec.tsx | 6 ------ 1 file changed, 6 deletions(-) diff --git a/tests/picker.spec.tsx b/tests/picker.spec.tsx index 41a15313f..07eb8338f 100644 --- a/tests/picker.spec.tsx +++ b/tests/picker.spec.tsx @@ -1199,13 +1199,11 @@ describe('Picker.Basic', () => { it('presets - disabled does not trigger', () => { const onChange = jest.fn(); - const onHover = jest.fn(); const futureDate = dayjs().add(1, 'day'); render( { const presetEle = document.querySelector('.rc-picker-presets li'); - // Hover - fireEvent.mouseEnter(presetEle); - expect(onHover).not.toHaveBeenCalled(); - // Click fireEvent.click(presetEle); expect(onChange).not.toHaveBeenCalled(); From f4e2ad821eb14a3a2fcb671da9ed0ec1c285c55b Mon Sep 17 00:00:00 2001 From: RoxanneF Date: Fri, 30 May 2025 14:59:41 +0800 Subject: [PATCH 14/16] =?UTF-8?q?fix:=20preset=E5=92=8CmaxDate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/picker.spec.tsx | 146 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 137 insertions(+), 9 deletions(-) diff --git a/tests/picker.spec.tsx b/tests/picker.spec.tsx index 07eb8338f..40177035c 100644 --- a/tests/picker.spec.tsx +++ b/tests/picker.spec.tsx @@ -1,7 +1,6 @@ /* eslint-disable @typescript-eslint/no-loop-func */ import { act, createEvent, fireEvent, render } from '@testing-library/react'; -import type { Dayjs } from 'dayjs'; -import dayjs from 'dayjs'; +import dayjs, { type Dayjs } from 'dayjs'; import moment from 'moment'; import 'moment/locale/zh-cn'; import KeyCode from '@rc-component/util/lib/KeyCode'; @@ -1197,24 +1196,153 @@ describe('Picker.Basic', () => { expect(onChange.mock.calls[0][0].format('YYYY-MM-DD')).toEqual('1990-09-04'); }); - it('presets - disabled does not trigger', () => { + it('presets - trigger', () => { const onChange = jest.fn(); + const mockHover = jest.fn(); - const futureDate = dayjs().add(1, 'day'); + const yesterday = dayjs().subtract(1, 'day'); render( & { onHover?: (date: Dayjs | null) => void })} />, ); const presetEle = document.querySelector('.rc-picker-presets li'); + if (!presetEle) throw new Error('Preset element not found'); + + fireEvent.click(presetEle); + expect(onChange).toHaveBeenCalled(); + + fireEvent.mouseEnter(presetEle); + // expect(mockHover).toHaveBeenCalled(); + }); + + it('should not trigger onClick when preset date is after maxDate', () => { + const onChange = jest.fn(); + const mockHover = jest.fn(); + const futureDate = moment().add(1, 'day'); + render( + & { onHover?: (date: Dayjs | null) => void })} + />, + ); + + const presetEle = document.querySelector('.rc-picker-presets li'); + if (!presetEle) throw new Error('Preset element not found'); - // Click fireEvent.click(presetEle); expect(onChange).not.toHaveBeenCalled(); + + fireEvent.mouseEnter(presetEle); + expect(mockHover).not.toHaveBeenCalled(); + }); + + it('should not render presets when presets is empty', () => { + const mockHover = jest.fn(); + const mockChange = jest.fn(); + + render( + & { + onHover?: (date: dayjs.Dayjs | null) => void; + })} + />, + ); + + // 用 DOM 判断是否渲染了 presets + const presetEle = document.querySelector('.rc-picker-presets li'); + + if (!presetEle) throw new Error('Preset element not found'); + + fireEvent.click(presetEle); + expect(mockChange).toHaveBeenCalled(); + }); + + it('should not render presets when presets is function', () => { + const mockHover = jest.fn(); + const mockChange = jest.fn(); + + render( + dayjs().subtract(1, 'day') }], + } as React.ComponentProps & { + onHover?: (date: dayjs.Dayjs | null) => void; + })} + />, + ); + + // 用 DOM 判断是否渲染了 presets + const presetEle = document.querySelector('.rc-picker-presets li'); + + if (!presetEle) throw new Error('Preset element not found'); + + fireEvent.click(presetEle); + expect(mockChange).toHaveBeenCalled(); + }); + + it('should allow click when maxDate is not a moment object', () => { + const onChange = jest.fn(); + + render( + )} + />, + ); + + const presetEle = document.querySelector('.rc-picker-presets li'); + if (!presetEle) throw new Error('Preset element not found'); + + fireEvent.click(presetEle); + expect(onChange).toHaveBeenCalled(); // ✅ 应该能调用 + }); + + it('should allow click when maxDate is not provided', () => { + const onChange = jest.fn(); + + render( + )} + />, + ); + + const presetEle = document.querySelector('.rc-picker-presets li'); + if (!presetEle) throw new Error('Preset element not found'); + + fireEvent.click(presetEle); + expect(onChange).toHaveBeenCalled(); // ✅ 应该能调用 }); it('presets support callback', () => { From 3a76aa66dbb6b569833100fa8a759caa62fc6be2 Mon Sep 17 00:00:00 2001 From: RoxanneF Date: Tue, 3 Jun 2025 16:43:15 +0800 Subject: [PATCH 15/16] =?UTF-8?q?fix:=20presets=E5=92=8CmaxDate=E5=AF=B9?= =?UTF-8?q?=E6=AF=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/picker.spec.tsx | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/tests/picker.spec.tsx b/tests/picker.spec.tsx index 40177035c..5e23a90f7 100644 --- a/tests/picker.spec.tsx +++ b/tests/picker.spec.tsx @@ -1226,16 +1226,18 @@ describe('Picker.Basic', () => { it('should not trigger onClick when preset date is after maxDate', () => { const onChange = jest.fn(); const mockHover = jest.fn(); - const futureDate = moment().add(1, 'day'); + const futureDate = dayjs().add(1, 'day'); // 使用 dayjs 替代 moment + const maxDate = dayjs(); // + const onHover = mockHover as jest.MockedFunction<(date: Dayjs | null) => void>; render( & { onHover?: (date: Dayjs | null) => void })} + maxDate, + }} />, ); @@ -1252,17 +1254,16 @@ describe('Picker.Basic', () => { it('should not render presets when presets is empty', () => { const mockHover = jest.fn(); const mockChange = jest.fn(); + const onHover = mockHover as jest.MockedFunction<(date: Dayjs | null) => void>; render( & { - onHover?: (date: dayjs.Dayjs | null) => void; - })} + }} />, ); @@ -1278,18 +1279,16 @@ describe('Picker.Basic', () => { it('should not render presets when presets is function', () => { const mockHover = jest.fn(); const mockChange = jest.fn(); - + const onHover = mockHover as jest.MockedFunction<(date: Dayjs | null) => void>; render( dayjs().subtract(1, 'day') }], - } as React.ComponentProps & { - onHover?: (date: dayjs.Dayjs | null) => void; - })} + }} />, ); From 201eb0bc1ec6593ac14d340a212bacc8afcb421f Mon Sep 17 00:00:00 2001 From: RoxanneF Date: Tue, 3 Jun 2025 20:04:17 +0800 Subject: [PATCH 16/16] =?UTF-8?q?fix:=20presets=E5=92=8CmaxDate=E7=9A=84?= =?UTF-8?q?=E5=A4=A7=E5=B0=8F=E6=AF=94=E8=BE=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/PickerInput/Popup/PresetPanel.tsx | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/PickerInput/Popup/PresetPanel.tsx b/src/PickerInput/Popup/PresetPanel.tsx index 4f02270fe..42d318d44 100644 --- a/src/PickerInput/Popup/PresetPanel.tsx +++ b/src/PickerInput/Popup/PresetPanel.tsx @@ -27,10 +27,13 @@ export default function PresetPanel(
          {presets.map(({ label, value }, index) => { - const isDisabled = - maxDate && moment.isMoment(maxDate) - ? moment(typeof value === 'function' ? value() : value).isAfter(maxDate) - : false; + // const isDisabled = + // maxDate && moment.isMoment(maxDate) + // ? moment(typeof value === 'function' ? value() : value).isAfter(maxDate) + // : false; + const isDisabled = maxDate + ? moment(typeof value === 'function' ? value() : value).isAfter(maxDate) + : false; return (