@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
@@ -1,8 +1,3 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { filter, includes, map } from 'lodash';
5
-
6
1
  /**
7
2
  * WordPress dependencies
8
3
  */
@@ -12,9 +7,9 @@ import {
12
7
  MenuItem,
13
8
  NavigableMenu,
14
9
  } from '@wordpress/components';
15
- import { useSelect, useDispatch } from '@wordpress/data';
10
+ import { useState } from '@wordpress/element';
11
+ import { useDispatch } from '@wordpress/data';
16
12
  import { store as coreStore } from '@wordpress/core-data';
17
- import { store as editorStore } from '@wordpress/editor';
18
13
  import {
19
14
  archive,
20
15
  blockMeta,
@@ -29,6 +24,7 @@ import {
29
24
  postDate,
30
25
  search,
31
26
  tag,
27
+ layout as customGenericTemplateIcon,
32
28
  } from '@wordpress/icons';
33
29
  import { __ } from '@wordpress/i18n';
34
30
  import { store as noticesStore } from '@wordpress/notices';
@@ -36,6 +32,19 @@ import { store as noticesStore } from '@wordpress/notices';
36
32
  /**
37
33
  * Internal dependencies
38
34
  */
35
+ import AddCustomTemplateModal from './add-custom-template-modal';
36
+ import {
37
+ useExistingTemplates,
38
+ useDefaultTemplateTypes,
39
+ entitiesConfig,
40
+ usePostTypes,
41
+ usePostTypePage,
42
+ useTaxonomies,
43
+ useTaxonomyCategory,
44
+ useTaxonomyTag,
45
+ useExtraTemplates,
46
+ } from './utils';
47
+ import AddCustomGenericTemplateModal from './add-custom-generic-template-modal';
39
48
  import { useHistory } from '../routes';
40
49
  import { store as editSiteStore } from '../../store';
41
50
 
@@ -71,28 +80,22 @@ const TEMPLATE_ICONS = {
71
80
  };
72
81
 
73
82
  export default function NewTemplate( { postType } ) {
83
+ const [ showCustomTemplateModal, setShowCustomTemplateModal ] =
84
+ useState( false );
85
+ const [
86
+ showCustomGenericTemplateModal,
87
+ setShowCustomGenericTemplateModal,
88
+ ] = useState( false );
89
+ const [ entityForSuggestions, setEntityForSuggestions ] = useState( {} );
90
+
74
91
  const history = useHistory();
75
- const { templates, defaultTemplateTypes } = useSelect(
76
- ( select ) => ( {
77
- templates: select( coreStore ).getEntityRecords(
78
- 'postType',
79
- 'wp_template',
80
- { per_page: -1 }
81
- ),
82
- defaultTemplateTypes: select(
83
- editorStore
84
- ).__experimentalGetDefaultTemplateTypes(),
85
- } ),
86
- []
87
- );
88
92
  const { saveEntityRecord } = useDispatch( coreStore );
89
93
  const { createErrorNotice } = useDispatch( noticesStore );
90
94
  const { setTemplate } = useDispatch( editSiteStore );
91
95
 
92
- async function createTemplate( template ) {
96
+ async function createTemplate( template, isWPSuggestion = true ) {
93
97
  try {
94
98
  const { title, description, slug } = template;
95
-
96
99
  const newTemplate = await saveEntityRecord(
97
100
  'postType',
98
101
  'wp_template',
@@ -103,7 +106,7 @@ export default function NewTemplate( { postType } ) {
103
106
  status: 'publish',
104
107
  title,
105
108
  // This adds a post meta field in template that is part of `is_custom` value calculation.
106
- is_wp_suggestion: true,
109
+ is_wp_suggestion: isWPSuggestion,
107
110
  },
108
111
  { throwOnError: true }
109
112
  );
@@ -130,63 +133,184 @@ export default function NewTemplate( { postType } ) {
130
133
  }
131
134
  }
132
135
 
133
- const existingTemplateSlugs = map( templates, 'slug' );
134
-
135
- const missingTemplates = filter(
136
- defaultTemplateTypes,
137
- ( template ) =>
138
- includes( DEFAULT_TEMPLATE_SLUGS, template.slug ) &&
139
- ! includes( existingTemplateSlugs, template.slug )
136
+ const missingTemplates = useMissingTemplates(
137
+ setEntityForSuggestions,
138
+ setShowCustomTemplateModal
140
139
  );
141
-
142
140
  if ( ! missingTemplates.length ) {
143
141
  return null;
144
142
  }
143
+ return (
144
+ <>
145
+ <DropdownMenu
146
+ className="edit-site-new-template-dropdown"
147
+ icon={ null }
148
+ text={ postType.labels.add_new }
149
+ label={ postType.labels.add_new_item }
150
+ popoverProps={ {
151
+ noArrow: false,
152
+ } }
153
+ toggleProps={ {
154
+ variant: 'primary',
155
+ } }
156
+ >
157
+ { () => (
158
+ <NavigableMenu className="edit-site-new-template-dropdown__popover">
159
+ <MenuGroup label={ postType.labels.add_new_item }>
160
+ { missingTemplates.map( ( template ) => {
161
+ const {
162
+ title,
163
+ description,
164
+ slug,
165
+ onClick,
166
+ icon,
167
+ } = template;
168
+ return (
169
+ <MenuItem
170
+ icon={
171
+ icon ||
172
+ TEMPLATE_ICONS[ slug ] ||
173
+ post
174
+ }
175
+ iconPosition="left"
176
+ info={ description }
177
+ key={ slug }
178
+ onClick={ () =>
179
+ onClick
180
+ ? onClick( template )
181
+ : createTemplate( template )
182
+ }
183
+ >
184
+ { title }
185
+ </MenuItem>
186
+ );
187
+ } ) }
188
+ </MenuGroup>
189
+ <MenuGroup>
190
+ <MenuItem
191
+ icon={ customGenericTemplateIcon }
192
+ iconPosition="left"
193
+ info={ __(
194
+ 'Custom templates can be applied to any post or page.'
195
+ ) }
196
+ key="custom-template"
197
+ onClick={ () =>
198
+ setShowCustomGenericTemplateModal( true )
199
+ }
200
+ >
201
+ { __( 'Custom template' ) }
202
+ </MenuItem>
203
+ </MenuGroup>
204
+ </NavigableMenu>
205
+ ) }
206
+ </DropdownMenu>
207
+ { showCustomTemplateModal && (
208
+ <AddCustomTemplateModal
209
+ onClose={ () => setShowCustomTemplateModal( false ) }
210
+ onSelect={ createTemplate }
211
+ entityForSuggestions={ entityForSuggestions }
212
+ />
213
+ ) }
214
+ { showCustomGenericTemplateModal && (
215
+ <AddCustomGenericTemplateModal
216
+ onClose={ () => setShowCustomGenericTemplateModal( false ) }
217
+ createTemplate={ createTemplate }
218
+ />
219
+ ) }
220
+ </>
221
+ );
222
+ }
223
+
224
+ function useMissingTemplates(
225
+ setEntityForSuggestions,
226
+ setShowCustomTemplateModal
227
+ ) {
228
+ const postTypes = usePostTypes();
229
+ const pagePostType = usePostTypePage();
230
+ const taxonomies = useTaxonomies();
231
+ const categoryTaxonomy = useTaxonomyCategory();
232
+ const tagTaxonomy = useTaxonomyTag();
145
233
 
234
+ const existingTemplates = useExistingTemplates();
235
+ const defaultTemplateTypes = useDefaultTemplateTypes();
236
+
237
+ const existingTemplateSlugs = ( existingTemplates || [] ).map(
238
+ ( { slug } ) => slug
239
+ );
240
+
241
+ const missingDefaultTemplates = ( defaultTemplateTypes || [] ).filter(
242
+ ( template ) =>
243
+ DEFAULT_TEMPLATE_SLUGS.includes( template.slug ) &&
244
+ ! existingTemplateSlugs.includes( template.slug )
245
+ );
246
+ const onClickMenuItem = ( _entityForSuggestions ) => {
247
+ setShowCustomTemplateModal( true );
248
+ setEntityForSuggestions( _entityForSuggestions );
249
+ };
250
+ // TODO: find better names for these variables. `useExtraTemplates` returns an array of items.
251
+ const categoryMenuItem = useExtraTemplates(
252
+ categoryTaxonomy,
253
+ entitiesConfig.category,
254
+ onClickMenuItem
255
+ );
256
+ const tagMenuItem = useExtraTemplates(
257
+ tagTaxonomy,
258
+ entitiesConfig.tag,
259
+ onClickMenuItem
260
+ );
261
+ const pageMenuItem = useExtraTemplates(
262
+ pagePostType,
263
+ entitiesConfig.page,
264
+ onClickMenuItem
265
+ );
266
+ // We need to replace existing default template types with
267
+ // the create specific template functionality. The original
268
+ // info (title, description, etc.) is preserved in the
269
+ // `useExtraTemplates` hook.
270
+ const enhancedMissingDefaultTemplateTypes = [ ...missingDefaultTemplates ];
271
+ [ categoryMenuItem, tagMenuItem, pageMenuItem ].forEach( ( menuItem ) => {
272
+ if ( ! menuItem?.length ) {
273
+ return;
274
+ }
275
+ const matchIndex = enhancedMissingDefaultTemplateTypes.findIndex(
276
+ ( template ) => template.slug === menuItem[ 0 ].slug
277
+ );
278
+ // Some default template types might have been filtered above from
279
+ // `missingDefaultTemplates` because they only check for the general
280
+ // template. So here we either replace or append the item, augmented
281
+ // with the check if it has available specific item to create a
282
+ // template for.
283
+ if ( matchIndex > -1 ) {
284
+ enhancedMissingDefaultTemplateTypes.splice(
285
+ matchIndex,
286
+ 1,
287
+ menuItem[ 0 ]
288
+ );
289
+ } else {
290
+ enhancedMissingDefaultTemplateTypes.push( menuItem[ 0 ] );
291
+ }
292
+ } );
146
293
  // Update the sort order to match the DEFAULT_TEMPLATE_SLUGS order.
147
- missingTemplates.sort( ( template1, template2 ) => {
294
+ enhancedMissingDefaultTemplateTypes?.sort( ( template1, template2 ) => {
148
295
  return (
149
296
  DEFAULT_TEMPLATE_SLUGS.indexOf( template1.slug ) -
150
297
  DEFAULT_TEMPLATE_SLUGS.indexOf( template2.slug )
151
298
  );
152
299
  } );
153
-
154
- return (
155
- <DropdownMenu
156
- className="edit-site-new-template-dropdown"
157
- icon={ null }
158
- text={ postType.labels.add_new }
159
- label={ postType.labels.add_new_item }
160
- popoverProps={ {
161
- noArrow: false,
162
- } }
163
- toggleProps={ {
164
- variant: 'primary',
165
- } }
166
- >
167
- { () => (
168
- <NavigableMenu className="edit-site-new-template-dropdown__popover">
169
- <MenuGroup label={ postType.labels.add_new_item }>
170
- { map( missingTemplates, ( template ) => {
171
- const { title, description, slug } = template;
172
- return (
173
- <MenuItem
174
- icon={ TEMPLATE_ICONS[ slug ] }
175
- iconPosition="left"
176
- info={ description }
177
- key={ slug }
178
- onClick={ () => {
179
- createTemplate( template );
180
- // We will be navigated way so no need to close the dropdown.
181
- } }
182
- >
183
- { title }
184
- </MenuItem>
185
- );
186
- } ) }
187
- </MenuGroup>
188
- </NavigableMenu>
189
- ) }
190
- </DropdownMenu>
300
+ const extraPostTypeTemplates = useExtraTemplates(
301
+ postTypes,
302
+ entitiesConfig.postType,
303
+ onClickMenuItem
304
+ );
305
+ const extraTaxonomyTemplates = useExtraTemplates(
306
+ taxonomies,
307
+ entitiesConfig.taxonomy,
308
+ onClickMenuItem
191
309
  );
310
+ const missingTemplates = [
311
+ ...enhancedMissingDefaultTemplateTypes,
312
+ ...extraPostTypeTemplates,
313
+ ...extraTaxonomyTemplates,
314
+ ];
315
+ return missingTemplates;
192
316
  }
@@ -9,3 +9,140 @@
9
9
  }
10
10
  }
11
11
  }
12
+
13
+ .edit-site-custom-template-modal {
14
+ &__contents {
15
+ > div {
16
+ text-align: center;
17
+ cursor: pointer;
18
+ padding: $grid-unit-30;
19
+ border: 1px solid $gray-300;
20
+ border-radius: $radius-block-ui;
21
+ width: 256px;
22
+ display: flex;
23
+ flex-direction: column;
24
+ gap: $grid-unit;
25
+ align-items: center;
26
+ justify-content: center;
27
+
28
+ span {
29
+ color: $gray-700;
30
+ }
31
+
32
+ &:hover {
33
+ border-color: var(--wp-admin-theme-color);
34
+
35
+ h5 {
36
+ color: var(--wp-admin-theme-color);
37
+ }
38
+ }
39
+
40
+ &:focus {
41
+ box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
42
+ }
43
+ }
44
+ }
45
+
46
+ .components-search-control {
47
+ input[type="search"].components-search-control__input {
48
+ background: $white;
49
+ border: 1px solid $gray-300;
50
+
51
+ &:focus {
52
+ border-color: var(--wp-admin-theme-color);
53
+ box-shadow: 0 0 0 1px var(--wp-admin-theme-color);
54
+ }
55
+ }
56
+ }
57
+
58
+ @include break-medium() {
59
+ width: 456px;
60
+ }
61
+ }
62
+
63
+ .edit-site-custom-template-modal__suggestions_list {
64
+ margin-top: $grid-unit-20;
65
+
66
+ @include break-small() {
67
+ height: 232px;
68
+ overflow: scroll;
69
+ }
70
+
71
+ &__list-item {
72
+ display: block;
73
+ width: 100%;
74
+ text-align: left;
75
+ white-space: pre-wrap;
76
+ overflow-wrap: break-word;
77
+ height: auto;
78
+
79
+ mark {
80
+ font-weight: 700;
81
+ background: none;
82
+ }
83
+
84
+ &:hover {
85
+ background-color: $gray-100;
86
+
87
+ mark {
88
+ color: var(--wp-admin-theme-color);
89
+ }
90
+ }
91
+
92
+ &:focus {
93
+ background-color: $gray-100;
94
+ }
95
+
96
+ &:focus:not(:disabled) {
97
+ box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color) inset;
98
+ }
99
+
100
+ &__title,
101
+ &__info {
102
+ overflow: hidden;
103
+ text-overflow: ellipsis;
104
+ display: block;
105
+ }
106
+
107
+ &__title {
108
+ font-weight: 500;
109
+ margin-bottom: 0.2em;
110
+ }
111
+
112
+ &__info {
113
+ color: $gray-700;
114
+ font-size: 0.9em;
115
+ line-height: 1.3;
116
+ word-break: break-all;
117
+ }
118
+ }
119
+ }
120
+
121
+ .edit-site-custom-template-modal__no-results {
122
+ border: 1px solid $gray-400;
123
+ border-radius: $radius-block-ui;
124
+ padding: $grid-unit-20;
125
+ margin-bottom: 0;
126
+ margin-top: $grid-unit-20;
127
+ }
128
+
129
+
130
+ .edit-site-custom-generic-template__modal {
131
+ .components-base-control {
132
+ @include break-medium() {
133
+ width: $grid-unit * 40;
134
+ }
135
+ }
136
+
137
+ .components-modal__header {
138
+ border-bottom: none;
139
+ }
140
+
141
+ .components-modal__content::before {
142
+ margin-bottom: $grid-unit-05;
143
+ }
144
+ }
145
+
146
+ .edit-site-custom-generic-template__modal-actions {
147
+ margin-top: $grid-unit-15;
148
+ }