diff --git a/frontend/src/components/form/DateTimePicker.tsx b/frontend/src/components/form/DateTimePicker.tsx index 714687d14..f407e2b6f 100644 --- a/frontend/src/components/form/DateTimePicker.tsx +++ b/frontend/src/components/form/DateTimePicker.tsx @@ -121,7 +121,9 @@ export default function DateTimePicker({ onChange(next || null)} + onCalendarChange={(next) => onChange((Array.isArray(next) ? next[0] : next) || null)} showTime={showTime ? { format: 'HH:mm:ss' } : false} + needConfirm={false} format={format} placeholder={placeholder} disabled={disabled} diff --git a/frontend/src/test/date-time-picker.test.tsx b/frontend/src/test/date-time-picker.test.tsx new file mode 100644 index 000000000..9521fb0fb --- /dev/null +++ b/frontend/src/test/date-time-picker.test.tsx @@ -0,0 +1,43 @@ +import { fireEvent } from '@testing-library/react'; +import dayjs from 'dayjs'; +import type { Dayjs } from 'dayjs'; +import { describe, expect, it, vi } from 'vitest'; + +import DateTimePicker from '@/components/form/DateTimePicker'; +import { renderWithProviders } from './test-utils'; + +function openPicker(): void { + const input = document.querySelector('.ant-picker input'); + if (!input) throw new Error('picker input not rendered'); + fireEvent.mouseDown(input); + fireEvent.click(input); +} + +function clickDayCell(title: string): void { + const cell = document.querySelector(`.ant-picker-cell[title="${title}"] .ant-picker-cell-inner`); + if (!cell) throw new Error(`day cell ${title} not rendered`); + fireEvent.click(cell); +} + +describe('DateTimePicker', () => { + it('commits a clicked calendar date without an OK press', () => { + const onChange = vi.fn<(next: Dayjs | null) => void>(); + renderWithProviders(); + + openPicker(); + const tomorrow = dayjs().add(1, 'day').format('YYYY-MM-DD'); + clickDayCell(tomorrow); + + expect(onChange).toHaveBeenCalled(); + const committed = onChange.mock.calls.at(-1)?.[0]; + expect(committed?.format('YYYY-MM-DD HH:mm:ss')).toBe(`${tomorrow} 00:00:00`); + }); + + it('renders no OK confirm button in the picker footer', () => { + renderWithProviders(); + + openPicker(); + + expect(document.querySelector('.ant-picker-ok')).toBeNull(); + }); +});