@navikt/ds-react
Version:
React components from the Norwegian Labour and Welfare Administration.
99 lines • 4.72 kB
JavaScript
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
import { isSameDay } from "date-fns";
import React, { forwardRef, useState } from "react";
import { useRenameCSS } from "../../theme/Theme.js";
import { useControllableState, useId } from "../../util/hooks/index.js";
import { useMergeRefs } from "../../util/hooks/useMergeRefs.js";
import { useI18n } from "../../util/i18n/i18n.hooks.js";
import { DateDialog } from "../Date.Dialog.js";
import { DateInputContextProvider, DatePickerInput } from "../Date.Input.js";
import { DateTranslationContextProvider, getTranslations, } from "../Date.locale.js";
import { isDateRange } from "../Date.typeutils.js";
import { ReactDayPicker } from "./parts/DatePicker.RDP.js";
import DatePickerStandalone from "./parts/DatePicker.Standalone.js";
/**
* A component that allows users to select a date from a calendar.
*
* @see [📝 Documentation](https://aksel.nav.no/komponenter/core/datepicker)
* @see 🏷️ {@link DatePickerProps}
*
* @example
* ```jsx
* const { inputProps, datepickerProps } = useMonthpicker({
* onMonthChange: console.log,
* });
*
* return (
* <DatePicker {...datepickerProps} dropdownCaption>
* <DatePicker.Input
* {...inputProps}
* label="Velg dato"
* />
* </DatePicker>
* );
* ```
*/
export const DatePicker = forwardRef((_a, ref) => {
var { children, locale, translations, selected, id, defaultSelected, wrapperClassName, open: _open, onClose, onOpenToggle, strategy, mode } = _a, rest = __rest(_a, ["children", "locale", "translations", "selected", "id", "defaultSelected", "wrapperClassName", "open", "onClose", "onOpenToggle", "strategy", "mode"]);
const translate = useI18n("DatePicker", translations, getTranslations(locale));
const { cn } = useRenameCSS();
const ariaId = useId(id);
const [open, setOpen] = useControllableState({
defaultValue: false,
value: _open,
});
/* We use state here to insure that anchor is defined if open is true on initial render */
const [wrapperRef, setWrapperRef] = useState(null);
const mergedRef = useMergeRefs(setWrapperRef, ref);
const [value, setValue] = useControllableState({
defaultValue: defaultSelected,
value: selected,
onChange: (newValue) => {
var _a;
let closeDialog = false;
if (mode === "single" && newValue) {
closeDialog = true;
}
else if (isDateRange(newValue) && newValue.from && newValue.to) {
closeDialog = true;
if (isSameDay(newValue.from, newValue.to)) {
closeDialog = false;
}
}
if (closeDialog) {
onClose === null || onClose === void 0 ? void 0 : onClose();
setOpen(false);
}
(_a = rest === null || rest === void 0 ? void 0 : rest.onSelect) === null || _a === void 0 ? void 0 : _a.call(rest, newValue);
},
});
return (React.createElement(DateTranslationContextProvider, { translate: translate },
React.createElement(DateInputContextProvider, { open: open, onOpen: () => {
setOpen((x) => !x);
onOpenToggle === null || onOpenToggle === void 0 ? void 0 : onOpenToggle();
}, ariaId: ariaId, defined: true },
React.createElement("div", { ref: mergedRef, className: cn("navds-date__wrapper", wrapperClassName) },
children,
React.createElement(DateDialog, { open: open, anchor: wrapperRef, onClose: () => {
onClose === null || onClose === void 0 ? void 0 : onClose();
open && setOpen(false);
}, locale: locale, translate: translate, variant: mode !== null && mode !== void 0 ? mode : "single", popoverProps: {
id: ariaId,
strategy,
} },
React.createElement(ReactDayPicker, Object.assign({}, rest, { locale: locale, handleSelect: setValue, selected: value, mode: mode })))))));
});
DatePicker.Standalone = DatePickerStandalone;
DatePicker.Input = DatePickerInput;
export default DatePicker;
//# sourceMappingURL=DatePicker.js.map