@wordpress/edit-site 7.3.2-next.v.202608281122.0 → 7.4.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 (131) hide show
  1. package/CHANGELOG.md +17 -1
  2. package/build/components/add-new-template/add-custom-template-modal-content.cjs +3 -1
  3. package/build/components/add-new-template/add-custom-template-modal-content.cjs.map +2 -2
  4. package/build/components/add-new-template/index.cjs +6 -4
  5. package/build/components/add-new-template/index.cjs.map +2 -2
  6. package/build/components/add-new-template/utils.cjs +84 -9
  7. package/build/components/add-new-template/utils.cjs.map +2 -2
  8. package/build/components/dataviews-actions/index.cjs +2 -55
  9. package/build/components/dataviews-actions/index.cjs.map +3 -3
  10. package/build/components/layout/index.cjs +2 -2
  11. package/build/components/layout/index.cjs.map +2 -2
  12. package/build/components/more-menu/welcome-guide-menu-item.cjs +10 -2
  13. package/build/components/more-menu/welcome-guide-menu-item.cjs.map +3 -3
  14. package/build/components/page-templates/fields.cjs +2 -126
  15. package/build/components/page-templates/fields.cjs.map +3 -3
  16. package/build/components/page-templates/index.cjs +46 -230
  17. package/build/components/page-templates/index.cjs.map +3 -3
  18. package/build/components/post-list/index.cjs +7 -17
  19. package/build/components/post-list/index.cjs.map +2 -2
  20. package/build/components/sidebar-global-styles/index.cjs +2 -2
  21. package/build/components/sidebar-global-styles/index.cjs.map +2 -2
  22. package/build/components/sidebar-identity/index.cjs +17 -22
  23. package/build/components/sidebar-identity/index.cjs.map +2 -2
  24. package/build/components/sidebar-navigation-item/index.cjs +1 -8
  25. package/build/components/sidebar-navigation-item/index.cjs.map +2 -2
  26. package/build/components/sidebar-navigation-screen-templates-browse/content.cjs +34 -72
  27. package/build/components/sidebar-navigation-screen-templates-browse/content.cjs.map +3 -3
  28. package/build/components/sidebar-navigation-screen-templates-browse/index.cjs +1 -2
  29. package/build/components/sidebar-navigation-screen-templates-browse/index.cjs.map +3 -3
  30. package/build/components/site-editor-routes/templates.cjs +2 -4
  31. package/build/components/site-editor-routes/templates.cjs.map +3 -3
  32. package/build/index.cjs +0 -1
  33. package/build/index.cjs.map +2 -2
  34. package/build-module/components/add-new-template/add-custom-template-modal-content.mjs +3 -1
  35. package/build-module/components/add-new-template/add-custom-template-modal-content.mjs.map +2 -2
  36. package/build-module/components/add-new-template/index.mjs +7 -4
  37. package/build-module/components/add-new-template/index.mjs.map +2 -2
  38. package/build-module/components/add-new-template/utils.mjs +84 -9
  39. package/build-module/components/add-new-template/utils.mjs.map +2 -2
  40. package/build-module/components/dataviews-actions/index.mjs +1 -53
  41. package/build-module/components/dataviews-actions/index.mjs.map +2 -2
  42. package/build-module/components/layout/index.mjs +2 -2
  43. package/build-module/components/layout/index.mjs.map +2 -2
  44. package/build-module/components/more-menu/welcome-guide-menu-item.mjs +10 -2
  45. package/build-module/components/more-menu/welcome-guide-menu-item.mjs.map +2 -2
  46. package/build-module/components/page-templates/fields.mjs +3 -129
  47. package/build-module/components/page-templates/fields.mjs.map +3 -3
  48. package/build-module/components/page-templates/index.mjs +52 -253
  49. package/build-module/components/page-templates/index.mjs.map +2 -2
  50. package/build-module/components/post-list/index.mjs +8 -18
  51. package/build-module/components/post-list/index.mjs.map +2 -2
  52. package/build-module/components/sidebar-global-styles/index.mjs +2 -2
  53. package/build-module/components/sidebar-global-styles/index.mjs.map +2 -2
  54. package/build-module/components/sidebar-identity/index.mjs +17 -22
  55. package/build-module/components/sidebar-identity/index.mjs.map +2 -2
  56. package/build-module/components/sidebar-navigation-item/index.mjs +1 -8
  57. package/build-module/components/sidebar-navigation-item/index.mjs.map +2 -2
  58. package/build-module/components/sidebar-navigation-screen-templates-browse/content.mjs +42 -75
  59. package/build-module/components/sidebar-navigation-screen-templates-browse/content.mjs.map +2 -2
  60. package/build-module/components/sidebar-navigation-screen-templates-browse/index.mjs +1 -2
  61. package/build-module/components/sidebar-navigation-screen-templates-browse/index.mjs.map +2 -2
  62. package/build-module/components/site-editor-routes/templates.mjs +2 -4
  63. package/build-module/components/site-editor-routes/templates.mjs.map +2 -2
  64. package/build-module/index.mjs +0 -1
  65. package/build-module/index.mjs.map +2 -2
  66. package/build-style/style-rtl.css +38 -81
  67. package/build-style/style.css +38 -81
  68. package/package.json +41 -38
  69. package/src/components/add-new-template/add-custom-template-modal-content.jsx +3 -1
  70. package/src/components/add-new-template/index.jsx +9 -4
  71. package/src/components/add-new-template/style.scss +8 -21
  72. package/src/components/add-new-template/utils.js +118 -9
  73. package/src/components/dataviews-actions/index.js +0 -61
  74. package/src/components/layout/index.jsx +5 -2
  75. package/src/components/more-menu/welcome-guide-menu-item.jsx +8 -3
  76. package/src/components/page-templates/fields.jsx +2 -146
  77. package/src/components/page-templates/index.jsx +30 -256
  78. package/src/components/post-list/index.jsx +7 -20
  79. package/src/components/sidebar-global-styles/index.jsx +7 -5
  80. package/src/components/sidebar-global-styles/style.scss +6 -0
  81. package/src/components/sidebar-identity/index.jsx +23 -19
  82. package/src/components/sidebar-identity/style.scss +7 -0
  83. package/src/components/sidebar-navigation-item/index.jsx +1 -7
  84. package/src/components/sidebar-navigation-screen-templates-browse/content.jsx +45 -80
  85. package/src/components/sidebar-navigation-screen-templates-browse/index.jsx +1 -8
  86. package/src/components/site-editor-routes/templates.jsx +2 -19
  87. package/src/components/welcome-guide/style.scss +1 -1
  88. package/src/index.jsx +0 -1
  89. package/src/style.scss +1 -1
  90. package/src/utils/test/get-filtered-template-parts.js +1 -0
  91. package/build/components/add-new-template-legacy/add-custom-generic-template-modal-content.cjs +0 -107
  92. package/build/components/add-new-template-legacy/add-custom-generic-template-modal-content.cjs.map +0 -7
  93. package/build/components/add-new-template-legacy/add-custom-template-modal-content.cjs +0 -327
  94. package/build/components/add-new-template-legacy/add-custom-template-modal-content.cjs.map +0 -7
  95. package/build/components/add-new-template-legacy/index.cjs +0 -390
  96. package/build/components/add-new-template-legacy/index.cjs.map +0 -7
  97. package/build/components/add-new-template-legacy/utils.cjs +0 -623
  98. package/build/components/add-new-template-legacy/utils.cjs.map +0 -7
  99. package/build/components/page-templates/hooks.cjs +0 -94
  100. package/build/components/page-templates/hooks.cjs.map +0 -7
  101. package/build/components/page-templates/index-legacy.cjs +0 -167
  102. package/build/components/page-templates/index-legacy.cjs.map +0 -7
  103. package/build/components/page-templates/view-utils.cjs +0 -79
  104. package/build/components/page-templates/view-utils.cjs.map +0 -7
  105. package/build/components/sidebar-navigation-screen-templates-browse/content-legacy.cjs +0 -78
  106. package/build/components/sidebar-navigation-screen-templates-browse/content-legacy.cjs.map +0 -7
  107. package/build-module/components/add-new-template-legacy/add-custom-generic-template-modal-content.mjs +0 -91
  108. package/build-module/components/add-new-template-legacy/add-custom-generic-template-modal-content.mjs.map +0 -7
  109. package/build-module/components/add-new-template-legacy/add-custom-template-modal-content.mjs +0 -315
  110. package/build-module/components/add-new-template-legacy/add-custom-template-modal-content.mjs.map +0 -7
  111. package/build-module/components/add-new-template-legacy/index.mjs +0 -391
  112. package/build-module/components/add-new-template-legacy/index.mjs.map +0 -7
  113. package/build-module/components/add-new-template-legacy/utils.mjs +0 -592
  114. package/build-module/components/add-new-template-legacy/utils.mjs.map +0 -7
  115. package/build-module/components/page-templates/hooks.mjs +0 -74
  116. package/build-module/components/page-templates/hooks.mjs.map +0 -7
  117. package/build-module/components/page-templates/index-legacy.mjs +0 -136
  118. package/build-module/components/page-templates/index-legacy.mjs.map +0 -7
  119. package/build-module/components/page-templates/view-utils.mjs +0 -52
  120. package/build-module/components/page-templates/view-utils.mjs.map +0 -7
  121. package/build-module/components/sidebar-navigation-screen-templates-browse/content-legacy.mjs +0 -52
  122. package/build-module/components/sidebar-navigation-screen-templates-browse/content-legacy.mjs.map +0 -7
  123. package/src/components/add-new-template-legacy/add-custom-generic-template-modal-content.jsx +0 -85
  124. package/src/components/add-new-template-legacy/add-custom-template-modal-content.jsx +0 -306
  125. package/src/components/add-new-template-legacy/index.jsx +0 -440
  126. package/src/components/add-new-template-legacy/utils.js +0 -757
  127. package/src/components/page-templates/hooks.js +0 -93
  128. package/src/components/page-templates/index-legacy.jsx +0 -143
  129. package/src/components/page-templates/view-utils.js +0 -50
  130. package/src/components/sidebar-navigation-screen-templates-browse/content-legacy.jsx +0 -52
  131. package/src/components/sidebar-navigation-screen-templates-browse/style.scss +0 -6
@@ -1,440 +0,0 @@
1
- import clsx from 'clsx';
2
- import {
3
- Button,
4
- Modal,
5
- __experimentalGrid as Grid,
6
- __experimentalText as WCText,
7
- __experimentalVStack as VStack,
8
- Flex,
9
- Icon as WCIcon,
10
- } from '@wordpress/components';
11
- import { decodeEntities } from '@wordpress/html-entities';
12
- import { useState, memo, useRef, useEffect } from '@wordpress/element';
13
- import { useSelect, useDispatch } from '@wordpress/data';
14
- import { store as coreStore } from '@wordpress/core-data';
15
- import { useViewportMatch } from '@wordpress/compose';
16
- import {
17
- archive,
18
- blockMeta,
19
- calendar,
20
- category,
21
- commentAuthorAvatar,
22
- pencil,
23
- home,
24
- layout,
25
- list,
26
- media,
27
- notFound,
28
- page,
29
- pin,
30
- verse,
31
- search,
32
- tag,
33
- } from '@wordpress/icons';
34
- import { __, sprintf } from '@wordpress/i18n';
35
- import { store as noticesStore } from '@wordpress/notices';
36
- import { privateApis as routerPrivateApis } from '@wordpress/router';
37
- import { focus } from '@wordpress/dom';
38
- import { TEMPLATE_POST_TYPE } from '../../utils/constants';
39
- import AddCustomTemplateModalContent from './add-custom-template-modal-content';
40
- import {
41
- useExistingTemplates,
42
- useDefaultTemplateTypes,
43
- useTaxonomiesMenuItems,
44
- usePostTypeMenuItems,
45
- useAuthorMenuItem,
46
- usePostTypeArchiveMenuItems,
47
- } from './utils';
48
- import AddCustomGenericTemplateModalContent from './add-custom-generic-template-modal-content';
49
- import { unlock } from '../../lock-unlock';
50
-
51
- const { useHistory } = unlock( routerPrivateApis );
52
-
53
- const DEFAULT_TEMPLATE_SLUGS = [
54
- 'front-page',
55
- 'home',
56
- 'single',
57
- 'page',
58
- 'index',
59
- 'archive',
60
- 'author',
61
- 'category',
62
- 'date',
63
- 'tag',
64
- 'search',
65
- '404',
66
- ];
67
-
68
- const TEMPLATE_ICONS = {
69
- 'front-page': home,
70
- home: verse,
71
- single: pin,
72
- page,
73
- archive,
74
- search,
75
- 404: notFound,
76
- index: list,
77
- category,
78
- author: commentAuthorAvatar,
79
- taxonomy: blockMeta,
80
- date: calendar,
81
- tag,
82
- attachment: media,
83
- };
84
-
85
- function TemplateListItem( {
86
- title,
87
- direction,
88
- className,
89
- description,
90
- icon,
91
- onClick,
92
- children,
93
- } ) {
94
- return (
95
- <Button
96
- __next40pxDefaultSize
97
- className={ className }
98
- onClick={ onClick }
99
- label={ description }
100
- showTooltip={ !! description }
101
- >
102
- <Flex
103
- as="span"
104
- spacing={ 2 }
105
- align="center"
106
- justify="center"
107
- style={ { width: '100%' } }
108
- direction={ direction }
109
- >
110
- <div className="edit-site-add-new-template__template-icon">
111
- <WCIcon icon={ icon } />
112
- </div>
113
- <VStack
114
- className="edit-site-add-new-template__template-name"
115
- alignment="center"
116
- spacing={ 0 }
117
- >
118
- <WCText
119
- align="center"
120
- weight="var(--wpds-typography-font-weight-emphasis)"
121
- lineHeight={ 1.53846153846 } // 20px
122
- >
123
- { title }
124
- </WCText>
125
- { children }
126
- </VStack>
127
- </Flex>
128
- </Button>
129
- );
130
- }
131
-
132
- const modalContentMap = {
133
- templatesList: 1,
134
- customTemplate: 2,
135
- customGenericTemplate: 3,
136
- };
137
-
138
- function NewTemplateModal( { onClose } ) {
139
- const [ modalContent, setModalContent ] = useState(
140
- modalContentMap.templatesList
141
- );
142
- const [ entityForSuggestions, setEntityForSuggestions ] = useState( {} );
143
- const [ isSubmitting, setIsSubmitting ] = useState( false );
144
- const missingTemplates = useMissingTemplates( setEntityForSuggestions, () =>
145
- setModalContent( modalContentMap.customTemplate )
146
- );
147
- const history = useHistory();
148
- const { saveEntityRecord } = useDispatch( coreStore );
149
- const { createErrorNotice, createSuccessNotice } =
150
- useDispatch( noticesStore );
151
- const containerRef = useRef( null );
152
- const isMobile = useViewportMatch( 'medium', '<' );
153
-
154
- const homeUrl = useSelect( ( select ) => {
155
- // Site index.
156
- return select( coreStore ).getEntityRecord( 'root', '__unstableBase' )
157
- ?.home;
158
- }, [] );
159
-
160
- const TEMPLATE_SHORT_DESCRIPTIONS = {
161
- 'front-page': homeUrl,
162
- date: sprintf(
163
- // translators: %s: The homepage url.
164
- __( 'E.g. %s' ),
165
- homeUrl + '/' + new Date().getFullYear()
166
- ),
167
- };
168
-
169
- useEffect( () => {
170
- // Focus the first focusable element when component mounts or UI changes
171
- // We don't want to focus on the other modals because they have their own focus management.
172
- if (
173
- containerRef.current &&
174
- modalContent === modalContentMap.templatesList
175
- ) {
176
- const [ firstFocusable ] = focus.focusable.find(
177
- containerRef.current
178
- );
179
- firstFocusable?.focus();
180
- }
181
- }, [ modalContent ] );
182
-
183
- async function createTemplate( template, isWPSuggestion = true ) {
184
- if ( isSubmitting ) {
185
- return;
186
- }
187
- setIsSubmitting( true );
188
- try {
189
- const { title, description, slug } = template;
190
- const newTemplate = await saveEntityRecord(
191
- 'postType',
192
- TEMPLATE_POST_TYPE,
193
- {
194
- description,
195
- // Slugs need to be strings, so this is for template `404`
196
- slug: slug.toString(),
197
- status: 'publish',
198
- title,
199
- // This adds a post meta field in template that is part of `is_custom` value calculation.
200
- is_wp_suggestion: isWPSuggestion,
201
- },
202
- { throwOnError: true }
203
- );
204
-
205
- // Navigate to the created template editor.
206
- history.navigate(
207
- `/${ TEMPLATE_POST_TYPE }/${ newTemplate.id }?canvas=edit`
208
- );
209
-
210
- createSuccessNotice(
211
- sprintf(
212
- // translators: %s: Title of the created post or template, e.g: "Hello world".
213
- __( '"%s" successfully created.' ),
214
- decodeEntities( newTemplate.title?.rendered || title ) ||
215
- __( '(no title)' )
216
- ),
217
- {
218
- type: 'snackbar',
219
- }
220
- );
221
- } catch ( error ) {
222
- const errorMessage =
223
- error.message && error.code !== 'unknown_error'
224
- ? error.message
225
- : __( 'An error occurred while creating the template.' );
226
-
227
- createErrorNotice( errorMessage, {
228
- type: 'snackbar',
229
- } );
230
- } finally {
231
- setIsSubmitting( false );
232
- }
233
- }
234
- const onModalClose = () => {
235
- onClose();
236
- setModalContent( modalContentMap.templatesList );
237
- };
238
-
239
- let modalTitle = __( 'Add template' );
240
- if ( modalContent === modalContentMap.customTemplate ) {
241
- modalTitle = sprintf(
242
- // translators: %s: Name of the post type e.g: "Post".
243
- __( 'Add template: %s' ),
244
- entityForSuggestions.labels.singular_name
245
- );
246
- } else if ( modalContent === modalContentMap.customGenericTemplate ) {
247
- modalTitle = __( 'Create custom template' );
248
- }
249
-
250
- return (
251
- <Modal
252
- title={ modalTitle }
253
- className={ clsx( 'edit-site-add-new-template__modal', {
254
- 'edit-site-add-new-template__modal_template_list':
255
- modalContent === modalContentMap.templatesList,
256
- 'edit-site-custom-template-modal':
257
- modalContent === modalContentMap.customTemplate,
258
- } ) }
259
- onRequestClose={ onModalClose }
260
- overlayClassName={
261
- modalContent === modalContentMap.customGenericTemplate
262
- ? 'edit-site-custom-generic-template__modal'
263
- : undefined
264
- }
265
- ref={ containerRef }
266
- >
267
- { modalContent === modalContentMap.templatesList && (
268
- <Grid
269
- columns={ isMobile ? 2 : 3 }
270
- gap={ 4 }
271
- align="flex-start"
272
- justify="center"
273
- className="edit-site-add-new-template__template-list__contents"
274
- >
275
- <Flex className="edit-site-add-new-template__template-list__prompt">
276
- { __(
277
- 'Select what the new template should apply to:'
278
- ) }
279
- </Flex>
280
- { missingTemplates.map( ( template ) => {
281
- const { title, slug, onClick } = template;
282
- return (
283
- <TemplateListItem
284
- key={ slug }
285
- title={ title }
286
- direction="column"
287
- className="edit-site-add-new-template__template-button"
288
- description={
289
- TEMPLATE_SHORT_DESCRIPTIONS[ slug ]
290
- }
291
- icon={ TEMPLATE_ICONS[ slug ] || layout }
292
- onClick={ () =>
293
- onClick
294
- ? onClick( template )
295
- : createTemplate( template )
296
- }
297
- />
298
- );
299
- } ) }
300
- <TemplateListItem
301
- title={ __( 'Custom template' ) }
302
- direction="row"
303
- className="edit-site-add-new-template__custom-template-button"
304
- icon={ pencil }
305
- onClick={ () =>
306
- setModalContent(
307
- modalContentMap.customGenericTemplate
308
- )
309
- }
310
- >
311
- <WCText
312
- lineHeight={ 1.53846153846 } // 20px
313
- >
314
- { __(
315
- 'A custom template can be manually applied to any post or page.'
316
- ) }
317
- </WCText>
318
- </TemplateListItem>
319
- </Grid>
320
- ) }
321
- { modalContent === modalContentMap.customTemplate && (
322
- <AddCustomTemplateModalContent
323
- onSelect={ createTemplate }
324
- entityForSuggestions={ entityForSuggestions }
325
- onBack={ () =>
326
- setModalContent( modalContentMap.templatesList )
327
- }
328
- containerRef={ containerRef }
329
- />
330
- ) }
331
- { modalContent === modalContentMap.customGenericTemplate && (
332
- <AddCustomGenericTemplateModalContent
333
- createTemplate={ createTemplate }
334
- onBack={ () =>
335
- setModalContent( modalContentMap.templatesList )
336
- }
337
- />
338
- ) }
339
- </Modal>
340
- );
341
- }
342
-
343
- function NewTemplate() {
344
- const [ showModal, setShowModal ] = useState( false );
345
-
346
- const { postType } = useSelect( ( select ) => {
347
- const { getPostType } = select( coreStore );
348
-
349
- return {
350
- postType: getPostType( TEMPLATE_POST_TYPE ),
351
- };
352
- }, [] );
353
-
354
- if ( ! postType ) {
355
- return null;
356
- }
357
-
358
- return (
359
- <>
360
- <Button
361
- variant="primary"
362
- onClick={ () => setShowModal( true ) }
363
- label={ postType.labels.add_new_item }
364
- size="compact"
365
- __next40pxDefaultSize
366
- >
367
- { postType.labels.add_new_item }
368
- </Button>
369
- { showModal && (
370
- <NewTemplateModal onClose={ () => setShowModal( false ) } />
371
- ) }
372
- </>
373
- );
374
- }
375
-
376
- function useMissingTemplates( setEntityForSuggestions, onClick ) {
377
- const existingTemplates = useExistingTemplates();
378
- const defaultTemplateTypes = useDefaultTemplateTypes();
379
- const existingTemplateSlugs = ( existingTemplates || [] ).map(
380
- ( { slug } ) => slug
381
- );
382
- const missingDefaultTemplates = ( defaultTemplateTypes || [] ).filter(
383
- ( template ) =>
384
- DEFAULT_TEMPLATE_SLUGS.includes( template.slug ) &&
385
- ! existingTemplateSlugs.includes( template.slug )
386
- );
387
- const onClickMenuItem = ( _entityForSuggestions ) => {
388
- onClick?.();
389
- setEntityForSuggestions( _entityForSuggestions );
390
- };
391
- // We need to replace existing default template types with
392
- // the create specific template functionality. The original
393
- // info (title, description, etc.) is preserved in the
394
- // used hooks.
395
- const enhancedMissingDefaultTemplateTypes = [ ...missingDefaultTemplates ];
396
- const { defaultTaxonomiesMenuItems, taxonomiesMenuItems } =
397
- useTaxonomiesMenuItems( onClickMenuItem );
398
- const { defaultPostTypesMenuItems, postTypesMenuItems } =
399
- usePostTypeMenuItems( onClickMenuItem );
400
-
401
- const authorMenuItem = useAuthorMenuItem( onClickMenuItem );
402
- [
403
- ...defaultTaxonomiesMenuItems,
404
- ...defaultPostTypesMenuItems,
405
- authorMenuItem,
406
- ].forEach( ( menuItem ) => {
407
- if ( ! menuItem ) {
408
- return;
409
- }
410
- const matchIndex = enhancedMissingDefaultTemplateTypes.findIndex(
411
- ( template ) => template.slug === menuItem.slug
412
- );
413
- // Some default template types might have been filtered above from
414
- // `missingDefaultTemplates` because they only check for the general
415
- // template. So here we either replace or append the item, augmented
416
- // with the check if it has available specific item to create a
417
- // template for.
418
- if ( matchIndex > -1 ) {
419
- enhancedMissingDefaultTemplateTypes[ matchIndex ] = menuItem;
420
- } else {
421
- enhancedMissingDefaultTemplateTypes.push( menuItem );
422
- }
423
- } );
424
- // Update the sort order to match the DEFAULT_TEMPLATE_SLUGS order.
425
- enhancedMissingDefaultTemplateTypes?.sort( ( template1, template2 ) => {
426
- return (
427
- DEFAULT_TEMPLATE_SLUGS.indexOf( template1.slug ) -
428
- DEFAULT_TEMPLATE_SLUGS.indexOf( template2.slug )
429
- );
430
- } );
431
- const missingTemplates = [
432
- ...enhancedMissingDefaultTemplateTypes,
433
- ...usePostTypeArchiveMenuItems(),
434
- ...postTypesMenuItems,
435
- ...taxonomiesMenuItems,
436
- ];
437
- return missingTemplates;
438
- }
439
-
440
- export default memo( NewTemplate );