@entur/datepicker 2.0.4 → 2.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"datepicker.cjs.production.min.js","sources":["../src/DatePicker/DatePickerHeader.tsx","../src/DatePicker/DatePickerInput.tsx","../src/DatePicker/DatePicker.tsx","../src/NativeDatePicker.tsx","../src/TimePicker.tsx","../src/NativeTimePicker.tsx","../src/index.tsx"],"sourcesContent":["import React from 'react';\nimport { ReactDatePickerCustomHeaderProps } from 'react-datepicker';\n\nimport { LeftArrowIcon, RightArrowIcon } from '@entur/icons';\nimport { Heading3 } from '@entur/typography';\nimport { IconButton } from '@entur/button';\n\nexport const DatePickerHeader = ({\n date,\n decreaseMonth,\n increaseMonth,\n prevMonthButtonDisabled,\n nextMonthButtonDisabled,\n}: Partial<ReactDatePickerCustomHeaderProps>) => {\n const monthNames = getMonthList();\n return (\n <div className=\"eds-datepicker__calender__header\">\n <IconButton\n type=\"button\"\n className=\"eds-datepicker__calender__header__month-button--left\"\n onClick={decreaseMonth}\n disabled={prevMonthButtonDisabled}\n >\n <LeftArrowIcon />\n </IconButton>\n <Heading3 className=\"eds-datepicker__calender__header__month-text\">\n {monthNames[date?.getMonth() ?? 0]}\n </Heading3>\n <Heading3 className=\"eds-datepicker__calender__header__month-text\">\n {date?.getFullYear()}\n </Heading3>\n\n <IconButton\n type=\"button\"\n className=\"eds-datepicker__calender__header__month-button--right\"\n onClick={increaseMonth}\n disabled={nextMonthButtonDisabled}\n >\n <RightArrowIcon />\n </IconButton>\n </div>\n );\n};\n\nfunction getMonthList(locale = 'nb') {\n const year = new Date().getFullYear();\n const monthList = Array(12).keys();\n const formatter = new Intl.DateTimeFormat(locale, {\n month: 'long',\n });\n const getMonthName = (monthIndex: number) =>\n formatter.format(new Date(year, monthIndex));\n\n return Array.from(monthList, getMonthName);\n}\n","import React from 'react';\n\nimport { TextField, VariantType } from '@entur/form';\nimport { Tooltip } from '@entur/tooltip';\nimport { IconButton } from '@entur/button';\nimport { CalendarIcon } from '@entur/icons';\n\ntype DatePickerInputProps = {\n style?: React.CSSProperties;\n label: string;\n inputPlaceholder: string;\n prepend?: React.ReactNode;\n feedback?: string;\n variant?: VariantType;\n disabled?: boolean;\n disableLabelAnimation?: boolean;\n calendarButtonTooltip: string;\n hideCalendarButton?: boolean;\n inputRef: React.RefObject<HTMLInputElement>;\n forwardRef: React.ForwardedRef<HTMLInputElement>;\n toggleCalendarGUI: () => void;\n onClick?: React.MouseEventHandler<HTMLButtonElement | HTMLInputElement>;\n onKeyDownInput: (event: KeyboardEvent) => any;\n onBlurInput: (event: FocusEvent) => any;\n onFocus: undefined; // To prevent open on focus\n selectedDate: Date | null; // Necessary to update component on state change\n placeholder?: null; // override react-datepickers placeholder prop\n};\n\nexport const DatePickerInput = React.forwardRef<\n HTMLInputElement,\n DatePickerInputProps\n>(\n (\n {\n style,\n label,\n inputPlaceholder,\n prepend,\n feedback,\n variant,\n disabled,\n calendarButtonTooltip,\n hideCalendarButton,\n disableLabelAnimation,\n inputRef,\n forwardRef,\n toggleCalendarGUI,\n onKeyDownInput,\n onBlurInput,\n selectedDate,\n placeholder, // eslint-disable-line\n ...rest // forwarded props from react-datepicker\n },\n ref,\n ) => {\n React.useEffect(() => {\n inputRef.current?.addEventListener('keydown', handleOnKeyDown);\n inputRef.current?.addEventListener('blur', handleOnBlur);\n inputRef.current?.addEventListener('focus', handleOnFocus);\n return () => {\n inputRef.current?.removeEventListener('keydown', handleOnKeyDown);\n inputRef.current?.removeEventListener('blur', handleOnBlur);\n inputRef.current?.removeEventListener('focus', handleOnFocus);\n };\n }, [inputRef, selectedDate]);\n\n function handleOnKeyDown(this: HTMLElement, event: KeyboardEvent) {\n onKeyDownInput(event);\n }\n function handleOnBlur(this: HTMLElement, event: FocusEvent) {\n onBlurInput(event);\n }\n function handleOnFocus() {\n setTimeout(() => inputRef.current?.select(), 5);\n }\n\n return (\n <TextField\n style={style}\n label={label}\n placeholder={inputPlaceholder}\n prepend={prepend}\n feedback={feedback}\n variant={variant}\n disableLabelAnimation={disableLabelAnimation}\n ref={mergeRefs(ref, inputRef, forwardRef)}\n append={\n !hideCalendarButton && (\n <Tooltip\n placement=\"top\"\n content={calendarButtonTooltip}\n disableHoverListener={disabled}\n disableFocusListener={disabled}\n >\n <IconButton type=\"button\" onClick={toggleCalendarGUI}>\n <CalendarIcon />\n </IconButton>\n </Tooltip>\n )\n }\n {...rest}\n />\n );\n },\n);\n\nconst mergeRefs = <T extends HTMLElement>(\n ...refs: React.MutableRefObject<T>[] | React.ForwardedRef<T>[]\n) => {\n return (node: T) => {\n for (const ref of refs) {\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) ref.current = node;\n }\n };\n};\n","import React, { useRef, useState } from 'react';\nimport ReactDatePicker, {\n default as ReactDatepicker,\n ReactDatePickerProps,\n registerLocale,\n} from 'react-datepicker';\nimport { parse, isSameDay, Locale } from 'date-fns';\nimport { nb } from 'date-fns/locale';\nimport classNames from 'classnames';\n\nimport { VariantType } from '@entur/form';\nimport { useRandomId } from '@entur/utils';\n\nimport { DatePickerHeader } from './DatePickerHeader';\nimport { DatePickerInput } from './DatePickerInput';\n\nimport './DatePicker.scss';\nimport 'react-datepicker/dist/react-datepicker.css';\n\nregisterLocale('nb', nb);\n\nexport type DatePickerProps = {\n /** Hva som er den valgte datoen */\n selectedDate: Date | null;\n /** Kalles når datoen/tiden endres */\n onChange: (\n date: Date | null,\n event: React.SyntheticEvent<any, Event> | undefined,\n ) => void;\n /**\n * Kalles når en tast trykkes i inputfeltet\n */\n onKeyDown?: (event: KeyboardEvent) => void;\n /**\n * Datoformater som skal støttes. Første i listen er formatet alt input omgjøres til.\n * Format-valg tilgjengelig her: https://date-fns.org/v2.28.0/docs/format\n * OBS: Noen kombinasjoner av datoformater kan gi rar og uønsket oppførsel,\n * test nøye ved endring\n * @default \"['dd.MM.yyyy', 'ddMMyyyy', 'dd/MM/yyyy', 'ddMMyy']\"\n */\n dateFormats?: string[];\n /**\n * Locale fra date-fns som brukes av Datepicker-en\n * @default nb\n */\n locale?: Locale;\n /** Placeholder om ingen dato er valgt\n * @default \"dd.mm.yyyy\"\n */\n placeholder?: string;\n /** Ekstra klassenavn */\n className?: string;\n /** Label over DatePicker */\n label: string;\n /**\n * Varselmelding, som vil komme under DatePicker\n */\n feedback?: string;\n /** Valideringsvariant\n */\n variant?: VariantType;\n /** Varselmelding for når datoen er på feil format\n * @default \"Ugyldig dato\"\n */\n validationFeedback?: string;\n /** Valideringsvariant for melding om feil datoformat\n * @default \"error\"\n */\n validationVariant?: VariantType;\n style?: React.CSSProperties;\n /** Plasserer labelen statisk på toppen av inputfeltet\n * @default false\n */\n disableLabelAnimation?: boolean;\n /** Tekst eller ikon som kommer før inputfelter\n * @default <DateIcon />\n */\n prepend?: React.ReactNode;\n /**\n * Tekst som vises ved hover på «Åpne kalender»-knappen\n */\n calendarButtonTooltip?: string;\n /** Skjuler knapp for åpning av kalender\n * @default false\n */\n hideCalendarButton?: boolean;\n /** Skjuler tilbakemeldingsteksten ved feil dato-input\n * @default false\n */\n hideValidation?: boolean;\n /** Skjuler kalender-GUI-et\n * @default false\n */\n hideCalendar?: boolean;\n /** Viser kun kalender-popover-en\n * @default false\n */\n inline?: boolean;\n // For testing\n 'data-cy'?: any;\n} & Omit<\n ReactDatePickerProps,\n 'selected' | 'customInput' | 'onChangeRaw' | 'dateFormat' | 'locale'\n>;\n\nexport const DatePicker = React.forwardRef<HTMLInputElement, DatePickerProps>(\n (\n {\n style,\n className,\n selectedDate,\n label,\n placeholder = 'dd.mm.yyyy',\n onChange,\n onKeyDown = () => null,\n dateFormats = ['dd.MM.yyyy', 'ddMMyyyy', 'dd/MM/yyyy', 'ddMMyy'],\n minDate,\n maxDate,\n inline = false,\n disabled,\n prepend,\n feedback = '',\n variant,\n validationFeedback = 'Ugyldig dato',\n validationVariant = 'error',\n disableLabelAnimation = false,\n calendarButtonTooltip = 'Åpne\\xa0kalender',\n hideCalendarButton = false,\n hideCalendar = false,\n hideValidation = false,\n weekLabel = 'uke',\n locale = nb,\n open,\n ...rest\n },\n ref,\n ) => {\n const datepickerId = useRandomId('eds-datepicker');\n\n const [showValidation, setShowValidation] = useState(false);\n\n const datepickerRef = useRef<ReactDatePicker>(null);\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n React.useEffect(() => validateInput(), [selectedDate]);\n\n const handleOnKeyDown = (event: KeyboardEvent) => {\n const calendarIsClosed = !datepickerRef.current?.isCalendarOpen();\n\n setShowValidation(false);\n if (event.key === 'Enter') {\n validateInput();\n focusAndSelectInputField();\n forceUpdateInputFormat();\n } else if (event.key === 'Tab' && calendarIsClosed) {\n validateInput();\n forceUpdateInputFormat();\n }\n onKeyDown(event);\n };\n\n const validateInput = () => {\n setShowValidation(false);\n const inputValue = inputRef.current?.value;\n if (!inputValue) return;\n\n const inputValueParsedWithAllDateFormats = dateFormats.map(format =>\n parse(inputValue, format, new Date(), {\n locale: locale,\n }),\n );\n\n const parsedDateFromInputIsTheSameAsSelectedDate =\n selectedDate &&\n inputValueParsedWithAllDateFormats.some(dateFormat =>\n isSameDay(dateFormat, selectedDate),\n );\n\n if (parsedDateFromInputIsTheSameAsSelectedDate) {\n // valid date inputted\n setShowValidation(false);\n } else {\n // invalid date inputted\n setShowValidation(true);\n }\n };\n\n const getFeedbackAndVariant = (): {\n feedback: string;\n variant: VariantType | undefined;\n } => {\n if (feedback) return { feedback, variant };\n if (!hideValidation && showValidation)\n return { feedback: validationFeedback, variant: validationVariant };\n return { feedback: '', variant: undefined };\n };\n\n const focusAndSelectInputField = () =>\n setTimeout(() => {\n inputRef.current?.select();\n }, 5);\n\n const forceUpdateInputFormat = () =>\n datepickerRef.current?.setState({ inputValue: null });\n\n const toggleCalendarGUI = () =>\n datepickerRef.current?.setOpen(!datepickerRef.current?.isCalendarOpen());\n\n return (\n <>\n <ReactDatepicker\n selected={selectedDate}\n minDate={minDate}\n maxDate={maxDate}\n dateFormat={dateFormats}\n showWeekNumbers\n weekLabel={weekLabel}\n onChange={onChange}\n onClickOutside={validateInput}\n id={datepickerId}\n ariaLabelledBy={datepickerId}\n showPopperArrow={false}\n locale={locale}\n inline={inline}\n disabled={disabled}\n preventOpenOnFocus={true}\n open={hideCalendar ? false : open}\n ref={datepickerRef}\n calendarClassName=\"eds-datepicker__calender\"\n dayClassName={() => 'eds-datepicker__calender__day'}\n weekDayClassName={() => 'eds-datepicker__calender__day-name'}\n className={classNames(className, 'eds-datepicker__input')}\n highlightDates={[\n { 'eds-datepicker__calender__day--today': [new Date()] },\n {\n 'eds-datepicker__calender__day--selected': selectedDate\n ? [selectedDate]\n : [],\n },\n ]}\n renderCustomHeader={({\n date,\n changeYear,\n changeMonth,\n decreaseMonth,\n increaseMonth,\n prevMonthButtonDisabled,\n nextMonthButtonDisabled,\n }) => (\n <DatePickerHeader\n date={date}\n changeYear={changeYear}\n changeMonth={changeMonth}\n increaseMonth={increaseMonth}\n decreaseMonth={decreaseMonth}\n prevMonthButtonDisabled={prevMonthButtonDisabled}\n nextMonthButtonDisabled={nextMonthButtonDisabled}\n />\n )}\n customInput={\n <DatePickerInput\n style={style}\n label={label}\n inputPlaceholder={placeholder}\n calendarButtonTooltip={calendarButtonTooltip}\n prepend={prepend}\n feedback={getFeedbackAndVariant().feedback}\n variant={getFeedbackAndVariant().variant}\n inputRef={inputRef}\n forwardRef={ref}\n onKeyDownInput={handleOnKeyDown}\n onBlurInput={() =>\n !datepickerRef.current?.isCalendarOpen() && validateInput()\n }\n onFocus={undefined}\n toggleCalendarGUI={toggleCalendarGUI}\n disableLabelAnimation={disableLabelAnimation}\n hideCalendarButton={hideCalendarButton}\n selectedDate={selectedDate}\n />\n }\n {...rest}\n />\n </>\n );\n },\n);\n","import React from 'react';\nimport {\n BaseFormControl,\n isFilled,\n useInputGroupContext,\n useVariant,\n VariantType,\n} from '@entur/form';\nimport { DateIcon } from '@entur/icons';\nimport { useOnMount, useRandomId } from '@entur/utils';\n\nexport type NativeDatePickerProps = {\n /** Ekstra klassenavn */\n className?: string;\n /** Label over NativeDatePicker */\n label: string;\n /** Varselmelding, som vil komme under NativeDatePicker */\n feedback?: string;\n /** Valideringsvariant */\n variant?: VariantType;\n /** Plasserer labelen statisk på toppen av inputfeltet\n * @default false\n */\n disableLabelAnimation?: boolean;\n /** Tekst eller ikon som kommer før inputfelter\n * @default <DateIcon />\n */\n prepend?: React.ReactNode;\n} & React.InputHTMLAttributes<HTMLInputElement>;\n\nexport const NativeDatePicker = React.forwardRef<\n HTMLInputElement,\n NativeDatePickerProps\n>(\n (\n {\n className,\n style,\n label,\n onChange,\n feedback,\n variant,\n disableLabelAnimation,\n prepend = <DateIcon inline />,\n ...rest\n },\n ref: React.Ref<HTMLInputElement>,\n ) => {\n const nativedatepickerId = useRandomId('eds-nativetimepicker');\n return (\n <BaseFormControl\n style={style}\n className={className}\n prepend={prepend}\n label={label}\n feedback={feedback}\n variant={variant}\n labelId={nativedatepickerId}\n disableLabelAnimation={disableLabelAnimation}\n isFilled\n >\n <NativeDatePickerBase\n onChange={onChange}\n aria-labelledby={nativedatepickerId}\n ref={ref}\n variant={variant}\n {...rest}\n />\n </BaseFormControl>\n );\n },\n);\n\ntype NativeDatePickerBaseProps = {\n onChange?: any;\n variant?: VariantType;\n} & React.DetailedHTMLProps<\n React.InputHTMLAttributes<HTMLInputElement>,\n HTMLInputElement\n>;\n\nconst NativeDatePickerBase = React.forwardRef<\n HTMLInputElement,\n NativeDatePickerBaseProps\n>(({ onChange, variant, value, ...rest }, ref) => {\n const contextVariant = useVariant();\n const currentVariant = variant || contextVariant;\n const { isFilled: isDatepickerFilled, setFilled: setFiller } =\n useInputGroupContext();\n\n useOnMount(() => {\n setFiller && !isDatepickerFilled && setFiller(true);\n });\n\n React.useEffect(() => {\n if (value) {\n setFiller && !isDatepickerFilled && setFiller(true);\n } else {\n setFiller && isDatepickerFilled && setFiller(false);\n }\n }, [value, setFiller, isDatepickerFilled]);\n\n const handleChange = (event: any) => {\n if (isFilled(event.target)) {\n setFiller && !isDatepickerFilled && setFiller(true);\n } else {\n setFiller && isDatepickerFilled && setFiller(false);\n }\n if (onChange) {\n onChange(event);\n }\n };\n return (\n <input\n ref={ref}\n aria-invalid={currentVariant === 'error'}\n type=\"date\"\n className=\"eds-form-control eds-native-date-picker\"\n onChange={handleChange}\n value={value}\n {...rest}\n />\n );\n});\n","import React from 'react';\nimport {\n default as ReactDatepicker,\n ReactDatePickerProps,\n registerLocale,\n} from 'react-datepicker';\nimport classNames from 'classnames';\nimport {\n BaseFormControl,\n useInputGroupContext,\n VariantType,\n} from '@entur/form';\nimport { LeftArrowIcon, RightArrowIcon } from '@entur/icons';\nimport { useOnMount, useRandomId } from '@entur/utils';\nimport { nb } from 'date-fns/locale';\nimport { add, sub } from 'date-fns';\nimport * as Popper from '@popperjs/core';\nimport './TimePicker.scss';\nregisterLocale('nb', nb);\n\nexport type TimePickerProps = {\n /** Hva som er den valgte datoen */\n selectedTime?: Date;\n /** Kalles når datoen/tiden endres */\n onChange: (\n date: Date | null,\n event: React.SyntheticEvent<any, Event>,\n ) => void;\n /** Placeholder om ingen dato er valgt\n * @default \"Velg tid\"\n */\n placeholder?: string;\n /** Ekstra klassenavn */\n className?: string;\n /** Label over TimePicker */\n label: string;\n /** Varselmelding, som vil komme under TimePicker */\n feedback?: string;\n /** Valideringsvariant */\n variant?: VariantType;\n style?: React.CSSProperties;\n labelTooltip?: React.ReactNode;\n /** Plasserer labelen statisk på toppen av inputfeltet\n * @default false\n */\n disableLabelAnimation?: boolean;\n /** Kalles ved klikk på pil venstre i TimePicker\n * @default Trekker fra 30 minutter av den valgte tiden\n */\n onLeftArrowClick?: (selectedTime?: Date | null, e?: React.MouseEvent) => void;\n /** Kalles ved klikk på pil høyre i TimePicker\n * @default Legger til 30 minutter av den valgte tiden\n */\n onRightArrowClick?: (\n selectedTime?: Date | null,\n e?: React.MouseEvent,\n ) => void;\n} & ReactDatePickerProps;\n\nexport const TimePicker = React.forwardRef<HTMLDivElement, TimePickerProps>(\n (\n {\n selectedTime = null,\n onChange,\n placeholder = 'Velg tid',\n disabled,\n className,\n style,\n label,\n labelTooltip,\n feedback,\n variant,\n disableLabelAnimation,\n locale = 'nb',\n onLeftArrowClick = (selectedTime, event) =>\n selectedTime && onChange(sub(selectedTime, { minutes: 30 }), event),\n onRightArrowClick = (selectedTime, event) =>\n selectedTime && onChange(add(selectedTime, { minutes: 30 }), event),\n ...rest\n },\n ref,\n ) => {\n const timepickerId = useRandomId('eds-timepicker');\n return (\n <BaseFormControl\n style={style}\n ref={ref}\n label={label}\n labelId={timepickerId}\n labelTooltip={labelTooltip}\n variant={variant}\n feedback={feedback}\n disableLabelAnimation={disableLabelAnimation}\n className=\"eds-timepicker-form-control\"\n disabled={disabled}\n prepend={\n <TimePickerArrowButton\n direction=\"left\"\n tabIndex={-1}\n onClick={(e: React.MouseEvent) => onLeftArrowClick(selectedTime, e)}\n disabled={disabled}\n />\n }\n >\n <TimePickerBase\n selectedTime={selectedTime}\n onChange={onChange}\n placeholder={placeholder}\n className={className}\n locale={locale}\n ariaLabelledBy={timepickerId}\n disabled={disabled}\n {...rest}\n />\n <TimePickerArrowButton\n direction=\"right\"\n tabIndex={-1}\n onClick={(e: React.MouseEvent) => onRightArrowClick(selectedTime, e)}\n disabled={disabled}\n />\n </BaseFormControl>\n );\n },\n);\n\ntype TimePickerBaseProps = {\n /** Hva som er den valgte datoen */\n selectedTime?: Date | null;\n /** Kalles når datoen/tiden endres */\n onChange: (\n date: Date | null,\n event: React.SyntheticEvent<any, Event>,\n ) => void;\n /** Placeholder om ingen dato er valgt\n * @default \"Velg tid\"\n */\n placeholder?: string;\n /** Ekstra klassenavn */\n className?: string;\n [key: string]: any;\n} & ReactDatePickerProps;\n\nconst POPPER_MODIFIERS: Popper.StrictModifiers[] = [\n {\n name: 'offset',\n enabled: true,\n options: {\n offset: [0, 0],\n },\n },\n];\nconst TimePickerBase: React.FC<TimePickerBaseProps> = ({\n className,\n onChange,\n selectedTime,\n placeholder,\n timeFormat = 'HH:mm',\n dateFormat = ['HH:mm', 'HHmm'],\n ...rest\n}) => {\n const { isFilled: isTimepickerFilled, setFilled: setFiller } =\n useInputGroupContext();\n\n useOnMount(() => {\n if (selectedTime) {\n setFiller && !isTimepickerFilled && setFiller(true);\n }\n });\n\n React.useEffect(() => {\n if (selectedTime) {\n setFiller && !isTimepickerFilled && setFiller(true);\n } else {\n setFiller && isTimepickerFilled && setFiller(false);\n }\n }, [selectedTime, setFiller, isTimepickerFilled]);\n\n const handleChange = (date: any, event: any) => {\n if (date) {\n setFiller && !isTimepickerFilled && setFiller(true);\n } else {\n setFiller && isTimepickerFilled && setFiller(false);\n }\n if (onChange) {\n onChange(date, event);\n }\n };\n return (\n <ReactDatepicker\n className={classNames(\n 'eds-form-control',\n 'eds-timepicker__input',\n className,\n )}\n calendarClassName=\"eds-timepicker\"\n selected={selectedTime}\n onChange={handleChange}\n dateFormat={dateFormat}\n timeFormat={timeFormat}\n showTimeSelect\n showTimeInput={true}\n showTimeSelectOnly\n showPopperArrow={false}\n placeholderText={placeholder}\n popperClassName=\"eds-datepicker__popper\"\n popperModifiers={POPPER_MODIFIERS}\n open={false}\n {...rest}\n />\n );\n};\n\ntype TimePickerArrowButtonProps = {\n direction: 'left' | 'right';\n} & React.DetailedHTMLProps<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n HTMLButtonElement\n>;\n\nconst TimePickerArrowButton: React.FC<TimePickerArrowButtonProps> = ({\n direction,\n ...rest\n}) => {\n return (\n <button\n className={classNames(\n 'eds-timepicker__arrowbutton',\n `eds-timepicker__arrowbutton--${direction}`,\n )}\n type=\"button\"\n {...rest}\n >\n {direction === 'left' ? <LeftArrowIcon /> : <RightArrowIcon />}\n </button>\n );\n};\n","import React from 'react';\nimport {\n BaseFormControl,\n isFilled,\n useInputGroupContext,\n useVariant,\n VariantType,\n} from '@entur/form';\nimport { ClockIcon } from '@entur/icons';\nimport { useOnMount, useRandomId } from '@entur/utils';\n\nexport type NativeTimePickerProps = {\n /** Ekstra klassenavn */\n className?: string;\n /** Label over NativeTimePicker */\n label: string;\n /** Varselmelding, som vil komme under NativeTimePicker */\n feedback?: string;\n /** Valideringsvariant */\n variant?: VariantType;\n /** Plasserer labelen statisk på toppen av inputfeltet\n * @default false\n */\n disableLabelAnimation?: boolean;\n /** Tekst eller ikon som kommer før inputfelter\n * @default <ClockIcon />\n */\n prepend?: React.ReactNode;\n} & React.InputHTMLAttributes<HTMLInputElement>;\n\nexport const NativeTimePicker = React.forwardRef<\n HTMLInputElement,\n NativeTimePickerProps\n>(\n (\n {\n className,\n style,\n onChange,\n label,\n feedback,\n variant,\n disableLabelAnimation,\n prepend = <ClockIcon />,\n ...rest\n },\n ref: React.Ref<HTMLInputElement>,\n ) => {\n const nativetimepickerId = useRandomId('eds-nativetimepicker');\n return (\n <BaseFormControl\n style={style}\n className={className}\n prepend={prepend}\n label={label}\n feedback={feedback}\n variant={variant}\n labelId={nativetimepickerId}\n disableLabelAnimation={disableLabelAnimation}\n >\n <NativeTimePickerBase\n onChange={onChange}\n aria-labelledby={nativetimepickerId}\n ref={ref}\n {...rest}\n />\n </BaseFormControl>\n );\n },\n);\n\ntype NativeTimePickerBaseProps = {\n variant?: VariantType;\n} & React.DetailedHTMLProps<\n React.InputHTMLAttributes<HTMLInputElement>,\n HTMLInputElement\n>;\n\nconst NativeTimePickerBase = React.forwardRef<\n HTMLInputElement,\n NativeTimePickerBaseProps\n>(({ onChange, value, ...rest }, ref) => {\n const contextVariant = useVariant();\n const currentVariant = rest.variant || contextVariant;\n const { isFilled: isTimepickerFilled, setFilled: setFiller } =\n useInputGroupContext();\n\n useOnMount(() => {\n setFiller && !isTimepickerFilled && setFiller(true);\n });\n\n React.useEffect(() => {\n if (value) {\n setFiller && !isTimepickerFilled && setFiller(true);\n } else {\n setFiller && isTimepickerFilled && setFiller(false);\n }\n }, [value, setFiller, isTimepickerFilled]);\n\n const handleChange = (event: any) => {\n if (isFilled(event.target)) {\n setFiller && !isTimepickerFilled && setFiller(true);\n } else {\n setFiller && isTimepickerFilled && setFiller(false);\n }\n if (onChange) {\n onChange(event);\n }\n };\n return (\n <input\n ref={ref}\n aria-invalid={currentVariant === 'error'}\n type=\"time\"\n className=\"eds-form-control eds-native-date-picker\"\n onChange={handleChange}\n value={value}\n {...rest}\n />\n );\n});\n","import { warnAboutMissingStyles } from '@entur/utils';\nimport './index.scss';\n\nwarnAboutMissingStyles('datepicker', 'form', 'icons');\n\nexport * from './DatePicker';\nexport * from './NativeDatePicker';\nexport * from './TimePicker';\nexport * from './NativeTimePicker';\n"],"names":["DatePickerHeader","date","decreaseMonth","increaseMonth","prevMonthButtonDisabled","nextMonthButtonDisabled","monthNames","locale","year","Date","getFullYear","monthList","Array","keys","formatter","Intl","DateTimeFormat","month","from","monthIndex","format","getMonthList","React","className","IconButton","type","onClick","disabled","LeftArrowIcon","Heading3","getMonth","RightArrowIcon","DatePickerInput","forwardRef","ref","style","label","inputPlaceholder","prepend","feedback","variant","calendarButtonTooltip","hideCalendarButton","disableLabelAnimation","inputRef","toggleCalendarGUI","onKeyDownInput","onBlurInput","selectedDate","rest","handleOnKeyDown","event","handleOnBlur","handleOnFocus","setTimeout","current","_inputRef$current7","select","useEffect","addEventListener","removeEventListener","TextField","placeholder","mergeRefs","append","Tooltip","placement","content","disableHoverListener","disableFocusListener","CalendarIcon","refs","node","registerLocale","nb","DatePicker","onChange","onKeyDown","dateFormats","minDate","maxDate","inline","validationFeedback","validationVariant","hideCalendar","hideValidation","weekLabel","open","datepickerId","useRandomId","useState","showValidation","setShowValidation","datepickerRef","useRef","validateInput","inputValue","_inputRef$current","value","inputValueParsedWithAllDateFormats","map","parse","parsedDateFromInputIsTheSameAsSelectedDate","some","dateFormat","isSameDay","getFeedbackAndVariant","undefined","forceUpdateInputFormat","_datepickerRef$curren2","setState","ReactDatepicker","selected","showWeekNumbers","onClickOutside","id","ariaLabelledBy","showPopperArrow","preventOpenOnFocus","calendarClassName","dayClassName","weekDayClassName","classNames","highlightDates","renderCustomHeader","changeYear","changeMonth","customInput","calendarIsClosed","_datepickerRef$curren","isCalendarOpen","key","_datepickerRef$curren5","onFocus","_datepickerRef$curren3","setOpen","_datepickerRef$curren4","NativeDatePicker","DateIcon","nativedatepickerId","BaseFormControl","labelId","isFilled","NativeDatePickerBase","contextVariant","useVariant","currentVariant","useInputGroupContext","isDatepickerFilled","setFiller","setFilled","useOnMount","target","TimePicker","selectedTime","labelTooltip","onLeftArrowClick","sub","minutes","onRightArrowClick","add","timepickerId","TimePickerArrowButton","direction","tabIndex","e","TimePickerBase","POPPER_MODIFIERS","name","enabled","options","offset","timeFormat","isTimepickerFilled","showTimeSelect","showTimeInput","showTimeSelectOnly","placeholderText","popperClassName","popperModifiers","NativeTimePicker","ClockIcon","nativetimepickerId","NativeTimePickerBase","warnAboutMissingStyles"],"mappings":"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"}
1
+ {"version":3,"file":"datepicker.cjs.production.min.js","sources":["../src/DatePicker/DatePickerHeader.tsx","../src/DatePicker/DatePickerInput.tsx","../src/DatePicker/DatePicker.tsx","../src/NativeDatePicker.tsx","../src/TimePicker.tsx","../src/NativeTimePicker.tsx","../src/index.tsx"],"sourcesContent":["import React from 'react';\nimport { ReactDatePickerCustomHeaderProps } from 'react-datepicker';\n\nimport { LeftArrowIcon, RightArrowIcon } from '@entur/icons';\nimport { Heading3 } from '@entur/typography';\nimport { IconButton } from '@entur/button';\n\nexport const DatePickerHeader = ({\n date,\n decreaseMonth,\n increaseMonth,\n prevMonthButtonDisabled,\n nextMonthButtonDisabled,\n}: Partial<ReactDatePickerCustomHeaderProps>) => {\n const monthNames = getMonthList();\n return (\n <div className=\"eds-datepicker__calender__header\">\n <IconButton\n type=\"button\"\n className=\"eds-datepicker__calender__header__month-button--left\"\n onClick={decreaseMonth}\n disabled={prevMonthButtonDisabled}\n >\n <LeftArrowIcon />\n </IconButton>\n <Heading3 className=\"eds-datepicker__calender__header__month-text\">\n {monthNames[date?.getMonth() ?? 0]}\n </Heading3>\n <Heading3 className=\"eds-datepicker__calender__header__month-text\">\n {date?.getFullYear()}\n </Heading3>\n\n <IconButton\n type=\"button\"\n className=\"eds-datepicker__calender__header__month-button--right\"\n onClick={increaseMonth}\n disabled={nextMonthButtonDisabled}\n >\n <RightArrowIcon />\n </IconButton>\n </div>\n );\n};\n\nfunction getMonthList(locale = 'nb') {\n const year = new Date().getFullYear();\n const monthList = Array(12).keys();\n const formatter = new Intl.DateTimeFormat(locale, {\n month: 'long',\n });\n const getMonthName = (monthIndex: number) =>\n formatter.format(new Date(year, monthIndex));\n\n return Array.from(monthList, getMonthName);\n}\n","import React from 'react';\n\nimport { TextField, VariantType } from '@entur/form';\nimport { Tooltip } from '@entur/tooltip';\nimport { IconButton } from '@entur/button';\nimport { CalendarIcon } from '@entur/icons';\n\ntype DatePickerInputProps = {\n style?: React.CSSProperties;\n label: string;\n inputPlaceholder: string;\n prepend?: React.ReactNode;\n feedback?: string;\n variant?: VariantType;\n disabled?: boolean;\n disableLabelAnimation?: boolean;\n calendarButtonTooltip: string;\n hideCalendarButton?: boolean;\n inputRef: React.RefObject<HTMLInputElement>;\n calendarButtonId: string;\n forwardRef: React.ForwardedRef<HTMLInputElement>;\n toggleCalendarGUI: () => void;\n setFocusToCalendarGUI: () => void;\n setShouldFocusOnCalendarButtonAfterSelect: React.Dispatch<\n React.SetStateAction<boolean>\n >;\n onKeyDownInput: (event: KeyboardEvent) => any;\n onBlurInput: (event: FocusEvent) => any;\n calendarGUIIsOpen: () => boolean | undefined;\n onClick?: React.MouseEventHandler<HTMLInputElement>; // react-datepicker's onClick prop\n onFocus: undefined; // To prevent open on focus\n selectedDate: Date | null; // Necessary to update component on state change\n placeholder?: null; // override react-datepickers placeholder prop\n};\n\nexport const DatePickerInput = React.forwardRef<\n HTMLInputElement,\n DatePickerInputProps\n>(\n (\n {\n style,\n label,\n inputPlaceholder,\n prepend,\n feedback,\n variant,\n disabled,\n calendarButtonTooltip,\n hideCalendarButton,\n disableLabelAnimation,\n inputRef,\n calendarButtonId,\n forwardRef,\n toggleCalendarGUI,\n onKeyDownInput,\n onBlurInput,\n selectedDate,\n setFocusToCalendarGUI,\n setShouldFocusOnCalendarButtonAfterSelect,\n calendarGUIIsOpen,\n placeholder, // eslint-disable-line\n onClick,\n ...rest // forwarded props from react-datepicker\n },\n ref,\n ) => {\n React.useEffect(() => {\n inputRef.current?.addEventListener('keydown', handleOnKeyDown);\n inputRef.current?.addEventListener('blur', handleOnBlur);\n inputRef.current?.addEventListener('focus', handleOnFocus);\n return () => {\n inputRef.current?.removeEventListener('keydown', handleOnKeyDown);\n inputRef.current?.removeEventListener('blur', handleOnBlur);\n inputRef.current?.removeEventListener('focus', handleOnFocus);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [inputRef, selectedDate]);\n\n function handleOnKeyDown(this: HTMLElement, event: KeyboardEvent) {\n onKeyDownInput(event);\n }\n function handleOnBlur(this: HTMLElement, event: FocusEvent) {\n onBlurInput(event);\n }\n const handleOnFocus = () =>\n requestAnimationFrame(() => inputRef.current?.select());\n\n const handleOnClickInputField = (\n event: React.MouseEvent<HTMLInputElement, MouseEvent>,\n ) => {\n setShouldFocusOnCalendarButtonAfterSelect(false);\n onClick && onClick(event);\n };\n\n const handleOnClickCalendarButton = () => {\n toggleCalendarGUI();\n setFocusToCalendarGUI();\n setShouldFocusOnCalendarButtonAfterSelect(true);\n };\n\n return (\n <TextField\n style={style}\n label={label}\n placeholder={inputPlaceholder}\n prepend={prepend}\n feedback={feedback}\n variant={variant}\n disableLabelAnimation={disableLabelAnimation}\n ref={mergeRefs(ref, inputRef, forwardRef)}\n onClick={handleOnClickInputField}\n append={\n !hideCalendarButton && (\n <Tooltip\n placement=\"top\"\n content={calendarButtonTooltip}\n disableHoverListener={disabled}\n disableFocusListener={disabled}\n >\n <IconButton\n id={calendarButtonId}\n type=\"button\"\n onClick={handleOnClickCalendarButton}\n tabIndex={calendarGUIIsOpen() ? -1 : 0}\n >\n <CalendarIcon />\n </IconButton>\n </Tooltip>\n )\n }\n {...rest}\n />\n );\n },\n);\n\nconst mergeRefs = <T extends HTMLElement>(\n ...refs: React.MutableRefObject<T>[] | React.ForwardedRef<T>[]\n) => {\n return (node: T) => {\n for (const ref of refs) {\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) ref.current = node;\n }\n };\n};\n","import React, { useRef, useState } from 'react';\nimport ReactDatePicker, {\n default as ReactDatepicker,\n ReactDatePickerProps,\n registerLocale,\n} from 'react-datepicker';\nimport { parse, isSameDay, Locale } from 'date-fns';\nimport { nb } from 'date-fns/locale';\nimport classNames from 'classnames';\n\nimport { VariantType } from '@entur/form';\nimport { useRandomId } from '@entur/utils';\n\nimport { DatePickerHeader } from './DatePickerHeader';\nimport { DatePickerInput } from './DatePickerInput';\n\nimport './DatePicker.scss';\nimport 'react-datepicker/dist/react-datepicker.css';\n\nregisterLocale('nb', nb);\n\nexport type DatePickerProps = {\n /** Hva som er den valgte datoen */\n selectedDate: Date | null;\n /** Kalles når datoen/tiden endres */\n onChange: (\n date: Date | null,\n event: React.SyntheticEvent<any, Event> | undefined,\n ) => void;\n /**\n * Kalles når en tast trykkes i inputfeltet\n */\n onKeyDown?: (event: KeyboardEvent) => void;\n /**\n * Datoformater som skal støttes. Første i listen er formatet alt input omgjøres til.\n * Format-valg tilgjengelig her: https://date-fns.org/v2.28.0/docs/format\n * OBS: Noen kombinasjoner av datoformater kan gi rar og uønsket oppførsel,\n * test nøye ved endring\n * @default \"['dd.MM.yyyy', 'ddMMyyyy', 'dd/MM/yyyy', 'ddMMyy']\"\n */\n dateFormats?: string[];\n /**\n * Locale fra date-fns som brukes av Datepicker-en\n * @default nb\n */\n locale?: Locale;\n /** Placeholder om ingen dato er valgt\n * @default \"dd.mm.yyyy\"\n */\n placeholder?: string;\n /** Ekstra klassenavn */\n className?: string;\n /** Label over DatePicker */\n label: string;\n /**\n * Varselmelding, som vil komme under DatePicker\n */\n feedback?: string;\n /** Valideringsvariant\n */\n variant?: VariantType;\n /** Varselmelding for når datoen er på feil format\n * @default \"Ugyldig dato\"\n */\n validationFeedback?: string;\n /** Valideringsvariant for melding om feil datoformat\n * @default \"error\"\n */\n validationVariant?: VariantType;\n style?: React.CSSProperties;\n /** Plasserer labelen statisk på toppen av inputfeltet\n * @default false\n */\n disableLabelAnimation?: boolean;\n /** Tekst eller ikon som kommer før inputfelter\n * @default <DateIcon />\n */\n prepend?: React.ReactNode;\n /**\n * Tekst som vises ved hover på «Åpne kalender»-knappen\n */\n calendarButtonTooltip?: string;\n /** Skjuler knapp for åpning av kalender\n * @default false\n */\n hideCalendarButton?: boolean;\n /** Skjuler tilbakemeldingsteksten ved feil dato-input\n * @default false\n */\n hideValidation?: boolean;\n /** Skjuler kalender-GUI-et\n * @default false\n */\n hideCalendar?: boolean;\n /** Viser kun kalender-popover-en\n * @default false\n */\n inline?: boolean;\n // For testing\n 'data-cy'?: any;\n} & Omit<\n ReactDatePickerProps,\n 'selected' | 'customInput' | 'onChangeRaw' | 'dateFormat' | 'locale'\n>;\n\nexport const DatePicker = React.forwardRef<HTMLInputElement, DatePickerProps>(\n (\n {\n style,\n className,\n selectedDate,\n label,\n placeholder = 'dd.mm.yyyy',\n onChange,\n onKeyDown = () => null,\n dateFormats = ['dd.MM.yyyy', 'ddMMyyyy', 'dd/MM/yyyy', 'ddMMyy'],\n minDate,\n maxDate,\n inline = false,\n disabled,\n prepend,\n feedback = '',\n variant,\n validationFeedback = 'Ugyldig dato',\n validationVariant = 'error',\n disableLabelAnimation = false,\n calendarButtonTooltip = 'Åpne\\xa0kalender',\n hideCalendarButton = false,\n hideCalendar = false,\n hideValidation = false,\n weekLabel = 'uke',\n locale = nb,\n open,\n ...rest\n },\n ref,\n ) => {\n const datepickerId = useRandomId('eds-datepicker');\n\n const datepickerRef = useRef<ReactDatePicker>(null);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const calendarButton = document.getElementById(datepickerId + '-button');\n\n const [showValidation, setShowValidation] = useState(false);\n const [\n shouldFocusOnCalendarButtonAfterSelect,\n setShouldFocusOnCalendarButtonAfterSelect,\n ] = useState(false);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n React.useEffect(() => validateInput(), [selectedDate]);\n\n const handleOnChange = (\n date: Date | null,\n event: React.SyntheticEvent<any, Event> | undefined,\n ): void => {\n if (shouldFocusOnCalendarButtonAfterSelect && !hideCalendarButton) {\n calendarButton?.focus();\n setShouldFocusOnCalendarButtonAfterSelect(false);\n } else inputRef.current?.focus();\n\n onChange(date, event);\n };\n\n const handleOnKeyDown = (event: KeyboardEvent) => {\n setShowValidation(false);\n\n if (event.key === 'Enter') {\n if (!datePickerGUIIsOpen()) {\n // onBlurInput will validate if calendar is open\n validateInput();\n forceUpdateInputFormat();\n }\n focusAndSelectInputField();\n } else if (event.key === 'Tab' && datePickerGUIIsOpen()) {\n forceUpdateInputFormat();\n } else if (event.key === 'Escape') {\n forceUpdateInputFormat();\n focusAndSelectInputField();\n if (datePickerGUIIsOpen()) toggleCalendarGUI();\n }\n onKeyDown(event);\n };\n\n const handleOnClickOutside = () =>\n setShouldFocusOnCalendarButtonAfterSelect(false);\n\n const handleOnBlurInput = () => {\n if (datePickerGUIIsOpen()) return;\n validateInput();\n forceUpdateInputFormat();\n };\n\n const validateInput = () => {\n setShowValidation(false);\n const inputValue = inputRef.current?.value;\n if (!inputValue) return;\n\n const inputValueParsedWithAllDateFormats = dateFormats.map(format =>\n parse(inputValue, format, new Date(), {\n locale: locale,\n }),\n );\n\n const parsedDateFromInputIsTheSameAsSelectedDate =\n selectedDate &&\n inputValueParsedWithAllDateFormats.some(dateFormat =>\n isSameDay(dateFormat, selectedDate),\n );\n\n if (parsedDateFromInputIsTheSameAsSelectedDate) {\n // valid date inputted\n setShowValidation(false);\n } else {\n // invalid date inputted\n setShowValidation(true);\n }\n };\n\n const getFeedbackAndVariant = (): {\n feedback: string;\n variant: VariantType | undefined;\n } => {\n if (feedback) return { feedback, variant };\n if (!hideValidation && showValidation)\n return { feedback: validationFeedback, variant: validationVariant };\n return { feedback: '', variant: undefined };\n };\n\n const focusAndSelectInputField = () =>\n requestAnimationFrame(() => inputRef.current?.select());\n\n const forceUpdateInputFormat = () =>\n datepickerRef.current?.setState({ inputValue: null });\n\n const toggleCalendarGUI = () =>\n datepickerRef.current?.setOpen(!datePickerGUIIsOpen());\n\n // this focus function will fail if both an inline and a non-inline calendar is present in the same document\n const setFocusToCalendarGUI = () => {\n if (inline || hideCalendar || datePickerGUIIsOpen()) return;\n // 1 frame delay to allow calendar to spawn\n requestAnimationFrame(() => {\n const dateToSetFocusTo = selectedDate\n ? (document.getElementsByClassName(\n 'eds-datepicker__calender__day--selected',\n )[0] as HTMLElement | null)\n : (document.getElementsByClassName(\n 'eds-datepicker__calender__day--today',\n )[0] as HTMLElement | null);\n if (dateToSetFocusTo !== null) dateToSetFocusTo.focus();\n });\n setShouldFocusOnCalendarButtonAfterSelect(true);\n setShowValidation(false);\n };\n\n const datePickerGUIIsOpen = () => datepickerRef.current?.isCalendarOpen();\n\n return (\n <>\n <ReactDatepicker\n selected={selectedDate}\n minDate={minDate}\n maxDate={maxDate}\n dateFormat={dateFormats}\n showWeekNumbers\n weekLabel={weekLabel}\n onChange={handleOnChange}\n onClickOutside={handleOnClickOutside}\n id={datepickerId}\n ariaLabelledBy={datepickerId}\n showPopperArrow={false}\n locale={locale}\n inline={inline}\n disabled={disabled}\n preventOpenOnFocus={true}\n open={hideCalendar ? false : open}\n ref={datepickerRef}\n calendarClassName=\"eds-datepicker__calender\"\n dayClassName={() => 'eds-datepicker__calender__day'}\n weekDayClassName={() => 'eds-datepicker__calender__day-name'}\n className={classNames(className, 'eds-datepicker__input')}\n highlightDates={[\n { 'eds-datepicker__calender__day--today': [new Date()] },\n {\n 'eds-datepicker__calender__day--selected': selectedDate\n ? [selectedDate]\n : [],\n },\n ]}\n renderCustomHeader={({\n date,\n changeYear,\n changeMonth,\n decreaseMonth,\n increaseMonth,\n prevMonthButtonDisabled,\n nextMonthButtonDisabled,\n }) => (\n <DatePickerHeader\n date={date}\n changeYear={changeYear}\n changeMonth={changeMonth}\n increaseMonth={increaseMonth}\n decreaseMonth={decreaseMonth}\n prevMonthButtonDisabled={prevMonthButtonDisabled}\n nextMonthButtonDisabled={nextMonthButtonDisabled}\n />\n )}\n customInput={\n <DatePickerInput\n style={style}\n label={label}\n inputPlaceholder={placeholder}\n calendarButtonTooltip={calendarButtonTooltip}\n prepend={prepend}\n feedback={getFeedbackAndVariant().feedback}\n variant={getFeedbackAndVariant().variant}\n inputRef={inputRef}\n calendarButtonId={datepickerId + '-button'}\n forwardRef={ref}\n onKeyDownInput={handleOnKeyDown}\n onBlurInput={handleOnBlurInput}\n onFocus={undefined}\n toggleCalendarGUI={toggleCalendarGUI}\n setFocusToCalendarGUI={setFocusToCalendarGUI}\n setShouldFocusOnCalendarButtonAfterSelect={\n setShouldFocusOnCalendarButtonAfterSelect\n }\n calendarGUIIsOpen={datePickerGUIIsOpen}\n disableLabelAnimation={disableLabelAnimation}\n hideCalendarButton={hideCalendarButton}\n selectedDate={selectedDate}\n />\n }\n {...rest}\n />\n </>\n );\n },\n);\n","import React from 'react';\nimport {\n BaseFormControl,\n isFilled,\n useInputGroupContext,\n useVariant,\n VariantType,\n} from '@entur/form';\nimport { DateIcon } from '@entur/icons';\nimport { useOnMount, useRandomId } from '@entur/utils';\n\nexport type NativeDatePickerProps = {\n /** Ekstra klassenavn */\n className?: string;\n /** Label over NativeDatePicker */\n label: string;\n /** Varselmelding, som vil komme under NativeDatePicker */\n feedback?: string;\n /** Valideringsvariant */\n variant?: VariantType;\n /** Plasserer labelen statisk på toppen av inputfeltet\n * @default false\n */\n disableLabelAnimation?: boolean;\n /** Tekst eller ikon som kommer før inputfelter\n * @default <DateIcon />\n */\n prepend?: React.ReactNode;\n} & React.InputHTMLAttributes<HTMLInputElement>;\n\nexport const NativeDatePicker = React.forwardRef<\n HTMLInputElement,\n NativeDatePickerProps\n>(\n (\n {\n className,\n style,\n label,\n onChange,\n feedback,\n variant,\n disableLabelAnimation,\n prepend = <DateIcon inline />,\n ...rest\n },\n ref: React.Ref<HTMLInputElement>,\n ) => {\n const nativedatepickerId = useRandomId('eds-nativetimepicker');\n return (\n <BaseFormControl\n style={style}\n className={className}\n prepend={prepend}\n label={label}\n feedback={feedback}\n variant={variant}\n labelId={nativedatepickerId}\n disableLabelAnimation={disableLabelAnimation}\n isFilled\n >\n <NativeDatePickerBase\n onChange={onChange}\n aria-labelledby={nativedatepickerId}\n ref={ref}\n variant={variant}\n {...rest}\n />\n </BaseFormControl>\n );\n },\n);\n\ntype NativeDatePickerBaseProps = {\n onChange?: any;\n variant?: VariantType;\n} & React.DetailedHTMLProps<\n React.InputHTMLAttributes<HTMLInputElement>,\n HTMLInputElement\n>;\n\nconst NativeDatePickerBase = React.forwardRef<\n HTMLInputElement,\n NativeDatePickerBaseProps\n>(({ onChange, variant, value, ...rest }, ref) => {\n const contextVariant = useVariant();\n const currentVariant = variant || contextVariant;\n const { isFilled: isDatepickerFilled, setFilled: setFiller } =\n useInputGroupContext();\n\n useOnMount(() => {\n setFiller && !isDatepickerFilled && setFiller(true);\n });\n\n React.useEffect(() => {\n if (value) {\n setFiller && !isDatepickerFilled && setFiller(true);\n } else {\n setFiller && isDatepickerFilled && setFiller(false);\n }\n }, [value, setFiller, isDatepickerFilled]);\n\n const handleChange = (event: any) => {\n if (isFilled(event.target)) {\n setFiller && !isDatepickerFilled && setFiller(true);\n } else {\n setFiller && isDatepickerFilled && setFiller(false);\n }\n if (onChange) {\n onChange(event);\n }\n };\n return (\n <input\n ref={ref}\n aria-invalid={currentVariant === 'error'}\n type=\"date\"\n className=\"eds-form-control eds-native-date-picker\"\n onChange={handleChange}\n value={value}\n {...rest}\n />\n );\n});\n","import React from 'react';\nimport {\n default as ReactDatepicker,\n ReactDatePickerProps,\n registerLocale,\n} from 'react-datepicker';\nimport classNames from 'classnames';\nimport {\n BaseFormControl,\n useInputGroupContext,\n VariantType,\n} from '@entur/form';\nimport { LeftArrowIcon, RightArrowIcon } from '@entur/icons';\nimport { useOnMount, useRandomId } from '@entur/utils';\nimport { nb } from 'date-fns/locale';\nimport { add, sub } from 'date-fns';\nimport * as Popper from '@popperjs/core';\nimport './TimePicker.scss';\nregisterLocale('nb', nb);\n\nexport type TimePickerProps = {\n /** Hva som er den valgte datoen */\n selectedTime?: Date;\n /** Kalles når datoen/tiden endres */\n onChange: (\n date: Date | null,\n event: React.SyntheticEvent<any, Event>,\n ) => void;\n /** Placeholder om ingen dato er valgt\n * @default \"Velg tid\"\n */\n placeholder?: string;\n /** Ekstra klassenavn */\n className?: string;\n /** Label over TimePicker */\n label: string;\n /** Varselmelding, som vil komme under TimePicker */\n feedback?: string;\n /** Valideringsvariant */\n variant?: VariantType;\n style?: React.CSSProperties;\n labelTooltip?: React.ReactNode;\n /** Plasserer labelen statisk på toppen av inputfeltet\n * @default false\n */\n disableLabelAnimation?: boolean;\n /** Kalles ved klikk på pil venstre i TimePicker\n * @default Trekker fra 30 minutter av den valgte tiden\n */\n onLeftArrowClick?: (selectedTime?: Date | null, e?: React.MouseEvent) => void;\n /** Kalles ved klikk på pil høyre i TimePicker\n * @default Legger til 30 minutter av den valgte tiden\n */\n onRightArrowClick?: (\n selectedTime?: Date | null,\n e?: React.MouseEvent,\n ) => void;\n} & ReactDatePickerProps;\n\nexport const TimePicker = React.forwardRef<HTMLDivElement, TimePickerProps>(\n (\n {\n selectedTime = null,\n onChange,\n placeholder = 'Velg tid',\n disabled,\n className,\n style,\n label,\n labelTooltip,\n feedback,\n variant,\n disableLabelAnimation,\n locale = 'nb',\n onLeftArrowClick = (selectedTime, event) =>\n selectedTime && onChange(sub(selectedTime, { minutes: 30 }), event),\n onRightArrowClick = (selectedTime, event) =>\n selectedTime && onChange(add(selectedTime, { minutes: 30 }), event),\n ...rest\n },\n ref,\n ) => {\n const timepickerId = useRandomId('eds-timepicker');\n return (\n <BaseFormControl\n style={style}\n ref={ref}\n label={label}\n labelId={timepickerId}\n labelTooltip={labelTooltip}\n variant={variant}\n feedback={feedback}\n disableLabelAnimation={disableLabelAnimation}\n className=\"eds-timepicker-form-control\"\n disabled={disabled}\n prepend={\n <TimePickerArrowButton\n direction=\"left\"\n tabIndex={-1}\n onClick={(e: React.MouseEvent) => onLeftArrowClick(selectedTime, e)}\n disabled={disabled}\n />\n }\n >\n <TimePickerBase\n selectedTime={selectedTime}\n onChange={onChange}\n placeholder={placeholder}\n className={className}\n locale={locale}\n ariaLabelledBy={timepickerId}\n disabled={disabled}\n {...rest}\n />\n <TimePickerArrowButton\n direction=\"right\"\n tabIndex={-1}\n onClick={(e: React.MouseEvent) => onRightArrowClick(selectedTime, e)}\n disabled={disabled}\n />\n </BaseFormControl>\n );\n },\n);\n\ntype TimePickerBaseProps = {\n /** Hva som er den valgte datoen */\n selectedTime?: Date | null;\n /** Kalles når datoen/tiden endres */\n onChange: (\n date: Date | null,\n event: React.SyntheticEvent<any, Event>,\n ) => void;\n /** Placeholder om ingen dato er valgt\n * @default \"Velg tid\"\n */\n placeholder?: string;\n /** Ekstra klassenavn */\n className?: string;\n [key: string]: any;\n} & ReactDatePickerProps;\n\nconst POPPER_MODIFIERS: Popper.StrictModifiers[] = [\n {\n name: 'offset',\n enabled: true,\n options: {\n offset: [0, 0],\n },\n },\n];\nconst TimePickerBase: React.FC<TimePickerBaseProps> = ({\n className,\n onChange,\n selectedTime,\n placeholder,\n timeFormat = 'HH:mm',\n dateFormat = ['HH:mm', 'HHmm'],\n ...rest\n}) => {\n const { isFilled: isTimepickerFilled, setFilled: setFiller } =\n useInputGroupContext();\n\n useOnMount(() => {\n if (selectedTime) {\n setFiller && !isTimepickerFilled && setFiller(true);\n }\n });\n\n React.useEffect(() => {\n if (selectedTime) {\n setFiller && !isTimepickerFilled && setFiller(true);\n } else {\n setFiller && isTimepickerFilled && setFiller(false);\n }\n }, [selectedTime, setFiller, isTimepickerFilled]);\n\n const handleChange = (date: any, event: any) => {\n if (date) {\n setFiller && !isTimepickerFilled && setFiller(true);\n } else {\n setFiller && isTimepickerFilled && setFiller(false);\n }\n if (onChange) {\n onChange(date, event);\n }\n };\n return (\n <ReactDatepicker\n className={classNames(\n 'eds-form-control',\n 'eds-timepicker__input',\n className,\n )}\n calendarClassName=\"eds-timepicker\"\n selected={selectedTime}\n onChange={handleChange}\n dateFormat={dateFormat}\n timeFormat={timeFormat}\n showTimeSelect\n showTimeInput={true}\n showTimeSelectOnly\n showPopperArrow={false}\n placeholderText={placeholder}\n popperClassName=\"eds-datepicker__popper\"\n popperModifiers={POPPER_MODIFIERS}\n open={false}\n {...rest}\n />\n );\n};\n\ntype TimePickerArrowButtonProps = {\n direction: 'left' | 'right';\n} & React.DetailedHTMLProps<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n HTMLButtonElement\n>;\n\nconst TimePickerArrowButton: React.FC<TimePickerArrowButtonProps> = ({\n direction,\n ...rest\n}) => {\n return (\n <button\n className={classNames(\n 'eds-timepicker__arrowbutton',\n `eds-timepicker__arrowbutton--${direction}`,\n )}\n type=\"button\"\n {...rest}\n >\n {direction === 'left' ? <LeftArrowIcon /> : <RightArrowIcon />}\n </button>\n );\n};\n","import React from 'react';\nimport {\n BaseFormControl,\n isFilled,\n useInputGroupContext,\n useVariant,\n VariantType,\n} from '@entur/form';\nimport { ClockIcon } from '@entur/icons';\nimport { useOnMount, useRandomId } from '@entur/utils';\n\nexport type NativeTimePickerProps = {\n /** Ekstra klassenavn */\n className?: string;\n /** Label over NativeTimePicker */\n label: string;\n /** Varselmelding, som vil komme under NativeTimePicker */\n feedback?: string;\n /** Valideringsvariant */\n variant?: VariantType;\n /** Plasserer labelen statisk på toppen av inputfeltet\n * @default false\n */\n disableLabelAnimation?: boolean;\n /** Tekst eller ikon som kommer før inputfelter\n * @default <ClockIcon />\n */\n prepend?: React.ReactNode;\n} & React.InputHTMLAttributes<HTMLInputElement>;\n\nexport const NativeTimePicker = React.forwardRef<\n HTMLInputElement,\n NativeTimePickerProps\n>(\n (\n {\n className,\n style,\n onChange,\n label,\n feedback,\n variant,\n disableLabelAnimation,\n prepend = <ClockIcon />,\n ...rest\n },\n ref: React.Ref<HTMLInputElement>,\n ) => {\n const nativetimepickerId = useRandomId('eds-nativetimepicker');\n return (\n <BaseFormControl\n style={style}\n className={className}\n prepend={prepend}\n label={label}\n feedback={feedback}\n variant={variant}\n labelId={nativetimepickerId}\n disableLabelAnimation={disableLabelAnimation}\n >\n <NativeTimePickerBase\n onChange={onChange}\n aria-labelledby={nativetimepickerId}\n ref={ref}\n {...rest}\n />\n </BaseFormControl>\n );\n },\n);\n\ntype NativeTimePickerBaseProps = {\n variant?: VariantType;\n} & React.DetailedHTMLProps<\n React.InputHTMLAttributes<HTMLInputElement>,\n HTMLInputElement\n>;\n\nconst NativeTimePickerBase = React.forwardRef<\n HTMLInputElement,\n NativeTimePickerBaseProps\n>(({ onChange, value, ...rest }, ref) => {\n const contextVariant = useVariant();\n const currentVariant = rest.variant || contextVariant;\n const { isFilled: isTimepickerFilled, setFilled: setFiller } =\n useInputGroupContext();\n\n useOnMount(() => {\n setFiller && !isTimepickerFilled && setFiller(true);\n });\n\n React.useEffect(() => {\n if (value) {\n setFiller && !isTimepickerFilled && setFiller(true);\n } else {\n setFiller && isTimepickerFilled && setFiller(false);\n }\n }, [value, setFiller, isTimepickerFilled]);\n\n const handleChange = (event: any) => {\n if (isFilled(event.target)) {\n setFiller && !isTimepickerFilled && setFiller(true);\n } else {\n setFiller && isTimepickerFilled && setFiller(false);\n }\n if (onChange) {\n onChange(event);\n }\n };\n return (\n <input\n ref={ref}\n aria-invalid={currentVariant === 'error'}\n type=\"time\"\n className=\"eds-form-control eds-native-date-picker\"\n onChange={handleChange}\n value={value}\n {...rest}\n />\n );\n});\n","import { warnAboutMissingStyles } from '@entur/utils';\nimport './index.scss';\n\nwarnAboutMissingStyles('datepicker', 'form', 'icons');\n\nexport * from './DatePicker';\nexport * from './NativeDatePicker';\nexport * from './TimePicker';\nexport * from './NativeTimePicker';\n"],"names":["DatePickerHeader","date","decreaseMonth","increaseMonth","prevMonthButtonDisabled","nextMonthButtonDisabled","monthNames","locale","year","Date","getFullYear","monthList","Array","keys","formatter","Intl","DateTimeFormat","month","from","monthIndex","format","getMonthList","React","className","IconButton","type","onClick","disabled","LeftArrowIcon","Heading3","getMonth","RightArrowIcon","DatePickerInput","forwardRef","ref","style","label","inputPlaceholder","prepend","feedback","variant","calendarButtonTooltip","hideCalendarButton","disableLabelAnimation","inputRef","calendarButtonId","toggleCalendarGUI","onKeyDownInput","onBlurInput","selectedDate","setFocusToCalendarGUI","setShouldFocusOnCalendarButtonAfterSelect","calendarGUIIsOpen","rest","handleOnKeyDown","event","handleOnBlur","useEffect","current","addEventListener","handleOnFocus","removeEventListener","requestAnimationFrame","_inputRef$current7","select","TextField","placeholder","mergeRefs","append","Tooltip","placement","content","disableHoverListener","disableFocusListener","id","tabIndex","CalendarIcon","refs","node","registerLocale","nb","DatePicker","onChange","onKeyDown","dateFormats","minDate","maxDate","inline","validationFeedback","validationVariant","hideCalendar","hideValidation","weekLabel","open","datepickerId","useRandomId","datepickerRef","useRef","calendarButton","document","getElementById","useState","showValidation","setShowValidation","shouldFocusOnCalendarButtonAfterSelect","validateInput","inputValue","_inputRef$current2","value","inputValueParsedWithAllDateFormats","map","parse","parsedDateFromInputIsTheSameAsSelectedDate","some","dateFormat","isSameDay","getFeedbackAndVariant","undefined","focusAndSelectInputField","_inputRef$current3","forceUpdateInputFormat","_datepickerRef$curren","setState","_datepickerRef$curren2","setOpen","datePickerGUIIsOpen","_datepickerRef$curren3","isCalendarOpen","ReactDatepicker","selected","showWeekNumbers","focus","onClickOutside","ariaLabelledBy","showPopperArrow","preventOpenOnFocus","calendarClassName","dayClassName","weekDayClassName","classNames","highlightDates","renderCustomHeader","changeYear","changeMonth","customInput","key","onFocus","dateToSetFocusTo","getElementsByClassName","NativeDatePicker","DateIcon","nativedatepickerId","BaseFormControl","labelId","isFilled","NativeDatePickerBase","contextVariant","useVariant","currentVariant","useInputGroupContext","isDatepickerFilled","setFiller","setFilled","useOnMount","target","TimePicker","selectedTime","labelTooltip","onLeftArrowClick","sub","minutes","onRightArrowClick","add","timepickerId","TimePickerArrowButton","direction","e","TimePickerBase","POPPER_MODIFIERS","name","enabled","options","offset","timeFormat","isTimepickerFilled","showTimeSelect","showTimeInput","showTimeSelectOnly","placeholderText","popperClassName","popperModifiers","NativeTimePicker","ClockIcon","nativetimepickerId","NativeTimePickerBase","warnAboutMissingStyles"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { useRandomId, useOnMount, warnAboutMissingStyles } from '@entur/utils';
2
- import React, { useState, useRef } from 'react';
2
+ import React, { useRef, useState } from 'react';
3
3
  import ReactDatepicker, { registerLocale } from 'react-datepicker';
4
4
  import { parse, isSameDay, sub, add } from 'date-fns';
5
5
  import { nb } from 'date-fns/locale';
@@ -128,7 +128,7 @@ function getMonthList(locale) {
128
128
  return Array.from(monthList, getMonthName);
129
129
  }
130
130
 
131
- var _excluded$4 = ["style", "label", "inputPlaceholder", "prepend", "feedback", "variant", "disabled", "calendarButtonTooltip", "hideCalendarButton", "disableLabelAnimation", "inputRef", "forwardRef", "toggleCalendarGUI", "onKeyDownInput", "onBlurInput", "selectedDate", "placeholder"];
131
+ var _excluded$4 = ["style", "label", "inputPlaceholder", "prepend", "feedback", "variant", "disabled", "calendarButtonTooltip", "hideCalendarButton", "disableLabelAnimation", "inputRef", "calendarButtonId", "forwardRef", "toggleCalendarGUI", "onKeyDownInput", "onBlurInput", "selectedDate", "setFocusToCalendarGUI", "setShouldFocusOnCalendarButtonAfterSelect", "calendarGUIIsOpen", "placeholder", "onClick"];
132
132
  var DatePickerInput = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
133
133
  var style = _ref.style,
134
134
  label = _ref.label,
@@ -141,11 +141,16 @@ var DatePickerInput = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
141
141
  hideCalendarButton = _ref.hideCalendarButton,
142
142
  disableLabelAnimation = _ref.disableLabelAnimation,
143
143
  inputRef = _ref.inputRef,
144
+ calendarButtonId = _ref.calendarButtonId,
144
145
  forwardRef = _ref.forwardRef,
145
146
  toggleCalendarGUI = _ref.toggleCalendarGUI,
146
147
  onKeyDownInput = _ref.onKeyDownInput,
147
148
  onBlurInput = _ref.onBlurInput,
148
149
  selectedDate = _ref.selectedDate,
150
+ setFocusToCalendarGUI = _ref.setFocusToCalendarGUI,
151
+ setShouldFocusOnCalendarButtonAfterSelect = _ref.setShouldFocusOnCalendarButtonAfterSelect,
152
+ calendarGUIIsOpen = _ref.calendarGUIIsOpen,
153
+ onClick = _ref.onClick,
149
154
  rest = _objectWithoutPropertiesLoose(_ref, _excluded$4);
150
155
 
151
156
  React.useEffect(function () {
@@ -160,7 +165,7 @@ var DatePickerInput = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
160
165
  (_inputRef$current4 = inputRef.current) == null ? void 0 : _inputRef$current4.removeEventListener('keydown', handleOnKeyDown);
161
166
  (_inputRef$current5 = inputRef.current) == null ? void 0 : _inputRef$current5.removeEventListener('blur', handleOnBlur);
162
167
  (_inputRef$current6 = inputRef.current) == null ? void 0 : _inputRef$current6.removeEventListener('focus', handleOnFocus);
163
- };
168
+ }; // eslint-disable-next-line react-hooks/exhaustive-deps
164
169
  }, [inputRef, selectedDate]);
165
170
 
166
171
  function handleOnKeyDown(event) {
@@ -171,13 +176,24 @@ var DatePickerInput = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
171
176
  onBlurInput(event);
172
177
  }
173
178
 
174
- function handleOnFocus() {
175
- setTimeout(function () {
179
+ var handleOnFocus = function handleOnFocus() {
180
+ return requestAnimationFrame(function () {
176
181
  var _inputRef$current7;
177
182
 
178
183
  return (_inputRef$current7 = inputRef.current) == null ? void 0 : _inputRef$current7.select();
179
- }, 5);
180
- }
184
+ });
185
+ };
186
+
187
+ var handleOnClickInputField = function handleOnClickInputField(event) {
188
+ setShouldFocusOnCalendarButtonAfterSelect(false);
189
+ onClick && onClick(event);
190
+ };
191
+
192
+ var handleOnClickCalendarButton = function handleOnClickCalendarButton() {
193
+ toggleCalendarGUI();
194
+ setFocusToCalendarGUI();
195
+ setShouldFocusOnCalendarButtonAfterSelect(true);
196
+ };
181
197
 
182
198
  return React.createElement(TextField, _extends({
183
199
  style: style,
@@ -188,14 +204,17 @@ var DatePickerInput = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
188
204
  variant: variant,
189
205
  disableLabelAnimation: disableLabelAnimation,
190
206
  ref: mergeRefs(ref, inputRef, forwardRef),
207
+ onClick: handleOnClickInputField,
191
208
  append: !hideCalendarButton && React.createElement(Tooltip, {
192
209
  placement: "top",
193
210
  content: calendarButtonTooltip,
194
211
  disableHoverListener: disabled,
195
212
  disableFocusListener: disabled
196
213
  }, React.createElement(IconButton, {
214
+ id: calendarButtonId,
197
215
  type: "button",
198
- onClick: toggleCalendarGUI
216
+ onClick: handleOnClickCalendarButton,
217
+ tabIndex: calendarGUIIsOpen() ? -1 : 0
199
218
  }, React.createElement(CalendarIcon, null)))
200
219
  }, rest));
201
220
  });
@@ -263,40 +282,71 @@ var DatePicker = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
263
282
  rest = _objectWithoutPropertiesLoose(_ref, _excluded$3);
264
283
 
265
284
  var datepickerId = useRandomId('eds-datepicker');
285
+ var datepickerRef = useRef(null);
286
+ var inputRef = React.useRef(null);
287
+ var calendarButton = document.getElementById(datepickerId + '-button');
266
288
 
267
289
  var _useState = useState(false),
268
290
  showValidation = _useState[0],
269
291
  setShowValidation = _useState[1];
270
292
 
271
- var datepickerRef = useRef(null);
272
- var inputRef = React.useRef(null);
293
+ var _useState2 = useState(false),
294
+ shouldFocusOnCalendarButtonAfterSelect = _useState2[0],
295
+ setShouldFocusOnCalendarButtonAfterSelect = _useState2[1]; // eslint-disable-next-line react-hooks/exhaustive-deps
296
+
297
+
273
298
  React.useEffect(function () {
274
299
  return validateInput();
275
300
  }, [selectedDate]);
276
301
 
277
- var handleOnKeyDown = function handleOnKeyDown(event) {
278
- var _datepickerRef$curren;
302
+ var handleOnChange = function handleOnChange(date, event) {
303
+ var _inputRef$current;
279
304
 
280
- var calendarIsClosed = !((_datepickerRef$curren = datepickerRef.current) != null && _datepickerRef$curren.isCalendarOpen());
305
+ if (shouldFocusOnCalendarButtonAfterSelect && !hideCalendarButton) {
306
+ calendarButton == null ? void 0 : calendarButton.focus();
307
+ setShouldFocusOnCalendarButtonAfterSelect(false);
308
+ } else (_inputRef$current = inputRef.current) == null ? void 0 : _inputRef$current.focus();
309
+
310
+ onChange(date, event);
311
+ };
312
+
313
+ var handleOnKeyDown = function handleOnKeyDown(event) {
281
314
  setShowValidation(false);
282
315
 
283
316
  if (event.key === 'Enter') {
284
- validateInput();
317
+ if (!datePickerGUIIsOpen()) {
318
+ // onBlurInput will validate if calendar is open
319
+ validateInput();
320
+ forceUpdateInputFormat();
321
+ }
322
+
285
323
  focusAndSelectInputField();
324
+ } else if (event.key === 'Tab' && datePickerGUIIsOpen()) {
286
325
  forceUpdateInputFormat();
287
- } else if (event.key === 'Tab' && calendarIsClosed) {
288
- validateInput();
326
+ } else if (event.key === 'Escape') {
289
327
  forceUpdateInputFormat();
328
+ focusAndSelectInputField();
329
+ if (datePickerGUIIsOpen()) toggleCalendarGUI();
290
330
  }
291
331
 
292
332
  onKeyDown(event);
293
333
  };
294
334
 
335
+ var handleOnClickOutside = function handleOnClickOutside() {
336
+ return setShouldFocusOnCalendarButtonAfterSelect(false);
337
+ };
338
+
339
+ var handleOnBlurInput = function handleOnBlurInput() {
340
+ if (datePickerGUIIsOpen()) return;
341
+ validateInput();
342
+ forceUpdateInputFormat();
343
+ };
344
+
295
345
  var validateInput = function validateInput() {
296
- var _inputRef$current;
346
+ var _inputRef$current2;
297
347
 
298
348
  setShowValidation(false);
299
- var inputValue = (_inputRef$current = inputRef.current) == null ? void 0 : _inputRef$current.value;
349
+ var inputValue = (_inputRef$current2 = inputRef.current) == null ? void 0 : _inputRef$current2.value;
300
350
  if (!inputValue) return;
301
351
  var inputValueParsedWithAllDateFormats = dateFormats.map(function (format) {
302
352
  return parse(inputValue, format, new Date(), {
@@ -332,25 +382,43 @@ var DatePicker = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
332
382
  };
333
383
 
334
384
  var focusAndSelectInputField = function focusAndSelectInputField() {
335
- return setTimeout(function () {
336
- var _inputRef$current2;
385
+ return requestAnimationFrame(function () {
386
+ var _inputRef$current3;
337
387
 
338
- (_inputRef$current2 = inputRef.current) == null ? void 0 : _inputRef$current2.select();
339
- }, 5);
388
+ return (_inputRef$current3 = inputRef.current) == null ? void 0 : _inputRef$current3.select();
389
+ });
340
390
  };
341
391
 
342
392
  var forceUpdateInputFormat = function forceUpdateInputFormat() {
343
- var _datepickerRef$curren2;
393
+ var _datepickerRef$curren;
344
394
 
345
- return (_datepickerRef$curren2 = datepickerRef.current) == null ? void 0 : _datepickerRef$curren2.setState({
395
+ return (_datepickerRef$curren = datepickerRef.current) == null ? void 0 : _datepickerRef$curren.setState({
346
396
  inputValue: null
347
397
  });
348
398
  };
349
399
 
350
400
  var toggleCalendarGUI = function toggleCalendarGUI() {
351
- var _datepickerRef$curren3, _datepickerRef$curren4;
401
+ var _datepickerRef$curren2;
352
402
 
353
- return (_datepickerRef$curren3 = datepickerRef.current) == null ? void 0 : _datepickerRef$curren3.setOpen(!((_datepickerRef$curren4 = datepickerRef.current) != null && _datepickerRef$curren4.isCalendarOpen()));
403
+ return (_datepickerRef$curren2 = datepickerRef.current) == null ? void 0 : _datepickerRef$curren2.setOpen(!datePickerGUIIsOpen());
404
+ }; // this focus function will fail if both an inline and a non-inline calendar is present in the same document
405
+
406
+
407
+ var setFocusToCalendarGUI = function setFocusToCalendarGUI() {
408
+ if (inline || hideCalendar || datePickerGUIIsOpen()) return; // 1 frame delay to allow calendar to spawn
409
+
410
+ requestAnimationFrame(function () {
411
+ var dateToSetFocusTo = selectedDate ? document.getElementsByClassName('eds-datepicker__calender__day--selected')[0] : document.getElementsByClassName('eds-datepicker__calender__day--today')[0];
412
+ if (dateToSetFocusTo !== null) dateToSetFocusTo.focus();
413
+ });
414
+ setShouldFocusOnCalendarButtonAfterSelect(true);
415
+ setShowValidation(false);
416
+ };
417
+
418
+ var datePickerGUIIsOpen = function datePickerGUIIsOpen() {
419
+ var _datepickerRef$curren3;
420
+
421
+ return (_datepickerRef$curren3 = datepickerRef.current) == null ? void 0 : _datepickerRef$curren3.isCalendarOpen();
354
422
  };
355
423
 
356
424
  return React.createElement(React.Fragment, null, React.createElement(ReactDatepicker, _extends({
@@ -360,8 +428,8 @@ var DatePicker = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
360
428
  dateFormat: dateFormats,
361
429
  showWeekNumbers: true,
362
430
  weekLabel: weekLabel,
363
- onChange: onChange,
364
- onClickOutside: validateInput,
431
+ onChange: handleOnChange,
432
+ onClickOutside: handleOnClickOutside,
365
433
  id: datepickerId,
366
434
  ariaLabelledBy: datepickerId,
367
435
  showPopperArrow: false,
@@ -411,15 +479,15 @@ var DatePicker = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
411
479
  feedback: getFeedbackAndVariant().feedback,
412
480
  variant: getFeedbackAndVariant().variant,
413
481
  inputRef: inputRef,
482
+ calendarButtonId: datepickerId + '-button',
414
483
  forwardRef: ref,
415
484
  onKeyDownInput: handleOnKeyDown,
416
- onBlurInput: function onBlurInput() {
417
- var _datepickerRef$curren5;
418
-
419
- return !((_datepickerRef$curren5 = datepickerRef.current) != null && _datepickerRef$curren5.isCalendarOpen()) && validateInput();
420
- },
485
+ onBlurInput: handleOnBlurInput,
421
486
  onFocus: undefined,
422
487
  toggleCalendarGUI: toggleCalendarGUI,
488
+ setFocusToCalendarGUI: setFocusToCalendarGUI,
489
+ setShouldFocusOnCalendarButtonAfterSelect: setShouldFocusOnCalendarButtonAfterSelect,
490
+ calendarGUIIsOpen: datePickerGUIIsOpen,
423
491
  disableLabelAnimation: disableLabelAnimation,
424
492
  hideCalendarButton: hideCalendarButton,
425
493
  selectedDate: selectedDate