@wordpress/components 19.6.1-next.a55ed9455a.0 → 19.6.1
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 +3 -1
- package/build/toggle-group-control/toggle-group-control-option/component.js +1 -4
- package/build/toggle-group-control/toggle-group-control-option/component.js.map +1 -1
- package/build/toggle-group-control/toggle-group-control-option/styles.js +12 -19
- package/build/toggle-group-control/toggle-group-control-option/styles.js.map +1 -1
- package/build/tree-grid/index.js +4 -1
- package/build/tree-grid/index.js.map +1 -1
- package/build-module/toggle-group-control/toggle-group-control-option/component.js +1 -4
- package/build-module/toggle-group-control/toggle-group-control-option/component.js.map +1 -1
- package/build-module/toggle-group-control/toggle-group-control-option/styles.js +11 -17
- package/build-module/toggle-group-control/toggle-group-control-option/styles.js.map +1 -1
- package/build-module/tree-grid/index.js +4 -1
- package/build-module/tree-grid/index.js.map +1 -1
- package/build-types/toggle-group-control/toggle-group-control-option/component.d.ts.map +1 -1
- package/build-types/toggle-group-control/toggle-group-control-option/styles.d.ts +0 -4
- package/build-types/toggle-group-control/toggle-group-control-option/styles.d.ts.map +1 -1
- package/package.json +17 -17
- package/src/font-size-picker/test/index.js +0 -2
- package/src/mobile/image/style.native.scss +1 -0
- package/src/toggle-group-control/test/__snapshots__/index.js.snap +0 -27
- package/src/toggle-group-control/toggle-group-control-option/component.tsx +1 -4
- package/src/toggle-group-control/toggle-group-control-option/styles.ts +0 -12
- package/src/tree-grid/README.md +1 -1
- package/src/tree-grid/index.js +4 -0
- package/src/tree-grid/test/index.js +61 -17
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -244,7 +244,10 @@ function TreeGrid(_ref, ref) {
|
|
|
244
244
|
|
|
245
245
|
|
|
246
246
|
const nextIndex = Math.min(currentColumnIndex, focusablesInNextRow.length - 1);
|
|
247
|
-
focusablesInNextRow[nextIndex].focus(); //
|
|
247
|
+
focusablesInNextRow[nextIndex].focus(); // Let consumers know the row that was originally focused,
|
|
248
|
+
// and the row that is now in focus.
|
|
249
|
+
|
|
250
|
+
onFocusRow(event, activeRow, rows[nextRowIndex]); // Prevent key use for anything else. This ensures Voiceover
|
|
248
251
|
// doesn't try to handle key navigation.
|
|
249
252
|
|
|
250
253
|
event.preventDefault();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["@wordpress/components/src/tree-grid/index.js"],"names":["includes","focus","forwardRef","useCallback","UP","DOWN","LEFT","RIGHT","HOME","END","RovingTabIndexContainer","getRowFocusables","rowElement","focusablesInRow","focusable","find","sequential","length","filter","closest","TreeGrid","ref","children","onExpandRow","onCollapseRow","onFocusRow","props","onKeyDown","event","keyCode","metaKey","ctrlKey","altKey","hasModifierKeyPressed","stopPropagation","activeElement","document","currentTarget","treeGridElement","contains","activeRow","currentColumnIndex","indexOf","canExpandCollapse","cannotFocusNextColumn","getAttribute","nextIndex","Math","max","min","preventDefault","level","parseInt","rows","Array","from","querySelectorAll","parentRow","currentRowIndex","i","focusableItems","nextRowIndex","focusablesInNextRow","default","TreeGridRow","TreeGridCell","TreeGridItem"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport { includes } from 'lodash';\n\n/**\n * WordPress dependencies\n */\nimport { focus } from '@wordpress/dom';\nimport { forwardRef, useCallback } from '@wordpress/element';\nimport { UP, DOWN, LEFT, RIGHT, HOME, END } from '@wordpress/keycodes';\n\n/**\n * Internal dependencies\n */\nimport RovingTabIndexContainer from './roving-tab-index';\n\n/**\n * Return focusables in a row element, excluding those from other branches\n * nested within the row.\n *\n * @param {Element} rowElement The DOM element representing the row.\n *\n * @return {?Array} The array of focusables in the row.\n */\nfunction getRowFocusables( rowElement ) {\n\tconst focusablesInRow = focus.focusable.find( rowElement, {\n\t\tsequential: true,\n\t} );\n\n\tif ( ! focusablesInRow || ! focusablesInRow.length ) {\n\t\treturn;\n\t}\n\n\treturn focusablesInRow.filter( ( focusable ) => {\n\t\treturn focusable.closest( '[role=\"row\"]' ) === rowElement;\n\t} );\n}\n\n/**\n * Renders both a table and tbody element, used to create a tree hierarchy.\n *\n * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/components/src/tree-grid/README.md\n * @param {Object} props Component props.\n * @param {WPElement} props.children Children to be rendered.\n * @param {Function} props.onExpandRow Callback to fire when row is expanded.\n * @param {Function} props.onCollapseRow Callback to fire when row is collapsed.\n * @param {Function} props.onFocusRow Callback to fire when moving focus to a different row.\n * @param {Object} ref A ref to the underlying DOM table element.\n */\nfunction TreeGrid(\n\t{\n\t\tchildren,\n\t\tonExpandRow = () => {},\n\t\tonCollapseRow = () => {},\n\t\tonFocusRow = () => {},\n\t\t...props\n\t},\n\tref\n) {\n\tconst onKeyDown = useCallback(\n\t\t( event ) => {\n\t\t\tconst { keyCode, metaKey, ctrlKey, altKey } = event;\n\n\t\t\t// The shift key is intentionally absent from the following list,\n\t\t\t// to enable shift + up/down to select items from the list.\n\t\t\tconst hasModifierKeyPressed = metaKey || ctrlKey || altKey;\n\n\t\t\tif (\n\t\t\t\thasModifierKeyPressed ||\n\t\t\t\t! includes( [ UP, DOWN, LEFT, RIGHT, HOME, END ], keyCode )\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// The event will be handled, stop propagation.\n\t\t\tevent.stopPropagation();\n\n\t\t\tconst { activeElement } = document;\n\t\t\tconst { currentTarget: treeGridElement } = event;\n\t\t\tif ( ! treeGridElement.contains( activeElement ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Calculate the columnIndex of the active element.\n\t\t\tconst activeRow = activeElement.closest( '[role=\"row\"]' );\n\t\t\tconst focusablesInRow = getRowFocusables( activeRow );\n\t\t\tconst currentColumnIndex = focusablesInRow.indexOf( activeElement );\n\t\t\tconst canExpandCollapse = 0 === currentColumnIndex;\n\t\t\tconst cannotFocusNextColumn =\n\t\t\t\tcanExpandCollapse &&\n\t\t\t\tactiveRow.getAttribute( 'aria-expanded' ) === 'false' &&\n\t\t\t\tkeyCode === RIGHT;\n\n\t\t\tif ( includes( [ LEFT, RIGHT ], keyCode ) ) {\n\t\t\t\t// Calculate to the next element.\n\t\t\t\tlet nextIndex;\n\t\t\t\tif ( keyCode === LEFT ) {\n\t\t\t\t\tnextIndex = Math.max( 0, currentColumnIndex - 1 );\n\t\t\t\t} else {\n\t\t\t\t\tnextIndex = Math.min(\n\t\t\t\t\t\tcurrentColumnIndex + 1,\n\t\t\t\t\t\tfocusablesInRow.length - 1\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Focus is at the left most column.\n\t\t\t\tif ( canExpandCollapse ) {\n\t\t\t\t\tif ( keyCode === LEFT ) {\n\t\t\t\t\t\t// Left:\n\t\t\t\t\t\t// If a row is focused, and it is expanded, collapses the current row.\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tactiveRow.getAttribute( 'aria-expanded' ) === 'true'\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tonCollapseRow( activeRow );\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// If a row is focused, and it is collapsed, moves to the parent row (if there is one).\n\t\t\t\t\t\tconst level = Math.max(\n\t\t\t\t\t\t\tparseInt(\n\t\t\t\t\t\t\t\tactiveRow?.getAttribute( 'aria-level' ) ?? 1,\n\t\t\t\t\t\t\t\t10\n\t\t\t\t\t\t\t) - 1,\n\t\t\t\t\t\t\t1\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst rows = Array.from(\n\t\t\t\t\t\t\ttreeGridElement.querySelectorAll( '[role=\"row\"]' )\n\t\t\t\t\t\t);\n\t\t\t\t\t\tlet parentRow = activeRow;\n\t\t\t\t\t\tconst currentRowIndex = rows.indexOf( activeRow );\n\t\t\t\t\t\tfor ( let i = currentRowIndex; i >= 0; i-- ) {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tparseInt(\n\t\t\t\t\t\t\t\t\trows[ i ].getAttribute( 'aria-level' ),\n\t\t\t\t\t\t\t\t\t10\n\t\t\t\t\t\t\t\t) === level\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tparentRow = rows[ i ];\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tgetRowFocusables( parentRow )?.[ 0 ]?.focus();\n\t\t\t\t\t}\n\t\t\t\t\tif ( keyCode === RIGHT ) {\n\t\t\t\t\t\t// Right:\n\t\t\t\t\t\t// If a row is focused, and it is collapsed, expands the current row.\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tactiveRow.getAttribute( 'aria-expanded' ) ===\n\t\t\t\t\t\t\t'false'\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tonExpandRow( activeRow );\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// If a row is focused, and it is expanded, focuses the rightmost cell in the row.\n\t\t\t\t\t\tconst focusableItems = getRowFocusables( activeRow );\n\t\t\t\t\t\tif ( focusableItems.length > 0 ) {\n\t\t\t\t\t\t\tfocusableItems[\n\t\t\t\t\t\t\t\tfocusableItems.length - 1\n\t\t\t\t\t\t\t]?.focus();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// Prevent key use for anything else. For example, Voiceover\n\t\t\t\t\t// will start reading text on continued use of left/right arrow\n\t\t\t\t\t// keys.\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Focus the next element. If at most left column and row is collapsed, moving right is not allowed as this will expand. However, if row is collapsed, moving left is allowed.\n\t\t\t\tif ( cannotFocusNextColumn ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tfocusablesInRow[ nextIndex ].focus();\n\n\t\t\t\t// Prevent key use for anything else. This ensures Voiceover\n\t\t\t\t// doesn't try to handle key navigation.\n\t\t\t\tevent.preventDefault();\n\t\t\t} else if ( includes( [ UP, DOWN ], keyCode ) ) {\n\t\t\t\t// Calculate the rowIndex of the next row.\n\t\t\t\tconst rows = Array.from(\n\t\t\t\t\ttreeGridElement.querySelectorAll( '[role=\"row\"]' )\n\t\t\t\t);\n\t\t\t\tconst currentRowIndex = rows.indexOf( activeRow );\n\t\t\t\tlet nextRowIndex;\n\n\t\t\t\tif ( keyCode === UP ) {\n\t\t\t\t\tnextRowIndex = Math.max( 0, currentRowIndex - 1 );\n\t\t\t\t} else {\n\t\t\t\t\tnextRowIndex = Math.min(\n\t\t\t\t\t\tcurrentRowIndex + 1,\n\t\t\t\t\t\trows.length - 1\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Focus is either at the top or bottom edge of the grid. Do nothing.\n\t\t\t\tif ( nextRowIndex === currentRowIndex ) {\n\t\t\t\t\t// Prevent key use for anything else. For example, Voiceover\n\t\t\t\t\t// will start navigating horizontally when reaching the vertical\n\t\t\t\t\t// bounds of a table.\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Get the focusables in the next row.\n\t\t\t\tconst focusablesInNextRow = getRowFocusables(\n\t\t\t\t\trows[ nextRowIndex ]\n\t\t\t\t);\n\n\t\t\t\t// If for some reason there are no focusables in the next row, do nothing.\n\t\t\t\tif ( ! focusablesInNextRow || ! focusablesInNextRow.length ) {\n\t\t\t\t\t// Prevent key use for anything else. For example, Voiceover\n\t\t\t\t\t// will still focus text when using arrow keys, while this\n\t\t\t\t\t// component should limit navigation to focusables.\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Try to focus the element in the next row that's at a similar column to the activeElement.\n\t\t\t\tconst nextIndex = Math.min(\n\t\t\t\t\tcurrentColumnIndex,\n\t\t\t\t\tfocusablesInNextRow.length - 1\n\t\t\t\t);\n\t\t\t\tfocusablesInNextRow[ nextIndex ].focus();\n\n\t\t\t\t// Let consumers know the row that was originally focused,\n\t\t\t\t// and the row that is now in focus.\n\t\t\t\tonFocusRow( event, activeRow, rows[ nextRowIndex ] );\n\n\t\t\t\t// Prevent key use for anything else. This ensures Voiceover\n\t\t\t\t// doesn't try to handle key navigation.\n\t\t\t\tevent.preventDefault();\n\t\t\t} else if ( includes( [ HOME, END ], keyCode ) ) {\n\t\t\t\t// Calculate the rowIndex of the next row.\n\t\t\t\tconst rows = Array.from(\n\t\t\t\t\ttreeGridElement.querySelectorAll( '[role=\"row\"]' )\n\t\t\t\t);\n\t\t\t\tconst currentRowIndex = rows.indexOf( activeRow );\n\t\t\t\tlet nextRowIndex;\n\n\t\t\t\tif ( keyCode === HOME ) {\n\t\t\t\t\tnextRowIndex = 0;\n\t\t\t\t} else {\n\t\t\t\t\tnextRowIndex = rows.length - 1;\n\t\t\t\t}\n\n\t\t\t\t// Focus is either at the top or bottom edge of the grid. Do nothing.\n\t\t\t\tif ( nextRowIndex === currentRowIndex ) {\n\t\t\t\t\t// Prevent key use for anything else. For example, Voiceover\n\t\t\t\t\t// will start navigating horizontally when reaching the vertical\n\t\t\t\t\t// bounds of a table.\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Get the focusables in the next row.\n\t\t\t\tconst focusablesInNextRow = getRowFocusables(\n\t\t\t\t\trows[ nextRowIndex ]\n\t\t\t\t);\n\n\t\t\t\t// If for some reason there are no focusables in the next row, do nothing.\n\t\t\t\tif ( ! focusablesInNextRow || ! focusablesInNextRow.length ) {\n\t\t\t\t\t// Prevent key use for anything else. For example, Voiceover\n\t\t\t\t\t// will still focus text when using arrow keys, while this\n\t\t\t\t\t// component should limit navigation to focusables.\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Try to focus the element in the next row that's at a similar column to the activeElement.\n\t\t\t\tconst nextIndex = Math.min(\n\t\t\t\t\tcurrentColumnIndex,\n\t\t\t\t\tfocusablesInNextRow.length - 1\n\t\t\t\t);\n\t\t\t\tfocusablesInNextRow[ nextIndex ].focus();\n\n\t\t\t\t// Prevent key use for anything else. This ensures Voiceover\n\t\t\t\t// doesn't try to handle key navigation.\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t},\n\t\t[ onExpandRow, onCollapseRow, onFocusRow ]\n\t);\n\n\t/* Disable reason: A treegrid is implemented using a table element. */\n\t/* eslint-disable jsx-a11y/no-noninteractive-element-to-interactive-role */\n\treturn (\n\t\t<RovingTabIndexContainer>\n\t\t\t<table\n\t\t\t\t{ ...props }\n\t\t\t\trole=\"treegrid\"\n\t\t\t\tonKeyDown={ onKeyDown }\n\t\t\t\tref={ ref }\n\t\t\t>\n\t\t\t\t<tbody>{ children }</tbody>\n\t\t\t</table>\n\t\t</RovingTabIndexContainer>\n\t);\n\t/* eslint-enable jsx-a11y/no-noninteractive-element-to-interactive-role */\n}\n\nexport default forwardRef( TreeGrid );\nexport { default as TreeGridRow } from './row';\nexport { default as TreeGridCell } from './cell';\nexport { default as TreeGridItem } from './item';\n"]}
|
|
1
|
+
{"version":3,"sources":["@wordpress/components/src/tree-grid/index.js"],"names":["includes","focus","forwardRef","useCallback","UP","DOWN","LEFT","RIGHT","HOME","END","RovingTabIndexContainer","getRowFocusables","rowElement","focusablesInRow","focusable","find","sequential","length","filter","closest","TreeGrid","ref","children","onExpandRow","onCollapseRow","onFocusRow","props","onKeyDown","event","keyCode","metaKey","ctrlKey","altKey","hasModifierKeyPressed","stopPropagation","activeElement","document","currentTarget","treeGridElement","contains","activeRow","currentColumnIndex","indexOf","canExpandCollapse","cannotFocusNextColumn","getAttribute","nextIndex","Math","max","min","preventDefault","level","parseInt","rows","Array","from","querySelectorAll","parentRow","currentRowIndex","i","focusableItems","nextRowIndex","focusablesInNextRow","default","TreeGridRow","TreeGridCell","TreeGridItem"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport { includes } from 'lodash';\n\n/**\n * WordPress dependencies\n */\nimport { focus } from '@wordpress/dom';\nimport { forwardRef, useCallback } from '@wordpress/element';\nimport { UP, DOWN, LEFT, RIGHT, HOME, END } from '@wordpress/keycodes';\n\n/**\n * Internal dependencies\n */\nimport RovingTabIndexContainer from './roving-tab-index';\n\n/**\n * Return focusables in a row element, excluding those from other branches\n * nested within the row.\n *\n * @param {Element} rowElement The DOM element representing the row.\n *\n * @return {?Array} The array of focusables in the row.\n */\nfunction getRowFocusables( rowElement ) {\n\tconst focusablesInRow = focus.focusable.find( rowElement, {\n\t\tsequential: true,\n\t} );\n\n\tif ( ! focusablesInRow || ! focusablesInRow.length ) {\n\t\treturn;\n\t}\n\n\treturn focusablesInRow.filter( ( focusable ) => {\n\t\treturn focusable.closest( '[role=\"row\"]' ) === rowElement;\n\t} );\n}\n\n/**\n * Renders both a table and tbody element, used to create a tree hierarchy.\n *\n * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/components/src/tree-grid/README.md\n * @param {Object} props Component props.\n * @param {WPElement} props.children Children to be rendered.\n * @param {Function} props.onExpandRow Callback to fire when row is expanded.\n * @param {Function} props.onCollapseRow Callback to fire when row is collapsed.\n * @param {Function} props.onFocusRow Callback to fire when moving focus to a different row.\n * @param {Object} ref A ref to the underlying DOM table element.\n */\nfunction TreeGrid(\n\t{\n\t\tchildren,\n\t\tonExpandRow = () => {},\n\t\tonCollapseRow = () => {},\n\t\tonFocusRow = () => {},\n\t\t...props\n\t},\n\tref\n) {\n\tconst onKeyDown = useCallback(\n\t\t( event ) => {\n\t\t\tconst { keyCode, metaKey, ctrlKey, altKey } = event;\n\n\t\t\t// The shift key is intentionally absent from the following list,\n\t\t\t// to enable shift + up/down to select items from the list.\n\t\t\tconst hasModifierKeyPressed = metaKey || ctrlKey || altKey;\n\n\t\t\tif (\n\t\t\t\thasModifierKeyPressed ||\n\t\t\t\t! includes( [ UP, DOWN, LEFT, RIGHT, HOME, END ], keyCode )\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// The event will be handled, stop propagation.\n\t\t\tevent.stopPropagation();\n\n\t\t\tconst { activeElement } = document;\n\t\t\tconst { currentTarget: treeGridElement } = event;\n\t\t\tif ( ! treeGridElement.contains( activeElement ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Calculate the columnIndex of the active element.\n\t\t\tconst activeRow = activeElement.closest( '[role=\"row\"]' );\n\t\t\tconst focusablesInRow = getRowFocusables( activeRow );\n\t\t\tconst currentColumnIndex = focusablesInRow.indexOf( activeElement );\n\t\t\tconst canExpandCollapse = 0 === currentColumnIndex;\n\t\t\tconst cannotFocusNextColumn =\n\t\t\t\tcanExpandCollapse &&\n\t\t\t\tactiveRow.getAttribute( 'aria-expanded' ) === 'false' &&\n\t\t\t\tkeyCode === RIGHT;\n\n\t\t\tif ( includes( [ LEFT, RIGHT ], keyCode ) ) {\n\t\t\t\t// Calculate to the next element.\n\t\t\t\tlet nextIndex;\n\t\t\t\tif ( keyCode === LEFT ) {\n\t\t\t\t\tnextIndex = Math.max( 0, currentColumnIndex - 1 );\n\t\t\t\t} else {\n\t\t\t\t\tnextIndex = Math.min(\n\t\t\t\t\t\tcurrentColumnIndex + 1,\n\t\t\t\t\t\tfocusablesInRow.length - 1\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Focus is at the left most column.\n\t\t\t\tif ( canExpandCollapse ) {\n\t\t\t\t\tif ( keyCode === LEFT ) {\n\t\t\t\t\t\t// Left:\n\t\t\t\t\t\t// If a row is focused, and it is expanded, collapses the current row.\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tactiveRow.getAttribute( 'aria-expanded' ) === 'true'\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tonCollapseRow( activeRow );\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// If a row is focused, and it is collapsed, moves to the parent row (if there is one).\n\t\t\t\t\t\tconst level = Math.max(\n\t\t\t\t\t\t\tparseInt(\n\t\t\t\t\t\t\t\tactiveRow?.getAttribute( 'aria-level' ) ?? 1,\n\t\t\t\t\t\t\t\t10\n\t\t\t\t\t\t\t) - 1,\n\t\t\t\t\t\t\t1\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst rows = Array.from(\n\t\t\t\t\t\t\ttreeGridElement.querySelectorAll( '[role=\"row\"]' )\n\t\t\t\t\t\t);\n\t\t\t\t\t\tlet parentRow = activeRow;\n\t\t\t\t\t\tconst currentRowIndex = rows.indexOf( activeRow );\n\t\t\t\t\t\tfor ( let i = currentRowIndex; i >= 0; i-- ) {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tparseInt(\n\t\t\t\t\t\t\t\t\trows[ i ].getAttribute( 'aria-level' ),\n\t\t\t\t\t\t\t\t\t10\n\t\t\t\t\t\t\t\t) === level\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tparentRow = rows[ i ];\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tgetRowFocusables( parentRow )?.[ 0 ]?.focus();\n\t\t\t\t\t}\n\t\t\t\t\tif ( keyCode === RIGHT ) {\n\t\t\t\t\t\t// Right:\n\t\t\t\t\t\t// If a row is focused, and it is collapsed, expands the current row.\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tactiveRow.getAttribute( 'aria-expanded' ) ===\n\t\t\t\t\t\t\t'false'\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tonExpandRow( activeRow );\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// If a row is focused, and it is expanded, focuses the rightmost cell in the row.\n\t\t\t\t\t\tconst focusableItems = getRowFocusables( activeRow );\n\t\t\t\t\t\tif ( focusableItems.length > 0 ) {\n\t\t\t\t\t\t\tfocusableItems[\n\t\t\t\t\t\t\t\tfocusableItems.length - 1\n\t\t\t\t\t\t\t]?.focus();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// Prevent key use for anything else. For example, Voiceover\n\t\t\t\t\t// will start reading text on continued use of left/right arrow\n\t\t\t\t\t// keys.\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Focus the next element. If at most left column and row is collapsed, moving right is not allowed as this will expand. However, if row is collapsed, moving left is allowed.\n\t\t\t\tif ( cannotFocusNextColumn ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tfocusablesInRow[ nextIndex ].focus();\n\n\t\t\t\t// Prevent key use for anything else. This ensures Voiceover\n\t\t\t\t// doesn't try to handle key navigation.\n\t\t\t\tevent.preventDefault();\n\t\t\t} else if ( includes( [ UP, DOWN ], keyCode ) ) {\n\t\t\t\t// Calculate the rowIndex of the next row.\n\t\t\t\tconst rows = Array.from(\n\t\t\t\t\ttreeGridElement.querySelectorAll( '[role=\"row\"]' )\n\t\t\t\t);\n\t\t\t\tconst currentRowIndex = rows.indexOf( activeRow );\n\t\t\t\tlet nextRowIndex;\n\n\t\t\t\tif ( keyCode === UP ) {\n\t\t\t\t\tnextRowIndex = Math.max( 0, currentRowIndex - 1 );\n\t\t\t\t} else {\n\t\t\t\t\tnextRowIndex = Math.min(\n\t\t\t\t\t\tcurrentRowIndex + 1,\n\t\t\t\t\t\trows.length - 1\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Focus is either at the top or bottom edge of the grid. Do nothing.\n\t\t\t\tif ( nextRowIndex === currentRowIndex ) {\n\t\t\t\t\t// Prevent key use for anything else. For example, Voiceover\n\t\t\t\t\t// will start navigating horizontally when reaching the vertical\n\t\t\t\t\t// bounds of a table.\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Get the focusables in the next row.\n\t\t\t\tconst focusablesInNextRow = getRowFocusables(\n\t\t\t\t\trows[ nextRowIndex ]\n\t\t\t\t);\n\n\t\t\t\t// If for some reason there are no focusables in the next row, do nothing.\n\t\t\t\tif ( ! focusablesInNextRow || ! focusablesInNextRow.length ) {\n\t\t\t\t\t// Prevent key use for anything else. For example, Voiceover\n\t\t\t\t\t// will still focus text when using arrow keys, while this\n\t\t\t\t\t// component should limit navigation to focusables.\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Try to focus the element in the next row that's at a similar column to the activeElement.\n\t\t\t\tconst nextIndex = Math.min(\n\t\t\t\t\tcurrentColumnIndex,\n\t\t\t\t\tfocusablesInNextRow.length - 1\n\t\t\t\t);\n\t\t\t\tfocusablesInNextRow[ nextIndex ].focus();\n\n\t\t\t\t// Let consumers know the row that was originally focused,\n\t\t\t\t// and the row that is now in focus.\n\t\t\t\tonFocusRow( event, activeRow, rows[ nextRowIndex ] );\n\n\t\t\t\t// Prevent key use for anything else. This ensures Voiceover\n\t\t\t\t// doesn't try to handle key navigation.\n\t\t\t\tevent.preventDefault();\n\t\t\t} else if ( includes( [ HOME, END ], keyCode ) ) {\n\t\t\t\t// Calculate the rowIndex of the next row.\n\t\t\t\tconst rows = Array.from(\n\t\t\t\t\ttreeGridElement.querySelectorAll( '[role=\"row\"]' )\n\t\t\t\t);\n\t\t\t\tconst currentRowIndex = rows.indexOf( activeRow );\n\t\t\t\tlet nextRowIndex;\n\n\t\t\t\tif ( keyCode === HOME ) {\n\t\t\t\t\tnextRowIndex = 0;\n\t\t\t\t} else {\n\t\t\t\t\tnextRowIndex = rows.length - 1;\n\t\t\t\t}\n\n\t\t\t\t// Focus is either at the top or bottom edge of the grid. Do nothing.\n\t\t\t\tif ( nextRowIndex === currentRowIndex ) {\n\t\t\t\t\t// Prevent key use for anything else. For example, Voiceover\n\t\t\t\t\t// will start navigating horizontally when reaching the vertical\n\t\t\t\t\t// bounds of a table.\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Get the focusables in the next row.\n\t\t\t\tconst focusablesInNextRow = getRowFocusables(\n\t\t\t\t\trows[ nextRowIndex ]\n\t\t\t\t);\n\n\t\t\t\t// If for some reason there are no focusables in the next row, do nothing.\n\t\t\t\tif ( ! focusablesInNextRow || ! focusablesInNextRow.length ) {\n\t\t\t\t\t// Prevent key use for anything else. For example, Voiceover\n\t\t\t\t\t// will still focus text when using arrow keys, while this\n\t\t\t\t\t// component should limit navigation to focusables.\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Try to focus the element in the next row that's at a similar column to the activeElement.\n\t\t\t\tconst nextIndex = Math.min(\n\t\t\t\t\tcurrentColumnIndex,\n\t\t\t\t\tfocusablesInNextRow.length - 1\n\t\t\t\t);\n\t\t\t\tfocusablesInNextRow[ nextIndex ].focus();\n\n\t\t\t\t// Let consumers know the row that was originally focused,\n\t\t\t\t// and the row that is now in focus.\n\t\t\t\tonFocusRow( event, activeRow, rows[ nextRowIndex ] );\n\n\t\t\t\t// Prevent key use for anything else. This ensures Voiceover\n\t\t\t\t// doesn't try to handle key navigation.\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t},\n\t\t[ onExpandRow, onCollapseRow, onFocusRow ]\n\t);\n\n\t/* Disable reason: A treegrid is implemented using a table element. */\n\t/* eslint-disable jsx-a11y/no-noninteractive-element-to-interactive-role */\n\treturn (\n\t\t<RovingTabIndexContainer>\n\t\t\t<table\n\t\t\t\t{ ...props }\n\t\t\t\trole=\"treegrid\"\n\t\t\t\tonKeyDown={ onKeyDown }\n\t\t\t\tref={ ref }\n\t\t\t>\n\t\t\t\t<tbody>{ children }</tbody>\n\t\t\t</table>\n\t\t</RovingTabIndexContainer>\n\t);\n\t/* eslint-enable jsx-a11y/no-noninteractive-element-to-interactive-role */\n}\n\nexport default forwardRef( TreeGrid );\nexport { default as TreeGridRow } from './row';\nexport { default as TreeGridCell } from './cell';\nexport { default as TreeGridItem } from './item';\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../../../src/toggle-group-control/toggle-group-control-option/component.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,6BAA6B,EAAoB,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../../../src/toggle-group-control/toggle-group-control-option/component.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,6BAA6B,EAAoB,MAAM,UAAU,CAAC;AA4EhF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,QAAA,MAAM,iCAAiC,8FAGtC,CAAC;AAEF,eAAe,iCAAiC,CAAC"}
|
|
@@ -11,9 +11,5 @@ export declare const ButtonContentView: import("@emotion/styled").StyledComponen
|
|
|
11
11
|
as?: import("react").ElementType<any> | undefined;
|
|
12
12
|
}, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
|
|
13
13
|
export declare const separatorActive: import("@emotion/utils").SerializedStyles;
|
|
14
|
-
export declare const LabelPlaceholderView: import("@emotion/styled").StyledComponent<{
|
|
15
|
-
theme?: import("@emotion/react").Theme | undefined;
|
|
16
|
-
as?: import("react").ElementType<any> | undefined;
|
|
17
|
-
}, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
|
|
18
14
|
export declare const medium: import("@emotion/utils").SerializedStyles;
|
|
19
15
|
//# sourceMappingURL=styles.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/toggle-group-control/toggle-group-control-option/styles.ts"],"names":[],"mappings":";AAWA,eAAO,MAAM,SAAS;;;yGAKrB,CAAC;AAEF,eAAO,MAAM,UAAU,2CAEtB,CAAC;AAEF,eAAO,MAAM,UAAU,2CA+BtB,CAAC;AAEF,eAAO,MAAM,YAAY,2CAGxB,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;
|
|
1
|
+
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/toggle-group-control/toggle-group-control-option/styles.ts"],"names":[],"mappings":";AAWA,eAAO,MAAM,SAAS;;;yGAKrB,CAAC;AAEF,eAAO,MAAM,UAAU,2CAEtB,CAAC;AAEF,eAAO,MAAM,UAAU,2CA+BtB,CAAC;AAEF,eAAO,MAAM,YAAY,2CAGxB,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;yGAG7B,CAAC;AAEF,eAAO,MAAM,eAAe,2CAE3B,CAAC;AAEF,eAAO,MAAM,MAAM,2CAElB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wordpress/components",
|
|
3
|
-
"version": "19.6.1
|
|
3
|
+
"version": "19.6.1",
|
|
4
4
|
"description": "UI components for WordPress.",
|
|
5
5
|
"author": "The WordPress Contributors",
|
|
6
6
|
"license": "GPL-2.0-or-later",
|
|
@@ -37,21 +37,21 @@
|
|
|
37
37
|
"@emotion/styled": "^11.6.0",
|
|
38
38
|
"@emotion/utils": "1.0.0",
|
|
39
39
|
"@use-gesture/react": "^10.2.6",
|
|
40
|
-
"@wordpress/a11y": "^3.
|
|
41
|
-
"@wordpress/compose": "^5.1
|
|
42
|
-
"@wordpress/date": "^4.
|
|
43
|
-
"@wordpress/deprecated": "^3.
|
|
44
|
-
"@wordpress/dom": "^3.
|
|
45
|
-
"@wordpress/element": "^4.1
|
|
46
|
-
"@wordpress/escape-html": "^2.
|
|
47
|
-
"@wordpress/hooks": "^3.
|
|
48
|
-
"@wordpress/i18n": "^4.
|
|
49
|
-
"@wordpress/icons": "^
|
|
50
|
-
"@wordpress/is-shallow-equal": "^4.
|
|
51
|
-
"@wordpress/keycodes": "^3.
|
|
52
|
-
"@wordpress/primitives": "^3.
|
|
53
|
-
"@wordpress/rich-text": "^5.1
|
|
54
|
-
"@wordpress/warning": "^2.
|
|
40
|
+
"@wordpress/a11y": "^3.4.1",
|
|
41
|
+
"@wordpress/compose": "^5.2.1",
|
|
42
|
+
"@wordpress/date": "^4.4.1",
|
|
43
|
+
"@wordpress/deprecated": "^3.4.1",
|
|
44
|
+
"@wordpress/dom": "^3.4.1",
|
|
45
|
+
"@wordpress/element": "^4.2.1",
|
|
46
|
+
"@wordpress/escape-html": "^2.4.1",
|
|
47
|
+
"@wordpress/hooks": "^3.4.1",
|
|
48
|
+
"@wordpress/i18n": "^4.4.1",
|
|
49
|
+
"@wordpress/icons": "^8.0.1",
|
|
50
|
+
"@wordpress/is-shallow-equal": "^4.4.1",
|
|
51
|
+
"@wordpress/keycodes": "^3.4.1",
|
|
52
|
+
"@wordpress/primitives": "^3.2.1",
|
|
53
|
+
"@wordpress/rich-text": "^5.2.1",
|
|
54
|
+
"@wordpress/warning": "^2.4.1",
|
|
55
55
|
"classnames": "^2.3.1",
|
|
56
56
|
"colord": "^2.7.0",
|
|
57
57
|
"dom-scroll-into-view": "^1.2.1",
|
|
@@ -76,5 +76,5 @@
|
|
|
76
76
|
"publishConfig": {
|
|
77
77
|
"access": "public"
|
|
78
78
|
},
|
|
79
|
-
"gitHead": "
|
|
79
|
+
"gitHead": "3494eafea7cb345728166c902b3d1223c4a8db6f"
|
|
80
80
|
}
|
|
@@ -203,7 +203,6 @@ describe( 'FontSizePicker', () => {
|
|
|
203
203
|
);
|
|
204
204
|
const element = screen.getByLabelText( 'Large' );
|
|
205
205
|
expect( element ).toBeInTheDocument();
|
|
206
|
-
expect( element.children ).toHaveLength( 2 );
|
|
207
206
|
expect( element.children[ 0 ].textContent ).toBe( '1.7' );
|
|
208
207
|
} );
|
|
209
208
|
it( 'should use incremental sequence of numbers as labels if we have complex css', () => {
|
|
@@ -223,7 +222,6 @@ describe( 'FontSizePicker', () => {
|
|
|
223
222
|
);
|
|
224
223
|
const element = screen.getByLabelText( 'Large' );
|
|
225
224
|
expect( element ).toBeInTheDocument();
|
|
226
|
-
expect( element.children ).toHaveLength( 2 );
|
|
227
225
|
expect( element.children[ 0 ].textContent ).toBe( '3' );
|
|
228
226
|
} );
|
|
229
227
|
} );
|
|
@@ -122,21 +122,6 @@ exports[`ToggleGroupControl should render correctly 1`] = `
|
|
|
122
122
|
.emotion-11 {
|
|
123
123
|
font-size: 13px;
|
|
124
124
|
line-height: 1;
|
|
125
|
-
position: absolute;
|
|
126
|
-
top: 50%;
|
|
127
|
-
left: 50%;
|
|
128
|
-
-webkit-transform: translate( -50%, -50% );
|
|
129
|
-
-moz-transform: translate( -50%, -50% );
|
|
130
|
-
-ms-transform: translate( -50%, -50% );
|
|
131
|
-
transform: translate( -50%, -50% );
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
.emotion-13 {
|
|
135
|
-
font-size: 13px;
|
|
136
|
-
font-weight: bold;
|
|
137
|
-
height: 0;
|
|
138
|
-
overflow: hidden;
|
|
139
|
-
visibility: hidden;
|
|
140
125
|
}
|
|
141
126
|
|
|
142
127
|
<div
|
|
@@ -180,12 +165,6 @@ exports[`ToggleGroupControl should render correctly 1`] = `
|
|
|
180
165
|
>
|
|
181
166
|
R
|
|
182
167
|
</div>
|
|
183
|
-
<div
|
|
184
|
-
aria-hidden="true"
|
|
185
|
-
class="emotion-13 emotion-14"
|
|
186
|
-
>
|
|
187
|
-
R
|
|
188
|
-
</div>
|
|
189
168
|
</button>
|
|
190
169
|
</div>
|
|
191
170
|
<div
|
|
@@ -208,12 +187,6 @@ exports[`ToggleGroupControl should render correctly 1`] = `
|
|
|
208
187
|
>
|
|
209
188
|
J
|
|
210
189
|
</div>
|
|
211
|
-
<div
|
|
212
|
-
aria-hidden="true"
|
|
213
|
-
class="emotion-13 emotion-14"
|
|
214
|
-
>
|
|
215
|
-
J
|
|
216
|
-
</div>
|
|
217
190
|
</button>
|
|
218
191
|
</div>
|
|
219
192
|
</div>
|
|
@@ -24,7 +24,7 @@ import * as styles from './styles';
|
|
|
24
24
|
import { useCx } from '../../utils/hooks';
|
|
25
25
|
import Tooltip from '../../tooltip';
|
|
26
26
|
|
|
27
|
-
const { ButtonContentView,
|
|
27
|
+
const { ButtonContentView, LabelView } = styles;
|
|
28
28
|
|
|
29
29
|
const WithToolTip = ( { showTooltip, text, children }: WithToolTipProps ) => {
|
|
30
30
|
if ( showTooltip && text ) {
|
|
@@ -88,9 +88,6 @@ function ToggleGroupControlOption(
|
|
|
88
88
|
value={ value }
|
|
89
89
|
>
|
|
90
90
|
<ButtonContentView>{ label }</ButtonContentView>
|
|
91
|
-
<LabelPlaceholderView aria-hidden>
|
|
92
|
-
{ label }
|
|
93
|
-
</LabelPlaceholderView>
|
|
94
91
|
</Radio>
|
|
95
92
|
</WithToolTip>
|
|
96
93
|
</LabelView>
|
|
@@ -61,24 +61,12 @@ export const buttonActive = css`
|
|
|
61
61
|
export const ButtonContentView = styled.div`
|
|
62
62
|
font-size: ${ CONFIG.fontSize };
|
|
63
63
|
line-height: 1;
|
|
64
|
-
position: absolute;
|
|
65
|
-
top: 50%;
|
|
66
|
-
left: 50%;
|
|
67
|
-
transform: translate( -50%, -50% );
|
|
68
64
|
`;
|
|
69
65
|
|
|
70
66
|
export const separatorActive = css`
|
|
71
67
|
background: transparent;
|
|
72
68
|
`;
|
|
73
69
|
|
|
74
|
-
export const LabelPlaceholderView = styled.div`
|
|
75
|
-
font-size: ${ CONFIG.fontSize };
|
|
76
|
-
font-weight: bold;
|
|
77
|
-
height: 0;
|
|
78
|
-
overflow: hidden;
|
|
79
|
-
visibility: hidden;
|
|
80
|
-
`;
|
|
81
|
-
|
|
82
70
|
export const medium = css`
|
|
83
71
|
min-height: ${ CONFIG.controlHeight };
|
|
84
72
|
`;
|
package/src/tree-grid/README.md
CHANGED
|
@@ -114,7 +114,7 @@ Aside from the documented callback functions, any props specified will be passed
|
|
|
114
114
|
|
|
115
115
|
###### onFocusRow( event: Event, startRow: HTMLElement, destinationRow: HTMLElement )
|
|
116
116
|
|
|
117
|
-
Callback that fires when focus is shifted from one row to another via the
|
|
117
|
+
Callback that fires when focus is shifted from one row to another via the Up and Down keys. Callback is also fired on Home and End keys which move focus from the beginning row to the end row.
|
|
118
118
|
The callback is passed the event, the start row element that the focus was on originally, and
|
|
119
119
|
the destination row element after the focus has moved.
|
|
120
120
|
|
package/src/tree-grid/index.js
CHANGED
|
@@ -275,6 +275,10 @@ function TreeGrid(
|
|
|
275
275
|
);
|
|
276
276
|
focusablesInNextRow[ nextIndex ].focus();
|
|
277
277
|
|
|
278
|
+
// Let consumers know the row that was originally focused,
|
|
279
|
+
// and the row that is now in focus.
|
|
280
|
+
onFocusRow( event, activeRow, rows[ nextRowIndex ] );
|
|
281
|
+
|
|
278
282
|
// Prevent key use for anything else. This ensures Voiceover
|
|
279
283
|
// doesn't try to handle key navigation.
|
|
280
284
|
event.preventDefault();
|
|
@@ -6,7 +6,7 @@ import { fireEvent, render, screen } from '@testing-library/react';
|
|
|
6
6
|
/**
|
|
7
7
|
* WordPress dependencies
|
|
8
8
|
*/
|
|
9
|
-
import { LEFT, RIGHT, UP, DOWN } from '@wordpress/keycodes';
|
|
9
|
+
import { LEFT, RIGHT, UP, DOWN, HOME, END } from '@wordpress/keycodes';
|
|
10
10
|
import { forwardRef } from '@wordpress/element';
|
|
11
11
|
|
|
12
12
|
/**
|
|
@@ -68,10 +68,10 @@ describe( 'TreeGrid', () => {
|
|
|
68
68
|
level={ 1 }
|
|
69
69
|
positionInSet={ 1 }
|
|
70
70
|
setSize={ 3 }
|
|
71
|
-
isExpanded={
|
|
71
|
+
isExpanded={ false }
|
|
72
72
|
>
|
|
73
73
|
<TreeGridCell withoutGridItem>
|
|
74
|
-
<TestButton>Row 1</TestButton>
|
|
74
|
+
<TestButton aria-expanded="false">Row 1</TestButton>
|
|
75
75
|
</TreeGridCell>
|
|
76
76
|
</TreeGridRow>
|
|
77
77
|
<TreeGridRow
|
|
@@ -88,7 +88,7 @@ describe( 'TreeGrid', () => {
|
|
|
88
88
|
level={ 1 }
|
|
89
89
|
positionInSet={ 3 }
|
|
90
90
|
setSize={ 3 }
|
|
91
|
-
isExpanded={
|
|
91
|
+
isExpanded={ false }
|
|
92
92
|
>
|
|
93
93
|
<TreeGridCell withoutGridItem>
|
|
94
94
|
<TestButton>Row 3</TestButton>
|
|
@@ -97,16 +97,16 @@ describe( 'TreeGrid', () => {
|
|
|
97
97
|
</TreeGrid>
|
|
98
98
|
);
|
|
99
99
|
|
|
100
|
-
screen.getByText( 'Row
|
|
101
|
-
const
|
|
100
|
+
screen.getByText( 'Row 1' ).focus();
|
|
101
|
+
const row1Element = screen.getByText( 'Row 1' ).closest( 'tr' );
|
|
102
102
|
|
|
103
|
-
fireEvent.keyDown( screen.getByText( 'Row
|
|
103
|
+
fireEvent.keyDown( screen.getByText( 'Row 1' ), {
|
|
104
104
|
key: 'ArrowRight',
|
|
105
105
|
keyCode: RIGHT,
|
|
106
|
-
currentTarget:
|
|
106
|
+
currentTarget: row1Element,
|
|
107
107
|
} );
|
|
108
108
|
|
|
109
|
-
expect( onExpandRow ).toHaveBeenCalledWith(
|
|
109
|
+
expect( onExpandRow ).toHaveBeenCalledWith( row1Element );
|
|
110
110
|
} );
|
|
111
111
|
} );
|
|
112
112
|
|
|
@@ -120,17 +120,17 @@ describe( 'TreeGrid', () => {
|
|
|
120
120
|
level={ 1 }
|
|
121
121
|
positionInSet={ 1 }
|
|
122
122
|
setSize={ 3 }
|
|
123
|
-
isExpanded={
|
|
123
|
+
isExpanded={ true }
|
|
124
124
|
>
|
|
125
125
|
<TreeGridCell withoutGridItem>
|
|
126
|
-
<TestButton>Row 1</TestButton>
|
|
126
|
+
<TestButton aria-expanded="true">Row 1</TestButton>
|
|
127
127
|
</TreeGridCell>
|
|
128
128
|
</TreeGridRow>
|
|
129
129
|
<TreeGridRow
|
|
130
130
|
level={ 1 }
|
|
131
131
|
positionInSet={ 2 }
|
|
132
132
|
setSize={ 3 }
|
|
133
|
-
isExpanded={
|
|
133
|
+
isExpanded={ false }
|
|
134
134
|
>
|
|
135
135
|
<TreeGridCell withoutGridItem>
|
|
136
136
|
<TestButton>Row 2</TestButton>
|
|
@@ -149,16 +149,16 @@ describe( 'TreeGrid', () => {
|
|
|
149
149
|
</TreeGrid>
|
|
150
150
|
);
|
|
151
151
|
|
|
152
|
-
screen.getByText( 'Row
|
|
153
|
-
const
|
|
152
|
+
screen.getByText( 'Row 1' ).focus();
|
|
153
|
+
const row1Element = screen.getByText( 'Row 1' ).closest( 'tr' );
|
|
154
154
|
|
|
155
|
-
fireEvent.keyDown( screen.getByText( 'Row
|
|
155
|
+
fireEvent.keyDown( screen.getByText( 'Row 1' ), {
|
|
156
156
|
key: 'ArrowLeft',
|
|
157
157
|
keyCode: LEFT,
|
|
158
|
-
currentTarget:
|
|
158
|
+
currentTarget: row1Element,
|
|
159
159
|
} );
|
|
160
160
|
|
|
161
|
-
expect( onCollapseRow ).toHaveBeenCalledWith(
|
|
161
|
+
expect( onCollapseRow ).toHaveBeenCalledWith( row1Element );
|
|
162
162
|
} );
|
|
163
163
|
} );
|
|
164
164
|
|
|
@@ -205,6 +205,28 @@ describe( 'TreeGrid', () => {
|
|
|
205
205
|
);
|
|
206
206
|
} );
|
|
207
207
|
|
|
208
|
+
it( 'should call onFocusRow with event, start and end nodes when pressing End', () => {
|
|
209
|
+
const onFocusRow = jest.fn();
|
|
210
|
+
render( <TestTree onFocusRow={ onFocusRow } /> );
|
|
211
|
+
|
|
212
|
+
screen.getByText( 'Row 1' ).focus();
|
|
213
|
+
|
|
214
|
+
const row1Element = screen.getByText( 'Row 1' ).closest( 'tr' );
|
|
215
|
+
const row3Element = screen.getByText( 'Row 3' ).closest( 'tr' );
|
|
216
|
+
|
|
217
|
+
fireEvent.keyDown( screen.getByText( 'Row 1' ), {
|
|
218
|
+
key: 'End',
|
|
219
|
+
keyCode: END,
|
|
220
|
+
currentTarget: row1Element,
|
|
221
|
+
} );
|
|
222
|
+
|
|
223
|
+
expect( onFocusRow ).toHaveBeenCalledWith(
|
|
224
|
+
expect.objectContaining( { key: 'End', keyCode: END } ),
|
|
225
|
+
row1Element,
|
|
226
|
+
row3Element
|
|
227
|
+
);
|
|
228
|
+
} );
|
|
229
|
+
|
|
208
230
|
it( 'should call onFocusRow with event, start and end nodes when pressing Up Arrow', () => {
|
|
209
231
|
const onFocusRow = jest.fn();
|
|
210
232
|
render( <TestTree onFocusRow={ onFocusRow } /> );
|
|
@@ -227,6 +249,28 @@ describe( 'TreeGrid', () => {
|
|
|
227
249
|
);
|
|
228
250
|
} );
|
|
229
251
|
|
|
252
|
+
it( 'should call onFocusRow with event, start and end nodes when pressing Home', () => {
|
|
253
|
+
const onFocusRow = jest.fn();
|
|
254
|
+
render( <TestTree onFocusRow={ onFocusRow } /> );
|
|
255
|
+
|
|
256
|
+
screen.getByText( 'Row 3' ).focus();
|
|
257
|
+
|
|
258
|
+
const row3Element = screen.getByText( 'Row 3' ).closest( 'tr' );
|
|
259
|
+
const row1Element = screen.getByText( 'Row 1' ).closest( 'tr' );
|
|
260
|
+
|
|
261
|
+
fireEvent.keyDown( screen.getByText( 'Row 3' ), {
|
|
262
|
+
key: 'Home',
|
|
263
|
+
keyCode: HOME,
|
|
264
|
+
currentTarget: row3Element,
|
|
265
|
+
} );
|
|
266
|
+
|
|
267
|
+
expect( onFocusRow ).toHaveBeenCalledWith(
|
|
268
|
+
expect.objectContaining( { key: 'Home', keyCode: HOME } ),
|
|
269
|
+
row3Element,
|
|
270
|
+
row1Element
|
|
271
|
+
);
|
|
272
|
+
} );
|
|
273
|
+
|
|
230
274
|
it( 'should call onFocusRow when shift key is held', () => {
|
|
231
275
|
const onFocusRow = jest.fn();
|
|
232
276
|
render( <TestTree onFocusRow={ onFocusRow } /> );
|