{"version":3,"file":"Calendar.cjs","sources":["../../../../../src/components/datepicker/internal/Calendar.tsx"],"sourcesContent":["import React, {\n    forwardRef,\n    useCallback,\n    useEffect,\n    useReducer,\n    useRef,\n} from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { useId } from \"../../../hooks/useId/useId.js\";\nimport { Button } from \"../../button/Button.js\";\nimport { ArrowLeftIcon } from \"../../icon/icons/ArrowLeftIcon.js\";\nimport { ArrowRightIcon } from \"../../icon/icons/ArrowRightIcon.js\";\nimport { ChevronDownIcon } from \"../../icon/icons/ChevronDownIcon.js\";\nimport type { YearsToShow } from \"../types.js\";\nimport { calendarInitializer, calendarReducer } from \"./calendarReducer.js\";\nimport { type UseCalendarProps, useCalendar } from \"./useCalendar.js\";\nimport {\n    DEFAULT_YEARS_TO_SHOW,\n    type DateInfo,\n    addMonth,\n    getInitialDateShown,\n    getMonthSelectOptions,\n    getYearSelectOptions,\n    isBackDisabled,\n    isForwardDisabled,\n    subtractMonth,\n} from \"./utils.js\";\n\ninterface CalendarProps\n    extends Omit<\n        UseCalendarProps,\n        \"date\" | \"onOffsetChanged\" | \"offset\" | \"firstDayOfWeek\" | \"selected\"\n    > {\n    date: Date | null;\n    defaultSelected?: Date;\n    days?: string[];\n    months?: string[];\n    monthLabel?: string;\n    yearLabel?: string;\n    yearsToShow?: YearsToShow;\n    onTabOutside: React.KeyboardEventHandler;\n}\n\nconst defaultMonths = [\n    \"Januar\",\n    \"Februar\",\n    \"Mars\",\n    \"April\",\n    \"Mai\",\n    \"Juni\",\n    \"Juli\",\n    \"August\",\n    \"September\",\n    \"Oktober\",\n    \"November\",\n    \"Desember\",\n];\n\nconst defaultDays = [\"man\", \"tir\", \"ons\", \"tor\", \"fre\", \"lør\", \"søn\"];\n\nexport const Calendar = forwardRef<HTMLDivElement, CalendarProps>(\n    (props, ref) => {\n        const {\n            date,\n            defaultSelected,\n            minDate,\n            maxDate,\n            days = defaultDays,\n            months = defaultMonths,\n            monthLabel = \"Velg måned\",\n            yearLabel = \"Velg år\",\n            yearsToShow = DEFAULT_YEARS_TO_SHOW,\n            onTabOutside,\n            ...rest\n        } = props;\n\n        const id = useId(\"jkl-calendar\");\n\n        const [{ offset, selectedDate, shownDate }, dispatch] = useReducer(\n            calendarReducer,\n            getInitialDateShown(date, defaultSelected, minDate, maxDate),\n            calendarInitializer,\n        );\n\n        const shownMonth = shownDate.getMonth();\n        const shownYear = shownDate.getFullYear();\n\n        useEffect(() => {\n            dispatch({\n                type: \"SET_SELECTED_DATE\",\n                newDate: getInitialDateShown(\n                    date,\n                    defaultSelected,\n                    minDate,\n                    maxDate,\n                ),\n            });\n        }, [date, defaultSelected, minDate, maxDate]);\n\n        const onOffsetChanged = useCallback((newOffset: number) => {\n            dispatch({\n                type: \"SET_OFFSET\",\n                newOffset,\n            });\n        }, []);\n\n        const {\n            calendars,\n            getBackProps,\n            getDateProps,\n            getForwardProps,\n            handleOffsetChanged,\n        } = useCalendar({\n            date: selectedDate,\n            selected: selectedDate,\n            minDate,\n            maxDate,\n            offset,\n            onOffsetChanged,\n            firstDayOfWeek: 1,\n            ...rest,\n        });\n\n        /// Calendar keyboard navigation\n\n        const calendarPaddingRef = useRef<HTMLDivElement>(null);\n        const doFocusChange = useCallback(\n            (offsetDiff: number) => {\n                if (!calendarPaddingRef.current) {\n                    return;\n                }\n\n                const e = document.activeElement;\n                const buttons =\n                    calendarPaddingRef.current.querySelectorAll<HTMLButtonElement>(\n                        'button.jkl-calendar-date-button:not([data-adjacent=\"true\"]',\n                    );\n\n                const changeFocusTo = async (nextButton: HTMLButtonElement) => {\n                    e?.setAttribute(\"tabindex\", \"-1\");\n                    nextButton.setAttribute(\"tabindex\", \"0\");\n                    nextButton.focus();\n                };\n\n                buttons.forEach((el, i) => {\n                    const newNodeKey = i + offsetDiff;\n\n                    if (el === e) {\n                        if (\n                            newNodeKey <= buttons.length - 1 &&\n                            newNodeKey >= 0\n                        ) {\n                            changeFocusTo(buttons[newNodeKey]);\n                        } else if (offsetDiff < 0) {\n                            if (isBackDisabled({ calendars, minDate })) {\n                                return;\n                            }\n\n                            // Hvis newNodeKey er utenfor samlingen med knapper så har vi prøvd å gå til\n                            // en dag utenfor måneden. Er offsetDiff negativ så har vi gått tilbake en\n                            // måned.\n                            flushSync(() => {\n                                handleOffsetChanged(\n                                    offset -\n                                        subtractMonth({\n                                            calendars,\n                                            offset: 1,\n                                            minDate,\n                                        }),\n                                );\n                            });\n                            if (!calendarPaddingRef.current) {\n                                return;\n                            }\n                            const newButtons =\n                                calendarPaddingRef.current.querySelectorAll<HTMLButtonElement>(\n                                    'button.jkl-calendar-date-button:not([data-adjacent=\"true\"]',\n                                );\n                            // + - = -\n                            if (newButtons[newButtons.length + newNodeKey]) {\n                                // Sørg for at ikke både 1. i måneden og valgt dag er fokuserbare\n                                newButtons[0].setAttribute(\"tabindex\", \"-1\");\n                                changeFocusTo(\n                                    newButtons[newButtons.length + newNodeKey],\n                                );\n                            }\n                        } else {\n                            if (isForwardDisabled({ calendars, maxDate })) {\n                                return;\n                            }\n\n                            // Hvis newNodeKey er utenfor samlingen med knapper så har vi prøvd å gå til\n                            // en dag utenfor måneden. Er offsetDiff positiv så har vi gått frem en\n                            // måned.\n                            flushSync(() => {\n                                handleOffsetChanged(\n                                    offset +\n                                        addMonth({\n                                            calendars,\n                                            offset: 1,\n                                            maxDate,\n                                        }),\n                                );\n                            });\n                            if (!calendarPaddingRef.current) {\n                                return;\n                            }\n                            const newButtons =\n                                calendarPaddingRef.current.querySelectorAll<HTMLButtonElement>(\n                                    'button.jkl-calendar-date-button:not([data-adjacent=\"true\"]',\n                                );\n                            // NewNodeKey er basert på forrige måneds liste med knapper. For at verdien skal bli\n                            // riktig i vår nye måned må vi trekke fra anntal dager fra forrige måned.\n                            if (newButtons[newNodeKey - buttons.length]) {\n                                // Sørg for at ikke både 1. i måneden og valgt dag er fokuserbare\n                                newButtons[0].setAttribute(\"tabindex\", \"-1\");\n                                changeFocusTo(\n                                    newButtons[newNodeKey - buttons.length],\n                                );\n                            }\n                        }\n                    }\n                });\n            },\n            [handleOffsetChanged, offset, calendars, maxDate, minDate],\n        );\n\n        const handleArrowNavigation = useCallback(\n            (event: React.KeyboardEvent) => {\n                switch (event.key) {\n                    case \"ArrowUp\":\n                        doFocusChange(-7);\n                        event.preventDefault();\n                        break;\n                    case \"ArrowRight\":\n                        doFocusChange(1);\n                        event.preventDefault();\n                        break;\n                    case \"ArrowDown\":\n                        doFocusChange(7);\n                        event.preventDefault();\n                        break;\n                    case \"ArrowLeft\":\n                        doFocusChange(-1);\n                        event.preventDefault();\n                        break;\n                    default:\n                        break;\n                }\n            },\n            [doFocusChange],\n        );\n\n        const handleTabInside: React.KeyboardEventHandler = useCallback(\n            (event) => {\n                if (event.key !== \"Tab\") return;\n\n                const focusableElements =\n                    calendarPaddingRef.current?.querySelectorAll<HTMLElement>(\n                        'button:not([disabled]):not([tabindex=\"-1\"]), select',\n                    );\n\n                if (!focusableElements) return;\n\n                const firstElement = focusableElements[0];\n                const lastElement =\n                    focusableElements[focusableElements.length - 1];\n\n                if (!event.shiftKey && document.activeElement === lastElement) {\n                    firstElement.focus();\n                    event.preventDefault();\n                } else if (\n                    event.shiftKey &&\n                    document.activeElement === firstElement\n                ) {\n                    lastElement.focus();\n                    event.preventDefault();\n                }\n            },\n            [],\n        );\n\n        const isFocusableDate = useCallback(\n            (dateInfo: DateInfo) => {\n                const { date, selected, selectable, prevMonth, nextMonth } =\n                    dateInfo;\n\n                // Datoen kan ikke velges\n                if (!selectable) {\n                    return false;\n                }\n                // Datoen er valgt dato\n                if (selected) {\n                    return true;\n                }\n                // Datoen er første valgbare dato\n                if (date.toString() === minDate?.toString()) {\n                    return true;\n                }\n\n                // Datoen er første i måneden som vises\n                if (\n                    !prevMonth &&\n                    !nextMonth &&\n                    shownDate.getFullYear() === date.getFullYear() &&\n                    selectedDate.getMonth() !== date.getMonth() &&\n                    date.getDate() === 1\n                ) {\n                    return true;\n                }\n\n                return false;\n            },\n            [shownDate, minDate, selectedDate],\n        );\n\n        const handleGotoEdgeMonth = useCallback(() => {\n            if (\n                // Vi er i ferd med å gå til første måned\n                minDate &&\n                shownDate.getFullYear() - minDate.getFullYear() === 0 &&\n                shownDate.getMonth() - minDate.getMonth() === 1\n            ) {\n                // Fokuser på \"neste månded\"-knappen\n                document\n                    .querySelector<HTMLButtonElement>(\n                        `[data-testid=\"${id}-forward-button\"]`,\n                    )\n                    ?.focus();\n            } else if (\n                // Vi er i ferd med å gå til siste måned\n                maxDate &&\n                maxDate.getFullYear() - shownDate.getFullYear() === 0 &&\n                maxDate.getMonth() - shownDate.getMonth() === 1\n            ) {\n                // Fokuser på \"forrige månded\"-knappen\n                document\n                    .querySelector<HTMLButtonElement>(\n                        `[data-testid=\"${id}-back-button\"]`,\n                    )\n                    ?.focus();\n            }\n        }, [minDate, maxDate, shownDate, id]);\n\n        /// Extended variant events\n\n        const handleYearChange = useCallback<\n            React.ChangeEventHandler<HTMLSelectElement>\n        >(\n            (event) => {\n                if (event.target.value.length !== 4) {\n                    return;\n                }\n\n                const year: number = Number.parseInt(event.target.value);\n                if (Number.isNaN(year)) {\n                    return;\n                }\n\n                let offset = (year - shownDate.getFullYear()) * 12;\n                const expectedDate = new Date(\n                    shownDate.getFullYear(),\n                    shownDate.getMonth() + offset,\n                    shownDate.getDate(),\n                );\n\n                // Pass på at vi ikke hopper forbi maks. eller min. dato\n                if (\n                    maxDate &&\n                    maxDate.getFullYear() === expectedDate.getFullYear() &&\n                    maxDate.getMonth() < expectedDate.getMonth()\n                ) {\n                    offset -= expectedDate.getMonth() - maxDate.getMonth();\n                } else if (\n                    minDate &&\n                    minDate.getFullYear() === expectedDate.getFullYear() &&\n                    minDate.getMonth() > expectedDate.getMonth()\n                ) {\n                    offset += minDate.getMonth() - expectedDate.getMonth();\n                }\n\n                dispatch({\n                    type: \"ADD_OFFSET\",\n                    addedOffset: offset,\n                });\n\n                return;\n            },\n            [shownDate, minDate, maxDate],\n        );\n\n        const handleMonthChange = useCallback<\n            React.ChangeEventHandler<HTMLSelectElement>\n        >(\n            (event) => {\n                if (!selectedDate && !date) {\n                    return;\n                }\n\n                const yearDiff =\n                    shownDate.getFullYear() -\n                    (selectedDate || new Date()).getFullYear();\n                const monthDiff =\n                    Number.parseInt(event.target.value) -\n                    (selectedDate || new Date()).getMonth();\n\n                dispatch({\n                    type: \"SET_OFFSET\",\n                    newOffset: yearDiff * 12 + monthDiff,\n                });\n\n                return;\n            },\n            [selectedDate, date, shownDate],\n        );\n\n        const yearSelectOptions = getYearSelectOptions(\n            shownYear,\n            minDate,\n            maxDate,\n            yearsToShow,\n        );\n        const monthSelectOptions = getMonthSelectOptions(\n            shownYear,\n            months,\n            minDate,\n            maxDate,\n        );\n\n        return (\n            <div\n                ref={ref}\n                id={id}\n                className=\"jkl-calendar\"\n                data-testid=\"jkl-calendar\"\n            >\n                {/* Vi lytter på på trykk på Tab inne i kalenderen for å håndtere fokus */}\n                {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions */}\n                <div\n                    className=\"jkl-calendar__padding\"\n                    ref={calendarPaddingRef}\n                    onKeyDown={handleTabInside}\n                >\n                    <fieldset className=\"jkl-calendar-navigation\">\n                        <div>\n                            <Button\n                                {...getBackProps({\n                                    calendars,\n                                    onClick: handleGotoEdgeMonth,\n                                })}\n                                data-testid={`${id}-back-button`}\n                                variant=\"ghost\"\n                                icon={<ArrowLeftIcon variant=\"medium\" bold />}\n                            />\n                            <Button\n                                {...getForwardProps({\n                                    calendars,\n                                    onClick: handleGotoEdgeMonth,\n                                })}\n                                variant=\"ghost\"\n                                data-testid={`${id}-forward-button`}\n                                icon={<ArrowRightIcon variant=\"medium\" bold />}\n                            />\n                        </div>\n                        <div>\n                            <div className=\"jkl-calendar-navigation-dropdown\">\n                                <select\n                                    onChange={handleMonthChange}\n                                    className=\"jkl-calendar-navigation-dropdown__select\"\n                                    aria-label={monthLabel}\n                                    value={shownMonth.toString()}\n                                >\n                                    {monthSelectOptions.map(\n                                        ({ label, value }) => (\n                                            <option key={value} value={value}>\n                                                {label}\n                                            </option>\n                                        ),\n                                    )}\n                                </select>\n                                <ChevronDownIcon\n                                    bold\n                                    className=\"jkl-calendar-navigation-dropdown__chevron\"\n                                />\n                            </div>\n                            <div className=\"jkl-calendar-navigation-dropdown\">\n                                <select\n                                    onChange={handleYearChange}\n                                    className=\"jkl-calendar-navigation-dropdown__select\"\n                                    aria-label={yearLabel}\n                                    value={shownYear.toString()}\n                                >\n                                    {yearSelectOptions.map((year) => (\n                                        <option key={year} value={year}>\n                                            {year}\n                                        </option>\n                                    ))}\n                                </select>\n                                <ChevronDownIcon\n                                    bold\n                                    className=\"jkl-calendar-navigation-dropdown__chevron\"\n                                />\n                            </div>\n                        </div>\n                    </fieldset>\n                    {calendars.map((calendar) => (\n                        <table\n                            className=\"jkl-calendar-table\"\n                            key={`${calendar.month}${calendar.year}`}\n                            data-testid=\"jkl-datepicker-calendar\"\n                        >\n                            <caption className=\"jkl-sr-only\">\n                                {months[calendar.month]}, {calendar.year}\n                            </caption>\n                            <thead>\n                                <tr>\n                                    {days.map((weekday) => (\n                                        <th\n                                            key={`${calendar.month}${calendar.year}${weekday}`}\n                                        >\n                                            {weekday}\n                                        </th>\n                                    ))}\n                                </tr>\n                            </thead>\n                            <tbody data-testid=\"jkl-datepicker-dates\">\n                                {calendar.weeks.map((week, weekIndex) => (\n                                    <tr\n                                        key={`${calendar.month}${calendar.year}${weekIndex}`}\n                                    >\n                                        {week.map((dateInfo, index) => {\n                                            const key = `${calendar.month}${calendar.year}${weekIndex}${index}`;\n                                            if (typeof dateInfo === \"string\") {\n                                                return (\n                                                    <td\n                                                        className=\"jkl-calendar__date jkl-calendar__date--empty\"\n                                                        key={key}\n                                                    >\n                                                        {dateInfo}\n                                                    </td>\n                                                );\n                                            }\n                                            const {\n                                                date,\n                                                selectable,\n                                                today,\n                                                prevMonth,\n                                                nextMonth,\n                                            } = dateInfo;\n\n                                            return (\n                                                <td key={key}>\n                                                    <button\n                                                        {...getDateProps({\n                                                            dateObj: dateInfo,\n                                                        })}\n                                                        type=\"button\"\n                                                        className=\"jkl-calendar-date-button\"\n                                                        tabIndex={\n                                                            isFocusableDate(\n                                                                dateInfo,\n                                                            )\n                                                                ? 0\n                                                                : -1\n                                                        }\n                                                        aria-label={`${date.getDate()}. ${months[\n                                                            date.getMonth()\n                                                        ].toLowerCase()}`}\n                                                        aria-current={\n                                                            today\n                                                                ? \"date\"\n                                                                : undefined\n                                                        }\n                                                        data-adjacent={\n                                                            prevMonth ||\n                                                            nextMonth\n                                                                ? \"true\"\n                                                                : undefined\n                                                        }\n                                                        disabled={!selectable}\n                                                        onKeyDown={\n                                                            handleArrowNavigation\n                                                        }\n                                                    >\n                                                        <span aria-hidden=\"true\">\n                                                            {date.getDate()}\n                                                        </span>\n                                                    </button>\n                                                </td>\n                                            );\n                                        })}\n                                    </tr>\n                                ))}\n                            </tbody>\n                        </table>\n                    ))}\n                </div>\n            </div>\n        );\n    },\n);\n\nCalendar.displayName = \"Calendar\";\n"],"names":["defaultMonths","defaultDays","Calendar","forwardRef","props","ref","date","defaultSelected","minDate","maxDate","days","months","monthLabel","yearLabel","yearsToShow","DEFAULT_YEARS_TO_SHOW","onTabOutside","rest","id","useId","offset","selectedDate","shownDate","dispatch","useReducer","calendarReducer","getInitialDateShown","calendarInitializer","shownMonth","getMonth","shownYear","getFullYear","useEffect","type","newDate","onOffsetChanged","useCallback","newOffset","calendars","getBackProps","getDateProps","getForwardProps","handleOffsetChanged","useCalendar","selected","firstDayOfWeek","calendarPaddingRef","useRef","doFocusChange","offsetDiff","current","e","document","activeElement","buttons","querySelectorAll","changeFocusTo","async","setAttribute","nextButton","focus","forEach","el","i","newNodeKey","length","isBackDisabled","flushSync","subtractMonth","newButtons","isForwardDisabled","addMonth","handleArrowNavigation","event","key","preventDefault","handleTabInside","focusableElements","firstElement","lastElement","shiftKey","isFocusableDate","dateInfo","selectable","prevMonth","nextMonth","toString","getDate","handleGotoEdgeMonth","querySelector","handleYearChange","target","value","year","Number","parseInt","isNaN","expectedDate","Date","addedOffset","handleMonthChange","yearDiff","monthDiff","yearSelectOptions","getYearSelectOptions","monthSelectOptions","getMonthSelectOptions","jsx","className","children","jsxs","onKeyDown","Button","onClick","variant","icon","ArrowLeftIcon","bold","ArrowRightIcon","onChange","map","label","ChevronDownIcon","calendar","month","weekday","weeks","week","weekIndex","index","today","dateObj","tabIndex","toLowerCase","disabled","displayName"],"mappings":"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"}