From 4b5a019aa42818b8c7dcd52f3f43038d4fff537b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bed=C5=99ich=20Schindler?= Date: Mon, 6 Jul 2026 17:39:49 +0200 Subject: [PATCH] Introduce `MultiSelectField` (#574) --- mkdocs.yml | 1 + src/components/FormLayout/README.md | 10 +- src/components/InputGroup/InputGroup.jsx | 1 + src/components/InputGroup/README.md | 84 +- .../MultiSelectField/MultiSelectField.jsx | 472 +++++++ .../MultiSelectField.module.scss | 146 +++ src/components/MultiSelectField/README.md | 1159 +++++++++++++++++ .../__tests__/MultiSelectField.spec.tsx | 981 ++++++++++++++ ...ComponentProps-object-1-chromium-linux.png | Bin 0 -> 2665 bytes ...ariant-string-outline-1-chromium-linux.png | Bin 0 -> 2922 bytes ...ariant-string-outline-1-chromium-linux.png | Bin 0 -> 2665 bytes ...variant-string-filled-1-chromium-linux.png | Bin 0 -> 2575 bytes ...ariant-string-outline-1-chromium-linux.png | Bin 0 -> 2928 bytes ...variant-string-filled-1-chromium-linux.png | Bin 0 -> 2746 bytes ...ariant-string-outline-1-chromium-linux.png | Bin 0 -> 2383 bytes ...variant-string-filled-1-chromium-linux.png | Bin 0 -> 2734 bytes ...ariant-string-outline-1-chromium-linux.png | Bin 0 -> 2631 bytes ...variant-string-filled-1-chromium-linux.png | Bin 0 -> 2493 bytes ...ariant-string-outline-1-chromium-linux.png | Bin 0 -> 2947 bytes ...ariant-string-outline-1-chromium-linux.png | Bin 0 -> 2687 bytes ...ariant-string-outline-1-chromium-linux.png | Bin 0 -> 2639 bytes ...variant-string-filled-1-chromium-linux.png | Bin 0 -> 2323 bytes ...variant-string-filled-1-chromium-linux.png | Bin 0 -> 2458 bytes ...variant-string-filled-1-chromium-linux.png | Bin 0 -> 2739 bytes ...variant-string-filled-1-chromium-linux.png | Bin 0 -> 2477 bytes ...s-shape-defaultOpened-1-chromium-linux.png | Bin 0 -> 6850 bytes ...-searchAlgorithm-null-1-chromium-linux.png | Bin 0 -> 6808 bytes ...ned-size-string-large-1-chromium-linux.png | Bin 0 -> 7486 bytes ...ned-size-string-small-1-chromium-linux.png | Bin 0 -> 6459 bytes ...aultPartiallyDisabled-1-chromium-linux.png | Bin 0 -> 6806 bytes ...options-shape-grouped-1-chromium-linux.png | Bin 0 -> 8023 bytes ...tiallyDisabledGrouped-1-chromium-linux.png | Bin 0 -> 10745 bytes ...-shape-searchFiltered-1-chromium-linux.png | Bin 0 -> 6488 bytes ...-searchWithoutResults-1-chromium-linux.png | Bin 0 -> 6931 bytes ...selectedOptionFocused-1-chromium-linux.png | Bin 0 -> 6762 bytes ...out-string-horizontal-1-chromium-linux.png | Bin 0 -> 2476 bytes ...ayout-string-vertical-1-chromium-linux.png | Bin 0 -> 2665 bytes ...out-string-horizontal-1-chromium-linux.png | Bin 0 -> 2898 bytes ...ayout-string-vertical-1-chromium-linux.png | Bin 0 -> 3196 bytes ...validationText-string-1-chromium-linux.png | Bin 0 -> 5281 bytes ...idationText-undefined-1-chromium-linux.png | Bin 0 -> 4358 bytes ...validationText-string-1-chromium-linux.png | Bin 0 -> 4706 bytes ...Visible-boolean-false-1-chromium-linux.png | Bin 0 -> 1638 bytes ...lVisible-boolean-true-1-chromium-linux.png | Bin 0 -> 2665 bytes ...ual-label-node-normal-1-chromium-linux.png | Bin 0 -> 3141 bytes ...ual-label-string-long-1-chromium-linux.png | Bin 0 -> 6521 bytes ...equired-boolean-false-1-chromium-linux.png | Bin 0 -> 2665 bytes ...nState-string-invalid-1-chromium-linux.png | Bin 0 -> 2928 bytes ...ionState-string-valid-1-chromium-linux.png | Bin 0 -> 2947 bytes ...nState-string-warning-1-chromium-linux.png | Bin 0 -> 2922 bytes ...dationState-undefined-1-chromium-linux.png | Bin 0 -> 2665 bytes ...Required-boolean-true-1-chromium-linux.png | Bin 0 -> 2796 bytes ...nState-string-invalid-1-chromium-linux.png | Bin 0 -> 3080 bytes ...ionState-string-valid-1-chromium-linux.png | Bin 0 -> 3096 bytes ...nState-string-warning-1-chromium-linux.png | Bin 0 -> 3076 bytes ...dationState-undefined-1-chromium-linux.png | Bin 0 -> 2796 bytes ...equired-boolean-false-1-chromium-linux.png | Bin 0 -> 2665 bytes ...nState-string-invalid-1-chromium-linux.png | Bin 0 -> 2928 bytes ...ionState-string-valid-1-chromium-linux.png | Bin 0 -> 2947 bytes ...nState-string-warning-1-chromium-linux.png | Bin 0 -> 2922 bytes ...dationState-undefined-1-chromium-linux.png | Bin 0 -> 2665 bytes ...required-boolean-true-1-chromium-linux.png | Bin 0 -> 2796 bytes ...nState-string-invalid-1-chromium-linux.png | Bin 0 -> 3080 bytes ...ionState-string-valid-1-chromium-linux.png | Bin 0 -> 3096 bytes ...nState-string-warning-1-chromium-linux.png | Bin 0 -> 3076 bytes ...dationState-undefined-1-chromium-linux.png | Bin 0 -> 2796 bytes ...ual-size-string-large-1-chromium-linux.png | Bin 0 -> 2957 bytes ...al-size-string-medium-1-chromium-linux.png | Bin 0 -> 2665 bytes ...ual-size-string-small-1-chromium-linux.png | Bin 0 -> 2403 bytes ...out-string-horizontal-1-chromium-linux.png | Bin 0 -> 4562 bytes ...ayout-string-vertical-1-chromium-linux.png | Bin 0 -> 4777 bytes .../__tests__/MultiSelectField.story.tsx | 138 ++ .../openMultiSelectFieldOptionsTest.ts | 142 ++ .../MultiSelectFieldDropdown.jsx | 175 +++ .../MultiSelectFieldDropdown.module.scss | 17 + .../MultiSelectFieldDropdown/index.js | 1 + .../MultiSelectFieldDropdownGroup.jsx | 25 + .../MultiSelectFieldDropdownGroup.module.scss | 17 + .../MultiSelectFieldDropdownGroup/index.js | 1 + .../MultiSelectFieldDropdownItem.jsx | 85 ++ .../MultiSelectFieldDropdownItem.module.scss | 52 + .../MultiSelectFieldDropdownItem/index.js | 1 + .../MultiSelectFieldDropdownTextItem.jsx | 17 + ...ltiSelectFieldDropdownTextItem.module.scss | 16 + .../MultiSelectFieldDropdownTextItem/index.js | 1 + .../MultiSelectFieldSearchInput.jsx | 94 ++ .../MultiSelectFieldSearchInput.module.scss | 34 + .../MultiSelectFieldSearchInput/index.js | 1 + .../MultiSelectFieldTag.jsx | 87 ++ .../MultiSelectFieldTag.module.scss | 67 + .../_components/MultiSelectFieldTag/index.js | 1 + .../__tests__/getOptionsLabelMap.test.js | 44 + .../__tests__/isPrintableCharacterKey.test.js | 30 + .../_helpers/__tests__/keyDetected.test.js | 30 + .../_helpers/getOptionsLabelMap.js | 26 + .../_helpers/isPrintableCharacterKey.js | 12 + .../MultiSelectField/_helpers/keyDetected.js | 13 + ...itiveAccentInsensitivePrefixSearch.test.js | 31 + ...veAccentInsensitiveSubstringSearch.test.js | 31 + ...nsitiveAccentSensitivePrefixSearch.test.js | 32 + ...tiveAccentSensitiveSubstringSearch.test.js | 31 + .../__tests__/genericSearch.test.js | 138 ++ ...sitiveAccentInsensitivePrefixComparator.js | 15 + ...iveAccentInsensitiveSubstringComparator.js | 15 + ...ensitiveAccentSensitivePrefixComparator.js | 13 + ...itiveAccentSensitiveSubstringComparator.js | 13 + .../_helpers/__tests__/removeAccent.test.js | 13 + .../_helpers/removeAccent.js | 10 + ...nsensitiveAccentInsensitivePrefixSearch.js | 17 + ...nsitiveAccentInsensitiveSubstringSearch.js | 17 + ...eInsensitiveAccentSensitivePrefixSearch.js | 17 + ...sensitiveAccentSensitiveSubstringSearch.js | 17 + .../_searchAlgorithms/genericSearch.js | 51 + src/components/MultiSelectField/_theme.scss | 68 + src/components/MultiSelectField/index.js | 6 + .../MultiSelectField/keyBindings.js | 9 + src/hooks/__tests__/useClickOutside.test.jsx | 70 + src/hooks/useClickOutside.js | 25 + src/index.js | 8 + src/theme.scss | 46 + src/translations/en.js | 5 + webpack.config.babel.js | 2 +- 122 files changed, 4674 insertions(+), 7 deletions(-) create mode 100644 src/components/MultiSelectField/MultiSelectField.jsx create mode 100644 src/components/MultiSelectField/MultiSelectField.module.scss create mode 100644 src/components/MultiSelectField/README.md create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-defaultComponentProps-object-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-disabled-boolean--048b9-State-string-warning-variant-string-outline-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-disabled-boolean--29ae6-ationState-undefined-variant-string-outline-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-disabled-boolean--3fbc6-dationState-undefined-variant-string-filled-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-disabled-boolean--4506b-State-string-invalid-variant-string-outline-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-disabled-boolean--6c549-ionState-string-valid-variant-string-filled-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-disabled-boolean--6ce0f-ationState-undefined-variant-string-outline-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-disabled-boolean--7032a-nState-string-invalid-variant-string-filled-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-disabled-boolean--7ef8f-State-string-invalid-variant-string-outline-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-disabled-boolean--809d8-ionState-string-valid-variant-string-filled-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-disabled-boolean--90e99-onState-string-valid-variant-string-outline-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-disabled-boolean--bd913-onState-string-valid-variant-string-outline-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-disabled-boolean--c4bb7-State-string-warning-variant-string-outline-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-disabled-boolean--c4c6c-dationState-undefined-variant-string-filled-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-disabled-boolean--c9c51-nState-string-warning-variant-string-filled-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-disabled-boolean--cf6de-nState-string-warning-variant-string-filled-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-disabled-boolean--e6fdb-nState-string-invalid-variant-string-filled-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-fullPage-options-shape-defaultOpened-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-fullPage-options-shape-defaultOpened-searchAlgorithm-null-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-fullPage-options-shape-defaultOpened-size-string-large-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-fullPage-options-shape-defaultOpened-size-string-small-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-fullPage-options-shape-defaultPartiallyDisabled-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-fullPage-options-shape-grouped-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-fullPage-options-shape-partiallyDisabledGrouped-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-fullPage-options-shape-searchFiltered-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-fullPage-options-shape-searchWithoutResults-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-fullPage-options-shape-selectedOptionFocused-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-fullWidth-boolean-false-layout-string-horizontal-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-fullWidth-boolean-false-layout-string-vertical-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-fullWidth-boolean-true-layout-string-horizontal-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-fullWidth-boolean-true-layout-string-vertical-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-helpText-string-validationText-string-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-helpText-string-validationText-undefined-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-helpText-undefined-validationText-string-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-isLabelVisible-boolean-false-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-isLabelVisible-boolean-true-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-label-node-normal-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-label-string-long-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-renderAsRequired-boolean-false-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-renderAsRequired-boolean-false-validationState-string-invalid-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-renderAsRequired-boolean-false-validationState-string-valid-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-renderAsRequired-boolean-false-validationState-string-warning-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-renderAsRequired-boolean-false-validationState-undefined-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-renderAsRequired-boolean-true-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-renderAsRequired-boolean-true-validationState-string-invalid-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-renderAsRequired-boolean-true-validationState-string-valid-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-renderAsRequired-boolean-true-validationState-string-warning-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-renderAsRequired-boolean-true-validationState-undefined-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-required-boolean-false-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-required-boolean-false-validationState-string-invalid-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-required-boolean-false-validationState-string-valid-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-required-boolean-false-validationState-string-warning-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-required-boolean-false-validationState-undefined-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-required-boolean-true-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-required-boolean-true-validationState-string-invalid-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-required-boolean-true-validationState-string-valid-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-required-boolean-true-validationState-string-warning-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-required-boolean-true-validationState-undefined-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-size-string-large-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-size-string-medium-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-base-visual-size-string-small-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-formLayout-visual-layout-string-horizontal-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.spec.tsx-snapshots/MultiSelectField-formLayout-visual-layout-string-vertical-1-chromium-linux.png create mode 100644 src/components/MultiSelectField/__tests__/MultiSelectField.story.tsx create mode 100644 src/components/MultiSelectField/__tests__/_propTests/openMultiSelectFieldOptionsTest.ts create mode 100644 src/components/MultiSelectField/_components/MultiSelectFieldDropdown/MultiSelectFieldDropdown.jsx create mode 100644 src/components/MultiSelectField/_components/MultiSelectFieldDropdown/MultiSelectFieldDropdown.module.scss create mode 100644 src/components/MultiSelectField/_components/MultiSelectFieldDropdown/index.js create mode 100644 src/components/MultiSelectField/_components/MultiSelectFieldDropdownGroup/MultiSelectFieldDropdownGroup.jsx create mode 100644 src/components/MultiSelectField/_components/MultiSelectFieldDropdownGroup/MultiSelectFieldDropdownGroup.module.scss create mode 100644 src/components/MultiSelectField/_components/MultiSelectFieldDropdownGroup/index.js create mode 100644 src/components/MultiSelectField/_components/MultiSelectFieldDropdownItem/MultiSelectFieldDropdownItem.jsx create mode 100644 src/components/MultiSelectField/_components/MultiSelectFieldDropdownItem/MultiSelectFieldDropdownItem.module.scss create mode 100644 src/components/MultiSelectField/_components/MultiSelectFieldDropdownItem/index.js create mode 100644 src/components/MultiSelectField/_components/MultiSelectFieldDropdownTextItem/MultiSelectFieldDropdownTextItem.jsx create mode 100644 src/components/MultiSelectField/_components/MultiSelectFieldDropdownTextItem/MultiSelectFieldDropdownTextItem.module.scss create mode 100644 src/components/MultiSelectField/_components/MultiSelectFieldDropdownTextItem/index.js create mode 100644 src/components/MultiSelectField/_components/MultiSelectFieldSearchInput/MultiSelectFieldSearchInput.jsx create mode 100644 src/components/MultiSelectField/_components/MultiSelectFieldSearchInput/MultiSelectFieldSearchInput.module.scss create mode 100644 src/components/MultiSelectField/_components/MultiSelectFieldSearchInput/index.js create mode 100644 src/components/MultiSelectField/_components/MultiSelectFieldTag/MultiSelectFieldTag.jsx create mode 100644 src/components/MultiSelectField/_components/MultiSelectFieldTag/MultiSelectFieldTag.module.scss create mode 100644 src/components/MultiSelectField/_components/MultiSelectFieldTag/index.js create mode 100644 src/components/MultiSelectField/_helpers/__tests__/getOptionsLabelMap.test.js create mode 100644 src/components/MultiSelectField/_helpers/__tests__/isPrintableCharacterKey.test.js create mode 100644 src/components/MultiSelectField/_helpers/__tests__/keyDetected.test.js create mode 100644 src/components/MultiSelectField/_helpers/getOptionsLabelMap.js create mode 100644 src/components/MultiSelectField/_helpers/isPrintableCharacterKey.js create mode 100644 src/components/MultiSelectField/_helpers/keyDetected.js create mode 100644 src/components/MultiSelectField/_searchAlgorithms/__tests__/caseInsensitiveAccentInsensitivePrefixSearch.test.js create mode 100644 src/components/MultiSelectField/_searchAlgorithms/__tests__/caseInsensitiveAccentInsensitiveSubstringSearch.test.js create mode 100644 src/components/MultiSelectField/_searchAlgorithms/__tests__/caseInsensitiveAccentSensitivePrefixSearch.test.js create mode 100644 src/components/MultiSelectField/_searchAlgorithms/__tests__/caseInsensitiveAccentSensitiveSubstringSearch.test.js create mode 100644 src/components/MultiSelectField/_searchAlgorithms/__tests__/genericSearch.test.js create mode 100644 src/components/MultiSelectField/_searchAlgorithms/_comparators/caseInsensitiveAccentInsensitivePrefixComparator.js create mode 100644 src/components/MultiSelectField/_searchAlgorithms/_comparators/caseInsensitiveAccentInsensitiveSubstringComparator.js create mode 100644 src/components/MultiSelectField/_searchAlgorithms/_comparators/caseInsensitiveAccentSensitivePrefixComparator.js create mode 100644 src/components/MultiSelectField/_searchAlgorithms/_comparators/caseInsensitiveAccentSensitiveSubstringComparator.js create mode 100644 src/components/MultiSelectField/_searchAlgorithms/_helpers/__tests__/removeAccent.test.js create mode 100644 src/components/MultiSelectField/_searchAlgorithms/_helpers/removeAccent.js create mode 100644 src/components/MultiSelectField/_searchAlgorithms/caseInsensitiveAccentInsensitivePrefixSearch.js create mode 100644 src/components/MultiSelectField/_searchAlgorithms/caseInsensitiveAccentInsensitiveSubstringSearch.js create mode 100644 src/components/MultiSelectField/_searchAlgorithms/caseInsensitiveAccentSensitivePrefixSearch.js create mode 100644 src/components/MultiSelectField/_searchAlgorithms/caseInsensitiveAccentSensitiveSubstringSearch.js create mode 100644 src/components/MultiSelectField/_searchAlgorithms/genericSearch.js create mode 100644 src/components/MultiSelectField/_theme.scss create mode 100644 src/components/MultiSelectField/index.js create mode 100644 src/components/MultiSelectField/keyBindings.js create mode 100644 src/hooks/__tests__/useClickOutside.test.jsx create mode 100644 src/hooks/useClickOutside.js diff --git a/mkdocs.yml b/mkdocs.yml index fa640c9e..67273a22 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -103,6 +103,7 @@ nav: - Inputs: - CheckBoxField: 'components/CheckboxField/README.md' - FileInputField: 'components/FileInputField/README.md' + - MultiSelectField: 'components/MultiSelectField/README.md' - Radio: 'components/Radio/README.md' - SelectField: 'components/SelectField/README.md' - TextArea: 'components/TextArea/README.md' diff --git a/src/components/FormLayout/README.md b/src/components/FormLayout/README.md index 88d30953..7e778f9a 100644 --- a/src/components/FormLayout/README.md +++ b/src/components/FormLayout/README.md @@ -49,7 +49,8 @@ there are longer validation messages or help texts. The FormLayout supports buttons and all React UI form fields: [Button](/components/Button), [CheckboxField](/components/CheckboxField), -[FileInputField](/components/FileInputField), [Radio](/components/Radio), +[FileInputField](/components/FileInputField), +[MultiSelectField](/components/MultiSelectField), [Radio](/components/Radio), [SelectField](/components/SelectField), [TextArea](/components/TextArea), [TextField](/components/TextField), and [Toggle](/components/Toggle). @@ -57,6 +58,7 @@ The FormLayout supports buttons and all React UI form fields: React.createElement(() => { const [fieldLayout, setFieldLayout] = React.useState('horizontal'); const [fruit, setFruit] = React.useState('apple'); + const [preferredFruits, setPreferredFruits] = React.useState(['apple']); const [isDeliveryAddress, setIsDeliveryAddress] = React.useState(true); const [receiveNewsletter, setReceiveNewsletter] = React.useState(true); const options = [ @@ -137,6 +139,12 @@ React.createElement(() => { options={options} value={fruit} /> + setPreferredFruits(value)} + options={options} + value={preferredFruits} + />