Skip to content

Commit 37c81f8

Browse files
committed
base first button tabIndex=0 off of level prop, not querySelector
1 parent 4856580 commit 37c81f8

File tree

4 files changed

+16
-12
lines changed

4 files changed

+16
-12
lines changed

src/DataRenderer.test.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,4 +411,14 @@ describe('DataRender', () => {
411411
expect(screen.queryByText(/test:/)).not.toBeInTheDocument();
412412
expect(screen.queryByText(/array/)).not.toBeInTheDocument();
413413
});
414+
415+
it('only one item with tabindex=0 if level=0, none if level>0', () => {
416+
const data = { test: [1, 2, 3], test2: [1, 2, 3], test3: { a: 'b', c: { d: '1', a: 2 } } };
417+
418+
const { container, rerender } = render(<WrappedDataRenderer value={data} level={0} />);
419+
expect(container.querySelectorAll('[tabindex="0"]')).toHaveLength(1);
420+
421+
rerender(<WrappedDataRenderer value={data} level={1} />);
422+
expect(container.querySelectorAll('[tabindex="0"]')).toHaveLength(0);
423+
});
414424
});

src/DataRenderer.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export interface StyleProps {
2323

2424
interface CommonRenderProps {
2525
lastElement: boolean;
26+
/** There should only be one node with `level==0`. */
2627
level: number;
2728
style: StyleProps;
2829
shouldExpandNode: (level: number, value: any, field?: string) => boolean;
@@ -140,8 +141,8 @@ function ExpandableObject({
140141
aria-expanded={expanded}
141142
aria-controls={expanded ? contentsId : undefined}
142143
ref={expanderButtonRef}
143-
// tabIndex=0 gets set by js
144-
tabIndex={-1}
144+
// tabIndex gets changed by js. There should only be one node (top level) with level==0.
145+
tabIndex={level === 0 ? 0 : -1}
145146
/>
146147
{(field || field === '') &&
147148
(clickToExpandNode ? (

src/index.test.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,9 @@ describe('JsonView', () => {
4747
});
4848

4949
it('should go to next node on ArrowDown, prev node with ArrowUp, tabindex should change', () => {
50-
render(<JsonView data={{ test: [1, 2, 3], test2: [1, 2, 3] }} />);
50+
const { container } = render(<JsonView data={{ test: [1, 2, 3], test2: [1, 2, 3] }} />);
51+
52+
expect(container.querySelectorAll('[tabindex="0"]')).toHaveLength(1);
5153
const buttons = screen.getAllByRole('button', { hidden: true });
5254
expect(buttons).toHaveLength(3);
5355

src/index.tsx

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -58,15 +58,6 @@ export const JsonView = ({
5858
...ariaAttrs
5959
}: Props) => {
6060
const outerRef = React.useRef<HTMLDivElement>(null);
61-
62-
// on first render, set first button to tabIndex=0.
63-
React.useEffect(() => {
64-
const firstButton = outerRef.current?.querySelector<HTMLElement>('[role=button]');
65-
if (firstButton) {
66-
firstButton.tabIndex = 0;
67-
}
68-
}, [outerRef]);
69-
7061
return (
7162
<div
7263
aria-label='JSON view'

0 commit comments

Comments
 (0)