@wordpress/block-library 8.30.0 → 8.31.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 (254) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/block/edit.js +17 -8
  3. package/build/block/edit.js.map +1 -1
  4. package/build/code/save.js +3 -1
  5. package/build/code/save.js.map +1 -1
  6. package/build/cover/edit/index.js +2 -1
  7. package/build/cover/edit/index.js.map +1 -1
  8. package/build/details/edit.js +1 -0
  9. package/build/details/edit.js.map +1 -1
  10. package/build/file/edit.js +2 -0
  11. package/build/file/edit.js.map +1 -1
  12. package/build/heading/index.js +4 -3
  13. package/build/heading/index.js.map +1 -1
  14. package/build/media-text/edit.js +33 -9
  15. package/build/media-text/edit.js.map +1 -1
  16. package/build/media-text/index.js +5 -0
  17. package/build/media-text/index.js.map +1 -1
  18. package/build/media-text/media-container.js +30 -11
  19. package/build/media-text/media-container.js.map +1 -1
  20. package/build/media-text/save.js +2 -2
  21. package/build/media-text/save.js.map +1 -1
  22. package/build/navigation/edit/index.js +23 -29
  23. package/build/navigation/edit/index.js.map +1 -1
  24. package/build/navigation/edit/navigation-menu-delete-control.js +12 -20
  25. package/build/navigation/edit/navigation-menu-delete-control.js.map +1 -1
  26. package/build/navigation/edit/navigation-menu-selector.js +24 -23
  27. package/build/navigation/edit/navigation-menu-selector.js.map +1 -1
  28. package/build/navigation/edit/placeholder/index.js +4 -4
  29. package/build/navigation/edit/placeholder/index.js.map +1 -1
  30. package/build/navigation/use-navigation-menu.js +15 -12
  31. package/build/navigation/use-navigation-menu.js.map +1 -1
  32. package/build/navigation-link/edit.js +12 -10
  33. package/build/navigation-link/edit.js.map +1 -1
  34. package/build/navigation-submenu/edit.js +4 -0
  35. package/build/navigation-submenu/edit.js.map +1 -1
  36. package/build/post-author/edit.js +1 -0
  37. package/build/post-author/edit.js.map +1 -1
  38. package/build/post-excerpt/edit.js +1 -0
  39. package/build/post-excerpt/edit.js.map +1 -1
  40. package/build/post-featured-image/edit.js +4 -1
  41. package/build/post-featured-image/edit.js.map +1 -1
  42. package/build/post-featured-image/index.js +6 -0
  43. package/build/post-featured-image/index.js.map +1 -1
  44. package/build/post-navigation-link/edit.js +1 -0
  45. package/build/post-navigation-link/edit.js.map +1 -1
  46. package/build/post-terms/edit.js +2 -0
  47. package/build/post-terms/edit.js.map +1 -1
  48. package/build/quote/edit.js +2 -2
  49. package/build/quote/edit.js.map +1 -1
  50. package/build/read-more/edit.js +1 -0
  51. package/build/read-more/edit.js.map +1 -1
  52. package/build/search/edit.js +2 -0
  53. package/build/search/edit.js.map +1 -1
  54. package/build/search/edit.native.js +2 -2
  55. package/build/search/edit.native.js.map +1 -1
  56. package/build/social-link/edit.js +1 -1
  57. package/build/social-link/edit.js.map +1 -1
  58. package/build/social-link/icons/medium.js +1 -1
  59. package/build/social-link/icons/medium.js.map +1 -1
  60. package/build/social-link/icons/reddit.js +1 -1
  61. package/build/social-link/icons/reddit.js.map +1 -1
  62. package/build/table/deprecated.js +285 -175
  63. package/build/table/deprecated.js.map +1 -1
  64. package/build/table/index.js +1 -1
  65. package/build/template-part/edit/index.js +1 -1
  66. package/build/template-part/edit/index.js.map +1 -1
  67. package/build/video/edit.native.js +1 -1
  68. package/build/video/edit.native.js.map +1 -1
  69. package/build-module/block/edit.js +18 -9
  70. package/build-module/block/edit.js.map +1 -1
  71. package/build-module/code/save.js +3 -1
  72. package/build-module/code/save.js.map +1 -1
  73. package/build-module/cover/edit/index.js +2 -1
  74. package/build-module/cover/edit/index.js.map +1 -1
  75. package/build-module/details/edit.js +1 -0
  76. package/build-module/details/edit.js.map +1 -1
  77. package/build-module/file/edit.js +2 -0
  78. package/build-module/file/edit.js.map +1 -1
  79. package/build-module/heading/index.js +4 -3
  80. package/build-module/heading/index.js.map +1 -1
  81. package/build-module/media-text/edit.js +34 -10
  82. package/build-module/media-text/edit.js.map +1 -1
  83. package/build-module/media-text/index.js +5 -0
  84. package/build-module/media-text/index.js.map +1 -1
  85. package/build-module/media-text/media-container.js +31 -12
  86. package/build-module/media-text/media-container.js.map +1 -1
  87. package/build-module/media-text/save.js +2 -2
  88. package/build-module/media-text/save.js.map +1 -1
  89. package/build-module/navigation/edit/index.js +24 -30
  90. package/build-module/navigation/edit/index.js.map +1 -1
  91. package/build-module/navigation/edit/navigation-menu-delete-control.js +15 -23
  92. package/build-module/navigation/edit/navigation-menu-delete-control.js.map +1 -1
  93. package/build-module/navigation/edit/navigation-menu-selector.js +24 -23
  94. package/build-module/navigation/edit/navigation-menu-selector.js.map +1 -1
  95. package/build-module/navigation/edit/placeholder/index.js +4 -4
  96. package/build-module/navigation/edit/placeholder/index.js.map +1 -1
  97. package/build-module/navigation/use-navigation-menu.js +15 -12
  98. package/build-module/navigation/use-navigation-menu.js.map +1 -1
  99. package/build-module/navigation-link/edit.js +13 -11
  100. package/build-module/navigation-link/edit.js.map +1 -1
  101. package/build-module/navigation-submenu/edit.js +4 -0
  102. package/build-module/navigation-submenu/edit.js.map +1 -1
  103. package/build-module/post-author/edit.js +1 -0
  104. package/build-module/post-author/edit.js.map +1 -1
  105. package/build-module/post-excerpt/edit.js +1 -0
  106. package/build-module/post-excerpt/edit.js.map +1 -1
  107. package/build-module/post-featured-image/edit.js +5 -2
  108. package/build-module/post-featured-image/edit.js.map +1 -1
  109. package/build-module/post-featured-image/index.js +6 -0
  110. package/build-module/post-featured-image/index.js.map +1 -1
  111. package/build-module/post-navigation-link/edit.js +1 -0
  112. package/build-module/post-navigation-link/edit.js.map +1 -1
  113. package/build-module/post-terms/edit.js +2 -0
  114. package/build-module/post-terms/edit.js.map +1 -1
  115. package/build-module/quote/edit.js +2 -2
  116. package/build-module/quote/edit.js.map +1 -1
  117. package/build-module/read-more/edit.js +1 -0
  118. package/build-module/read-more/edit.js.map +1 -1
  119. package/build-module/search/edit.js +2 -0
  120. package/build-module/search/edit.js.map +1 -1
  121. package/build-module/search/edit.native.js +2 -2
  122. package/build-module/search/edit.native.js.map +1 -1
  123. package/build-module/social-link/edit.js +1 -1
  124. package/build-module/social-link/edit.js.map +1 -1
  125. package/build-module/social-link/icons/medium.js +1 -1
  126. package/build-module/social-link/icons/medium.js.map +1 -1
  127. package/build-module/social-link/icons/reddit.js +1 -1
  128. package/build-module/social-link/icons/reddit.js.map +1 -1
  129. package/build-module/table/deprecated.js +286 -176
  130. package/build-module/table/deprecated.js.map +1 -1
  131. package/build-module/table/index.js +1 -1
  132. package/build-module/template-part/edit/index.js +1 -1
  133. package/build-module/template-part/edit/index.js.map +1 -1
  134. package/build-module/video/edit.native.js +1 -1
  135. package/build-module/video/edit.native.js.map +1 -1
  136. package/build-style/editor-rtl.css +10 -4
  137. package/build-style/editor.css +10 -4
  138. package/build-style/file/editor-rtl.css +3 -0
  139. package/build-style/file/editor.css +3 -0
  140. package/build-style/image/editor-rtl.css +0 -3
  141. package/build-style/image/editor.css +0 -3
  142. package/build-style/media-text/editor-rtl.css +7 -1
  143. package/build-style/media-text/editor.css +7 -1
  144. package/build-style/social-links/style-rtl.css +2 -2
  145. package/build-style/social-links/style.css +2 -2
  146. package/build-style/style-rtl.css +2 -2
  147. package/build-style/style.css +2 -2
  148. package/package.json +34 -34
  149. package/src/archives/index.php +4 -0
  150. package/src/avatar/index.php +6 -0
  151. package/src/block/edit.js +38 -15
  152. package/src/block/index.php +4 -0
  153. package/src/block/test/edit.native.js +67 -0
  154. package/src/calendar/index.php +12 -0
  155. package/src/categories/index.php +6 -0
  156. package/src/code/save.js +7 -1
  157. package/src/comment-author-name/index.php +4 -0
  158. package/src/comment-content/index.php +4 -0
  159. package/src/comment-date/index.php +4 -0
  160. package/src/comment-edit-link/index.php +4 -0
  161. package/src/comment-reply-link/index.php +4 -0
  162. package/src/comment-template/index.php +4 -0
  163. package/src/comments/index.php +10 -0
  164. package/src/comments-pagination/index.php +4 -0
  165. package/src/comments-pagination-next/index.php +4 -0
  166. package/src/comments-pagination-numbers/index.php +4 -0
  167. package/src/comments-pagination-previous/index.php +4 -0
  168. package/src/comments-title/index.php +4 -0
  169. package/src/cover/edit/index.js +4 -1
  170. package/src/cover/index.php +4 -0
  171. package/src/details/edit.js +1 -0
  172. package/src/file/edit.js +2 -0
  173. package/src/file/editor.scss +3 -0
  174. package/src/file/index.php +4 -0
  175. package/src/gallery/index.php +6 -0
  176. package/src/heading/index.js +4 -3
  177. package/src/heading/index.php +4 -0
  178. package/src/home-link/index.php +10 -0
  179. package/src/image/editor.scss +0 -5
  180. package/src/image/index.php +12 -1
  181. package/src/latest-comments/index.php +4 -0
  182. package/src/latest-posts/index.php +8 -0
  183. package/src/loginout/index.php +4 -0
  184. package/src/media-text/block.json +5 -0
  185. package/src/media-text/edit.js +70 -19
  186. package/src/media-text/editor.scss +7 -1
  187. package/src/media-text/index.php +70 -0
  188. package/src/media-text/media-container.js +49 -9
  189. package/src/media-text/save.js +2 -2
  190. package/src/navigation/edit/index.js +67 -71
  191. package/src/navigation/edit/navigation-menu-delete-control.js +22 -49
  192. package/src/navigation/edit/navigation-menu-selector.js +39 -21
  193. package/src/navigation/edit/placeholder/index.js +4 -4
  194. package/src/navigation/edit/test/navigation-menu-selector.js +75 -53
  195. package/src/navigation/index.php +101 -26
  196. package/src/navigation/test/use-navigation-menu.js +21 -21
  197. package/src/navigation/use-navigation-menu.js +23 -9
  198. package/src/navigation-link/edit.js +12 -13
  199. package/src/navigation-link/index.php +14 -0
  200. package/src/navigation-submenu/edit.js +4 -0
  201. package/src/navigation-submenu/index.php +8 -0
  202. package/src/page-list/index.php +12 -0
  203. package/src/page-list-item/index.php +2 -0
  204. package/src/pattern/index.php +2 -0
  205. package/src/post-author/edit.js +1 -0
  206. package/src/post-author/index.php +4 -0
  207. package/src/post-author-biography/index.php +4 -0
  208. package/src/post-author-name/index.php +4 -0
  209. package/src/post-comments-form/index.php +6 -0
  210. package/src/post-content/index.php +4 -0
  211. package/src/post-date/index.php +4 -0
  212. package/src/post-excerpt/edit.js +1 -0
  213. package/src/post-excerpt/index.php +4 -0
  214. package/src/post-featured-image/block.json +6 -0
  215. package/src/post-featured-image/edit.js +4 -0
  216. package/src/post-featured-image/index.php +15 -0
  217. package/src/post-navigation-link/edit.js +1 -0
  218. package/src/post-navigation-link/index.php +4 -0
  219. package/src/post-template/index.php +4 -0
  220. package/src/post-terms/edit.js +2 -0
  221. package/src/post-terms/index.php +6 -0
  222. package/src/post-title/index.php +2 -0
  223. package/src/query/index.php +2 -0
  224. package/src/query-no-results/index.php +4 -0
  225. package/src/query-pagination/index.php +4 -0
  226. package/src/query-pagination-next/index.php +4 -0
  227. package/src/query-pagination-numbers/index.php +4 -0
  228. package/src/query-pagination-previous/index.php +4 -0
  229. package/src/query-title/index.php +4 -0
  230. package/src/quote/edit.js +11 -5
  231. package/src/read-more/edit.js +1 -0
  232. package/src/read-more/index.php +4 -0
  233. package/src/rss/index.php +4 -0
  234. package/src/search/edit.js +2 -0
  235. package/src/search/edit.native.js +2 -2
  236. package/src/search/index.php +19 -1
  237. package/src/shortcode/index.php +4 -0
  238. package/src/site-logo/index.php +20 -0
  239. package/src/site-tagline/index.php +4 -0
  240. package/src/site-title/index.php +4 -0
  241. package/src/social-link/edit.js +1 -1
  242. package/src/social-link/icons/medium.js +1 -1
  243. package/src/social-link/icons/reddit.js +1 -1
  244. package/src/social-link/index.php +22 -9
  245. package/src/social-link/socials-with-bg.scss +1 -1
  246. package/src/social-link/socials-without-bg.scss +1 -1
  247. package/src/table/block.json +1 -1
  248. package/src/table/deprecated.js +308 -175
  249. package/src/tag-cloud/index.php +4 -0
  250. package/src/template-part/edit/index.js +1 -1
  251. package/src/template-part/index.php +10 -0
  252. package/src/term-description/index.php +4 -0
  253. package/src/video/edit.native.js +2 -0
  254. package/tsconfig.json +1 -0
@@ -6,7 +6,7 @@ import classnames from 'classnames';
6
6
  /**
7
7
  * WordPress dependencies
8
8
  */
9
- import { ResizableBox, Spinner } from '@wordpress/components';
9
+ import { ResizableBox, Spinner, Placeholder } from '@wordpress/components';
10
10
  import {
11
11
  BlockControls,
12
12
  BlockIcon,
@@ -56,21 +56,39 @@ const ResizableBoxContainer = forwardRef(
56
56
  }
57
57
  );
58
58
 
59
- function ToolbarEditButton( { mediaId, mediaUrl, onSelectMedia } ) {
59
+ function ToolbarEditButton( {
60
+ mediaId,
61
+ mediaUrl,
62
+ onSelectMedia,
63
+ toggleUseFeaturedImage,
64
+ useFeaturedImage,
65
+ featuredImageURL,
66
+ } ) {
60
67
  return (
61
68
  <BlockControls group="other">
62
69
  <MediaReplaceFlow
63
70
  mediaId={ mediaId }
64
- mediaURL={ mediaUrl }
71
+ mediaUrl={
72
+ useFeaturedImage && featuredImageURL
73
+ ? featuredImageURL
74
+ : mediaUrl
75
+ }
65
76
  allowedTypes={ ALLOWED_MEDIA_TYPES }
66
77
  accept="image/*,video/*"
67
78
  onSelect={ onSelectMedia }
79
+ onToggleFeaturedImage={ toggleUseFeaturedImage }
80
+ useFeaturedImage={ useFeaturedImage }
68
81
  />
69
82
  </BlockControls>
70
83
  );
71
84
  }
72
85
 
73
- function PlaceholderContainer( { className, mediaUrl, onSelectMedia } ) {
86
+ function PlaceholderContainer( {
87
+ className,
88
+ mediaUrl,
89
+ onSelectMedia,
90
+ toggleUseFeaturedImage,
91
+ } ) {
74
92
  const { createErrorNotice } = useDispatch( noticesStore );
75
93
 
76
94
  const onUploadError = ( message ) => {
@@ -86,6 +104,7 @@ function PlaceholderContainer( { className, mediaUrl, onSelectMedia } ) {
86
104
  className={ className }
87
105
  onSelect={ onSelectMedia }
88
106
  accept="image/*,video/*"
107
+ onToggleFeaturedImage={ toggleUseFeaturedImage }
89
108
  allowedTypes={ ALLOWED_MEDIA_TYPES }
90
109
  onError={ onUploadError }
91
110
  disableMediaButtons={ mediaUrl }
@@ -110,13 +129,17 @@ function MediaContainer( props, ref ) {
110
129
  onSelectMedia,
111
130
  onWidthChange,
112
131
  enableResize,
132
+ toggleUseFeaturedImage,
133
+ useFeaturedImage,
134
+ featuredImageURL,
135
+ featuredImageAlt,
113
136
  } = props;
114
137
 
115
138
  const isTemporaryMedia = ! mediaId && isBlobURL( mediaUrl );
116
139
 
117
140
  const { toggleSelection } = useDispatch( blockEditorStore );
118
141
 
119
- if ( mediaUrl ) {
142
+ if ( mediaUrl || featuredImageURL || useFeaturedImage ) {
120
143
  const onResizeStart = () => {
121
144
  toggleSelection( false );
122
145
  };
@@ -134,11 +157,16 @@ function MediaContainer( props, ref ) {
134
157
 
135
158
  const backgroundStyles =
136
159
  mediaType === 'image' && imageFill
137
- ? imageFillStyles( mediaUrl, focalPoint )
160
+ ? imageFillStyles( mediaUrl || featuredImageURL, focalPoint )
138
161
  : {};
139
162
 
140
163
  const mediaTypeRenderers = {
141
- image: () => <img src={ mediaUrl } alt={ mediaAlt } />,
164
+ image: () =>
165
+ useFeaturedImage && featuredImageURL ? (
166
+ <img src={ featuredImageURL } alt={ featuredImageAlt } />
167
+ ) : (
168
+ mediaUrl && <img src={ mediaUrl } alt={ mediaAlt } />
169
+ ),
142
170
  video: () => <video controls src={ mediaUrl } />,
143
171
  };
144
172
 
@@ -165,12 +193,24 @@ function MediaContainer( props, ref ) {
165
193
  >
166
194
  <ToolbarEditButton
167
195
  onSelectMedia={ onSelectMedia }
168
- mediaUrl={ mediaUrl }
196
+ mediaUrl={
197
+ useFeaturedImage && featuredImageURL
198
+ ? featuredImageURL
199
+ : mediaUrl
200
+ }
169
201
  mediaId={ mediaId }
202
+ toggleUseFeaturedImage={ toggleUseFeaturedImage }
203
+ useFeaturedImage={ useFeaturedImage }
170
204
  />
171
205
  { ( mediaTypeRenderers[ mediaType ] || noop )() }
172
206
  { isTemporaryMedia && <Spinner /> }
173
- <PlaceholderContainer { ...props } />
207
+ { ! useFeaturedImage && <PlaceholderContainer { ...props } /> }
208
+ { ! featuredImageURL && useFeaturedImage && (
209
+ <Placeholder
210
+ className="wp-block-media-text--placeholder-image"
211
+ withIllustration
212
+ />
213
+ ) }
174
214
  </ResizableBoxContainer>
175
215
  );
176
216
  }
@@ -42,13 +42,13 @@ export default function save( { attributes } ) {
42
42
  [ `size-${ mediaSizeSlug }` ]: mediaId && mediaType === 'image',
43
43
  } );
44
44
 
45
- let image = (
45
+ let image = mediaUrl ? (
46
46
  <img
47
47
  src={ mediaUrl }
48
48
  alt={ mediaAlt }
49
49
  className={ imageClasses || null }
50
50
  />
51
- );
51
+ ) : null;
52
52
 
53
53
  if ( href ) {
54
54
  image = (
@@ -39,7 +39,7 @@ import {
39
39
  Spinner,
40
40
  Notice,
41
41
  } from '@wordpress/components';
42
- import { __, sprintf } from '@wordpress/i18n';
42
+ import { __ } from '@wordpress/i18n';
43
43
  import { speak } from '@wordpress/a11y';
44
44
  import { close, Icon } from '@wordpress/icons';
45
45
  import { useInstanceId } from '@wordpress/compose';
@@ -153,8 +153,8 @@ function Navigation( {
153
153
  isError: createNavigationMenuIsError,
154
154
  } = useCreateNavigationMenu( clientId );
155
155
 
156
- const createUntitledEmptyNavigationMenu = () => {
157
- createNavigationMenu( '' );
156
+ const createUntitledEmptyNavigationMenu = async () => {
157
+ await createNavigationMenu( '' );
158
158
  };
159
159
 
160
160
  const {
@@ -187,9 +187,9 @@ function Navigation( {
187
187
  hasResolvedCanUserUpdateNavigationMenu,
188
188
  canUserDeleteNavigationMenu,
189
189
  hasResolvedCanUserDeleteNavigationMenu,
190
- canUserCreateNavigationMenu,
191
- isResolvingCanUserCreateNavigationMenu,
192
- hasResolvedCanUserCreateNavigationMenu,
190
+ canUserCreateNavigationMenus,
191
+ isResolvingCanUserCreateNavigationMenus,
192
+ hasResolvedCanUserCreateNavigationMenus,
193
193
  } = useNavigationMenu( ref );
194
194
 
195
195
  const navMenuResolvedButMissing =
@@ -342,16 +342,7 @@ function Navigation( {
342
342
  const [ detectedOverlayColor, setDetectedOverlayColor ] = useState();
343
343
 
344
344
  const onSelectClassicMenu = async ( classicMenu ) => {
345
- const navMenu = await convertClassicMenu(
346
- classicMenu.id,
347
- classicMenu.name,
348
- 'draft'
349
- );
350
- if ( navMenu ) {
351
- handleUpdateMenu( navMenu.id, {
352
- focusNavigationBlock: true,
353
- } );
354
- }
345
+ return convertClassicMenu( classicMenu.id, classicMenu.name, 'draft' );
355
346
  };
356
347
 
357
348
  const onSelectNavigationMenu = ( menuId ) => {
@@ -402,6 +393,9 @@ function Navigation( {
402
393
  showClassicMenuConversionNotice(
403
394
  __( 'Classic menu imported successfully.' )
404
395
  );
396
+ handleUpdateMenu( createNavigationMenuPost?.id, {
397
+ focusNavigationBlock: true,
398
+ } );
405
399
  }
406
400
 
407
401
  if ( classicMenuConversionStatus === CLASSIC_MENU_CONVERSION_ERROR ) {
@@ -414,6 +408,8 @@ function Navigation( {
414
408
  classicMenuConversionError,
415
409
  hideClassicMenuConversionNotice,
416
410
  showClassicMenuConversionNotice,
411
+ createNavigationMenuPost?.id,
412
+ handleUpdateMenu,
417
413
  ] );
418
414
 
419
415
  useEffect( () => {
@@ -471,8 +467,8 @@ function Navigation( {
471
467
 
472
468
  if (
473
469
  ! ref &&
474
- hasResolvedCanUserCreateNavigationMenu &&
475
- ! canUserCreateNavigationMenu
470
+ hasResolvedCanUserCreateNavigationMenus &&
471
+ ! canUserCreateNavigationMenus
476
472
  ) {
477
473
  showNavigationMenuPermissionsNotice(
478
474
  __(
@@ -486,8 +482,8 @@ function Navigation( {
486
482
  isInnerBlockSelected,
487
483
  canUserUpdateNavigationMenu,
488
484
  hasResolvedCanUserUpdateNavigationMenu,
489
- canUserCreateNavigationMenu,
490
- hasResolvedCanUserCreateNavigationMenu,
485
+ canUserCreateNavigationMenus,
486
+ hasResolvedCanUserCreateNavigationMenus,
491
487
  ref,
492
488
  hideNavigationMenuPermissionsNotice,
493
489
  showNavigationMenuPermissionsNotice,
@@ -495,7 +491,7 @@ function Navigation( {
495
491
  ] );
496
492
 
497
493
  const hasManagePermissions =
498
- canUserCreateNavigationMenu || canUserUpdateNavigationMenu;
494
+ canUserCreateNavigationMenus || canUserUpdateNavigationMenu;
499
495
 
500
496
  const overlayMenuPreviewClasses = classnames(
501
497
  'wp-block-navigation__overlay-menu-preview',
@@ -805,9 +801,11 @@ function Navigation( {
805
801
  isSelected={ isSelected }
806
802
  currentMenuId={ ref }
807
803
  clientId={ clientId }
808
- canUserCreateNavigationMenu={ canUserCreateNavigationMenu }
809
- isResolvingCanUserCreateNavigationMenu={
810
- isResolvingCanUserCreateNavigationMenu
804
+ canUserCreateNavigationMenus={
805
+ canUserCreateNavigationMenus
806
+ }
807
+ isResolvingCanUserCreateNavigationMenus={
808
+ isResolvingCanUserCreateNavigationMenus
811
809
  }
812
810
  onSelectNavigationMenu={ onSelectNavigationMenu }
813
811
  onSelectClassicMenu={ onSelectClassicMenu }
@@ -845,15 +843,11 @@ function Navigation( {
845
843
  { hasResolvedCanUserDeleteNavigationMenu &&
846
844
  canUserDeleteNavigationMenu && (
847
845
  <NavigationMenuDeleteControl
848
- onDelete={ ( deletedMenuTitle = '' ) => {
846
+ onDelete={ () => {
849
847
  replaceInnerBlocks( clientId, [] );
850
848
  showNavigationMenuStatusNotice(
851
- sprintf(
852
- // translators: %s: the name of a menu (e.g. Header navigation).
853
- __(
854
- 'Navigation menu %s successfully deleted.'
855
- ),
856
- deletedMenuTitle
849
+ __(
850
+ 'Navigation menu successfully deleted.'
857
851
  )
858
852
  );
859
853
  } }
@@ -866,50 +860,52 @@ function Navigation( {
866
860
  </InspectorControls>
867
861
  ) }
868
862
 
869
- { isLoading && (
870
- <TagName { ...blockProps }>
863
+ <TagName
864
+ { ...blockProps }
865
+ aria-describedby={
866
+ ! isPlaceholder && ! isLoading
867
+ ? accessibleDescriptionId
868
+ : undefined
869
+ }
870
+ >
871
+ { isLoading && (
871
872
  <div className="wp-block-navigation__loading-indicator-container">
872
873
  <Spinner className="wp-block-navigation__loading-indicator" />
873
874
  </div>
874
- </TagName>
875
- ) }
875
+ ) }
876
876
 
877
- { ! isLoading && (
878
- <TagName
879
- { ...blockProps }
880
- aria-describedby={
881
- ! isPlaceholder
882
- ? accessibleDescriptionId
883
- : undefined
884
- }
885
- >
886
- <AccessibleMenuDescription
887
- id={ accessibleDescriptionId }
888
- />
889
- <ResponsiveWrapper
890
- id={ clientId }
891
- onToggle={ setResponsiveMenuVisibility }
892
- hasIcon={ hasIcon }
893
- icon={ icon }
894
- isOpen={ isResponsiveMenuOpen }
895
- isResponsive={ isResponsive }
896
- isHiddenByDefault={ 'always' === overlayMenu }
897
- overlayBackgroundColor={ overlayBackgroundColor }
898
- overlayTextColor={ overlayTextColor }
899
- >
900
- { isEntityAvailable && (
901
- <NavigationInnerBlocks
902
- clientId={ clientId }
903
- hasCustomPlaceholder={
904
- !! CustomPlaceholder
905
- }
906
- templateLock={ templateLock }
907
- orientation={ orientation }
908
- />
909
- ) }
910
- </ResponsiveWrapper>
911
- </TagName>
912
- ) }
877
+ { ! isLoading && (
878
+ <>
879
+ <AccessibleMenuDescription
880
+ id={ accessibleDescriptionId }
881
+ />
882
+ <ResponsiveWrapper
883
+ id={ clientId }
884
+ onToggle={ setResponsiveMenuVisibility }
885
+ hasIcon={ hasIcon }
886
+ icon={ icon }
887
+ isOpen={ isResponsiveMenuOpen }
888
+ isResponsive={ isResponsive }
889
+ isHiddenByDefault={ 'always' === overlayMenu }
890
+ overlayBackgroundColor={
891
+ overlayBackgroundColor
892
+ }
893
+ overlayTextColor={ overlayTextColor }
894
+ >
895
+ { isEntityAvailable && (
896
+ <NavigationInnerBlocks
897
+ clientId={ clientId }
898
+ hasCustomPlaceholder={
899
+ !! CustomPlaceholder
900
+ }
901
+ templateLock={ templateLock }
902
+ orientation={ orientation }
903
+ />
904
+ ) }
905
+ </ResponsiveWrapper>
906
+ </>
907
+ ) }
908
+ </TagName>
913
909
  </RecursionProvider>
914
910
  </EntityProvider>
915
911
  );
@@ -3,23 +3,17 @@
3
3
  */
4
4
  import {
5
5
  Button,
6
- Modal,
7
- __experimentalHStack as HStack,
6
+ __experimentalConfirmDialog as ConfirmDialog,
8
7
  } from '@wordpress/components';
9
- import {
10
- store as coreStore,
11
- useEntityId,
12
- useEntityProp,
13
- } from '@wordpress/core-data';
8
+ import { store as coreStore, useEntityId } from '@wordpress/core-data';
14
9
  import { useDispatch } from '@wordpress/data';
15
10
  import { useState } from '@wordpress/element';
16
- import { __, sprintf } from '@wordpress/i18n';
11
+ import { __ } from '@wordpress/i18n';
17
12
 
18
13
  export default function NavigationMenuDeleteControl( { onDelete } ) {
19
- const [ isConfirmModalVisible, setIsConfirmModalVisible ] =
14
+ const [ isConfirmDialogVisible, setIsConfirmDialogVisible ] =
20
15
  useState( false );
21
16
  const id = useEntityId( 'postType', 'wp_navigation' );
22
- const [ title ] = useEntityProp( 'postType', 'wp_navigation', 'title' );
23
17
  const { deleteEntityRecord } = useDispatch( coreStore );
24
18
 
25
19
  return (
@@ -29,50 +23,29 @@ export default function NavigationMenuDeleteControl( { onDelete } ) {
29
23
  variant="secondary"
30
24
  isDestructive
31
25
  onClick={ () => {
32
- setIsConfirmModalVisible( true );
26
+ setIsConfirmDialogVisible( true );
33
27
  } }
34
28
  >
35
29
  { __( 'Delete menu' ) }
36
30
  </Button>
37
- { isConfirmModalVisible && (
38
- <Modal
39
- title={ sprintf(
40
- /* translators: %s: the name of a menu to delete */
41
- __( 'Delete %s' ),
42
- title
43
- ) }
44
- onRequestClose={ () => setIsConfirmModalVisible( false ) }
31
+ { isConfirmDialogVisible && (
32
+ <ConfirmDialog
33
+ isOpen
34
+ onConfirm={ () => {
35
+ deleteEntityRecord( 'postType', 'wp_navigation', id, {
36
+ force: true,
37
+ } );
38
+ onDelete();
39
+ } }
40
+ onCancel={ () => {
41
+ setIsConfirmDialogVisible( false );
42
+ } }
43
+ confirmButtonText={ __( 'Delete' ) }
45
44
  >
46
- <p>
47
- { __(
48
- 'Are you sure you want to delete this navigation menu?'
49
- ) }
50
- </p>
51
- <HStack justify="right">
52
- <Button
53
- variant="tertiary"
54
- onClick={ () => {
55
- setIsConfirmModalVisible( false );
56
- } }
57
- >
58
- { __( 'Cancel' ) }
59
- </Button>
60
- <Button
61
- variant="primary"
62
- onClick={ () => {
63
- deleteEntityRecord(
64
- 'postType',
65
- 'wp_navigation',
66
- id,
67
- { force: true }
68
- );
69
- onDelete( title );
70
- } }
71
- >
72
- { __( 'Confirm' ) }
73
- </Button>
74
- </HStack>
75
- </Modal>
45
+ { __(
46
+ 'Are you sure you want to delete this Navigation menu?'
47
+ ) }
48
+ </ConfirmDialog>
76
49
  ) }
77
50
  </>
78
51
  );
@@ -49,7 +49,7 @@ function NavigationMenuSelector( {
49
49
  /* translators: %s: The name of a menu. */
50
50
  const createActionLabel = __( "Create from '%s'" );
51
51
 
52
- const [ isCreatingMenu, setIsCreatingMenu ] = useState( false );
52
+ const [ isUpdatingMenuRef, setIsUpdatingMenuRef ] = useState( false );
53
53
 
54
54
  actionLabel = actionLabel || createActionLabel;
55
55
 
@@ -59,7 +59,7 @@ function NavigationMenuSelector( {
59
59
  navigationMenus,
60
60
  isResolvingNavigationMenus,
61
61
  hasResolvedNavigationMenus,
62
- canUserCreateNavigationMenu,
62
+ canUserCreateNavigationMenus,
63
63
  canSwitchNavigationMenu,
64
64
  } = useNavigationMenu();
65
65
 
@@ -82,15 +82,25 @@ function NavigationMenuSelector( {
82
82
  value: id,
83
83
  label,
84
84
  ariaLabel: sprintf( actionLabel, label ),
85
+ disabled:
86
+ isUpdatingMenuRef ||
87
+ isResolvingNavigationMenus ||
88
+ ! hasResolvedNavigationMenus,
85
89
  };
86
90
  } ) || []
87
91
  );
88
- }, [ navigationMenus, actionLabel ] );
92
+ }, [
93
+ navigationMenus,
94
+ actionLabel,
95
+ isResolvingNavigationMenus,
96
+ hasResolvedNavigationMenus,
97
+ isUpdatingMenuRef,
98
+ ] );
89
99
 
90
100
  const hasNavigationMenus = !! navigationMenus?.length;
91
101
  const hasClassicMenus = !! classicMenus?.length;
92
102
  const showNavigationMenus = !! canSwitchNavigationMenu;
93
- const showClassicMenus = !! canUserCreateNavigationMenu;
103
+ const showClassicMenus = !! canUserCreateNavigationMenus;
94
104
 
95
105
  const noMenuSelected = hasNavigationMenus && ! currentMenuId;
96
106
  const noBlockMenus = ! hasNavigationMenus && hasResolvedNavigationMenus;
@@ -99,7 +109,7 @@ function NavigationMenuSelector( {
99
109
 
100
110
  let selectorLabel = '';
101
111
 
102
- if ( isCreatingMenu || isResolvingNavigationMenus ) {
112
+ if ( isResolvingNavigationMenus ) {
103
113
  selectorLabel = __( 'Loading…' );
104
114
  } else if ( noMenuSelected || noBlockMenus || menuUnavailable ) {
105
115
  // Note: classic Menus may be available.
@@ -111,17 +121,17 @@ function NavigationMenuSelector( {
111
121
 
112
122
  useEffect( () => {
113
123
  if (
114
- isCreatingMenu &&
124
+ isUpdatingMenuRef &&
115
125
  ( createNavigationMenuIsSuccess || createNavigationMenuIsError )
116
126
  ) {
117
- setIsCreatingMenu( false );
127
+ setIsUpdatingMenuRef( false );
118
128
  }
119
129
  }, [
120
130
  hasResolvedNavigationMenus,
121
131
  createNavigationMenuIsSuccess,
122
- canUserCreateNavigationMenu,
132
+ canUserCreateNavigationMenus,
123
133
  createNavigationMenuIsError,
124
- isCreatingMenu,
134
+ isUpdatingMenuRef,
125
135
  menuUnavailable,
126
136
  noBlockMenus,
127
137
  noMenuSelected,
@@ -131,7 +141,7 @@ function NavigationMenuSelector( {
131
141
  <DropdownMenu
132
142
  label={ selectorLabel }
133
143
  icon={ moreVertical }
134
- toggleProps={ { isSmall: true } }
144
+ toggleProps={ { size: 'small' } }
135
145
  >
136
146
  { ( { onClose } ) => (
137
147
  <>
@@ -140,12 +150,10 @@ function NavigationMenuSelector( {
140
150
  <MenuItemsChoice
141
151
  value={ currentMenuId }
142
152
  onSelect={ ( menuId ) => {
143
- setIsCreatingMenu( true );
144
153
  onSelectNavigationMenu( menuId );
145
154
  onClose();
146
155
  } }
147
156
  choices={ menuChoices }
148
- disabled={ isCreatingMenu }
149
157
  />
150
158
  </MenuGroup>
151
159
  ) }
@@ -155,9 +163,10 @@ function NavigationMenuSelector( {
155
163
  const label = decodeEntities( menu.name );
156
164
  return (
157
165
  <MenuItem
158
- onClick={ () => {
159
- setIsCreatingMenu( true );
160
- onSelectClassicMenu( menu );
166
+ onClick={ async () => {
167
+ setIsUpdatingMenuRef( true );
168
+ await onSelectClassicMenu( menu );
169
+ setIsUpdatingMenuRef( false );
161
170
  onClose();
162
171
  } }
163
172
  key={ menu.id }
@@ -165,7 +174,11 @@ function NavigationMenuSelector( {
165
174
  createActionLabel,
166
175
  label
167
176
  ) }
168
- disabled={ isCreatingMenu }
177
+ disabled={
178
+ isUpdatingMenuRef ||
179
+ isResolvingNavigationMenus ||
180
+ ! hasResolvedNavigationMenus
181
+ }
169
182
  >
170
183
  { label }
171
184
  </MenuItem>
@@ -174,15 +187,20 @@ function NavigationMenuSelector( {
174
187
  </MenuGroup>
175
188
  ) }
176
189
 
177
- { canUserCreateNavigationMenu && (
190
+ { canUserCreateNavigationMenus && (
178
191
  <MenuGroup label={ __( 'Tools' ) }>
179
192
  <MenuItem
180
- disabled={ isCreatingMenu }
181
- onClick={ () => {
193
+ onClick={ async () => {
194
+ setIsUpdatingMenuRef( true );
195
+ await onCreateNew();
196
+ setIsUpdatingMenuRef( false );
182
197
  onClose();
183
- onCreateNew();
184
- setIsCreatingMenu( true );
185
198
  } }
199
+ disabled={
200
+ isUpdatingMenuRef ||
201
+ isResolvingNavigationMenus ||
202
+ ! hasResolvedNavigationMenus
203
+ }
186
204
  >
187
205
  { __( 'Create new menu' ) }
188
206
  </MenuItem>
@@ -18,8 +18,8 @@ export default function NavigationPlaceholder( {
18
18
  isSelected,
19
19
  currentMenuId,
20
20
  clientId,
21
- canUserCreateNavigationMenu = false,
22
- isResolvingCanUserCreateNavigationMenu,
21
+ canUserCreateNavigationMenus = false,
22
+ isResolvingCanUserCreateNavigationMenus,
23
23
  onSelectNavigationMenu,
24
24
  onSelectClassicMenu,
25
25
  onCreateEmpty,
@@ -41,7 +41,7 @@ export default function NavigationPlaceholder( {
41
41
  }, [ hasResolvedMenus, isResolvingMenus, isSelected ] );
42
42
 
43
43
  const isResolvingActions =
44
- isResolvingMenus && isResolvingCanUserCreateNavigationMenu;
44
+ isResolvingMenus && isResolvingCanUserCreateNavigationMenus;
45
45
 
46
46
  return (
47
47
  <>
@@ -74,7 +74,7 @@ export default function NavigationPlaceholder( {
74
74
 
75
75
  <hr />
76
76
 
77
- { canUserCreateNavigationMenu && (
77
+ { canUserCreateNavigationMenus && (
78
78
  <Button
79
79
  variant="tertiary"
80
80
  onClick={ onCreateEmpty }