@loadsmart/loadsmart-ui 7.6.0 → 7.7.0-beta.1
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/README.md +15 -1
- package/dist/DragDropFile.context-oKnUu6d3.js +33 -0
- package/dist/{DragDropFile.context-D-EBrXnw.js.map → DragDropFile.context-oKnUu6d3.js.map} +1 -1
- package/dist/index.js +9104 -253
- package/dist/index.js.map +1 -1
- package/dist/miranda-compatibility.theme-C_FEacSw.js +2528 -0
- package/dist/{miranda-compatibility.theme-ChPV-BBw.js.map → miranda-compatibility.theme-C_FEacSw.js.map} +1 -1
- package/dist/prop-B8LY6G2g.js +81 -0
- package/dist/{prop-BwhJNJHO.js.map → prop-B8LY6G2g.js.map} +1 -1
- package/dist/testing/index.js +282 -1
- package/dist/testing/index.js.map +1 -1
- package/dist/theming/index.js +22 -1
- package/dist/theming/index.js.map +1 -1
- package/dist/toArray-Dxb1kUxx.js +14 -0
- package/dist/{toArray-BW3gx_gH.js.map → toArray-Dxb1kUxx.js.map} +1 -1
- package/dist/tools/index.js +6 -1
- package/dist/tools/index.js.map +1 -1
- package/package.json +24 -54
- package/dist/DragDropFile.context-D-EBrXnw.js +0 -2
- package/dist/DragDropFile.context-jVTIKfj5.mjs +0 -29
- package/dist/DragDropFile.context-jVTIKfj5.mjs.map +0 -1
- package/dist/index.mjs +0 -8046
- package/dist/index.mjs.map +0 -1
- package/dist/miranda-compatibility.theme-ChPV-BBw.js +0 -2
- package/dist/miranda-compatibility.theme-DQDHkWzC.mjs +0 -2469
- package/dist/miranda-compatibility.theme-DQDHkWzC.mjs.map +0 -1
- package/dist/prop-5m3D4883.mjs +0 -54
- package/dist/prop-5m3D4883.mjs.map +0 -1
- package/dist/prop-BwhJNJHO.js +0 -2
- package/dist/testing/index.mjs +0 -228
- package/dist/testing/index.mjs.map +0 -1
- package/dist/theming/index.mjs +0 -20
- package/dist/theming/index.mjs.map +0 -1
- package/dist/toArray-BW3gx_gH.js +0 -2
- package/dist/toArray-DqgeO2ua.mjs +0 -8
- package/dist/toArray-DqgeO2ua.mjs.map +0 -1
- package/dist/tools/index.mjs +0 -7
- package/dist/tools/index.mjs.map +0 -1
- package/src/@types/@loadsmart/utilsFunction.d.ts +0 -5
- package/src/@types/@loadsmart/utilsObject.d.ts +0 -5
- package/src/@types/svg.d.ts +0 -4
- package/src/addons/Theme/register.js +0 -590
- package/src/common/BackButton/BackButton.tsx +0 -18
- package/src/common/BackButton/index.ts +0 -2
- package/src/common/CloseButton/CloseButton.tsx +0 -55
- package/src/common/CloseButton/index.ts +0 -2
- package/src/common/SelectionWrapper.tsx +0 -130
- package/src/components/Accordion/Accordion.context.tsx +0 -36
- package/src/components/Accordion/Accordion.stories.tsx +0 -186
- package/src/components/Accordion/Accordion.test.tsx +0 -209
- package/src/components/Accordion/Accordion.tsx +0 -233
- package/src/components/Accordion/index.ts +0 -2
- package/src/components/Banner/Banner.stories.tsx +0 -213
- package/src/components/Banner/Banner.test.tsx +0 -118
- package/src/components/Banner/Banner.tsx +0 -418
- package/src/components/Banner/index.tsx +0 -2
- package/src/components/Breadcrumbs/Breadbrumbs.test.tsx +0 -125
- package/src/components/Breadcrumbs/Breadcrumb.tsx +0 -92
- package/src/components/Breadcrumbs/Breadcrumbs.stories.tsx +0 -21
- package/src/components/Breadcrumbs/Breadcrumbs.tsx +0 -54
- package/src/components/Breadcrumbs/index.ts +0 -4
- package/src/components/Button/Button.stories.tsx +0 -174
- package/src/components/Button/Button.test.tsx +0 -57
- package/src/components/Button/Button.tsx +0 -576
- package/src/components/Button/index.tsx +0 -2
- package/src/components/Calendar/Calendar.helpers.ts +0 -15
- package/src/components/Calendar/Calendar.stories.tsx +0 -168
- package/src/components/Calendar/Calendar.test.tsx +0 -316
- package/src/components/Calendar/Calendar.tsx +0 -130
- package/src/components/Calendar/Calendar.types.ts +0 -68
- package/src/components/Calendar/Date.helper.test.ts +0 -847
- package/src/components/Calendar/Date.helper.ts +0 -461
- package/src/components/Calendar/DateFormat.helper.test.ts +0 -171
- package/src/components/Calendar/DateFormat.helper.ts +0 -195
- package/src/components/Calendar/Month.helper.test.ts +0 -187
- package/src/components/Calendar/Month.helper.ts +0 -172
- package/src/components/Calendar/PickerModeToggle.tsx +0 -61
- package/src/components/Calendar/Pickers/DayPicker.test.tsx +0 -85
- package/src/components/Calendar/Pickers/DayPicker.tsx +0 -127
- package/src/components/Calendar/Pickers/MonthPicker.test.tsx +0 -77
- package/src/components/Calendar/Pickers/MonthPicker.tsx +0 -51
- package/src/components/Calendar/Pickers/PickerButton.tsx +0 -119
- package/src/components/Calendar/Pickers/YearPicker.test.tsx +0 -75
- package/src/components/Calendar/Pickers/YearPicker.tsx +0 -52
- package/src/components/Calendar/index.ts +0 -10
- package/src/components/Calendar/useCalendar.ts +0 -190
- package/src/components/Calendar/usePickerMode.ts +0 -48
- package/src/components/Card/Card.stories.tsx +0 -117
- package/src/components/Card/Card.test.tsx +0 -139
- package/src/components/Card/Card.tsx +0 -106
- package/src/components/Card/CardTitle.tsx +0 -43
- package/src/components/Card/index.ts +0 -2
- package/src/components/Checkbox/Checkbox.stories.tsx +0 -79
- package/src/components/Checkbox/Checkbox.test.tsx +0 -66
- package/src/components/Checkbox/Checkbox.tsx +0 -170
- package/src/components/Checkbox/index.ts +0 -2
- package/src/components/DatePicker/DatePicker.stories.tsx +0 -113
- package/src/components/DatePicker/DatePicker.test.tsx +0 -174
- package/src/components/DatePicker/DatePicker.tsx +0 -140
- package/src/components/DatePicker/DatePicker.types.ts +0 -30
- package/src/components/DatePicker/DateRangePicker.stories.tsx +0 -128
- package/src/components/DatePicker/DateRangePicker.test.tsx +0 -267
- package/src/components/DatePicker/DateRangePicker.tsx +0 -110
- package/src/components/DatePicker/index.ts +0 -3
- package/src/components/DatePicker/useDatePicker.ts +0 -201
- package/src/components/DatePicker/useDateRangePicker.ts +0 -224
- package/src/components/Dialog/Dialog.stories.tsx +0 -227
- package/src/components/Dialog/Dialog.test.tsx +0 -74
- package/src/components/Dialog/Dialog.tsx +0 -139
- package/src/components/Dialog/index.tsx +0 -4
- package/src/components/Dialog/useDialog.tsx +0 -59
- package/src/components/DragDropFile/DragDropFile.context.tsx +0 -39
- package/src/components/DragDropFile/DragDropFile.stories.tsx +0 -183
- package/src/components/DragDropFile/DragDropFile.tsx +0 -11
- package/src/components/DragDropFile/components/DropZone.test.tsx +0 -108
- package/src/components/DragDropFile/components/DropZone.tsx +0 -145
- package/src/components/DragDropFile/components/FileItem.tsx +0 -117
- package/src/components/DragDropFile/components/FileList.test.tsx +0 -119
- package/src/components/DragDropFile/components/FileList.tsx +0 -47
- package/src/components/DragDropFile/components/Wrapper.tsx +0 -22
- package/src/components/DragDropFile/index.ts +0 -9
- package/src/components/DragDropFile/mocks.ts +0 -23
- package/src/components/DragDropFile/styles.tsx +0 -81
- package/src/components/DragDropFile/types.ts +0 -85
- package/src/components/Drawer/Drawer.stories.tsx +0 -83
- package/src/components/Drawer/Drawer.test.tsx +0 -90
- package/src/components/Drawer/Drawer.tsx +0 -225
- package/src/components/Drawer/index.ts +0 -4
- package/src/components/Dropdown/Dropdown.context.ts +0 -13
- package/src/components/Dropdown/Dropdown.fixtures.ts +0 -15
- package/src/components/Dropdown/Dropdown.stories.tsx +0 -259
- package/src/components/Dropdown/Dropdown.test.tsx +0 -173
- package/src/components/Dropdown/Dropdown.tsx +0 -141
- package/src/components/Dropdown/Dropdown.types.ts +0 -59
- package/src/components/Dropdown/DropdownMenu.tsx +0 -263
- package/src/components/Dropdown/DropdownTrigger.tsx +0 -368
- package/src/components/Dropdown/index.ts +0 -15
- package/src/components/Dropdown/useDropdown.test.ts +0 -96
- package/src/components/Dropdown/useDropdown.ts +0 -65
- package/src/components/EmptyState/EmptyState.mocks.tsx +0 -60
- package/src/components/EmptyState/EmptyState.stories.tsx +0 -239
- package/src/components/EmptyState/EmptyState.test.tsx +0 -101
- package/src/components/EmptyState/EmptyState.tsx +0 -22
- package/src/components/EmptyState/EmptyState.types.ts +0 -59
- package/src/components/EmptyState/EmptyStateWithIcon.tsx +0 -42
- package/src/components/EmptyState/EmptyStateWithIllustration.tsx +0 -72
- package/src/components/EmptyState/Illustration.tsx +0 -29
- package/src/components/EmptyState/index.ts +0 -4
- package/src/components/ErrorMessage/ErrorMessage.stories.tsx +0 -26
- package/src/components/ErrorMessage/ErrorMessage.test.tsx +0 -24
- package/src/components/ErrorMessage/ErrorMessage.tsx +0 -19
- package/src/components/ErrorMessage/index.ts +0 -2
- package/src/components/HighlightMatch/HighlightMatch.stories.tsx +0 -24
- package/src/components/HighlightMatch/HighlightMatch.test.tsx +0 -37
- package/src/components/HighlightMatch/HighlightMatch.tsx +0 -29
- package/src/components/HighlightMatch/index.ts +0 -2
- package/src/components/Icon/Icon.tsx +0 -55
- package/src/components/Icon/assets/back.svg +0 -4
- package/src/components/Icon/assets/burger-menu.svg +0 -3
- package/src/components/Icon/assets/calendar.svg +0 -5
- package/src/components/Icon/assets/caret-down.svg +0 -4
- package/src/components/Icon/assets/caret-left.svg +0 -4
- package/src/components/Icon/assets/caret-right-last.svg +0 -4
- package/src/components/Icon/assets/caret-right.svg +0 -4
- package/src/components/Icon/assets/check.svg +0 -4
- package/src/components/Icon/assets/chevron-down.svg +0 -3
- package/src/components/Icon/assets/circle.svg +0 -3
- package/src/components/Icon/assets/close.svg +0 -4
- package/src/components/Icon/assets/dots-horizontal.svg +0 -1
- package/src/components/Icon/assets/information.svg +0 -4
- package/src/components/Icon/assets/minus.svg +0 -4
- package/src/components/Icon/assets/plus.svg +0 -4
- package/src/components/Icon/assets/refresh.svg +0 -3
- package/src/components/Icon/assets/sort-asc.svg +0 -7
- package/src/components/Icon/assets/sort-desc.svg +0 -7
- package/src/components/Icon/assets/sort.svg +0 -7
- package/src/components/Icon/assets/upload.svg +0 -3
- package/src/components/Icon/assets/warning.svg +0 -4
- package/src/components/Icon/index.ts +0 -2
- package/src/components/IconFactory/IconFactory.fixtures.tsx +0 -31
- package/src/components/IconFactory/IconFactory.stories.tsx +0 -120
- package/src/components/IconFactory/IconFactory.test.tsx +0 -36
- package/src/components/IconFactory/IconFactory.tsx +0 -75
- package/src/components/IconFactory/index.ts +0 -2
- package/src/components/Label/Label.stories.tsx +0 -47
- package/src/components/Label/Label.test.tsx +0 -80
- package/src/components/Label/Label.tsx +0 -120
- package/src/components/Label/index.ts +0 -2
- package/src/components/Layout/Box.tsx +0 -98
- package/src/components/Layout/Grid.tsx +0 -42
- package/src/components/Layout/Group.tsx +0 -55
- package/src/components/Layout/Layout.stories.tsx +0 -412
- package/src/components/Layout/Layout.tsx +0 -19
- package/src/components/Layout/Layout.types.ts +0 -9
- package/src/components/Layout/Layout.utils.ts +0 -20
- package/src/components/Layout/Sidebar.tsx +0 -75
- package/src/components/Layout/Stack.tsx +0 -63
- package/src/components/Layout/Switcher.tsx +0 -48
- package/src/components/Layout/index.tsx +0 -8
- package/src/components/Link/Link.stories.tsx +0 -22
- package/src/components/Link/Link.test.tsx +0 -79
- package/src/components/Link/Link.tsx +0 -114
- package/src/components/Link/index.ts +0 -3
- package/src/components/Link/useSafeLink.ts +0 -49
- package/src/components/Loaders/LoadingBar.stories.tsx +0 -36
- package/src/components/Loaders/LoadingBar.test.tsx +0 -35
- package/src/components/Loaders/LoadingBar.tsx +0 -65
- package/src/components/Loaders/LoadingDots.stories.tsx +0 -69
- package/src/components/Loaders/LoadingDots.test.tsx +0 -22
- package/src/components/Loaders/LoadingDots.tsx +0 -68
- package/src/components/Loaders/Spinner.stories.tsx +0 -24
- package/src/components/Loaders/Spinner.test.tsx +0 -35
- package/src/components/Loaders/Spinner.tsx +0 -68
- package/src/components/Loaders/index.tsx +0 -3
- package/src/components/Modal/Modal.stories.tsx +0 -121
- package/src/components/Modal/Modal.test.tsx +0 -46
- package/src/components/Modal/Modal.tsx +0 -163
- package/src/components/Modal/index.tsx +0 -2
- package/src/components/Pagination/Pagination.constants.ts +0 -7
- package/src/components/Pagination/Pagination.helper.ts +0 -88
- package/src/components/Pagination/Pagination.stories.tsx +0 -29
- package/src/components/Pagination/Pagination.test.tsx +0 -102
- package/src/components/Pagination/Pagination.tsx +0 -34
- package/src/components/Pagination/Pagination.types.ts +0 -55
- package/src/components/Pagination/PaginationItem.tsx +0 -74
- package/src/components/Pagination/index.ts +0 -2
- package/src/components/Pagination/usePagination.test.ts +0 -188
- package/src/components/Pagination/usePagination.ts +0 -87
- package/src/components/Popover/Popover.stories.tsx +0 -50
- package/src/components/Popover/Popover.test.tsx +0 -22
- package/src/components/Popover/Popover.tsx +0 -110
- package/src/components/Popover/Popover.types.ts +0 -39
- package/src/components/Popover/index.ts +0 -11
- package/src/components/ProgressBar/ProgressBar.stories.tsx +0 -47
- package/src/components/ProgressBar/ProgressBar.test.tsx +0 -40
- package/src/components/ProgressBar/ProgressBar.tsx +0 -89
- package/src/components/ProgressBar/index.tsx +0 -2
- package/src/components/Radio/Radio.stories.tsx +0 -75
- package/src/components/Radio/Radio.test.tsx +0 -66
- package/src/components/Radio/Radio.tsx +0 -153
- package/src/components/Radio/index.ts +0 -2
- package/src/components/Section/Section.test.tsx +0 -35
- package/src/components/Section/Section.tsx +0 -66
- package/src/components/Section/Sections.stories.tsx +0 -56
- package/src/components/Section/index.ts +0 -2
- package/src/components/Select/Select.constants.ts +0 -12
- package/src/components/Select/Select.context.ts +0 -11
- package/src/components/Select/Select.fixtures.ts +0 -167
- package/src/components/Select/Select.stories.tsx +0 -780
- package/src/components/Select/Select.test.tsx +0 -1109
- package/src/components/Select/Select.tsx +0 -271
- package/src/components/Select/Select.types.ts +0 -148
- package/src/components/Select/SelectCreatableOption.tsx +0 -20
- package/src/components/Select/SelectEmpty.test.tsx +0 -15
- package/src/components/Select/SelectEmpty.tsx +0 -29
- package/src/components/Select/SelectOption.test.tsx +0 -78
- package/src/components/Select/SelectOption.tsx +0 -79
- package/src/components/Select/SelectTrigger.tsx +0 -83
- package/src/components/Select/components.tsx +0 -14
- package/src/components/Select/index.ts +0 -12
- package/src/components/Select/useSelect.helpers.test.ts +0 -184
- package/src/components/Select/useSelect.helpers.ts +0 -63
- package/src/components/Select/useSelect.test.ts +0 -207
- package/src/components/Select/useSelect.ts +0 -540
- package/src/components/Select/useSelectExternal.ts +0 -26
- package/src/components/SideNavigation/Logo/Logo.test.tsx +0 -19
- package/src/components/SideNavigation/Logo/Logo.tsx +0 -26
- package/src/components/SideNavigation/Logo/index.ts +0 -1
- package/src/components/SideNavigation/Menu/Menu.test.tsx +0 -65
- package/src/components/SideNavigation/Menu/Menu.tsx +0 -53
- package/src/components/SideNavigation/Menu/MenuBaseItem.tsx +0 -64
- package/src/components/SideNavigation/Menu/MenuExpandable.tsx +0 -107
- package/src/components/SideNavigation/Menu/MenuLink.tsx +0 -37
- package/src/components/SideNavigation/Menu/index.ts +0 -1
- package/src/components/SideNavigation/Separator/Separator.test.tsx +0 -14
- package/src/components/SideNavigation/Separator/Separator.tsx +0 -20
- package/src/components/SideNavigation/Separator/index.ts +0 -1
- package/src/components/SideNavigation/SideNavigation.stories.tsx +0 -69
- package/src/components/SideNavigation/SideNavigation.test.tsx +0 -21
- package/src/components/SideNavigation/SideNavigation.tsx +0 -47
- package/src/components/SideNavigation/index.ts +0 -5
- package/src/components/SideNavigation/useSideNavigation.ts +0 -36
- package/src/components/Steps/ProgressSteps/ProgressStep.tsx +0 -163
- package/src/components/Steps/ProgressSteps/ProgressSteps.tsx +0 -37
- package/src/components/Steps/ProgressSteps/index.ts +0 -1
- package/src/components/Steps/Steps.fixtures.ts +0 -11
- package/src/components/Steps/Steps.helpers.ts +0 -11
- package/src/components/Steps/Steps.stories.tsx +0 -65
- package/src/components/Steps/Steps.test.tsx +0 -78
- package/src/components/Steps/Steps.tsx +0 -53
- package/src/components/Steps/Steps.types.ts +0 -5
- package/src/components/Steps/StepsContext.ts +0 -5
- package/src/components/Steps/StepsStep.tsx +0 -58
- package/src/components/Steps/index.ts +0 -6
- package/src/components/Steps/useStep.test.tsx +0 -217
- package/src/components/Steps/useSteps.ts +0 -131
- package/src/components/Switch/Switch.stories.tsx +0 -65
- package/src/components/Switch/Switch.test.tsx +0 -60
- package/src/components/Switch/Switch.tsx +0 -209
- package/src/components/Switch/index.ts +0 -2
- package/src/components/Table/Selection.tsx +0 -202
- package/src/components/Table/Table.fixtures.ts +0 -101
- package/src/components/Table/Table.stories.tsx +0 -568
- package/src/components/Table/Table.test.tsx +0 -310
- package/src/components/Table/Table.tsx +0 -523
- package/src/components/Table/Table.types.ts +0 -93
- package/src/components/Table/TableSortHandle.tsx +0 -31
- package/src/components/Table/index.tsx +0 -2
- package/src/components/Table/useSortBy.test.ts +0 -96
- package/src/components/Table/useSortBy.ts +0 -92
- package/src/components/Table/useSortBy.types.ts +0 -21
- package/src/components/TablePagination/RowsPerPage.tsx +0 -81
- package/src/components/TablePagination/TablePagination.stories.tsx +0 -42
- package/src/components/TablePagination/TablePagination.styles.ts +0 -13
- package/src/components/TablePagination/TablePagination.test.tsx +0 -111
- package/src/components/TablePagination/TablePagination.tsx +0 -49
- package/src/components/TablePagination/TablePagination.types.ts +0 -69
- package/src/components/TablePagination/TablePaginationActions.tsx +0 -144
- package/src/components/TablePagination/index.ts +0 -2
- package/src/components/Tabs/Tabs.stories.tsx +0 -78
- package/src/components/Tabs/Tabs.test.tsx +0 -103
- package/src/components/Tabs/Tabs.tsx +0 -287
- package/src/components/Tabs/Tabs.types.ts +0 -7
- package/src/components/Tabs/TabsContext.ts +0 -10
- package/src/components/Tabs/index.ts +0 -2
- package/src/components/Tag/Tag.stories.tsx +0 -112
- package/src/components/Tag/Tag.test.tsx +0 -19
- package/src/components/Tag/Tag.tsx +0 -393
- package/src/components/Tag/index.ts +0 -2
- package/src/components/Text/Text.stories.tsx +0 -59
- package/src/components/Text/Text.test.tsx +0 -48
- package/src/components/Text/Text.tsx +0 -14
- package/src/components/Text/index.ts +0 -2
- package/src/components/TextField/TextField.stories.tsx +0 -90
- package/src/components/TextField/TextField.test.tsx +0 -36
- package/src/components/TextField/TextField.tsx +0 -244
- package/src/components/TextField/index.ts +0 -6
- package/src/components/TextField/useTextField.tsx +0 -26
- package/src/components/Textarea/Textarea.stories.tsx +0 -101
- package/src/components/Textarea/Textarea.test.tsx +0 -14
- package/src/components/Textarea/Textarea.tsx +0 -230
- package/src/components/Textarea/index.ts +0 -2
- package/src/components/Toast/Toast.stories.tsx +0 -50
- package/src/components/Toast/Toast.test.tsx +0 -24
- package/src/components/Toast/Toast.tsx +0 -141
- package/src/components/Toast/icons/close.svg +0 -3
- package/src/components/Toast/icons/danger.svg +0 -4
- package/src/components/Toast/icons/neutral.svg +0 -4
- package/src/components/Toast/icons/success.svg +0 -3
- package/src/components/Toast/icons/warning.svg +0 -4
- package/src/components/Toast/index.tsx +0 -2
- package/src/components/ToggleGroup/Toggle.test.tsx +0 -76
- package/src/components/ToggleGroup/Toggle.tsx +0 -158
- package/src/components/ToggleGroup/ToggleGroup.constants.ts +0 -16
- package/src/components/ToggleGroup/ToggleGroup.stories.tsx +0 -145
- package/src/components/ToggleGroup/ToggleGroup.test.tsx +0 -237
- package/src/components/ToggleGroup/ToggleGroup.tsx +0 -165
- package/src/components/ToggleGroup/ToggleGroup.types.ts +0 -35
- package/src/components/ToggleGroup/ToggleGroupContext.ts +0 -13
- package/src/components/ToggleGroup/index.ts +0 -3
- package/src/components/Tooltip/Tooltip.stories.tsx +0 -82
- package/src/components/Tooltip/Tooltip.test.tsx +0 -49
- package/src/components/Tooltip/Tooltip.tsx +0 -185
- package/src/components/Tooltip/index.ts +0 -2
- package/src/components/TopNavigation/Logo/Logo.test.tsx +0 -21
- package/src/components/TopNavigation/Logo/Logo.tsx +0 -20
- package/src/components/TopNavigation/Logo/index.ts +0 -1
- package/src/components/TopNavigation/Menu/Menu.test.tsx +0 -125
- package/src/components/TopNavigation/Menu/Menu.tsx +0 -62
- package/src/components/TopNavigation/Menu/MenuItemDropdown.tsx +0 -118
- package/src/components/TopNavigation/Menu/MenuItemIcon.tsx +0 -50
- package/src/components/TopNavigation/Menu/index.ts +0 -1
- package/src/components/TopNavigation/OpenSideNavButton/OpenSideNavButton.tsx +0 -28
- package/src/components/TopNavigation/OpenSideNavButton/index.ts +0 -1
- package/src/components/TopNavigation/TopNavigation.stories.tsx +0 -42
- package/src/components/TopNavigation/TopNavigation.tsx +0 -47
- package/src/components/TopNavigation/index.ts +0 -2
- package/src/components/VisuallyHidden/VisuallyHidden.mdx +0 -26
- package/src/components/VisuallyHidden/VisuallyHidden.stories.tsx +0 -32
- package/src/components/VisuallyHidden/VisuallyHidden.test.tsx +0 -18
- package/src/components/VisuallyHidden/VisuallyHidden.tsx +0 -6
- package/src/components/VisuallyHidden/index.ts +0 -1
- package/src/docs/tools/DatePickerEvent.stories.mdx +0 -108
- package/src/docs/tools/DragDropFileEvent.stories.mdx +0 -75
- package/src/docs/tools/conditional.stories.mdx +0 -251
- package/src/docs/tools/selectEvent.stories.mdx +0 -121
- package/src/hooks/useClickOutside/index.ts +0 -1
- package/src/hooks/useClickOutside/useClickOutside.test.tsx +0 -116
- package/src/hooks/useClickOutside/useClickOutside.ts +0 -65
- package/src/hooks/useDidMount/index.ts +0 -1
- package/src/hooks/useDidMount/useDidMount.test.tsx +0 -38
- package/src/hooks/useDidMount/useDidMount.ts +0 -20
- package/src/hooks/useFingerprint/index.ts +0 -1
- package/src/hooks/useFingerprint/useFingerprint.test.ts +0 -76
- package/src/hooks/useFingerprint/useFingerprint.ts +0 -94
- package/src/hooks/useFocusTrap/index.ts +0 -2
- package/src/hooks/useFocusTrap/useFocusTrap.stories.tsx +0 -87
- package/src/hooks/useFocusTrap/useFocusTrap.test.tsx +0 -129
- package/src/hooks/useFocusTrap/useFocusTrap.ts +0 -187
- package/src/hooks/useFocusWithin/index.ts +0 -2
- package/src/hooks/useFocusWithin/useFocusWithin.test.tsx +0 -71
- package/src/hooks/useFocusWithin/useFocusWithin.ts +0 -62
- package/src/hooks/useHeightExpansionToggler/index.ts +0 -2
- package/src/hooks/useHeightExpansionToggler/useHeightExpansionToggler.test.tsx +0 -85
- package/src/hooks/useHeightExpansionToggler/useHeightExpansionToggler.ts +0 -54
- package/src/hooks/useID/index.ts +0 -1
- package/src/hooks/useID/useID.ts +0 -18
- package/src/hooks/useSelectable/SelectableStrategy.test.ts +0 -424
- package/src/hooks/useSelectable/SelectableStrategy.ts +0 -143
- package/src/hooks/useSelectable/index.ts +0 -8
- package/src/hooks/useSelectable/useSelectable.test.ts +0 -221
- package/src/hooks/useSelectable/useSelectable.ts +0 -156
- package/src/hooks/useSelectable/useSelectable.types.ts +0 -45
- package/src/hooks/useWindowResize/index.ts +0 -1
- package/src/hooks/useWindowResize/useWindowResize.ts +0 -27
- package/src/index.ts +0 -188
- package/src/stories/assets/code-brackets.svg +0 -1
- package/src/stories/assets/colors.svg +0 -1
- package/src/stories/assets/comments.svg +0 -1
- package/src/stories/assets/direction.svg +0 -1
- package/src/stories/assets/flow.svg +0 -1
- package/src/stories/assets/plugin.svg +0 -1
- package/src/stories/assets/repo.svg +0 -1
- package/src/stories/assets/stackalt.svg +0 -1
- package/src/stories/introduction.stories.mdx +0 -57
- package/src/stories/startPage.stories.mdx +0 -95
- package/src/styles/activatable.tsx +0 -30
- package/src/styles/disableable.tsx +0 -45
- package/src/styles/ellipsizable.tsx +0 -14
- package/src/styles/focusable.tsx +0 -32
- package/src/styles/font.test.ts +0 -31
- package/src/styles/font.tsx +0 -40
- package/src/styles/hidden.tsx +0 -29
- package/src/styles/hoverable.tsx +0 -30
- package/src/styles/transition.tsx +0 -25
- package/src/styles/typography.test.ts +0 -93
- package/src/styles/typography.ts +0 -190
- package/src/testing/DatePickerEvent/DatePickerEvent.ts +0 -117
- package/src/testing/DatePickerEvent/DateRangePickerEvent.ts +0 -83
- package/src/testing/DatePickerEvent/index.ts +0 -2
- package/src/testing/DragDropFileEvent/DragDropFileEvent.ts +0 -56
- package/src/testing/DragDropFileEvent/index.ts +0 -1
- package/src/testing/SelectEvent/SelectEvent.test.tsx +0 -192
- package/src/testing/SelectEvent/SelectEvent.ts +0 -264
- package/src/testing/SelectEvent/index.ts +0 -1
- package/src/testing/getInterpolatedStyles/getInterpolatedStyles.ts +0 -25
- package/src/testing/getInterpolatedStyles/index.ts +0 -1
- package/src/testing/index.ts +0 -6
- package/src/testing/renderWithDragDropFileProvider/index.ts +0 -1
- package/src/testing/renderWithDragDropFileProvider/renderWithDragDropFileProvider.tsx +0 -28
- package/src/tests/generator.ts +0 -127
- package/src/tests/renderer.tsx +0 -39
- package/src/theming/index.ts +0 -42
- package/src/theming/themes/alice.theme.ts +0 -1022
- package/src/theming/themes/index.ts +0 -3
- package/src/theming/themes/loadsmart.theme.ts +0 -1019
- package/src/theming/themes/miranda-compatibility.theme.ts +0 -972
- package/src/theming/theming.helpers.ts +0 -95
- package/src/tools/conditional.test.ts +0 -166
- package/src/tools/conditional.ts +0 -127
- package/src/tools/index.ts +0 -2
- package/src/tools/prop.test.ts +0 -52
- package/src/tools/prop.ts +0 -36
- package/src/utils/toolset/awaitTo.ts +0 -24
- package/src/utils/toolset/flatten.ts +0 -3
- package/src/utils/toolset/formatBytes.test.ts +0 -45
- package/src/utils/toolset/formatBytes.ts +0 -18
- package/src/utils/toolset/get.ts +0 -2
- package/src/utils/toolset/getID.test.ts +0 -57
- package/src/utils/toolset/getID.ts +0 -93
- package/src/utils/toolset/getOrdinalSuffix.test.ts +0 -27
- package/src/utils/toolset/getOrdinalSuffix.ts +0 -15
- package/src/utils/toolset/highlightMatch.test.tsx +0 -32
- package/src/utils/toolset/highlightMatch.tsx +0 -32
- package/src/utils/toolset/interleave.test.ts +0 -40
- package/src/utils/toolset/interleave.ts +0 -23
- package/src/utils/toolset/isEmpty.ts +0 -2
- package/src/utils/toolset/isThenable.test.ts +0 -40
- package/src/utils/toolset/isThenable.ts +0 -14
- package/src/utils/toolset/keyboard.ts +0 -50
- package/src/utils/toolset/omit.ts +0 -2
- package/src/utils/toolset/pluralize.ts +0 -16
- package/src/utils/toolset/range.ts +0 -2
- package/src/utils/toolset/rem.ts +0 -7
- package/src/utils/toolset/styledCompounds.ts +0 -22
- package/src/utils/toolset/toArray.ts +0 -16
- package/src/utils/types/ColorScheme.ts +0 -3
- package/src/utils/types/EventLike.ts +0 -11
- package/src/utils/types/InterpolatedStyle.ts +0 -3
- package/src/utils/types/Status.ts +0 -8
|
@@ -1,1109 +0,0 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import { composeStories } from '@storybook/react'
|
|
3
|
-
|
|
4
|
-
import { render } from '@testing-library/react'
|
|
5
|
-
|
|
6
|
-
import { SelectableKeyTypeOptions, Fruit, FRUITS, USERS } from './Select.fixtures'
|
|
7
|
-
import * as stories from './Select.stories'
|
|
8
|
-
import generator from '../../tests/generator'
|
|
9
|
-
import renderer, { act, screen, fire, waitFor } from '../../tests/renderer'
|
|
10
|
-
import selectEvent from '../../testing/SelectEvent'
|
|
11
|
-
|
|
12
|
-
import type { SelectProps, Option } from './Select.types'
|
|
13
|
-
import Select from './Select'
|
|
14
|
-
import type { Selectable } from 'hooks/useSelectable'
|
|
15
|
-
|
|
16
|
-
const {
|
|
17
|
-
Playground,
|
|
18
|
-
SingleAsyncDatasource,
|
|
19
|
-
SingleCustomOptionRendering,
|
|
20
|
-
CreatableSync,
|
|
21
|
-
CreatableAsync,
|
|
22
|
-
} = composeStories(stories)
|
|
23
|
-
|
|
24
|
-
describe('Select', () => {
|
|
25
|
-
describe('Generic', () => {
|
|
26
|
-
const setup = (overrides: Partial<SelectProps>) =>
|
|
27
|
-
renderer(<Playground {...overrides} />).render()
|
|
28
|
-
|
|
29
|
-
it('start collapsed', () => {
|
|
30
|
-
setup({})
|
|
31
|
-
|
|
32
|
-
screen.getByTestId('select-trigger-search-field')
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
it('transfer additional input props to SelectTrigger', () => {
|
|
36
|
-
const props: Partial<SelectProps> = {
|
|
37
|
-
getInputProps: () => ({
|
|
38
|
-
minLength: 11,
|
|
39
|
-
maxLength: 33,
|
|
40
|
-
}),
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
setup({ ...props })
|
|
44
|
-
|
|
45
|
-
const searchInput = screen.getByTestId('select-trigger-search-field')
|
|
46
|
-
|
|
47
|
-
expect(searchInput).toHaveAttribute('minlength', '11')
|
|
48
|
-
expect(searchInput).toHaveAttribute('maxlength', '33')
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
describe('when disabled', () => {
|
|
52
|
-
it('does not expand with the available options when search input is clicked', () => {
|
|
53
|
-
setup({ disabled: true })
|
|
54
|
-
|
|
55
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
56
|
-
|
|
57
|
-
expect(selectEvent.isMenuExpanded(searchInput)).toBe(false)
|
|
58
|
-
expect(searchInput).toBeDisabled()
|
|
59
|
-
|
|
60
|
-
fire.click(searchInput)
|
|
61
|
-
|
|
62
|
-
expect(selectEvent.isMenuExpanded(searchInput)).toBe(false)
|
|
63
|
-
})
|
|
64
|
-
|
|
65
|
-
it('does not expand with the available options when trigger handle is clicked', () => {
|
|
66
|
-
setup({ disabled: true })
|
|
67
|
-
|
|
68
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
69
|
-
const triggerHandle = screen.getByTestId('select-trigger-handle')
|
|
70
|
-
|
|
71
|
-
expect(selectEvent.isMenuExpanded(searchInput)).toBe(false)
|
|
72
|
-
expect(triggerHandle).toBeDisabled()
|
|
73
|
-
|
|
74
|
-
fire.click(triggerHandle)
|
|
75
|
-
|
|
76
|
-
expect(selectEvent.isMenuExpanded(searchInput)).toBe(false)
|
|
77
|
-
})
|
|
78
|
-
})
|
|
79
|
-
|
|
80
|
-
describe('when enabled', () => {
|
|
81
|
-
it('expands with the available options when search input is clicked', async () => {
|
|
82
|
-
setup({})
|
|
83
|
-
|
|
84
|
-
await waitFor(() => {
|
|
85
|
-
expect(screen.getByTestId('select-trigger-handle')).toBeEnabled()
|
|
86
|
-
})
|
|
87
|
-
|
|
88
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
89
|
-
|
|
90
|
-
expect(selectEvent.isMenuExpanded(searchInput)).toBe(false)
|
|
91
|
-
|
|
92
|
-
fire.click(searchInput)
|
|
93
|
-
|
|
94
|
-
expect(selectEvent.isMenuExpanded(searchInput)).toBe(true)
|
|
95
|
-
|
|
96
|
-
const options = await screen.findAllByRole('option')
|
|
97
|
-
|
|
98
|
-
for (let i = 0; i < FRUITS.length; i++) {
|
|
99
|
-
expect(options[i]).toHaveTextContent(FRUITS[i].label)
|
|
100
|
-
}
|
|
101
|
-
})
|
|
102
|
-
|
|
103
|
-
it('expands with the available options when trigger handle is clicked', async () => {
|
|
104
|
-
setup({})
|
|
105
|
-
|
|
106
|
-
const triggerHandle = screen.getByTestId('select-trigger-handle')
|
|
107
|
-
|
|
108
|
-
await waitFor(() => {
|
|
109
|
-
expect(triggerHandle).toBeEnabled()
|
|
110
|
-
})
|
|
111
|
-
|
|
112
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
113
|
-
|
|
114
|
-
expect(selectEvent.isMenuExpanded(searchInput)).toBe(false)
|
|
115
|
-
|
|
116
|
-
fire.click(triggerHandle)
|
|
117
|
-
|
|
118
|
-
expect(selectEvent.isMenuExpanded(searchInput)).toBe(true)
|
|
119
|
-
|
|
120
|
-
const options = await screen.findAllByRole('option')
|
|
121
|
-
|
|
122
|
-
for (let i = 0; i < FRUITS.length; i++) {
|
|
123
|
-
expect(options[i]).toHaveTextContent(FRUITS[i].label)
|
|
124
|
-
}
|
|
125
|
-
})
|
|
126
|
-
|
|
127
|
-
it('expands only if a query is typed if the options list is empty', async () => {
|
|
128
|
-
render(<Playground options={undefined} />)
|
|
129
|
-
|
|
130
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
131
|
-
const triggerHandle = screen.getByTestId('select-trigger-handle')
|
|
132
|
-
|
|
133
|
-
expect(triggerHandle).toBeDisabled()
|
|
134
|
-
expect(selectEvent.isMenuExpanded(searchInput)).toBe(false)
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* using userEvent.type goes beyond the event dispatching we need here to
|
|
138
|
-
* make the select component to react and expand the menu; additionally,
|
|
139
|
-
* it throws the `act` warning in `useClickOutide`'s `handleEvent`, but we do not have any testable evidence
|
|
140
|
-
* that can make for a valid assertion.
|
|
141
|
-
* that's why we use `fireEvent.change` instead of `userEvent.type`.
|
|
142
|
-
*/
|
|
143
|
-
fire.change(searchInput, { target: { value: generator.word() } })
|
|
144
|
-
|
|
145
|
-
expect(selectEvent.isMenuExpanded(searchInput)).toBe(true)
|
|
146
|
-
|
|
147
|
-
await waitFor(() => {
|
|
148
|
-
expect(triggerHandle).toBeEnabled()
|
|
149
|
-
})
|
|
150
|
-
})
|
|
151
|
-
|
|
152
|
-
it('shows correct options when options prop change', async () => {
|
|
153
|
-
const { rerender } = render(<Playground options={undefined} />)
|
|
154
|
-
|
|
155
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
156
|
-
|
|
157
|
-
expect(screen.getByTestId('select-trigger-handle')).toBeDisabled()
|
|
158
|
-
expect(screen.queryByRole('listbox')).not.toBeInTheDocument()
|
|
159
|
-
|
|
160
|
-
rerender(<Playground options={[...FRUITS]} />)
|
|
161
|
-
|
|
162
|
-
await selectEvent.expand(searchInput)
|
|
163
|
-
|
|
164
|
-
await waitFor(() => {
|
|
165
|
-
screen.getAllByRole('option')
|
|
166
|
-
})
|
|
167
|
-
|
|
168
|
-
const items = screen.getAllByRole('option')
|
|
169
|
-
|
|
170
|
-
for (let i = 0; i < FRUITS.length; i++) {
|
|
171
|
-
expect(items[i]).toHaveTextContent(FRUITS[i].label)
|
|
172
|
-
}
|
|
173
|
-
})
|
|
174
|
-
|
|
175
|
-
it('expands when user enters a search string', () => {
|
|
176
|
-
setup({})
|
|
177
|
-
|
|
178
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
179
|
-
|
|
180
|
-
expect(selectEvent.isMenuExpanded(searchInput)).toBe(false)
|
|
181
|
-
|
|
182
|
-
fire.change(searchInput, { target: { value: 'foo' } })
|
|
183
|
-
|
|
184
|
-
expect(selectEvent.isMenuExpanded(searchInput)).toBe(true)
|
|
185
|
-
})
|
|
186
|
-
|
|
187
|
-
it('filters the available options when user enters a search string', async () => {
|
|
188
|
-
setup({})
|
|
189
|
-
|
|
190
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
191
|
-
const searchedFruit = generator.pickone([...FRUITS])
|
|
192
|
-
|
|
193
|
-
await selectEvent.search(searchedFruit.label, searchInput)
|
|
194
|
-
|
|
195
|
-
const options = await selectEvent.getOptions(searchInput)
|
|
196
|
-
|
|
197
|
-
expect(options.length).toBeGreaterThanOrEqual(1)
|
|
198
|
-
expect(options[0]).toHaveTextContent(searchedFruit.label)
|
|
199
|
-
})
|
|
200
|
-
|
|
201
|
-
it('calls blur when focus is lost', async () => {
|
|
202
|
-
const onBlur = jest.fn((event?: MouseEvent | TouchEvent | KeyboardEvent) => event)
|
|
203
|
-
|
|
204
|
-
setup({ onBlur })
|
|
205
|
-
|
|
206
|
-
const selectInput = screen.getByLabelText('Select your favorite fruit')
|
|
207
|
-
|
|
208
|
-
await selectEvent.expand(selectInput)
|
|
209
|
-
|
|
210
|
-
/**
|
|
211
|
-
* we are using `act` with manually triggered elements so RTL waits for
|
|
212
|
-
* all state changes that happen during click and key presses before proceeding to
|
|
213
|
-
* the assetions.
|
|
214
|
-
* If you remove these and replace with userEvent, you will see the `act` warning.
|
|
215
|
-
*/
|
|
216
|
-
act(() => {
|
|
217
|
-
selectInput.dispatchEvent(new MouseEvent('mousedown', { bubbles: true }))
|
|
218
|
-
selectInput.dispatchEvent(new MouseEvent('mouseup', { bubbles: true }))
|
|
219
|
-
})
|
|
220
|
-
|
|
221
|
-
act(() => {
|
|
222
|
-
selectInput.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }))
|
|
223
|
-
selectInput.dispatchEvent(new KeyboardEvent('keyup', { key: 'Escape', bubbles: true }))
|
|
224
|
-
})
|
|
225
|
-
|
|
226
|
-
await waitFor(() => {
|
|
227
|
-
expect(onBlur).toHaveBeenCalled()
|
|
228
|
-
})
|
|
229
|
-
|
|
230
|
-
await selectEvent.expand(selectInput)
|
|
231
|
-
|
|
232
|
-
act(() => {
|
|
233
|
-
selectInput.dispatchEvent(new MouseEvent('mousedown', { bubbles: true }))
|
|
234
|
-
selectInput.dispatchEvent(new MouseEvent('mouseup', { bubbles: true }))
|
|
235
|
-
})
|
|
236
|
-
|
|
237
|
-
act(() => {
|
|
238
|
-
document.body.dispatchEvent(new MouseEvent('mousedown', { bubbles: true }))
|
|
239
|
-
document.body.dispatchEvent(new MouseEvent('mouseup', { bubbles: true }))
|
|
240
|
-
})
|
|
241
|
-
|
|
242
|
-
await waitFor(() => {
|
|
243
|
-
expect(onBlur).toHaveBeenCalled()
|
|
244
|
-
})
|
|
245
|
-
})
|
|
246
|
-
|
|
247
|
-
it('shrinks when an option is selected', async () => {
|
|
248
|
-
setup({})
|
|
249
|
-
|
|
250
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
251
|
-
const searchedFruit = generator.pickone([...FRUITS])
|
|
252
|
-
|
|
253
|
-
fire.change(searchInput, {
|
|
254
|
-
target: { value: searchedFruit.label },
|
|
255
|
-
})
|
|
256
|
-
|
|
257
|
-
expect(selectEvent.isMenuExpanded(searchInput)).toBe(true)
|
|
258
|
-
|
|
259
|
-
await selectEvent.select(searchedFruit.label, searchInput)
|
|
260
|
-
|
|
261
|
-
expect(selectEvent.isMenuExpanded(searchInput)).toBe(false)
|
|
262
|
-
})
|
|
263
|
-
})
|
|
264
|
-
|
|
265
|
-
describe('Single selection', () => {
|
|
266
|
-
it('selects the clicked item', async () => {
|
|
267
|
-
setup({})
|
|
268
|
-
|
|
269
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
270
|
-
const selectedFruit = generator.pickone([...FRUITS])
|
|
271
|
-
|
|
272
|
-
await selectEvent.select(selectedFruit.label, searchInput)
|
|
273
|
-
|
|
274
|
-
expect(searchInput).toHaveDisplayValue(selectedFruit.label)
|
|
275
|
-
|
|
276
|
-
const selectedOptions = await selectEvent.getSelectedOptions(searchInput)
|
|
277
|
-
expect(selectedOptions).toHaveLength(1)
|
|
278
|
-
|
|
279
|
-
expect(selectedOptions[0]).toHaveTextContent(selectedFruit.label)
|
|
280
|
-
})
|
|
281
|
-
|
|
282
|
-
it('initializes with a selected item', async () => {
|
|
283
|
-
const selectedFruit = generator.pickone([...FRUITS])
|
|
284
|
-
|
|
285
|
-
setup({
|
|
286
|
-
value: selectedFruit as Option,
|
|
287
|
-
})
|
|
288
|
-
|
|
289
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
290
|
-
expect(searchInput).toHaveDisplayValue(selectedFruit.label)
|
|
291
|
-
|
|
292
|
-
const selectedOptions = await selectEvent.getSelectedOptions(searchInput)
|
|
293
|
-
expect(selectedOptions).toHaveLength(1)
|
|
294
|
-
|
|
295
|
-
expect(selectedOptions[0]).toHaveTextContent(selectedFruit.label)
|
|
296
|
-
})
|
|
297
|
-
|
|
298
|
-
it('updates selected item after the initially selected item changes', async () => {
|
|
299
|
-
const [selectedFruit, newSelectedFruit] = generator.pickset([...FRUITS], 2)
|
|
300
|
-
const props = {
|
|
301
|
-
value: selectedFruit as Option,
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
const { rerender } = render(<Playground {...props} />)
|
|
305
|
-
|
|
306
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
307
|
-
expect(searchInput).toHaveDisplayValue(selectedFruit.label)
|
|
308
|
-
|
|
309
|
-
let selectedOptions = await selectEvent.getSelectedOptions(searchInput)
|
|
310
|
-
expect(selectedOptions).toHaveLength(1)
|
|
311
|
-
|
|
312
|
-
expect(selectedOptions[0]).toHaveTextContent(selectedFruit.label)
|
|
313
|
-
|
|
314
|
-
const newProps = {
|
|
315
|
-
value: newSelectedFruit as Option,
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
rerender(<Playground {...newProps} />)
|
|
319
|
-
|
|
320
|
-
expect(searchInput).toHaveDisplayValue(newSelectedFruit.label)
|
|
321
|
-
|
|
322
|
-
selectedOptions = await selectEvent.getSelectedOptions(searchInput)
|
|
323
|
-
expect(selectedOptions).toHaveLength(1)
|
|
324
|
-
|
|
325
|
-
expect(selectedOptions[0]).toHaveTextContent(newSelectedFruit.label)
|
|
326
|
-
})
|
|
327
|
-
|
|
328
|
-
it('unselects the clicked item', async () => {
|
|
329
|
-
const selectedFruit = generator.pickone([...FRUITS])
|
|
330
|
-
|
|
331
|
-
setup({
|
|
332
|
-
value: selectedFruit as Option,
|
|
333
|
-
})
|
|
334
|
-
|
|
335
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
336
|
-
expect(searchInput).toHaveDisplayValue(selectedFruit.label)
|
|
337
|
-
|
|
338
|
-
const selectedOptions = await selectEvent.getSelectedOptions(searchInput)
|
|
339
|
-
expect(selectedOptions).toHaveLength(1)
|
|
340
|
-
|
|
341
|
-
expect(selectedOptions[0]).toHaveTextContent(selectedFruit.label)
|
|
342
|
-
|
|
343
|
-
await selectEvent.unselect(selectedFruit.label, searchInput)
|
|
344
|
-
|
|
345
|
-
expect(await selectEvent.getSelectedOptions(searchInput)).toHaveLength(0)
|
|
346
|
-
expect(searchInput).toHaveDisplayValue('')
|
|
347
|
-
})
|
|
348
|
-
|
|
349
|
-
it('clears selection', async () => {
|
|
350
|
-
const selectedFruit = generator.pickone([...FRUITS])
|
|
351
|
-
|
|
352
|
-
setup({
|
|
353
|
-
value: selectedFruit as Option,
|
|
354
|
-
})
|
|
355
|
-
|
|
356
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
357
|
-
expect(searchInput).toHaveDisplayValue(selectedFruit.label)
|
|
358
|
-
|
|
359
|
-
const selectedOptions = await selectEvent.getSelectedOptions(searchInput)
|
|
360
|
-
expect(selectedOptions).toHaveLength(1)
|
|
361
|
-
|
|
362
|
-
expect(selectedOptions[0]).toHaveTextContent(selectedFruit.label)
|
|
363
|
-
|
|
364
|
-
await selectEvent.clear(searchInput)
|
|
365
|
-
|
|
366
|
-
expect(await selectEvent.getSelectedOptions(searchInput)).toHaveLength(0)
|
|
367
|
-
expect(searchInput).toHaveDisplayValue('')
|
|
368
|
-
expect(selectEvent.isMenuExpanded(searchInput)).toBe(false)
|
|
369
|
-
})
|
|
370
|
-
|
|
371
|
-
it('removes the clear button', async () => {
|
|
372
|
-
const selectedFruit = generator.pickone([...FRUITS])
|
|
373
|
-
|
|
374
|
-
setup({
|
|
375
|
-
value: selectedFruit as Option,
|
|
376
|
-
hideClear: true,
|
|
377
|
-
})
|
|
378
|
-
|
|
379
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
380
|
-
expect(searchInput).toHaveDisplayValue(selectedFruit.label)
|
|
381
|
-
|
|
382
|
-
const selectedOptions = await selectEvent.getSelectedOptions(searchInput)
|
|
383
|
-
expect(selectedOptions).toHaveLength(1)
|
|
384
|
-
|
|
385
|
-
expect(selectedOptions[0]).toHaveTextContent(selectedFruit.label)
|
|
386
|
-
|
|
387
|
-
expect(screen.queryByTestId('select-trigger-clear')).not.toBeInTheDocument()
|
|
388
|
-
})
|
|
389
|
-
})
|
|
390
|
-
|
|
391
|
-
describe('Multi selection', () => {
|
|
392
|
-
it('selects multiple options', async () => {
|
|
393
|
-
const [firstOption, secondOption] = generator.pickset([...FRUITS], 2)
|
|
394
|
-
|
|
395
|
-
setup({ multiple: true })
|
|
396
|
-
|
|
397
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
398
|
-
await selectEvent.select(firstOption.label, searchInput)
|
|
399
|
-
|
|
400
|
-
expect(screen.getByTitle('1 selected option')).toHaveTextContent('1')
|
|
401
|
-
|
|
402
|
-
await selectEvent.select(secondOption.label, searchInput)
|
|
403
|
-
|
|
404
|
-
expect(screen.getByTitle('2 selected options')).toHaveTextContent('2')
|
|
405
|
-
|
|
406
|
-
const selectedOptions = await selectEvent.getSelectedOptions(searchInput)
|
|
407
|
-
expect(selectedOptions).toHaveLength(2)
|
|
408
|
-
|
|
409
|
-
const [firstSelection, secondSelection] = selectedOptions
|
|
410
|
-
|
|
411
|
-
expect(firstSelection).toHaveTextContent(firstOption.label)
|
|
412
|
-
expect(secondSelection).toHaveTextContent(secondOption.label)
|
|
413
|
-
})
|
|
414
|
-
|
|
415
|
-
it('unselects a selected option keeping selected the others', async () => {
|
|
416
|
-
const [firstOption, secondOption, thirdOption] = generator.pickset([...FRUITS], 3)
|
|
417
|
-
|
|
418
|
-
setup({ multiple: true, value: [firstOption, secondOption, thirdOption] as Option[] })
|
|
419
|
-
|
|
420
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
421
|
-
expect(await selectEvent.getSelectedOptions(searchInput)).toHaveLength(3)
|
|
422
|
-
|
|
423
|
-
expect(screen.getByTitle('3 selected options')).toHaveTextContent('3')
|
|
424
|
-
|
|
425
|
-
await selectEvent.unselect(secondOption.label, searchInput)
|
|
426
|
-
|
|
427
|
-
const selectedOptions = await selectEvent.getSelectedOptions(searchInput)
|
|
428
|
-
expect(selectedOptions).toHaveLength(2)
|
|
429
|
-
|
|
430
|
-
const [firstSelection, secondSelection] = selectedOptions
|
|
431
|
-
|
|
432
|
-
expect(firstSelection).toHaveTextContent(firstOption.label)
|
|
433
|
-
expect(secondSelection).toHaveTextContent(thirdOption.label)
|
|
434
|
-
})
|
|
435
|
-
|
|
436
|
-
it('clears all selections when clicking the counter close button', async () => {
|
|
437
|
-
const [firstOption, secondOption, thirdOption] = generator.pickset([...FRUITS], 3)
|
|
438
|
-
setup({ multiple: true, value: [firstOption, secondOption, thirdOption] as Option[] })
|
|
439
|
-
|
|
440
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
441
|
-
expect(await selectEvent.getSelectedOptions(searchInput)).toHaveLength(3)
|
|
442
|
-
|
|
443
|
-
expect(screen.getByTitle('3 selected options')).toHaveTextContent('3')
|
|
444
|
-
|
|
445
|
-
await selectEvent.clear(searchInput)
|
|
446
|
-
|
|
447
|
-
expect(screen.queryByTestId('select-trigger-clear-counter')).not.toBeInTheDocument()
|
|
448
|
-
|
|
449
|
-
expect(await selectEvent.getSelectedOptions(searchInput)).toHaveLength(0)
|
|
450
|
-
})
|
|
451
|
-
})
|
|
452
|
-
})
|
|
453
|
-
|
|
454
|
-
describe('Async Datasources', () => {
|
|
455
|
-
const setup = (overrides: Partial<SelectProps>) =>
|
|
456
|
-
renderer(<SingleAsyncDatasource {...overrides} />).render()
|
|
457
|
-
|
|
458
|
-
it('expands with the available options when search input is clicked', async () => {
|
|
459
|
-
setup({})
|
|
460
|
-
|
|
461
|
-
await waitFor(() => {
|
|
462
|
-
expect(screen.getByTestId('select-trigger-handle')).toBeEnabled()
|
|
463
|
-
})
|
|
464
|
-
|
|
465
|
-
const searchInput = screen.getByLabelText('Select the project manager')
|
|
466
|
-
|
|
467
|
-
expect(selectEvent.isMenuExpanded(searchInput)).toBe(false)
|
|
468
|
-
|
|
469
|
-
fire.click(searchInput)
|
|
470
|
-
|
|
471
|
-
await waitFor(() => {
|
|
472
|
-
expect(selectEvent.isMenuExpanded(searchInput)).toBe(true)
|
|
473
|
-
})
|
|
474
|
-
|
|
475
|
-
const options = await selectEvent.getOptions(searchInput)
|
|
476
|
-
|
|
477
|
-
for (let i = 0; i < USERS.length; i++) {
|
|
478
|
-
expect(options[i]).toHaveTextContent(USERS[i].name)
|
|
479
|
-
}
|
|
480
|
-
})
|
|
481
|
-
|
|
482
|
-
it('expands with the available options when trigger handle is clicked', async () => {
|
|
483
|
-
setup({})
|
|
484
|
-
|
|
485
|
-
const searchInput = screen.getByLabelText('Select the project manager')
|
|
486
|
-
|
|
487
|
-
expect(selectEvent.isMenuExpanded(searchInput)).toBe(false)
|
|
488
|
-
|
|
489
|
-
await selectEvent.expand(searchInput)
|
|
490
|
-
|
|
491
|
-
expect(selectEvent.isMenuExpanded(searchInput)).toBe(true)
|
|
492
|
-
|
|
493
|
-
const options = await selectEvent.getOptions(searchInput)
|
|
494
|
-
|
|
495
|
-
for (let i = 0; i < USERS.length; i++) {
|
|
496
|
-
expect(options[i]).toHaveTextContent(USERS[i].name)
|
|
497
|
-
}
|
|
498
|
-
})
|
|
499
|
-
|
|
500
|
-
it('filters the available options when user enters a search string', async () => {
|
|
501
|
-
setup({})
|
|
502
|
-
|
|
503
|
-
const searchInput = screen.getByLabelText('Select the project manager')
|
|
504
|
-
const searchedUser = generator.pickone([...USERS])
|
|
505
|
-
|
|
506
|
-
await selectEvent.search(searchedUser.name, searchInput)
|
|
507
|
-
|
|
508
|
-
const options = await selectEvent.getOptions(searchInput)
|
|
509
|
-
|
|
510
|
-
expect(options.length).toBe(1)
|
|
511
|
-
expect(options[0]).toHaveTextContent(searchedUser.name)
|
|
512
|
-
})
|
|
513
|
-
})
|
|
514
|
-
|
|
515
|
-
describe('Override components', () => {
|
|
516
|
-
const getOptionText = (option: Fruit) => `${option.label}family: ${option.family}`
|
|
517
|
-
const setup = (overrides: Partial<SelectProps>) =>
|
|
518
|
-
renderer(<SingleCustomOptionRendering {...overrides} />).render()
|
|
519
|
-
const CreatableOption = () => {
|
|
520
|
-
return (
|
|
521
|
-
<Select.CreatableOption data-testid="custom-creatable">Add item</Select.CreatableOption>
|
|
522
|
-
)
|
|
523
|
-
}
|
|
524
|
-
|
|
525
|
-
it.each([[{ multiple: true }], [{ multiple: false }]])(
|
|
526
|
-
'overrides the option component with %s',
|
|
527
|
-
async (props) => {
|
|
528
|
-
setup(props)
|
|
529
|
-
|
|
530
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
531
|
-
await selectEvent.expand(searchInput)
|
|
532
|
-
|
|
533
|
-
const items = screen.getAllByTestId('custom-option')
|
|
534
|
-
expect(items).toHaveLength(FRUITS.length)
|
|
535
|
-
|
|
536
|
-
for (let i = 0; i < FRUITS.length; i++) {
|
|
537
|
-
expect(items[i]).toHaveTextContent(getOptionText(FRUITS[i]))
|
|
538
|
-
}
|
|
539
|
-
}
|
|
540
|
-
)
|
|
541
|
-
|
|
542
|
-
it('overrides the option component with initial value', async () => {
|
|
543
|
-
const selectedFruit = generator.pickone([...FRUITS])
|
|
544
|
-
|
|
545
|
-
setup({ value: selectedFruit as Option })
|
|
546
|
-
|
|
547
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
548
|
-
await selectEvent.expand(searchInput)
|
|
549
|
-
|
|
550
|
-
const customOptions = screen.getAllByTestId('custom-option')
|
|
551
|
-
expect(customOptions).toHaveLength(FRUITS.length)
|
|
552
|
-
|
|
553
|
-
const selectedOptions = await selectEvent.getSelectedOptions(searchInput)
|
|
554
|
-
|
|
555
|
-
expect(selectedOptions).toHaveLength(1)
|
|
556
|
-
expect(selectedOptions[0]).toHaveTextContent(selectedFruit.label)
|
|
557
|
-
})
|
|
558
|
-
|
|
559
|
-
it('selects custom item clicked', async () => {
|
|
560
|
-
const selectedFruit = generator.pickone<Fruit>([...FRUITS])
|
|
561
|
-
|
|
562
|
-
setup({})
|
|
563
|
-
|
|
564
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
565
|
-
const optionText = getOptionText(selectedFruit)
|
|
566
|
-
|
|
567
|
-
await selectEvent.select(optionText, searchInput)
|
|
568
|
-
const selectedOptions = await selectEvent.getSelectedOptions(searchInput)
|
|
569
|
-
|
|
570
|
-
expect(searchInput).toHaveDisplayValue(selectedFruit.label)
|
|
571
|
-
expect(selectedOptions).toHaveLength(1)
|
|
572
|
-
expect(selectedOptions[0]).toHaveTextContent(optionText)
|
|
573
|
-
})
|
|
574
|
-
|
|
575
|
-
it('selects multiple clicked custom items', async () => {
|
|
576
|
-
const SELECTED_OPTIONS_AMOUNT = 2
|
|
577
|
-
const options = generator.pickset([...FRUITS], SELECTED_OPTIONS_AMOUNT)
|
|
578
|
-
|
|
579
|
-
setup({ multiple: true })
|
|
580
|
-
|
|
581
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
582
|
-
|
|
583
|
-
for await (const option of options) {
|
|
584
|
-
const optionText = getOptionText(option)
|
|
585
|
-
await selectEvent.select(optionText, searchInput)
|
|
586
|
-
}
|
|
587
|
-
|
|
588
|
-
const selectedOptions = await selectEvent.getSelectedOptions(searchInput)
|
|
589
|
-
expect(selectedOptions).toHaveLength(SELECTED_OPTIONS_AMOUNT)
|
|
590
|
-
|
|
591
|
-
for await (const [index, option] of options.entries()) {
|
|
592
|
-
const optionText = getOptionText(option)
|
|
593
|
-
expect(selectedOptions[index]).toHaveTextContent(optionText)
|
|
594
|
-
}
|
|
595
|
-
})
|
|
596
|
-
|
|
597
|
-
it.each([[{ multiple: true }], [{ multiple: false }]])(
|
|
598
|
-
'overrides the empty component with %s',
|
|
599
|
-
async (props) => {
|
|
600
|
-
const Empty = () => {
|
|
601
|
-
return <Select.Empty data-testid="custom-empty">No fruit found.</Select.Empty>
|
|
602
|
-
}
|
|
603
|
-
setup({
|
|
604
|
-
...props,
|
|
605
|
-
components: { Empty },
|
|
606
|
-
})
|
|
607
|
-
|
|
608
|
-
fire.change(screen.getByTestId('select-trigger-search-field'), {
|
|
609
|
-
target: { value: 'foo' },
|
|
610
|
-
})
|
|
611
|
-
|
|
612
|
-
expect(await screen.findByTestId('custom-empty')).toHaveTextContent('No fruit found.')
|
|
613
|
-
}
|
|
614
|
-
)
|
|
615
|
-
|
|
616
|
-
it.each([[{ multiple: true }], [{ multiple: false }]])(
|
|
617
|
-
'overrides the creatable option component - %s',
|
|
618
|
-
async (args) => {
|
|
619
|
-
setup({
|
|
620
|
-
components: { CreatableOption },
|
|
621
|
-
onCreate: jest.fn(),
|
|
622
|
-
...args,
|
|
623
|
-
})
|
|
624
|
-
|
|
625
|
-
fire.change(screen.getByTestId('select-trigger-search-field'), {
|
|
626
|
-
target: { value: 'foo' },
|
|
627
|
-
})
|
|
628
|
-
|
|
629
|
-
await waitFor(() => {
|
|
630
|
-
expect(screen.getByTestId('custom-creatable')).toHaveTextContent('Add item')
|
|
631
|
-
})
|
|
632
|
-
}
|
|
633
|
-
)
|
|
634
|
-
|
|
635
|
-
it.each([[{ multiple: false }], [{ multiple: true }]])(
|
|
636
|
-
'calls onCreate when custom creatable option is clicked - %s',
|
|
637
|
-
async (args) => {
|
|
638
|
-
const onCreate = jest.fn()
|
|
639
|
-
setup({
|
|
640
|
-
components: { CreatableOption },
|
|
641
|
-
onCreate,
|
|
642
|
-
...args,
|
|
643
|
-
})
|
|
644
|
-
|
|
645
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
646
|
-
|
|
647
|
-
await act(async () => {
|
|
648
|
-
fire.change(searchInput, {
|
|
649
|
-
target: { value: 'foo' },
|
|
650
|
-
})
|
|
651
|
-
|
|
652
|
-
const creatableOption = await screen.findByTestId('custom-creatable')
|
|
653
|
-
|
|
654
|
-
fire.click(creatableOption)
|
|
655
|
-
})
|
|
656
|
-
|
|
657
|
-
expect(onCreate).toBeCalledWith('foo')
|
|
658
|
-
}
|
|
659
|
-
)
|
|
660
|
-
})
|
|
661
|
-
|
|
662
|
-
describe('Creatable sync', () => {
|
|
663
|
-
const setup = (overrides: Partial<SelectProps>) =>
|
|
664
|
-
renderer(<CreatableSync {...overrides} />).render()
|
|
665
|
-
it.each([[{ multiple: false }], [{ multiple: true }]])(
|
|
666
|
-
'does not render the creatable option when onCreate callback is not provided - %s',
|
|
667
|
-
async (args) => {
|
|
668
|
-
setup({ onCreate: null as unknown as undefined, ...args })
|
|
669
|
-
|
|
670
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
671
|
-
fire.change(searchInput, {
|
|
672
|
-
target: { value: 'foo' },
|
|
673
|
-
})
|
|
674
|
-
|
|
675
|
-
await waitFor(() => {
|
|
676
|
-
screen.getByText('No results found.')
|
|
677
|
-
expect(screen.queryByText('Add "foo"')).not.toBeInTheDocument()
|
|
678
|
-
})
|
|
679
|
-
}
|
|
680
|
-
)
|
|
681
|
-
|
|
682
|
-
it.each([[{ multiple: false }], [{ multiple: true }]])(
|
|
683
|
-
'renders creatable option when onCreate callback is provided - %s',
|
|
684
|
-
async (args) => {
|
|
685
|
-
setup({ ...args })
|
|
686
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
687
|
-
fire.change(searchInput, {
|
|
688
|
-
target: { value: 'foo' },
|
|
689
|
-
})
|
|
690
|
-
await waitFor(() => {
|
|
691
|
-
expect(screen.getByText('Add "foo"')).toBeInTheDocument()
|
|
692
|
-
})
|
|
693
|
-
}
|
|
694
|
-
)
|
|
695
|
-
|
|
696
|
-
it.each([[{ multiple: false }], [{ multiple: true }]])(
|
|
697
|
-
'renders creatable option at the end of the list when the entered query is not equal one of the available options - %s',
|
|
698
|
-
async (args) => {
|
|
699
|
-
setup({ ...args })
|
|
700
|
-
const { label: availableOption } = generator.pickone([...FRUITS])
|
|
701
|
-
const query = availableOption.slice(0, availableOption.length - 1)
|
|
702
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
703
|
-
|
|
704
|
-
fire.change(searchInput, {
|
|
705
|
-
target: { value: query },
|
|
706
|
-
})
|
|
707
|
-
|
|
708
|
-
await waitFor(() => {
|
|
709
|
-
expect(screen.getByLabelText(availableOption)).toBeInTheDocument()
|
|
710
|
-
})
|
|
711
|
-
expect(screen.getByText(`Add "${query}"`)).toBeInTheDocument()
|
|
712
|
-
}
|
|
713
|
-
)
|
|
714
|
-
|
|
715
|
-
it.each([[{ multiple: false }], [{ multiple: true }]])(
|
|
716
|
-
'does not render creatable option at the end of the list when the onCreate prop is not provided - %s',
|
|
717
|
-
async (args) => {
|
|
718
|
-
setup({
|
|
719
|
-
onCreate: null as unknown as undefined,
|
|
720
|
-
...args,
|
|
721
|
-
})
|
|
722
|
-
const { label: availableOption } = generator.pickone([...FRUITS])
|
|
723
|
-
const query = availableOption.slice(0, availableOption.length - 1)
|
|
724
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
725
|
-
|
|
726
|
-
fire.change(searchInput, {
|
|
727
|
-
target: { value: query },
|
|
728
|
-
})
|
|
729
|
-
|
|
730
|
-
await screen.findByLabelText(availableOption)
|
|
731
|
-
await waitFor(() => {
|
|
732
|
-
expect(screen.queryByText(`Add "${query}"`)).not.toBeInTheDocument()
|
|
733
|
-
})
|
|
734
|
-
}
|
|
735
|
-
)
|
|
736
|
-
|
|
737
|
-
it.each([[{ multiple: false }], [{ multiple: true }]])(
|
|
738
|
-
'does not render creatable option at the end of the list when the entered query is equal one of the available options - %s',
|
|
739
|
-
async (args) => {
|
|
740
|
-
setup({
|
|
741
|
-
...args,
|
|
742
|
-
})
|
|
743
|
-
const { label: availableOption } = generator.pickone([...FRUITS])
|
|
744
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
745
|
-
|
|
746
|
-
fire.change(searchInput, {
|
|
747
|
-
target: { value: availableOption },
|
|
748
|
-
})
|
|
749
|
-
|
|
750
|
-
await screen.findByLabelText(availableOption)
|
|
751
|
-
await waitFor(() => {
|
|
752
|
-
expect(screen.queryByText(`Add "${availableOption}"`)).not.toBeInTheDocument()
|
|
753
|
-
})
|
|
754
|
-
}
|
|
755
|
-
)
|
|
756
|
-
|
|
757
|
-
it.each([[{ multiple: false }], [{ multiple: true }]])(
|
|
758
|
-
'does not render creatable option when no query is provided - %s',
|
|
759
|
-
async (args) => {
|
|
760
|
-
setup({
|
|
761
|
-
...args,
|
|
762
|
-
})
|
|
763
|
-
const { label: availableOption } = generator.pickone([...FRUITS])
|
|
764
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
765
|
-
|
|
766
|
-
await selectEvent.expand(searchInput)
|
|
767
|
-
|
|
768
|
-
await screen.findByLabelText(availableOption)
|
|
769
|
-
await waitFor(() => {
|
|
770
|
-
expect(screen.queryByText('Add ""')).not.toBeInTheDocument()
|
|
771
|
-
})
|
|
772
|
-
}
|
|
773
|
-
)
|
|
774
|
-
|
|
775
|
-
it.each([[{ multiple: false }], [{ multiple: true }]])(
|
|
776
|
-
'calls onCreate when creatable option is clicked - %s',
|
|
777
|
-
async (args) => {
|
|
778
|
-
const onCreate = jest.fn()
|
|
779
|
-
setup({ onCreate, ...args })
|
|
780
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
781
|
-
|
|
782
|
-
await act(async () => {
|
|
783
|
-
fire.change(searchInput, {
|
|
784
|
-
target: { value: 'foo' },
|
|
785
|
-
})
|
|
786
|
-
|
|
787
|
-
const creatableOption = await screen.findByText('Add "foo"')
|
|
788
|
-
|
|
789
|
-
fire.click(creatableOption)
|
|
790
|
-
})
|
|
791
|
-
|
|
792
|
-
expect(onCreate).toBeCalledWith('foo')
|
|
793
|
-
}
|
|
794
|
-
)
|
|
795
|
-
|
|
796
|
-
it.each([[{ multiple: false }], [{ multiple: true }]])(
|
|
797
|
-
'calls onChange with the new item when onCreate returns the item - %s',
|
|
798
|
-
async (args) => {
|
|
799
|
-
const query = 'foo'
|
|
800
|
-
const newItem: Fruit = { label: query, value: query, family: '' }
|
|
801
|
-
const value = args.multiple ? [newItem] : newItem
|
|
802
|
-
const onChange = jest.fn()
|
|
803
|
-
const onCreate = jest.fn().mockReturnValue(newItem)
|
|
804
|
-
|
|
805
|
-
setup({ onCreate, onChange, ...args })
|
|
806
|
-
|
|
807
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
808
|
-
|
|
809
|
-
await act(async () => {
|
|
810
|
-
fire.change(searchInput, {
|
|
811
|
-
target: { value: query },
|
|
812
|
-
})
|
|
813
|
-
|
|
814
|
-
const creatableOption = await screen.findByText(`Add "${query}"`)
|
|
815
|
-
|
|
816
|
-
fire.click(creatableOption)
|
|
817
|
-
})
|
|
818
|
-
|
|
819
|
-
expect(onChange).toBeCalledWith({
|
|
820
|
-
target: {
|
|
821
|
-
id: 'select-creatable-sync',
|
|
822
|
-
name: 'select-creatable-sync',
|
|
823
|
-
value,
|
|
824
|
-
},
|
|
825
|
-
})
|
|
826
|
-
}
|
|
827
|
-
)
|
|
828
|
-
|
|
829
|
-
it.each([[{ multiple: false }], [{ multiple: true }]])(
|
|
830
|
-
"does not call onChange when onCreate doesn't return the item - %s",
|
|
831
|
-
async (args) => {
|
|
832
|
-
const query = 'foo'
|
|
833
|
-
const onChange = jest.fn()
|
|
834
|
-
const onCreate = jest.fn()
|
|
835
|
-
|
|
836
|
-
setup({ onCreate, onChange, ...args })
|
|
837
|
-
|
|
838
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
839
|
-
|
|
840
|
-
await act(async () => {
|
|
841
|
-
fire.change(searchInput, {
|
|
842
|
-
target: { value: query },
|
|
843
|
-
})
|
|
844
|
-
|
|
845
|
-
const creatableOption = await screen.findByText(`Add "${query}"`)
|
|
846
|
-
|
|
847
|
-
fire.click(creatableOption)
|
|
848
|
-
})
|
|
849
|
-
|
|
850
|
-
expect(onChange).not.toBeCalled()
|
|
851
|
-
}
|
|
852
|
-
)
|
|
853
|
-
|
|
854
|
-
it.each([[{ multiple: false }], [{ multiple: true }]])(
|
|
855
|
-
'fetches items after onCreate callback is called - %s',
|
|
856
|
-
async (args) => {
|
|
857
|
-
const dsFetch = jest.fn()
|
|
858
|
-
const datasources = [
|
|
859
|
-
() => ({
|
|
860
|
-
type: 'user',
|
|
861
|
-
adapter: {
|
|
862
|
-
getKey: jest.fn().mockReturnValue('foo'),
|
|
863
|
-
getLabel: jest.fn().mockReturnValue('foo'),
|
|
864
|
-
},
|
|
865
|
-
fetch: dsFetch,
|
|
866
|
-
}),
|
|
867
|
-
]
|
|
868
|
-
setup({ datasources, ...args })
|
|
869
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
870
|
-
|
|
871
|
-
await act(async () => {
|
|
872
|
-
fire.change(searchInput, {
|
|
873
|
-
target: { value: 'foo' },
|
|
874
|
-
})
|
|
875
|
-
|
|
876
|
-
const creatableOption = await screen.findByText('Add "foo"')
|
|
877
|
-
|
|
878
|
-
fire.click(creatableOption)
|
|
879
|
-
})
|
|
880
|
-
|
|
881
|
-
await waitFor(() => {
|
|
882
|
-
expect(dsFetch).toBeCalledTimes(2)
|
|
883
|
-
})
|
|
884
|
-
expect(dsFetch).lastCalledWith({ query: 'foo', regex: expect.anything() })
|
|
885
|
-
}
|
|
886
|
-
)
|
|
887
|
-
|
|
888
|
-
it.each([[{ multiple: false }], [{ multiple: true }]])(
|
|
889
|
-
'renders fixed creatable option when isValidNewOption is passed - %s',
|
|
890
|
-
async (args) => {
|
|
891
|
-
setup({ ...args, isValidNewOption: true })
|
|
892
|
-
|
|
893
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
894
|
-
await selectEvent.expand(searchInput)
|
|
895
|
-
|
|
896
|
-
await waitFor(() => {
|
|
897
|
-
expect(screen.getByText(/add ""/i)).toBeInTheDocument()
|
|
898
|
-
})
|
|
899
|
-
}
|
|
900
|
-
)
|
|
901
|
-
|
|
902
|
-
it.each([[{ multiple: false }], [{ multiple: true }]])(
|
|
903
|
-
'renders creatable option as first item - %s',
|
|
904
|
-
async (args) => {
|
|
905
|
-
setup({ ...args, isValidNewOption: true, createOptionPosition: 'first' })
|
|
906
|
-
|
|
907
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
908
|
-
await selectEvent.expand(searchInput)
|
|
909
|
-
|
|
910
|
-
await waitFor(() => {
|
|
911
|
-
expect(screen.getByText(/add ""/i)).toBeInTheDocument()
|
|
912
|
-
})
|
|
913
|
-
expect(screen.getAllByTestId('dropdown-menu-item')[0]).toHaveTextContent(/add ""/i)
|
|
914
|
-
}
|
|
915
|
-
)
|
|
916
|
-
|
|
917
|
-
it.each([[{ multiple: false }], [{ multiple: true }]])(
|
|
918
|
-
'renders creatable option as last item - %s',
|
|
919
|
-
async (args) => {
|
|
920
|
-
setup({ ...args, isValidNewOption: true, createOptionPosition: 'last' })
|
|
921
|
-
|
|
922
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
923
|
-
await selectEvent.expand(searchInput)
|
|
924
|
-
|
|
925
|
-
await waitFor(() => {
|
|
926
|
-
expect(screen.getByText(/add ""/i)).toBeInTheDocument()
|
|
927
|
-
})
|
|
928
|
-
const options = screen.getAllByTestId('dropdown-menu-item')
|
|
929
|
-
expect(options[options.length - 1]).toHaveTextContent(/add ""/i)
|
|
930
|
-
}
|
|
931
|
-
)
|
|
932
|
-
|
|
933
|
-
it.each([[{ multiple: false }], [{ multiple: true }]])(
|
|
934
|
-
'keep creatable option on the list even when any value is selected - %s',
|
|
935
|
-
async (args) => {
|
|
936
|
-
const CreatableOption = () => {
|
|
937
|
-
return (
|
|
938
|
-
<Select.CreatableOption data-testid="custom-creatable">Add item</Select.CreatableOption>
|
|
939
|
-
)
|
|
940
|
-
}
|
|
941
|
-
const value = generator.pickone([...FRUITS]) as Selectable
|
|
942
|
-
setup({
|
|
943
|
-
...args,
|
|
944
|
-
isValidNewOption: true,
|
|
945
|
-
createOptionPosition: 'first',
|
|
946
|
-
value,
|
|
947
|
-
components: {
|
|
948
|
-
CreatableOption,
|
|
949
|
-
},
|
|
950
|
-
})
|
|
951
|
-
|
|
952
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
953
|
-
await selectEvent.expand(searchInput)
|
|
954
|
-
expect(await screen.findByText(/add item/i)).toBeVisible()
|
|
955
|
-
}
|
|
956
|
-
)
|
|
957
|
-
|
|
958
|
-
it.each([[{ multiple: false }], [{ multiple: true }]])(
|
|
959
|
-
'show creatable option on the list even when option list is empty - %s',
|
|
960
|
-
async (args) => {
|
|
961
|
-
const CreatableOption = () => {
|
|
962
|
-
return <Select.CreatableOption>Add item</Select.CreatableOption>
|
|
963
|
-
}
|
|
964
|
-
setup({
|
|
965
|
-
...args,
|
|
966
|
-
isValidNewOption: true,
|
|
967
|
-
createOptionPosition: 'first',
|
|
968
|
-
options: [],
|
|
969
|
-
components: {
|
|
970
|
-
CreatableOption,
|
|
971
|
-
},
|
|
972
|
-
})
|
|
973
|
-
|
|
974
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
975
|
-
await selectEvent.expand(searchInput)
|
|
976
|
-
expect(await screen.findByText(/add item/i)).toBeVisible()
|
|
977
|
-
}
|
|
978
|
-
)
|
|
979
|
-
})
|
|
980
|
-
|
|
981
|
-
describe('Creatable Async', () => {
|
|
982
|
-
const setup = (overrides: Partial<SelectProps>) =>
|
|
983
|
-
renderer(<CreatableAsync {...overrides} />).render()
|
|
984
|
-
|
|
985
|
-
it('fetchs items after call onCreate callback - async', async () => {
|
|
986
|
-
const dsFetch = jest.fn()
|
|
987
|
-
const onCreate = jest.fn()
|
|
988
|
-
const datasources = [
|
|
989
|
-
() => ({
|
|
990
|
-
type: 'user',
|
|
991
|
-
adapter: {
|
|
992
|
-
getKey: jest.fn().mockReturnValue('foo'),
|
|
993
|
-
getLabel: jest.fn().mockReturnValue('foo'),
|
|
994
|
-
},
|
|
995
|
-
fetch: dsFetch,
|
|
996
|
-
}),
|
|
997
|
-
]
|
|
998
|
-
setup({ datasources, onCreate })
|
|
999
|
-
const searchInput = screen.getByLabelText('Select the project manager')
|
|
1000
|
-
|
|
1001
|
-
fire.change(searchInput, {
|
|
1002
|
-
target: { value: 'foo' },
|
|
1003
|
-
})
|
|
1004
|
-
const creatableOption = await screen.findByText('Add "foo"')
|
|
1005
|
-
fire.click(creatableOption)
|
|
1006
|
-
|
|
1007
|
-
await waitFor(
|
|
1008
|
-
() => {
|
|
1009
|
-
expect(dsFetch).toBeCalledTimes(2)
|
|
1010
|
-
},
|
|
1011
|
-
{ timeout: 5000 }
|
|
1012
|
-
)
|
|
1013
|
-
expect(dsFetch).lastCalledWith({ query: 'foo', regex: expect.anything() })
|
|
1014
|
-
})
|
|
1015
|
-
|
|
1016
|
-
it.each([[{ multiple: false }], [{ multiple: true }]])(
|
|
1017
|
-
'calls onChange with the new item when onCreate resolves the item - %s',
|
|
1018
|
-
async (args) => {
|
|
1019
|
-
const query = 'foo'
|
|
1020
|
-
const newItem = { uuid: query, name: query, _type: 'user' }
|
|
1021
|
-
const value = args.multiple ? [newItem] : newItem
|
|
1022
|
-
const onChange = jest.fn()
|
|
1023
|
-
const onCreate = jest.fn().mockResolvedValue(newItem)
|
|
1024
|
-
|
|
1025
|
-
setup({ onCreate, onChange, ...args })
|
|
1026
|
-
const searchInput = screen.getByLabelText('Select the project manager')
|
|
1027
|
-
|
|
1028
|
-
fire.change(searchInput, {
|
|
1029
|
-
target: { value: query },
|
|
1030
|
-
})
|
|
1031
|
-
await waitFor(() => screen.findByTestId('select-trigger-loading'))
|
|
1032
|
-
|
|
1033
|
-
const creatableOption = await screen.findByText(`Add "${query}"`, undefined, {
|
|
1034
|
-
timeout: 2500,
|
|
1035
|
-
})
|
|
1036
|
-
fire.click(creatableOption)
|
|
1037
|
-
|
|
1038
|
-
await waitFor(() => {
|
|
1039
|
-
expect(onChange).toBeCalledWith({
|
|
1040
|
-
target: {
|
|
1041
|
-
id: 'select-creatable-async',
|
|
1042
|
-
name: 'select-creatable-async',
|
|
1043
|
-
value,
|
|
1044
|
-
},
|
|
1045
|
-
})
|
|
1046
|
-
})
|
|
1047
|
-
}
|
|
1048
|
-
)
|
|
1049
|
-
})
|
|
1050
|
-
|
|
1051
|
-
describe('SelectableKeyType Options', () => {
|
|
1052
|
-
const setup = (overrides: Partial<SelectProps>) =>
|
|
1053
|
-
renderer(<Playground {...overrides} options={SelectableKeyTypeOptions} />).render()
|
|
1054
|
-
|
|
1055
|
-
const expectedValue = (value: unknown) => ({
|
|
1056
|
-
target: {
|
|
1057
|
-
id: 'select-playground',
|
|
1058
|
-
name: 'select-playground',
|
|
1059
|
-
value,
|
|
1060
|
-
},
|
|
1061
|
-
})
|
|
1062
|
-
|
|
1063
|
-
it.each(SelectableKeyTypeOptions)('selects single option: %s', async (option) => {
|
|
1064
|
-
const onChange = jest.fn()
|
|
1065
|
-
setup({ onChange })
|
|
1066
|
-
|
|
1067
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
1068
|
-
|
|
1069
|
-
await selectEvent.select(option.label, searchInput)
|
|
1070
|
-
const selectedOptions = await selectEvent.getSelectedOptions(searchInput)
|
|
1071
|
-
expect(selectedOptions).toHaveLength(1)
|
|
1072
|
-
expect(selectedOptions[0]).toHaveTextContent(option.label)
|
|
1073
|
-
expect(onChange).toBeCalledWith(expectedValue({ _type: 'generic', ...option }))
|
|
1074
|
-
})
|
|
1075
|
-
|
|
1076
|
-
it.each(SelectableKeyTypeOptions)('selects multiple options %s', async (option) => {
|
|
1077
|
-
const onChange = jest.fn()
|
|
1078
|
-
setup({ onChange, multiple: true })
|
|
1079
|
-
|
|
1080
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
1081
|
-
|
|
1082
|
-
await selectEvent.select(option.label, searchInput)
|
|
1083
|
-
const selectedOptions = await selectEvent.getSelectedOptions(searchInput)
|
|
1084
|
-
expect(selectedOptions).toHaveLength(1)
|
|
1085
|
-
expect(selectedOptions[0]).toHaveTextContent(option.label)
|
|
1086
|
-
expect(onChange).toBeCalledWith(expectedValue([{ _type: 'generic', ...option }]))
|
|
1087
|
-
})
|
|
1088
|
-
|
|
1089
|
-
it('selects all options', async () => {
|
|
1090
|
-
setup({ multiple: true })
|
|
1091
|
-
|
|
1092
|
-
const searchInput = screen.getByLabelText('Select your favorite fruit')
|
|
1093
|
-
for (let i = 0; i < SelectableKeyTypeOptions.length; i++) {
|
|
1094
|
-
await selectEvent.select(SelectableKeyTypeOptions[i].label, searchInput)
|
|
1095
|
-
}
|
|
1096
|
-
|
|
1097
|
-
const selectedOptions = await selectEvent.getSelectedOptions(searchInput)
|
|
1098
|
-
expect(selectedOptions).toHaveLength(SelectableKeyTypeOptions.length)
|
|
1099
|
-
|
|
1100
|
-
for (let i = 0; i < selectedOptions.length; i++) {
|
|
1101
|
-
const element = selectedOptions[i]
|
|
1102
|
-
expect(element).toHaveTextContent(SelectableKeyTypeOptions[i].label)
|
|
1103
|
-
}
|
|
1104
|
-
|
|
1105
|
-
await selectEvent.expand(searchInput)
|
|
1106
|
-
expect(screen.getByText('No more options.')).toBeInTheDocument()
|
|
1107
|
-
})
|
|
1108
|
-
})
|
|
1109
|
-
})
|