@entur/dropdown 7.3.9-beta.0 → 8.0.0-beta.0

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":"dropdown.cjs.js","sources":["../src/components/DropdownList.tsx","../src/components/FieldComponents.tsx","../src/useNormalizedItems.ts","../src/useResolvedItems.ts","../src/utils.ts","../src/SearchableDropdown.tsx","../src/MultiSelect.tsx","../src/Dropdown.tsx","../src/NativeDropdown.tsx","../src/index.tsx"],"sourcesContent":["import React, { MutableRefObject } from 'react';\nimport classNames from 'classnames';\nimport { UseComboboxPropGetters, UseSelectPropGetters } from 'downshift';\n\nimport { VisuallyHidden } from '@entur/a11y';\nimport { Checkbox } from '@entur/form';\n\nimport { NormalizedDropdownItemType } from '../types';\n\nimport './DropdownList.scss';\n\ntype DropdownListProps<ValueType> = {\n ariaLabelChosenSingular?: string;\n ariaLabelSelectedItem?: string;\n getItemProps:\n | UseComboboxPropGetters<ValueType>['getItemProps']\n | UseSelectPropGetters<ValueType>['getItemProps'];\n highlightedIndex: number;\n isOpen: boolean;\n listItems: NormalizedDropdownItemType<ValueType | string>[];\n floatingStyles: { [key: string]: any } | undefined;\n innerRef?:\n | MutableRefObject<HTMLUListElement>\n | ((node: HTMLElement | null) => void);\n loading?: boolean;\n loadingText?: string;\n noMatchesText?: string;\n selectAllCheckboxState?: boolean | 'indeterminate';\n selectAllItem?: NormalizedDropdownItemType<string>;\n selectedItems: NormalizedDropdownItemType<ValueType>[];\n style?: React.CSSProperties;\n readOnly?: boolean;\n};\n\nexport const DropdownList = <ValueType extends NonNullable<any>>({\n ariaLabelChosenSingular = 'valgt',\n ariaLabelSelectedItem = ', valgt element, trykk for å fjerne',\n getItemProps,\n isOpen,\n highlightedIndex,\n listItems,\n floatingStyles,\n innerRef,\n loading = false,\n loadingText = 'Laster inn …',\n noMatchesText = 'Ingen treff for søket',\n readOnly = false,\n selectAllCheckboxState,\n selectAllItem,\n selectedItems,\n style,\n ...rest\n}: DropdownListProps<ValueType>) => {\n const isMultiselect = selectAllItem !== undefined;\n const isNoMatches =\n !loading &&\n (listItems.length === 0 ||\n (listItems?.length === 1 &&\n listItems?.[0]?.value === selectAllItem?.value));\n const isItemSelected = (\n item: NormalizedDropdownItemType<ValueType | string>,\n ) =>\n selectedItems.some(selectedItem => {\n // Primary match: value must always match\n if (selectedItem?.value !== item?.value) return false;\n\n // If both have labels, they must match for accessibility consistency\n // This ensures screen readers announce the same label for selected items\n // that users see in the dropdown list, preventing confusion\n if (selectedItem?.label && item?.label) {\n return selectedItem.label === item.label;\n }\n\n return true;\n });\n\n const ariaValuesSelectAll = () => {\n switch (selectAllCheckboxState) {\n case 'indeterminate': {\n return {\n label: `${selectAllItem?.label}, delvis valgt`,\n selected: false,\n };\n }\n case true: {\n return {\n label: `${selectAllItem?.label}, ${ariaLabelChosenSingular}`,\n selected: true,\n };\n }\n default: {\n return { label: `${selectAllItem?.label}`, selected: false };\n }\n }\n };\n\n const selectAllListItemContent = () => (\n <>\n <Checkbox\n aria-hidden=\"true\"\n checked={selectAllCheckboxState}\n className=\"eds-dropdown__list__item__checkbox\"\n tabIndex={-1}\n onChange={() => undefined}\n />\n <span\n className=\"eds-dropdown__list__item__text\"\n aria-label={ariaValuesSelectAll().label}\n >\n {selectAllItem?.label}\n </span>\n </>\n );\n\n const isReactComponent = (icon: any): icon is React.ComponentType<any> => {\n return (\n typeof icon === 'function' ||\n (typeof icon === 'object' &&\n icon !== null &&\n '$$typeof' in icon &&\n typeof icon.$$typeof === 'symbol')\n );\n };\n\n const listItemContent = (item: NormalizedDropdownItemType<ValueType>) => {\n return (\n <>\n {isMultiselect && (\n <Checkbox\n aria-hidden=\"true\"\n checked={isItemSelected(item)}\n className=\"eds-dropdown__list__item__checkbox\"\n tabIndex={-1}\n onChange={() => undefined}\n />\n )}\n <span className=\"eds-dropdown__list__item__text\">\n {item.label}\n <VisuallyHidden>\n {isItemSelected(item) ? ariaLabelSelectedItem : ''}\n </VisuallyHidden>\n </span>\n {Array.isArray(item.icons)\n ? item.icons.filter(isReactComponent).map((Icon, index) => {\n const key = `${\n Icon.displayName ?? Icon.name ?? Icon.name\n }-${index}`;\n return (\n <Icon\n key={key}\n inline\n className=\"eds-dropdown__list__item__icon\"\n />\n );\n })\n : null}\n </>\n );\n };\n\n return (\n <ul\n className=\"eds-dropdown__list\"\n ref={innerRef}\n style={{\n display: isOpen && !readOnly ? undefined : 'none',\n ...floatingStyles,\n ...style,\n }}\n {...rest}\n >\n {(() => {\n if (!isOpen || readOnly) return null;\n\n if (loading) {\n return (\n <li\n key=\"dropdown-list-loading\"\n className=\"eds-dropdown__list__item\"\n >\n {loadingText}\n </li>\n );\n }\n\n if (isNoMatches) {\n return (\n <li\n key=\"dropdown-list-no-match\"\n className=\"eds-dropdown__list__item\"\n >\n {noMatchesText}\n </li>\n );\n }\n\n return listItems.map((item, index) => {\n const key =\n item.itemKey ??\n `${item.label ?? ''}-${item.value ?? ''}-${(item.icons ?? [])\n .map(icon => icon?.displayName ?? icon?.name ?? 'unknown')\n .join('-')}`;\n const itemIsSelectAll = item.value === selectAllItem?.value;\n if (itemIsSelectAll && listItems.length <= 2) return null;\n return (\n <li\n className={classNames('eds-dropdown__list__item', {\n 'eds-dropdown__list__item--select-all': itemIsSelectAll,\n 'eds-dropdown__list__item--highlighted':\n highlightedIndex === index,\n 'eds-dropdown__list__item--selected':\n !isMultiselect && isItemSelected(item),\n })}\n key={key}\n {...getItemProps({\n // @ts-expect-error Since getItemProps expects the same item type\n // here as items, it throws error when selectAllItem is a string.\n // This does, however, not cause any functional issues.\n item,\n index,\n 'aria-selected': itemIsSelectAll\n ? ariaValuesSelectAll().selected\n : isItemSelected(item),\n })}\n >\n {itemIsSelectAll\n ? selectAllListItemContent()\n : listItemContent(\n item as NormalizedDropdownItemType<ValueType>,\n )}\n </li>\n );\n });\n })()}\n </ul>\n );\n};\n","import React, { forwardRef } from 'react';\nimport classNames from 'classnames';\nimport {\n UseComboboxGetToggleButtonPropsReturnValue,\n UseMultipleSelectionGetSelectedItemPropsOptions,\n} from 'downshift';\n\nimport { IconButton } from '@entur/button';\nimport { TagChip } from '@entur/chip';\nimport { CloseSmallIcon, DownArrowIcon } from '@entur/icons';\nimport { LoadingDots } from '@entur/loader';\nimport { Tooltip } from '@entur/tooltip';\n\nimport { NormalizedDropdownItemType } from '../types';\n\nimport './FieldComponents.scss';\n\nexport const SelectedItemTag = <ValueType extends NonNullable<any>>({\n ariaLabelRemoveSelected,\n ariaLabelChosen = 'valgt',\n disabled,\n getSelectedItemProps,\n index,\n readOnly,\n removeSelectedItem,\n selectedItem,\n}: {\n ariaLabelRemoveSelected: string;\n ariaLabelChosen?: string;\n disabled?: boolean;\n getSelectedItemProps?: (\n options: UseMultipleSelectionGetSelectedItemPropsOptions<\n NormalizedDropdownItemType<ValueType>\n >,\n ) => any;\n index?: number;\n readOnly?: boolean;\n removeSelectedItem: (item: NormalizedDropdownItemType<ValueType>) => void;\n selectedItem: NormalizedDropdownItemType<ValueType>;\n}) => {\n const { tabIndex: _, ...selectedItemProps } =\n getSelectedItemProps?.({\n selectedItem,\n index,\n }) ?? {};\n return (\n <TagChip\n size=\"small\"\n className={classNames('eds-dropdown__selected-item-tag', {\n 'eds-dropdown__selected-item-tag--readonly': readOnly,\n 'eds-dropdown__selected-item-tag--disabled': disabled,\n })}\n {...selectedItemProps}\n onClose={(e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n removeSelectedItem(selectedItem);\n }}\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n closeButtonAriaLabel={`${selectedItem.label} ${ariaLabelChosen}, ${ariaLabelRemoveSelected} `}\n key={selectedItem.value}\n aria-live=\"polite\"\n >\n <span\n aria-hidden=\"true\"\n className=\"eds-dropdown__selected-item-tag__text\"\n >\n {selectedItem.label}\n </span>\n </TagChip>\n );\n};\n\ntype FieldAppendProps = Partial<UseComboboxGetToggleButtonPropsReturnValue> & {\n ariaLabelCloseList: string;\n ariaLabelOpenList: string;\n clearable?: boolean;\n labelClearSelected: string;\n disabled?: boolean;\n focusable?: boolean;\n isOpen: boolean;\n loading: boolean;\n loadingText: string | undefined;\n onClear: () => void;\n itemIsSelected: boolean;\n};\n\nexport const DropdownFieldAppendix = forwardRef(\n (\n {\n ariaLabelCloseList,\n ariaLabelOpenList,\n clearable = false,\n labelClearSelected,\n focusable = false,\n disabled,\n isOpen,\n loading = false,\n loadingText,\n onClear,\n itemIsSelected,\n ...rest\n }: FieldAppendProps,\n ref: React.ForwardedRef<HTMLButtonElement>,\n ) => {\n function getToggleAriaLabel() {\n if (loading) return loadingText;\n if (isOpen) return ariaLabelCloseList;\n return ariaLabelOpenList;\n }\n\n return (\n <>\n {!disabled && (\n <div className=\"eds-dropdown__appendix\">\n {clearable && itemIsSelected && (\n <ClearableButton\n onClear={onClear}\n focusable={true}\n labelClearSelectedItems={labelClearSelected}\n />\n )}\n\n <IconButton\n className={classNames('eds-dropdown__appendix__toggle-button', {\n 'eds-dropdown__appendix__toggle-button--open': isOpen,\n })}\n ref={ref}\n aria-label={getToggleAriaLabel()}\n {...rest}\n type=\"button\"\n tabIndex={focusable ? 0 : -1}\n >\n {!loading ? (\n <DownArrowIcon aria-hidden=\"true\" />\n ) : (\n <LoadingDots aria-hidden=\"true\" />\n )}\n </IconButton>\n </div>\n )}\n </>\n );\n },\n);\n\nexport const ClearableButton = ({\n onClear,\n labelClearSelectedItems = 'Fjern valgte',\n focusable = false,\n}: {\n onClear: () => void;\n labelClearSelectedItems?: string;\n focusable?: boolean;\n ariaLabelClearItems?: string;\n}) => {\n return (\n <>\n <Tooltip\n aria-hidden=\"true\"\n placement=\"top\"\n content={labelClearSelectedItems}\n className=\"eds-dropdown__appendix__clear-button__tooltip\"\n >\n <IconButton\n className=\"eds-dropdown__appendix__clear-button\"\n type=\"button\"\n tabIndex={focusable ? 0 : -1}\n // These events bubble up to the Dropdown container and trigger openMenu.\n // To avoid this, stopPropagation and preventDefault are added.\n onClick={e => {\n e.stopPropagation();\n onClear();\n }}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n e.stopPropagation();\n onClear();\n }\n }}\n aria-label={labelClearSelectedItems}\n >\n <CloseSmallIcon aria-hidden=\"true\" />\n </IconButton>\n </Tooltip>\n <div className=\"eds-dropdown__appendix__divider\" />\n </>\n );\n};\n","import React from 'react';\n\nimport { DropdownItemType, NormalizedDropdownItemType } from './types';\n\nexport const useNormalizedItems = <ValueType = string>(\n items: DropdownItemType<ValueType>[],\n): NormalizedDropdownItemType<ValueType>[] =>\n React.useMemo(\n () =>\n items.map(item => {\n if (typeof item == 'string') {\n return {\n value: item as ValueType,\n label: item,\n };\n }\n\n if (item?.value === undefined) {\n return {\n ...item,\n value: item.label as ValueType,\n };\n }\n return { ...item, value: item.value };\n }),\n [items],\n );\n","import React from 'react';\n\nimport { useDebounce } from '@entur/utils';\n\nimport { useNormalizedItems } from './useNormalizedItems';\n\nimport {\n PotentiallyAsyncDropdownItemType,\n DropdownItemType,\n NormalizedDropdownItemType,\n AsyncDropdownItemType,\n} from './types';\n\nexport const useResolvedItems = <ValueType extends NonNullable<any>>(\n /** The list of items, or an async function that resolves the list of items */\n itemsOrItemsResolver: PotentiallyAsyncDropdownItemType<ValueType>,\n /** The time to wait after the input changes to the fetchItems method is called */\n debounceTimeout = 250,\n): {\n fetchItems: (query?: string) => void;\n loading: boolean;\n items: NormalizedDropdownItemType<ValueType>[];\n} => {\n const itemsIsAFunction = typeof itemsOrItemsResolver === 'function';\n\n const [items, setItems] = React.useState<DropdownItemType<ValueType>[]>(\n itemsIsAFunction ? [] : itemsOrItemsResolver,\n );\n const [loading, setLoading] = React.useState(false);\n\n const abortControllerRef = React.useRef<AbortController>(\n new AbortController(),\n );\n\n // We normalize the itemsResolver argument to an async function, so we\n // can use it without thinking about the differences later\n const itemsResolver = React.useMemo(() => {\n if (itemsIsAFunction)\n return itemsOrItemsResolver as AsyncDropdownItemType<ValueType>;\n return () =>\n Promise.resolve(itemsOrItemsResolver as DropdownItemType<ValueType>[]);\n }, [itemsOrItemsResolver, itemsIsAFunction]);\n\n // This should be called whenever the input value changes\n const updateItems = async (inputValue?: string) => {\n // The abortController handles cleanup of the previous request and unmounting\n if (abortControllerRef?.current) abortControllerRef?.current?.abort();\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n setLoading(true);\n\n try {\n const resolvedItems = await itemsResolver(\n inputValue ?? '',\n abortControllerRef,\n );\n\n if (abortControllerRef?.current?.signal?.aborted) {\n console.warn(\n 'Avbryt den asynkrone funksjonen din med signalet fra AbortController-en for å for å unngå minnelekkasje.',\n 'Funksjonen bør kaste en DOMException med navnet \"AbortError\" når den avbrytes.',\n '',\n '\\n\\nSe eksempel her: https://linje.entur.no/komponenter/skjemaelementer/dropdown#s%C3%B8kbar-dropdown-med-valg-fra-nettverkskall-bassert-p%C3%A5-tekstinput',\n '\\nLes mer om AbortController her: https://developer.mozilla.org/en-US/docs/Web/API/AbortController',\n );\n return;\n }\n\n setLoading(false);\n setItems(resolvedItems);\n } catch (error) {\n if (\n error &&\n typeof error === 'object' &&\n 'name' in error &&\n error.name === 'AbortError'\n ) {\n // Stop execution if the request was aborted\n return;\n }\n console.warn(\n 'The following error was received but not handled inside Entur Designsystems useResolvedItems hook:',\n );\n throw error;\n }\n };\n\n const debouncedFetchItems = useDebounce(updateItems, debounceTimeout);\n const normalizedItems = useNormalizedItems(items);\n\n React.useEffect(() => {\n // send abort signal to previous request on unmount for cleanup\n return () => abortControllerRef?.current?.abort('Component unmounted');\n }, []);\n\n React.useEffect(() => {\n // Let's fetch the list initially if it's specified\n if (itemsIsAFunction) {\n debouncedFetchItems('');\n }\n }, [itemsIsAFunction, itemsResolver]);\n\n return {\n items: normalizedItems,\n loading: itemsIsAFunction ? loading : false,\n fetchItems: debouncedFetchItems,\n };\n};\n","import { useMemo } from 'react';\nimport { UseComboboxState } from 'downshift';\nimport { NormalizedDropdownItemType } from './types';\n\n// Redeclare forwardRef\ndeclare module 'react' {\n function forwardRef<T, P = object>(\n render: (props: P, ref: React.Ref<T>) => React.ReactElement | null,\n ): (props: P & React.RefAttributes<T>) => React.ReactElement | null;\n}\n\n/* start general utils */\nexport const EMPTY_INPUT = '';\n\nexport function lowerCaseFilterTest(\n item: NormalizedDropdownItemType<any>,\n input: string | undefined,\n) {\n if (!input) {\n return true;\n }\n const sanitizeEscapeCharacters = input.replace(\n /[-/\\\\^$*+?.()|[\\]{}]/g,\n '\\\\$&',\n );\n const inputRegex = new RegExp(sanitizeEscapeCharacters, 'i');\n return inputRegex.test(item.label);\n}\n\nexport function noFilter<ValueType>(\n //@ts-expect-error only here to comply with dropdown filter API\n item: NormalizedDropdownItemType<ValueType>,\n //@ts-expect-error only here to comply with dropdown filter API\n input: string | undefined,\n) {\n return true;\n}\n\nexport const itemToString = (item: NormalizedDropdownItemType<any> | null) =>\n item ? item.label : '';\n\nexport const itemToKey = (item: NormalizedDropdownItemType<any> | null) =>\n item?.label + item?.value;\n\nexport const isFunctionWithQueryArgument = (object: any) =>\n typeof object === 'function' && object.length > 0;\n\nexport const clamp = (val: number, min = 1, max = 10) =>\n Math.min(Math.max(val, min), max);\n\n/* end general utils */\n/* start multiselect utils */\n\ntype useMultiselectUtilsType<ValueType> = {\n selectedItems: NormalizedDropdownItemType<ValueType>[];\n listItems: NormalizedDropdownItemType<ValueType | string>[];\n selectAll: NormalizedDropdownItemType<string>;\n};\n\nexport const useMultiselectUtils = <ValueType>({\n listItems,\n selectedItems,\n selectAll,\n}: useMultiselectUtilsType<ValueType>) => {\n const hasSelectedItems = selectedItems.length > 0;\n\n const listItemsWithoutSelectAll = listItems.filter(\n item => item.value !== selectAll.value,\n ) as NormalizedDropdownItemType<ValueType>[];\n\n const unselectedItemsInListItems = listItemsWithoutSelectAll.filter(\n listItem =>\n !selectedItems.some(\n selectedItem => selectedItem.value === listItem.value,\n ),\n );\n\n const allListItemsAreSelected = !listItemsWithoutSelectAll.some(\n listItem =>\n !selectedItems.some(\n selectedItem => selectedItem.value === listItem.value,\n ),\n );\n\n const someListItemsAreSelected = listItemsWithoutSelectAll.some(listItem =>\n selectedItems.some(selectedItem => selectedItem.value === listItem.value),\n );\n\n const addClickedItemToSelectedItems = (\n clickedItem: NormalizedDropdownItemType<ValueType>,\n onChange: (value: NormalizedDropdownItemType<ValueType>[]) => void,\n ) => onChange([...selectedItems, clickedItem]);\n\n const clickedItemIsInSelectedItems = (\n clickedItem: NormalizedDropdownItemType<ValueType>,\n ) =>\n selectedItems.some(\n selectedItem => selectedItem.value === clickedItem.value,\n );\n\n const clickedItemIsSelectAll = (\n clickedItem: NormalizedDropdownItemType<string | ValueType>,\n ): clickedItem is NormalizedDropdownItemType<string> =>\n clickedItem.value === selectAll.value;\n\n const handleListItemClicked = ({\n clickedItem,\n onChange,\n }: {\n clickedItem: NormalizedDropdownItemType<any>;\n onChange: (value: NormalizedDropdownItemType<ValueType>[]) => void;\n }) => {\n if (clickedItemIsSelectAll(clickedItem)) {\n if (allListItemsAreSelected) {\n return unselectAllListItems(onChange);\n }\n return selectAllUnselectedItemsInListItems(onChange);\n }\n\n if (clickedItemIsInSelectedItems(clickedItem)) {\n return removeClickedItemFromSelectedItems(clickedItem, onChange);\n }\n addClickedItemToSelectedItems(clickedItem, onChange);\n };\n\n const removeClickedItemFromSelectedItems = (\n clickedItem: NormalizedDropdownItemType<ValueType>,\n onChange: (value: NormalizedDropdownItemType<ValueType>[]) => void,\n ) =>\n onChange(\n selectedItems.filter(\n selectedItem => selectedItem.value !== clickedItem.value,\n ),\n );\n\n const selectAllCheckboxState: boolean | 'indeterminate' = useMemo(() => {\n if (allListItemsAreSelected) return true;\n if (someListItemsAreSelected) return 'indeterminate';\n return false;\n }, [allListItemsAreSelected, someListItemsAreSelected]);\n\n const selectAllUnselectedItemsInListItems = (\n onChange: (value: NormalizedDropdownItemType<ValueType>[]) => void,\n ) => {\n onChange([...selectedItems, ...unselectedItemsInListItems]);\n };\n\n const unselectAllListItems = (\n onChange: (value: NormalizedDropdownItemType<ValueType>[]) => void,\n ) => {\n const selectedItemsWithoutItemsInListItems = selectedItems.filter(\n selectedItem =>\n !listItemsWithoutSelectAll.some(\n listItem => listItem.value === selectedItem.value,\n ),\n );\n onChange(selectedItemsWithoutItemsInListItems);\n };\n\n return {\n addClickedItemToSelectedItems,\n allListItemsAreSelected,\n clickedItemIsInSelectedItems,\n clickedItemIsSelectAll,\n handleListItemClicked,\n hasSelectedItems,\n listItemsWithoutSelectAll,\n removeClickedItemFromSelectedItems,\n selectAllCheckboxState,\n selectAllUnselectedItemsInListItems,\n someListItemsAreSelected,\n unselectAllListItems,\n };\n};\n\n/* end multiselect utils */\n/* start a11y utils */\n\n// called when the state changes:\n// selectedItem, highlightedIndex, inputValue or isOpen.\nexport function getA11yStatusMessage<ValueType>(\n options: UseComboboxState<NormalizedDropdownItemType<ValueType>> & {\n selectAllItemIncluded?: boolean;\n resultCount: number;\n },\n): string {\n const { isOpen, selectAllItemIncluded = false, resultCount } = options;\n\n if (!isOpen) {\n return '';\n }\n\n const resultCountWithoutSelectAll = selectAllItemIncluded\n ? resultCount - 1\n : resultCount;\n\n if (resultCountWithoutSelectAll === 0) {\n return 'Ingen resultater';\n }\n\n return `${resultCountWithoutSelectAll} resultat${\n resultCountWithoutSelectAll === 1 ? '' : 'er'\n } tilgjengelig, naviger med pil opp eller ned, velg elementer med Enter.`;\n}\n/* end a11y utils */\n","/* eslint-disable no-warning-comments */\nimport React, {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport {\n UseComboboxState,\n UseComboboxStateChangeOptions,\n useCombobox,\n} from 'downshift';\nimport classNames from 'classnames';\nimport {\n useFloating,\n autoUpdate,\n offset,\n flip,\n shift,\n size,\n} from '@floating-ui/react-dom';\n\nimport { BaseFormControl } from '@entur/form';\nimport { space } from '@entur/tokens';\nimport { mergeRefs } from '@entur/utils';\n\nimport { DropdownList } from './components/DropdownList';\nimport { DropdownFieldAppendix } from './components/FieldComponents';\n\nimport { DropdownProps } from './Dropdown';\nimport { useResolvedItems } from './useResolvedItems';\nimport {\n clamp,\n EMPTY_INPUT,\n getA11yStatusMessage,\n isFunctionWithQueryArgument,\n itemToString,\n lowerCaseFilterTest,\n noFilter,\n} from './utils';\n\nimport { NormalizedDropdownItemType } from './types';\n\nimport './Dropdown.scss';\n\nexport type SearchableDropdownProps<ValueType> = DropdownProps<ValueType> & {\n /** Filtreringen som brukes når man skriver inn tekst i inputfeltet\n * @default Regex-test som sjekker om item.label inneholder input-teksten\n */\n itemFilter?: (\n item: NormalizedDropdownItemType<ValueType>,\n inputValue: string | undefined,\n ) => boolean;\n /** Antall millisekunder man venter etter tekstinput før det gjøres kall for å oppdatere items\n * Denne er kun relevant hvis du sender inn en funksjon som items.\n */\n debounceTimeout?: number;\n /** Tekst som kommer opp når det ikke er noe treff på filtreringsøket\n * @default \"Ingen treff for søket\"\n */\n noMatchesText?: string;\n /** Callback som kalles når brukeren går ut av input-feltet */\n onBlur?: (event: React.FocusEvent<HTMLInputElement>) => void;\n /** Callback når komponenten klikkes */\n onClick?: (event: React.MouseEvent<HTMLElement>) => void;\n /** Callback når en tast trykkes */\n onKeyDown?: (event: React.KeyboardEvent<HTMLDivElement>) => void;\n /** Callback når komponenten får fokus */\n onFocus?: (event: React.FocusEvent<HTMLDivElement>) => void;\n};\n\nexport const SearchableDropdown = React.forwardRef(\n <ValueType extends NonNullable<any>>(\n {\n ariaLabelChosenSingular,\n ariaLabelCloseList = 'Lukk liste med valg',\n ariaLabelOpenList = 'Åpne liste med valg',\n ariaLabelSelectedItem,\n className,\n clearable = true,\n debounceTimeout,\n disabled = false,\n disableLabelAnimation = false,\n feedback,\n items: initialItems,\n itemFilter = isFunctionWithQueryArgument(initialItems)\n ? noFilter\n : lowerCaseFilterTest,\n label,\n labelClearSelectedItem = 'fjern valgt',\n labelTooltip,\n listStyle,\n loading,\n loadingText = 'Laster resultater …',\n noMatchesText = 'Ingen tilgjengelige valg …',\n onChange = () => undefined,\n placeholder,\n prepend,\n readOnly = false,\n selectedItem: value,\n selectOnBlur = false,\n selectOnTab = false,\n style,\n variant = 'info',\n onBlur,\n onClick,\n onKeyDown,\n onFocus,\n ...rest\n }: SearchableDropdownProps<ValueType>,\n ref: React.ForwardedRef<HTMLInputElement>,\n ) => {\n const [showSelectedItem, setShowSelectedItem] = useState(value !== null);\n const [lastHighlightedIndex, setLastHighlightedIndex] = useState(0);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const {\n items: normalizedItems,\n loading: resolvedItemsLoading,\n fetchItems,\n } = useResolvedItems(initialItems, debounceTimeout);\n\n const [listItems, setListItems] = useState(normalizedItems);\n\n const filterListItems = ({ inputValue }: { inputValue: string }) =>\n setListItems(\n normalizedItems.filter(item => itemFilter(item, inputValue)),\n );\n\n const updateListItems = ({ inputValue }: { inputValue?: string }) => {\n const shouldRefetchItems = isFunctionWithQueryArgument(initialItems);\n if (shouldRefetchItems) fetchItems(inputValue ?? EMPTY_INPUT);\n\n filterListItems({ inputValue: inputValue ?? EMPTY_INPUT });\n };\n\n const resetInputState = ({\n changes,\n }: {\n changes: Partial<UseComboboxState<NormalizedDropdownItemType<ValueType>>>;\n }) => {\n return {\n ...changes,\n inputValue: EMPTY_INPUT,\n };\n };\n\n const inputHasFocus =\n typeof document !== 'undefined'\n ? inputRef?.current === document?.activeElement\n : false;\n\n useEffect(() => {\n filterListItems({ inputValue });\n }, [normalizedItems]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n // sync internal state on initial render\n if (selectedItem !== null && !inputHasFocus) {\n setShowSelectedItem(true);\n updateListItems({ inputValue: EMPTY_INPUT });\n setInputValue(EMPTY_INPUT);\n }\n }, []);\n\n const stateReducer = useCallback(\n (\n state: UseComboboxState<NormalizedDropdownItemType<ValueType>>,\n {\n type,\n changes,\n }: UseComboboxStateChangeOptions<NormalizedDropdownItemType<ValueType>>,\n ) => {\n if (\n changes.highlightedIndex !== undefined &&\n changes?.highlightedIndex >= 0\n ) {\n setLastHighlightedIndex(changes?.highlightedIndex);\n }\n\n switch (type) {\n // empty input to show selected item and reset dropdown list on item selection\n case useCombobox.stateChangeTypes.ItemClick:\n case useCombobox.stateChangeTypes.InputKeyDownEnter:\n return resetInputState({ changes });\n case useCombobox.stateChangeTypes.InputBlur:\n // We dont want to change selection on blur so we keep previous selectedItem\n return resetInputState({\n changes: { ...changes, selectedItem: value },\n });\n case useCombobox.stateChangeTypes.ControlledPropUpdatedSelectedItem:\n return resetInputState({ changes });\n // remove leading whitespace, select element with spacebar on empty input\n case useCombobox.stateChangeTypes.InputChange: {\n const leadingWhitespaceTest = /^\\s+/g;\n const isSpacePressedOnEmptyInput = changes.inputValue === ' ';\n if (!isSpacePressedOnEmptyInput) setLastHighlightedIndex(0);\n\n if (changes.inputValue?.match(leadingWhitespaceTest)) {\n const sanitizedInputValue = changes.inputValue.replace(\n leadingWhitespaceTest,\n EMPTY_INPUT,\n );\n if (isSpacePressedOnEmptyInput) {\n if (!state.isOpen)\n return {\n ...changes,\n inputValue: sanitizedInputValue,\n isOpen: true,\n };\n\n if (changes.highlightedIndex !== undefined) {\n return {\n ...changes,\n inputValue: sanitizedInputValue,\n selectedItem: listItems[changes.highlightedIndex],\n };\n }\n }\n }\n\n return { ...changes, highlightedIndex: 0 };\n }\n default:\n return changes;\n }\n },\n [fetchItems, filterListItems, inputHasFocus, resetInputState],\n );\n\n const {\n isOpen,\n getToggleButtonProps,\n getLabelProps,\n getMenuProps,\n getInputProps,\n highlightedIndex,\n getItemProps,\n selectedItem,\n inputValue,\n setInputValue,\n selectItem,\n reset,\n } = useCombobox({\n defaultHighlightedIndex: lastHighlightedIndex,\n items: listItems,\n itemToString,\n selectedItem: value,\n stateReducer,\n onInputValueChange(changes) {\n updateListItems({ inputValue: changes.inputValue });\n },\n onSelectedItemChange({ selectedItem: newSelectedItem }) {\n onChange(newSelectedItem);\n },\n // Accessibility\n getA11yStatusMessage: options =>\n getA11yStatusMessage({ ...options, resultCount: listItems.length }),\n });\n\n // calculations for floating-UI popover position\n const { refs, floatingStyles, update } = useFloating({\n open: isOpen,\n placement: 'bottom-start',\n middleware: [\n offset(space.extraSmall2),\n shift({ padding: space.extraSmall }),\n size({\n apply({ elements, availableHeight }) {\n elements.floating.style.setProperty(\n '--list-max-height',\n `${clamp(10 * 16, availableHeight, 20 * 16)}px`,\n );\n },\n }),\n flip({ fallbackStrategy: 'initialPlacement' }),\n ],\n });\n\n // Update floating-ui position on scroll etc. Floating-ui's autoupdate is usually used inside\n // the useFloating hook but this requires the floating element to be conditionally rendered.\n // Downshift doesn't work correctly when conditionally rendered since props and refs aren't correctly\n // spread to the component. We therefor use this useLayoutEffect to update position. See https://floating-ui.com/docs/autoupdate#usage\n useLayoutEffect(() => {\n if (isOpen && refs.reference.current && refs.floating.current) {\n return autoUpdate(\n refs.reference.current,\n refs.floating.current,\n update,\n );\n }\n }, [isOpen, refs.reference, refs.floating, update]);\n\n const handleOnClear = () => {\n inputRef.current?.focus();\n reset();\n };\n\n return (\n <BaseFormControl\n className={classNames(\n 'eds-dropdown',\n 'eds-dropdown--searchable',\n className,\n { 'eds-dropdown--has-tooltip': labelTooltip !== undefined },\n )}\n disabled={disabled}\n disableLabelAnimation={disableLabelAnimation}\n feedback={feedback}\n isFilled={selectedItem !== null || inputValue !== EMPTY_INPUT}\n label={label}\n labelId={getLabelProps().id}\n labelProps={getLabelProps()}\n labelTooltip={labelTooltip}\n onClick={(e: React.MouseEvent<HTMLElement>) => {\n if (e.target === e.currentTarget) getInputProps()?.onClick?.(e);\n onClick?.(e);\n }}\n onKeyDown={onKeyDown}\n onFocus={onFocus}\n prepend={prepend}\n readOnly={readOnly}\n ref={refs.setReference}\n style={style}\n tabIndex={disabled || readOnly ? -1 : undefined}\n variant={variant}\n after={\n <DropdownList\n ariaLabelChosenSingular={ariaLabelChosenSingular}\n ariaLabelSelectedItem={ariaLabelSelectedItem}\n floatingStyles={floatingStyles}\n getItemProps={getItemProps}\n highlightedIndex={highlightedIndex}\n isOpen={isOpen}\n listItems={listItems}\n loading={loading ?? resolvedItemsLoading}\n loadingText={loadingText}\n noMatchesText={noMatchesText}\n selectedItems={selectedItem !== null ? [selectedItem] : []}\n readOnly={readOnly}\n {...getMenuProps({\n refKey: 'innerRef',\n ref: refs.setFloating,\n style: listStyle,\n })}\n />\n }\n {...rest}\n // Append is not supported as of now\n append={undefined}\n >\n <span\n className={classNames('eds-dropdown--searchable__selected-item', {\n 'eds-dropdown--searchable__selected-item--hidden':\n !showSelectedItem,\n })}\n onClick={event => {\n if (!disabled && !readOnly) {\n inputRef.current?.focus();\n getInputProps()?.onClick?.(event);\n }\n }}\n tabIndex={readOnly ? 0 : -1}\n >\n {showSelectedItem ? selectedItem?.label : ''}\n </span>\n <input\n className={classNames('eds-dropdown__input eds-form-control', {\n 'eds-dropdown__input--hidden': showSelectedItem,\n })}\n {...getInputProps({\n onKeyDown(e: React.KeyboardEvent) {\n if (isOpen && e.key === 'Tab') {\n const highlitedItem = listItems[highlightedIndex];\n if ((selectOnTab || selectOnBlur) && highlitedItem) {\n selectItem(highlitedItem);\n setShowSelectedItem(true);\n }\n }\n },\n onBlur(e) {\n if (selectedItem !== null) setShowSelectedItem(true);\n onBlur?.(e);\n },\n onFocus() {\n if (!readOnly) {\n setShowSelectedItem(false);\n }\n },\n disabled: disabled,\n readOnly: readOnly,\n placeholder: selectedItem?.label ?? placeholder,\n tabIndex: disabled || readOnly ? -1 : undefined,\n ref: mergeRefs(inputRef, ref),\n })}\n />\n <DropdownFieldAppendix\n {...getToggleButtonProps({\n 'aria-busy': !(loading ?? resolvedItemsLoading)\n ? undefined\n : 'true',\n })}\n ariaLabelCloseList={ariaLabelCloseList}\n ariaLabelOpenList={ariaLabelOpenList}\n clearable={clearable}\n disabled={disabled || readOnly}\n onClear={handleOnClear}\n focusable={false}\n labelClearSelected={labelClearSelectedItem}\n isOpen={isOpen}\n itemIsSelected={selectedItem !== null}\n loadingText={loadingText}\n loading={loading ?? resolvedItemsLoading}\n />\n </BaseFormControl>\n );\n },\n);\n","import React, {\n Dispatch,\n SetStateAction,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport classNames from 'classnames';\nimport {\n useMultipleSelection,\n useCombobox,\n UseComboboxStateChangeOptions,\n UseComboboxState,\n} from 'downshift';\nimport {\n useFloating,\n autoUpdate,\n offset,\n flip,\n shift,\n size,\n} from '@floating-ui/react-dom';\n\nimport { VisuallyHidden } from '@entur/a11y';\nimport { BaseFormControl } from '@entur/form';\nimport { space } from '@entur/tokens';\nimport { mergeRefs, useRandomId } from '@entur/utils';\n\nimport {\n DropdownFieldAppendix,\n SelectedItemTag,\n} from './components/FieldComponents';\nimport { DropdownList } from './components/DropdownList';\n\nimport { useResolvedItems } from './useResolvedItems';\nimport { DropdownProps } from './Dropdown';\nimport {\n clamp,\n EMPTY_INPUT,\n getA11yStatusMessage,\n isFunctionWithQueryArgument,\n itemToKey,\n itemToString,\n lowerCaseFilterTest,\n noFilter,\n useMultiselectUtils,\n} from './utils';\n\nimport { NormalizedDropdownItemType } from './types';\n\nimport './Dropdown.scss';\n\nexport type MultiSelectProps<ValueType> = Omit<\n DropdownProps<ValueType>,\n 'selectedItem' | 'onChange'\n> & {\n /** Elementer som er valgt blant 'items'. Bruk tom liste for ingen valgte\n */\n selectedItems: NormalizedDropdownItemType<ValueType>[];\n /** Callback med alle valgte verdier.\n * Bruk denne til å oppdatere selectedItems-listen */\n onChange?: (\n selectedItems: NormalizedDropdownItemType<ValueType>[],\n ) => void | Dispatch<SetStateAction<NormalizedDropdownItemType<ValueType>[]>>;\n /** Filtreringen som brukes når man skriver inn tekst i inputfeltet\n * @default Regex-test som sjekker om item.label inneholder input-teksten\n */\n itemFilter?: (\n item: NormalizedDropdownItemType<ValueType>,\n inputValue: string | undefined,\n ) => boolean;\n /** Skjuler «Velg alle» fra listen med valg\n * @default false\n */\n hideSelectAll?: boolean;\n /** Antall millisekunder man venter før man kaller en potensiell items-funksjon\n * @default 250\n */\n debounceTimeout?: number;\n /** Maks antall individuelle valgt-element-tags i MultiSelect-en før de blir til en samle-tag\n * @default 10\n */\n maxChips?: number;\n /** Resetter input etter at et element er valgt i listen\n * @default false\n */\n clearInputOnSelect?: boolean;\n /** Teksten som vises for «Velg alle»-elementet i listen\n * @default \"Velg alle\"\n */\n labelSelectAll?: string;\n /** Teksten som vises for «Velg alle»-elementet i listen\n * @default \"Alle valgt\"\n */\n labelAllItemsSelected?: string;\n /** Skjermleser-tekst som for å fjerne alle valg\n * @default \"Fjern valgte\"\n */\n labelClearAllItems?: string;\n /** Tekst for skjemleser på knapper for å fjerne valgt element\n * @default \"trykk for å fjerne valg\"\n */\n ariaLabelRemoveSelected?: string;\n /** Tekst for skjemleser for å indikere at et element er valgt\n * @default \"valgte\"\n */\n ariaLabelChosenPlural?: string;\n /** Tekst for skjemleser for å hoppe til input-feltet\n * @default `${selectedItems.length} valgte elementer, trykk for å hoppe til tekstfeltet`\n */\n ariaLabelJumpToInput?: string;\n /** Callback som kalles når brukeren går ut av input-feltet */\n onBlur?: (event: React.FocusEvent<HTMLInputElement>) => void;\n /** Callback når komponenten klikkes */\n onClick?: (event: React.MouseEvent<HTMLElement>) => void;\n /** Callback når en tast trykkes */\n onKeyDown?: (event: React.KeyboardEvent<HTMLDivElement>) => void;\n /** Callback når komponenten får fokus */\n onFocus?: (event: React.FocusEvent<HTMLDivElement>) => void;\n};\n\nexport const MultiSelect = React.forwardRef(\n <ValueType extends NonNullable<any>>(\n {\n className,\n clearable = true,\n clearInputOnSelect = false,\n debounceTimeout,\n disabled = false,\n disableLabelAnimation,\n feedback,\n hideSelectAll = false,\n items: initialItems,\n itemFilter = isFunctionWithQueryArgument(initialItems)\n ? noFilter\n : lowerCaseFilterTest,\n label,\n labelAllItemsSelected = 'Alle valgt',\n labelClearAllItems = 'Fjern valgte',\n labelSelectAll = 'Velg alle',\n labelTooltip,\n listStyle,\n loading,\n loadingText = 'Laster resultater …',\n maxChips = 10,\n noMatchesText,\n onChange = () => undefined,\n placeholder,\n readOnly = false,\n selectedItems = [],\n selectOnBlur = false,\n selectOnTab = false,\n style,\n variant = 'information',\n ariaLabelChosenSingular,\n ariaLabelChosenPlural = 'valgte',\n ariaLabelCloseList = 'Lukk liste med valg',\n ariaLabelJumpToInput = `${selectedItems.length} valgte elementer, trykk for å hoppe til tekstfeltet`,\n ariaLabelOpenList = 'Åpne liste med valg',\n ariaLabelRemoveSelected = 'trykk for å fjerne valg',\n ariaLabelSelectedItem,\n onBlur,\n onClick,\n onKeyDown,\n onFocus,\n ...rest\n }: MultiSelectProps<ValueType>,\n ref: React.ForwardedRef<HTMLInputElement>,\n ) => {\n const [lastHighlightedIndex, setLastHighlightedIndex] = React.useState(0);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n //@ts-expect-error this is done to aid developers debug wrong prop usage\n if (rest.selectedItem !== undefined)\n console.warn(\n \"Incorrect 'selectedItem' prop found, did you mean to use 'selectedItems?\",\n );\n //@ts-expect-error selectedItem should not actually exist in rest\n }, [rest.selectedItem]);\n\n const {\n items: normalizedItems,\n loading: resolvedItemsLoading,\n fetchItems,\n } = useResolvedItems(initialItems, debounceTimeout);\n\n const isAllNonAsyncItemsSelected =\n typeof initialItems !== 'function' &&\n selectedItems.length === normalizedItems.length;\n\n // special 'item' used as Select All entry in the dropdown list\n const selectAll: NormalizedDropdownItemType<string> = {\n value: useRandomId('select-all'),\n label: labelSelectAll,\n };\n // special 'item' used as a replacement selected item tag for when\n // there are more selected element than maxChips\n const summarySelectedItems: NormalizedDropdownItemType<string> =\n React.useMemo(\n () => ({\n value: EMPTY_INPUT,\n label: isAllNonAsyncItemsSelected\n ? labelAllItemsSelected\n : selectedItems.length + ' ' + ariaLabelChosenPlural,\n }),\n [\n isAllNonAsyncItemsSelected,\n selectedItems,\n labelAllItemsSelected,\n ariaLabelChosenPlural,\n ],\n );\n\n const [listItems, setListItems] = useState([\n ...(!hideSelectAll ? [selectAll] : []),\n ...normalizedItems,\n ]);\n\n const filterListItems = React.useCallback(\n ({ inputValue }: { inputValue: string }) =>\n setListItems([\n ...(!hideSelectAll ? [selectAll] : []),\n ...normalizedItems.filter(item => itemFilter(item, inputValue)),\n ]),\n [hideSelectAll, selectAll, normalizedItems, itemFilter],\n );\n\n const updateListItems = React.useCallback(\n ({ inputValue }: { inputValue?: string }) => {\n const shouldRefetchItems = isFunctionWithQueryArgument(initialItems);\n if (shouldRefetchItems) fetchItems(inputValue ?? EMPTY_INPUT);\n\n filterListItems({ inputValue: inputValue ?? EMPTY_INPUT });\n },\n [filterListItems, initialItems, fetchItems],\n );\n\n React.useEffect(() => {\n filterListItems({ inputValue });\n }, [normalizedItems]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const {\n hasSelectedItems,\n handleListItemClicked,\n selectAllCheckboxState,\n clickedItemIsInSelectedItems,\n clickedItemIsSelectAll,\n } = useMultiselectUtils<ValueType>({\n listItems,\n selectAll,\n selectedItems,\n });\n\n const {\n getSelectedItemProps,\n getDropdownProps,\n reset,\n removeSelectedItem,\n setSelectedItems,\n } = useMultipleSelection({\n selectedItems,\n // @ts-expect-error prop missing from library types\n itemToString,\n itemToKey,\n onSelectedItemsChange({ selectedItems: newSelectedItems }) {\n onChange(newSelectedItems);\n },\n });\n\n const stateReducer = React.useCallback(\n (\n state: UseComboboxState<NormalizedDropdownItemType<ValueType | string>>,\n {\n changes,\n type,\n }: UseComboboxStateChangeOptions<\n NormalizedDropdownItemType<ValueType | string>\n >,\n ) => {\n if (\n changes.highlightedIndex !== undefined &&\n changes?.highlightedIndex >= 0\n ) {\n setLastHighlightedIndex(changes?.highlightedIndex);\n }\n\n switch (type) {\n // reset input value when leaving input field\n case useCombobox.stateChangeTypes.InputBlur:\n return {\n ...changes,\n inputValue: EMPTY_INPUT,\n };\n // keep menu open and edit input value on item selection\n case useCombobox.stateChangeTypes.InputKeyDownEnter:\n case useCombobox.stateChangeTypes.ItemClick: {\n return {\n ...changes,\n isOpen: true,\n inputValue: clearInputOnSelect\n ? EMPTY_INPUT\n : inputRef?.current?.value ?? EMPTY_INPUT,\n };\n }\n // edit input value when selected items is updated outside component\n case useCombobox.stateChangeTypes.ControlledPropUpdatedSelectedItem: {\n return {\n ...changes,\n inputValue: inputRef?.current?.value ?? EMPTY_INPUT,\n };\n }\n // remove leading whitespace, select item with spacebar if input is empty and filter list items\n case useCombobox.stateChangeTypes.InputChange: {\n const leadingWhitespaceTest = /^\\s+/g;\n const isSpacePressedOnEmptyInput = changes.inputValue === ' ';\n if (!isSpacePressedOnEmptyInput)\n setLastHighlightedIndex(hideSelectAll ? 0 : 1);\n\n if (changes.inputValue?.match(leadingWhitespaceTest)) {\n const sanitizedInputValue = changes.inputValue.replace(\n leadingWhitespaceTest,\n EMPTY_INPUT,\n );\n if (isSpacePressedOnEmptyInput) {\n if (!state.isOpen)\n return {\n ...changes,\n inputValue: sanitizedInputValue,\n isOpen: true,\n };\n\n if (changes.highlightedIndex !== undefined) {\n return {\n ...changes,\n inputValue: sanitizedInputValue,\n selectedItem: listItems[changes.highlightedIndex],\n };\n }\n }\n }\n\n return { ...changes, highlightedIndex: hideSelectAll ? 0 : 1 };\n }\n default:\n return changes;\n }\n },\n [hideSelectAll, normalizedItems, initialItems],\n );\n\n const {\n getInputProps,\n getItemProps,\n getLabelProps,\n getMenuProps,\n getToggleButtonProps,\n highlightedIndex,\n inputValue,\n isOpen,\n setInputValue,\n } = useCombobox({\n defaultHighlightedIndex: lastHighlightedIndex, // after selection, highlight previously selected item.\n items: listItems,\n itemToString,\n selectedItem: null,\n stateReducer,\n onInputValueChange(changes) {\n updateListItems({ inputValue: changes.inputValue });\n },\n onSelectedItemChange({ selectedItem: clickedItem }) {\n // clickedItem means item chosen either via mouse or keyboard\n if (!clickedItem) return;\n\n handleListItemClicked({\n clickedItem,\n onChange: setSelectedItems,\n });\n },\n // Accessibility\n getA11yStatusMessage: options =>\n getA11yStatusMessage({\n ...options,\n selectAllItemIncluded: !hideSelectAll,\n resultCount: listItems.length,\n }),\n ...rest,\n });\n\n // calculations for floating-UI popover position\n const { refs, floatingStyles, update } = useFloating<HTMLDivElement>({\n open: isOpen,\n placement: 'bottom-start',\n middleware: [\n offset(space.extraSmall2),\n shift({ padding: space.extraSmall }),\n size({\n apply({ elements, availableHeight }) {\n elements.floating.style.setProperty(\n '--list-max-height',\n `${clamp(10 * 16, availableHeight, 20 * 16)}px`,\n );\n },\n }),\n flip({ fallbackStrategy: 'initialPlacement' }),\n ],\n });\n\n // Update floating-ui position on scroll etc. Floating-ui's autoupdate is usually used inside\n // the useFloating hook but this requires the floating element to be conditionally rendered.\n // Downshift doesn't work correctly when conditionally rendered since props and refs aren't correctly\n // spread to the component. We therefor use this useLayoutEffect to update position. See https://floating-ui.com/docs/autoupdate#usage\n useLayoutEffect(() => {\n if (isOpen && refs.reference.current && refs.floating.current) {\n return autoUpdate(\n refs.reference.current,\n refs.floating.current,\n update,\n );\n }\n }, [isOpen, refs.reference, refs.floating, update]);\n\n const handleOnClear = () => {\n inputRef.current?.focus();\n reset();\n };\n\n return (\n <BaseFormControl\n className={classNames(\n 'eds-dropdown',\n 'eds-dropdown--multiselect',\n className,\n { 'eds-dropdown--has-tooltip': labelTooltip !== undefined },\n )}\n disabled={disabled}\n disableLabelAnimation={disableLabelAnimation}\n feedback={feedback}\n isFilled={hasSelectedItems || inputValue !== EMPTY_INPUT}\n label={label}\n labelId={getLabelProps().id}\n labelProps={getLabelProps()}\n labelTooltip={labelTooltip}\n onClick={(e: React.MouseEvent<HTMLElement>) => {\n if (e.target === e.currentTarget) getInputProps()?.onClick?.(e);\n onClick?.(e);\n }}\n onKeyDown={onKeyDown}\n onFocus={onFocus}\n readOnly={readOnly}\n ref={refs.setReference}\n style={style}\n variant={variant}\n after={\n <DropdownList\n ariaLabelChosenSingular={ariaLabelChosenSingular}\n ariaLabelSelectedItem={ariaLabelSelectedItem}\n floatingStyles={floatingStyles}\n getItemProps={getItemProps}\n highlightedIndex={highlightedIndex}\n isOpen={isOpen}\n listItems={listItems}\n loading={loading ?? resolvedItemsLoading}\n loadingText={loadingText}\n noMatchesText={noMatchesText}\n selectAllCheckboxState={selectAllCheckboxState}\n selectAllItem={selectAll}\n selectedItems={selectedItems}\n readOnly={readOnly}\n {...getMenuProps({\n 'aria-multiselectable': true,\n refKey: 'innerRef',\n ref: refs.setFloating,\n style: listStyle,\n })}\n />\n }\n {...rest}\n >\n <div\n className={classNames(\n 'eds-dropdown--multiselect__selected-items-and-input',\n {\n 'eds-dropdown--multiselect__selected-items-and-input--filled':\n hasSelectedItems,\n },\n )}\n >\n {selectedItems.length > 1 ? (\n <VisuallyHidden onClick={inputRef.current?.focus}>\n {ariaLabelJumpToInput}\n </VisuallyHidden>\n ) : null}\n {selectedItems.length <= maxChips ? (\n selectedItems.map((selectedItem, index) => (\n <SelectedItemTag\n ariaLabelChosen={ariaLabelChosenSingular}\n ariaLabelRemoveSelected={ariaLabelRemoveSelected}\n disabled={disabled}\n getSelectedItemProps={getSelectedItemProps}\n index={index}\n key={\n selectedItem?.label +\n (typeof selectedItem?.value === 'string'\n ? selectedItem.value\n : '')\n }\n readOnly={readOnly}\n removeSelectedItem={() => {\n removeSelectedItem(selectedItem);\n inputRef?.current?.focus();\n }}\n selectedItem={selectedItem}\n />\n ))\n ) : (\n <SelectedItemTag\n ariaLabelRemoveSelected={labelClearAllItems}\n ariaLabelChosen=\"\"\n disabled={disabled}\n readOnly={readOnly}\n removeSelectedItem={handleOnClear}\n selectedItem={summarySelectedItems}\n />\n )}\n <input\n {...getInputProps({\n onKeyDown: (e: React.KeyboardEvent) => {\n if (selectOnTab && isOpen && e.key === 'Tab') {\n const highlitedItem = listItems[highlightedIndex];\n if (!highlitedItem) return;\n\n // Skip tab selection for select all or if item already is selected\n const shouldSkipTabSelection =\n clickedItemIsSelectAll(highlitedItem) ||\n (!clickedItemIsSelectAll(highlitedItem) &&\n clickedItemIsInSelectedItems(highlitedItem));\n\n if (shouldSkipTabSelection) return;\n\n handleListItemClicked({\n clickedItem: highlitedItem,\n onChange: setSelectedItems,\n });\n }\n },\n onBlur: e => {\n setInputValue('');\n onBlur?.(e);\n },\n ...getDropdownProps({\n preventKeyAction: isOpen,\n value: inputValue ?? EMPTY_INPUT,\n ref: mergeRefs(inputRef, ref),\n }),\n className: 'eds-dropdown__input eds-form-control',\n disabled: readOnly || disabled,\n placeholder: placeholder,\n tabIndex: disabled || readOnly ? -1 : undefined,\n })}\n />\n </div>\n <DropdownFieldAppendix\n {...getToggleButtonProps({\n 'aria-busy': !(loading ?? resolvedItemsLoading)\n ? undefined\n : 'true',\n })}\n ariaLabelCloseList={ariaLabelCloseList}\n ariaLabelOpenList={ariaLabelOpenList}\n clearable={clearable}\n disabled={disabled || readOnly}\n onClear={handleOnClear}\n focusable={false}\n labelClearSelected={labelClearAllItems}\n isOpen={isOpen}\n itemIsSelected={selectedItems.length > 0}\n loadingText={loadingText}\n loading={loading ?? resolvedItemsLoading}\n />\n </BaseFormControl>\n );\n },\n);\n","import React, { Dispatch, SetStateAction, useLayoutEffect } from 'react';\nimport classNames from 'classnames';\nimport { useSelect } from 'downshift';\nimport {\n autoUpdate,\n flip,\n offset,\n shift,\n size,\n useFloating,\n} from '@floating-ui/react-dom';\n\nimport { BaseFormControl } from '@entur/form';\nimport { space } from '@entur/tokens';\nimport { mergeRefs, VariantType } from '@entur/utils';\n\nimport { DropdownList } from './components/DropdownList';\nimport { DropdownFieldAppendix } from './components/FieldComponents';\nimport { useResolvedItems } from './useResolvedItems';\nimport { clamp, itemToString } from './utils';\n\nimport {\n NormalizedDropdownItemType,\n PotentiallyAsyncDropdownItemType,\n} from './types';\n\nimport './Dropdown.scss';\n\n/** @deprecated use variant=\"information\" instead */\nconst info = 'info';\n/** @deprecated use variant=\"negative\" instead */\nconst error = 'error';\n\nexport type DropdownProps<ValueType> = {\n /** Tilgjengelige valg i dropdown-en */\n items: PotentiallyAsyncDropdownItemType<ValueType>;\n /** Valgt verdi. Bruk null for ingen verdi. */\n selectedItem: NormalizedDropdownItemType<ValueType> | null;\n /** Callback ved valg som skal oppdatere selectedItem */\n onChange?: (\n selectedItem: NormalizedDropdownItemType<ValueType> | null,\n ) => void | Dispatch<\n SetStateAction<NormalizedDropdownItemType<ValueType> | null>\n >;\n /** Beskrivende tekst som forklarer feltet */\n label: string;\n /** Placeholder-tekst når ingenting er satt */\n placeholder?: string;\n /** Om man skal ha mulighet for å nullstille Dropdown-en\n * @default false\n */\n clearable?: boolean;\n /** Lar brukeren velge ved å \"tab-e\" seg ut av komponenten */\n selectOnTab?: boolean;\n /**\n * @deprecated\n * Bruk selectOnTab i stedet\n *\n * Lar brukeren velge ved å \"tab-e\" seg ut av komponenten */\n selectOnBlur?: boolean;\n /** Deaktiver dropdown-en */\n disabled?: boolean;\n /** Setter dropdown-en i read-only modus */\n readOnly?: boolean;\n /** Hvilken valideringsvariant som gjelder */\n variant?: VariantType | typeof error | typeof info;\n /** Valideringsmelding, brukes sammen med `variant` */\n feedback?: string;\n /** Tekst eller ikon som kommer først i dropdown-feltet */\n prepend?: React.ReactNode;\n /** */\n loading?: boolean;\n /** En tekst som beskriver hva som skjer når man venter på items\n * @default 'Laster inn …'\n */\n loadingText?: string;\n /** Tekst som kommer opp når det ikke er noe elementer å vise\n * @default \"Ingen tilgjengelige valg …\"\n */\n noMatchesText?: string;\n /** Om man skal ha mulighet for å nullstille Dropdown-en\n * @default \"fjern valgt\"\n */\n labelClearSelectedItem?: string;\n /** En tooltip som gir ekstra info om inputfeltet */\n labelTooltip?: React.ReactNode;\n /** Plasserer labelen statisk på toppen av inputfeltet\n * @default false\n */\n disableLabelAnimation?: boolean;\n /** Ekstra klassenavn */\n className?: string;\n /** Styling som sendes ned til Dropdown-lista */\n listStyle?: { [key: string]: any };\n /** Styling for Dropdown-en */\n style?: { [key: string]: any };\n /** Tekst for skjemleser for knapp som lukker listen med valg\n * @default \"Lukk liste med valg\"\n */\n ariaLabelCloseList?: string;\n /** Tekst for skjemleser for knapp som åpner listen med valg\n * @default \"Åpne liste med valg\"\n */\n ariaLabelOpenList?: string;\n /** Ord for at et element er valgt i entall\n * eks. 'Element 1, _valgt_'\n * @default 'valgt'\n */\n ariaLabelChosenSingular?: string;\n /** Tekst for skjermleser som beskriver statusen til et element som valgt\n * @default ', valgt element, trykk for å fjerne'\n */\n ariaLabelSelectedItem?: string;\n};\n\nexport const Dropdown = React.forwardRef(\n <ValueType extends NonNullable<any>>(\n {\n ariaLabelChosenSingular,\n ariaLabelCloseList = 'Lukk liste med valg',\n ariaLabelOpenList = 'Åpne liste med valg',\n ariaLabelSelectedItem,\n className,\n clearable = false,\n disabled = false,\n disableLabelAnimation,\n feedback,\n items: initialItems,\n label,\n labelClearSelectedItem = 'fjern valgt',\n labelTooltip,\n listStyle,\n loading,\n loadingText = 'Laster resultater …',\n noMatchesText = 'Ingen tilgjengelige valg …',\n onChange,\n placeholder,\n prepend,\n readOnly = false,\n selectedItem,\n selectOnBlur = false,\n selectOnTab = false,\n style,\n variant = 'information',\n ...rest\n }: DropdownProps<ValueType>,\n ref: React.ForwardedRef<HTMLDivElement>,\n ) => {\n const { items: normalizedItems, loading: resolvedItemsLoading } =\n useResolvedItems(initialItems);\n const isFilled = selectedItem !== null || placeholder !== undefined;\n const {\n isOpen,\n getItemProps,\n getLabelProps,\n getMenuProps,\n getToggleButtonProps,\n highlightedIndex,\n selectItem,\n reset,\n } = useSelect({\n items: normalizedItems,\n defaultHighlightedIndex: selectedItem ? undefined : 0,\n selectedItem,\n stateReducer(_, { changes, type }) {\n const toggleButtonIsFocused =\n typeof document !== 'undefined' &&\n document.activeElement === refs.reference.current;\n\n switch (type) {\n case useSelect.stateChangeTypes.ToggleButtonKeyDownArrowDown:\n case useSelect.stateChangeTypes.ToggleButtonKeyDownArrowUp:\n if (!toggleButtonIsFocused) return { ...changes, isOpen: false };\n }\n return changes;\n },\n onStateChange({ type, selectedItem: newSelectedItem }) {\n switch (type) {\n case useSelect.stateChangeTypes.ToggleButtonBlur:\n if (!selectOnBlur) return;\n }\n if (newSelectedItem === undefined) return;\n onChange?.(newSelectedItem ?? null);\n },\n itemToString,\n });\n\n // calculations for floating-UI popover position\n const { refs, floatingStyles, update } = useFloating<HTMLDivElement>({\n open: isOpen,\n placement: 'bottom-start',\n middleware: [\n offset(space.extraSmall2),\n shift({ padding: space.extraSmall }),\n size({\n apply({ elements, availableHeight }) {\n elements.floating.style.setProperty(\n '--list-max-height',\n `${clamp(10 * 16, availableHeight, 20 * 16)}px`,\n );\n },\n }),\n flip({ fallbackStrategy: 'initialPlacement' }),\n ],\n });\n\n // Update floating-ui position on scroll etc. Floating-ui's autoupdate is usually used inside\n // the useFloating hook but this requires the floating element to be conditionally rendered.\n // Downshift doesn't work correctly when conditionally rendered since props and refs aren't correctly\n // spread to the component. We therefor use this useLayoutEffect to update position. See https://floating-ui.com/docs/autoupdate#usage\n useLayoutEffect(() => {\n if (isOpen && refs.reference.current && refs.floating.current) {\n return autoUpdate(\n refs.reference.current,\n refs.floating.current,\n update,\n );\n }\n }, [isOpen, refs.reference, refs.floating, update]);\n\n const handleOnClear = () => {\n reset();\n refs.reference.current?.focus();\n };\n\n return (\n <BaseFormControl\n className={classNames('eds-dropdown', className, {\n 'eds-dropdown--has-tooltip': labelTooltip !== undefined,\n })}\n disableLabelAnimation={disableLabelAnimation}\n feedback={feedback}\n isFilled={isFilled}\n labelProps={getLabelProps()}\n labelTooltip={labelTooltip}\n prepend={prepend}\n style={style}\n variant={variant}\n {...getToggleButtonProps({\n ref: mergeRefs(ref, refs.setReference),\n 'aria-disabled': disabled,\n 'aria-label': disabled ? 'Disabled dropdown' : '',\n disabled: disabled,\n readOnly: readOnly,\n label: label,\n labelId: getLabelProps()?.id,\n children: undefined,\n tabIndex: disabled || readOnly ? -1 : 0,\n onKeyDown(e) {\n if (isOpen && e.key === 'Tab') {\n const highlitedItem = normalizedItems[highlightedIndex];\n // we don't want to clear selection with tab\n if (\n (selectOnTab || selectOnBlur) &&\n highlitedItem &&\n highlitedItem !== selectedItem\n ) {\n selectItem(highlitedItem);\n }\n }\n },\n })}\n after={\n <DropdownList\n ariaLabelChosenSingular={ariaLabelChosenSingular}\n ariaLabelSelectedItem={ariaLabelSelectedItem}\n floatingStyles={floatingStyles}\n getItemProps={getItemProps}\n highlightedIndex={highlightedIndex}\n isOpen={isOpen}\n listItems={normalizedItems}\n loading={loading ?? resolvedItemsLoading}\n loadingText={loadingText}\n noMatchesText={noMatchesText}\n selectedItems={selectedItem !== null ? [selectedItem] : []}\n readOnly={readOnly}\n {...getMenuProps({\n refKey: 'innerRef',\n ref: refs.setFloating,\n style: listStyle,\n })}\n />\n }\n {...rest}\n // Append is not supported as of now\n append={undefined}\n >\n <div className=\"eds-dropdown__selected-item\">\n {selectedItem?.label ?? (\n <div\n className={classNames(\n 'eds-dropdown__selected-item__placeholder',\n {\n 'eds-dropdown__selected-item__placeholder--readonly':\n readOnly,\n },\n )}\n >\n {placeholder}\n </div>\n )}\n </div>\n <DropdownFieldAppendix\n aria-busy={!(loading ?? resolvedItemsLoading) ? undefined : 'true'}\n aria-expanded={isOpen}\n clearable={clearable}\n onClear={handleOnClear}\n disabled={disabled || readOnly}\n focusable={false}\n labelClearSelected={labelClearSelectedItem}\n isOpen={isOpen}\n itemIsSelected={selectedItem !== null}\n ariaLabelCloseList={ariaLabelCloseList}\n ariaLabelOpenList={ariaLabelOpenList}\n loading={false}\n loadingText={undefined}\n />\n </BaseFormControl>\n );\n },\n);\n","import React, { forwardRef } from 'react';\nimport { BaseFormControl } from '@entur/form';\nimport { DownArrowIcon } from '@entur/icons';\nimport { LoadingDots } from '@entur/loader';\nimport { useRandomId, VariantType } from '@entur/utils';\n\nimport { useResolvedItems } from './useResolvedItems';\nimport {\n NormalizedDropdownItemType,\n PotentiallyAsyncDropdownItemType,\n} from './types';\n\nimport './Dropdown.scss';\n\n/** @deprecated use variant=\"information\" instead */\nconst info = 'info';\n/** @deprecated use variant=\"negative\" instead */\nconst error = 'error';\n\nexport type NativeDropdownProps<ValueType> = {\n /** Ekstra klassenavn */\n className?: string;\n /**\n * For å deaktivere dropdow-nen\n * @default false\n **/\n disabled?: boolean;\n /** Valideringsmelding, brukes sammen med `variant` */\n feedback?: string;\n /** Alle valg for dropdown-en å ha */\n items: PotentiallyAsyncDropdownItemType<ValueType>;\n /** Beskrivende tekst som forklarer feltet */\n label: string;\n /** En callback for endringer av value\n * Obs: merk at parameter her denne ikke er samme som i en HTML select.\n * Bruk { target } hvis du trenger info om select-elementet som ble trykket på\n */\n onChange?: ({\n value,\n selectedItem,\n target,\n }: {\n value: string;\n selectedItem: NormalizedDropdownItemType<ValueType> | null;\n target: EventTarget & HTMLSelectElement;\n }) => void;\n /** Tekst eller ikon som kommer før dropdown-en */\n prepend?: React.ReactNode;\n /**\n * Setter dropdown-en i read-only modus\n * @default false\n **/\n readOnly?: boolean;\n /** Den valgte verdien som NormalizedDropdownItemType\n * (Brukes når komponenten er 'controlled')\n */\n selectedItem?: NormalizedDropdownItemType<ValueType> | null;\n /** Den valgte verdien som sting\n * (Brukes når komponenten er 'controlled)\n */\n value?: string;\n /** Hvilken valideringsvariant som gjelder*/\n variant?: VariantType | typeof error | typeof info;\n /** Plasserer labelen statisk på toppen av inputfeltet\n * @default false\n */\n disableLabelAnimation?: boolean;\n [key: string]: any;\n};\n\nexport const NativeDropdown = forwardRef(\n <ValueType extends string | number>(\n {\n className,\n disabled = false,\n disableLabelAnimation,\n feedback,\n items,\n label,\n loadingText,\n onChange,\n prepend,\n readOnly = false,\n selectedItem,\n style,\n value,\n variant,\n ...rest\n }: NativeDropdownProps<ValueType>,\n ref: React.ForwardedRef<HTMLSelectElement>,\n ) => {\n const { items: normalizedItems, loading } =\n useResolvedItems<ValueType>(items);\n const nativeDropdownId = useRandomId('eds-dropdown-native');\n\n return (\n <BaseFormControl\n disabled={disabled}\n readOnly={readOnly}\n prepend={prepend}\n append={\n <FieldAppend\n hidden={disabled || readOnly}\n loading={loading}\n loadingText={loadingText}\n />\n }\n className={className}\n style={style}\n label={label}\n labelId={nativeDropdownId}\n variant={variant}\n feedback={feedback}\n disableLabelAnimation={disableLabelAnimation}\n isFilled={true}\n >\n <select\n aria-invalid={variant === 'negative' || variant === error}\n aria-labelledby={nativeDropdownId}\n aria-busy={loading}\n className=\"eds-form-control eds-dropdown--native\"\n disabled={disabled || readOnly}\n onChange={event => {\n onChange?.({\n value: event.target.value,\n selectedItem:\n normalizedItems.find(\n item => item.value === event.target.value,\n ) ?? null,\n target: event.target,\n });\n }}\n value={value ?? selectedItem?.value ?? undefined}\n ref={ref}\n {...rest}\n >\n {normalizedItems.map(item => (\n <option key={item.value} value={item.value}>\n {item.label}\n </option>\n ))}\n </select>\n </BaseFormControl>\n );\n },\n);\n\nconst FieldAppend = ({\n loading,\n loadingText,\n hidden,\n}: {\n loading: boolean;\n loadingText?: string;\n hidden: boolean;\n}) => {\n if (loading) {\n return (\n <div className=\"eds-dropdown-native__loading-dots\">\n <LoadingDots aria-label={loadingText} />\n </div>\n );\n }\n if (hidden) {\n return <></>;\n }\n return <DownArrowIcon inline />;\n};\n","import { warnAboutMissingStyles } from '@entur/utils';\nimport './index.scss';\n\nwarnAboutMissingStyles('dropdown', 'form', 'a11y', 'chip');\n\nexport type { NormalizedDropdownItemType, DropdownItemType } from './types';\n\nexport * from './SearchableDropdown';\nexport * from './MultiSelect';\nexport * from './Dropdown';\nexport * from './NativeDropdown';\nexport * from './types';\n"],"names":["jsxs","Fragment","jsx","Checkbox","VisuallyHidden","createElement","TagChip","forwardRef","IconButton","DownArrowIcon","LoadingDots","Tooltip","CloseSmallIcon","error","useDebounce","useMemo","useState","useRef","inputValue","useEffect","useCallback","useCombobox","useFloating","offset","space","shift","size","flip","useLayoutEffect","autoUpdate","BaseFormControl","mergeRefs","useRandomId","useMultipleSelection","useSelect","warnAboutMissingStyles"],"mappings":"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"}
1
+ {"version":3,"file":"dropdown.cjs.js","sources":["../src/components/DropdownList.tsx","../src/components/FieldComponents.tsx","../src/useNormalizedItems.ts","../src/useResolvedItems.ts","../src/utils.ts","../src/SearchableDropdown.tsx","../src/MultiSelect.tsx","../src/Dropdown.tsx","../src/NativeDropdown.tsx","../src/index.tsx"],"sourcesContent":["import React, { MutableRefObject } from 'react';\nimport classNames from 'classnames';\nimport { UseComboboxPropGetters, UseSelectPropGetters } from 'downshift';\n\nimport { VisuallyHidden } from '@entur/a11y';\nimport { Checkbox } from '@entur/form';\n\nimport { NormalizedDropdownItemType } from '../types';\n\nimport './DropdownList.scss';\n\ntype DropdownListProps<ValueType> = {\n ariaLabelChosenSingular?: string;\n ariaLabelSelectedItem?: string;\n getItemProps:\n | UseComboboxPropGetters<ValueType>['getItemProps']\n | UseSelectPropGetters<ValueType>['getItemProps'];\n highlightedIndex: number;\n isOpen: boolean;\n listItems: NormalizedDropdownItemType<ValueType | string>[];\n floatingStyles: { [key: string]: any } | undefined;\n innerRef?:\n | MutableRefObject<HTMLUListElement>\n | ((node: HTMLElement | null) => void);\n loading?: boolean;\n loadingText?: string;\n noMatchesText?: string;\n selectAllCheckboxState?: boolean | 'indeterminate';\n selectAllItem?: NormalizedDropdownItemType<string>;\n selectedItems: NormalizedDropdownItemType<ValueType>[];\n style?: React.CSSProperties;\n readOnly?: boolean;\n};\n\nexport const DropdownList = <ValueType extends NonNullable<any>>({\n ariaLabelChosenSingular = 'valgt',\n ariaLabelSelectedItem = ', valgt element',\n getItemProps,\n isOpen,\n highlightedIndex,\n listItems,\n floatingStyles,\n innerRef,\n loading = false,\n loadingText = 'Laster inn …',\n noMatchesText = 'Ingen treff for søket',\n readOnly = false,\n selectAllCheckboxState,\n selectAllItem,\n selectedItems,\n style,\n ...rest\n}: DropdownListProps<ValueType>) => {\n const isMultiselect = selectAllItem !== undefined;\n const isNoMatches =\n !loading &&\n (listItems.length === 0 ||\n (listItems?.length === 1 &&\n listItems?.[0]?.value === selectAllItem?.value));\n const isItemSelected = (\n item: NormalizedDropdownItemType<ValueType | string>,\n ) =>\n selectedItems.some(selectedItem => {\n // Primary match: value must always match\n if (selectedItem?.value !== item?.value) return false;\n\n // If both have labels, they must match for accessibility consistency\n // This ensures screen readers announce the same label for selected items\n // that users see in the dropdown list, preventing confusion\n if (selectedItem?.label && item?.label) {\n return selectedItem.label === item.label;\n }\n\n return true;\n });\n\n const ariaValuesSelectAll = () => {\n switch (selectAllCheckboxState) {\n case 'indeterminate': {\n return {\n label: `${selectAllItem?.label}, delvis valgt`,\n selected: false,\n };\n }\n case true: {\n return {\n label: `${selectAllItem?.label}, ${ariaLabelChosenSingular}`,\n selected: true,\n };\n }\n default: {\n return { label: `${selectAllItem?.label}`, selected: false };\n }\n }\n };\n\n const selectAllListItemContent = () => (\n <>\n <Checkbox\n aria-hidden=\"true\"\n checked={selectAllCheckboxState}\n className=\"eds-dropdown__list__item__checkbox\"\n tabIndex={-1}\n onChange={() => undefined}\n />\n <span\n className=\"eds-dropdown__list__item__text\"\n aria-label={ariaValuesSelectAll().label}\n >\n {selectAllItem?.label}\n </span>\n </>\n );\n\n const isReactComponent = (icon: any): icon is React.ComponentType<any> => {\n return (\n typeof icon === 'function' ||\n (typeof icon === 'object' &&\n icon !== null &&\n '$$typeof' in icon &&\n typeof icon.$$typeof === 'symbol')\n );\n };\n\n const listItemContent = (item: NormalizedDropdownItemType<ValueType>) => {\n return (\n <>\n {isMultiselect && (\n <Checkbox\n aria-hidden=\"true\"\n checked={isItemSelected(item)}\n className=\"eds-dropdown__list__item__checkbox\"\n tabIndex={-1}\n onChange={() => undefined}\n />\n )}\n <span className=\"eds-dropdown__list__item__text\">\n {item.label}\n <VisuallyHidden>\n {isItemSelected(item) ? ariaLabelSelectedItem : ''}\n </VisuallyHidden>\n </span>\n {Array.isArray(item.icons)\n ? item.icons.filter(isReactComponent).map((Icon, index) => {\n const key = `${\n Icon.displayName ?? Icon.name ?? Icon.name\n }-${index}`;\n return (\n <Icon\n key={key}\n inline\n className=\"eds-dropdown__list__item__icon\"\n />\n );\n })\n : null}\n </>\n );\n };\n\n return (\n <ul\n className=\"eds-dropdown__list\"\n ref={innerRef}\n style={{\n display: isOpen && !readOnly ? undefined : 'none',\n ...floatingStyles,\n ...style,\n }}\n {...rest}\n >\n {(() => {\n if (!isOpen || readOnly) return null;\n\n if (loading) {\n return (\n <li\n key=\"dropdown-list-loading\"\n className=\"eds-dropdown__list__item\"\n >\n {loadingText}\n </li>\n );\n }\n\n if (isNoMatches) {\n return (\n <li\n key=\"dropdown-list-no-match\"\n className=\"eds-dropdown__list__item\"\n >\n {noMatchesText}\n </li>\n );\n }\n\n return listItems.map((item, index) => {\n const key =\n item.itemKey ??\n `${item.label ?? ''}-${item.value ?? ''}-${(item.icons ?? [])\n .map(icon => icon?.displayName ?? icon?.name ?? 'unknown')\n .join('-')}`;\n const itemIsSelectAll = item.value === selectAllItem?.value;\n if (itemIsSelectAll && listItems.length <= 2) return null;\n return (\n <li\n className={classNames('eds-dropdown__list__item', {\n 'eds-dropdown__list__item--select-all': itemIsSelectAll,\n 'eds-dropdown__list__item--highlighted':\n highlightedIndex === index,\n 'eds-dropdown__list__item--selected':\n !isMultiselect && isItemSelected(item),\n })}\n key={key}\n {...getItemProps({\n // @ts-expect-error Since getItemProps expects the same item type\n // here as items, it throws error when selectAllItem is a string.\n // This does, however, not cause any functional issues.\n item,\n index,\n 'aria-selected': itemIsSelectAll\n ? ariaValuesSelectAll().selected\n : isItemSelected(item),\n })}\n >\n {itemIsSelectAll\n ? selectAllListItemContent()\n : listItemContent(\n item as NormalizedDropdownItemType<ValueType>,\n )}\n </li>\n );\n });\n })()}\n </ul>\n );\n};\n","import React, { forwardRef } from 'react';\nimport classNames from 'classnames';\nimport {\n UseComboboxGetToggleButtonPropsReturnValue,\n UseMultipleSelectionGetSelectedItemPropsOptions,\n} from 'downshift';\n\nimport { IconButton } from '@entur/button';\nimport { TagChip } from '@entur/chip';\nimport { CloseSmallIcon, DownArrowIcon } from '@entur/icons';\nimport { LoadingDots } from '@entur/loader';\nimport { Tooltip } from '@entur/tooltip';\n\nimport { NormalizedDropdownItemType } from '../types';\n\nimport './FieldComponents.scss';\n\nexport const SelectedItemTag = <ValueType extends NonNullable<any>>({\n ariaLabelRemoveSelected,\n ariaLabelChosen = 'valgt',\n disabled,\n getSelectedItemProps,\n index,\n readOnly,\n removeSelectedItem,\n selectedItem,\n}: {\n ariaLabelRemoveSelected: string;\n ariaLabelChosen?: string;\n disabled?: boolean;\n getSelectedItemProps?: (\n options: UseMultipleSelectionGetSelectedItemPropsOptions<\n NormalizedDropdownItemType<ValueType>\n >,\n ) => any;\n index?: number;\n readOnly?: boolean;\n removeSelectedItem: (item: NormalizedDropdownItemType<ValueType>) => void;\n selectedItem: NormalizedDropdownItemType<ValueType>;\n}) => {\n if (!selectedItem) return null;\n\n const { tabIndex: _, ...selectedItemProps } =\n getSelectedItemProps?.({\n selectedItem,\n index,\n }) ?? {};\n return (\n <TagChip\n size=\"small\"\n className={classNames('eds-dropdown__selected-item-tag', {\n 'eds-dropdown__selected-item-tag--readonly': readOnly,\n 'eds-dropdown__selected-item-tag--disabled': disabled,\n })}\n {...selectedItemProps}\n onClose={(e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n removeSelectedItem(selectedItem);\n }}\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n closeButtonAriaLabel={`${selectedItem.label} ${ariaLabelChosen}, ${ariaLabelRemoveSelected} `}\n key={selectedItem.value}\n aria-live=\"polite\"\n >\n <span\n aria-hidden=\"true\"\n className=\"eds-dropdown__selected-item-tag__text\"\n >\n {selectedItem.label}\n </span>\n </TagChip>\n );\n};\n\ntype FieldAppendProps = Partial<UseComboboxGetToggleButtonPropsReturnValue> & {\n ariaLabelCloseList: string;\n ariaLabelOpenList: string;\n clearable?: boolean;\n labelClearSelected: string;\n disabled?: boolean;\n focusable?: boolean;\n isOpen: boolean;\n loading: boolean;\n loadingText: string | undefined;\n onClear: () => void;\n itemIsSelected: boolean;\n};\n\nexport const DropdownFieldAppendix = forwardRef(\n (\n {\n ariaLabelCloseList,\n ariaLabelOpenList,\n clearable = false,\n labelClearSelected,\n focusable = false,\n disabled,\n isOpen,\n loading = false,\n loadingText,\n onClear,\n itemIsSelected,\n ...rest\n }: FieldAppendProps,\n ref: React.ForwardedRef<HTMLButtonElement>,\n ) => {\n function getToggleAriaLabel() {\n if (loading) return loadingText;\n if (isOpen) return ariaLabelCloseList;\n return ariaLabelOpenList;\n }\n\n return (\n <>\n {!disabled && (\n <div className=\"eds-dropdown__appendix\">\n {clearable && itemIsSelected && (\n <ClearableButton\n onClear={onClear}\n focusable={true}\n labelClearSelectedItems={labelClearSelected}\n />\n )}\n\n <IconButton\n className={classNames('eds-dropdown__appendix__toggle-button', {\n 'eds-dropdown__appendix__toggle-button--open': isOpen,\n })}\n ref={ref}\n aria-label={getToggleAriaLabel()}\n {...rest}\n type=\"button\"\n tabIndex={focusable ? 0 : -1}\n >\n {!loading ? (\n <DownArrowIcon aria-hidden=\"true\" />\n ) : (\n <LoadingDots aria-hidden=\"true\" />\n )}\n </IconButton>\n </div>\n )}\n </>\n );\n },\n);\n\nexport const ClearableButton = ({\n onClear,\n labelClearSelectedItems = 'Fjern valgte',\n focusable = false,\n}: {\n onClear: () => void;\n labelClearSelectedItems?: string;\n focusable?: boolean;\n ariaLabelClearItems?: string;\n}) => {\n return (\n <>\n <Tooltip\n aria-hidden=\"true\"\n placement=\"top\"\n content={labelClearSelectedItems}\n className=\"eds-dropdown__appendix__clear-button__tooltip\"\n >\n <IconButton\n className=\"eds-dropdown__appendix__clear-button\"\n type=\"button\"\n tabIndex={focusable ? 0 : -1}\n // These events bubble up to the Dropdown container and trigger openMenu.\n // To avoid this, stopPropagation and preventDefault are added.\n onClick={e => {\n e.stopPropagation();\n onClear();\n }}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n e.stopPropagation();\n onClear();\n }\n }}\n aria-label={labelClearSelectedItems}\n >\n <CloseSmallIcon aria-hidden=\"true\" />\n </IconButton>\n </Tooltip>\n <div className=\"eds-dropdown__appendix__divider\" />\n </>\n );\n};\n","import React from 'react';\n\nimport { DropdownItemType, NormalizedDropdownItemType } from './types';\n\nexport const useNormalizedItems = <ValueType = string>(\n items: DropdownItemType<ValueType>[],\n): NormalizedDropdownItemType<ValueType>[] =>\n React.useMemo(\n () =>\n items.map(item => {\n if (typeof item == 'string') {\n return {\n value: item as ValueType,\n label: item,\n };\n }\n\n if (item?.value === undefined) {\n return {\n ...item,\n value: item.label as ValueType,\n };\n }\n return { ...item, value: item.value };\n }),\n [items],\n );\n","import React from 'react';\n\nimport { useDebounce } from '@entur/utils';\n\nimport { useNormalizedItems } from './useNormalizedItems';\n\nimport {\n PotentiallyAsyncDropdownItemType,\n DropdownItemType,\n NormalizedDropdownItemType,\n AsyncDropdownItemType,\n} from './types';\n\nexport const useResolvedItems = <ValueType extends NonNullable<any>>(\n /** The list of items, or an async function that resolves the list of items */\n itemsOrItemsResolver: PotentiallyAsyncDropdownItemType<ValueType>,\n /** The time to wait after the input changes to the fetchItems method is called */\n debounceTimeout = 250,\n): {\n fetchItems: (query?: string) => void;\n loading: boolean;\n items: NormalizedDropdownItemType<ValueType>[];\n} => {\n const itemsIsAFunction = typeof itemsOrItemsResolver === 'function';\n\n const [items, setItems] = React.useState<DropdownItemType<ValueType>[]>(\n itemsIsAFunction ? [] : itemsOrItemsResolver,\n );\n const [loading, setLoading] = React.useState(false);\n\n const abortControllerRef = React.useRef<AbortController>(\n new AbortController(),\n );\n\n // We normalize the itemsResolver argument to an async function, so we\n // can use it without thinking about the differences later\n const itemsResolver = React.useMemo(() => {\n if (itemsIsAFunction)\n return itemsOrItemsResolver as AsyncDropdownItemType<ValueType>;\n return () =>\n Promise.resolve(itemsOrItemsResolver as DropdownItemType<ValueType>[]);\n }, [itemsOrItemsResolver, itemsIsAFunction]);\n\n // This should be called whenever the input value changes\n const updateItems = async (inputValue?: string) => {\n // The abortController handles cleanup of the previous request and unmounting\n if (abortControllerRef?.current) abortControllerRef?.current?.abort();\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n setLoading(true);\n\n try {\n const resolvedItems = await itemsResolver(\n inputValue ?? '',\n abortControllerRef,\n );\n\n if (abortControllerRef?.current?.signal?.aborted) {\n console.warn(\n 'Avbryt den asynkrone funksjonen din med signalet fra AbortController-en for å for å unngå minnelekkasje.',\n 'Funksjonen bør kaste en DOMException med navnet \"AbortError\" når den avbrytes.',\n '',\n '\\n\\nSe eksempel her: https://linje.entur.no/komponenter/skjemaelementer/dropdown#s%C3%B8kbar-dropdown-med-valg-fra-nettverkskall-bassert-p%C3%A5-tekstinput',\n '\\nLes mer om AbortController her: https://developer.mozilla.org/en-US/docs/Web/API/AbortController',\n );\n return;\n }\n\n setLoading(false);\n setItems(resolvedItems);\n } catch (error) {\n if (\n error &&\n typeof error === 'object' &&\n 'name' in error &&\n error.name === 'AbortError'\n ) {\n // Stop execution if the request was aborted\n return;\n }\n console.warn(\n 'The following error was received but not handled inside Entur Designsystems useResolvedItems hook:',\n );\n throw error;\n }\n };\n\n const debouncedFetchItems = useDebounce(updateItems, debounceTimeout);\n const normalizedItems = useNormalizedItems(items);\n\n React.useEffect(() => {\n // send abort signal to previous request on unmount for cleanup\n return () => abortControllerRef?.current?.abort('Component unmounted');\n }, []);\n\n React.useEffect(() => {\n // Let's fetch the list initially if it's specified\n if (itemsIsAFunction) {\n debouncedFetchItems('');\n }\n }, [itemsIsAFunction, itemsResolver]);\n\n return {\n items: normalizedItems,\n loading: itemsIsAFunction ? loading : false,\n fetchItems: debouncedFetchItems,\n };\n};\n","import { useMemo } from 'react';\nimport { UseComboboxState } from 'downshift';\nimport { NormalizedDropdownItemType } from './types';\n\n// Redeclare forwardRef\ndeclare module 'react' {\n function forwardRef<T, P = object>(\n render: (props: P, ref: React.Ref<T>) => React.ReactElement | null,\n ): (props: P & React.RefAttributes<T>) => React.ReactElement | null;\n}\n\n/* start general utils */\nexport const EMPTY_INPUT = '';\n\nexport function lowerCaseFilterTest(\n item: NormalizedDropdownItemType<any>,\n input: string | undefined,\n) {\n if (!input) {\n return true;\n }\n const sanitizeEscapeCharacters = input.replace(\n /[-/\\\\^$*+?.()|[\\]{}]/g,\n '\\\\$&',\n );\n const inputRegex = new RegExp(sanitizeEscapeCharacters, 'i');\n return inputRegex.test(item.label);\n}\n\nexport function noFilter<ValueType>(\n //@ts-expect-error only here to comply with dropdown filter API\n item: NormalizedDropdownItemType<ValueType>,\n //@ts-expect-error only here to comply with dropdown filter API\n input: string | undefined,\n) {\n return true;\n}\n\nexport const itemToString = (item: NormalizedDropdownItemType<any> | null) =>\n item ? item.label : '';\n\nexport const itemToKey = (item: NormalizedDropdownItemType<any> | null) =>\n item?.label + item?.value;\n\nexport const isFunctionWithQueryArgument = (object: any) =>\n typeof object === 'function' && object.length > 0;\n\nexport const clamp = (val: number, min = 1, max = 10) =>\n Math.min(Math.max(val, min), max);\n\nexport const resetInputState = <ValueType>(\n changes: Partial<UseComboboxState<NormalizedDropdownItemType<ValueType>>>,\n) => ({\n ...changes,\n inputValue: EMPTY_INPUT,\n});\n\n/* end general utils */\n/* start multiselect utils */\n\ntype useMultiselectUtilsType<ValueType> = {\n selectedItems: NormalizedDropdownItemType<ValueType>[];\n listItems: NormalizedDropdownItemType<ValueType | string>[];\n selectAll: NormalizedDropdownItemType<string>;\n};\n\nexport const useMultiselectUtils = <ValueType>({\n listItems,\n selectedItems,\n selectAll,\n}: useMultiselectUtilsType<ValueType>) => {\n const hasSelectedItems = selectedItems.length > 0;\n\n const listItemsWithoutSelectAll = listItems.filter(\n item => item.value !== selectAll.value,\n ) as NormalizedDropdownItemType<ValueType>[];\n\n const unselectedItemsInListItems = listItemsWithoutSelectAll.filter(\n listItem =>\n !selectedItems.some(\n selectedItem => selectedItem.value === listItem.value,\n ),\n );\n\n const allListItemsAreSelected = !listItemsWithoutSelectAll.some(\n listItem =>\n !selectedItems.some(\n selectedItem => selectedItem.value === listItem.value,\n ),\n );\n\n const someListItemsAreSelected = listItemsWithoutSelectAll.some(listItem =>\n selectedItems.some(selectedItem => selectedItem.value === listItem.value),\n );\n\n const addClickedItemToSelectedItems = (\n clickedItem: NormalizedDropdownItemType<ValueType>,\n onChange: (value: NormalizedDropdownItemType<ValueType>[]) => void,\n ) => onChange([...selectedItems, clickedItem]);\n\n const clickedItemIsInSelectedItems = (\n clickedItem: NormalizedDropdownItemType<ValueType>,\n ) =>\n selectedItems.some(\n selectedItem => selectedItem.value === clickedItem.value,\n );\n\n const clickedItemIsSelectAll = (\n clickedItem: NormalizedDropdownItemType<string | ValueType>,\n ): clickedItem is NormalizedDropdownItemType<string> =>\n clickedItem.value === selectAll.value;\n\n const handleListItemClicked = ({\n clickedItem,\n onChange,\n }: {\n clickedItem: NormalizedDropdownItemType<any>;\n onChange: (value: NormalizedDropdownItemType<ValueType>[]) => void;\n }) => {\n if (clickedItemIsSelectAll(clickedItem)) {\n if (allListItemsAreSelected) {\n return unselectAllListItems(onChange);\n }\n return selectAllUnselectedItemsInListItems(onChange);\n }\n\n if (clickedItemIsInSelectedItems(clickedItem)) {\n return removeClickedItemFromSelectedItems(clickedItem, onChange);\n }\n addClickedItemToSelectedItems(clickedItem, onChange);\n };\n\n const removeClickedItemFromSelectedItems = (\n clickedItem: NormalizedDropdownItemType<ValueType>,\n onChange: (value: NormalizedDropdownItemType<ValueType>[]) => void,\n ) =>\n onChange(\n selectedItems.filter(\n selectedItem => selectedItem.value !== clickedItem.value,\n ),\n );\n\n const selectAllCheckboxState: boolean | 'indeterminate' = useMemo(() => {\n if (allListItemsAreSelected) return true;\n if (someListItemsAreSelected) return 'indeterminate';\n return false;\n }, [allListItemsAreSelected, someListItemsAreSelected]);\n\n const selectAllUnselectedItemsInListItems = (\n onChange: (value: NormalizedDropdownItemType<ValueType>[]) => void,\n ) => {\n onChange([...selectedItems, ...unselectedItemsInListItems]);\n };\n\n const unselectAllListItems = (\n onChange: (value: NormalizedDropdownItemType<ValueType>[]) => void,\n ) => {\n const selectedItemsWithoutItemsInListItems = selectedItems.filter(\n selectedItem =>\n !listItemsWithoutSelectAll.some(\n listItem => listItem.value === selectedItem.value,\n ),\n );\n onChange(selectedItemsWithoutItemsInListItems);\n };\n\n return {\n addClickedItemToSelectedItems,\n allListItemsAreSelected,\n clickedItemIsInSelectedItems,\n clickedItemIsSelectAll,\n handleListItemClicked,\n hasSelectedItems,\n listItemsWithoutSelectAll,\n removeClickedItemFromSelectedItems,\n selectAllCheckboxState,\n selectAllUnselectedItemsInListItems,\n someListItemsAreSelected,\n unselectAllListItems,\n };\n};\n\n/* end multiselect utils */\n/* start a11y utils */\n\n// called when the state changes:\n// selectedItem, highlightedIndex, inputValue or isOpen.\nexport function getA11yStatusMessage<ValueType>(\n options: UseComboboxState<NormalizedDropdownItemType<ValueType>> & {\n selectAllItemIncluded?: boolean;\n resultCount: number;\n },\n): string {\n const { isOpen, selectAllItemIncluded = false, resultCount } = options;\n\n if (!isOpen) {\n return '';\n }\n\n const resultCountWithoutSelectAll = selectAllItemIncluded\n ? resultCount - 1\n : resultCount;\n\n if (resultCountWithoutSelectAll === 0) {\n return 'Ingen resultater';\n }\n\n return `${resultCountWithoutSelectAll} resultat${\n resultCountWithoutSelectAll === 1 ? '' : 'er'\n } tilgjengelig, naviger med pil opp eller ned, velg elementer med Enter.`;\n}\n/* end a11y utils */\n","/* eslint-disable no-warning-comments */\nimport React, {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport {\n UseComboboxState,\n UseComboboxStateChangeOptions,\n useCombobox,\n} from 'downshift';\nimport classNames from 'classnames';\nimport {\n useFloating,\n autoUpdate,\n offset,\n flip,\n shift,\n size,\n} from '@floating-ui/react-dom';\n\nimport { BaseFormControl } from '@entur/form';\nimport { space } from '@entur/tokens';\nimport { mergeRefs } from '@entur/utils';\n\nimport { DropdownList } from './components/DropdownList';\nimport { DropdownFieldAppendix } from './components/FieldComponents';\n\nimport { DropdownProps } from './Dropdown';\nimport { useResolvedItems } from './useResolvedItems';\nimport {\n clamp,\n EMPTY_INPUT,\n getA11yStatusMessage,\n isFunctionWithQueryArgument,\n itemToString,\n lowerCaseFilterTest,\n noFilter,\n resetInputState,\n} from './utils';\n\nimport { NormalizedDropdownItemType } from './types';\n\nimport './Dropdown.scss';\n\nexport type SearchableDropdownProps<ValueType> = DropdownProps<ValueType> & {\n /** Filtreringen som brukes når man skriver inn tekst i inputfeltet\n * @default Regex-test som sjekker om item.label inneholder input-teksten\n */\n itemFilter?: (\n item: NormalizedDropdownItemType<ValueType>,\n inputValue: string | undefined,\n ) => boolean;\n /** Antall millisekunder man venter etter tekstinput før det gjøres kall for å oppdatere items\n * Denne er kun relevant hvis du sender inn en funksjon som items.\n */\n debounceTimeout?: number;\n /** Tekst som kommer opp når det ikke er noe treff på filtreringsøket\n * @default \"Ingen treff for søket\"\n */\n noMatchesText?: string;\n /** Callback som kalles når brukeren går ut av input-feltet */\n onBlur?: (event: React.FocusEvent<HTMLInputElement>) => void;\n /** Callback når komponenten klikkes */\n onClick?: (event: React.MouseEvent<HTMLElement>) => void;\n /** Callback når en tast trykkes */\n onKeyDown?: (event: React.KeyboardEvent<HTMLDivElement>) => void;\n /** Callback når input-feltet får fokus */\n onFocus?: (event: React.FocusEvent<HTMLDivElement>) => void;\n};\n\nexport const SearchableDropdown = React.forwardRef(\n <ValueType extends NonNullable<any>>(\n {\n ariaLabelChosenSingular,\n ariaLabelCloseList = 'Lukk liste med valg',\n ariaLabelOpenList = 'Åpne liste med valg',\n ariaLabelSelectedItem,\n className,\n clearable = true,\n debounceTimeout,\n disabled = false,\n disableLabelAnimation = false,\n feedback,\n items: initialItems,\n itemFilter = isFunctionWithQueryArgument(initialItems)\n ? noFilter\n : lowerCaseFilterTest,\n label,\n labelClearSelectedItem = 'fjern valgt',\n labelTooltip,\n listStyle,\n loading,\n loadingText = 'Laster resultater …',\n noMatchesText = 'Ingen tilgjengelige valg …',\n onChange = () => undefined,\n placeholder,\n prepend,\n readOnly = false,\n selectedItem: value,\n selectOnTab = false,\n style,\n variant = 'info',\n onBlur,\n onClick,\n onKeyDown,\n onFocus,\n ...rest\n }: SearchableDropdownProps<ValueType>,\n ref: React.ForwardedRef<HTMLInputElement>,\n ) => {\n const [showSelectedItem, setShowSelectedItem] = useState(value !== null);\n const [lastHighlightedIndex, setLastHighlightedIndex] = useState(0);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const {\n items: normalizedItems,\n loading: resolvedItemsLoading,\n fetchItems,\n } = useResolvedItems(initialItems, debounceTimeout);\n\n const [listItems, setListItems] = useState(normalizedItems);\n\n const filterListItems = ({ inputValue }: { inputValue: string }) =>\n setListItems(\n normalizedItems.filter(item => itemFilter(item, inputValue)),\n );\n\n const updateListItems = ({ inputValue }: { inputValue?: string }) => {\n const shouldRefetchItems = isFunctionWithQueryArgument(initialItems);\n if (shouldRefetchItems) fetchItems(inputValue ?? EMPTY_INPUT);\n\n filterListItems({ inputValue: inputValue ?? EMPTY_INPUT });\n };\n\n const inputHasFocus =\n typeof document !== 'undefined'\n ? inputRef?.current === document?.activeElement\n : false;\n\n useEffect(() => {\n filterListItems({ inputValue });\n }, [normalizedItems]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const stateReducer = useCallback(\n (\n state: UseComboboxState<NormalizedDropdownItemType<ValueType>>,\n {\n type,\n changes,\n }: UseComboboxStateChangeOptions<NormalizedDropdownItemType<ValueType>>,\n ) => {\n switch (type) {\n // empty input to show selected item and reset dropdown list on item selection\n case useCombobox.stateChangeTypes.ItemClick:\n case useCombobox.stateChangeTypes.InputKeyDownEnter:\n return resetInputState<ValueType>(changes);\n case useCombobox.stateChangeTypes.InputBlur:\n // We dont want to change selection on blur so we keep previous selectedItem\n return resetInputState<ValueType>({\n ...changes,\n selectedItem: state.selectedItem,\n });\n case useCombobox.stateChangeTypes.ControlledPropUpdatedSelectedItem:\n return { ...changes, inputValue: state.inputValue };\n // remove leading whitespace, select element with spacebar on empty input\n case useCombobox.stateChangeTypes.InputChange: {\n const isSpacePressedOnEmptyInput = changes.inputValue === ' ';\n\n if (!isSpacePressedOnEmptyInput)\n return { ...changes, highlightedIndex: 0 };\n\n const sanitizedInputValue = (changes.inputValue ?? '').replace(\n /^\\s+/,\n EMPTY_INPUT,\n );\n\n if (!state.isOpen)\n return {\n ...changes,\n inputValue: sanitizedInputValue,\n isOpen: true,\n };\n\n const i = changes.highlightedIndex ?? -1;\n if (i >= 0 && i < listItems.length)\n return {\n ...changes,\n inputValue: sanitizedInputValue,\n selectedItem: listItems[i],\n };\n\n return { ...changes, inputValue: sanitizedInputValue };\n }\n default:\n return changes;\n }\n },\n [listItems, EMPTY_INPUT],\n );\n\n const {\n isOpen,\n getToggleButtonProps,\n getLabelProps,\n getMenuProps,\n getInputProps,\n highlightedIndex,\n getItemProps,\n selectedItem,\n inputValue,\n setInputValue,\n selectItem,\n reset,\n } = useCombobox({\n defaultHighlightedIndex: lastHighlightedIndex,\n items: listItems,\n itemToString,\n selectedItem: value,\n stateReducer,\n onInputValueChange(changes) {\n updateListItems({ inputValue: changes.inputValue });\n },\n onSelectedItemChange({ selectedItem: newSelectedItem }) {\n onChange(newSelectedItem);\n },\n onHighlightedIndexChange: ({ highlightedIndex }) => {\n if (highlightedIndex >= 0) setLastHighlightedIndex(highlightedIndex);\n },\n // Accessibility\n getA11yStatusMessage: options =>\n getA11yStatusMessage({ ...options, resultCount: listItems.length }),\n });\n\n useEffect(() => {\n // sync internal state on initial render\n if (value !== null && !inputHasFocus) {\n setShowSelectedItem(true);\n updateListItems({ inputValue: EMPTY_INPUT });\n setInputValue(EMPTY_INPUT);\n }\n }, [value]);\n\n const handleOnClear = () => {\n inputRef.current?.focus();\n reset();\n };\n\n // calculations for floating-UI popover position\n const { refs, floatingStyles, update } = useFloating({\n open: isOpen,\n placement: 'bottom-start',\n middleware: [\n offset(space.extraSmall2),\n shift({ padding: space.extraSmall }),\n size({\n apply({ elements, availableHeight }) {\n elements.floating.style.setProperty(\n '--list-max-height',\n `${clamp(10 * 16, availableHeight, 20 * 16)}px`,\n );\n },\n }),\n flip({ fallbackStrategy: 'initialPlacement' }),\n ],\n });\n\n // Update floating-ui position on scroll etc. Floating-ui's autoupdate is usually used inside\n // the useFloating hook but this requires the floating element to be conditionally rendered.\n // Downshift doesn't work correctly when conditionally rendered since props and refs aren't correctly\n // spread to the component. We therefor use this useLayoutEffect to update position. See https://floating-ui.com/docs/autoupdate#usage\n useLayoutEffect(() => {\n if (isOpen && refs.reference.current && refs.floating.current) {\n return autoUpdate(\n refs.reference.current,\n refs.floating.current,\n update,\n );\n }\n }, [isOpen, refs.reference, refs.floating, update]);\n\n const labelProps = getLabelProps();\n const toggleButtonProps = getToggleButtonProps({\n 'aria-busy': !(loading ?? resolvedItemsLoading) ? undefined : 'true',\n });\n const menuProps = getMenuProps({\n refKey: 'innerRef',\n ref: refs.setFloating,\n style: listStyle,\n });\n const inputProps = getInputProps({\n onKeyDown(e: React.KeyboardEvent) {\n if (isOpen && e.key === 'Tab') {\n const highlitedItem = listItems[highlightedIndex];\n if (selectOnTab && highlitedItem) {\n selectItem(highlitedItem);\n setShowSelectedItem(true);\n }\n }\n },\n onBlur(e) {\n if (selectedItem !== null) setShowSelectedItem(true);\n onBlur?.(e);\n },\n onFocus(e) {\n if (!readOnly) setShowSelectedItem(false);\n onFocus?.(e);\n },\n disabled: disabled,\n readOnly: readOnly,\n placeholder: selectedItem?.label ?? placeholder,\n tabIndex: disabled || readOnly ? -1 : undefined,\n ref: mergeRefs(inputRef, ref),\n });\n\n return (\n <BaseFormControl\n className={classNames(\n 'eds-dropdown',\n 'eds-dropdown--searchable',\n className,\n { 'eds-dropdown--has-tooltip': labelTooltip !== undefined },\n )}\n disabled={disabled}\n disableLabelAnimation={disableLabelAnimation}\n feedback={feedback}\n isFilled={selectedItem !== null || inputValue !== EMPTY_INPUT}\n label={label}\n labelId={labelProps.id}\n labelProps={labelProps}\n labelTooltip={labelTooltip}\n onClick={(e: React.MouseEvent<HTMLElement>) => {\n if (e.target === e.currentTarget) inputProps?.onClick?.(e);\n onClick?.(e);\n }}\n onKeyDown={onKeyDown}\n prepend={prepend}\n readOnly={readOnly}\n ref={refs.setReference}\n style={style}\n tabIndex={disabled || readOnly ? -1 : undefined}\n variant={variant}\n after={\n <DropdownList\n ariaLabelChosenSingular={ariaLabelChosenSingular}\n ariaLabelSelectedItem={ariaLabelSelectedItem}\n floatingStyles={floatingStyles}\n getItemProps={getItemProps}\n highlightedIndex={highlightedIndex}\n isOpen={isOpen}\n listItems={listItems}\n loading={loading ?? resolvedItemsLoading}\n loadingText={loadingText}\n noMatchesText={noMatchesText}\n selectedItems={selectedItem !== null ? [selectedItem] : []}\n readOnly={readOnly}\n {...menuProps}\n />\n }\n {...rest}\n // Append is not supported as of now\n append={undefined}\n >\n <span\n className={classNames('eds-dropdown--searchable__selected-item', {\n 'eds-dropdown--searchable__selected-item--hidden':\n !showSelectedItem,\n })}\n onClick={event => {\n if (!disabled && !readOnly) {\n inputRef.current?.focus();\n inputProps?.onClick?.(event);\n }\n }}\n tabIndex={readOnly ? 0 : -1}\n >\n {showSelectedItem ? selectedItem?.label : ''}\n </span>\n <input\n className={classNames('eds-dropdown__input eds-form-control', {\n 'eds-dropdown__input--hidden': showSelectedItem,\n })}\n {...inputProps}\n />\n <DropdownFieldAppendix\n {...toggleButtonProps}\n ariaLabelCloseList={ariaLabelCloseList}\n ariaLabelOpenList={ariaLabelOpenList}\n clearable={clearable}\n disabled={disabled || readOnly}\n onClear={handleOnClear}\n focusable={false}\n labelClearSelected={labelClearSelectedItem}\n isOpen={isOpen}\n itemIsSelected={selectedItem !== null}\n loadingText={loadingText}\n loading={loading ?? resolvedItemsLoading}\n />\n </BaseFormControl>\n );\n },\n);\n","import React, {\n Dispatch,\n SetStateAction,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport classNames from 'classnames';\nimport {\n useMultipleSelection,\n useCombobox,\n UseComboboxStateChangeOptions,\n UseComboboxState,\n} from 'downshift';\nimport {\n useFloating,\n autoUpdate,\n offset,\n flip,\n shift,\n size,\n} from '@floating-ui/react-dom';\n\nimport { VisuallyHidden } from '@entur/a11y';\nimport { BaseFormControl } from '@entur/form';\nimport { space } from '@entur/tokens';\nimport { mergeRefs, useRandomId } from '@entur/utils';\n\nimport {\n DropdownFieldAppendix,\n SelectedItemTag,\n} from './components/FieldComponents';\nimport { DropdownList } from './components/DropdownList';\n\nimport { useResolvedItems } from './useResolvedItems';\nimport { DropdownProps } from './Dropdown';\nimport {\n clamp,\n EMPTY_INPUT,\n getA11yStatusMessage,\n isFunctionWithQueryArgument,\n itemToKey,\n itemToString,\n lowerCaseFilterTest,\n noFilter,\n resetInputState,\n useMultiselectUtils,\n} from './utils';\n\nimport { NormalizedDropdownItemType } from './types';\n\nimport './Dropdown.scss';\n\nexport type MultiSelectProps<ValueType> = Omit<\n DropdownProps<ValueType>,\n 'selectedItem' | 'onChange'\n> & {\n /** Elementer som er valgt blant 'items'. Bruk tom liste for ingen valgte\n */\n selectedItems: NormalizedDropdownItemType<ValueType>[];\n /** Callback med alle valgte verdier.\n * Bruk denne til å oppdatere selectedItems-listen */\n onChange?: (\n selectedItems: NormalizedDropdownItemType<ValueType>[],\n ) => void | Dispatch<SetStateAction<NormalizedDropdownItemType<ValueType>[]>>;\n /** Filtreringen som brukes når man skriver inn tekst i inputfeltet\n * @default Regex-test som sjekker om item.label inneholder input-teksten\n */\n itemFilter?: (\n item: NormalizedDropdownItemType<ValueType>,\n inputValue: string | undefined,\n ) => boolean;\n /** Skjuler «Velg alle» fra listen med valg\n * @default false\n */\n hideSelectAll?: boolean;\n /** Antall millisekunder man venter før man kaller en potensiell items-funksjon\n * @default 250\n */\n debounceTimeout?: number;\n /** Maks antall individuelle valgt-element-tags i MultiSelect-en før de blir til en samle-tag\n * @default 10\n */\n maxChips?: number;\n /** Resetter input etter at et element er valgt i listen\n * @default false\n */\n clearInputOnSelect?: boolean;\n /** Teksten som vises for «Velg alle»-elementet i listen\n * @default \"Velg alle\"\n */\n labelSelectAll?: string;\n /** Teksten som vises for «Velg alle»-elementet i listen\n * @default \"Alle valgt\"\n */\n labelAllItemsSelected?: string;\n /** Skjermleser-tekst som for å fjerne alle valg\n * @default \"Fjern valgte\"\n */\n labelClearAllItems?: string;\n /** Tekst for skjemleser på knapper for å fjerne valgt element\n * @default \"trykk for å fjerne valg\"\n */\n ariaLabelRemoveSelected?: string;\n /** Tekst for skjemleser for å indikere at et element er valgt\n * @default \"valgte\"\n */\n ariaLabelChosenPlural?: string;\n /** Tekst for skjemleser for å hoppe til input-feltet\n * @default `${selectedItems.length} valgte elementer, trykk for å hoppe til tekstfeltet`\n */\n ariaLabelJumpToInput?: string;\n /** Callback som kalles når brukeren går ut av input-feltet */\n onBlur?: (event: React.FocusEvent<HTMLInputElement>) => void;\n /** Callback når komponenten klikkes */\n onClick?: (event: React.MouseEvent<HTMLElement>) => void;\n /** Callback når en tast trykkes */\n onKeyDown?: (event: React.KeyboardEvent<HTMLDivElement>) => void;\n /** Callback når input-feltet får fokus */\n onFocus?: (event: React.FocusEvent<HTMLDivElement>) => void;\n};\n\nexport const MultiSelect = React.forwardRef(\n <ValueType extends NonNullable<any>>(\n {\n className,\n clearable = true,\n clearInputOnSelect = false,\n debounceTimeout,\n disabled = false,\n disableLabelAnimation,\n feedback,\n hideSelectAll = false,\n items: initialItems,\n itemFilter = isFunctionWithQueryArgument(initialItems)\n ? noFilter\n : lowerCaseFilterTest,\n label,\n labelAllItemsSelected = 'Alle valgt',\n labelClearAllItems = 'Fjern valgte',\n labelSelectAll = 'Velg alle',\n labelTooltip,\n listStyle,\n loading,\n loadingText = 'Laster resultater …',\n maxChips = 10,\n noMatchesText,\n onChange = () => undefined,\n placeholder,\n readOnly = false,\n selectedItems = [],\n selectOnTab = false,\n style,\n variant = 'information',\n ariaLabelChosenSingular,\n ariaLabelChosenPlural = 'valgte',\n ariaLabelCloseList = 'Lukk liste med valg',\n ariaLabelJumpToInput = `${selectedItems.length} valgte elementer, trykk for å hoppe til tekstfeltet`,\n ariaLabelOpenList = 'Åpne liste med valg',\n ariaLabelRemoveSelected = 'trykk for å fjerne valg',\n ariaLabelSelectedItem,\n onBlur,\n onClick,\n onKeyDown,\n onFocus,\n ...rest\n }: MultiSelectProps<ValueType>,\n ref: React.ForwardedRef<HTMLInputElement>,\n ) => {\n const [lastHighlightedIndex, setLastHighlightedIndex] = React.useState(0);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n //@ts-expect-error this is done to aid developers debug wrong prop usage\n if (rest.selectedItem !== undefined)\n console.warn(\n \"Incorrect 'selectedItem' prop found, did you mean to use 'selectedItems?\",\n );\n //@ts-expect-error selectedItem should not actually exist in rest\n }, [rest.selectedItem]);\n\n const {\n items: normalizedItems,\n loading: resolvedItemsLoading,\n fetchItems,\n } = useResolvedItems(initialItems, debounceTimeout);\n\n const isAllNonAsyncItemsSelected =\n typeof initialItems !== 'function' &&\n selectedItems.length === normalizedItems.length;\n\n // special 'item' used as Select All entry in the dropdown list\n const selectAllUniqueId = useRandomId('select-all');\n const selectAll: NormalizedDropdownItemType<string> = React.useMemo(\n () => ({\n value: selectAllUniqueId,\n label: labelSelectAll,\n }),\n [labelSelectAll],\n );\n\n // special 'item' used as a replacement selected item tag for when\n // there are more selected element than maxChips\n const summarySelectedItems: NormalizedDropdownItemType<string> =\n React.useMemo(\n () => ({\n value: EMPTY_INPUT,\n label: isAllNonAsyncItemsSelected\n ? labelAllItemsSelected\n : selectedItems.length + ' ' + ariaLabelChosenPlural,\n }),\n [\n isAllNonAsyncItemsSelected,\n selectedItems,\n labelAllItemsSelected,\n ariaLabelChosenPlural,\n ],\n );\n\n const [listItems, setListItems] = useState([\n ...(!hideSelectAll ? [selectAll] : []),\n ...normalizedItems,\n ]);\n\n const filterListItems = React.useCallback(\n ({ inputValue }: { inputValue: string }) =>\n setListItems([\n ...(!hideSelectAll ? [selectAll] : []),\n ...normalizedItems.filter(item => itemFilter(item, inputValue)),\n ]),\n [hideSelectAll, selectAll, normalizedItems, itemFilter],\n );\n\n const updateListItems = React.useCallback(\n ({ inputValue }: { inputValue?: string }) => {\n const shouldRefetchItems = isFunctionWithQueryArgument(initialItems);\n if (shouldRefetchItems) fetchItems(inputValue ?? EMPTY_INPUT);\n\n filterListItems({ inputValue: inputValue ?? EMPTY_INPUT });\n },\n [filterListItems, initialItems, fetchItems],\n );\n\n React.useEffect(() => {\n filterListItems({ inputValue });\n }, [normalizedItems]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const {\n hasSelectedItems,\n handleListItemClicked,\n selectAllCheckboxState,\n clickedItemIsInSelectedItems,\n clickedItemIsSelectAll,\n } = useMultiselectUtils<ValueType>({\n listItems,\n selectAll,\n selectedItems,\n });\n\n const {\n getSelectedItemProps,\n getDropdownProps,\n reset,\n removeSelectedItem,\n setSelectedItems,\n } = useMultipleSelection({\n selectedItems,\n // @ts-expect-error prop missing from library types\n itemToString,\n itemToKey,\n onSelectedItemsChange({ selectedItems: newSelectedItems }) {\n onChange(newSelectedItems);\n },\n });\n\n const stateReducer = React.useCallback(\n (\n state: UseComboboxState<NormalizedDropdownItemType<ValueType | string>>,\n {\n type,\n changes,\n }: UseComboboxStateChangeOptions<\n NormalizedDropdownItemType<ValueType | string>\n >,\n ) => {\n switch (type) {\n // keep menu open and edit input value on item selection\n case useCombobox.stateChangeTypes.InputKeyDownEnter:\n case useCombobox.stateChangeTypes.ItemClick: {\n return {\n ...changes,\n isOpen: true,\n inputValue: clearInputOnSelect ? EMPTY_INPUT : state.inputValue,\n };\n }\n // reset input value when leaving input field\n case useCombobox.stateChangeTypes.InputBlur: {\n const { selectedItem: _, ...otherChanges } = changes;\n return resetInputState<ValueType | string>(otherChanges);\n }\n // edit input value when selected items is updated outside component\n case useCombobox.stateChangeTypes.ControlledPropUpdatedSelectedItem: {\n return { ...changes, inputValue: state.inputValue };\n }\n // remove leading whitespace, select item with spacebar if input is empty and filter list items\n case useCombobox.stateChangeTypes.InputChange: {\n const isSpacePressedOnEmptyInput = changes.inputValue === ' ';\n\n if (!isSpacePressedOnEmptyInput)\n return { ...changes, highlightedIndex: hideSelectAll ? 0 : 1 };\n\n const sanitizedInputValue = (changes.inputValue ?? '').replace(\n /^\\s+/,\n EMPTY_INPUT,\n );\n\n if (!state.isOpen)\n return {\n ...changes,\n inputValue: sanitizedInputValue,\n isOpen: true,\n };\n\n const i = changes.highlightedIndex ?? -1;\n if (i >= 0 && i < listItems.length)\n return {\n ...changes,\n inputValue: sanitizedInputValue,\n selectedItem: listItems[i],\n };\n\n return { ...changes, inputValue: sanitizedInputValue };\n }\n default:\n return changes;\n }\n },\n [hideSelectAll, listItems, clearInputOnSelect],\n );\n\n const {\n getInputProps,\n getItemProps,\n getLabelProps,\n getMenuProps,\n getToggleButtonProps,\n highlightedIndex,\n inputValue,\n isOpen,\n } = useCombobox({\n defaultHighlightedIndex: lastHighlightedIndex, // after selection, highlight previously selected item.\n items: listItems,\n itemToString,\n selectedItem: null,\n stateReducer,\n onInputValueChange(changes) {\n updateListItems({ inputValue: changes.inputValue });\n },\n onSelectedItemChange({ selectedItem: clickedItem }) {\n // clickedItem means item chosen either via mouse or keyboard\n if (!clickedItem) return;\n\n handleListItemClicked({\n clickedItem,\n onChange: setSelectedItems,\n });\n },\n onHighlightedIndexChange: ({ highlightedIndex }) => {\n if (highlightedIndex >= 0) setLastHighlightedIndex(highlightedIndex);\n },\n // Accessibility\n getA11yStatusMessage: options =>\n getA11yStatusMessage({\n ...options,\n selectAllItemIncluded: !hideSelectAll,\n resultCount: listItems.length,\n }),\n ...rest,\n });\n\n // calculations for floating-UI popover position\n const { refs, floatingStyles, update } = useFloating<HTMLDivElement>({\n open: isOpen,\n placement: 'bottom-start',\n middleware: [\n offset(space.extraSmall2),\n shift({ padding: space.extraSmall }),\n size({\n apply({ elements, availableHeight }) {\n elements.floating.style.setProperty(\n '--list-max-height',\n `${clamp(10 * 16, availableHeight, 20 * 16)}px`,\n );\n },\n }),\n flip({ fallbackStrategy: 'initialPlacement' }),\n ],\n });\n\n // Update floating-ui position on scroll etc. Floating-ui's autoupdate is usually used inside\n // the useFloating hook but this requires the floating element to be conditionally rendered.\n // Downshift doesn't work correctly when conditionally rendered since props and refs aren't correctly\n // spread to the component. We therefor use this useLayoutEffect to update position. See https://floating-ui.com/docs/autoupdate#usage\n useLayoutEffect(() => {\n if (isOpen && refs.reference.current && refs.floating.current) {\n return autoUpdate(\n refs.reference.current,\n refs.floating.current,\n update,\n );\n }\n }, [isOpen, refs.reference, refs.floating, update]);\n\n const handleOnClear = () => {\n inputRef.current?.focus();\n reset();\n };\n\n const dropdownProps = getDropdownProps({\n preventKeyAction: isOpen,\n value: inputValue ?? EMPTY_INPUT,\n ref: mergeRefs(inputRef, ref),\n });\n const inputProps = getInputProps({\n onKeyDown: (e: React.KeyboardEvent) => {\n if (selectOnTab && isOpen && e.key === 'Tab') {\n const highlitedItem = listItems[highlightedIndex];\n if (!highlitedItem) return;\n\n // Skip tab selection for select all or if item already is selected\n const shouldSkipTabSelection =\n clickedItemIsSelectAll(highlitedItem) ||\n (!clickedItemIsSelectAll(highlitedItem) &&\n clickedItemIsInSelectedItems(highlitedItem));\n\n if (shouldSkipTabSelection) return;\n\n handleListItemClicked({\n clickedItem: highlitedItem,\n onChange: setSelectedItems,\n });\n }\n },\n onBlur,\n onFocus,\n ...dropdownProps,\n className: 'eds-dropdown__input eds-form-control',\n disabled: readOnly || disabled,\n placeholder: placeholder,\n tabIndex: disabled || readOnly ? -1 : undefined,\n });\n const labelProps = getLabelProps();\n const menuProps = getMenuProps({\n 'aria-multiselectable': true,\n refKey: 'innerRef',\n ref: refs.setFloating,\n style: listStyle,\n });\n const toggleButtonProps = getToggleButtonProps({\n 'aria-busy': !(loading ?? resolvedItemsLoading) ? undefined : 'true',\n });\n\n return (\n <BaseFormControl\n className={classNames(\n 'eds-dropdown',\n 'eds-dropdown--multiselect',\n className,\n { 'eds-dropdown--has-tooltip': labelTooltip !== undefined },\n )}\n disabled={disabled}\n disableLabelAnimation={disableLabelAnimation}\n feedback={feedback}\n isFilled={hasSelectedItems || inputValue !== EMPTY_INPUT}\n label={label}\n labelId={labelProps.id}\n labelProps={labelProps}\n labelTooltip={labelTooltip}\n onClick={(e: React.MouseEvent<HTMLElement>) => {\n if (e.target === e.currentTarget) inputProps?.onClick?.(e);\n onClick?.(e);\n }}\n onKeyDown={onKeyDown}\n readOnly={readOnly}\n ref={refs.setReference}\n style={style}\n variant={variant}\n after={\n <DropdownList\n ariaLabelChosenSingular={ariaLabelChosenSingular}\n ariaLabelSelectedItem={ariaLabelSelectedItem}\n floatingStyles={floatingStyles}\n getItemProps={getItemProps}\n highlightedIndex={highlightedIndex}\n isOpen={isOpen}\n listItems={listItems}\n loading={loading ?? resolvedItemsLoading}\n loadingText={loadingText}\n noMatchesText={noMatchesText}\n selectAllCheckboxState={selectAllCheckboxState}\n selectAllItem={selectAll}\n selectedItems={selectedItems}\n readOnly={readOnly}\n {...menuProps}\n />\n }\n {...rest}\n >\n <div\n className={classNames(\n 'eds-dropdown--multiselect__selected-items-and-input',\n {\n 'eds-dropdown--multiselect__selected-items-and-input--filled':\n hasSelectedItems,\n },\n )}\n >\n {selectedItems.length > 1 ? (\n <VisuallyHidden onClick={() => inputRef.current?.focus()}>\n {ariaLabelJumpToInput}\n </VisuallyHidden>\n ) : null}\n {selectedItems.length <= maxChips ? (\n selectedItems.map((selectedItem, index) => (\n <SelectedItemTag\n ariaLabelChosen={ariaLabelChosenSingular}\n ariaLabelRemoveSelected={ariaLabelRemoveSelected}\n disabled={disabled}\n getSelectedItemProps={getSelectedItemProps}\n index={index}\n key={\n selectedItem?.label +\n (typeof selectedItem?.value === 'string'\n ? selectedItem.value\n : '')\n }\n readOnly={readOnly}\n removeSelectedItem={() => {\n removeSelectedItem(selectedItem);\n inputRef?.current?.focus();\n }}\n selectedItem={selectedItem}\n />\n ))\n ) : (\n <SelectedItemTag\n ariaLabelRemoveSelected={labelClearAllItems}\n ariaLabelChosen=\"\"\n disabled={disabled}\n readOnly={readOnly}\n removeSelectedItem={handleOnClear}\n selectedItem={summarySelectedItems}\n />\n )}\n <input {...inputProps} />\n </div>\n <DropdownFieldAppendix\n {...toggleButtonProps}\n ariaLabelCloseList={ariaLabelCloseList}\n ariaLabelOpenList={ariaLabelOpenList}\n clearable={clearable}\n disabled={disabled || readOnly}\n onClear={handleOnClear}\n focusable={false}\n labelClearSelected={labelClearAllItems}\n isOpen={isOpen}\n itemIsSelected={selectedItems.length > 0}\n loadingText={loadingText}\n loading={loading ?? resolvedItemsLoading}\n />\n </BaseFormControl>\n );\n },\n);\n","import React, { Dispatch, SetStateAction, useLayoutEffect } from 'react';\nimport classNames from 'classnames';\nimport { useSelect } from 'downshift';\nimport {\n autoUpdate,\n flip,\n offset,\n shift,\n size,\n useFloating,\n} from '@floating-ui/react-dom';\n\nimport { BaseFormControl } from '@entur/form';\nimport { space } from '@entur/tokens';\nimport { mergeRefs, VariantType } from '@entur/utils';\n\nimport { DropdownList } from './components/DropdownList';\nimport { DropdownFieldAppendix } from './components/FieldComponents';\nimport { useResolvedItems } from './useResolvedItems';\nimport { clamp, itemToString } from './utils';\n\nimport {\n NormalizedDropdownItemType,\n PotentiallyAsyncDropdownItemType,\n} from './types';\n\nimport './Dropdown.scss';\n\n/** @deprecated use variant=\"information\" instead */\nconst info = 'info';\n/** @deprecated use variant=\"negative\" instead */\nconst error = 'error';\n\nexport type DropdownProps<ValueType> = {\n /** Tilgjengelige valg i dropdown-en */\n items: PotentiallyAsyncDropdownItemType<ValueType>;\n /** Valgt verdi. Bruk null for ingen verdi. */\n selectedItem: NormalizedDropdownItemType<ValueType> | null;\n /** Callback ved valg som skal oppdatere selectedItem */\n onChange?: (\n selectedItem: NormalizedDropdownItemType<ValueType> | null,\n ) => void | Dispatch<\n SetStateAction<NormalizedDropdownItemType<ValueType> | null>\n >;\n /** Beskrivende tekst som forklarer feltet */\n label: string;\n /** Placeholder-tekst når ingenting er satt */\n placeholder?: string;\n /** Om man skal ha mulighet for å nullstille Dropdown-en\n * @default false\n */\n clearable?: boolean;\n /** Velg det markerte elementet når brukeren \"tab-er\" seg vekk fra komponenten/input-feltet */\n selectOnTab?: boolean;\n /** Deaktiver dropdown-en */\n disabled?: boolean;\n /** Setter dropdown-en i read-only modus */\n readOnly?: boolean;\n /** Hvilken valideringsvariant som gjelder */\n variant?: VariantType | typeof error | typeof info;\n /** Valideringsmelding, brukes sammen med `variant` */\n feedback?: string;\n /** Tekst eller ikon som kommer først i dropdown-feltet */\n prepend?: React.ReactNode;\n /** */\n loading?: boolean;\n /** En tekst som beskriver hva som skjer når man venter på items\n * @default 'Laster inn …'\n */\n loadingText?: string;\n /** Tekst som kommer opp når det ikke er noe elementer å vise\n * @default \"Ingen tilgjengelige valg …\"\n */\n noMatchesText?: string;\n /** Om man skal ha mulighet for å nullstille Dropdown-en\n * @default \"fjern valgt\"\n */\n labelClearSelectedItem?: string;\n /** En tooltip som gir ekstra info om inputfeltet */\n labelTooltip?: React.ReactNode;\n /** Plasserer labelen statisk på toppen av inputfeltet\n * @default false\n */\n disableLabelAnimation?: boolean;\n /** Ekstra klassenavn */\n className?: string;\n /** Styling som sendes ned til Dropdown-lista */\n listStyle?: { [key: string]: any };\n /** Styling for Dropdown-en */\n style?: { [key: string]: any };\n /** Tekst for skjemleser for knapp som lukker listen med valg\n * @default \"Lukk liste med valg\"\n */\n ariaLabelCloseList?: string;\n /** Tekst for skjemleser for knapp som åpner listen med valg\n * @default \"Åpne liste med valg\"\n */\n ariaLabelOpenList?: string;\n /** Ord for at et element er valgt i entall\n * eks. 'Element 1, _valgt_'\n * @default 'valgt'\n */\n ariaLabelChosenSingular?: string;\n /** Tekst for skjermleser som beskriver statusen til et element som valgt\n * @default ', valgt element, trykk for å fjerne'\n */\n ariaLabelSelectedItem?: string;\n};\n\nexport const Dropdown = React.forwardRef(\n <ValueType extends NonNullable<any>>(\n {\n ariaLabelChosenSingular,\n ariaLabelCloseList = 'Lukk liste med valg',\n ariaLabelOpenList = 'Åpne liste med valg',\n ariaLabelSelectedItem,\n className,\n clearable = false,\n disabled = false,\n disableLabelAnimation,\n feedback,\n items: initialItems,\n label,\n labelClearSelectedItem = 'fjern valgt',\n labelTooltip,\n listStyle,\n loading,\n loadingText = 'Laster resultater …',\n noMatchesText = 'Ingen tilgjengelige valg …',\n onChange,\n placeholder,\n prepend,\n readOnly = false,\n selectedItem,\n selectOnTab = false,\n style,\n variant = 'information',\n ...rest\n }: DropdownProps<ValueType>,\n ref: React.ForwardedRef<HTMLDivElement>,\n ) => {\n const { items: normalizedItems, loading: resolvedItemsLoading } =\n useResolvedItems(initialItems);\n const isFilled = selectedItem !== null || placeholder !== undefined;\n const {\n isOpen,\n getItemProps,\n getLabelProps,\n getMenuProps,\n getToggleButtonProps,\n highlightedIndex,\n selectItem,\n reset,\n } = useSelect({\n items: normalizedItems,\n defaultHighlightedIndex: selectedItem ? undefined : 0,\n selectedItem,\n stateReducer(state, { changes, type }) {\n const toggleButtonIsFocused =\n typeof document !== 'undefined' &&\n document.activeElement === refs.reference.current;\n\n switch (type) {\n case useSelect.stateChangeTypes.ToggleButtonKeyDownArrowDown:\n case useSelect.stateChangeTypes.ToggleButtonKeyDownArrowUp:\n if (!toggleButtonIsFocused) return { ...changes, isOpen: false };\n break;\n case useSelect.stateChangeTypes.ToggleButtonBlur:\n return { ...changes, selectedItem: state.selectedItem };\n }\n return changes;\n },\n onSelectedItemChange({ selectedItem: newSelectedItem }) {\n onChange?.(newSelectedItem);\n },\n itemToString,\n });\n\n // calculations for floating-UI popover position\n const { refs, floatingStyles, update } = useFloating<HTMLDivElement>({\n open: isOpen,\n placement: 'bottom-start',\n middleware: [\n offset(space.extraSmall2),\n shift({ padding: space.extraSmall }),\n size({\n apply({ elements, availableHeight }) {\n elements.floating.style.setProperty(\n '--list-max-height',\n `${clamp(10 * 16, availableHeight, 20 * 16)}px`,\n );\n },\n }),\n flip({ fallbackStrategy: 'initialPlacement' }),\n ],\n });\n\n // Update floating-ui position on scroll etc. Floating-ui's autoupdate is usually used inside\n // the useFloating hook but this requires the floating element to be conditionally rendered.\n // Downshift doesn't work correctly when conditionally rendered since props and refs aren't correctly\n // spread to the component. We therefor use this useLayoutEffect to update position. See https://floating-ui.com/docs/autoupdate#usage\n useLayoutEffect(() => {\n if (isOpen && refs.reference.current && refs.floating.current) {\n return autoUpdate(\n refs.reference.current,\n refs.floating.current,\n update,\n );\n }\n }, [isOpen, refs.reference, refs.floating, update]);\n\n const handleOnClear = () => {\n refs.reference.current?.focus();\n reset();\n };\n\n const labelProps = getLabelProps({\n isFilled,\n });\n const toggleButtonProps = getToggleButtonProps({\n ref: mergeRefs(ref, refs.setReference),\n 'aria-disabled': disabled,\n 'aria-label': disabled ? 'Disabled dropdown' : '',\n disabled: disabled,\n readOnly: readOnly,\n label: label,\n labelId: labelProps?.id,\n tabIndex: disabled || readOnly ? -1 : 0,\n onKeyDown(e) {\n if (isOpen && e.key === 'Tab') {\n const highlitedItem = normalizedItems[highlightedIndex];\n // we don't want to clear selection with tab\n if (selectOnTab && highlitedItem && highlitedItem !== selectedItem) {\n selectItem(highlitedItem);\n }\n }\n },\n });\n const menuProps = getMenuProps({\n refKey: 'innerRef',\n ref: refs.setFloating,\n style: listStyle,\n });\n\n return (\n <BaseFormControl\n className={classNames('eds-dropdown', className, {\n 'eds-dropdown--has-tooltip': labelTooltip !== undefined,\n })}\n disableLabelAnimation={disableLabelAnimation}\n feedback={feedback}\n labelProps={labelProps}\n labelTooltip={labelTooltip}\n prepend={prepend}\n style={style}\n variant={variant}\n {...toggleButtonProps}\n after={\n <DropdownList\n ariaLabelChosenSingular={ariaLabelChosenSingular}\n ariaLabelSelectedItem={ariaLabelSelectedItem}\n floatingStyles={floatingStyles}\n getItemProps={getItemProps}\n highlightedIndex={highlightedIndex}\n isOpen={isOpen}\n listItems={normalizedItems}\n loading={loading ?? resolvedItemsLoading}\n loadingText={loadingText}\n noMatchesText={noMatchesText}\n selectedItems={selectedItem !== null ? [selectedItem] : []}\n readOnly={readOnly}\n {...menuProps}\n />\n }\n {...rest}\n // Append is not supported as of now\n append={undefined}\n >\n <div className=\"eds-dropdown__selected-item\">\n {selectedItem?.label ?? (\n <div\n className={classNames(\n 'eds-dropdown__selected-item__placeholder',\n {\n 'eds-dropdown__selected-item__placeholder--readonly':\n readOnly,\n },\n )}\n >\n {placeholder}\n </div>\n )}\n </div>\n <DropdownFieldAppendix\n aria-busy={!(loading ?? resolvedItemsLoading) ? undefined : 'true'}\n aria-expanded={isOpen}\n clearable={clearable}\n onClear={handleOnClear}\n disabled={disabled || readOnly}\n focusable={false}\n labelClearSelected={labelClearSelectedItem}\n isOpen={isOpen}\n itemIsSelected={selectedItem !== null}\n ariaLabelCloseList={ariaLabelCloseList}\n ariaLabelOpenList={ariaLabelOpenList}\n loading={false}\n loadingText={undefined}\n />\n </BaseFormControl>\n );\n },\n);\n","import React, { forwardRef } from 'react';\nimport { BaseFormControl } from '@entur/form';\nimport { DownArrowIcon } from '@entur/icons';\nimport { LoadingDots } from '@entur/loader';\nimport { useRandomId, VariantType } from '@entur/utils';\n\nimport { useResolvedItems } from './useResolvedItems';\nimport {\n NormalizedDropdownItemType,\n PotentiallyAsyncDropdownItemType,\n} from './types';\n\nimport './Dropdown.scss';\n\n/** @deprecated use variant=\"information\" instead */\nconst info = 'info';\n/** @deprecated use variant=\"negative\" instead */\nconst error = 'error';\n\nexport type NativeDropdownProps<ValueType> = {\n /** Ekstra klassenavn */\n className?: string;\n /**\n * For å deaktivere dropdow-nen\n * @default false\n **/\n disabled?: boolean;\n /** Valideringsmelding, brukes sammen med `variant` */\n feedback?: string;\n /** Alle valg for dropdown-en å ha */\n items: PotentiallyAsyncDropdownItemType<ValueType>;\n /** Beskrivende tekst som forklarer feltet */\n label: string;\n /** En callback for endringer av value\n * Obs: merk at parameter her denne ikke er samme som i en HTML select.\n * Bruk { target } hvis du trenger info om select-elementet som ble trykket på\n */\n onChange?: ({\n value,\n selectedItem,\n target,\n }: {\n value: string;\n selectedItem: NormalizedDropdownItemType<ValueType> | null;\n target: EventTarget & HTMLSelectElement;\n }) => void;\n /** Tekst eller ikon som kommer før dropdown-en */\n prepend?: React.ReactNode;\n /**\n * Setter dropdown-en i read-only modus\n * @default false\n **/\n readOnly?: boolean;\n /** Den valgte verdien som NormalizedDropdownItemType\n * (Brukes når komponenten er 'controlled')\n */\n selectedItem?: NormalizedDropdownItemType<ValueType> | null;\n /** Den valgte verdien som sting\n * (Brukes når komponenten er 'controlled)\n */\n value?: string;\n /** Hvilken valideringsvariant som gjelder*/\n variant?: VariantType | typeof error | typeof info;\n /** Plasserer labelen statisk på toppen av inputfeltet\n * @default false\n */\n disableLabelAnimation?: boolean;\n [key: string]: any;\n};\n\nexport const NativeDropdown = forwardRef(\n <ValueType extends string | number>(\n {\n className,\n disabled = false,\n disableLabelAnimation,\n feedback,\n items,\n label,\n loadingText,\n onChange,\n prepend,\n readOnly = false,\n selectedItem,\n style,\n value,\n variant,\n ...rest\n }: NativeDropdownProps<ValueType>,\n ref: React.ForwardedRef<HTMLSelectElement>,\n ) => {\n const { items: normalizedItems, loading } =\n useResolvedItems<ValueType>(items);\n const nativeDropdownId = useRandomId('eds-dropdown-native');\n\n return (\n <BaseFormControl\n disabled={disabled}\n readOnly={readOnly}\n prepend={prepend}\n append={\n <FieldAppend\n hidden={disabled || readOnly}\n loading={loading}\n loadingText={loadingText}\n />\n }\n className={className}\n style={style}\n label={label}\n labelId={nativeDropdownId}\n variant={variant}\n feedback={feedback}\n disableLabelAnimation={disableLabelAnimation}\n isFilled={true}\n >\n <select\n aria-invalid={variant === 'negative' || variant === error}\n aria-labelledby={nativeDropdownId}\n aria-busy={loading}\n className=\"eds-form-control eds-dropdown--native\"\n disabled={disabled || readOnly}\n onChange={event => {\n onChange?.({\n value: event.target.value,\n selectedItem:\n normalizedItems.find(\n item => item.value === event.target.value,\n ) ?? null,\n target: event.target,\n });\n }}\n value={value ?? selectedItem?.value ?? undefined}\n ref={ref}\n {...rest}\n >\n {normalizedItems.map(item => (\n <option key={item.value} value={item.value}>\n {item.label}\n </option>\n ))}\n </select>\n </BaseFormControl>\n );\n },\n);\n\nconst FieldAppend = ({\n loading,\n loadingText,\n hidden,\n}: {\n loading: boolean;\n loadingText?: string;\n hidden: boolean;\n}) => {\n if (loading) {\n return (\n <div className=\"eds-dropdown-native__loading-dots\">\n <LoadingDots aria-label={loadingText} />\n </div>\n );\n }\n if (hidden) {\n return <></>;\n }\n return <DownArrowIcon inline />;\n};\n","import { warnAboutMissingStyles } from '@entur/utils';\nimport './index.scss';\n\nwarnAboutMissingStyles('dropdown', 'form', 'a11y', 'chip');\n\nexport type { NormalizedDropdownItemType, DropdownItemType } from './types';\n\nexport * from './SearchableDropdown';\nexport * from './MultiSelect';\nexport * from './Dropdown';\nexport * from './NativeDropdown';\nexport * from './types';\n"],"names":["jsxs","Fragment","jsx","Checkbox","VisuallyHidden","createElement","TagChip","forwardRef","IconButton","DownArrowIcon","LoadingDots","Tooltip","CloseSmallIcon","error","useDebounce","useMemo","useState","useRef","inputValue","useEffect","useCallback","useCombobox","highlightedIndex","useFloating","offset","space","shift","size","flip","useLayoutEffect","autoUpdate","mergeRefs","BaseFormControl","useRandomId","useMultipleSelection","useSelect","warnAboutMissingStyles"],"mappings":"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"}