@mantine/dates
Version:
Calendars, date and time pickers based on Mantine components
240 lines (234 loc) • 8.09 kB
JavaScript
'use client';
'use strict';
var jsxRuntime = require('react/jsx-runtime');
var dayjs = require('dayjs');
var react = require('react');
var core = require('@mantine/core');
var hooks = require('@mantine/hooks');
var useUncontrolledDates = require('../../hooks/use-uncontrolled-dates/use-uncontrolled-dates.cjs');
require('../DatesProvider/DatesProvider.cjs');
var useDatesContext = require('../DatesProvider/use-dates-context.cjs');
var assignTime = require('../../utils/assign-time/assign-time.cjs');
var getDefaultClampedDate = require('../../utils/get-default-clamped-date/get-default-clamped-date.cjs');
var clampDate = require('../../utils/clamp-date/clamp-date.cjs');
require('../Calendar/Calendar.cjs');
var pickCalendarLevelsProps = require('../Calendar/pick-calendar-levels-props/pick-calendar-levels-props.cjs');
var DatePicker = require('../DatePicker/DatePicker.cjs');
var PickerInputBase = require('../PickerInputBase/PickerInputBase.cjs');
var TimePicker = require('../TimePicker/TimePicker.cjs');
var getMinMaxTime = require('./get-min-max-time/get-min-max-time.cjs');
var DateTimePicker_module = require('./DateTimePicker.module.css.cjs');
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
var dayjs__default = /*#__PURE__*/_interopDefault(dayjs);
const defaultProps = {
dropdownType: "popover",
size: "sm"
};
const DateTimePicker = core.factory((_props, ref) => {
const props = core.useProps("DateTimePicker", defaultProps, _props);
const {
value,
defaultValue,
onChange,
valueFormat,
locale,
classNames,
styles,
unstyled,
timePickerProps,
submitButtonProps,
withSeconds,
level,
defaultLevel,
size,
variant,
dropdownType,
vars,
minDate,
maxDate,
defaultDate,
defaultTimeValue,
presets,
attributes,
onDropdownClose,
...rest
} = props;
const getStyles = core.useStyles({
name: "DateTimePicker",
classes: DateTimePicker_module,
props,
classNames,
styles,
unstyled,
attributes,
vars
});
const { resolvedClassNames, resolvedStyles } = core.useResolvedStylesApi({
classNames,
styles,
props
});
const _valueFormat = valueFormat || (withSeconds ? "DD/MM/YYYY HH:mm:ss" : "DD/MM/YYYY HH:mm");
const timePickerRef = react.useRef(null);
const timePickerRefMerged = hooks.useMergedRef(timePickerRef, timePickerProps?.hoursRef);
const {
calendarProps: { allowSingleDateInRange, ...calendarProps },
others
} = pickCalendarLevelsProps.pickCalendarProps(rest);
const ctx = useDatesContext.useDatesContext();
const [_value, setValue] = useUncontrolledDates.useUncontrolledDates({
type: "default",
value,
defaultValue,
onChange,
withTime: true
});
const _defaultDate = defaultDate || _value;
const formatTime = (dateValue) => dateValue ? dayjs__default.default(dateValue).format(withSeconds ? "HH:mm:ss" : "HH:mm") : "";
const [timeValue, setTimeValue] = react.useState(defaultTimeValue || formatTime(_value));
const [currentLevel, setCurrentLevel] = react.useState(level || defaultLevel || "month");
const [dropdownOpened, dropdownHandlers] = hooks.useDisclosure(false);
const formattedValue = _value ? dayjs__default.default(_value).locale(ctx.getLocale(locale)).format(_valueFormat) : "";
const handleTimeChange = (timeString) => {
timePickerProps?.onChange?.(timeString);
setTimeValue(timeString);
if (timeString) {
setValue(assignTime.assignTime(_value, timeString));
}
};
const handleDateChange = (date) => {
if (date) {
setValue(assignTime.assignTime(clampDate.clampDate(minDate, maxDate, date), timeValue || defaultTimeValue || ""));
}
timePickerRef.current?.focus();
};
const handleTimeInputKeyDown = (event) => {
if (event.key === "Enter") {
event.preventDefault();
dropdownHandlers.close();
}
};
hooks.useDidUpdate(() => {
if (!dropdownOpened) {
setTimeValue(formatTime(_value));
}
}, [_value, dropdownOpened]);
hooks.useDidUpdate(() => {
if (dropdownOpened) {
setCurrentLevel("month");
}
}, [dropdownOpened]);
const __stopPropagation = dropdownType === "popover";
const handleDropdownClose = () => {
const clamped = clampDate.clampDate(minDate, maxDate, _value);
if (_value && _value !== clamped) {
setValue(clampDate.clampDate(minDate, maxDate, _value));
}
onDropdownClose?.();
};
return /* @__PURE__ */ jsxRuntime.jsxs(
PickerInputBase.PickerInputBase,
{
formattedValue,
dropdownOpened: !rest.disabled ? dropdownOpened : false,
dropdownHandlers,
classNames: resolvedClassNames,
styles: resolvedStyles,
unstyled,
ref,
onClear: () => setValue(null),
shouldClear: !!_value,
value: _value,
size,
variant,
dropdownType,
...others,
type: "default",
__staticSelector: "DateTimePicker",
onDropdownClose: handleDropdownClose,
withTime: true,
attributes,
children: [
/* @__PURE__ */ jsxRuntime.jsx(
DatePicker.DatePicker,
{
...calendarProps,
maxDate,
minDate,
size,
variant,
type: "default",
value: _value,
defaultDate: _defaultDate || getDefaultClampedDate.getDefaultClampedDate({ maxDate, minDate }),
onChange: handleDateChange,
locale,
classNames: resolvedClassNames,
styles: resolvedStyles,
unstyled,
__staticSelector: "DateTimePicker",
__stopPropagation,
level,
defaultLevel,
onLevelChange: (_level) => {
setCurrentLevel(_level);
calendarProps.onLevelChange?.(_level);
},
presets,
__onPresetSelect: (val) => {
setValue(val);
val && setTimeValue(formatTime(val));
},
attributes
}
),
currentLevel === "month" && /* @__PURE__ */ jsxRuntime.jsxs("div", { ...getStyles("timeWrapper"), children: [
/* @__PURE__ */ jsxRuntime.jsx(
TimePicker.TimePicker,
{
value: timeValue,
withSeconds,
unstyled,
min: getMinMaxTime.getMinTime({ minDate, value: _value }),
max: getMinMaxTime.getMaxTime({ maxDate, value: _value }),
...timePickerProps,
...getStyles("timeInput", {
className: timePickerProps?.className,
style: timePickerProps?.style
}),
onChange: handleTimeChange,
onKeyDown: handleTimeInputKeyDown,
size,
"data-mantine-stop-propagation": __stopPropagation || void 0,
hoursRef: timePickerRefMerged,
attributes
}
),
/* @__PURE__ */ jsxRuntime.jsx(
core.ActionIcon,
{
variant: "default",
size: `input-${size || "sm"}`,
...getStyles("submitButton", {
className: submitButtonProps?.className,
style: submitButtonProps?.style
}),
unstyled,
"data-mantine-stop-propagation": __stopPropagation || void 0,
children: /* @__PURE__ */ jsxRuntime.jsx(core.CheckIcon, { size: "30%" }),
...submitButtonProps,
onClick: (event) => {
submitButtonProps?.onClick?.(event);
dropdownHandlers.close();
handleDropdownClose();
}
}
)
] })
]
}
);
});
DateTimePicker.classes = { ...DateTimePicker_module, ...PickerInputBase.PickerInputBase.classes, ...DatePicker.DatePicker.classes };
DateTimePicker.displayName = "@mantine/dates/DateTimePicker";
exports.DateTimePicker = DateTimePicker;
//# sourceMappingURL=DateTimePicker.cjs.map