@patternfly/react-core 5.3.0-prerelease.3 → 5.3.0-prerelease.5
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/CHANGELOG.md +16 -0
- package/components/package.json +1 -1
- package/deprecated/package.json +1 -1
- package/dist/dynamic/components/AboutModal/package.json +1 -1
- package/dist/dynamic/components/Accordion/package.json +1 -1
- package/dist/dynamic/components/ActionList/package.json +1 -1
- package/dist/dynamic/components/Alert/package.json +1 -1
- package/dist/dynamic/components/Avatar/package.json +1 -1
- package/dist/dynamic/components/BackToTop/package.json +1 -1
- package/dist/dynamic/components/Backdrop/package.json +1 -1
- package/dist/dynamic/components/BackgroundImage/package.json +1 -1
- package/dist/dynamic/components/Badge/package.json +1 -1
- package/dist/dynamic/components/Banner/package.json +1 -1
- package/dist/dynamic/components/Brand/package.json +1 -1
- package/dist/dynamic/components/Breadcrumb/package.json +1 -1
- package/dist/dynamic/components/Button/package.json +1 -1
- package/dist/dynamic/components/CalendarMonth/package.json +1 -1
- package/dist/dynamic/components/Card/package.json +1 -1
- package/dist/dynamic/components/Checkbox/package.json +1 -1
- package/dist/dynamic/components/Chip/package.json +1 -1
- package/dist/dynamic/components/ClipboardCopy/package.json +1 -1
- package/dist/dynamic/components/CodeBlock/package.json +1 -1
- package/dist/dynamic/components/DataList/package.json +1 -1
- package/dist/dynamic/components/DatePicker/package.json +1 -1
- package/dist/dynamic/components/DescriptionList/package.json +1 -1
- package/dist/dynamic/components/Divider/package.json +1 -1
- package/dist/dynamic/components/DragDrop/package.json +1 -1
- package/dist/dynamic/components/Drawer/package.json +1 -1
- package/dist/dynamic/components/Dropdown/package.json +1 -1
- package/dist/dynamic/components/DualListSelector/package.json +1 -1
- package/dist/dynamic/components/EmptyState/package.json +1 -1
- package/dist/dynamic/components/ExpandableSection/package.json +1 -1
- package/dist/dynamic/components/FileUpload/package.json +1 -1
- package/dist/dynamic/components/Form/package.json +1 -1
- package/dist/dynamic/components/FormSelect/package.json +1 -1
- package/dist/dynamic/components/HelperText/package.json +1 -1
- package/dist/dynamic/components/Hint/package.json +1 -1
- package/dist/dynamic/components/Icon/package.json +1 -1
- package/dist/dynamic/components/InputGroup/package.json +1 -1
- package/dist/dynamic/components/JumpLinks/package.json +1 -1
- package/dist/dynamic/components/Label/package.json +1 -1
- package/dist/dynamic/components/List/package.json +1 -1
- package/dist/dynamic/components/LoginPage/package.json +1 -1
- package/dist/dynamic/components/Masthead/package.json +1 -1
- package/dist/dynamic/components/Menu/package.json +1 -1
- package/dist/dynamic/components/MenuToggle/package.json +1 -1
- package/dist/dynamic/components/Modal/package.json +1 -1
- package/dist/dynamic/components/MultipleFileUpload/package.json +1 -1
- package/dist/dynamic/components/Nav/package.json +1 -1
- package/dist/dynamic/components/NotificationBadge/package.json +1 -1
- package/dist/dynamic/components/NotificationDrawer/package.json +1 -1
- package/dist/dynamic/components/NumberInput/package.json +1 -1
- package/dist/dynamic/components/OverflowMenu/package.json +1 -1
- package/dist/dynamic/components/Page/package.json +1 -1
- package/dist/dynamic/components/Pagination/package.json +1 -1
- package/dist/dynamic/components/Panel/package.json +1 -1
- package/dist/dynamic/components/Popover/package.json +1 -1
- package/dist/dynamic/components/Progress/package.json +1 -1
- package/dist/dynamic/components/ProgressStepper/package.json +1 -1
- package/dist/dynamic/components/Radio/package.json +1 -1
- package/dist/dynamic/components/SearchInput/package.json +1 -1
- package/dist/dynamic/components/Select/package.json +1 -1
- package/dist/dynamic/components/Sidebar/package.json +1 -1
- package/dist/dynamic/components/SimpleList/package.json +1 -1
- package/dist/dynamic/components/Skeleton/package.json +1 -1
- package/dist/dynamic/components/SkipToContent/package.json +1 -1
- package/dist/dynamic/components/Slider/package.json +1 -1
- package/dist/dynamic/components/Spinner/package.json +1 -1
- package/dist/dynamic/components/Switch/package.json +1 -1
- package/dist/dynamic/components/Tabs/package.json +1 -1
- package/dist/dynamic/components/Text/package.json +1 -1
- package/dist/dynamic/components/TextArea/package.json +1 -1
- package/dist/dynamic/components/TextInput/package.json +1 -1
- package/dist/dynamic/components/TextInputGroup/package.json +1 -1
- package/dist/dynamic/components/Tile/package.json +1 -1
- package/dist/dynamic/components/TimePicker/package.json +1 -1
- package/dist/dynamic/components/Timestamp/package.json +1 -1
- package/dist/dynamic/components/Title/package.json +1 -1
- package/dist/dynamic/components/ToggleGroup/package.json +1 -1
- package/dist/dynamic/components/Toolbar/package.json +1 -1
- package/dist/dynamic/components/Tooltip/package.json +1 -1
- package/dist/dynamic/components/TreeView/package.json +1 -1
- package/dist/dynamic/components/Truncate/package.json +1 -1
- package/dist/dynamic/components/Wizard/hooks/package.json +1 -1
- package/dist/dynamic/components/Wizard/package.json +1 -1
- package/dist/dynamic/deprecated/components/ApplicationLauncher/package.json +1 -1
- package/dist/dynamic/deprecated/components/ContextSelector/package.json +1 -1
- package/dist/dynamic/deprecated/components/Dropdown/package.json +1 -1
- package/dist/dynamic/deprecated/components/OptionsMenu/package.json +1 -1
- package/dist/dynamic/deprecated/components/PageHeader/package.json +1 -1
- package/dist/dynamic/deprecated/components/Select/package.json +1 -1
- package/dist/dynamic/deprecated/components/Wizard/package.json +1 -1
- package/dist/dynamic/deprecated/components/package.json +1 -1
- package/dist/dynamic/helpers/FocusTrap/FocusTrap/package.json +1 -1
- package/dist/dynamic/helpers/GenerateId/GenerateId/package.json +1 -1
- package/dist/dynamic/helpers/KeyboardHandler/package.json +1 -1
- package/dist/dynamic/helpers/OUIA/ouia/package.json +1 -1
- package/dist/dynamic/helpers/Popper/Popper/package.json +1 -1
- package/dist/dynamic/helpers/constants/package.json +1 -1
- package/dist/dynamic/helpers/datetimeUtils/package.json +1 -1
- package/dist/dynamic/helpers/favorites/package.json +1 -1
- package/dist/dynamic/helpers/fileUtils/package.json +1 -1
- package/dist/dynamic/helpers/htmlConstants/package.json +1 -1
- package/dist/dynamic/helpers/package.json +1 -1
- package/dist/dynamic/helpers/resizeObserver/package.json +1 -1
- package/dist/dynamic/helpers/typeUtils/package.json +1 -1
- package/dist/dynamic/helpers/useInterval/package.json +1 -1
- package/dist/dynamic/helpers/useIsomorphicLayout/package.json +1 -1
- package/dist/dynamic/helpers/useUnmountEffect/package.json +1 -1
- package/dist/dynamic/helpers/util/package.json +1 -1
- package/dist/dynamic/layouts/Bullseye/package.json +1 -1
- package/dist/dynamic/layouts/Flex/package.json +1 -1
- package/dist/dynamic/layouts/Gallery/package.json +1 -1
- package/dist/dynamic/layouts/Grid/package.json +1 -1
- package/dist/dynamic/layouts/Level/package.json +1 -1
- package/dist/dynamic/layouts/Split/package.json +1 -1
- package/dist/dynamic/layouts/Stack/package.json +1 -1
- package/dist/dynamic/next/components/DualListSelector/package.json +1 -0
- package/dist/dynamic/next/components/Modal/package.json +1 -1
- package/dist/dynamic/next/components/package.json +1 -1
- package/dist/dynamic/styles/package.json +1 -1
- package/dist/esm/components/SearchInput/SearchInput.d.ts +2 -0
- package/dist/esm/components/SearchInput/SearchInput.d.ts.map +1 -1
- package/dist/esm/components/SearchInput/SearchInput.js +2 -2
- package/dist/esm/components/SearchInput/SearchInput.js.map +1 -1
- package/dist/esm/components/Select/Select.d.ts +6 -0
- package/dist/esm/components/Select/Select.d.ts.map +1 -1
- package/dist/esm/components/Select/Select.js +3 -3
- package/dist/esm/components/Select/Select.js.map +1 -1
- package/dist/esm/components/TextInputGroup/TextInputGroupMain.d.ts +2 -0
- package/dist/esm/components/TextInputGroup/TextInputGroupMain.d.ts.map +1 -1
- package/dist/esm/components/TextInputGroup/TextInputGroupMain.js +3 -3
- package/dist/esm/components/TextInputGroup/TextInputGroupMain.js.map +1 -1
- package/dist/esm/helpers/Popper/Popper.js +2 -2
- package/dist/esm/helpers/Popper/Popper.js.map +1 -1
- package/dist/esm/next/components/DualListSelector/DualListSelector.d.ts +23 -0
- package/dist/esm/next/components/DualListSelector/DualListSelector.d.ts.map +1 -0
- package/dist/esm/next/components/DualListSelector/DualListSelector.js +23 -0
- package/dist/esm/next/components/DualListSelector/DualListSelector.js.map +1 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorContext.d.ts +19 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorContext.d.ts.map +1 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorContext.js +5 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorContext.js.map +1 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorControl.d.ts +25 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorControl.d.ts.map +1 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorControl.js +18 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorControl.js.map +1 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorControlsWrapper.d.ts +15 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorControlsWrapper.d.ts.map +1 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorControlsWrapper.js +35 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorControlsWrapper.js.map +1 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorList.d.ts +8 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorList.d.ts.map +1 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorList.js +26 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorList.js.map +1 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorListItem.d.ts +29 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorListItem.d.ts.map +1 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorListItem.js +38 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorListItem.js.map +1 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorListWrapper.d.ts +24 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorListWrapper.d.ts.map +1 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorListWrapper.js +59 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorListWrapper.js.map +1 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorPane.d.ts +31 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorPane.d.ts.map +1 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorPane.js +27 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorPane.js.map +1 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorTree.d.ts +48 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorTree.d.ts.map +1 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorTree.js +15 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorTree.js.map +1 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorTreeItem.d.ts +32 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorTreeItem.d.ts.map +1 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorTreeItem.js +75 -0
- package/dist/esm/next/components/DualListSelector/DualListSelectorTreeItem.js.map +1 -0
- package/dist/esm/next/components/DualListSelector/index.d.ts +8 -0
- package/dist/esm/next/components/DualListSelector/index.d.ts.map +1 -0
- package/dist/esm/next/components/DualListSelector/index.js +8 -0
- package/dist/esm/next/components/DualListSelector/index.js.map +1 -0
- package/dist/esm/next/components/DualListSelector/treeUtils.d.ts +8 -0
- package/dist/esm/next/components/DualListSelector/treeUtils.d.ts.map +1 -0
- package/dist/esm/next/components/DualListSelector/treeUtils.js +68 -0
- package/dist/esm/next/components/DualListSelector/treeUtils.js.map +1 -0
- package/dist/esm/next/components/index.d.ts +1 -0
- package/dist/esm/next/components/index.d.ts.map +1 -1
- package/dist/esm/next/components/index.js +1 -0
- package/dist/esm/next/components/index.js.map +1 -1
- package/dist/js/components/SearchInput/SearchInput.d.ts +2 -0
- package/dist/js/components/SearchInput/SearchInput.d.ts.map +1 -1
- package/dist/js/components/SearchInput/SearchInput.js +2 -2
- package/dist/js/components/SearchInput/SearchInput.js.map +1 -1
- package/dist/js/components/Select/Select.d.ts +6 -0
- package/dist/js/components/Select/Select.d.ts.map +1 -1
- package/dist/js/components/Select/Select.js +3 -3
- package/dist/js/components/Select/Select.js.map +1 -1
- package/dist/js/components/TextInputGroup/TextInputGroupMain.d.ts +2 -0
- package/dist/js/components/TextInputGroup/TextInputGroupMain.d.ts.map +1 -1
- package/dist/js/components/TextInputGroup/TextInputGroupMain.js +3 -3
- package/dist/js/components/TextInputGroup/TextInputGroupMain.js.map +1 -1
- package/dist/js/helpers/Popper/Popper.js +2 -2
- package/dist/js/helpers/Popper/Popper.js.map +1 -1
- package/dist/js/next/components/DualListSelector/DualListSelector.d.ts +23 -0
- package/dist/js/next/components/DualListSelector/DualListSelector.d.ts.map +1 -0
- package/dist/js/next/components/DualListSelector/DualListSelector.js +26 -0
- package/dist/js/next/components/DualListSelector/DualListSelector.js.map +1 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorContext.d.ts +19 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorContext.d.ts.map +1 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorContext.js +9 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorContext.js.map +1 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorControl.d.ts +25 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorControl.d.ts.map +1 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorControl.js +22 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorControl.js.map +1 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorControlsWrapper.d.ts +15 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorControlsWrapper.d.ts.map +1 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorControlsWrapper.js +39 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorControlsWrapper.js.map +1 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorList.d.ts +8 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorList.d.ts.map +1 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorList.js +30 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorList.js.map +1 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorListItem.d.ts +29 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorListItem.d.ts.map +1 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorListItem.js +42 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorListItem.js.map +1 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorListWrapper.d.ts +24 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorListWrapper.d.ts.map +1 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorListWrapper.js +63 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorListWrapper.js.map +1 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorPane.d.ts +31 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorPane.d.ts.map +1 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorPane.js +31 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorPane.js.map +1 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorTree.d.ts +48 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorTree.d.ts.map +1 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorTree.js +19 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorTree.js.map +1 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorTreeItem.d.ts +32 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorTreeItem.d.ts.map +1 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorTreeItem.js +78 -0
- package/dist/js/next/components/DualListSelector/DualListSelectorTreeItem.js.map +1 -0
- package/dist/js/next/components/DualListSelector/index.d.ts +8 -0
- package/dist/js/next/components/DualListSelector/index.d.ts.map +1 -0
- package/dist/js/next/components/DualListSelector/index.js +11 -0
- package/dist/js/next/components/DualListSelector/index.js.map +1 -0
- package/dist/js/next/components/DualListSelector/treeUtils.d.ts +8 -0
- package/dist/js/next/components/DualListSelector/treeUtils.d.ts.map +1 -0
- package/dist/js/next/components/DualListSelector/treeUtils.js +77 -0
- package/dist/js/next/components/DualListSelector/treeUtils.js.map +1 -0
- package/dist/js/next/components/index.d.ts +1 -0
- package/dist/js/next/components/index.d.ts.map +1 -1
- package/dist/js/next/components/index.js +1 -0
- package/dist/js/next/components/index.js.map +1 -1
- package/dist/umd/react-core.min.js +2 -2
- package/helpers/package.json +1 -1
- package/layouts/package.json +1 -1
- package/next/package.json +1 -1
- package/package.json +2 -2
- package/src/components/SearchInput/SearchInput.tsx +4 -0
- package/src/components/Select/Select.tsx +13 -1
- package/src/components/TextInputGroup/TextInputGroupMain.tsx +5 -0
- package/src/components/TextInputGroup/__tests__/TextInputGroupMain.test.tsx +8 -0
- package/src/helpers/Popper/Popper.tsx +1 -1
- package/src/next/components/DualListSelector/DualListSelector.tsx +50 -0
- package/src/next/components/DualListSelector/DualListSelectorContext.ts +21 -0
- package/src/next/components/DualListSelector/DualListSelectorControl.tsx +66 -0
- package/src/next/components/DualListSelector/DualListSelectorControlsWrapper.tsx +87 -0
- package/src/next/components/DualListSelector/DualListSelectorList.tsx +57 -0
- package/src/next/components/DualListSelector/DualListSelectorListItem.tsx +105 -0
- package/src/next/components/DualListSelector/DualListSelectorListWrapper.tsx +124 -0
- package/src/next/components/DualListSelector/DualListSelectorPane.tsx +94 -0
- package/src/next/components/DualListSelector/DualListSelectorTree.tsx +110 -0
- package/src/next/components/DualListSelector/DualListSelectorTreeItem.tsx +184 -0
- package/src/next/components/DualListSelector/__tests__/DualListSelector.test.tsx +26 -0
- package/src/next/components/DualListSelector/__tests__/__snapshots__/DualListSelector.test.tsx.snap +122 -0
- package/src/next/components/DualListSelector/examples/DualListSelector.md +99 -0
- package/src/next/components/DualListSelector/examples/DualListSelectorBasic.tsx +157 -0
- package/src/next/components/DualListSelector/examples/DualListSelectorBasicSearch.tsx +214 -0
- package/src/next/components/DualListSelector/examples/DualListSelectorBasicTooltips.tsx +165 -0
- package/src/next/components/DualListSelector/examples/DualListSelectorComplexOptionsActions.tsx +347 -0
- package/src/next/components/DualListSelector/examples/DualListSelectorDragDrop.tsx +184 -0
- package/src/next/components/DualListSelector/examples/DualListSelectorTree.tsx +380 -0
- package/src/next/components/DualListSelector/index.ts +7 -0
- package/src/next/components/DualListSelector/treeUtils.ts +81 -0
- package/src/next/components/index.ts +1 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import styles from '@patternfly/react-styles/css/components/DualListSelector/dual-list-selector';
|
|
3
|
+
import { css } from '@patternfly/react-styles';
|
|
4
|
+
import { getUniqueId } from '../../../helpers';
|
|
5
|
+
import { DualListSelectorListWrapper } from './DualListSelectorListWrapper';
|
|
6
|
+
import { DualListSelectorPaneContext } from './DualListSelectorContext';
|
|
7
|
+
import { SearchInput } from '../../../components/SearchInput';
|
|
8
|
+
import cssMenuMinHeight from '@patternfly/react-tokens/dist/esm/c_dual_list_selector__menu_MinHeight';
|
|
9
|
+
|
|
10
|
+
/** Acts as the container for a list of options that are either available or chosen,
|
|
11
|
+
* depending on the pane type (available or chosen). A search input and other actions,
|
|
12
|
+
* such as sorting, can also be passed into this sub-component.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
export interface DualListSelectorPaneProps extends Omit<React.HTMLProps<HTMLDivElement>, 'title'> {
|
|
16
|
+
/** Additional classes applied to the dual list selector pane. */
|
|
17
|
+
className?: string;
|
|
18
|
+
/** A dual list selector list or dual list selector tree to be rendered in the pane. */
|
|
19
|
+
children?: React.ReactNode;
|
|
20
|
+
/** Flag indicating if this pane is the chosen pane. */
|
|
21
|
+
isChosen?: boolean;
|
|
22
|
+
/** Status to display above the pane. */
|
|
23
|
+
status?: string;
|
|
24
|
+
/** Title of the pane. */
|
|
25
|
+
title?: React.ReactNode;
|
|
26
|
+
/** A search input placed above the list at the top of the pane, before actions. */
|
|
27
|
+
searchInput?: React.ReactNode;
|
|
28
|
+
/** Actions to place above the pane. */
|
|
29
|
+
actions?: React.ReactNode[];
|
|
30
|
+
/** ID of the pane. */
|
|
31
|
+
id?: string;
|
|
32
|
+
/** Flag indicating whether the component is disabled. */
|
|
33
|
+
isDisabled?: boolean;
|
|
34
|
+
/** Callback for search input. To be used when isSearchable is true. */
|
|
35
|
+
onSearch?: (event: React.ChangeEvent<HTMLInputElement>) => void;
|
|
36
|
+
/** Minimum height of the list of options rendered in the pane. **/
|
|
37
|
+
listMinHeight?: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export const DualListSelectorPane: React.FunctionComponent<DualListSelectorPaneProps> = ({
|
|
41
|
+
isChosen = false,
|
|
42
|
+
className = '',
|
|
43
|
+
status = '',
|
|
44
|
+
actions,
|
|
45
|
+
searchInput,
|
|
46
|
+
children,
|
|
47
|
+
title = '',
|
|
48
|
+
id = getUniqueId('dual-list-selector-pane'),
|
|
49
|
+
isDisabled = false,
|
|
50
|
+
listMinHeight,
|
|
51
|
+
...props
|
|
52
|
+
}: DualListSelectorPaneProps) => (
|
|
53
|
+
<div
|
|
54
|
+
className={css(styles.dualListSelectorPane, isChosen ? styles.modifiers.chosen : 'pf-m-available', className)}
|
|
55
|
+
{...props}
|
|
56
|
+
>
|
|
57
|
+
{title && (
|
|
58
|
+
<div className={css(styles.dualListSelectorHeader)}>
|
|
59
|
+
<div className={`${styles.dualListSelector}__title`}>
|
|
60
|
+
<div className={css(styles.dualListSelectorTitleText)}>{title}</div>
|
|
61
|
+
</div>
|
|
62
|
+
</div>
|
|
63
|
+
)}
|
|
64
|
+
{(actions || searchInput) && (
|
|
65
|
+
<div className={css(styles.dualListSelectorTools)}>
|
|
66
|
+
{searchInput && (
|
|
67
|
+
<div className={css(styles.dualListSelectorToolsFilter)}>
|
|
68
|
+
{searchInput ? searchInput : <SearchInput isDisabled={isDisabled} />}
|
|
69
|
+
</div>
|
|
70
|
+
)}
|
|
71
|
+
{actions && <div className={css(styles.dualListSelectorToolsActions)}>{actions}</div>}
|
|
72
|
+
</div>
|
|
73
|
+
)}
|
|
74
|
+
{status && (
|
|
75
|
+
<div className={css(styles.dualListSelectorStatus)}>
|
|
76
|
+
<div className={css(styles.dualListSelectorStatusText)} id={`${id}-status`}>
|
|
77
|
+
{status}
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
)}
|
|
81
|
+
<DualListSelectorPaneContext.Provider value={{ isChosen }}>
|
|
82
|
+
<DualListSelectorListWrapper
|
|
83
|
+
aria-labelledby={`${id}-status`}
|
|
84
|
+
id={`${id}-list`}
|
|
85
|
+
{...(listMinHeight && {
|
|
86
|
+
style: { [cssMenuMinHeight.name]: listMinHeight } as React.CSSProperties
|
|
87
|
+
})}
|
|
88
|
+
>
|
|
89
|
+
{children}
|
|
90
|
+
</DualListSelectorListWrapper>
|
|
91
|
+
</DualListSelectorPaneContext.Provider>
|
|
92
|
+
</div>
|
|
93
|
+
);
|
|
94
|
+
DualListSelectorPane.displayName = 'DualListSelectorPane';
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { css } from '@patternfly/react-styles';
|
|
3
|
+
import styles from '@patternfly/react-styles/css/components/DualListSelector/dual-list-selector';
|
|
4
|
+
import { DualListSelectorTreeItem } from './DualListSelectorTreeItem';
|
|
5
|
+
|
|
6
|
+
export interface DualListSelectorTreeItemData {
|
|
7
|
+
/** Content rendered inside the dual list selector. */
|
|
8
|
+
children?: DualListSelectorTreeItemData[];
|
|
9
|
+
/** Additional classes applied to the dual list selector. */
|
|
10
|
+
className?: string;
|
|
11
|
+
/** Flag indicating this option is expanded by default. */
|
|
12
|
+
defaultExpanded?: boolean;
|
|
13
|
+
/** Flag indicating this option has a badge. */
|
|
14
|
+
hasBadge?: boolean;
|
|
15
|
+
/** Callback fired when an option is checked. */
|
|
16
|
+
onOptionCheck?: (
|
|
17
|
+
event: React.MouseEvent | React.ChangeEvent<HTMLInputElement> | React.KeyboardEvent,
|
|
18
|
+
isChecked: boolean,
|
|
19
|
+
isChosen: boolean,
|
|
20
|
+
itemData: DualListSelectorTreeItemData
|
|
21
|
+
) => void;
|
|
22
|
+
/** ID of the option. */
|
|
23
|
+
id: string;
|
|
24
|
+
/** Text of the option. */
|
|
25
|
+
text: string;
|
|
26
|
+
/** Parent ID of an option. */
|
|
27
|
+
parentId?: string;
|
|
28
|
+
/** Checked state of the option. */
|
|
29
|
+
isChecked: boolean;
|
|
30
|
+
/** Additional properties to pass to the option checkbox. */
|
|
31
|
+
checkProps?: any;
|
|
32
|
+
/** Additional properties to pass to the option badge. */
|
|
33
|
+
badgeProps?: any;
|
|
34
|
+
/** Flag indicating whether the component is disabled. */
|
|
35
|
+
isDisabled?: boolean;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Used in place of the DualListSelectorListItem sub-component when building a
|
|
39
|
+
* composable dual list selector with a tree.
|
|
40
|
+
*/
|
|
41
|
+
|
|
42
|
+
export interface DualListSelectorTreeProps extends Omit<React.HTMLProps<HTMLUListElement>, 'data'> {
|
|
43
|
+
/** Data of the tree view. */
|
|
44
|
+
data: DualListSelectorTreeItemData[] | (() => DualListSelectorTreeItemData[]);
|
|
45
|
+
/** ID of the tree view. */
|
|
46
|
+
id?: string;
|
|
47
|
+
/** @hide Flag indicating if the list is nested. */
|
|
48
|
+
isNested?: boolean;
|
|
49
|
+
/** Flag indicating if all options should have badges. */
|
|
50
|
+
hasBadges?: boolean;
|
|
51
|
+
/** Sets the default expanded behavior. */
|
|
52
|
+
defaultAllExpanded?: boolean;
|
|
53
|
+
/** Flag indicating if the dual list selector tree is in the disabled state. */
|
|
54
|
+
isDisabled?: boolean;
|
|
55
|
+
/** Callback fired when an option is checked. */
|
|
56
|
+
onOptionCheck?: (
|
|
57
|
+
event: React.MouseEvent | React.ChangeEvent<HTMLInputElement> | React.KeyboardEvent,
|
|
58
|
+
isChecked: boolean,
|
|
59
|
+
itemData: DualListSelectorTreeItemData
|
|
60
|
+
) => void;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export const DualListSelectorTree: React.FunctionComponent<DualListSelectorTreeProps> = ({
|
|
64
|
+
data,
|
|
65
|
+
hasBadges = false,
|
|
66
|
+
isNested = false,
|
|
67
|
+
defaultAllExpanded = false,
|
|
68
|
+
onOptionCheck,
|
|
69
|
+
isDisabled = false,
|
|
70
|
+
...props
|
|
71
|
+
}: DualListSelectorTreeProps) => {
|
|
72
|
+
const dataToRender = typeof data === 'function' ? data() : data;
|
|
73
|
+
const tree = dataToRender.map((item) => (
|
|
74
|
+
<DualListSelectorTreeItem
|
|
75
|
+
key={item.id}
|
|
76
|
+
text={item.text}
|
|
77
|
+
id={item.id}
|
|
78
|
+
defaultExpanded={item.defaultExpanded !== undefined ? item.defaultExpanded : defaultAllExpanded}
|
|
79
|
+
onOptionCheck={onOptionCheck}
|
|
80
|
+
isChecked={item.isChecked}
|
|
81
|
+
checkProps={item.checkProps}
|
|
82
|
+
hasBadge={item.hasBadge !== undefined ? item.hasBadge : hasBadges}
|
|
83
|
+
badgeProps={item.badgeProps}
|
|
84
|
+
itemData={item}
|
|
85
|
+
isDisabled={isDisabled}
|
|
86
|
+
useMemo={true}
|
|
87
|
+
{...(item.children && {
|
|
88
|
+
children: (
|
|
89
|
+
<DualListSelectorTree
|
|
90
|
+
isNested
|
|
91
|
+
data={item.children}
|
|
92
|
+
hasBadges={hasBadges}
|
|
93
|
+
defaultAllExpanded={defaultAllExpanded}
|
|
94
|
+
onOptionCheck={onOptionCheck}
|
|
95
|
+
isDisabled={isDisabled}
|
|
96
|
+
/>
|
|
97
|
+
)
|
|
98
|
+
})}
|
|
99
|
+
/>
|
|
100
|
+
));
|
|
101
|
+
return isNested ? (
|
|
102
|
+
<ul className={css(styles.dualListSelectorList)} role="group" {...props}>
|
|
103
|
+
{tree}
|
|
104
|
+
</ul>
|
|
105
|
+
) : (
|
|
106
|
+
<>{tree}</>
|
|
107
|
+
);
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
DualListSelectorTree.displayName = 'DualListSelectorTree';
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import styles from '@patternfly/react-styles/css/components/DualListSelector/dual-list-selector';
|
|
3
|
+
import { css } from '@patternfly/react-styles';
|
|
4
|
+
import { DualListSelectorTreeItemData } from './DualListSelectorTree';
|
|
5
|
+
import { Badge } from '../../../components/Badge';
|
|
6
|
+
import AngleRightIcon from '@patternfly/react-icons/dist/esm/icons/angle-right-icon';
|
|
7
|
+
import { flattenTree } from './treeUtils';
|
|
8
|
+
import { DualListSelectorListContext } from './DualListSelectorContext';
|
|
9
|
+
|
|
10
|
+
export interface DualListSelectorTreeItemProps extends React.HTMLProps<HTMLLIElement> {
|
|
11
|
+
/** Content rendered inside the dual list selector. */
|
|
12
|
+
children?: React.ReactNode;
|
|
13
|
+
/** Additional classes applied to the dual list selector. */
|
|
14
|
+
className?: string;
|
|
15
|
+
/** Flag indicating this option is expanded by default. */
|
|
16
|
+
defaultExpanded?: boolean;
|
|
17
|
+
/** Flag indicating this option has a badge. */
|
|
18
|
+
hasBadge?: boolean;
|
|
19
|
+
/** Callback fired when an option is checked. */
|
|
20
|
+
onOptionCheck?: (
|
|
21
|
+
event: React.MouseEvent | React.ChangeEvent<HTMLInputElement> | React.KeyboardEvent,
|
|
22
|
+
isChecked: boolean,
|
|
23
|
+
itemData: DualListSelectorTreeItemData
|
|
24
|
+
) => void;
|
|
25
|
+
/** ID of the option. */
|
|
26
|
+
id: string;
|
|
27
|
+
/** Text of the option. */
|
|
28
|
+
text: string;
|
|
29
|
+
/** Flag indicating if this open is checked. */
|
|
30
|
+
isChecked?: boolean;
|
|
31
|
+
/** Additional properties to pass to the option checkbox. */
|
|
32
|
+
checkProps?: any;
|
|
33
|
+
/** Additional properties to pass to the option badge. */
|
|
34
|
+
badgeProps?: any;
|
|
35
|
+
/** Raw data of the option. */
|
|
36
|
+
itemData?: DualListSelectorTreeItemData;
|
|
37
|
+
/** Flag indicating whether the component is disabled. */
|
|
38
|
+
isDisabled?: boolean;
|
|
39
|
+
/** Flag indicating the DualListSelector tree should utilize memoization to help render large data sets. */
|
|
40
|
+
useMemo?: boolean;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const DualListSelectorTreeItemBase: React.FunctionComponent<DualListSelectorTreeItemProps> = ({
|
|
44
|
+
onOptionCheck,
|
|
45
|
+
children,
|
|
46
|
+
className,
|
|
47
|
+
id,
|
|
48
|
+
text,
|
|
49
|
+
defaultExpanded,
|
|
50
|
+
hasBadge,
|
|
51
|
+
isChecked,
|
|
52
|
+
checkProps,
|
|
53
|
+
badgeProps,
|
|
54
|
+
itemData,
|
|
55
|
+
isDisabled = false,
|
|
56
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
57
|
+
useMemo,
|
|
58
|
+
...props
|
|
59
|
+
}: DualListSelectorTreeItemProps) => {
|
|
60
|
+
const ref = React.useRef(null);
|
|
61
|
+
const [isExpanded, setIsExpanded] = React.useState(defaultExpanded || false);
|
|
62
|
+
const { setFocusedOption } = React.useContext(DualListSelectorListContext);
|
|
63
|
+
|
|
64
|
+
React.useEffect(() => {
|
|
65
|
+
setIsExpanded(defaultExpanded);
|
|
66
|
+
}, [defaultExpanded]);
|
|
67
|
+
|
|
68
|
+
return (
|
|
69
|
+
<li
|
|
70
|
+
className={css(
|
|
71
|
+
styles.dualListSelectorListItem,
|
|
72
|
+
className,
|
|
73
|
+
children && styles.modifiers.expandable,
|
|
74
|
+
isExpanded && styles.modifiers.expanded,
|
|
75
|
+
isDisabled && styles.modifiers.disabled
|
|
76
|
+
)}
|
|
77
|
+
id={id}
|
|
78
|
+
{...props}
|
|
79
|
+
aria-selected={isChecked}
|
|
80
|
+
role="treeitem"
|
|
81
|
+
{...(isExpanded && { 'aria-expanded': 'true' })}
|
|
82
|
+
>
|
|
83
|
+
<div
|
|
84
|
+
className={css(
|
|
85
|
+
styles.dualListSelectorListItemRow,
|
|
86
|
+
isChecked && styles.modifiers.selected,
|
|
87
|
+
styles.modifiers.check
|
|
88
|
+
)}
|
|
89
|
+
>
|
|
90
|
+
<div
|
|
91
|
+
className={css(styles.dualListSelectorItem)}
|
|
92
|
+
ref={ref}
|
|
93
|
+
tabIndex={-1}
|
|
94
|
+
onClick={
|
|
95
|
+
isDisabled
|
|
96
|
+
? undefined
|
|
97
|
+
: (evt) => {
|
|
98
|
+
onOptionCheck && onOptionCheck(evt, !isChecked, itemData);
|
|
99
|
+
setFocusedOption(id);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
>
|
|
103
|
+
<span className={css(styles.dualListSelectorItemMain)}>
|
|
104
|
+
{children && (
|
|
105
|
+
<div
|
|
106
|
+
className={css(styles.dualListSelectorItemToggle)}
|
|
107
|
+
onClick={(e) => {
|
|
108
|
+
if (children) {
|
|
109
|
+
setIsExpanded(!isExpanded);
|
|
110
|
+
}
|
|
111
|
+
e.stopPropagation();
|
|
112
|
+
}}
|
|
113
|
+
onKeyDown={(e: React.KeyboardEvent) => {
|
|
114
|
+
if (e.key === ' ' || e.key === 'Enter') {
|
|
115
|
+
(document.activeElement as HTMLElement).click();
|
|
116
|
+
e.preventDefault();
|
|
117
|
+
}
|
|
118
|
+
}}
|
|
119
|
+
tabIndex={-1}
|
|
120
|
+
>
|
|
121
|
+
<span className={css(styles.dualListSelectorItemToggleIcon)}>
|
|
122
|
+
<AngleRightIcon aria-hidden />
|
|
123
|
+
</span>
|
|
124
|
+
</div>
|
|
125
|
+
)}
|
|
126
|
+
<span className={css(styles.dualListSelectorItemCheck)}>
|
|
127
|
+
<input
|
|
128
|
+
type="checkbox"
|
|
129
|
+
onChange={(evt: React.ChangeEvent<HTMLInputElement>) => {
|
|
130
|
+
onOptionCheck && onOptionCheck(evt, !isChecked, itemData);
|
|
131
|
+
setFocusedOption(id);
|
|
132
|
+
}}
|
|
133
|
+
onClick={(evt: React.MouseEvent) => evt.stopPropagation()}
|
|
134
|
+
onKeyDown={(e: React.KeyboardEvent) => {
|
|
135
|
+
if (e.key === ' ' || e.key === 'Enter') {
|
|
136
|
+
onOptionCheck && onOptionCheck(e, !isChecked, itemData);
|
|
137
|
+
setFocusedOption(id);
|
|
138
|
+
e.preventDefault();
|
|
139
|
+
}
|
|
140
|
+
}}
|
|
141
|
+
ref={(elem) => elem && (elem.indeterminate = isChecked === null)}
|
|
142
|
+
checked={isChecked || false}
|
|
143
|
+
tabIndex={-1}
|
|
144
|
+
{...checkProps}
|
|
145
|
+
/>
|
|
146
|
+
</span>
|
|
147
|
+
|
|
148
|
+
<span className={css(styles.dualListSelectorItemText)}>{text}</span>
|
|
149
|
+
{hasBadge && children && (
|
|
150
|
+
<span className={css(styles.dualListSelectorItemCount)}>
|
|
151
|
+
<Badge {...badgeProps}>{flattenTree((children as React.ReactElement).props.data).length}</Badge>
|
|
152
|
+
</span>
|
|
153
|
+
)}
|
|
154
|
+
</span>
|
|
155
|
+
</div>
|
|
156
|
+
</div>
|
|
157
|
+
{isExpanded && children}
|
|
158
|
+
</li>
|
|
159
|
+
);
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
export const DualListSelectorTreeItem = React.memo(DualListSelectorTreeItemBase, (prevProps, nextProps) => {
|
|
163
|
+
if (!nextProps.useMemo) {
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
if (
|
|
168
|
+
prevProps.className !== nextProps.className ||
|
|
169
|
+
prevProps.text !== nextProps.text ||
|
|
170
|
+
prevProps.id !== nextProps.id ||
|
|
171
|
+
prevProps.defaultExpanded !== nextProps.defaultExpanded ||
|
|
172
|
+
prevProps.checkProps !== nextProps.checkProps ||
|
|
173
|
+
prevProps.hasBadge !== nextProps.hasBadge ||
|
|
174
|
+
prevProps.badgeProps !== nextProps.badgeProps ||
|
|
175
|
+
prevProps.isChecked !== nextProps.isChecked ||
|
|
176
|
+
prevProps.itemData !== nextProps.itemData
|
|
177
|
+
) {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
return true;
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
DualListSelectorTreeItem.displayName = 'DualListSelectorTreeItem';
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { render } from '@testing-library/react';
|
|
2
|
+
import { DualListSelectorPane } from '../../DualListSelector';
|
|
3
|
+
import { SearchInput } from '../../../../components/SearchInput';
|
|
4
|
+
import React from 'react';
|
|
5
|
+
|
|
6
|
+
describe('DualListSelector', () => {
|
|
7
|
+
test('basic', () => {
|
|
8
|
+
const { asFragment } = render(<DualListSelectorPane id="basicTest" />);
|
|
9
|
+
expect(asFragment()).toMatchSnapshot();
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
test('with search inputs', () => {
|
|
13
|
+
const { asFragment } = render(<DualListSelectorPane id="searchTest" searchInput={<SearchInput />} />);
|
|
14
|
+
expect(asFragment()).toMatchSnapshot();
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
test('with custom status', () => {
|
|
18
|
+
const { asFragment } = render(<DualListSelectorPane id="statusTest" status="Test status1" />);
|
|
19
|
+
expect(asFragment()).toMatchSnapshot();
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
test('basic with disabled controls', () => {
|
|
23
|
+
const { asFragment } = render(<DualListSelectorPane id="disabledTest" isDisabled />);
|
|
24
|
+
expect(asFragment()).toMatchSnapshot();
|
|
25
|
+
});
|
|
26
|
+
});
|
package/src/next/components/DualListSelector/__tests__/__snapshots__/DualListSelector.test.tsx.snap
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
|
+
|
|
3
|
+
exports[`DualListSelector basic 1`] = `
|
|
4
|
+
<DocumentFragment>
|
|
5
|
+
<div
|
|
6
|
+
class="pf-v5-c-dual-list-selector__pane pf-m-available"
|
|
7
|
+
>
|
|
8
|
+
<div
|
|
9
|
+
class="pf-v5-c-dual-list-selector__menu"
|
|
10
|
+
tabindex="0"
|
|
11
|
+
>
|
|
12
|
+
<ul
|
|
13
|
+
class="pf-v5-c-dual-list-selector__list"
|
|
14
|
+
/>
|
|
15
|
+
</div>
|
|
16
|
+
</div>
|
|
17
|
+
</DocumentFragment>
|
|
18
|
+
`;
|
|
19
|
+
|
|
20
|
+
exports[`DualListSelector basic with disabled controls 1`] = `
|
|
21
|
+
<DocumentFragment>
|
|
22
|
+
<div
|
|
23
|
+
class="pf-v5-c-dual-list-selector__pane pf-m-available"
|
|
24
|
+
>
|
|
25
|
+
<div
|
|
26
|
+
class="pf-v5-c-dual-list-selector__menu"
|
|
27
|
+
tabindex="0"
|
|
28
|
+
>
|
|
29
|
+
<ul
|
|
30
|
+
class="pf-v5-c-dual-list-selector__list"
|
|
31
|
+
/>
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
</DocumentFragment>
|
|
35
|
+
`;
|
|
36
|
+
|
|
37
|
+
exports[`DualListSelector with custom status 1`] = `
|
|
38
|
+
<DocumentFragment>
|
|
39
|
+
<div
|
|
40
|
+
class="pf-v5-c-dual-list-selector__pane pf-m-available"
|
|
41
|
+
>
|
|
42
|
+
<div
|
|
43
|
+
class="pf-v5-c-dual-list-selector__status"
|
|
44
|
+
>
|
|
45
|
+
<div
|
|
46
|
+
class="pf-v5-c-dual-list-selector__status-text"
|
|
47
|
+
id="statusTest-status"
|
|
48
|
+
>
|
|
49
|
+
Test status1
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
<div
|
|
53
|
+
class="pf-v5-c-dual-list-selector__menu"
|
|
54
|
+
tabindex="0"
|
|
55
|
+
>
|
|
56
|
+
<ul
|
|
57
|
+
class="pf-v5-c-dual-list-selector__list"
|
|
58
|
+
/>
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
</DocumentFragment>
|
|
62
|
+
`;
|
|
63
|
+
|
|
64
|
+
exports[`DualListSelector with search inputs 1`] = `
|
|
65
|
+
<DocumentFragment>
|
|
66
|
+
<div
|
|
67
|
+
class="pf-v5-c-dual-list-selector__pane pf-m-available"
|
|
68
|
+
>
|
|
69
|
+
<div
|
|
70
|
+
class="pf-v5-c-dual-list-selector__tools"
|
|
71
|
+
>
|
|
72
|
+
<div
|
|
73
|
+
class="pf-v5-c-dual-list-selector__tools-filter"
|
|
74
|
+
>
|
|
75
|
+
<div
|
|
76
|
+
class="pf-v5-c-text-input-group"
|
|
77
|
+
>
|
|
78
|
+
<div
|
|
79
|
+
class="pf-v5-c-text-input-group__main pf-m-icon"
|
|
80
|
+
>
|
|
81
|
+
<span
|
|
82
|
+
class="pf-v5-c-text-input-group__text"
|
|
83
|
+
>
|
|
84
|
+
<span
|
|
85
|
+
class="pf-v5-c-text-input-group__icon"
|
|
86
|
+
>
|
|
87
|
+
<svg
|
|
88
|
+
aria-hidden="true"
|
|
89
|
+
class="pf-v5-svg"
|
|
90
|
+
fill="currentColor"
|
|
91
|
+
height="1em"
|
|
92
|
+
role="img"
|
|
93
|
+
viewBox="0 0 512 512"
|
|
94
|
+
width="1em"
|
|
95
|
+
>
|
|
96
|
+
<path
|
|
97
|
+
d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"
|
|
98
|
+
/>
|
|
99
|
+
</svg>
|
|
100
|
+
</span>
|
|
101
|
+
<input
|
|
102
|
+
aria-label="Search input"
|
|
103
|
+
class="pf-v5-c-text-input-group__text-input"
|
|
104
|
+
type="text"
|
|
105
|
+
value=""
|
|
106
|
+
/>
|
|
107
|
+
</span>
|
|
108
|
+
</div>
|
|
109
|
+
</div>
|
|
110
|
+
</div>
|
|
111
|
+
</div>
|
|
112
|
+
<div
|
|
113
|
+
class="pf-v5-c-dual-list-selector__menu"
|
|
114
|
+
tabindex="0"
|
|
115
|
+
>
|
|
116
|
+
<ul
|
|
117
|
+
class="pf-v5-c-dual-list-selector__list"
|
|
118
|
+
/>
|
|
119
|
+
</div>
|
|
120
|
+
</div>
|
|
121
|
+
</DocumentFragment>
|
|
122
|
+
`;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: Dual list selector
|
|
3
|
+
section: components
|
|
4
|
+
cssPrefix: 'pf-v5-c-dual-list-selector'
|
|
5
|
+
propComponents:
|
|
6
|
+
[
|
|
7
|
+
'DualListSelector',
|
|
8
|
+
'DualListSelectorPane',
|
|
9
|
+
'DualListSelectorList',
|
|
10
|
+
'DualListSelectorListItem',
|
|
11
|
+
'DualListSelectorControlsWrapper',
|
|
12
|
+
'DualListSelectorControl',
|
|
13
|
+
'DualListSelectorTree',
|
|
14
|
+
'DualListSelectorTreeItemData'
|
|
15
|
+
]
|
|
16
|
+
beta: true
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
import AngleDoubleLeftIcon from '@patternfly/react-icons/dist/esm/icons/angle-double-left-icon';
|
|
20
|
+
import AngleLeftIcon from '@patternfly/react-icons/dist/esm/icons/angle-left-icon';
|
|
21
|
+
import AngleDoubleRightIcon from '@patternfly/react-icons/dist/esm/icons/angle-double-right-icon';
|
|
22
|
+
import AngleRightIcon from '@patternfly/react-icons/dist/esm/icons/angle-right-icon';
|
|
23
|
+
import PficonSortCommonAscIcon from '@patternfly/react-icons/dist/esm/icons/pficon-sort-common-asc-icon';
|
|
24
|
+
import SearchIcon from '@patternfly/react-icons/dist/esm/icons/search-icon';
|
|
25
|
+
import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon';
|
|
26
|
+
|
|
27
|
+
## Examples
|
|
28
|
+
|
|
29
|
+
The dual list selector is built in a composable manner to make customization easier. The standard sub-component relationships are arranged as follows:
|
|
30
|
+
|
|
31
|
+
```noLive
|
|
32
|
+
<DualListSelector>
|
|
33
|
+
<DualListSelectorPane>
|
|
34
|
+
<DualListSelectorList>
|
|
35
|
+
<DualListSelectorListItem />
|
|
36
|
+
</DualListSelectorList>
|
|
37
|
+
</DualListSelectorPane>
|
|
38
|
+
|
|
39
|
+
<DualListSelectorControlsWrapper>
|
|
40
|
+
<DualListSelectorControl /> /* A standard Dual list selector has 4 controls */
|
|
41
|
+
</DualListSelectorControlsWrapper>
|
|
42
|
+
|
|
43
|
+
<DualListSelectorPane isChosen>
|
|
44
|
+
<DualListSelectorList>
|
|
45
|
+
<DualListSelectorListItem />
|
|
46
|
+
</DualListSelectorList>
|
|
47
|
+
</DualListSelectorPane>
|
|
48
|
+
</DualListSelector>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Basic
|
|
52
|
+
|
|
53
|
+
```ts file="./DualListSelectorBasic.tsx"
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Basic with tooltips
|
|
58
|
+
|
|
59
|
+
```ts file="./DualListSelectorBasicTooltips.tsx"
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Basic with search
|
|
64
|
+
|
|
65
|
+
```ts file="./DualListSelectorBasicSearch.tsx"
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Using more complex options with actions
|
|
70
|
+
|
|
71
|
+
```ts file="./DualListSelectorComplexOptionsActions.tsx"
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### With tree
|
|
76
|
+
|
|
77
|
+
```ts file="DualListSelectorTree.tsx"
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Drag and drop
|
|
82
|
+
|
|
83
|
+
This example only allows reordering the contents of the "chosen" pane with drag and drop. To make a pane able to be reordered:
|
|
84
|
+
|
|
85
|
+
- wrap the `DualListSelectorPane` in a `DragDrop` component
|
|
86
|
+
- wrap the `DualListSelectorList` in a `Droppable` component
|
|
87
|
+
- wrap the `DualListSelectorListItem` components in a `Draggable` component
|
|
88
|
+
- define an `onDrop` callback which reorders the sortable options.
|
|
89
|
+
- The `onDrop` function provides the starting location and destination location for a dragged item. It should return
|
|
90
|
+
true to enable the 'drop' animation in the new location and false to enable the 'drop' animation back to the item's
|
|
91
|
+
old position.
|
|
92
|
+
- define an `onDrag` callback which ensures that the drag event will not cross hairs with the `onOptionSelect` click
|
|
93
|
+
event set on the option. Note: the `ignoreNextOptionSelect` state value is used to prevent selection while dragging.
|
|
94
|
+
|
|
95
|
+
Note: Keyboard accessibility and screen reader accessibility for the `DragDrop` component are still in development.
|
|
96
|
+
|
|
97
|
+
```ts file="DualListSelectorDragDrop.tsx"
|
|
98
|
+
|
|
99
|
+
```
|