@mui/x-date-pickers-pro
Version:
The Pro plan edition of the Date and Time Picker components (MUI X).
60 lines • 1.92 kB
JavaScript
import { mergeDateAndTime } from '@mui/x-date-pickers/internals';
export function calculateRangeChange({
utils,
range,
newDate: selectedDate,
rangePosition,
allowRangeFlip = false,
shouldMergeDateAndTime = false,
referenceDate
}) {
const [start, end] = range;
if (shouldMergeDateAndTime && selectedDate) {
// If there is a date already selected, then we want to keep its time
if (start && rangePosition === 'start') {
selectedDate = mergeDateAndTime(utils, selectedDate, start);
}
if (end && rangePosition === 'end') {
selectedDate = mergeDateAndTime(utils, selectedDate, end);
}
}
const newSelectedDate = referenceDate && selectedDate && shouldMergeDateAndTime ? mergeDateAndTime(utils, selectedDate, referenceDate) : selectedDate;
if (rangePosition === 'start') {
const truthyResult = allowRangeFlip ? {
nextSelection: 'start',
newRange: [end, newSelectedDate]
} : {
nextSelection: 'end',
newRange: [newSelectedDate, null]
};
return Boolean(end) && utils.isAfter(newSelectedDate, end) ? truthyResult : {
nextSelection: 'end',
newRange: [newSelectedDate, end]
};
}
const truthyResult = allowRangeFlip ? {
nextSelection: 'end',
newRange: [newSelectedDate, start]
} : {
nextSelection: 'end',
newRange: [newSelectedDate, null]
};
return Boolean(start) && utils.isBeforeDay(newSelectedDate, start) ? truthyResult : {
nextSelection: 'start',
newRange: [start, newSelectedDate]
};
}
export function calculateRangePreview(options) {
if (options.newDate == null) {
return [null, null];
}
const [start, end] = options.range;
const {
newRange
} = calculateRangeChange(options);
if (!start || !end) {
return newRange;
}
const [previewStart, previewEnd] = newRange;
return options.rangePosition === 'end' ? [end, previewEnd] : [previewStart, start];
}