Skip to content

Commit 899af1e

Browse files
fix: normalize startdate and enddate timestamps in rangepicker (#1025)
* fix: fix startdate and enddate timestamps in rangepicker * fix: abstract normalizer
1 parent 8dd55b4 commit 899af1e

File tree

3 files changed

+89
-4
lines changed

3 files changed

+89
-4
lines changed

src/components/DateTimePicker/Internal/OcRangePicker.tsx

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import {
3737
getInputSize,
3838
elementsContains,
3939
} from './Utils/uiUtil';
40+
import { normalizeRangeTimes, normalizeSingleTime } from './Utils/timeUtil';
4041
import type { ContextOperationRefProps } from './PartialContext';
4142
import PartialContext from './PartialContext';
4243
import {
@@ -409,6 +410,13 @@ function InnerRangePicker<DateType>(props: OcRangePickerProps<DateType>) {
409410
}
410411
}
411412

413+
// Normalize times when showTime is false
414+
if (!showTime && picker !== 'time') {
415+
values = normalizeRangeTimes(generateConfig, values);
416+
startValue = getValue(values, 0);
417+
endValue = getValue(values, 1);
418+
}
419+
412420
setSelectedValue(values);
413421

414422
const startStr: string = values?.[0]
@@ -452,7 +460,6 @@ function InnerRangePicker<DateType>(props: OcRangePickerProps<DateType>) {
452460

453461
const canTrigger: boolean =
454462
values === null || (canStartValueTrigger && canEndValueTrigger);
455-
456463
if (canTrigger) {
457464
// Trigger onChange only when value is validated.
458465
setInnerValue(values);
@@ -503,8 +510,19 @@ function InnerRangePicker<DateType>(props: OcRangePickerProps<DateType>) {
503510
index === 0 ? disabledStartDate : disabledEndDate;
504511

505512
if (inputDate && !disabledFunc(inputDate)) {
506-
setSelectedValue(updateValues(selectedValue, inputDate, index));
507-
setViewDate(inputDate, index);
513+
let normalizedInputDate: DateType = inputDate;
514+
515+
// Normalize times when showTime is false
516+
if (!showTime && picker !== 'time') {
517+
normalizedInputDate = normalizeSingleTime(
518+
generateConfig,
519+
inputDate,
520+
index === 0 // isStartDate
521+
);
522+
}
523+
524+
setSelectedValue(updateValues(selectedValue, normalizedInputDate, index));
525+
setViewDate(normalizedInputDate, index);
508526
}
509527
};
510528

@@ -1170,7 +1188,7 @@ function InnerRangePicker<DateType>(props: OcRangePickerProps<DateType>) {
11701188
date: DateType,
11711189
type: 'key' | 'mouse' | 'submit'
11721190
) => {
1173-
const values: [DateType, DateType] = updateValues(
1191+
let values: [DateType, DateType] = updateValues(
11741192
selectedValue,
11751193
date,
11761194
mergedActivePickerIndex
@@ -1197,6 +1215,11 @@ function InnerRangePicker<DateType>(props: OcRangePickerProps<DateType>) {
11971215
triggerOpen(false, mergedActivePickerIndex, 'confirm');
11981216
}
11991217
} else {
1218+
// Normalize times when showTime is false before setting selected value
1219+
if (!showTime && picker !== 'time') {
1220+
values = normalizeRangeTimes(generateConfig, values);
1221+
}
1222+
12001223
setSelectedValue(values);
12011224
}
12021225
};

src/components/DateTimePicker/Internal/Tests/range.test.tsx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2024,4 +2024,16 @@ describe('Picker.Range', () => {
20242024
).toBe('0px');
20252025
mock.mockRestore();
20262026
});
2027+
2028+
it('should select the start time stamp at 00:00:00 and end time stamp at 23:59:59 when the time is not selected', () => {
2029+
const onChange = jest.fn();
2030+
const wrapper = mount(<DayjsRangePicker onChange={onChange} />);
2031+
2032+
wrapper.openPicker();
2033+
wrapper.selectCell(2);
2034+
wrapper.selectCell(5);
2035+
2036+
expect(onChange.mock.calls[0][0][0].format('HH:mm:ss')).toBe('00:00:00');
2037+
expect(onChange.mock.calls[0][0][1].format('HH:mm:ss')).toBe('23:59:59');
2038+
});
20272039
});

src/components/DateTimePicker/Internal/Utils/timeUtil.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type { NullableDateType } from '../OcPicker.types';
22
import type { GenerateConfig } from '../Generate';
3+
import type { RangeValue } from '../OcPicker.types';
34

45
export function setTime<DateType>(
56
generateConfig: GenerateConfig<DateType>,
@@ -72,3 +73,52 @@ export function getLastDay<DateType>(
7273
const monthShow: string = month < 10 ? `0${month}` : `${month}`;
7374
return `${year}-${monthShow}-${lastDay}`;
7475
}
76+
77+
export function normalizeRangeTimes<DateType>(
78+
generateConfig: GenerateConfig<DateType>,
79+
values: RangeValue<DateType>
80+
): RangeValue<DateType> {
81+
if (!values) {
82+
return values;
83+
}
84+
85+
let normalizedValues: [DateType, DateType] = values;
86+
87+
// Set start date to beginning of day (00:00:00)
88+
if (normalizedValues?.[0]) {
89+
normalizedValues[0] = setTime(
90+
generateConfig,
91+
normalizedValues[0],
92+
0, // hour
93+
0, // minute
94+
0 // second
95+
);
96+
}
97+
98+
// Set end date to end of day (23:59:59)
99+
if (normalizedValues?.[1]) {
100+
normalizedValues[1] = setTime(
101+
generateConfig,
102+
normalizedValues[1],
103+
23, // hour
104+
59, // minute
105+
59 // second
106+
);
107+
}
108+
109+
return normalizedValues;
110+
}
111+
112+
export function normalizeSingleTime<DateType>(
113+
generateConfig: GenerateConfig<DateType>,
114+
date: DateType,
115+
isStartDate: boolean
116+
): DateType {
117+
if (isStartDate) {
118+
// Set to beginning of day (00:00:00)
119+
return setTime(generateConfig, date, 0, 0, 0);
120+
} else {
121+
// Set to end of day (23:59:59)
122+
return setTime(generateConfig, date, 23, 59, 59);
123+
}
124+
}

0 commit comments

Comments
 (0)