From 7f958150e8e23e32f2eb8c1f26aac47d73482326 Mon Sep 17 00:00:00 2001 From: Katie McFaul Date: Thu, 13 Nov 2025 16:00:36 -0500 Subject: [PATCH 1/4] feat(TreeView): add support for disabled TreeViewListItems --- .../src/components/TreeView/TreeView.tsx | 6 + .../components/TreeView/TreeViewListItem.tsx | 33 +++- .../__tests__/TreeViewListItem.test.tsx | 166 ++++++++++++++++++ 3 files changed, 196 insertions(+), 9 deletions(-) diff --git a/packages/react-core/src/components/TreeView/TreeView.tsx b/packages/react-core/src/components/TreeView/TreeView.tsx index b6cd5a0c950..3eb2b8d02f9 100644 --- a/packages/react-core/src/components/TreeView/TreeView.tsx +++ b/packages/react-core/src/components/TreeView/TreeView.tsx @@ -35,6 +35,10 @@ export interface TreeViewDataItem { name: React.ReactNode; /** Title of a tree view item. Only used in compact presentations. */ title?: React.ReactNode; + /** Flag indicating if the tree view item is disabled. */ + isDisabled?: boolean; + /** Flag indicating if the tree view item toggle is disabled. */ + isToggleDisabled?: boolean; } /** The main tree view component. */ @@ -158,6 +162,8 @@ export const TreeView: React.FunctionComponent = ({ id={item.id} isExpanded={allExpanded} isSelectable={hasSelectableNodes} + isDisabled={item.isDisabled} + isToggleDisabled={item.isToggleDisabled} defaultExpanded={item.defaultExpanded !== undefined ? item.defaultExpanded : defaultAllExpanded} onSelect={onSelect} onCheck={onCheck} diff --git a/packages/react-core/src/components/TreeView/TreeViewListItem.tsx b/packages/react-core/src/components/TreeView/TreeViewListItem.tsx index ce04ba41af0..e74c7f4e12e 100644 --- a/packages/react-core/src/components/TreeView/TreeViewListItem.tsx +++ b/packages/react-core/src/components/TreeView/TreeViewListItem.tsx @@ -46,6 +46,10 @@ export interface TreeViewListItemProps { * children. */ isSelectable?: boolean; + /** Flag indicating if the tree view item is disabled. */ + isDisabled?: boolean; + /** Flag indicating if the tree view item toggle is disabled. */ + isToggleDisabled?: boolean; /** Data structure of tree view item. */ itemData?: TreeViewDataItem; /** Internal content of a tree view item. */ @@ -81,6 +85,8 @@ const TreeViewListItemBase: React.FunctionComponent = ({ title, id, isExpanded, + isDisabled = false, + isToggleDisabled = false, defaultExpanded = false, children = null, onSelect, @@ -128,9 +134,9 @@ const TreeViewListItemBase: React.FunctionComponent = ({ const renderToggle = (randomId: string) => ( { - if (isSelectable || hasCheckbox) { + if (!isToggleDisabled && (isSelectable || hasCheckbox)) { if (internalIsExpanded) { onCollapse && onCollapse(evt, itemData, parentItem); } else { @@ -138,12 +144,12 @@ const TreeViewListItemBase: React.FunctionComponent = ({ } setIsExpanded(!internalIsExpanded); } - if (isSelectable) { + if (!isToggleDisabled && isSelectable) { evt.stopPropagation(); } }} {...((hasCheckbox || isSelectable) && { 'aria-labelledby': `label-${randomId}` })} - {...(ToggleComponent === 'button' && { type: 'button' })} + {...(ToggleComponent === 'button' && { disabled: isToggleDisabled, type: 'button' })} tabIndex={-1} > @@ -180,7 +186,12 @@ const TreeViewListItemBase: React.FunctionComponent = ({ <> {isCompact && title && {title}} {isSelectable ? ( - ) : ( @@ -234,11 +245,15 @@ const TreeViewListItemBase: React.FunctionComponent = ({ {(randomId) => ( { if (!hasCheckbox) { - onSelect && onSelect(evt, itemData, parentItem); - if (!isSelectable && children && evt.isDefaultPrevented() !== true) { + !isDisabled && onSelect && onSelect(evt, itemData, parentItem); + if (!isDisabled && !isSelectable && children && evt.isDefaultPrevented() !== true) { if (internalIsExpanded) { onCollapse && onCollapse(evt, itemData, parentItem); } else { @@ -250,7 +265,7 @@ const TreeViewListItemBase: React.FunctionComponent = ({ }} {...(hasCheckbox && { htmlFor: randomId })} {...((hasCheckbox || (isSelectable && children)) && { id: `label-${randomId}` })} - {...(Component === 'button' && { type: 'button' })} + {...(Component === 'button' && { type: 'button', disabled: isDisabled })} > {children && renderToggle(randomId)} diff --git a/packages/react-core/src/components/TreeView/__tests__/TreeViewListItem.test.tsx b/packages/react-core/src/components/TreeView/__tests__/TreeViewListItem.test.tsx index 80301d08ed2..35e69f58f7c 100644 --- a/packages/react-core/src/components/TreeView/__tests__/TreeViewListItem.test.tsx +++ b/packages/react-core/src/components/TreeView/__tests__/TreeViewListItem.test.tsx @@ -415,6 +415,172 @@ test(`Does not render ${styles.treeViewNode} element with ${styles.modifiers.cur expect(treeViewNode).not.toHaveClass(styles.modifiers.current); }); +// Assisted by Cursor AI +describe('isDisabled prop', () => { + const user = userEvent.setup(); + const onSelectMock = jest.fn(); + const onExpandMock = jest.fn(); + const onCollapseMock = jest.fn(); + + beforeEach(() => { + jest.clearAllMocks(); + }); + + test('Renders button with disabled attribute and pf-m-disabled class when isDisabled is true', () => { + render(); + + const button = screen.getByRole('button', { name: requiredProps.name }); + expect(button).toBeDisabled(); + expect(button).toHaveClass('pf-m-disabled'); + }); + + test('Does not render button with disabled attribute when isDisabled is false', () => { + render(); + + expect(screen.getByRole('button', { name: requiredProps.name })).not.toBeDisabled(); + }); + + test('Renders selectable button with disabled attribute when isDisabled is true', () => { + render(); + + const treeViewNode = screen.getByRole('treeitem').querySelector(`.${styles.treeViewNode}`); + const selectableButton = treeViewNode?.querySelector('button'); + expect(selectableButton).toBeDisabled(); + expect(selectableButton).toHaveClass('pf-m-disabled'); + }); + + test('Does not call onSelect when isDisabled is true', async () => { + render(); + + await user.click(screen.getByRole('button', { name: requiredProps.name })); + + expect(onSelectMock).not.toHaveBeenCalled(); + }); + + test('Does not call onExpand when isDisabled is true and item is collapsed', async () => { + render( + + Content + + ); + + await user.click(screen.getByRole('button', { name: requiredProps.name })); + + expect(onExpandMock).not.toHaveBeenCalled(); + }); + + test('Does not call onCollapse when isDisabled is true and item is expanded', async () => { + render( + + Content + + ); + + await user.click(screen.getByRole('button', { name: requiredProps.name })); + + expect(onCollapseMock).not.toHaveBeenCalled(); + }); +}); + +// Assisted by Cursor AI +describe('isToggleDisabled prop', () => { + const user = userEvent.setup(); + const onExpandMock = jest.fn(); + const onCollapseMock = jest.fn(); + + beforeEach(() => { + jest.clearAllMocks(); + }); + + test('Renders toggle button with disabled attribute and pf-m-disabled class when isToggleDisabled is true and hasCheckbox is passed', () => { + render( + + Content + + ); + + const toggle = screen.getByText(requiredProps.name).previousElementSibling?.previousElementSibling; + expect(toggle).toBeDisabled(); + expect(toggle).toHaveClass('pf-m-disabled'); + }); + + test('Renders toggle button with disabled attribute and pf-m-disabled class when isToggleDisabled is true and isSelectable is passed', () => { + render( + + Content + + ); + + const toggle = screen.getByText(requiredProps.name).previousElementSibling; + expect(toggle).toBeDisabled(); + expect(toggle).toHaveClass('pf-m-disabled'); + }); + + test('Does not render toggle span with disabled attribute when isToggleDisabled is true (toggle is span by default)', () => { + render( + + Content + + ); + + const toggle = screen.getByText(requiredProps.name).previousElementSibling; + expect(toggle?.tagName).toBe('SPAN'); + expect(toggle).not.toHaveAttribute('disabled'); + }); + + test('Does not call onExpand when isToggleDisabled is true and hasCheckbox is passed', async () => { + render( + + Content + + ); + + const toggle = screen.getByText(requiredProps.name).previousElementSibling?.previousElementSibling; + await user.click(toggle as Element); + + expect(onExpandMock).not.toHaveBeenCalled(); + }); + + test('Does not call onCollapse when isToggleDisabled is true and hasCheckbox is passed', async () => { + render( + + Content + + ); + + const toggle = screen.getByText(requiredProps.name).previousElementSibling?.previousElementSibling; + await user.click(toggle as Element); + + expect(onCollapseMock).not.toHaveBeenCalled(); + }); + + test('Does not call onExpand when isToggleDisabled is true and isSelectable is passed', async () => { + render( + + Content + + ); + + const toggle = screen.getByText(requiredProps.name).previousElementSibling; + await user.click(toggle as Element); + + expect(onExpandMock).not.toHaveBeenCalled(); + }); + + test('Does not call onCollapse when isToggleDisabled is true and isSelectable is passed', async () => { + render( + + Content + + ); + + const toggle = screen.getByText(requiredProps.name).previousElementSibling; + await user.click(toggle as Element); + + expect(onCollapseMock).not.toHaveBeenCalled(); + }); +}); + describe('Callback props', () => { const user = userEvent.setup(); const compareItemsMock = jest.fn(); From f74a5bc055241cb261f2f105ed0f4fe8d2e69b34 Mon Sep 17 00:00:00 2001 From: Katie McFaul Date: Tue, 6 Jan 2026 13:21:48 -0500 Subject: [PATCH 2/4] pr feedback & css updates --- .../components/TreeView/TreeViewListItem.tsx | 16 ++-- .../__tests__/TreeViewListItem.test.tsx | 95 +++++++++++++++++-- 2 files changed, 94 insertions(+), 17 deletions(-) diff --git a/packages/react-core/src/components/TreeView/TreeViewListItem.tsx b/packages/react-core/src/components/TreeView/TreeViewListItem.tsx index e74c7f4e12e..a0804193e99 100644 --- a/packages/react-core/src/components/TreeView/TreeViewListItem.tsx +++ b/packages/react-core/src/components/TreeView/TreeViewListItem.tsx @@ -131,10 +131,11 @@ const TreeViewListItemBase: React.FunctionComponent = ({ } const ToggleComponent = hasCheckbox || isSelectable ? 'button' : 'span'; + const hasDisabledToggleClass = isToggleDisabled || (Component === 'button' && isDisabled); const renderToggle = (randomId: string) => ( { if (!isToggleDisabled && (isSelectable || hasCheckbox)) { if (internalIsExpanded) { @@ -186,12 +187,7 @@ const TreeViewListItemBase: React.FunctionComponent = ({ <> {isCompact && title && {title}} {isSelectable ? ( - ) : ( @@ -231,6 +227,9 @@ const TreeViewListItemBase: React.FunctionComponent = ({ }) ); + const isFullyDisabled = + (Component === 'button' && isDisabled) || (Component !== 'button' && isDisabled && isToggleDisabled); + return (
  • = ({ tabIndex={-1} {...(hasCheckbox && { 'aria-checked': isCheckboxChecked })} {...(!hasCheckbox && { 'aria-selected': isSelected })} + {...(isFullyDisabled && { 'aria-disabled': true })} >
    @@ -248,7 +248,7 @@ const TreeViewListItemBase: React.FunctionComponent = ({ className={css( styles.treeViewNode, isSelected && styles.modifiers.current, - Component === 'button' && isDisabled && 'pf-m-disabled' + isDisabled && 'pf-m-disabled' )} onClick={(evt: React.MouseEvent) => { if (!hasCheckbox) { diff --git a/packages/react-core/src/components/TreeView/__tests__/TreeViewListItem.test.tsx b/packages/react-core/src/components/TreeView/__tests__/TreeViewListItem.test.tsx index 35e69f58f7c..2d622bf371f 100644 --- a/packages/react-core/src/components/TreeView/__tests__/TreeViewListItem.test.tsx +++ b/packages/react-core/src/components/TreeView/__tests__/TreeViewListItem.test.tsx @@ -440,15 +440,6 @@ describe('isDisabled prop', () => { expect(screen.getByRole('button', { name: requiredProps.name })).not.toBeDisabled(); }); - test('Renders selectable button with disabled attribute when isDisabled is true', () => { - render(); - - const treeViewNode = screen.getByRole('treeitem').querySelector(`.${styles.treeViewNode}`); - const selectableButton = treeViewNode?.querySelector('button'); - expect(selectableButton).toBeDisabled(); - expect(selectableButton).toHaveClass('pf-m-disabled'); - }); - test('Does not call onSelect when isDisabled is true', async () => { render(); @@ -480,6 +471,59 @@ describe('isDisabled prop', () => { expect(onCollapseMock).not.toHaveBeenCalled(); }); + + test('Renders toggle with pf-m-disabled class when isDisabled is true for default TreeViewListItem', () => { + render( + + Content + + ); + + const toggle = screen.getByText(requiredProps.name).previousElementSibling; + expect(toggle).toHaveClass('pf-m-disabled'); + }); + + test('Renders treeitem with aria-disabled when isDisabled is true for default TreeViewListItem', () => { + render(); + + expect(screen.getByRole('treeitem')).toHaveAttribute('aria-disabled', 'true'); + }); + + test('Renders treeitem with aria-disabled when isDisabled and isToggleDisabled are true and isSelectable is true', () => { + render( + + Content + + ); + + expect(screen.getByRole('treeitem')).toHaveAttribute('aria-disabled', 'true'); + }); + + test('Renders treeitem with aria-disabled when isDisabled and isToggleDisabled are true and hasCheckbox is true', () => { + render( + + Content + + ); + + expect(screen.getByRole('treeitem')).toHaveAttribute('aria-disabled', 'true'); + }); + + test('Does not render treeitem with aria-disabled when isDisabled is true, isToggleDisabled is false, and isSelectable is true', () => { + render( + + Content + + ); + + expect(screen.getByRole('treeitem')).not.toHaveAttribute('aria-disabled'); + }); + + test('Does not render treeitem with aria-disabled when isDisabled is false', () => { + render(); + + expect(screen.getByRole('treeitem')).not.toHaveAttribute('aria-disabled'); + }); }); // Assisted by Cursor AI @@ -579,6 +623,39 @@ describe('isToggleDisabled prop', () => { expect(onCollapseMock).not.toHaveBeenCalled(); }); + + test('Renders toggle span with pf-m-disabled class when isDisabled is true for default TreeViewListItem', () => { + render( + + Content + + ); + + const toggle = screen.getByText(requiredProps.name).previousElementSibling; + expect(toggle).toHaveClass('pf-m-disabled'); + }); + + test('Does not render toggle with pf-m-disabled class when isDisabled is true and hasCheckbox is true', () => { + render( + + Content + + ); + + const toggle = screen.getByText(requiredProps.name).previousElementSibling?.previousElementSibling; + expect(toggle).not.toHaveClass('pf-m-disabled'); + }); + + test('Does not render toggle with pf-m-disabled class when isDisabled is true and isSelectable is true', () => { + render( + + Content + + ); + + const toggle = screen.getByText(requiredProps.name).previousElementSibling; + expect(toggle).not.toHaveClass('pf-m-disabled'); + }); }); describe('Callback props', () => { From f3cafd1f55b8684dd04f0816aa6a364509dcabaf Mon Sep 17 00:00:00 2001 From: Katie McFaul Date: Mon, 19 Jan 2026 14:49:21 -0500 Subject: [PATCH 3/4] bump core, replace hardcoded css with modifier obj --- packages/react-core/package.json | 2 +- .../components/TreeView/TreeViewListItem.tsx | 4 +-- .../__tests__/TreeViewListItem.test.tsx | 28 +++++++++---------- packages/react-docs/package.json | 2 +- packages/react-icons/package.json | 2 +- packages/react-styles/package.json | 2 +- packages/react-tokens/package.json | 2 +- yarn.lock | 18 ++++++------ 8 files changed, 30 insertions(+), 30 deletions(-) diff --git a/packages/react-core/package.json b/packages/react-core/package.json index 626f0aa68bd..f1b6b766b30 100644 --- a/packages/react-core/package.json +++ b/packages/react-core/package.json @@ -54,7 +54,7 @@ "tslib": "^2.8.1" }, "devDependencies": { - "@patternfly/patternfly": "6.5.0-prerelease.33", + "@patternfly/patternfly": "6.5.0-prerelease.34", "case-anything": "^3.1.2", "css": "^3.0.0", "fs-extra": "^11.3.0" diff --git a/packages/react-core/src/components/TreeView/TreeViewListItem.tsx b/packages/react-core/src/components/TreeView/TreeViewListItem.tsx index a0804193e99..a47619f8a7d 100644 --- a/packages/react-core/src/components/TreeView/TreeViewListItem.tsx +++ b/packages/react-core/src/components/TreeView/TreeViewListItem.tsx @@ -135,7 +135,7 @@ const TreeViewListItemBase: React.FunctionComponent = ({ const renderToggle = (randomId: string) => ( { if (!isToggleDisabled && (isSelectable || hasCheckbox)) { if (internalIsExpanded) { @@ -248,7 +248,7 @@ const TreeViewListItemBase: React.FunctionComponent = ({ className={css( styles.treeViewNode, isSelected && styles.modifiers.current, - isDisabled && 'pf-m-disabled' + isDisabled && styles.modifiers.disabled )} onClick={(evt: React.MouseEvent) => { if (!hasCheckbox) { diff --git a/packages/react-core/src/components/TreeView/__tests__/TreeViewListItem.test.tsx b/packages/react-core/src/components/TreeView/__tests__/TreeViewListItem.test.tsx index 2d622bf371f..ea735d53002 100644 --- a/packages/react-core/src/components/TreeView/__tests__/TreeViewListItem.test.tsx +++ b/packages/react-core/src/components/TreeView/__tests__/TreeViewListItem.test.tsx @@ -426,12 +426,12 @@ describe('isDisabled prop', () => { jest.clearAllMocks(); }); - test('Renders button with disabled attribute and pf-m-disabled class when isDisabled is true', () => { + test(`Renders button with disabled attribute and ${styles.modifiers.disabled} class when isDisabled is true`, () => { render(); const button = screen.getByRole('button', { name: requiredProps.name }); expect(button).toBeDisabled(); - expect(button).toHaveClass('pf-m-disabled'); + expect(button).toHaveClass(styles.modifiers.disabled); }); test('Does not render button with disabled attribute when isDisabled is false', () => { @@ -472,7 +472,7 @@ describe('isDisabled prop', () => { expect(onCollapseMock).not.toHaveBeenCalled(); }); - test('Renders toggle with pf-m-disabled class when isDisabled is true for default TreeViewListItem', () => { + test(`Renders toggle with ${styles.modifiers.disabled} class when isDisabled is true for default TreeViewListItem`, () => { render( Content @@ -480,7 +480,7 @@ describe('isDisabled prop', () => { ); const toggle = screen.getByText(requiredProps.name).previousElementSibling; - expect(toggle).toHaveClass('pf-m-disabled'); + expect(toggle).toHaveClass(styles.modifiers.disabled); }); test('Renders treeitem with aria-disabled when isDisabled is true for default TreeViewListItem', () => { @@ -536,7 +536,7 @@ describe('isToggleDisabled prop', () => { jest.clearAllMocks(); }); - test('Renders toggle button with disabled attribute and pf-m-disabled class when isToggleDisabled is true and hasCheckbox is passed', () => { + test(`Renders toggle button with disabled attribute and ${styles.modifiers.disabled} class when isToggleDisabled is true and hasCheckbox is passed`, () => { render( Content @@ -545,10 +545,10 @@ describe('isToggleDisabled prop', () => { const toggle = screen.getByText(requiredProps.name).previousElementSibling?.previousElementSibling; expect(toggle).toBeDisabled(); - expect(toggle).toHaveClass('pf-m-disabled'); + expect(toggle).toHaveClass(styles.modifiers.disabled); }); - test('Renders toggle button with disabled attribute and pf-m-disabled class when isToggleDisabled is true and isSelectable is passed', () => { + test(`Renders toggle button with disabled attribute and ${styles.modifiers.disabled} class when isToggleDisabled is true and isSelectable is passed`, () => { render( Content @@ -557,7 +557,7 @@ describe('isToggleDisabled prop', () => { const toggle = screen.getByText(requiredProps.name).previousElementSibling; expect(toggle).toBeDisabled(); - expect(toggle).toHaveClass('pf-m-disabled'); + expect(toggle).toHaveClass(styles.modifiers.disabled); }); test('Does not render toggle span with disabled attribute when isToggleDisabled is true (toggle is span by default)', () => { @@ -624,7 +624,7 @@ describe('isToggleDisabled prop', () => { expect(onCollapseMock).not.toHaveBeenCalled(); }); - test('Renders toggle span with pf-m-disabled class when isDisabled is true for default TreeViewListItem', () => { + test(`Renders toggle span with ${styles.modifiers.disabled} class when isDisabled is true for default TreeViewListItem`, () => { render( Content @@ -632,10 +632,10 @@ describe('isToggleDisabled prop', () => { ); const toggle = screen.getByText(requiredProps.name).previousElementSibling; - expect(toggle).toHaveClass('pf-m-disabled'); + expect(toggle).toHaveClass(styles.modifiers.disabled); }); - test('Does not render toggle with pf-m-disabled class when isDisabled is true and hasCheckbox is true', () => { + test(`Does not render toggle with ${styles.modifiers.disabled} class when isDisabled is true and hasCheckbox is true`, () => { render( Content @@ -643,10 +643,10 @@ describe('isToggleDisabled prop', () => { ); const toggle = screen.getByText(requiredProps.name).previousElementSibling?.previousElementSibling; - expect(toggle).not.toHaveClass('pf-m-disabled'); + expect(toggle).not.toHaveClass(styles.modifiers.disabled); }); - test('Does not render toggle with pf-m-disabled class when isDisabled is true and isSelectable is true', () => { + test(`Does not render toggle with ${styles.modifiers.disabled} class when isDisabled is true and isSelectable is true`, () => { render( Content @@ -654,7 +654,7 @@ describe('isToggleDisabled prop', () => { ); const toggle = screen.getByText(requiredProps.name).previousElementSibling; - expect(toggle).not.toHaveClass('pf-m-disabled'); + expect(toggle).not.toHaveClass(styles.modifiers.disabled); }); }); diff --git a/packages/react-docs/package.json b/packages/react-docs/package.json index 0a3c0343c25..d649afc2a50 100644 --- a/packages/react-docs/package.json +++ b/packages/react-docs/package.json @@ -23,7 +23,7 @@ "test:a11y": "patternfly-a11y --config patternfly-a11y.config" }, "dependencies": { - "@patternfly/patternfly": "6.5.0-prerelease.33", + "@patternfly/patternfly": "6.5.0-prerelease.34", "@patternfly/react-charts": "workspace:^", "@patternfly/react-code-editor": "workspace:^", "@patternfly/react-core": "workspace:^", diff --git a/packages/react-icons/package.json b/packages/react-icons/package.json index e7d7f0b7f4d..6f569ddef3a 100644 --- a/packages/react-icons/package.json +++ b/packages/react-icons/package.json @@ -34,7 +34,7 @@ "@fortawesome/free-brands-svg-icons": "^5.15.4", "@fortawesome/free-regular-svg-icons": "^5.15.4", "@fortawesome/free-solid-svg-icons": "^5.15.4", - "@patternfly/patternfly": "6.5.0-prerelease.33", + "@patternfly/patternfly": "6.5.0-prerelease.34", "@rhds/icons": "^2.0.0", "fs-extra": "^11.3.0", "tslib": "^2.8.1" diff --git a/packages/react-styles/package.json b/packages/react-styles/package.json index ca50ff37669..749c5f05c1a 100644 --- a/packages/react-styles/package.json +++ b/packages/react-styles/package.json @@ -19,7 +19,7 @@ "clean": "rimraf dist css" }, "devDependencies": { - "@patternfly/patternfly": "6.5.0-prerelease.33", + "@patternfly/patternfly": "6.5.0-prerelease.34", "change-case": "^5.4.4", "fs-extra": "^11.3.0" }, diff --git a/packages/react-tokens/package.json b/packages/react-tokens/package.json index 145428b89e3..ea2ff655fb2 100644 --- a/packages/react-tokens/package.json +++ b/packages/react-tokens/package.json @@ -30,7 +30,7 @@ }, "devDependencies": { "@adobe/css-tools": "^4.4.4", - "@patternfly/patternfly": "6.5.0-prerelease.33", + "@patternfly/patternfly": "6.5.0-prerelease.34", "fs-extra": "^11.3.0" } } diff --git a/yarn.lock b/yarn.lock index f79515467d4..92e5df7e56a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4525,10 +4525,10 @@ __metadata: languageName: node linkType: hard -"@patternfly/patternfly@npm:6.5.0-prerelease.33": - version: 6.5.0-prerelease.33 - resolution: "@patternfly/patternfly@npm:6.5.0-prerelease.33" - checksum: 10c0/d3714f12545a4784dd26abc4e60e979ba40b1a551027c6df1888a6839fa4fdc078c2370f049a326fb5fbd330075107ac36fb393bf40fa4b9fdbe4b4f8777ad81 +"@patternfly/patternfly@npm:6.5.0-prerelease.34": + version: 6.5.0-prerelease.34 + resolution: "@patternfly/patternfly@npm:6.5.0-prerelease.34" + checksum: 10c0/e25d30fcdc933a69568058bf09e940c1835cd537004864b1aa0a43587fab4876ec16899d40bd7e70056d5a293d10768fe04c6bd887e2e527557e078aaf18adf7 languageName: node linkType: hard @@ -4626,7 +4626,7 @@ __metadata: version: 0.0.0-use.local resolution: "@patternfly/react-core@workspace:packages/react-core" dependencies: - "@patternfly/patternfly": "npm:6.5.0-prerelease.33" + "@patternfly/patternfly": "npm:6.5.0-prerelease.34" "@patternfly/react-icons": "workspace:^" "@patternfly/react-styles": "workspace:^" "@patternfly/react-tokens": "workspace:^" @@ -4647,7 +4647,7 @@ __metadata: resolution: "@patternfly/react-docs@workspace:packages/react-docs" dependencies: "@patternfly/documentation-framework": "npm:^6.28.9" - "@patternfly/patternfly": "npm:6.5.0-prerelease.33" + "@patternfly/patternfly": "npm:6.5.0-prerelease.34" "@patternfly/patternfly-a11y": "npm:5.1.0" "@patternfly/react-charts": "workspace:^" "@patternfly/react-code-editor": "workspace:^" @@ -4687,7 +4687,7 @@ __metadata: "@fortawesome/free-brands-svg-icons": "npm:^5.15.4" "@fortawesome/free-regular-svg-icons": "npm:^5.15.4" "@fortawesome/free-solid-svg-icons": "npm:^5.15.4" - "@patternfly/patternfly": "npm:6.5.0-prerelease.33" + "@patternfly/patternfly": "npm:6.5.0-prerelease.34" "@rhds/icons": "npm:^2.0.0" fs-extra: "npm:^11.3.0" tslib: "npm:^2.8.1" @@ -4774,7 +4774,7 @@ __metadata: version: 0.0.0-use.local resolution: "@patternfly/react-styles@workspace:packages/react-styles" dependencies: - "@patternfly/patternfly": "npm:6.5.0-prerelease.33" + "@patternfly/patternfly": "npm:6.5.0-prerelease.34" change-case: "npm:^5.4.4" fs-extra: "npm:^11.3.0" languageName: unknown @@ -4816,7 +4816,7 @@ __metadata: resolution: "@patternfly/react-tokens@workspace:packages/react-tokens" dependencies: "@adobe/css-tools": "npm:^4.4.4" - "@patternfly/patternfly": "npm:6.5.0-prerelease.33" + "@patternfly/patternfly": "npm:6.5.0-prerelease.34" fs-extra: "npm:^11.3.0" languageName: unknown linkType: soft From fed5011c3ddcbbe0e92d8be44179d38d80ef98d1 Mon Sep 17 00:00:00 2001 From: Katie McFaul Date: Mon, 19 Jan 2026 15:03:13 -0500 Subject: [PATCH 4/4] add disabled props to memo --- .../react-core/src/components/TreeView/TreeViewListItem.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/react-core/src/components/TreeView/TreeViewListItem.tsx b/packages/react-core/src/components/TreeView/TreeViewListItem.tsx index a47619f8a7d..bad16e6a07a 100644 --- a/packages/react-core/src/components/TreeView/TreeViewListItem.tsx +++ b/packages/react-core/src/components/TreeView/TreeViewListItem.tsx @@ -312,6 +312,8 @@ export const TreeViewListItem = memo(TreeViewListItemBase, (prevProps, nextProps prevProps.id !== nextProps.id || prevProps.isExpanded !== nextProps.isExpanded || prevProps.defaultExpanded !== nextProps.defaultExpanded || + prevProps.isDisabled !== nextProps.isDisabled || + prevProps.isToggleDisabled !== nextProps.isToggleDisabled || prevProps.onSelect !== nextProps.onSelect || prevProps.onCheck !== nextProps.onCheck || prevProps.onExpand !== nextProps.onExpand ||