@wordpress/edit-site 6.3.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 (334) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/build/components/add-new-pattern/index.js +14 -3
  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/index.js +3 -1
  7. package/build/components/add-new-template/index.js.map +1 -1
  8. package/build/components/add-new-template/utils.js +2 -2
  9. package/build/components/add-new-template/utils.js.map +1 -1
  10. package/build/components/block-editor/use-site-editor-settings.js +1 -82
  11. package/build/components/block-editor/use-site-editor-settings.js.map +1 -1
  12. package/build/components/editor/index.js +71 -20
  13. package/build/components/editor/index.js.map +1 -1
  14. package/build/components/global-styles/block-preview-panel.js +14 -5
  15. package/build/components/global-styles/block-preview-panel.js.map +1 -1
  16. package/build/components/global-styles/font-families.js +40 -22
  17. package/build/components/global-styles/font-families.js.map +1 -1
  18. package/build/components/global-styles/font-library-modal/context.js +0 -5
  19. package/build/components/global-styles/font-library-modal/context.js.map +1 -1
  20. package/build/components/global-styles/font-library-modal/font-collection.js +25 -5
  21. package/build/components/global-styles/font-library-modal/font-collection.js.map +1 -1
  22. package/build/components/global-styles/font-library-modal/index.js +5 -12
  23. package/build/components/global-styles/font-library-modal/index.js.map +1 -1
  24. package/build/components/global-styles/font-library-modal/installed-fonts.js +78 -15
  25. package/build/components/global-styles/font-library-modal/installed-fonts.js.map +1 -1
  26. package/build/components/global-styles/font-library-modal/upload-fonts.js +2 -3
  27. package/build/components/global-styles/font-library-modal/upload-fonts.js.map +1 -1
  28. package/build/components/global-styles/font-sizes/confirm-delete-font-size-dialog.js +39 -0
  29. package/build/components/global-styles/font-sizes/confirm-delete-font-size-dialog.js.map +1 -0
  30. package/build/components/global-styles/font-sizes/confirm-reset-font-sizes-dialog.js +39 -0
  31. package/build/components/global-styles/font-sizes/confirm-reset-font-sizes-dialog.js.map +1 -0
  32. package/build/components/global-styles/font-sizes/font-size-preview.js +44 -0
  33. package/build/components/global-styles/font-sizes/font-size-preview.js.map +1 -0
  34. package/build/components/global-styles/font-sizes/font-size.js +213 -0
  35. package/build/components/global-styles/font-sizes/font-size.js.map +1 -0
  36. package/build/components/global-styles/font-sizes/font-sizes-count.js +50 -0
  37. package/build/components/global-styles/font-sizes/font-sizes-count.js.map +1 -0
  38. package/build/components/global-styles/font-sizes/font-sizes.js +163 -0
  39. package/build/components/global-styles/font-sizes/font-sizes.js.map +1 -0
  40. package/build/components/global-styles/font-sizes/rename-font-size-dialog.js +67 -0
  41. package/build/components/global-styles/font-sizes/rename-font-size-dialog.js.map +1 -0
  42. package/build/components/global-styles/screen-block.js +10 -8
  43. package/build/components/global-styles/screen-block.js.map +1 -1
  44. package/build/components/global-styles/screen-style-variations.js +2 -2
  45. package/build/components/global-styles/screen-style-variations.js.map +1 -1
  46. package/build/components/global-styles/screen-typeset.js +40 -0
  47. package/build/components/global-styles/screen-typeset.js.map +1 -0
  48. package/build/components/global-styles/screen-typography-element.js +14 -0
  49. package/build/components/global-styles/screen-typography-element.js.map +1 -1
  50. package/build/components/global-styles/screen-typography.js +5 -6
  51. package/build/components/global-styles/screen-typography.js.map +1 -1
  52. package/build/components/global-styles/shadows-edit-panel.js +50 -59
  53. package/build/components/global-styles/shadows-edit-panel.js.map +1 -1
  54. package/build/components/global-styles/size-control/index.js +85 -0
  55. package/build/components/global-styles/size-control/index.js.map +1 -0
  56. package/build/components/global-styles/style-variations-container.js +3 -0
  57. package/build/components/global-styles/style-variations-container.js.map +1 -1
  58. package/build/components/global-styles/typeset-button.js +97 -0
  59. package/build/components/global-styles/typeset-button.js.map +1 -0
  60. package/build/components/global-styles/typeset.js +80 -0
  61. package/build/components/global-styles/typeset.js.map +1 -0
  62. package/build/components/global-styles/ui.js +12 -0
  63. package/build/components/global-styles/ui.js.map +1 -1
  64. package/build/components/global-styles/utils.js +10 -1
  65. package/build/components/global-styles/utils.js.map +1 -1
  66. package/build/components/global-styles/variations/variations-color.js.map +1 -1
  67. package/build/components/global-styles/variations/variations-typography.js +1 -1
  68. package/build/components/global-styles/variations/variations-typography.js.map +1 -1
  69. package/build/components/layout/index.js +6 -0
  70. package/build/components/layout/index.js.map +1 -1
  71. package/build/components/layout/router.js +14 -6
  72. package/build/components/layout/router.js.map +1 -1
  73. package/build/components/page-patterns/fields.js +230 -0
  74. package/build/components/page-patterns/fields.js.map +1 -0
  75. package/build/components/page-patterns/header.js +1 -1
  76. package/build/components/page-patterns/header.js.map +1 -1
  77. package/build/components/page-patterns/index.js +21 -227
  78. package/build/components/page-patterns/index.js.map +1 -1
  79. package/build/components/page-patterns/use-patterns.js +26 -1
  80. package/build/components/page-patterns/use-patterns.js.map +1 -1
  81. package/build/components/page-templates/fields.js +169 -0
  82. package/build/components/page-templates/fields.js.map +1 -0
  83. package/build/components/page-templates/index.js +38 -198
  84. package/build/components/page-templates/index.js.map +1 -1
  85. package/build/components/post-edit/index.js +117 -0
  86. package/build/components/post-edit/index.js.map +1 -0
  87. package/build/components/post-fields/index.js +318 -0
  88. package/build/components/post-fields/index.js.map +1 -0
  89. package/build/components/post-list/index.js +339 -0
  90. package/build/components/post-list/index.js.map +1 -0
  91. package/build/components/posts-app/router.js +3 -3
  92. package/build/components/posts-app/router.js.map +1 -1
  93. package/build/components/sidebar-dataviews/add-new-view.js +2 -2
  94. package/build/components/sidebar-dataviews/add-new-view.js.map +1 -1
  95. package/build/components/sidebar-dataviews/dataview-item.js +2 -3
  96. package/build/components/sidebar-dataviews/dataview-item.js.map +1 -1
  97. package/build/components/sidebar-dataviews/default-views.js +103 -91
  98. package/build/components/sidebar-dataviews/default-views.js.map +1 -1
  99. package/build/components/sidebar-dataviews/index.js +2 -2
  100. package/build/components/sidebar-dataviews/index.js.map +1 -1
  101. package/build/components/sidebar-navigation-screen-global-styles/content.js +64 -0
  102. package/build/components/sidebar-navigation-screen-global-styles/content.js.map +1 -0
  103. package/build/components/sidebar-navigation-screen-global-styles/index.js +2 -47
  104. package/build/components/sidebar-navigation-screen-global-styles/index.js.map +1 -1
  105. package/build/components/site-hub/index.js +6 -3
  106. package/build/components/site-hub/index.js.map +1 -1
  107. package/build/components/style-book/index.js +22 -25
  108. package/build/components/style-book/index.js.map +1 -1
  109. package/build/components/sync-state-with-url/use-init-edited-entity-from-url.js +5 -0
  110. package/build/components/sync-state-with-url/use-init-edited-entity-from-url.js.map +1 -1
  111. package/build/hooks/push-changes-to-global-styles/index.js +3 -4
  112. package/build/hooks/push-changes-to-global-styles/index.js.map +1 -1
  113. package/build/hooks/use-theme-style-variations/use-theme-style-variations-by-property.js +2 -4
  114. package/build/hooks/use-theme-style-variations/use-theme-style-variations-by-property.js.map +1 -1
  115. package/build/index.js +4 -2
  116. package/build/index.js.map +1 -1
  117. package/build/store/selectors.js +34 -6
  118. package/build/store/selectors.js.map +1 -1
  119. package/build/utils/get-filtered-template-parts.js +64 -0
  120. package/build/utils/get-filtered-template-parts.js.map +1 -0
  121. package/build-module/components/add-new-pattern/index.js +14 -3
  122. package/build-module/components/add-new-pattern/index.js.map +1 -1
  123. package/build-module/components/add-new-post/index.js +2 -1
  124. package/build-module/components/add-new-post/index.js.map +1 -1
  125. package/build-module/components/add-new-template/index.js +3 -1
  126. package/build-module/components/add-new-template/index.js.map +1 -1
  127. package/build-module/components/add-new-template/utils.js +2 -2
  128. package/build-module/components/add-new-template/utils.js.map +1 -1
  129. package/build-module/components/block-editor/use-site-editor-settings.js +1 -82
  130. package/build-module/components/block-editor/use-site-editor-settings.js.map +1 -1
  131. package/build-module/components/editor/index.js +73 -22
  132. package/build-module/components/editor/index.js.map +1 -1
  133. package/build-module/components/global-styles/block-preview-panel.js +14 -5
  134. package/build-module/components/global-styles/block-preview-panel.js.map +1 -1
  135. package/build-module/components/global-styles/font-families.js +42 -24
  136. package/build-module/components/global-styles/font-families.js.map +1 -1
  137. package/build-module/components/global-styles/font-library-modal/context.js +0 -5
  138. package/build-module/components/global-styles/font-library-modal/context.js.map +1 -1
  139. package/build-module/components/global-styles/font-library-modal/font-collection.js +26 -6
  140. package/build-module/components/global-styles/font-library-modal/font-collection.js.map +1 -1
  141. package/build-module/components/global-styles/font-library-modal/index.js +5 -12
  142. package/build-module/components/global-styles/font-library-modal/index.js.map +1 -1
  143. package/build-module/components/global-styles/font-library-modal/installed-fonts.js +81 -18
  144. package/build-module/components/global-styles/font-library-modal/installed-fonts.js.map +1 -1
  145. package/build-module/components/global-styles/font-library-modal/upload-fonts.js +2 -3
  146. package/build-module/components/global-styles/font-library-modal/upload-fonts.js.map +1 -1
  147. package/build-module/components/global-styles/font-sizes/confirm-delete-font-size-dialog.js +32 -0
  148. package/build-module/components/global-styles/font-sizes/confirm-delete-font-size-dialog.js.map +1 -0
  149. package/build-module/components/global-styles/font-sizes/confirm-reset-font-sizes-dialog.js +32 -0
  150. package/build-module/components/global-styles/font-sizes/confirm-reset-font-sizes-dialog.js.map +1 -0
  151. package/build-module/components/global-styles/font-sizes/font-size-preview.js +37 -0
  152. package/build-module/components/global-styles/font-sizes/font-size-preview.js.map +1 -0
  153. package/build-module/components/global-styles/font-sizes/font-size.js +207 -0
  154. package/build-module/components/global-styles/font-sizes/font-size.js.map +1 -0
  155. package/build-module/components/global-styles/font-sizes/font-sizes-count.js +43 -0
  156. package/build-module/components/global-styles/font-sizes/font-sizes-count.js.map +1 -0
  157. package/build-module/components/global-styles/font-sizes/font-sizes.js +157 -0
  158. package/build-module/components/global-styles/font-sizes/font-sizes.js.map +1 -0
  159. package/build-module/components/global-styles/font-sizes/rename-font-size-dialog.js +61 -0
  160. package/build-module/components/global-styles/font-sizes/rename-font-size-dialog.js.map +1 -0
  161. package/build-module/components/global-styles/screen-block.js +10 -8
  162. package/build-module/components/global-styles/screen-block.js.map +1 -1
  163. package/build-module/components/global-styles/screen-style-variations.js +2 -2
  164. package/build-module/components/global-styles/screen-style-variations.js.map +1 -1
  165. package/build-module/components/global-styles/screen-typeset.js +34 -0
  166. package/build-module/components/global-styles/screen-typeset.js.map +1 -0
  167. package/build-module/components/global-styles/screen-typography-element.js +14 -0
  168. package/build-module/components/global-styles/screen-typography-element.js.map +1 -1
  169. package/build-module/components/global-styles/screen-typography.js +5 -6
  170. package/build-module/components/global-styles/screen-typography.js.map +1 -1
  171. package/build-module/components/global-styles/shadows-edit-panel.js +51 -60
  172. package/build-module/components/global-styles/shadows-edit-panel.js.map +1 -1
  173. package/build-module/components/global-styles/size-control/index.js +79 -0
  174. package/build-module/components/global-styles/size-control/index.js.map +1 -0
  175. package/build-module/components/global-styles/style-variations-container.js +3 -0
  176. package/build-module/components/global-styles/style-variations-container.js.map +1 -1
  177. package/build-module/components/global-styles/typeset-button.js +89 -0
  178. package/build-module/components/global-styles/typeset-button.js.map +1 -0
  179. package/build-module/components/global-styles/typeset.js +71 -0
  180. package/build-module/components/global-styles/typeset.js.map +1 -0
  181. package/build-module/components/global-styles/ui.js +12 -0
  182. package/build-module/components/global-styles/ui.js.map +1 -1
  183. package/build-module/components/global-styles/utils.js +10 -1
  184. package/build-module/components/global-styles/utils.js.map +1 -1
  185. package/build-module/components/global-styles/variations/variations-color.js +1 -1
  186. package/build-module/components/global-styles/variations/variations-color.js.map +1 -1
  187. package/build-module/components/global-styles/variations/variations-typography.js +1 -2
  188. package/build-module/components/global-styles/variations/variations-typography.js.map +1 -1
  189. package/build-module/components/layout/index.js +6 -0
  190. package/build-module/components/layout/index.js.map +1 -1
  191. package/build-module/components/layout/router.js +14 -6
  192. package/build-module/components/layout/router.js.map +1 -1
  193. package/build-module/components/page-patterns/fields.js +223 -0
  194. package/build-module/components/page-patterns/fields.js.map +1 -0
  195. package/build-module/components/page-patterns/header.js +1 -1
  196. package/build-module/components/page-patterns/header.js.map +1 -1
  197. package/build-module/components/page-patterns/index.js +24 -230
  198. package/build-module/components/page-patterns/index.js.map +1 -1
  199. package/build-module/components/page-patterns/use-patterns.js +26 -1
  200. package/build-module/components/page-patterns/use-patterns.js.map +1 -1
  201. package/build-module/components/page-templates/fields.js +160 -0
  202. package/build-module/components/page-templates/fields.js.map +1 -0
  203. package/build-module/components/page-templates/index.js +39 -199
  204. package/build-module/components/page-templates/index.js.map +1 -1
  205. package/build-module/components/post-edit/index.js +110 -0
  206. package/build-module/components/post-edit/index.js.map +1 -0
  207. package/build-module/components/post-fields/index.js +310 -0
  208. package/build-module/components/post-fields/index.js.map +1 -0
  209. package/build-module/components/post-list/index.js +333 -0
  210. package/build-module/components/post-list/index.js.map +1 -0
  211. package/build-module/components/posts-app/router.js +3 -3
  212. package/build-module/components/posts-app/router.js.map +1 -1
  213. package/build-module/components/sidebar-dataviews/add-new-view.js +2 -2
  214. package/build-module/components/sidebar-dataviews/add-new-view.js.map +1 -1
  215. package/build-module/components/sidebar-dataviews/dataview-item.js +2 -3
  216. package/build-module/components/sidebar-dataviews/dataview-item.js.map +1 -1
  217. package/build-module/components/sidebar-dataviews/default-views.js +102 -90
  218. package/build-module/components/sidebar-dataviews/default-views.js.map +1 -1
  219. package/build-module/components/sidebar-dataviews/index.js +5 -5
  220. package/build-module/components/sidebar-dataviews/index.js.map +1 -1
  221. package/build-module/components/sidebar-navigation-screen-global-styles/content.js +57 -0
  222. package/build-module/components/sidebar-navigation-screen-global-styles/content.js.map +1 -0
  223. package/build-module/components/sidebar-navigation-screen-global-styles/index.js +2 -47
  224. package/build-module/components/sidebar-navigation-screen-global-styles/index.js.map +1 -1
  225. package/build-module/components/site-hub/index.js +7 -4
  226. package/build-module/components/site-hub/index.js.map +1 -1
  227. package/build-module/components/style-book/index.js +23 -26
  228. package/build-module/components/style-book/index.js.map +1 -1
  229. package/build-module/components/sync-state-with-url/use-init-edited-entity-from-url.js +5 -0
  230. package/build-module/components/sync-state-with-url/use-init-edited-entity-from-url.js.map +1 -1
  231. package/build-module/hooks/push-changes-to-global-styles/index.js +3 -4
  232. package/build-module/hooks/push-changes-to-global-styles/index.js.map +1 -1
  233. package/build-module/hooks/use-theme-style-variations/use-theme-style-variations-by-property.js +2 -3
  234. package/build-module/hooks/use-theme-style-variations/use-theme-style-variations-by-property.js.map +1 -1
  235. package/build-module/index.js +4 -2
  236. package/build-module/index.js.map +1 -1
  237. package/build-module/store/selectors.js +35 -7
  238. package/build-module/store/selectors.js.map +1 -1
  239. package/build-module/utils/get-filtered-template-parts.js +57 -0
  240. package/build-module/utils/get-filtered-template-parts.js.map +1 -0
  241. package/build-style/posts-rtl.css +749 -492
  242. package/build-style/posts.css +749 -492
  243. package/build-style/style-rtl.css +956 -613
  244. package/build-style/style.css +956 -613
  245. package/package.json +41 -41
  246. package/src/components/add-new-pattern/index.js +16 -5
  247. package/src/components/add-new-post/index.js +2 -1
  248. package/src/components/add-new-template/index.js +4 -1
  249. package/src/components/add-new-template/style.scss +4 -6
  250. package/src/components/add-new-template/utils.js +10 -6
  251. package/src/components/block-editor/use-site-editor-settings.js +15 -111
  252. package/src/components/editor/index.js +80 -22
  253. package/src/components/editor/style.scss +59 -1
  254. package/src/components/global-styles/block-preview-panel.js +22 -9
  255. package/src/components/global-styles/font-families.js +65 -32
  256. package/src/components/global-styles/font-library-modal/context.js +0 -5
  257. package/src/components/global-styles/font-library-modal/font-collection.js +34 -10
  258. package/src/components/global-styles/font-library-modal/index.js +6 -9
  259. package/src/components/global-styles/font-library-modal/installed-fonts.js +115 -16
  260. package/src/components/global-styles/font-library-modal/style.scss +9 -0
  261. package/src/components/global-styles/font-library-modal/upload-fonts.js +2 -2
  262. package/src/components/global-styles/font-sizes/confirm-delete-font-size-dialog.js +43 -0
  263. package/src/components/global-styles/font-sizes/confirm-reset-font-sizes-dialog.js +37 -0
  264. package/src/components/global-styles/font-sizes/font-size-preview.js +43 -0
  265. package/src/components/global-styles/font-sizes/font-size.js +250 -0
  266. package/src/components/global-styles/font-sizes/font-sizes-count.js +40 -0
  267. package/src/components/global-styles/font-sizes/font-sizes.js +263 -0
  268. package/src/components/global-styles/font-sizes/rename-font-size-dialog.js +70 -0
  269. package/src/components/global-styles/screen-block.js +12 -14
  270. package/src/components/global-styles/screen-style-variations.js +2 -2
  271. package/src/components/global-styles/screen-typeset.js +42 -0
  272. package/src/components/global-styles/screen-typography-element.js +14 -0
  273. package/src/components/global-styles/screen-typography.js +7 -6
  274. package/src/components/global-styles/shadows-edit-panel.js +66 -73
  275. package/src/components/global-styles/size-control/index.js +86 -0
  276. package/src/components/global-styles/style-variations-container.js +4 -0
  277. package/src/components/global-styles/style.scss +17 -10
  278. package/src/components/global-styles/typeset-button.js +93 -0
  279. package/src/components/global-styles/typeset.js +73 -0
  280. package/src/components/global-styles/ui.js +15 -0
  281. package/src/components/global-styles/utils.js +13 -1
  282. package/src/components/global-styles/variations/variations-color.js +1 -1
  283. package/src/components/global-styles/variations/variations-typography.js +1 -2
  284. package/src/components/layout/index.js +11 -0
  285. package/src/components/layout/router.js +13 -5
  286. package/src/components/layout/style.scss +34 -8
  287. package/src/components/page-patterns/fields.js +251 -0
  288. package/src/components/page-patterns/header.js +1 -1
  289. package/src/components/page-patterns/index.js +24 -246
  290. package/src/components/page-patterns/style.scss +82 -85
  291. package/src/components/page-patterns/use-patterns.js +31 -1
  292. package/src/components/page-templates/fields.js +157 -0
  293. package/src/components/page-templates/index.js +46 -192
  294. package/src/components/page-templates/style.scss +19 -8
  295. package/src/components/post-edit/index.js +115 -0
  296. package/src/components/post-edit/style.scss +9 -0
  297. package/src/components/post-fields/index.js +357 -0
  298. package/src/components/post-list/index.js +386 -0
  299. package/src/components/{posts-app → post-list}/style.scss +12 -9
  300. package/src/components/posts-app/router.js +3 -3
  301. package/src/components/sidebar-dataviews/add-new-view.js +2 -4
  302. package/src/components/sidebar-dataviews/dataview-item.js +2 -2
  303. package/src/components/sidebar-dataviews/default-views.js +116 -104
  304. package/src/components/sidebar-dataviews/index.js +4 -3
  305. package/src/components/sidebar-navigation-screen-global-styles/content.js +55 -0
  306. package/src/components/sidebar-navigation-screen-global-styles/index.js +1 -55
  307. package/src/components/site-hub/index.js +11 -2
  308. package/src/components/site-icon/style.scss +4 -1
  309. package/src/components/style-book/index.js +27 -32
  310. package/src/components/sync-state-with-url/use-init-edited-entity-from-url.js +5 -0
  311. package/src/hooks/push-changes-to-global-styles/index.js +3 -4
  312. package/src/hooks/use-theme-style-variations/use-theme-style-variations-by-property.js +2 -3
  313. package/src/index.js +6 -2
  314. package/src/posts.scss +1 -1
  315. package/src/store/selectors.js +53 -14
  316. package/src/store/test/selectors.js +1 -26
  317. package/src/style.scss +2 -1
  318. package/src/utils/get-filtered-template-parts.js +61 -0
  319. package/src/utils/test/get-filtered-template-parts.js +127 -0
  320. package/build/components/global-styles/screen-background.js +0 -36
  321. package/build/components/global-styles/screen-background.js.map +0 -1
  322. package/build/components/posts-app/posts-list.js +0 -568
  323. package/build/components/posts-app/posts-list.js.map +0 -1
  324. package/build/utils/clone-deep.js +0 -15
  325. package/build/utils/clone-deep.js.map +0 -1
  326. package/build-module/components/global-styles/screen-background.js +0 -30
  327. package/build-module/components/global-styles/screen-background.js.map +0 -1
  328. package/build-module/components/posts-app/posts-list.js +0 -560
  329. package/build-module/components/posts-app/posts-list.js.map +0 -1
  330. package/build-module/utils/clone-deep.js +0 -9
  331. package/build-module/utils/clone-deep.js.map +0 -1
  332. package/src/components/global-styles/screen-background.js +0 -29
  333. package/src/components/posts-app/posts-list.js +0 -651
  334. 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,26 +1,9 @@
1
- /**
2
- * External dependencies
3
- */
4
- import clsx from 'clsx';
5
-
6
1
  /**
7
2
  * WordPress dependencies
8
3
  */
9
- import {
10
- Icon,
11
- __experimentalText as Text,
12
- __experimentalHStack as HStack,
13
- VisuallyHidden,
14
- } from '@wordpress/components';
15
4
  import { __ } from '@wordpress/i18n';
16
5
  import { useState, useMemo, useCallback, useEffect } from '@wordpress/element';
17
- import { useEntityRecords } from '@wordpress/core-data';
18
- import { decodeEntities } from '@wordpress/html-entities';
19
- import { parse } from '@wordpress/blocks';
20
- import {
21
- BlockPreview,
22
- privateApis as blockEditorPrivateApis,
23
- } from '@wordpress/block-editor';
6
+ import { privateApis as corePrivateApis } from '@wordpress/core-data';
24
7
  import { DataViews, filterSortAndPaginate } from '@wordpress/dataviews';
25
8
  import { privateApis as routerPrivateApis } from '@wordpress/router';
26
9
  import { privateApis as editorPrivateApis } from '@wordpress/editor';
@@ -28,11 +11,8 @@ import { privateApis as editorPrivateApis } from '@wordpress/editor';
28
11
  /**
29
12
  * Internal dependencies
30
13
  */
31
- import { Async } from '../async';
32
14
  import Page from '../page';
33
- import { default as Link, useLink } from '../routes/link';
34
15
  import AddNewTemplate from '../add-new-template';
35
- import { useAddedBy } from './hooks';
36
16
  import {
37
17
  TEMPLATE_POST_TYPE,
38
18
  OPERATOR_IS_ANY,
@@ -40,27 +20,50 @@ import {
40
20
  LAYOUT_TABLE,
41
21
  LAYOUT_LIST,
42
22
  } from '../../utils/constants';
43
-
44
- import usePatternSettings from '../page-patterns/use-pattern-settings';
45
23
  import { unlock } from '../../lock-unlock';
46
24
  import { useEditPostAction } from '../dataviews-actions';
25
+ import {
26
+ authorField,
27
+ descriptionField,
28
+ previewField,
29
+ titleField,
30
+ } from './fields';
47
31
 
48
32
  const { usePostActions } = unlock( editorPrivateApis );
49
-
50
- const { ExperimentalBlockEditorProvider, useGlobalStyle } = unlock(
51
- blockEditorPrivateApis
52
- );
53
33
  const { useHistory, useLocation } = unlock( routerPrivateApis );
34
+ const { useEntityRecordsWithPermissions } = unlock( corePrivateApis );
54
35
 
55
36
  const EMPTY_ARRAY = [];
56
37
 
57
38
  const defaultLayouts = {
58
39
  [ LAYOUT_TABLE ]: {
40
+ fields: [ 'template', 'author' ],
59
41
  layout: {
60
42
  primaryField: 'title',
43
+ combinedFields: [
44
+ {
45
+ id: 'template',
46
+ label: __( 'Template' ),
47
+ children: [ 'title', 'description' ],
48
+ direction: 'vertical',
49
+ },
50
+ ],
51
+ styles: {
52
+ template: {
53
+ maxWidth: 400,
54
+ minWidth: 320,
55
+ },
56
+ preview: {
57
+ width: '1%',
58
+ },
59
+ author: {
60
+ width: '1%',
61
+ },
62
+ },
61
63
  },
62
64
  },
63
65
  [ LAYOUT_GRID ]: {
66
+ fields: [ 'title', 'description', 'author' ],
64
67
  layout: {
65
68
  mediaField: 'preview',
66
69
  primaryField: 'title',
@@ -68,6 +71,7 @@ const defaultLayouts = {
68
71
  },
69
72
  },
70
73
  [ LAYOUT_LIST ]: {
74
+ fields: [ 'title', 'description', 'author' ],
71
75
  layout: {
72
76
  primaryField: 'title',
73
77
  mediaField: 'preview',
@@ -84,110 +88,11 @@ const DEFAULT_VIEW = {
84
88
  field: 'title',
85
89
  direction: 'asc',
86
90
  },
87
- fields: [ 'title', 'description', 'author' ],
91
+ fields: defaultLayouts[ LAYOUT_GRID ].fields,
88
92
  layout: defaultLayouts[ LAYOUT_GRID ].layout,
89
93
  filters: [],
90
94
  };
91
95
 
92
- function Title( { item, viewType } ) {
93
- if ( viewType === LAYOUT_LIST ) {
94
- return decodeEntities( item.title?.rendered ) || __( '(no title)' );
95
- }
96
- const linkProps = {
97
- params: {
98
- postId: item.id,
99
- postType: item.type,
100
- canvas: 'edit',
101
- },
102
- };
103
- return (
104
- <Link { ...linkProps }>
105
- { decodeEntities( item.title?.rendered ) || __( '(no title)' ) }
106
- </Link>
107
- );
108
- }
109
-
110
- function AuthorField( { item, viewType } ) {
111
- const [ isImageLoaded, setIsImageLoaded ] = useState( false );
112
- const { text, icon, imageUrl } = useAddedBy( item.type, item.id );
113
- const withIcon = viewType !== LAYOUT_LIST;
114
-
115
- return (
116
- <HStack alignment="left" spacing={ 1 }>
117
- { withIcon && imageUrl && (
118
- <div
119
- className={ clsx( 'page-templates-author-field__avatar', {
120
- 'is-loaded': isImageLoaded,
121
- } ) }
122
- >
123
- <img
124
- onLoad={ () => setIsImageLoaded( true ) }
125
- alt=""
126
- src={ imageUrl }
127
- />
128
- </div>
129
- ) }
130
- { withIcon && ! imageUrl && (
131
- <div className="page-templates-author-field__icon">
132
- <Icon icon={ icon } />
133
- </div>
134
- ) }
135
- <span className="page-templates-author-field__name">{ text }</span>
136
- </HStack>
137
- );
138
- }
139
-
140
- function Preview( { item, viewType } ) {
141
- const settings = usePatternSettings();
142
- const [ backgroundColor = 'white' ] = useGlobalStyle( 'color.background' );
143
- const blocks = useMemo( () => {
144
- return parse( item.content.raw );
145
- }, [ item.content.raw ] );
146
- const { onClick } = useLink( {
147
- postId: item.id,
148
- postType: item.type,
149
- canvas: 'edit',
150
- } );
151
-
152
- const isEmpty = ! blocks?.length;
153
- // Wrap everything in a block editor provider to ensure 'styles' that are needed
154
- // for the previews are synced between the site editor store and the block editor store.
155
- // Additionally we need to have the `__experimentalBlockPatterns` setting in order to
156
- // render patterns inside the previews.
157
- // TODO: Same approach is used in the patterns list and it becomes obvious that some of
158
- // the block editor settings are needed in context where we don't have the block editor.
159
- // Explore how we can solve this in a better way.
160
- return (
161
- <ExperimentalBlockEditorProvider settings={ settings }>
162
- <div
163
- className={ `page-templates-preview-field is-viewtype-${ viewType }` }
164
- style={ { backgroundColor } }
165
- >
166
- { viewType === LAYOUT_LIST && ! isEmpty && (
167
- <Async>
168
- <BlockPreview blocks={ blocks } />
169
- </Async>
170
- ) }
171
- { viewType !== LAYOUT_LIST && (
172
- <button
173
- className="page-templates-preview-field__button"
174
- type="button"
175
- onClick={ onClick }
176
- aria-label={ item.title?.rendered || item.title }
177
- >
178
- { isEmpty && __( 'Empty template' ) }
179
- { ! isEmpty && (
180
- <Async>
181
- <BlockPreview blocks={ blocks } />
182
- </Async>
183
- ) }
184
- </button>
185
- ) }
186
- </div>
187
- </ExperimentalBlockEditorProvider>
188
- );
189
- }
190
-
191
96
  export default function PageTemplates() {
192
97
  const { params } = useLocation();
193
98
  const { activeView = 'all', layout, postId } = params;
@@ -199,6 +104,7 @@ export default function PageTemplates() {
199
104
  ...DEFAULT_VIEW,
200
105
  type: usedType,
201
106
  layout: defaultLayouts[ usedType ].layout,
107
+ fields: defaultLayouts[ usedType ].fields,
202
108
  filters:
203
109
  activeView !== 'all'
204
110
  ? [
@@ -228,20 +134,18 @@ export default function PageTemplates() {
228
134
  } ) );
229
135
  }, [ activeView ] );
230
136
 
231
- const { records, isResolving: isLoadingData } = useEntityRecords(
232
- 'postType',
233
- TEMPLATE_POST_TYPE,
234
- {
137
+ const { records, isResolving: isLoadingData } =
138
+ useEntityRecordsWithPermissions( 'postType', TEMPLATE_POST_TYPE, {
235
139
  per_page: -1,
236
- }
237
- );
140
+ } );
238
141
  const history = useHistory();
239
- const onSelectionChange = useCallback(
142
+ const onChangeSelection = useCallback(
240
143
  ( items ) => {
144
+ setSelection( items );
241
145
  if ( view?.type === LAYOUT_LIST ) {
242
146
  history.push( {
243
147
  ...params,
244
- postId: items.length === 1 ? items[ 0 ].id : undefined,
148
+ postId: items.length === 1 ? items[ 0 ] : undefined,
245
149
  } );
246
150
  }
247
151
  },
@@ -264,65 +168,15 @@ export default function PageTemplates() {
264
168
 
265
169
  const fields = useMemo(
266
170
  () => [
171
+ previewField,
172
+ titleField,
173
+ descriptionField,
267
174
  {
268
- header: __( 'Preview' ),
269
- id: 'preview',
270
- render: ( { item } ) => {
271
- return <Preview item={ item } viewType={ view.type } />;
272
- },
273
- minWidth: 120,
274
- maxWidth: 120,
275
- enableSorting: false,
276
- },
277
- {
278
- header: __( 'Template' ),
279
- id: 'title',
280
- getValue: ( { item } ) => item.title?.rendered,
281
- render: ( { item } ) => (
282
- <Title item={ item } viewType={ view.type } />
283
- ),
284
- maxWidth: 400,
285
- enableHiding: false,
286
- enableGlobalSearch: true,
287
- },
288
- {
289
- header: __( 'Description' ),
290
- id: 'description',
291
- render: ( { item } ) => {
292
- return item.description ? (
293
- <span className="page-templates-description">
294
- { decodeEntities( item.description ) }
295
- </span>
296
- ) : (
297
- view.type === LAYOUT_TABLE && (
298
- <>
299
- <Text variant="muted" aria-hidden="true">
300
- &#8212;
301
- </Text>
302
- <VisuallyHidden>
303
- { __( 'No description.' ) }
304
- </VisuallyHidden>
305
- </>
306
- )
307
- );
308
- },
309
- maxWidth: 400,
310
- minWidth: 320,
311
- enableSorting: false,
312
- enableGlobalSearch: true,
313
- },
314
- {
315
- header: __( 'Author' ),
316
- id: 'author',
317
- getValue: ( { item } ) => item.author_text,
318
- render: ( { item } ) => {
319
- return <AuthorField viewType={ view.type } item={ item } />;
320
- },
175
+ ...authorField,
321
176
  elements: authors,
322
- width: '1%',
323
177
  },
324
178
  ],
325
- [ authors, view.type ]
179
+ [ authors ]
326
180
  );
327
181
 
328
182
  const { data, paginationInfo } = useMemo( () => {
@@ -360,6 +214,7 @@ export default function PageTemplates() {
360
214
  actions={ <AddNewTemplate /> }
361
215
  >
362
216
  <DataViews
217
+ key={ activeView }
363
218
  paginationInfo={ paginationInfo }
364
219
  fields={ fields }
365
220
  actions={ actions }
@@ -367,9 +222,8 @@ export default function PageTemplates() {
367
222
  isLoading={ isLoadingData }
368
223
  view={ view }
369
224
  onChangeView={ onChangeView }
370
- onSelectionChange={ onSelectionChange }
225
+ onChangeSelection={ onChangeSelection }
371
226
  selection={ selection }
372
- setSelection={ setSelection }
373
227
  defaultLayouts={ defaultLayouts }
374
228
  />
375
229
  </Page>
@@ -2,6 +2,8 @@
2
2
  display: flex;
3
3
  flex-direction: column;
4
4
  height: 100%;
5
+ width: 100%;
6
+ border-radius: $radius-medium;
5
7
 
6
8
  .page-templates-preview-field__button {
7
9
  box-shadow: none;
@@ -12,7 +14,7 @@
12
14
  cursor: pointer;
13
15
  overflow: hidden;
14
16
  height: 100%;
15
- border-radius: $grid-unit-05;
17
+ border-radius: $radius-medium;
16
18
 
17
19
  &:focus-visible {
18
20
  box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
@@ -21,21 +23,23 @@
21
23
  }
22
24
  }
23
25
 
24
- &.is-viewtype-list {
26
+ .dataviews-view-list & {
25
27
  .block-editor-block-preview__container {
26
28
  height: 120px;
27
29
  }
28
30
  }
29
31
 
30
- &.is-viewtype-grid {
32
+ .dataviews-view-grid & {
31
33
  .block-editor-block-preview__container {
32
34
  height: 100%;
33
35
  }
34
36
  }
35
37
 
36
- &.is-viewtype-table {
38
+ .dataviews-view-table & {
37
39
  border-radius: $radius-block-ui;
38
40
  position: relative;
41
+ width: 120px;
42
+ max-height: 160px;
39
43
 
40
44
  &::after {
41
45
  content: "";
@@ -51,7 +55,13 @@
51
55
  }
52
56
 
53
57
  .page-templates-description {
54
- 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
+ }
55
65
  }
56
66
 
57
67
  .edit-site-page-templates {
@@ -67,12 +77,12 @@
67
77
  width: $grid-unit-30;
68
78
  height: $grid-unit-30;
69
79
  align-items: center;
70
- justify-content: center;
80
+ justify-content: left;
71
81
  display: flex;
72
82
 
73
83
  img {
74
- width: 20px;
75
- height: 20px;
84
+ width: $grid-unit-20;
85
+ height: $grid-unit-20;
76
86
  object-fit: cover;
77
87
  opacity: 0;
78
88
  transition: opacity 0.1s linear;
@@ -94,6 +104,7 @@
94
104
  height: $grid-unit-30;
95
105
 
96
106
  svg {
107
+ margin-left: -$grid-unit-05;
97
108
  fill: currentColor;
98
109
  }
99
110
  }
@@ -0,0 +1,115 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import clsx from 'clsx';
5
+
6
+ /**
7
+ * WordPress dependencies
8
+ */
9
+ import { __ } from '@wordpress/i18n';
10
+ import { DataForm, isItemValid } from '@wordpress/dataviews';
11
+ import { useDispatch, useSelect, useRegistry } from '@wordpress/data';
12
+ import { store as coreDataStore } from '@wordpress/core-data';
13
+ import {
14
+ Button,
15
+ FlexItem,
16
+ __experimentalVStack as VStack,
17
+ } from '@wordpress/components';
18
+ import { useState, useMemo } from '@wordpress/element';
19
+
20
+ /**
21
+ * Internal dependencies
22
+ */
23
+ import Page from '../page';
24
+ import usePostFields from '../post-fields';
25
+
26
+ function PostEditForm( { postType, postId } ) {
27
+ const ids = useMemo( () => postId.split( ',' ), [ postId ] );
28
+ const { initialEdits } = useSelect(
29
+ ( select ) => {
30
+ if ( ids.length !== 1 ) {
31
+ }
32
+ return {
33
+ initialEdits:
34
+ ids.length === 1
35
+ ? select( coreDataStore ).getEntityRecord(
36
+ 'postType',
37
+ postType,
38
+ ids[ 0 ]
39
+ )
40
+ : null,
41
+ };
42
+ },
43
+ [ postType, ids ]
44
+ );
45
+ const registry = useRegistry();
46
+ const { saveEntityRecord } = useDispatch( coreDataStore );
47
+ const { fields } = usePostFields();
48
+ const form = {
49
+ type: 'panel',
50
+ fields: [ 'title', 'author' ],
51
+ };
52
+ const [ edits, setEdits ] = useState( {} );
53
+ const itemWithEdits = useMemo( () => {
54
+ return {
55
+ ...initialEdits,
56
+ ...edits,
57
+ };
58
+ }, [ initialEdits, edits ] );
59
+ const onSubmit = async ( event ) => {
60
+ event.preventDefault();
61
+
62
+ if ( ! isItemValid( itemWithEdits, fields, form ) ) {
63
+ return;
64
+ }
65
+
66
+ const { getEntityRecord } = registry.resolveSelect( coreDataStore );
67
+ for ( const id of ids ) {
68
+ const item = await getEntityRecord( 'postType', postType, id );
69
+ saveEntityRecord( 'postType', postType, {
70
+ ...item,
71
+ ...edits,
72
+ } );
73
+ }
74
+ setEdits( {} );
75
+ };
76
+
77
+ const isUpdateDisabled = ! isItemValid( itemWithEdits, fields, form );
78
+ return (
79
+ <VStack as="form" onSubmit={ onSubmit } spacing={ 4 }>
80
+ <DataForm
81
+ data={ itemWithEdits }
82
+ fields={ fields }
83
+ form={ form }
84
+ onChange={ setEdits }
85
+ />
86
+ <FlexItem>
87
+ <Button
88
+ variant="primary"
89
+ type="submit"
90
+ accessibleWhenDisabled
91
+ disabled={ isUpdateDisabled }
92
+ __next40pxDefaultSize
93
+ >
94
+ { __( 'Update' ) }
95
+ </Button>
96
+ </FlexItem>
97
+ </VStack>
98
+ );
99
+ }
100
+
101
+ export function PostEdit( { postType, postId } ) {
102
+ return (
103
+ <Page
104
+ className={ clsx( 'edit-site-post-edit', {
105
+ 'is-empty': ! postId,
106
+ } ) }
107
+ label={ __( 'Post Edit' ) }
108
+ >
109
+ { postId && (
110
+ <PostEditForm postType={ postType } postId={ postId } />
111
+ ) }
112
+ { ! postId && <p>{ __( 'Select a page to edit' ) }</p> }
113
+ </Page>
114
+ );
115
+ }
@@ -0,0 +1,9 @@
1
+ .edit-site-post-edit {
2
+ padding: $grid-unit-30;
3
+
4
+ &.is-empty .edit-site-page-content {
5
+ display: flex;
6
+ align-items: center;
7
+ justify-content: center;
8
+ }
9
+ }