@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,56 +1,42 @@
1
1
  import { Page } from '@wordpress/admin-ui';
2
- import { __, sprintf } from '@wordpress/i18n';
3
- import { decodeEntities } from '@wordpress/html-entities';
2
+ import { __ } from '@wordpress/i18n';
4
3
  import { useState, useMemo, useCallback } from '@wordpress/element';
5
- import {
6
- privateApis as corePrivateApis,
7
- store as coreStore,
8
- } from '@wordpress/core-data';
4
+ import { privateApis as corePrivateApis } from '@wordpress/core-data';
9
5
  import { DataViews, filterSortAndPaginate } from '@wordpress/dataviews';
10
6
  import { privateApis as routerPrivateApis } from '@wordpress/router';
11
7
  import { privateApis as editorPrivateApis } from '@wordpress/editor';
12
8
  import { addQueryArgs } from '@wordpress/url';
13
- import { useSelect, useDispatch } from '@wordpress/data';
14
9
  import { useEvent } from '@wordpress/compose';
15
- import { useView } from '@wordpress/views';
16
- import { Modal } from '@wordpress/components';
17
- import { store as noticesStore } from '@wordpress/notices';
10
+ import { useView, useViewConfig } from '@wordpress/views';
18
11
  import AddNewTemplate from '../add-new-template';
19
12
  import { TEMPLATE_POST_TYPE } from '../../utils/constants';
20
13
  import { unlock } from '../../lock-unlock';
21
- import {
22
- useEditPostAction,
23
- useSetActiveTemplateAction,
24
- } from '../dataviews-actions';
25
- import {
26
- authorField,
27
- descriptionField,
28
- previewField,
29
- activeField,
30
- slugField,
31
- useThemeField,
32
- } from './fields';
33
- import {
34
- defaultLayouts,
35
- DEFAULT_VIEW,
36
- getActiveViewOverridesForTab,
37
- } from './view-utils';
14
+ import { useEditPostAction } from '../dataviews-actions';
15
+ import { previewField } from './fields';
38
16
 
39
- const { usePostActions, usePostFields, templateTitleField } =
40
- unlock( editorPrivateApis );
17
+ const { usePostActions, usePostFields } = unlock( editorPrivateApis );
41
18
  const { useHistory, useLocation } = unlock( routerPrivateApis );
42
19
  const { useEntityRecordsWithPermissions } = unlock( corePrivateApis );
43
20
 
21
+ const VIEW_CONFIG_FIELDS = [ 'default_view', 'default_layouts', 'view_list' ];
22
+
44
23
  export default function PageTemplates() {
45
24
  const { path, query } = useLocation();
46
- const { activeView = 'active', postId } = query;
25
+ const { activeView = 'all', postId } = query;
47
26
  const [ selection, setSelection ] = useState( [ postId ] );
48
- const [ selectedRegisteredTemplate, setSelectedRegisteredTemplate ] =
49
- useState( false );
50
- const defaultView = DEFAULT_VIEW;
27
+
28
+ const {
29
+ default_view: defaultView,
30
+ default_layouts: defaultLayouts,
31
+ view_list: viewList,
32
+ } = useViewConfig( {
33
+ kind: 'postType',
34
+ name: TEMPLATE_POST_TYPE,
35
+ fields: VIEW_CONFIG_FIELDS,
36
+ } );
51
37
  const activeViewOverrides = useMemo(
52
- () => getActiveViewOverridesForTab( activeView ),
53
- [ activeView ]
38
+ () => viewList?.find( ( v ) => v.slug === activeView )?.view ?? {},
39
+ [ viewList, activeView ]
54
40
  );
55
41
  const { view, updateView, isModified, resetToDefault } = useView( {
56
42
  kind: 'postType',
@@ -58,6 +44,7 @@ export default function PageTemplates() {
58
44
  slug: 'default',
59
45
  defaultView,
60
46
  activeViewOverrides,
47
+ defaultLayouts,
61
48
  queryParams: {
62
49
  page: query.pageNumber,
63
50
  search: query.search,
@@ -73,129 +60,10 @@ export default function PageTemplates() {
73
60
  },
74
61
  } );
75
62
 
76
- const { activeTemplatesOption, activeTheme, defaultTemplateTypes } =
77
- useSelect( ( select ) => {
78
- const { getEntityRecord, getCurrentTheme } = select( coreStore );
79
- return {
80
- activeTemplatesOption: getEntityRecord( 'root', 'site' )
81
- ?.active_templates,
82
- activeTheme: getCurrentTheme(),
83
- defaultTemplateTypes:
84
- select( coreStore ).getCurrentTheme()
85
- ?.default_template_types,
86
- };
87
- } );
88
- // Todo: this will have to be better so that we're not fetching all the
89
- // records all the time. Active templates query will need to move server
90
- // side.
91
- const { records: userRecords, isResolving: isLoadingUserRecords } =
63
+ const { records, isResolving: isLoadingData } =
92
64
  useEntityRecordsWithPermissions( 'postType', TEMPLATE_POST_TYPE, {
93
65
  per_page: -1,
94
- combinedTemplates: false,
95
- } );
96
- const { records: staticRecords, isResolving: isLoadingStaticData } =
97
- useEntityRecordsWithPermissions( 'root', 'registeredTemplate', {
98
- // This should not be needed, the endpoint returns all registered
99
- // templates, but it's not possible right now to turn off pagination
100
- // for entity configs.
101
- per_page: -1,
102
66
  } );
103
-
104
- const activeTemplates = useMemo( () => {
105
- const _active = [ ...staticRecords ];
106
- if ( activeTemplatesOption ) {
107
- for ( const activeSlug in activeTemplatesOption ) {
108
- const activeId = activeTemplatesOption[ activeSlug ];
109
- // Replace the template in the array.
110
- const template = userRecords.find(
111
- ( userRecord ) =>
112
- userRecord.id === activeId &&
113
- userRecord.theme === activeTheme.stylesheet
114
- );
115
- if ( template ) {
116
- const index = _active.findIndex(
117
- ( { slug } ) => slug === template.slug
118
- );
119
- if ( index !== -1 ) {
120
- _active[ index ] = template;
121
- } else {
122
- _active.push( template );
123
- }
124
- }
125
- }
126
- }
127
- return _active;
128
- }, [ userRecords, staticRecords, activeTemplatesOption, activeTheme ] );
129
-
130
- let isLoadingData;
131
- if ( activeView === 'active' ) {
132
- isLoadingData = isLoadingUserRecords || isLoadingStaticData;
133
- } else if ( activeView === 'user' ) {
134
- isLoadingData = isLoadingUserRecords;
135
- } else {
136
- isLoadingData = isLoadingStaticData;
137
- }
138
-
139
- const records = useMemo( () => {
140
- function isCustom( record ) {
141
- // For registered templates, the is_custom field is defined.
142
- return (
143
- record.is_custom ??
144
- // For user templates it's custom if the is_wp_suggestion meta
145
- // field is not set and the slug is not found in the default
146
- // template types.
147
- ( ! record.meta?.is_wp_suggestion &&
148
- ! defaultTemplateTypes.some(
149
- ( type ) => type.slug === record.slug
150
- ) )
151
- );
152
- }
153
-
154
- let _records;
155
- if ( activeView === 'active' ) {
156
- // Don't show active custom templates in the active view.
157
- _records = activeTemplates.filter(
158
- ( record ) => ! isCustom( record )
159
- );
160
- } else if ( activeView === 'user' ) {
161
- _records = userRecords;
162
- } else {
163
- _records = staticRecords;
164
- }
165
- return _records.map( ( record ) => ( {
166
- ...record,
167
- _isActive: activeTemplates.some(
168
- ( template ) => template.id === record.id
169
- ),
170
- _isCustom: isCustom( record ),
171
- } ) );
172
- }, [
173
- activeTemplates,
174
- defaultTemplateTypes,
175
- userRecords,
176
- staticRecords,
177
- activeView,
178
- ] );
179
-
180
- const users = useSelect(
181
- ( select ) => {
182
- const { getUser } = select( coreStore );
183
- return records.reduce( ( acc, record ) => {
184
- if ( record.author_text ) {
185
- if ( ! acc[ record.author_text ] ) {
186
- acc[ record.author_text ] = record.author_text;
187
- }
188
- } else if ( record.author ) {
189
- if ( ! acc[ record.author ] ) {
190
- acc[ record.author ] = getUser( record.author );
191
- }
192
- }
193
- return acc;
194
- }, {} );
195
- },
196
- [ records ]
197
- );
198
-
199
67
  const history = useHistory();
200
68
  const onChangeSelection = useCallback(
201
69
  ( items ) => {
@@ -211,95 +79,23 @@ export default function PageTemplates() {
211
79
  [ history, path, view?.type ]
212
80
  );
213
81
 
214
- const postTypeFields = usePostFields( {
215
- postType: TEMPLATE_POST_TYPE,
216
- } );
217
- const dateField = postTypeFields.find( ( field ) => field.id === 'date' );
218
- const themeField = useThemeField();
82
+ const postFields = usePostFields( { postType: TEMPLATE_POST_TYPE } );
219
83
  const fields = useMemo( () => {
220
- const _fields = [
221
- previewField,
222
- templateTitleField,
223
- descriptionField,
224
- activeField,
225
- slugField,
226
- ];
227
- if ( activeView === 'user' ) {
228
- _fields.push( themeField );
229
- if ( dateField ) {
230
- _fields.push( dateField );
231
- }
232
- }
233
- const elements = [];
234
- for ( const author in users ) {
235
- elements.push( {
236
- value: users[ author ]?.id ?? author,
237
- label: users[ author ]?.name ?? author,
238
- } );
239
- }
240
- _fields.push( {
241
- ...authorField,
242
- elements,
243
- } );
244
- return _fields;
245
- }, [ users, activeView, themeField, dateField ] );
84
+ return [ previewField, ...( postFields || [] ) ];
85
+ }, [ postFields ] );
246
86
 
247
87
  const { data, paginationInfo } = useMemo( () => {
248
88
  return filterSortAndPaginate( records, view, fields );
249
89
  }, [ records, view, fields ] );
250
90
 
251
- const { createSuccessNotice } = useDispatch( noticesStore );
252
- const onActionPerformed = useCallback(
253
- ( actionId, items ) => {
254
- switch ( actionId ) {
255
- case 'duplicate-post':
256
- {
257
- const newItem = items[ 0 ];
258
- const _title =
259
- typeof newItem.title === 'string'
260
- ? newItem.title
261
- : newItem.title?.rendered;
262
- history.navigate( `/template?activeView=user` );
263
- createSuccessNotice(
264
- sprintf(
265
- // translators: %s: Title of the created post or template, e.g: "Hello world".
266
- __( '"%s" successfully created.' ),
267
- decodeEntities( _title ) || __( '(no title)' )
268
- ),
269
- {
270
- type: 'snackbar',
271
- id: 'duplicate-post-action',
272
- actions: [
273
- {
274
- label: __( 'Edit' ),
275
- onClick: () => {
276
- history.navigate(
277
- `/${ newItem.type }/${ newItem.id }?canvas=edit`
278
- );
279
- },
280
- },
281
- ],
282
- }
283
- );
284
- }
285
- break;
286
- }
287
- },
288
- [ history, createSuccessNotice ]
289
- );
290
91
  const postTypeActions = usePostActions( {
291
92
  postType: TEMPLATE_POST_TYPE,
292
93
  context: 'list',
293
- onActionPerformed,
294
94
  } );
295
95
  const editAction = useEditPostAction();
296
- const setActiveTemplateAction = useSetActiveTemplateAction();
297
96
  const actions = useMemo(
298
- () =>
299
- activeView === 'user'
300
- ? [ setActiveTemplateAction, editAction, ...postTypeActions ]
301
- : [ setActiveTemplateAction, ...postTypeActions ],
302
- [ postTypeActions, setActiveTemplateAction, editAction, activeView ]
97
+ () => [ editAction, ...postTypeActions ],
98
+ [ postTypeActions, editAction ]
303
99
  );
304
100
 
305
101
  const onChangeView = useEvent( ( newView ) => {
@@ -310,10 +106,6 @@ export default function PageTemplates() {
310
106
  }
311
107
  } );
312
108
 
313
- const duplicateAction = actions.find(
314
- ( action ) => action.id === 'duplicate-post'
315
- );
316
-
317
109
  return (
318
110
  <Page
319
111
  className="edit-site-page-templates"
@@ -332,14 +124,8 @@ export default function PageTemplates() {
332
124
  onChangeView={ onChangeView }
333
125
  onChangeSelection={ onChangeSelection }
334
126
  isItemClickable={ () => true }
335
- onClickItem={ ( item ) => {
336
- if ( typeof item.id === 'string' ) {
337
- setSelectedRegisteredTemplate( item );
338
- } else {
339
- history.navigate(
340
- `/${ item.type }/${ item.id }?canvas=edit`
341
- );
342
- }
127
+ onClickItem={ ( { id } ) => {
128
+ history.navigate( `/wp_template/${ id }?canvas=edit` );
343
129
  } }
344
130
  selection={ selection }
345
131
  defaultLayouts={ defaultLayouts }
@@ -352,18 +138,6 @@ export default function PageTemplates() {
352
138
  : false
353
139
  }
354
140
  />
355
- { selectedRegisteredTemplate && duplicateAction && (
356
- <Modal
357
- title={ __( 'Duplicate' ) }
358
- onRequestClose={ () => setSelectedRegisteredTemplate() }
359
- size="small"
360
- >
361
- <duplicateAction.RenderModal
362
- items={ [ selectedRegisteredTemplate ] }
363
- closeModal={ () => setSelectedRegisteredTemplate() }
364
- />
365
- </Modal>
366
- ) }
367
141
  </Page>
368
142
  );
369
143
  }
@@ -7,7 +7,7 @@ import {
7
7
  import { useState, useMemo, useCallback, useEffect } from '@wordpress/element';
8
8
  import { privateApis as routerPrivateApis } from '@wordpress/router';
9
9
  import { useSelect } from '@wordpress/data';
10
- import { DataViews, filterSortAndPaginate } from '@wordpress/dataviews';
10
+ import { DataViews } from '@wordpress/dataviews';
11
11
  import { privateApis as editorPrivateApis } from '@wordpress/editor';
12
12
  import { useEvent, usePrevious } from '@wordpress/compose';
13
13
  import { addQueryArgs } from '@wordpress/url';
@@ -176,27 +176,14 @@ export default function PostList( { postType } ) {
176
176
  const { notesCount, isLoading: isLoadingNotesCount } =
177
177
  useNotesCount( postIds );
178
178
 
179
- // The REST API sort the authors by ID, but we want to sort them by name.
180
- const data = useMemo( () => {
181
- let processedRecords = records;
182
-
183
- if ( view?.sort?.field === 'author' ) {
184
- processedRecords = filterSortAndPaginate(
185
- records,
186
- { sort: { ...view.sort } },
187
- fields
188
- ).data;
189
- }
190
-
191
- if ( processedRecords ) {
192
- return processedRecords.map( ( record ) => ( {
179
+ const data = useMemo(
180
+ () =>
181
+ records?.map( ( record ) => ( {
193
182
  ...record,
194
183
  notesCount: notesCount[ record.id ] ?? 0,
195
- } ) );
196
- }
197
-
198
- return processedRecords;
199
- }, [ records, fields, view?.sort, notesCount ] );
184
+ } ) ),
185
+ [ records, notesCount ]
186
+ );
200
187
 
201
188
  const ids = data?.map( ( record ) => getItemId( record ) ) ?? [];
202
189
  const prevIds = usePrevious( ids ) ?? [];
@@ -98,11 +98,13 @@ export default function SidebarGlobalStyles() {
98
98
  title={ __( 'Styles' ) }
99
99
  headingLevel={ 2 }
100
100
  >
101
- <GlobalStylesUIWrapper
102
- path={ section }
103
- onPathChange={ onChangeSection }
104
- settings={ settings }
105
- />
101
+ <div className="edit-site-styles__content">
102
+ <GlobalStylesUIWrapper
103
+ path={ section }
104
+ onPathChange={ onChangeSection }
105
+ settings={ settings }
106
+ />
107
+ </div>
106
108
  </Page>
107
109
  );
108
110
  }
@@ -31,6 +31,12 @@
31
31
  }
32
32
  }
33
33
 
34
+ .edit-site-styles__content {
35
+ flex-grow: 1;
36
+ min-height: 0;
37
+ background-color: var(--wpds-color-background-surface-neutral-strong);
38
+ }
39
+
34
40
  // Show button text labels when preference is enabled.
35
41
  .show-icon-labels {
36
42
  .edit-site-styles__header-actions {
@@ -5,6 +5,11 @@ import { store as coreStore } from '@wordpress/core-data';
5
5
  import { DataForm } from '@wordpress/dataviews';
6
6
  import { MediaEdit } from '@wordpress/fields';
7
7
  import { decodeEntities } from '@wordpress/html-entities';
8
+ import { useViewConfig } from '@wordpress/views';
9
+
10
+ // The screen only renders a form, so it requests the `form` of the entity
11
+ // view configuration alone.
12
+ const VIEW_CONFIG_FIELDS = [ 'form' ];
8
13
 
9
14
  const fields = [
10
15
  {
@@ -53,14 +58,6 @@ const fields = [
53
58
  },
54
59
  ];
55
60
 
56
- const form = {
57
- layout: {
58
- type: 'regular',
59
- labelPosition: 'top',
60
- },
61
- fields: [ 'title', 'description', 'site_logo', 'site_icon' ],
62
- };
63
-
64
61
  export default function SidebarIdentity() {
65
62
  const data = useSelect(
66
63
  ( select ) =>
@@ -68,23 +65,30 @@ export default function SidebarIdentity() {
68
65
  []
69
66
  );
70
67
  const { editEntityRecord } = useDispatch( coreStore );
68
+ const { form } = useViewConfig( {
69
+ kind: 'root',
70
+ name: 'site',
71
+ fields: VIEW_CONFIG_FIELDS,
72
+ } );
71
73
 
72
74
  const onChange = ( edits ) => {
73
75
  editEntityRecord( 'root', 'site', undefined, edits );
74
76
  };
75
77
 
78
+ if ( ! form ) {
79
+ return null;
80
+ }
81
+
76
82
  return (
77
- <Page
78
- title={ _x( 'Identity', 'site identity' ) }
79
- headingLevel={ 2 }
80
- hasPadding
81
- >
82
- <DataForm
83
- data={ data }
84
- fields={ fields }
85
- form={ form }
86
- onChange={ onChange }
87
- />
83
+ <Page title={ _x( 'Identity', 'site identity' ) } headingLevel={ 2 }>
84
+ <div className="edit-site-sidebar-identity__form">
85
+ <DataForm
86
+ data={ data }
87
+ fields={ fields }
88
+ form={ form }
89
+ onChange={ onChange }
90
+ />
91
+ </div>
88
92
  </Page>
89
93
  );
90
94
  }
@@ -0,0 +1,7 @@
1
+ .edit-site-sidebar-identity__form {
2
+ flex-grow: 1;
3
+ min-height: 0;
4
+ overflow: auto;
5
+ background-color: var(--wpds-color-background-surface-neutral-strong);
6
+ padding: var(--wpds-dimension-padding-lg) var(--wpds-dimension-padding-2xl);
7
+ }
@@ -65,13 +65,7 @@ function SidebarNavigationItemContent( {
65
65
  { ...props }
66
66
  >
67
67
  <Stack direction="row" align="center" justify="start" gap="sm">
68
- { icon && (
69
- <Icon
70
- style={ { fill: 'currentcolor' } }
71
- icon={ icon }
72
- size={ 24 }
73
- />
74
- ) }
68
+ { icon && <Icon icon={ icon } size={ 24 } /> }
75
69
  <FlexBlock>{ children }</FlexBlock>
76
70
  { withChevron && (
77
71
  <Icon
@@ -1,87 +1,52 @@
1
- import { useEntityRecords } from '@wordpress/core-data';
2
- import { useMemo } from '@wordpress/element';
3
- import { __experimentalItemGroup as ItemGroup } from '@wordpress/components';
4
- import { __ } from '@wordpress/i18n';
5
- import { privateApis as routerPrivateApis } from '@wordpress/router';
6
- import { addQueryArgs } from '@wordpress/url';
7
- import { commentAuthorAvatar, published } from '@wordpress/icons';
8
- import SidebarNavigationItem from '../sidebar-navigation-item';
9
- import { useAddedBy } from '../page-templates/hooks';
10
- import { unlock } from '../../lock-unlock';
11
-
12
- const { useLocation } = unlock( routerPrivateApis );
13
-
14
- const EMPTY_ARRAY = [];
15
-
16
- function TemplateDataviewItem( { template, isActive } ) {
17
- const { text, icon } = useAddedBy( template.type, template.id );
18
-
19
- return (
20
- <SidebarNavigationItem
21
- to={ addQueryArgs( '/template', { activeView: text } ) }
22
- icon={ icon }
23
- aria-current={ isActive }
24
- >
25
- { text }
26
- </SidebarNavigationItem>
27
- );
28
- }
1
+ import { store as coreStore } from '@wordpress/core-data';
2
+ import { useSelect } from '@wordpress/data';
3
+ import {
4
+ commentAuthorAvatar,
5
+ layout,
6
+ plugins as pluginIcon,
7
+ globe,
8
+ } from '@wordpress/icons';
9
+ import { TEMPLATE_POST_TYPE } from '../../utils/constants';
10
+ import DataViewsSidebarContent from '../sidebar-dataviews';
29
11
 
12
+ const SOURCE_TO_ICON = {
13
+ user: commentAuthorAvatar,
14
+ theme: layout,
15
+ plugin: pluginIcon,
16
+ site: globe,
17
+ };
30
18
  export default function DataviewsTemplatesSidebarContent() {
31
- const {
32
- query: { activeView = 'active' },
33
- } = useLocation();
34
- const { records } = useEntityRecords( 'root', 'registeredTemplate', {
35
- // This should not be needed, the endpoint returns all registered
36
- // templates, but it's not possible right now to turn off pagination for
37
- // entity configs.
38
- per_page: -1,
39
- } );
40
- const firstItemPerAuthorText = useMemo( () => {
41
- const firstItemPerAuthor = records?.reduce( ( acc, template ) => {
42
- const author = template.author_text;
43
- if ( author && ! acc[ author ] ) {
44
- acc[ author ] = template;
45
- }
46
- return acc;
47
- }, {} );
48
- return (
49
- ( firstItemPerAuthor && Object.values( firstItemPerAuthor ) ) ??
50
- EMPTY_ARRAY
19
+ const authorSourceMap = useSelect( ( select ) => {
20
+ const templates = select( coreStore ).getEntityRecords(
21
+ 'postType',
22
+ TEMPLATE_POST_TYPE,
23
+ { per_page: -1 }
51
24
  );
52
- }, [ records ] );
25
+ if ( ! templates ) {
26
+ return {};
27
+ }
28
+ const map = {};
29
+ for ( const template of templates ) {
30
+ if (
31
+ template.author_text &&
32
+ template.original_source &&
33
+ ! map[ template.author_text ]
34
+ ) {
35
+ map[ template.author_text ] = template.original_source;
36
+ }
37
+ }
38
+ return map;
39
+ }, [] );
40
+
41
+ const resolveIcon = ( view ) => {
42
+ const source = authorSourceMap[ view.slug ];
43
+ return SOURCE_TO_ICON[ source ] ?? layout;
44
+ };
53
45
 
54
46
  return (
55
- <ItemGroup className="edit-site-sidebar-navigation-screen-templates-browse">
56
- <SidebarNavigationItem
57
- to="/template"
58
- icon={ published }
59
- aria-current={ activeView === 'active' }
60
- >
61
- { __( 'Active templates' ) }
62
- </SidebarNavigationItem>
63
- <SidebarNavigationItem
64
- to={ addQueryArgs( '/template', { activeView: 'user' } ) }
65
- icon={ commentAuthorAvatar }
66
- aria-current={ activeView === 'user' }
67
- >
68
- {
69
- // Let's avoid calling them "custom templates" to avoid
70
- // confusion. "Created" is closest to meaning database
71
- // templates, created by users.
72
- // https://developer.wordpress.org/themes/classic-themes/templates/page-template-files/#creating-custom-page-templates-for-global-use
73
- __( 'Created templates' )
74
- }
75
- </SidebarNavigationItem>
76
- { firstItemPerAuthorText.map( ( template ) => {
77
- return (
78
- <TemplateDataviewItem
79
- key={ template.author_text }
80
- template={ template }
81
- isActive={ activeView === template.author_text }
82
- />
83
- );
84
- } ) }
85
- </ItemGroup>
47
+ <DataViewsSidebarContent
48
+ postType={ TEMPLATE_POST_TYPE }
49
+ resolveIcon={ resolveIcon }
50
+ />
86
51
  );
87
52
  }
@@ -1,7 +1,6 @@
1
1
  import { __ } from '@wordpress/i18n';
2
2
  import SidebarNavigationScreen from '../sidebar-navigation-screen';
3
3
  import DataviewsTemplatesSidebarContent from './content';
4
- import DataviewsTemplatesSidebarContentLegacy from './content-legacy';
5
4
 
6
5
  export default function SidebarNavigationScreenTemplatesBrowse( { backPath } ) {
7
6
  return (
@@ -11,13 +10,7 @@ export default function SidebarNavigationScreenTemplatesBrowse( { backPath } ) {
11
10
  'Manage the templates that define the structure of your pages, or reset any customizations made to those supplied by your theme.'
12
11
  ) }
13
12
  backPath={ backPath }
14
- content={
15
- window?.__experimentalTemplateActivate ? (
16
- <DataviewsTemplatesSidebarContent />
17
- ) : (
18
- <DataviewsTemplatesSidebarContentLegacy />
19
- )
20
- }
13
+ content={ <DataviewsTemplatesSidebarContent /> }
21
14
  />
22
15
  );
23
16
  }