@patternfly/react-core 6.3.0-prerelease.14 → 6.3.0-prerelease.16
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 +13 -0
- package/CONTRIBUTING.md +3 -5
- 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/ClipboardCopy/package.json +1 -1
- package/dist/dynamic/components/CodeBlock/package.json +1 -1
- package/dist/dynamic/components/Content/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/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/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/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/Chip/package.json +1 -1
- package/dist/dynamic/deprecated/components/DragDrop/package.json +1 -1
- package/dist/dynamic/deprecated/components/DualListSelector/package.json +1 -1
- package/dist/dynamic/deprecated/components/Modal/package.json +1 -1
- package/dist/dynamic/deprecated/components/Tile/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/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/styles/package.json +1 -1
- package/dist/esm/components/DualListSelector/DualListSelector.d.ts +5 -0
- package/dist/esm/components/DualListSelector/DualListSelector.d.ts.map +1 -1
- package/dist/esm/components/DualListSelector/DualListSelector.js +4 -3
- package/dist/esm/components/DualListSelector/DualListSelector.js.map +1 -1
- package/dist/esm/components/DualListSelector/DualListSelectorContext.d.ts +1 -0
- package/dist/esm/components/DualListSelector/DualListSelectorContext.d.ts.map +1 -1
- package/dist/esm/components/DualListSelector/DualListSelectorContext.js +1 -1
- package/dist/esm/components/DualListSelector/DualListSelectorContext.js.map +1 -1
- package/dist/esm/components/DualListSelector/DualListSelectorListWrapper.d.ts.map +1 -1
- package/dist/esm/components/DualListSelector/DualListSelectorListWrapper.js +1 -1
- package/dist/esm/components/DualListSelector/DualListSelectorListWrapper.js.map +1 -1
- package/dist/esm/components/DualListSelector/DualListSelectorTree.d.ts.map +1 -1
- package/dist/esm/components/DualListSelector/DualListSelectorTree.js +4 -1
- package/dist/esm/components/DualListSelector/DualListSelectorTree.js.map +1 -1
- package/dist/esm/components/DualListSelector/DualListSelectorTreeItem.d.ts +5 -0
- package/dist/esm/components/DualListSelector/DualListSelectorTreeItem.d.ts.map +1 -1
- package/dist/esm/components/DualListSelector/DualListSelectorTreeItem.js +8 -4
- package/dist/esm/components/DualListSelector/DualListSelectorTreeItem.js.map +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/helpers/KeyboardHandler.js +3 -2
- package/dist/esm/helpers/KeyboardHandler.js.map +1 -1
- package/dist/esm/helpers/Popper/Popper.d.ts.map +1 -1
- package/dist/esm/helpers/Popper/Popper.js +1 -0
- package/dist/esm/helpers/Popper/Popper.js.map +1 -1
- package/dist/js/components/DualListSelector/DualListSelector.d.ts +5 -0
- package/dist/js/components/DualListSelector/DualListSelector.d.ts.map +1 -1
- package/dist/js/components/DualListSelector/DualListSelector.js +4 -3
- package/dist/js/components/DualListSelector/DualListSelector.js.map +1 -1
- package/dist/js/components/DualListSelector/DualListSelectorContext.d.ts +1 -0
- package/dist/js/components/DualListSelector/DualListSelectorContext.d.ts.map +1 -1
- package/dist/js/components/DualListSelector/DualListSelectorContext.js +1 -1
- package/dist/js/components/DualListSelector/DualListSelectorContext.js.map +1 -1
- package/dist/js/components/DualListSelector/DualListSelectorListWrapper.d.ts.map +1 -1
- package/dist/js/components/DualListSelector/DualListSelectorListWrapper.js +1 -1
- package/dist/js/components/DualListSelector/DualListSelectorListWrapper.js.map +1 -1
- package/dist/js/components/DualListSelector/DualListSelectorTree.d.ts.map +1 -1
- package/dist/js/components/DualListSelector/DualListSelectorTree.js +4 -1
- package/dist/js/components/DualListSelector/DualListSelectorTree.js.map +1 -1
- package/dist/js/components/DualListSelector/DualListSelectorTreeItem.d.ts +5 -0
- package/dist/js/components/DualListSelector/DualListSelectorTreeItem.d.ts.map +1 -1
- package/dist/js/components/DualListSelector/DualListSelectorTreeItem.js +7 -3
- package/dist/js/components/DualListSelector/DualListSelectorTreeItem.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/helpers/KeyboardHandler.js +3 -2
- package/dist/js/helpers/KeyboardHandler.js.map +1 -1
- package/dist/js/helpers/Popper/Popper.d.ts.map +1 -1
- package/dist/js/helpers/Popper/Popper.js +1 -0
- package/dist/js/helpers/Popper/Popper.js.map +1 -1
- package/dist/umd/assets/{output-DXt7tMoN.css → output-JLWYbLYn.css} +16768 -16768
- 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/DualListSelector/DualListSelector.tsx +18 -4
- package/src/components/DualListSelector/DualListSelectorContext.ts +2 -1
- package/src/components/DualListSelector/DualListSelectorListWrapper.tsx +8 -5
- package/src/components/DualListSelector/DualListSelectorTree.tsx +4 -0
- package/src/components/DualListSelector/DualListSelectorTreeItem.tsx +17 -2
- package/src/components/DualListSelector/__tests__/DualListSelector.test.tsx +32 -1
- package/src/components/DualListSelector/__tests__/DualListSelectorTreeItem.test.tsx +55 -0
- package/src/components/DualListSelector/examples/DualListSelectorTree.tsx +1 -1
- package/src/components/SearchInput/SearchInput.tsx +8 -1
- package/src/helpers/KeyboardHandler.tsx +2 -2
- package/src/helpers/Popper/Popper.tsx +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":"6.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":"6.3.0-prerelease.15","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":"6.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":"6.3.0-prerelease.15","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":"6.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":"6.3.0-prerelease.15","private":true}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@patternfly/react-core",
|
|
3
|
-
"version": "6.3.0-prerelease.
|
|
3
|
+
"version": "6.3.0-prerelease.16",
|
|
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",
|
|
@@ -63,5 +63,5 @@
|
|
|
63
63
|
"react": "^17 || ^18 || ^19",
|
|
64
64
|
"react-dom": "^17 || ^18 || ^19"
|
|
65
65
|
},
|
|
66
|
-
"gitHead": "
|
|
66
|
+
"gitHead": "9d843f99842f39a8233c16c23c001aa22647dd82"
|
|
67
67
|
}
|
|
@@ -17,13 +17,19 @@ export interface DualListSelectorProps {
|
|
|
17
17
|
isTree?: boolean;
|
|
18
18
|
/** Content to be rendered in the dual list selector. */
|
|
19
19
|
children?: React.ReactNode;
|
|
20
|
+
/** Flag indicating whether a tree dual list selector has animations. This will always render
|
|
21
|
+
* nested dual list selector items rather than dynamically rendering them. This prop will be removed in
|
|
22
|
+
* the next breaking change release in favor of defaulting to always-rendered items.
|
|
23
|
+
*/
|
|
24
|
+
hasAnimations?: boolean;
|
|
20
25
|
}
|
|
21
26
|
|
|
22
27
|
class DualListSelector extends Component<DualListSelectorProps> {
|
|
23
28
|
static displayName = 'DualListSelector';
|
|
24
29
|
static defaultProps: PickOptional<DualListSelectorProps> = {
|
|
25
30
|
children: '',
|
|
26
|
-
isTree: false
|
|
31
|
+
isTree: false,
|
|
32
|
+
hasAnimations: false
|
|
27
33
|
};
|
|
28
34
|
|
|
29
35
|
constructor(props: DualListSelectorProps) {
|
|
@@ -31,13 +37,21 @@ class DualListSelector extends Component<DualListSelectorProps> {
|
|
|
31
37
|
}
|
|
32
38
|
|
|
33
39
|
render() {
|
|
34
|
-
const { className, children, id, isTree, ...props } = this.props;
|
|
40
|
+
const { className, children, id, isTree, hasAnimations, ...props } = this.props;
|
|
35
41
|
|
|
36
42
|
return (
|
|
37
|
-
<DualListSelectorContext.Provider value={{ isTree }}>
|
|
43
|
+
<DualListSelectorContext.Provider value={{ isTree, hasAnimations }}>
|
|
38
44
|
<GenerateId>
|
|
39
45
|
{(randomId) => (
|
|
40
|
-
<div
|
|
46
|
+
<div
|
|
47
|
+
className={css(
|
|
48
|
+
styles.dualListSelector,
|
|
49
|
+
hasAnimations && isTree && styles.modifiers.animateExpand,
|
|
50
|
+
className
|
|
51
|
+
)}
|
|
52
|
+
id={id || randomId}
|
|
53
|
+
{...props}
|
|
54
|
+
>
|
|
41
55
|
{children}
|
|
42
56
|
</div>
|
|
43
57
|
)}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { createContext } from 'react';
|
|
2
2
|
export const DualListSelectorContext = createContext<{
|
|
3
3
|
isTree?: boolean;
|
|
4
|
-
|
|
4
|
+
hasAnimations?: boolean;
|
|
5
|
+
}>({ isTree: false, hasAnimations: false });
|
|
5
6
|
|
|
6
7
|
export const DualListSelectorListContext = createContext<{
|
|
7
8
|
setFocusedOption?: (id: string) => void;
|
|
@@ -56,14 +56,17 @@ export const DualListSelectorListWrapperBase: React.FunctionComponent<DualListSe
|
|
|
56
56
|
}
|
|
57
57
|
event.stopImmediatePropagation();
|
|
58
58
|
const validOptions = isTree
|
|
59
|
-
? (
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
59
|
+
? (
|
|
60
|
+
Array.from(
|
|
61
|
+
menuRef.current.querySelectorAll(
|
|
62
|
+
`.${styles.dualListSelectorItemToggle}, .${styles.dualListSelectorItemCheck} > input`
|
|
63
|
+
)
|
|
64
|
+
) as Element[]
|
|
65
|
+
).filter((item) => !item.closest(`.${styles.dualListSelectorList}[inert]`))
|
|
64
66
|
: (Array.from(menuRef.current.getElementsByTagName('LI')) as Element[]).filter(
|
|
65
67
|
(el) => !el.classList.contains('pf-m-disabled')
|
|
66
68
|
);
|
|
69
|
+
|
|
67
70
|
const activeElement = document.activeElement;
|
|
68
71
|
handleArrows(
|
|
69
72
|
event,
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { useContext } from 'react';
|
|
1
2
|
import { css } from '@patternfly/react-styles';
|
|
2
3
|
import styles from '@patternfly/react-styles/css/components/DualListSelector/dual-list-selector';
|
|
4
|
+
import { DualListSelectorContext } from './DualListSelectorContext';
|
|
3
5
|
import { DualListSelectorTreeItem } from './DualListSelectorTreeItem';
|
|
4
6
|
|
|
5
7
|
export interface DualListSelectorTreeItemData {
|
|
@@ -68,11 +70,13 @@ export const DualListSelectorTree: React.FunctionComponent<DualListSelectorTreeP
|
|
|
68
70
|
isDisabled = false,
|
|
69
71
|
...props
|
|
70
72
|
}: DualListSelectorTreeProps) => {
|
|
73
|
+
const { hasAnimations } = useContext(DualListSelectorContext);
|
|
71
74
|
const dataToRender = typeof data === 'function' ? data() : data;
|
|
72
75
|
const tree = dataToRender.map((item) => (
|
|
73
76
|
<DualListSelectorTreeItem
|
|
74
77
|
key={item.id}
|
|
75
78
|
text={item.text}
|
|
79
|
+
hasAnimations={hasAnimations}
|
|
76
80
|
id={item.id}
|
|
77
81
|
defaultExpanded={item.defaultExpanded !== undefined ? item.defaultExpanded : defaultAllExpanded}
|
|
78
82
|
onOptionCheck={onOptionCheck}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { memo, useContext, useEffect, useRef, useState } from 'react';
|
|
1
|
+
import { memo, useContext, useEffect, useRef, useState, cloneElement, Children, isValidElement } from 'react';
|
|
2
2
|
import styles from '@patternfly/react-styles/css/components/DualListSelector/dual-list-selector';
|
|
3
3
|
import { css } from '@patternfly/react-styles';
|
|
4
4
|
import { DualListSelectorTreeItemData } from './DualListSelectorTree';
|
|
@@ -38,6 +38,11 @@ export interface DualListSelectorTreeItemProps extends React.HTMLProps<HTMLLIEle
|
|
|
38
38
|
isDisabled?: boolean;
|
|
39
39
|
/** Flag indicating the DualListSelector tree should utilize memoization to help render large data sets. */
|
|
40
40
|
useMemo?: boolean;
|
|
41
|
+
/** Flag indicating whether a tree dual list selector has animations. This will always render
|
|
42
|
+
* nested dual list selector items rather than dynamically rendering them. This prop will be removed in
|
|
43
|
+
* the next breaking change release in favor of defaulting to always-rendered items.
|
|
44
|
+
*/
|
|
45
|
+
hasAnimations?: boolean;
|
|
41
46
|
}
|
|
42
47
|
|
|
43
48
|
const DualListSelectorTreeItemBase: React.FunctionComponent<DualListSelectorTreeItemProps> = ({
|
|
@@ -53,6 +58,7 @@ const DualListSelectorTreeItemBase: React.FunctionComponent<DualListSelectorTree
|
|
|
53
58
|
badgeProps,
|
|
54
59
|
itemData,
|
|
55
60
|
isDisabled = false,
|
|
61
|
+
hasAnimations,
|
|
56
62
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
57
63
|
useMemo,
|
|
58
64
|
...props
|
|
@@ -65,6 +71,15 @@ const DualListSelectorTreeItemBase: React.FunctionComponent<DualListSelectorTree
|
|
|
65
71
|
setIsExpanded(defaultExpanded);
|
|
66
72
|
}, [defaultExpanded]);
|
|
67
73
|
|
|
74
|
+
const clonedChildren = Children.map(
|
|
75
|
+
children,
|
|
76
|
+
(child) =>
|
|
77
|
+
isValidElement(child) &&
|
|
78
|
+
cloneElement(child as React.ReactElement<any>, {
|
|
79
|
+
inert: isExpanded ? undefined : ''
|
|
80
|
+
})
|
|
81
|
+
);
|
|
82
|
+
|
|
68
83
|
return (
|
|
69
84
|
<li
|
|
70
85
|
className={css(
|
|
@@ -156,7 +171,7 @@ const DualListSelectorTreeItemBase: React.FunctionComponent<DualListSelectorTree
|
|
|
156
171
|
</span>
|
|
157
172
|
</div>
|
|
158
173
|
</div>
|
|
159
|
-
{isExpanded &&
|
|
174
|
+
{(isExpanded || hasAnimations) && clonedChildren}
|
|
160
175
|
</li>
|
|
161
176
|
);
|
|
162
177
|
};
|
|
@@ -1,6 +1,37 @@
|
|
|
1
|
-
import { render } from '@testing-library/react';
|
|
1
|
+
import { render, screen } from '@testing-library/react';
|
|
2
|
+
import styles from '@patternfly/react-styles/css/components/DualListSelector/dual-list-selector';
|
|
3
|
+
import { DualListSelector } from '../DualListSelector';
|
|
2
4
|
import { DualListSelectorPane } from '../DualListSelectorPane';
|
|
3
5
|
import { SearchInput } from '../../SearchInput';
|
|
6
|
+
|
|
7
|
+
// The following tests can be removed as part of https://github.com/patternfly/patternfly-react/issues/11838
|
|
8
|
+
describe('Opt-in animations', () => {
|
|
9
|
+
test(`Does not render with class ${styles.modifiers.animateExpand} by default`, () => {
|
|
10
|
+
render(<DualListSelector data-testid="test-id" />);
|
|
11
|
+
|
|
12
|
+
expect(screen.getByTestId('test-id')).not.toHaveClass(styles.modifiers.animateExpand);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
test(`Does not render with class ${styles.modifiers.animateExpand} when hasAnimations is true and isTree is false`, () => {
|
|
16
|
+
render(<DualListSelector hasAnimations data-testid="test-id" />);
|
|
17
|
+
|
|
18
|
+
expect(screen.getByTestId('test-id')).not.toHaveClass(styles.modifiers.animateExpand);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
test(`Does not render with class ${styles.modifiers.animateExpand} by default when isTree is true`, () => {
|
|
22
|
+
render(<DualListSelector isTree data-testid="test-id" />);
|
|
23
|
+
|
|
24
|
+
expect(screen.getByTestId('test-id')).not.toHaveClass(styles.modifiers.animateExpand);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test(`Renders with class ${styles.modifiers.animateExpand} when both isTree and hasAnimations are true`, () => {
|
|
28
|
+
render(<DualListSelector isTree hasAnimations data-testid="test-id" />);
|
|
29
|
+
|
|
30
|
+
expect(screen.getByTestId('test-id')).toHaveClass(styles.modifiers.animateExpand);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
// Following tests should be moved to a separate DualListSelectorPane test file
|
|
4
35
|
describe('DualListSelector', () => {
|
|
5
36
|
test('basic', () => {
|
|
6
37
|
const { asFragment } = render(<DualListSelectorPane id="basicTest" />);
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { render, screen } from '@testing-library/react';
|
|
2
|
+
import styles from '@patternfly/react-styles/css/components/DualListSelector/dual-list-selector';
|
|
3
|
+
import { DualListSelectorTreeItem } from '../DualListSelectorTreeItem';
|
|
4
|
+
|
|
5
|
+
// The following tests checking for children to not be/to be rendered will need to be refactored
|
|
6
|
+
// as part of https://github.com/patternfly/patternfly-react/issues/11838
|
|
7
|
+
test('Does not render children by default', () => {
|
|
8
|
+
render(
|
|
9
|
+
<DualListSelectorTreeItem id="item-id" text="Test text">
|
|
10
|
+
<div>Children content</div>
|
|
11
|
+
</DualListSelectorTreeItem>
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
expect(screen.queryByText('Children content')).not.toBeInTheDocument();
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
test('Renders children when defaultExpanded is true', () => {
|
|
18
|
+
render(
|
|
19
|
+
<DualListSelectorTreeItem defaultExpanded id="item-id" text="Test text">
|
|
20
|
+
<div>Children content</div>
|
|
21
|
+
</DualListSelectorTreeItem>
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
expect(screen.getByText('Children content')).toBeVisible();
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test('Renders children when hasAnimations is true', () => {
|
|
28
|
+
render(
|
|
29
|
+
<DualListSelectorTreeItem hasAnimations id="item-id" text="Test text">
|
|
30
|
+
<div>Children content</div>
|
|
31
|
+
</DualListSelectorTreeItem>
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
expect(screen.getByText('Children content')).toBeVisible();
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
test('Renders children with inert attribute by default when hasAnimations is true', () => {
|
|
38
|
+
render(
|
|
39
|
+
<DualListSelectorTreeItem hasAnimations id="item-id" text="Test text">
|
|
40
|
+
<div>Children content</div>
|
|
41
|
+
</DualListSelectorTreeItem>
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
expect(screen.getByText('Children content')).toHaveAttribute('inert', '');
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test('Does not render children with inert attribute when hasAnimations and defaultExpanded are true', () => {
|
|
48
|
+
render(
|
|
49
|
+
<DualListSelectorTreeItem hasAnimations defaultExpanded id="item-id" text="Test text">
|
|
50
|
+
<div>Children content</div>
|
|
51
|
+
</DualListSelectorTreeItem>
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
expect(screen.getByText('Children content')).not.toHaveAttribute('inert');
|
|
55
|
+
});
|
|
@@ -283,7 +283,7 @@ export const DualListSelectorComposableTree: React.FunctionComponent<ExampleProp
|
|
|
283
283
|
};
|
|
284
284
|
|
|
285
285
|
return (
|
|
286
|
-
<DualListSelector isTree>
|
|
286
|
+
<DualListSelector hasAnimations isTree>
|
|
287
287
|
{buildPane(false)}
|
|
288
288
|
<DualListSelectorControlsWrapper>
|
|
289
289
|
<DualListSelectorControl
|
|
@@ -118,6 +118,8 @@ export interface SearchInputProps extends Omit<React.HTMLProps<HTMLDivElement>,
|
|
|
118
118
|
/** The number of search results returned. Either a total number of results,
|
|
119
119
|
* or a string representing the current result over the total number of results. i.e. "1 / 5". */
|
|
120
120
|
resultsCount?: number | string;
|
|
121
|
+
/** Screenreader text that will appear after resultsCount to give context for what that value represents to assistive technologies. */
|
|
122
|
+
resultsCountContext?: string;
|
|
121
123
|
/** Label for the button which calls the onSearch event handler. */
|
|
122
124
|
submitSearchButtonLabel?: string;
|
|
123
125
|
/** Value of the search input. */
|
|
@@ -144,6 +146,7 @@ const SearchInputBase: React.FunctionComponent<SearchInputProps> = ({
|
|
|
144
146
|
onToggleAdvancedSearch,
|
|
145
147
|
isAdvancedSearchOpen = false,
|
|
146
148
|
resultsCount,
|
|
149
|
+
resultsCountContext = ' results',
|
|
147
150
|
onNextClick,
|
|
148
151
|
onPreviousClick,
|
|
149
152
|
innerRef,
|
|
@@ -309,7 +312,11 @@ const SearchInputBase: React.FunctionComponent<SearchInputProps> = ({
|
|
|
309
312
|
/>
|
|
310
313
|
{(renderUtilities || areUtilitiesDisplayed) && (
|
|
311
314
|
<TextInputGroupUtilities>
|
|
312
|
-
{resultsCount &&
|
|
315
|
+
{resultsCount && (
|
|
316
|
+
<Badge isRead screenReaderText={resultsCountContext}>
|
|
317
|
+
{resultsCount}
|
|
318
|
+
</Badge>
|
|
319
|
+
)}
|
|
313
320
|
{!!onNextClick && !!onPreviousClick && (
|
|
314
321
|
<div className={textInputGroupStyles.textInputGroupGroup}>
|
|
315
322
|
<Button
|
|
@@ -116,12 +116,12 @@ export const handleArrows = (
|
|
|
116
116
|
: nextSiblingMainElement.nextElementSibling;
|
|
117
117
|
|
|
118
118
|
if (nextSibling) {
|
|
119
|
-
if (validSiblingTags.includes(nextSibling
|
|
119
|
+
if (validSiblingTags.includes(nextSibling?.tagName)) {
|
|
120
120
|
moveTarget = nextSibling;
|
|
121
121
|
break;
|
|
122
122
|
}
|
|
123
123
|
// For cases where the validSiblingTag is inside a div wrapper
|
|
124
|
-
if (validSiblingTags.includes(nextSibling.children[0]
|
|
124
|
+
if (validSiblingTags.includes(nextSibling.children[0]?.tagName)) {
|
|
125
125
|
moveTarget = nextSibling.children[0];
|
|
126
126
|
break;
|
|
127
127
|
}
|
|
@@ -486,6 +486,7 @@ export const Popper: React.FunctionComponent<PopperProps> = ({
|
|
|
486
486
|
setOpacity(0);
|
|
487
487
|
transitionTimerRef.current = setTimeout(() => {
|
|
488
488
|
setInternalIsVisible(false);
|
|
489
|
+
setPopperElement(null);
|
|
489
490
|
onHidden();
|
|
490
491
|
}, animationDuration);
|
|
491
492
|
}, exitDelay);
|