@wordpress/edit-site 6.4.0 → 6.6.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 (234) hide show
  1. package/CHANGELOG.md +4 -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/background-panel.js +1 -4
  11. package/build/components/global-styles/background-panel.js.map +1 -1
  12. package/build/components/global-styles/font-families.js +3 -4
  13. package/build/components/global-styles/font-families.js.map +1 -1
  14. package/build/components/global-styles/font-library-modal/context.js +0 -5
  15. package/build/components/global-styles/font-library-modal/context.js.map +1 -1
  16. package/build/components/global-styles/font-library-modal/font-collection.js +25 -5
  17. package/build/components/global-styles/font-library-modal/font-collection.js.map +1 -1
  18. package/build/components/global-styles/font-library-modal/index.js +1 -8
  19. package/build/components/global-styles/font-library-modal/index.js.map +1 -1
  20. package/build/components/global-styles/font-library-modal/installed-fonts.js +23 -7
  21. package/build/components/global-styles/font-library-modal/installed-fonts.js.map +1 -1
  22. package/build/components/global-styles/font-library-modal/upload-fonts.js +2 -3
  23. package/build/components/global-styles/font-library-modal/upload-fonts.js.map +1 -1
  24. package/build/components/global-styles/screen-block.js +5 -7
  25. package/build/components/global-styles/screen-block.js.map +1 -1
  26. package/build/components/global-styles/screen-css.js +1 -1
  27. package/build/components/global-styles/screen-css.js.map +1 -1
  28. package/build/components/global-styles/screen-typeset.js +40 -0
  29. package/build/components/global-styles/screen-typeset.js.map +1 -0
  30. package/build/components/global-styles/screen-typography-element.js +14 -0
  31. package/build/components/global-styles/screen-typography-element.js.map +1 -1
  32. package/build/components/global-styles/screen-typography.js +4 -6
  33. package/build/components/global-styles/screen-typography.js.map +1 -1
  34. package/build/components/global-styles/shadows-edit-panel.js +51 -59
  35. package/build/components/global-styles/shadows-edit-panel.js.map +1 -1
  36. package/build/components/global-styles/size-control/index.js +10 -5
  37. package/build/components/global-styles/size-control/index.js.map +1 -1
  38. package/build/components/global-styles/typeset-button.js +97 -0
  39. package/build/components/global-styles/typeset-button.js.map +1 -0
  40. package/build/components/global-styles/typeset.js +80 -0
  41. package/build/components/global-styles/typeset.js.map +1 -0
  42. package/build/components/global-styles/ui.js +4 -0
  43. package/build/components/global-styles/ui.js.map +1 -1
  44. package/build/components/global-styles/utils.js +10 -1
  45. package/build/components/global-styles/utils.js.map +1 -1
  46. package/build/components/page-patterns/fields.js +230 -0
  47. package/build/components/page-patterns/fields.js.map +1 -0
  48. package/build/components/page-patterns/index.js +13 -228
  49. package/build/components/page-patterns/index.js.map +1 -1
  50. package/build/components/page-patterns/use-patterns.js +29 -1
  51. package/build/components/page-patterns/use-patterns.js.map +1 -1
  52. package/build/components/page-templates/fields.js +169 -0
  53. package/build/components/page-templates/fields.js.map +1 -0
  54. package/build/components/page-templates/index.js +10 -177
  55. package/build/components/page-templates/index.js.map +1 -1
  56. package/build/components/post-edit/index.js +46 -34
  57. package/build/components/post-edit/index.js.map +1 -1
  58. package/build/components/post-fields/index.js +50 -28
  59. package/build/components/post-fields/index.js.map +1 -1
  60. package/build/components/post-list/index.js +126 -68
  61. package/build/components/post-list/index.js.map +1 -1
  62. package/build/components/sidebar-dataviews/add-new-view.js +3 -2
  63. package/build/components/sidebar-dataviews/add-new-view.js.map +1 -1
  64. package/build/components/sidebar-dataviews/custom-dataviews-list.js +1 -0
  65. package/build/components/sidebar-dataviews/custom-dataviews-list.js.map +1 -1
  66. package/build/components/sidebar-dataviews/dataview-item.js +2 -3
  67. package/build/components/sidebar-dataviews/dataview-item.js.map +1 -1
  68. package/build/components/sidebar-dataviews/default-views.js +81 -81
  69. package/build/components/sidebar-dataviews/default-views.js.map +1 -1
  70. package/build/components/sidebar-dataviews/index.js +3 -42
  71. package/build/components/sidebar-dataviews/index.js.map +1 -1
  72. package/build/components/site-hub/index.js +6 -3
  73. package/build/components/site-hub/index.js.map +1 -1
  74. package/build/components/style-book/index.js +22 -25
  75. package/build/components/style-book/index.js.map +1 -1
  76. package/build/components/sync-state-with-url/use-init-edited-entity-from-url.js +5 -0
  77. package/build/components/sync-state-with-url/use-init-edited-entity-from-url.js.map +1 -1
  78. package/build/hooks/push-changes-to-global-styles/index.js +3 -3
  79. package/build/hooks/push-changes-to-global-styles/index.js.map +1 -1
  80. package/build/hooks/use-theme-style-variations/use-theme-style-variations-by-property.js +2 -4
  81. package/build/hooks/use-theme-style-variations/use-theme-style-variations-by-property.js.map +1 -1
  82. package/build/index.js +0 -2
  83. package/build/index.js.map +1 -1
  84. package/build/utils/is-template-removable.js +2 -2
  85. package/build/utils/is-template-removable.js.map +1 -1
  86. package/build/utils/is-template-revertable.js +1 -1
  87. package/build/utils/is-template-revertable.js.map +1 -1
  88. package/build-module/components/add-new-pattern/index.js +6 -1
  89. package/build-module/components/add-new-pattern/index.js.map +1 -1
  90. package/build-module/components/add-new-post/index.js +2 -1
  91. package/build-module/components/add-new-post/index.js.map +1 -1
  92. package/build-module/components/add-new-template/utils.js +2 -2
  93. package/build-module/components/add-new-template/utils.js.map +1 -1
  94. package/build-module/components/editor/index.js +73 -22
  95. package/build-module/components/editor/index.js.map +1 -1
  96. package/build-module/components/global-styles/background-panel.js +1 -4
  97. package/build-module/components/global-styles/background-panel.js.map +1 -1
  98. package/build-module/components/global-styles/font-families.js +3 -4
  99. package/build-module/components/global-styles/font-families.js.map +1 -1
  100. package/build-module/components/global-styles/font-library-modal/context.js +0 -5
  101. package/build-module/components/global-styles/font-library-modal/context.js.map +1 -1
  102. package/build-module/components/global-styles/font-library-modal/font-collection.js +26 -6
  103. package/build-module/components/global-styles/font-library-modal/font-collection.js.map +1 -1
  104. package/build-module/components/global-styles/font-library-modal/index.js +1 -8
  105. package/build-module/components/global-styles/font-library-modal/index.js.map +1 -1
  106. package/build-module/components/global-styles/font-library-modal/installed-fonts.js +23 -7
  107. package/build-module/components/global-styles/font-library-modal/installed-fonts.js.map +1 -1
  108. package/build-module/components/global-styles/font-library-modal/upload-fonts.js +2 -3
  109. package/build-module/components/global-styles/font-library-modal/upload-fonts.js.map +1 -1
  110. package/build-module/components/global-styles/screen-block.js +5 -7
  111. package/build-module/components/global-styles/screen-block.js.map +1 -1
  112. package/build-module/components/global-styles/screen-css.js +1 -1
  113. package/build-module/components/global-styles/screen-css.js.map +1 -1
  114. package/build-module/components/global-styles/screen-typeset.js +34 -0
  115. package/build-module/components/global-styles/screen-typeset.js.map +1 -0
  116. package/build-module/components/global-styles/screen-typography-element.js +14 -0
  117. package/build-module/components/global-styles/screen-typography-element.js.map +1 -1
  118. package/build-module/components/global-styles/screen-typography.js +4 -6
  119. package/build-module/components/global-styles/screen-typography.js.map +1 -1
  120. package/build-module/components/global-styles/shadows-edit-panel.js +52 -60
  121. package/build-module/components/global-styles/shadows-edit-panel.js.map +1 -1
  122. package/build-module/components/global-styles/size-control/index.js +10 -5
  123. package/build-module/components/global-styles/size-control/index.js.map +1 -1
  124. package/build-module/components/global-styles/typeset-button.js +89 -0
  125. package/build-module/components/global-styles/typeset-button.js.map +1 -0
  126. package/build-module/components/global-styles/typeset.js +71 -0
  127. package/build-module/components/global-styles/typeset.js.map +1 -0
  128. package/build-module/components/global-styles/ui.js +4 -0
  129. package/build-module/components/global-styles/ui.js.map +1 -1
  130. package/build-module/components/global-styles/utils.js +10 -1
  131. package/build-module/components/global-styles/utils.js.map +1 -1
  132. package/build-module/components/page-patterns/fields.js +223 -0
  133. package/build-module/components/page-patterns/fields.js.map +1 -0
  134. package/build-module/components/page-patterns/index.js +14 -231
  135. package/build-module/components/page-patterns/index.js.map +1 -1
  136. package/build-module/components/page-patterns/use-patterns.js +26 -0
  137. package/build-module/components/page-patterns/use-patterns.js.map +1 -1
  138. package/build-module/components/page-templates/fields.js +160 -0
  139. package/build-module/components/page-templates/fields.js.map +1 -0
  140. package/build-module/components/page-templates/index.js +12 -178
  141. package/build-module/components/page-templates/index.js.map +1 -1
  142. package/build-module/components/post-edit/index.js +49 -37
  143. package/build-module/components/post-edit/index.js.map +1 -1
  144. package/build-module/components/post-fields/index.js +50 -28
  145. package/build-module/components/post-fields/index.js.map +1 -1
  146. package/build-module/components/post-list/index.js +128 -70
  147. package/build-module/components/post-list/index.js.map +1 -1
  148. package/build-module/components/sidebar-dataviews/add-new-view.js +3 -2
  149. package/build-module/components/sidebar-dataviews/add-new-view.js.map +1 -1
  150. package/build-module/components/sidebar-dataviews/custom-dataviews-list.js +1 -0
  151. package/build-module/components/sidebar-dataviews/custom-dataviews-list.js.map +1 -1
  152. package/build-module/components/sidebar-dataviews/dataview-item.js +2 -3
  153. package/build-module/components/sidebar-dataviews/dataview-item.js.map +1 -1
  154. package/build-module/components/sidebar-dataviews/default-views.js +81 -81
  155. package/build-module/components/sidebar-dataviews/default-views.js.map +1 -1
  156. package/build-module/components/sidebar-dataviews/index.js +3 -42
  157. package/build-module/components/sidebar-dataviews/index.js.map +1 -1
  158. package/build-module/components/site-hub/index.js +7 -4
  159. package/build-module/components/site-hub/index.js.map +1 -1
  160. package/build-module/components/style-book/index.js +23 -26
  161. package/build-module/components/style-book/index.js.map +1 -1
  162. package/build-module/components/sync-state-with-url/use-init-edited-entity-from-url.js +5 -0
  163. package/build-module/components/sync-state-with-url/use-init-edited-entity-from-url.js.map +1 -1
  164. package/build-module/hooks/push-changes-to-global-styles/index.js +3 -3
  165. package/build-module/hooks/push-changes-to-global-styles/index.js.map +1 -1
  166. package/build-module/hooks/use-theme-style-variations/use-theme-style-variations-by-property.js +2 -3
  167. package/build-module/hooks/use-theme-style-variations/use-theme-style-variations-by-property.js.map +1 -1
  168. package/build-module/index.js +0 -2
  169. package/build-module/index.js.map +1 -1
  170. package/build-module/utils/is-template-removable.js +2 -2
  171. package/build-module/utils/is-template-removable.js.map +1 -1
  172. package/build-module/utils/is-template-revertable.js +1 -1
  173. package/build-module/utils/is-template-revertable.js.map +1 -1
  174. package/build-style/posts-rtl.css +201 -25
  175. package/build-style/posts.css +201 -25
  176. package/build-style/style-rtl.css +307 -69
  177. package/build-style/style.css +307 -69
  178. package/package.json +41 -41
  179. package/src/components/add-new-pattern/index.js +8 -3
  180. package/src/components/add-new-post/index.js +2 -1
  181. package/src/components/add-new-template/style.scss +1 -1
  182. package/src/components/add-new-template/utils.js +10 -6
  183. package/src/components/editor/index.js +80 -22
  184. package/src/components/editor/style.scss +60 -2
  185. package/src/components/global-styles/background-panel.js +0 -3
  186. package/src/components/global-styles/font-families.js +3 -5
  187. package/src/components/global-styles/font-library-modal/context.js +0 -5
  188. package/src/components/global-styles/font-library-modal/font-collection.js +34 -10
  189. package/src/components/global-styles/font-library-modal/index.js +2 -7
  190. package/src/components/global-styles/font-library-modal/installed-fonts.js +26 -6
  191. package/src/components/global-styles/font-library-modal/style.scss +2 -2
  192. package/src/components/global-styles/font-library-modal/upload-fonts.js +2 -2
  193. package/src/components/global-styles/screen-block.js +2 -4
  194. package/src/components/global-styles/screen-css.js +3 -1
  195. package/src/components/global-styles/screen-typeset.js +42 -0
  196. package/src/components/global-styles/screen-typography-element.js +14 -0
  197. package/src/components/global-styles/screen-typography.js +4 -4
  198. package/src/components/global-styles/shadows-edit-panel.js +67 -73
  199. package/src/components/global-styles/size-control/index.js +9 -6
  200. package/src/components/global-styles/style.scss +4 -7
  201. package/src/components/global-styles/typeset-button.js +93 -0
  202. package/src/components/global-styles/typeset.js +73 -0
  203. package/src/components/global-styles/ui.js +5 -0
  204. package/src/components/global-styles/utils.js +13 -1
  205. package/src/components/layout/style.scss +8 -0
  206. package/src/components/page-patterns/fields.js +251 -0
  207. package/src/components/page-patterns/index.js +19 -246
  208. package/src/components/page-patterns/style.scss +82 -85
  209. package/src/components/page-patterns/use-patterns.js +33 -0
  210. package/src/components/page-templates/fields.js +157 -0
  211. package/src/components/page-templates/index.js +19 -170
  212. package/src/components/page-templates/style.scss +14 -5
  213. package/src/components/post-edit/index.js +58 -35
  214. package/src/components/post-fields/index.js +88 -25
  215. package/src/components/post-list/index.js +135 -79
  216. package/src/components/sidebar-dataviews/add-new-view.js +3 -4
  217. package/src/components/sidebar-dataviews/custom-dataviews-list.js +1 -0
  218. package/src/components/sidebar-dataviews/dataview-item.js +2 -2
  219. package/src/components/sidebar-dataviews/default-views.js +95 -95
  220. package/src/components/sidebar-dataviews/index.js +3 -37
  221. package/src/components/site-hub/index.js +11 -2
  222. package/src/components/site-icon/style.scss +4 -1
  223. package/src/components/style-book/index.js +27 -32
  224. package/src/components/sync-state-with-url/use-init-edited-entity-from-url.js +5 -0
  225. package/src/hooks/push-changes-to-global-styles/index.js +3 -3
  226. package/src/hooks/use-theme-style-variations/use-theme-style-variations-by-property.js +2 -3
  227. package/src/index.js +0 -2
  228. package/src/utils/is-template-removable.js +4 -2
  229. package/src/utils/is-template-revertable.js +2 -1
  230. package/build/utils/clone-deep.js +0 -15
  231. package/build/utils/clone-deep.js.map +0 -1
  232. package/build-module/utils/clone-deep.js +0 -9
  233. package/build-module/utils/clone-deep.js.map +0 -1
  234. 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
- import usePatterns from './use-patterns';
26
+ import usePatterns, { useAugmentPatternsWithPermissions } 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( () => {
@@ -366,6 +136,8 @@ export default function DataviewsPatterns() {
366
136
  return filterSortAndPaginate( patterns, viewWithoutFilters, fields );
367
137
  }, [ patterns, view, fields, type ] );
368
138
 
139
+ const dataWithPermissions = useAugmentPatternsWithPermissions( data );
140
+
369
141
  const templatePartActions = usePostActions( {
370
142
  postType: TEMPLATE_PART_POST_TYPE,
371
143
  context: 'list',
@@ -401,10 +173,11 @@ export default function DataviewsPatterns() {
401
173
  descriptionId={ `${ id }-description` }
402
174
  />
403
175
  <DataViews
176
+ key={ categoryId + postType }
404
177
  paginationInfo={ paginationInfo }
405
178
  fields={ fields }
406
179
  actions={ actions }
407
- data={ data || EMPTY_ARRAY }
180
+ data={ dataWithPermissions || EMPTY_ARRAY }
408
181
  getItemId={ ( item ) => item.name ?? item.id }
409
182
  isLoading={ isResolving }
410
183
  view={ view }
@@ -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
@@ -255,6 +256,38 @@ const selectUserPatterns = createSelector(
255
256
  ]
256
257
  );
257
258
 
259
+ export function useAugmentPatternsWithPermissions( patterns ) {
260
+ const idsAndTypes = useMemo(
261
+ () =>
262
+ patterns
263
+ ?.filter( ( record ) => record.type !== PATTERN_TYPES.theme )
264
+ .map( ( record ) => [ record.type, record.id ] ) ?? [],
265
+ [ patterns ]
266
+ );
267
+
268
+ const permissions = useSelect(
269
+ ( select ) => {
270
+ const { getEntityRecordPermissions } = unlock(
271
+ select( coreStore )
272
+ );
273
+ return idsAndTypes.reduce( ( acc, [ type, id ] ) => {
274
+ acc[ id ] = getEntityRecordPermissions( 'postType', type, id );
275
+ return acc;
276
+ }, {} );
277
+ },
278
+ [ idsAndTypes ]
279
+ );
280
+
281
+ return useMemo(
282
+ () =>
283
+ patterns?.map( ( record ) => ( {
284
+ ...record,
285
+ permissions: permissions?.[ record.id ] ?? {},
286
+ } ) ) ?? [],
287
+ [ patterns, permissions ]
288
+ );
289
+ }
290
+
258
291
  export const usePatterns = (
259
292
  postType,
260
293
  categoryId,