@wordpress/edit-site 4.7.0 → 4.10.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 (248) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/build/components/add-new-template/add-custom-generic-template-modal.js +84 -0
  3. package/build/components/add-new-template/add-custom-generic-template-modal.js.map +1 -0
  4. package/build/components/add-new-template/add-custom-template-modal.js +224 -0
  5. package/build/components/add-new-template/add-custom-template-modal.js.map +1 -0
  6. package/build/components/add-new-template/new-template.js +94 -33
  7. package/build/components/add-new-template/new-template.js.map +1 -1
  8. package/build/components/add-new-template/utils.js +405 -0
  9. package/build/components/add-new-template/utils.js.map +1 -0
  10. package/build/components/block-editor/block-inspector-button.js.map +1 -1
  11. package/build/components/block-editor/index.js.map +1 -1
  12. package/build/components/code-editor/index.js +17 -4
  13. package/build/components/code-editor/index.js.map +1 -1
  14. package/build/components/edit-template-part-menu-button/index.js.map +1 -1
  15. package/build/components/editor/index.js +16 -0
  16. package/build/components/editor/index.js.map +1 -1
  17. package/build/components/error-boundary/index.js +6 -0
  18. package/build/components/error-boundary/index.js.map +1 -1
  19. package/build/components/global-styles/context-menu.js +6 -3
  20. package/build/components/global-styles/context-menu.js.map +1 -1
  21. package/build/components/global-styles/dimensions-panel.js +2 -6
  22. package/build/components/global-styles/dimensions-panel.js.map +1 -1
  23. package/build/components/global-styles/global-styles-provider.js +4 -2
  24. package/build/components/global-styles/global-styles-provider.js.map +1 -1
  25. package/build/components/global-styles/gradients-palette-panel.js +3 -7
  26. package/build/components/global-styles/gradients-palette-panel.js.map +1 -1
  27. package/build/components/global-styles/hooks.js +11 -2
  28. package/build/components/global-styles/hooks.js.map +1 -1
  29. package/build/components/global-styles/palette.js +2 -1
  30. package/build/components/global-styles/palette.js.map +1 -1
  31. package/build/components/global-styles/screen-block-list.js +4 -1
  32. package/build/components/global-styles/screen-block-list.js.map +1 -1
  33. package/build/components/global-styles/screen-button-color.js +80 -0
  34. package/build/components/global-styles/screen-button-color.js.map +1 -0
  35. package/build/components/global-styles/screen-color-palette.js +13 -17
  36. package/build/components/global-styles/screen-color-palette.js.map +1 -1
  37. package/build/components/global-styles/screen-colors.js +56 -8
  38. package/build/components/global-styles/screen-colors.js.map +1 -1
  39. package/build/components/global-styles/screen-link-color.js +48 -14
  40. package/build/components/global-styles/screen-link-color.js.map +1 -1
  41. package/build/components/global-styles/screen-root.js +4 -2
  42. package/build/components/global-styles/screen-root.js.map +1 -1
  43. package/build/components/global-styles/screen-style-variations.js +9 -1
  44. package/build/components/global-styles/screen-style-variations.js.map +1 -1
  45. package/build/components/global-styles/screen-typography-element.js +4 -0
  46. package/build/components/global-styles/screen-typography-element.js.map +1 -1
  47. package/build/components/global-styles/screen-typography.js +9 -1
  48. package/build/components/global-styles/screen-typography.js.map +1 -1
  49. package/build/components/global-styles/ui.js +11 -0
  50. package/build/components/global-styles/ui.js.map +1 -1
  51. package/build/components/global-styles/use-global-styles-output.js +199 -30
  52. package/build/components/global-styles/use-global-styles-output.js.map +1 -1
  53. package/build/components/global-styles/utils.js +4 -2
  54. package/build/components/global-styles/utils.js.map +1 -1
  55. package/build/components/header/index.js +28 -10
  56. package/build/components/header/index.js.map +1 -1
  57. package/build/components/header/mode-switcher/index.js.map +1 -1
  58. package/build/components/header/more-menu/copy-content-menu-item.js +1 -1
  59. package/build/components/header/more-menu/copy-content-menu-item.js.map +1 -1
  60. package/build/components/header/more-menu/site-export.js +4 -1
  61. package/build/components/header/more-menu/site-export.js.map +1 -1
  62. package/build/components/header/undo-redo/redo.js +13 -4
  63. package/build/components/header/undo-redo/redo.js.map +1 -1
  64. package/build/components/header/undo-redo/undo.js +13 -4
  65. package/build/components/header/undo-redo/undo.js.map +1 -1
  66. package/build/components/keyboard-shortcut-help-modal/config.js +17 -0
  67. package/build/components/keyboard-shortcut-help-modal/config.js.map +1 -1
  68. package/build/components/keyboard-shortcut-help-modal/index.js +1 -3
  69. package/build/components/keyboard-shortcut-help-modal/index.js.map +1 -1
  70. package/build/components/keyboard-shortcuts/index.js.map +1 -1
  71. package/build/components/list/actions/index.js.map +1 -1
  72. package/build/components/list/actions/rename-menu-item.js.map +1 -1
  73. package/build/components/list/added-by.js.map +1 -1
  74. package/build/components/navigation-sidebar/index.js.map +1 -1
  75. package/build/components/save-button/index.js.map +1 -1
  76. package/build/components/sidebar/index.js.map +1 -1
  77. package/build/components/sidebar/navigation-menu-sidebar/navigation-inspector.js.map +1 -1
  78. package/build/components/sidebar/template-card/index.js +19 -7
  79. package/build/components/sidebar/template-card/index.js.map +1 -1
  80. package/build/components/sidebar/template-card/template-actions.js +64 -0
  81. package/build/components/sidebar/template-card/template-actions.js.map +1 -0
  82. package/build/components/sidebar/template-card/template-areas.js.map +1 -1
  83. package/build/components/template-details/edit-template-title.js +11 -3
  84. package/build/components/template-details/edit-template-title.js.map +1 -1
  85. package/build/components/template-details/index.js +1 -20
  86. package/build/components/template-details/index.js.map +1 -1
  87. package/build/components/template-details/template-areas.js.map +1 -1
  88. package/build/components/template-part-converter/index.js.map +1 -1
  89. package/build/components/url-query-controller/index.js.map +1 -1
  90. package/build/store/actions.js.map +1 -1
  91. package/build/store/selectors.js +4 -1
  92. package/build/store/selectors.js.map +1 -1
  93. package/build-module/components/add-new-template/add-custom-generic-template-modal.js +77 -0
  94. package/build-module/components/add-new-template/add-custom-generic-template-modal.js.map +1 -0
  95. package/build-module/components/add-new-template/add-custom-template-modal.js +209 -0
  96. package/build-module/components/add-new-template/add-custom-template-modal.js.map +1 -0
  97. package/build-module/components/add-new-template/new-template.js +93 -34
  98. package/build-module/components/add-new-template/new-template.js.map +1 -1
  99. package/build-module/components/add-new-template/utils.js +365 -0
  100. package/build-module/components/add-new-template/utils.js.map +1 -0
  101. package/build-module/components/block-editor/block-inspector-button.js.map +1 -1
  102. package/build-module/components/block-editor/index.js.map +1 -1
  103. package/build-module/components/code-editor/index.js +18 -5
  104. package/build-module/components/code-editor/index.js.map +1 -1
  105. package/build-module/components/edit-template-part-menu-button/index.js.map +1 -1
  106. package/build-module/components/editor/index.js +16 -0
  107. package/build-module/components/editor/index.js.map +1 -1
  108. package/build-module/components/error-boundary/index.js +5 -0
  109. package/build-module/components/error-boundary/index.js.map +1 -1
  110. package/build-module/components/global-styles/context-menu.js +6 -3
  111. package/build-module/components/global-styles/context-menu.js.map +1 -1
  112. package/build-module/components/global-styles/dimensions-panel.js +2 -6
  113. package/build-module/components/global-styles/dimensions-panel.js.map +1 -1
  114. package/build-module/components/global-styles/global-styles-provider.js +4 -2
  115. package/build-module/components/global-styles/global-styles-provider.js.map +1 -1
  116. package/build-module/components/global-styles/gradients-palette-panel.js +3 -5
  117. package/build-module/components/global-styles/gradients-palette-panel.js.map +1 -1
  118. package/build-module/components/global-styles/hooks.js +11 -2
  119. package/build-module/components/global-styles/hooks.js.map +1 -1
  120. package/build-module/components/global-styles/palette.js +2 -1
  121. package/build-module/components/global-styles/palette.js.map +1 -1
  122. package/build-module/components/global-styles/screen-block-list.js +4 -1
  123. package/build-module/components/global-styles/screen-block-list.js.map +1 -1
  124. package/build-module/components/global-styles/screen-button-color.js +67 -0
  125. package/build-module/components/global-styles/screen-button-color.js.map +1 -0
  126. package/build-module/components/global-styles/screen-color-palette.js +14 -19
  127. package/build-module/components/global-styles/screen-color-palette.js.map +1 -1
  128. package/build-module/components/global-styles/screen-colors.js +57 -9
  129. package/build-module/components/global-styles/screen-colors.js.map +1 -1
  130. package/build-module/components/global-styles/screen-link-color.js +47 -14
  131. package/build-module/components/global-styles/screen-link-color.js.map +1 -1
  132. package/build-module/components/global-styles/screen-root.js +4 -2
  133. package/build-module/components/global-styles/screen-root.js.map +1 -1
  134. package/build-module/components/global-styles/screen-style-variations.js +9 -1
  135. package/build-module/components/global-styles/screen-style-variations.js.map +1 -1
  136. package/build-module/components/global-styles/screen-typography-element.js +4 -0
  137. package/build-module/components/global-styles/screen-typography-element.js.map +1 -1
  138. package/build-module/components/global-styles/screen-typography.js +10 -2
  139. package/build-module/components/global-styles/screen-typography.js.map +1 -1
  140. package/build-module/components/global-styles/ui.js +10 -0
  141. package/build-module/components/global-styles/ui.js.map +1 -1
  142. package/build-module/components/global-styles/use-global-styles-output.js +198 -32
  143. package/build-module/components/global-styles/use-global-styles-output.js.map +1 -1
  144. package/build-module/components/global-styles/utils.js +5 -3
  145. package/build-module/components/global-styles/utils.js.map +1 -1
  146. package/build-module/components/header/index.js +29 -11
  147. package/build-module/components/header/index.js.map +1 -1
  148. package/build-module/components/header/mode-switcher/index.js.map +1 -1
  149. package/build-module/components/header/more-menu/copy-content-menu-item.js +1 -1
  150. package/build-module/components/header/more-menu/copy-content-menu-item.js.map +1 -1
  151. package/build-module/components/header/more-menu/site-export.js +4 -1
  152. package/build-module/components/header/more-menu/site-export.js.map +1 -1
  153. package/build-module/components/header/undo-redo/redo.js +9 -3
  154. package/build-module/components/header/undo-redo/redo.js.map +1 -1
  155. package/build-module/components/header/undo-redo/undo.js +9 -3
  156. package/build-module/components/header/undo-redo/undo.js.map +1 -1
  157. package/build-module/components/keyboard-shortcut-help-modal/config.js +17 -0
  158. package/build-module/components/keyboard-shortcut-help-modal/config.js.map +1 -1
  159. package/build-module/components/keyboard-shortcut-help-modal/index.js +1 -2
  160. package/build-module/components/keyboard-shortcut-help-modal/index.js.map +1 -1
  161. package/build-module/components/keyboard-shortcuts/index.js.map +1 -1
  162. package/build-module/components/list/actions/index.js.map +1 -1
  163. package/build-module/components/list/actions/rename-menu-item.js.map +1 -1
  164. package/build-module/components/list/added-by.js.map +1 -1
  165. package/build-module/components/navigation-sidebar/index.js.map +1 -1
  166. package/build-module/components/save-button/index.js.map +1 -1
  167. package/build-module/components/sidebar/index.js.map +1 -1
  168. package/build-module/components/sidebar/navigation-menu-sidebar/navigation-inspector.js.map +1 -1
  169. package/build-module/components/sidebar/template-card/index.js +18 -7
  170. package/build-module/components/sidebar/template-card/index.js.map +1 -1
  171. package/build-module/components/sidebar/template-card/template-actions.js +49 -0
  172. package/build-module/components/sidebar/template-card/template-actions.js.map +1 -0
  173. package/build-module/components/sidebar/template-card/template-areas.js.map +1 -1
  174. package/build-module/components/template-details/edit-template-title.js +12 -3
  175. package/build-module/components/template-details/edit-template-title.js.map +1 -1
  176. package/build-module/components/template-details/index.js +2 -21
  177. package/build-module/components/template-details/index.js.map +1 -1
  178. package/build-module/components/template-details/template-areas.js.map +1 -1
  179. package/build-module/components/template-part-converter/index.js.map +1 -1
  180. package/build-module/components/url-query-controller/index.js.map +1 -1
  181. package/build-module/store/actions.js.map +1 -1
  182. package/build-module/store/selectors.js +5 -2
  183. package/build-module/store/selectors.js.map +1 -1
  184. package/build-style/style-rtl.css +188 -42
  185. package/build-style/style.css +188 -42
  186. package/package.json +29 -29
  187. package/src/components/add-new-template/add-custom-generic-template-modal.js +97 -0
  188. package/src/components/add-new-template/add-custom-template-modal.js +265 -0
  189. package/src/components/add-new-template/new-template.js +194 -70
  190. package/src/components/add-new-template/style.scss +137 -0
  191. package/src/components/add-new-template/utils.js +369 -0
  192. package/src/components/block-editor/block-inspector-button.js +2 -3
  193. package/src/components/block-editor/index.js +4 -9
  194. package/src/components/code-editor/index.js +15 -5
  195. package/src/components/edit-template-part-menu-button/index.js +2 -3
  196. package/src/components/editor/index.js +15 -5
  197. package/src/components/error-boundary/index.js +5 -0
  198. package/src/components/global-styles/context-menu.js +3 -0
  199. package/src/components/global-styles/dimensions-panel.js +2 -7
  200. package/src/components/global-styles/global-styles-provider.js +12 -17
  201. package/src/components/global-styles/gradients-palette-panel.js +2 -5
  202. package/src/components/global-styles/hooks.js +20 -3
  203. package/src/components/global-styles/palette.js +4 -1
  204. package/src/components/global-styles/screen-block-list.js +14 -5
  205. package/src/components/global-styles/screen-button-color.js +102 -0
  206. package/src/components/global-styles/screen-color-palette.js +25 -27
  207. package/src/components/global-styles/screen-colors.js +58 -7
  208. package/src/components/global-styles/screen-link-color.js +65 -23
  209. package/src/components/global-styles/screen-root.js +12 -5
  210. package/src/components/global-styles/screen-style-variations.js +10 -4
  211. package/src/components/global-styles/screen-typography-element.js +4 -0
  212. package/src/components/global-styles/screen-typography.js +17 -2
  213. package/src/components/global-styles/style.scss +14 -8
  214. package/src/components/global-styles/test/use-global-styles-output.js +250 -16
  215. package/src/components/global-styles/ui.js +13 -0
  216. package/src/components/global-styles/use-global-styles-output.js +246 -32
  217. package/src/components/global-styles/utils.js +5 -2
  218. package/src/components/header/index.js +38 -13
  219. package/src/components/header/mode-switcher/index.js +4 -4
  220. package/src/components/header/more-menu/copy-content-menu-item.js +3 -4
  221. package/src/components/header/more-menu/site-export.js +5 -3
  222. package/src/components/header/style.scss +53 -5
  223. package/src/components/header/undo-redo/redo.js +6 -1
  224. package/src/components/header/undo-redo/undo.js +6 -1
  225. package/src/components/keyboard-shortcut-help-modal/config.js +12 -0
  226. package/src/components/keyboard-shortcut-help-modal/index.js +1 -2
  227. package/src/components/keyboard-shortcut-help-modal/style.scss +0 -5
  228. package/src/components/keyboard-shortcuts/index.js +6 -10
  229. package/src/components/list/actions/index.js +2 -3
  230. package/src/components/list/actions/rename-menu-item.js +4 -6
  231. package/src/components/list/added-by.js +4 -3
  232. package/src/components/list/style.scss +0 -8
  233. package/src/components/navigation-sidebar/index.js +2 -4
  234. package/src/components/save-button/index.js +2 -4
  235. package/src/components/sidebar/index.js +6 -6
  236. package/src/components/sidebar/navigation-menu-sidebar/navigation-inspector.js +6 -9
  237. package/src/components/sidebar/template-card/index.js +17 -9
  238. package/src/components/sidebar/template-card/style.scss +49 -35
  239. package/src/components/sidebar/template-card/template-actions.js +43 -0
  240. package/src/components/sidebar/template-card/template-areas.js +6 -6
  241. package/src/components/template-details/edit-template-title.js +10 -2
  242. package/src/components/template-details/index.js +4 -21
  243. package/src/components/template-details/template-areas.js +6 -6
  244. package/src/components/template-part-converter/index.js +2 -3
  245. package/src/components/test/error-boundary.js +38 -0
  246. package/src/components/url-query-controller/index.js +2 -3
  247. package/src/store/actions.js +257 -233
  248. package/src/store/selectors.js +19 -14
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wordpress/edit-site",
3
- "version": "4.7.0",
3
+ "version": "4.10.0",
4
4
  "description": "Edit Site Page module for WordPress.",
5
5
  "author": "The WordPress Contributors",
6
6
  "license": "GPL-2.0-or-later",
@@ -27,33 +27,33 @@
27
27
  "react-native": "src/index",
28
28
  "dependencies": {
29
29
  "@babel/runtime": "^7.16.0",
30
- "@wordpress/a11y": "^3.10.0",
31
- "@wordpress/api-fetch": "^6.7.0",
32
- "@wordpress/block-editor": "^9.2.0",
33
- "@wordpress/block-library": "^7.7.0",
34
- "@wordpress/blocks": "^11.9.0",
35
- "@wordpress/components": "^19.12.0",
36
- "@wordpress/compose": "^5.8.0",
37
- "@wordpress/core-data": "^4.8.0",
38
- "@wordpress/data": "^6.10.0",
39
- "@wordpress/deprecated": "^3.10.0",
40
- "@wordpress/editor": "^12.9.0",
41
- "@wordpress/element": "^4.8.0",
42
- "@wordpress/hooks": "^3.10.0",
43
- "@wordpress/html-entities": "^3.10.0",
44
- "@wordpress/i18n": "^4.10.0",
45
- "@wordpress/icons": "^9.1.0",
46
- "@wordpress/interface": "^4.9.0",
47
- "@wordpress/keyboard-shortcuts": "^3.8.0",
48
- "@wordpress/keycodes": "^3.10.0",
49
- "@wordpress/media-utils": "^4.1.0",
50
- "@wordpress/notices": "^3.10.0",
51
- "@wordpress/plugins": "^4.8.0",
52
- "@wordpress/preferences": "^2.2.0",
53
- "@wordpress/reusable-blocks": "^3.8.0",
54
- "@wordpress/style-engine": "^0.9.0",
55
- "@wordpress/url": "^3.11.0",
56
- "@wordpress/viewport": "^4.8.0",
30
+ "@wordpress/a11y": "^3.13.0",
31
+ "@wordpress/api-fetch": "^6.10.0",
32
+ "@wordpress/block-editor": "^9.5.0",
33
+ "@wordpress/block-library": "^7.10.0",
34
+ "@wordpress/blocks": "^11.12.0",
35
+ "@wordpress/components": "^19.15.0",
36
+ "@wordpress/compose": "^5.11.0",
37
+ "@wordpress/core-data": "^4.11.0",
38
+ "@wordpress/data": "^6.13.0",
39
+ "@wordpress/deprecated": "^3.13.0",
40
+ "@wordpress/editor": "^12.12.0",
41
+ "@wordpress/element": "^4.11.0",
42
+ "@wordpress/hooks": "^3.13.0",
43
+ "@wordpress/html-entities": "^3.13.0",
44
+ "@wordpress/i18n": "^4.13.0",
45
+ "@wordpress/icons": "^9.4.0",
46
+ "@wordpress/interface": "^4.12.0",
47
+ "@wordpress/keyboard-shortcuts": "^3.11.0",
48
+ "@wordpress/keycodes": "^3.13.0",
49
+ "@wordpress/media-utils": "^4.4.0",
50
+ "@wordpress/notices": "^3.13.0",
51
+ "@wordpress/plugins": "^4.11.0",
52
+ "@wordpress/preferences": "^2.5.0",
53
+ "@wordpress/reusable-blocks": "^3.11.0",
54
+ "@wordpress/style-engine": "^0.12.0",
55
+ "@wordpress/url": "^3.14.0",
56
+ "@wordpress/viewport": "^4.11.0",
57
57
  "classnames": "^2.3.1",
58
58
  "downloadjs": "^1.4.7",
59
59
  "history": "^5.1.0",
@@ -68,5 +68,5 @@
68
68
  "publishConfig": {
69
69
  "access": "public"
70
70
  },
71
- "gitHead": "a3e0b62091e8a8bdf5e2518e42d60d7098af48cc"
71
+ "gitHead": "9d9d33bbdf317a4381b8ca1713e43bb50df653b3"
72
72
  }
@@ -0,0 +1,97 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { kebabCase } from 'lodash';
5
+
6
+ /**
7
+ * WordPress dependencies
8
+ */
9
+ import { useState } from '@wordpress/element';
10
+ import { __ } from '@wordpress/i18n';
11
+ import {
12
+ Button,
13
+ Flex,
14
+ FlexItem,
15
+ Modal,
16
+ TextControl,
17
+ } from '@wordpress/components';
18
+
19
+ function AddCustomGenericTemplateModal( { onClose, createTemplate } ) {
20
+ const [ title, setTitle ] = useState( '' );
21
+ const defaultTitle = __( 'Custom Template' );
22
+ const [ isBusy, setIsBusy ] = useState( false );
23
+ async function onCreateTemplate( event ) {
24
+ event.preventDefault();
25
+
26
+ if ( isBusy ) {
27
+ return;
28
+ }
29
+
30
+ setIsBusy( true );
31
+
32
+ createTemplate(
33
+ {
34
+ slug:
35
+ 'wp-custom-template-' + kebabCase( title || defaultTitle ),
36
+ title: title || defaultTitle,
37
+ },
38
+ false
39
+ );
40
+ }
41
+ return (
42
+ <Modal
43
+ title={ __( 'Create custom template' ) }
44
+ closeLabel={ __( 'Close' ) }
45
+ onRequestClose={ () => {
46
+ onClose();
47
+ } }
48
+ overlayClassName="edit-site-custom-generic-template__modal"
49
+ >
50
+ <form onSubmit={ onCreateTemplate }>
51
+ <Flex align="flex-start" gap={ 8 }>
52
+ <FlexItem>
53
+ <TextControl
54
+ label={ __( 'Name' ) }
55
+ value={ title }
56
+ onChange={ setTitle }
57
+ placeholder={ defaultTitle }
58
+ disabled={ isBusy }
59
+ help={ __(
60
+ 'Describe the template, e.g. "Post with sidebar".'
61
+ ) }
62
+ />
63
+ </FlexItem>
64
+ </Flex>
65
+
66
+ <Flex
67
+ className="edit-site-custom-generic-template__modal-actions"
68
+ justify="flex-end"
69
+ expanded={ false }
70
+ >
71
+ <FlexItem>
72
+ <Button
73
+ variant="tertiary"
74
+ onClick={ () => {
75
+ onClose();
76
+ } }
77
+ >
78
+ { __( 'Cancel' ) }
79
+ </Button>
80
+ </FlexItem>
81
+ <FlexItem>
82
+ <Button
83
+ variant="primary"
84
+ type="submit"
85
+ isBusy={ isBusy }
86
+ aria-disabled={ isBusy }
87
+ >
88
+ { __( 'Create' ) }
89
+ </Button>
90
+ </FlexItem>
91
+ </Flex>
92
+ </form>
93
+ </Modal>
94
+ );
95
+ }
96
+
97
+ export default AddCustomGenericTemplateModal;
@@ -0,0 +1,265 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useState, useMemo, useEffect } from '@wordpress/element';
5
+ import { __, sprintf } from '@wordpress/i18n';
6
+ import {
7
+ Button,
8
+ Flex,
9
+ FlexItem,
10
+ Modal,
11
+ SearchControl,
12
+ TextHighlight,
13
+ __experimentalText as Text,
14
+ __experimentalHeading as Heading,
15
+ __unstableComposite as Composite,
16
+ __unstableUseCompositeState as useCompositeState,
17
+ __unstableCompositeItem as CompositeItem,
18
+ } from '@wordpress/components';
19
+ import { useDebounce } from '@wordpress/compose';
20
+ import { useEntityRecords } from '@wordpress/core-data';
21
+
22
+ /**
23
+ * Internal dependencies
24
+ */
25
+ import { mapToIHasNameAndId } from './utils';
26
+
27
+ const EMPTY_ARRAY = [];
28
+
29
+ function selectSuggestion( suggestion, onSelect, entityForSuggestions ) {
30
+ const {
31
+ labels,
32
+ slug,
33
+ config: { templateSlug, templatePrefix },
34
+ } = entityForSuggestions;
35
+ const title = sprintf(
36
+ // translators: Represents the title of a user's custom template in the Site Editor, where %1$s is the singular name of a post type or taxonomy and %2$s is the name of the post or term, e.g. "Post: Hello, WordPress", "Category: shoes"
37
+ __( '%1$s: %2$s' ),
38
+ labels.singular_name,
39
+ suggestion.name
40
+ );
41
+ let newTemplateSlug = `${ templateSlug || slug }-${ suggestion.slug }`;
42
+ if ( templatePrefix ) {
43
+ newTemplateSlug = templatePrefix + newTemplateSlug;
44
+ }
45
+ const newTemplate = {
46
+ title,
47
+ description: sprintf(
48
+ // translators: Represents the description of a user's custom template in the Site Editor, e.g. "Template for Post: Hello, WordPress"
49
+ __( 'Template for %1$s' ),
50
+ title
51
+ ),
52
+ slug: newTemplateSlug,
53
+ };
54
+ onSelect( newTemplate );
55
+ }
56
+
57
+ function SuggestionListItem( {
58
+ suggestion,
59
+ search,
60
+ onSelect,
61
+ entityForSuggestions,
62
+ composite,
63
+ } ) {
64
+ const baseCssClass =
65
+ 'edit-site-custom-template-modal__suggestions_list__list-item';
66
+ return (
67
+ <CompositeItem
68
+ role="option"
69
+ as={ Button }
70
+ { ...composite }
71
+ className={ baseCssClass }
72
+ onClick={ () =>
73
+ selectSuggestion( suggestion, onSelect, entityForSuggestions )
74
+ }
75
+ >
76
+ <span className={ `${ baseCssClass }__title` }>
77
+ <TextHighlight text={ suggestion.name } highlight={ search } />
78
+ </span>
79
+ { suggestion.link && (
80
+ <span className={ `${ baseCssClass }__info` }>
81
+ { suggestion.link }
82
+ </span>
83
+ ) }
84
+ </CompositeItem>
85
+ );
86
+ }
87
+
88
+ function useDebouncedInput() {
89
+ const [ input, setInput ] = useState( '' );
90
+ const [ debounced, setter ] = useState( '' );
91
+ const setDebounced = useDebounce( setter, 250 );
92
+ useEffect( () => {
93
+ if ( debounced !== input ) {
94
+ setDebounced( input );
95
+ }
96
+ }, [ debounced, input ] );
97
+ return [ input, setInput, debounced ];
98
+ }
99
+
100
+ function useSearchSuggestions( entityForSuggestions, search ) {
101
+ const { config, postsToExclude } = entityForSuggestions;
102
+ const query = useMemo(
103
+ () => ( {
104
+ order: 'asc',
105
+ _fields: 'id,name,title,slug,link',
106
+ context: 'view',
107
+ search,
108
+ orderBy: config.getOrderBy( { search } ),
109
+ exclude: postsToExclude,
110
+ per_page: search ? 20 : 10,
111
+ } ),
112
+ [ search, config, postsToExclude ]
113
+ );
114
+ const { records: searchResults, hasResolved: searchHasResolved } =
115
+ useEntityRecords(
116
+ entityForSuggestions.type,
117
+ entityForSuggestions.slug,
118
+ query
119
+ );
120
+ const [ suggestions, setSuggestions ] = useState( EMPTY_ARRAY );
121
+ useEffect( () => {
122
+ if ( ! searchHasResolved ) return;
123
+ let newSuggestions = EMPTY_ARRAY;
124
+ if ( searchResults?.length ) {
125
+ newSuggestions = searchResults;
126
+ if ( config.recordNamePath ) {
127
+ newSuggestions = mapToIHasNameAndId(
128
+ newSuggestions,
129
+ config.recordNamePath
130
+ );
131
+ }
132
+ }
133
+ // Update suggestions only when the query has resolved, so as to keep
134
+ // the previous results in the UI.
135
+ setSuggestions( newSuggestions );
136
+ }, [ searchResults, searchHasResolved ] );
137
+ return suggestions;
138
+ }
139
+
140
+ function SuggestionList( { entityForSuggestions, onSelect } ) {
141
+ const composite = useCompositeState( { orientation: 'vertical' } );
142
+ const [ search, setSearch, debouncedSearch ] = useDebouncedInput();
143
+ const suggestions = useSearchSuggestions(
144
+ entityForSuggestions,
145
+ debouncedSearch
146
+ );
147
+ const { labels } = entityForSuggestions;
148
+ return (
149
+ <>
150
+ <SearchControl
151
+ onChange={ setSearch }
152
+ value={ search }
153
+ label={ labels.search_items }
154
+ placeholder={ labels.search_items }
155
+ />
156
+ { !! suggestions?.length && (
157
+ <Composite
158
+ { ...composite }
159
+ role="listbox"
160
+ className="edit-site-custom-template-modal__suggestions_list"
161
+ >
162
+ { suggestions.map( ( suggestion ) => (
163
+ <SuggestionListItem
164
+ key={ suggestion.slug }
165
+ suggestion={ suggestion }
166
+ search={ debouncedSearch }
167
+ onSelect={ onSelect }
168
+ entityForSuggestions={ entityForSuggestions }
169
+ composite={ composite }
170
+ />
171
+ ) ) }
172
+ </Composite>
173
+ ) }
174
+ { debouncedSearch && ! suggestions?.length && (
175
+ <p className="edit-site-custom-template-modal__no-results">
176
+ { labels.not_found }
177
+ </p>
178
+ ) }
179
+ </>
180
+ );
181
+ }
182
+
183
+ function AddCustomTemplateModal( { onClose, onSelect, entityForSuggestions } ) {
184
+ const [ showSearchEntities, setShowSearchEntities ] = useState(
185
+ entityForSuggestions.hasGeneralTemplate
186
+ );
187
+ const baseCssClass = 'edit-site-custom-template-modal';
188
+ return (
189
+ <Modal
190
+ title={ sprintf(
191
+ // translators: %s: Name of the post type e.g: "Post".
192
+ __( 'Add template: %s' ),
193
+ entityForSuggestions.labels.singular_name
194
+ ) }
195
+ className={ baseCssClass }
196
+ closeLabel={ __( 'Close' ) }
197
+ onRequestClose={ onClose }
198
+ >
199
+ { ! showSearchEntities && (
200
+ <>
201
+ <p>
202
+ { __(
203
+ 'Select whether to create a single template for all items or a specific one.'
204
+ ) }
205
+ </p>
206
+ <Flex
207
+ className={ `${ baseCssClass }__contents` }
208
+ gap="4"
209
+ align="initial"
210
+ >
211
+ <FlexItem
212
+ isBlock
213
+ onClick={ () => {
214
+ const { slug, title, description } =
215
+ entityForSuggestions.template;
216
+ onSelect( { slug, title, description } );
217
+ } }
218
+ >
219
+ <Heading level={ 5 }>
220
+ { entityForSuggestions.labels.all_items }
221
+ </Heading>
222
+ <Text as="span">
223
+ {
224
+ // translators: The user is given the choice to set up a template for all items of a post type or taxonomy, or just a specific one.
225
+ __( 'For all items' )
226
+ }
227
+ </Text>
228
+ </FlexItem>
229
+ <FlexItem
230
+ isBlock
231
+ onClick={ () => {
232
+ setShowSearchEntities( true );
233
+ } }
234
+ >
235
+ <Heading level={ 5 }>
236
+ { entityForSuggestions.labels.singular_name }
237
+ </Heading>
238
+ <Text as="span">
239
+ {
240
+ // translators: The user is given the choice to set up a template for all items of a post type or taxonomy, or just a specific one.
241
+ __( 'For a specific item' )
242
+ }
243
+ </Text>
244
+ </FlexItem>
245
+ </Flex>
246
+ </>
247
+ ) }
248
+ { showSearchEntities && (
249
+ <>
250
+ <p>
251
+ { __(
252
+ 'This template will be used only for the specific item chosen.'
253
+ ) }
254
+ </p>
255
+ <SuggestionList
256
+ entityForSuggestions={ entityForSuggestions }
257
+ onSelect={ onSelect }
258
+ />
259
+ </>
260
+ ) }
261
+ </Modal>
262
+ );
263
+ }
264
+
265
+ export default AddCustomTemplateModal;