Skip to content

Commit 30a649e

Browse files
committed
pr feedback & css updates
1 parent b171cbf commit 30a649e

File tree

2 files changed

+94
-17
lines changed

2 files changed

+94
-17
lines changed

packages/react-core/src/components/TreeView/TreeViewListItem.tsx

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -131,10 +131,11 @@ const TreeViewListItemBase: React.FunctionComponent<TreeViewListItemProps> = ({
131131
}
132132

133133
const ToggleComponent = hasCheckbox || isSelectable ? 'button' : 'span';
134+
const hasDisabledToggleClass = isToggleDisabled || (Component === 'button' && isDisabled);
134135

135136
const renderToggle = (randomId: string) => (
136137
<ToggleComponent
137-
className={css(styles.treeViewNodeToggle, ToggleComponent === 'button' && isToggleDisabled && 'pf-m-disabled')}
138+
className={css(styles.treeViewNodeToggle, hasDisabledToggleClass && 'pf-m-disabled')}
138139
onClick={(evt: React.MouseEvent) => {
139140
if (!isToggleDisabled && (isSelectable || hasCheckbox)) {
140141
if (internalIsExpanded) {
@@ -186,12 +187,7 @@ const TreeViewListItemBase: React.FunctionComponent<TreeViewListItemProps> = ({
186187
<>
187188
{isCompact && title && <span className={css(styles.treeViewNodeTitle)}>{title}</span>}
188189
{isSelectable ? (
189-
<button
190-
tabIndex={-1}
191-
className={css(styles.treeViewNodeText, isDisabled && 'pf-m-disabled')}
192-
type="button"
193-
disabled={isDisabled}
194-
>
190+
<button tabIndex={-1} className={css(styles.treeViewNodeText)} type="button" disabled={isDisabled}>
195191
{name}
196192
</button>
197193
) : (
@@ -231,6 +227,9 @@ const TreeViewListItemBase: React.FunctionComponent<TreeViewListItemProps> = ({
231227
})
232228
);
233229

230+
const isFullyDisabled =
231+
(Component === 'button' && isDisabled) || (Component !== 'button' && isDisabled && isToggleDisabled);
232+
234233
return (
235234
<li
236235
id={id}
@@ -240,6 +239,7 @@ const TreeViewListItemBase: React.FunctionComponent<TreeViewListItemProps> = ({
240239
tabIndex={-1}
241240
{...(hasCheckbox && { 'aria-checked': isCheckboxChecked })}
242241
{...(!hasCheckbox && { 'aria-selected': isSelected })}
242+
{...(isFullyDisabled && { 'aria-disabled': true })}
243243
>
244244
<div className={css(styles.treeViewContent)}>
245245
<GenerateId prefix={isSelectable ? 'selectable-id' : 'checkbox-id'}>
@@ -248,7 +248,7 @@ const TreeViewListItemBase: React.FunctionComponent<TreeViewListItemProps> = ({
248248
className={css(
249249
styles.treeViewNode,
250250
isSelected && styles.modifiers.current,
251-
Component === 'button' && isDisabled && 'pf-m-disabled'
251+
isDisabled && 'pf-m-disabled'
252252
)}
253253
onClick={(evt: React.MouseEvent) => {
254254
if (!hasCheckbox) {

packages/react-core/src/components/TreeView/__tests__/TreeViewListItem.test.tsx

Lines changed: 86 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -440,15 +440,6 @@ describe('isDisabled prop', () => {
440440
expect(screen.getByRole('button', { name: requiredProps.name })).not.toBeDisabled();
441441
});
442442

443-
test('Renders selectable button with disabled attribute when isDisabled is true', () => {
444-
render(<TreeViewListItem isSelectable isDisabled {...requiredProps} />);
445-
446-
const treeViewNode = screen.getByRole('treeitem').querySelector(`.${styles.treeViewNode}`);
447-
const selectableButton = treeViewNode?.querySelector('button');
448-
expect(selectableButton).toBeDisabled();
449-
expect(selectableButton).toHaveClass('pf-m-disabled');
450-
});
451-
452443
test('Does not call onSelect when isDisabled is true', async () => {
453444
render(<TreeViewListItem isDisabled onSelect={onSelectMock} {...requiredProps} />);
454445

@@ -480,6 +471,59 @@ describe('isDisabled prop', () => {
480471

481472
expect(onCollapseMock).not.toHaveBeenCalled();
482473
});
474+
475+
test('Renders toggle with pf-m-disabled class when isDisabled is true for default TreeViewListItem', () => {
476+
render(
477+
<TreeViewListItem isDisabled {...requiredProps}>
478+
Content
479+
</TreeViewListItem>
480+
);
481+
482+
const toggle = screen.getByText(requiredProps.name).previousElementSibling;
483+
expect(toggle).toHaveClass('pf-m-disabled');
484+
});
485+
486+
test('Renders treeitem with aria-disabled when isDisabled is true for default TreeViewListItem', () => {
487+
render(<TreeViewListItem isDisabled {...requiredProps} />);
488+
489+
expect(screen.getByRole('treeitem')).toHaveAttribute('aria-disabled', 'true');
490+
});
491+
492+
test('Renders treeitem with aria-disabled when isDisabled and isToggleDisabled are true and isSelectable is true', () => {
493+
render(
494+
<TreeViewListItem isSelectable isDisabled isToggleDisabled {...requiredProps}>
495+
Content
496+
</TreeViewListItem>
497+
);
498+
499+
expect(screen.getByRole('treeitem')).toHaveAttribute('aria-disabled', 'true');
500+
});
501+
502+
test('Renders treeitem with aria-disabled when isDisabled and isToggleDisabled are true and hasCheckbox is true', () => {
503+
render(
504+
<TreeViewListItem hasCheckbox isDisabled isToggleDisabled {...requiredProps}>
505+
Content
506+
</TreeViewListItem>
507+
);
508+
509+
expect(screen.getByRole('treeitem')).toHaveAttribute('aria-disabled', 'true');
510+
});
511+
512+
test('Does not render treeitem with aria-disabled when isDisabled is true, isToggleDisabled is false, and isSelectable is true', () => {
513+
render(
514+
<TreeViewListItem isSelectable isDisabled {...requiredProps}>
515+
Content
516+
</TreeViewListItem>
517+
);
518+
519+
expect(screen.getByRole('treeitem')).not.toHaveAttribute('aria-disabled');
520+
});
521+
522+
test('Does not render treeitem with aria-disabled when isDisabled is false', () => {
523+
render(<TreeViewListItem isDisabled={false} {...requiredProps} />);
524+
525+
expect(screen.getByRole('treeitem')).not.toHaveAttribute('aria-disabled');
526+
});
483527
});
484528

485529
// Assisted by Cursor AI
@@ -579,6 +623,39 @@ describe('isToggleDisabled prop', () => {
579623

580624
expect(onCollapseMock).not.toHaveBeenCalled();
581625
});
626+
627+
test('Renders toggle span with pf-m-disabled class when isDisabled is true for default TreeViewListItem', () => {
628+
render(
629+
<TreeViewListItem isDisabled {...requiredProps}>
630+
Content
631+
</TreeViewListItem>
632+
);
633+
634+
const toggle = screen.getByText(requiredProps.name).previousElementSibling;
635+
expect(toggle).toHaveClass('pf-m-disabled');
636+
});
637+
638+
test('Does not render toggle with pf-m-disabled class when isDisabled is true and hasCheckbox is true', () => {
639+
render(
640+
<TreeViewListItem hasCheckbox isDisabled {...requiredProps}>
641+
Content
642+
</TreeViewListItem>
643+
);
644+
645+
const toggle = screen.getByText(requiredProps.name).previousElementSibling?.previousElementSibling;
646+
expect(toggle).not.toHaveClass('pf-m-disabled');
647+
});
648+
649+
test('Does not render toggle with pf-m-disabled class when isDisabled is true and isSelectable is true', () => {
650+
render(
651+
<TreeViewListItem isSelectable isDisabled {...requiredProps}>
652+
Content
653+
</TreeViewListItem>
654+
);
655+
656+
const toggle = screen.getByText(requiredProps.name).previousElementSibling;
657+
expect(toggle).not.toHaveClass('pf-m-disabled');
658+
});
582659
});
583660

584661
describe('Callback props', () => {

0 commit comments

Comments
 (0)