@wordpress/editor 14.4.0 → 14.5.0

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 (222) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/bindings/post-meta.js +12 -0
  3. package/build/bindings/post-meta.js.map +1 -1
  4. package/build/components/blog-title/index.js +1 -1
  5. package/build/components/blog-title/index.js.map +1 -1
  6. package/build/components/commands/index.js +8 -2
  7. package/build/components/commands/index.js.map +1 -1
  8. package/build/components/document-bar/index.js +1 -1
  9. package/build/components/document-bar/index.js.map +1 -1
  10. package/build/components/header/index.js +2 -3
  11. package/build/components/header/index.js.map +1 -1
  12. package/build/components/page-attributes/parent.js +6 -2
  13. package/build/components/page-attributes/parent.js.map +1 -1
  14. package/build/components/post-actions/actions.js +38 -344
  15. package/build/components/post-actions/actions.js.map +1 -1
  16. package/build/components/post-actions/index.js +16 -6
  17. package/build/components/post-actions/index.js.map +1 -1
  18. package/build/components/post-author/hook.js +10 -3
  19. package/build/components/post-author/hook.js.map +1 -1
  20. package/build/components/post-author/panel.js +2 -1
  21. package/build/components/post-author/panel.js.map +1 -1
  22. package/build/components/post-card-panel/index.js +1 -1
  23. package/build/components/post-card-panel/index.js.map +1 -1
  24. package/build/components/post-comments/index.js +6 -20
  25. package/build/components/post-comments/index.js.map +1 -1
  26. package/build/components/post-status/index.js +17 -41
  27. package/build/components/post-status/index.js.map +1 -1
  28. package/build/components/post-template/create-new-template-modal.js +3 -0
  29. package/build/components/post-template/create-new-template-modal.js.map +1 -1
  30. package/build/components/post-url/panel.js +3 -2
  31. package/build/components/post-url/panel.js.map +1 -1
  32. package/build/components/preview-dropdown/index.js +82 -17
  33. package/build/components/preview-dropdown/index.js.map +1 -1
  34. package/build/components/provider/disable-non-page-content-blocks.js +14 -18
  35. package/build/components/provider/disable-non-page-content-blocks.js.map +1 -1
  36. package/build/components/site-discussion/index.js +6 -20
  37. package/build/components/site-discussion/index.js.map +1 -1
  38. package/build/components/template-content-panel/index.js +14 -12
  39. package/build/components/template-content-panel/index.js.map +1 -1
  40. package/build/components/visual-editor/index.js +2 -1
  41. package/build/components/visual-editor/index.js.map +1 -1
  42. package/build/dataviews/actions/export-pattern.native.js +9 -0
  43. package/build/dataviews/actions/export-pattern.native.js.map +1 -0
  44. package/build/dataviews/actions/permanently-delete-post.js +107 -0
  45. package/build/dataviews/actions/permanently-delete-post.js.map +1 -0
  46. package/build/dataviews/actions/restore-post.js +112 -0
  47. package/build/dataviews/actions/restore-post.js.map +1 -0
  48. package/build/dataviews/actions/trash-post.js +142 -0
  49. package/build/dataviews/actions/trash-post.js.map +1 -0
  50. package/build/dataviews/store/private-actions.js +45 -0
  51. package/build/dataviews/store/private-actions.js.map +1 -1
  52. package/build/dataviews/store/private-selectors.js +10 -10
  53. package/build/dataviews/store/private-selectors.js.map +1 -1
  54. package/build/dataviews/store/reducer.js +15 -1
  55. package/build/dataviews/store/reducer.js.map +1 -1
  56. package/build/dataviews/types.js.map +1 -1
  57. package/build/private-apis.js +0 -2
  58. package/build/private-apis.js.map +1 -1
  59. package/build/store/actions.js +16 -2
  60. package/build/store/actions.js.map +1 -1
  61. package/build/store/private-actions.js +8 -1
  62. package/build/store/private-actions.js.map +1 -1
  63. package/build/store/private-selectors.js +33 -2
  64. package/build/store/private-selectors.js.map +1 -1
  65. package/build-module/bindings/post-meta.js +12 -0
  66. package/build-module/bindings/post-meta.js.map +1 -1
  67. package/build-module/components/blog-title/index.js +1 -1
  68. package/build-module/components/blog-title/index.js.map +1 -1
  69. package/build-module/components/commands/index.js +8 -2
  70. package/build-module/components/commands/index.js.map +1 -1
  71. package/build-module/components/document-bar/index.js +1 -1
  72. package/build-module/components/document-bar/index.js.map +1 -1
  73. package/build-module/components/header/index.js +2 -3
  74. package/build-module/components/header/index.js.map +1 -1
  75. package/build-module/components/page-attributes/parent.js +7 -3
  76. package/build-module/components/page-attributes/parent.js.map +1 -1
  77. package/build-module/components/post-actions/actions.js +44 -350
  78. package/build-module/components/post-actions/actions.js.map +1 -1
  79. package/build-module/components/post-actions/index.js +16 -6
  80. package/build-module/components/post-actions/index.js.map +1 -1
  81. package/build-module/components/post-author/hook.js +10 -3
  82. package/build-module/components/post-author/hook.js.map +1 -1
  83. package/build-module/components/post-author/panel.js +2 -1
  84. package/build-module/components/post-author/panel.js.map +1 -1
  85. package/build-module/components/post-card-panel/index.js +1 -1
  86. package/build-module/components/post-card-panel/index.js.map +1 -1
  87. package/build-module/components/post-comments/index.js +7 -23
  88. package/build-module/components/post-comments/index.js.map +1 -1
  89. package/build-module/components/post-status/index.js +19 -43
  90. package/build-module/components/post-status/index.js.map +1 -1
  91. package/build-module/components/post-template/create-new-template-modal.js +3 -0
  92. package/build-module/components/post-template/create-new-template-modal.js.map +1 -1
  93. package/build-module/components/post-url/panel.js +4 -5
  94. package/build-module/components/post-url/panel.js.map +1 -1
  95. package/build-module/components/preview-dropdown/index.js +84 -19
  96. package/build-module/components/preview-dropdown/index.js.map +1 -1
  97. package/build-module/components/provider/disable-non-page-content-blocks.js +15 -19
  98. package/build-module/components/provider/disable-non-page-content-blocks.js.map +1 -1
  99. package/build-module/components/site-discussion/index.js +7 -21
  100. package/build-module/components/site-discussion/index.js.map +1 -1
  101. package/build-module/components/template-content-panel/index.js +15 -13
  102. package/build-module/components/template-content-panel/index.js.map +1 -1
  103. package/build-module/components/visual-editor/index.js +2 -1
  104. package/build-module/components/visual-editor/index.js.map +1 -1
  105. package/build-module/dataviews/actions/export-pattern.native.js +3 -0
  106. package/build-module/dataviews/actions/export-pattern.native.js.map +1 -0
  107. package/build-module/dataviews/actions/permanently-delete-post.js +99 -0
  108. package/build-module/dataviews/actions/permanently-delete-post.js.map +1 -0
  109. package/build-module/dataviews/actions/restore-post.js +104 -0
  110. package/build-module/dataviews/actions/restore-post.js.map +1 -0
  111. package/build-module/dataviews/actions/trash-post.js +135 -0
  112. package/build-module/dataviews/actions/trash-post.js.map +1 -0
  113. package/build-module/dataviews/store/private-actions.js +40 -0
  114. package/build-module/dataviews/store/private-actions.js.map +1 -1
  115. package/build-module/dataviews/store/private-selectors.js +8 -9
  116. package/build-module/dataviews/store/private-selectors.js.map +1 -1
  117. package/build-module/dataviews/store/reducer.js +15 -1
  118. package/build-module/dataviews/store/reducer.js.map +1 -1
  119. package/build-module/dataviews/types.js.map +1 -1
  120. package/build-module/private-apis.js +0 -2
  121. package/build-module/private-apis.js.map +1 -1
  122. package/build-module/store/actions.js +16 -2
  123. package/build-module/store/actions.js.map +1 -1
  124. package/build-module/store/private-actions.js +8 -1
  125. package/build-module/store/private-actions.js.map +1 -1
  126. package/build-module/store/private-selectors.js +32 -2
  127. package/build-module/store/private-selectors.js.map +1 -1
  128. package/build-style/style-rtl.css +19 -3
  129. package/build-style/style.css +19 -3
  130. package/build-types/bindings/post-meta.d.ts +6 -0
  131. package/build-types/bindings/post-meta.d.ts.map +1 -1
  132. package/build-types/components/commands/index.d.ts.map +1 -1
  133. package/build-types/components/header/index.d.ts.map +1 -1
  134. package/build-types/components/page-attributes/parent.d.ts.map +1 -1
  135. package/build-types/components/post-actions/actions.d.ts.map +1 -1
  136. package/build-types/components/post-actions/index.d.ts.map +1 -1
  137. package/build-types/components/post-author/hook.d.ts +1 -1
  138. package/build-types/components/post-author/hook.d.ts.map +1 -1
  139. package/build-types/components/post-author/panel.d.ts.map +1 -1
  140. package/build-types/components/post-comments/index.d.ts.map +1 -1
  141. package/build-types/components/post-status/index.d.ts +2 -1
  142. package/build-types/components/post-status/index.d.ts.map +1 -1
  143. package/build-types/components/post-template/create-new-template-modal.d.ts.map +1 -1
  144. package/build-types/components/post-url/panel.d.ts.map +1 -1
  145. package/build-types/components/preview-dropdown/index.d.ts.map +1 -1
  146. package/build-types/components/provider/disable-non-page-content-blocks.d.ts.map +1 -1
  147. package/build-types/components/site-discussion/index.d.ts.map +1 -1
  148. package/build-types/components/template-content-panel/index.d.ts.map +1 -1
  149. package/build-types/components/visual-editor/index.d.ts.map +1 -1
  150. package/build-types/dataviews/actions/export-pattern.native.d.ts +3 -0
  151. package/build-types/dataviews/actions/export-pattern.native.d.ts.map +1 -0
  152. package/build-types/dataviews/actions/permanently-delete-post.d.ts +5 -0
  153. package/build-types/dataviews/actions/permanently-delete-post.d.ts.map +1 -0
  154. package/build-types/dataviews/actions/restore-post.d.ts +5 -0
  155. package/build-types/dataviews/actions/restore-post.d.ts.map +1 -0
  156. package/build-types/dataviews/actions/trash-post.d.ts +5 -0
  157. package/build-types/dataviews/actions/trash-post.d.ts.map +1 -0
  158. package/build-types/dataviews/store/private-actions.d.ts +8 -3
  159. package/build-types/dataviews/store/private-actions.d.ts.map +1 -1
  160. package/build-types/dataviews/store/private-selectors.d.ts +2 -1
  161. package/build-types/dataviews/store/private-selectors.d.ts.map +1 -1
  162. package/build-types/dataviews/store/reducer.d.ts +4 -1
  163. package/build-types/dataviews/store/reducer.d.ts.map +1 -1
  164. package/build-types/dataviews/types.d.ts +9 -0
  165. package/build-types/dataviews/types.d.ts.map +1 -1
  166. package/build-types/private-apis.d.ts.map +1 -1
  167. package/build-types/store/actions.d.ts.map +1 -1
  168. package/build-types/store/private-actions.d.ts.map +1 -1
  169. package/build-types/store/private-selectors.d.ts +11 -0
  170. package/build-types/store/private-selectors.d.ts.map +1 -1
  171. package/build-types/store/reducer.d.ts +1 -0
  172. package/build-types/store/reducer.d.ts.map +1 -1
  173. package/package.json +36 -36
  174. package/src/bindings/post-meta.js +20 -0
  175. package/src/components/blog-title/index.js +1 -1
  176. package/src/components/commands/index.js +4 -2
  177. package/src/components/document-bar/index.js +1 -1
  178. package/src/components/document-bar/style.scss +1 -1
  179. package/src/components/editor-interface/style.scss +5 -0
  180. package/src/components/header/index.js +1 -2
  181. package/src/components/list-view-sidebar/style.scss +4 -0
  182. package/src/components/page-attributes/parent.js +25 -7
  183. package/src/components/post-actions/actions.js +47 -470
  184. package/src/components/post-actions/index.js +19 -7
  185. package/src/components/post-author/hook.js +11 -3
  186. package/src/components/post-author/panel.js +3 -1
  187. package/src/components/post-card-panel/index.js +1 -1
  188. package/src/components/post-comments/index.js +7 -20
  189. package/src/components/post-publish-panel/test/__snapshots__/index.js.snap +2 -2
  190. package/src/components/post-status/index.js +11 -41
  191. package/src/components/post-template/create-new-template-modal.js +7 -1
  192. package/src/components/post-url/panel.js +8 -2
  193. package/src/components/preview-dropdown/index.js +113 -35
  194. package/src/components/preview-dropdown/style.scss +5 -0
  195. package/src/components/provider/disable-non-page-content-blocks.js +27 -24
  196. package/src/components/site-discussion/index.js +7 -19
  197. package/src/components/template-content-panel/index.js +36 -21
  198. package/src/components/visual-editor/index.js +8 -6
  199. package/src/components/visual-editor/style.scss +1 -3
  200. package/src/dataviews/actions/export-pattern.native.tsx +3 -0
  201. package/src/dataviews/actions/permanently-delete-post.tsx +116 -0
  202. package/src/dataviews/actions/restore-post.tsx +134 -0
  203. package/src/dataviews/actions/trash-post.tsx +196 -0
  204. package/src/dataviews/store/private-actions.ts +68 -0
  205. package/src/dataviews/store/private-selectors.ts +9 -17
  206. package/src/dataviews/store/reducer.ts +20 -1
  207. package/src/dataviews/types.ts +11 -0
  208. package/src/private-apis.js +0 -2
  209. package/src/store/actions.js +36 -13
  210. package/src/store/private-actions.js +8 -4
  211. package/src/store/private-selectors.js +45 -2
  212. package/src/store/test/private-selectors.js +78 -0
  213. package/tsconfig.tsbuildinfo +1 -1
  214. package/build/dataviews/actions/index.js +0 -32
  215. package/build/dataviews/actions/index.js.map +0 -1
  216. package/build-module/dataviews/actions/index.js +0 -24
  217. package/build-module/dataviews/actions/index.js.map +0 -1
  218. package/build-types/dataviews/actions/index.d.ts +0 -2
  219. package/build-types/dataviews/actions/index.d.ts.map +0 -1
  220. package/src/components/document-outline/test/__snapshots__/index.js.snap +0 -111
  221. package/src/components/document-outline/test/index.js +0 -185
  222. package/src/dataviews/actions/index.ts +0 -25
@@ -196,22 +196,45 @@ export const savePost =
196
196
  content,
197
197
  };
198
198
  dispatch( { type: 'REQUEST_POST_UPDATE_START', options } );
199
- await registry
200
- .dispatch( coreStore )
201
- .saveEntityRecord(
202
- 'postType',
203
- previousRecord.type,
204
- edits,
199
+
200
+ let error = false;
201
+ try {
202
+ error = await applyFilters(
203
+ 'editor.__unstablePreSavePost',
204
+ Promise.resolve( false ),
205
205
  options
206
206
  );
207
+ } catch ( err ) {
208
+ error = err;
209
+ }
207
210
 
208
- let error = registry
209
- .select( coreStore )
210
- .getLastEntitySaveError(
211
- 'postType',
212
- previousRecord.type,
213
- previousRecord.id
214
- );
211
+ if ( ! error ) {
212
+ try {
213
+ await registry
214
+ .dispatch( coreStore )
215
+ .saveEntityRecord(
216
+ 'postType',
217
+ previousRecord.type,
218
+ edits,
219
+ options
220
+ );
221
+ } catch ( err ) {
222
+ error =
223
+ err.message && err.code !== 'unknown_error'
224
+ ? err.message
225
+ : __( 'An error occurred while updating.' );
226
+ }
227
+ }
228
+
229
+ if ( ! error ) {
230
+ error = registry
231
+ .select( coreStore )
232
+ .getLastEntitySaveError(
233
+ 'postType',
234
+ previousRecord.type,
235
+ previousRecord.id
236
+ );
237
+ }
215
238
 
216
239
  if ( ! error ) {
217
240
  await applyFilters(
@@ -393,10 +393,14 @@ export const removeTemplates =
393
393
  if ( items.length === 1 ) {
394
394
  // Depending on how the entity was retrieved its title might be
395
395
  // an object or simple string.
396
- const title =
397
- typeof items[ 0 ].title === 'string'
398
- ? items[ 0 ].title
399
- : items[ 0 ].title?.rendered;
396
+ let title;
397
+ if ( typeof items[ 0 ].title === 'string' ) {
398
+ title = items[ 0 ].title;
399
+ } else if ( typeof items[ 0 ].title?.rendered === 'string' ) {
400
+ title = items[ 0 ].title?.rendered;
401
+ } else if ( typeof items[ 0 ].title?.raw === 'string' ) {
402
+ title = items[ 0 ].title?.raw;
403
+ }
400
404
  successMessage = isResetting
401
405
  ? sprintf(
402
406
  /* translators: The template/part's name. */
@@ -25,7 +25,10 @@ import {
25
25
  getCurrentPost,
26
26
  __experimentalGetDefaultTemplatePartAreas,
27
27
  } from './selectors';
28
- import { getEntityActions as _getEntityActions } from '../dataviews/store/private-selectors';
28
+ import {
29
+ getEntityActions as _getEntityActions,
30
+ isEntityReady as _isEntityReady,
31
+ } from '../dataviews/store/private-selectors';
29
32
 
30
33
  const EMPTY_INSERTION_POINT = {
31
34
  rootClientId: undefined,
@@ -110,7 +113,10 @@ export const getPostIcon = createRegistrySelector(
110
113
  // `icon` is the `menu_icon` property of a post type. We
111
114
  // only handle `dashicons` for now, even if the `menu_icon`
112
115
  // also supports urls and svg as values.
113
- if ( postTypeEntity?.icon?.startsWith( 'dashicons-' ) ) {
116
+ if (
117
+ typeof postTypeEntity?.icon === 'string' &&
118
+ postTypeEntity.icon.startsWith( 'dashicons-' )
119
+ ) {
114
120
  return postTypeEntity.icon.slice( 10 );
115
121
  }
116
122
  return pageIcon;
@@ -160,3 +166,40 @@ export const hasPostMetaChanges = createRegistrySelector(
160
166
  export function getEntityActions( state, ...args ) {
161
167
  return _getEntityActions( state.dataviews, ...args );
162
168
  }
169
+
170
+ export function isEntityReady( state, ...args ) {
171
+ return _isEntityReady( state.dataviews, ...args );
172
+ }
173
+
174
+ /**
175
+ * Similar to getBlocksByName in @wordpress/block-editor, but only returns the top-most
176
+ * blocks that aren't descendants of the query block.
177
+ *
178
+ * @param {Object} state Global application state.
179
+ * @param {Array|string} blockNames Block names of the blocks to retrieve.
180
+ *
181
+ * @return {Array} Block client IDs.
182
+ */
183
+ export const getPostBlocksByName = createRegistrySelector( ( select ) =>
184
+ createSelector(
185
+ ( state, blockNames ) => {
186
+ blockNames = Array.isArray( blockNames )
187
+ ? blockNames
188
+ : [ blockNames ];
189
+ const { getBlocksByName, getBlockParents, getBlockName } =
190
+ select( blockEditorStore );
191
+ return getBlocksByName( blockNames ).filter( ( clientId ) =>
192
+ getBlockParents( clientId ).every( ( parentClientId ) => {
193
+ const parentBlockName = getBlockName( parentClientId );
194
+ return (
195
+ // Ignore descendents of the query block.
196
+ parentBlockName !== 'core/query' &&
197
+ // Enable only the top-most block.
198
+ ! blockNames.includes( parentBlockName )
199
+ );
200
+ } )
201
+ );
202
+ },
203
+ () => [ select( blockEditorStore ).getBlocks() ]
204
+ )
205
+ );
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { getPostBlocksByName } from '../private-selectors';
5
+
6
+ describe( 'getPostBlocksByName', () => {
7
+ const state = {
8
+ blocks: {
9
+ byClientId: new Map( [
10
+ [ 'block1', { name: 'core/paragraph' } ],
11
+ [ 'block2', { name: 'core/heading' } ],
12
+ [ 'block3', { name: 'core/paragraph' } ],
13
+ [ 'block4', { name: 'core/query' } ],
14
+ [ 'block5', { name: 'core/paragraph' } ],
15
+ [ 'block6', { name: 'core/heading' } ],
16
+ ] ),
17
+ order: new Map( [
18
+ [ '', [ 'block1', 'block2', 'block3', 'block4' ] ],
19
+ [ 'block4', [ 'block5', 'block6' ] ],
20
+ ] ),
21
+ parents: new Map( [
22
+ [ 'block1', '' ],
23
+ [ 'block2', '' ],
24
+ [ 'block3', '' ],
25
+ [ 'block4', '' ],
26
+ [ 'block5', 'block4' ],
27
+ [ 'block6', 'block4' ],
28
+ ] ),
29
+ },
30
+ };
31
+
32
+ getPostBlocksByName.registry = {
33
+ select: () => ( {
34
+ getBlocksByName: ( blockNames ) =>
35
+ Array.from( state.blocks.byClientId.keys() ).filter(
36
+ ( clientId ) =>
37
+ blockNames.includes(
38
+ state.blocks.byClientId.get( clientId ).name
39
+ )
40
+ ),
41
+ getBlockParents: ( clientId ) => {
42
+ const parents = [];
43
+ let parent = state.blocks.parents.get( clientId );
44
+ while ( parent ) {
45
+ parents.push( parent );
46
+ parent = state.blocks.parents.get( parent );
47
+ }
48
+ return parents;
49
+ },
50
+ getBlockName: ( clientId ) =>
51
+ state.blocks.byClientId.get( clientId ).name,
52
+ getBlocks: () => [],
53
+ } ),
54
+ };
55
+
56
+ it( 'should return top-level blocks of the specified name', () => {
57
+ const result = getPostBlocksByName( state, 'core/paragraph' );
58
+ expect( result ).toEqual( [ 'block1', 'block3' ] );
59
+ } );
60
+
61
+ it( 'should return an empty array if no blocks match', () => {
62
+ const result = getPostBlocksByName( state, 'core/non-existent' );
63
+ expect( result ).toEqual( [] );
64
+ } );
65
+
66
+ it( 'should ignore blocks inside a query block', () => {
67
+ const result = getPostBlocksByName( state, 'core/paragraph' );
68
+ expect( result ).toEqual( [ 'block1', 'block3' ] );
69
+ } );
70
+
71
+ it( 'should handle multiple block names', () => {
72
+ const result = getPostBlocksByName( state, [
73
+ 'core/paragraph',
74
+ 'core/heading',
75
+ ] );
76
+ expect( result ).toEqual( [ 'block1', 'block2', 'block3' ] );
77
+ } );
78
+ } );