diff --git a/packages/components/date-picker/DatePicker.tsx b/packages/components/date-picker/DatePicker.tsx index 32b5583ff2..b6aafb6f5d 100644 --- a/packages/components/date-picker/DatePicker.tsx +++ b/packages/components/date-picker/DatePicker.tsx @@ -34,6 +34,7 @@ import type { DateValue, DatePickerYearChangeTrigger, DatePickerMonthChangeTrigger, + PresetDate, } from './type'; import type { TagInputRemoveContext } from '../tag-input'; @@ -368,7 +369,7 @@ export default defineComponent({ } // 预设 - function onPresetClick(presetValue: DateValue | (() => DateValue)) { + function onPresetClick(presetValue: DateValue | (() => DateValue), context: { preset: PresetDate; e: MouseEvent }) { const presetVal = isFunction(presetValue) ? presetValue() : presetValue; onChange?.( formatDate(presetVal, { @@ -385,6 +386,7 @@ export default defineComponent({ format: formatRef.value.format, }); popupVisible.value = false; + props.onPresetClick?.(context); } function onYearChange(nextYear: number) { @@ -462,7 +464,7 @@ export default defineComponent({ popupVisible={!isReadOnly.value && popupVisible.value} valueDisplay={() => renderTNodeJSX('valueDisplay', { params: valueDisplayParams.value })} {...(props.selectInputProps as TdDatePickerProps['selectInputProps'])} - panel={() => } + panel={() => } tagInputProps={{ onRemove: onTagRemoveClick, }} diff --git a/packages/components/date-picker/DateRangePicker.tsx b/packages/components/date-picker/DateRangePicker.tsx index 3aa5a19939..f2b04d5d90 100644 --- a/packages/components/date-picker/DateRangePicker.tsx +++ b/packages/components/date-picker/DateRangePicker.tsx @@ -553,7 +553,7 @@ export default defineComponent({ popupProps={popupProps.value} rangeInputProps={rangeInputProps.value} popupVisible={popupVisible.value} - panel={() => } + panel={() => } /> ); diff --git a/packages/components/date-picker/__tests__/date-picker.test.tsx b/packages/components/date-picker/__tests__/date-picker.test.tsx index 43eb7f098c..73b3fb1d51 100644 --- a/packages/components/date-picker/__tests__/date-picker.test.tsx +++ b/packages/components/date-picker/__tests__/date-picker.test.tsx @@ -56,6 +56,102 @@ describe('DatePicker', () => { expect(wrapper.element).toMatchSnapshot(); }); + it('DatePicker: the presets slot appears when the pop-up panel is opened', async () => { + const presetsSlotId = 'date-picker-presets-slot-content'; + const attachClass = 'date-picker-presets-slot-attach'; + + const wrapper = mount({ + render() { + return ( +
+ + {{ + presets: () => presets, + }} + +
+ ); + }, + }); + + const trigger = wrapper.find('.t-input'); + await trigger.trigger('mousedown'); + await trigger.trigger('mouseup'); + await trigger.trigger('click'); + await nextTick(); + await new Promise((resolve) => setTimeout(resolve, 0)); + + const presetsEl = wrapper.find(`[data-testid="${presetsSlotId}"]`); + expect(presetsEl.exists()).toBe(true); + expect(presetsEl.text()).toBe('presets'); + }); + + it('DatePicker: clicking the preset button triggers preset-click and passes { preset, e }', async () => { + const onPresetClick = vi.fn(); + const attachClass = 'date-picker-preset-click-attach'; + const presets = { today: '2020-12-28', yesterday: '2020-12-27' }; + + const wrapper = mount({ + render() { + return ( +
+ +
+ ); + }, + }); + + const trigger = wrapper.find('.t-input'); + await trigger.trigger('mousedown'); + await trigger.trigger('mouseup'); + await trigger.trigger('click'); + await nextTick(); + await new Promise((resolve) => setTimeout(resolve, 0)); + + const buttons = wrapper.findAll('.t-button'); + const todayButton = buttons.find((b) => b.text() === 'today'); + expect(todayButton).toBeTruthy(); + if (todayButton) await todayButton.trigger('click'); + await nextTick(); + + expect(onPresetClick).toHaveBeenCalledTimes(1); + const context = onPresetClick.mock.calls[0][0]; + expect(context).toHaveProperty('preset'); + expect(context).toHaveProperty('e'); + expect(context.preset).toEqual({ today: '2020-12-28' }); + expect(context.e).toBeInstanceOf(MouseEvent); + }); + + it('DateRangePicker: the presets slot appears when the pop-up panel is opened', async () => { + const presetsSlotId = 'date-range-presets-slot-content'; + const attachClass = 'date-range-presets-test-attach'; + + const wrapper = mount({ + render() { + return ( +
+ + {{ + presets: () => presets, + }} + +
+ ); + }, + }); + + const trigger = wrapper.find('.t-input'); + await trigger.trigger('mousedown'); + await trigger.trigger('mouseup'); + await trigger.trigger('click'); + await nextTick(); + await new Promise((resolve) => setTimeout(resolve, 0)); + + const presetsEl = wrapper.find(`[data-testid="${presetsSlotId}"]`); + expect(presetsEl.exists()).toBe(true); + expect(presetsEl.text()).toBe('presets'); + }); + it("DatePicker: :defaultTime[string] & :valueType['time-stamp'] without enableTimePicker", async () => { // 测试 DatePicker 当 valueType 为 time-stamp 且提供 defaultTime 但不启用 enableTimePicker 时 const defaultTime = '10:30:45'; diff --git a/packages/components/date-picker/_example-ts/date-presets-alt.vue b/packages/components/date-picker/_example-ts/date-presets-alt.vue index d686745cfc..a2e5a7fe61 100644 --- a/packages/components/date-picker/_example-ts/date-presets-alt.vue +++ b/packages/components/date-picker/_example-ts/date-presets-alt.vue @@ -1,5 +1,11 @@