@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
package/helpers/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@patternfly/react-core-helpers","main":"../dist/js/helpers/index.js","module":"../dist/esm/helpers/index.js","typings":"../dist/esm/helpers/index.d.ts","version":"5.3.0-prerelease.
|
|
1
|
+
{"name":"@patternfly/react-core-helpers","main":"../dist/js/helpers/index.js","module":"../dist/esm/helpers/index.js","typings":"../dist/esm/helpers/index.d.ts","version":"5.3.0-prerelease.4","private":true}
|
package/layouts/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@patternfly/react-core-layouts","main":"../dist/js/layouts/index.js","module":"../dist/esm/layouts/index.js","typings":"../dist/esm/layouts/index.d.ts","version":"5.3.0-prerelease.
|
|
1
|
+
{"name":"@patternfly/react-core-layouts","main":"../dist/js/layouts/index.js","module":"../dist/esm/layouts/index.js","typings":"../dist/esm/layouts/index.d.ts","version":"5.3.0-prerelease.4","private":true}
|
package/next/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@patternfly/react-core-next","main":"../dist/js/next/index.js","module":"../dist/esm/next/index.js","typings":"../dist/esm/next/index.d.ts","version":"5.3.0-prerelease.
|
|
1
|
+
{"name":"@patternfly/react-core-next","main":"../dist/js/next/index.js","module":"../dist/esm/next/index.js","typings":"../dist/esm/next/index.d.ts","version":"5.3.0-prerelease.4","private":true}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@patternfly/react-core",
|
|
3
|
-
"version": "5.3.0-prerelease.
|
|
3
|
+
"version": "5.3.0-prerelease.5",
|
|
4
4
|
"description": "This library provides a set of common React components for use with the PatternFly reference implementation.",
|
|
5
5
|
"main": "dist/js/index.js",
|
|
6
6
|
"module": "dist/esm/index.js",
|
|
@@ -72,5 +72,5 @@
|
|
|
72
72
|
"react": "^17 || ^18",
|
|
73
73
|
"react-dom": "^17 || ^18"
|
|
74
74
|
},
|
|
75
|
-
"gitHead": "
|
|
75
|
+
"gitHead": "59cae77313f2e11417f0ef599ccc4581a834be27"
|
|
76
76
|
}
|
|
@@ -75,6 +75,8 @@ export interface SearchInputProps extends Omit<React.HTMLProps<HTMLDivElement>,
|
|
|
75
75
|
hasWordsAttrLabel?: React.ReactNode;
|
|
76
76
|
/** A suggestion for autocompleting. */
|
|
77
77
|
hint?: string;
|
|
78
|
+
/** Id for the search input */
|
|
79
|
+
searchInputId?: string;
|
|
78
80
|
/** @hide A reference object to attach to the input box. */
|
|
79
81
|
innerRef?: React.RefObject<any>;
|
|
80
82
|
/** A flag for controlling the open state of a custom advanced search implementation. */
|
|
@@ -126,6 +128,7 @@ export interface SearchInputProps extends Omit<React.HTMLProps<HTMLDivElement>,
|
|
|
126
128
|
|
|
127
129
|
const SearchInputBase: React.FunctionComponent<SearchInputProps> = ({
|
|
128
130
|
className,
|
|
131
|
+
searchInputId,
|
|
129
132
|
value = '',
|
|
130
133
|
attributes = [] as string[],
|
|
131
134
|
formAdditionalItems,
|
|
@@ -298,6 +301,7 @@ const SearchInputBase: React.FunctionComponent<SearchInputProps> = ({
|
|
|
298
301
|
onKeyDown={onEnter}
|
|
299
302
|
onChange={onChangeHandler}
|
|
300
303
|
name={name}
|
|
304
|
+
inputId={searchInputId}
|
|
301
305
|
/>
|
|
302
306
|
{(renderUtilities || areUtilitiesDisplayed) && (
|
|
303
307
|
<TextInputGroupUtilities>
|
|
@@ -70,6 +70,12 @@ export interface SelectProps extends MenuProps, OUIAProps {
|
|
|
70
70
|
role?: string;
|
|
71
71
|
/** Additional properties to pass to the popper */
|
|
72
72
|
popperProps?: SelectPopperProps;
|
|
73
|
+
/** Height of the select menu */
|
|
74
|
+
menuHeight?: string;
|
|
75
|
+
/** Maximum height of select menu */
|
|
76
|
+
maxMenuHeight?: string;
|
|
77
|
+
/** Indicates if the select menu should be scrollable */
|
|
78
|
+
isScrollable?: boolean;
|
|
73
79
|
}
|
|
74
80
|
|
|
75
81
|
const SelectBase: React.FunctionComponent<SelectProps & OUIAProps> = ({
|
|
@@ -87,6 +93,9 @@ const SelectBase: React.FunctionComponent<SelectProps & OUIAProps> = ({
|
|
|
87
93
|
zIndex = 9999,
|
|
88
94
|
role = 'listbox',
|
|
89
95
|
popperProps,
|
|
96
|
+
menuHeight,
|
|
97
|
+
maxMenuHeight,
|
|
98
|
+
isScrollable,
|
|
90
99
|
...props
|
|
91
100
|
}: SelectProps & OUIAProps) => {
|
|
92
101
|
const localMenuRef = React.useRef<HTMLDivElement>();
|
|
@@ -151,6 +160,7 @@ const SelectBase: React.FunctionComponent<SelectProps & OUIAProps> = ({
|
|
|
151
160
|
}}
|
|
152
161
|
isPlain={isPlain}
|
|
153
162
|
selected={selected}
|
|
163
|
+
isScrollable={isScrollable}
|
|
154
164
|
{...getOUIAProps(
|
|
155
165
|
Select.displayName,
|
|
156
166
|
props.ouiaId !== undefined ? props.ouiaId : getDefaultOUIAId(Select.displayName),
|
|
@@ -158,7 +168,9 @@ const SelectBase: React.FunctionComponent<SelectProps & OUIAProps> = ({
|
|
|
158
168
|
)}
|
|
159
169
|
{...props}
|
|
160
170
|
>
|
|
161
|
-
<MenuContent
|
|
171
|
+
<MenuContent menuHeight={menuHeight} maxMenuHeight={maxMenuHeight}>
|
|
172
|
+
{children}
|
|
173
|
+
</MenuContent>
|
|
162
174
|
</Menu>
|
|
163
175
|
);
|
|
164
176
|
return (
|
|
@@ -53,6 +53,8 @@ export interface TextInputGroupMainProps extends Omit<React.HTMLProps<HTMLDivEle
|
|
|
53
53
|
isExpanded?: boolean;
|
|
54
54
|
/** @beta The id of the element(s) controlled by the input. Required if role has a value of "combobox". */
|
|
55
55
|
'aria-controls'?: string;
|
|
56
|
+
/** The id of the input element */
|
|
57
|
+
inputId?: string;
|
|
56
58
|
}
|
|
57
59
|
|
|
58
60
|
const TextInputGroupMainBase: React.FunctionComponent<TextInputGroupMainProps> = ({
|
|
@@ -73,6 +75,7 @@ const TextInputGroupMainBase: React.FunctionComponent<TextInputGroupMainProps> =
|
|
|
73
75
|
role,
|
|
74
76
|
isExpanded,
|
|
75
77
|
'aria-controls': ariaControls,
|
|
78
|
+
inputId,
|
|
76
79
|
...props
|
|
77
80
|
}: TextInputGroupMainProps) => {
|
|
78
81
|
const { isDisabled } = React.useContext(TextInputGroupContext);
|
|
@@ -94,6 +97,7 @@ const TextInputGroupMainBase: React.FunctionComponent<TextInputGroupMainProps> =
|
|
|
94
97
|
disabled
|
|
95
98
|
aria-hidden="true"
|
|
96
99
|
value={hint}
|
|
100
|
+
id={inputId}
|
|
97
101
|
/>
|
|
98
102
|
)}
|
|
99
103
|
{icon && <span className={css(styles.textInputGroupIcon)}>{icon}</span>}
|
|
@@ -110,6 +114,7 @@ const TextInputGroupMainBase: React.FunctionComponent<TextInputGroupMainProps> =
|
|
|
110
114
|
placeholder={inputPlaceHolder}
|
|
111
115
|
name={name}
|
|
112
116
|
aria-activedescendant={ariaActivedescendant}
|
|
117
|
+
id={inputId}
|
|
113
118
|
{...(role && { role })}
|
|
114
119
|
{...(isExpanded !== undefined && { 'aria-expanded': isExpanded })}
|
|
115
120
|
{...(ariaControls && { 'aria-controls': ariaControls })}
|
|
@@ -109,6 +109,14 @@ describe('TextInputGroupMain', () => {
|
|
|
109
109
|
expect(inputValue).toBeVisible();
|
|
110
110
|
});
|
|
111
111
|
|
|
112
|
+
it('passes the inputId prop to the input', () => {
|
|
113
|
+
render(<TextInputGroupMain inputId="input-id">Test</TextInputGroupMain>);
|
|
114
|
+
|
|
115
|
+
const input = screen.getByRole('textbox');
|
|
116
|
+
|
|
117
|
+
expect(input).toHaveAttribute('id', 'input-id');
|
|
118
|
+
});
|
|
119
|
+
|
|
112
120
|
it('passes the placeholder prop to the input', () => {
|
|
113
121
|
render(<TextInputGroupMain placeholder="placeholder text">Test</TextInputGroupMain>);
|
|
114
122
|
|
|
@@ -449,7 +449,7 @@ export const Popper: React.FunctionComponent<PopperProps> = ({
|
|
|
449
449
|
React.useEffect(() => {
|
|
450
450
|
// currentPopperContent = {tooltip children} || {dropdown children}
|
|
451
451
|
const currentPopperContent =
|
|
452
|
-
popper?.props?.children[1]?.props?.children || popper?.props?.children?.props?.children;
|
|
452
|
+
popper?.props?.children?.[1]?.props?.children || popper?.props?.children?.props?.children;
|
|
453
453
|
setPopperContent(currentPopperContent);
|
|
454
454
|
|
|
455
455
|
if (currentPopperContent && popperContent && currentPopperContent !== popperContent) {
|
|
@@ -0,0 +1,50 @@
|
|
|
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 { GenerateId, PickOptional } from '../../../helpers';
|
|
5
|
+
import { DualListSelectorContext } from './DualListSelectorContext';
|
|
6
|
+
|
|
7
|
+
/** Acts as a container for all other DualListSelector sub-components when using a
|
|
8
|
+
* composable dual list selector.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
export interface DualListSelectorProps {
|
|
12
|
+
/** Additional classes applied to the dual list selector. */
|
|
13
|
+
className?: string;
|
|
14
|
+
/** ID of the dual list selector. */
|
|
15
|
+
id?: string;
|
|
16
|
+
/** Flag indicating if the dual list selector uses trees instead of simple lists. */
|
|
17
|
+
isTree?: boolean;
|
|
18
|
+
/** Content to be rendered in the dual list selector. */
|
|
19
|
+
children?: React.ReactNode;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
class DualListSelector extends React.Component<DualListSelectorProps> {
|
|
23
|
+
static displayName = 'DualListSelector';
|
|
24
|
+
static defaultProps: PickOptional<DualListSelectorProps> = {
|
|
25
|
+
children: '',
|
|
26
|
+
isTree: false
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
constructor(props: DualListSelectorProps) {
|
|
30
|
+
super(props);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
render() {
|
|
34
|
+
const { className, children, id, isTree, ...props } = this.props;
|
|
35
|
+
|
|
36
|
+
return (
|
|
37
|
+
<DualListSelectorContext.Provider value={{ isTree }}>
|
|
38
|
+
<GenerateId>
|
|
39
|
+
{(randomId) => (
|
|
40
|
+
<div className={css(styles.dualListSelector, className)} id={id || randomId} {...props}>
|
|
41
|
+
{children}
|
|
42
|
+
</div>
|
|
43
|
+
)}
|
|
44
|
+
</GenerateId>
|
|
45
|
+
</DualListSelectorContext.Provider>
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export { DualListSelector };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
export const DualListSelectorContext = React.createContext<{
|
|
4
|
+
isTree?: boolean;
|
|
5
|
+
}>({ isTree: false });
|
|
6
|
+
|
|
7
|
+
export const DualListSelectorListContext = React.createContext<{
|
|
8
|
+
setFocusedOption?: (id: string) => void;
|
|
9
|
+
isTree?: boolean;
|
|
10
|
+
ariaLabelledBy?: string;
|
|
11
|
+
focusedOption?: string;
|
|
12
|
+
displayOption?: (option: React.ReactNode) => boolean;
|
|
13
|
+
selectedOptions?: string[] | number[];
|
|
14
|
+
id?: string;
|
|
15
|
+
options?: React.ReactNode[];
|
|
16
|
+
isDisabled?: boolean;
|
|
17
|
+
}>({});
|
|
18
|
+
|
|
19
|
+
export const DualListSelectorPaneContext = React.createContext<{
|
|
20
|
+
isChosen: boolean;
|
|
21
|
+
}>({ isChosen: false });
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { css } from '@patternfly/react-styles';
|
|
3
|
+
import { Button, ButtonVariant } from '../../../components/Button';
|
|
4
|
+
import { Tooltip } from '../../../components/Tooltip';
|
|
5
|
+
import styles from '@patternfly/react-styles/css/components/DualListSelector/dual-list-selector';
|
|
6
|
+
|
|
7
|
+
/** Renders an individual control button for moving selected options between each
|
|
8
|
+
* dual list selector pane.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
export interface DualListSelectorControlProps extends Omit<React.HTMLProps<HTMLDivElement>, 'onClick'> {
|
|
12
|
+
/** Content to be rendered in the dual list selector control. */
|
|
13
|
+
children?: React.ReactNode;
|
|
14
|
+
/** @hide forwarded ref */
|
|
15
|
+
innerRef?: React.Ref<any>;
|
|
16
|
+
/** Flag indicating the control is disabled. */
|
|
17
|
+
isDisabled?: boolean;
|
|
18
|
+
/** Additional classes applied to the dual list selector control. */
|
|
19
|
+
className?: string;
|
|
20
|
+
/** Callback fired when dual list selector control is selected. */
|
|
21
|
+
onClick?: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;
|
|
22
|
+
/** Accessible label for the dual list selector control. */
|
|
23
|
+
'aria-label'?: string;
|
|
24
|
+
/** Content to be displayed in a tooltip on hover of control. */
|
|
25
|
+
tooltipContent?: React.ReactNode;
|
|
26
|
+
/** Additional tooltip properties passed to the tooltip. */
|
|
27
|
+
tooltipProps?: any;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export const DualListSelectorControlBase: React.FunctionComponent<DualListSelectorControlProps> = ({
|
|
31
|
+
innerRef,
|
|
32
|
+
children,
|
|
33
|
+
className,
|
|
34
|
+
'aria-label': ariaLabel,
|
|
35
|
+
isDisabled = true,
|
|
36
|
+
onClick = () => {},
|
|
37
|
+
tooltipContent,
|
|
38
|
+
tooltipProps = {} as any,
|
|
39
|
+
...props
|
|
40
|
+
}: DualListSelectorControlProps) => {
|
|
41
|
+
const privateRef = React.useRef(null);
|
|
42
|
+
const ref = innerRef || privateRef;
|
|
43
|
+
return (
|
|
44
|
+
<div className={css(styles.dualListSelectorControlsItem, className)} {...props}>
|
|
45
|
+
<Button
|
|
46
|
+
isDisabled={isDisabled}
|
|
47
|
+
aria-disabled={isDisabled}
|
|
48
|
+
variant={ButtonVariant.plain}
|
|
49
|
+
onClick={onClick}
|
|
50
|
+
aria-label={ariaLabel}
|
|
51
|
+
tabIndex={-1}
|
|
52
|
+
ref={ref}
|
|
53
|
+
>
|
|
54
|
+
{children}
|
|
55
|
+
</Button>
|
|
56
|
+
{tooltipContent && <Tooltip content={tooltipContent} position="left" triggerRef={ref} {...tooltipProps} />}
|
|
57
|
+
</div>
|
|
58
|
+
);
|
|
59
|
+
};
|
|
60
|
+
DualListSelectorControlBase.displayName = 'DualListSelectorControlBase';
|
|
61
|
+
|
|
62
|
+
export const DualListSelectorControl = React.forwardRef((props: DualListSelectorControlProps, ref: React.Ref<any>) => (
|
|
63
|
+
<DualListSelectorControlBase innerRef={ref} {...props} />
|
|
64
|
+
));
|
|
65
|
+
|
|
66
|
+
DualListSelectorControl.displayName = 'DualListSelectorControl';
|
|
@@ -0,0 +1,87 @@
|
|
|
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 { handleArrows } from '../../../helpers';
|
|
5
|
+
|
|
6
|
+
/** Acts as the container for the DualListSelectorControl sub-components. */
|
|
7
|
+
|
|
8
|
+
export interface DualListSelectorControlsWrapperProps extends React.HTMLProps<HTMLDivElement> {
|
|
9
|
+
/** Content to be rendered inside of the controls wrapper. */
|
|
10
|
+
children?: React.ReactNode;
|
|
11
|
+
/** Additional classes added to the wrapper. */
|
|
12
|
+
className?: string;
|
|
13
|
+
/** @hide Forwarded ref */
|
|
14
|
+
innerRef?: React.RefObject<HTMLDivElement>;
|
|
15
|
+
/** Accessible label for the dual list selector controls wrapper. */
|
|
16
|
+
'aria-label'?: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export const DualListSelectorControlsWrapperBase: React.FunctionComponent<DualListSelectorControlsWrapperProps> = ({
|
|
20
|
+
innerRef,
|
|
21
|
+
children = null,
|
|
22
|
+
className,
|
|
23
|
+
'aria-label': ariaLabel = 'Controls for moving options between lists',
|
|
24
|
+
...props
|
|
25
|
+
}: DualListSelectorControlsWrapperProps) => {
|
|
26
|
+
const ref = React.useRef(null);
|
|
27
|
+
const wrapperRef = innerRef || ref;
|
|
28
|
+
// Adds keyboard navigation to the dynamically built dual list selector controls. Works when controls are dynamically built
|
|
29
|
+
// as well as when they are passed in via children.
|
|
30
|
+
const handleKeys = (event: KeyboardEvent) => {
|
|
31
|
+
if (
|
|
32
|
+
!wrapperRef.current ||
|
|
33
|
+
(wrapperRef.current !== (event.target as HTMLElement).closest(`.${styles.dualListSelectorControls}`) &&
|
|
34
|
+
!Array.from(wrapperRef.current.getElementsByClassName(styles.dualListSelectorControls)).includes(
|
|
35
|
+
(event.target as HTMLElement).closest(`.${styles.dualListSelectorControls}`)
|
|
36
|
+
))
|
|
37
|
+
) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
event.stopImmediatePropagation();
|
|
41
|
+
|
|
42
|
+
const controls = (Array.from(wrapperRef.current.getElementsByTagName('BUTTON')) as Element[]).filter(
|
|
43
|
+
(el) => !el.classList.contains('pf-m-disabled')
|
|
44
|
+
);
|
|
45
|
+
const activeElement = document.activeElement;
|
|
46
|
+
handleArrows(
|
|
47
|
+
event,
|
|
48
|
+
controls,
|
|
49
|
+
(element: Element) => activeElement.contains(element),
|
|
50
|
+
(element: Element) => element,
|
|
51
|
+
undefined,
|
|
52
|
+
undefined,
|
|
53
|
+
true,
|
|
54
|
+
false
|
|
55
|
+
);
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
React.useEffect(() => {
|
|
59
|
+
window.addEventListener('keydown', handleKeys);
|
|
60
|
+
return () => {
|
|
61
|
+
window.removeEventListener('keydown', handleKeys);
|
|
62
|
+
};
|
|
63
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
64
|
+
}, [wrapperRef.current]);
|
|
65
|
+
|
|
66
|
+
return (
|
|
67
|
+
<div
|
|
68
|
+
className={css(styles.dualListSelectorControls, className)}
|
|
69
|
+
tabIndex={0}
|
|
70
|
+
ref={wrapperRef}
|
|
71
|
+
aria-label={ariaLabel}
|
|
72
|
+
{...props}
|
|
73
|
+
>
|
|
74
|
+
{children}
|
|
75
|
+
</div>
|
|
76
|
+
);
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
DualListSelectorControlsWrapperBase.displayName = 'DualListSelectorControlsWrapperBase';
|
|
80
|
+
|
|
81
|
+
export const DualListSelectorControlsWrapper = React.forwardRef(
|
|
82
|
+
(props: DualListSelectorControlsWrapperProps, ref: React.Ref<HTMLDivElement>) => (
|
|
83
|
+
<DualListSelectorControlsWrapperBase innerRef={ref as React.MutableRefObject<any>} role="group" {...props} />
|
|
84
|
+
)
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
DualListSelectorControlsWrapper.displayName = 'DualListSelectorControlsWrapper';
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { css } from '@patternfly/react-styles';
|
|
2
|
+
import styles from '@patternfly/react-styles/css/components/DualListSelector/dual-list-selector';
|
|
3
|
+
import { DualListSelectorListItem } from './DualListSelectorListItem';
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
import { DualListSelectorListContext } from './DualListSelectorContext';
|
|
6
|
+
|
|
7
|
+
/** Acts as the container for DualListSelectorListItem sub-components. */
|
|
8
|
+
|
|
9
|
+
export interface DualListSelectorListProps extends React.HTMLProps<HTMLUListElement> {
|
|
10
|
+
/** Content rendered inside the dual list selector list. */
|
|
11
|
+
children?: React.ReactNode;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const DualListSelectorList: React.FunctionComponent<DualListSelectorListProps> = ({
|
|
15
|
+
children,
|
|
16
|
+
...props
|
|
17
|
+
}: DualListSelectorListProps) => {
|
|
18
|
+
const { isTree, ariaLabelledBy, focusedOption, displayOption, selectedOptions, id, options, isDisabled } =
|
|
19
|
+
React.useContext(DualListSelectorListContext);
|
|
20
|
+
|
|
21
|
+
const hasOptions = () =>
|
|
22
|
+
options.length !== 0 || (children !== undefined && (children as React.ReactNode[]).length !== 0);
|
|
23
|
+
|
|
24
|
+
return (
|
|
25
|
+
<ul
|
|
26
|
+
className={css(styles.dualListSelectorList)}
|
|
27
|
+
{...(hasOptions() && {
|
|
28
|
+
role: isTree ? 'tree' : 'listbox',
|
|
29
|
+
'aria-multiselectable': true,
|
|
30
|
+
'aria-labelledby': ariaLabelledBy,
|
|
31
|
+
'aria-activedescendant': focusedOption
|
|
32
|
+
})}
|
|
33
|
+
aria-disabled={isDisabled ? 'true' : undefined}
|
|
34
|
+
{...props}
|
|
35
|
+
>
|
|
36
|
+
{options.length === 0
|
|
37
|
+
? children
|
|
38
|
+
: options.map((option, index) => {
|
|
39
|
+
if (displayOption(option)) {
|
|
40
|
+
return (
|
|
41
|
+
<DualListSelectorListItem
|
|
42
|
+
key={index}
|
|
43
|
+
isSelected={(selectedOptions as number[]).indexOf(index) !== -1}
|
|
44
|
+
id={`${id}-option-${index}`}
|
|
45
|
+
orderIndex={index}
|
|
46
|
+
isDisabled={isDisabled}
|
|
47
|
+
>
|
|
48
|
+
{option}
|
|
49
|
+
</DualListSelectorListItem>
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
return;
|
|
53
|
+
})}
|
|
54
|
+
</ul>
|
|
55
|
+
);
|
|
56
|
+
};
|
|
57
|
+
DualListSelectorList.displayName = 'DualListSelectorList';
|
|
@@ -0,0 +1,105 @@
|
|
|
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 GripVerticalIcon from '@patternfly/react-icons/dist/esm/icons/grip-vertical-icon';
|
|
6
|
+
import { Button, ButtonVariant } from '../../../components/Button';
|
|
7
|
+
import { DualListSelectorListContext } from './DualListSelectorContext';
|
|
8
|
+
|
|
9
|
+
/** Creates an individual option that can be selected and moved between the
|
|
10
|
+
* dual list selector panes. This is contained within the DualListSelectorList sub-component.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
export interface DualListSelectorListItemProps extends React.HTMLProps<HTMLLIElement> {
|
|
14
|
+
/** Content rendered inside the dual list selector. */
|
|
15
|
+
children?: React.ReactNode;
|
|
16
|
+
/** Additional classes applied to the dual list selector. */
|
|
17
|
+
className?: string;
|
|
18
|
+
/** Flag indicating the list item is currently selected. */
|
|
19
|
+
isSelected?: boolean;
|
|
20
|
+
/** Callback fired when an option is selected. */
|
|
21
|
+
onOptionSelect?: (event: React.MouseEvent | React.ChangeEvent | React.KeyboardEvent, id?: string) => void;
|
|
22
|
+
/** ID of the option. */
|
|
23
|
+
id?: string;
|
|
24
|
+
/** @hide Internal field used to keep track of order of unfiltered options. */
|
|
25
|
+
orderIndex?: number;
|
|
26
|
+
/** @hide Forwarded ref */
|
|
27
|
+
innerRef?: React.RefObject<HTMLLIElement>;
|
|
28
|
+
/** Flag indicating this item is draggable for reordering. */
|
|
29
|
+
isDraggable?: boolean;
|
|
30
|
+
/** Accessible label for the draggable button on draggable list items. */
|
|
31
|
+
draggableButtonAriaLabel?: string;
|
|
32
|
+
/** Flag indicating if the dual list selector is in a disabled state. */
|
|
33
|
+
isDisabled?: boolean;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export const DualListSelectorListItemBase: React.FunctionComponent<DualListSelectorListItemProps> = ({
|
|
37
|
+
onOptionSelect,
|
|
38
|
+
orderIndex,
|
|
39
|
+
children,
|
|
40
|
+
className,
|
|
41
|
+
id = getUniqueId('dual-list-selector-list-item'),
|
|
42
|
+
isSelected,
|
|
43
|
+
innerRef,
|
|
44
|
+
isDraggable = false,
|
|
45
|
+
isDisabled,
|
|
46
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
47
|
+
draggableButtonAriaLabel = 'Reorder option',
|
|
48
|
+
...props
|
|
49
|
+
}: DualListSelectorListItemProps) => {
|
|
50
|
+
const privateRef = React.useRef<HTMLLIElement>(null);
|
|
51
|
+
const ref = innerRef || privateRef;
|
|
52
|
+
const { setFocusedOption } = React.useContext(DualListSelectorListContext);
|
|
53
|
+
|
|
54
|
+
return (
|
|
55
|
+
<li
|
|
56
|
+
className={css(styles.dualListSelectorListItem, className, isDisabled && styles.modifiers.disabled)}
|
|
57
|
+
key={orderIndex}
|
|
58
|
+
onClick={
|
|
59
|
+
isDisabled
|
|
60
|
+
? undefined
|
|
61
|
+
: (e: React.MouseEvent) => {
|
|
62
|
+
setFocusedOption(id);
|
|
63
|
+
onOptionSelect(e, id);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
onKeyDown={(e: React.KeyboardEvent) => {
|
|
67
|
+
if (e.key === ' ' || e.key === 'Enter') {
|
|
68
|
+
(document.activeElement as HTMLElement).click();
|
|
69
|
+
e.preventDefault();
|
|
70
|
+
}
|
|
71
|
+
}}
|
|
72
|
+
aria-selected={isSelected}
|
|
73
|
+
id={id}
|
|
74
|
+
ref={ref}
|
|
75
|
+
role="option"
|
|
76
|
+
tabIndex={-1}
|
|
77
|
+
{...props}
|
|
78
|
+
>
|
|
79
|
+
<div className={css(styles.dualListSelectorListItemRow, isSelected && styles.modifiers.selected)}>
|
|
80
|
+
{isDraggable && !isDisabled && (
|
|
81
|
+
<div className={css(styles.dualListSelectorDraggable)}>
|
|
82
|
+
{/** TODO once keyboard accessibility is enabled, remove `component=span`
|
|
83
|
+
and add `aria-label={draggableButtonAriaLabel}` */}
|
|
84
|
+
<Button variant={ButtonVariant.plain} component="span">
|
|
85
|
+
<GripVerticalIcon style={{ verticalAlign: '-0.3em' }} />
|
|
86
|
+
</Button>
|
|
87
|
+
</div>
|
|
88
|
+
)}
|
|
89
|
+
<span className={css(styles.dualListSelectorItem)}>
|
|
90
|
+
<span className={css(styles.dualListSelectorItemMain)}>
|
|
91
|
+
<span className={css(styles.dualListSelectorItemText)}>{children}</span>
|
|
92
|
+
</span>
|
|
93
|
+
</span>
|
|
94
|
+
</div>
|
|
95
|
+
</li>
|
|
96
|
+
);
|
|
97
|
+
};
|
|
98
|
+
DualListSelectorListItemBase.displayName = 'DualListSelectorListItemBase';
|
|
99
|
+
|
|
100
|
+
export const DualListSelectorListItem = React.forwardRef(
|
|
101
|
+
(props: DualListSelectorListItemProps, ref: React.Ref<HTMLLIElement>) => (
|
|
102
|
+
<DualListSelectorListItemBase innerRef={ref as React.MutableRefObject<any>} {...props} />
|
|
103
|
+
)
|
|
104
|
+
);
|
|
105
|
+
DualListSelectorListItem.displayName = 'DualListSelectorListItem';
|
|
@@ -0,0 +1,124 @@
|
|
|
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, handleArrows } from '../../../helpers';
|
|
5
|
+
import { DualListSelectorList } from './DualListSelectorList';
|
|
6
|
+
import { DualListSelectorContext, DualListSelectorListContext } from './DualListSelectorContext';
|
|
7
|
+
|
|
8
|
+
export interface DualListSelectorListWrapperProps extends React.HTMLProps<HTMLDivElement> {
|
|
9
|
+
/** Additional classes applied to the dual list selector. */
|
|
10
|
+
className?: string;
|
|
11
|
+
/** Anything that can be rendered inside of the list. */
|
|
12
|
+
children?: React.ReactNode;
|
|
13
|
+
/** ID of the dual list selector list. */
|
|
14
|
+
id?: string;
|
|
15
|
+
/** Accessibly label for the list. */
|
|
16
|
+
'aria-labelledby': string;
|
|
17
|
+
/** @hide forwarded ref */
|
|
18
|
+
innerRef?: React.RefObject<HTMLDivElement>;
|
|
19
|
+
/** @hide Options to list in the pane. */
|
|
20
|
+
options?: React.ReactNode[];
|
|
21
|
+
/** @hide Options currently selected in the pane. */
|
|
22
|
+
selectedOptions?: string[] | number[];
|
|
23
|
+
/** @hide Function to determine if an option should be displayed depending on a custom filter value. */
|
|
24
|
+
displayOption?: (option: React.ReactNode) => boolean;
|
|
25
|
+
/** Flag indicating whether the component is disabled. */
|
|
26
|
+
isDisabled?: boolean;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export const DualListSelectorListWrapperBase: React.FunctionComponent<DualListSelectorListWrapperProps> = ({
|
|
30
|
+
className,
|
|
31
|
+
children,
|
|
32
|
+
'aria-labelledby': ariaLabelledBy,
|
|
33
|
+
innerRef,
|
|
34
|
+
options = [],
|
|
35
|
+
selectedOptions = [],
|
|
36
|
+
displayOption,
|
|
37
|
+
id = getUniqueId('dual-list-selector-list'),
|
|
38
|
+
isDisabled = false,
|
|
39
|
+
...props
|
|
40
|
+
}: DualListSelectorListWrapperProps) => {
|
|
41
|
+
const [focusedOption, setFocusedOption] = React.useState('');
|
|
42
|
+
const ref = React.useRef(null);
|
|
43
|
+
const menuRef = innerRef || ref;
|
|
44
|
+
const { isTree } = React.useContext(DualListSelectorContext);
|
|
45
|
+
|
|
46
|
+
// Sets up keyboard focus handling for the dual list selector menu child of the pane.
|
|
47
|
+
const handleKeys = (event: KeyboardEvent) => {
|
|
48
|
+
if (
|
|
49
|
+
!menuRef.current ||
|
|
50
|
+
(menuRef.current !== (event.target as HTMLElement).closest(`.${styles.dualListSelectorMenu}`) &&
|
|
51
|
+
!Array.from(menuRef.current.getElementsByClassName(styles.dualListSelectorMenu)).includes(
|
|
52
|
+
(event.target as HTMLElement).closest(`.${styles.dualListSelectorMenu}`)
|
|
53
|
+
))
|
|
54
|
+
) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
event.stopImmediatePropagation();
|
|
58
|
+
const validOptions = isTree
|
|
59
|
+
? (Array.from(
|
|
60
|
+
menuRef.current.querySelectorAll(
|
|
61
|
+
`.${styles.dualListSelectorItemToggle}, .${styles.dualListSelectorItemCheck} > input`
|
|
62
|
+
)
|
|
63
|
+
) as Element[])
|
|
64
|
+
: (Array.from(menuRef.current.getElementsByTagName('LI')) as Element[]).filter(
|
|
65
|
+
(el) => !el.classList.contains('pf-m-disabled')
|
|
66
|
+
);
|
|
67
|
+
const activeElement = document.activeElement;
|
|
68
|
+
handleArrows(
|
|
69
|
+
event,
|
|
70
|
+
validOptions,
|
|
71
|
+
(element: Element) => activeElement.contains(element),
|
|
72
|
+
(element: Element) => {
|
|
73
|
+
if (element.classList.contains(`.${styles.dualListSelectorListItem}`)) {
|
|
74
|
+
setFocusedOption(element.id);
|
|
75
|
+
} else {
|
|
76
|
+
setFocusedOption(element.closest(`.${styles.dualListSelectorListItem}`).id);
|
|
77
|
+
}
|
|
78
|
+
return element;
|
|
79
|
+
},
|
|
80
|
+
[`.${styles.dualListSelectorItemToggle}`, `.${styles.dualListSelectorItemCheck} > input`],
|
|
81
|
+
undefined,
|
|
82
|
+
false,
|
|
83
|
+
false,
|
|
84
|
+
false
|
|
85
|
+
);
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
React.useEffect(() => {
|
|
89
|
+
window.addEventListener('keydown', handleKeys);
|
|
90
|
+
return () => {
|
|
91
|
+
window.removeEventListener('keydown', handleKeys);
|
|
92
|
+
};
|
|
93
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
94
|
+
}, [menuRef.current]);
|
|
95
|
+
|
|
96
|
+
return (
|
|
97
|
+
<div className={css(styles.dualListSelectorMenu, className)} ref={menuRef} tabIndex={0} {...props}>
|
|
98
|
+
<DualListSelectorListContext.Provider
|
|
99
|
+
value={{
|
|
100
|
+
setFocusedOption,
|
|
101
|
+
isTree,
|
|
102
|
+
focusedOption,
|
|
103
|
+
ariaLabelledBy,
|
|
104
|
+
displayOption,
|
|
105
|
+
selectedOptions,
|
|
106
|
+
id,
|
|
107
|
+
options,
|
|
108
|
+
isDisabled
|
|
109
|
+
}}
|
|
110
|
+
>
|
|
111
|
+
{children ? children : <DualListSelectorList />}
|
|
112
|
+
</DualListSelectorListContext.Provider>
|
|
113
|
+
</div>
|
|
114
|
+
);
|
|
115
|
+
};
|
|
116
|
+
DualListSelectorListWrapperBase.displayName = 'DualListSelectorListWrapperBase';
|
|
117
|
+
|
|
118
|
+
export const DualListSelectorListWrapper = React.forwardRef(
|
|
119
|
+
(props: DualListSelectorListWrapperProps, ref: React.Ref<HTMLDivElement>) => (
|
|
120
|
+
<DualListSelectorListWrapperBase innerRef={ref as React.MutableRefObject<any>} {...props} />
|
|
121
|
+
)
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
DualListSelectorListWrapper.displayName = 'DualListSelectorListWrapper';
|