@wordpress/block-library 8.5.0 → 8.6.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 (287) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/buttons/edit.native.js +1 -1
  3. package/build/buttons/edit.native.js.map +1 -1
  4. package/build/columns/edit.js +10 -8
  5. package/build/columns/edit.js.map +1 -1
  6. package/build/columns/edit.native.js +1 -1
  7. package/build/columns/edit.native.js.map +1 -1
  8. package/build/comments/edit/placeholder.js +8 -5
  9. package/build/comments/edit/placeholder.js.map +1 -1
  10. package/build/cover/index.js +13 -4
  11. package/build/cover/index.js.map +1 -1
  12. package/build/cover/variations.js +29 -0
  13. package/build/cover/variations.js.map +1 -0
  14. package/build/embed/edit.js +13 -14
  15. package/build/embed/edit.js.map +1 -1
  16. package/build/embed/edit.native.js +18 -14
  17. package/build/embed/edit.native.js.map +1 -1
  18. package/build/embed/util.js +39 -12
  19. package/build/embed/util.js.map +1 -1
  20. package/build/gallery/edit.js +1 -0
  21. package/build/gallery/edit.js.map +1 -1
  22. package/build/latest-posts/edit.js +10 -10
  23. package/build/latest-posts/edit.js.map +1 -1
  24. package/build/latest-posts/edit.native.js +3 -3
  25. package/build/latest-posts/edit.native.js.map +1 -1
  26. package/build/media-text/constants.js +17 -1
  27. package/build/media-text/constants.js.map +1 -1
  28. package/build/media-text/edit.js +7 -19
  29. package/build/media-text/edit.js.map +1 -1
  30. package/build/media-text/edit.native.js +6 -5
  31. package/build/media-text/edit.native.js.map +1 -1
  32. package/build/media-text/transforms.js +32 -44
  33. package/build/media-text/transforms.js.map +1 -1
  34. package/build/navigation/edit/index.js +56 -86
  35. package/build/navigation/edit/index.js.map +1 -1
  36. package/build/navigation/edit/inner-blocks.js +4 -1
  37. package/build/navigation/edit/inner-blocks.js.map +1 -1
  38. package/build/navigation/edit/menu-inspector-controls.js +2 -5
  39. package/build/navigation/edit/menu-inspector-controls.js.map +1 -1
  40. package/build/navigation/edit/navigation-menu-selector.js +26 -22
  41. package/build/navigation/edit/navigation-menu-selector.js.map +1 -1
  42. package/build/navigation/edit/unsaved-inner-blocks.js +14 -1
  43. package/build/navigation/edit/unsaved-inner-blocks.js.map +1 -1
  44. package/build/navigation/edit/use-convert-classic-menu-to-block-menu.js +2 -4
  45. package/build/navigation/edit/use-convert-classic-menu-to-block-menu.js.map +1 -1
  46. package/build/navigation/edit/use-create-navigation-menu.js +1 -1
  47. package/build/navigation/edit/use-create-navigation-menu.js.map +1 -1
  48. package/build/navigation/edit/use-navigation-notice.js +1 -1
  49. package/build/navigation/edit/use-navigation-notice.js.map +1 -1
  50. package/build/navigation-link/edit.js +0 -11
  51. package/build/navigation-link/edit.js.map +1 -1
  52. package/build/navigation-link/link-ui.js +0 -1
  53. package/build/navigation-link/link-ui.js.map +1 -1
  54. package/build/navigation-submenu/edit.js +1 -13
  55. package/build/navigation-submenu/edit.js.map +1 -1
  56. package/build/page-list/edit.js +59 -45
  57. package/build/page-list/edit.js.map +1 -1
  58. package/build/page-list-item/edit.js +3 -2
  59. package/build/page-list-item/edit.js.map +1 -1
  60. package/build/post-content/edit.js +6 -1
  61. package/build/post-content/edit.js.map +1 -1
  62. package/build/post-featured-image/dimension-controls.js +0 -6
  63. package/build/post-featured-image/dimension-controls.js.map +1 -1
  64. package/build/post-featured-image/edit.js +1 -1
  65. package/build/post-featured-image/edit.js.map +1 -1
  66. package/build/pullquote/deprecated.js +3 -3
  67. package/build/pullquote/deprecated.js.map +1 -1
  68. package/build/query/edit/query-placeholder.js +3 -2
  69. package/build/query/edit/query-placeholder.js.map +1 -1
  70. package/build/query/utils.js +26 -9
  71. package/build/query/utils.js.map +1 -1
  72. package/build/table/state.js +12 -4
  73. package/build/table/state.js.map +1 -1
  74. package/build/template-part/edit/import-controls.js +4 -24
  75. package/build/template-part/edit/import-controls.js.map +1 -1
  76. package/build/template-part/edit/utils/transformers.js +69 -19
  77. package/build/template-part/edit/utils/transformers.js.map +1 -1
  78. package/build/text-columns/edit.js +3 -7
  79. package/build/text-columns/edit.js.map +1 -1
  80. package/build/text-columns/save.js +11 -13
  81. package/build/text-columns/save.js.map +1 -1
  82. package/build-module/buttons/edit.native.js +1 -1
  83. package/build-module/buttons/edit.native.js.map +1 -1
  84. package/build-module/columns/edit.js +10 -7
  85. package/build-module/columns/edit.js.map +1 -1
  86. package/build-module/columns/edit.native.js +1 -1
  87. package/build-module/columns/edit.native.js.map +1 -1
  88. package/build-module/comments/edit/placeholder.js +9 -5
  89. package/build-module/comments/edit/placeholder.js.map +1 -1
  90. package/build-module/cover/index.js +12 -4
  91. package/build-module/cover/index.js.map +1 -1
  92. package/build-module/cover/variations.js +19 -0
  93. package/build-module/cover/variations.js.map +1 -0
  94. package/build-module/embed/edit.js +14 -15
  95. package/build-module/embed/edit.js.map +1 -1
  96. package/build-module/embed/edit.native.js +19 -15
  97. package/build-module/embed/edit.native.js.map +1 -1
  98. package/build-module/embed/util.js +34 -10
  99. package/build-module/embed/util.js.map +1 -1
  100. package/build-module/gallery/edit.js +1 -0
  101. package/build-module/gallery/edit.js.map +1 -1
  102. package/build-module/latest-posts/edit.js +10 -9
  103. package/build-module/latest-posts/edit.js.map +1 -1
  104. package/build-module/latest-posts/edit.native.js +3 -3
  105. package/build-module/latest-posts/edit.native.js.map +1 -1
  106. package/build-module/media-text/constants.js +10 -0
  107. package/build-module/media-text/constants.js.map +1 -1
  108. package/build-module/media-text/edit.js +2 -14
  109. package/build-module/media-text/edit.js.map +1 -1
  110. package/build-module/media-text/edit.native.js +4 -3
  111. package/build-module/media-text/edit.native.js.map +1 -1
  112. package/build-module/media-text/transforms.js +32 -44
  113. package/build-module/media-text/transforms.js.map +1 -1
  114. package/build-module/navigation/edit/index.js +58 -88
  115. package/build-module/navigation/edit/index.js.map +1 -1
  116. package/build-module/navigation/edit/inner-blocks.js +4 -1
  117. package/build-module/navigation/edit/inner-blocks.js.map +1 -1
  118. package/build-module/navigation/edit/menu-inspector-controls.js +2 -5
  119. package/build-module/navigation/edit/menu-inspector-controls.js.map +1 -1
  120. package/build-module/navigation/edit/navigation-menu-selector.js +25 -22
  121. package/build-module/navigation/edit/navigation-menu-selector.js.map +1 -1
  122. package/build-module/navigation/edit/unsaved-inner-blocks.js +14 -1
  123. package/build-module/navigation/edit/unsaved-inner-blocks.js.map +1 -1
  124. package/build-module/navigation/edit/use-convert-classic-menu-to-block-menu.js +2 -4
  125. package/build-module/navigation/edit/use-convert-classic-menu-to-block-menu.js.map +1 -1
  126. package/build-module/navigation/edit/use-create-navigation-menu.js +1 -1
  127. package/build-module/navigation/edit/use-create-navigation-menu.js.map +1 -1
  128. package/build-module/navigation/edit/use-navigation-notice.js +1 -1
  129. package/build-module/navigation/edit/use-navigation-notice.js.map +1 -1
  130. package/build-module/navigation-link/edit.js +0 -11
  131. package/build-module/navigation-link/edit.js.map +1 -1
  132. package/build-module/navigation-link/link-ui.js +0 -1
  133. package/build-module/navigation-link/link-ui.js.map +1 -1
  134. package/build-module/navigation-submenu/edit.js +1 -13
  135. package/build-module/navigation-submenu/edit.js.map +1 -1
  136. package/build-module/page-list/edit.js +61 -47
  137. package/build-module/page-list/edit.js.map +1 -1
  138. package/build-module/page-list-item/edit.js +3 -2
  139. package/build-module/page-list-item/edit.js.map +1 -1
  140. package/build-module/post-content/edit.js +6 -1
  141. package/build-module/post-content/edit.js.map +1 -1
  142. package/build-module/post-featured-image/dimension-controls.js +0 -6
  143. package/build-module/post-featured-image/dimension-controls.js.map +1 -1
  144. package/build-module/post-featured-image/edit.js +1 -1
  145. package/build-module/post-featured-image/edit.js.map +1 -1
  146. package/build-module/pullquote/deprecated.js +3 -2
  147. package/build-module/pullquote/deprecated.js.map +1 -1
  148. package/build-module/query/edit/query-placeholder.js +4 -3
  149. package/build-module/query/edit/query-placeholder.js.map +1 -1
  150. package/build-module/query/utils.js +21 -6
  151. package/build-module/query/utils.js.map +1 -1
  152. package/build-module/table/state.js +13 -5
  153. package/build-module/table/state.js.map +1 -1
  154. package/build-module/template-part/edit/import-controls.js +4 -23
  155. package/build-module/template-part/edit/import-controls.js.map +1 -1
  156. package/build-module/template-part/edit/utils/transformers.js +69 -20
  157. package/build-module/template-part/edit/utils/transformers.js.map +1 -1
  158. package/build-module/text-columns/edit.js +3 -6
  159. package/build-module/text-columns/edit.js.map +1 -1
  160. package/build-module/text-columns/save.js +11 -12
  161. package/build-module/text-columns/save.js.map +1 -1
  162. package/build-style/cover/style-rtl.css +11 -5
  163. package/build-style/cover/style.css +11 -5
  164. package/build-style/editor-rtl.css +5 -1
  165. package/build-style/editor.css +5 -1
  166. package/build-style/navigation/editor-rtl.css +1 -1
  167. package/build-style/navigation/editor.css +1 -1
  168. package/build-style/page-list/editor-rtl.css +4 -0
  169. package/build-style/page-list/editor.css +4 -0
  170. package/build-style/post-featured-image/style-rtl.css +1 -0
  171. package/build-style/post-featured-image/style.css +1 -0
  172. package/build-style/style-rtl.css +12 -5
  173. package/build-style/style.css +12 -5
  174. package/package.json +31 -31
  175. package/src/audio/test/__snapshots__/edit.native.js.snap +44 -4
  176. package/src/audio/test/__snapshots__/transforms.native.js.snap +25 -0
  177. package/src/audio/test/transforms.native.js +42 -0
  178. package/src/block/test/__snapshots__/transforms.native.js.snap +15 -0
  179. package/src/block/test/transforms.native.js +40 -0
  180. package/src/buttons/edit.native.js +1 -1
  181. package/src/buttons/test/__snapshots__/transforms.native.js.snap +31 -0
  182. package/src/buttons/test/transforms.native.js +48 -0
  183. package/src/columns/edit.js +28 -17
  184. package/src/columns/edit.native.js +1 -1
  185. package/src/columns/test/__snapshots__/transforms.native.js.snap +61 -0
  186. package/src/columns/test/transforms.native.js +91 -0
  187. package/src/comment-template/index.php +1 -2
  188. package/src/comments/edit/placeholder.js +16 -4
  189. package/src/cover/block.json +9 -3
  190. package/src/cover/index.js +2 -0
  191. package/src/cover/style.scss +16 -7
  192. package/src/cover/test/__snapshots__/transforms.native.js.snap +73 -0
  193. package/src/cover/test/transforms.native.js +112 -0
  194. package/src/cover/variations.js +20 -0
  195. package/src/embed/edit.js +16 -12
  196. package/src/embed/edit.native.js +28 -18
  197. package/src/embed/test/__snapshots__/transforms.native.js.snap +23 -0
  198. package/src/embed/test/index.js +12 -0
  199. package/src/embed/test/transforms.native.js +44 -0
  200. package/src/embed/util.js +29 -8
  201. package/src/file/test/__snapshots__/edit.native.js.snap +18 -2
  202. package/src/file/test/__snapshots__/transforms.native.js.snap +19 -0
  203. package/src/file/test/transforms.native.js +42 -0
  204. package/src/freeform/test/__snapshots__/transforms.native.js.snap +19 -0
  205. package/src/freeform/test/transforms.native.js +39 -0
  206. package/src/gallery/edit.js +3 -0
  207. package/src/gallery/test/__snapshots__/transforms.native.js.snap +53 -0
  208. package/src/gallery/test/transforms.native.js +52 -0
  209. package/src/group/test/__snapshots__/transforms.native.js.snap +35 -0
  210. package/src/group/test/transforms.native.js +75 -0
  211. package/src/heading/test/__snapshots__/transforms.native.js.snap +47 -0
  212. package/src/heading/test/transforms.native.js +46 -0
  213. package/src/image/test/__snapshots__/transforms.native.js.snap +49 -0
  214. package/src/image/test/transforms.native.js +48 -0
  215. package/src/latest-posts/edit.js +11 -16
  216. package/src/latest-posts/edit.native.js +3 -3
  217. package/src/latest-posts/test/__snapshots__/transforms.native.js.snap +15 -0
  218. package/src/latest-posts/test/transforms.native.js +61 -0
  219. package/src/list/test/__snapshots__/transforms.native.js.snap +85 -0
  220. package/src/list/test/transforms.native.js +56 -0
  221. package/src/media-text/constants.js +16 -0
  222. package/src/media-text/edit.js +8 -18
  223. package/src/media-text/edit.native.js +3 -9
  224. package/src/media-text/test/__snapshots__/transforms.native.js.snap +73 -0
  225. package/src/media-text/test/transforms.native.js +112 -0
  226. package/src/media-text/transforms.js +24 -51
  227. package/src/missing/test/__snapshots__/edit.native.js.snap +20 -2
  228. package/src/more/test/__snapshots__/transforms.native.js.snap +19 -0
  229. package/src/more/test/transforms.native.js +42 -0
  230. package/src/navigation/edit/index.js +104 -107
  231. package/src/navigation/edit/inner-blocks.js +3 -0
  232. package/src/navigation/edit/menu-inspector-controls.js +2 -7
  233. package/src/navigation/edit/navigation-menu-selector.js +41 -25
  234. package/src/navigation/edit/unsaved-inner-blocks.js +46 -33
  235. package/src/navigation/edit/use-convert-classic-menu-to-block-menu.js +82 -83
  236. package/src/navigation/edit/use-create-navigation-menu.js +1 -1
  237. package/src/navigation/edit/use-navigation-notice.js +1 -1
  238. package/src/navigation/editor.scss +23 -20
  239. package/src/navigation/index.php +18 -39
  240. package/src/navigation-link/edit.js +0 -9
  241. package/src/navigation-link/index.php +5 -8
  242. package/src/navigation-link/link-ui.js +0 -1
  243. package/src/navigation-submenu/edit.js +0 -10
  244. package/src/navigation-submenu/index.php +23 -6
  245. package/src/nextpage/test/__snapshots__/transforms.native.js.snap +19 -0
  246. package/src/nextpage/test/transforms.native.js +42 -0
  247. package/src/page-list/edit.js +78 -44
  248. package/src/page-list/editor.scss +6 -0
  249. package/src/page-list-item/edit.js +2 -3
  250. package/src/paragraph/test/__snapshots__/transforms.native.js.snap +59 -0
  251. package/src/paragraph/test/transforms.native.js +50 -0
  252. package/src/post-content/edit.js +5 -1
  253. package/src/post-excerpt/index.php +1 -2
  254. package/src/post-featured-image/dimension-controls.js +0 -8
  255. package/src/post-featured-image/edit.js +1 -1
  256. package/src/post-featured-image/style.scss +1 -0
  257. package/src/preformatted/test/__snapshots__/transforms.native.js.snap +31 -0
  258. package/src/preformatted/test/transforms.native.js +42 -0
  259. package/src/pullquote/deprecated.js +2 -6
  260. package/src/pullquote/test/__snapshots__/transforms.native.js.snap +47 -0
  261. package/src/pullquote/test/transforms.native.js +46 -0
  262. package/src/query/edit/query-placeholder.js +10 -5
  263. package/src/query/test/utils.js +33 -1
  264. package/src/query/utils.js +19 -6
  265. package/src/quote/test/__snapshots__/transforms.native.js.snap +39 -0
  266. package/src/quote/test/transforms.native.js +67 -0
  267. package/src/search/test/__snapshots__/edit.native.js.snap +11 -1
  268. package/src/search/test/__snapshots__/transforms.native.js.snap +15 -0
  269. package/src/search/test/transforms.native.js +40 -0
  270. package/src/separator/test/__snapshots__/transforms.native.js.snap +19 -0
  271. package/src/separator/test/transforms.native.js +42 -0
  272. package/src/shortcode/test/__snapshots__/transforms.native.js.snap +19 -0
  273. package/src/shortcode/test/transforms.native.js +42 -0
  274. package/src/social-links/test/__snapshots__/transforms.native.js.snap +31 -0
  275. package/src/social-links/test/transforms.native.js +53 -0
  276. package/src/spacer/test/__snapshots__/transforms.native.js.snap +19 -0
  277. package/src/spacer/test/transforms.native.js +42 -0
  278. package/src/table/state.js +8 -17
  279. package/src/template-part/edit/import-controls.js +2 -29
  280. package/src/template-part/edit/utils/transformers.js +96 -19
  281. package/src/text-columns/edit.js +1 -6
  282. package/src/text-columns/save.js +1 -6
  283. package/src/verse/test/__snapshots__/transforms.native.js.snap +25 -0
  284. package/src/verse/test/transforms.native.js +42 -0
  285. package/src/video/test/__snapshots__/transforms.native.js.snap +41 -0
  286. package/src/video/test/transforms.native.js +48 -0
  287. package/tsconfig.tsbuildinfo +1 -1
@@ -12,7 +12,6 @@ import {
12
12
  useEffect,
13
13
  useRef,
14
14
  Platform,
15
- useMemo,
16
15
  } from '@wordpress/element';
17
16
  import {
18
17
  InspectorControls,
@@ -41,7 +40,7 @@ import {
41
40
  } from '@wordpress/components';
42
41
  import { __, sprintf } from '@wordpress/i18n';
43
42
  import { speak } from '@wordpress/a11y';
44
- import { createBlock, getBlockType } from '@wordpress/blocks';
43
+ import { createBlock } from '@wordpress/blocks';
45
44
  import { close, Icon } from '@wordpress/icons';
46
45
 
47
46
  /**
@@ -107,16 +106,20 @@ function Navigation( {
107
106
 
108
107
  const ref = attributes.ref;
109
108
 
110
- const setRef = ( postId ) => {
111
- setAttributes( { ref: postId } );
112
- };
109
+ const setRef = useCallback(
110
+ ( postId ) => {
111
+ setAttributes( { ref: postId } );
112
+ },
113
+ [ setAttributes ]
114
+ );
113
115
 
114
116
  const recursionId = `navigationMenu/${ ref }`;
115
117
  const hasAlreadyRendered = useHasRecursion( recursionId );
116
118
 
117
119
  // Preload classic menus, so that they don't suddenly pop-in when viewing
118
120
  // the Select Menu dropdown.
119
- const { menus: classicMenus } = useNavigationEntities();
121
+ const { menus: classicMenus, hasResolvedMenus: hasResolvedClassicMenus } =
122
+ useNavigationEntities();
120
123
 
121
124
  const [ showNavigationMenuStatusNotice, hideNavigationMenuStatusNotice ] =
122
125
  useNavigationNotice( {
@@ -197,52 +200,22 @@ function Navigation( {
197
200
  const isConvertingClassicMenu =
198
201
  classicMenuConversionStatus === CLASSIC_MENU_CONVERSION_PENDING;
199
202
 
200
- // Only autofallback to published menus.
201
- const fallbackNavigationMenus = useMemo(
202
- () =>
203
- navigationMenus
204
- ?.filter( ( menu ) => menu.status === 'publish' )
205
- ?.sort( ( menuA, menuB ) => {
206
- const menuADate = new Date( menuA.date );
207
- const menuBDate = new Date( menuB.date );
208
- return menuADate.getTime() < menuBDate.getTime();
209
- } ),
210
- [ navigationMenus ]
211
- );
212
-
213
- // This useEffect adds snackbar and speak status notices when menus are created.
214
- // If there are no fallback navigation menus then we don't show these messages,
215
- // because this means that we are creating the first, fallback navigation menu.
216
- useEffect( () => {
217
- hideNavigationMenuStatusNotice();
218
-
219
- if ( fallbackNavigationMenus && isCreatingNavigationMenu ) {
220
- speak( __( `Creating Navigation Menu.` ) );
221
- }
222
-
223
- if ( createNavigationMenuIsSuccess ) {
224
- handleUpdateMenu( createNavigationMenuPost.id, {
225
- focusNavigationBlock: true,
226
- } );
203
+ // Only auto-fallback to the latest published menu.
204
+ // The REST API already returns items sorted by publishing date.
205
+ const fallbackNavigationMenuId = navigationMenus?.find(
206
+ ( menu ) => menu.status === 'publish'
207
+ )?.id;
227
208
 
228
- if ( fallbackNavigationMenus ) {
229
- showNavigationMenuStatusNotice(
230
- __( `Navigation Menu successfully created.` )
231
- );
209
+ const handleUpdateMenu = useCallback(
210
+ ( menuId, options = { focusNavigationBlock: false } ) => {
211
+ const { focusNavigationBlock } = options;
212
+ setRef( menuId );
213
+ if ( focusNavigationBlock ) {
214
+ selectBlock( clientId );
232
215
  }
233
- }
234
-
235
- if ( createNavigationMenuIsError ) {
236
- showNavigationMenuStatusNotice(
237
- __( 'Failed to create Navigation Menu.' )
238
- );
239
- }
240
- }, [
241
- createNavigationMenuStatus,
242
- createNavigationMenuError,
243
- createNavigationMenuPost,
244
- fallbackNavigationMenus,
245
- ] );
216
+ },
217
+ [ selectBlock, clientId, setRef ]
218
+ );
246
219
 
247
220
  // Attempt to retrieve and prioritize any existing navigation menu unless:
248
221
  // - the are uncontrolled inner blocks already present in the block.
@@ -256,7 +229,7 @@ function Navigation( {
256
229
  hasUncontrolledInnerBlocks ||
257
230
  isCreatingNavigationMenu ||
258
231
  ref ||
259
- ! fallbackNavigationMenus?.length
232
+ ! fallbackNavigationMenuId
260
233
  ) {
261
234
  return;
262
235
  }
@@ -269,12 +242,14 @@ function Navigation( {
269
242
  * nor to be undoable, hence why it is marked as non persistent
270
243
  */
271
244
  __unstableMarkNextChangeAsNotPersistent();
272
- setRef( fallbackNavigationMenus[ 0 ].id );
245
+ setRef( fallbackNavigationMenuId );
273
246
  }, [
274
247
  ref,
248
+ setRef,
275
249
  isCreatingNavigationMenu,
276
- fallbackNavigationMenus,
250
+ fallbackNavigationMenuId,
277
251
  hasUncontrolledInnerBlocks,
252
+ __unstableMarkNextChangeAsNotPersistent,
278
253
  ] );
279
254
 
280
255
  const isEntityAvailable =
@@ -291,10 +266,12 @@ function Navigation( {
291
266
  useEffect( () => {
292
267
  if (
293
268
  ref ||
269
+ ! hasResolvedClassicMenus ||
294
270
  ! hasResolvedNavigationMenus ||
295
271
  isConvertingClassicMenu ||
296
- fallbackNavigationMenus?.length > 0 ||
297
- hasUnsavedBlocks
272
+ fallbackNavigationMenuId ||
273
+ hasUnsavedBlocks ||
274
+ ! classicMenus?.length
298
275
  ) {
299
276
  return;
300
277
  }
@@ -303,46 +280,39 @@ function Navigation( {
303
280
  // a classic menu with a `primary` location or slug,
304
281
  // then create a new navigation menu based on it.
305
282
  // Otherwise, use the most recently created classic menu.
306
- if ( classicMenus?.length ) {
307
- const primaryMenus = classicMenus.filter(
308
- ( classicMenu ) =>
309
- classicMenu.locations.includes( 'primary' ) ||
310
- classicMenu.slug === 'primary'
311
- );
283
+ const primaryMenus = classicMenus.filter(
284
+ ( classicMenu ) =>
285
+ classicMenu.locations.includes( 'primary' ) ||
286
+ classicMenu.slug === 'primary'
287
+ );
312
288
 
313
- if ( primaryMenus.length ) {
314
- convertClassicMenu(
315
- primaryMenus[ 0 ].id,
316
- primaryMenus[ 0 ].name,
317
- 'publish'
318
- );
319
- } else {
320
- classicMenus.sort( ( a, b ) => {
321
- return b.id - a.id;
322
- } );
323
- convertClassicMenu(
324
- classicMenus[ 0 ].id,
325
- classicMenus[ 0 ].name,
326
- 'publish'
327
- );
328
- }
289
+ if ( primaryMenus.length ) {
290
+ convertClassicMenu(
291
+ primaryMenus[ 0 ].id,
292
+ primaryMenus[ 0 ].name,
293
+ 'publish'
294
+ );
329
295
  } else {
330
- // If there are no fallback navigation menus and no classic menus,
331
- // then create a new navigation menu.
332
-
333
- // Check that we have a page-list block type.
334
- let defaultBlocks = [];
335
- if ( getBlockType( 'core/page-list' ) ) {
336
- defaultBlocks = [ createBlock( 'core/page-list' ) ];
337
- }
338
-
339
- createNavigationMenu(
340
- 'Navigation', // TODO - use the template slug in future
341
- defaultBlocks,
296
+ classicMenus.sort( ( a, b ) => {
297
+ return b.id - a.id;
298
+ } );
299
+ convertClassicMenu(
300
+ classicMenus[ 0 ].id,
301
+ classicMenus[ 0 ].name,
342
302
  'publish'
343
303
  );
344
304
  }
345
- }, [ hasResolvedNavigationMenus, hasUnsavedBlocks ] );
305
+ }, [
306
+ hasResolvedClassicMenus,
307
+ hasResolvedNavigationMenus,
308
+ hasUnsavedBlocks,
309
+ classicMenus,
310
+ convertClassicMenu,
311
+ createNavigationMenu,
312
+ fallbackNavigationMenuId,
313
+ isConvertingClassicMenu,
314
+ ref,
315
+ ] );
346
316
 
347
317
  const navRef = useRef();
348
318
 
@@ -362,6 +332,25 @@ function Navigation( {
362
332
  classicMenus?.length === 0 &&
363
333
  ! hasUncontrolledInnerBlocks;
364
334
 
335
+ useEffect( () => {
336
+ if ( isPlaceholder ) {
337
+ /**
338
+ * this fallback only displays (both in editor and on front)
339
+ * the list of pages block if no menu is available as a fallback.
340
+ * We don't want the fallback to request a save,
341
+ * nor to be undoable, hence we mark it non persistent.
342
+ */
343
+ __unstableMarkNextChangeAsNotPersistent();
344
+ replaceInnerBlocks( clientId, [ createBlock( 'core/page-list' ) ] );
345
+ }
346
+ }, [
347
+ clientId,
348
+ isPlaceholder,
349
+ ref,
350
+ __unstableMarkNextChangeAsNotPersistent,
351
+ replaceInnerBlocks,
352
+ ] );
353
+
365
354
  // "loading" state:
366
355
  // - there is a menu creation process in progress.
367
356
  // - there is a classic menu conversion process in progress.
@@ -413,17 +402,6 @@ function Navigation( {
413
402
  ] = useState();
414
403
  const [ detectedOverlayColor, setDetectedOverlayColor ] = useState();
415
404
 
416
- const handleUpdateMenu = useCallback(
417
- ( menuId, options = { focusNavigationBlock: false } ) => {
418
- const { focusNavigationBlock } = options;
419
- setRef( menuId );
420
- if ( focusNavigationBlock ) {
421
- selectBlock( clientId );
422
- }
423
- },
424
- [ selectBlock, clientId ]
425
- );
426
-
427
405
  const onSelectClassicMenu = async ( classicMenu ) => {
428
406
  const navMenu = await convertClassicMenu(
429
407
  classicMenu.id,
@@ -449,7 +427,7 @@ function Navigation( {
449
427
  }
450
428
 
451
429
  if ( createNavigationMenuIsSuccess ) {
452
- handleUpdateMenu( createNavigationMenuPost.id, {
430
+ handleUpdateMenu( createNavigationMenuPost?.id, {
453
431
  focusNavigationBlock: true,
454
432
  } );
455
433
 
@@ -466,7 +444,7 @@ function Navigation( {
466
444
  }, [
467
445
  createNavigationMenuStatus,
468
446
  createNavigationMenuError,
469
- createNavigationMenuPost,
447
+ createNavigationMenuPost?.id,
470
448
  createNavigationMenuIsError,
471
449
  createNavigationMenuIsSuccess,
472
450
  isCreatingNavigationMenu,
@@ -492,7 +470,12 @@ function Navigation( {
492
470
  __( 'Classic menu import failed.' )
493
471
  );
494
472
  }
495
- }, [ classicMenuConversionStatus, classicMenuConversionError ] );
473
+ }, [
474
+ classicMenuConversionStatus,
475
+ classicMenuConversionError,
476
+ hideClassicMenuConversionNotice,
477
+ showClassicMenuConversionNotice,
478
+ ] );
496
479
 
497
480
  // Spacer block needs orientation from context. This is a patch until
498
481
  // https://github.com/WordPress/gutenberg/issues/36197 is addressed.
@@ -501,7 +484,11 @@ function Navigation( {
501
484
  __unstableMarkNextChangeAsNotPersistent();
502
485
  setAttributes( { orientation } );
503
486
  }
504
- }, [ orientation ] );
487
+ }, [
488
+ orientation,
489
+ __unstableMarkNextChangeAsNotPersistent,
490
+ setAttributes,
491
+ ] );
505
492
 
506
493
  useEffect( () => {
507
494
  if ( ! enableContrastChecking ) {
@@ -531,7 +518,11 @@ function Navigation( {
531
518
  setDetectedOverlayBackgroundColor
532
519
  );
533
520
  }
534
- } );
521
+ }, [
522
+ enableContrastChecking,
523
+ overlayTextColor.color,
524
+ overlayBackgroundColor.color,
525
+ ] );
535
526
 
536
527
  useEffect( () => {
537
528
  if ( ! isSelected && ! isInnerBlockSelected ) {
@@ -572,6 +563,9 @@ function Navigation( {
572
563
  canUserCreateNavigationMenu,
573
564
  hasResolvedCanUserCreateNavigationMenu,
574
565
  ref,
566
+ hideNavigationMenuPermissionsNotice,
567
+ showNavigationMenuPermissionsNotice,
568
+ navMenuResolvedButMissing,
575
569
  ] );
576
570
 
577
571
  const hasManagePermissions =
@@ -791,6 +785,7 @@ function Navigation( {
791
785
  createNavigationMenuIsSuccess
792
786
  }
793
787
  createNavigationMenuIsError={ createNavigationMenuIsError }
788
+ currentMenuId={ ref }
794
789
  isNavigationMenuMissing={ isNavigationMenuMissing }
795
790
  isManageMenusButtonDisabled={ isManageMenusButtonDisabled }
796
791
  onCreateNew={ createUntitledEmptyNavigationMenu }
@@ -898,7 +893,9 @@ function Navigation( {
898
893
 
899
894
  { isLoading && (
900
895
  <TagName { ...blockProps }>
901
- <Spinner className="wp-block-navigation__loading-indicator" />
896
+ <div className="wp-block-navigation__loading-indicator-container">
897
+ <Spinner className="wp-block-navigation__loading-indicator" />
898
+ </div>
902
899
  </TagName>
903
900
  ) }
904
901
 
@@ -29,6 +29,9 @@ const ALLOWED_BLOCKS = [
29
29
 
30
30
  const DEFAULT_BLOCK = {
31
31
  name: 'core/navigation-link',
32
+ attributes: {
33
+ type: 'page',
34
+ },
32
35
  };
33
36
 
34
37
  export default function NavigationInnerBlocks( {
@@ -45,10 +45,6 @@ const MainContent = ( {
45
45
  );
46
46
  const { navigationMenu } = useNavigationMenu( currentMenuId );
47
47
 
48
- if ( currentMenuId && isNavigationMenuMissing ) {
49
- return <p>{ __( 'Select or create a menu' ) }</p>;
50
- }
51
-
52
48
  if ( currentMenuId && isNavigationMenuMissing ) {
53
49
  return <DeletedNavigationWarning onCreateNew={ onCreateNew } />;
54
50
  }
@@ -69,6 +65,7 @@ const MainContent = ( {
69
65
  return (
70
66
  <OffCanvasEditor
71
67
  blocks={ clientIdsTree }
68
+ parentClientId={ clientId }
72
69
  isExpanded={ true }
73
70
  LeafMoreMenu={ LeafMoreMenu }
74
71
  description={ description }
@@ -89,9 +86,7 @@ const MenuInspectorControls = ( props ) => {
89
86
 
90
87
  return (
91
88
  <InspectorControls group="list">
92
- <PanelBody
93
- title={ process.env.IS_GUTENBERG_PLUGIN ? null : __( 'Menu' ) }
94
- >
89
+ <PanelBody title={ null }>
95
90
  <HStack className="wp-block-navigation-off-canvas-editor__header">
96
91
  <Heading
97
92
  className="wp-block-navigation-off-canvas-editor__title"
@@ -11,6 +11,7 @@ import { moreVertical } from '@wordpress/icons';
11
11
  import { __, sprintf } from '@wordpress/i18n';
12
12
  import { decodeEntities } from '@wordpress/html-entities';
13
13
  import { useEffect, useMemo, useState } from '@wordpress/element';
14
+ import { useEntityProp } from '@wordpress/core-data';
14
15
 
15
16
  /**
16
17
  * Internal dependencies
@@ -18,6 +19,14 @@ import { useEffect, useMemo, useState } from '@wordpress/element';
18
19
  import useNavigationMenu from '../use-navigation-menu';
19
20
  import useNavigationEntities from '../use-navigation-entities';
20
21
 
22
+ function buildMenuLabel( title, id ) {
23
+ const label =
24
+ decodeEntities( title?.rendered ) ||
25
+ /* translators: %s is the index of the menu in the list of menus. */
26
+ sprintf( __( '(no title %s)' ), id );
27
+ return label;
28
+ }
29
+
21
30
  function NavigationMenuSelector( {
22
31
  currentMenuId,
23
32
  onSelectNavigationMenu,
@@ -30,7 +39,6 @@ function NavigationMenuSelector( {
30
39
  /* translators: %s: The name of a menu. */
31
40
  const createActionLabel = __( "Create from '%s'" );
32
41
 
33
- const [ selectorLabel, setSelectorLabel ] = useState( '' );
34
42
  const [ isCreatingMenu, setIsCreatingMenu ] = useState( false );
35
43
 
36
44
  actionLabel = actionLabel || createActionLabel;
@@ -39,25 +47,23 @@ function NavigationMenuSelector( {
39
47
 
40
48
  const {
41
49
  navigationMenus,
50
+ isResolvingNavigationMenus,
42
51
  hasResolvedNavigationMenus,
43
52
  canUserCreateNavigationMenu,
44
53
  canSwitchNavigationMenu,
45
54
  } = useNavigationMenu();
46
55
 
56
+ const [ currentTitle ] = useEntityProp(
57
+ 'postType',
58
+ 'wp_navigation',
59
+ 'title'
60
+ );
61
+
47
62
  const menuChoices = useMemo( () => {
48
63
  return (
49
64
  navigationMenus?.map( ( { id, title }, index ) => {
50
- const label =
51
- decodeEntities( title?.rendered ) ||
52
- /* translators: %s is the index of the menu in the list of menus. */
53
- sprintf( __( '(no title %s)' ), index + 1 );
54
-
55
- if ( id === currentMenuId && ! isCreatingMenu ) {
56
- setSelectorLabel(
57
- /* translators: %s is the name of a navigation menu. */
58
- sprintf( __( 'You are currently editing %s' ), label )
59
- );
60
- }
65
+ const label = buildMenuLabel( title, index + 1 );
66
+
61
67
  return {
62
68
  value: id,
63
69
  label,
@@ -65,7 +71,7 @@ function NavigationMenuSelector( {
65
71
  };
66
72
  } ) || []
67
73
  );
68
- }, [ currentMenuId, navigationMenus, actionLabel, isCreatingMenu ] );
74
+ }, [ navigationMenus, actionLabel ] );
69
75
 
70
76
  const hasNavigationMenus = !! navigationMenus?.length;
71
77
  const hasClassicMenus = !! classicMenus?.length;
@@ -77,20 +83,35 @@ function NavigationMenuSelector( {
77
83
  const menuUnavailable =
78
84
  hasResolvedNavigationMenus && currentMenuId === null;
79
85
 
80
- useEffect( () => {
81
- if ( ! hasResolvedNavigationMenus && ! canUserCreateNavigationMenu ) {
82
- setSelectorLabel( __( 'Loading …' ) );
83
- } else if ( noMenuSelected || noBlockMenus || menuUnavailable ) {
84
- setSelectorLabel( __( 'Choose or create a Navigation menu' ) );
85
- }
86
+ let selectorLabel = '';
87
+
88
+ if ( isCreatingMenu || isResolvingNavigationMenus ) {
89
+ selectorLabel = __( 'Loading …' );
90
+ } else if ( noMenuSelected || noBlockMenus || menuUnavailable ) {
91
+ // Note: classic Menus may be available.
92
+ selectorLabel = __( 'Choose or create a Navigation menu' );
93
+ } else {
94
+ // Current Menu's title.
95
+ selectorLabel = currentTitle;
96
+ }
86
97
 
98
+ useEffect( () => {
87
99
  if (
88
100
  isCreatingMenu &&
89
101
  ( createNavigationMenuIsSuccess || createNavigationMenuIsError )
90
102
  ) {
91
103
  setIsCreatingMenu( false );
92
104
  }
93
- }, [ hasResolvedNavigationMenus, createNavigationMenuIsSuccess ] );
105
+ }, [
106
+ hasResolvedNavigationMenus,
107
+ createNavigationMenuIsSuccess,
108
+ canUserCreateNavigationMenu,
109
+ createNavigationMenuIsError,
110
+ isCreatingMenu,
111
+ menuUnavailable,
112
+ noBlockMenus,
113
+ noMenuSelected,
114
+ ] );
94
115
 
95
116
  const NavigationMenuSelectorDropdown = (
96
117
  <DropdownMenu
@@ -105,7 +126,6 @@ function NavigationMenuSelector( {
105
126
  <MenuItemsChoice
106
127
  value={ currentMenuId }
107
128
  onSelect={ ( menuId ) => {
108
- setSelectorLabel( __( 'Loading …' ) );
109
129
  setIsCreatingMenu( true );
110
130
  onSelectNavigationMenu( menuId );
111
131
  onClose();
@@ -122,9 +142,6 @@ function NavigationMenuSelector( {
122
142
  return (
123
143
  <MenuItem
124
144
  onClick={ () => {
125
- setSelectorLabel(
126
- __( 'Loading …' )
127
- );
128
145
  setIsCreatingMenu( true );
129
146
  onSelectClassicMenu( menu );
130
147
  onClose();
@@ -151,7 +168,6 @@ function NavigationMenuSelector( {
151
168
  onClose();
152
169
  onCreateNew();
153
170
  setIsCreatingMenu( true );
154
- setSelectorLabel( __( 'Loading …' ) );
155
171
  } }
156
172
  >
157
173
  { __( 'Create new menu' ) }
@@ -120,40 +120,53 @@ export default function UnsavedInnerBlocks( {
120
120
  const { hasResolvedNavigationMenus } = useNavigationMenu();
121
121
 
122
122
  // Automatically save the uncontrolled blocks.
123
- useEffect( () => {
124
- // The block will be disabled when used in a BlockPreview.
125
- // In this case avoid automatic creation of a wp_navigation post.
126
- // Otherwise the user will be spammed with lots of menus!
127
- //
128
- // Also ensure other navigation menus have loaded so an
129
- // accurate name can be created.
130
- //
131
- // Don't try saving when another save is already
132
- // in progress.
133
- //
134
- // And finally only create the menu when the block is selected,
135
- // which is an indication they want to start editing.
136
- if (
137
- isDisabled ||
138
- isSaving ||
139
- ! hasResolvedDraftNavigationMenus ||
140
- ! hasResolvedNavigationMenus ||
141
- ! hasSelection ||
142
- ! innerBlocksAreDirty
143
- ) {
144
- return;
145
- }
123
+ useEffect(
124
+ () => {
125
+ // The block will be disabled when used in a BlockPreview.
126
+ // In this case avoid automatic creation of a wp_navigation post.
127
+ // Otherwise the user will be spammed with lots of menus!
128
+ //
129
+ // Also ensure other navigation menus have loaded so an
130
+ // accurate name can be created.
131
+ //
132
+ // Don't try saving when another save is already
133
+ // in progress.
134
+ //
135
+ // And finally only create the menu when the block is selected,
136
+ // which is an indication they want to start editing.
137
+ if (
138
+ isDisabled ||
139
+ isSaving ||
140
+ ! hasResolvedDraftNavigationMenus ||
141
+ ! hasResolvedNavigationMenus ||
142
+ ! hasSelection ||
143
+ ! innerBlocksAreDirty
144
+ ) {
145
+ return;
146
+ }
146
147
 
147
- createNavigationMenu( null, blocks );
148
- }, [
149
- createNavigationMenu,
150
- isDisabled,
151
- isSaving,
152
- hasResolvedDraftNavigationMenus,
153
- hasResolvedNavigationMenus,
154
- innerBlocksAreDirty,
155
- hasSelection,
156
- ] );
148
+ createNavigationMenu( null, blocks );
149
+ },
150
+ /* The dependency "blocks" is intentionally omitted here.
151
+ * This is because making blocks a dependency would cause
152
+ * createNavigationMenu to run on every block change whereas
153
+ * we only want it to run when the blocks are first detected
154
+ * as dirty.
155
+ * A better solution might be to add a hard saving lock using
156
+ * a ref to avoid having to disbale theses eslint rules.
157
+ */
158
+ /* eslint-disable react-hooks/exhaustive-deps */
159
+ [
160
+ createNavigationMenu,
161
+ isDisabled,
162
+ isSaving,
163
+ hasResolvedDraftNavigationMenus,
164
+ hasResolvedNavigationMenus,
165
+ innerBlocksAreDirty,
166
+ hasSelection,
167
+ ]
168
+ /* eslint-enable react-hooks/exhaustive-deps */
169
+ );
157
170
 
158
171
  const Wrapper = isSaving ? Disabled : 'div';
159
172