{"version":3,"file":"DatePicker.cjs","sources":["../../../../src/components/datepicker/DatePicker.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport dayjs from \"dayjs\";\nimport React, {\n    type ChangeEvent,\n    type FocusEvent,\n    type KeyboardEvent,\n    type MouseEvent,\n    forwardRef,\n    useCallback,\n    useRef,\n    useState,\n} from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { formatDateString } from \"../../utilities/formatters/date/formatDate.js\";\nimport { IconButton } from \"../icon-button/IconButton.js\";\nimport { CalendarIcon } from \"../icon/icons/CalendarIcon.js\";\nimport { InputGroup } from \"../input-group/InputGroup.js\";\nimport Popover from \"../popover/Popover.js\";\nimport { BaseTextInput } from \"../text-input/BaseTextInput.js\";\nimport { Calendar } from \"./internal/Calendar.js\";\nimport { type DateInfo, getInitialDate } from \"./internal/utils.js\";\nimport type { DatePickerProps, DateValidationError } from \"./types.js\";\nimport { formatInput, parseDateString } from \"./utils.js\";\nimport { isWithinLowerBound, isWithinUpperBound } from \"./validation.js\";\n\nconst setInputValue = (input: HTMLInputElement, value: string) => {\n    const nativeSetter = Object.getOwnPropertyDescriptor(\n        HTMLInputElement.prototype,\n        \"value\",\n    )?.set;\n\n    if (nativeSetter) {\n        nativeSetter.call(input, value);\n    } else {\n        input.value = value;\n    }\n};\n\nconst normalizeInputValue = (\n    rawValue: string,\n    shouldStripAutoFormatting: boolean,\n) => {\n    const digits = rawValue.replace(/\\D/g, \"\");\n    const partialCompactDate = formatDateString(digits, {\n        partial: true,\n    });\n    const rawValueWithoutTrailingPunctuation = rawValue.replace(/\\D+$/, \"\");\n    const compactDateCandidate =\n        digits.length === 8 ? formatDateString(digits) : rawValue;\n    const validCompactDate = parseDateString(compactDateCandidate)\n        ? compactDateCandidate\n        : null;\n    const shouldRemoveFormatting =\n        shouldStripAutoFormatting &&\n        rawValue !== digits &&\n        rawValueWithoutTrailingPunctuation === partialCompactDate &&\n        parseDateString(rawValue) === undefined &&\n        validCompactDate === null;\n\n    return validCompactDate ?? (shouldRemoveFormatting ? digits : rawValue);\n};\n\nconst getInputValidationState = ({\n    value,\n    minDate,\n    maxDate,\n}: {\n    value: string;\n    minDate?: Date;\n    maxDate?: Date;\n}): { date: Date | null; error: DateValidationError | null } => {\n    if (!value) {\n        return { date: null, error: null };\n    }\n\n    const parsedDate = parseDateString(value);\n\n    if (!parsedDate) {\n        return { date: null, error: \"WRONG_FORMAT\" };\n    }\n\n    if (minDate && !isWithinLowerBound(parsedDate, minDate)) {\n        return { date: parsedDate, error: \"OUTSIDE_LOWER_BOUND\" };\n    }\n\n    if (maxDate && !isWithinUpperBound(parsedDate, maxDate)) {\n        return { date: parsedDate, error: \"OUTSIDE_UPPER_BOUND\" };\n    }\n\n    return { date: parsedDate, error: null };\n};\n\nexport const DatePicker = forwardRef<HTMLInputElement, DatePickerProps>(\n    (props, forwardedInputRef) => {\n        const {\n            \"data-testautoid\": testAutoId,\n            id,\n            className = \"\",\n            label = \"Velg dato\",\n            labelProps,\n            defaultValue,\n            defaultShow = false,\n            value,\n            disableBeforeDate: disableBefore,\n            disableAfterDate: disableAfter,\n            yearsToShow,\n            name,\n            helpLabel,\n            errorLabel,\n            invalid,\n            days,\n            months,\n            monthLabel,\n            yearLabel,\n            placeholder = \"dd.mm.åååå\",\n            width = \"11.25rem\",\n            onChange,\n            onBlur,\n            onFocus,\n            onKeyDown,\n            action,\n            showCalendarLabel = \"Åpne kalender\",\n            hideCalendarLabel = \"Lukk kalender\",\n            supportLabelProps,\n            tooltip,\n            textInputProps,\n            description,\n            ...rest\n        } = props;\n\n        if (process.env.NODE_ENV !== \"production\" && value && defaultValue) {\n            console.warn(\n                \"DatePicker må enten være controlled eller uncontrolled. Hvis du bruker defaultValue og value sammen vil defaultValue bli ignorert.\",\n            );\n        }\n        /// Input state\n\n        const disableBeforeDate = parseDateString(disableBefore);\n        const minDate = disableBeforeDate\n            ? dayjs(disableBeforeDate).startOf(\"day\").toDate()\n            : undefined;\n        const disableAfterDate = parseDateString(disableAfter);\n        const maxDate = disableAfterDate\n            ? dayjs(disableAfterDate).startOf(\"day\").toDate()\n            : undefined;\n\n        const [date, setDate] = useState(\n            getInitialDate(value, defaultValue, minDate, maxDate),\n        );\n        const [error, setError] = useState<DateValidationError | null>(null);\n\n        /// Calendar state\n\n        const [showCalendar, setShowCalendar] = useState(defaultShow);\n\n        const calendarRef = useRef<HTMLDivElement>(null);\n        const datepickerRef = useRef<HTMLDivElement>(null);\n\n        /// Input events\n\n        const iconButtonRef = useRef<HTMLButtonElement | null>(null);\n        const inputRef = useRef<HTMLInputElement | null>(null);\n        const didAutoFormatCompactInputRef = useRef(false);\n\n        // Hjelper for å gjøre det enklere å både forwarde refen men også bruke den selv internt\n        const unifiedInputRef = useCallback(\n            (instance: HTMLInputElement | null) => {\n                inputRef.current = instance;\n                if (forwardedInputRef) {\n                    if (typeof forwardedInputRef === \"function\") {\n                        forwardedInputRef(instance);\n                    } else {\n                        forwardedInputRef.current = instance;\n                    }\n                }\n            },\n            [forwardedInputRef],\n        );\n\n        const handleFocus = useCallback(\n            (e: FocusEvent<HTMLInputElement>) => {\n                if (!onFocus || !datepickerRef.current) {\n                    return;\n                }\n\n                const nextFocusIsInside = datepickerRef.current.contains(\n                    e.relatedTarget as Node,\n                );\n                if (!nextFocusIsInside) {\n                    onFocus(e, date, { error, value: e.target.value });\n                }\n            },\n            [onFocus, date, error],\n        );\n\n        const handleBlur = useCallback(\n            (e: FocusEvent<HTMLInputElement>) => {\n                if (onBlur) {\n                    onBlur(e, date, { error, value: e.target.value });\n                }\n            },\n            [onBlur, date, error],\n        );\n\n        const handleKeyDownAction = useCallback(\n            (e: React.KeyboardEvent<HTMLButtonElement>) => {\n                if (e.key === \"Escape\") {\n                    setShowCalendar(false);\n                    e.preventDefault();\n                    e.stopPropagation();\n                }\n\n                if (action?.onKeyDown) {\n                    action.onKeyDown(e);\n                }\n            },\n            [action],\n        );\n\n        const handleChange = useCallback(\n            (e: ChangeEvent<HTMLInputElement>) => {\n                const rawValue = e.currentTarget.value;\n                const formattedValue = normalizeInputValue(\n                    rawValue,\n                    didAutoFormatCompactInputRef.current,\n                );\n\n                if (formattedValue !== rawValue) {\n                    setInputValue(e.currentTarget, formattedValue);\n                }\n\n                const digits = rawValue.replace(/\\D/g, \"\");\n                didAutoFormatCompactInputRef.current =\n                    rawValue === digits &&\n                    formattedValue === formatDateString(digits) &&\n                    formattedValue !== rawValue &&\n                    parseDateString(formattedValue) !== undefined;\n\n                const { date: nextDate, error: nextError } =\n                    getInputValidationState({\n                        value: formattedValue,\n                        minDate,\n                        maxDate,\n                    });\n\n                if (nextDate && !nextError) {\n                    setShowCalendar(false);\n                }\n\n                setError(nextError);\n                setDate(nextDate);\n\n                if (onChange) {\n                    onChange(e, nextDate, {\n                        error: nextError,\n                        value: formattedValue,\n                    });\n                }\n            },\n            [onChange, minDate, maxDate],\n        );\n\n        /// Calendar events\n\n        const clickCalendar = useCallback(\n            (e: MouseEvent<HTMLButtonElement>) => {\n                flushSync(() => {\n                    setShowCalendar(!showCalendar);\n                });\n\n                const calendarEl = calendarRef.current;\n                const button =\n                    calendarEl &&\n                    (calendarEl.querySelector(\n                        '[aria-pressed=\"true\"]',\n                    ) as HTMLButtonElement);\n                // Make sure the popover-modal is correctly positioned before focusing a button\n                // so we avoid accidentally scrolling to the top of the page\n                window.requestAnimationFrame(() => button?.focus());\n\n                if (action?.onClick) {\n                    action.onClick(e);\n                }\n            },\n            [showCalendar, action],\n        );\n\n        const handleClickCalendarDay = useCallback(\n            ({ date }: DateInfo) => {\n                setShowCalendar(false);\n                setDate(date);\n\n                if (inputRef.current) {\n                    const node = inputRef.current;\n\n                    didAutoFormatCompactInputRef.current = false;\n                    node.value = formatInput(date);\n\n                    // Simulér et change-event så APIet blir så likt som mulig en endring av inputfeltet\n                    const event = document.createEvent(\"HTMLEvents\");\n                    event.initEvent(\"input\", true, false);\n                    node.dispatchEvent(event);\n\n                    node.focus();\n\n                    if (onChange) {\n                        // Det er ikke helt sant at dette er et React.SyntheticEvent, men it's fine – probably?\n                        // Den har tingene man kan forvente, men hvis du gjør serdeles fancy ting med events\n                        // så kan det hende du må utvide denne for å dekke behovet ditt.\n                        onChange(\n                            event as unknown as ChangeEvent<HTMLInputElement>,\n                            date,\n                            {\n                                error: null,\n                                value: node.value,\n                            },\n                        );\n                    }\n                }\n            },\n            [onChange],\n        );\n\n        const handleTabOutsideCalendar = useCallback((e: KeyboardEvent) => {\n            e.preventDefault();\n            setShowCalendar(false);\n            iconButtonRef.current?.focus();\n        }, []);\n\n        return (\n            <InputGroup\n                id={id}\n                className={clsx(\"jkl-datepicker\", className)}\n                {...rest}\n                ref={datepickerRef}\n                label={label}\n                labelProps={labelProps}\n                helpLabel={helpLabel}\n                errorLabel={errorLabel}\n                supportLabelProps={supportLabelProps}\n                tooltip={tooltip}\n                description={description}\n                render={(inputProps) => (\n                    <BaseTextInput\n                        data-focused={showCalendar ? \"true\" : undefined}\n                        ref={unifiedInputRef}\n                        data-testid=\"jkl-datepicker__input\"\n                        data-testautoid={testAutoId}\n                        className=\"jkl-datepicker__input\"\n                        name={name}\n                        defaultValue={defaultValue}\n                        value={value}\n                        type=\"text\"\n                        placeholder={placeholder}\n                        width={width}\n                        onFocus={handleFocus}\n                        onBlur={handleBlur}\n                        onChange={handleChange}\n                        actionButton={\n                            <Popover\n                                positionReference={inputRef}\n                                open={showCalendar}\n                                onOpenChange={() =>\n                                    setShowCalendar(!showCalendar)\n                                }\n                                offset={8}\n                            >\n                                <Popover.Trigger\n                                    {...action}\n                                    data-testid=\"jkl-datepicker__trigger\"\n                                    className=\"jkl-text-input-action-button\"\n                                    title={\n                                        showCalendar\n                                            ? hideCalendarLabel\n                                            : showCalendarLabel\n                                    }\n                                    tabIndex={0}\n                                    onClick={clickCalendar}\n                                    onKeyDown={handleKeyDownAction}\n                                    asChild\n                                >\n                                    <IconButton>\n                                        <CalendarIcon />\n                                    </IconButton>\n                                </Popover.Trigger>\n                                <Popover.Content initialFocus={-1} padding={24}>\n                                    <Calendar\n                                        ref={calendarRef}\n                                        date={date}\n                                        minDate={minDate}\n                                        maxDate={maxDate}\n                                        days={days}\n                                        months={months}\n                                        monthLabel={monthLabel}\n                                        yearLabel={yearLabel}\n                                        yearsToShow={yearsToShow}\n                                        onDateSelected={handleClickCalendarDay}\n                                        onTabOutside={handleTabOutsideCalendar}\n                                    />\n                                </Popover.Content>\n                            </Popover>\n                        }\n                        {...textInputProps}\n                        {...inputProps}\n                        aria-invalid={invalid || !!errorLabel}\n                    />\n                )}\n            />\n        );\n    },\n);\n\nDatePicker.displayName = \"DatePicker\";\n"],"names":["DatePicker","forwardRef","props","forwardedInputRef","testAutoId","id","className","label","labelProps","defaultValue","defaultShow","value","disableBeforeDate","disableBefore","disableAfterDate","disableAfter","yearsToShow","name","helpLabel","errorLabel","invalid","days","months","monthLabel","yearLabel","placeholder","width","onChange","onBlur","onFocus","onKeyDown","action","showCalendarLabel","hideCalendarLabel","supportLabelProps","tooltip","textInputProps","description","rest","process","env","NODE_ENV","console","warn","parseDateString","minDate","dayjs","startOf","toDate","maxDate","date","setDate","useState","getInitialDate","error","setError","showCalendar","setShowCalendar","calendarRef","useRef","datepickerRef","iconButtonRef","inputRef","didAutoFormatCompactInputRef","unifiedInputRef","useCallback","instance","current","handleFocus","e","contains","relatedTarget","target","handleBlur","handleKeyDownAction","key","preventDefault","stopPropagation","handleChange","rawValue","currentTarget","formattedValue","shouldStripAutoFormatting","digits","replace","partialCompactDate","formatDateString","partial","rawValueWithoutTrailingPunctuation","compactDateCandidate","length","validCompactDate","shouldRemoveFormatting","normalizeInputValue","input","nativeSetter","Object","getOwnPropertyDescriptor","HTMLInputElement","prototype","set","call","setInputValue","nextDate","nextError","parsedDate","isWithinLowerBound","isWithinUpperBound","getInputValidationState","clickCalendar","flushSync","calendarEl","button","querySelector","window","requestAnimationFrame","focus","onClick","handleClickCalendarDay","node","formatInput","event","document","createEvent","initEvent","dispatchEvent","handleTabOutsideCalendar","jsx","InputGroup","clsx","ref","render","inputProps","BaseTextInput","type","actionButton","jsxs","Popover","positionReference","open","onOpenChange","offset","children","Trigger","title","tabIndex","asChild","IconButton","CalendarIcon","Content","initialFocus","padding","Calendar","onDateSelected","onTabOutside","displayName"],"mappings":"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"}