@wordpress/editor 14.0.3 → 14.2.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 (279) hide show
  1. package/CHANGELOG.md +16 -12
  2. package/README.md +189 -24
  3. package/build/components/create-template-part-modal/index.js +2 -0
  4. package/build/components/create-template-part-modal/index.js.map +1 -1
  5. package/build/components/document-bar/index.js +11 -4
  6. package/build/components/document-bar/index.js.map +1 -1
  7. package/build/components/editor/index.js +18 -24
  8. package/build/components/editor/index.js.map +1 -1
  9. package/build/components/editor-interface/index.js +3 -1
  10. package/build/components/editor-interface/index.js.map +1 -1
  11. package/build/components/entities-saved-states/hooks/use-is-dirty.js +9 -0
  12. package/build/components/entities-saved-states/hooks/use-is-dirty.js.map +1 -1
  13. package/build/components/entities-saved-states/index.js +28 -0
  14. package/build/components/entities-saved-states/index.js.map +1 -1
  15. package/build/components/global-keyboard-shortcuts/index.js +1 -1
  16. package/build/components/global-keyboard-shortcuts/index.js.map +1 -1
  17. package/build/components/header/index.js +6 -2
  18. package/build/components/header/index.js.map +1 -1
  19. package/build/components/index.js +15 -0
  20. package/build/components/index.js.map +1 -1
  21. package/build/components/post-actions/actions.js +286 -263
  22. package/build/components/post-actions/actions.js.map +1 -1
  23. package/build/components/post-actions/index.js +2 -0
  24. package/build/components/post-actions/index.js.map +1 -1
  25. package/build/components/post-publish-button/index.js +4 -0
  26. package/build/components/post-publish-button/index.js.map +1 -1
  27. package/build/components/post-publish-button/label.js +5 -0
  28. package/build/components/post-publish-button/label.js.map +1 -1
  29. package/build/components/post-publish-panel/index.js +4 -0
  30. package/build/components/post-publish-panel/index.js.map +1 -1
  31. package/build/components/post-slug/check.js +8 -1
  32. package/build/components/post-slug/check.js.map +1 -1
  33. package/build/components/post-slug/index.js +6 -0
  34. package/build/components/post-slug/index.js.map +1 -1
  35. package/build/components/post-status/index.js +2 -1
  36. package/build/components/post-status/index.js.map +1 -1
  37. package/build/components/post-sticky/check.js +8 -0
  38. package/build/components/post-sticky/check.js.map +1 -1
  39. package/build/components/post-sticky/index.js +13 -13
  40. package/build/components/post-sticky/index.js.map +1 -1
  41. package/build/components/post-switch-to-draft-button/index.js +11 -2
  42. package/build/components/post-switch-to-draft-button/index.js.map +1 -1
  43. package/build/components/post-sync-status/index.js +5 -1
  44. package/build/components/post-sync-status/index.js.map +1 -1
  45. package/build/components/post-taxonomies/check.js +8 -0
  46. package/build/components/post-taxonomies/check.js.map +1 -1
  47. package/build/components/post-taxonomies/flat-term-selector.js +14 -2
  48. package/build/components/post-taxonomies/flat-term-selector.js.map +1 -1
  49. package/build/components/post-taxonomies/index.js +9 -0
  50. package/build/components/post-taxonomies/index.js.map +1 -1
  51. package/build/components/post-taxonomies/panel.js +10 -0
  52. package/build/components/post-taxonomies/panel.js.map +1 -1
  53. package/build/components/post-template/create-new-template-modal.js +2 -0
  54. package/build/components/post-template/create-new-template-modal.js.map +1 -1
  55. package/build/components/post-title/index.js +4 -8
  56. package/build/components/post-title/index.js.map +1 -1
  57. package/build/components/post-title/post-title-raw.js +3 -7
  58. package/build/components/post-title/post-title-raw.js.map +1 -1
  59. package/build/components/post-trash/check.js +8 -0
  60. package/build/components/post-trash/check.js.map +1 -1
  61. package/build/components/post-trash/index.js +5 -1
  62. package/build/components/post-trash/index.js.map +1 -1
  63. package/build/components/provider/index.js +18 -15
  64. package/build/components/provider/index.js.map +1 -1
  65. package/build/components/sidebar/index.js +2 -1
  66. package/build/components/sidebar/index.js.map +1 -1
  67. package/build/components/sidebar/post-summary.js +2 -3
  68. package/build/components/sidebar/post-summary.js.map +1 -1
  69. package/build/components/table-of-contents/index.js +11 -0
  70. package/build/components/table-of-contents/index.js.map +1 -1
  71. package/build/components/template-part-content-panel/index.js +70 -0
  72. package/build/components/template-part-content-panel/index.js.map +1 -0
  73. package/build/components/template-part-menu-items/convert-to-regular.js +38 -0
  74. package/build/components/template-part-menu-items/convert-to-regular.js.map +1 -0
  75. package/build/components/template-part-menu-items/convert-to-template-part.js +77 -0
  76. package/build/components/template-part-menu-items/convert-to-template-part.js.map +1 -0
  77. package/build/components/template-part-menu-items/index.js +67 -0
  78. package/build/components/template-part-menu-items/index.js.map +1 -0
  79. package/build/components/template-part-menu-items/index.native.js +10 -0
  80. package/build/components/template-part-menu-items/index.native.js.map +1 -0
  81. package/build/components/theme-support-check/index.js +9 -0
  82. package/build/components/theme-support-check/index.js.map +1 -1
  83. package/build/components/time-to-read/index.js +6 -0
  84. package/build/components/time-to-read/index.js.map +1 -1
  85. package/build/components/word-count/index.js +5 -1
  86. package/build/components/word-count/index.js.map +1 -1
  87. package/build/dataviews/api.js +61 -0
  88. package/build/dataviews/api.js.map +1 -0
  89. package/build/dataviews/store/private-actions.js +28 -0
  90. package/build/dataviews/store/private-actions.js.map +1 -0
  91. package/build/dataviews/store/private-selectors.js +20 -0
  92. package/build/dataviews/store/private-selectors.js.map +1 -0
  93. package/build/dataviews/store/reducer.js +36 -0
  94. package/build/dataviews/store/reducer.js.map +1 -0
  95. package/build/index.js +12 -0
  96. package/build/index.js.map +1 -1
  97. package/build/private-apis.js +0 -6
  98. package/build/private-apis.js.map +1 -1
  99. package/build/private-apis.native.js +0 -2
  100. package/build/private-apis.native.js.map +1 -1
  101. package/build/store/private-actions.js +21 -0
  102. package/build/store/private-actions.js.map +1 -1
  103. package/build/store/private-selectors.js +5 -0
  104. package/build/store/private-selectors.js.map +1 -1
  105. package/build/store/reducer.js +4 -1
  106. package/build/store/reducer.js.map +1 -1
  107. package/build-module/components/create-template-part-modal/index.js +2 -0
  108. package/build-module/components/create-template-part-modal/index.js.map +1 -1
  109. package/build-module/components/document-bar/index.js +11 -4
  110. package/build-module/components/document-bar/index.js.map +1 -1
  111. package/build-module/components/editor/index.js +19 -24
  112. package/build-module/components/editor/index.js.map +1 -1
  113. package/build-module/components/editor-interface/index.js +3 -1
  114. package/build-module/components/editor-interface/index.js.map +1 -1
  115. package/build-module/components/entities-saved-states/hooks/use-is-dirty.js +10 -0
  116. package/build-module/components/entities-saved-states/hooks/use-is-dirty.js.map +1 -1
  117. package/build-module/components/entities-saved-states/index.js +28 -0
  118. package/build-module/components/entities-saved-states/index.js.map +1 -1
  119. package/build-module/components/global-keyboard-shortcuts/index.js +1 -1
  120. package/build-module/components/global-keyboard-shortcuts/index.js.map +1 -1
  121. package/build-module/components/header/index.js +6 -2
  122. package/build-module/components/header/index.js.map +1 -1
  123. package/build-module/components/index.js +16 -0
  124. package/build-module/components/index.js.map +1 -1
  125. package/build-module/components/post-actions/actions.js +286 -263
  126. package/build-module/components/post-actions/actions.js.map +1 -1
  127. package/build-module/components/post-actions/index.js +2 -0
  128. package/build-module/components/post-actions/index.js.map +1 -1
  129. package/build-module/components/post-publish-button/index.js +4 -0
  130. package/build-module/components/post-publish-button/index.js.map +1 -1
  131. package/build-module/components/post-publish-button/label.js +6 -0
  132. package/build-module/components/post-publish-button/label.js.map +1 -1
  133. package/build-module/components/post-publish-panel/index.js +4 -0
  134. package/build-module/components/post-publish-panel/index.js.map +1 -1
  135. package/build-module/components/post-slug/check.js +9 -0
  136. package/build-module/components/post-slug/check.js.map +1 -1
  137. package/build-module/components/post-slug/index.js +6 -0
  138. package/build-module/components/post-slug/index.js.map +1 -1
  139. package/build-module/components/post-status/index.js +2 -1
  140. package/build-module/components/post-status/index.js.map +1 -1
  141. package/build-module/components/post-sticky/check.js +9 -0
  142. package/build-module/components/post-sticky/check.js.map +1 -1
  143. package/build-module/components/post-sticky/index.js +15 -13
  144. package/build-module/components/post-sticky/index.js.map +1 -1
  145. package/build-module/components/post-switch-to-draft-button/index.js +10 -1
  146. package/build-module/components/post-switch-to-draft-button/index.js.map +1 -1
  147. package/build-module/components/post-sync-status/index.js +6 -0
  148. package/build-module/components/post-sync-status/index.js.map +1 -1
  149. package/build-module/components/post-taxonomies/check.js +9 -0
  150. package/build-module/components/post-taxonomies/check.js.map +1 -1
  151. package/build-module/components/post-taxonomies/flat-term-selector.js +14 -2
  152. package/build-module/components/post-taxonomies/flat-term-selector.js.map +1 -1
  153. package/build-module/components/post-taxonomies/index.js +9 -0
  154. package/build-module/components/post-taxonomies/index.js.map +1 -1
  155. package/build-module/components/post-taxonomies/panel.js +10 -0
  156. package/build-module/components/post-taxonomies/panel.js.map +1 -1
  157. package/build-module/components/post-template/create-new-template-modal.js +2 -0
  158. package/build-module/components/post-template/create-new-template-modal.js.map +1 -1
  159. package/build-module/components/post-title/index.js +4 -8
  160. package/build-module/components/post-title/index.js.map +1 -1
  161. package/build-module/components/post-title/post-title-raw.js +3 -7
  162. package/build-module/components/post-title/post-title-raw.js.map +1 -1
  163. package/build-module/components/post-trash/check.js +9 -0
  164. package/build-module/components/post-trash/check.js.map +1 -1
  165. package/build-module/components/post-trash/index.js +6 -0
  166. package/build-module/components/post-trash/index.js.map +1 -1
  167. package/build-module/components/provider/index.js +18 -15
  168. package/build-module/components/provider/index.js.map +1 -1
  169. package/build-module/components/sidebar/index.js +2 -1
  170. package/build-module/components/sidebar/index.js.map +1 -1
  171. package/build-module/components/sidebar/post-summary.js +2 -3
  172. package/build-module/components/sidebar/post-summary.js.map +1 -1
  173. package/build-module/components/table-of-contents/index.js +11 -0
  174. package/build-module/components/table-of-contents/index.js.map +1 -1
  175. package/build-module/components/template-part-content-panel/index.js +63 -0
  176. package/build-module/components/template-part-content-panel/index.js.map +1 -0
  177. package/build-module/components/template-part-menu-items/convert-to-regular.js +31 -0
  178. package/build-module/components/template-part-menu-items/convert-to-regular.js.map +1 -0
  179. package/build-module/components/template-part-menu-items/convert-to-template-part.js +71 -0
  180. package/build-module/components/template-part-menu-items/convert-to-template-part.js.map +1 -0
  181. package/build-module/components/template-part-menu-items/index.js +59 -0
  182. package/build-module/components/template-part-menu-items/index.js.map +1 -0
  183. package/build-module/components/template-part-menu-items/index.native.js +4 -0
  184. package/build-module/components/template-part-menu-items/index.native.js.map +1 -0
  185. package/build-module/components/theme-support-check/index.js +10 -0
  186. package/build-module/components/theme-support-check/index.js.map +1 -1
  187. package/build-module/components/time-to-read/index.js +6 -0
  188. package/build-module/components/time-to-read/index.js.map +1 -1
  189. package/build-module/components/word-count/index.js +6 -0
  190. package/build-module/components/word-count/index.js.map +1 -1
  191. package/build-module/dataviews/api.js +54 -0
  192. package/build-module/dataviews/api.js.map +1 -0
  193. package/build-module/dataviews/store/private-actions.js +21 -0
  194. package/build-module/dataviews/store/private-actions.js.map +1 -0
  195. package/build-module/dataviews/store/private-selectors.js +14 -0
  196. package/build-module/dataviews/store/private-selectors.js.map +1 -0
  197. package/build-module/dataviews/store/reducer.js +29 -0
  198. package/build-module/dataviews/store/reducer.js.map +1 -0
  199. package/build-module/index.js +1 -0
  200. package/build-module/index.js.map +1 -1
  201. package/build-module/private-apis.js +0 -6
  202. package/build-module/private-apis.js.map +1 -1
  203. package/build-module/private-apis.native.js +0 -2
  204. package/build-module/private-apis.native.js.map +1 -1
  205. package/build-module/store/private-actions.js +1 -0
  206. package/build-module/store/private-actions.js.map +1 -1
  207. package/build-module/store/private-selectors.js +4 -0
  208. package/build-module/store/private-selectors.js.map +1 -1
  209. package/build-module/store/reducer.js +3 -1
  210. package/build-module/store/reducer.js.map +1 -1
  211. package/build-style/style-rtl.css +10 -9
  212. package/build-style/style.css +10 -9
  213. package/build-types/dataviews/store/private-actions.d.ts +17 -0
  214. package/build-types/dataviews/store/private-actions.d.ts.map +1 -0
  215. package/build-types/dataviews/store/private-selectors.d.ts +10 -0
  216. package/build-types/dataviews/store/private-selectors.d.ts.map +1 -0
  217. package/build-types/dataviews/store/reducer.d.ts +11 -0
  218. package/build-types/dataviews/store/reducer.d.ts.map +1 -0
  219. package/package.json +35 -35
  220. package/src/components/create-template-part-modal/index.js +2 -0
  221. package/src/components/create-template-part-modal/style.scss +0 -6
  222. package/src/components/document-bar/index.js +11 -4
  223. package/src/components/editor/index.js +23 -28
  224. package/src/components/editor-interface/index.js +2 -0
  225. package/src/components/entities-saved-states/hooks/use-is-dirty.js +9 -0
  226. package/src/components/entities-saved-states/index.js +26 -0
  227. package/src/components/global-keyboard-shortcuts/index.js +1 -1
  228. package/src/components/header/index.js +2 -1
  229. package/src/components/index.js +16 -0
  230. package/src/components/keyboard-shortcut-help-modal/style.scss +0 -3
  231. package/src/components/post-actions/actions.js +376 -387
  232. package/src/components/post-actions/index.js +2 -0
  233. package/src/components/post-card-panel/style.scss +4 -0
  234. package/src/components/post-panel-row/style.scss +1 -1
  235. package/src/components/post-publish-button/index.js +3 -0
  236. package/src/components/post-publish-button/label.js +5 -0
  237. package/src/components/post-publish-panel/index.js +3 -0
  238. package/src/components/post-slug/check.js +8 -0
  239. package/src/components/post-slug/index.js +5 -0
  240. package/src/components/post-status/index.js +2 -0
  241. package/src/components/post-status/style.scss +5 -0
  242. package/src/components/post-sticky/check.js +8 -0
  243. package/src/components/post-sticky/index.js +14 -12
  244. package/src/components/post-sticky/style.scss +3 -2
  245. package/src/components/post-switch-to-draft-button/index.js +10 -1
  246. package/src/components/post-sync-status/index.js +5 -0
  247. package/src/components/post-taxonomies/check.js +8 -0
  248. package/src/components/post-taxonomies/flat-term-selector.js +13 -2
  249. package/src/components/post-taxonomies/index.js +8 -0
  250. package/src/components/post-taxonomies/panel.js +9 -0
  251. package/src/components/post-template/create-new-template-modal.js +2 -0
  252. package/src/components/post-title/index.js +2 -5
  253. package/src/components/post-title/post-title-raw.js +2 -5
  254. package/src/components/post-trash/check.js +8 -0
  255. package/src/components/post-trash/index.js +5 -0
  256. package/src/components/provider/index.js +17 -17
  257. package/src/components/sidebar/index.js +2 -0
  258. package/src/components/sidebar/post-summary.js +1 -3
  259. package/src/components/table-of-contents/index.js +10 -0
  260. package/src/components/template-part-content-panel/index.js +62 -0
  261. package/src/components/template-part-menu-items/convert-to-regular.js +32 -0
  262. package/src/components/template-part-menu-items/convert-to-template-part.js +75 -0
  263. package/src/components/template-part-menu-items/index.js +59 -0
  264. package/src/components/template-part-menu-items/index.native.js +3 -0
  265. package/src/components/theme-support-check/index.js +9 -0
  266. package/src/components/time-to-read/index.js +5 -0
  267. package/src/components/word-count/index.js +5 -0
  268. package/src/dataviews/api.js +55 -0
  269. package/src/dataviews/store/private-actions.ts +30 -0
  270. package/src/dataviews/store/private-selectors.ts +15 -0
  271. package/src/dataviews/store/reducer.ts +44 -0
  272. package/src/index.js +1 -0
  273. package/src/private-apis.js +0 -6
  274. package/src/private-apis.native.js +0 -2
  275. package/src/store/private-actions.js +1 -0
  276. package/src/store/private-selectors.js +5 -0
  277. package/src/store/reducer.js +2 -0
  278. package/tsconfig.json +36 -0
  279. package/tsconfig.tsbuildinfo +1 -0
@@ -78,7 +78,6 @@ const deletePostAction = {
78
78
  RenderModal: ({
79
79
  items,
80
80
  closeModal,
81
- onActionStart,
82
81
  onActionPerformed
83
82
  }) => {
84
83
  const [isBusy, setIsBusy] = useState(false);
@@ -105,9 +104,6 @@ const deletePostAction = {
105
104
  variant: "primary",
106
105
  onClick: async () => {
107
106
  setIsBusy(true);
108
- if (onActionStart) {
109
- onActionStart(items);
110
- }
111
107
  await removeTemplates(items, {
112
108
  allowUndo: false
113
109
  });
@@ -124,15 +120,6 @@ const deletePostAction = {
124
120
  });
125
121
  }
126
122
  };
127
- function useCanUserEligibilityCheckPostType(capability, resource, action) {
128
- const registry = useRegistry();
129
- return useMemo(() => ({
130
- ...action,
131
- isEligible(item) {
132
- return action.isEligible(item) && registry.select(coreStore).canUser(capability, resource, item.id);
133
- }
134
- }), [action, registry, capability, resource]);
135
- }
136
123
  const trashPostAction = {
137
124
  id: 'move-to-trash',
138
125
  label: __('Move to Trash'),
@@ -146,7 +133,6 @@ const trashPostAction = {
146
133
  RenderModal: ({
147
134
  items,
148
135
  closeModal,
149
- onActionStart,
150
136
  onActionPerformed
151
137
  }) => {
152
138
  const [isBusy, setIsBusy] = useState(false);
@@ -177,9 +163,6 @@ const trashPostAction = {
177
163
  variant: "primary",
178
164
  onClick: async () => {
179
165
  setIsBusy(true);
180
- if (onActionStart) {
181
- onActionStart(items);
182
- }
183
166
  const promiseResult = await Promise.allSettled(items.map(item => deleteEntityRecord('postType', item.type, item.id, {}, {
184
167
  throwOnError: true
185
168
  })));
@@ -252,180 +235,191 @@ const trashPostAction = {
252
235
  });
253
236
  }
254
237
  };
238
+ function useCanUserEligibilityCheckPostType(capability, resource, action) {
239
+ const registry = useRegistry();
240
+ return useMemo(() => ({
241
+ ...action,
242
+ isEligible(item) {
243
+ return action.isEligible(item) && registry.select(coreStore).canUser(capability, resource, item.id);
244
+ }
245
+ }), [action, registry, capability, resource]);
246
+ }
255
247
  function useTrashPostAction(resource) {
256
248
  return useCanUserEligibilityCheckPostType('delete', resource, trashPostAction);
257
249
  }
258
- function usePermanentlyDeletePostAction(resource) {
259
- const {
260
- createSuccessNotice,
261
- createErrorNotice
262
- } = useDispatch(noticesStore);
263
- const {
264
- deleteEntityRecord
265
- } = useDispatch(coreStore);
266
- const permanentlyDeletePostAction = useMemo(() => ({
267
- id: 'permanently-delete',
268
- label: __('Permanently delete'),
269
- supportsBulk: true,
270
- isEligible({
250
+ const permanentlyDeletePostAction = {
251
+ id: 'permanently-delete',
252
+ label: __('Permanently delete'),
253
+ supportsBulk: true,
254
+ isEligible({
255
+ status
256
+ }) {
257
+ return status === 'trash';
258
+ },
259
+ async callback(posts, {
260
+ registry
261
+ }) {
262
+ const {
263
+ createSuccessNotice,
264
+ createErrorNotice
265
+ } = registry.dispatch(noticesStore);
266
+ const {
267
+ deleteEntityRecord
268
+ } = registry.dispatch(coreStore);
269
+ const promiseResult = await Promise.allSettled(posts.map(post => {
270
+ return deleteEntityRecord('postType', post.type, post.id, {
271
+ force: true
272
+ }, {
273
+ throwOnError: true
274
+ });
275
+ }));
276
+ // If all the promises were fulfilled with success.
277
+ if (promiseResult.every(({
271
278
  status
272
- }) {
273
- return status === 'trash';
274
- },
275
- async callback(posts, onActionPerformed) {
276
- const promiseResult = await Promise.allSettled(posts.map(post => {
277
- return deleteEntityRecord('postType', post.type, post.id, {
278
- force: true
279
- }, {
280
- throwOnError: true
281
- });
282
- }));
283
- // If all the promises were fulfilled with success.
284
- if (promiseResult.every(({
285
- status
286
- }) => status === 'fulfilled')) {
287
- let successMessage;
288
- if (promiseResult.length === 1) {
289
- successMessage = sprintf( /* translators: The posts's title. */
290
- __('"%s" permanently deleted.'), getItemTitle(posts[0]));
279
+ }) => status === 'fulfilled')) {
280
+ let successMessage;
281
+ if (promiseResult.length === 1) {
282
+ successMessage = sprintf( /* translators: The posts's title. */
283
+ __('"%s" permanently deleted.'), getItemTitle(posts[0]));
284
+ } else {
285
+ successMessage = __('The posts were permanently deleted.');
286
+ }
287
+ createSuccessNotice(successMessage, {
288
+ type: 'snackbar',
289
+ id: 'permanently-delete-post-action'
290
+ });
291
+ } else {
292
+ // If there was at lease one failure.
293
+ let errorMessage;
294
+ // If we were trying to permanently delete a single post.
295
+ if (promiseResult.length === 1) {
296
+ if (promiseResult[0].reason?.message) {
297
+ errorMessage = promiseResult[0].reason.message;
291
298
  } else {
292
- successMessage = __('The posts were permanently deleted.');
293
- }
294
- createSuccessNotice(successMessage, {
295
- type: 'snackbar',
296
- id: 'permanently-delete-post-action'
297
- });
298
- if (onActionPerformed) {
299
- onActionPerformed(posts);
299
+ errorMessage = __('An error occurred while permanently deleting the post.');
300
300
  }
301
+ // If we were trying to permanently delete multiple posts
301
302
  } else {
302
- // If there was at lease one failure.
303
- let errorMessage;
304
- // If we were trying to permanently delete a single post.
305
- if (promiseResult.length === 1) {
306
- if (promiseResult[0].reason?.message) {
307
- errorMessage = promiseResult[0].reason.message;
308
- } else {
309
- errorMessage = __('An error occurred while permanently deleting the post.');
303
+ const errorMessages = new Set();
304
+ const failedPromises = promiseResult.filter(({
305
+ status
306
+ }) => status === 'rejected');
307
+ for (const failedPromise of failedPromises) {
308
+ if (failedPromise.reason?.message) {
309
+ errorMessages.add(failedPromise.reason.message);
310
310
  }
311
- // If we were trying to permanently delete multiple posts
311
+ }
312
+ if (errorMessages.size === 0) {
313
+ errorMessage = __('An error occurred while permanently deleting the posts.');
314
+ } else if (errorMessages.size === 1) {
315
+ errorMessage = sprintf( /* translators: %s: an error message */
316
+ __('An error occurred while permanently deleting the posts: %s'), [...errorMessages][0]);
312
317
  } else {
313
- const errorMessages = new Set();
314
- const failedPromises = promiseResult.filter(({
315
- status
316
- }) => status === 'rejected');
317
- for (const failedPromise of failedPromises) {
318
- if (failedPromise.reason?.message) {
319
- errorMessages.add(failedPromise.reason.message);
320
- }
321
- }
322
- if (errorMessages.size === 0) {
323
- errorMessage = __('An error occurred while permanently deleting the posts.');
324
- } else if (errorMessages.size === 1) {
325
- errorMessage = sprintf( /* translators: %s: an error message */
326
- __('An error occurred while permanently deleting the posts: %s'), [...errorMessages][0]);
327
- } else {
328
- errorMessage = sprintf( /* translators: %s: a list of comma separated error messages */
329
- __('Some errors occurred while permanently deleting the posts: %s'), [...errorMessages].join(','));
330
- }
318
+ errorMessage = sprintf( /* translators: %s: a list of comma separated error messages */
319
+ __('Some errors occurred while permanently deleting the posts: %s'), [...errorMessages].join(','));
331
320
  }
332
- createErrorNotice(errorMessage, {
333
- type: 'snackbar'
334
- });
335
321
  }
322
+ createErrorNotice(errorMessage, {
323
+ type: 'snackbar'
324
+ });
336
325
  }
337
- }), [createSuccessNotice, createErrorNotice, deleteEntityRecord]);
326
+ }
327
+ };
328
+ function usePermanentlyDeletePostAction(resource) {
338
329
  return useCanUserEligibilityCheckPostType('delete', resource, permanentlyDeletePostAction);
339
330
  }
340
- function useRestorePostAction(resource) {
341
- const {
342
- createSuccessNotice,
343
- createErrorNotice
344
- } = useDispatch(noticesStore);
345
- const {
346
- editEntityRecord,
347
- saveEditedEntityRecord
348
- } = useDispatch(coreStore);
349
- const restorePostAction = useMemo(() => ({
350
- id: 'restore',
351
- label: __('Restore'),
352
- isPrimary: true,
353
- icon: backup,
354
- supportsBulk: true,
355
- isEligible({
331
+ const restorePostAction = {
332
+ id: 'restore',
333
+ label: __('Restore'),
334
+ isPrimary: true,
335
+ icon: backup,
336
+ supportsBulk: true,
337
+ isEligible({
338
+ status
339
+ }) {
340
+ return status === 'trash';
341
+ },
342
+ async callback(posts, {
343
+ registry,
344
+ onActionPerformed
345
+ }) {
346
+ const {
347
+ createSuccessNotice,
348
+ createErrorNotice
349
+ } = registry.dispatch(noticesStore);
350
+ const {
351
+ editEntityRecord,
352
+ saveEditedEntityRecord
353
+ } = registry.dispatch(coreStore);
354
+ await Promise.allSettled(posts.map(post => {
355
+ return editEntityRecord('postType', post.type, post.id, {
356
+ status: 'draft'
357
+ });
358
+ }));
359
+ const promiseResult = await Promise.allSettled(posts.map(post => {
360
+ return saveEditedEntityRecord('postType', post.type, post.id, {
361
+ throwOnError: true
362
+ });
363
+ }));
364
+ if (promiseResult.every(({
356
365
  status
357
- }) {
358
- return status === 'trash';
359
- },
360
- async callback(posts, onActionPerformed) {
361
- await Promise.allSettled(posts.map(post => {
362
- return editEntityRecord('postType', post.type, post.id, {
363
- status: 'draft'
364
- });
365
- }));
366
- const promiseResult = await Promise.allSettled(posts.map(post => {
367
- return saveEditedEntityRecord('postType', post.type, post.id, {
368
- throwOnError: true
369
- });
370
- }));
371
- if (promiseResult.every(({
372
- status
373
- }) => status === 'fulfilled')) {
374
- let successMessage;
375
- if (posts.length === 1) {
376
- successMessage = sprintf( /* translators: The number of posts. */
377
- __('"%s" has been restored.'), getItemTitle(posts[0]));
378
- } else if (posts[0].type === 'page') {
379
- successMessage = sprintf( /* translators: The number of posts. */
380
- __('%d pages have been restored.'), posts.length);
366
+ }) => status === 'fulfilled')) {
367
+ let successMessage;
368
+ if (posts.length === 1) {
369
+ successMessage = sprintf( /* translators: The number of posts. */
370
+ __('"%s" has been restored.'), getItemTitle(posts[0]));
371
+ } else if (posts[0].type === 'page') {
372
+ successMessage = sprintf( /* translators: The number of posts. */
373
+ __('%d pages have been restored.'), posts.length);
374
+ } else {
375
+ successMessage = sprintf( /* translators: The number of posts. */
376
+ __('%d posts have been restored.'), posts.length);
377
+ }
378
+ createSuccessNotice(successMessage, {
379
+ type: 'snackbar',
380
+ id: 'restore-post-action'
381
+ });
382
+ if (onActionPerformed) {
383
+ onActionPerformed(posts);
384
+ }
385
+ } else {
386
+ // If there was at lease one failure.
387
+ let errorMessage;
388
+ // If we were trying to move a single post to the trash.
389
+ if (promiseResult.length === 1) {
390
+ if (promiseResult[0].reason?.message) {
391
+ errorMessage = promiseResult[0].reason.message;
381
392
  } else {
382
- successMessage = sprintf( /* translators: The number of posts. */
383
- __('%d posts have been restored.'), posts.length);
384
- }
385
- createSuccessNotice(successMessage, {
386
- type: 'snackbar',
387
- id: 'restore-post-action'
388
- });
389
- if (onActionPerformed) {
390
- onActionPerformed(posts);
393
+ errorMessage = __('An error occurred while restoring the post.');
391
394
  }
395
+ // If we were trying to move multiple posts to the trash
392
396
  } else {
393
- // If there was at lease one failure.
394
- let errorMessage;
395
- // If we were trying to move a single post to the trash.
396
- if (promiseResult.length === 1) {
397
- if (promiseResult[0].reason?.message) {
398
- errorMessage = promiseResult[0].reason.message;
399
- } else {
400
- errorMessage = __('An error occurred while restoring the post.');
397
+ const errorMessages = new Set();
398
+ const failedPromises = promiseResult.filter(({
399
+ status
400
+ }) => status === 'rejected');
401
+ for (const failedPromise of failedPromises) {
402
+ if (failedPromise.reason?.message) {
403
+ errorMessages.add(failedPromise.reason.message);
401
404
  }
402
- // If we were trying to move multiple posts to the trash
405
+ }
406
+ if (errorMessages.size === 0) {
407
+ errorMessage = __('An error occurred while restoring the posts.');
408
+ } else if (errorMessages.size === 1) {
409
+ errorMessage = sprintf( /* translators: %s: an error message */
410
+ __('An error occurred while restoring the posts: %s'), [...errorMessages][0]);
403
411
  } else {
404
- const errorMessages = new Set();
405
- const failedPromises = promiseResult.filter(({
406
- status
407
- }) => status === 'rejected');
408
- for (const failedPromise of failedPromises) {
409
- if (failedPromise.reason?.message) {
410
- errorMessages.add(failedPromise.reason.message);
411
- }
412
- }
413
- if (errorMessages.size === 0) {
414
- errorMessage = __('An error occurred while restoring the posts.');
415
- } else if (errorMessages.size === 1) {
416
- errorMessage = sprintf( /* translators: %s: an error message */
417
- __('An error occurred while restoring the posts: %s'), [...errorMessages][0]);
418
- } else {
419
- errorMessage = sprintf( /* translators: %s: a list of comma separated error messages */
420
- __('Some errors occurred while restoring the posts: %s'), [...errorMessages].join(','));
421
- }
412
+ errorMessage = sprintf( /* translators: %s: a list of comma separated error messages */
413
+ __('Some errors occurred while restoring the posts: %s'), [...errorMessages].join(','));
422
414
  }
423
- createErrorNotice(errorMessage, {
424
- type: 'snackbar'
425
- });
426
415
  }
416
+ createErrorNotice(errorMessage, {
417
+ type: 'snackbar'
418
+ });
427
419
  }
428
- }), [createSuccessNotice, createErrorNotice, editEntityRecord, saveEditedEntityRecord]);
420
+ }
421
+ };
422
+ function useRestorePostAction(resource) {
429
423
  return useCanUserEligibilityCheckPostType('update', resource, restorePostAction);
430
424
  }
431
425
  const viewPostAction = {
@@ -436,7 +430,9 @@ const viewPostAction = {
436
430
  isEligible(post) {
437
431
  return post.status !== 'trash';
438
432
  },
439
- callback(posts, onActionPerformed) {
433
+ callback(posts, {
434
+ onActionPerformed
435
+ }) {
440
436
  const post = posts[0];
441
437
  window.open(post.link, '_blank');
442
438
  if (onActionPerformed) {
@@ -462,7 +458,9 @@ const postRevisionsAction = {
462
458
  const revisionsCount = (_post$_links$version = post?._links?.['version-history']?.[0]?.count) !== null && _post$_links$version !== void 0 ? _post$_links$version : 0;
463
459
  return lastRevisionId && revisionsCount > 1;
464
460
  },
465
- callback(posts, onActionPerformed) {
461
+ callback(posts, {
462
+ onActionPerformed
463
+ }) {
466
464
  const post = posts[0];
467
465
  const href = addQueryArgs('revision.php', {
468
466
  revision: post?._links?.['predecessor-version']?.[0]?.id
@@ -572,42 +570,52 @@ const renamePostAction = {
572
570
  function useRenamePostAction(resource) {
573
571
  return useCanUserEligibilityCheckPostType('update', resource, renamePostAction);
574
572
  }
575
- const duplicatePostAction = {
576
- id: 'duplicate-post',
577
- label: _x('Duplicate', 'action label'),
578
- isEligible({
579
- status
580
- }) {
581
- return status !== 'trash';
582
- },
583
- RenderModal: ({
584
- items,
585
- closeModal,
586
- onActionPerformed
587
- }) => {
588
- const [item] = items;
589
- const [isCreatingPage, setIsCreatingPage] = useState(false);
590
- const [title, setTitle] = useState(sprintf( /* translators: %s: Existing item title */
591
- __('%s (Copy)'), getItemTitle(item)));
592
- const {
593
- saveEntityRecord
594
- } = useDispatch(coreStore);
573
+ const useDuplicatePostAction = postType => {
574
+ const {
575
+ userCanCreatePost
576
+ } = useSelect(select => {
595
577
  const {
596
- createSuccessNotice,
597
- createErrorNotice
598
- } = useDispatch(noticesStore);
599
- async function createPage(event) {
600
- event.preventDefault();
601
- if (isCreatingPage) {
602
- return;
603
- }
604
- setIsCreatingPage(true);
605
- try {
606
- const newItem = await saveEntityRecord('postType', item.type, {
578
+ getPostType,
579
+ canUser
580
+ } = select(coreStore);
581
+ const resource = getPostType(postType)?.rest_base || '';
582
+ return {
583
+ userCanCreatePost: canUser('create', resource)
584
+ };
585
+ }, [postType]);
586
+ return useMemo(() => userCanCreatePost && {
587
+ id: 'duplicate-post',
588
+ label: _x('Duplicate', 'action label'),
589
+ isEligible({
590
+ status
591
+ }) {
592
+ return status !== 'trash';
593
+ },
594
+ RenderModal: ({
595
+ items,
596
+ closeModal,
597
+ onActionPerformed
598
+ }) => {
599
+ const [item] = items;
600
+ const [isCreatingPage, setIsCreatingPage] = useState(false);
601
+ const [title, setTitle] = useState(sprintf( /* translators: %s: Existing item title */
602
+ __('%s (Copy)'), getItemTitle(item)));
603
+ const {
604
+ saveEntityRecord
605
+ } = useDispatch(coreStore);
606
+ const {
607
+ createSuccessNotice,
608
+ createErrorNotice
609
+ } = useDispatch(noticesStore);
610
+ async function createPage(event) {
611
+ event.preventDefault();
612
+ if (isCreatingPage) {
613
+ return;
614
+ }
615
+ const newItemOject = {
607
616
  status: 'draft',
608
617
  title,
609
618
  slug: title || __('No title'),
610
- author: item.author,
611
619
  comment_status: item.comment_status,
612
620
  content: typeof item.content === 'string' ? item.content : item.content.raw,
613
621
  excerpt: item.excerpt.raw,
@@ -618,58 +626,69 @@ const duplicatePostAction = {
618
626
  format: item.format,
619
627
  featured_media: item.featured_media,
620
628
  menu_order: item.menu_order,
621
- ping_status: item.ping_status,
622
- categories: item.categories,
623
- tags: item.tags
624
- }, {
625
- throwOnError: true
626
- });
627
- createSuccessNotice(sprintf(
628
- // translators: %s: Title of the created template e.g: "Category".
629
- __('"%s" successfully created.'), decodeEntities(newItem.title?.rendered || title)), {
630
- id: 'duplicate-post-action',
631
- type: 'snackbar'
629
+ ping_status: item.ping_status
630
+ };
631
+ const assignablePropertiesPrefix = 'wp:action-assign-';
632
+ // Get all the properties that the current user is able to assign normally author, categories, tags,
633
+ // and custom taxonomies.
634
+ const assignableProperties = Object.keys(item?._links || {}).filter(property => property.startsWith(assignablePropertiesPrefix)).map(property => property.slice(assignablePropertiesPrefix.length));
635
+ assignableProperties.forEach(property => {
636
+ if (item[property]) {
637
+ newItemOject[property] = item[property];
638
+ }
632
639
  });
633
- if (onActionPerformed) {
634
- onActionPerformed([newItem]);
640
+ setIsCreatingPage(true);
641
+ try {
642
+ const newItem = await saveEntityRecord('postType', item.type, newItemOject, {
643
+ throwOnError: true
644
+ });
645
+ createSuccessNotice(sprintf(
646
+ // translators: %s: Title of the created template e.g: "Category".
647
+ __('"%s" successfully created.'), decodeEntities(newItem.title?.rendered || title)), {
648
+ id: 'duplicate-post-action',
649
+ type: 'snackbar'
650
+ });
651
+ if (onActionPerformed) {
652
+ onActionPerformed([newItem]);
653
+ }
654
+ } catch (error) {
655
+ const errorMessage = error.message && error.code !== 'unknown_error' ? error.message : __('An error occurred while duplicating the page.');
656
+ createErrorNotice(errorMessage, {
657
+ type: 'snackbar'
658
+ });
659
+ } finally {
660
+ setIsCreatingPage(false);
661
+ closeModal();
635
662
  }
636
- } catch (error) {
637
- const errorMessage = error.message && error.code !== 'unknown_error' ? error.message : __('An error occurred while duplicating the page.');
638
- createErrorNotice(errorMessage, {
639
- type: 'snackbar'
640
- });
641
- } finally {
642
- setIsCreatingPage(false);
643
- closeModal();
644
663
  }
645
- }
646
- return /*#__PURE__*/_jsx("form", {
647
- onSubmit: createPage,
648
- children: /*#__PURE__*/_jsxs(VStack, {
649
- spacing: 3,
650
- children: [/*#__PURE__*/_jsx(TextControl, {
651
- label: __('Title'),
652
- onChange: setTitle,
653
- placeholder: __('No title'),
654
- value: title
655
- }), /*#__PURE__*/_jsxs(HStack, {
656
- spacing: 2,
657
- justify: "end",
658
- children: [/*#__PURE__*/_jsx(Button, {
659
- variant: "tertiary",
660
- onClick: closeModal,
661
- children: __('Cancel')
662
- }), /*#__PURE__*/_jsx(Button, {
663
- variant: "primary",
664
- type: "submit",
665
- isBusy: isCreatingPage,
666
- "aria-disabled": isCreatingPage,
667
- children: _x('Duplicate', 'action label')
664
+ return /*#__PURE__*/_jsx("form", {
665
+ onSubmit: createPage,
666
+ children: /*#__PURE__*/_jsxs(VStack, {
667
+ spacing: 3,
668
+ children: [/*#__PURE__*/_jsx(TextControl, {
669
+ label: __('Title'),
670
+ onChange: setTitle,
671
+ placeholder: __('No title'),
672
+ value: title
673
+ }), /*#__PURE__*/_jsxs(HStack, {
674
+ spacing: 2,
675
+ justify: "end",
676
+ children: [/*#__PURE__*/_jsx(Button, {
677
+ variant: "tertiary",
678
+ onClick: closeModal,
679
+ children: __('Cancel')
680
+ }), /*#__PURE__*/_jsx(Button, {
681
+ variant: "primary",
682
+ type: "submit",
683
+ isBusy: isCreatingPage,
684
+ "aria-disabled": isCreatingPage,
685
+ children: _x('Duplicate', 'action label')
686
+ })]
668
687
  })]
669
- })]
670
- })
671
- });
672
- }
688
+ })
689
+ });
690
+ }
691
+ }, [userCanCreatePost]);
673
692
  };
674
693
  const isTemplatePartRevertable = item => {
675
694
  if (!item) {
@@ -690,7 +709,6 @@ const resetTemplateAction = {
690
709
  RenderModal: ({
691
710
  items,
692
711
  closeModal,
693
- onActionStart,
694
712
  onActionPerformed
695
713
  }) => {
696
714
  const [isBusy, setIsBusy] = useState(false);
@@ -754,9 +772,6 @@ const resetTemplateAction = {
754
772
  variant: "primary",
755
773
  onClick: async () => {
756
774
  setIsBusy(true);
757
- if (onActionStart) {
758
- onActionStart(items);
759
- }
760
775
  await onConfirm(items);
761
776
  onActionPerformed?.(items);
762
777
  setIsBusy(false);
@@ -832,25 +847,31 @@ export function usePostActions({
832
847
  context
833
848
  }) {
834
849
  const {
850
+ defaultActions,
835
851
  postTypeObject,
852
+ userCanCreatePostType,
836
853
  resource,
837
- cachedCanUserResolvers,
838
- userCanCreatePostType
854
+ cachedCanUserResolvers
839
855
  } = useSelect(select => {
840
856
  const {
841
857
  getPostType,
842
- getCachedResolvers,
843
- canUser
858
+ canUser,
859
+ getCachedResolvers
844
860
  } = select(coreStore);
861
+ const {
862
+ getEntityActions
863
+ } = unlock(select(editorStore));
845
864
  const _postTypeObject = getPostType(postType);
846
865
  const _resource = _postTypeObject?.rest_base || '';
847
866
  return {
848
867
  postTypeObject: _postTypeObject,
868
+ defaultActions: getEntityActions('postType', postType),
869
+ userCanCreatePostType: canUser('create', _resource),
849
870
  resource: _resource,
850
- cachedCanUserResolvers: getCachedResolvers()?.canUser,
851
- userCanCreatePostType: canUser('create', _resource)
871
+ cachedCanUserResolvers: getCachedResolvers()?.canUser
852
872
  };
853
873
  }, [postType]);
874
+ const duplicatePostAction = useDuplicatePostAction(postType);
854
875
  const trashPostActionForPostType = useTrashPostAction(resource);
855
876
  const permanentlyDeletePostActionForPostType = usePermanentlyDeletePostAction(resource);
856
877
  const renamePostActionForPostType = useRenamePostAction(resource);
@@ -864,7 +885,7 @@ export function usePostActions({
864
885
  if (!isLoaded) {
865
886
  return [];
866
887
  }
867
- let actions = [postTypeObject?.viewable && viewPostAction, supportsRevisions && postRevisionsAction, globalThis.IS_GUTENBERG_PLUGIN ? !isTemplateOrTemplatePart && !isPattern && duplicatePostAction : false, isTemplateOrTemplatePart && userCanCreatePostType && duplicateTemplatePartAction, isPattern && userCanCreatePostType && duplicatePatternAction, supportsTitle && renamePostActionForPostType, isPattern && exportPatternAsJSONAction, isTemplateOrTemplatePart ? resetTemplateAction : restorePostActionForPostType, isTemplateOrTemplatePart || isPattern ? deletePostAction : trashPostActionForPostType, !isTemplateOrTemplatePart && permanentlyDeletePostActionForPostType].filter(Boolean);
888
+ let actions = [postTypeObject?.viewable && viewPostAction, supportsRevisions && postRevisionsAction, globalThis.IS_GUTENBERG_PLUGIN ? !isTemplateOrTemplatePart && !isPattern && duplicatePostAction : false, isTemplateOrTemplatePart && userCanCreatePostType && duplicateTemplatePartAction, isPattern && userCanCreatePostType && duplicatePatternAction, supportsTitle && renamePostActionForPostType, isPattern && exportPatternAsJSONAction, isTemplateOrTemplatePart ? resetTemplateAction : restorePostActionForPostType, isTemplateOrTemplatePart || isPattern ? deletePostAction : trashPostActionForPostType, !isTemplateOrTemplatePart && permanentlyDeletePostActionForPostType, ...defaultActions].filter(Boolean);
868
889
  // Filter actions based on provided context. If not provided
869
890
  // all actions are returned. We'll have a single entry for getting the actions
870
891
  // and the consumer should provide the context to filter the actions, if needed.
@@ -883,7 +904,9 @@ export function usePostActions({
883
904
  const existingCallback = actions[i].callback;
884
905
  actions[i] = {
885
906
  ...actions[i],
886
- callback: (items, _onActionPerformed) => {
907
+ callback: (items, {
908
+ _onActionPerformed
909
+ }) => {
887
910
  existingCallback(items, _items => {
888
911
  if (_onActionPerformed) {
889
912
  _onActionPerformed(_items);
@@ -916,6 +939,6 @@ export function usePostActions({
916
939
  // We are making this use memo depend on cachedCanUserResolvers as a way to make the component using this hook re-render
917
940
  // when user capabilities are resolved. This makes sure the isEligible functions of actions dependent on capabilities are re-evaluated.
918
941
  // eslint-disable-next-line react-hooks/exhaustive-deps
919
- }, [isTemplateOrTemplatePart, isPattern, postTypeObject?.viewable, permanentlyDeletePostActionForPostType, restorePostActionForPostType, renamePostActionForPostType, trashPostActionForPostType, onActionPerformed, isLoaded, supportsRevisions, supportsTitle, context, userCanCreatePostType, cachedCanUserResolvers]);
942
+ }, [defaultActions, userCanCreatePostType, isTemplateOrTemplatePart, isPattern, postTypeObject?.viewable, duplicatePostAction, trashPostActionForPostType, restorePostActionForPostType, renamePostActionForPostType, permanentlyDeletePostActionForPostType, onActionPerformed, isLoaded, supportsRevisions, supportsTitle, context, cachedCanUserResolvers]);
920
943
  }
921
944
  //# sourceMappingURL=actions.js.map