Skip to content

Commit 73903da

Browse files
author
Eric Olkowski
committed
feat(DualListSelector): enabled opt-in animations
1 parent 2d58acf commit 73903da

11 files changed

Lines changed: 42 additions & 21 deletions

File tree

packages/react-core/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454
"tslib": "^2.8.1"
5555
},
5656
"devDependencies": {
57-
"@patternfly/patternfly": "6.3.0-prerelease.15",
57+
"@patternfly/patternfly": "6.3.0-prerelease.20",
5858
"case-anything": "^3.1.2",
5959
"css": "^3.0.0",
6060
"fs-extra": "^11.3.0"

packages/react-core/src/components/DualListSelector/DualListSelector.tsx

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,27 +17,37 @@ export interface DualListSelectorProps {
1717
isTree?: boolean;
1818
/** Content to be rendered in the dual list selector. */
1919
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;
2025
}
2126

2227
class DualListSelector extends Component<DualListSelectorProps> {
2328
static displayName = 'DualListSelector';
2429
static defaultProps: PickOptional<DualListSelectorProps> = {
2530
children: '',
26-
isTree: false
31+
isTree: false,
32+
hasAnimations: false
2733
};
2834

2935
constructor(props: DualListSelectorProps) {
3036
super(props);
3137
}
3238

3339
render() {
34-
const { className, children, id, isTree, ...props } = this.props;
40+
const { className, children, id, isTree, hasAnimations, ...props } = this.props;
3541

3642
return (
37-
<DualListSelectorContext.Provider value={{ isTree }}>
43+
<DualListSelectorContext.Provider value={{ isTree, hasAnimations }}>
3844
<GenerateId>
3945
{(randomId) => (
40-
<div className={css(styles.dualListSelector, className)} id={id || randomId} {...props}>
46+
<div
47+
className={css(styles.dualListSelector, hasAnimations && 'pf-m-animate-expand', className)}
48+
id={id || randomId}
49+
{...props}
50+
>
4151
{children}
4252
</div>
4353
)}

packages/react-core/src/components/DualListSelector/DualListSelectorContext.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { createContext } from 'react';
22
export const DualListSelectorContext = createContext<{
33
isTree?: boolean;
4-
}>({ isTree: false });
4+
hasAnimations?: boolean;
5+
}>({ isTree: false, hasAnimations: false });
56

67
export const DualListSelectorListContext = createContext<{
78
setFocusedOption?: (id: string) => void;

packages/react-core/src/components/DualListSelector/DualListSelectorTree.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
import { useContext } from 'react';
12
import { css } from '@patternfly/react-styles';
23
import styles from '@patternfly/react-styles/css/components/DualListSelector/dual-list-selector';
4+
import { DualListSelectorContext } from './DualListSelectorContext';
35
import { DualListSelectorTreeItem } from './DualListSelectorTreeItem';
46

57
export interface DualListSelectorTreeItemData {
@@ -68,11 +70,13 @@ export const DualListSelectorTree: React.FunctionComponent<DualListSelectorTreeP
6870
isDisabled = false,
6971
...props
7072
}: DualListSelectorTreeProps) => {
73+
const { hasAnimations } = useContext(DualListSelectorContext);
7174
const dataToRender = typeof data === 'function' ? data() : data;
7275
const tree = dataToRender.map((item) => (
7376
<DualListSelectorTreeItem
7477
key={item.id}
7578
text={item.text}
79+
hasAnimations={hasAnimations}
7680
id={item.id}
7781
defaultExpanded={item.defaultExpanded !== undefined ? item.defaultExpanded : defaultAllExpanded}
7882
onOptionCheck={onOptionCheck}

packages/react-core/src/components/DualListSelector/DualListSelectorTreeItem.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ export interface DualListSelectorTreeItemProps extends React.HTMLProps<HTMLLIEle
3838
isDisabled?: boolean;
3939
/** Flag indicating the DualListSelector tree should utilize memoization to help render large data sets. */
4040
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;
4146
}
4247

4348
const DualListSelectorTreeItemBase: React.FunctionComponent<DualListSelectorTreeItemProps> = ({
@@ -53,6 +58,7 @@ const DualListSelectorTreeItemBase: React.FunctionComponent<DualListSelectorTree
5358
badgeProps,
5459
itemData,
5560
isDisabled = false,
61+
hasAnimations,
5662
// eslint-disable-next-line @typescript-eslint/no-unused-vars
5763
useMemo,
5864
...props
@@ -156,7 +162,7 @@ const DualListSelectorTreeItemBase: React.FunctionComponent<DualListSelectorTree
156162
</span>
157163
</div>
158164
</div>
159-
{isExpanded && children}
165+
{(isExpanded || hasAnimations) && children}
160166
</li>
161167
);
162168
};

packages/react-core/src/components/DualListSelector/examples/DualListSelectorTree.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ export const DualListSelectorComposableTree: React.FunctionComponent<ExampleProp
283283
};
284284

285285
return (
286-
<DualListSelector isTree>
286+
<DualListSelector hasAnimations isTree>
287287
{buildPane(false)}
288288
<DualListSelectorControlsWrapper>
289289
<DualListSelectorControl

packages/react-docs/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
"test:a11y": "patternfly-a11y --config patternfly-a11y.config"
2424
},
2525
"dependencies": {
26-
"@patternfly/patternfly": "6.3.0-prerelease.15",
26+
"@patternfly/patternfly": "6.3.0-prerelease.20",
2727
"@patternfly/react-charts": "workspace:^",
2828
"@patternfly/react-code-editor": "workspace:^",
2929
"@patternfly/react-core": "workspace:^",

packages/react-icons/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
"@fortawesome/free-brands-svg-icons": "^5.15.4",
3434
"@fortawesome/free-regular-svg-icons": "^5.15.4",
3535
"@fortawesome/free-solid-svg-icons": "^5.15.4",
36-
"@patternfly/patternfly": "6.3.0-prerelease.15",
36+
"@patternfly/patternfly": "6.3.0-prerelease.20",
3737
"fs-extra": "^11.3.0",
3838
"tslib": "^2.8.1"
3939
},

packages/react-styles/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
"clean": "rimraf dist css"
2020
},
2121
"devDependencies": {
22-
"@patternfly/patternfly": "6.3.0-prerelease.15",
22+
"@patternfly/patternfly": "6.3.0-prerelease.20",
2323
"change-case": "^5.4.4",
2424
"fs-extra": "^11.3.0"
2525
},

packages/react-tokens/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
},
3131
"devDependencies": {
3232
"@adobe/css-tools": "^4.4.2",
33-
"@patternfly/patternfly": "6.3.0-prerelease.15",
33+
"@patternfly/patternfly": "6.3.0-prerelease.20",
3434
"fs-extra": "^11.3.0"
3535
}
3636
}

0 commit comments

Comments
 (0)