@economic/taco 1.1.4 → 1.1.5-alpha.102

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.
Files changed (160) hide show
  1. package/README.md +82 -82
  2. package/dist/components/Icon/components/LogOut.d.ts +3 -0
  3. package/dist/components/Icon/components/Menu.d.ts +3 -0
  4. package/dist/components/Icon/components/Numbers.d.ts +3 -0
  5. package/dist/components/Icon/components/Profile.d.ts +3 -0
  6. package/dist/components/Icon/components/index.d.ts +1 -1
  7. package/dist/components/Input/Input.d.ts +1 -1
  8. package/dist/components/Menu/Menu.d.ts +2 -2
  9. package/dist/components/Menu/components/Item.d.ts +1 -1
  10. package/dist/components/Menu/components/Link.d.ts +1 -1
  11. package/dist/components/Tour/Tour.d.ts +2 -0
  12. package/dist/esm/components/Banner/util.js +1 -1
  13. package/dist/esm/components/Banner/util.js.map +1 -1
  14. package/dist/esm/components/Button/util.js +18 -23
  15. package/dist/esm/components/Button/util.js.map +1 -1
  16. package/dist/esm/components/Card/Card.js +3 -0
  17. package/dist/esm/components/Card/Card.js.map +1 -1
  18. package/dist/esm/components/Combobox/Combobox.js +1 -0
  19. package/dist/esm/components/Combobox/Combobox.js.map +1 -1
  20. package/dist/esm/components/Combobox/useCombobox.js +67 -87
  21. package/dist/esm/components/Combobox/useCombobox.js.map +1 -1
  22. package/dist/esm/components/Datepicker/useDatepicker.js +27 -34
  23. package/dist/esm/components/Datepicker/useDatepicker.js.map +1 -1
  24. package/dist/esm/components/Dialog/Context.js +4 -4
  25. package/dist/esm/components/Dialog/Context.js.map +1 -1
  26. package/dist/esm/components/Dialog/components/Content.js +39 -44
  27. package/dist/esm/components/Dialog/components/Content.js.map +1 -1
  28. package/dist/esm/components/Dialog/components/Drawer.js +3 -3
  29. package/dist/esm/components/Dialog/components/Drawer.js.map +1 -1
  30. package/dist/esm/components/Dialog/components/Extra.js +2 -2
  31. package/dist/esm/components/Dialog/components/Extra.js.map +1 -1
  32. package/dist/esm/components/Dialog/components/Trigger.js +3 -3
  33. package/dist/esm/components/Dialog/components/Trigger.js.map +1 -1
  34. package/dist/esm/components/Hanger/Hanger.js +1 -1
  35. package/dist/esm/components/Hanger/Hanger.js.map +1 -1
  36. package/dist/esm/components/Icon/components/LogOut.js +20 -0
  37. package/dist/esm/components/Icon/components/LogOut.js.map +1 -0
  38. package/dist/esm/components/Icon/components/Menu.js +18 -0
  39. package/dist/esm/components/Icon/components/Menu.js.map +1 -0
  40. package/dist/esm/components/Icon/components/Numbers.js +18 -0
  41. package/dist/esm/components/Icon/components/Numbers.js.map +1 -0
  42. package/dist/esm/components/Icon/components/Profile.js +20 -0
  43. package/dist/esm/components/Icon/components/Profile.js.map +1 -0
  44. package/dist/esm/components/Icon/components/index.js +12 -4
  45. package/dist/esm/components/Icon/components/index.js.map +1 -1
  46. package/dist/esm/components/Input/util.js +2 -2
  47. package/dist/esm/components/Input/util.js.map +1 -1
  48. package/dist/esm/components/Listbox/ScrollableList.js +64 -83
  49. package/dist/esm/components/Listbox/ScrollableList.js.map +1 -1
  50. package/dist/esm/components/Listbox/useListbox.js +51 -60
  51. package/dist/esm/components/Listbox/useListbox.js.map +1 -1
  52. package/dist/esm/components/Listbox/useMultiListbox.js +64 -91
  53. package/dist/esm/components/Listbox/useMultiListbox.js.map +1 -1
  54. package/dist/esm/components/Listbox/useTypeahead.js +10 -9
  55. package/dist/esm/components/Listbox/useTypeahead.js.map +1 -1
  56. package/dist/esm/components/Listbox/util.js +48 -85
  57. package/dist/esm/components/Listbox/util.js.map +1 -1
  58. package/dist/esm/components/Menu/Context.js +2 -2
  59. package/dist/esm/components/Menu/Context.js.map +1 -1
  60. package/dist/esm/components/Menu/components/Checkbox.js +9 -10
  61. package/dist/esm/components/Menu/components/Checkbox.js.map +1 -1
  62. package/dist/esm/components/Menu/components/Content.js +9 -11
  63. package/dist/esm/components/Menu/components/Content.js.map +1 -1
  64. package/dist/esm/components/Menu/components/Header.js +3 -3
  65. package/dist/esm/components/Menu/components/Header.js.map +1 -1
  66. package/dist/esm/components/Menu/components/Item.js +30 -31
  67. package/dist/esm/components/Menu/components/Item.js.map +1 -1
  68. package/dist/esm/components/Menu/components/Link.js +10 -11
  69. package/dist/esm/components/Menu/components/Link.js.map +1 -1
  70. package/dist/esm/components/Menu/components/RadioGroup.js +17 -19
  71. package/dist/esm/components/Menu/components/RadioGroup.js.map +1 -1
  72. package/dist/esm/components/Menu/components/Separator.js +1 -1
  73. package/dist/esm/components/Menu/components/Separator.js.map +1 -1
  74. package/dist/esm/components/Menu/components/Trigger.js +4 -4
  75. package/dist/esm/components/Menu/components/Trigger.js.map +1 -1
  76. package/dist/esm/components/Pagination/PageNumbers.js +23 -28
  77. package/dist/esm/components/Pagination/PageNumbers.js.map +1 -1
  78. package/dist/esm/components/Pagination/usePagination.js +7 -21
  79. package/dist/esm/components/Pagination/usePagination.js.map +1 -1
  80. package/dist/esm/components/Pagination/usePaginationShortcuts.js +9 -9
  81. package/dist/esm/components/Pagination/usePaginationShortcuts.js.map +1 -1
  82. package/dist/esm/components/Popover/Popover.js +1 -1
  83. package/dist/esm/components/Popover/Popover.js.map +1 -1
  84. package/dist/esm/components/Popover/Primitives.js +7 -8
  85. package/dist/esm/components/Popover/Primitives.js.map +1 -1
  86. package/dist/esm/components/SearchInput/SearchInput.js +4 -1
  87. package/dist/esm/components/SearchInput/SearchInput.js.map +1 -1
  88. package/dist/esm/components/Select/useSelect.js +63 -81
  89. package/dist/esm/components/Select/useSelect.js.map +1 -1
  90. package/dist/esm/components/Table/components/BaseTable.js +23 -30
  91. package/dist/esm/components/Table/components/BaseTable.js.map +1 -1
  92. package/dist/esm/components/Table/components/PaginatedTable.js +3 -7
  93. package/dist/esm/components/Table/components/PaginatedTable.js.map +1 -1
  94. package/dist/esm/components/Table/components/Table.js +18 -25
  95. package/dist/esm/components/Table/components/Table.js.map +1 -1
  96. package/dist/esm/components/Table/components/WindowedTable.js +89 -109
  97. package/dist/esm/components/Table/components/WindowedTable.js.map +1 -1
  98. package/dist/esm/components/Table/hooks/plugins/useRowActions.js +122 -146
  99. package/dist/esm/components/Table/hooks/plugins/useRowActions.js.map +1 -1
  100. package/dist/esm/components/Table/hooks/plugins/useRowDraggable.js +57 -61
  101. package/dist/esm/components/Table/hooks/plugins/useRowDraggable.js.map +1 -1
  102. package/dist/esm/components/Table/hooks/plugins/useRowEditing.js +39 -36
  103. package/dist/esm/components/Table/hooks/plugins/useRowEditing.js.map +1 -1
  104. package/dist/esm/components/Table/hooks/plugins/useRowSelect.js +79 -89
  105. package/dist/esm/components/Table/hooks/plugins/useRowSelect.js.map +1 -1
  106. package/dist/esm/components/Table/hooks/useRowCreation.js +29 -64
  107. package/dist/esm/components/Table/hooks/useRowCreation.js.map +1 -1
  108. package/dist/esm/components/Table/hooks/useTable.js +119 -141
  109. package/dist/esm/components/Table/hooks/useTable.js.map +1 -1
  110. package/dist/esm/components/Table/hooks/useTableKeyboardNavigation.js +13 -16
  111. package/dist/esm/components/Table/hooks/useTableKeyboardNavigation.js.map +1 -1
  112. package/dist/esm/components/Table/util/renderColumn.js +10 -10
  113. package/dist/esm/components/Table/util/renderColumn.js.map +1 -1
  114. package/dist/esm/components/Table/util/renderRow.js +37 -46
  115. package/dist/esm/components/Table/util/renderRow.js.map +1 -1
  116. package/dist/esm/components/Table/util/rowIndexPath.js +14 -16
  117. package/dist/esm/components/Table/util/rowIndexPath.js.map +1 -1
  118. package/dist/esm/components/Table/util/sortTypes.js +23 -31
  119. package/dist/esm/components/Table/util/sortTypes.js.map +1 -1
  120. package/dist/esm/components/Table/util.js +29 -41
  121. package/dist/esm/components/Table/util.js.map +1 -1
  122. package/dist/esm/components/Toast/Toast.js +21 -22
  123. package/dist/esm/components/Toast/Toast.js.map +1 -1
  124. package/dist/esm/components/Toast/util.js +2 -2
  125. package/dist/esm/components/Toast/util.js.map +1 -1
  126. package/dist/esm/components/Tour/Tour.js +3 -1
  127. package/dist/esm/components/Tour/Tour.js.map +1 -1
  128. package/dist/esm/index.css +661 -661
  129. package/dist/esm/index.js +4 -1
  130. package/dist/esm/index.js.map +1 -1
  131. package/dist/esm/primitives/Button.js +9 -13
  132. package/dist/esm/primitives/Button.js.map +1 -1
  133. package/dist/esm/utils/date.js.map +1 -1
  134. package/dist/esm/utils/hooks/useBoundingClientRectListener.js.map +1 -1
  135. package/dist/esm/utils/hooks/useDraggable.js +16 -17
  136. package/dist/esm/utils/hooks/useDraggable.js.map +1 -1
  137. package/dist/esm/utils/hooks/useDropTarget.js.map +1 -1
  138. package/dist/esm/utils/hooks/useListKeyboardNavigation.js.map +1 -1
  139. package/dist/esm/utils/hooks/useListScrollTo.js.map +1 -1
  140. package/dist/esm/utils/hooks/useOnClickOutside.js.map +1 -1
  141. package/dist/esm/utils/hooks/useProxiedRef.js.map +1 -1
  142. package/dist/esm/utils/hooks/useTimer.js +9 -17
  143. package/dist/esm/utils/hooks/useTimer.js.map +1 -1
  144. package/dist/esm/utils/input.js +7 -11
  145. package/dist/esm/utils/input.js.map +1 -1
  146. package/dist/esm/utils/mergeRefs.js +1 -1
  147. package/dist/esm/utils/mergeRefs.js.map +1 -1
  148. package/dist/esm/utils/taillwind.js +2 -2
  149. package/dist/esm/utils/taillwind.js.map +1 -1
  150. package/dist/index.css +661 -661
  151. package/dist/index.d.ts +4 -1
  152. package/dist/taco.cjs.development.js +1566 -1823
  153. package/dist/taco.cjs.development.js.map +1 -1
  154. package/dist/taco.cjs.production.min.js +1 -1
  155. package/dist/taco.cjs.production.min.js.map +1 -1
  156. package/dist/utils/mergeRefs.d.ts +1 -1
  157. package/package.json +6 -7
  158. package/plugins/tailwindcss-aria-attributes.js +73 -73
  159. package/tailwind.config.js +9 -0
  160. package/types.json +2612 -7006
@@ -1 +1 @@
1
- {"version":3,"file":"ScrollableList.js","sources":["../../../../src/components/Listbox/ScrollableList.tsx"],"sourcesContent":["import * as React from 'react';\nimport cn from 'classnames';\nimport { useProxiedRef } from '../../utils/hooks/useProxiedRef';\nimport { getNextIndexFromKeycode } from '../../utils/hooks/useListKeyboardNavigation';\nimport { useListScrollTo } from '../../utils/hooks/useListScrollTo';\nimport './ScrollableList.css';\nimport { Spinner } from '../Spinner/Spinner';\nimport { useLocalization } from '../Provider/Provider';\nimport { Checkbox } from '../Checkbox/Checkbox';\nimport { getInputClasses } from '../Input/util';\n\nexport type ScrollableListItemValue = string | number | boolean | null;\n\nexport type ScrollableListItem = {\n /**\n * Set whether the item is disabled.\n * This will both change the style and make the item unselectable\n */\n disabled?: boolean;\n /* Specifies whether the item has child items -- intended for internal use only */\n hasChildren?: boolean;\n /** Place an icon before the item's text */\n icon?: React.ReactElement;\n /* The index path to the item -- intended for internal use only */\n path?: string;\n /** Text describing the item */\n text: string | JSX.Element;\n /** Value of the item */\n value: ScrollableListItemValue;\n /** Child items to show hierarchical data */\n children?: ScrollableListItem[];\n};\n\n/** @internal */\nexport type ScrollableListProps = Omit<\n React.HTMLAttributes<HTMLUListElement>,\n 'defaultValue' | 'id' | 'onChange' | 'onClick' | 'onKeyDown'\n> & {\n /** Data indicating the options in scrollable list */\n data: ScrollableListItem[];\n /** Sets the list to be disabled */\n disabled?: boolean;\n /** Draws attention to the scrollable list by changing its style and making it visually prominent */\n highlighted?: boolean;\n /** Set an id for the scrollable list */\n id: string;\n /* Whether the input is in an invalid state */\n invalid?: boolean;\n /**\n * Shows a loading indicator with a text next to it.\n * Read more about how to provide the text in `Provider` component.\n */\n loading?: boolean;\n /**\n * Handler called when current active/selected option changes in a scrollable list.\n * @param index indicates the index of the current active option\n */\n onChange: (index: number) => void;\n /** Handler called when option is clicked */\n onClick?: (event: React.MouseEvent<HTMLLIElement>, index: number) => void;\n /**\n * Set whether the selected item should be scrolled into view when listbox is focused.\n * Default value is `false`\n */\n scrollOnFocus?: boolean;\n /** Handler called when a key is pressed */\n onKeyDown?: (event: React.KeyboardEvent<HTMLUListElement>, index: number | undefined) => void;\n /* Sets the list to read only mode */\n readOnly?: boolean;\n /**\n * Value of the scrollable list representing the selected item.\n * It needs to be an existing value from the provided data.\n */\n value: number | undefined;\n /**\n * Allows to select multiple items from the list\n */\n multiselect?: boolean;\n /**\n * Contains the currently selected values when multiselect mode is ON.\n */\n selectedIndexes?: number[];\n /**\n * True when all available (not disabled) options are selected\n */\n allOptionsSelected?: boolean;\n};\n\n/** @internal */\nexport type ScrollableListPropsWithRef = ScrollableListProps & React.RefAttributes<HTMLUListElement>;\n\nexport const getId = (id: string, value: ScrollableListItemValue): string => `${id}_${value}`;\n\nconst getNextEnabledItem = (\n event: React.KeyboardEvent<HTMLElement>,\n data: ScrollableListItem[],\n index: number | undefined\n): number | undefined => {\n const nextIndex = getNextIndexFromKeycode(event.keyCode, data.length, index);\n\n if (nextIndex) {\n if (nextIndex === index) {\n return index;\n } else if (data[nextIndex] && data[nextIndex].disabled) {\n return getNextEnabledItem(event, data, nextIndex);\n }\n }\n\n return nextIndex;\n};\n\nexport const ScrollableList = React.forwardRef(function ScrollableList(\n props: ScrollableListProps,\n ref: React.Ref<HTMLUListElement>\n) {\n const {\n data,\n disabled,\n highlighted,\n id,\n invalid: _,\n loading,\n onChange: setCurrentIndex,\n onClick,\n onFocus,\n onKeyDown,\n readOnly,\n scrollOnFocus = false,\n value: currentIndex,\n multiselect,\n selectedIndexes = [],\n allOptionsSelected = false,\n ...otherProps\n } = props;\n const listRef = useProxiedRef<HTMLUListElement>(ref);\n const itemRefs = React.useMemo(() => data.map(() => React.createRef<HTMLLIElement>()), [data]);\n const { texts } = useLocalization();\n const { scrollTo } = useListScrollTo(listRef, itemRefs);\n\n React.useEffect(() => {\n if (currentIndex && itemRefs[currentIndex]?.current) {\n itemRefs[currentIndex].current?.scrollIntoView({\n block: 'center',\n });\n }\n }, []);\n\n React.useEffect(() => {\n scrollTo(currentIndex);\n }, [currentIndex]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLUListElement>): void => {\n const nextIndex = getNextEnabledItem(event, data, currentIndex);\n\n if (nextIndex !== undefined && nextIndex !== currentIndex) {\n event.preventDefault();\n scrollTo(nextIndex);\n setCurrentIndex(nextIndex);\n }\n\n if (onKeyDown) {\n event.persist();\n const index = nextIndex !== undefined ? nextIndex : currentIndex;\n onKeyDown(event, index);\n }\n };\n\n const handleClick = (index: number) => (event: React.MouseEvent<HTMLLIElement>) => {\n setCurrentIndex(index);\n\n if (onClick) {\n event.persist();\n onClick(event, index);\n }\n };\n\n const handleFocus = (event: React.FocusEvent<HTMLUListElement>): void => {\n if (scrollOnFocus) {\n scrollTo(currentIndex);\n }\n\n if (onFocus) {\n event.persist();\n onFocus(event);\n }\n };\n\n const getOptionCheckedState = (optionValue: string, index: number): boolean => {\n if (optionValue === '#ALL-OPTIONS#') {\n return allOptionsSelected;\n } else if (!optionValue || !selectedIndexes) {\n return false;\n } else {\n return selectedIndexes.findIndex(i => i === index) !== -1;\n }\n };\n\n const list: React.HTMLAttributes<HTMLUListElement> &\n React.RefAttributes<HTMLUListElement> & { disabled?: boolean; readOnly?: boolean } = {\n ...otherProps,\n className: cn(\n 'inline-flex flex-col list-none !p-0 m-0 overflow-y-auto h-auto',\n getInputClasses(props),\n {\n 'yt-list--multiselect': multiselect,\n 'pointer-events-none': disabled,\n 'cursor-not-allowed': disabled || readOnly,\n },\n otherProps.className\n ),\n disabled,\n id,\n onFocus: !disabled && !readOnly ? handleFocus : undefined,\n onKeyDown: !disabled && !readOnly ? handleKeyDown : undefined,\n readOnly,\n ref: listRef,\n role: 'listbox',\n tabIndex: otherProps.tabIndex || 0,\n };\n\n const options = data.map((option, index) => {\n const depth = option.path ? option.path.split('.').length - 1 : 0;\n\n return {\n 'aria-selected': multiselect ? getOptionCheckedState(String(option.value), index) : currentIndex === index,\n 'data-focused': currentIndex === index,\n children: option.text,\n className: cn(\n 'flex items-center px-3 w-full cursor-pointer bg-white flex-[0_0_2rem] focus:wcag-blue focus:border-blue',\n {\n 'sticky top-0 font-bold': depth === 0 && !!option.hasChildren,\n }\n ),\n disabled: option.disabled,\n icon: option.icon,\n id: getId(id, option.value),\n key: getId(id, option.value),\n onClick: !disabled && !readOnly ? handleClick(index) : undefined,\n ref: itemRefs[index],\n role: 'option',\n style:\n depth > 0\n ? {\n paddingLeft: `${depth + 1}rem`,\n }\n : undefined,\n };\n });\n\n return (\n <ul {...list} data-taco=\"scrollable-list\">\n {loading ? (\n <li className=\"yt-list__empty\">\n <span>\n <Spinner delay={0} />\n </span>\n <span>{texts.listbox.loading}</span>\n </li>\n ) : options.length ? (\n options.map(({ children, icon, ...optionProps }) => (\n <li {...optionProps}>\n {icon}\n <span className=\"flex-grow truncate text-left\">{children}</span>\n {multiselect && (\n <Checkbox\n checked={optionProps['aria-selected']}\n onChange={() => null}\n className=\"pointer-events-none ml-2 self-center p-px\"\n />\n )}\n </li>\n ))\n ) : (\n <li className=\"yt-list__empty\">\n <span>{texts.listbox.empty}</span>\n </li>\n )}\n </ul>\n );\n});\n"],"names":["getId","id","value","getNextEnabledItem","event","data","index","nextIndex","getNextIndexFromKeycode","keyCode","length","disabled","ScrollableList","React","props","ref","loading","setCurrentIndex","onChange","onClick","onFocus","onKeyDown","readOnly","scrollOnFocus","currentIndex","multiselect","selectedIndexes","allOptionsSelected","otherProps","listRef","useProxiedRef","itemRefs","map","useLocalization","texts","useListScrollTo","scrollTo","current","scrollIntoView","block","handleKeyDown","undefined","preventDefault","persist","handleClick","handleFocus","getOptionCheckedState","optionValue","findIndex","i","list","className","cn","getInputClasses","role","tabIndex","options","option","depth","path","split","String","children","text","hasChildren","icon","key","style","paddingLeft","Spinner","delay","listbox","optionProps","Checkbox","checked","empty"],"mappings":"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"}
1
+ {"version":3,"file":"ScrollableList.js","sources":["../../../../src/components/Listbox/ScrollableList.tsx"],"sourcesContent":["import * as React from 'react';\nimport cn from 'classnames';\nimport { useProxiedRef } from '../../utils/hooks/useProxiedRef';\nimport { getNextIndexFromKeycode } from '../../utils/hooks/useListKeyboardNavigation';\nimport { useListScrollTo } from '../../utils/hooks/useListScrollTo';\nimport './ScrollableList.css';\nimport { Spinner } from '../Spinner/Spinner';\nimport { useLocalization } from '../Provider/Provider';\nimport { Checkbox } from '../Checkbox/Checkbox';\nimport { getInputClasses } from '../Input/util';\n\nexport type ScrollableListItemValue = string | number | boolean | null;\n\nexport type ScrollableListItem = {\n /**\n * Set whether the item is disabled.\n * This will both change the style and make the item unselectable\n */\n disabled?: boolean;\n /* Specifies whether the item has child items -- intended for internal use only */\n hasChildren?: boolean;\n /** Place an icon before the item's text */\n icon?: React.ReactElement;\n /* The index path to the item -- intended for internal use only */\n path?: string;\n /** Text describing the item */\n text: string | JSX.Element;\n /** Value of the item */\n value: ScrollableListItemValue;\n /** Child items to show hierarchical data */\n children?: ScrollableListItem[];\n};\n\n/** @internal */\nexport type ScrollableListProps = Omit<\n React.HTMLAttributes<HTMLUListElement>,\n 'defaultValue' | 'id' | 'onChange' | 'onClick' | 'onKeyDown'\n> & {\n /** Data indicating the options in scrollable list */\n data: ScrollableListItem[];\n /** Sets the list to be disabled */\n disabled?: boolean;\n /** Draws attention to the scrollable list by changing its style and making it visually prominent */\n highlighted?: boolean;\n /** Set an id for the scrollable list */\n id: string;\n /* Whether the input is in an invalid state */\n invalid?: boolean;\n /**\n * Shows a loading indicator with a text next to it.\n * Read more about how to provide the text in `Provider` component.\n */\n loading?: boolean;\n /**\n * Handler called when current active/selected option changes in a scrollable list.\n * @param index indicates the index of the current active option\n */\n onChange: (index: number) => void;\n /** Handler called when option is clicked */\n onClick?: (event: React.MouseEvent<HTMLLIElement>, index: number) => void;\n /**\n * Set whether the selected item should be scrolled into view when listbox is focused.\n * Default value is `false`\n */\n scrollOnFocus?: boolean;\n /** Handler called when a key is pressed */\n onKeyDown?: (event: React.KeyboardEvent<HTMLUListElement>, index: number | undefined) => void;\n /* Sets the list to read only mode */\n readOnly?: boolean;\n /**\n * Value of the scrollable list representing the selected item.\n * It needs to be an existing value from the provided data.\n */\n value: number | undefined;\n /**\n * Allows to select multiple items from the list\n */\n multiselect?: boolean;\n /**\n * Contains the currently selected values when multiselect mode is ON.\n */\n selectedIndexes?: number[];\n /**\n * True when all available (not disabled) options are selected\n */\n allOptionsSelected?: boolean;\n};\n\n/** @internal */\nexport type ScrollableListPropsWithRef = ScrollableListProps & React.RefAttributes<HTMLUListElement>;\n\nexport const getId = (id: string, value: ScrollableListItemValue): string => `${id}_${value}`;\n\nconst getNextEnabledItem = (\n event: React.KeyboardEvent<HTMLElement>,\n data: ScrollableListItem[],\n index: number | undefined\n): number | undefined => {\n const nextIndex = getNextIndexFromKeycode(event.keyCode, data.length, index);\n\n if (nextIndex) {\n if (nextIndex === index) {\n return index;\n } else if (data[nextIndex] && data[nextIndex].disabled) {\n return getNextEnabledItem(event, data, nextIndex);\n }\n }\n\n return nextIndex;\n};\n\nexport const ScrollableList = React.forwardRef(function ScrollableList(\n props: ScrollableListProps,\n ref: React.Ref<HTMLUListElement>\n) {\n const {\n data,\n disabled,\n highlighted,\n id,\n invalid: _,\n loading,\n onChange: setCurrentIndex,\n onClick,\n onFocus,\n onKeyDown,\n readOnly,\n scrollOnFocus = false,\n value: currentIndex,\n multiselect,\n selectedIndexes = [],\n allOptionsSelected = false,\n ...otherProps\n } = props;\n const listRef = useProxiedRef<HTMLUListElement>(ref);\n const itemRefs = React.useMemo(() => data.map(() => React.createRef<HTMLLIElement>()), [data]);\n const { texts } = useLocalization();\n const { scrollTo } = useListScrollTo(listRef, itemRefs);\n\n React.useEffect(() => {\n if (currentIndex && itemRefs[currentIndex]?.current) {\n itemRefs[currentIndex].current?.scrollIntoView({\n block: 'center',\n });\n }\n }, []);\n\n React.useEffect(() => {\n scrollTo(currentIndex);\n }, [currentIndex]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLUListElement>): void => {\n const nextIndex = getNextEnabledItem(event, data, currentIndex);\n\n if (nextIndex !== undefined && nextIndex !== currentIndex) {\n event.preventDefault();\n scrollTo(nextIndex);\n setCurrentIndex(nextIndex);\n }\n\n if (onKeyDown) {\n event.persist();\n const index = nextIndex !== undefined ? nextIndex : currentIndex;\n onKeyDown(event, index);\n }\n };\n\n const handleClick = (index: number) => (event: React.MouseEvent<HTMLLIElement>) => {\n setCurrentIndex(index);\n\n if (onClick) {\n event.persist();\n onClick(event, index);\n }\n };\n\n const handleFocus = (event: React.FocusEvent<HTMLUListElement>): void => {\n if (scrollOnFocus) {\n scrollTo(currentIndex);\n }\n\n if (onFocus) {\n event.persist();\n onFocus(event);\n }\n };\n\n const getOptionCheckedState = (optionValue: string, index: number): boolean => {\n if (optionValue === '#ALL-OPTIONS#') {\n return allOptionsSelected;\n } else if (!optionValue || !selectedIndexes) {\n return false;\n } else {\n return selectedIndexes.findIndex(i => i === index) !== -1;\n }\n };\n\n const list: React.HTMLAttributes<HTMLUListElement> &\n React.RefAttributes<HTMLUListElement> & { disabled?: boolean; readOnly?: boolean } = {\n ...otherProps,\n className: cn(\n 'inline-flex flex-col list-none !p-0 m-0 overflow-y-auto h-auto',\n getInputClasses(props),\n {\n 'yt-list--multiselect': multiselect,\n 'pointer-events-none': disabled,\n 'cursor-not-allowed': disabled || readOnly,\n },\n otherProps.className\n ),\n disabled,\n id,\n onFocus: !disabled && !readOnly ? handleFocus : undefined,\n onKeyDown: !disabled && !readOnly ? handleKeyDown : undefined,\n readOnly,\n ref: listRef,\n role: 'listbox',\n tabIndex: otherProps.tabIndex || 0,\n };\n\n const options = data.map((option, index) => {\n const depth = option.path ? option.path.split('.').length - 1 : 0;\n\n return {\n 'aria-selected': multiselect ? getOptionCheckedState(String(option.value), index) : currentIndex === index,\n 'data-focused': currentIndex === index,\n children: option.text,\n className: cn(\n 'flex items-center px-3 w-full cursor-pointer bg-white flex-[0_0_2rem] focus:wcag-blue focus:border-blue',\n {\n 'sticky top-0 font-bold': depth === 0 && !!option.hasChildren,\n }\n ),\n disabled: option.disabled,\n icon: option.icon,\n id: getId(id, option.value),\n key: getId(id, option.value),\n onClick: !disabled && !readOnly ? handleClick(index) : undefined,\n ref: itemRefs[index],\n role: 'option',\n style:\n depth > 0\n ? {\n paddingLeft: `${depth + 1}rem`,\n }\n : undefined,\n };\n });\n\n return (\n <ul {...list} data-taco=\"scrollable-list\">\n {loading ? (\n <li className=\"yt-list__empty\">\n <span>\n <Spinner delay={0} />\n </span>\n <span>{texts.listbox.loading}</span>\n </li>\n ) : options.length ? (\n options.map(({ children, icon, ...optionProps }) => (\n <li {...optionProps}>\n {icon}\n <span className=\"flex-grow truncate text-left\">{children}</span>\n {multiselect && (\n <Checkbox\n checked={optionProps['aria-selected']}\n onChange={() => null}\n className=\"pointer-events-none ml-2 self-center p-px\"\n />\n )}\n </li>\n ))\n ) : (\n <li className=\"yt-list__empty\">\n <span>{texts.listbox.empty}</span>\n </li>\n )}\n </ul>\n );\n});\n"],"names":["getId","id","value","getNextEnabledItem","event","data","index","nextIndex","getNextIndexFromKeycode","keyCode","length","disabled","ScrollableList","React","props","ref","highlighted","invalid","_","loading","onChange","setCurrentIndex","onClick","onFocus","onKeyDown","readOnly","scrollOnFocus","currentIndex","multiselect","selectedIndexes","allOptionsSelected","otherProps","listRef","useProxiedRef","itemRefs","map","texts","useLocalization","scrollTo","useListScrollTo","current","scrollIntoView","block","handleKeyDown","undefined","preventDefault","persist","handleClick","handleFocus","getOptionCheckedState","optionValue","findIndex","i","list","className","cn","getInputClasses","role","tabIndex","options","option","depth","path","split","String","children","text","hasChildren","icon","key","style","paddingLeft","Spinner","delay","listbox","optionProps","Checkbox","checked","empty"],"mappings":"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"}
@@ -1,46 +1,40 @@
1
- import { objectWithoutPropertiesLoose as _objectWithoutPropertiesLoose, extends as _extends } from '../../_virtual/_rollupPluginBabelHelpers.js';
2
1
  import { useMemo, useEffect } from 'react';
3
2
  import { v4 } from 'uuid';
4
3
  import { useProxiedRef } from '../../utils/hooks/useProxiedRef.js';
5
4
  import { useFlattenedData, getIndexFromValue, getActiveDescendant, setInputValueByRef, findByValue, sanitizeItem } from './util.js';
6
5
  import { useTypeahead } from './useTypeahead.js';
7
6
 
8
- var _excluded = ["data", "defaultValue", "disabled", "emptyValue", "id", "invalid", "name", "onChange", "onFocus", "onKeyDown", "value"];
9
- var useListbox = function useListbox(_ref, ref) {
10
- var _ref$data = _ref.data,
11
- externalData = _ref$data === void 0 ? [] : _ref$data,
12
- defaultValue = _ref.defaultValue,
13
- disabled = _ref.disabled,
14
- emptyValue = _ref.emptyValue,
15
- nativeId = _ref.id,
16
- invalid = _ref.invalid,
17
- name = _ref.name,
18
- onChange = _ref.onChange,
19
- onFocus = _ref.onFocus,
20
- onKeyDown = _ref.onKeyDown,
21
- _ref$value = _ref.value,
22
- value = _ref$value === void 0 ? emptyValue : _ref$value,
23
- otherProps = _objectWithoutPropertiesLoose(_ref, _excluded);
24
-
25
- var data = useFlattenedData(emptyValue !== undefined ? [{
7
+ const useListbox = ({
8
+ data: externalData = [],
9
+ defaultValue,
10
+ disabled,
11
+ emptyValue,
12
+ id: nativeId,
13
+ invalid,
14
+ name,
15
+ onChange,
16
+ onFocus,
17
+ onKeyDown,
18
+ value = emptyValue,
19
+ ...otherProps
20
+ }, ref) => {
21
+ const data = useFlattenedData(emptyValue !== undefined ? [{
26
22
  text: '',
27
23
  value: emptyValue
28
- }].concat(externalData) : externalData);
29
- var id = useMemo(function () {
30
- return nativeId || v4();
31
- }, [nativeId]);
32
- var inputRef = useProxiedRef(ref);
33
- var currentIndex = value !== undefined ? getIndexFromValue(data, value) : undefined;
34
-
35
- var _useTypeahead = useTypeahead({
36
- data: data,
37
- currentIndex: currentIndex
38
- }),
39
- getNextIndex = _useTypeahead.getNextIndex;
40
-
41
- var setInputValueByIndex = function setInputValueByIndex(index) {
24
+ }, ...externalData] : externalData);
25
+ const id = useMemo(() => nativeId || v4(), [nativeId]);
26
+ const inputRef = useProxiedRef(ref);
27
+ const currentIndex = value !== undefined ? getIndexFromValue(data, value) : undefined;
28
+ const {
29
+ getNextIndex
30
+ } = useTypeahead({
31
+ data,
32
+ currentIndex
33
+ });
34
+
35
+ const setInputValueByIndex = index => {
42
36
  if (index !== undefined) {
43
- var option = data[index];
37
+ const option = data[index];
44
38
 
45
39
  if (option && !option.disabled) {
46
40
  setInputValueByRef(inputRef.current, option.value);
@@ -48,14 +42,14 @@ var useListbox = function useListbox(_ref, ref) {
48
42
  }
49
43
  };
50
44
 
51
- var handleListboxChange = function handleListboxChange(index) {
45
+ const handleListboxChange = index => {
52
46
  setInputValueByIndex(index);
53
47
  };
54
48
 
55
- useEffect(function () {
49
+ useEffect(() => {
56
50
  if (data.length && currentIndex === undefined) {
57
51
  if (defaultValue !== undefined) {
58
- var defaultValueIndex = getIndexFromValue(data, defaultValue);
52
+ const defaultValueIndex = getIndexFromValue(data, defaultValue);
59
53
 
60
54
  if (defaultValueIndex !== undefined) {
61
55
  setInputValueByIndex(defaultValueIndex);
@@ -66,11 +60,11 @@ var useListbox = function useListbox(_ref, ref) {
66
60
  }
67
61
  }, [data]);
68
62
 
69
- var handleListboxKeyDown = function handleListboxKeyDown(event) {
70
- var charKey = String.fromCharCode(event.keyCode);
63
+ const handleListboxKeyDown = event => {
64
+ const charKey = String.fromCharCode(event.keyCode);
71
65
 
72
66
  if (charKey.match(/(\w)/g)) {
73
- var nextIndex = getNextIndex(charKey);
67
+ const nextIndex = getNextIndex(charKey);
74
68
 
75
69
  if (nextIndex > -1 && nextIndex !== currentIndex) {
76
70
  setInputValueByIndex(nextIndex);
@@ -85,7 +79,7 @@ var useListbox = function useListbox(_ref, ref) {
85
79
  }
86
80
  };
87
81
 
88
- var handleListboxFocus = function handleListboxFocus(event) {
82
+ const handleListboxFocus = event => {
89
83
  if (currentIndex === undefined && data.length) {
90
84
  setInputValueByIndex(0);
91
85
  }
@@ -96,26 +90,24 @@ var useListbox = function useListbox(_ref, ref) {
96
90
  }
97
91
  };
98
92
 
99
- var handleInputChange = function handleInputChange(event) {
93
+ const handleInputChange = event => {
100
94
  event.persist();
101
95
 
102
96
  if (onChange) {
103
97
  var _item$path$split, _item$path;
104
98
 
105
- var item = findByValue(data, event.target.value);
99
+ const item = findByValue(data, event.target.value);
106
100
  event.detail = sanitizeItem(item);
107
- var indexes = (_item$path$split = item === null || item === void 0 ? void 0 : (_item$path = item.path) === null || _item$path === void 0 ? void 0 : _item$path.split('.')) !== null && _item$path$split !== void 0 ? _item$path$split : [];
101
+ const indexes = (_item$path$split = item === null || item === void 0 ? void 0 : (_item$path = item.path) === null || _item$path === void 0 ? void 0 : _item$path.split('.')) !== null && _item$path$split !== void 0 ? _item$path$split : [];
108
102
 
109
103
  if (indexes.length > 1) {
110
104
  // we don't want to map the current item
111
105
  indexes.pop(); // we need to rebuild the path as we map
112
106
 
113
- var lastPath;
114
- event.detail.parents = indexes.map(function (i) {
107
+ let lastPath;
108
+ event.detail.parents = indexes.map(i => {
115
109
  lastPath = lastPath ? [lastPath, i].join('.') : i;
116
- return sanitizeItem(data.find(function (i) {
117
- return i.path === lastPath;
118
- }));
110
+ return sanitizeItem(data.find(i => i.path === lastPath));
119
111
  });
120
112
  }
121
113
 
@@ -123,30 +115,29 @@ var useListbox = function useListbox(_ref, ref) {
123
115
  }
124
116
  };
125
117
 
126
- var list = _extends({}, otherProps, {
118
+ const list = { ...otherProps,
127
119
  'aria-activedescendant': getActiveDescendant(data, currentIndex, id),
128
- data: data,
129
- disabled: disabled,
130
- id: id,
131
- invalid: invalid,
120
+ data,
121
+ disabled,
122
+ id,
123
+ invalid,
132
124
  onChange: handleListboxChange,
133
125
  onFocus: handleListboxFocus,
134
126
  onKeyDown: handleListboxKeyDown,
135
127
  scrollOnFocus: true,
136
128
  tabIndex: disabled ? -1 : otherProps.tabIndex ? otherProps.tabIndex : 0,
137
129
  value: currentIndex
138
- });
139
-
140
- var input = {
141
- name: name,
130
+ };
131
+ const input = {
132
+ name,
142
133
  onChange: handleInputChange,
143
134
  ref: inputRef,
144
135
  tabIndex: -1,
145
136
  value: value !== null && value !== void 0 ? value : ''
146
137
  };
147
138
  return {
148
- list: list,
149
- input: input
139
+ list,
140
+ input
150
141
  };
151
142
  };
152
143
 
@@ -1 +1 @@
1
- {"version":3,"file":"useListbox.js","sources":["../../../../src/components/Listbox/useListbox.tsx"],"sourcesContent":["import * as React from 'react';\nimport { v4 as uuid } from 'uuid';\nimport { ListboxProps } from './Listbox';\nimport { useProxiedRef } from '../../utils/hooks/useProxiedRef';\nimport { setInputValueByRef, getIndexFromValue, findByValue, getActiveDescendant, useFlattenedData, sanitizeItem } from './util';\nimport { ScrollableListProps } from './ScrollableList';\nimport { useTypeahead } from './useTypeahead';\n\ntype useListbox = {\n list: ScrollableListProps;\n input: Omit<React.HTMLAttributes<HTMLInputElement>, 'defaultValue'>;\n};\n\nexport const useListbox = (\n {\n data: externalData = [],\n defaultValue,\n disabled,\n emptyValue,\n id: nativeId,\n invalid,\n name,\n onChange,\n onFocus,\n onKeyDown,\n value = emptyValue,\n ...otherProps\n }: ListboxProps,\n ref: React.Ref<HTMLInputElement>\n): useListbox => {\n const data = useFlattenedData(emptyValue !== undefined ? [{ text: '', value: emptyValue }, ...externalData] : externalData);\n const id = React.useMemo(() => nativeId || uuid(), [nativeId]);\n const inputRef = useProxiedRef<HTMLInputElement>(ref);\n const currentIndex = value !== undefined ? getIndexFromValue(data, value) : undefined;\n const { getNextIndex } = useTypeahead({ data, currentIndex });\n\n const setInputValueByIndex = (index: number | undefined): void => {\n if (index !== undefined) {\n const option = data[index];\n\n if (option && !option.disabled) {\n setInputValueByRef(inputRef.current, option.value);\n }\n }\n };\n\n const handleListboxChange = (index: number): void => {\n setInputValueByIndex(index);\n };\n\n React.useEffect(() => {\n if (data.length && currentIndex === undefined) {\n if (defaultValue !== undefined) {\n const defaultValueIndex = getIndexFromValue(data, defaultValue);\n\n if (defaultValueIndex !== undefined) {\n setInputValueByIndex(defaultValueIndex);\n }\n } else {\n setInputValueByIndex(0);\n }\n }\n }, [data]);\n\n const handleListboxKeyDown = (event: React.KeyboardEvent<HTMLElement>): void => {\n const charKey = String.fromCharCode(event.keyCode);\n\n if (charKey.match(/(\\w)/g)) {\n const nextIndex = getNextIndex(charKey);\n\n if (nextIndex > -1 && nextIndex !== currentIndex) {\n setInputValueByIndex(nextIndex);\n }\n return;\n }\n\n if (onKeyDown) {\n event.persist();\n onKeyDown(event);\n }\n };\n\n const handleListboxFocus = (event: React.FocusEvent<HTMLElement>): void => {\n if (currentIndex === undefined && data.length) {\n setInputValueByIndex(0);\n }\n\n if (onFocus) {\n event.persist();\n onFocus(event);\n }\n };\n\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>): void => {\n event.persist();\n\n if (onChange) {\n const item = findByValue(data, event.target.value);\n (event as any).detail = sanitizeItem(item);\n\n const indexes = item?.path?.split('.') ?? [];\n\n if (indexes.length > 1) {\n // we don't want to map the current item\n indexes.pop();\n // we need to rebuild the path as we map\n let lastPath: string;\n\n (event as any).detail.parents = indexes.map(i => {\n lastPath = lastPath ? [lastPath, i].join('.') : i;\n return sanitizeItem(data.find(i => i.path === lastPath));\n });\n }\n\n onChange(event);\n }\n };\n\n const list: ScrollableListProps = {\n ...otherProps,\n 'aria-activedescendant': getActiveDescendant(data, currentIndex, id),\n data,\n disabled,\n id,\n invalid,\n onChange: handleListboxChange,\n onFocus: handleListboxFocus,\n onKeyDown: handleListboxKeyDown,\n scrollOnFocus: true,\n tabIndex: disabled ? -1 : otherProps.tabIndex ? otherProps.tabIndex : 0,\n value: currentIndex,\n };\n\n const input = {\n name,\n onChange: handleInputChange,\n ref: inputRef,\n tabIndex: -1,\n value: value ?? '',\n };\n\n return { list, input };\n};\n"],"names":["useListbox","ref","data","externalData","defaultValue","disabled","emptyValue","nativeId","id","invalid","name","onChange","onFocus","onKeyDown","value","otherProps","useFlattenedData","undefined","text","React","uuid","inputRef","useProxiedRef","currentIndex","getIndexFromValue","useTypeahead","getNextIndex","setInputValueByIndex","index","option","setInputValueByRef","current","handleListboxChange","length","defaultValueIndex","handleListboxKeyDown","event","charKey","String","fromCharCode","keyCode","match","nextIndex","persist","handleListboxFocus","handleInputChange","item","findByValue","target","detail","sanitizeItem","indexes","path","split","pop","lastPath","parents","map","i","join","find","list","getActiveDescendant","scrollOnFocus","tabIndex","input"],"mappings":"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"}
1
+ {"version":3,"file":"useListbox.js","sources":["../../../../src/components/Listbox/useListbox.tsx"],"sourcesContent":["import * as React from 'react';\nimport { v4 as uuid } from 'uuid';\nimport { ListboxProps } from './Listbox';\nimport { useProxiedRef } from '../../utils/hooks/useProxiedRef';\nimport { setInputValueByRef, getIndexFromValue, findByValue, getActiveDescendant, useFlattenedData, sanitizeItem } from './util';\nimport { ScrollableListProps } from './ScrollableList';\nimport { useTypeahead } from './useTypeahead';\n\ntype useListbox = {\n list: ScrollableListProps;\n input: Omit<React.HTMLAttributes<HTMLInputElement>, 'defaultValue'>;\n};\n\nexport const useListbox = (\n {\n data: externalData = [],\n defaultValue,\n disabled,\n emptyValue,\n id: nativeId,\n invalid,\n name,\n onChange,\n onFocus,\n onKeyDown,\n value = emptyValue,\n ...otherProps\n }: ListboxProps,\n ref: React.Ref<HTMLInputElement>\n): useListbox => {\n const data = useFlattenedData(emptyValue !== undefined ? [{ text: '', value: emptyValue }, ...externalData] : externalData);\n const id = React.useMemo(() => nativeId || uuid(), [nativeId]);\n const inputRef = useProxiedRef<HTMLInputElement>(ref);\n const currentIndex = value !== undefined ? getIndexFromValue(data, value) : undefined;\n const { getNextIndex } = useTypeahead({ data, currentIndex });\n\n const setInputValueByIndex = (index: number | undefined): void => {\n if (index !== undefined) {\n const option = data[index];\n\n if (option && !option.disabled) {\n setInputValueByRef(inputRef.current, option.value);\n }\n }\n };\n\n const handleListboxChange = (index: number): void => {\n setInputValueByIndex(index);\n };\n\n React.useEffect(() => {\n if (data.length && currentIndex === undefined) {\n if (defaultValue !== undefined) {\n const defaultValueIndex = getIndexFromValue(data, defaultValue);\n\n if (defaultValueIndex !== undefined) {\n setInputValueByIndex(defaultValueIndex);\n }\n } else {\n setInputValueByIndex(0);\n }\n }\n }, [data]);\n\n const handleListboxKeyDown = (event: React.KeyboardEvent<HTMLElement>): void => {\n const charKey = String.fromCharCode(event.keyCode);\n\n if (charKey.match(/(\\w)/g)) {\n const nextIndex = getNextIndex(charKey);\n\n if (nextIndex > -1 && nextIndex !== currentIndex) {\n setInputValueByIndex(nextIndex);\n }\n return;\n }\n\n if (onKeyDown) {\n event.persist();\n onKeyDown(event);\n }\n };\n\n const handleListboxFocus = (event: React.FocusEvent<HTMLElement>): void => {\n if (currentIndex === undefined && data.length) {\n setInputValueByIndex(0);\n }\n\n if (onFocus) {\n event.persist();\n onFocus(event);\n }\n };\n\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>): void => {\n event.persist();\n\n if (onChange) {\n const item = findByValue(data, event.target.value);\n (event as any).detail = sanitizeItem(item);\n\n const indexes = item?.path?.split('.') ?? [];\n\n if (indexes.length > 1) {\n // we don't want to map the current item\n indexes.pop();\n // we need to rebuild the path as we map\n let lastPath: string;\n\n (event as any).detail.parents = indexes.map(i => {\n lastPath = lastPath ? [lastPath, i].join('.') : i;\n return sanitizeItem(data.find(i => i.path === lastPath));\n });\n }\n\n onChange(event);\n }\n };\n\n const list: ScrollableListProps = {\n ...otherProps,\n 'aria-activedescendant': getActiveDescendant(data, currentIndex, id),\n data,\n disabled,\n id,\n invalid,\n onChange: handleListboxChange,\n onFocus: handleListboxFocus,\n onKeyDown: handleListboxKeyDown,\n scrollOnFocus: true,\n tabIndex: disabled ? -1 : otherProps.tabIndex ? otherProps.tabIndex : 0,\n value: currentIndex,\n };\n\n const input = {\n name,\n onChange: handleInputChange,\n ref: inputRef,\n tabIndex: -1,\n value: value ?? '',\n };\n\n return { list, input };\n};\n"],"names":["useListbox","data","externalData","defaultValue","disabled","emptyValue","id","nativeId","invalid","name","onChange","onFocus","onKeyDown","value","otherProps","ref","useFlattenedData","undefined","text","React","uuid","inputRef","useProxiedRef","currentIndex","getIndexFromValue","getNextIndex","useTypeahead","setInputValueByIndex","index","option","setInputValueByRef","current","handleListboxChange","length","defaultValueIndex","handleListboxKeyDown","event","charKey","String","fromCharCode","keyCode","match","nextIndex","persist","handleListboxFocus","handleInputChange","item","findByValue","target","detail","sanitizeItem","indexes","path","split","pop","lastPath","parents","map","i","join","find","list","getActiveDescendant","scrollOnFocus","tabIndex","input"],"mappings":"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"}
@@ -1,4 +1,3 @@
1
- import { objectWithoutPropertiesLoose as _objectWithoutPropertiesLoose, extends as _extends } from '../../_virtual/_rollupPluginBabelHelpers.js';
2
1
  import { useMemo, useState, useEffect } from 'react';
3
2
  import { v4 } from 'uuid';
4
3
  import { useLocalization } from '../Provider/Provider.js';
@@ -7,62 +6,47 @@ import keycode from 'keycode';
7
6
  import { getIndexFromValue, getSelectedIndexesFromValue, setInputValueByRef, getActiveDescendant, findByValue } from './util.js';
8
7
  import { useTypeahead } from './useTypeahead.js';
9
8
 
10
- var _excluded = ["data", "defaultValue", "disabled", "emptyValue", "id", "name", "onClick", "onChange", "onFocus", "onKeyDown", "value"];
11
- var useMultiListbox = function useMultiListbox(_ref, ref) {
12
- var _ref$data = _ref.data,
13
- externalData = _ref$data === void 0 ? [] : _ref$data,
14
- defaultValue = _ref.defaultValue,
15
- disabled = _ref.disabled,
16
- nativeId = _ref.id,
17
- name = _ref.name,
18
- onClick = _ref.onClick,
19
- onChange = _ref.onChange,
20
- onFocus = _ref.onFocus,
21
- onKeyDown = _ref.onKeyDown,
22
- value = _ref.value,
23
- otherProps = _objectWithoutPropertiesLoose(_ref, _excluded);
24
-
25
- var _useLocalization = useLocalization(),
26
- texts = _useLocalization.texts;
27
-
28
- var id = useMemo(function () {
29
- return nativeId || v4();
30
- }, [nativeId]);
31
- var inputRef = useProxiedRef(ref);
32
- var data = useMemo(function () {
9
+ const useMultiListbox = ({
10
+ data: externalData = [],
11
+ defaultValue,
12
+ disabled,
13
+ emptyValue: _,
14
+ id: nativeId,
15
+ name,
16
+ onClick,
17
+ onChange,
18
+ onFocus,
19
+ onKeyDown,
20
+ value,
21
+ ...otherProps
22
+ }, ref) => {
23
+ const {
24
+ texts
25
+ } = useLocalization();
26
+ const id = useMemo(() => nativeId || v4(), [nativeId]);
27
+ const inputRef = useProxiedRef(ref);
28
+ const data = useMemo(() => {
33
29
  return [{
34
30
  text: texts.listbox.allOption,
35
31
  value: '#ALL-OPTIONS#'
36
- }].concat(externalData);
32
+ }, ...externalData];
37
33
  }, [externalData]);
38
-
39
- var _React$useState = useState(getIndexFromValue(data, value) || 0),
40
- currentIndex = _React$useState[0],
41
- setCurrentIndex = _React$useState[1];
42
-
43
- var _React$useState2 = useState(false),
44
- allOptionsSelected = _React$useState2[0],
45
- setAllOptionsSelected = _React$useState2[1];
46
-
47
- var _useTypeahead = useTypeahead({
48
- data: data,
49
- currentIndex: currentIndex
50
- }),
51
- getNextIndex = _useTypeahead.getNextIndex;
52
-
53
- var _React$useState3 = useState(getSelectedIndexesFromValue(data, value)),
54
- selectedIndexes = _React$useState3[0],
55
- setSelectedIndexes = _React$useState3[1];
56
-
57
- useEffect(function () {
34
+ const [currentIndex, setCurrentIndex] = useState(getIndexFromValue(data, value) || 0);
35
+ const [allOptionsSelected, setAllOptionsSelected] = useState(false);
36
+ const {
37
+ getNextIndex
38
+ } = useTypeahead({
39
+ data,
40
+ currentIndex
41
+ });
42
+ const [selectedIndexes, setSelectedIndexes] = useState(getSelectedIndexesFromValue(data, value));
43
+ useEffect(() => {
58
44
  if (defaultValue && !value) {
59
45
  setInputValueByRef(inputRef.current, defaultValue.toString());
60
46
  }
61
47
  }, []);
62
- useEffect(function () {
63
- var selectableItemsCount = data.filter(function (item) {
64
- return !item.disabled;
65
- }).length - 1;
48
+ useEffect(() => {
49
+ const selectableItemsCount = data.filter(item => !item.disabled).length - 1;
66
50
 
67
51
  if (selectableItemsCount === selectedIndexes.length) {
68
52
  setAllOptionsSelected(true);
@@ -71,38 +55,30 @@ var useMultiListbox = function useMultiListbox(_ref, ref) {
71
55
  }
72
56
  }, [selectedIndexes, data]);
73
57
 
74
- var setInputValueByIndex = function setInputValueByIndex(index) {
58
+ const setInputValueByIndex = index => {
75
59
  if (index !== undefined) {
76
- var option = data[index];
60
+ const option = data[index];
77
61
 
78
62
  if (option && !option.disabled) {
79
63
  var _inputRef$current;
80
64
 
81
- var newInputValue = '';
82
- var currentInputValue = (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.value;
83
- var currentValuesArray = (currentInputValue === null || currentInputValue === void 0 ? void 0 : currentInputValue.split(',')) || [];
84
- var optionAlreadySelected = currentValuesArray.findIndex(function (val) {
85
- return val === String(option.value);
86
- }) !== -1; // Handling the select_all option
65
+ let newInputValue = '';
66
+ const currentInputValue = (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.value;
67
+ const currentValuesArray = (currentInputValue === null || currentInputValue === void 0 ? void 0 : currentInputValue.split(',')) || [];
68
+ const optionAlreadySelected = currentValuesArray.findIndex(val => val === String(option.value)) !== -1; // Handling the select_all option
87
69
 
88
70
  if (option.value === '#ALL-OPTIONS#') {
89
71
  if (!allOptionsSelected) {
90
- newInputValue = data.filter(function (option, index) {
91
- return index !== 0 && !option.disabled;
92
- }).map(function (option) {
93
- return option.value;
94
- }).join(',');
72
+ newInputValue = data.filter((option, index) => index !== 0 && !option.disabled).map(option => option.value).join(',');
95
73
  } else {
96
74
  newInputValue = '';
97
75
  }
98
76
  } else {
99
77
  // Handling rest options
100
78
  if (optionAlreadySelected) {
101
- newInputValue = currentValuesArray.filter(function (val) {
102
- return val !== String(option.value);
103
- }).join(',');
79
+ newInputValue = currentValuesArray.filter(val => val !== String(option.value)).join(',');
104
80
  } else {
105
- newInputValue = currentInputValue ? currentInputValue + "," + option.value : option.value;
81
+ newInputValue = currentInputValue ? `${currentInputValue},${option.value}` : option.value;
106
82
  }
107
83
  }
108
84
 
@@ -111,7 +87,7 @@ var useMultiListbox = function useMultiListbox(_ref, ref) {
111
87
  }
112
88
  };
113
89
 
114
- var handleListboxClick = function handleListboxClick(event, index) {
90
+ const handleListboxClick = (event, index) => {
115
91
  event.preventDefault();
116
92
 
117
93
  if (!data[index].disabled) {
@@ -124,11 +100,11 @@ var useMultiListbox = function useMultiListbox(_ref, ref) {
124
100
  }
125
101
  };
126
102
 
127
- var handleListboxKeyDown = function handleListboxKeyDown(event, index) {
128
- var charKey = String.fromCharCode(event.keyCode);
103
+ const handleListboxKeyDown = (event, index) => {
104
+ const charKey = String.fromCharCode(event.keyCode);
129
105
 
130
106
  if (charKey.match(/(\w)/g)) {
131
- var nextIndex = getNextIndex(charKey);
107
+ const nextIndex = getNextIndex(charKey);
132
108
 
133
109
  if (nextIndex > -1 && nextIndex !== currentIndex) {
134
110
  setCurrentIndex(nextIndex);
@@ -160,22 +136,22 @@ var useMultiListbox = function useMultiListbox(_ref, ref) {
160
136
  }
161
137
  };
162
138
 
163
- var handleListboxFocus = function handleListboxFocus(event) {
139
+ const handleListboxFocus = event => {
164
140
  if (onFocus) {
165
141
  event.persist();
166
142
  onFocus(event);
167
143
  }
168
144
  };
169
145
 
170
- var handleInputChange = function handleInputChange(event) {
146
+ const handleInputChange = event => {
171
147
  event.persist();
172
148
  setSelectedIndexes(getSelectedIndexesFromValue(data, event.target.value));
173
149
 
174
150
  if (onChange) {
175
- var detail = [];
176
- var valuesArray = event.target.value.split(',');
177
- valuesArray.forEach(function (val) {
178
- var item = findByValue(data, val);
151
+ const detail = [];
152
+ const valuesArray = event.target.value.split(',');
153
+ valuesArray.forEach(val => {
154
+ const item = findByValue(data, val);
179
155
 
180
156
  if (item) {
181
157
  detail.push(item);
@@ -186,36 +162,33 @@ var useMultiListbox = function useMultiListbox(_ref, ref) {
186
162
  }
187
163
  };
188
164
 
189
- var list = _extends({}, otherProps, {
165
+ const list = { ...otherProps,
190
166
  'aria-activedescendant': getActiveDescendant(data, currentIndex, id),
191
167
  'aria-multiselectable': true,
192
- data: data,
193
- disabled: disabled,
194
- id: id,
195
- onChange: function onChange() {
196
- return null;
197
- },
168
+ data,
169
+ disabled,
170
+ id,
171
+ onChange: () => null,
198
172
  onClick: handleListboxClick,
199
173
  onFocus: handleListboxFocus,
200
174
  onKeyDown: handleListboxKeyDown,
201
175
  scrollOnFocus: false,
202
176
  tabIndex: disabled ? -1 : otherProps.tabIndex ? otherProps.tabIndex : 0,
203
177
  value: currentIndex,
204
- selectedIndexes: selectedIndexes,
178
+ selectedIndexes,
205
179
  multiselect: true,
206
- allOptionsSelected: allOptionsSelected
207
- });
208
-
209
- var input = {
210
- name: name,
180
+ allOptionsSelected
181
+ };
182
+ const input = {
183
+ name,
211
184
  onChange: handleInputChange,
212
185
  ref: inputRef,
213
186
  tabIndex: -1,
214
187
  value: value !== null && value !== void 0 ? value : ''
215
188
  };
216
189
  return {
217
- list: list,
218
- input: input
190
+ list,
191
+ input
219
192
  };
220
193
  };
221
194