@wordpress/editor 14.48.2-next.v.202606191442.0 → 14.49.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.
Files changed (94) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/README.md +5 -13
  3. package/build/components/autosave-monitor/index.cjs +40 -83
  4. package/build/components/autosave-monitor/index.cjs.map +3 -3
  5. package/build/components/post-publish-panel/postpublish.cjs +0 -1
  6. package/build/components/post-publish-panel/postpublish.cjs.map +2 -2
  7. package/build/components/post-status/index.cjs +0 -1
  8. package/build/components/post-status/index.cjs.map +2 -2
  9. package/build/components/post-taxonomies/hierarchical-term-selector.cjs +0 -1
  10. package/build/components/post-taxonomies/hierarchical-term-selector.cjs.map +2 -2
  11. package/build/components/post-template/create-new-template-modal.cjs +0 -1
  12. package/build/components/post-template/create-new-template-modal.cjs.map +2 -2
  13. package/build/components/post-text-editor/utils.cjs +2 -2
  14. package/build/components/post-text-editor/utils.cjs.map +1 -1
  15. package/build/components/post-visibility/index.cjs +0 -1
  16. package/build/components/post-visibility/index.cjs.map +2 -2
  17. package/build/components/provider/disable-non-page-content-blocks.cjs +23 -3
  18. package/build/components/provider/disable-non-page-content-blocks.cjs.map +2 -2
  19. package/build/components/provider/navigation-block-editing-mode.cjs +9 -2
  20. package/build/components/provider/navigation-block-editing-mode.cjs.map +2 -2
  21. package/build/components/provider/use-block-editor-settings.cjs +2 -1
  22. package/build/components/provider/use-block-editor-settings.cjs.map +2 -2
  23. package/build/components/sidebar/dataform-post-summary.cjs +87 -32
  24. package/build/components/sidebar/dataform-post-summary.cjs.map +3 -3
  25. package/build/components/sidebar/post-summary.cjs +8 -6
  26. package/build/components/sidebar/post-summary.cjs.map +3 -3
  27. package/build/dataviews/store/private-actions.cjs +3 -1
  28. package/build/dataviews/store/private-actions.cjs.map +2 -2
  29. package/build/store/private-actions.cjs +2 -2
  30. package/build/store/private-actions.cjs.map +2 -2
  31. package/build-module/components/autosave-monitor/index.mjs +42 -81
  32. package/build-module/components/autosave-monitor/index.mjs.map +2 -2
  33. package/build-module/components/post-publish-panel/postpublish.mjs +0 -1
  34. package/build-module/components/post-publish-panel/postpublish.mjs.map +2 -2
  35. package/build-module/components/post-status/index.mjs +0 -1
  36. package/build-module/components/post-status/index.mjs.map +2 -2
  37. package/build-module/components/post-taxonomies/hierarchical-term-selector.mjs +0 -1
  38. package/build-module/components/post-taxonomies/hierarchical-term-selector.mjs.map +2 -2
  39. package/build-module/components/post-template/create-new-template-modal.mjs +0 -1
  40. package/build-module/components/post-template/create-new-template-modal.mjs.map +2 -2
  41. package/build-module/components/post-text-editor/utils.mjs +2 -2
  42. package/build-module/components/post-text-editor/utils.mjs.map +1 -1
  43. package/build-module/components/post-visibility/index.mjs +0 -1
  44. package/build-module/components/post-visibility/index.mjs.map +2 -2
  45. package/build-module/components/provider/disable-non-page-content-blocks.mjs +23 -3
  46. package/build-module/components/provider/disable-non-page-content-blocks.mjs.map +2 -2
  47. package/build-module/components/provider/navigation-block-editing-mode.mjs +10 -3
  48. package/build-module/components/provider/navigation-block-editing-mode.mjs.map +2 -2
  49. package/build-module/components/provider/use-block-editor-settings.mjs +2 -1
  50. package/build-module/components/provider/use-block-editor-settings.mjs.map +2 -2
  51. package/build-module/components/sidebar/dataform-post-summary.mjs +88 -33
  52. package/build-module/components/sidebar/dataform-post-summary.mjs.map +2 -2
  53. package/build-module/components/sidebar/post-summary.mjs +8 -6
  54. package/build-module/components/sidebar/post-summary.mjs.map +2 -2
  55. package/build-module/dataviews/store/private-actions.mjs +5 -1
  56. package/build-module/dataviews/store/private-actions.mjs.map +2 -2
  57. package/build-module/store/private-actions.mjs +2 -2
  58. package/build-module/store/private-actions.mjs.map +2 -2
  59. package/build-style/style-rtl.css +29 -33
  60. package/build-style/style.css +29 -33
  61. package/build-types/components/autosave-monitor/index.d.ts +11 -29
  62. package/build-types/components/autosave-monitor/index.d.ts.map +1 -1
  63. package/build-types/components/post-publish-panel/postpublish.d.ts.map +1 -1
  64. package/build-types/components/post-status/index.d.ts.map +1 -1
  65. package/build-types/components/post-taxonomies/hierarchical-term-selector.d.ts.map +1 -1
  66. package/build-types/components/post-template/create-new-template-modal.d.ts.map +1 -1
  67. package/build-types/components/post-visibility/index.d.ts.map +1 -1
  68. package/build-types/components/provider/disable-non-page-content-blocks.d.ts.map +1 -1
  69. package/build-types/components/provider/navigation-block-editing-mode.d.ts.map +1 -1
  70. package/build-types/components/provider/use-block-editor-settings.d.ts.map +1 -1
  71. package/build-types/components/sidebar/dataform-post-summary.d.ts.map +1 -1
  72. package/build-types/components/sidebar/post-summary.d.ts.map +1 -1
  73. package/build-types/dataviews/store/private-actions.d.ts.map +1 -1
  74. package/build-types/utils/get-template-part-icon.d.ts.map +1 -1
  75. package/package.json +46 -46
  76. package/src/components/autosave-monitor/index.js +69 -104
  77. package/src/components/autosave-monitor/test/index.js +137 -122
  78. package/src/components/plugin-post-publish-panel/test/__snapshots__/index.js.snap +1 -0
  79. package/src/components/post-publish-panel/postpublish.js +0 -1
  80. package/src/components/post-publish-panel/test/__snapshots__/index.js.snap +7 -2
  81. package/src/components/post-saved-state/test/__snapshots__/index.js.snap +1 -0
  82. package/src/components/post-status/index.js +0 -1
  83. package/src/components/post-taxonomies/hierarchical-term-selector.js +0 -1
  84. package/src/components/post-template/create-new-template-modal.js +0 -1
  85. package/src/components/post-text-editor/utils.js +2 -2
  86. package/src/components/post-visibility/index.js +0 -1
  87. package/src/components/provider/disable-non-page-content-blocks.js +23 -6
  88. package/src/components/provider/navigation-block-editing-mode.js +10 -4
  89. package/src/components/provider/use-block-editor-settings.js +3 -1
  90. package/src/components/sidebar/dataform-post-summary.js +133 -49
  91. package/src/components/sidebar/post-summary.js +12 -10
  92. package/src/dataviews/store/private-actions.ts +8 -1
  93. package/src/store/private-actions.js +2 -2
  94. package/src/store/test/actions.js +2 -2
@@ -3,195 +3,210 @@
3
3
  */
4
4
  import { render } from '@testing-library/react';
5
5
 
6
+ /**
7
+ * WordPress dependencies
8
+ */
9
+ import { useSelect, useDispatch } from '@wordpress/data';
10
+
6
11
  /**
7
12
  * Internal dependencies
8
13
  */
9
- import { AutosaveMonitor } from '../';
14
+ import AutosaveMonitor from '../';
15
+
16
+ jest.mock( '@wordpress/data/src/components/use-select', () => jest.fn() );
17
+ jest.mock( '@wordpress/data/src/components/use-dispatch', () => ( {
18
+ useDispatch: jest.fn(),
19
+ } ) );
10
20
 
11
21
  jest.useFakeTimers();
12
- jest.spyOn( global, 'clearTimeout' );
13
- jest.spyOn( global, 'setTimeout' );
22
+ jest.spyOn( global, 'clearInterval' );
23
+ jest.spyOn( global, 'setInterval' );
24
+
25
+ // The current edited-post state, read live by the mocked selectors so it can be
26
+ // changed between timer ticks without re-rendering the component.
27
+ let state;
28
+
29
+ function setState( overrides = {} ) {
30
+ state = {
31
+ editsReference: 1,
32
+ isDirty: false,
33
+ isAutosaveable: false,
34
+ isAutosaving: false,
35
+ autosaveInterval: 10,
36
+ ...overrides,
37
+ };
38
+ }
14
39
 
15
40
  describe( 'AutosaveMonitor', () => {
16
- let setAutosaveTimerSpy;
17
41
  beforeEach( () => {
18
- setAutosaveTimerSpy = jest.spyOn(
19
- AutosaveMonitor.prototype,
20
- 'setAutosaveTimer'
21
- );
22
- } );
23
-
24
- afterEach( () => {
25
- setAutosaveTimerSpy.mockClear();
42
+ setState();
43
+ // `useSelect( store )` (static mode) returns bound selectors; the
44
+ // component destructures the ones it needs from each call. The mapping
45
+ // form `useSelect( mapSelect )` receives a `select` that resolves to the
46
+ // same selectors.
47
+ useSelect.mockImplementation( ( mapSelectOrStore ) => {
48
+ const selectors = {
49
+ getReferenceByDistinctEdits: () => state.editsReference,
50
+ isEditedPostDirty: () => state.isDirty,
51
+ isEditedPostAutosaveable: () => state.isAutosaveable,
52
+ isAutosavingPost: () => state.isAutosaving,
53
+ getEditorSettings: () => ( {
54
+ autosaveInterval: state.autosaveInterval,
55
+ } ),
56
+ };
57
+ if ( typeof mapSelectOrStore === 'function' ) {
58
+ return mapSelectOrStore( () => selectors );
59
+ }
60
+ return selectors;
61
+ } );
62
+ useDispatch.mockReturnValue( { autosave: jest.fn() } );
63
+ setInterval.mockClear();
64
+ clearInterval.mockClear();
26
65
  } );
27
66
 
28
67
  it( 'should render nothing', () => {
29
- const { container } = render( <AutosaveMonitor isDirty /> );
68
+ const { container } = render( <AutosaveMonitor /> );
30
69
 
31
70
  expect( container ).toBeEmptyDOMElement();
32
71
  } );
33
72
 
34
- it( 'should start autosave timer after being mounted', () => {
35
- render( <AutosaveMonitor isDirty /> );
73
+ it( 'should start the autosave timer after being mounted', () => {
74
+ render( <AutosaveMonitor /> );
36
75
 
37
- expect( setAutosaveTimerSpy ).toHaveBeenCalled();
76
+ expect( setInterval ).toHaveBeenCalled();
38
77
  } );
39
78
 
40
79
  it( 'should clear the autosave timer after being unmounted', () => {
41
- const { rerender } = render( <AutosaveMonitor isDirty /> );
80
+ const { rerender } = render( <AutosaveMonitor /> );
42
81
 
43
82
  rerender( <div /> );
44
83
 
45
- expect( clearTimeout ).toHaveBeenCalled();
84
+ expect( clearInterval ).toHaveBeenCalled();
46
85
  } );
47
86
 
48
- it( 'should clear and restart autosave timer when the interval changes', () => {
49
- const { rerender } = render( <AutosaveMonitor isDirty /> );
87
+ it( 'should restart the autosave timer when the interval changes', () => {
88
+ const { rerender } = render( <AutosaveMonitor interval={ 10 } /> );
50
89
 
51
- rerender( <AutosaveMonitor isDirty interval={ 999 } /> );
90
+ setInterval.mockClear();
91
+ clearInterval.mockClear();
92
+ rerender( <AutosaveMonitor interval={ 999 } /> );
52
93
 
53
- expect( clearTimeout ).toHaveBeenCalled();
54
- expect( setAutosaveTimerSpy ).toHaveBeenCalledTimes( 2 );
94
+ expect( clearInterval ).toHaveBeenCalled();
95
+ expect( setInterval ).toHaveBeenCalledTimes( 1 );
55
96
  } );
56
97
 
57
- it( 'should autosave when `editReference` changes', () => {
58
- const autosave = jest.fn();
59
- const { rerender } = render(
60
- <AutosaveMonitor isDirty isAutosaveable autosave={ autosave } />
61
- );
62
-
63
- expect( autosave ).not.toHaveBeenCalled();
98
+ it( 'should schedule the timer using the interval in seconds', () => {
99
+ render( <AutosaveMonitor interval={ 5 } /> );
64
100
 
65
- rerender(
66
- <AutosaveMonitor
67
- isDirty
68
- isAutosaveable
69
- autosave={ autosave }
70
- editsReference={ [] }
71
- />
101
+ expect( setInterval ).toHaveBeenLastCalledWith(
102
+ expect.any( Function ),
103
+ 5000
72
104
  );
105
+ } );
73
106
 
74
- jest.runOnlyPendingTimers();
107
+ it( 'should fall back to the editor autosaveInterval setting', () => {
108
+ setState( { autosaveInterval: 7 } );
109
+ render( <AutosaveMonitor /> );
75
110
 
76
- expect( autosave ).toHaveBeenCalledTimes( 1 );
111
+ expect( setInterval ).toHaveBeenLastCalledWith(
112
+ expect.any( Function ),
113
+ 7000
114
+ );
77
115
  } );
78
116
 
79
- it( 'should autosave when `editReference` changes and the post becomes dirty', () => {
117
+ it( 'should autosave a dirty, autosaveable post on the timer tick', () => {
80
118
  const autosave = jest.fn();
81
- const { rerender } = render(
82
- <AutosaveMonitor isAutosaveable autosave={ autosave } />
83
- );
119
+ setState( { isDirty: true, isAutosaveable: true } );
120
+ render( <AutosaveMonitor autosave={ autosave } interval={ 5 } /> );
84
121
 
85
122
  expect( autosave ).not.toHaveBeenCalled();
86
123
 
87
- rerender(
88
- <AutosaveMonitor
89
- isDirty
90
- isAutosaveable
91
- autosave={ autosave }
92
- editsReference={ [] }
93
- />
94
- );
95
-
96
- jest.runOnlyPendingTimers();
124
+ jest.advanceTimersByTime( 5000 );
97
125
 
98
126
  expect( autosave ).toHaveBeenCalledTimes( 1 );
99
127
  } );
100
128
 
101
- it( 'should not autosave when `editReference` changes and the post is not dirty anymore', () => {
129
+ it( 'should not autosave when the post is not dirty', () => {
102
130
  const autosave = jest.fn();
103
- const { rerender } = render(
104
- <AutosaveMonitor isDirty isAutosaveable autosave={ autosave } />
105
- );
131
+ setState( { isDirty: false, isAutosaveable: true } );
132
+ render( <AutosaveMonitor autosave={ autosave } interval={ 5 } /> );
133
+
134
+ jest.advanceTimersByTime( 5000 );
106
135
 
107
136
  expect( autosave ).not.toHaveBeenCalled();
137
+ } );
108
138
 
109
- rerender(
110
- <AutosaveMonitor
111
- isAutosaveable
112
- autosave={ autosave }
113
- editsReference={ [] }
114
- />
115
- );
139
+ it( 'should not autosave while an autosave is already in progress', () => {
140
+ const autosave = jest.fn();
141
+ setState( { isDirty: true, isAutosaveable: true, isAutosaving: true } );
142
+ render( <AutosaveMonitor autosave={ autosave } interval={ 5 } /> );
116
143
 
117
- jest.runOnlyPendingTimers();
144
+ jest.advanceTimersByTime( 5000 );
118
145
 
119
146
  expect( autosave ).not.toHaveBeenCalled();
120
147
  } );
121
148
 
122
- it( 'should not autosave when `editReference` changes and the post is not autosaving', () => {
149
+ it( 'should autosave edits made during an in-progress autosave once it finishes', () => {
123
150
  const autosave = jest.fn();
124
- const { rerender } = render(
125
- <AutosaveMonitor isAutosaveable autosave={ autosave } />
126
- );
127
-
151
+ setState( { isDirty: true, isAutosaveable: true } );
152
+ render( <AutosaveMonitor autosave={ autosave } interval={ 5 } /> );
153
+
154
+ // New edit arrives while an autosave is already in progress: the tick
155
+ // should not consume the edits reference nor trigger an autosave.
156
+ setState( {
157
+ isDirty: true,
158
+ isAutosaveable: true,
159
+ isAutosaving: true,
160
+ editsReference: 2,
161
+ } );
162
+ jest.advanceTimersByTime( 5000 );
128
163
  expect( autosave ).not.toHaveBeenCalled();
129
164
 
130
- rerender(
131
- <AutosaveMonitor
132
- isAutosaveable
133
- autosave={ autosave }
134
- isAutosaving={ false }
135
- editsReference={ [] }
136
- />
137
- );
138
-
139
- jest.runOnlyPendingTimers();
140
-
141
- expect( autosave ).not.toHaveBeenCalled();
165
+ // Once the autosave finishes, the pending edit must still be autosaved.
166
+ setState( { isDirty: true, isAutosaveable: true, editsReference: 2 } );
167
+ jest.advanceTimersByTime( 5000 );
168
+ expect( autosave ).toHaveBeenCalledTimes( 1 );
142
169
  } );
143
170
 
144
- it( 'should not autosave when `editReference` changes and the post started autosaving', () => {
171
+ it( 'should not autosave again until there are new edits', () => {
145
172
  const autosave = jest.fn();
146
- const { rerender } = render(
147
- <AutosaveMonitor
148
- isAutosaveable
149
- autosave={ autosave }
150
- isAutosaving={ false }
151
- />
152
- );
173
+ setState( { isDirty: true, isAutosaveable: true } );
174
+ render( <AutosaveMonitor autosave={ autosave } interval={ 5 } /> );
153
175
 
154
- expect( autosave ).not.toHaveBeenCalled();
155
-
156
- rerender(
157
- <AutosaveMonitor
158
- isAutosaveable
159
- autosave={ autosave }
160
- isAutosaving
161
- editsReference={ [] }
162
- />
163
- );
176
+ jest.advanceTimersByTime( 5000 );
177
+ expect( autosave ).toHaveBeenCalledTimes( 1 );
164
178
 
165
- jest.runOnlyPendingTimers();
179
+ // No new edits: a subsequent tick should not autosave again.
180
+ jest.advanceTimersByTime( 5000 );
181
+ expect( autosave ).toHaveBeenCalledTimes( 1 );
166
182
 
167
- expect( autosave ).not.toHaveBeenCalled();
183
+ // A new distinct edit triggers another autosave.
184
+ setState( { isDirty: true, isAutosaveable: true, editsReference: 2 } );
185
+ jest.advanceTimersByTime( 5000 );
186
+ expect( autosave ).toHaveBeenCalledTimes( 2 );
168
187
  } );
169
188
 
170
- it( 'should schedule itself in another {interval} ms', () => {
171
- const { rerender } = render( <AutosaveMonitor isDirty /> );
172
-
173
- rerender( <AutosaveMonitor isDirty isAutosaveable interval={ 5 } /> );
189
+ it( 'should keep pending edits and retry once the post becomes autosaveable', () => {
190
+ const autosave = jest.fn();
191
+ setState( { isDirty: true, isAutosaveable: false, editsReference: 2 } );
192
+ render( <AutosaveMonitor autosave={ autosave } interval={ 5 } /> );
174
193
 
175
- jest.runOnlyPendingTimers();
194
+ jest.advanceTimersByTime( 5000 );
195
+ expect( autosave ).not.toHaveBeenCalled();
176
196
 
177
- expect( setTimeout ).toHaveBeenLastCalledWith(
178
- expect.any( Function ),
179
- 5000
180
- );
197
+ setState( { isDirty: true, isAutosaveable: true, editsReference: 2 } );
198
+ jest.advanceTimersByTime( 5000 );
199
+ expect( autosave ).toHaveBeenCalledTimes( 1 );
181
200
  } );
182
201
 
183
- it( 'should schedule itself in 1000 ms if the post is not autosaveable at a time', () => {
184
- const { rerender } = render( <AutosaveMonitor isDirty /> );
185
-
186
- rerender(
187
- <AutosaveMonitor isDirty isAutosaveable={ false } interval={ 5 } />
188
- );
202
+ it( 'should fall back to the editor store autosave action', () => {
203
+ const autosave = jest.fn();
204
+ useDispatch.mockReturnValue( { autosave } );
205
+ setState( { isDirty: true, isAutosaveable: true } );
206
+ render( <AutosaveMonitor interval={ 5 } /> );
189
207
 
190
- jest.runOnlyPendingTimers();
208
+ jest.advanceTimersByTime( 5000 );
191
209
 
192
- expect( setTimeout ).toHaveBeenLastCalledWith(
193
- expect.any( Function ),
194
- 1000
195
- );
210
+ expect( autosave ).toHaveBeenCalledTimes( 1 );
196
211
  } );
197
212
  } );
@@ -19,6 +19,7 @@ exports[`PluginPostPublishPanel renders fill properly 1`] = `
19
19
  <svg
20
20
  aria-hidden="true"
21
21
  class="components-panel__arrow"
22
+ fill="currentColor"
22
23
  focusable="false"
23
24
  height="24"
24
25
  viewBox="0 0 24 24"
@@ -136,7 +136,6 @@ export default function PostPublishPanelPostpublish( {
136
136
  </p>
137
137
  <div className="post-publish-panel__postpublish-post-address-container">
138
138
  <TextControl
139
- __next40pxDefaultSize
140
139
  className="post-publish-panel__postpublish-post-address"
141
140
  readOnly
142
141
  label={ sprintf(
@@ -66,6 +66,7 @@ exports[`PostPublishPanel should render the post-publish panel if the post is pu
66
66
  >
67
67
  <svg
68
68
  aria-hidden="true"
69
+ fill="currentColor"
69
70
  focusable="false"
70
71
  height="24"
71
72
  viewBox="0 0 24 24"
@@ -134,7 +135,7 @@ exports[`PostPublishPanel should render the post-publish panel if the post is pu
134
135
  post address
135
136
  </label>
136
137
  <input
137
- class="components-text-control__input is-next-40px-default-size"
138
+ class="components-text-control__input"
138
139
  id="inspector-text-control-0"
139
140
  readonly=""
140
141
  type="text"
@@ -168,6 +169,7 @@ exports[`PostPublishPanel should render the post-publish panel if the post is pu
168
169
  </span>
169
170
  <svg
170
171
  aria-hidden="true"
172
+ fill="currentColor"
171
173
  focusable="false"
172
174
  height="24"
173
175
  viewBox="0 0 24 24"
@@ -291,6 +293,7 @@ exports[`PostPublishPanel should render the post-publish panel if the post is sc
291
293
  >
292
294
  <svg
293
295
  aria-hidden="true"
296
+ fill="currentColor"
294
297
  focusable="false"
295
298
  height="24"
296
299
  viewBox="0 0 24 24"
@@ -362,7 +365,7 @@ exports[`PostPublishPanel should render the post-publish panel if the post is sc
362
365
  post address
363
366
  </label>
364
367
  <input
365
- class="components-text-control__input is-next-40px-default-size"
368
+ class="components-text-control__input"
366
369
  id="inspector-text-control-1"
367
370
  readonly=""
368
371
  type="text"
@@ -521,6 +524,7 @@ exports[`PostPublishPanel should render the pre-publish panel if post status is
521
524
  <svg
522
525
  aria-hidden="true"
523
526
  class="components-site-icon"
527
+ fill="currentColor"
524
528
  focusable="false"
525
529
  height="36px"
526
530
  viewBox="-2 -2 24 24"
@@ -675,6 +679,7 @@ exports[`PostPublishPanel should render the pre-publish panel if the post is not
675
679
  <svg
676
680
  aria-hidden="true"
677
681
  class="components-site-icon"
682
+ fill="currentColor"
678
683
  focusable="false"
679
684
  height="36px"
680
685
  viewBox="-2 -2 24 24"
@@ -9,6 +9,7 @@ exports[`PostSavedState returns a disabled button if the post is not saveable 1`
9
9
  >
10
10
  <svg
11
11
  aria-hidden="true"
12
+ fill="currentColor"
12
13
  focusable="false"
13
14
  height="24"
14
15
  viewBox="0 0 24 24"
@@ -246,7 +246,6 @@ export default function PostStatus() {
246
246
  ) }
247
247
  type="text"
248
248
  id={ passwordInputId }
249
- __next40pxDefaultSize
250
249
  maxLength={ 255 }
251
250
  />
252
251
  </div>
@@ -462,7 +462,6 @@ export function HierarchicalTermSelector( { slug } ) {
462
462
  <form onSubmit={ onAddTerm }>
463
463
  <Flex direction="column" gap="4">
464
464
  <TextControl
465
- __next40pxDefaultSize
466
465
  className="editor-post-taxonomies__hierarchical-terms-input"
467
466
  label={ newTermLabel }
468
467
  value={ formName }
@@ -121,7 +121,6 @@ export default function CreateNewTemplateModal( { onClose } ) {
121
121
  <form onSubmit={ submit }>
122
122
  <VStack spacing="3">
123
123
  <TextControl
124
- __next40pxDefaultSize
125
124
  label={ __( 'Name' ) }
126
125
  value={ title }
127
126
  onChange={ setTitle }
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import { diffChars } from 'diff/lib/diff/character';
5
- import { diffLines } from 'diff/lib/diff/line';
4
+ import { diffChars } from 'diff/lib/diff/character.js';
5
+ import { diffLines } from 'diff/lib/diff/line.js';
6
6
 
7
7
  // Character diffing (Myers) is cheap when the edit distance is small but
8
8
  // degrades toward O(n^2) as the two strings diverge: a full replacement of
@@ -82,7 +82,6 @@ export default function PostVisibility( { onClose } ) {
82
82
  placeholder={ __( 'Use a secure password' ) }
83
83
  type="text"
84
84
  id={ `editor-post-visibility__password-input-${ instanceId }` }
85
- __next40pxDefaultSize
86
85
  maxLength={ 255 }
87
86
  />
88
87
  ) }
@@ -52,22 +52,31 @@ export default function DisableNonPageContentBlocks() {
52
52
  // Child blocks of templates and templateParts are also loaded separately,
53
53
  // so these are kept in separate effects.
54
54
  useEffect( () => {
55
- const { setBlockEditingMode, unsetBlockEditingMode } =
56
- registry.dispatch( blockEditorStore );
55
+ const {
56
+ setBlockEditingMode,
57
+ unsetBlockEditingMode,
58
+ __unstableMarkNextChangeAsNotPersistent,
59
+ } = registry.dispatch( blockEditorStore );
57
60
 
61
+ __unstableMarkNextChangeAsNotPersistent();
58
62
  setBlockEditingMode( '', 'disabled' );
59
63
 
60
64
  return () => {
65
+ __unstableMarkNextChangeAsNotPersistent();
61
66
  unsetBlockEditingMode( '' );
62
67
  };
63
68
  }, [ registry ] );
64
69
 
65
70
  useEffect( () => {
66
- const { setBlockEditingMode, unsetBlockEditingMode } =
67
- registry.dispatch( blockEditorStore );
71
+ const {
72
+ setBlockEditingMode,
73
+ unsetBlockEditingMode,
74
+ __unstableMarkNextChangeAsNotPersistent,
75
+ } = registry.dispatch( blockEditorStore );
68
76
 
69
77
  registry.batch( () => {
70
78
  for ( const clientId of templateParts ) {
79
+ __unstableMarkNextChangeAsNotPersistent();
71
80
  setBlockEditingMode( clientId, 'contentOnly' );
72
81
  }
73
82
  } );
@@ -75,6 +84,7 @@ export default function DisableNonPageContentBlocks() {
75
84
  return () => {
76
85
  registry.batch( () => {
77
86
  for ( const clientId of templateParts ) {
87
+ __unstableMarkNextChangeAsNotPersistent();
78
88
  unsetBlockEditingMode( clientId );
79
89
  }
80
90
  } );
@@ -82,17 +92,22 @@ export default function DisableNonPageContentBlocks() {
82
92
  }, [ templateParts, registry ] );
83
93
 
84
94
  useEffect( () => {
85
- const { setBlockEditingMode, unsetBlockEditingMode } =
86
- registry.dispatch( blockEditorStore );
95
+ const {
96
+ setBlockEditingMode,
97
+ unsetBlockEditingMode,
98
+ __unstableMarkNextChangeAsNotPersistent,
99
+ } = registry.dispatch( blockEditorStore );
87
100
 
88
101
  const contentOnlySet = new Set( contentOnlyIds );
89
102
 
90
103
  registry.batch( () => {
91
104
  for ( const clientId of contentOnlyIds ) {
105
+ __unstableMarkNextChangeAsNotPersistent();
92
106
  setBlockEditingMode( clientId, 'contentOnly' );
93
107
  }
94
108
  for ( const clientId of templatePartChildren ) {
95
109
  if ( ! contentOnlySet.has( clientId ) ) {
110
+ __unstableMarkNextChangeAsNotPersistent();
96
111
  setBlockEditingMode( clientId, 'disabled' );
97
112
  }
98
113
  }
@@ -101,10 +116,12 @@ export default function DisableNonPageContentBlocks() {
101
116
  return () => {
102
117
  registry.batch( () => {
103
118
  for ( const clientId of contentOnlyIds ) {
119
+ __unstableMarkNextChangeAsNotPersistent();
104
120
  unsetBlockEditingMode( clientId );
105
121
  }
106
122
  for ( const clientId of templatePartChildren ) {
107
123
  if ( ! contentOnlySet.has( clientId ) ) {
124
+ __unstableMarkNextChangeAsNotPersistent();
108
125
  unsetBlockEditingMode( clientId );
109
126
  }
110
127
  }
@@ -2,7 +2,7 @@
2
2
  * WordPress dependencies
3
3
  */
4
4
  import { useEffect } from '@wordpress/element';
5
- import { useDispatch, useSelect } from '@wordpress/data';
5
+ import { useRegistry, useSelect } from '@wordpress/data';
6
6
  import { store as blockEditorStore } from '@wordpress/block-editor';
7
7
 
8
8
  /**
@@ -14,24 +14,30 @@ import { store as blockEditorStore } from '@wordpress/block-editor';
14
14
  */
15
15
 
16
16
  export default function NavigationBlockEditingMode() {
17
+ const registry = useRegistry();
17
18
  // In the navigation block editor,
18
19
  // the navigation block is the only root block.
19
20
  const blockClientId = useSelect(
20
21
  ( select ) => select( blockEditorStore ).getBlockOrder()?.[ 0 ],
21
22
  []
22
23
  );
23
- const { setBlockEditingMode, unsetBlockEditingMode } =
24
- useDispatch( blockEditorStore );
25
24
 
26
25
  useEffect( () => {
27
26
  if ( ! blockClientId ) {
28
27
  return;
29
28
  }
29
+ const {
30
+ setBlockEditingMode,
31
+ unsetBlockEditingMode,
32
+ __unstableMarkNextChangeAsNotPersistent,
33
+ } = registry.dispatch( blockEditorStore );
30
34
 
35
+ __unstableMarkNextChangeAsNotPersistent();
31
36
  setBlockEditingMode( blockClientId, 'contentOnly' );
32
37
 
33
38
  return () => {
39
+ __unstableMarkNextChangeAsNotPersistent();
34
40
  unsetBlockEditingMode( blockClientId );
35
41
  };
36
- }, [ blockClientId, unsetBlockEditingMode, setBlockEditingMode ] );
42
+ }, [ registry, blockClientId ] );
37
43
  }
@@ -68,6 +68,7 @@ const BLOCK_EDITOR_SETTINGS = [
68
68
  'clearBlockSelection',
69
69
  'codeEditingEnabled',
70
70
  'colors',
71
+ 'disableContentOnlyForTemplateParts',
71
72
  'disableContentOnlyForUnsyncedPatterns',
72
73
  'disableCustomColors',
73
74
  'disableCustomFontSizes',
@@ -414,7 +415,8 @@ function useBlockEditorSettings( settings, postType, postId, renderingMode ) {
414
415
  // When in template-locked mode (e.g., "Show Template" in the post editor),
415
416
  // don't treat template parts as contentOnly sections.
416
417
  disableContentOnlyForTemplateParts:
417
- renderingMode === 'template-locked',
418
+ renderingMode === 'template-locked' ||
419
+ settings.disableContentOnlyForTemplateParts,
418
420
  ...( deviceType ? { [ deviceTypeKey ]: deviceType } : {} ),
419
421
  [ onViewportStateChangeKey ]: updateDeviceTypeForViewportState,
420
422
  [ isNavigationOverlayContextKey ]: isNavigationOverlayContext,