@elliemae/ds-controlled-form 3.0.0-next.14 → 3.0.0-next.18
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/dist/cjs/autocomplete/Autocomplete.js +5 -6
- package/dist/cjs/autocomplete/Autocomplete.js.map +2 -2
- package/dist/cjs/autocomplete/AutocompleteCTX.js +3 -14
- package/dist/cjs/autocomplete/AutocompleteCTX.js.map +2 -2
- package/dist/cjs/autocomplete/AutocompleteDataTestids.js +1 -7
- package/dist/cjs/autocomplete/AutocompleteDataTestids.js.map +2 -2
- package/dist/cjs/autocomplete/config/useAutocomplete.js +23 -11
- package/dist/cjs/autocomplete/config/useAutocomplete.js.map +3 -3
- package/dist/cjs/autocomplete/parts/container/Container.js +27 -17
- package/dist/cjs/autocomplete/parts/container/Container.js.map +2 -2
- package/dist/cjs/autocomplete/parts/container/styled.js +0 -5
- package/dist/cjs/autocomplete/parts/container/styled.js.map +2 -2
- package/dist/cjs/autocomplete/parts/{controls → container}/useKeyboardNavigation.js +18 -24
- package/dist/cjs/autocomplete/parts/container/useKeyboardNavigation.js.map +7 -0
- package/dist/cjs/autocomplete/parts/menu-list/MenuList.js +5 -25
- package/dist/cjs/autocomplete/parts/menu-list/MenuList.js.map +2 -2
- package/dist/cjs/autocomplete/parts/menu-list/styled.js +2 -4
- package/dist/cjs/autocomplete/parts/menu-list/styled.js.map +2 -2
- package/dist/cjs/autocomplete/parts/menu-list/useItemRenderer.js +33 -35
- package/dist/cjs/autocomplete/parts/menu-list/useItemRenderer.js.map +2 -2
- package/dist/cjs/autocomplete/react-desc-prop-types.js +4 -9
- package/dist/cjs/autocomplete/react-desc-prop-types.js.map +2 -2
- package/dist/cjs/autocomplete/sharedTypes.js.map +1 -1
- package/dist/cjs/autocomplete/{config/constants.js → tests/utils.js} +27 -13
- package/dist/cjs/autocomplete/tests/utils.js.map +7 -0
- package/dist/cjs/autocomplete/utils/listHelper.js +8 -12
- package/dist/cjs/autocomplete/utils/listHelper.js.map +2 -2
- package/dist/cjs/combobox/config/useComboBox.js +7 -1
- package/dist/cjs/combobox/config/useComboBox.js.map +2 -2
- package/dist/cjs/combobox/config/useCorrectOptions.js +10 -29
- package/dist/cjs/combobox/config/useCorrectOptions.js.map +2 -2
- package/dist/cjs/combobox/parts/A11yFocusedOption.js +3 -3
- package/dist/cjs/combobox/parts/A11yFocusedOption.js.map +2 -2
- package/dist/cjs/combobox/parts/controls/Controls.js +3 -1
- package/dist/cjs/combobox/parts/controls/Controls.js.map +2 -2
- package/dist/cjs/combobox/parts/controls-input/ControlsInput.js +2 -1
- package/dist/cjs/combobox/parts/controls-input/ControlsInput.js.map +2 -2
- package/dist/cjs/combobox/parts/controls-input/styled.js +3 -0
- package/dist/cjs/combobox/parts/controls-input/styled.js.map +2 -2
- package/dist/cjs/combobox/parts/controls-input/useControlsInput.js +4 -5
- package/dist/cjs/combobox/parts/controls-input/useControlsInput.js.map +2 -2
- package/dist/cjs/combobox/parts/controls-input/useKeyboardNavigation.js +32 -29
- package/dist/cjs/combobox/parts/controls-input/useKeyboardNavigation.js.map +2 -2
- package/dist/cjs/combobox/parts/controls-input/useMaskedOnChange.js +8 -5
- package/dist/cjs/combobox/parts/controls-input/useMaskedOnChange.js.map +2 -2
- package/dist/cjs/combobox/parts/header-list/useHeaderListHandlers.js +4 -4
- package/dist/cjs/combobox/parts/header-list/useHeaderListHandlers.js.map +2 -2
- package/dist/cjs/combobox/parts/menu-list/MenuList.js +13 -10
- package/dist/cjs/combobox/parts/menu-list/MenuList.js.map +2 -2
- package/dist/cjs/combobox/parts/menu-list/styled.js +2 -1
- package/dist/cjs/combobox/parts/menu-list/styled.js.map +2 -2
- package/dist/cjs/combobox/parts/menu-list/useItemRenderer.js +7 -7
- package/dist/cjs/combobox/parts/menu-list/useItemRenderer.js.map +2 -2
- package/dist/cjs/combobox/parts/menu-list/useMenuListSetFocusOption.js +7 -7
- package/dist/cjs/combobox/parts/menu-list/useMenuListSetFocusOption.js.map +2 -2
- package/dist/cjs/combobox/react-desc-prop-types.js +2 -1
- package/dist/cjs/combobox/react-desc-prop-types.js.map +2 -2
- package/dist/cjs/combobox/utils/listHelper.js +34 -11
- package/dist/cjs/combobox/utils/listHelper.js.map +2 -2
- package/dist/cjs/mask-hook/hooks/index.js +1 -1
- package/dist/cjs/mask-hook/hooks/index.js.map +1 -1
- package/dist/cjs/mask-hook/hooks/useNumberMask.js +5 -0
- package/dist/cjs/mask-hook/hooks/useNumberMask.js.map +2 -2
- package/dist/cjs/mask-hook/hooks/usePhoneMask.js +5 -0
- package/dist/cjs/mask-hook/hooks/usePhoneMask.js.map +2 -2
- package/dist/cjs/mask-hook/hooks/useSSNMask.js +5 -0
- package/dist/cjs/mask-hook/hooks/useSSNMask.js.map +2 -2
- package/dist/cjs/mask-hook/hooks/{useZipCode.js → useZipCodeMask.js} +13 -8
- package/dist/cjs/mask-hook/hooks/{useZipCode.js.map → useZipCodeMask.js.map} +3 -3
- package/dist/esm/autocomplete/Autocomplete.js +2 -3
- package/dist/esm/autocomplete/Autocomplete.js.map +2 -2
- package/dist/esm/autocomplete/AutocompleteCTX.js +3 -14
- package/dist/esm/autocomplete/AutocompleteCTX.js.map +2 -2
- package/dist/esm/autocomplete/AutocompleteDataTestids.js +1 -7
- package/dist/esm/autocomplete/AutocompleteDataTestids.js.map +2 -2
- package/dist/esm/autocomplete/config/useAutocomplete.js +24 -12
- package/dist/esm/autocomplete/config/useAutocomplete.js.map +3 -3
- package/dist/esm/autocomplete/parts/container/Container.js +28 -18
- package/dist/esm/autocomplete/parts/container/Container.js.map +2 -2
- package/dist/esm/autocomplete/parts/container/styled.js +0 -5
- package/dist/esm/autocomplete/parts/container/styled.js.map +2 -2
- package/dist/esm/autocomplete/parts/{controls → container}/useKeyboardNavigation.js +18 -24
- package/dist/esm/autocomplete/parts/container/useKeyboardNavigation.js.map +7 -0
- package/dist/esm/autocomplete/parts/menu-list/MenuList.js +6 -26
- package/dist/esm/autocomplete/parts/menu-list/MenuList.js.map +2 -2
- package/dist/esm/autocomplete/parts/menu-list/styled.js +2 -4
- package/dist/esm/autocomplete/parts/menu-list/styled.js.map +2 -2
- package/dist/esm/autocomplete/parts/menu-list/useItemRenderer.js +33 -35
- package/dist/esm/autocomplete/parts/menu-list/useItemRenderer.js.map +2 -2
- package/dist/esm/autocomplete/react-desc-prop-types.js +4 -9
- package/dist/esm/autocomplete/react-desc-prop-types.js.map +2 -2
- package/dist/esm/autocomplete/tests/utils.js +27 -0
- package/dist/esm/autocomplete/tests/utils.js.map +7 -0
- package/dist/esm/autocomplete/utils/listHelper.js +8 -12
- package/dist/esm/autocomplete/utils/listHelper.js.map +2 -2
- package/dist/esm/combobox/config/useComboBox.js +7 -1
- package/dist/esm/combobox/config/useComboBox.js.map +2 -2
- package/dist/esm/combobox/config/useCorrectOptions.js +11 -30
- package/dist/esm/combobox/config/useCorrectOptions.js.map +2 -2
- package/dist/esm/combobox/parts/A11yFocusedOption.js +3 -3
- package/dist/esm/combobox/parts/A11yFocusedOption.js.map +2 -2
- package/dist/esm/combobox/parts/controls/Controls.js +3 -1
- package/dist/esm/combobox/parts/controls/Controls.js.map +2 -2
- package/dist/esm/combobox/parts/controls-input/ControlsInput.js +2 -1
- package/dist/esm/combobox/parts/controls-input/ControlsInput.js.map +2 -2
- package/dist/esm/combobox/parts/controls-input/styled.js +3 -0
- package/dist/esm/combobox/parts/controls-input/styled.js.map +2 -2
- package/dist/esm/combobox/parts/controls-input/useControlsInput.js +4 -5
- package/dist/esm/combobox/parts/controls-input/useControlsInput.js.map +2 -2
- package/dist/esm/combobox/parts/controls-input/useKeyboardNavigation.js +32 -29
- package/dist/esm/combobox/parts/controls-input/useKeyboardNavigation.js.map +2 -2
- package/dist/esm/combobox/parts/controls-input/useMaskedOnChange.js +8 -5
- package/dist/esm/combobox/parts/controls-input/useMaskedOnChange.js.map +2 -2
- package/dist/esm/combobox/parts/header-list/useHeaderListHandlers.js +4 -4
- package/dist/esm/combobox/parts/header-list/useHeaderListHandlers.js.map +2 -2
- package/dist/esm/combobox/parts/menu-list/MenuList.js +13 -10
- package/dist/esm/combobox/parts/menu-list/MenuList.js.map +2 -2
- package/dist/esm/combobox/parts/menu-list/styled.js +2 -1
- package/dist/esm/combobox/parts/menu-list/styled.js.map +2 -2
- package/dist/esm/combobox/parts/menu-list/useItemRenderer.js +7 -7
- package/dist/esm/combobox/parts/menu-list/useItemRenderer.js.map +2 -2
- package/dist/esm/combobox/parts/menu-list/useMenuListSetFocusOption.js +7 -7
- package/dist/esm/combobox/parts/menu-list/useMenuListSetFocusOption.js.map +2 -2
- package/dist/esm/combobox/react-desc-prop-types.js +2 -1
- package/dist/esm/combobox/react-desc-prop-types.js.map +2 -2
- package/dist/esm/combobox/utils/listHelper.js +34 -11
- package/dist/esm/combobox/utils/listHelper.js.map +2 -2
- package/dist/esm/mask-hook/hooks/index.js +1 -1
- package/dist/esm/mask-hook/hooks/index.js.map +1 -1
- package/dist/esm/mask-hook/hooks/useNumberMask.js +5 -0
- package/dist/esm/mask-hook/hooks/useNumberMask.js.map +2 -2
- package/dist/esm/mask-hook/hooks/usePhoneMask.js +5 -0
- package/dist/esm/mask-hook/hooks/usePhoneMask.js.map +2 -2
- package/dist/esm/mask-hook/hooks/useSSNMask.js +5 -0
- package/dist/esm/mask-hook/hooks/useSSNMask.js.map +2 -2
- package/dist/esm/mask-hook/hooks/{useZipCode.js → useZipCodeMask.js} +10 -5
- package/dist/esm/mask-hook/hooks/{useZipCode.js.map → useZipCodeMask.js.map} +3 -3
- package/package.json +15 -15
- package/dist/cjs/autocomplete/config/constants.js.map +0 -7
- package/dist/cjs/autocomplete/config/useGetPropsWithDefault.js +0 -37
- package/dist/cjs/autocomplete/config/useGetPropsWithDefault.js.map +0 -7
- package/dist/cjs/autocomplete/index.d.js +0 -27
- package/dist/cjs/autocomplete/index.d.js.map +0 -7
- package/dist/cjs/autocomplete/parts/a11y-messages/MultiAllyMessages.js +0 -50
- package/dist/cjs/autocomplete/parts/a11y-messages/MultiAllyMessages.js.map +0 -7
- package/dist/cjs/autocomplete/parts/a11y-messages/SingleAllyMessages.js +0 -48
- package/dist/cjs/autocomplete/parts/a11y-messages/SingleAllyMessages.js.map +0 -7
- package/dist/cjs/autocomplete/parts/a11y-messages/index.js +0 -37
- package/dist/cjs/autocomplete/parts/a11y-messages/index.js.map +0 -7
- package/dist/cjs/autocomplete/parts/a11y-messages/styled.js +0 -41
- package/dist/cjs/autocomplete/parts/a11y-messages/styled.js.map +0 -7
- package/dist/cjs/autocomplete/parts/controls/Controls.js +0 -72
- package/dist/cjs/autocomplete/parts/controls/Controls.js.map +0 -7
- package/dist/cjs/autocomplete/parts/controls/index.js +0 -35
- package/dist/cjs/autocomplete/parts/controls/index.js.map +0 -7
- package/dist/cjs/autocomplete/parts/controls/styled.js +0 -108
- package/dist/cjs/autocomplete/parts/controls/styled.js.map +0 -7
- package/dist/cjs/autocomplete/parts/controls/useControlsInput.js +0 -62
- package/dist/cjs/autocomplete/parts/controls/useControlsInput.js.map +0 -7
- package/dist/cjs/autocomplete/parts/controls/useKeyboardNavigation.js.map +0 -7
- package/dist/cjs/autocomplete/parts/controls/useMaskedOnChange.js +0 -48
- package/dist/cjs/autocomplete/parts/controls/useMaskedOnChange.js.map +0 -7
- package/dist/cjs/autocomplete/parts/menu-list/useMenuList.js +0 -82
- package/dist/cjs/autocomplete/parts/menu-list/useMenuList.js.map +0 -7
- package/dist/cjs/autocomplete/propTypes.js +0 -56
- package/dist/cjs/autocomplete/propTypes.js.map +0 -7
- package/dist/cjs/autocomplete/utils/hooks/useKeyboardNavigation.js +0 -108
- package/dist/cjs/autocomplete/utils/hooks/useKeyboardNavigation.js.map +0 -7
- package/dist/cjs/autocomplete/utils/hooks/useOnElementResize.js +0 -56
- package/dist/cjs/autocomplete/utils/hooks/useOnElementResize.js.map +0 -7
- package/dist/esm/autocomplete/config/constants.js +0 -13
- package/dist/esm/autocomplete/config/constants.js.map +0 -7
- package/dist/esm/autocomplete/config/useGetPropsWithDefault.js +0 -8
- package/dist/esm/autocomplete/config/useGetPropsWithDefault.js.map +0 -7
- package/dist/esm/autocomplete/index.d.js +0 -2
- package/dist/esm/autocomplete/index.d.js.map +0 -7
- package/dist/esm/autocomplete/parts/a11y-messages/MultiAllyMessages.js +0 -21
- package/dist/esm/autocomplete/parts/a11y-messages/MultiAllyMessages.js.map +0 -7
- package/dist/esm/autocomplete/parts/a11y-messages/SingleAllyMessages.js +0 -19
- package/dist/esm/autocomplete/parts/a11y-messages/SingleAllyMessages.js.map +0 -7
- package/dist/esm/autocomplete/parts/a11y-messages/index.js +0 -8
- package/dist/esm/autocomplete/parts/a11y-messages/index.js.map +0 -7
- package/dist/esm/autocomplete/parts/a11y-messages/styled.js +0 -12
- package/dist/esm/autocomplete/parts/a11y-messages/styled.js.map +0 -7
- package/dist/esm/autocomplete/parts/controls/Controls.js +0 -43
- package/dist/esm/autocomplete/parts/controls/Controls.js.map +0 -7
- package/dist/esm/autocomplete/parts/controls/index.js +0 -6
- package/dist/esm/autocomplete/parts/controls/index.js.map +0 -7
- package/dist/esm/autocomplete/parts/controls/styled.js +0 -79
- package/dist/esm/autocomplete/parts/controls/styled.js.map +0 -7
- package/dist/esm/autocomplete/parts/controls/useControlsInput.js +0 -33
- package/dist/esm/autocomplete/parts/controls/useControlsInput.js.map +0 -7
- package/dist/esm/autocomplete/parts/controls/useKeyboardNavigation.js.map +0 -7
- package/dist/esm/autocomplete/parts/controls/useMaskedOnChange.js +0 -19
- package/dist/esm/autocomplete/parts/controls/useMaskedOnChange.js.map +0 -7
- package/dist/esm/autocomplete/parts/menu-list/useMenuList.js +0 -53
- package/dist/esm/autocomplete/parts/menu-list/useMenuList.js.map +0 -7
- package/dist/esm/autocomplete/propTypes.js +0 -27
- package/dist/esm/autocomplete/propTypes.js.map +0 -7
- package/dist/esm/autocomplete/utils/hooks/useKeyboardNavigation.js +0 -79
- package/dist/esm/autocomplete/utils/hooks/useKeyboardNavigation.js.map +0 -7
- package/dist/esm/autocomplete/utils/hooks/useOnElementResize.js +0 -27
- package/dist/esm/autocomplete/utils/hooks/useOnElementResize.js.map +0 -7
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../scripts/build/transpile/react-shim.js", "../../../src/autocomplete/AutocompleteDataTestids.tsx"],
|
|
4
|
-
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "export const AutocompleteDataTestid = {\n
|
|
5
|
-
"mappings": "AAAA;ACAO,MAAM,yBAAyB;AAAA,EACpC,
|
|
4
|
+
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "export const AutocompleteDataTestid = {\n LIST: 'autocomplete-menu-list',\n OPTION: 'autocomplete-option',\n CONTAINER: 'autocomplete-container',\n};\n"],
|
|
5
|
+
"mappings": "AAAA;ACAO,MAAM,yBAAyB;AAAA,EACpC,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,WAAW;AAAA;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
2
4
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
3
5
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
4
6
|
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
@@ -14,21 +16,27 @@ var __spreadValues = (a, b) => {
|
|
|
14
16
|
}
|
|
15
17
|
return a;
|
|
16
18
|
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
17
20
|
import * as React from "react";
|
|
18
|
-
import { useMemo, useState, useRef, useCallback } from "react";
|
|
21
|
+
import { useMemo, useState, useEffect, useRef, useCallback } from "react";
|
|
22
|
+
import { useMemoMergePropsWithDefault, useValidateTypescriptPropTypes } from "@elliemae/ds-props-helpers";
|
|
19
23
|
import { useVirtual } from "react-virtual";
|
|
20
|
-
import {
|
|
24
|
+
import { propTypes } from "../react-desc-prop-types";
|
|
25
|
+
import { defaultProps } from "../AutocompleteCTX";
|
|
26
|
+
import { getFirstOption } from "../utils/listHelper";
|
|
21
27
|
const useAutocomplete = (props) => {
|
|
28
|
+
const defaultPropsWithInnerRef = __spreadProps(__spreadValues({}, defaultProps), {
|
|
29
|
+
innerRef: useRef(null)
|
|
30
|
+
});
|
|
31
|
+
const propsWithDefault = useMemoMergePropsWithDefault(props, defaultPropsWithInnerRef);
|
|
32
|
+
useValidateTypescriptPropTypes(propsWithDefault, propTypes);
|
|
22
33
|
const [showPopover, setShowPopover] = useState(false);
|
|
23
34
|
const [referenceElement, setReferenceElement] = useState(null);
|
|
24
35
|
const [focusOptionIdx, setCurrentOption] = useState("");
|
|
25
36
|
const inputRef = useRef(null);
|
|
26
37
|
const listRef = useRef(null);
|
|
27
|
-
const wrapperListRef = useRef(null);
|
|
28
38
|
const selectedOptionsRef = useRef(null);
|
|
29
|
-
const
|
|
30
|
-
const propsWithDefaults = useGetAutocompleteWithDefaultsProps(props);
|
|
31
|
-
const { options } = propsWithDefaults;
|
|
39
|
+
const { options, filter } = propsWithDefault;
|
|
32
40
|
const virtualListHelpers = useVirtual({
|
|
33
41
|
size: options.length,
|
|
34
42
|
parentRef: listRef,
|
|
@@ -38,8 +46,16 @@ const useAutocomplete = (props) => {
|
|
|
38
46
|
const scrollOptionIntoView = useCallback((dsId, opts = { align: "center" }) => {
|
|
39
47
|
virtualListHelpers.scrollToIndex(options.findIndex((opt) => opt.dsId === dsId), opts);
|
|
40
48
|
}, [options, virtualListHelpers]);
|
|
49
|
+
useEffect(() => {
|
|
50
|
+
if (filter.length === 0 || options.length === 0) {
|
|
51
|
+
setShowPopover(false);
|
|
52
|
+
}
|
|
53
|
+
}, [filter, options.length, setShowPopover]);
|
|
54
|
+
useEffect(() => {
|
|
55
|
+
setCurrentOption(getFirstOption(options));
|
|
56
|
+
}, [options, showPopover]);
|
|
41
57
|
const ctx = useMemo(() => ({
|
|
42
|
-
props: __spreadValues({},
|
|
58
|
+
props: __spreadValues({}, propsWithDefault),
|
|
43
59
|
virtualListHelpers,
|
|
44
60
|
showPopover,
|
|
45
61
|
referenceElement,
|
|
@@ -47,23 +63,19 @@ const useAutocomplete = (props) => {
|
|
|
47
63
|
listRef,
|
|
48
64
|
focusOptionIdx,
|
|
49
65
|
selectedOptionsRef,
|
|
50
|
-
controlsWrapperRef,
|
|
51
|
-
wrapperListRef,
|
|
52
66
|
setCurrentOption,
|
|
53
67
|
scrollOptionIntoView,
|
|
54
68
|
setReferenceElement,
|
|
55
69
|
setShowPopover
|
|
56
70
|
}), [
|
|
57
71
|
scrollOptionIntoView,
|
|
58
|
-
|
|
72
|
+
propsWithDefault,
|
|
59
73
|
virtualListHelpers,
|
|
60
74
|
focusOptionIdx,
|
|
61
|
-
wrapperListRef,
|
|
62
75
|
showPopover,
|
|
63
76
|
referenceElement,
|
|
64
77
|
inputRef,
|
|
65
78
|
selectedOptionsRef,
|
|
66
|
-
controlsWrapperRef,
|
|
67
79
|
listRef
|
|
68
80
|
]);
|
|
69
81
|
return ctx;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../../../../scripts/build/transpile/react-shim.js", "../../../../src/autocomplete/config/useAutocomplete.
|
|
4
|
-
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable max-lines */\n/* eslint-disable import/prefer-default-export */\n/* eslint-disable complexity */\n/* eslint-disable max-statements */\nimport { useMemo, useState, useRef, useCallback } from 'react';\nimport { useVirtual } from 'react-virtual';\nimport {
|
|
5
|
-
"mappings": "
|
|
3
|
+
"sources": ["../../../../../../scripts/build/transpile/react-shim.js", "../../../../src/autocomplete/config/useAutocomplete.ts"],
|
|
4
|
+
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable max-lines */\n/* eslint-disable import/prefer-default-export */\n/* eslint-disable complexity */\n/* eslint-disable max-statements */\nimport { useMemo, useState, useEffect, useRef, useCallback } from 'react';\nimport { useMemoMergePropsWithDefault, useValidateTypescriptPropTypes } from '@elliemae/ds-props-helpers';\n\nimport { useVirtual } from 'react-virtual';\nimport { DSAutocompleteT, propTypes } from '../react-desc-prop-types';\nimport { DSAutoCompleteInternalsT } from '../sharedTypes';\nimport { defaultProps } from '../AutocompleteCTX';\nimport { getFirstOption } from '../utils/listHelper';\n\nexport const useAutocomplete = (props: DSAutocompleteT.Props): DSAutoCompleteInternalsT.AutocompleteContext => {\n const defaultPropsWithInnerRef = {\n ...defaultProps,\n innerRef: useRef(null),\n };\n const propsWithDefault = useMemoMergePropsWithDefault(props, defaultPropsWithInnerRef);\n useValidateTypescriptPropTypes(propsWithDefault, propTypes);\n const [showPopover, setShowPopover] = useState<boolean>(false);\n const [referenceElement, setReferenceElement] = useState<HTMLElement | null>(null);\n\n const [focusOptionIdx, setCurrentOption] = useState<string>('');\n\n const inputRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n\n const selectedOptionsRef = useRef<HTMLDivElement>(null);\n\n const { options, filter } = propsWithDefault;\n\n // ===========================================================================\n // Virtualization setup\n // ===========================================================================\n\n const virtualListHelpers: ReturnType<typeof useVirtual> = useVirtual({\n size: options.length,\n parentRef: listRef,\n overscan: 15,\n paddingStart: 0,\n });\n\n // ===========================================================================\n // Scroll into view function\n // ===========================================================================\n const scrollOptionIntoView = useCallback(\n (dsId: string, opts = { align: 'center' }) => {\n virtualListHelpers.scrollToIndex(\n options.findIndex((opt) => opt.dsId === dsId),\n opts,\n );\n },\n [options, virtualListHelpers],\n );\n\n useEffect(() => {\n if (filter.length === 0 || options.length === 0) {\n setShowPopover(false);\n }\n }, [filter, options.length, setShowPopover]);\n\n useEffect(() => {\n setCurrentOption(getFirstOption(options));\n }, [options, showPopover]);\n\n const ctx = useMemo(\n () => ({\n props: { ...propsWithDefault },\n virtualListHelpers,\n showPopover,\n referenceElement,\n inputRef,\n listRef,\n focusOptionIdx,\n selectedOptionsRef,\n setCurrentOption,\n scrollOptionIntoView,\n setReferenceElement,\n setShowPopover,\n }),\n [\n scrollOptionIntoView,\n propsWithDefault,\n virtualListHelpers,\n focusOptionIdx,\n showPopover,\n referenceElement,\n inputRef,\n selectedOptionsRef,\n listRef,\n ],\n );\n\n return ctx;\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;ACIA;AACA;AAEA;AACA;AAEA;AACA;AAEO,MAAM,kBAAkB,CAAC,UAA+E;AAC7G,QAAM,2BAA2B,iCAC5B,eAD4B;AAAA,IAE/B,UAAU,OAAO;AAAA;AAEnB,QAAM,mBAAmB,6BAA6B,OAAO;AAC7D,iCAA+B,kBAAkB;AACjD,QAAM,CAAC,aAAa,kBAAkB,SAAkB;AACxD,QAAM,CAAC,kBAAkB,uBAAuB,SAA6B;AAE7E,QAAM,CAAC,gBAAgB,oBAAoB,SAAiB;AAE5D,QAAM,WAAW,OAAyB;AAC1C,QAAM,UAAU,OAAuB;AAEvC,QAAM,qBAAqB,OAAuB;AAElD,QAAM,EAAE,SAAS,WAAW;AAM5B,QAAM,qBAAoD,WAAW;AAAA,IACnE,MAAM,QAAQ;AAAA,IACd,WAAW;AAAA,IACX,UAAU;AAAA,IACV,cAAc;AAAA;AAMhB,QAAM,uBAAuB,YAC3B,CAAC,MAAc,OAAO,EAAE,OAAO,eAAe;AAC5C,uBAAmB,cACjB,QAAQ,UAAU,CAAC,QAAQ,IAAI,SAAS,OACxC;AAAA,KAGJ,CAAC,SAAS;AAGZ,YAAU,MAAM;AACd,QAAI,OAAO,WAAW,KAAK,QAAQ,WAAW,GAAG;AAC/C,qBAAe;AAAA;AAAA,KAEhB,CAAC,QAAQ,QAAQ,QAAQ;AAE5B,YAAU,MAAM;AACd,qBAAiB,eAAe;AAAA,KAC/B,CAAC,SAAS;AAEb,QAAM,MAAM,QACV,MAAO;AAAA,IACL,OAAO,mBAAK;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MAEF;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAIJ,SAAO;AAAA;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,31 +1,42 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import React2, { useCallback, useContext } from "react";
|
|
2
|
+
import React2, { useCallback, useEffect, useContext } from "react";
|
|
3
3
|
import { DSPopperJS } from "@elliemae/ds-popperjs";
|
|
4
|
-
import
|
|
5
|
-
import { StyledContainerWithPopper,
|
|
6
|
-
import { Controls } from "../controls";
|
|
4
|
+
import AutocompleteContext from "../../AutocompleteCTX";
|
|
5
|
+
import { StyledContainerWithPopper, StyledPopperWrapper } from "./styled";
|
|
7
6
|
import { MenuList } from "../menu-list";
|
|
7
|
+
import { useKeyboardNavigation } from "./useKeyboardNavigation";
|
|
8
|
+
import { AutocompleteDataTestid } from "../../AutocompleteDataTestids";
|
|
8
9
|
const Container = () => {
|
|
9
10
|
const {
|
|
10
|
-
props: {
|
|
11
|
+
props: { startPlacementPreference, children, filter, placementOrderPreference },
|
|
11
12
|
showPopover,
|
|
12
|
-
inputRef,
|
|
13
13
|
setReferenceElement,
|
|
14
14
|
setShowPopover,
|
|
15
15
|
referenceElement
|
|
16
16
|
} = useContext(AutocompleteContext);
|
|
17
|
+
useEffect(() => {
|
|
18
|
+
const closePopper = () => {
|
|
19
|
+
setShowPopover(false);
|
|
20
|
+
};
|
|
21
|
+
window.addEventListener("blur", closePopper);
|
|
22
|
+
return () => {
|
|
23
|
+
window.removeEventListener("blur", closePopper);
|
|
24
|
+
};
|
|
25
|
+
}, [setShowPopover]);
|
|
17
26
|
const handleCloseMenu = useCallback(() => {
|
|
18
27
|
setShowPopover(false);
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
28
|
+
}, [setShowPopover]);
|
|
29
|
+
const input = React2.Children.only(children);
|
|
30
|
+
const { onInputKeyDown } = useKeyboardNavigation();
|
|
31
|
+
return /* @__PURE__ */ React2.createElement(StyledContainerWithPopper, {
|
|
32
|
+
ref: setReferenceElement,
|
|
33
|
+
role: "combobox",
|
|
34
|
+
"aria-autocomplete": "list",
|
|
35
|
+
"aria-controls": "autocomplete-listbox",
|
|
36
|
+
"aria-expanded": showPopover,
|
|
37
|
+
onKeyDown: onInputKeyDown,
|
|
38
|
+
"data-testid": AutocompleteDataTestid.CONTAINER
|
|
39
|
+
}, input, filter && /* @__PURE__ */ React2.createElement(DSPopperJS, {
|
|
29
40
|
customOffset: [0, 5],
|
|
30
41
|
closeContextMenu: handleCloseMenu,
|
|
31
42
|
referenceElement,
|
|
@@ -37,8 +48,7 @@ const Container = () => {
|
|
|
37
48
|
withoutAnimation: true,
|
|
38
49
|
zIndex: 10
|
|
39
50
|
}, /* @__PURE__ */ React2.createElement(StyledPopperWrapper, {
|
|
40
|
-
tabIndex: -1
|
|
41
|
-
onMouseDown: handleMouseDown
|
|
51
|
+
tabIndex: -1
|
|
42
52
|
}, /* @__PURE__ */ React2.createElement(MenuList, null))));
|
|
43
53
|
};
|
|
44
54
|
export {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../../scripts/build/transpile/react-shim.js", "../../../../../src/autocomplete/parts/container/Container.tsx"],
|
|
4
|
-
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable complexity */\nimport React, { useCallback, useContext } from 'react';\nimport { DSPopperJS } from '@elliemae/ds-popperjs';\nimport
|
|
5
|
-
"mappings": "AAAA;ACCA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,YAAY,MAAmB;
|
|
4
|
+
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable complexity */\nimport React, { useCallback, useEffect, useContext } from 'react';\nimport { DSPopperJS } from '@elliemae/ds-popperjs';\nimport AutocompleteContext from '../../AutocompleteCTX';\nimport { StyledContainerWithPopper, StyledPopperWrapper } from './styled';\nimport { MenuList } from '../menu-list';\nimport { useKeyboardNavigation } from './useKeyboardNavigation';\nimport { AutocompleteDataTestid } from '../../AutocompleteDataTestids';\n\nexport const Container = (): JSX.Element => {\n const {\n props: { startPlacementPreference, children, filter, placementOrderPreference },\n showPopover,\n setReferenceElement,\n setShowPopover,\n referenceElement,\n } = useContext(AutocompleteContext);\n\n useEffect(() => {\n const closePopper = () => {\n setShowPopover(false);\n };\n window.addEventListener('blur', closePopper);\n\n return () => {\n window.removeEventListener('blur', closePopper);\n };\n }, [setShowPopover]);\n\n const handleCloseMenu = useCallback(() => {\n setShowPopover(false);\n }, [setShowPopover]);\n\n const input = React.Children.only(children);\n const { onInputKeyDown } = useKeyboardNavigation();\n\n return (\n <StyledContainerWithPopper\n ref={setReferenceElement}\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-controls=\"autocomplete-listbox\"\n aria-expanded={showPopover}\n onKeyDown={onInputKeyDown}\n data-testid={AutocompleteDataTestid.CONTAINER}\n >\n {input}\n {filter && (\n <DSPopperJS\n customOffset={[0, 5]}\n closeContextMenu={handleCloseMenu}\n referenceElement={referenceElement}\n showPopover={showPopover}\n startPlacementPreference={startPlacementPreference}\n placementOrderPreference={placementOrderPreference}\n withoutPortal\n withoutArrow\n withoutAnimation\n zIndex={10}\n >\n <StyledPopperWrapper tabIndex={-1}>\n <MenuList />\n </StyledPopperWrapper>\n </DSPopperJS>\n )}\n </StyledContainerWithPopper>\n );\n};\n"],
|
|
5
|
+
"mappings": "AAAA;ACCA;AACA;AACA;AACA;AACA;AACA;AACA;AAEO,MAAM,YAAY,MAAmB;AAC1C,QAAM;AAAA,IACJ,OAAO,EAAE,0BAA0B,UAAU,QAAQ;AAAA,IACrD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAW;AAEf,YAAU,MAAM;AACd,UAAM,cAAc,MAAM;AACxB,qBAAe;AAAA;AAEjB,WAAO,iBAAiB,QAAQ;AAEhC,WAAO,MAAM;AACX,aAAO,oBAAoB,QAAQ;AAAA;AAAA,KAEpC,CAAC;AAEJ,QAAM,kBAAkB,YAAY,MAAM;AACxC,mBAAe;AAAA,KACd,CAAC;AAEJ,QAAM,QAAQ,OAAM,SAAS,KAAK;AAClC,QAAM,EAAE,mBAAmB;AAE3B,SACE,qCAAC,2BAAD;AAAA,IACE,KAAK;AAAA,IACL,MAAK;AAAA,IACL,qBAAkB;AAAA,IAClB,iBAAc;AAAA,IACd,iBAAe;AAAA,IACf,WAAW;AAAA,IACX,eAAa,uBAAuB;AAAA,KAEnC,OACA,UACC,qCAAC,YAAD;AAAA,IACE,cAAc,CAAC,GAAG;AAAA,IAClB,kBAAkB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAa;AAAA,IACb,cAAY;AAAA,IACZ,kBAAgB;AAAA,IAChB,QAAQ;AAAA,KAER,qCAAC,qBAAD;AAAA,IAAqB,UAAU;AAAA,KAC7B,qCAAC,UAAD;AAAA;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -5,17 +5,12 @@ const StyledContainerWithPopper = styled.div`
|
|
|
5
5
|
height: 28px;
|
|
6
6
|
position: relative;
|
|
7
7
|
`;
|
|
8
|
-
const StyledContainerInline = styled.div`
|
|
9
|
-
width: 100%;
|
|
10
|
-
position: relative;
|
|
11
|
-
`;
|
|
12
8
|
const StyledPopperWrapper = styled.div`
|
|
13
9
|
background: #fff;
|
|
14
10
|
overflow: auto;
|
|
15
11
|
position: relative;
|
|
16
12
|
`;
|
|
17
13
|
export {
|
|
18
|
-
StyledContainerInline,
|
|
19
14
|
StyledContainerWithPopper,
|
|
20
15
|
StyledPopperWrapper
|
|
21
16
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../../scripts/build/transpile/react-shim.js", "../../../../../src/autocomplete/parts/container/styled.tsx"],
|
|
4
|
-
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import styled from 'styled-components';\n\nexport const StyledContainerWithPopper = styled.div`\n width: 100%;\n height: 28px;\n position: relative;\n`;\n\nexport const
|
|
5
|
-
"mappings": "AAAA;ACAA;AAEO,MAAM,4BAA4B,OAAO;AAAA;AAAA;AAAA;AAAA;AAMzC,MAAM,
|
|
4
|
+
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import styled from 'styled-components';\n\nexport const StyledContainerWithPopper = styled.div`\n width: 100%;\n height: 28px;\n position: relative;\n`;\n\nexport const StyledPopperWrapper = styled.div`\n background: #fff;\n overflow: auto;\n position: relative;\n`;\n"],
|
|
5
|
+
"mappings": "AAAA;ACAA;AAEO,MAAM,4BAA4B,OAAO;AAAA;AAAA;AAAA;AAAA;AAMzC,MAAM,sBAAsB,OAAO;AAAA;AAAA;AAAA;AAAA;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -5,7 +5,7 @@ import { findInCircularList } from "../../utils/listHelper";
|
|
|
5
5
|
const isOptionFocuseable = (opt) => !["section", "separator"].includes(opt.type);
|
|
6
6
|
const useKeyboardNavigation = () => {
|
|
7
7
|
const {
|
|
8
|
-
props: {
|
|
8
|
+
props: { onSelect, options },
|
|
9
9
|
setShowPopover,
|
|
10
10
|
showPopover,
|
|
11
11
|
focusOptionIdx,
|
|
@@ -14,21 +14,15 @@ const useKeyboardNavigation = () => {
|
|
|
14
14
|
} = useContext(AutocompleteContext);
|
|
15
15
|
const currentItemIndex = options.findIndex((opt) => opt.dsId === focusOptionIdx);
|
|
16
16
|
const currentItem = options.find((item) => item.type === "option" && item.dsId === focusOptionIdx);
|
|
17
|
-
const selectOption = useCallback((e) => {
|
|
18
|
-
if (onValueChange)
|
|
19
|
-
onValueChange(currentItem.label, e);
|
|
20
|
-
setShowPopover(false);
|
|
21
|
-
}, [currentItem, setShowPopover, onValueChange]);
|
|
22
17
|
const onInputKeyDown = useCallback((e) => {
|
|
23
|
-
|
|
24
|
-
if (["ArrowDown", "ArrowUp", "Enter"].includes(e.key) || e.keyCode >= 48 && e.keyCode <= 90) {
|
|
18
|
+
if ((e.keyCode >= 48 && e.keyCode <= 90 || e.key === "Backspace") && !showPopover) {
|
|
25
19
|
setShowPopover(true);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
20
|
+
} else if (e.key === "Tab")
|
|
21
|
+
setShowPopover(false);
|
|
22
|
+
if (e.key === "Enter" && showPopover) {
|
|
23
|
+
e.preventDefault();
|
|
24
|
+
onSelect(currentItem?.label, e);
|
|
25
|
+
setShowPopover(false);
|
|
32
26
|
}
|
|
33
27
|
if (e.key === "ArrowDown") {
|
|
34
28
|
e.preventDefault();
|
|
@@ -36,8 +30,6 @@ const useKeyboardNavigation = () => {
|
|
|
36
30
|
const nextItemIndex = findInCircularList(options, currentItemIndex, isOptionFocuseable);
|
|
37
31
|
setCurrentOption(options[nextItemIndex].dsId);
|
|
38
32
|
scrollOptionIntoView(options[nextItemIndex].dsId);
|
|
39
|
-
} else {
|
|
40
|
-
setShowPopover(true);
|
|
41
33
|
}
|
|
42
34
|
}
|
|
43
35
|
if (e.key === "ArrowUp") {
|
|
@@ -46,19 +38,21 @@ const useKeyboardNavigation = () => {
|
|
|
46
38
|
const nextItemIndex = findInCircularList(options, currentItemIndex, isOptionFocuseable, -1);
|
|
47
39
|
setCurrentOption(options[nextItemIndex].dsId);
|
|
48
40
|
scrollOptionIntoView(options[nextItemIndex].dsId);
|
|
49
|
-
} else {
|
|
50
|
-
setShowPopover(true);
|
|
51
|
-
setTimeout(() => {
|
|
52
|
-
const nextItemIndex = findInCircularList(options, 0, isOptionFocuseable, -1);
|
|
53
|
-
setCurrentOption(options[nextItemIndex].dsId);
|
|
54
|
-
scrollOptionIntoView(options[nextItemIndex].dsId);
|
|
55
|
-
});
|
|
56
41
|
}
|
|
57
42
|
}
|
|
58
43
|
if (e.key === "Escape") {
|
|
59
44
|
setShowPopover(false);
|
|
60
45
|
}
|
|
61
|
-
}, [
|
|
46
|
+
}, [
|
|
47
|
+
currentItem?.label,
|
|
48
|
+
currentItemIndex,
|
|
49
|
+
onSelect,
|
|
50
|
+
options,
|
|
51
|
+
scrollOptionIntoView,
|
|
52
|
+
setCurrentOption,
|
|
53
|
+
setShowPopover,
|
|
54
|
+
showPopover
|
|
55
|
+
]);
|
|
62
56
|
return { onInputKeyDown };
|
|
63
57
|
};
|
|
64
58
|
export {
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../scripts/build/transpile/react-shim.js", "../../../../../src/autocomplete/parts/container/useKeyboardNavigation.tsx"],
|
|
4
|
+
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable max-lines */\n/* eslint-disable max-depth */\n/* eslint-disable max-statements */\n/* eslint-disable complexity */\nimport React, { useCallback, useContext } from 'react';\nimport { DSAutocompleteT } from '../../react-desc-prop-types';\nimport AutocompleteContext from '../../AutocompleteCTX';\nimport { findInCircularList } from '../../utils/listHelper';\n\nconst isOptionFocuseable = (opt: DSAutocompleteT.OptionTypes): boolean => !['section', 'separator'].includes(opt.type);\n\nexport const useKeyboardNavigation = () => {\n const {\n props: { onSelect, options },\n setShowPopover,\n showPopover,\n focusOptionIdx,\n setCurrentOption,\n scrollOptionIntoView,\n } = useContext(AutocompleteContext);\n\n const currentItemIndex = options.findIndex((opt) => opt.dsId === focusOptionIdx);\n const currentItem = options.find(\n (item) => item.type === 'option' && item.dsId === focusOptionIdx,\n ) as DSAutocompleteT.ItemOption;\n\n const onInputKeyDown: React.KeyboardEventHandler<HTMLInputElement> = useCallback(\n (e) => {\n if (((e.keyCode >= 48 && e.keyCode <= 90) || e.key === 'Backspace') && !showPopover) {\n setShowPopover(true);\n } else if (e.key === 'Tab') setShowPopover(false);\n\n // =============================================================================\n // ENTER AND SPACE KEY SELECT OPTIONS AND OPEN CLOSE THE POPOVER\n // =============================================================================\n if (e.key === 'Enter' && showPopover) {\n e.preventDefault();\n onSelect(currentItem?.label, e);\n setShowPopover(false);\n }\n\n // =============================================================================\n // ARROWS UP AND DOWN\n // =============================================================================\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n if (showPopover) {\n const nextItemIndex = findInCircularList(options, currentItemIndex, isOptionFocuseable);\n setCurrentOption(options[nextItemIndex].dsId);\n scrollOptionIntoView(options[nextItemIndex].dsId);\n }\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n if (showPopover) {\n const nextItemIndex = findInCircularList(options, currentItemIndex, isOptionFocuseable, -1);\n setCurrentOption(options[nextItemIndex].dsId);\n scrollOptionIntoView(options[nextItemIndex].dsId);\n }\n }\n // =============================================================================\n // ESCAPE\n // =============================================================================\n if (e.key === 'Escape') {\n setShowPopover(false);\n }\n },\n [\n currentItem?.label,\n currentItemIndex,\n onSelect,\n options,\n scrollOptionIntoView,\n setCurrentOption,\n setShowPopover,\n showPopover,\n ],\n );\n\n return { onInputKeyDown };\n};\n"],
|
|
5
|
+
"mappings": "AAAA;ACIA;AAEA;AACA;AAEA,MAAM,qBAAqB,CAAC,QAA8C,CAAC,CAAC,WAAW,aAAa,SAAS,IAAI;AAE1G,MAAM,wBAAwB,MAAM;AACzC,QAAM;AAAA,IACJ,OAAO,EAAE,UAAU;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAW;AAEf,QAAM,mBAAmB,QAAQ,UAAU,CAAC,QAAQ,IAAI,SAAS;AACjE,QAAM,cAAc,QAAQ,KAC1B,CAAC,SAAS,KAAK,SAAS,YAAY,KAAK,SAAS;AAGpD,QAAM,iBAA+D,YACnE,CAAC,MAAM;AACL,QAAM,GAAE,WAAW,MAAM,EAAE,WAAW,MAAO,EAAE,QAAQ,gBAAgB,CAAC,aAAa;AACnF,qBAAe;AAAA,eACN,EAAE,QAAQ;AAAO,qBAAe;AAK3C,QAAI,EAAE,QAAQ,WAAW,aAAa;AACpC,QAAE;AACF,eAAS,aAAa,OAAO;AAC7B,qBAAe;AAAA;AAMjB,QAAI,EAAE,QAAQ,aAAa;AACzB,QAAE;AACF,UAAI,aAAa;AACf,cAAM,gBAAgB,mBAAmB,SAAS,kBAAkB;AACpE,yBAAiB,QAAQ,eAAe;AACxC,6BAAqB,QAAQ,eAAe;AAAA;AAAA;AAGhD,QAAI,EAAE,QAAQ,WAAW;AACvB,QAAE;AACF,UAAI,aAAa;AACf,cAAM,gBAAgB,mBAAmB,SAAS,kBAAkB,oBAAoB;AACxF,yBAAiB,QAAQ,eAAe;AACxC,6BAAqB,QAAQ,eAAe;AAAA;AAAA;AAMhD,QAAI,EAAE,QAAQ,UAAU;AACtB,qBAAe;AAAA;AAAA,KAGnB;AAAA,IACE,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAIJ,SAAO,EAAE;AAAA;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,50 +1,30 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import React2, { useContext,
|
|
3
|
-
import { DSCircularProgressIndicator } from "@elliemae/ds-circular-progress-indicator";
|
|
4
|
-
import { Grid } from "@elliemae/ds-grid";
|
|
2
|
+
import React2, { useContext, useCallback } from "react";
|
|
5
3
|
import { StyledListWrapper, StyledList, StyledVirtualListWrapper } from "./styled";
|
|
6
4
|
import { AutocompleteDataTestid } from "../../AutocompleteDataTestids";
|
|
7
5
|
import AutocompleteContext from "../../AutocompleteCTX";
|
|
8
|
-
import { useOnElementResize } from "../../utils/hooks/useOnElementResize";
|
|
9
6
|
import { useItemRenderer } from "./useItemRenderer";
|
|
10
|
-
import { useMenuList } from "./useMenuList";
|
|
11
7
|
const MenuList = () => {
|
|
12
8
|
const {
|
|
13
|
-
props: {
|
|
9
|
+
props: { options },
|
|
14
10
|
referenceElement,
|
|
15
11
|
inputRef,
|
|
16
12
|
listRef,
|
|
17
13
|
showPopover,
|
|
18
|
-
wrapperListRef,
|
|
19
|
-
controlsWrapperRef,
|
|
20
14
|
virtualListHelpers: { totalSize }
|
|
21
15
|
} = useContext(AutocompleteContext);
|
|
22
16
|
const ItemRenderer = useItemRenderer();
|
|
23
|
-
useMenuList();
|
|
24
|
-
const { width } = useOnElementResize(controlsWrapperRef);
|
|
25
|
-
const listWidth = useMemo(() => menuMinWidth || `${referenceElement?.offsetWidth}`, [menuMinWidth, referenceElement, width]);
|
|
26
17
|
const handleOnFocus = useCallback(() => {
|
|
27
18
|
inputRef.current?.focus();
|
|
28
19
|
}, [inputRef]);
|
|
29
20
|
return /* @__PURE__ */ React2.createElement(StyledListWrapper, {
|
|
30
21
|
tabIndex: -1,
|
|
31
|
-
ref: wrapperListRef,
|
|
32
22
|
onMouseDown: (e) => e.preventDefault(),
|
|
33
|
-
minWidth:
|
|
34
|
-
id: "
|
|
23
|
+
minWidth: referenceElement?.offsetWidth,
|
|
24
|
+
id: "autocomplete-listbox",
|
|
35
25
|
role: "listbox"
|
|
36
|
-
},
|
|
37
|
-
justifyContent: "center",
|
|
38
|
-
alignItems: "center",
|
|
39
|
-
style: { padding: 20 }
|
|
40
|
-
}, /* @__PURE__ */ React2.createElement(DSCircularProgressIndicator, {
|
|
41
|
-
size: "l",
|
|
42
|
-
loading: isLoading,
|
|
43
|
-
waiting: false,
|
|
44
|
-
showTooltip: false
|
|
45
|
-
})) : /* @__PURE__ */ React2.createElement(React2.Fragment, null, options.length > 0 && /* @__PURE__ */ React2.createElement(StyledVirtualListWrapper, {
|
|
26
|
+
}, options.length > 0 && /* @__PURE__ */ React2.createElement(StyledVirtualListWrapper, {
|
|
46
27
|
tabIndex: -1,
|
|
47
|
-
maxHeight: menuMaxHeight,
|
|
48
28
|
ref: listRef
|
|
49
29
|
}, /* @__PURE__ */ React2.createElement(StyledList, {
|
|
50
30
|
tabIndex: -1,
|
|
@@ -52,7 +32,7 @@ const MenuList = () => {
|
|
|
52
32
|
onFocus: handleOnFocus,
|
|
53
33
|
"data-testid": AutocompleteDataTestid.LIST,
|
|
54
34
|
style: { height: totalSize, margin: "8px 0px" }
|
|
55
|
-
}, ItemRenderer)))
|
|
35
|
+
}, ItemRenderer)));
|
|
56
36
|
};
|
|
57
37
|
export {
|
|
58
38
|
MenuList
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../../scripts/build/transpile/react-shim.js", "../../../../../src/autocomplete/parts/menu-list/MenuList.tsx"],
|
|
4
|
-
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import React, { useContext,
|
|
5
|
-
"mappings": "AAAA;ACAA;AACA;AACA;
|
|
4
|
+
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import React, { useContext, useCallback } from 'react';\nimport { StyledListWrapper, StyledList, StyledVirtualListWrapper } from './styled';\nimport { AutocompleteDataTestid } from '../../AutocompleteDataTestids';\nimport AutocompleteContext from '../../AutocompleteCTX';\nimport { useItemRenderer } from './useItemRenderer';\n\nexport const MenuList = (): JSX.Element => {\n const {\n props: { options },\n referenceElement,\n inputRef,\n listRef,\n showPopover,\n virtualListHelpers: { totalSize },\n } = useContext(AutocompleteContext);\n\n const ItemRenderer = useItemRenderer();\n\n const handleOnFocus = useCallback(() => {\n inputRef.current?.focus();\n }, [inputRef]);\n\n return (\n <StyledListWrapper\n tabIndex={-1}\n onMouseDown={(e) => e.preventDefault()}\n minWidth={referenceElement?.offsetWidth}\n id=\"autocomplete-listbox\"\n role=\"listbox\"\n >\n {options.length > 0 && (\n <StyledVirtualListWrapper tabIndex={-1} ref={listRef}>\n <StyledList\n tabIndex={-1}\n aria-expanded={showPopover}\n onFocus={handleOnFocus}\n data-testid={AutocompleteDataTestid.LIST}\n style={{ height: totalSize, margin: '8px 0px' }}\n >\n {ItemRenderer}\n </StyledList>\n </StyledVirtualListWrapper>\n )}\n </StyledListWrapper>\n );\n};\n"],
|
|
5
|
+
"mappings": "AAAA;ACAA;AACA;AACA;AACA;AACA;AAEO,MAAM,WAAW,MAAmB;AACzC,QAAM;AAAA,IACJ,OAAO,EAAE;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,oBAAoB,EAAE;AAAA,MACpB,WAAW;AAEf,QAAM,eAAe;AAErB,QAAM,gBAAgB,YAAY,MAAM;AACtC,aAAS,SAAS;AAAA,KACjB,CAAC;AAEJ,SACE,qCAAC,mBAAD;AAAA,IACE,UAAU;AAAA,IACV,aAAa,CAAC,MAAM,EAAE;AAAA,IACtB,UAAU,kBAAkB;AAAA,IAC5B,IAAG;AAAA,IACH,MAAK;AAAA,KAEJ,QAAQ,SAAS,KAChB,qCAAC,0BAAD;AAAA,IAA0B,UAAU;AAAA,IAAI,KAAK;AAAA,KAC3C,qCAAC,YAAD;AAAA,IACE,UAAU;AAAA,IACV,iBAAe;AAAA,IACf,SAAS;AAAA,IACT,eAAa,uBAAuB;AAAA,IACpC,OAAO,EAAE,QAAQ,WAAW,QAAQ;AAAA,KAEnC;AAAA;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import styled from "styled-components";
|
|
3
3
|
const StyledListWrapper = styled.div`
|
|
4
|
-
min-width: ${(
|
|
4
|
+
min-width: ${({ minWidth }) => minWidth ? `${minWidth}px` : "100%"};
|
|
5
5
|
`;
|
|
6
6
|
const StyledList = styled.ul`
|
|
7
7
|
position: relative;
|
|
@@ -9,9 +9,7 @@ const StyledList = styled.ul`
|
|
|
9
9
|
`;
|
|
10
10
|
const StyledVirtualListWrapper = styled.div`
|
|
11
11
|
overflow-y: auto;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
max-height: ${({ maxHeight, inline }) => inline ? "" : `${!maxHeight ? "400" : maxHeight}px`};
|
|
12
|
+
max-height: ${({ maxHeight }) => `${!maxHeight ? "400" : maxHeight}px`};
|
|
15
13
|
`;
|
|
16
14
|
export {
|
|
17
15
|
StyledList,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../../scripts/build/transpile/react-shim.js", "../../../../../src/autocomplete/parts/menu-list/styled.tsx"],
|
|
4
|
-
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import styled from 'styled-components';\n\nexport const StyledListWrapper = styled.div<{
|
|
5
|
-
"mappings": "AAAA;ACAA;AAEO,MAAM,oBAAoB,OAAO;AAAA,eACzB,CAAC,
|
|
4
|
+
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import styled from 'styled-components';\n\nexport const StyledListWrapper = styled.div<{ minWidth?: number | string }>`\n min-width: ${({ minWidth }) => (minWidth ? `${minWidth}px` : '100%')};\n`;\n\nexport const StyledList = styled.ul`\n position: relative;\n padding: 0;\n`;\n\nexport const StyledVirtualListWrapper = styled.div<{\n maxHeight: number;\n}>`\n overflow-y: auto;\n max-height: ${({ maxHeight }) => `${!maxHeight ? '400' : maxHeight}px`};\n`;\n"],
|
|
5
|
+
"mappings": "AAAA;ACAA;AAEO,MAAM,oBAAoB,OAAO;AAAA,eACzB,CAAC,EAAE,eAAgB,WAAW,GAAG,eAAe;AAAA;AAGxD,MAAM,aAAa,OAAO;AAAA;AAAA;AAAA;AAK1B,MAAM,2BAA2B,OAAO;AAAA;AAAA,gBAI/B,CAAC,EAAE,gBAAgB,GAAG,CAAC,YAAY,QAAQ;AAAA;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -19,54 +19,52 @@ var __spreadValues = (a, b) => {
|
|
|
19
19
|
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
20
|
import * as React from "react";
|
|
21
21
|
import React2, { useMemo, useContext, useCallback } from "react";
|
|
22
|
-
import { SingleMenuItem } from "@elliemae/ds-common/MenuItem";
|
|
23
|
-
import
|
|
24
|
-
import { isSelected } from "../../utils/listHelper";
|
|
22
|
+
import { SingleMenuItem, Section } from "@elliemae/ds-common/MenuItem";
|
|
23
|
+
import AutocompleteContext from "../../AutocompleteCTX";
|
|
25
24
|
import { AutocompleteDataTestid } from "../../AutocompleteDataTestids";
|
|
26
25
|
const useItemRenderer = () => {
|
|
27
26
|
const {
|
|
28
|
-
props: { options,
|
|
27
|
+
props: { options, onSelect },
|
|
29
28
|
inputRef,
|
|
30
29
|
setShowPopover,
|
|
31
30
|
focusOptionIdx,
|
|
32
31
|
virtualListHelpers
|
|
33
32
|
} = useContext(AutocompleteContext);
|
|
34
|
-
const { virtualItems } = virtualListHelpers;
|
|
35
33
|
const handleClick = useCallback((option, e) => {
|
|
36
|
-
|
|
37
|
-
inputRef.current.value = option.label;
|
|
38
|
-
onFilter(option.label);
|
|
39
|
-
onChange(option.label);
|
|
34
|
+
onSelect(option.label, e);
|
|
40
35
|
setShowPopover(false);
|
|
41
|
-
inputRef.current?.focus();
|
|
42
36
|
e.stopPropagation();
|
|
43
37
|
e.preventDefault();
|
|
44
|
-
}, [
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
38
|
+
}, [onSelect, setShowPopover]);
|
|
39
|
+
return useMemo(() => {
|
|
40
|
+
if (virtualListHelpers) {
|
|
41
|
+
return virtualListHelpers.virtualItems.map((vItem) => {
|
|
42
|
+
const option = options[vItem.index];
|
|
43
|
+
const generalProps = {
|
|
44
|
+
wrapperStyles: { position: "absolute", top: vItem.start, left: 0, width: "100%" },
|
|
45
|
+
key: `${option.dsId}`,
|
|
46
|
+
innerRef: vItem.measureRef
|
|
47
|
+
};
|
|
48
|
+
if (option.type === "section") {
|
|
49
|
+
return /* @__PURE__ */ React2.createElement(Section, __spreadValues({
|
|
50
|
+
label: option.label
|
|
51
|
+
}, generalProps));
|
|
52
|
+
}
|
|
53
|
+
if (option.type === "option") {
|
|
54
|
+
return /* @__PURE__ */ React2.createElement(SingleMenuItem, __spreadProps(__spreadValues({}, generalProps), {
|
|
55
|
+
value: option.value,
|
|
56
|
+
label: option.label,
|
|
57
|
+
dataTestid: AutocompleteDataTestid.OPTION,
|
|
58
|
+
disabled: option.disabled,
|
|
59
|
+
onClick: (e) => handleClick(option, e),
|
|
60
|
+
isActive: option.dsId === focusOptionIdx
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
63
|
+
return /* @__PURE__ */ React2.createElement(React2.Fragment, null);
|
|
64
|
+
});
|
|
66
65
|
}
|
|
67
|
-
return
|
|
68
|
-
}
|
|
69
|
-
return ItemRenderer;
|
|
66
|
+
return null;
|
|
67
|
+
}, [options, focusOptionIdx, inputRef, virtualListHelpers]);
|
|
70
68
|
};
|
|
71
69
|
export {
|
|
72
70
|
useItemRenderer
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../../scripts/build/transpile/react-shim.js", "../../../../../src/autocomplete/parts/menu-list/useItemRenderer.tsx"],
|
|
4
|
-
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable react-hooks/exhaustive-deps */\nimport React, { useMemo, useContext, useCallback } from 'react';\nimport {
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;ACCA;
|
|
4
|
+
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable react-hooks/exhaustive-deps */\nimport React, { useMemo, useContext, useCallback } from 'react';\nimport { SingleMenuItem, Section } from '@elliemae/ds-common/MenuItem';\nimport AutocompleteContext from '../../AutocompleteCTX';\nimport { AutocompleteDataTestid } from '../../AutocompleteDataTestids';\nimport { DSAutocompleteT } from '../../react-desc-prop-types';\n\nexport const useItemRenderer = (): Array<JSX.Element> | null => {\n const {\n props: { options, onSelect },\n inputRef,\n setShowPopover,\n focusOptionIdx,\n virtualListHelpers,\n } = useContext(AutocompleteContext);\n\n const handleClick = useCallback(\n (option: DSAutocompleteT.ItemOption, e: React.ChangeEvent<HTMLInputElement>) => {\n onSelect(option.label, e);\n setShowPopover(false);\n e.stopPropagation();\n e.preventDefault();\n },\n [onSelect, setShowPopover],\n );\n\n return useMemo(() => {\n if (virtualListHelpers) {\n return virtualListHelpers.virtualItems.map((vItem) => {\n const option = options[vItem.index];\n const generalProps = {\n wrapperStyles: { position: 'absolute', top: vItem.start, left: 0, width: '100%' },\n key: `${option.dsId}`,\n innerRef: vItem.measureRef,\n };\n if (option.type === 'section') {\n return <Section label={option.label} {...generalProps} />;\n }\n if (option.type === 'option') {\n return (\n <SingleMenuItem\n {...generalProps}\n value={option.value}\n label={option.label}\n dataTestid={AutocompleteDataTestid.OPTION}\n disabled={option.disabled}\n onClick={(e: React.ChangeEvent<HTMLInputElement>) => handleClick(option, e)}\n isActive={option.dsId === focusOptionIdx}\n />\n );\n }\n return <></>;\n });\n }\n return null;\n }, [options, focusOptionIdx, inputRef, virtualListHelpers]);\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;ACCA;AACA;AACA;AACA;AAGO,MAAM,kBAAkB,MAAiC;AAC9D,QAAM;AAAA,IACJ,OAAO,EAAE,SAAS;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAW;AAEf,QAAM,cAAc,YAClB,CAAC,QAAoC,MAA2C;AAC9E,aAAS,OAAO,OAAO;AACvB,mBAAe;AACf,MAAE;AACF,MAAE;AAAA,KAEJ,CAAC,UAAU;AAGb,SAAO,QAAQ,MAAM;AACnB,QAAI,oBAAoB;AACtB,aAAO,mBAAmB,aAAa,IAAI,CAAC,UAAU;AACpD,cAAM,SAAS,QAAQ,MAAM;AAC7B,cAAM,eAAe;AAAA,UACnB,eAAe,EAAE,UAAU,YAAY,KAAK,MAAM,OAAO,MAAM,GAAG,OAAO;AAAA,UACzE,KAAK,GAAG,OAAO;AAAA,UACf,UAAU,MAAM;AAAA;AAElB,YAAI,OAAO,SAAS,WAAW;AAC7B,iBAAO,qCAAC,SAAD;AAAA,YAAS,OAAO,OAAO;AAAA,aAAW;AAAA;AAE3C,YAAI,OAAO,SAAS,UAAU;AAC5B,iBACE,qCAAC,gBAAD,iCACM,eADN;AAAA,YAEE,OAAO,OAAO;AAAA,YACd,OAAO,OAAO;AAAA,YACd,YAAY,uBAAuB;AAAA,YACnC,UAAU,OAAO;AAAA,YACjB,SAAS,CAAC,MAA2C,YAAY,QAAQ;AAAA,YACzE,UAAU,OAAO,SAAS;AAAA;AAAA;AAIhC,eAAO;AAAA;AAAA;AAGX,WAAO;AAAA,KACN,CAAC,SAAS,gBAAgB,UAAU;AAAA;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,17 +1,12 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import { PropTypes } from "@elliemae/ds-props-helpers";
|
|
3
|
-
function noop(..._args) {
|
|
4
|
-
}
|
|
5
3
|
const propTypes = {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
hasError: PropTypes.bool.description("Whether the combo box has error or not").defaultValue("false"),
|
|
11
|
-
onChange: PropTypes.func.description("function triggered when an option is selected it will send the options selected").defaultValue("")
|
|
4
|
+
options: PropTypes.oneOfType([PropTypes.array, PropTypes.object]).isRequired.description("List of options").defaultValue([]),
|
|
5
|
+
filter: PropTypes.string.isRequired.description("String value to filter the options").defaultValue(""),
|
|
6
|
+
onSelect: PropTypes.func.isRequired.description("function triggered when an option is selected it will send the options selected").defaultValue(""),
|
|
7
|
+
children: PropTypes.node.isRequired.description("React component to apply autocomplete functionality").defaultValue("")
|
|
12
8
|
};
|
|
13
9
|
export {
|
|
14
|
-
noop,
|
|
15
10
|
propTypes
|
|
16
11
|
};
|
|
17
12
|
//# sourceMappingURL=react-desc-prop-types.js.map
|