Skip to content

Commit 818a44d

Browse files
jsnajdrMamadukaellatrixtyxla
authored
Reset blockEditingModes on RESET_BLOCKS (WordPress#76529)
* Move the blockEditingModes state to state.blocks * Add unit test for blockEditingModes preservation * Preserve valid blockEditingModes on reset Co-authored-by: jsnajdr <jsnajdr@git.wordpress.org> Co-authored-by: Mamaduka <mamaduka@git.wordpress.org> Co-authored-by: ellatrix <ellatrix@git.wordpress.org> Co-authored-by: tyxla <tyxla@git.wordpress.org>
1 parent c1fc48c commit 818a44d

File tree

6 files changed

+310
-157
lines changed

6 files changed

+310
-157
lines changed

packages/block-editor/src/store/private-selectors.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ export const getEnabledClientIdsTree = createRegistrySelector( () =>
147147
createSelector( getEnabledClientIdsTreeUnmemoized, ( state ) => [
148148
state.blocks.order,
149149
state.derivedBlockEditingModes,
150-
state.blockEditingModes,
150+
state.blocks.blockEditingModes,
151151
] )
152152
);
153153

@@ -170,7 +170,7 @@ export const getEnabledBlockParents = createSelector(
170170
},
171171
( state ) => [
172172
state.blocks.parents,
173-
state.blockEditingModes,
173+
state.blocks.blockEditingModes,
174174
state.settings.templateLock,
175175
state.blockListSettings,
176176
]

packages/block-editor/src/store/reducer.js

Lines changed: 33 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -693,6 +693,16 @@ const withBlockReset = ( reducer ) => ( state, action ) => {
693693
controlledOrder.forEach( preserveTreeEntry );
694694
}
695695

696+
// Preserve block editing modes for blocks that are not removed.
697+
const preservedBlockEditingModes =
698+
state?.blockEditingModes ?? new Map();
699+
for ( const [ clientId, mode ] of preservedBlockEditingModes ) {
700+
if ( ! newState.tree.has( clientId ) ) {
701+
continue;
702+
}
703+
newState.blockEditingModes.set( clientId, mode );
704+
}
705+
696706
return newState;
697707
}
698708

@@ -1283,6 +1293,25 @@ export const blocks = pipe(
12831293
}
12841294
return state;
12851295
},
1296+
1297+
blockEditingModes( state = new Map(), action ) {
1298+
switch ( action.type ) {
1299+
case 'SET_BLOCK_EDITING_MODE':
1300+
if ( state.get( action.clientId ) === action.mode ) {
1301+
return state;
1302+
}
1303+
return new Map( state ).set( action.clientId, action.mode );
1304+
case 'UNSET_BLOCK_EDITING_MODE': {
1305+
if ( ! state.has( action.clientId ) ) {
1306+
return state;
1307+
}
1308+
const newState = new Map( state );
1309+
newState.delete( action.clientId );
1310+
return newState;
1311+
}
1312+
}
1313+
return state;
1314+
},
12861315
} );
12871316

12881317
/**
@@ -2127,38 +2156,6 @@ export function editedContentOnlySection( state, action ) {
21272156
return state;
21282157
}
21292158

2130-
/**
2131-
* Reducer returning a map of block client IDs to block editing modes.
2132-
*
2133-
* @param {Map} state Current state.
2134-
* @param {Object} action Dispatched action.
2135-
*
2136-
* @return {Map} Updated state.
2137-
*/
2138-
export function blockEditingModes( state = new Map(), action ) {
2139-
switch ( action.type ) {
2140-
case 'SET_BLOCK_EDITING_MODE':
2141-
if ( state.get( action.clientId ) === action.mode ) {
2142-
return state;
2143-
}
2144-
return new Map( state ).set( action.clientId, action.mode );
2145-
case 'UNSET_BLOCK_EDITING_MODE': {
2146-
if ( ! state.has( action.clientId ) ) {
2147-
return state;
2148-
}
2149-
const newState = new Map( state );
2150-
newState.delete( action.clientId );
2151-
return newState;
2152-
}
2153-
case 'RESET_BLOCKS': {
2154-
return state.has( '' )
2155-
? new Map().set( '', state.get( '' ) )
2156-
: state;
2157-
}
2158-
}
2159-
return state;
2160-
}
2161-
21622159
/**
21632160
* Reducer returning a map of style IDs to style overrides.
21642161
*
@@ -2395,7 +2392,6 @@ const combinedReducers = combineReducers( {
23952392
editedContentOnlySection,
23962393
blockVisibility,
23972394
viewportModalClientIds,
2398-
blockEditingModes,
23992395
styleOverrides,
24002396
removalPromptData,
24012397
blockRemovalRules,
@@ -2526,7 +2522,7 @@ function getDerivedBlockEditingModesForTree( state, treeClientId = '' ) {
25262522
// so the default block editing mode is set to disabled.
25272523
const sectionRootClientId = state.settings?.[ sectionRootClientIdKey ];
25282524
const sectionClientIds = state.blocks.order.get( sectionRootClientId );
2529-
const hasDisabledBlocks = Array.from( state.blockEditingModes ).some(
2525+
const hasDisabledBlocks = Array.from( state.blocks.blockEditingModes ).some(
25302526
( [ , mode ] ) => mode === 'disabled'
25312527
);
25322528
const templatePartClientIds = [];
@@ -2602,7 +2598,7 @@ function getDerivedBlockEditingModesForTree( state, treeClientId = '' ) {
26022598

26032599
// If the block already has an explicit block editing mode set,
26042600
// don't override it.
2605-
if ( state.blockEditingModes.has( clientId ) ) {
2601+
if ( state.blocks.blockEditingModes.has( clientId ) ) {
26062602
return;
26072603
}
26082604

@@ -2613,12 +2609,12 @@ function getDerivedBlockEditingModesForTree( state, treeClientId = '' ) {
26132609
let ancestorBlockEditingMode;
26142610
let parent = state.blocks.parents.get( clientId );
26152611
while ( parent !== undefined ) {
2616-
if ( state.blockEditingModes.has( parent ) ) {
2612+
if ( state.blocks.blockEditingModes.has( parent ) ) {
26172613
// Checking the explicit block editing mode will be slower,
26182614
// as the block editing mode is more likely to be set on a
26192615
// distant ancestor.
26202616
ancestorBlockEditingMode =
2621-
state.blockEditingModes.get( parent );
2617+
state.blocks.blockEditingModes.get( parent );
26222618
}
26232619
if ( ancestorBlockEditingMode ) {
26242620
break;

packages/block-editor/src/store/selectors.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3242,8 +3242,8 @@ export function getBlockEditingMode( state, clientId = '' ) {
32423242
}
32433243

32443244
// In normal mode, consider that an explicitly set editing mode takes over.
3245-
if ( state.blockEditingModes.has( clientId ) ) {
3246-
return state.blockEditingModes.get( clientId );
3245+
if ( state.blocks.blockEditingModes.has( clientId ) ) {
3246+
return state.blocks.blockEditingModes.get( clientId );
32473247
}
32483248

32493249
return 'default';

packages/block-editor/src/store/test/private-selectors.js

Lines changed: 67 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -131,12 +131,12 @@ describe( 'private selectors', () => {
131131
'9b9c5c3f-2e46-4f02-9e14-9fe9515b958f',
132132
],
133133
] ),
134+
blockEditingModes: new Map( [] ),
134135
},
135136
blockListSettings: {
136137
'ef45d5fd-5234-4fd5-ac4f-c3736c7f9337': {},
137138
'9b9c5c3f-2e46-4f02-9e14-9fe9515b958f': {},
138139
},
139-
blockEditingModes: new Map( [] ),
140140
derivedBlockEditingModes: new Map( [] ),
141141
};
142142

@@ -152,7 +152,10 @@ describe( 'private selectors', () => {
152152
it( 'should return false when top level block is not disabled', () => {
153153
const state = {
154154
...baseState,
155-
blockEditingModes: new Map( [] ),
155+
blocks: {
156+
...baseState.blocks,
157+
blockEditingModes: new Map( [] ),
158+
},
156159
derivedBlockEditingModes: new Map( [] ),
157160
};
158161
expect(
@@ -166,9 +169,12 @@ describe( 'private selectors', () => {
166169
it( 'should return true when top level block is disabled and there are no editing modes within it', () => {
167170
const state = {
168171
...baseState,
169-
blockEditingModes: new Map( [
170-
[ 'ef45d5fd-5234-4fd5-ac4f-c3736c7f9337', 'disabled' ],
171-
] ),
172+
blocks: {
173+
...baseState.blocks,
174+
blockEditingModes: new Map( [
175+
[ 'ef45d5fd-5234-4fd5-ac4f-c3736c7f9337', 'disabled' ],
176+
] ),
177+
},
172178
derivedBlockEditingModes: new Map( [
173179
[ 'b26fc763-417d-4f01-b81c-2ec61e14a972', 'disabled' ],
174180
[ '9b9c5c3f-2e46-4f02-9e14-9fe9515b958f', 'disabled' ],
@@ -187,7 +193,10 @@ describe( 'private selectors', () => {
187193
it( 'should return true when top level block is disabled via inheritance and there are no editing modes within it', () => {
188194
const state = {
189195
...baseState,
190-
blockEditingModes: new Map( [ [ '', 'disabled' ] ] ),
196+
blocks: {
197+
...baseState.blocks,
198+
blockEditingModes: new Map( [ [ '', 'disabled' ] ] ),
199+
},
191200
derivedBlockEditingModes: new Map( [
192201
[ '6cf70164-9097-4460-bcbf-200560546988', 'disabled' ],
193202
[ 'ef45d5fd-5234-4fd5-ac4f-c3736c7f9337', 'disabled' ],
@@ -208,10 +217,13 @@ describe( 'private selectors', () => {
208217
it( 'should return true when top level block is disabled and there are disabled editing modes within it', () => {
209218
const state = {
210219
...baseState,
211-
blockEditingModes: new Map( [
212-
[ 'ef45d5fd-5234-4fd5-ac4f-c3736c7f9337', 'disabled' ],
213-
[ 'b3247f75-fd94-4fef-97f9-5bfd162cc416', 'disabled' ],
214-
] ),
220+
blocks: {
221+
...baseState.blocks,
222+
blockEditingModes: new Map( [
223+
[ 'ef45d5fd-5234-4fd5-ac4f-c3736c7f9337', 'disabled' ],
224+
[ 'b3247f75-fd94-4fef-97f9-5bfd162cc416', 'disabled' ],
225+
] ),
226+
},
215227
derivedBlockEditingModes: new Map( [
216228
[ 'b26fc763-417d-4f01-b81c-2ec61e14a972', 'disabled' ],
217229
[ '9b9c5c3f-2e46-4f02-9e14-9fe9515b958f', 'disabled' ],
@@ -229,10 +241,13 @@ describe( 'private selectors', () => {
229241
it( 'should return false when top level block is disabled and there are non-disabled editing modes within it', () => {
230242
const state = {
231243
...baseState,
232-
blockEditingModes: new Map( [
233-
[ 'ef45d5fd-5234-4fd5-ac4f-c3736c7f9337', 'disabled' ],
234-
[ 'b3247f75-fd94-4fef-97f9-5bfd162cc416', 'default' ],
235-
] ),
244+
blocks: {
245+
...baseState.blocks,
246+
blockEditingModes: new Map( [
247+
[ 'ef45d5fd-5234-4fd5-ac4f-c3736c7f9337', 'disabled' ],
248+
[ 'b3247f75-fd94-4fef-97f9-5bfd162cc416', 'default' ],
249+
] ),
250+
},
236251
derivedBlockEditingModes: new Map( [
237252
[ 'b26fc763-417d-4f01-b81c-2ec61e14a972', 'disabled' ],
238253
[ '9b9c5c3f-2e46-4f02-9e14-9fe9515b958f', 'disabled' ],
@@ -250,10 +265,13 @@ describe( 'private selectors', () => {
250265
it( 'should return false when top level block is disabled via inheritance and there are non-disabled editing modes within it', () => {
251266
const state = {
252267
...baseState,
253-
blockEditingModes: new Map( [
254-
[ '', 'disabled' ],
255-
[ 'b3247f75-fd94-4fef-97f9-5bfd162cc416', 'default' ],
256-
] ),
268+
blocks: {
269+
...baseState.blocks,
270+
blockEditingModes: new Map( [
271+
[ '', 'disabled' ],
272+
[ 'b3247f75-fd94-4fef-97f9-5bfd162cc416', 'default' ],
273+
] ),
274+
},
257275
derivedBlockEditingModes: new Map( [
258276
[ '6cf70164-9097-4460-bcbf-200560546988', 'disabled' ],
259277
[ 'ef45d5fd-5234-4fd5-ac4f-c3736c7f9337', 'disabled' ],
@@ -343,7 +361,10 @@ describe( 'private selectors', () => {
343361
it( 'should return tree containing only clientId and innerBlocks', () => {
344362
const state = {
345363
...baseState,
346-
blockEditingModes: new Map( [] ),
364+
blocks: {
365+
...baseState.blocks,
366+
blockEditingModes: new Map( [] ),
367+
},
347368
derivedBlockEditingModes: new Map( [] ),
348369
};
349370
expect( getEnabledClientIdsTree( state ) ).toEqual( [
@@ -381,7 +402,10 @@ describe( 'private selectors', () => {
381402
it( 'should return a subtree when rootBlockClientId is given', () => {
382403
const state = {
383404
...baseState,
384-
blockEditingModes: new Map( [] ),
405+
blocks: {
406+
...baseState.blocks,
407+
blockEditingModes: new Map( [] ),
408+
},
385409
derivedBlockEditingModes: new Map( [] ),
386410
};
387411
expect(
@@ -413,11 +437,20 @@ describe( 'private selectors', () => {
413437
it( 'should filter out disabled blocks', () => {
414438
const state = {
415439
...baseState,
416-
blockEditingModes: new Map( [
417-
[ '', 'disabled' ],
418-
[ 'b26fc763-417d-4f01-b81c-2ec61e14a972', 'contentOnly' ],
419-
[ '9b9c5c3f-2e46-4f02-9e14-9fe9515b958f', 'contentOnly' ],
420-
] ),
440+
blocks: {
441+
...baseState.blocks,
442+
blockEditingModes: new Map( [
443+
[ '', 'disabled' ],
444+
[
445+
'b26fc763-417d-4f01-b81c-2ec61e14a972',
446+
'contentOnly',
447+
],
448+
[
449+
'9b9c5c3f-2e46-4f02-9e14-9fe9515b958f',
450+
'contentOnly',
451+
],
452+
] ),
453+
},
421454
derivedBlockEditingModes: new Map( [
422455
[ '6cf70164-9097-4460-bcbf-200560546988', 'disabled' ],
423456
[ 'ef45d5fd-5234-4fd5-ac4f-c3736c7f9337', 'disabled' ],
@@ -457,8 +490,8 @@ describe( 'private selectors', () => {
457490
[ '6cf70164-9097-4460-bcbf-200560546988', [] ],
458491
[ '', [ '6cf70164-9097-4460-bcbf-200560546988' ] ],
459492
] ),
493+
blockEditingModes: new Map(),
460494
},
461-
blockEditingModes: new Map(),
462495
derivedBlockEditingModes: new Map(),
463496
};
464497
expect(
@@ -503,11 +536,11 @@ describe( 'private selectors', () => {
503536
[ '4c2b7140-fffd-44b4-b2a7-820c670a6514' ],
504537
],
505538
] ),
539+
blockEditingModes: new Map( [
540+
[ '', 'disabled' ],
541+
[ 'e178812d-ce5e-48c7-a945-8ae4ffcbbb7c', 'default' ],
542+
] ),
506543
},
507-
blockEditingModes: new Map( [
508-
[ '', 'disabled' ],
509-
[ 'e178812d-ce5e-48c7-a945-8ae4ffcbbb7c', 'default' ],
510-
] ),
511544
derivedBlockEditingModes: new Map( [
512545
[ 'ef45d5fd-5234-4fd5-ac4f-c3736c7f9337', 'disabled' ],
513546
[ '9b9c5c3f-2e46-4f02-9e14-9fe9515b958f', 'disabled' ],
@@ -556,11 +589,11 @@ describe( 'private selectors', () => {
556589
[ '4c2b7140-fffd-44b4-b2a7-820c670a6514' ],
557590
],
558591
] ),
592+
blockEditingModes: new Map( [
593+
[ '', 'disabled' ],
594+
[ '9b9c5c3f-2e46-4f02-9e14-9fe9515b958f', 'default' ],
595+
] ),
559596
},
560-
blockEditingModes: new Map( [
561-
[ '', 'disabled' ],
562-
[ '9b9c5c3f-2e46-4f02-9e14-9fe9515b958f', 'default' ],
563-
] ),
564597
derivedBlockEditingModes: new Map( [
565598
[ 'ef45d5fd-5234-4fd5-ac4f-c3736c7f9337', 'disabled' ],
566599
] ),

0 commit comments

Comments
 (0)