@wordpress/edit-site 6.4.0 → 6.5.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 (198) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/components/add-new-pattern/index.js +6 -1
  3. package/build/components/add-new-pattern/index.js.map +1 -1
  4. package/build/components/add-new-post/index.js +2 -1
  5. package/build/components/add-new-post/index.js.map +1 -1
  6. package/build/components/add-new-template/utils.js +2 -2
  7. package/build/components/add-new-template/utils.js.map +1 -1
  8. package/build/components/editor/index.js +71 -20
  9. package/build/components/editor/index.js.map +1 -1
  10. package/build/components/global-styles/font-families.js +3 -4
  11. package/build/components/global-styles/font-families.js.map +1 -1
  12. package/build/components/global-styles/font-library-modal/context.js +0 -5
  13. package/build/components/global-styles/font-library-modal/context.js.map +1 -1
  14. package/build/components/global-styles/font-library-modal/font-collection.js +25 -5
  15. package/build/components/global-styles/font-library-modal/font-collection.js.map +1 -1
  16. package/build/components/global-styles/font-library-modal/index.js +1 -8
  17. package/build/components/global-styles/font-library-modal/index.js.map +1 -1
  18. package/build/components/global-styles/font-library-modal/installed-fonts.js +21 -6
  19. package/build/components/global-styles/font-library-modal/installed-fonts.js.map +1 -1
  20. package/build/components/global-styles/font-library-modal/upload-fonts.js +2 -3
  21. package/build/components/global-styles/font-library-modal/upload-fonts.js.map +1 -1
  22. package/build/components/global-styles/screen-typeset.js +40 -0
  23. package/build/components/global-styles/screen-typeset.js.map +1 -0
  24. package/build/components/global-styles/screen-typography-element.js +14 -0
  25. package/build/components/global-styles/screen-typography-element.js.map +1 -1
  26. package/build/components/global-styles/screen-typography.js +4 -6
  27. package/build/components/global-styles/screen-typography.js.map +1 -1
  28. package/build/components/global-styles/shadows-edit-panel.js +50 -59
  29. package/build/components/global-styles/shadows-edit-panel.js.map +1 -1
  30. package/build/components/global-styles/typeset-button.js +97 -0
  31. package/build/components/global-styles/typeset-button.js.map +1 -0
  32. package/build/components/global-styles/typeset.js +80 -0
  33. package/build/components/global-styles/typeset.js.map +1 -0
  34. package/build/components/global-styles/ui.js +4 -0
  35. package/build/components/global-styles/ui.js.map +1 -1
  36. package/build/components/global-styles/utils.js +10 -1
  37. package/build/components/global-styles/utils.js.map +1 -1
  38. package/build/components/page-patterns/fields.js +230 -0
  39. package/build/components/page-patterns/fields.js.map +1 -0
  40. package/build/components/page-patterns/index.js +8 -226
  41. package/build/components/page-patterns/index.js.map +1 -1
  42. package/build/components/page-patterns/use-patterns.js +26 -1
  43. package/build/components/page-patterns/use-patterns.js.map +1 -1
  44. package/build/components/page-templates/fields.js +169 -0
  45. package/build/components/page-templates/fields.js.map +1 -0
  46. package/build/components/page-templates/index.js +10 -177
  47. package/build/components/page-templates/index.js.map +1 -1
  48. package/build/components/post-edit/index.js +18 -6
  49. package/build/components/post-edit/index.js.map +1 -1
  50. package/build/components/post-fields/index.js +19 -15
  51. package/build/components/post-fields/index.js.map +1 -1
  52. package/build/components/post-list/index.js +125 -67
  53. package/build/components/post-list/index.js.map +1 -1
  54. package/build/components/sidebar-dataviews/add-new-view.js +2 -2
  55. package/build/components/sidebar-dataviews/add-new-view.js.map +1 -1
  56. package/build/components/sidebar-dataviews/dataview-item.js +2 -3
  57. package/build/components/sidebar-dataviews/dataview-item.js.map +1 -1
  58. package/build/components/sidebar-dataviews/default-views.js +81 -81
  59. package/build/components/sidebar-dataviews/default-views.js.map +1 -1
  60. package/build/components/sidebar-dataviews/index.js +3 -42
  61. package/build/components/sidebar-dataviews/index.js.map +1 -1
  62. package/build/components/site-hub/index.js +6 -3
  63. package/build/components/site-hub/index.js.map +1 -1
  64. package/build/components/style-book/index.js +22 -25
  65. package/build/components/style-book/index.js.map +1 -1
  66. package/build/components/sync-state-with-url/use-init-edited-entity-from-url.js +5 -0
  67. package/build/components/sync-state-with-url/use-init-edited-entity-from-url.js.map +1 -1
  68. package/build/hooks/push-changes-to-global-styles/index.js +2 -3
  69. package/build/hooks/push-changes-to-global-styles/index.js.map +1 -1
  70. package/build/hooks/use-theme-style-variations/use-theme-style-variations-by-property.js +2 -4
  71. package/build/hooks/use-theme-style-variations/use-theme-style-variations-by-property.js.map +1 -1
  72. package/build/index.js +0 -2
  73. package/build/index.js.map +1 -1
  74. package/build-module/components/add-new-pattern/index.js +6 -1
  75. package/build-module/components/add-new-pattern/index.js.map +1 -1
  76. package/build-module/components/add-new-post/index.js +2 -1
  77. package/build-module/components/add-new-post/index.js.map +1 -1
  78. package/build-module/components/add-new-template/utils.js +2 -2
  79. package/build-module/components/add-new-template/utils.js.map +1 -1
  80. package/build-module/components/editor/index.js +73 -22
  81. package/build-module/components/editor/index.js.map +1 -1
  82. package/build-module/components/global-styles/font-families.js +3 -4
  83. package/build-module/components/global-styles/font-families.js.map +1 -1
  84. package/build-module/components/global-styles/font-library-modal/context.js +0 -5
  85. package/build-module/components/global-styles/font-library-modal/context.js.map +1 -1
  86. package/build-module/components/global-styles/font-library-modal/font-collection.js +26 -6
  87. package/build-module/components/global-styles/font-library-modal/font-collection.js.map +1 -1
  88. package/build-module/components/global-styles/font-library-modal/index.js +1 -8
  89. package/build-module/components/global-styles/font-library-modal/index.js.map +1 -1
  90. package/build-module/components/global-styles/font-library-modal/installed-fonts.js +21 -6
  91. package/build-module/components/global-styles/font-library-modal/installed-fonts.js.map +1 -1
  92. package/build-module/components/global-styles/font-library-modal/upload-fonts.js +2 -3
  93. package/build-module/components/global-styles/font-library-modal/upload-fonts.js.map +1 -1
  94. package/build-module/components/global-styles/screen-typeset.js +34 -0
  95. package/build-module/components/global-styles/screen-typeset.js.map +1 -0
  96. package/build-module/components/global-styles/screen-typography-element.js +14 -0
  97. package/build-module/components/global-styles/screen-typography-element.js.map +1 -1
  98. package/build-module/components/global-styles/screen-typography.js +4 -6
  99. package/build-module/components/global-styles/screen-typography.js.map +1 -1
  100. package/build-module/components/global-styles/shadows-edit-panel.js +51 -60
  101. package/build-module/components/global-styles/shadows-edit-panel.js.map +1 -1
  102. package/build-module/components/global-styles/typeset-button.js +89 -0
  103. package/build-module/components/global-styles/typeset-button.js.map +1 -0
  104. package/build-module/components/global-styles/typeset.js +71 -0
  105. package/build-module/components/global-styles/typeset.js.map +1 -0
  106. package/build-module/components/global-styles/ui.js +4 -0
  107. package/build-module/components/global-styles/ui.js.map +1 -1
  108. package/build-module/components/global-styles/utils.js +10 -1
  109. package/build-module/components/global-styles/utils.js.map +1 -1
  110. package/build-module/components/page-patterns/fields.js +223 -0
  111. package/build-module/components/page-patterns/fields.js.map +1 -0
  112. package/build-module/components/page-patterns/index.js +11 -229
  113. package/build-module/components/page-patterns/index.js.map +1 -1
  114. package/build-module/components/page-patterns/use-patterns.js +26 -1
  115. package/build-module/components/page-patterns/use-patterns.js.map +1 -1
  116. package/build-module/components/page-templates/fields.js +160 -0
  117. package/build-module/components/page-templates/fields.js.map +1 -0
  118. package/build-module/components/page-templates/index.js +12 -178
  119. package/build-module/components/page-templates/index.js.map +1 -1
  120. package/build-module/components/post-edit/index.js +20 -8
  121. package/build-module/components/post-edit/index.js.map +1 -1
  122. package/build-module/components/post-fields/index.js +19 -15
  123. package/build-module/components/post-fields/index.js.map +1 -1
  124. package/build-module/components/post-list/index.js +127 -69
  125. package/build-module/components/post-list/index.js.map +1 -1
  126. package/build-module/components/sidebar-dataviews/add-new-view.js +2 -2
  127. package/build-module/components/sidebar-dataviews/add-new-view.js.map +1 -1
  128. package/build-module/components/sidebar-dataviews/dataview-item.js +2 -3
  129. package/build-module/components/sidebar-dataviews/dataview-item.js.map +1 -1
  130. package/build-module/components/sidebar-dataviews/default-views.js +81 -81
  131. package/build-module/components/sidebar-dataviews/default-views.js.map +1 -1
  132. package/build-module/components/sidebar-dataviews/index.js +3 -42
  133. package/build-module/components/sidebar-dataviews/index.js.map +1 -1
  134. package/build-module/components/site-hub/index.js +7 -4
  135. package/build-module/components/site-hub/index.js.map +1 -1
  136. package/build-module/components/style-book/index.js +23 -26
  137. package/build-module/components/style-book/index.js.map +1 -1
  138. package/build-module/components/sync-state-with-url/use-init-edited-entity-from-url.js +5 -0
  139. package/build-module/components/sync-state-with-url/use-init-edited-entity-from-url.js.map +1 -1
  140. package/build-module/hooks/push-changes-to-global-styles/index.js +2 -3
  141. package/build-module/hooks/push-changes-to-global-styles/index.js.map +1 -1
  142. package/build-module/hooks/use-theme-style-variations/use-theme-style-variations-by-property.js +2 -3
  143. package/build-module/hooks/use-theme-style-variations/use-theme-style-variations-by-property.js.map +1 -1
  144. package/build-module/index.js +0 -2
  145. package/build-module/index.js.map +1 -1
  146. package/build-style/posts-rtl.css +190 -11
  147. package/build-style/posts.css +190 -11
  148. package/build-style/style-rtl.css +296 -55
  149. package/build-style/style.css +296 -55
  150. package/package.json +41 -41
  151. package/src/components/add-new-pattern/index.js +8 -3
  152. package/src/components/add-new-post/index.js +2 -1
  153. package/src/components/add-new-template/utils.js +10 -6
  154. package/src/components/editor/index.js +80 -22
  155. package/src/components/editor/style.scss +59 -1
  156. package/src/components/global-styles/font-families.js +3 -5
  157. package/src/components/global-styles/font-library-modal/context.js +0 -5
  158. package/src/components/global-styles/font-library-modal/font-collection.js +34 -10
  159. package/src/components/global-styles/font-library-modal/index.js +2 -7
  160. package/src/components/global-styles/font-library-modal/installed-fonts.js +23 -5
  161. package/src/components/global-styles/font-library-modal/style.scss +1 -1
  162. package/src/components/global-styles/font-library-modal/upload-fonts.js +2 -2
  163. package/src/components/global-styles/screen-typeset.js +42 -0
  164. package/src/components/global-styles/screen-typography-element.js +14 -0
  165. package/src/components/global-styles/screen-typography.js +4 -4
  166. package/src/components/global-styles/shadows-edit-panel.js +66 -73
  167. package/src/components/global-styles/style.scss +4 -7
  168. package/src/components/global-styles/typeset-button.js +93 -0
  169. package/src/components/global-styles/typeset.js +73 -0
  170. package/src/components/global-styles/ui.js +5 -0
  171. package/src/components/global-styles/utils.js +13 -1
  172. package/src/components/layout/style.scss +8 -0
  173. package/src/components/page-patterns/fields.js +251 -0
  174. package/src/components/page-patterns/index.js +15 -244
  175. package/src/components/page-patterns/style.scss +82 -85
  176. package/src/components/page-patterns/use-patterns.js +31 -1
  177. package/src/components/page-templates/fields.js +157 -0
  178. package/src/components/page-templates/index.js +19 -170
  179. package/src/components/page-templates/style.scss +14 -5
  180. package/src/components/post-edit/index.js +27 -8
  181. package/src/components/post-fields/index.js +29 -17
  182. package/src/components/post-list/index.js +134 -74
  183. package/src/components/sidebar-dataviews/add-new-view.js +2 -4
  184. package/src/components/sidebar-dataviews/dataview-item.js +2 -2
  185. package/src/components/sidebar-dataviews/default-views.js +95 -95
  186. package/src/components/sidebar-dataviews/index.js +3 -37
  187. package/src/components/site-hub/index.js +11 -2
  188. package/src/components/site-icon/style.scss +4 -1
  189. package/src/components/style-book/index.js +27 -32
  190. package/src/components/sync-state-with-url/use-init-edited-entity-from-url.js +5 -0
  191. package/src/hooks/push-changes-to-global-styles/index.js +2 -3
  192. package/src/hooks/use-theme-style-variations/use-theme-style-variations-by-property.js +2 -3
  193. package/src/index.js +0 -2
  194. package/build/utils/clone-deep.js +0 -15
  195. package/build/utils/clone-deep.js.map +0 -1
  196. package/build-module/utils/clone-deep.js +0 -9
  197. package/build-module/utils/clone-deep.js.map +0 -1
  198. package/src/utils/clone-deep.js +0 -8
@@ -1,59 +1,39 @@
1
- /**
2
- * External dependencies
3
- */
4
- import clsx from 'clsx';
5
-
6
1
  /**
7
2
  * WordPress dependencies
8
3
  */
9
- import {
10
- __experimentalHStack as HStack,
11
- Button,
12
- Tooltip,
13
- Flex,
14
- } from '@wordpress/components';
15
- import { __, _x } from '@wordpress/i18n';
4
+ import { __ } from '@wordpress/i18n';
16
5
  import { useState, useMemo, useId, useEffect } from '@wordpress/element';
17
- import {
18
- BlockPreview,
19
- privateApis as blockEditorPrivateApis,
20
- } from '@wordpress/block-editor';
6
+ import { privateApis as blockEditorPrivateApis } from '@wordpress/block-editor';
21
7
  import { DataViews, filterSortAndPaginate } from '@wordpress/dataviews';
22
- import { Icon, lockSmall } from '@wordpress/icons';
23
8
  import { usePrevious } from '@wordpress/compose';
24
9
  import { useEntityRecords } from '@wordpress/core-data';
25
10
  import { privateApis as editorPrivateApis } from '@wordpress/editor';
26
11
  import { privateApis as routerPrivateApis } from '@wordpress/router';
27
- import { parse } from '@wordpress/blocks';
28
- import { decodeEntities } from '@wordpress/html-entities';
29
12
 
30
13
  /**
31
14
  * Internal dependencies
32
15
  */
33
- import { Async } from '../async';
34
16
  import Page from '../page';
35
17
  import {
36
18
  LAYOUT_GRID,
37
19
  LAYOUT_TABLE,
38
- LAYOUT_LIST,
39
20
  PATTERN_TYPES,
40
21
  TEMPLATE_PART_POST_TYPE,
41
- PATTERN_SYNC_TYPES,
42
22
  PATTERN_DEFAULT_CATEGORY,
43
- OPERATOR_IS,
44
23
  } from '../../utils/constants';
45
24
  import usePatternSettings from './use-pattern-settings';
46
25
  import { unlock } from '../../lock-unlock';
47
26
  import usePatterns from './use-patterns';
48
27
  import PatternsHeader from './header';
49
- import { useLink } from '../routes/link';
50
- import { useAddedBy } from '../page-templates/hooks';
51
28
  import { useEditPostAction } from '../dataviews-actions';
52
- import { defaultGetTitle } from './search-items';
29
+ import {
30
+ patternStatusField,
31
+ previewField,
32
+ titleField,
33
+ templatePartAuthorField,
34
+ } from './fields';
53
35
 
54
- const { ExperimentalBlockEditorProvider, useGlobalStyle } = unlock(
55
- blockEditorPrivateApis
56
- );
36
+ const { ExperimentalBlockEditorProvider } = unlock( blockEditorPrivateApis );
57
37
  const { usePostActions } = unlock( editorPrivateApis );
58
38
  const { useLocation } = unlock( routerPrivateApis );
59
39
 
@@ -90,164 +70,6 @@ const DEFAULT_VIEW = {
90
70
  filters: [],
91
71
  };
92
72
 
93
- const SYNC_FILTERS = [
94
- {
95
- value: PATTERN_SYNC_TYPES.full,
96
- label: _x( 'Synced', 'pattern (singular)' ),
97
- description: __( 'Patterns that are kept in sync across the site.' ),
98
- },
99
- {
100
- value: PATTERN_SYNC_TYPES.unsynced,
101
- label: _x( 'Not synced', 'pattern (singular)' ),
102
- description: __(
103
- 'Patterns that can be changed freely without affecting the site.'
104
- ),
105
- },
106
- ];
107
-
108
- function PreviewWrapper( { item, onClick, ariaDescribedBy, children } ) {
109
- return (
110
- <button
111
- className="page-patterns-preview-field__button"
112
- type="button"
113
- onClick={ item.type !== PATTERN_TYPES.theme ? onClick : undefined }
114
- aria-label={ item.title }
115
- aria-describedby={ ariaDescribedBy }
116
- aria-disabled={ item.type === PATTERN_TYPES.theme }
117
- >
118
- { children }
119
- </button>
120
- );
121
- }
122
-
123
- function Preview( { item, viewType } ) {
124
- const descriptionId = useId();
125
- const description = item.description || item?.excerpt?.raw;
126
- const isUserPattern = item.type === PATTERN_TYPES.user;
127
- const isTemplatePart = item.type === TEMPLATE_PART_POST_TYPE;
128
- const [ backgroundColor ] = useGlobalStyle( 'color.background' );
129
- const { onClick } = useLink( {
130
- postType: item.type,
131
- postId: isUserPattern || isTemplatePart ? item.id : item.name,
132
- canvas: 'edit',
133
- } );
134
- const blocks = useMemo( () => {
135
- return (
136
- item.blocks ??
137
- parse( item.content.raw, {
138
- __unstableSkipMigrationLogs: true,
139
- } )
140
- );
141
- }, [ item?.content?.raw, item.blocks ] );
142
- const isEmpty = ! blocks?.length;
143
-
144
- return (
145
- <div
146
- className={ `page-patterns-preview-field is-viewtype-${ viewType }` }
147
- style={ { backgroundColor } }
148
- >
149
- <PreviewWrapper
150
- item={ item }
151
- onClick={ onClick }
152
- ariaDescribedBy={ !! description ? descriptionId : undefined }
153
- >
154
- { isEmpty && isTemplatePart && __( 'Empty template part' ) }
155
- { isEmpty && ! isTemplatePart && __( 'Empty pattern' ) }
156
- { ! isEmpty && (
157
- <Async>
158
- <BlockPreview
159
- blocks={ blocks }
160
- viewportWidth={ item.viewportWidth }
161
- />
162
- </Async>
163
- ) }
164
- </PreviewWrapper>
165
- { !! description && (
166
- <div hidden id={ descriptionId }>
167
- { description }
168
- </div>
169
- ) }
170
- </div>
171
- );
172
- }
173
-
174
- function Author( { item, viewType } ) {
175
- const [ isImageLoaded, setIsImageLoaded ] = useState( false );
176
- const { text, icon, imageUrl } = useAddedBy( item.type, item.id );
177
- const withIcon = viewType !== LAYOUT_LIST;
178
-
179
- return (
180
- <HStack alignment="left" spacing={ 0 }>
181
- { withIcon && imageUrl && (
182
- <div
183
- className={ clsx( 'page-templates-author-field__avatar', {
184
- 'is-loaded': isImageLoaded,
185
- } ) }
186
- >
187
- <img
188
- onLoad={ () => setIsImageLoaded( true ) }
189
- alt=""
190
- src={ imageUrl }
191
- />
192
- </div>
193
- ) }
194
- { withIcon && ! imageUrl && (
195
- <div className="page-templates-author-field__icon">
196
- <Icon icon={ icon } />
197
- </div>
198
- ) }
199
- <span className="page-templates-author-field__name">{ text }</span>
200
- </HStack>
201
- );
202
- }
203
-
204
- function Title( { item } ) {
205
- const isUserPattern = item.type === PATTERN_TYPES.user;
206
- const isTemplatePart = item.type === TEMPLATE_PART_POST_TYPE;
207
- const { onClick } = useLink( {
208
- postType: item.type,
209
- postId: isUserPattern || isTemplatePart ? item.id : item.name,
210
- canvas: 'edit',
211
- } );
212
- const title = decodeEntities( defaultGetTitle( item ) );
213
- return (
214
- <HStack alignment="center" justify="flex-start" spacing={ 2 }>
215
- <Flex
216
- as="div"
217
- gap={ 0 }
218
- justify="left"
219
- className="edit-site-patterns__pattern-title"
220
- >
221
- { item.type === PATTERN_TYPES.theme ? (
222
- title
223
- ) : (
224
- <Button
225
- variant="link"
226
- onClick={ onClick }
227
- // Required for the grid's roving tab index system.
228
- // See https://github.com/WordPress/gutenberg/pull/51898#discussion_r1243399243.
229
- tabIndex="-1"
230
- >
231
- { title }
232
- </Button>
233
- ) }
234
- </Flex>
235
- { item.type === PATTERN_TYPES.theme && (
236
- <Tooltip
237
- placement="top"
238
- text={ __( 'This pattern cannot be edited.' ) }
239
- >
240
- <Icon
241
- className="edit-site-patterns__pattern-lock-icon"
242
- icon={ lockSmall }
243
- size={ 24 }
244
- />
245
- </Tooltip>
246
- ) }
247
- </HStack>
248
- );
249
- }
250
-
251
73
  export default function DataviewsPatterns() {
252
74
  const {
253
75
  params: { postType, categoryId: categoryIdFromURL },
@@ -267,6 +89,7 @@ export default function DataviewsPatterns() {
267
89
  const { records } = useEntityRecords( 'postType', TEMPLATE_PART_POST_TYPE, {
268
90
  per_page: -1,
269
91
  } );
92
+
270
93
  const authors = useMemo( () => {
271
94
  if ( ! records ) {
272
95
  return EMPTY_ARRAY;
@@ -282,72 +105,19 @@ export default function DataviewsPatterns() {
282
105
  }, [ records ] );
283
106
 
284
107
  const fields = useMemo( () => {
285
- const _fields = [
286
- {
287
- label: __( 'Preview' ),
288
- id: 'preview',
289
- render: ( { item } ) => (
290
- <Preview item={ item } viewType={ view.type } />
291
- ),
292
- enableSorting: false,
293
- },
294
- {
295
- label: __( 'Title' ),
296
- id: 'title',
297
- getValue: ( { item } ) => item.title?.raw || item.title,
298
- render: ( { item } ) => <Title item={ item } />,
299
- enableHiding: false,
300
- },
301
- ];
108
+ const _fields = [ previewField, titleField ];
302
109
 
303
110
  if ( type === PATTERN_TYPES.user ) {
304
- _fields.push( {
305
- label: __( 'Sync status' ),
306
- id: 'sync-status',
307
- render: ( { item } ) => {
308
- const syncStatus =
309
- 'wp_pattern_sync_status' in item
310
- ? item.wp_pattern_sync_status ||
311
- PATTERN_SYNC_TYPES.full
312
- : PATTERN_SYNC_TYPES.unsynced;
313
- // User patterns can have their sync statuses checked directly.
314
- // Non-user patterns are all unsynced for the time being.
315
- return (
316
- <span
317
- className={ `edit-site-patterns__field-sync-status-${ syncStatus }` }
318
- >
319
- {
320
- SYNC_FILTERS.find(
321
- ( { value } ) => value === syncStatus
322
- ).label
323
- }
324
- </span>
325
- );
326
- },
327
- elements: SYNC_FILTERS,
328
- filterBy: {
329
- operators: [ OPERATOR_IS ],
330
- isPrimary: true,
331
- },
332
- enableSorting: false,
333
- } );
111
+ _fields.push( patternStatusField );
334
112
  } else if ( type === TEMPLATE_PART_POST_TYPE ) {
335
113
  _fields.push( {
336
- label: __( 'Author' ),
337
- id: 'author',
338
- getValue: ( { item } ) => item.author_text,
339
- render: ( { item } ) => {
340
- return <Author viewType={ view.type } item={ item } />;
341
- },
114
+ ...templatePartAuthorField,
342
115
  elements: authors,
343
- filterBy: {
344
- isPrimary: true,
345
- },
346
116
  } );
347
117
  }
348
118
 
349
119
  return _fields;
350
- }, [ view.type, type, authors ] );
120
+ }, [ type, authors ] );
351
121
 
352
122
  // Reset the page number when the category changes.
353
123
  useEffect( () => {
@@ -401,6 +171,7 @@ export default function DataviewsPatterns() {
401
171
  descriptionId={ `${ id }-description` }
402
172
  />
403
173
  <DataViews
174
+ key={ categoryId + postType }
404
175
  paginationInfo={ paginationInfo }
405
176
  fields={ fields }
406
177
  actions={ actions }
@@ -1,118 +1,115 @@
1
- .edit-site-patterns__section-header {
2
- .screen-reader-shortcut:focus {
3
- top: 0;
4
- }
1
+ .edit-site-patterns__delete-modal {
2
+ width: $modal-width-small;
5
3
  }
6
4
 
7
- .edit-site-patterns__pattern-title {
8
- .is-link {
9
- text-decoration: none;
10
- color: $gray-200;
5
+ .page-patterns-preview-field {
6
+ display: flex;
7
+ flex-direction: column;
8
+ height: 100%;
9
+ border-radius: $radius-medium;
11
10
 
12
- &:hover,
13
- &:focus {
14
- color: $white;
11
+ .dataviews-view-table & {
12
+ width: 96px;
13
+ flex-grow: 0;
14
+ border-radius: 2px;
15
+
16
+ .page-patterns-preview-field__button {
17
+ border-radius: 2px;
15
18
  }
16
19
  }
17
20
 
18
- .edit-site-patterns__pattern-icon {
21
+ .page-patterns-preview-field__button {
22
+ box-shadow: none;
23
+ border: none;
24
+ padding: 0;
25
+ background-color: unset;
26
+ box-sizing: border-box;
27
+ cursor: pointer;
28
+ overflow: hidden;
29
+ height: 100%;
19
30
  border-radius: $grid-unit-05;
20
- background: var(--wp-block-synced-color);
21
- fill: $white;
22
- }
23
31
 
24
- .edit-site-patterns__pattern-lock-icon {
25
- fill: currentcolor;
32
+ &:focus-visible {
33
+ box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
34
+ // Windows High Contrast mode will show this outline, but not the box-shadow.
35
+ outline: 2px solid transparent;
36
+ }
37
+
38
+ &[aria-disabled="true"] {
39
+ cursor: default;
40
+ }
26
41
  }
27
42
  }
28
43
 
29
- .edit-site-patterns__delete-modal {
30
- width: $modal-width-small;
44
+ .edit-site-patterns__pattern-icon {
45
+ fill: var(--wp-block-synced-color);
46
+ flex-shrink: 0;
31
47
  }
32
48
 
33
- .edit-site-page-patterns-dataviews {
34
- .page-patterns-preview-field {
35
- display: flex;
36
- flex-direction: column;
37
- height: 100%;
38
-
39
- &.is-viewtype-table {
40
- width: 96px;
41
- flex-grow: 0;
42
- border-radius: 2px;
49
+ .edit-site-patterns__pattern-lock-icon {
50
+ min-width: min-content;
51
+ }
43
52
 
44
- .page-patterns-preview-field__button {
45
- border-radius: 2px;
46
- }
47
- }
53
+ .edit-site-patterns__section-header {
54
+ border-bottom: 1px solid #f0f0f0;
55
+ padding: $grid-unit-20 $grid-unit-60;
56
+ position: sticky;
57
+ top: 0;
58
+ z-index: 2;
59
+ flex-shrink: 0;
60
+ transition: padding ease-out 0.1s;
61
+ @include reduce-motion("transition");
62
+ min-height: $grid-unit-50;
63
+
64
+ .edit-site-patterns__title {
65
+ min-height: $grid-unit-50;
48
66
 
49
- .page-patterns-preview-field__button {
50
- box-shadow: none;
51
- border: none;
52
- padding: 0;
53
- background-color: unset;
54
- box-sizing: border-box;
55
- cursor: pointer;
56
- overflow: hidden;
57
- height: 100%;
58
- border-radius: $grid-unit-05;
59
-
60
- &:focus-visible {
61
- box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
62
- // Windows High Contrast mode will show this outline, but not the box-shadow.
63
- outline: 2px solid transparent;
64
- }
65
-
66
- &[aria-disabled="true"] {
67
- cursor: default;
68
- }
67
+ .components-heading {
68
+ flex-grow: 1;
69
+ flex-basis: 0;
70
+ white-space: nowrap;
69
71
  }
70
72
  }
71
73
 
72
- .edit-site-patterns__pattern-icon {
73
- fill: var(--wp-block-synced-color);
74
- flex-shrink: 0;
74
+ .edit-site-patterns__sub-title {
75
+ margin-bottom: $grid-unit-10;
75
76
  }
76
77
 
77
- .edit-site-patterns__pattern-lock-icon {
78
- min-width: min-content;
78
+ .screen-reader-shortcut:focus {
79
+ top: 0;
79
80
  }
81
+ }
80
82
 
81
- .edit-site-patterns__section-header {
82
- border-bottom: 1px solid #f0f0f0;
83
- padding: $grid-unit-20 $grid-unit-60;
84
- position: sticky;
85
- top: 0;
86
- z-index: 2;
87
- flex-shrink: 0;
88
- transition: padding ease-out 0.1s;
89
- @include reduce-motion("transition");
90
- min-height: $grid-unit-50;
83
+ .edit-site-patterns__pattern-title {
84
+ display: block;
85
+ width: 100%;
86
+ white-space: nowrap;
87
+ overflow: hidden;
88
+ text-overflow: ellipsis;
89
+ color: inherit;
91
90
 
92
- .edit-site-patterns__title {
93
- min-height: $grid-unit-50;
91
+ .is-link {
92
+ text-decoration: none;
93
+ color: $gray-200;
94
94
 
95
- .components-heading {
96
- flex-grow: 1;
97
- flex-basis: 0;
98
- white-space: nowrap;
99
- }
95
+ &:hover,
96
+ &:focus {
97
+ color: $white;
100
98
  }
99
+ }
101
100
 
102
- .edit-site-patterns__sub-title {
103
- margin-bottom: $grid-unit-10;
104
- }
101
+ .edit-site-patterns__pattern-icon {
102
+ border-radius: $grid-unit-05;
103
+ background: var(--wp-block-synced-color);
104
+ fill: $white;
105
105
  }
106
106
 
107
- .edit-site-patterns__pattern-title {
108
- display: block;
109
- width: 100%;
110
- white-space: nowrap;
111
- overflow: hidden;
112
- text-overflow: ellipsis;
113
- color: inherit;
107
+ .edit-site-patterns__pattern-lock-icon {
108
+ fill: currentcolor;
114
109
  }
110
+ }
115
111
 
112
+ .edit-site-page-patterns-dataviews {
116
113
  .dataviews-pagination {
117
114
  z-index: z-index(".edit-site-patterns__dataviews-list-pagination");
118
115
  }
@@ -5,6 +5,7 @@ import { parse } from '@wordpress/blocks';
5
5
  import { useSelect, createSelector } from '@wordpress/data';
6
6
  import { store as coreStore } from '@wordpress/core-data';
7
7
  import { store as editorStore } from '@wordpress/editor';
8
+ import { useMemo } from '@wordpress/element';
8
9
 
9
10
  /**
10
11
  * Internal dependencies
@@ -260,7 +261,7 @@ export const usePatterns = (
260
261
  categoryId,
261
262
  { search = '', syncStatus } = {}
262
263
  ) => {
263
- return useSelect(
264
+ const { patterns, ...rest } = useSelect(
264
265
  ( select ) => {
265
266
  if ( postType === TEMPLATE_PART_POST_TYPE ) {
266
267
  return selectTemplateParts( select, categoryId, search );
@@ -283,6 +284,35 @@ export const usePatterns = (
283
284
  },
284
285
  [ categoryId, postType, search, syncStatus ]
285
286
  );
287
+
288
+ const ids = useMemo(
289
+ () => patterns?.map( ( record ) => record.id ) ?? [],
290
+ [ patterns ]
291
+ );
292
+
293
+ const permissions = useSelect(
294
+ ( select ) => {
295
+ const { getEntityRecordsPermissions } = unlock(
296
+ select( coreStore )
297
+ );
298
+ return getEntityRecordsPermissions( 'postType', postType, ids );
299
+ },
300
+ [ ids, postType ]
301
+ );
302
+
303
+ const patternsWithPermissions = useMemo(
304
+ () =>
305
+ patterns?.map( ( record, index ) => ( {
306
+ ...record,
307
+ permissions: permissions[ index ],
308
+ } ) ) ?? [],
309
+ [ patterns, permissions ]
310
+ );
311
+
312
+ return {
313
+ ...rest,
314
+ patterns: patternsWithPermissions,
315
+ };
286
316
  };
287
317
 
288
318
  export default usePatterns;