@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.
- package/checkbox/lib/Checkbox.tsx +24 -33
- package/collection/index.ts +1 -0
- package/collection/lib/useBaseListModel.tsx +3 -3
- package/collection/lib/useListItemRegister.tsx +1 -1
- package/collection/lib/useListRenderItem.tsx +2 -2
- package/combobox/index.ts +11 -4
- package/combobox/lib/Combobox.tsx +1 -1
- package/combobox/lib/ComboboxCard.tsx +1 -1
- package/combobox/lib/ComboboxInput.tsx +2 -90
- package/combobox/lib/ComboboxMenu.tsx +4 -3
- package/combobox/lib/ComboboxMenuItem.tsx +9 -8
- package/combobox/lib/ComboboxMenuList.tsx +1 -1
- package/combobox/lib/ComboboxPopper.tsx +20 -0
- package/combobox/lib/hooks/index.ts +9 -0
- package/combobox/lib/hooks/useComboboxInput.ts +88 -0
- package/combobox/lib/hooks/useComboboxKeyboardTypeAhead.ts +127 -0
- package/combobox/lib/hooks/useComboboxListKeyboardHandler.ts +23 -0
- package/combobox/lib/{useComboboxModel.tsx → hooks/useComboboxModel.tsx} +6 -2
- package/combobox/lib/hooks/useComboboxMoveCursorToSelected.tsx +27 -0
- package/combobox/lib/hooks/useComboboxResetCursorToSelected.tsx +18 -0
- package/combobox/lib/hooks/useSetPopupWidth.ts +16 -0
- package/common/lib/utils/components.ts +284 -274
- package/common/lib/utils/models.ts +67 -84
- package/dist/commonjs/checkbox/lib/Checkbox.d.ts.map +1 -1
- package/dist/commonjs/checkbox/lib/Checkbox.js +13 -17
- package/dist/commonjs/collection/index.d.ts +1 -0
- package/dist/commonjs/collection/index.d.ts.map +1 -1
- package/dist/commonjs/collection/index.js +3 -1
- package/dist/commonjs/collection/lib/useBaseListModel.d.ts +1 -1
- package/dist/commonjs/collection/lib/useBaseListModel.d.ts.map +1 -1
- package/dist/commonjs/collection/lib/useBaseListModel.js +2 -2
- package/dist/commonjs/collection/lib/useListItemRegister.js +2 -2
- package/dist/commonjs/collection/lib/useListRenderItem.js +2 -2
- package/dist/commonjs/combobox/index.d.ts +1 -4
- package/dist/commonjs/combobox/index.d.ts.map +1 -1
- package/dist/commonjs/combobox/index.js +11 -9
- package/dist/commonjs/combobox/lib/Combobox.d.ts +9 -3
- package/dist/commonjs/combobox/lib/Combobox.d.ts.map +1 -1
- package/dist/commonjs/combobox/lib/Combobox.js +2 -2
- package/dist/commonjs/combobox/lib/ComboboxCard.js +3 -3
- package/dist/commonjs/combobox/lib/ComboboxInput.d.ts +1 -106
- package/dist/commonjs/combobox/lib/ComboboxInput.d.ts.map +1 -1
- package/dist/commonjs/combobox/lib/ComboboxInput.js +4 -71
- package/dist/commonjs/combobox/lib/ComboboxMenu.d.ts +9 -3
- package/dist/commonjs/combobox/lib/ComboboxMenu.d.ts.map +1 -1
- package/dist/commonjs/combobox/lib/ComboboxMenu.js +5 -4
- package/dist/commonjs/combobox/lib/ComboboxMenuItem.d.ts +7 -1
- package/dist/commonjs/combobox/lib/ComboboxMenuItem.d.ts.map +1 -1
- package/dist/commonjs/combobox/lib/ComboboxMenuItem.js +7 -7
- package/dist/commonjs/combobox/lib/ComboboxMenuList.js +2 -2
- package/dist/commonjs/combobox/lib/ComboboxPopper.d.ts +97 -0
- package/dist/commonjs/combobox/lib/ComboboxPopper.d.ts.map +1 -0
- package/dist/commonjs/{select/lib/SelectOption.js → combobox/lib/ComboboxPopper.js} +12 -8
- package/dist/commonjs/combobox/lib/hooks/index.d.ts +10 -0
- package/dist/commonjs/combobox/lib/hooks/index.d.ts.map +1 -0
- package/dist/commonjs/combobox/lib/hooks/index.js +21 -0
- package/dist/commonjs/combobox/lib/hooks/useComboboxInput.d.ts +107 -0
- package/dist/commonjs/combobox/lib/hooks/useComboboxInput.d.ts.map +1 -0
- package/dist/commonjs/combobox/lib/hooks/useComboboxInput.js +74 -0
- package/dist/{es6/combobox/lib → commonjs/combobox/lib/hooks}/useComboboxInputOpenWithArrowKeys.d.ts +6 -6
- package/dist/commonjs/combobox/lib/hooks/useComboboxInputOpenWithArrowKeys.d.ts.map +1 -0
- package/dist/commonjs/combobox/lib/hooks/useComboboxKeyboardTypeAhead.d.ts +101 -0
- package/dist/commonjs/combobox/lib/hooks/useComboboxKeyboardTypeAhead.d.ts.map +1 -0
- package/dist/commonjs/combobox/lib/hooks/useComboboxKeyboardTypeAhead.js +109 -0
- package/dist/commonjs/combobox/lib/hooks/useComboboxListKeyboardHandler.d.ts +84 -0
- package/dist/commonjs/combobox/lib/hooks/useComboboxListKeyboardHandler.d.ts.map +1 -0
- package/dist/commonjs/combobox/lib/hooks/useComboboxListKeyboardHandler.js +22 -0
- package/dist/commonjs/combobox/lib/hooks/useComboboxLoader.d.ts.map +1 -0
- package/dist/commonjs/combobox/lib/{useComboboxModel.d.ts → hooks/useComboboxModel.d.ts} +196 -196
- package/dist/commonjs/combobox/lib/hooks/useComboboxModel.d.ts.map +1 -0
- package/dist/commonjs/combobox/lib/{useComboboxModel.js → hooks/useComboboxModel.js} +3 -2
- package/dist/commonjs/combobox/lib/hooks/useComboboxMoveCursorToSelected.d.ts +82 -0
- package/dist/commonjs/combobox/lib/hooks/useComboboxMoveCursorToSelected.d.ts.map +1 -0
- package/dist/commonjs/combobox/lib/hooks/useComboboxMoveCursorToSelected.js +33 -0
- package/dist/commonjs/combobox/lib/hooks/useComboboxResetCursorToSelected.d.ts +82 -0
- package/dist/commonjs/combobox/lib/hooks/useComboboxResetCursorToSelected.d.ts.map +1 -0
- package/dist/commonjs/combobox/lib/hooks/useComboboxResetCursorToSelected.js +23 -0
- package/dist/commonjs/combobox/lib/hooks/useSetPopupWidth.d.ts +82 -0
- package/dist/commonjs/combobox/lib/hooks/useSetPopupWidth.d.ts.map +1 -0
- package/dist/commonjs/combobox/lib/hooks/useSetPopupWidth.js +22 -0
- package/dist/commonjs/common/lib/utils/components.d.ts.map +1 -1
- package/dist/commonjs/common/lib/utils/models.d.ts +4 -4
- package/dist/commonjs/common/lib/utils/models.d.ts.map +1 -1
- package/dist/commonjs/common/lib/utils/models.js +7 -8
- package/dist/commonjs/form-field/lib/FormField.d.ts.map +1 -1
- package/dist/commonjs/form-field/lib/FormField.js +3 -2
- package/dist/commonjs/menu/lib/MenuPopper.d.ts.map +1 -1
- package/dist/commonjs/menu/lib/MenuPopper.js +10 -1
- package/dist/commonjs/popup/lib/PopupPopper.d.ts.map +1 -1
- package/dist/commonjs/popup/lib/PopupPopper.js +10 -1
- package/dist/commonjs/radio/lib/Radio.d.ts.map +1 -1
- package/dist/commonjs/radio/lib/Radio.js +17 -22
- package/dist/commonjs/select/index.d.ts +1 -1
- package/dist/commonjs/select/index.d.ts.map +1 -1
- package/dist/commonjs/select/index.js +1 -1
- package/dist/commonjs/select/lib/Select.d.ts +2634 -18
- package/dist/commonjs/select/lib/Select.d.ts.map +1 -1
- package/dist/commonjs/select/lib/Select.js +141 -84
- package/dist/commonjs/select/lib/hooks/index.d.ts +4 -0
- package/dist/commonjs/select/lib/hooks/index.d.ts.map +1 -0
- package/dist/commonjs/select/lib/hooks/index.js +15 -0
- package/dist/commonjs/select/lib/hooks/useSelectCard.d.ts +83 -0
- package/dist/commonjs/select/lib/hooks/useSelectCard.d.ts.map +1 -0
- package/dist/commonjs/select/lib/hooks/useSelectCard.js +13 -0
- package/dist/commonjs/select/lib/hooks/useSelectInput.d.ts +112 -0
- package/dist/commonjs/select/lib/hooks/useSelectInput.d.ts.map +1 -0
- package/dist/commonjs/select/lib/hooks/useSelectInput.js +49 -0
- package/dist/commonjs/select/lib/hooks/useSelectModel.d.ts +1779 -0
- package/dist/commonjs/select/lib/hooks/useSelectModel.d.ts.map +1 -0
- package/dist/commonjs/select/lib/hooks/useSelectModel.js +32 -0
- package/dist/commonjs/table/lib/Table.d.ts +1 -2
- package/dist/commonjs/table/lib/Table.d.ts.map +1 -1
- package/dist/commonjs/table/lib/Table.js +1 -2
- package/dist/commonjs/table/lib/TableRow.d.ts +3 -6
- package/dist/commonjs/table/lib/TableRow.d.ts.map +1 -1
- package/dist/commonjs/table/lib/TableRow.js +3 -5
- package/dist/commonjs/text-area/lib/TextArea.d.ts.map +1 -1
- package/dist/commonjs/text-area/lib/TextArea.js +1 -1
- package/dist/commonjs/text-input/lib/TextInput.js +1 -1
- package/dist/commonjs/tokens/lib/space.d.ts +44 -31
- package/dist/commonjs/tokens/lib/space.d.ts.map +1 -1
- package/dist/commonjs/tokens/lib/space.js +22 -29
- package/dist/commonjs/tooltip/lib/TooltipContainer.js +2 -2
- package/dist/es6/checkbox/lib/Checkbox.d.ts.map +1 -1
- package/dist/es6/checkbox/lib/Checkbox.js +14 -18
- package/dist/es6/collection/index.d.ts +1 -0
- package/dist/es6/collection/index.d.ts.map +1 -1
- package/dist/es6/collection/index.js +1 -0
- package/dist/es6/collection/lib/useBaseListModel.d.ts +1 -1
- package/dist/es6/collection/lib/useBaseListModel.d.ts.map +1 -1
- package/dist/es6/collection/lib/useBaseListModel.js +2 -2
- package/dist/es6/collection/lib/useListItemRegister.js +2 -2
- package/dist/es6/collection/lib/useListRenderItem.js +2 -2
- package/dist/es6/combobox/index.d.ts +1 -4
- package/dist/es6/combobox/index.d.ts.map +1 -1
- package/dist/es6/combobox/index.js +1 -4
- package/dist/es6/combobox/lib/Combobox.d.ts +9 -3
- package/dist/es6/combobox/lib/Combobox.d.ts.map +1 -1
- package/dist/es6/combobox/lib/Combobox.js +1 -1
- package/dist/es6/combobox/lib/ComboboxCard.js +1 -1
- package/dist/es6/combobox/lib/ComboboxInput.d.ts +1 -106
- package/dist/es6/combobox/lib/ComboboxInput.d.ts.map +1 -1
- package/dist/es6/combobox/lib/ComboboxInput.js +2 -69
- package/dist/es6/combobox/lib/ComboboxMenu.d.ts +9 -3
- package/dist/es6/combobox/lib/ComboboxMenu.d.ts.map +1 -1
- package/dist/es6/combobox/lib/ComboboxMenu.js +4 -3
- package/dist/es6/combobox/lib/ComboboxMenuItem.d.ts +7 -1
- package/dist/es6/combobox/lib/ComboboxMenuItem.d.ts.map +1 -1
- package/dist/es6/combobox/lib/ComboboxMenuItem.js +7 -7
- package/dist/es6/combobox/lib/ComboboxMenuList.js +1 -1
- package/dist/es6/combobox/lib/ComboboxPopper.d.ts +97 -0
- package/dist/es6/combobox/lib/ComboboxPopper.d.ts.map +1 -0
- package/dist/es6/combobox/lib/ComboboxPopper.js +12 -0
- package/dist/es6/combobox/lib/hooks/index.d.ts +10 -0
- package/dist/es6/combobox/lib/hooks/index.d.ts.map +1 -0
- package/dist/es6/combobox/lib/hooks/index.js +9 -0
- package/dist/es6/combobox/lib/hooks/useComboboxInput.d.ts +107 -0
- package/dist/es6/combobox/lib/hooks/useComboboxInput.d.ts.map +1 -0
- package/dist/es6/combobox/lib/hooks/useComboboxInput.js +68 -0
- package/dist/{commonjs/combobox/lib → es6/combobox/lib/hooks}/useComboboxInputOpenWithArrowKeys.d.ts +6 -6
- package/dist/es6/combobox/lib/hooks/useComboboxInputOpenWithArrowKeys.d.ts.map +1 -0
- package/dist/es6/combobox/lib/hooks/useComboboxKeyboardTypeAhead.d.ts +101 -0
- package/dist/es6/combobox/lib/hooks/useComboboxKeyboardTypeAhead.d.ts.map +1 -0
- package/dist/es6/combobox/lib/hooks/useComboboxKeyboardTypeAhead.js +103 -0
- package/dist/es6/combobox/lib/hooks/useComboboxListKeyboardHandler.d.ts +84 -0
- package/dist/es6/combobox/lib/hooks/useComboboxListKeyboardHandler.d.ts.map +1 -0
- package/dist/es6/combobox/lib/hooks/useComboboxListKeyboardHandler.js +19 -0
- package/dist/es6/combobox/lib/hooks/useComboboxLoader.d.ts.map +1 -0
- package/dist/es6/combobox/lib/{useComboboxModel.d.ts → hooks/useComboboxModel.d.ts} +196 -196
- package/dist/es6/combobox/lib/hooks/useComboboxModel.d.ts.map +1 -0
- package/dist/es6/combobox/lib/{useComboboxModel.js → hooks/useComboboxModel.js} +3 -2
- package/dist/es6/combobox/lib/hooks/useComboboxMoveCursorToSelected.d.ts +82 -0
- package/dist/es6/combobox/lib/hooks/useComboboxMoveCursorToSelected.d.ts.map +1 -0
- package/dist/es6/combobox/lib/hooks/useComboboxMoveCursorToSelected.js +27 -0
- package/dist/es6/combobox/lib/hooks/useComboboxResetCursorToSelected.d.ts +82 -0
- package/dist/es6/combobox/lib/hooks/useComboboxResetCursorToSelected.d.ts.map +1 -0
- package/dist/es6/combobox/lib/hooks/useComboboxResetCursorToSelected.js +17 -0
- package/dist/es6/combobox/lib/hooks/useSetPopupWidth.d.ts +82 -0
- package/dist/es6/combobox/lib/hooks/useSetPopupWidth.d.ts.map +1 -0
- package/dist/es6/combobox/lib/hooks/useSetPopupWidth.js +16 -0
- package/dist/es6/common/lib/utils/components.d.ts.map +1 -1
- package/dist/es6/common/lib/utils/models.d.ts +4 -4
- package/dist/es6/common/lib/utils/models.d.ts.map +1 -1
- package/dist/es6/common/lib/utils/models.js +7 -8
- package/dist/es6/form-field/lib/FormField.d.ts.map +1 -1
- package/dist/es6/form-field/lib/FormField.js +3 -2
- package/dist/es6/menu/lib/MenuPopper.d.ts.map +1 -1
- package/dist/es6/menu/lib/MenuPopper.js +10 -1
- package/dist/es6/popup/lib/PopupPopper.d.ts.map +1 -1
- package/dist/es6/popup/lib/PopupPopper.js +10 -1
- package/dist/es6/radio/lib/Radio.d.ts.map +1 -1
- package/dist/es6/radio/lib/Radio.js +18 -23
- package/dist/es6/select/index.d.ts +1 -1
- package/dist/es6/select/index.d.ts.map +1 -1
- package/dist/es6/select/index.js +1 -1
- package/dist/es6/select/lib/Select.d.ts +2634 -18
- package/dist/es6/select/lib/Select.d.ts.map +1 -1
- package/dist/es6/select/lib/Select.js +139 -66
- package/dist/es6/select/lib/hooks/index.d.ts +4 -0
- package/dist/es6/select/lib/hooks/index.d.ts.map +1 -0
- package/dist/es6/select/lib/hooks/index.js +3 -0
- package/dist/es6/select/lib/hooks/useSelectCard.d.ts +83 -0
- package/dist/es6/select/lib/hooks/useSelectCard.d.ts.map +1 -0
- package/dist/es6/select/lib/hooks/useSelectCard.js +10 -0
- package/dist/es6/select/lib/hooks/useSelectInput.d.ts +112 -0
- package/dist/es6/select/lib/hooks/useSelectInput.d.ts.map +1 -0
- package/dist/es6/select/lib/hooks/useSelectInput.js +46 -0
- package/dist/es6/select/lib/hooks/useSelectModel.d.ts +1779 -0
- package/dist/es6/select/lib/hooks/useSelectModel.d.ts.map +1 -0
- package/dist/es6/select/lib/hooks/useSelectModel.js +29 -0
- package/dist/es6/table/lib/Table.d.ts +1 -2
- package/dist/es6/table/lib/Table.d.ts.map +1 -1
- package/dist/es6/table/lib/Table.js +1 -2
- package/dist/es6/table/lib/TableRow.d.ts +3 -6
- package/dist/es6/table/lib/TableRow.d.ts.map +1 -1
- package/dist/es6/table/lib/TableRow.js +4 -6
- package/dist/es6/text-area/lib/TextArea.d.ts.map +1 -1
- package/dist/es6/text-area/lib/TextArea.js +2 -2
- package/dist/es6/text-input/lib/TextInput.js +2 -2
- package/dist/es6/tokens/lib/space.d.ts +44 -31
- package/dist/es6/tokens/lib/space.d.ts.map +1 -1
- package/dist/es6/tokens/lib/space.js +22 -29
- package/dist/es6/tooltip/lib/TooltipContainer.js +3 -3
- package/form-field/lib/FormField.tsx +8 -2
- package/menu/lib/MenuPopper.tsx +14 -1
- package/package.json +4 -4
- package/popup/lib/Popper.tsx +1 -1
- package/popup/lib/PopupPopper.tsx +17 -1
- package/radio/lib/Radio.tsx +18 -34
- package/select/index.ts +1 -1
- package/select/lib/Select.tsx +175 -111
- package/select/lib/hooks/index.ts +3 -0
- package/select/lib/hooks/useSelectCard.ts +11 -0
- package/select/lib/hooks/useSelectInput.ts +74 -0
- package/select/lib/hooks/useSelectModel.tsx +30 -0
- package/table/lib/Table.tsx +1 -2
- package/table/lib/TableRow.tsx +5 -8
- package/text-area/lib/TextArea.tsx +2 -8
- package/text-input/lib/TextInput.tsx +2 -2
- package/tokens/README.md +25 -28
- package/tokens/lib/space.ts +53 -40
- package/tooltip/lib/TooltipContainer.tsx +3 -3
- package/dist/commonjs/combobox/lib/useComboboxInputOpenWithArrowKeys.d.ts.map +0 -1
- package/dist/commonjs/combobox/lib/useComboboxLoader.d.ts.map +0 -1
- package/dist/commonjs/combobox/lib/useComboboxModel.d.ts.map +0 -1
- package/dist/commonjs/select/lib/SelectOption.d.ts +0 -20
- package/dist/commonjs/select/lib/SelectOption.d.ts.map +0 -1
- package/dist/es6/combobox/lib/useComboboxInputOpenWithArrowKeys.d.ts.map +0 -1
- package/dist/es6/combobox/lib/useComboboxLoader.d.ts.map +0 -1
- package/dist/es6/combobox/lib/useComboboxModel.d.ts.map +0 -1
- package/dist/es6/select/lib/SelectOption.d.ts +0 -20
- package/dist/es6/select/lib/SelectOption.d.ts.map +0 -1
- package/dist/es6/select/lib/SelectOption.js +0 -7
- package/select/lib/SelectOption.tsx +0 -33
- /package/combobox/lib/{useComboboxInputOpenWithArrowKeys.ts → hooks/useComboboxInputOpenWithArrowKeys.ts} +0 -0
- /package/combobox/lib/{useComboboxLoader.ts → hooks/useComboboxLoader.ts} +0 -0
- /package/dist/commonjs/combobox/lib/{useComboboxInputOpenWithArrowKeys.js → hooks/useComboboxInputOpenWithArrowKeys.js} +0 -0
- /package/dist/commonjs/combobox/lib/{useComboboxLoader.d.ts → hooks/useComboboxLoader.d.ts} +0 -0
- /package/dist/commonjs/combobox/lib/{useComboboxLoader.js → hooks/useComboboxLoader.js} +0 -0
- /package/dist/es6/combobox/lib/{useComboboxInputOpenWithArrowKeys.js → hooks/useComboboxInputOpenWithArrowKeys.js} +0 -0
- /package/dist/es6/combobox/lib/{useComboboxLoader.d.ts → hooks/useComboboxLoader.d.ts} +0 -0
- /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
|
-
|
|
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
|
+
});
|