@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
@@ -25,9 +25,9 @@ import {
25
25
  Button,
26
26
  } from '@wordpress/components';
27
27
  import { __, sprintf } from '@wordpress/i18n';
28
- import { useMemo, useState, useEffect } from '@wordpress/element';
28
+ import { useMemo, useState, useEffect, useCallback } from '@wordpress/element';
29
29
  import { useEntityRecords } from '@wordpress/core-data';
30
- import { useSelect } from '@wordpress/data';
30
+ import { useSelect, useDispatch } from '@wordpress/data';
31
31
 
32
32
  /**
33
33
  * Internal dependencies
@@ -53,7 +53,9 @@ function BlockContent( {
53
53
  if ( ! hasResolvedPages ) {
54
54
  return (
55
55
  <div { ...blockProps }>
56
- <Spinner />
56
+ <div className="wp-block-page-list__loading-indicator-container">
57
+ <Spinner className="wp-block-page-list__loading-indicator" />
58
+ </div>
57
59
  </div>
58
60
  );
59
61
  }
@@ -111,29 +113,6 @@ function BlockContent( {
111
113
  }
112
114
  }
113
115
 
114
- function ConvertToLinks( { onClick, disabled } ) {
115
- const [ isOpen, setOpen ] = useState( false );
116
- const openModal = () => setOpen( true );
117
- const closeModal = () => setOpen( false );
118
-
119
- return (
120
- <>
121
- <BlockControls group="other">
122
- <ToolbarButton title={ __( 'Edit' ) } onClick={ openModal }>
123
- { __( 'Edit' ) }
124
- </ToolbarButton>
125
- </BlockControls>
126
- { isOpen && (
127
- <ConvertToLinksModal
128
- onClick={ onClick }
129
- onClose={ closeModal }
130
- disabled={ disabled }
131
- />
132
- ) }
133
- </>
134
- );
135
- }
136
-
137
116
  export default function PageListEdit( {
138
117
  context,
139
118
  clientId,
@@ -141,6 +120,9 @@ export default function PageListEdit( {
141
120
  setAttributes,
142
121
  } ) {
143
122
  const { parentPageID } = attributes;
123
+ const [ isOpen, setOpen ] = useState( false );
124
+ const openModal = useCallback( () => setOpen( true ), [] );
125
+ const closeModal = () => setOpen( false );
144
126
 
145
127
  const { records: pages, hasResolved: hasResolvedPages } = useEntityRecords(
146
128
  'postType',
@@ -218,7 +200,11 @@ export default function PageListEdit( {
218
200
  const hasChildren = pagesByParentId.has( page.id );
219
201
  const pageProps = {
220
202
  id: page.id,
221
- label: page.title?.rendered,
203
+ label:
204
+ // translators: displayed when a page has an empty title.
205
+ page.title?.rendered?.trim() !== ''
206
+ ? page.title?.rendered
207
+ : __( '(no title)' ),
222
208
  title: page.title?.rendered,
223
209
  link: page.url,
224
210
  hasChildren,
@@ -261,34 +247,69 @@ export default function PageListEdit( {
261
247
  parentPageID,
262
248
  ] );
263
249
 
264
- const innerBlocksProps = useInnerBlocksProps( blockProps, {
265
- allowedBlocks: [ 'core/page-list-item' ],
266
- renderAppender: false,
267
- __unstableDisableDropZone: true,
268
- templateLock: 'all',
269
- onInput: NOOP,
270
- onChange: NOOP,
271
- value: blockList,
272
- } );
273
-
274
- const { isNested } = useSelect(
250
+ const {
251
+ isNested,
252
+ hasSelectedChild,
253
+ parentBlock,
254
+ hasDraggedChild,
255
+ isChildOfNavigation,
256
+ } = useSelect(
275
257
  ( select ) => {
276
- const { getBlockParentsByBlockName } = select( blockEditorStore );
258
+ const {
259
+ getBlockParentsByBlockName,
260
+ hasSelectedInnerBlock,
261
+ getBlockRootClientId,
262
+ hasDraggedInnerBlock,
263
+ } = select( blockEditorStore );
277
264
  const blockParents = getBlockParentsByBlockName(
278
265
  clientId,
279
266
  'core/navigation-submenu',
280
267
  true
281
268
  );
269
+ const navigationBlockParents = getBlockParentsByBlockName(
270
+ clientId,
271
+ 'core/navigation',
272
+ true
273
+ );
282
274
  return {
283
275
  isNested: blockParents.length > 0,
276
+ isChildOfNavigation: navigationBlockParents.length > 0,
277
+ hasSelectedChild: hasSelectedInnerBlock( clientId, true ),
278
+ hasDraggedChild: hasDraggedInnerBlock( clientId, true ),
279
+ parentBlock: getBlockRootClientId( clientId ),
284
280
  };
285
281
  },
286
282
  [ clientId ]
287
283
  );
288
284
 
285
+ const innerBlocksProps = useInnerBlocksProps( blockProps, {
286
+ allowedBlocks: [ 'core/page-list-item' ],
287
+ renderAppender: false,
288
+ __unstableDisableDropZone: true,
289
+ templateLock: isChildOfNavigation ? false : 'all',
290
+ onInput: NOOP,
291
+ onChange: NOOP,
292
+ value: blockList,
293
+ } );
294
+
295
+ const { selectBlock } = useDispatch( blockEditorStore );
296
+
297
+ useEffect( () => {
298
+ if ( hasSelectedChild || hasDraggedChild ) {
299
+ openModal();
300
+ selectBlock( parentBlock );
301
+ }
302
+ }, [
303
+ hasSelectedChild,
304
+ hasDraggedChild,
305
+ parentBlock,
306
+ selectBlock,
307
+ openModal,
308
+ ] );
309
+
289
310
  useEffect( () => {
290
311
  setAttributes( { isNested } );
291
- }, [ isNested ] );
312
+ }, [ isNested, setAttributes ] );
292
313
 
293
314
  return (
294
315
  <>
@@ -323,10 +344,23 @@ export default function PageListEdit( {
323
344
  ) }
324
345
  </InspectorControls>
325
346
  { allowConvertToLinks && (
326
- <ConvertToLinks
327
- disabled={ ! hasResolvedPages }
328
- onClick={ convertToNavigationLinks }
329
- />
347
+ <>
348
+ <BlockControls group="other">
349
+ <ToolbarButton
350
+ title={ __( 'Edit' ) }
351
+ onClick={ openModal }
352
+ >
353
+ { __( 'Edit' ) }
354
+ </ToolbarButton>
355
+ </BlockControls>
356
+ { isOpen && (
357
+ <ConvertToLinksModal
358
+ onClick={ convertToNavigationLinks }
359
+ onClose={ closeModal }
360
+ disabled={ ! hasResolvedPages }
361
+ />
362
+ ) }
363
+ </>
330
364
  ) }
331
365
  <BlockContent
332
366
  blockProps={ blockProps }
@@ -61,3 +61,9 @@
61
61
  .wp-block-page-list .components-notice {
62
62
  margin-left: 0;
63
63
  }
64
+
65
+ // Space spinner to give it breathing
66
+ // room when block is selected and has focus outline.
67
+ .wp-block-page-list__loading-indicator-container {
68
+ padding: $grid-unit-10 $grid-unit-15;
69
+ }
@@ -2,7 +2,6 @@
2
2
  * External dependencies
3
3
  */
4
4
  import classnames from 'classnames';
5
-
6
5
  /**
7
6
  * WordPress dependencies
8
7
  */
@@ -36,7 +35,7 @@ function useFrontPageId() {
36
35
  }
37
36
 
38
37
  export default function PageListItemEdit( { context, attributes } ) {
39
- const { id, label, link, hasChildren } = attributes;
38
+ const { id, label, link, hasChildren, title } = attributes;
40
39
  const isNavigationChild = 'showSubmenuIcon' in context;
41
40
  const frontPageId = useFrontPageId();
42
41
 
@@ -81,7 +80,7 @@ export default function PageListItemEdit( { context, attributes } ) {
81
80
  } ) }
82
81
  href={ link }
83
82
  >
84
- { decodeEntities( label ) }
83
+ { decodeEntities( title ) }
85
84
  </a>
86
85
  ) }
87
86
  { hasChildren && (
@@ -0,0 +1,59 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Paragraph block transforms to Columns block 1`] = `
4
+ "<!-- wp:columns -->
5
+ <div class="wp-block-columns"><!-- wp:column {"width":"100%"} -->
6
+ <div class="wp-block-column" style="flex-basis:100%"><!-- wp:paragraph -->
7
+ <p>Example text</p>
8
+ <!-- /wp:paragraph --></div>
9
+ <!-- /wp:column --></div>
10
+ <!-- /wp:columns -->"
11
+ `;
12
+
13
+ exports[`Paragraph block transforms to Group block 1`] = `
14
+ "<!-- wp:group {"layout":{"type":"constrained"}} -->
15
+ <div class="wp-block-group"><!-- wp:paragraph -->
16
+ <p>Example text</p>
17
+ <!-- /wp:paragraph --></div>
18
+ <!-- /wp:group -->"
19
+ `;
20
+
21
+ exports[`Paragraph block transforms to Heading block 1`] = `
22
+ "<!-- wp:heading -->
23
+ <h2 class="wp-block-heading">Example text</h2>
24
+ <!-- /wp:heading -->"
25
+ `;
26
+
27
+ exports[`Paragraph block transforms to List block 1`] = `
28
+ "<!-- wp:list -->
29
+ <ul><!-- wp:list-item -->
30
+ <li>Example text</li>
31
+ <!-- /wp:list-item --></ul>
32
+ <!-- /wp:list -->"
33
+ `;
34
+
35
+ exports[`Paragraph block transforms to Preformatted block 1`] = `
36
+ "<!-- wp:preformatted -->
37
+ <pre class="wp-block-preformatted">Example text</pre>
38
+ <!-- /wp:preformatted -->"
39
+ `;
40
+
41
+ exports[`Paragraph block transforms to Pullquote block 1`] = `
42
+ "<!-- wp:pullquote -->
43
+ <figure class="wp-block-pullquote"><blockquote><p>Example text</p></blockquote></figure>
44
+ <!-- /wp:pullquote -->"
45
+ `;
46
+
47
+ exports[`Paragraph block transforms to Quote block 1`] = `
48
+ "<!-- wp:quote -->
49
+ <blockquote class="wp-block-quote"><!-- wp:paragraph -->
50
+ <p>Example text</p>
51
+ <!-- /wp:paragraph --></blockquote>
52
+ <!-- /wp:quote -->"
53
+ `;
54
+
55
+ exports[`Paragraph block transforms to Verse block 1`] = `
56
+ "<!-- wp:verse -->
57
+ <pre class="wp-block-verse">Example text</pre>
58
+ <!-- /wp:verse -->"
59
+ `;
@@ -0,0 +1,50 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import {
5
+ getEditorHtml,
6
+ initializeEditor,
7
+ setupCoreBlocks,
8
+ transformBlock,
9
+ getBlockTransformOptions,
10
+ } from 'test/helpers';
11
+
12
+ const block = 'Paragraph';
13
+ const initialHtml = `
14
+ <!-- wp:paragraph -->
15
+ <p>Example text</p>
16
+ <!-- /wp:paragraph -->`;
17
+
18
+ // NOTE: Paragraph block can be transformed to Buttons block in web,
19
+ // however this transform is not supported in the native version.
20
+ const transformsWithInnerBlocks = [ 'List', 'Quote', 'Columns', 'Group' ];
21
+ const blockTransforms = [
22
+ 'Heading',
23
+ 'Preformatted',
24
+ 'Pullquote',
25
+ 'Verse',
26
+ ...transformsWithInnerBlocks,
27
+ ];
28
+
29
+ setupCoreBlocks();
30
+
31
+ describe( `${ block } block transforms`, () => {
32
+ test.each( blockTransforms )( 'to %s block', async ( blockTransform ) => {
33
+ const screen = await initializeEditor( { initialHtml } );
34
+ const newBlock = await transformBlock( screen, block, blockTransform, {
35
+ hasInnerBlocks:
36
+ transformsWithInnerBlocks.includes( blockTransform ),
37
+ } );
38
+ expect( newBlock ).toBeVisible();
39
+ expect( getEditorHtml() ).toMatchSnapshot();
40
+ } );
41
+
42
+ it( 'matches expected transformation options', async () => {
43
+ const screen = await initializeEditor( { initialHtml } );
44
+ const transformOptions = await getBlockTransformOptions(
45
+ screen,
46
+ block
47
+ );
48
+ expect( transformOptions ).toHaveLength( blockTransforms.length );
49
+ } );
50
+ } );
@@ -58,8 +58,12 @@ function EditableContent( { context = {} } ) {
58
58
 
59
59
  function Content( props ) {
60
60
  const { context: { queryId, postType, postId } = {} } = props;
61
- const isDescendentOfQueryLoop = Number.isFinite( queryId );
62
61
  const userCanEdit = useCanEditEntity( 'postType', postType, postId );
62
+ if ( userCanEdit === undefined ) {
63
+ return null;
64
+ }
65
+
66
+ const isDescendentOfQueryLoop = Number.isFinite( queryId );
63
67
  const isEditable = userCanEdit && ! isDescendentOfQueryLoop;
64
68
 
65
69
  return isEditable ? (
@@ -84,8 +84,7 @@ add_action( 'init', 'register_block_core_post_excerpt' );
84
84
  * Returns 100 because 100 is the max length in the setting.
85
85
  */
86
86
  if ( is_admin() ||
87
- defined( 'REST_REQUEST' ) ||
88
- 'REST_REQUEST' ) {
87
+ defined( 'REST_REQUEST' ) && REST_REQUEST ) {
89
88
  add_filter(
90
89
  'excerpt_length',
91
90
  function() {
@@ -96,10 +96,6 @@ const DimensionControls = ( {
96
96
  label: __( 'Square' ),
97
97
  value: '1',
98
98
  },
99
- {
100
- label: __( '16:10' ),
101
- value: '16/10',
102
- },
103
99
  {
104
100
  label: __( '16:9' ),
105
101
  value: '16/9',
@@ -112,10 +108,6 @@ const DimensionControls = ( {
112
108
  label: __( '3:2' ),
113
109
  value: '3/2',
114
110
  },
115
- {
116
- label: __( '10:16' ),
117
- value: '10/16',
118
- },
119
111
  {
120
112
  label: __( '9:16' ),
121
113
  value: '9/16',
@@ -139,7 +139,7 @@ export default function PostFeaturedImageEdit( {
139
139
  imageSizeOptions={ imageSizeOptions }
140
140
  />
141
141
  <InspectorControls>
142
- <PanelBody title={ __( 'Link settings' ) }>
142
+ <PanelBody title={ __( 'Settings' ) }>
143
143
  <ToggleControl
144
144
  __nextHasNoMarginBottom
145
145
  label={
@@ -3,6 +3,7 @@
3
3
  margin-right: 0;
4
4
  a {
5
5
  display: block;
6
+ height: 100%;
6
7
  }
7
8
  img {
8
9
  max-width: 100%;
@@ -0,0 +1,31 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Preformatted block transforms to Code block 1`] = `
4
+ "<!-- wp:code -->
5
+ <pre class="wp-block-code"><code>Some <em>preformatted</em> text...<br />And more!</code></pre>
6
+ <!-- /wp:code -->"
7
+ `;
8
+
9
+ exports[`Preformatted block transforms to Columns block 1`] = `
10
+ "<!-- wp:columns -->
11
+ <div class="wp-block-columns"><!-- wp:column {"width":"100%"} -->
12
+ <div class="wp-block-column" style="flex-basis:100%"><!-- wp:preformatted -->
13
+ <pre class="wp-block-preformatted">Some <em>preformatted</em> text...<br />And more!</pre>
14
+ <!-- /wp:preformatted --></div>
15
+ <!-- /wp:column --></div>
16
+ <!-- /wp:columns -->"
17
+ `;
18
+
19
+ exports[`Preformatted block transforms to Group block 1`] = `
20
+ "<!-- wp:group {"layout":{"type":"constrained"}} -->
21
+ <div class="wp-block-group"><!-- wp:preformatted -->
22
+ <pre class="wp-block-preformatted">Some <em>preformatted</em> text...<br />And more!</pre>
23
+ <!-- /wp:preformatted --></div>
24
+ <!-- /wp:group -->"
25
+ `;
26
+
27
+ exports[`Preformatted block transforms to Paragraph block 1`] = `
28
+ "<!-- wp:paragraph -->
29
+ <p>Some <em>preformatted</em> text...<br />And more!</p>
30
+ <!-- /wp:paragraph -->"
31
+ `;
@@ -0,0 +1,42 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import {
5
+ getEditorHtml,
6
+ initializeEditor,
7
+ setupCoreBlocks,
8
+ transformBlock,
9
+ getBlockTransformOptions,
10
+ } from 'test/helpers';
11
+
12
+ const block = 'Preformatted';
13
+ const initialHtml = `
14
+ <!-- wp:preformatted -->
15
+ <pre class="wp-block-preformatted">Some <em>preformatted</em> text...<br>And more!</pre>
16
+ <!-- /wp:preformatted -->`;
17
+
18
+ const transformsWithInnerBlocks = [ 'Columns', 'Group' ];
19
+ const blockTransforms = [ 'Paragraph', 'Code', ...transformsWithInnerBlocks ];
20
+
21
+ setupCoreBlocks();
22
+
23
+ describe( `${ block } block transforms`, () => {
24
+ test.each( blockTransforms )( 'to %s block', async ( blockTransform ) => {
25
+ const screen = await initializeEditor( { initialHtml } );
26
+ const newBlock = await transformBlock( screen, block, blockTransform, {
27
+ hasInnerBlocks:
28
+ transformsWithInnerBlocks.includes( blockTransform ),
29
+ } );
30
+ expect( newBlock ).toBeVisible();
31
+ expect( getEditorHtml() ).toMatchSnapshot();
32
+ } );
33
+
34
+ it( 'matches expected transformation options', async () => {
35
+ const screen = await initializeEditor( { initialHtml } );
36
+ const transformOptions = await getBlockTransformOptions(
37
+ screen,
38
+ block
39
+ );
40
+ expect( transformOptions ).toHaveLength( blockTransforms.length );
41
+ } );
42
+ } );
@@ -2,7 +2,6 @@
2
2
  * External dependencies
3
3
  */
4
4
  import classnames from 'classnames';
5
- import { get } from 'lodash';
6
5
 
7
6
  /**
8
7
  * WordPress dependencies
@@ -435,11 +434,8 @@ const v2 = {
435
434
  // Is normal style and a named color is being used, we need to retrieve the color value to set the style,
436
435
  // as there is no expectation that themes create classes that set border colors.
437
436
  } else if ( mainColor ) {
438
- const colors = get(
439
- select( blockEditorStore ).getSettings(),
440
- [ 'colors' ],
441
- []
442
- );
437
+ const colors =
438
+ select( blockEditorStore ).getSettings().colors ?? [];
443
439
  const colorObject = getColorObjectByAttributeValues(
444
440
  colors,
445
441
  mainColor
@@ -0,0 +1,47 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Pullquote block transforms to Columns block 1`] = `
4
+ "<!-- wp:columns -->
5
+ <div class="wp-block-columns"><!-- wp:column {"width":"100%"} -->
6
+ <div class="wp-block-column" style="flex-basis:100%"><!-- wp:pullquote -->
7
+ <figure class="wp-block-pullquote"><blockquote><p>One of the hardest things to do in technology is disrupt yourself.</p><cite>Matt Mullenweg</cite></blockquote></figure>
8
+ <!-- /wp:pullquote --></div>
9
+ <!-- /wp:column --></div>
10
+ <!-- /wp:columns -->"
11
+ `;
12
+
13
+ exports[`Pullquote block transforms to Group block 1`] = `
14
+ "<!-- wp:group {"layout":{"type":"constrained"}} -->
15
+ <div class="wp-block-group"><!-- wp:pullquote -->
16
+ <figure class="wp-block-pullquote"><blockquote><p>One of the hardest things to do in technology is disrupt yourself.</p><cite>Matt Mullenweg</cite></blockquote></figure>
17
+ <!-- /wp:pullquote --></div>
18
+ <!-- /wp:group -->"
19
+ `;
20
+
21
+ exports[`Pullquote block transforms to Heading block 1`] = `
22
+ "<!-- wp:heading -->
23
+ <h2 class="wp-block-heading">One of the hardest things to do in technology is disrupt yourself.</h2>
24
+ <!-- /wp:heading -->
25
+
26
+ <!-- wp:heading -->
27
+ <h2 class="wp-block-heading">Matt Mullenweg</h2>
28
+ <!-- /wp:heading -->"
29
+ `;
30
+
31
+ exports[`Pullquote block transforms to Paragraph block 1`] = `
32
+ "<!-- wp:paragraph -->
33
+ <p>One of the hardest things to do in technology is disrupt yourself.</p>
34
+ <!-- /wp:paragraph -->
35
+
36
+ <!-- wp:paragraph -->
37
+ <p>Matt Mullenweg</p>
38
+ <!-- /wp:paragraph -->"
39
+ `;
40
+
41
+ exports[`Pullquote block transforms to Quote block 1`] = `
42
+ "<!-- wp:quote -->
43
+ <blockquote class="wp-block-quote"><!-- wp:paragraph -->
44
+ <p>One of the hardest things to do in technology is disrupt yourself.</p>
45
+ <!-- /wp:paragraph --><cite>Matt Mullenweg</cite></blockquote>
46
+ <!-- /wp:quote -->"
47
+ `;
@@ -0,0 +1,46 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import {
5
+ getEditorHtml,
6
+ initializeEditor,
7
+ setupCoreBlocks,
8
+ transformBlock,
9
+ getBlockTransformOptions,
10
+ } from 'test/helpers';
11
+
12
+ const block = 'Pullquote';
13
+ const initialHtml = `
14
+ <!-- wp:pullquote -->
15
+ <figure class="wp-block-pullquote"><blockquote><p>One of the hardest things to do in technology is disrupt yourself.</p><cite>Matt Mullenweg</cite></blockquote></figure>
16
+ <!-- /wp:pullquote -->`;
17
+
18
+ const transformsWithInnerBlocks = [ 'Quote', 'Columns', 'Group' ];
19
+ const blockTransforms = [
20
+ 'Paragraph',
21
+ 'Heading',
22
+ ...transformsWithInnerBlocks,
23
+ ];
24
+
25
+ setupCoreBlocks();
26
+
27
+ describe( `${ block } block transforms`, () => {
28
+ test.each( blockTransforms )( 'to %s block', async ( blockTransform ) => {
29
+ const screen = await initializeEditor( { initialHtml } );
30
+ const newBlock = await transformBlock( screen, block, blockTransform, {
31
+ hasInnerBlocks:
32
+ transformsWithInnerBlocks.includes( blockTransform ),
33
+ } );
34
+ expect( newBlock ).toBeVisible();
35
+ expect( getEditorHtml() ).toMatchSnapshot();
36
+ } );
37
+
38
+ it( 'matches expected transformation options', async () => {
39
+ const screen = await initializeEditor( { initialHtml } );
40
+ const transformOptions = await getBlockTransformOptions(
41
+ screen,
42
+ block
43
+ );
44
+ expect( transformOptions ).toHaveLength( blockTransforms.length );
45
+ } );
46
+ } );
@@ -19,7 +19,7 @@ import { __ } from '@wordpress/i18n';
19
19
  /**
20
20
  * Internal dependencies
21
21
  */
22
- import { useScopedBlockVariations } from '../utils';
22
+ import { useScopedBlockVariations, useBlockNameForPatterns } from '../utils';
23
23
 
24
24
  export default function QueryPlaceholder( {
25
25
  attributes,
@@ -30,6 +30,10 @@ export default function QueryPlaceholder( {
30
30
  } ) {
31
31
  const [ isStartingBlank, setIsStartingBlank ] = useState( false );
32
32
  const blockProps = useBlockProps();
33
+ const blockNameForPatterns = useBlockNameForPatterns(
34
+ clientId,
35
+ attributes
36
+ );
33
37
 
34
38
  const { blockType, allVariations, hasPatterns } = useSelect(
35
39
  ( select ) => {
@@ -37,15 +41,16 @@ export default function QueryPlaceholder( {
37
41
  const { getBlockRootClientId, getPatternsByBlockTypes } =
38
42
  select( blockEditorStore );
39
43
  const rootClientId = getBlockRootClientId( clientId );
40
-
41
44
  return {
42
45
  blockType: getBlockType( name ),
43
46
  allVariations: getBlockVariations( name ),
44
- hasPatterns: !! getPatternsByBlockTypes( name, rootClientId )
45
- .length,
47
+ hasPatterns: !! getPatternsByBlockTypes(
48
+ blockNameForPatterns,
49
+ rootClientId
50
+ ).length,
46
51
  };
47
52
  },
48
- [ name, clientId ]
53
+ [ name, blockNameForPatterns, clientId ]
49
54
  );
50
55
 
51
56
  const matchingVariation = getMatchingVariation( attributes, allVariations );
@@ -2,7 +2,7 @@
2
2
  * Internal dependencies
3
3
  */
4
4
  import { terms } from './fixtures';
5
- import { getEntitiesInfo } from '../utils';
5
+ import { getEntitiesInfo, getValueFromObjectPath } from '../utils';
6
6
 
7
7
  describe( 'Query block utils', () => {
8
8
  describe( 'getEntitiesInfo', () => {
@@ -29,4 +29,36 @@ describe( 'Query block utils', () => {
29
29
  );
30
30
  } );
31
31
  } );
32
+
33
+ describe( 'getValueFromObjectPath', () => {
34
+ it( 'should return undefined when path is empty', () => {
35
+ const object = { foo: 'bar' };
36
+ const result = getValueFromObjectPath( object, '' );
37
+ expect( result ).toBeUndefined();
38
+ } );
39
+
40
+ it( 'should return undefined when path does not exist', () => {
41
+ const object = { foo: 'bar' };
42
+ const result = getValueFromObjectPath( object, 'baz' );
43
+ expect( result ).toBeUndefined();
44
+ } );
45
+
46
+ it( 'should return undefined when a deeper path does not exist', () => {
47
+ const object = { foo: { bar: 'baz' } };
48
+ const result = getValueFromObjectPath( object, 'foo.test' );
49
+ expect( result ).toBeUndefined();
50
+ } );
51
+
52
+ it( 'should return the corresponding value of a single level path', () => {
53
+ const object = { foo: 'bar' };
54
+ const result = getValueFromObjectPath( object, 'foo' );
55
+ expect( result ).toBe( 'bar' );
56
+ } );
57
+
58
+ it( 'should return the value of a deeper path', () => {
59
+ const object = { foo: { bar: { baz: 'test' } } };
60
+ const result = getValueFromObjectPath( object, 'foo.bar.baz' );
61
+ expect( result ).toBe( 'test' );
62
+ } );
63
+ } );
32
64
  } );