@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
@@ -0,0 +1,157 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import clsx from 'clsx';
5
+
6
+ /**
7
+ * WordPress dependencies
8
+ */
9
+ import { Icon, __experimentalHStack as HStack } from '@wordpress/components';
10
+ import { __ } from '@wordpress/i18n';
11
+ import { useState, useMemo } from '@wordpress/element';
12
+ import { decodeEntities } from '@wordpress/html-entities';
13
+ import { parse } from '@wordpress/blocks';
14
+ import {
15
+ BlockPreview,
16
+ privateApis as blockEditorPrivateApis,
17
+ } from '@wordpress/block-editor';
18
+ import { EditorProvider } from '@wordpress/editor';
19
+
20
+ /**
21
+ * Internal dependencies
22
+ */
23
+ import { Async } from '../async';
24
+ import { default as Link, useLink } from '../routes/link';
25
+ import { useAddedBy } from './hooks';
26
+
27
+ import usePatternSettings from '../page-patterns/use-pattern-settings';
28
+ import { unlock } from '../../lock-unlock';
29
+
30
+ const { useGlobalStyle } = unlock( blockEditorPrivateApis );
31
+
32
+ function PreviewField( { item } ) {
33
+ const settings = usePatternSettings();
34
+ const [ backgroundColor = 'white' ] = useGlobalStyle( 'color.background' );
35
+ const blocks = useMemo( () => {
36
+ return parse( item.content.raw );
37
+ }, [ item.content.raw ] );
38
+ const { onClick } = useLink( {
39
+ postId: item.id,
40
+ postType: item.type,
41
+ canvas: 'edit',
42
+ } );
43
+
44
+ const isEmpty = ! blocks?.length;
45
+ // Wrap everything in a block editor provider to ensure 'styles' that are needed
46
+ // for the previews are synced between the site editor store and the block editor store.
47
+ // Additionally we need to have the `__experimentalBlockPatterns` setting in order to
48
+ // render patterns inside the previews.
49
+ // TODO: Same approach is used in the patterns list and it becomes obvious that some of
50
+ // the block editor settings are needed in context where we don't have the block editor.
51
+ // Explore how we can solve this in a better way.
52
+ return (
53
+ <EditorProvider post={ item } settings={ settings }>
54
+ <div
55
+ className="page-templates-preview-field"
56
+ style={ { backgroundColor } }
57
+ >
58
+ <button
59
+ className="page-templates-preview-field__button"
60
+ type="button"
61
+ onClick={ onClick }
62
+ aria-label={ item.title?.rendered || item.title }
63
+ >
64
+ { isEmpty && __( 'Empty template' ) }
65
+ { ! isEmpty && (
66
+ <Async>
67
+ <BlockPreview blocks={ blocks } />
68
+ </Async>
69
+ ) }
70
+ </button>
71
+ </div>
72
+ </EditorProvider>
73
+ );
74
+ }
75
+
76
+ export const previewField = {
77
+ label: __( 'Preview' ),
78
+ id: 'preview',
79
+ render: PreviewField,
80
+ enableSorting: false,
81
+ };
82
+
83
+ function TitleField( { item } ) {
84
+ const linkProps = {
85
+ params: {
86
+ postId: item.id,
87
+ postType: item.type,
88
+ canvas: 'edit',
89
+ },
90
+ };
91
+ return (
92
+ <Link { ...linkProps }>
93
+ { decodeEntities( item.title?.rendered ) || __( '(no title)' ) }
94
+ </Link>
95
+ );
96
+ }
97
+
98
+ export const titleField = {
99
+ label: __( 'Template' ),
100
+ id: 'title',
101
+ getValue: ( { item } ) => item.title?.rendered,
102
+ render: TitleField,
103
+ enableHiding: false,
104
+ enableGlobalSearch: true,
105
+ };
106
+
107
+ export const descriptionField = {
108
+ label: __( 'Description' ),
109
+ id: 'description',
110
+ render: ( { item } ) => {
111
+ return (
112
+ item.description && (
113
+ <span className="page-templates-description">
114
+ { decodeEntities( item.description ) }
115
+ </span>
116
+ )
117
+ );
118
+ },
119
+ enableSorting: false,
120
+ enableGlobalSearch: true,
121
+ };
122
+
123
+ function AuthorField( { item } ) {
124
+ const [ isImageLoaded, setIsImageLoaded ] = useState( false );
125
+ const { text, icon, imageUrl } = useAddedBy( item.type, item.id );
126
+
127
+ return (
128
+ <HStack alignment="left" spacing={ 0 }>
129
+ { imageUrl && (
130
+ <div
131
+ className={ clsx( 'page-templates-author-field__avatar', {
132
+ 'is-loaded': isImageLoaded,
133
+ } ) }
134
+ >
135
+ <img
136
+ onLoad={ () => setIsImageLoaded( true ) }
137
+ alt=""
138
+ src={ imageUrl }
139
+ />
140
+ </div>
141
+ ) }
142
+ { ! imageUrl && (
143
+ <div className="page-templates-author-field__icon">
144
+ <Icon icon={ icon } />
145
+ </div>
146
+ ) }
147
+ <span className="page-templates-author-field__name">{ text }</span>
148
+ </HStack>
149
+ );
150
+ }
151
+
152
+ export const authorField = {
153
+ label: __( 'Author' ),
154
+ id: 'author',
155
+ getValue: ( { item } ) => item.author_text,
156
+ render: AuthorField,
157
+ };
@@ -1,36 +1,18 @@
1
- /**
2
- * External dependencies
3
- */
4
- import clsx from 'clsx';
5
-
6
1
  /**
7
2
  * WordPress dependencies
8
3
  */
9
- import { Icon, __experimentalHStack as HStack } from '@wordpress/components';
10
4
  import { __ } from '@wordpress/i18n';
11
5
  import { useState, useMemo, useCallback, useEffect } from '@wordpress/element';
12
- import { useEntityRecords } from '@wordpress/core-data';
13
- import { decodeEntities } from '@wordpress/html-entities';
14
- import { parse } from '@wordpress/blocks';
15
- import {
16
- BlockPreview,
17
- privateApis as blockEditorPrivateApis,
18
- } from '@wordpress/block-editor';
6
+ import { privateApis as corePrivateApis } from '@wordpress/core-data';
19
7
  import { DataViews, filterSortAndPaginate } from '@wordpress/dataviews';
20
8
  import { privateApis as routerPrivateApis } from '@wordpress/router';
21
- import {
22
- privateApis as editorPrivateApis,
23
- EditorProvider,
24
- } from '@wordpress/editor';
9
+ import { privateApis as editorPrivateApis } from '@wordpress/editor';
25
10
 
26
11
  /**
27
12
  * Internal dependencies
28
13
  */
29
- import { Async } from '../async';
30
14
  import Page from '../page';
31
- import { default as Link, useLink } from '../routes/link';
32
15
  import AddNewTemplate from '../add-new-template';
33
- import { useAddedBy } from './hooks';
34
16
  import {
35
17
  TEMPLATE_POST_TYPE,
36
18
  OPERATOR_IS_ANY,
@@ -38,15 +20,18 @@ import {
38
20
  LAYOUT_TABLE,
39
21
  LAYOUT_LIST,
40
22
  } from '../../utils/constants';
41
-
42
- import usePatternSettings from '../page-patterns/use-pattern-settings';
43
23
  import { unlock } from '../../lock-unlock';
44
24
  import { useEditPostAction } from '../dataviews-actions';
25
+ import {
26
+ authorField,
27
+ descriptionField,
28
+ previewField,
29
+ titleField,
30
+ } from './fields';
45
31
 
46
32
  const { usePostActions } = unlock( editorPrivateApis );
47
-
48
- const { useGlobalStyle } = unlock( blockEditorPrivateApis );
49
33
  const { useHistory, useLocation } = unlock( routerPrivateApis );
34
+ const { useEntityRecordsWithPermissions } = unlock( corePrivateApis );
50
35
 
51
36
  const EMPTY_ARRAY = [];
52
37
 
@@ -69,8 +54,7 @@ const defaultLayouts = {
69
54
  minWidth: 320,
70
55
  },
71
56
  preview: {
72
- minWidth: 120,
73
- maxWidth: 120,
57
+ width: '1%',
74
58
  },
75
59
  author: {
76
60
  width: '1%',
@@ -109,104 +93,6 @@ const DEFAULT_VIEW = {
109
93
  filters: [],
110
94
  };
111
95
 
112
- function Title( { item, viewType } ) {
113
- if ( viewType === LAYOUT_LIST ) {
114
- return decodeEntities( item.title?.rendered ) || __( '(no title)' );
115
- }
116
- const linkProps = {
117
- params: {
118
- postId: item.id,
119
- postType: item.type,
120
- canvas: 'edit',
121
- },
122
- };
123
- return (
124
- <Link { ...linkProps }>
125
- { decodeEntities( item.title?.rendered ) || __( '(no title)' ) }
126
- </Link>
127
- );
128
- }
129
-
130
- function AuthorField( { item } ) {
131
- const [ isImageLoaded, setIsImageLoaded ] = useState( false );
132
- const { text, icon, imageUrl } = useAddedBy( item.type, item.id );
133
-
134
- return (
135
- <HStack alignment="left" spacing={ 0 }>
136
- { imageUrl && (
137
- <div
138
- className={ clsx( 'page-templates-author-field__avatar', {
139
- 'is-loaded': isImageLoaded,
140
- } ) }
141
- >
142
- <img
143
- onLoad={ () => setIsImageLoaded( true ) }
144
- alt=""
145
- src={ imageUrl }
146
- />
147
- </div>
148
- ) }
149
- { ! imageUrl && (
150
- <div className="page-templates-author-field__icon">
151
- <Icon icon={ icon } />
152
- </div>
153
- ) }
154
- <span className="page-templates-author-field__name">{ text }</span>
155
- </HStack>
156
- );
157
- }
158
-
159
- function Preview( { item, viewType } ) {
160
- const settings = usePatternSettings();
161
- const [ backgroundColor = 'white' ] = useGlobalStyle( 'color.background' );
162
- const blocks = useMemo( () => {
163
- return parse( item.content.raw );
164
- }, [ item.content.raw ] );
165
- const { onClick } = useLink( {
166
- postId: item.id,
167
- postType: item.type,
168
- canvas: 'edit',
169
- } );
170
-
171
- const isEmpty = ! blocks?.length;
172
- // Wrap everything in a block editor provider to ensure 'styles' that are needed
173
- // for the previews are synced between the site editor store and the block editor store.
174
- // Additionally we need to have the `__experimentalBlockPatterns` setting in order to
175
- // render patterns inside the previews.
176
- // TODO: Same approach is used in the patterns list and it becomes obvious that some of
177
- // the block editor settings are needed in context where we don't have the block editor.
178
- // Explore how we can solve this in a better way.
179
- return (
180
- <EditorProvider post={ item } settings={ settings }>
181
- <div
182
- className={ `page-templates-preview-field is-viewtype-${ viewType }` }
183
- style={ { backgroundColor } }
184
- >
185
- { viewType === LAYOUT_LIST && ! isEmpty && (
186
- <Async>
187
- <BlockPreview blocks={ blocks } />
188
- </Async>
189
- ) }
190
- { viewType !== LAYOUT_LIST && (
191
- <button
192
- className="page-templates-preview-field__button"
193
- type="button"
194
- onClick={ onClick }
195
- aria-label={ item.title?.rendered || item.title }
196
- >
197
- { isEmpty && __( 'Empty template' ) }
198
- { ! isEmpty && (
199
- <Async>
200
- <BlockPreview blocks={ blocks } />
201
- </Async>
202
- ) }
203
- </button>
204
- ) }
205
- </div>
206
- </EditorProvider>
207
- );
208
- }
209
-
210
96
  export default function PageTemplates() {
211
97
  const { params } = useLocation();
212
98
  const { activeView = 'all', layout, postId } = params;
@@ -248,13 +134,10 @@ export default function PageTemplates() {
248
134
  } ) );
249
135
  }, [ activeView ] );
250
136
 
251
- const { records, isResolving: isLoadingData } = useEntityRecords(
252
- 'postType',
253
- TEMPLATE_POST_TYPE,
254
- {
137
+ const { records, isResolving: isLoadingData } =
138
+ useEntityRecordsWithPermissions( 'postType', TEMPLATE_POST_TYPE, {
255
139
  per_page: -1,
256
- }
257
- );
140
+ } );
258
141
  const history = useHistory();
259
142
  const onChangeSelection = useCallback(
260
143
  ( items ) => {
@@ -285,50 +168,15 @@ export default function PageTemplates() {
285
168
 
286
169
  const fields = useMemo(
287
170
  () => [
171
+ previewField,
172
+ titleField,
173
+ descriptionField,
288
174
  {
289
- label: __( 'Preview' ),
290
- id: 'preview',
291
- render: ( { item } ) => {
292
- return <Preview item={ item } viewType={ view.type } />;
293
- },
294
- enableSorting: false,
295
- },
296
- {
297
- label: __( 'Template' ),
298
- id: 'title',
299
- getValue: ( { item } ) => item.title?.rendered,
300
- render: ( { item } ) => (
301
- <Title item={ item } viewType={ view.type } />
302
- ),
303
- enableHiding: false,
304
- enableGlobalSearch: true,
305
- },
306
- {
307
- label: __( 'Description' ),
308
- id: 'description',
309
- render: ( { item } ) => {
310
- return (
311
- item.description && (
312
- <span className="page-templates-description">
313
- { decodeEntities( item.description ) }
314
- </span>
315
- )
316
- );
317
- },
318
- enableSorting: false,
319
- enableGlobalSearch: true,
320
- },
321
- {
322
- label: __( 'Author' ),
323
- id: 'author',
324
- getValue: ( { item } ) => item.author_text,
325
- render: ( { item } ) => {
326
- return <AuthorField viewType={ view.type } item={ item } />;
327
- },
175
+ ...authorField,
328
176
  elements: authors,
329
177
  },
330
178
  ],
331
- [ authors, view.type ]
179
+ [ authors ]
332
180
  );
333
181
 
334
182
  const { data, paginationInfo } = useMemo( () => {
@@ -366,6 +214,7 @@ export default function PageTemplates() {
366
214
  actions={ <AddNewTemplate /> }
367
215
  >
368
216
  <DataViews
217
+ key={ activeView }
369
218
  paginationInfo={ paginationInfo }
370
219
  fields={ fields }
371
220
  actions={ actions }
@@ -3,6 +3,7 @@
3
3
  flex-direction: column;
4
4
  height: 100%;
5
5
  width: 100%;
6
+ border-radius: $radius-medium;
6
7
 
7
8
  .page-templates-preview-field__button {
8
9
  box-shadow: none;
@@ -13,7 +14,7 @@
13
14
  cursor: pointer;
14
15
  overflow: hidden;
15
16
  height: 100%;
16
- border-radius: $grid-unit-05;
17
+ border-radius: $radius-medium;
17
18
 
18
19
  &:focus-visible {
19
20
  box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
@@ -22,21 +23,23 @@
22
23
  }
23
24
  }
24
25
 
25
- &.is-viewtype-list {
26
+ .dataviews-view-list & {
26
27
  .block-editor-block-preview__container {
27
28
  height: 120px;
28
29
  }
29
30
  }
30
31
 
31
- &.is-viewtype-grid {
32
+ .dataviews-view-grid & {
32
33
  .block-editor-block-preview__container {
33
34
  height: 100%;
34
35
  }
35
36
  }
36
37
 
37
- &.is-viewtype-table {
38
+ .dataviews-view-table & {
38
39
  border-radius: $radius-block-ui;
39
40
  position: relative;
41
+ width: 120px;
42
+ max-height: 160px;
40
43
 
41
44
  &::after {
42
45
  content: "";
@@ -52,7 +55,13 @@
52
55
  }
53
56
 
54
57
  .page-templates-description {
55
- white-space: normal;
58
+ max-width: 50em;
59
+ text-wrap: balance; // Fallback for Safari
60
+ text-wrap: pretty;
61
+
62
+ .dataviews-view-table & {
63
+ margin-bottom: $grid-unit-10;
64
+ }
56
65
  }
57
66
 
58
67
  .edit-site-page-templates {
@@ -8,27 +8,29 @@ import clsx from 'clsx';
8
8
  */
9
9
  import { __ } from '@wordpress/i18n';
10
10
  import { DataForm } from '@wordpress/dataviews';
11
- import { useDispatch, useSelect, useRegistry } from '@wordpress/data';
11
+ import { useDispatch, useSelect } from '@wordpress/data';
12
12
  import { store as coreDataStore } from '@wordpress/core-data';
13
- import { Button } from '@wordpress/components';
14
- import { useState, useMemo } from '@wordpress/element';
13
+ import { __experimentalVStack as VStack } from '@wordpress/components';
14
+ import { useState, useMemo, useEffect } from '@wordpress/element';
15
+ import { privateApis as editorPrivateApis } from '@wordpress/editor';
15
16
 
16
17
  /**
17
18
  * Internal dependencies
18
19
  */
19
20
  import Page from '../page';
20
21
  import usePostFields from '../post-fields';
22
+ import { unlock } from '../../lock-unlock';
23
+
24
+ const { PostCardPanel } = unlock( editorPrivateApis );
21
25
 
22
26
  function PostEditForm( { postType, postId } ) {
23
27
  const ids = useMemo( () => postId.split( ',' ), [ postId ] );
24
- const { initialEdits } = useSelect(
28
+ const { record } = useSelect(
25
29
  ( select ) => {
26
- if ( ids.length !== 1 ) {
27
- }
28
30
  return {
29
- initialEdits:
31
+ record:
30
32
  ids.length === 1
31
- ? select( coreDataStore ).getEntityRecord(
33
+ ? select( coreDataStore ).getEditedEntityRecord(
32
34
  'postType',
33
35
  postType,
34
36
  ids[ 0 ]
@@ -38,44 +40,65 @@ function PostEditForm( { postType, postId } ) {
38
40
  },
39
41
  [ postType, ids ]
40
42
  );
41
- const registry = useRegistry();
42
- const { saveEntityRecord } = useDispatch( coreDataStore );
43
- const { fields } = usePostFields();
43
+ const [ multiEdits, setMultiEdits ] = useState( {} );
44
+ const { editEntityRecord } = useDispatch( coreDataStore );
45
+ const { fields: _fields } = usePostFields();
46
+ const fields = useMemo(
47
+ () =>
48
+ _fields?.map( ( field ) => {
49
+ if ( field.id === 'status' ) {
50
+ return {
51
+ ...field,
52
+ elements: field.elements.filter(
53
+ ( element ) => element.value !== 'trash'
54
+ ),
55
+ };
56
+ }
57
+ return field;
58
+ } ),
59
+ [ _fields ]
60
+ );
44
61
  const form = {
45
- visibleFields: [ 'title' ],
62
+ type: 'panel',
63
+ fields: [ 'title', 'status', 'date', 'author', 'comment_status' ],
46
64
  };
47
- const [ edits, setEdits ] = useState( {} );
48
- const itemWithEdits = useMemo( () => {
49
- return {
50
- ...initialEdits,
51
- ...edits,
52
- };
53
- }, [ initialEdits, edits ] );
54
- const onSubmit = async ( event ) => {
55
- event.preventDefault();
56
- const { getEntityRecord } = registry.resolveSelect( coreDataStore );
65
+ const onChange = ( edits ) => {
57
66
  for ( const id of ids ) {
58
- const item = await getEntityRecord( 'postType', postType, id );
59
- saveEntityRecord( 'postType', postType, {
60
- ...item,
61
- ...edits,
62
- } );
67
+ if (
68
+ edits.status !== 'future' &&
69
+ record.status === 'future' &&
70
+ new Date( record.date ) > new Date()
71
+ ) {
72
+ edits.date = null;
73
+ }
74
+ if ( edits.status === 'private' && record.password ) {
75
+ edits.password = '';
76
+ }
77
+ editEntityRecord( 'postType', postType, id, edits );
78
+ if ( ids.length > 1 ) {
79
+ setMultiEdits( ( prev ) => ( {
80
+ ...prev,
81
+ ...edits,
82
+ } ) );
83
+ }
63
84
  }
64
- setEdits( {} );
65
85
  };
86
+ useEffect( () => {
87
+ setMultiEdits( {} );
88
+ }, [ ids ] );
66
89
 
67
90
  return (
68
- <form onSubmit={ onSubmit }>
91
+ <VStack spacing={ 4 }>
92
+ { ids.length === 1 && (
93
+ <PostCardPanel postType={ postType } postId={ ids[ 0 ] } />
94
+ ) }
69
95
  <DataForm
70
- data={ itemWithEdits }
96
+ data={ ids.length === 1 ? record : multiEdits }
71
97
  fields={ fields }
72
98
  form={ form }
73
- onChange={ setEdits }
99
+ onChange={ onChange }
74
100
  />
75
- <Button variant="primary" type="submit">
76
- { __( 'Update' ) }
77
- </Button>
78
- </form>
101
+ </VStack>
79
102
  );
80
103
  }
81
104