@wordpress/edit-site 5.20.0 → 5.21.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 (231) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/components/actions/trash-post.js +48 -0
  3. package/build/components/actions/trash-post.js.map +1 -0
  4. package/build/components/add-new-template/add-custom-template-modal-content.js +17 -13
  5. package/build/components/add-new-template/add-custom-template-modal-content.js.map +1 -1
  6. package/build/components/block-editor/resize-handle.js +2 -1
  7. package/build/components/block-editor/resize-handle.js.map +1 -1
  8. package/build/components/create-template-part-modal/index.js +10 -6
  9. package/build/components/create-template-part-modal/index.js.map +1 -1
  10. package/build/components/dataviews/dataviews.js +41 -32
  11. package/build/components/dataviews/dataviews.js.map +1 -1
  12. package/build/components/dataviews/field-actions.js +30 -0
  13. package/build/components/dataviews/field-actions.js.map +1 -0
  14. package/build/components/dataviews/filters.js +61 -0
  15. package/build/components/dataviews/filters.js.map +1 -0
  16. package/build/components/dataviews/in-filter.js +51 -0
  17. package/build/components/dataviews/in-filter.js.map +1 -0
  18. package/build/components/dataviews/index.js +0 -7
  19. package/build/components/dataviews/index.js.map +1 -1
  20. package/build/components/dataviews/pagination.js +75 -27
  21. package/build/components/dataviews/pagination.js.map +1 -1
  22. package/build/components/dataviews/text-filter.js +18 -12
  23. package/build/components/dataviews/text-filter.js.map +1 -1
  24. package/build/components/dataviews/view-actions.js +94 -56
  25. package/build/components/dataviews/view-actions.js.map +1 -1
  26. package/build/components/dataviews/view-grid.js +59 -0
  27. package/build/components/dataviews/view-grid.js.map +1 -0
  28. package/build/components/dataviews/view-list.js +283 -0
  29. package/build/components/dataviews/view-list.js.map +1 -0
  30. package/build/components/editor/index.js +2 -1
  31. package/build/components/editor/index.js.map +1 -1
  32. package/build/components/global-styles/font-library-modal/context.js +16 -10
  33. package/build/components/global-styles/font-library-modal/context.js.map +1 -1
  34. package/build/components/global-styles/font-library-modal/font-collection.js +20 -6
  35. package/build/components/global-styles/font-library-modal/font-collection.js.map +1 -1
  36. package/build/components/global-styles/screen-block.js +1 -2
  37. package/build/components/global-styles/screen-block.js.map +1 -1
  38. package/build/components/global-styles/screen-root.js +1 -2
  39. package/build/components/global-styles/screen-root.js.map +1 -1
  40. package/build/components/global-styles/ui.js +3 -4
  41. package/build/components/global-styles/ui.js.map +1 -1
  42. package/build/components/layout/index.js +10 -2
  43. package/build/components/layout/index.js.map +1 -1
  44. package/build/components/media/index.js +34 -0
  45. package/build/components/media/index.js.map +1 -0
  46. package/build/components/page-actions/index.js +0 -2
  47. package/build/components/page-actions/index.js.map +1 -1
  48. package/build/components/page-pages/index.js +153 -107
  49. package/build/components/page-pages/index.js.map +1 -1
  50. package/build/components/page-patterns/delete-category-menu-item.js +89 -0
  51. package/build/components/page-patterns/delete-category-menu-item.js.map +1 -0
  52. package/build/components/page-patterns/duplicate-menu-item.js +52 -131
  53. package/build/components/page-patterns/duplicate-menu-item.js.map +1 -1
  54. package/build/components/page-patterns/grid-item.js +1 -0
  55. package/build/components/page-patterns/grid-item.js.map +1 -1
  56. package/build/components/page-patterns/header.js +25 -3
  57. package/build/components/page-patterns/header.js.map +1 -1
  58. package/build/components/page-patterns/rename-category-menu-item.js +49 -0
  59. package/build/components/page-patterns/rename-category-menu-item.js.map +1 -0
  60. package/build/components/page-patterns/rename-menu-item.js +1 -1
  61. package/build/components/page-patterns/rename-menu-item.js.map +1 -1
  62. package/build/components/page-patterns/use-patterns.js +1 -0
  63. package/build/components/page-patterns/use-patterns.js.map +1 -1
  64. package/build/components/pattern-modal/duplicate.js +65 -0
  65. package/build/components/pattern-modal/duplicate.js.map +1 -0
  66. package/build/components/pattern-modal/index.js +24 -0
  67. package/build/components/pattern-modal/index.js.map +1 -0
  68. package/build/components/pattern-modal/rename.js +42 -0
  69. package/build/components/pattern-modal/rename.js.map +1 -0
  70. package/build/components/sidebar-edit-mode/template-panel/last-revision.js +3 -0
  71. package/build/components/sidebar-edit-mode/template-panel/last-revision.js.map +1 -1
  72. package/build/components/sidebar-navigation-screen-pattern/template-part-navigation-menu-list-item.js +2 -2
  73. package/build/components/sidebar-navigation-screen-pattern/template-part-navigation-menu-list-item.js.map +1 -1
  74. package/build/components/sidebar-navigation-screen-pattern/template-part-navigation-menu.js +2 -3
  75. package/build/components/sidebar-navigation-screen-pattern/template-part-navigation-menu.js.map +1 -1
  76. package/build/components/sidebar-navigation-screen-pattern/use-navigation-menu-title.js +29 -0
  77. package/build/components/sidebar-navigation-screen-pattern/use-navigation-menu-title.js.map +1 -0
  78. package/build/components/sidebar-navigation-screen-template/home-template-details.js +12 -1
  79. package/build/components/sidebar-navigation-screen-template/home-template-details.js.map +1 -1
  80. package/build/hooks/commands/use-common-commands.js +1 -2
  81. package/build/hooks/commands/use-common-commands.js.map +1 -1
  82. package/build/hooks/commands/use-edit-mode-commands.js +49 -0
  83. package/build/hooks/commands/use-edit-mode-commands.js.map +1 -1
  84. package/build/lock-unlock.js +1 -1
  85. package/build/lock-unlock.js.map +1 -1
  86. package/build/store/selectors.js +4 -5
  87. package/build/store/selectors.js.map +1 -1
  88. package/build-module/components/actions/trash-post.js +41 -0
  89. package/build-module/components/actions/trash-post.js.map +1 -0
  90. package/build-module/components/add-new-template/add-custom-template-modal-content.js +16 -12
  91. package/build-module/components/add-new-template/add-custom-template-modal-content.js.map +1 -1
  92. package/build-module/components/block-editor/resize-handle.js +2 -1
  93. package/build-module/components/block-editor/resize-handle.js.map +1 -1
  94. package/build-module/components/create-template-part-modal/index.js +10 -6
  95. package/build-module/components/create-template-part-modal/index.js.map +1 -1
  96. package/build-module/components/dataviews/dataviews.js +40 -31
  97. package/build-module/components/dataviews/dataviews.js.map +1 -1
  98. package/build-module/components/dataviews/field-actions.js +22 -0
  99. package/build-module/components/dataviews/field-actions.js.map +1 -0
  100. package/build-module/components/dataviews/filters.js +53 -0
  101. package/build-module/components/dataviews/filters.js.map +1 -0
  102. package/build-module/components/dataviews/in-filter.js +43 -0
  103. package/build-module/components/dataviews/in-filter.js.map +1 -0
  104. package/build-module/components/dataviews/index.js +0 -1
  105. package/build-module/components/dataviews/index.js.map +1 -1
  106. package/build-module/components/dataviews/pagination.js +74 -28
  107. package/build-module/components/dataviews/pagination.js.map +1 -1
  108. package/build-module/components/dataviews/text-filter.js +19 -13
  109. package/build-module/components/dataviews/text-filter.js.map +1 -1
  110. package/build-module/components/dataviews/view-actions.js +95 -54
  111. package/build-module/components/dataviews/view-actions.js.map +1 -1
  112. package/build-module/components/dataviews/view-grid.js +51 -0
  113. package/build-module/components/dataviews/view-grid.js.map +1 -0
  114. package/build-module/components/dataviews/view-list.js +274 -0
  115. package/build-module/components/dataviews/view-list.js.map +1 -0
  116. package/build-module/components/editor/index.js +2 -1
  117. package/build-module/components/editor/index.js.map +1 -1
  118. package/build-module/components/global-styles/font-library-modal/context.js +16 -10
  119. package/build-module/components/global-styles/font-library-modal/context.js.map +1 -1
  120. package/build-module/components/global-styles/font-library-modal/font-collection.js +20 -6
  121. package/build-module/components/global-styles/font-library-modal/font-collection.js.map +1 -1
  122. package/build-module/components/global-styles/screen-block.js +1 -2
  123. package/build-module/components/global-styles/screen-block.js.map +1 -1
  124. package/build-module/components/global-styles/screen-root.js +1 -2
  125. package/build-module/components/global-styles/screen-root.js.map +1 -1
  126. package/build-module/components/global-styles/ui.js +3 -4
  127. package/build-module/components/global-styles/ui.js.map +1 -1
  128. package/build-module/components/layout/index.js +11 -3
  129. package/build-module/components/layout/index.js.map +1 -1
  130. package/build-module/components/media/index.js +26 -0
  131. package/build-module/components/media/index.js.map +1 -0
  132. package/build-module/components/page-actions/index.js +0 -2
  133. package/build-module/components/page-actions/index.js.map +1 -1
  134. package/build-module/components/page-pages/index.js +156 -110
  135. package/build-module/components/page-pages/index.js.map +1 -1
  136. package/build-module/components/page-patterns/delete-category-menu-item.js +82 -0
  137. package/build-module/components/page-patterns/delete-category-menu-item.js.map +1 -0
  138. package/build-module/components/page-patterns/duplicate-menu-item.js +54 -133
  139. package/build-module/components/page-patterns/duplicate-menu-item.js.map +1 -1
  140. package/build-module/components/page-patterns/grid-item.js +1 -0
  141. package/build-module/components/page-patterns/grid-item.js.map +1 -1
  142. package/build-module/components/page-patterns/header.js +26 -4
  143. package/build-module/components/page-patterns/header.js.map +1 -1
  144. package/build-module/components/page-patterns/rename-category-menu-item.js +42 -0
  145. package/build-module/components/page-patterns/rename-category-menu-item.js.map +1 -0
  146. package/build-module/components/page-patterns/rename-menu-item.js +1 -1
  147. package/build-module/components/page-patterns/rename-menu-item.js.map +1 -1
  148. package/build-module/components/page-patterns/use-patterns.js +1 -0
  149. package/build-module/components/page-patterns/use-patterns.js.map +1 -1
  150. package/build-module/components/pattern-modal/duplicate.js +57 -0
  151. package/build-module/components/pattern-modal/duplicate.js.map +1 -0
  152. package/build-module/components/pattern-modal/index.js +14 -0
  153. package/build-module/components/pattern-modal/index.js.map +1 -0
  154. package/build-module/components/pattern-modal/rename.js +34 -0
  155. package/build-module/components/pattern-modal/rename.js.map +1 -0
  156. package/build-module/components/sidebar-edit-mode/template-panel/last-revision.js +3 -0
  157. package/build-module/components/sidebar-edit-mode/template-panel/last-revision.js.map +1 -1
  158. package/build-module/components/sidebar-navigation-screen-pattern/template-part-navigation-menu-list-item.js +2 -2
  159. package/build-module/components/sidebar-navigation-screen-pattern/template-part-navigation-menu-list-item.js.map +1 -1
  160. package/build-module/components/sidebar-navigation-screen-pattern/template-part-navigation-menu.js +2 -3
  161. package/build-module/components/sidebar-navigation-screen-pattern/template-part-navigation-menu.js.map +1 -1
  162. package/build-module/components/sidebar-navigation-screen-pattern/use-navigation-menu-title.js +22 -0
  163. package/build-module/components/sidebar-navigation-screen-pattern/use-navigation-menu-title.js.map +1 -0
  164. package/build-module/components/sidebar-navigation-screen-template/home-template-details.js +12 -1
  165. package/build-module/components/sidebar-navigation-screen-template/home-template-details.js.map +1 -1
  166. package/build-module/hooks/commands/use-common-commands.js +1 -2
  167. package/build-module/hooks/commands/use-common-commands.js.map +1 -1
  168. package/build-module/hooks/commands/use-edit-mode-commands.js +50 -1
  169. package/build-module/hooks/commands/use-edit-mode-commands.js.map +1 -1
  170. package/build-module/lock-unlock.js +1 -1
  171. package/build-module/lock-unlock.js.map +1 -1
  172. package/build-module/store/selectors.js +4 -5
  173. package/build-module/store/selectors.js.map +1 -1
  174. package/build-style/style-rtl.css +42 -9
  175. package/build-style/style.css +42 -9
  176. package/package.json +40 -40
  177. package/src/components/actions/trash-post.js +55 -0
  178. package/src/components/add-new-template/add-custom-template-modal-content.js +22 -17
  179. package/src/components/block-editor/resize-handle.js +1 -0
  180. package/src/components/create-template-part-modal/index.js +9 -5
  181. package/src/components/dataviews/README.md +107 -0
  182. package/src/components/dataviews/dataviews.js +44 -33
  183. package/src/components/dataviews/field-actions.js +28 -0
  184. package/src/components/dataviews/filters.js +57 -0
  185. package/src/components/dataviews/in-filter.js +47 -0
  186. package/src/components/dataviews/index.js +0 -1
  187. package/src/components/dataviews/pagination.js +71 -29
  188. package/src/components/dataviews/style.scss +11 -1
  189. package/src/components/dataviews/text-filter.js +19 -15
  190. package/src/components/dataviews/view-actions.js +108 -63
  191. package/src/components/dataviews/view-grid.js +60 -0
  192. package/src/components/dataviews/view-list.js +348 -0
  193. package/src/components/editor/index.js +2 -0
  194. package/src/components/global-styles/font-library-modal/context.js +17 -11
  195. package/src/components/global-styles/font-library-modal/font-collection.js +18 -10
  196. package/src/components/global-styles/screen-block.js +1 -2
  197. package/src/components/global-styles/screen-root.js +1 -2
  198. package/src/components/global-styles/style.scss +16 -4
  199. package/src/components/global-styles/ui.js +1 -2
  200. package/src/components/layout/index.js +12 -4
  201. package/src/components/media/index.js +25 -0
  202. package/src/components/page-actions/index.js +1 -7
  203. package/src/components/page-pages/index.js +156 -108
  204. package/src/components/page-pages/style.scss +3 -0
  205. package/src/components/page-patterns/delete-category-menu-item.js +104 -0
  206. package/src/components/page-patterns/duplicate-menu-item.js +68 -181
  207. package/src/components/page-patterns/grid-item.js +1 -0
  208. package/src/components/page-patterns/header.js +42 -6
  209. package/src/components/page-patterns/rename-category-menu-item.js +45 -0
  210. package/src/components/page-patterns/rename-menu-item.js +2 -2
  211. package/src/components/page-patterns/style.scss +8 -0
  212. package/src/components/page-patterns/use-patterns.js +5 -0
  213. package/src/components/pattern-modal/duplicate.js +53 -0
  214. package/src/components/pattern-modal/index.js +19 -0
  215. package/src/components/pattern-modal/rename.js +29 -0
  216. package/src/components/sidebar-edit-mode/template-panel/last-revision.js +4 -0
  217. package/src/components/sidebar-navigation-screen/style.scss +17 -5
  218. package/src/components/sidebar-navigation-screen-pattern/template-part-navigation-menu-list-item.js +2 -7
  219. package/src/components/sidebar-navigation-screen-pattern/template-part-navigation-menu.js +2 -8
  220. package/src/components/sidebar-navigation-screen-pattern/use-navigation-menu-title.js +32 -0
  221. package/src/components/sidebar-navigation-screen-template/home-template-details.js +21 -7
  222. package/src/hooks/commands/use-common-commands.js +1 -2
  223. package/src/hooks/commands/use-edit-mode-commands.js +41 -0
  224. package/src/lock-unlock.js +1 -1
  225. package/src/store/selectors.js +9 -10
  226. package/src/style.scss +1 -0
  227. package/build/components/dataviews/list-view.js +0 -89
  228. package/build/components/dataviews/list-view.js.map +0 -1
  229. package/build-module/components/dataviews/list-view.js +0 -80
  230. package/build-module/components/dataviews/list-view.js.map +0 -1
  231. package/src/components/dataviews/list-view.js +0 -106
@@ -1,120 +1,139 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import apiFetch from '@wordpress/api-fetch';
5
- import { addQueryArgs } from '@wordpress/url';
6
4
  import {
7
- VisuallyHidden,
8
5
  __experimentalHeading as Heading,
9
6
  __experimentalVStack as VStack,
10
7
  } from '@wordpress/components';
11
8
  import { __ } from '@wordpress/i18n';
12
9
  import { useEntityRecords } from '@wordpress/core-data';
13
10
  import { decodeEntities } from '@wordpress/html-entities';
14
- import { useState, useEffect, useMemo } from '@wordpress/element';
11
+ import { useState, useMemo, useCallback } from '@wordpress/element';
12
+ import { dateI18n, getDate, getSettings } from '@wordpress/date';
15
13
 
16
14
  /**
17
15
  * Internal dependencies
18
16
  */
19
17
  import Page from '../page';
20
18
  import Link from '../routes/link';
21
- import PageActions from '../page-actions';
22
- import { DataViews, PAGE_SIZE_VALUES } from '../dataviews';
19
+ import { DataViews } from '../dataviews';
20
+ import useTrashPostAction from '../actions/trash-post';
21
+ import Media from '../media';
23
22
 
24
23
  const EMPTY_ARRAY = [];
24
+ const EMPTY_OBJECT = {};
25
+ const defaultConfigPerViewType = {
26
+ list: {},
27
+ grid: {
28
+ mediaField: 'featured-image',
29
+ },
30
+ };
25
31
 
26
32
  export default function PagePages() {
27
- const [ reset, setResetQuery ] = useState( ( v ) => ! v );
28
- const [ globalFilter, setGlobalFilter ] = useState( '' );
29
- const [ paginationInfo, setPaginationInfo ] = useState();
30
- const [ { pageIndex, pageSize }, setPagination ] = useState( {
31
- pageIndex: 0,
32
- pageSize: PAGE_SIZE_VALUES[ 0 ],
33
+ const [ view, setView ] = useState( {
34
+ type: 'list',
35
+ filters: {
36
+ search: '',
37
+ status: 'publish, draft',
38
+ },
39
+ page: 1,
40
+ perPage: 5,
41
+ sort: {
42
+ field: 'date',
43
+ direction: 'desc',
44
+ },
45
+ visibleFilters: [ 'search', 'author', 'status' ],
46
+ // All fields are visible by default, so it's
47
+ // better to keep track of the hidden ones.
48
+ hiddenFields: [ 'date', 'featured-image' ],
49
+ layout: {},
33
50
  } );
34
51
  // Request post statuses to get the proper labels.
35
- const [ postStatuses, setPostStatuses ] = useState( EMPTY_ARRAY );
36
- useEffect( () => {
37
- apiFetch( {
38
- path: '/wp/v2/statuses',
39
- } ).then( setPostStatuses );
40
- }, [] );
41
-
42
- // TODO: probably memo other objects passed as state(ex:https://tanstack.com/table/v8/docs/examples/react/pagination-controlled).
43
- const pagination = useMemo(
44
- () => ( { pageIndex, pageSize } ),
45
- [ pageIndex, pageSize ]
52
+ const { records: statuses } = useEntityRecords( 'root', 'status' );
53
+ const postStatuses = useMemo(
54
+ () =>
55
+ statuses === null
56
+ ? EMPTY_OBJECT
57
+ : Object.fromEntries(
58
+ statuses.map( ( { slug, name } ) => [ slug, name ] )
59
+ ),
60
+ [ statuses ]
46
61
  );
47
- const [ sorting, setSorting ] = useState( [
48
- { order: 'desc', orderby: 'date' },
49
- ] );
62
+
50
63
  const queryArgs = useMemo(
51
64
  () => ( {
52
- per_page: pageSize,
53
- page: pageIndex + 1, // tanstack starts from zero.
65
+ per_page: view.perPage,
66
+ page: view.page,
54
67
  _embed: 'author',
55
- order: sorting[ 0 ]?.desc ? 'desc' : 'asc',
56
- orderby: sorting[ 0 ]?.id,
57
- search: globalFilter,
58
- status: [ 'publish', 'draft' ],
68
+ order: view.sort?.direction,
69
+ orderby: view.sort?.field,
70
+ ...view.filters,
59
71
  } ),
60
- [
61
- globalFilter,
62
- sorting[ 0 ]?.id,
63
- sorting[ 0 ]?.desc,
64
- pageSize,
65
- pageIndex,
66
- reset,
67
- ]
72
+ [ view ]
68
73
  );
69
- const { records, isResolving: isLoading } = useEntityRecords(
70
- 'postType',
71
- 'page',
72
- queryArgs
74
+ const {
75
+ records: pages,
76
+ isResolving: isLoadingPages,
77
+ totalItems,
78
+ totalPages,
79
+ } = useEntityRecords( 'postType', 'page', queryArgs );
80
+
81
+ const { records: authors } = useEntityRecords( 'root', 'user', {
82
+ who: 'authors',
83
+ } );
84
+
85
+ const paginationInfo = useMemo(
86
+ () => ( {
87
+ totalItems,
88
+ totalPages,
89
+ } ),
90
+ [ totalItems, totalPages ]
73
91
  );
74
- useEffect( () => {
75
- // Make extra request to handle controlled pagination.
76
- apiFetch( {
77
- path: addQueryArgs( '/wp/v2/pages', {
78
- ...queryArgs,
79
- _fields: 'id',
80
- } ),
81
- method: 'HEAD',
82
- parse: false,
83
- } ).then( ( res ) => {
84
- const totalPages = parseInt( res.headers.get( 'X-WP-TotalPages' ) );
85
- const totalItems = parseInt( res.headers.get( 'X-WP-Total' ) );
86
- setPaginationInfo( {
87
- totalPages,
88
- totalItems,
89
- } );
90
- } );
91
- // Status should not make extra request if already did..
92
- }, [ globalFilter, pageSize, reset ] );
93
92
 
94
93
  const fields = useMemo(
95
94
  () => [
95
+ {
96
+ id: 'featured-image',
97
+ header: __( 'Featured Image' ),
98
+ getValue: ( { item } ) => item.featured_media,
99
+ render: ( { item, view: currentView } ) =>
100
+ !! item.featured_media ? (
101
+ <Media
102
+ className="edit-site-page-pages__featured-image"
103
+ id={ item.featured_media }
104
+ size={
105
+ currentView.type === 'list'
106
+ ? [ 'thumbnail', 'medium', 'large', 'full' ]
107
+ : [ 'large', 'full', 'medium', 'thumbnail' ]
108
+ }
109
+ />
110
+ ) : null,
111
+ enableSorting: false,
112
+ },
96
113
  {
97
114
  header: __( 'Title' ),
98
115
  id: 'title',
99
- accessorFn: ( page ) => page.title?.rendered || page.slug,
100
- cell: ( props ) => {
101
- const page = props.row.original;
116
+ getValue: ( { item } ) => item.title?.rendered || item.slug,
117
+ render: ( { item } ) => {
102
118
  return (
103
119
  <VStack spacing={ 1 }>
104
120
  <Heading as="h3" level={ 5 }>
105
121
  <Link
106
122
  params={ {
107
- postId: page.id,
108
- postType: page.type,
123
+ postId: item.id,
124
+ postType: item.type,
109
125
  canvas: 'edit',
110
126
  } }
111
127
  >
112
- { decodeEntities( props.getValue() ) }
128
+ { decodeEntities(
129
+ item.title?.rendered || item.slug
130
+ ) || __( '(no title)' ) }
113
131
  </Link>
114
132
  </Heading>
115
133
  </VStack>
116
134
  );
117
135
  },
136
+ filters: [ { id: 'search', type: 'search' } ],
118
137
  maxWidth: 400,
119
138
  sortingFn: 'alphanumeric',
120
139
  enableHiding: false,
@@ -122,38 +141,84 @@ export default function PagePages() {
122
141
  {
123
142
  header: __( 'Author' ),
124
143
  id: 'author',
125
- accessorFn: ( page ) => page._embedded?.author[ 0 ]?.name,
126
- cell: ( props ) => {
127
- const author = props.row.original._embedded?.author[ 0 ];
144
+ getValue: ( { item } ) => item._embedded?.author[ 0 ]?.name,
145
+ render: ( { item } ) => {
146
+ const author = item._embedded?.author[ 0 ];
128
147
  return (
129
148
  <a href={ `user-edit.php?user_id=${ author.id }` }>
130
149
  { author.name }
131
150
  </a>
132
151
  );
133
152
  },
153
+ filters: [ { id: 'author', type: 'enumeration' } ],
154
+ elements: [
155
+ {
156
+ value: '',
157
+ label: __( 'All' ),
158
+ },
159
+ ...( authors?.map( ( { id, name } ) => ( {
160
+ value: id,
161
+ label: name,
162
+ } ) ) || [] ),
163
+ ],
134
164
  },
135
165
  {
136
- header: 'Status',
166
+ header: __( 'Status' ),
137
167
  id: 'status',
138
- cell: ( props ) =>
139
- postStatuses[ props.row.original.status ]?.name,
168
+ getValue: ( { item } ) =>
169
+ postStatuses[ item.status ] ?? item.status,
170
+ filters: [ { type: 'enumeration', id: 'status' } ],
171
+ elements: [
172
+ { label: __( 'All' ), value: 'publish,draft' },
173
+ ...( ( postStatuses &&
174
+ Object.entries( postStatuses )
175
+ .filter( ( [ slug ] ) =>
176
+ [ 'publish', 'draft' ].includes( slug )
177
+ )
178
+ .map( ( [ slug, name ] ) => ( {
179
+ value: slug,
180
+ label: name,
181
+ } ) ) ) ||
182
+ [] ),
183
+ ],
184
+ enableSorting: false,
140
185
  },
141
186
  {
142
- header: <VisuallyHidden>{ __( 'Actions' ) }</VisuallyHidden>,
143
- id: 'actions',
144
- cell: ( props ) => {
145
- const page = props.row.original;
146
- return (
147
- <PageActions
148
- postId={ page.id }
149
- onRemove={ () => setResetQuery() }
150
- />
187
+ header: __( 'Date' ),
188
+ id: 'date',
189
+ getValue: ( { item } ) => item.date,
190
+ render: ( { item } ) => {
191
+ const formattedDate = dateI18n(
192
+ getSettings().formats.datetimeAbbreviated,
193
+ getDate( item.date )
151
194
  );
195
+ return <time>{ formattedDate }</time>;
152
196
  },
153
- enableHiding: false,
154
197
  },
155
198
  ],
156
- [ postStatuses ]
199
+ [ postStatuses, authors ]
200
+ );
201
+
202
+ const trashPostAction = useTrashPostAction();
203
+ const actions = useMemo( () => [ trashPostAction ], [ trashPostAction ] );
204
+ const onChangeView = useCallback(
205
+ ( viewUpdater ) => {
206
+ let updatedView =
207
+ typeof viewUpdater === 'function'
208
+ ? viewUpdater( view )
209
+ : viewUpdater;
210
+ if ( updatedView.type !== view.type ) {
211
+ updatedView = {
212
+ ...updatedView,
213
+ layout: {
214
+ ...defaultConfigPerViewType[ updatedView.type ],
215
+ },
216
+ };
217
+ }
218
+
219
+ setView( updatedView );
220
+ },
221
+ [ view ]
157
222
  );
158
223
 
159
224
  // TODO: we need to handle properly `data={ data || EMPTY_ARRAY }` for when `isLoading`.
@@ -161,29 +226,12 @@ export default function PagePages() {
161
226
  <Page title={ __( 'Pages' ) }>
162
227
  <DataViews
163
228
  paginationInfo={ paginationInfo }
164
- data={ records || EMPTY_ARRAY }
165
- isLoading={ isLoading }
166
229
  fields={ fields }
167
- options={ {
168
- manualSorting: true,
169
- manualFiltering: true,
170
- manualPagination: true,
171
- enableRowSelection: true,
172
- state: {
173
- sorting,
174
- globalFilter,
175
- pagination,
176
- },
177
- pageCount: paginationInfo?.totalPages,
178
- onSortingChange: setSorting,
179
- onGlobalFilterChange: ( value ) => {
180
- setGlobalFilter( value );
181
- setPagination( { pageIndex: 0, pageSize } );
182
- },
183
- // TODO: check these callbacks and maybe reset the query when needed...
184
- onPaginationChange: setPagination,
185
- meta: { resetQuery: setResetQuery },
186
- } }
230
+ actions={ actions }
231
+ data={ pages || EMPTY_ARRAY }
232
+ isLoading={ isLoadingPages }
233
+ view={ view }
234
+ onChangeView={ onChangeView }
187
235
  />
188
236
  </Page>
189
237
  );
@@ -0,0 +1,3 @@
1
+ .edit-site-page-pages__featured-image {
2
+ border-radius: $radius-block-ui;
3
+ }
@@ -0,0 +1,104 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import {
5
+ MenuItem,
6
+ __experimentalConfirmDialog as ConfirmDialog,
7
+ } from '@wordpress/components';
8
+ import { store as coreStore } from '@wordpress/core-data';
9
+ import { useDispatch } from '@wordpress/data';
10
+ import { useState } from '@wordpress/element';
11
+ import { decodeEntities } from '@wordpress/html-entities';
12
+ import { __, sprintf } from '@wordpress/i18n';
13
+ import { store as noticesStore } from '@wordpress/notices';
14
+ import { privateApis as routerPrivateApis } from '@wordpress/router';
15
+
16
+ /**
17
+ * Internal dependencies
18
+ */
19
+ import { unlock } from '../../lock-unlock';
20
+ import { PATTERN_TYPES, PATTERN_DEFAULT_CATEGORY } from '../../utils/constants';
21
+
22
+ const { useHistory } = unlock( routerPrivateApis );
23
+
24
+ export default function DeleteCategoryMenuItem( { category, onClose } ) {
25
+ const [ isModalOpen, setIsModalOpen ] = useState( false );
26
+ const history = useHistory();
27
+
28
+ const { createSuccessNotice, createErrorNotice } =
29
+ useDispatch( noticesStore );
30
+ const { deleteEntityRecord, invalidateResolution } =
31
+ useDispatch( coreStore );
32
+
33
+ const onDelete = async () => {
34
+ try {
35
+ await deleteEntityRecord(
36
+ 'taxonomy',
37
+ 'wp_pattern_category',
38
+ category.id,
39
+ { force: true },
40
+ { throwOnError: true }
41
+ );
42
+
43
+ // Prevent the need to refresh the page to get up-to-date categories
44
+ // and pattern categorization.
45
+ invalidateResolution( 'getUserPatternCategories' );
46
+ invalidateResolution( 'getEntityRecords', [
47
+ 'postType',
48
+ PATTERN_TYPES.user,
49
+ { per_page: -1 },
50
+ ] );
51
+
52
+ createSuccessNotice(
53
+ sprintf(
54
+ /* translators: The pattern category's name */
55
+ __( '"%s" deleted.' ),
56
+ category.label
57
+ ),
58
+ { type: 'snackbar', id: 'pattern-category-delete' }
59
+ );
60
+
61
+ onClose?.();
62
+ history.push( {
63
+ path: `/patterns`,
64
+ categoryType: PATTERN_TYPES.theme,
65
+ categoryId: PATTERN_DEFAULT_CATEGORY,
66
+ } );
67
+ } catch ( error ) {
68
+ const errorMessage =
69
+ error.message && error.code !== 'unknown_error'
70
+ ? error.message
71
+ : __(
72
+ 'An error occurred while deleting the pattern category.'
73
+ );
74
+
75
+ createErrorNotice( errorMessage, {
76
+ type: 'snackbar',
77
+ id: 'pattern-category-delete',
78
+ } );
79
+ }
80
+ };
81
+
82
+ return (
83
+ <>
84
+ <MenuItem isDestructive onClick={ () => setIsModalOpen( true ) }>
85
+ { __( 'Delete' ) }
86
+ </MenuItem>
87
+ <ConfirmDialog
88
+ isOpen={ isModalOpen }
89
+ onConfirm={ onDelete }
90
+ onCancel={ () => setIsModalOpen( false ) }
91
+ confirmButtonText={ __( 'Delete' ) }
92
+ className="edit-site-patterns__delete-modal"
93
+ >
94
+ { sprintf(
95
+ // translators: %s: The pattern category's name.
96
+ __(
97
+ 'Are you sure you want to delete the category "%s"? The patterns will not be deleted.'
98
+ ),
99
+ decodeEntities( category.label )
100
+ ) }
101
+ </ConfirmDialog>
102
+ </>
103
+ );
104
+ }