@wordpress/block-library 7.0.0 → 7.0.2

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 (230) hide show
  1. package/README.md +16 -0
  2. package/build/button/edit.native.js +2 -2
  3. package/build/button/edit.native.js.map +1 -1
  4. package/build/columns/index.js +12 -0
  5. package/build/columns/index.js.map +1 -1
  6. package/build/comment-author-avatar/edit.js +17 -4
  7. package/build/comment-author-avatar/edit.js.map +1 -1
  8. package/build/comment-template/edit.js +94 -36
  9. package/build/comment-template/edit.js.map +1 -1
  10. package/build/comment-template/hooks.js +175 -0
  11. package/build/comment-template/hooks.js.map +1 -0
  12. package/build/comment-template/index.js +1 -1
  13. package/build/comment-template/util.js.map +1 -1
  14. package/build/comments-pagination-next/index.js +1 -1
  15. package/build/comments-pagination-numbers/index.js +1 -1
  16. package/build/comments-query-loop/edit/comments-inspector-controls.js +20 -9
  17. package/build/comments-query-loop/edit/comments-inspector-controls.js.map +1 -1
  18. package/build/comments-query-loop/edit.js +1 -19
  19. package/build/comments-query-loop/edit.js.map +1 -1
  20. package/build/comments-query-loop/index.js +5 -0
  21. package/build/comments-query-loop/index.js.map +1 -1
  22. package/build/cover/edit.js +21 -22
  23. package/build/cover/edit.js.map +1 -1
  24. package/build/cover/edit.native.js +7 -5
  25. package/build/cover/edit.native.js.map +1 -1
  26. package/build/cover/overlay-color-settings.native.js +4 -3
  27. package/build/cover/overlay-color-settings.native.js.map +1 -1
  28. package/build/cover/transforms.js +4 -2
  29. package/build/cover/transforms.js.map +1 -1
  30. package/build/group/index.js +1 -0
  31. package/build/group/index.js.map +1 -1
  32. package/build/heading/edit.js +14 -2
  33. package/build/heading/edit.js.map +1 -1
  34. package/build/image/deprecated.js +89 -5
  35. package/build/image/deprecated.js.map +1 -1
  36. package/build/image/save.js +0 -7
  37. package/build/image/save.js.map +1 -1
  38. package/build/latest-posts/edit.js +1 -0
  39. package/build/latest-posts/edit.js.map +1 -1
  40. package/build/navigation/edit/index.js +17 -15
  41. package/build/navigation/edit/index.js.map +1 -1
  42. package/build/navigation/edit/navigation-menu-selector.js +44 -27
  43. package/build/navigation/edit/navigation-menu-selector.js.map +1 -1
  44. package/build/navigation/edit/placeholder/index.js +8 -22
  45. package/build/navigation/edit/placeholder/index.js.map +1 -1
  46. package/build/navigation/use-navigation-menu.js +6 -6
  47. package/build/navigation/use-navigation-menu.js.map +1 -1
  48. package/build/navigation-submenu/edit.js +41 -9
  49. package/build/navigation-submenu/edit.js.map +1 -1
  50. package/build/page-list/edit.js +11 -17
  51. package/build/page-list/edit.js.map +1 -1
  52. package/build/social-links/deprecated.js +1 -62
  53. package/build/social-links/deprecated.js.map +1 -1
  54. package/build/template-part/edit/index.js +36 -64
  55. package/build/template-part/edit/index.js.map +1 -1
  56. package/build/template-part/edit/placeholder.js +64 -0
  57. package/build/template-part/edit/placeholder.js.map +1 -0
  58. package/build/template-part/edit/selection-modal.js +103 -0
  59. package/build/template-part/edit/selection-modal.js.map +1 -0
  60. package/build/template-part/edit/title-modal.js +54 -0
  61. package/build/template-part/edit/title-modal.js.map +1 -0
  62. package/build/template-part/edit/utils/hooks.js +156 -0
  63. package/build/template-part/edit/utils/hooks.js.map +1 -0
  64. package/build/template-part/index.js +3 -1
  65. package/build/template-part/index.js.map +1 -1
  66. package/build-module/button/edit.native.js +4 -4
  67. package/build-module/button/edit.native.js.map +1 -1
  68. package/build-module/columns/index.js +12 -0
  69. package/build-module/columns/index.js.map +1 -1
  70. package/build-module/comment-author-avatar/edit.js +18 -6
  71. package/build-module/comment-author-avatar/edit.js.map +1 -1
  72. package/build-module/comment-template/edit.js +95 -37
  73. package/build-module/comment-template/edit.js.map +1 -1
  74. package/build-module/comment-template/hooks.js +156 -0
  75. package/build-module/comment-template/hooks.js.map +1 -0
  76. package/build-module/comment-template/index.js +1 -1
  77. package/build-module/comment-template/util.js.map +1 -1
  78. package/build-module/comments-pagination-next/index.js +1 -1
  79. package/build-module/comments-pagination-numbers/index.js +1 -1
  80. package/build-module/comments-query-loop/edit/comments-inspector-controls.js +20 -9
  81. package/build-module/comments-query-loop/edit/comments-inspector-controls.js.map +1 -1
  82. package/build-module/comments-query-loop/edit.js +2 -19
  83. package/build-module/comments-query-loop/edit.js.map +1 -1
  84. package/build-module/comments-query-loop/index.js +5 -0
  85. package/build-module/comments-query-loop/index.js.map +1 -1
  86. package/build-module/cover/edit.js +23 -24
  87. package/build-module/cover/edit.js.map +1 -1
  88. package/build-module/cover/edit.native.js +10 -8
  89. package/build-module/cover/edit.native.js.map +1 -1
  90. package/build-module/cover/overlay-color-settings.native.js +4 -4
  91. package/build-module/cover/overlay-color-settings.native.js.map +1 -1
  92. package/build-module/cover/transforms.js +4 -2
  93. package/build-module/cover/transforms.js.map +1 -1
  94. package/build-module/group/index.js +1 -0
  95. package/build-module/group/index.js.map +1 -1
  96. package/build-module/heading/edit.js +15 -3
  97. package/build-module/heading/edit.js.map +1 -1
  98. package/build-module/image/deprecated.js +90 -7
  99. package/build-module/image/deprecated.js.map +1 -1
  100. package/build-module/image/save.js +0 -7
  101. package/build-module/image/save.js.map +1 -1
  102. package/build-module/latest-posts/edit.js +1 -0
  103. package/build-module/latest-posts/edit.js.map +1 -1
  104. package/build-module/navigation/edit/index.js +17 -15
  105. package/build-module/navigation/edit/index.js.map +1 -1
  106. package/build-module/navigation/edit/navigation-menu-selector.js +45 -27
  107. package/build-module/navigation/edit/navigation-menu-selector.js.map +1 -1
  108. package/build-module/navigation/edit/placeholder/index.js +8 -21
  109. package/build-module/navigation/edit/placeholder/index.js.map +1 -1
  110. package/build-module/navigation/use-navigation-menu.js +6 -6
  111. package/build-module/navigation/use-navigation-menu.js.map +1 -1
  112. package/build-module/navigation-submenu/edit.js +41 -10
  113. package/build-module/navigation-submenu/edit.js.map +1 -1
  114. package/build-module/page-list/edit.js +12 -18
  115. package/build-module/page-list/edit.js.map +1 -1
  116. package/build-module/social-links/deprecated.js +1 -62
  117. package/build-module/social-links/deprecated.js.map +1 -1
  118. package/build-module/template-part/edit/index.js +37 -65
  119. package/build-module/template-part/edit/index.js.map +1 -1
  120. package/build-module/template-part/edit/placeholder.js +52 -0
  121. package/build-module/template-part/edit/placeholder.js.map +1 -0
  122. package/build-module/template-part/edit/selection-modal.js +89 -0
  123. package/build-module/template-part/edit/selection-modal.js.map +1 -0
  124. package/build-module/template-part/edit/title-modal.js +46 -0
  125. package/build-module/template-part/edit/title-modal.js.map +1 -0
  126. package/build-module/template-part/edit/utils/hooks.js +135 -0
  127. package/build-module/template-part/edit/utils/hooks.js.map +1 -0
  128. package/build-module/template-part/index.js +2 -1
  129. package/build-module/template-part/index.js.map +1 -1
  130. package/build-style/comment-author-avatar/editor-rtl.css +83 -0
  131. package/build-style/comment-author-avatar/editor.css +83 -0
  132. package/build-style/cover/style-rtl.css +4 -0
  133. package/build-style/cover/style.css +4 -0
  134. package/build-style/editor-rtl.css +27 -81
  135. package/build-style/editor.css +27 -81
  136. package/build-style/image/editor-rtl.css +0 -16
  137. package/build-style/image/editor.css +0 -16
  138. package/build-style/image/style-rtl.css +2 -0
  139. package/build-style/image/style.css +2 -0
  140. package/build-style/navigation/style-rtl.css +14 -3
  141. package/build-style/navigation/style.css +14 -3
  142. package/build-style/page-list/editor-rtl.css +0 -9
  143. package/build-style/page-list/editor.css +0 -9
  144. package/build-style/style-rtl.css +20 -3
  145. package/build-style/style.css +20 -3
  146. package/build-style/template-part/editor-rtl.css +19 -56
  147. package/build-style/template-part/editor.css +19 -56
  148. package/package.json +15 -15
  149. package/src/archives/index.php +1 -1
  150. package/src/button/edit.native.js +3 -3
  151. package/src/columns/block.json +12 -0
  152. package/src/comment-author-avatar/edit.js +13 -8
  153. package/src/comment-author-avatar/editor.scss +7 -0
  154. package/src/comment-template/block.json +7 -1
  155. package/src/comment-template/edit.js +102 -40
  156. package/src/comment-template/hooks.js +151 -0
  157. package/src/comment-template/index.php +8 -0
  158. package/src/comment-template/util.js +1 -0
  159. package/src/comments-pagination-next/block.json +8 -1
  160. package/src/comments-pagination-next/index.php +6 -8
  161. package/src/comments-pagination-numbers/block.json +7 -1
  162. package/src/comments-pagination-numbers/index.php +3 -10
  163. package/src/comments-query-loop/block.json +5 -0
  164. package/src/comments-query-loop/edit/comments-inspector-controls.js +22 -4
  165. package/src/comments-query-loop/edit.js +1 -16
  166. package/src/cover/edit.js +15 -28
  167. package/src/cover/edit.native.js +15 -7
  168. package/src/cover/overlay-color-settings.native.js +3 -4
  169. package/src/cover/style.scss +4 -0
  170. package/src/cover/transforms.js +2 -0
  171. package/src/editor.scss +1 -0
  172. package/src/gallery/index.php +1 -8
  173. package/src/group/block.json +1 -0
  174. package/src/heading/edit.js +18 -5
  175. package/src/home-link/index.php +1 -19
  176. package/src/image/deprecated.js +105 -1
  177. package/src/image/editor.scss +0 -18
  178. package/src/image/save.js +0 -8
  179. package/src/image/style.scss +3 -0
  180. package/src/image/test/edit.native.js +0 -10
  181. package/src/latest-posts/edit.js +1 -0
  182. package/src/latest-posts/index.php +1 -1
  183. package/src/navigation/edit/index.js +25 -26
  184. package/src/navigation/edit/navigation-menu-selector.js +73 -28
  185. package/src/navigation/edit/placeholder/index.js +8 -32
  186. package/src/navigation/index.php +4 -4
  187. package/src/navigation/style.scss +22 -3
  188. package/src/navigation/use-navigation-menu.js +6 -6
  189. package/src/navigation-link/index.php +3 -22
  190. package/src/navigation-submenu/edit.js +50 -12
  191. package/src/navigation-submenu/index.php +3 -21
  192. package/src/page-list/edit.js +21 -25
  193. package/src/page-list/editor.scss +0 -10
  194. package/src/page-list/index.php +4 -4
  195. package/src/post-navigation-link/index.php +3 -3
  196. package/src/search/index.php +6 -3
  197. package/src/site-logo/index.php +1 -1
  198. package/src/social-links/deprecated.js +0 -59
  199. package/src/template-part/edit/index.js +61 -71
  200. package/src/template-part/edit/placeholder.js +78 -0
  201. package/src/template-part/edit/selection-modal.js +115 -0
  202. package/src/template-part/edit/title-modal.js +59 -0
  203. package/src/template-part/edit/utils/hooks.js +158 -0
  204. package/src/template-part/editor.scss +16 -74
  205. package/src/template-part/index.js +4 -1
  206. package/build/navigation/edit/existing-menus-options.js +0 -62
  207. package/build/navigation/edit/existing-menus-options.js.map +0 -1
  208. package/build/template-part/edit/placeholder/index.js +0 -141
  209. package/build/template-part/edit/placeholder/index.js.map +0 -1
  210. package/build/template-part/edit/placeholder/patterns-setup.js +0 -100
  211. package/build/template-part/edit/placeholder/patterns-setup.js.map +0 -1
  212. package/build/template-part/edit/selection/index.js +0 -45
  213. package/build/template-part/edit/selection/index.js.map +0 -1
  214. package/build/template-part/edit/selection/template-part-previews.js +0 -317
  215. package/build/template-part/edit/selection/template-part-previews.js.map +0 -1
  216. package/build-module/navigation/edit/existing-menus-options.js +0 -53
  217. package/build-module/navigation/edit/existing-menus-options.js.map +0 -1
  218. package/build-module/template-part/edit/placeholder/index.js +0 -124
  219. package/build-module/template-part/edit/placeholder/index.js.map +0 -1
  220. package/build-module/template-part/edit/placeholder/patterns-setup.js +0 -91
  221. package/build-module/template-part/edit/placeholder/patterns-setup.js.map +0 -1
  222. package/build-module/template-part/edit/selection/index.js +0 -35
  223. package/build-module/template-part/edit/selection/index.js.map +0 -1
  224. package/build-module/template-part/edit/selection/template-part-previews.js +0 -298
  225. package/build-module/template-part/edit/selection/template-part-previews.js.map +0 -1
  226. package/src/navigation/edit/existing-menus-options.js +0 -70
  227. package/src/template-part/edit/placeholder/index.js +0 -172
  228. package/src/template-part/edit/placeholder/patterns-setup.js +0 -124
  229. package/src/template-part/edit/selection/index.js +0 -37
  230. package/src/template-part/edit/selection/template-part-previews.js +0 -372
@@ -10,18 +10,20 @@ import { isEmpty } from 'lodash';
10
10
 
11
11
  import { useSelect } from '@wordpress/data';
12
12
  import { BlockControls, useBlockProps, __experimentalUseNoRecursiveRenders as useNoRecursiveRenders, Warning, store as blockEditorStore } from '@wordpress/block-editor';
13
- import { Dropdown, ToolbarGroup, ToolbarButton, Spinner } from '@wordpress/components';
13
+ import { ToolbarGroup, ToolbarButton, Spinner, Modal } from '@wordpress/components';
14
14
  import { __, sprintf } from '@wordpress/i18n';
15
15
  import { store as coreStore } from '@wordpress/core-data';
16
+ import { useState } from '@wordpress/element';
16
17
  /**
17
18
  * Internal dependencies
18
19
  */
19
20
 
20
21
  import TemplatePartPlaceholder from './placeholder';
21
- import TemplatePartSelection from './selection';
22
+ import TemplatePartSelectionModal from './selection-modal';
22
23
  import { TemplatePartAdvancedControls } from './advanced-controls';
23
24
  import TemplatePartInnerBlocks from './inner-blocks';
24
25
  import { createTemplatePartId } from './utils/create-template-part-id';
26
+ import { useAlternativeBlockPatterns, useAlternativeTemplateParts, useTemplatePartArea } from './utils/hooks';
25
27
  export default function TemplatePartEdit(_ref) {
26
28
  let {
27
29
  attributes,
@@ -35,7 +37,8 @@ export default function TemplatePartEdit(_ref) {
35
37
  layout = {}
36
38
  } = attributes;
37
39
  const templatePartId = createTemplatePartId(theme, slug);
38
- const [hasAlreadyRendered, RecursionProvider] = useNoRecursiveRenders(templatePartId); // Set the postId block attribute if it did not exist,
40
+ const [hasAlreadyRendered, RecursionProvider] = useNoRecursiveRenders(templatePartId);
41
+ const [isTemplatePartSelectionOpen, setIsTemplatePartSelectionOpen] = useState(false); // Set the postId block attribute if it did not exist,
39
42
  // but wait until the inner blocks have loaded to allow
40
43
  // new edits to trigger this.
41
44
 
@@ -43,16 +46,10 @@ export default function TemplatePartEdit(_ref) {
43
46
  isResolved,
44
47
  innerBlocks,
45
48
  isMissing,
46
- defaultWrapper,
47
- area,
48
- enableSelection,
49
- hasResolvedReplacements
49
+ area
50
50
  } = useSelect(select => {
51
- var _select$__experimenta;
52
-
53
51
  const {
54
52
  getEditedEntityRecord,
55
- getEntityRecords,
56
53
  hasFinishedResolution
57
54
  } = select(coreStore);
58
55
  const {
@@ -61,40 +58,26 @@ export default function TemplatePartEdit(_ref) {
61
58
  const getEntityArgs = ['postType', 'wp_template_part', templatePartId];
62
59
  const entityRecord = templatePartId ? getEditedEntityRecord(...getEntityArgs) : null;
63
60
 
64
- const _area = (entityRecord === null || entityRecord === void 0 ? void 0 : entityRecord.area) || attributes.area; // Check whether other entities exist for switching/selection.
65
-
66
-
67
- const availableReplacementArgs = ['postType', 'wp_template_part', _area && 'uncategorized' !== _area && {
68
- area: _area
69
- }];
70
- const matchingReplacements = getEntityRecords(...availableReplacementArgs);
71
-
72
- const _enableSelection = templatePartId ? (matchingReplacements === null || matchingReplacements === void 0 ? void 0 : matchingReplacements.length) > 1 : (matchingReplacements === null || matchingReplacements === void 0 ? void 0 : matchingReplacements.length) > 0;
73
-
74
- const hasResolvedEntity = templatePartId ? hasFinishedResolution('getEditedEntityRecord', getEntityArgs) : false; // FIXME: @wordpress/block-library should not depend on @wordpress/editor.
75
- // Blocks can be loaded into a *non-post* block editor.
76
- // eslint-disable-next-line @wordpress/data-no-store-string-literals
61
+ const _area = (entityRecord === null || entityRecord === void 0 ? void 0 : entityRecord.area) || attributes.area;
77
62
 
78
- const defaultWrapperElement = (_select$__experimenta = select('core/editor').__experimentalGetDefaultTemplatePartAreas().find(_ref2 => {
79
- let {
80
- area: value
81
- } = _ref2;
82
- return value === _area;
83
- })) === null || _select$__experimenta === void 0 ? void 0 : _select$__experimenta.area_tag;
63
+ const hasResolvedEntity = templatePartId ? hasFinishedResolution('getEditedEntityRecord', getEntityArgs) : false;
84
64
  return {
85
65
  innerBlocks: getBlocks(clientId),
86
66
  isResolved: hasResolvedEntity,
87
67
  isMissing: hasResolvedEntity && isEmpty(entityRecord),
88
- defaultWrapper: defaultWrapperElement || 'div',
89
- area: _area,
90
- enableSelection: _enableSelection,
91
- hasResolvedReplacements: hasFinishedResolution('getEntityRecords', availableReplacementArgs)
68
+ area: _area
92
69
  };
93
70
  }, [templatePartId, clientId]);
71
+ const {
72
+ templateParts
73
+ } = useAlternativeTemplateParts(area, templatePartId);
74
+ const blockPatterns = useAlternativeBlockPatterns(area, clientId);
75
+ const hasReplacements = !!templateParts.length || !!blockPatterns.length;
76
+ const areaObject = useTemplatePartArea(area);
94
77
  const blockProps = useBlockProps();
95
78
  const isPlaceholder = !slug;
96
79
  const isEntityAvailable = !isPlaceholder && !isMissing && isResolved;
97
- const TagName = tagName || defaultWrapper; // We don't want to render a missing state if we have any inner blocks.
80
+ const TagName = tagName || areaObject.tagName; // We don't want to render a missing state if we have any inner blocks.
98
81
  // A new template part is automatically created if we have any inner blocks but no entity.
99
82
 
100
83
  if (innerBlocks.length === 0 && (slug && !theme || slug && isMissing)) {
@@ -112,47 +95,36 @@ export default function TemplatePartEdit(_ref) {
112
95
  setAttributes: setAttributes,
113
96
  isEntityAvailable: isEntityAvailable,
114
97
  templatePartId: templatePartId,
115
- defaultWrapper: defaultWrapper
98
+ defaultWrapper: areaObject.tagName
116
99
  }), isPlaceholder && createElement(TagName, blockProps, createElement(TemplatePartPlaceholder, {
117
100
  area: attributes.area,
101
+ templatePartId: templatePartId,
118
102
  clientId: clientId,
119
103
  setAttributes: setAttributes,
120
- enableSelection: enableSelection,
121
- hasResolvedReplacements: hasResolvedReplacements
122
- })), isEntityAvailable && enableSelection && createElement(BlockControls, null, createElement(ToolbarGroup, {
104
+ onOpenSelectionModal: () => setIsTemplatePartSelectionOpen(true)
105
+ })), isEntityAvailable && hasReplacements && createElement(BlockControls, null, createElement(ToolbarGroup, {
123
106
  className: "wp-block-template-part__block-control-group"
124
- }, createElement(Dropdown, {
125
- className: "wp-block-template-part__preview-dropdown-button",
126
- contentClassName: "wp-block-template-part__preview-dropdown-content",
127
- position: "bottom right left",
128
- renderToggle: _ref3 => {
129
- let {
130
- isOpen,
131
- onToggle
132
- } = _ref3;
133
- return createElement(ToolbarButton, {
134
- "aria-expanded": isOpen,
135
- onClick: onToggle
136
- }, __('Replace'));
137
- },
138
- renderContent: _ref4 => {
139
- let {
140
- onClose
141
- } = _ref4;
142
- return createElement(TemplatePartSelection, {
143
- setAttributes: setAttributes,
144
- onClose: onClose,
145
- area: area,
146
- templatePartId: templatePartId
147
- });
148
- }
149
- }))), isEntityAvailable && createElement(TemplatePartInnerBlocks, {
107
+ }, createElement(ToolbarButton, {
108
+ onClick: () => setIsTemplatePartSelectionOpen(true)
109
+ }, __('Replace')))), isEntityAvailable && createElement(TemplatePartInnerBlocks, {
150
110
  clientId: clientId,
151
111
  tagName: TagName,
152
112
  blockProps: blockProps,
153
113
  postId: templatePartId,
154
114
  hasInnerBlocks: innerBlocks.length > 0,
155
115
  layout: layout
156
- }), !isPlaceholder && !isResolved && createElement(TagName, blockProps, createElement(Spinner, null)));
116
+ }), !isPlaceholder && !isResolved && createElement(TagName, blockProps, createElement(Spinner, null)), isTemplatePartSelectionOpen && createElement(Modal, {
117
+ className: "block-editor-template-part__selection-modal",
118
+ title: sprintf( // Translators: %s as template part area title ("Header", "Footer", etc.).
119
+ __('Choose a %s'), areaObject.label.toLowerCase()),
120
+ closeLabel: __('Cancel'),
121
+ onRequestClose: () => setIsTemplatePartSelectionOpen(false)
122
+ }, createElement(TemplatePartSelectionModal, {
123
+ templatePartId: templatePartId,
124
+ clientId: clientId,
125
+ area: area,
126
+ setAttributes: setAttributes,
127
+ onClose: () => setIsTemplatePartSelectionOpen(false)
128
+ })));
157
129
  }
158
130
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-library/src/template-part/edit/index.js"],"names":["isEmpty","useSelect","BlockControls","useBlockProps","__experimentalUseNoRecursiveRenders","useNoRecursiveRenders","Warning","store","blockEditorStore","Dropdown","ToolbarGroup","ToolbarButton","Spinner","__","sprintf","coreStore","TemplatePartPlaceholder","TemplatePartSelection","TemplatePartAdvancedControls","TemplatePartInnerBlocks","createTemplatePartId","TemplatePartEdit","attributes","setAttributes","clientId","slug","theme","tagName","layout","templatePartId","hasAlreadyRendered","RecursionProvider","isResolved","innerBlocks","isMissing","defaultWrapper","area","enableSelection","hasResolvedReplacements","select","getEditedEntityRecord","getEntityRecords","hasFinishedResolution","getBlocks","getEntityArgs","entityRecord","_area","availableReplacementArgs","matchingReplacements","_enableSelection","length","hasResolvedEntity","defaultWrapperElement","__experimentalGetDefaultTemplatePartAreas","find","value","area_tag","blockProps","isPlaceholder","isEntityAvailable","TagName","isOpen","onToggle","onClose"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport { isEmpty } from 'lodash';\n\n/**\n * WordPress dependencies\n */\nimport { useSelect } from '@wordpress/data';\nimport {\n\tBlockControls,\n\tuseBlockProps,\n\t__experimentalUseNoRecursiveRenders as useNoRecursiveRenders,\n\tWarning,\n\tstore as blockEditorStore,\n} from '@wordpress/block-editor';\nimport {\n\tDropdown,\n\tToolbarGroup,\n\tToolbarButton,\n\tSpinner,\n} from '@wordpress/components';\nimport { __, sprintf } from '@wordpress/i18n';\nimport { store as coreStore } from '@wordpress/core-data';\n\n/**\n * Internal dependencies\n */\nimport TemplatePartPlaceholder from './placeholder';\nimport TemplatePartSelection from './selection';\nimport { TemplatePartAdvancedControls } from './advanced-controls';\nimport TemplatePartInnerBlocks from './inner-blocks';\nimport { createTemplatePartId } from './utils/create-template-part-id';\n\nexport default function TemplatePartEdit( {\n\tattributes,\n\tsetAttributes,\n\tclientId,\n} ) {\n\tconst { slug, theme, tagName, layout = {} } = attributes;\n\tconst templatePartId = createTemplatePartId( theme, slug );\n\n\tconst [ hasAlreadyRendered, RecursionProvider ] = useNoRecursiveRenders(\n\t\ttemplatePartId\n\t);\n\n\t// Set the postId block attribute if it did not exist,\n\t// but wait until the inner blocks have loaded to allow\n\t// new edits to trigger this.\n\tconst {\n\t\tisResolved,\n\t\tinnerBlocks,\n\t\tisMissing,\n\t\tdefaultWrapper,\n\t\tarea,\n\t\tenableSelection,\n\t\thasResolvedReplacements,\n\t} = useSelect(\n\t\t( select ) => {\n\t\t\tconst {\n\t\t\t\tgetEditedEntityRecord,\n\t\t\t\tgetEntityRecords,\n\t\t\t\thasFinishedResolution,\n\t\t\t} = select( coreStore );\n\t\t\tconst { getBlocks } = select( blockEditorStore );\n\n\t\t\tconst getEntityArgs = [\n\t\t\t\t'postType',\n\t\t\t\t'wp_template_part',\n\t\t\t\ttemplatePartId,\n\t\t\t];\n\t\t\tconst entityRecord = templatePartId\n\t\t\t\t? getEditedEntityRecord( ...getEntityArgs )\n\t\t\t\t: null;\n\t\t\tconst _area = entityRecord?.area || attributes.area;\n\n\t\t\t// Check whether other entities exist for switching/selection.\n\t\t\tconst availableReplacementArgs = [\n\t\t\t\t'postType',\n\t\t\t\t'wp_template_part',\n\t\t\t\t_area && 'uncategorized' !== _area && { area: _area },\n\t\t\t];\n\t\t\tconst matchingReplacements = getEntityRecords(\n\t\t\t\t...availableReplacementArgs\n\t\t\t);\n\t\t\tconst _enableSelection = templatePartId\n\t\t\t\t? matchingReplacements?.length > 1\n\t\t\t\t: matchingReplacements?.length > 0;\n\n\t\t\tconst hasResolvedEntity = templatePartId\n\t\t\t\t? hasFinishedResolution(\n\t\t\t\t\t\t'getEditedEntityRecord',\n\t\t\t\t\t\tgetEntityArgs\n\t\t\t\t )\n\t\t\t\t: false;\n\n\t\t\t// FIXME: @wordpress/block-library should not depend on @wordpress/editor.\n\t\t\t// Blocks can be loaded into a *non-post* block editor.\n\t\t\t// eslint-disable-next-line @wordpress/data-no-store-string-literals\n\t\t\tconst defaultWrapperElement = select( 'core/editor' )\n\t\t\t\t.__experimentalGetDefaultTemplatePartAreas()\n\t\t\t\t.find( ( { area: value } ) => value === _area )?.area_tag;\n\n\t\t\treturn {\n\t\t\t\tinnerBlocks: getBlocks( clientId ),\n\t\t\t\tisResolved: hasResolvedEntity,\n\t\t\t\tisMissing: hasResolvedEntity && isEmpty( entityRecord ),\n\t\t\t\tdefaultWrapper: defaultWrapperElement || 'div',\n\t\t\t\tarea: _area,\n\t\t\t\tenableSelection: _enableSelection,\n\t\t\t\thasResolvedReplacements: hasFinishedResolution(\n\t\t\t\t\t'getEntityRecords',\n\t\t\t\t\tavailableReplacementArgs\n\t\t\t\t),\n\t\t\t};\n\t\t},\n\t\t[ templatePartId, clientId ]\n\t);\n\n\tconst blockProps = useBlockProps();\n\tconst isPlaceholder = ! slug;\n\tconst isEntityAvailable = ! isPlaceholder && ! isMissing && isResolved;\n\tconst TagName = tagName || defaultWrapper;\n\n\t// We don't want to render a missing state if we have any inner blocks.\n\t// A new template part is automatically created if we have any inner blocks but no entity.\n\tif (\n\t\tinnerBlocks.length === 0 &&\n\t\t( ( slug && ! theme ) || ( slug && isMissing ) )\n\t) {\n\t\treturn (\n\t\t\t<TagName { ...blockProps }>\n\t\t\t\t<Warning>\n\t\t\t\t\t{ sprintf(\n\t\t\t\t\t\t/* translators: %s: Template part slug */\n\t\t\t\t\t\t__(\n\t\t\t\t\t\t\t'Template part has been deleted or is unavailable: %s'\n\t\t\t\t\t\t),\n\t\t\t\t\t\tslug\n\t\t\t\t\t) }\n\t\t\t\t</Warning>\n\t\t\t</TagName>\n\t\t);\n\t}\n\n\tif ( isEntityAvailable && hasAlreadyRendered ) {\n\t\treturn (\n\t\t\t<TagName { ...blockProps }>\n\t\t\t\t<Warning>\n\t\t\t\t\t{ __( 'Block cannot be rendered inside itself.' ) }\n\t\t\t\t</Warning>\n\t\t\t</TagName>\n\t\t);\n\t}\n\n\treturn (\n\t\t<RecursionProvider>\n\t\t\t<TemplatePartAdvancedControls\n\t\t\t\ttagName={ tagName }\n\t\t\t\tsetAttributes={ setAttributes }\n\t\t\t\tisEntityAvailable={ isEntityAvailable }\n\t\t\t\ttemplatePartId={ templatePartId }\n\t\t\t\tdefaultWrapper={ defaultWrapper }\n\t\t\t/>\n\t\t\t{ isPlaceholder && (\n\t\t\t\t<TagName { ...blockProps }>\n\t\t\t\t\t<TemplatePartPlaceholder\n\t\t\t\t\t\tarea={ attributes.area }\n\t\t\t\t\t\tclientId={ clientId }\n\t\t\t\t\t\tsetAttributes={ setAttributes }\n\t\t\t\t\t\tenableSelection={ enableSelection }\n\t\t\t\t\t\thasResolvedReplacements={ hasResolvedReplacements }\n\t\t\t\t\t/>\n\t\t\t\t</TagName>\n\t\t\t) }\n\t\t\t{ isEntityAvailable && enableSelection && (\n\t\t\t\t<BlockControls>\n\t\t\t\t\t<ToolbarGroup className=\"wp-block-template-part__block-control-group\">\n\t\t\t\t\t\t<Dropdown\n\t\t\t\t\t\t\tclassName=\"wp-block-template-part__preview-dropdown-button\"\n\t\t\t\t\t\t\tcontentClassName=\"wp-block-template-part__preview-dropdown-content\"\n\t\t\t\t\t\t\tposition=\"bottom right left\"\n\t\t\t\t\t\t\trenderToggle={ ( { isOpen, onToggle } ) => (\n\t\t\t\t\t\t\t\t<ToolbarButton\n\t\t\t\t\t\t\t\t\taria-expanded={ isOpen }\n\t\t\t\t\t\t\t\t\tonClick={ onToggle }\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{ __( 'Replace' ) }\n\t\t\t\t\t\t\t\t</ToolbarButton>\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\trenderContent={ ( { onClose } ) => (\n\t\t\t\t\t\t\t\t<TemplatePartSelection\n\t\t\t\t\t\t\t\t\tsetAttributes={ setAttributes }\n\t\t\t\t\t\t\t\t\tonClose={ onClose }\n\t\t\t\t\t\t\t\t\tarea={ area }\n\t\t\t\t\t\t\t\t\ttemplatePartId={ templatePartId }\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t/>\n\t\t\t\t\t</ToolbarGroup>\n\t\t\t\t</BlockControls>\n\t\t\t) }\n\t\t\t{ isEntityAvailable && (\n\t\t\t\t<TemplatePartInnerBlocks\n\t\t\t\t\tclientId={ clientId }\n\t\t\t\t\ttagName={ TagName }\n\t\t\t\t\tblockProps={ blockProps }\n\t\t\t\t\tpostId={ templatePartId }\n\t\t\t\t\thasInnerBlocks={ innerBlocks.length > 0 }\n\t\t\t\t\tlayout={ layout }\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ ! isPlaceholder && ! isResolved && (\n\t\t\t\t<TagName { ...blockProps }>\n\t\t\t\t\t<Spinner />\n\t\t\t\t</TagName>\n\t\t\t) }\n\t\t</RecursionProvider>\n\t);\n}\n"]}
1
+ {"version":3,"sources":["@wordpress/block-library/src/template-part/edit/index.js"],"names":["isEmpty","useSelect","BlockControls","useBlockProps","__experimentalUseNoRecursiveRenders","useNoRecursiveRenders","Warning","store","blockEditorStore","ToolbarGroup","ToolbarButton","Spinner","Modal","__","sprintf","coreStore","useState","TemplatePartPlaceholder","TemplatePartSelectionModal","TemplatePartAdvancedControls","TemplatePartInnerBlocks","createTemplatePartId","useAlternativeBlockPatterns","useAlternativeTemplateParts","useTemplatePartArea","TemplatePartEdit","attributes","setAttributes","clientId","slug","theme","tagName","layout","templatePartId","hasAlreadyRendered","RecursionProvider","isTemplatePartSelectionOpen","setIsTemplatePartSelectionOpen","isResolved","innerBlocks","isMissing","area","select","getEditedEntityRecord","hasFinishedResolution","getBlocks","getEntityArgs","entityRecord","_area","hasResolvedEntity","templateParts","blockPatterns","hasReplacements","length","areaObject","blockProps","isPlaceholder","isEntityAvailable","TagName","label","toLowerCase"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport { isEmpty } from 'lodash';\n\n/**\n * WordPress dependencies\n */\nimport { useSelect } from '@wordpress/data';\nimport {\n\tBlockControls,\n\tuseBlockProps,\n\t__experimentalUseNoRecursiveRenders as useNoRecursiveRenders,\n\tWarning,\n\tstore as blockEditorStore,\n} from '@wordpress/block-editor';\nimport {\n\tToolbarGroup,\n\tToolbarButton,\n\tSpinner,\n\tModal,\n} from '@wordpress/components';\nimport { __, sprintf } from '@wordpress/i18n';\nimport { store as coreStore } from '@wordpress/core-data';\nimport { useState } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport TemplatePartPlaceholder from './placeholder';\nimport TemplatePartSelectionModal from './selection-modal';\nimport { TemplatePartAdvancedControls } from './advanced-controls';\nimport TemplatePartInnerBlocks from './inner-blocks';\nimport { createTemplatePartId } from './utils/create-template-part-id';\nimport {\n\tuseAlternativeBlockPatterns,\n\tuseAlternativeTemplateParts,\n\tuseTemplatePartArea,\n} from './utils/hooks';\n\nexport default function TemplatePartEdit( {\n\tattributes,\n\tsetAttributes,\n\tclientId,\n} ) {\n\tconst { slug, theme, tagName, layout = {} } = attributes;\n\tconst templatePartId = createTemplatePartId( theme, slug );\n\tconst [ hasAlreadyRendered, RecursionProvider ] = useNoRecursiveRenders(\n\t\ttemplatePartId\n\t);\n\tconst [\n\t\tisTemplatePartSelectionOpen,\n\t\tsetIsTemplatePartSelectionOpen,\n\t] = useState( false );\n\n\t// Set the postId block attribute if it did not exist,\n\t// but wait until the inner blocks have loaded to allow\n\t// new edits to trigger this.\n\tconst { isResolved, innerBlocks, isMissing, area } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getEditedEntityRecord, hasFinishedResolution } = select(\n\t\t\t\tcoreStore\n\t\t\t);\n\t\t\tconst { getBlocks } = select( blockEditorStore );\n\n\t\t\tconst getEntityArgs = [\n\t\t\t\t'postType',\n\t\t\t\t'wp_template_part',\n\t\t\t\ttemplatePartId,\n\t\t\t];\n\t\t\tconst entityRecord = templatePartId\n\t\t\t\t? getEditedEntityRecord( ...getEntityArgs )\n\t\t\t\t: null;\n\t\t\tconst _area = entityRecord?.area || attributes.area;\n\t\t\tconst hasResolvedEntity = templatePartId\n\t\t\t\t? hasFinishedResolution(\n\t\t\t\t\t\t'getEditedEntityRecord',\n\t\t\t\t\t\tgetEntityArgs\n\t\t\t\t )\n\t\t\t\t: false;\n\n\t\t\treturn {\n\t\t\t\tinnerBlocks: getBlocks( clientId ),\n\t\t\t\tisResolved: hasResolvedEntity,\n\t\t\t\tisMissing: hasResolvedEntity && isEmpty( entityRecord ),\n\t\t\t\tarea: _area,\n\t\t\t};\n\t\t},\n\t\t[ templatePartId, clientId ]\n\t);\n\tconst { templateParts } = useAlternativeTemplateParts(\n\t\tarea,\n\t\ttemplatePartId\n\t);\n\tconst blockPatterns = useAlternativeBlockPatterns( area, clientId );\n\tconst hasReplacements = !! templateParts.length || !! blockPatterns.length;\n\tconst areaObject = useTemplatePartArea( area );\n\tconst blockProps = useBlockProps();\n\tconst isPlaceholder = ! slug;\n\tconst isEntityAvailable = ! isPlaceholder && ! isMissing && isResolved;\n\tconst TagName = tagName || areaObject.tagName;\n\n\t// We don't want to render a missing state if we have any inner blocks.\n\t// A new template part is automatically created if we have any inner blocks but no entity.\n\tif (\n\t\tinnerBlocks.length === 0 &&\n\t\t( ( slug && ! theme ) || ( slug && isMissing ) )\n\t) {\n\t\treturn (\n\t\t\t<TagName { ...blockProps }>\n\t\t\t\t<Warning>\n\t\t\t\t\t{ sprintf(\n\t\t\t\t\t\t/* translators: %s: Template part slug */\n\t\t\t\t\t\t__(\n\t\t\t\t\t\t\t'Template part has been deleted or is unavailable: %s'\n\t\t\t\t\t\t),\n\t\t\t\t\t\tslug\n\t\t\t\t\t) }\n\t\t\t\t</Warning>\n\t\t\t</TagName>\n\t\t);\n\t}\n\n\tif ( isEntityAvailable && hasAlreadyRendered ) {\n\t\treturn (\n\t\t\t<TagName { ...blockProps }>\n\t\t\t\t<Warning>\n\t\t\t\t\t{ __( 'Block cannot be rendered inside itself.' ) }\n\t\t\t\t</Warning>\n\t\t\t</TagName>\n\t\t);\n\t}\n\n\treturn (\n\t\t<RecursionProvider>\n\t\t\t<TemplatePartAdvancedControls\n\t\t\t\ttagName={ tagName }\n\t\t\t\tsetAttributes={ setAttributes }\n\t\t\t\tisEntityAvailable={ isEntityAvailable }\n\t\t\t\ttemplatePartId={ templatePartId }\n\t\t\t\tdefaultWrapper={ areaObject.tagName }\n\t\t\t/>\n\t\t\t{ isPlaceholder && (\n\t\t\t\t<TagName { ...blockProps }>\n\t\t\t\t\t<TemplatePartPlaceholder\n\t\t\t\t\t\tarea={ attributes.area }\n\t\t\t\t\t\ttemplatePartId={ templatePartId }\n\t\t\t\t\t\tclientId={ clientId }\n\t\t\t\t\t\tsetAttributes={ setAttributes }\n\t\t\t\t\t\tonOpenSelectionModal={ () =>\n\t\t\t\t\t\t\tsetIsTemplatePartSelectionOpen( true )\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t</TagName>\n\t\t\t) }\n\t\t\t{ isEntityAvailable && hasReplacements && (\n\t\t\t\t<BlockControls>\n\t\t\t\t\t<ToolbarGroup className=\"wp-block-template-part__block-control-group\">\n\t\t\t\t\t\t<ToolbarButton\n\t\t\t\t\t\t\tonClick={ () =>\n\t\t\t\t\t\t\t\tsetIsTemplatePartSelectionOpen( true )\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ __( 'Replace' ) }\n\t\t\t\t\t\t</ToolbarButton>\n\t\t\t\t\t</ToolbarGroup>\n\t\t\t\t</BlockControls>\n\t\t\t) }\n\t\t\t{ isEntityAvailable && (\n\t\t\t\t<TemplatePartInnerBlocks\n\t\t\t\t\tclientId={ clientId }\n\t\t\t\t\ttagName={ TagName }\n\t\t\t\t\tblockProps={ blockProps }\n\t\t\t\t\tpostId={ templatePartId }\n\t\t\t\t\thasInnerBlocks={ innerBlocks.length > 0 }\n\t\t\t\t\tlayout={ layout }\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ ! isPlaceholder && ! isResolved && (\n\t\t\t\t<TagName { ...blockProps }>\n\t\t\t\t\t<Spinner />\n\t\t\t\t</TagName>\n\t\t\t) }\n\t\t\t{ isTemplatePartSelectionOpen && (\n\t\t\t\t<Modal\n\t\t\t\t\tclassName=\"block-editor-template-part__selection-modal\"\n\t\t\t\t\ttitle={ sprintf(\n\t\t\t\t\t\t// Translators: %s as template part area title (\"Header\", \"Footer\", etc.).\n\t\t\t\t\t\t__( 'Choose a %s' ),\n\t\t\t\t\t\tareaObject.label.toLowerCase()\n\t\t\t\t\t) }\n\t\t\t\t\tcloseLabel={ __( 'Cancel' ) }\n\t\t\t\t\tonRequestClose={ () =>\n\t\t\t\t\t\tsetIsTemplatePartSelectionOpen( false )\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t<TemplatePartSelectionModal\n\t\t\t\t\t\ttemplatePartId={ templatePartId }\n\t\t\t\t\t\tclientId={ clientId }\n\t\t\t\t\t\tarea={ area }\n\t\t\t\t\t\tsetAttributes={ setAttributes }\n\t\t\t\t\t\tonClose={ () =>\n\t\t\t\t\t\t\tsetIsTemplatePartSelectionOpen( false )\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t</Modal>\n\t\t\t) }\n\t\t</RecursionProvider>\n\t);\n}\n"]}
@@ -0,0 +1,52 @@
1
+ import { createElement } from "@wordpress/element";
2
+
3
+ /**
4
+ * WordPress dependencies
5
+ */
6
+ import { __, sprintf } from '@wordpress/i18n';
7
+ import { Placeholder, Button, Spinner } from '@wordpress/components';
8
+ import { useState } from '@wordpress/element';
9
+ /**
10
+ * Internal dependencies
11
+ */
12
+
13
+ import { useAlternativeBlockPatterns, useAlternativeTemplateParts, useCreateTemplatePartFromBlocks, useTemplatePartArea } from './utils/hooks';
14
+ import TitleModal from './title-modal';
15
+ export default function TemplatePartPlaceholder(_ref) {
16
+ let {
17
+ area,
18
+ clientId,
19
+ templatePartId,
20
+ onOpenSelectionModal,
21
+ setAttributes
22
+ } = _ref;
23
+ const {
24
+ templateParts,
25
+ isResolving
26
+ } = useAlternativeTemplateParts(area, templatePartId);
27
+ const blockPatterns = useAlternativeBlockPatterns(area, clientId);
28
+ const [showTitleModal, setShowTitleModal] = useState(false);
29
+ const areaObject = useTemplatePartArea(area);
30
+ const createFromBlocks = useCreateTemplatePartFromBlocks(area, setAttributes);
31
+ return createElement(Placeholder, {
32
+ icon: areaObject.icon,
33
+ label: areaObject.label,
34
+ instructions: sprintf( // Translators: %s as template part area title ("Header", "Footer", etc.).
35
+ __('Choose an existing %s or create a new one.'), areaObject.label.toLowerCase())
36
+ }, isResolving && createElement(Spinner, null), !isResolving && !!(templateParts.length || blockPatterns.length) && createElement(Button, {
37
+ variant: "primary",
38
+ onClick: onOpenSelectionModal
39
+ }, __('Choose')), !isResolving && createElement(Button, {
40
+ variant: "secondary",
41
+ onClick: () => {
42
+ setShowTitleModal(true);
43
+ }
44
+ }, __('Start blank')), showTitleModal && createElement(TitleModal, {
45
+ areaLabel: areaObject.label,
46
+ onClose: () => setShowTitleModal(false),
47
+ onSubmit: title => {
48
+ createFromBlocks([], title);
49
+ }
50
+ }));
51
+ }
52
+ //# sourceMappingURL=placeholder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["@wordpress/block-library/src/template-part/edit/placeholder.js"],"names":["__","sprintf","Placeholder","Button","Spinner","useState","useAlternativeBlockPatterns","useAlternativeTemplateParts","useCreateTemplatePartFromBlocks","useTemplatePartArea","TitleModal","TemplatePartPlaceholder","area","clientId","templatePartId","onOpenSelectionModal","setAttributes","templateParts","isResolving","blockPatterns","showTitleModal","setShowTitleModal","areaObject","createFromBlocks","icon","label","toLowerCase","length","title"],"mappings":";;AAAA;AACA;AACA;AACA,SAASA,EAAT,EAAaC,OAAb,QAA4B,iBAA5B;AACA,SAASC,WAAT,EAAsBC,MAAtB,EAA8BC,OAA9B,QAA6C,uBAA7C;AACA,SAASC,QAAT,QAAyB,oBAAzB;AAEA;AACA;AACA;;AACA,SACCC,2BADD,EAECC,2BAFD,EAGCC,+BAHD,EAICC,mBAJD,QAKO,eALP;AAMA,OAAOC,UAAP,MAAuB,eAAvB;AAEA,eAAe,SAASC,uBAAT,OAMX;AAAA,MAN6C;AAChDC,IAAAA,IADgD;AAEhDC,IAAAA,QAFgD;AAGhDC,IAAAA,cAHgD;AAIhDC,IAAAA,oBAJgD;AAKhDC,IAAAA;AALgD,GAM7C;AACH,QAAM;AAAEC,IAAAA,aAAF;AAAiBC,IAAAA;AAAjB,MAAiCX,2BAA2B,CACjEK,IADiE,EAEjEE,cAFiE,CAAlE;AAIA,QAAMK,aAAa,GAAGb,2BAA2B,CAAEM,IAAF,EAAQC,QAAR,CAAjD;AACA,QAAM,CAAEO,cAAF,EAAkBC,iBAAlB,IAAwChB,QAAQ,CAAE,KAAF,CAAtD;AACA,QAAMiB,UAAU,GAAGb,mBAAmB,CAAEG,IAAF,CAAtC;AACA,QAAMW,gBAAgB,GAAGf,+BAA+B,CACvDI,IADuD,EAEvDI,aAFuD,CAAxD;AAKA,SACC,cAAC,WAAD;AACC,IAAA,IAAI,EAAGM,UAAU,CAACE,IADnB;AAEC,IAAA,KAAK,EAAGF,UAAU,CAACG,KAFpB;AAGC,IAAA,YAAY,EAAGxB,OAAO,EACrB;AACAD,IAAAA,EAAE,CAAE,4CAAF,CAFmB,EAGrBsB,UAAU,CAACG,KAAX,CAAiBC,WAAjB,EAHqB;AAHvB,KASGR,WAAW,IAAI,cAAC,OAAD,OATlB,EAWG,CAAEA,WAAF,IACD,CAAC,EAAID,aAAa,CAACU,MAAd,IAAwBR,aAAa,CAACQ,MAA1C,CADA,IAEA,cAAC,MAAD;AAAQ,IAAA,OAAO,EAAC,SAAhB;AAA0B,IAAA,OAAO,EAAGZ;AAApC,KACGf,EAAE,CAAE,QAAF,CADL,CAbH,EAkBG,CAAEkB,WAAF,IACD,cAAC,MAAD;AACC,IAAA,OAAO,EAAC,WADT;AAEC,IAAA,OAAO,EAAG,MAAM;AACfG,MAAAA,iBAAiB,CAAE,IAAF,CAAjB;AACA;AAJF,KAMGrB,EAAE,CAAE,aAAF,CANL,CAnBF,EA4BGoB,cAAc,IACf,cAAC,UAAD;AACC,IAAA,SAAS,EAAGE,UAAU,CAACG,KADxB;AAEC,IAAA,OAAO,EAAG,MAAMJ,iBAAiB,CAAE,KAAF,CAFlC;AAGC,IAAA,QAAQ,EAAKO,KAAF,IAAa;AACvBL,MAAAA,gBAAgB,CAAE,EAAF,EAAMK,KAAN,CAAhB;AACA;AALF,IA7BF,CADD;AAwCA","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { __, sprintf } from '@wordpress/i18n';\nimport { Placeholder, Button, Spinner } from '@wordpress/components';\nimport { useState } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport {\n\tuseAlternativeBlockPatterns,\n\tuseAlternativeTemplateParts,\n\tuseCreateTemplatePartFromBlocks,\n\tuseTemplatePartArea,\n} from './utils/hooks';\nimport TitleModal from './title-modal';\n\nexport default function TemplatePartPlaceholder( {\n\tarea,\n\tclientId,\n\ttemplatePartId,\n\tonOpenSelectionModal,\n\tsetAttributes,\n} ) {\n\tconst { templateParts, isResolving } = useAlternativeTemplateParts(\n\t\tarea,\n\t\ttemplatePartId\n\t);\n\tconst blockPatterns = useAlternativeBlockPatterns( area, clientId );\n\tconst [ showTitleModal, setShowTitleModal ] = useState( false );\n\tconst areaObject = useTemplatePartArea( area );\n\tconst createFromBlocks = useCreateTemplatePartFromBlocks(\n\t\tarea,\n\t\tsetAttributes\n\t);\n\n\treturn (\n\t\t<Placeholder\n\t\t\ticon={ areaObject.icon }\n\t\t\tlabel={ areaObject.label }\n\t\t\tinstructions={ sprintf(\n\t\t\t\t// Translators: %s as template part area title (\"Header\", \"Footer\", etc.).\n\t\t\t\t__( 'Choose an existing %s or create a new one.' ),\n\t\t\t\tareaObject.label.toLowerCase()\n\t\t\t) }\n\t\t>\n\t\t\t{ isResolving && <Spinner /> }\n\n\t\t\t{ ! isResolving &&\n\t\t\t\t!! ( templateParts.length || blockPatterns.length ) && (\n\t\t\t\t\t<Button variant=\"primary\" onClick={ onOpenSelectionModal }>\n\t\t\t\t\t\t{ __( 'Choose' ) }\n\t\t\t\t\t</Button>\n\t\t\t\t) }\n\n\t\t\t{ ! isResolving && (\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\tsetShowTitleModal( true );\n\t\t\t\t\t} }\n\t\t\t\t>\n\t\t\t\t\t{ __( 'Start blank' ) }\n\t\t\t\t</Button>\n\t\t\t) }\n\t\t\t{ showTitleModal && (\n\t\t\t\t<TitleModal\n\t\t\t\t\tareaLabel={ areaObject.label }\n\t\t\t\t\tonClose={ () => setShowTitleModal( false ) }\n\t\t\t\t\tonSubmit={ ( title ) => {\n\t\t\t\t\t\tcreateFromBlocks( [], title );\n\t\t\t\t\t} }\n\t\t\t\t/>\n\t\t\t) }\n\t\t</Placeholder>\n\t);\n}\n"]}
@@ -0,0 +1,89 @@
1
+ import { createElement, Fragment } from "@wordpress/element";
2
+
3
+ /**
4
+ * WordPress dependencies
5
+ */
6
+ import { useCallback, useMemo } from '@wordpress/element';
7
+ import { __, sprintf } from '@wordpress/i18n';
8
+ import { store as noticesStore } from '@wordpress/notices';
9
+ import { useDispatch } from '@wordpress/data';
10
+ import { parse } from '@wordpress/blocks';
11
+ import { useAsyncList } from '@wordpress/compose';
12
+ import { __experimentalBlockPatternsList as BlockPatternsList, store as blockEditorStore } from '@wordpress/block-editor';
13
+ /**
14
+ * Internal dependencies
15
+ */
16
+
17
+ import { useAlternativeBlockPatterns, useAlternativeTemplateParts, useCreateTemplatePartFromBlocks } from './utils/hooks';
18
+ import { createTemplatePartId } from './utils/create-template-part-id';
19
+ export default function TemplatePartSelectionModal(_ref) {
20
+ let {
21
+ setAttributes,
22
+ onClose,
23
+ templatePartId = null,
24
+ area,
25
+ clientId
26
+ } = _ref;
27
+ // When the templatePartId is undefined,
28
+ // it means the user is creating a new one from the placeholder.
29
+ const isReplacingTemplatePartContent = !!templatePartId;
30
+ const {
31
+ templateParts
32
+ } = useAlternativeTemplateParts(area, templatePartId); // We can map template parts to block patters to reuse the BlockPatternsList UI
33
+
34
+ const templartPartsAsBlockPatterns = useMemo(() => {
35
+ return templateParts.map(templatePart => ({
36
+ name: createTemplatePartId(templatePart.theme, templatePart.slug),
37
+ title: templatePart.title.rendered,
38
+ blocks: parse(templatePart.content.raw),
39
+ templatePart
40
+ }));
41
+ }, [templateParts]);
42
+ const shownTemplateParts = useAsyncList(templartPartsAsBlockPatterns);
43
+ const {
44
+ createSuccessNotice
45
+ } = useDispatch(noticesStore);
46
+ const blockPatterns = useAlternativeBlockPatterns(area, clientId);
47
+ const shownBlockPatterns = useAsyncList(blockPatterns);
48
+ const {
49
+ replaceInnerBlocks
50
+ } = useDispatch(blockEditorStore);
51
+ const onTemplatePartSelect = useCallback(templatePart => {
52
+ var _templatePart$title;
53
+
54
+ setAttributes({
55
+ slug: templatePart.slug,
56
+ theme: templatePart.theme,
57
+ area: undefined
58
+ });
59
+ createSuccessNotice(sprintf(
60
+ /* translators: %s: template part title. */
61
+ __('Template Part "%s" inserted.'), ((_templatePart$title = templatePart.title) === null || _templatePart$title === void 0 ? void 0 : _templatePart$title.rendered) || templatePart.slug), {
62
+ type: 'snackbar'
63
+ });
64
+ onClose();
65
+ }, []);
66
+ const createFromBlocks = useCreateTemplatePartFromBlocks(area, setAttributes);
67
+ return createElement(Fragment, null, createElement("div", {
68
+ className: "block-library-template-part__selection-content"
69
+ }, !!templartPartsAsBlockPatterns.length && createElement("div", null, createElement("h2", null, __('Existing template parts')), createElement(BlockPatternsList, {
70
+ blockPatterns: templartPartsAsBlockPatterns,
71
+ shownPatterns: shownTemplateParts,
72
+ onClickPattern: pattern => {
73
+ onTemplatePartSelect(pattern.templatePart);
74
+ }
75
+ })), !!blockPatterns.length && createElement("div", null, createElement("h2", null, __('Patterns')), createElement(BlockPatternsList, {
76
+ blockPatterns: blockPatterns,
77
+ shownPatterns: shownBlockPatterns,
78
+ onClickPattern: (pattern, blocks) => {
79
+ if (isReplacingTemplatePartContent) {
80
+ replaceInnerBlocks(clientId, blocks);
81
+ } else {
82
+ createFromBlocks(blocks, pattern.title);
83
+ }
84
+
85
+ onClose();
86
+ }
87
+ }))));
88
+ }
89
+ //# sourceMappingURL=selection-modal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["@wordpress/block-library/src/template-part/edit/selection-modal.js"],"names":["useCallback","useMemo","__","sprintf","store","noticesStore","useDispatch","parse","useAsyncList","__experimentalBlockPatternsList","BlockPatternsList","blockEditorStore","useAlternativeBlockPatterns","useAlternativeTemplateParts","useCreateTemplatePartFromBlocks","createTemplatePartId","TemplatePartSelectionModal","setAttributes","onClose","templatePartId","area","clientId","isReplacingTemplatePartContent","templateParts","templartPartsAsBlockPatterns","map","templatePart","name","theme","slug","title","rendered","blocks","content","raw","shownTemplateParts","createSuccessNotice","blockPatterns","shownBlockPatterns","replaceInnerBlocks","onTemplatePartSelect","undefined","type","createFromBlocks","length","pattern"],"mappings":"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","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useCallback, useMemo } from '@wordpress/element';\nimport { __, sprintf } from '@wordpress/i18n';\nimport { store as noticesStore } from '@wordpress/notices';\nimport { useDispatch } from '@wordpress/data';\nimport { parse } from '@wordpress/blocks';\nimport { useAsyncList } from '@wordpress/compose';\nimport {\n\t__experimentalBlockPatternsList as BlockPatternsList,\n\tstore as blockEditorStore,\n} from '@wordpress/block-editor';\n\n/**\n * Internal dependencies\n */\nimport {\n\tuseAlternativeBlockPatterns,\n\tuseAlternativeTemplateParts,\n\tuseCreateTemplatePartFromBlocks,\n} from './utils/hooks';\nimport { createTemplatePartId } from './utils/create-template-part-id';\n\nexport default function TemplatePartSelectionModal( {\n\tsetAttributes,\n\tonClose,\n\ttemplatePartId = null,\n\tarea,\n\tclientId,\n} ) {\n\t// When the templatePartId is undefined,\n\t// it means the user is creating a new one from the placeholder.\n\tconst isReplacingTemplatePartContent = !! templatePartId;\n\tconst { templateParts } = useAlternativeTemplateParts(\n\t\tarea,\n\t\ttemplatePartId\n\t);\n\t// We can map template parts to block patters to reuse the BlockPatternsList UI\n\tconst templartPartsAsBlockPatterns = useMemo( () => {\n\t\treturn templateParts.map( ( templatePart ) => ( {\n\t\t\tname: createTemplatePartId( templatePart.theme, templatePart.slug ),\n\t\t\ttitle: templatePart.title.rendered,\n\t\t\tblocks: parse( templatePart.content.raw ),\n\t\t\ttemplatePart,\n\t\t} ) );\n\t}, [ templateParts ] );\n\tconst shownTemplateParts = useAsyncList( templartPartsAsBlockPatterns );\n\tconst { createSuccessNotice } = useDispatch( noticesStore );\n\tconst blockPatterns = useAlternativeBlockPatterns( area, clientId );\n\tconst shownBlockPatterns = useAsyncList( blockPatterns );\n\tconst { replaceInnerBlocks } = useDispatch( blockEditorStore );\n\n\tconst onTemplatePartSelect = useCallback( ( templatePart ) => {\n\t\tsetAttributes( {\n\t\t\tslug: templatePart.slug,\n\t\t\ttheme: templatePart.theme,\n\t\t\tarea: undefined,\n\t\t} );\n\t\tcreateSuccessNotice(\n\t\t\tsprintf(\n\t\t\t\t/* translators: %s: template part title. */\n\t\t\t\t__( 'Template Part \"%s\" inserted.' ),\n\t\t\t\ttemplatePart.title?.rendered || templatePart.slug\n\t\t\t),\n\t\t\t{\n\t\t\t\ttype: 'snackbar',\n\t\t\t}\n\t\t);\n\t\tonClose();\n\t}, [] );\n\n\tconst createFromBlocks = useCreateTemplatePartFromBlocks(\n\t\tarea,\n\t\tsetAttributes\n\t);\n\n\treturn (\n\t\t<>\n\t\t\t<div className=\"block-library-template-part__selection-content\">\n\t\t\t\t{ !! templartPartsAsBlockPatterns.length && (\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<h2>{ __( 'Existing template parts' ) }</h2>\n\t\t\t\t\t\t<BlockPatternsList\n\t\t\t\t\t\t\tblockPatterns={ templartPartsAsBlockPatterns }\n\t\t\t\t\t\t\tshownPatterns={ shownTemplateParts }\n\t\t\t\t\t\t\tonClickPattern={ ( pattern ) => {\n\t\t\t\t\t\t\t\tonTemplatePartSelect( pattern.templatePart );\n\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t) }\n\n\t\t\t\t{ !! blockPatterns.length && (\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<h2>{ __( 'Patterns' ) }</h2>\n\t\t\t\t\t\t<BlockPatternsList\n\t\t\t\t\t\t\tblockPatterns={ blockPatterns }\n\t\t\t\t\t\t\tshownPatterns={ shownBlockPatterns }\n\t\t\t\t\t\t\tonClickPattern={ ( pattern, blocks ) => {\n\t\t\t\t\t\t\t\tif ( isReplacingTemplatePartContent ) {\n\t\t\t\t\t\t\t\t\treplaceInnerBlocks( clientId, blocks );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcreateFromBlocks( blocks, pattern.title );\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tonClose();\n\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t) }\n\t\t\t</div>\n\t\t</>\n\t);\n}\n"]}
@@ -0,0 +1,46 @@
1
+ import { createElement } from "@wordpress/element";
2
+
3
+ /**
4
+ * WordPress dependencies
5
+ */
6
+ import { useState } from '@wordpress/element';
7
+ import { __, sprintf } from '@wordpress/i18n';
8
+ import { TextControl, Flex, FlexItem, Button, Modal } from '@wordpress/components';
9
+ export default function TitleModal(_ref) {
10
+ let {
11
+ areaLabel,
12
+ onClose,
13
+ onSubmit
14
+ } = _ref;
15
+ // Restructure onCreate to set the blocks on local state.
16
+ // Add modal to confirm title and trigger onCreate.
17
+ const [title, setTitle] = useState(__('Untitled Template Part'));
18
+
19
+ const submitForCreation = event => {
20
+ event.preventDefault();
21
+ onSubmit(title);
22
+ };
23
+
24
+ return createElement(Modal, {
25
+ title: sprintf( // Translators: %s as template part area title ("Header", "Footer", etc.).
26
+ __('Name and create your new %s'), areaLabel.toLowerCase()),
27
+ closeLabel: __('Cancel'),
28
+ overlayClassName: "wp-block-template-part__placeholder-create-new__title-form",
29
+ onRequestClose: onClose
30
+ }, createElement("form", {
31
+ onSubmit: submitForCreation
32
+ }, createElement(TextControl, {
33
+ label: __('Name'),
34
+ value: title,
35
+ onChange: setTitle
36
+ }), createElement(Flex, {
37
+ className: "wp-block-template-part__placeholder-create-new__title-form-actions",
38
+ justify: "flex-end"
39
+ }, createElement(FlexItem, null, createElement(Button, {
40
+ variant: "primary",
41
+ type: "submit",
42
+ disabled: !title.length,
43
+ "aria-disabled": !title.length
44
+ }, __('Create'))))));
45
+ }
46
+ //# sourceMappingURL=title-modal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["@wordpress/block-library/src/template-part/edit/title-modal.js"],"names":["useState","__","sprintf","TextControl","Flex","FlexItem","Button","Modal","TitleModal","areaLabel","onClose","onSubmit","title","setTitle","submitForCreation","event","preventDefault","toLowerCase","length"],"mappings":";;AAAA;AACA;AACA;AACA,SAASA,QAAT,QAAyB,oBAAzB;AACA,SAASC,EAAT,EAAaC,OAAb,QAA4B,iBAA5B;AACA,SACCC,WADD,EAECC,IAFD,EAGCC,QAHD,EAICC,MAJD,EAKCC,KALD,QAMO,uBANP;AAQA,eAAe,SAASC,UAAT,OAAwD;AAAA,MAAnC;AAAEC,IAAAA,SAAF;AAAaC,IAAAA,OAAb;AAAsBC,IAAAA;AAAtB,GAAmC;AACtE;AACA;AACA,QAAM,CAAEC,KAAF,EAASC,QAAT,IAAsBb,QAAQ,CAAEC,EAAE,CAAE,wBAAF,CAAJ,CAApC;;AAEA,QAAMa,iBAAiB,GAAKC,KAAF,IAAa;AACtCA,IAAAA,KAAK,CAACC,cAAN;AACAL,IAAAA,QAAQ,CAAEC,KAAF,CAAR;AACA,GAHD;;AAKA,SACC,cAAC,KAAD;AACC,IAAA,KAAK,EAAGV,OAAO,EACd;AACAD,IAAAA,EAAE,CAAE,6BAAF,CAFY,EAGdQ,SAAS,CAACQ,WAAV,EAHc,CADhB;AAMC,IAAA,UAAU,EAAGhB,EAAE,CAAE,QAAF,CANhB;AAOC,IAAA,gBAAgB,EAAC,4DAPlB;AAQC,IAAA,cAAc,EAAGS;AARlB,KAUC;AAAM,IAAA,QAAQ,EAAGI;AAAjB,KACC,cAAC,WAAD;AACC,IAAA,KAAK,EAAGb,EAAE,CAAE,MAAF,CADX;AAEC,IAAA,KAAK,EAAGW,KAFT;AAGC,IAAA,QAAQ,EAAGC;AAHZ,IADD,EAMC,cAAC,IAAD;AACC,IAAA,SAAS,EAAC,oEADX;AAEC,IAAA,OAAO,EAAC;AAFT,KAIC,cAAC,QAAD,QACC,cAAC,MAAD;AACC,IAAA,OAAO,EAAC,SADT;AAEC,IAAA,IAAI,EAAC,QAFN;AAGC,IAAA,QAAQ,EAAG,CAAED,KAAK,CAACM,MAHpB;AAIC,qBAAgB,CAAEN,KAAK,CAACM;AAJzB,KAMGjB,EAAE,CAAE,QAAF,CANL,CADD,CAJD,CAND,CAVD,CADD;AAmCA","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useState } from '@wordpress/element';\nimport { __, sprintf } from '@wordpress/i18n';\nimport {\n\tTextControl,\n\tFlex,\n\tFlexItem,\n\tButton,\n\tModal,\n} from '@wordpress/components';\n\nexport default function TitleModal( { areaLabel, onClose, onSubmit } ) {\n\t// Restructure onCreate to set the blocks on local state.\n\t// Add modal to confirm title and trigger onCreate.\n\tconst [ title, setTitle ] = useState( __( 'Untitled Template Part' ) );\n\n\tconst submitForCreation = ( event ) => {\n\t\tevent.preventDefault();\n\t\tonSubmit( title );\n\t};\n\n\treturn (\n\t\t<Modal\n\t\t\ttitle={ sprintf(\n\t\t\t\t// Translators: %s as template part area title (\"Header\", \"Footer\", etc.).\n\t\t\t\t__( 'Name and create your new %s' ),\n\t\t\t\tareaLabel.toLowerCase()\n\t\t\t) }\n\t\t\tcloseLabel={ __( 'Cancel' ) }\n\t\t\toverlayClassName=\"wp-block-template-part__placeholder-create-new__title-form\"\n\t\t\tonRequestClose={ onClose }\n\t\t>\n\t\t\t<form onSubmit={ submitForCreation }>\n\t\t\t\t<TextControl\n\t\t\t\t\tlabel={ __( 'Name' ) }\n\t\t\t\t\tvalue={ title }\n\t\t\t\t\tonChange={ setTitle }\n\t\t\t\t/>\n\t\t\t\t<Flex\n\t\t\t\t\tclassName=\"wp-block-template-part__placeholder-create-new__title-form-actions\"\n\t\t\t\t\tjustify=\"flex-end\"\n\t\t\t\t>\n\t\t\t\t\t<FlexItem>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\t\tdisabled={ ! title.length }\n\t\t\t\t\t\t\taria-disabled={ ! title.length }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ __( 'Create' ) }\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</FlexItem>\n\t\t\t\t</Flex>\n\t\t\t</form>\n\t\t</Modal>\n\t);\n}\n"]}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { find, kebabCase } from 'lodash';
5
+ /**
6
+ * WordPress dependencies
7
+ */
8
+
9
+ import { useDispatch, useSelect } from '@wordpress/data';
10
+ import { store as coreStore } from '@wordpress/core-data';
11
+ import { store as blockEditorStore } from '@wordpress/block-editor';
12
+ import { useMemo } from '@wordpress/element';
13
+ import { serialize } from '@wordpress/blocks';
14
+ import { __ } from '@wordpress/i18n';
15
+ /**
16
+ * Internal dependencies
17
+ */
18
+
19
+ import { createTemplatePartId } from './create-template-part-id';
20
+ /**
21
+ * Retrieves the available template parts for the given area.
22
+ *
23
+ * @param {string} area Template part area.
24
+ * @param {string} excludedId Template part ID to exclude.
25
+ *
26
+ * @return {{ templateParts: Array, isResolving: boolean }} array of template parts.
27
+ */
28
+
29
+ export function useAlternativeTemplateParts(area, excludedId) {
30
+ const {
31
+ templateParts,
32
+ isResolving
33
+ } = useSelect(select => {
34
+ const {
35
+ getEntityRecords,
36
+ isResolving: _isResolving
37
+ } = select(coreStore);
38
+ const query = {
39
+ per_page: -1
40
+ };
41
+ return {
42
+ templateParts: getEntityRecords('postType', 'wp_template_part', query),
43
+ isLoading: _isResolving('getEntityRecords', ['postType', 'wp_template_part', query])
44
+ };
45
+ }, []);
46
+ const filteredTemplateParts = useMemo(() => {
47
+ if (!templateParts) {
48
+ return [];
49
+ }
50
+
51
+ return templateParts.filter(templatePart => createTemplatePartId(templatePart.theme, templatePart.slug) !== excludedId && (!area || 'uncategorized' === area || templatePart.area === area)) || [];
52
+ }, [templateParts, area]);
53
+ return {
54
+ templateParts: filteredTemplateParts,
55
+ isResolving
56
+ };
57
+ }
58
+ /**
59
+ * Retrieves the available block patterns for the given area.
60
+ *
61
+ * @param {string} area Template part area.
62
+ * @param {string} clientId Block Client ID. (The container of the block can impact allowed blocks).
63
+ *
64
+ * @return {Array} array of block patterns.
65
+ */
66
+
67
+ export function useAlternativeBlockPatterns(area, clientId) {
68
+ return useSelect(select => {
69
+ const blockNameWithArea = area ? `core/template-part/${area}` : 'core/template-part';
70
+ const {
71
+ getBlockRootClientId,
72
+ __experimentalGetPatternsByBlockTypes
73
+ } = select(blockEditorStore);
74
+ const rootClientId = getBlockRootClientId(clientId);
75
+ return __experimentalGetPatternsByBlockTypes(blockNameWithArea, rootClientId);
76
+ }, [area, clientId]);
77
+ }
78
+ export function useCreateTemplatePartFromBlocks(area, setAttributes) {
79
+ const {
80
+ saveEntityRecord
81
+ } = useDispatch(coreStore);
82
+ return async function () {
83
+ let blocks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
84
+ let title = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : __('Untitled Template Part');
85
+ // If we have `area` set from block attributes, means an exposed
86
+ // block variation was inserted. So add this prop to the template
87
+ // part entity on creation. Afterwards remove `area` value from
88
+ // block attributes.
89
+ const record = {
90
+ title,
91
+ slug: kebabCase(title),
92
+ content: serialize(blocks),
93
+ // `area` is filterable on the server and defaults to `UNCATEGORIZED`
94
+ // if provided value is not allowed.
95
+ area
96
+ };
97
+ const templatePart = await saveEntityRecord('postType', 'wp_template_part', record);
98
+ setAttributes({
99
+ slug: templatePart.slug,
100
+ theme: templatePart.theme,
101
+ area: undefined
102
+ });
103
+ };
104
+ }
105
+ /**
106
+ * Retrieves the template part area object.
107
+ *
108
+ * @param {string} area Template part area identifier.
109
+ *
110
+ * @return {{icon: Object, label: string, tagName: string}} Template Part area.
111
+ */
112
+
113
+ export function useTemplatePartArea(area) {
114
+ return useSelect(select => {
115
+ var _selectedArea$area_ta;
116
+
117
+ // FIXME: @wordpress/block-library should not depend on @wordpress/editor.
118
+ // Blocks can be loaded into a *non-post* block editor.
119
+ // eslint-disable-next-line @wordpress/data-no-store-string-literals
120
+ const definedAreas = select('core/editor').__experimentalGetDefaultTemplatePartAreas();
121
+
122
+ const selectedArea = find(definedAreas, {
123
+ area
124
+ });
125
+ const defaultArea = find(definedAreas, {
126
+ area: 'uncategorized'
127
+ });
128
+ return {
129
+ icon: (selectedArea === null || selectedArea === void 0 ? void 0 : selectedArea.icon) || (defaultArea === null || defaultArea === void 0 ? void 0 : defaultArea.icon),
130
+ label: (selectedArea === null || selectedArea === void 0 ? void 0 : selectedArea.label) || __('Template Part'),
131
+ tagName: (_selectedArea$area_ta = selectedArea === null || selectedArea === void 0 ? void 0 : selectedArea.area_tag) !== null && _selectedArea$area_ta !== void 0 ? _selectedArea$area_ta : 'div'
132
+ };
133
+ }, [area]);
134
+ }
135
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["@wordpress/block-library/src/template-part/edit/utils/hooks.js"],"names":["find","kebabCase","useDispatch","useSelect","store","coreStore","blockEditorStore","useMemo","serialize","__","createTemplatePartId","useAlternativeTemplateParts","area","excludedId","templateParts","isResolving","select","getEntityRecords","_isResolving","query","per_page","isLoading","filteredTemplateParts","filter","templatePart","theme","slug","useAlternativeBlockPatterns","clientId","blockNameWithArea","getBlockRootClientId","__experimentalGetPatternsByBlockTypes","rootClientId","useCreateTemplatePartFromBlocks","setAttributes","saveEntityRecord","blocks","title","record","content","undefined","useTemplatePartArea","definedAreas","__experimentalGetDefaultTemplatePartAreas","selectedArea","defaultArea","icon","label","tagName","area_tag"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport { find, kebabCase } from 'lodash';\n\n/**\n * WordPress dependencies\n */\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data';\nimport { store as blockEditorStore } from '@wordpress/block-editor';\nimport { useMemo } from '@wordpress/element';\nimport { serialize } from '@wordpress/blocks';\nimport { __ } from '@wordpress/i18n';\n\n/**\n * Internal dependencies\n */\nimport { createTemplatePartId } from './create-template-part-id';\n\n/**\n * Retrieves the available template parts for the given area.\n *\n * @param {string} area Template part area.\n * @param {string} excludedId Template part ID to exclude.\n *\n * @return {{ templateParts: Array, isResolving: boolean }} array of template parts.\n */\nexport function useAlternativeTemplateParts( area, excludedId ) {\n\tconst { templateParts, isResolving } = useSelect( ( select ) => {\n\t\tconst { getEntityRecords, isResolving: _isResolving } = select(\n\t\t\tcoreStore\n\t\t);\n\t\tconst query = { per_page: -1 };\n\t\treturn {\n\t\t\ttemplateParts: getEntityRecords(\n\t\t\t\t'postType',\n\t\t\t\t'wp_template_part',\n\t\t\t\tquery\n\t\t\t),\n\t\t\tisLoading: _isResolving( 'getEntityRecords', [\n\t\t\t\t'postType',\n\t\t\t\t'wp_template_part',\n\t\t\t\tquery,\n\t\t\t] ),\n\t\t};\n\t}, [] );\n\n\tconst filteredTemplateParts = useMemo( () => {\n\t\tif ( ! templateParts ) {\n\t\t\treturn [];\n\t\t}\n\t\treturn (\n\t\t\ttemplateParts.filter(\n\t\t\t\t( templatePart ) =>\n\t\t\t\t\tcreateTemplatePartId(\n\t\t\t\t\t\ttemplatePart.theme,\n\t\t\t\t\t\ttemplatePart.slug\n\t\t\t\t\t) !== excludedId &&\n\t\t\t\t\t( ! area ||\n\t\t\t\t\t\t'uncategorized' === area ||\n\t\t\t\t\t\ttemplatePart.area === area )\n\t\t\t) || []\n\t\t);\n\t}, [ templateParts, area ] );\n\n\treturn {\n\t\ttemplateParts: filteredTemplateParts,\n\t\tisResolving,\n\t};\n}\n\n/**\n * Retrieves the available block patterns for the given area.\n *\n * @param {string} area Template part area.\n * @param {string} clientId Block Client ID. (The container of the block can impact allowed blocks).\n *\n * @return {Array} array of block patterns.\n */\nexport function useAlternativeBlockPatterns( area, clientId ) {\n\treturn useSelect(\n\t\t( select ) => {\n\t\t\tconst blockNameWithArea = area\n\t\t\t\t? `core/template-part/${ area }`\n\t\t\t\t: 'core/template-part';\n\t\t\tconst {\n\t\t\t\tgetBlockRootClientId,\n\t\t\t\t__experimentalGetPatternsByBlockTypes,\n\t\t\t} = select( blockEditorStore );\n\t\t\tconst rootClientId = getBlockRootClientId( clientId );\n\t\t\treturn __experimentalGetPatternsByBlockTypes(\n\t\t\t\tblockNameWithArea,\n\t\t\t\trootClientId\n\t\t\t);\n\t\t},\n\t\t[ area, clientId ]\n\t);\n}\n\nexport function useCreateTemplatePartFromBlocks( area, setAttributes ) {\n\tconst { saveEntityRecord } = useDispatch( coreStore );\n\n\treturn async ( blocks = [], title = __( 'Untitled Template Part' ) ) => {\n\t\t// If we have `area` set from block attributes, means an exposed\n\t\t// block variation was inserted. So add this prop to the template\n\t\t// part entity on creation. Afterwards remove `area` value from\n\t\t// block attributes.\n\t\tconst record = {\n\t\t\ttitle,\n\t\t\tslug: kebabCase( title ),\n\t\t\tcontent: serialize( blocks ),\n\t\t\t// `area` is filterable on the server and defaults to `UNCATEGORIZED`\n\t\t\t// if provided value is not allowed.\n\t\t\tarea,\n\t\t};\n\t\tconst templatePart = await saveEntityRecord(\n\t\t\t'postType',\n\t\t\t'wp_template_part',\n\t\t\trecord\n\t\t);\n\t\tsetAttributes( {\n\t\t\tslug: templatePart.slug,\n\t\t\ttheme: templatePart.theme,\n\t\t\tarea: undefined,\n\t\t} );\n\t};\n}\n\n/**\n * Retrieves the template part area object.\n *\n * @param {string} area Template part area identifier.\n *\n * @return {{icon: Object, label: string, tagName: string}} Template Part area.\n */\nexport function useTemplatePartArea( area ) {\n\treturn useSelect(\n\t\t( select ) => {\n\t\t\t// FIXME: @wordpress/block-library should not depend on @wordpress/editor.\n\t\t\t// Blocks can be loaded into a *non-post* block editor.\n\t\t\t// eslint-disable-next-line @wordpress/data-no-store-string-literals\n\t\t\tconst definedAreas = select(\n\t\t\t\t'core/editor'\n\t\t\t).__experimentalGetDefaultTemplatePartAreas();\n\n\t\t\tconst selectedArea = find( definedAreas, { area } );\n\t\t\tconst defaultArea = find( definedAreas, { area: 'uncategorized' } );\n\n\t\t\treturn {\n\t\t\t\ticon: selectedArea?.icon || defaultArea?.icon,\n\t\t\t\tlabel: selectedArea?.label || __( 'Template Part' ),\n\t\t\t\ttagName: selectedArea?.area_tag ?? 'div',\n\t\t\t};\n\t\t},\n\t\t[ area ]\n\t);\n}\n"]}
@@ -10,6 +10,7 @@ import { store as coreDataStore } from '@wordpress/core-data';
10
10
  import { select } from '@wordpress/data';
11
11
  import { symbolFilled } from '@wordpress/icons';
12
12
  import { addFilter } from '@wordpress/hooks';
13
+ import { decodeEntities } from '@wordpress/html-entities';
13
14
  /**
14
15
  * Internal dependencies
15
16
  */
@@ -71,7 +72,7 @@ export const settings = {
71
72
  return;
72
73
  }
73
74
 
74
- return startCase(((_entity$title = entity.title) === null || _entity$title === void 0 ? void 0 : _entity$title.rendered) || entity.slug);
75
+ return decodeEntities((_entity$title = entity.title) === null || _entity$title === void 0 ? void 0 : _entity$title.rendered) || startCase(entity.slug);
75
76
  },
76
77
  edit
77
78
  }; // Importing this file includes side effects. This is whitelisted in block-library/package.json under sideEffects