@workday/canvas-kit-react 10.0.0-alpha.539-next.0 → 10.0.0-alpha.543-next.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.
Files changed (262) hide show
  1. package/checkbox/lib/Checkbox.tsx +24 -33
  2. package/collection/index.ts +1 -0
  3. package/collection/lib/useBaseListModel.tsx +3 -3
  4. package/collection/lib/useListItemRegister.tsx +1 -1
  5. package/collection/lib/useListRenderItem.tsx +2 -2
  6. package/combobox/index.ts +11 -4
  7. package/combobox/lib/Combobox.tsx +1 -1
  8. package/combobox/lib/ComboboxCard.tsx +1 -1
  9. package/combobox/lib/ComboboxInput.tsx +2 -90
  10. package/combobox/lib/ComboboxMenu.tsx +4 -3
  11. package/combobox/lib/ComboboxMenuItem.tsx +9 -8
  12. package/combobox/lib/ComboboxMenuList.tsx +1 -1
  13. package/combobox/lib/ComboboxPopper.tsx +20 -0
  14. package/combobox/lib/hooks/index.ts +9 -0
  15. package/combobox/lib/hooks/useComboboxInput.ts +88 -0
  16. package/combobox/lib/hooks/useComboboxKeyboardTypeAhead.ts +127 -0
  17. package/combobox/lib/hooks/useComboboxListKeyboardHandler.ts +23 -0
  18. package/combobox/lib/{useComboboxModel.tsx → hooks/useComboboxModel.tsx} +6 -2
  19. package/combobox/lib/hooks/useComboboxMoveCursorToSelected.tsx +27 -0
  20. package/combobox/lib/hooks/useComboboxResetCursorToSelected.tsx +18 -0
  21. package/combobox/lib/hooks/useSetPopupWidth.ts +16 -0
  22. package/common/lib/utils/components.ts +284 -274
  23. package/common/lib/utils/models.ts +67 -84
  24. package/dist/commonjs/checkbox/lib/Checkbox.d.ts.map +1 -1
  25. package/dist/commonjs/checkbox/lib/Checkbox.js +13 -17
  26. package/dist/commonjs/collection/index.d.ts +1 -0
  27. package/dist/commonjs/collection/index.d.ts.map +1 -1
  28. package/dist/commonjs/collection/index.js +3 -1
  29. package/dist/commonjs/collection/lib/useBaseListModel.d.ts +1 -1
  30. package/dist/commonjs/collection/lib/useBaseListModel.d.ts.map +1 -1
  31. package/dist/commonjs/collection/lib/useBaseListModel.js +2 -2
  32. package/dist/commonjs/collection/lib/useListItemRegister.js +2 -2
  33. package/dist/commonjs/collection/lib/useListRenderItem.js +2 -2
  34. package/dist/commonjs/combobox/index.d.ts +1 -4
  35. package/dist/commonjs/combobox/index.d.ts.map +1 -1
  36. package/dist/commonjs/combobox/index.js +11 -9
  37. package/dist/commonjs/combobox/lib/Combobox.d.ts +9 -3
  38. package/dist/commonjs/combobox/lib/Combobox.d.ts.map +1 -1
  39. package/dist/commonjs/combobox/lib/Combobox.js +2 -2
  40. package/dist/commonjs/combobox/lib/ComboboxCard.js +3 -3
  41. package/dist/commonjs/combobox/lib/ComboboxInput.d.ts +1 -106
  42. package/dist/commonjs/combobox/lib/ComboboxInput.d.ts.map +1 -1
  43. package/dist/commonjs/combobox/lib/ComboboxInput.js +4 -71
  44. package/dist/commonjs/combobox/lib/ComboboxMenu.d.ts +9 -3
  45. package/dist/commonjs/combobox/lib/ComboboxMenu.d.ts.map +1 -1
  46. package/dist/commonjs/combobox/lib/ComboboxMenu.js +5 -4
  47. package/dist/commonjs/combobox/lib/ComboboxMenuItem.d.ts +7 -1
  48. package/dist/commonjs/combobox/lib/ComboboxMenuItem.d.ts.map +1 -1
  49. package/dist/commonjs/combobox/lib/ComboboxMenuItem.js +7 -7
  50. package/dist/commonjs/combobox/lib/ComboboxMenuList.js +2 -2
  51. package/dist/commonjs/combobox/lib/ComboboxPopper.d.ts +97 -0
  52. package/dist/commonjs/combobox/lib/ComboboxPopper.d.ts.map +1 -0
  53. package/dist/commonjs/{select/lib/SelectOption.js → combobox/lib/ComboboxPopper.js} +12 -8
  54. package/dist/commonjs/combobox/lib/hooks/index.d.ts +10 -0
  55. package/dist/commonjs/combobox/lib/hooks/index.d.ts.map +1 -0
  56. package/dist/commonjs/combobox/lib/hooks/index.js +21 -0
  57. package/dist/commonjs/combobox/lib/hooks/useComboboxInput.d.ts +107 -0
  58. package/dist/commonjs/combobox/lib/hooks/useComboboxInput.d.ts.map +1 -0
  59. package/dist/commonjs/combobox/lib/hooks/useComboboxInput.js +74 -0
  60. package/dist/{es6/combobox/lib → commonjs/combobox/lib/hooks}/useComboboxInputOpenWithArrowKeys.d.ts +6 -6
  61. package/dist/commonjs/combobox/lib/hooks/useComboboxInputOpenWithArrowKeys.d.ts.map +1 -0
  62. package/dist/commonjs/combobox/lib/hooks/useComboboxKeyboardTypeAhead.d.ts +101 -0
  63. package/dist/commonjs/combobox/lib/hooks/useComboboxKeyboardTypeAhead.d.ts.map +1 -0
  64. package/dist/commonjs/combobox/lib/hooks/useComboboxKeyboardTypeAhead.js +109 -0
  65. package/dist/commonjs/combobox/lib/hooks/useComboboxListKeyboardHandler.d.ts +84 -0
  66. package/dist/commonjs/combobox/lib/hooks/useComboboxListKeyboardHandler.d.ts.map +1 -0
  67. package/dist/commonjs/combobox/lib/hooks/useComboboxListKeyboardHandler.js +22 -0
  68. package/dist/commonjs/combobox/lib/hooks/useComboboxLoader.d.ts.map +1 -0
  69. package/dist/commonjs/combobox/lib/{useComboboxModel.d.ts → hooks/useComboboxModel.d.ts} +196 -196
  70. package/dist/commonjs/combobox/lib/hooks/useComboboxModel.d.ts.map +1 -0
  71. package/dist/commonjs/combobox/lib/{useComboboxModel.js → hooks/useComboboxModel.js} +3 -2
  72. package/dist/commonjs/combobox/lib/hooks/useComboboxMoveCursorToSelected.d.ts +82 -0
  73. package/dist/commonjs/combobox/lib/hooks/useComboboxMoveCursorToSelected.d.ts.map +1 -0
  74. package/dist/commonjs/combobox/lib/hooks/useComboboxMoveCursorToSelected.js +33 -0
  75. package/dist/commonjs/combobox/lib/hooks/useComboboxResetCursorToSelected.d.ts +82 -0
  76. package/dist/commonjs/combobox/lib/hooks/useComboboxResetCursorToSelected.d.ts.map +1 -0
  77. package/dist/commonjs/combobox/lib/hooks/useComboboxResetCursorToSelected.js +23 -0
  78. package/dist/commonjs/combobox/lib/hooks/useSetPopupWidth.d.ts +82 -0
  79. package/dist/commonjs/combobox/lib/hooks/useSetPopupWidth.d.ts.map +1 -0
  80. package/dist/commonjs/combobox/lib/hooks/useSetPopupWidth.js +22 -0
  81. package/dist/commonjs/common/lib/utils/components.d.ts.map +1 -1
  82. package/dist/commonjs/common/lib/utils/models.d.ts +4 -4
  83. package/dist/commonjs/common/lib/utils/models.d.ts.map +1 -1
  84. package/dist/commonjs/common/lib/utils/models.js +7 -8
  85. package/dist/commonjs/form-field/lib/FormField.d.ts.map +1 -1
  86. package/dist/commonjs/form-field/lib/FormField.js +3 -2
  87. package/dist/commonjs/menu/lib/MenuPopper.d.ts.map +1 -1
  88. package/dist/commonjs/menu/lib/MenuPopper.js +10 -1
  89. package/dist/commonjs/popup/lib/PopupPopper.d.ts.map +1 -1
  90. package/dist/commonjs/popup/lib/PopupPopper.js +10 -1
  91. package/dist/commonjs/radio/lib/Radio.d.ts.map +1 -1
  92. package/dist/commonjs/radio/lib/Radio.js +17 -22
  93. package/dist/commonjs/select/index.d.ts +1 -1
  94. package/dist/commonjs/select/index.d.ts.map +1 -1
  95. package/dist/commonjs/select/index.js +1 -1
  96. package/dist/commonjs/select/lib/Select.d.ts +2634 -18
  97. package/dist/commonjs/select/lib/Select.d.ts.map +1 -1
  98. package/dist/commonjs/select/lib/Select.js +141 -84
  99. package/dist/commonjs/select/lib/hooks/index.d.ts +4 -0
  100. package/dist/commonjs/select/lib/hooks/index.d.ts.map +1 -0
  101. package/dist/commonjs/select/lib/hooks/index.js +15 -0
  102. package/dist/commonjs/select/lib/hooks/useSelectCard.d.ts +83 -0
  103. package/dist/commonjs/select/lib/hooks/useSelectCard.d.ts.map +1 -0
  104. package/dist/commonjs/select/lib/hooks/useSelectCard.js +13 -0
  105. package/dist/commonjs/select/lib/hooks/useSelectInput.d.ts +112 -0
  106. package/dist/commonjs/select/lib/hooks/useSelectInput.d.ts.map +1 -0
  107. package/dist/commonjs/select/lib/hooks/useSelectInput.js +49 -0
  108. package/dist/commonjs/select/lib/hooks/useSelectModel.d.ts +1779 -0
  109. package/dist/commonjs/select/lib/hooks/useSelectModel.d.ts.map +1 -0
  110. package/dist/commonjs/select/lib/hooks/useSelectModel.js +32 -0
  111. package/dist/commonjs/table/lib/Table.d.ts +1 -2
  112. package/dist/commonjs/table/lib/Table.d.ts.map +1 -1
  113. package/dist/commonjs/table/lib/Table.js +1 -2
  114. package/dist/commonjs/table/lib/TableRow.d.ts +3 -6
  115. package/dist/commonjs/table/lib/TableRow.d.ts.map +1 -1
  116. package/dist/commonjs/table/lib/TableRow.js +3 -5
  117. package/dist/commonjs/text-area/lib/TextArea.d.ts.map +1 -1
  118. package/dist/commonjs/text-area/lib/TextArea.js +1 -1
  119. package/dist/commonjs/text-input/lib/TextInput.js +1 -1
  120. package/dist/commonjs/tokens/lib/space.d.ts +44 -31
  121. package/dist/commonjs/tokens/lib/space.d.ts.map +1 -1
  122. package/dist/commonjs/tokens/lib/space.js +22 -29
  123. package/dist/commonjs/tooltip/lib/TooltipContainer.js +2 -2
  124. package/dist/es6/checkbox/lib/Checkbox.d.ts.map +1 -1
  125. package/dist/es6/checkbox/lib/Checkbox.js +14 -18
  126. package/dist/es6/collection/index.d.ts +1 -0
  127. package/dist/es6/collection/index.d.ts.map +1 -1
  128. package/dist/es6/collection/index.js +1 -0
  129. package/dist/es6/collection/lib/useBaseListModel.d.ts +1 -1
  130. package/dist/es6/collection/lib/useBaseListModel.d.ts.map +1 -1
  131. package/dist/es6/collection/lib/useBaseListModel.js +2 -2
  132. package/dist/es6/collection/lib/useListItemRegister.js +2 -2
  133. package/dist/es6/collection/lib/useListRenderItem.js +2 -2
  134. package/dist/es6/combobox/index.d.ts +1 -4
  135. package/dist/es6/combobox/index.d.ts.map +1 -1
  136. package/dist/es6/combobox/index.js +1 -4
  137. package/dist/es6/combobox/lib/Combobox.d.ts +9 -3
  138. package/dist/es6/combobox/lib/Combobox.d.ts.map +1 -1
  139. package/dist/es6/combobox/lib/Combobox.js +1 -1
  140. package/dist/es6/combobox/lib/ComboboxCard.js +1 -1
  141. package/dist/es6/combobox/lib/ComboboxInput.d.ts +1 -106
  142. package/dist/es6/combobox/lib/ComboboxInput.d.ts.map +1 -1
  143. package/dist/es6/combobox/lib/ComboboxInput.js +2 -69
  144. package/dist/es6/combobox/lib/ComboboxMenu.d.ts +9 -3
  145. package/dist/es6/combobox/lib/ComboboxMenu.d.ts.map +1 -1
  146. package/dist/es6/combobox/lib/ComboboxMenu.js +4 -3
  147. package/dist/es6/combobox/lib/ComboboxMenuItem.d.ts +7 -1
  148. package/dist/es6/combobox/lib/ComboboxMenuItem.d.ts.map +1 -1
  149. package/dist/es6/combobox/lib/ComboboxMenuItem.js +7 -7
  150. package/dist/es6/combobox/lib/ComboboxMenuList.js +1 -1
  151. package/dist/es6/combobox/lib/ComboboxPopper.d.ts +97 -0
  152. package/dist/es6/combobox/lib/ComboboxPopper.d.ts.map +1 -0
  153. package/dist/es6/combobox/lib/ComboboxPopper.js +12 -0
  154. package/dist/es6/combobox/lib/hooks/index.d.ts +10 -0
  155. package/dist/es6/combobox/lib/hooks/index.d.ts.map +1 -0
  156. package/dist/es6/combobox/lib/hooks/index.js +9 -0
  157. package/dist/es6/combobox/lib/hooks/useComboboxInput.d.ts +107 -0
  158. package/dist/es6/combobox/lib/hooks/useComboboxInput.d.ts.map +1 -0
  159. package/dist/es6/combobox/lib/hooks/useComboboxInput.js +68 -0
  160. package/dist/{commonjs/combobox/lib → es6/combobox/lib/hooks}/useComboboxInputOpenWithArrowKeys.d.ts +6 -6
  161. package/dist/es6/combobox/lib/hooks/useComboboxInputOpenWithArrowKeys.d.ts.map +1 -0
  162. package/dist/es6/combobox/lib/hooks/useComboboxKeyboardTypeAhead.d.ts +101 -0
  163. package/dist/es6/combobox/lib/hooks/useComboboxKeyboardTypeAhead.d.ts.map +1 -0
  164. package/dist/es6/combobox/lib/hooks/useComboboxKeyboardTypeAhead.js +103 -0
  165. package/dist/es6/combobox/lib/hooks/useComboboxListKeyboardHandler.d.ts +84 -0
  166. package/dist/es6/combobox/lib/hooks/useComboboxListKeyboardHandler.d.ts.map +1 -0
  167. package/dist/es6/combobox/lib/hooks/useComboboxListKeyboardHandler.js +19 -0
  168. package/dist/es6/combobox/lib/hooks/useComboboxLoader.d.ts.map +1 -0
  169. package/dist/es6/combobox/lib/{useComboboxModel.d.ts → hooks/useComboboxModel.d.ts} +196 -196
  170. package/dist/es6/combobox/lib/hooks/useComboboxModel.d.ts.map +1 -0
  171. package/dist/es6/combobox/lib/{useComboboxModel.js → hooks/useComboboxModel.js} +3 -2
  172. package/dist/es6/combobox/lib/hooks/useComboboxMoveCursorToSelected.d.ts +82 -0
  173. package/dist/es6/combobox/lib/hooks/useComboboxMoveCursorToSelected.d.ts.map +1 -0
  174. package/dist/es6/combobox/lib/hooks/useComboboxMoveCursorToSelected.js +27 -0
  175. package/dist/es6/combobox/lib/hooks/useComboboxResetCursorToSelected.d.ts +82 -0
  176. package/dist/es6/combobox/lib/hooks/useComboboxResetCursorToSelected.d.ts.map +1 -0
  177. package/dist/es6/combobox/lib/hooks/useComboboxResetCursorToSelected.js +17 -0
  178. package/dist/es6/combobox/lib/hooks/useSetPopupWidth.d.ts +82 -0
  179. package/dist/es6/combobox/lib/hooks/useSetPopupWidth.d.ts.map +1 -0
  180. package/dist/es6/combobox/lib/hooks/useSetPopupWidth.js +16 -0
  181. package/dist/es6/common/lib/utils/components.d.ts.map +1 -1
  182. package/dist/es6/common/lib/utils/models.d.ts +4 -4
  183. package/dist/es6/common/lib/utils/models.d.ts.map +1 -1
  184. package/dist/es6/common/lib/utils/models.js +7 -8
  185. package/dist/es6/form-field/lib/FormField.d.ts.map +1 -1
  186. package/dist/es6/form-field/lib/FormField.js +3 -2
  187. package/dist/es6/menu/lib/MenuPopper.d.ts.map +1 -1
  188. package/dist/es6/menu/lib/MenuPopper.js +10 -1
  189. package/dist/es6/popup/lib/PopupPopper.d.ts.map +1 -1
  190. package/dist/es6/popup/lib/PopupPopper.js +10 -1
  191. package/dist/es6/radio/lib/Radio.d.ts.map +1 -1
  192. package/dist/es6/radio/lib/Radio.js +18 -23
  193. package/dist/es6/select/index.d.ts +1 -1
  194. package/dist/es6/select/index.d.ts.map +1 -1
  195. package/dist/es6/select/index.js +1 -1
  196. package/dist/es6/select/lib/Select.d.ts +2634 -18
  197. package/dist/es6/select/lib/Select.d.ts.map +1 -1
  198. package/dist/es6/select/lib/Select.js +139 -66
  199. package/dist/es6/select/lib/hooks/index.d.ts +4 -0
  200. package/dist/es6/select/lib/hooks/index.d.ts.map +1 -0
  201. package/dist/es6/select/lib/hooks/index.js +3 -0
  202. package/dist/es6/select/lib/hooks/useSelectCard.d.ts +83 -0
  203. package/dist/es6/select/lib/hooks/useSelectCard.d.ts.map +1 -0
  204. package/dist/es6/select/lib/hooks/useSelectCard.js +10 -0
  205. package/dist/es6/select/lib/hooks/useSelectInput.d.ts +112 -0
  206. package/dist/es6/select/lib/hooks/useSelectInput.d.ts.map +1 -0
  207. package/dist/es6/select/lib/hooks/useSelectInput.js +46 -0
  208. package/dist/es6/select/lib/hooks/useSelectModel.d.ts +1779 -0
  209. package/dist/es6/select/lib/hooks/useSelectModel.d.ts.map +1 -0
  210. package/dist/es6/select/lib/hooks/useSelectModel.js +29 -0
  211. package/dist/es6/table/lib/Table.d.ts +1 -2
  212. package/dist/es6/table/lib/Table.d.ts.map +1 -1
  213. package/dist/es6/table/lib/Table.js +1 -2
  214. package/dist/es6/table/lib/TableRow.d.ts +3 -6
  215. package/dist/es6/table/lib/TableRow.d.ts.map +1 -1
  216. package/dist/es6/table/lib/TableRow.js +4 -6
  217. package/dist/es6/text-area/lib/TextArea.d.ts.map +1 -1
  218. package/dist/es6/text-area/lib/TextArea.js +2 -2
  219. package/dist/es6/text-input/lib/TextInput.js +2 -2
  220. package/dist/es6/tokens/lib/space.d.ts +44 -31
  221. package/dist/es6/tokens/lib/space.d.ts.map +1 -1
  222. package/dist/es6/tokens/lib/space.js +22 -29
  223. package/dist/es6/tooltip/lib/TooltipContainer.js +3 -3
  224. package/form-field/lib/FormField.tsx +8 -2
  225. package/menu/lib/MenuPopper.tsx +14 -1
  226. package/package.json +4 -4
  227. package/popup/lib/Popper.tsx +1 -1
  228. package/popup/lib/PopupPopper.tsx +17 -1
  229. package/radio/lib/Radio.tsx +18 -34
  230. package/select/index.ts +1 -1
  231. package/select/lib/Select.tsx +175 -111
  232. package/select/lib/hooks/index.ts +3 -0
  233. package/select/lib/hooks/useSelectCard.ts +11 -0
  234. package/select/lib/hooks/useSelectInput.ts +74 -0
  235. package/select/lib/hooks/useSelectModel.tsx +30 -0
  236. package/table/lib/Table.tsx +1 -2
  237. package/table/lib/TableRow.tsx +5 -8
  238. package/text-area/lib/TextArea.tsx +2 -8
  239. package/text-input/lib/TextInput.tsx +2 -2
  240. package/tokens/README.md +25 -28
  241. package/tokens/lib/space.ts +53 -40
  242. package/tooltip/lib/TooltipContainer.tsx +3 -3
  243. package/dist/commonjs/combobox/lib/useComboboxInputOpenWithArrowKeys.d.ts.map +0 -1
  244. package/dist/commonjs/combobox/lib/useComboboxLoader.d.ts.map +0 -1
  245. package/dist/commonjs/combobox/lib/useComboboxModel.d.ts.map +0 -1
  246. package/dist/commonjs/select/lib/SelectOption.d.ts +0 -20
  247. package/dist/commonjs/select/lib/SelectOption.d.ts.map +0 -1
  248. package/dist/es6/combobox/lib/useComboboxInputOpenWithArrowKeys.d.ts.map +0 -1
  249. package/dist/es6/combobox/lib/useComboboxLoader.d.ts.map +0 -1
  250. package/dist/es6/combobox/lib/useComboboxModel.d.ts.map +0 -1
  251. package/dist/es6/select/lib/SelectOption.d.ts +0 -20
  252. package/dist/es6/select/lib/SelectOption.d.ts.map +0 -1
  253. package/dist/es6/select/lib/SelectOption.js +0 -7
  254. package/select/lib/SelectOption.tsx +0 -33
  255. /package/combobox/lib/{useComboboxInputOpenWithArrowKeys.ts → hooks/useComboboxInputOpenWithArrowKeys.ts} +0 -0
  256. /package/combobox/lib/{useComboboxLoader.ts → hooks/useComboboxLoader.ts} +0 -0
  257. /package/dist/commonjs/combobox/lib/{useComboboxInputOpenWithArrowKeys.js → hooks/useComboboxInputOpenWithArrowKeys.js} +0 -0
  258. /package/dist/commonjs/combobox/lib/{useComboboxLoader.d.ts → hooks/useComboboxLoader.d.ts} +0 -0
  259. /package/dist/commonjs/combobox/lib/{useComboboxLoader.js → hooks/useComboboxLoader.js} +0 -0
  260. /package/dist/es6/combobox/lib/{useComboboxInputOpenWithArrowKeys.js → hooks/useComboboxInputOpenWithArrowKeys.js} +0 -0
  261. /package/dist/es6/combobox/lib/{useComboboxLoader.d.ts → hooks/useComboboxLoader.d.ts} +0 -0
  262. /package/dist/es6/combobox/lib/{useComboboxLoader.js → hooks/useComboboxLoader.js} +0 -0
@@ -0,0 +1,127 @@
1
+ import React from 'react';
2
+ import {createElemPropsHook} from '@workday/canvas-kit-react/common';
3
+ import {useComboboxModel} from './useComboboxModel';
4
+
5
+ /**
6
+ * `useComboboxKeyboardTypeAhead` handles type-ahead. It will try and find a matching item in the list. It also returns the keys types so far.
7
+ * This hook is best used when composing hooks and in conjunction with `useComboboxInput`.
8
+ *
9
+ * ```tsx
10
+ * // Example for a `Select` input
11
+ * export const useSelectInput = composeHooks(
12
+ * createElemPropsHook(useComboboxModel)((model, ref, elemProps: {keySofar?: string} = {}) => {
13
+ * return {
14
+ * onKeyDown(event: React.KeyboardEvent) {
15
+ * // onKeyDown logic ...
16
+ * },
17
+ * } as const;
18
+ * }),
19
+ * useComboboxKeyboardTypeAhead,
20
+ * useComboboxInput
21
+ * );
22
+ * ```
23
+ */
24
+ export const useComboboxKeyboardTypeAhead = createElemPropsHook(useComboboxModel)(model => {
25
+ const keySofar = React.useRef('');
26
+ const timer = React.useRef<ReturnType<typeof setTimeout>>();
27
+ const [keyTypedSofar, setKeyTypedSofar] = React.useState(keySofar.current);
28
+
29
+ const startClearKeysSoFarTimer = () => {
30
+ if (timer.current) {
31
+ clearTimeout(timer.current);
32
+ }
33
+ timer.current = setTimeout(() => {
34
+ keySofar.current = '';
35
+ setKeyTypedSofar(keySofar.current);
36
+ }, 500);
37
+ };
38
+
39
+ // Based on the the key typed, this will try and find an index in the array where it matches the string
40
+ // so if a user types `de` it will try and find an index in the array whose id matches `de` like denver
41
+ const getIndexByStartString = (
42
+ startIndex: number,
43
+ startString: string,
44
+ endIndex: number = model.state.items.length,
45
+ ignoreDisabled: boolean = true
46
+ ): number => {
47
+ for (let i = startIndex; i < endIndex; i++) {
48
+ const label = model.state.items[i].textValue.toLowerCase();
49
+ if (
50
+ label.startsWith(startString.toLowerCase()) &&
51
+ (!ignoreDisabled ||
52
+ (ignoreDisabled && !model.state.nonInteractiveIds.includes(model.state.items[i].id)))
53
+ ) {
54
+ return i;
55
+ }
56
+ }
57
+ return -1;
58
+ };
59
+
60
+ const currentItem = model.navigation.getItem(model.state.cursorId, model);
61
+ const cursorFocusedIndex = currentItem.index;
62
+
63
+ const handleKeyboardTypeAhead = (key: string, numOptions: number) => {
64
+ // If the starting point is beyond the list of options, reset it
65
+ // to the beginning of the list
66
+ const startNumber = keySofar.current.length === 0 ? cursorFocusedIndex + 1 : cursorFocusedIndex;
67
+
68
+ const start = startNumber === numOptions ? 0 : startNumber;
69
+
70
+ // Keeps track of the current key types and adds to it
71
+ // if you type `de` vs `d` for denver
72
+ keySofar.current += key;
73
+ setKeyTypedSofar(keySofar.current);
74
+ startClearKeysSoFarTimer();
75
+
76
+ // First, look for a match from start to end
77
+ let matchIndex = getIndexByStartString(start, keySofar.current);
78
+ getIndexByStartString(start, keySofar.current);
79
+
80
+ // If a match isn't found between start and end, wrap the search
81
+ // around and search again from the beginning (0) to start
82
+ if (matchIndex === -1) {
83
+ matchIndex = getIndexByStartString(0, keySofar.current, start);
84
+ }
85
+
86
+ // A match was found...
87
+ if (matchIndex > -1) {
88
+ model.events.goTo({id: model.state.items[matchIndex].id});
89
+ if (model.state.visibility === 'hidden') {
90
+ // If the menu is closed, fire the change event
91
+ // go to that item and select based on its id
92
+ model.events.select({id: model.state.items[matchIndex].id});
93
+ }
94
+ }
95
+ };
96
+
97
+ return {
98
+ onKeyDown(event: React.KeyboardEvent) {
99
+ // Call type ahead excluding backspace
100
+ if (event.key.length === 1 && event.key.match(/\S/)) {
101
+ handleKeyboardTypeAhead(event.key, model.state.items.length);
102
+ }
103
+
104
+ // If spacebar is typed
105
+ if (
106
+ (event.key === 'Spacebar' || event.key === ' ') &&
107
+ model.state.visibility === 'visible' &&
108
+ keySofar.current !== ''
109
+ ) {
110
+ // If the user is in the middle of typing a string, treat
111
+ // space key as type-ahead rather than option selection
112
+ handleKeyboardTypeAhead(' ', model.state.items.length);
113
+ }
114
+
115
+ if (
116
+ (event.key === 'Spacebar' || event.key === ' ') &&
117
+ model.state.visibility === 'hidden' &&
118
+ keySofar.current !== ''
119
+ ) {
120
+ // If the user is in the middle of typing a string, treat
121
+ // space key as type-ahead rather than option selection
122
+ handleKeyboardTypeAhead(' ', model.state.items.length);
123
+ }
124
+ },
125
+ keySofar: keyTypedSofar,
126
+ };
127
+ });
@@ -0,0 +1,23 @@
1
+ import React from 'react';
2
+ import {createElemPropsHook, useIsRTL} from '@workday/canvas-kit-react/common';
3
+ import {keyboardEventToCursorEvents} from '@workday/canvas-kit-react/collection';
4
+
5
+ import {useComboboxModel} from './index';
6
+
7
+ /**
8
+ * `useComboboxListKeyboardHandler` handle calling keyboard events like ArrowUp and ArrowDown only when the menu is visible.
9
+ */
10
+ export const useComboboxListKeyboardHandler = createElemPropsHook(useComboboxModel)(model => {
11
+ const isRTL = useIsRTL();
12
+
13
+ return {
14
+ onKeyDown(event: React.KeyboardEvent) {
15
+ if (model.state.visibility === 'visible') {
16
+ const handled = keyboardEventToCursorEvents(event, model, isRTL);
17
+ if (handled) {
18
+ event.preventDefault();
19
+ }
20
+ }
21
+ },
22
+ };
23
+ });
@@ -43,21 +43,25 @@ export const useComboboxModel = createModelHook({
43
43
  defaultConfig: {
44
44
  ...useInputModel.defaultConfig,
45
45
  ...useMenuModel.defaultConfig,
46
+ shouldVirtualize: true,
46
47
  },
48
+
47
49
  requiredConfig: {
48
50
  ...useInputModel.requiredConfig,
49
51
  ...useMenuModel.requiredConfig,
50
52
  },
51
53
  })(config => {
52
54
  const input = useInputModel(config);
55
+
53
56
  const menu = useMenuModel(
54
57
  useMenuModel.mergeConfig(config, {
55
- shouldVirtualize: true,
56
58
  onSelect({id}) {
57
- dispatchInputEvent(menu.state.targetRef.current, id);
59
+ const textValue = menu.navigation.getItem(id, menu).textValue || id;
60
+ dispatchInputEvent(menu.state.targetRef.current, textValue);
58
61
  },
59
62
  })
60
63
  );
64
+
61
65
  const [width, setWidth] = React.useState(0);
62
66
 
63
67
  const state = {
@@ -0,0 +1,27 @@
1
+ import React from 'react';
2
+ import {createElemPropsHook} from '@workday/canvas-kit-react/common';
3
+ import {useComboboxModel} from './useComboboxModel';
4
+
5
+ /**
6
+ * If there is nothing selected, move cursor to the first item, otherwise, move the cursor to the selected item
7
+ */
8
+ export const useComboboxMoveCursorToSelected = createElemPropsHook(useComboboxModel)(model => {
9
+ React.useLayoutEffect(() => {
10
+ const cursorItemId = model.state.items.find(item => item.id === model.state.cursorId)?.id;
11
+ // If there is no selected item and items exists we want to set the cursor to the first item in the array
12
+ if (!model.state.selectedIds.length && model.state.items.length && !cursorItemId) {
13
+ model.events.goTo({id: model.state.items[0].id});
14
+ } else if (model.state.selectedIds.length && !cursorItemId) {
15
+ // If the user wants an item selected by default by passing `initialSelectedId` we select that item
16
+ model.events.goTo({id: model.state.selectedIds[0]});
17
+ }
18
+ }, [
19
+ model.state.selectedIds,
20
+ model.events,
21
+ model.state.items,
22
+ model.state.cursorId,
23
+ model.state.visibility,
24
+ ]);
25
+
26
+ return {};
27
+ });
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ import {createElemPropsHook} from '@workday/canvas-kit-react/common';
3
+ import {useComboboxModel} from './useComboboxModel';
4
+
5
+ /**
6
+ * Reset the cursor to the selected item when the Menu is closed
7
+ */
8
+ export const useComboboxResetCursorToSelected = createElemPropsHook(useComboboxModel)(model => {
9
+ const visible = model.state.visibility !== 'hidden';
10
+ React.useEffect(() => {
11
+ // when closed, the cursor should reset to the selected item if something is selected
12
+ if (!visible && model.state.selectedIds.length) {
13
+ model.events.goTo({id: model.state.selectedIds[0]});
14
+ }
15
+ // eslint-disable-next-line react-hooks/exhaustive-deps
16
+ }, [visible, model.events, model.state.selectedIds]);
17
+ return {};
18
+ });
@@ -0,0 +1,16 @@
1
+ import React from 'react';
2
+ import {createElemPropsHook} from '@workday/canvas-kit-react/common';
3
+ import {useComboboxModel} from './useComboboxModel';
4
+
5
+ /**
6
+ * Sets the width of the Menu to the target element when the menu is visible
7
+ */
8
+ export const useSetPopupWidth = createElemPropsHook(useComboboxModel)(model => {
9
+ const visible = model.state.visibility !== 'hidden';
10
+ React.useLayoutEffect(() => {
11
+ if (visible) {
12
+ model.events.setWidth(model.state.targetRef.current?.clientWidth || 0);
13
+ }
14
+ }, [visible, model.events, model.state.targetRef]);
15
+ return {};
16
+ });