@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.
- package/CHANGELOG.md +2 -0
- package/README.md +5 -13
- package/build/components/autosave-monitor/index.cjs +40 -83
- package/build/components/autosave-monitor/index.cjs.map +3 -3
- package/build/components/post-publish-panel/postpublish.cjs +0 -1
- package/build/components/post-publish-panel/postpublish.cjs.map +2 -2
- package/build/components/post-status/index.cjs +0 -1
- package/build/components/post-status/index.cjs.map +2 -2
- package/build/components/post-taxonomies/hierarchical-term-selector.cjs +0 -1
- package/build/components/post-taxonomies/hierarchical-term-selector.cjs.map +2 -2
- package/build/components/post-template/create-new-template-modal.cjs +0 -1
- package/build/components/post-template/create-new-template-modal.cjs.map +2 -2
- package/build/components/post-text-editor/utils.cjs +2 -2
- package/build/components/post-text-editor/utils.cjs.map +1 -1
- package/build/components/post-visibility/index.cjs +0 -1
- package/build/components/post-visibility/index.cjs.map +2 -2
- package/build/components/provider/disable-non-page-content-blocks.cjs +23 -3
- package/build/components/provider/disable-non-page-content-blocks.cjs.map +2 -2
- package/build/components/provider/navigation-block-editing-mode.cjs +9 -2
- package/build/components/provider/navigation-block-editing-mode.cjs.map +2 -2
- package/build/components/provider/use-block-editor-settings.cjs +2 -1
- package/build/components/provider/use-block-editor-settings.cjs.map +2 -2
- package/build/components/sidebar/dataform-post-summary.cjs +87 -32
- package/build/components/sidebar/dataform-post-summary.cjs.map +3 -3
- package/build/components/sidebar/post-summary.cjs +8 -6
- package/build/components/sidebar/post-summary.cjs.map +3 -3
- package/build/dataviews/store/private-actions.cjs +3 -1
- package/build/dataviews/store/private-actions.cjs.map +2 -2
- package/build/store/private-actions.cjs +2 -2
- package/build/store/private-actions.cjs.map +2 -2
- package/build-module/components/autosave-monitor/index.mjs +42 -81
- package/build-module/components/autosave-monitor/index.mjs.map +2 -2
- package/build-module/components/post-publish-panel/postpublish.mjs +0 -1
- package/build-module/components/post-publish-panel/postpublish.mjs.map +2 -2
- package/build-module/components/post-status/index.mjs +0 -1
- package/build-module/components/post-status/index.mjs.map +2 -2
- package/build-module/components/post-taxonomies/hierarchical-term-selector.mjs +0 -1
- package/build-module/components/post-taxonomies/hierarchical-term-selector.mjs.map +2 -2
- package/build-module/components/post-template/create-new-template-modal.mjs +0 -1
- package/build-module/components/post-template/create-new-template-modal.mjs.map +2 -2
- package/build-module/components/post-text-editor/utils.mjs +2 -2
- package/build-module/components/post-text-editor/utils.mjs.map +1 -1
- package/build-module/components/post-visibility/index.mjs +0 -1
- package/build-module/components/post-visibility/index.mjs.map +2 -2
- package/build-module/components/provider/disable-non-page-content-blocks.mjs +23 -3
- package/build-module/components/provider/disable-non-page-content-blocks.mjs.map +2 -2
- package/build-module/components/provider/navigation-block-editing-mode.mjs +10 -3
- package/build-module/components/provider/navigation-block-editing-mode.mjs.map +2 -2
- package/build-module/components/provider/use-block-editor-settings.mjs +2 -1
- package/build-module/components/provider/use-block-editor-settings.mjs.map +2 -2
- package/build-module/components/sidebar/dataform-post-summary.mjs +88 -33
- package/build-module/components/sidebar/dataform-post-summary.mjs.map +2 -2
- package/build-module/components/sidebar/post-summary.mjs +8 -6
- package/build-module/components/sidebar/post-summary.mjs.map +2 -2
- package/build-module/dataviews/store/private-actions.mjs +5 -1
- package/build-module/dataviews/store/private-actions.mjs.map +2 -2
- package/build-module/store/private-actions.mjs +2 -2
- package/build-module/store/private-actions.mjs.map +2 -2
- package/build-style/style-rtl.css +29 -33
- package/build-style/style.css +29 -33
- package/build-types/components/autosave-monitor/index.d.ts +11 -29
- package/build-types/components/autosave-monitor/index.d.ts.map +1 -1
- package/build-types/components/post-publish-panel/postpublish.d.ts.map +1 -1
- package/build-types/components/post-status/index.d.ts.map +1 -1
- package/build-types/components/post-taxonomies/hierarchical-term-selector.d.ts.map +1 -1
- package/build-types/components/post-template/create-new-template-modal.d.ts.map +1 -1
- package/build-types/components/post-visibility/index.d.ts.map +1 -1
- package/build-types/components/provider/disable-non-page-content-blocks.d.ts.map +1 -1
- package/build-types/components/provider/navigation-block-editing-mode.d.ts.map +1 -1
- package/build-types/components/provider/use-block-editor-settings.d.ts.map +1 -1
- package/build-types/components/sidebar/dataform-post-summary.d.ts.map +1 -1
- package/build-types/components/sidebar/post-summary.d.ts.map +1 -1
- package/build-types/dataviews/store/private-actions.d.ts.map +1 -1
- package/build-types/utils/get-template-part-icon.d.ts.map +1 -1
- package/package.json +46 -46
- package/src/components/autosave-monitor/index.js +69 -104
- package/src/components/autosave-monitor/test/index.js +137 -122
- package/src/components/plugin-post-publish-panel/test/__snapshots__/index.js.snap +1 -0
- package/src/components/post-publish-panel/postpublish.js +0 -1
- package/src/components/post-publish-panel/test/__snapshots__/index.js.snap +7 -2
- package/src/components/post-saved-state/test/__snapshots__/index.js.snap +1 -0
- package/src/components/post-status/index.js +0 -1
- package/src/components/post-taxonomies/hierarchical-term-selector.js +0 -1
- package/src/components/post-template/create-new-template-modal.js +0 -1
- package/src/components/post-text-editor/utils.js +2 -2
- package/src/components/post-visibility/index.js +0 -1
- package/src/components/provider/disable-non-page-content-blocks.js +23 -6
- package/src/components/provider/navigation-block-editing-mode.js +10 -4
- package/src/components/provider/use-block-editor-settings.js +3 -1
- package/src/components/sidebar/dataform-post-summary.js +133 -49
- package/src/components/sidebar/post-summary.js +12 -10
- package/src/dataviews/store/private-actions.ts +8 -1
- package/src/store/private-actions.js +2 -2
- 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
|
|
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, '
|
|
13
|
-
jest.spyOn( global, '
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
)
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
|
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
|
|
73
|
+
it( 'should start the autosave timer after being mounted', () => {
|
|
74
|
+
render( <AutosaveMonitor /> );
|
|
36
75
|
|
|
37
|
-
expect(
|
|
76
|
+
expect( setInterval ).toHaveBeenCalled();
|
|
38
77
|
} );
|
|
39
78
|
|
|
40
79
|
it( 'should clear the autosave timer after being unmounted', () => {
|
|
41
|
-
const { rerender } = render( <AutosaveMonitor
|
|
80
|
+
const { rerender } = render( <AutosaveMonitor /> );
|
|
42
81
|
|
|
43
82
|
rerender( <div /> );
|
|
44
83
|
|
|
45
|
-
expect(
|
|
84
|
+
expect( clearInterval ).toHaveBeenCalled();
|
|
46
85
|
} );
|
|
47
86
|
|
|
48
|
-
it( 'should
|
|
49
|
-
const { rerender } = render( <AutosaveMonitor
|
|
87
|
+
it( 'should restart the autosave timer when the interval changes', () => {
|
|
88
|
+
const { rerender } = render( <AutosaveMonitor interval={ 10 } /> );
|
|
50
89
|
|
|
51
|
-
|
|
90
|
+
setInterval.mockClear();
|
|
91
|
+
clearInterval.mockClear();
|
|
92
|
+
rerender( <AutosaveMonitor interval={ 999 } /> );
|
|
52
93
|
|
|
53
|
-
expect(
|
|
54
|
-
expect(
|
|
94
|
+
expect( clearInterval ).toHaveBeenCalled();
|
|
95
|
+
expect( setInterval ).toHaveBeenCalledTimes( 1 );
|
|
55
96
|
} );
|
|
56
97
|
|
|
57
|
-
it( 'should
|
|
58
|
-
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
isAutosaveable
|
|
69
|
-
autosave={ autosave }
|
|
70
|
-
editsReference={ [] }
|
|
71
|
-
/>
|
|
101
|
+
expect( setInterval ).toHaveBeenLastCalledWith(
|
|
102
|
+
expect.any( Function ),
|
|
103
|
+
5000
|
|
72
104
|
);
|
|
105
|
+
} );
|
|
73
106
|
|
|
74
|
-
|
|
107
|
+
it( 'should fall back to the editor autosaveInterval setting', () => {
|
|
108
|
+
setState( { autosaveInterval: 7 } );
|
|
109
|
+
render( <AutosaveMonitor /> );
|
|
75
110
|
|
|
76
|
-
expect(
|
|
111
|
+
expect( setInterval ).toHaveBeenLastCalledWith(
|
|
112
|
+
expect.any( Function ),
|
|
113
|
+
7000
|
|
114
|
+
);
|
|
77
115
|
} );
|
|
78
116
|
|
|
79
|
-
it( 'should autosave
|
|
117
|
+
it( 'should autosave a dirty, autosaveable post on the timer tick', () => {
|
|
80
118
|
const autosave = jest.fn();
|
|
81
|
-
|
|
82
|
-
|
|
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
|
-
|
|
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
|
|
129
|
+
it( 'should not autosave when the post is not dirty', () => {
|
|
102
130
|
const autosave = jest.fn();
|
|
103
|
-
|
|
104
|
-
|
|
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
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
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.
|
|
144
|
+
jest.advanceTimersByTime( 5000 );
|
|
118
145
|
|
|
119
146
|
expect( autosave ).not.toHaveBeenCalled();
|
|
120
147
|
} );
|
|
121
148
|
|
|
122
|
-
it( 'should
|
|
149
|
+
it( 'should autosave edits made during an in-progress autosave once it finishes', () => {
|
|
123
150
|
const autosave = jest.fn();
|
|
124
|
-
|
|
125
|
-
|
|
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
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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
|
|
171
|
+
it( 'should not autosave again until there are new edits', () => {
|
|
145
172
|
const autosave = jest.fn();
|
|
146
|
-
|
|
147
|
-
|
|
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
|
-
|
|
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
|
-
|
|
179
|
+
// No new edits: a subsequent tick should not autosave again.
|
|
180
|
+
jest.advanceTimersByTime( 5000 );
|
|
181
|
+
expect( autosave ).toHaveBeenCalledTimes( 1 );
|
|
166
182
|
|
|
167
|
-
|
|
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
|
|
171
|
-
const
|
|
172
|
-
|
|
173
|
-
|
|
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.
|
|
194
|
+
jest.advanceTimersByTime( 5000 );
|
|
195
|
+
expect( autosave ).not.toHaveBeenCalled();
|
|
176
196
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
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
|
|
184
|
-
const
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
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.
|
|
208
|
+
jest.advanceTimersByTime( 5000 );
|
|
191
209
|
|
|
192
|
-
expect(
|
|
193
|
-
expect.any( Function ),
|
|
194
|
-
1000
|
|
195
|
-
);
|
|
210
|
+
expect( autosave ).toHaveBeenCalledTimes( 1 );
|
|
196
211
|
} );
|
|
197
212
|
} );
|
|
@@ -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
|
|
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
|
|
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"
|
|
@@ -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 }
|
|
@@ -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
|
|
@@ -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 {
|
|
56
|
-
|
|
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 {
|
|
67
|
-
|
|
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 {
|
|
86
|
-
|
|
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 {
|
|
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
|
-
}, [
|
|
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,
|