Skip to content

Commit 727f350

Browse files
andrewserongMamadukaellatrix
authored
List View: Support insert before/after keyboard shortcuts when focus is within the list view (#60651)
* List View: Support insert before/after keyboard shortcuts when focus is within the list view * Update tests Co-authored-by: andrewserong <[email protected]> Co-authored-by: Mamaduka <[email protected]> Co-authored-by: ellatrix <[email protected]>
1 parent 73ee882 commit 727f350

File tree

2 files changed

+70
-5
lines changed

2 files changed

+70
-5
lines changed

packages/block-editor/src/components/list-view/block-select-button.js

+31-2
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,13 @@ function ListViewBlockSelectButton(
6868
getBlocksByClientId,
6969
canRemoveBlocks,
7070
} = useSelect( blockEditorStore );
71-
const { duplicateBlocks, multiSelect, removeBlocks } =
72-
useDispatch( blockEditorStore );
71+
const {
72+
duplicateBlocks,
73+
multiSelect,
74+
removeBlocks,
75+
insertAfterBlock,
76+
insertBeforeBlock,
77+
} = useDispatch( blockEditorStore );
7378
const isMatch = useShortcutEventMatch();
7479
const isSticky = blockInformation?.positionType === 'sticky';
7580
const images = useListViewImages( { clientId, isExpanded } );
@@ -189,6 +194,30 @@ function ListViewBlockSelectButton(
189194
updateFocusAndSelection( updatedBlocks[ 0 ], false );
190195
}
191196
}
197+
} else if ( isMatch( 'core/block-editor/insert-before', event ) ) {
198+
if ( event.defaultPrevented ) {
199+
return;
200+
}
201+
event.preventDefault();
202+
203+
const { blocksToUpdate } = getBlocksToUpdate();
204+
await insertBeforeBlock( blocksToUpdate[ 0 ] );
205+
const newlySelectedBlocks = getSelectedBlockClientIds();
206+
207+
// Focus the first block of the newly inserted blocks, to keep focus within the list view.
208+
updateFocusAndSelection( newlySelectedBlocks[ 0 ], false );
209+
} else if ( isMatch( 'core/block-editor/insert-after', event ) ) {
210+
if ( event.defaultPrevented ) {
211+
return;
212+
}
213+
event.preventDefault();
214+
215+
const { blocksToUpdate } = getBlocksToUpdate();
216+
await insertAfterBlock( blocksToUpdate.at( -1 ) );
217+
const newlySelectedBlocks = getSelectedBlockClientIds();
218+
219+
// Focus the first block of the newly inserted blocks, to keep focus within the list view.
220+
updateFocusAndSelection( newlySelectedBlocks[ 0 ], false );
192221
} else if ( isMatch( 'core/block-editor/select-all', event ) ) {
193222
if ( event.defaultPrevented ) {
194223
return;

test/e2e/specs/editor/various/list-view.spec.js

+39-3
Original file line numberDiff line numberDiff line change
@@ -496,7 +496,7 @@ test.describe( 'List View', () => {
496496
).toBeFocused();
497497
} );
498498

499-
test( 'should cut, copy, paste, select, duplicate, delete, and deselect blocks using keyboard', async ( {
499+
test( 'should cut, copy, paste, select, duplicate, insert, delete, and deselect blocks using keyboard', async ( {
500500
editor,
501501
page,
502502
pageUtils,
@@ -663,8 +663,44 @@ test.describe( 'List View', () => {
663663
{ name: 'core/file', focused: true },
664664
] );
665665

666-
// Move focus to the first file block, and then delete it.
667-
await page.keyboard.press( 'ArrowUp' );
666+
// Test insert before.
667+
await pageUtils.pressKeys( 'primaryAlt+t' );
668+
669+
await expect
670+
.poll(
671+
listViewUtils.getBlocksWithA11yAttributes,
672+
'Inserting a block before should move selection and focus to the inserted block.'
673+
)
674+
.toMatchObject( [
675+
{ name: 'core/group' },
676+
{ name: 'core/columns' },
677+
{ name: 'core/file', selected: false },
678+
{ name: 'core/paragraph', focused: true, selected: true },
679+
{ name: 'core/file', selected: false },
680+
] );
681+
682+
// Test insert after.
683+
await pageUtils.pressKeys( 'primaryAlt+y' );
684+
685+
await expect
686+
.poll(
687+
listViewUtils.getBlocksWithA11yAttributes,
688+
'Inserting a block before should move selection and focus to the inserted block.'
689+
)
690+
.toMatchObject( [
691+
{ name: 'core/group' },
692+
{ name: 'core/columns' },
693+
{ name: 'core/file', selected: false },
694+
{ name: 'core/paragraph', focused: false, selected: false },
695+
{ name: 'core/paragraph', focused: true, selected: true },
696+
{ name: 'core/file', selected: false },
697+
] );
698+
699+
// Remove the inserted blocks.
700+
await page.keyboard.press( 'Delete' );
701+
await page.keyboard.press( 'Delete' );
702+
703+
// Delete the first File block.
668704
await page.keyboard.press( 'Delete' );
669705
await expect
670706
.poll(

0 commit comments

Comments
 (0)