@mui/x-date-pickers-pro
Version:
The Pro plan edition of the Date and Time Picker components (MUI X).
113 lines (111 loc) • 3.82 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import useEventCallback from '@mui/utils/useEventCallback';
import { unstable_useDateTimeField as useDateTimeField } from '@mui/x-date-pickers/DateTimeField';
import { useControlledValueWithTimezone, useDefaultizedDateTimeField } from '@mui/x-date-pickers/internals';
import { useValidation } from '@mui/x-date-pickers/validation';
import { validateDateTimeRange } from "../../../validation/index.js";
import { rangeValueManager } from "../../utils/valueManagers.js";
import { excludeProps } from "./shared.js";
import { useMultiInputFieldSelectedSections } from "../useMultiInputFieldSelectedSections.js";
export const useMultiInputDateTimeRangeField = ({
sharedProps: inSharedProps,
startTextFieldProps,
unstableStartFieldRef,
endTextFieldProps,
unstableEndFieldRef
}) => {
const sharedProps = useDefaultizedDateTimeField(inSharedProps);
const {
value: valueProp,
defaultValue,
referenceDate,
format,
formatDensity,
shouldRespectLeadingZeros,
onChange,
disabled,
readOnly,
selectedSections,
onSelectedSectionsChange,
timezone: timezoneProp,
enableAccessibleFieldDOMStructure,
autoFocus
} = sharedProps;
const {
value,
handleValueChange,
timezone
} = useControlledValueWithTimezone({
name: 'useMultiInputDateRangeField',
timezone: timezoneProp,
value: valueProp,
defaultValue,
referenceDate,
onChange,
valueManager: rangeValueManager
});
const {
validationError,
getValidationErrorForNewValue
} = useValidation({
props: sharedProps,
value,
timezone,
validator: validateDateTimeRange,
onError: sharedProps.onError
});
// TODO: Maybe export utility from `useField` instead of copy/pasting the logic
const buildChangeHandler = index => {
return (newDate, rawContext) => {
const newDateRange = index === 0 ? [newDate, value[1]] : [value[0], newDate];
const context = _extends({}, rawContext, {
validationError: getValidationErrorForNewValue(newDateRange)
});
handleValueChange(newDateRange, context);
};
};
const handleStartDateChange = useEventCallback(buildChangeHandler(0));
const handleEndDateChange = useEventCallback(buildChangeHandler(1));
const selectedSectionsResponse = useMultiInputFieldSelectedSections({
selectedSections,
onSelectedSectionsChange,
unstableStartFieldRef,
unstableEndFieldRef
});
const startFieldProps = _extends({
error: !!validationError[0]
}, startTextFieldProps, selectedSectionsResponse.start, {
disabled,
readOnly,
format,
formatDensity,
shouldRespectLeadingZeros,
timezone,
value: valueProp === undefined ? undefined : valueProp[0],
defaultValue: defaultValue === undefined ? undefined : defaultValue[0],
onChange: handleStartDateChange,
enableAccessibleFieldDOMStructure,
autoFocus // Do not add on end field.
});
const endFieldProps = _extends({
error: !!validationError[1]
}, endTextFieldProps, selectedSectionsResponse.end, {
format,
formatDensity,
shouldRespectLeadingZeros,
disabled,
readOnly,
timezone,
value: valueProp === undefined ? undefined : valueProp[1],
defaultValue: defaultValue === undefined ? undefined : defaultValue[1],
onChange: handleEndDateChange,
enableAccessibleFieldDOMStructure
});
const startDateResponse = useDateTimeField(startFieldProps);
const endDateResponse = useDateTimeField(endFieldProps);
/* TODO: Undo this change when a clearable behavior for multiple input range fields is implemented */
return {
startDate: excludeProps(startDateResponse, ['clearable', 'onClear']),
endDate: excludeProps(endDateResponse, ['clearable', 'onClear'])
};
};