Skip to content

Commit a87a843

Browse files
authored
fix: fix disabledTime not working when there is no default value (#680)
* fix: fix some time disabledTime not working * test case * fix * Semicolon * fix * fix * chore: improve * fix findValidTime * fix * improve
1 parent 2f801d1 commit a87a843

File tree

2 files changed

+52
-27
lines changed

2 files changed

+52
-27
lines changed

src/panels/DatetimePanel/index.tsx

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,18 @@ export type DatetimePanelProps<DateType> = {
1818
const ACTIVE_PANEL = tuple('date', 'time');
1919
type ActivePanelType = (typeof ACTIVE_PANEL)[number];
2020

21-
const findValidTime = (disabledRange: number[], maxValidTime: number) => {
21+
const findValidTime = (refValue: number, disabledRange: number[], maxValidTime: number) => {
2222
const rangeSet = new Set(disabledRange);
23-
for (let i = 0; i <= maxValidTime; i++) {
24-
if (!rangeSet.has(i)) {
25-
return i;
23+
if (rangeSet.has(refValue)) {
24+
for (let i = 0; i <= maxValidTime; i++) {
25+
if (!rangeSet.has(i) && i >= refValue) {
26+
// first not disabled time
27+
return i;
28+
}
2629
}
2730
}
28-
29-
return 0
30-
}
31+
return refValue;
32+
};
3133

3234
function DatetimePanel<DateType>(props: DatetimePanelProps<DateType>) {
3335
const {
@@ -104,33 +106,30 @@ function DatetimePanel<DateType>(props: DatetimePanelProps<DateType>) {
104106
const onInternalSelect = (date: DateType, source: 'date' | 'time') => {
105107
let selectedDate = date;
106108

107-
if (source === 'date' && !value && timeProps.defaultValue) {
108-
// Date with time defaultValue
109-
selectedDate = generateConfig.setHour(
110-
selectedDate,
111-
generateConfig.getHour(timeProps.defaultValue),
109+
if (source === 'date') {
110+
const disabledTimes = disabledTime?.(value || timeProps.defaultValue) || {};
111+
const validHour = findValidTime(
112+
generateConfig.getHour(selectedDate),
113+
disabledTimes.disabledHours?.() || [-1],
114+
23,
112115
);
113-
selectedDate = generateConfig.setMinute(
114-
selectedDate,
115-
generateConfig.getMinute(timeProps.defaultValue),
116+
const validMinute = findValidTime(
117+
generateConfig.getMinute(selectedDate),
118+
disabledTimes.disabledMinutes?.(validHour) || [-1],
119+
59,
116120
);
117-
selectedDate = generateConfig.setSecond(
118-
selectedDate,
119-
generateConfig.getSecond(timeProps.defaultValue),
121+
const validSeconds = findValidTime(
122+
generateConfig.getSecond(selectedDate),
123+
disabledTimes.disabledSeconds?.(validHour, validMinute) || [-1],
124+
59,
120125
);
126+
selectedDate = generateConfig.setHour(selectedDate, validHour);
127+
selectedDate = generateConfig.setMinute(selectedDate, validMinute);
128+
selectedDate = generateConfig.setSecond(selectedDate, validSeconds);
121129
} else if (source === 'time' && !value && defaultValue) {
122130
selectedDate = generateConfig.setYear(selectedDate, generateConfig.getYear(defaultValue));
123131
selectedDate = generateConfig.setMonth(selectedDate, generateConfig.getMonth(defaultValue));
124132
selectedDate = generateConfig.setDate(selectedDate, generateConfig.getDate(defaultValue));
125-
} else if (source === 'date' && value && disabledTime) {
126-
const disabledTimes = disabledTime(value)
127-
128-
const validHour = findValidTime(disabledTimes.disabledHours?.() || [-1], 23)
129-
const validMinute = findValidTime(disabledTimes.disabledMinutes?.(validHour) || [-1], 59)
130-
const validSeconds = findValidTime(disabledTimes.disabledSeconds?.(validHour, validMinute) || [-1], 59)
131-
selectedDate = generateConfig.setHour(selectedDate, validHour)
132-
selectedDate = generateConfig.setMinute(selectedDate, validMinute)
133-
selectedDate = generateConfig.setSecond(selectedDate, validSeconds)
134133
}
135134

136135
if (onSelect) {

tests/disabledTime.spec.tsx

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { fireEvent, render } from '@testing-library/react';
22
import type { Moment } from 'moment';
3+
import moment from 'moment';
34
import { resetWarned } from 'rc-util/lib/warning';
45
import React from 'react';
56
import {
@@ -159,6 +160,31 @@ describe('Picker.DisabledTime', () => {
159160
expect(document.querySelector('.rc-picker-input > input').getAttribute('value')).toEqual('1989-10-31 05:00:00');
160161
});
161162

163+
it('disabledTime should reset correctly when date changed by click for no default value', function () {
164+
const now = moment();
165+
const h = now.hours();
166+
const m = now.minutes();
167+
const s = now.seconds();
168+
169+
const disabledTime = jest.fn((_: Moment | null, __: 'start' | 'end') => ({
170+
disabledHours: () => [h],
171+
disabledMinutes: () => [m],
172+
disabledSeconds: () => [s],
173+
}));
174+
175+
const firstDayInMonth = now.startOf('month');
176+
const firstDayInCalendar = firstDayInMonth.clone().subtract(firstDayInMonth.days(), 'days');
177+
const expected = firstDayInCalendar.clone().hour(h + 1 % 24).minute(m + 1 % 60).second(s + 1 % 60);
178+
179+
render(<MomentRangePicker open showTime disabledTime={disabledTime} />);
180+
181+
fireEvent.click(document.querySelectorAll('.rc-picker-cell-inner')[0]);
182+
183+
expect(document.querySelector('.rc-picker-input > input').getAttribute('value')).toEqual(
184+
expected.format('YYYY-MM-DD HH:mm:ss'),
185+
);
186+
});
187+
162188
describe('warning for legacy props', () => {
163189
it('single', () => {
164190
resetWarned();

0 commit comments

Comments
 (0)