@wordpress/dataviews 2.2.0 → 4.0.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 (298) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +23 -8
  3. package/build/components/dataform/index.js +78 -0
  4. package/build/components/dataform/index.js.map +1 -0
  5. package/build/components/dataviews/index.js +115 -0
  6. package/build/components/dataviews/index.js.map +1 -0
  7. package/build/{bulk-actions.js → components/dataviews-bulk-actions/index.js} +39 -16
  8. package/build/components/dataviews-bulk-actions/index.js.map +1 -0
  9. package/build/{bulk-actions-toolbar.js → components/dataviews-bulk-actions-toolbar/index.js} +36 -20
  10. package/build/components/dataviews-bulk-actions-toolbar/index.js.map +1 -0
  11. package/build/components/dataviews-context/index.js +36 -0
  12. package/build/components/dataviews-context/index.js.map +1 -0
  13. package/build/{add-filter.js → components/dataviews-filters/add-filter.js} +3 -3
  14. package/build/components/dataviews-filters/add-filter.js.map +1 -0
  15. package/build/{filter-summary.js → components/dataviews-filters/filter-summary.js} +15 -14
  16. package/build/components/dataviews-filters/filter-summary.js.map +1 -0
  17. package/build/{filters.js → components/dataviews-filters/index.js} +15 -16
  18. package/build/components/dataviews-filters/index.js.map +1 -0
  19. package/build/{reset-filters.js → components/dataviews-filters/reset-filters.js} +1 -1
  20. package/build/components/dataviews-filters/reset-filters.js.map +1 -0
  21. package/build/{search-widget.js → components/dataviews-filters/search-widget.js} +21 -19
  22. package/build/components/dataviews-filters/search-widget.js.map +1 -0
  23. package/build/{item-actions.js → components/dataviews-item-actions/index.js} +3 -3
  24. package/build/components/dataviews-item-actions/index.js.map +1 -0
  25. package/build/components/dataviews-layout/index.js +53 -0
  26. package/build/components/dataviews-layout/index.js.map +1 -0
  27. package/build/{pagination.js → components/dataviews-pagination/index.js} +18 -15
  28. package/build/components/dataviews-pagination/index.js.map +1 -0
  29. package/build/{search.js → components/dataviews-search/index.js} +10 -6
  30. package/build/components/dataviews-search/index.js.map +1 -0
  31. package/build/components/dataviews-selection-checkbox/index.js +52 -0
  32. package/build/components/dataviews-selection-checkbox/index.js.map +1 -0
  33. package/build/{view-actions.js → components/dataviews-view-config/index.js} +94 -80
  34. package/build/components/dataviews-view-config/index.js.map +1 -0
  35. package/build/filter-and-sort-data-view.js +4 -1
  36. package/build/filter-and-sort-data-view.js.map +1 -1
  37. package/build/index.js +8 -1
  38. package/build/index.js.map +1 -1
  39. package/build/layouts/grid/density-picker.js +143 -0
  40. package/build/layouts/grid/density-picker.js.map +1 -0
  41. package/build/{view-grid.js → layouts/grid/index.js} +40 -53
  42. package/build/layouts/grid/index.js.map +1 -0
  43. package/build/layouts/index.js +52 -0
  44. package/build/layouts/index.js.map +1 -0
  45. package/build/{view-list.js → layouts/list/index.js} +31 -27
  46. package/build/layouts/list/index.js.map +1 -0
  47. package/build/layouts/table/column-header-menu.js +196 -0
  48. package/build/layouts/table/column-header-menu.js.map +1 -0
  49. package/build/layouts/table/index.js +350 -0
  50. package/build/layouts/table/index.js.map +1 -0
  51. package/build/normalize-fields.js +1 -1
  52. package/build/normalize-fields.js.map +1 -1
  53. package/build/private-types.js +6 -0
  54. package/build/private-types.js.map +1 -0
  55. package/build/types.js.map +1 -1
  56. package/build/utils.js.map +1 -1
  57. package/build-module/components/dataform/index.js +72 -0
  58. package/build-module/components/dataform/index.js.map +1 -0
  59. package/build-module/components/dataviews/index.js +108 -0
  60. package/build-module/components/dataviews/index.js.map +1 -0
  61. package/build-module/{bulk-actions.js → components/dataviews-bulk-actions/index.js} +39 -17
  62. package/build-module/components/dataviews-bulk-actions/index.js.map +1 -0
  63. package/build-module/{bulk-actions-toolbar.js → components/dataviews-bulk-actions-toolbar/index.js} +35 -20
  64. package/build-module/components/dataviews-bulk-actions-toolbar/index.js.map +1 -0
  65. package/build-module/components/dataviews-context/index.js +30 -0
  66. package/build-module/components/dataviews-context/index.js.map +1 -0
  67. package/build-module/{add-filter.js → components/dataviews-filters/add-filter.js} +3 -3
  68. package/build-module/components/dataviews-filters/add-filter.js.map +1 -0
  69. package/build-module/{filter-summary.js → components/dataviews-filters/filter-summary.js} +15 -14
  70. package/build-module/components/dataviews-filters/filter-summary.js.map +1 -0
  71. package/build-module/{filters.js → components/dataviews-filters/index.js} +16 -17
  72. package/build-module/components/dataviews-filters/index.js.map +1 -0
  73. package/build-module/{reset-filters.js → components/dataviews-filters/reset-filters.js} +1 -1
  74. package/build-module/components/dataviews-filters/reset-filters.js.map +1 -0
  75. package/build-module/{search-widget.js → components/dataviews-filters/search-widget.js} +21 -19
  76. package/build-module/components/dataviews-filters/search-widget.js.map +1 -0
  77. package/build-module/{item-actions.js → components/dataviews-item-actions/index.js} +3 -3
  78. package/build-module/components/dataviews-item-actions/index.js.map +1 -0
  79. package/build-module/components/dataviews-layout/index.js +45 -0
  80. package/build-module/components/dataviews-layout/index.js.map +1 -0
  81. package/build-module/{pagination.js → components/dataviews-pagination/index.js} +19 -17
  82. package/build-module/components/dataviews-pagination/index.js.map +1 -0
  83. package/build-module/{search.js → components/dataviews-search/index.js} +10 -7
  84. package/build-module/components/dataviews-search/index.js.map +1 -0
  85. package/build-module/components/dataviews-selection-checkbox/index.js +45 -0
  86. package/build-module/components/dataviews-selection-checkbox/index.js.map +1 -0
  87. package/build-module/{view-actions.js → components/dataviews-view-config/index.js} +98 -84
  88. package/build-module/components/dataviews-view-config/index.js.map +1 -0
  89. package/build-module/filter-and-sort-data-view.js +4 -1
  90. package/build-module/filter-and-sort-data-view.js.map +1 -1
  91. package/build-module/index.js +2 -1
  92. package/build-module/index.js.map +1 -1
  93. package/build-module/layouts/grid/density-picker.js +138 -0
  94. package/build-module/layouts/grid/density-picker.js.map +1 -0
  95. package/build-module/{view-grid.js → layouts/grid/index.js} +37 -50
  96. package/build-module/layouts/grid/index.js.map +1 -0
  97. package/build-module/layouts/index.js +43 -0
  98. package/build-module/layouts/index.js.map +1 -0
  99. package/build-module/{view-list.js → layouts/list/index.js} +29 -25
  100. package/build-module/layouts/list/index.js.map +1 -0
  101. package/build-module/layouts/table/column-header-menu.js +190 -0
  102. package/build-module/layouts/table/column-header-menu.js.map +1 -0
  103. package/build-module/layouts/table/index.js +344 -0
  104. package/build-module/layouts/table/index.js.map +1 -0
  105. package/build-module/normalize-fields.js +1 -1
  106. package/build-module/normalize-fields.js.map +1 -1
  107. package/build-module/private-types.js +2 -0
  108. package/build-module/private-types.js.map +1 -0
  109. package/build-module/types.js.map +1 -1
  110. package/build-module/utils.js.map +1 -1
  111. package/build-style/style-rtl.css +607 -561
  112. package/build-style/style.css +607 -561
  113. package/build-types/components/dataform/index.d.ts +17 -0
  114. package/build-types/components/dataform/index.d.ts.map +1 -0
  115. package/build-types/components/dataform/stories/index.story.d.ts +11 -0
  116. package/build-types/components/dataform/stories/index.story.d.ts.map +1 -0
  117. package/build-types/components/dataviews/index.d.ts +33 -0
  118. package/build-types/components/dataviews/index.d.ts.map +1 -0
  119. package/build-types/{stories → components/dataviews/stories}/fixtures.d.ts +18 -17
  120. package/build-types/components/dataviews/stories/fixtures.d.ts.map +1 -0
  121. package/build-types/components/dataviews/stories/index.story.d.ts +46 -0
  122. package/build-types/components/dataviews/stories/index.story.d.ts.map +1 -0
  123. package/build-types/components/dataviews-bulk-actions/index.d.ts +5 -0
  124. package/build-types/components/dataviews-bulk-actions/index.d.ts.map +1 -0
  125. package/build-types/components/dataviews-bulk-actions-toolbar/index.d.ts +2 -0
  126. package/build-types/components/dataviews-bulk-actions-toolbar/index.d.ts.map +1 -0
  127. package/build-types/components/dataviews-context/index.d.ts +26 -0
  128. package/build-types/components/dataviews-context/index.d.ts.map +1 -0
  129. package/build-types/{add-filter.d.ts → components/dataviews-filters/add-filter.d.ts} +1 -2
  130. package/build-types/components/dataviews-filters/add-filter.d.ts.map +1 -0
  131. package/build-types/{filter-summary.d.ts → components/dataviews-filters/filter-summary.d.ts} +1 -1
  132. package/build-types/components/dataviews-filters/filter-summary.d.ts.map +1 -0
  133. package/build-types/components/dataviews-filters/index.d.ts +4 -0
  134. package/build-types/components/dataviews-filters/index.d.ts.map +1 -0
  135. package/build-types/{reset-filters.d.ts → components/dataviews-filters/reset-filters.d.ts} +1 -2
  136. package/build-types/components/dataviews-filters/reset-filters.d.ts.map +1 -0
  137. package/build-types/{search-widget.d.ts → components/dataviews-filters/search-widget.d.ts} +1 -2
  138. package/build-types/components/dataviews-filters/search-widget.d.ts.map +1 -0
  139. package/build-types/components/dataviews-item-actions/index.d.ts +35 -0
  140. package/build-types/components/dataviews-item-actions/index.d.ts.map +1 -0
  141. package/build-types/components/dataviews-layout/index.d.ts +2 -0
  142. package/build-types/components/dataviews-layout/index.d.ts.map +1 -0
  143. package/build-types/components/dataviews-pagination/index.d.ts +4 -0
  144. package/build-types/components/dataviews-pagination/index.d.ts.map +1 -0
  145. package/build-types/components/dataviews-search/index.d.ts +6 -0
  146. package/build-types/components/dataviews-search/index.d.ts.map +1 -0
  147. package/build-types/components/dataviews-selection-checkbox/index.d.ts +16 -0
  148. package/build-types/components/dataviews-selection-checkbox/index.d.ts.map +1 -0
  149. package/build-types/components/dataviews-view-config/index.d.ts +8 -0
  150. package/build-types/components/dataviews-view-config/index.d.ts.map +1 -0
  151. package/build-types/filter-and-sort-data-view.d.ts +2 -2
  152. package/build-types/filter-and-sort-data-view.d.ts.map +1 -1
  153. package/build-types/index.d.ts +2 -1
  154. package/build-types/index.d.ts.map +1 -1
  155. package/build-types/layouts/grid/density-picker.d.ts +5 -0
  156. package/build-types/layouts/grid/density-picker.d.ts.map +1 -0
  157. package/build-types/layouts/grid/index.d.ts +3 -0
  158. package/build-types/layouts/grid/index.d.ts.map +1 -0
  159. package/build-types/{layouts.d.ts → layouts/index.d.ts} +6 -5
  160. package/build-types/layouts/index.d.ts.map +1 -0
  161. package/build-types/layouts/list/index.d.ts +3 -0
  162. package/build-types/layouts/list/index.d.ts.map +1 -0
  163. package/build-types/layouts/table/column-header-menu.d.ts +17 -0
  164. package/build-types/layouts/table/column-header-menu.d.ts.map +1 -0
  165. package/build-types/layouts/table/index.d.ts +4 -0
  166. package/build-types/layouts/table/index.d.ts.map +1 -0
  167. package/build-types/normalize-fields.d.ts +2 -2
  168. package/build-types/normalize-fields.d.ts.map +1 -1
  169. package/build-types/private-types.d.ts +3 -0
  170. package/build-types/private-types.d.ts.map +1 -0
  171. package/build-types/types.d.ts +106 -46
  172. package/build-types/types.d.ts.map +1 -1
  173. package/build-types/utils.d.ts +2 -2
  174. package/build-types/utils.d.ts.map +1 -1
  175. package/package.json +10 -10
  176. package/src/components/dataform/index.tsx +106 -0
  177. package/src/components/dataform/stories/index.story.tsx +42 -0
  178. package/src/components/dataviews/index.tsx +149 -0
  179. package/src/{stories → components/dataviews/stories}/fixtures.js +23 -11
  180. package/src/components/dataviews/stories/index.story.js +65 -0
  181. package/src/components/dataviews/style.scss +97 -0
  182. package/src/{bulk-actions.tsx → components/dataviews-bulk-actions/index.tsx} +58 -36
  183. package/src/components/dataviews-bulk-actions/style.scss +7 -0
  184. package/src/{bulk-actions-toolbar.tsx → components/dataviews-bulk-actions-toolbar/index.tsx} +48 -36
  185. package/src/components/dataviews-bulk-actions-toolbar/style.scss +45 -0
  186. package/src/components/dataviews-context/index.ts +49 -0
  187. package/src/{add-filter.tsx → components/dataviews-filters/add-filter.tsx} +4 -4
  188. package/src/{filter-summary.tsx → components/dataviews-filters/filter-summary.tsx} +36 -22
  189. package/src/{filters.tsx → components/dataviews-filters/index.tsx} +11 -25
  190. package/src/{reset-filters.tsx → components/dataviews-filters/reset-filters.tsx} +2 -2
  191. package/src/{search-widget.tsx → components/dataviews-filters/search-widget.tsx} +20 -20
  192. package/src/components/dataviews-filters/style.scss +252 -0
  193. package/src/{item-actions.tsx → components/dataviews-item-actions/index.tsx} +16 -17
  194. package/src/components/dataviews-item-actions/style.scss +3 -0
  195. package/src/components/dataviews-layout/index.tsx +51 -0
  196. package/src/{pagination.tsx → components/dataviews-pagination/index.tsx} +15 -23
  197. package/src/components/dataviews-pagination/style.scss +26 -0
  198. package/src/{search.tsx → components/dataviews-search/index.tsx} +5 -10
  199. package/src/components/dataviews-selection-checkbox/index.tsx +65 -0
  200. package/src/components/dataviews-selection-checkbox/style.scss +14 -0
  201. package/src/{view-actions.tsx → components/dataviews-view-config/index.tsx} +116 -119
  202. package/src/filter-and-sort-data-view.ts +13 -3
  203. package/src/index.ts +2 -1
  204. package/src/layouts/grid/density-picker.tsx +136 -0
  205. package/src/{view-grid.tsx → layouts/grid/index.tsx} +45 -63
  206. package/src/layouts/grid/style.scss +140 -0
  207. package/src/layouts/index.ts +66 -0
  208. package/src/{view-list.tsx → layouts/list/index.tsx} +40 -30
  209. package/src/layouts/list/style.scss +189 -0
  210. package/src/layouts/table/column-header-menu.tsx +268 -0
  211. package/src/layouts/table/index.tsx +471 -0
  212. package/src/layouts/table/style.scss +201 -0
  213. package/src/normalize-fields.ts +6 -4
  214. package/src/private-types.tsx +2 -0
  215. package/src/style.scss +11 -919
  216. package/src/test/filter-and-sort-data-view.js +17 -2
  217. package/src/types.ts +113 -55
  218. package/src/utils.ts +2 -4
  219. package/tsconfig.tsbuildinfo +1 -1
  220. package/build/add-filter.js.map +0 -1
  221. package/build/bulk-actions-toolbar.js.map +0 -1
  222. package/build/bulk-actions.js.map +0 -1
  223. package/build/dataviews.js +0 -136
  224. package/build/dataviews.js.map +0 -1
  225. package/build/filter-summary.js.map +0 -1
  226. package/build/filters.js.map +0 -1
  227. package/build/item-actions.js.map +0 -1
  228. package/build/layouts.js +0 -38
  229. package/build/layouts.js.map +0 -1
  230. package/build/pagination.js.map +0 -1
  231. package/build/reset-filters.js.map +0 -1
  232. package/build/search-widget.js.map +0 -1
  233. package/build/search.js.map +0 -1
  234. package/build/single-selection-checkbox.js +0 -63
  235. package/build/single-selection-checkbox.js.map +0 -1
  236. package/build/view-actions.js.map +0 -1
  237. package/build/view-grid.js.map +0 -1
  238. package/build/view-list.js.map +0 -1
  239. package/build/view-table.js +0 -409
  240. package/build/view-table.js.map +0 -1
  241. package/build-module/add-filter.js.map +0 -1
  242. package/build-module/bulk-actions-toolbar.js.map +0 -1
  243. package/build-module/bulk-actions.js.map +0 -1
  244. package/build-module/dataviews.js +0 -129
  245. package/build-module/dataviews.js.map +0 -1
  246. package/build-module/filter-summary.js.map +0 -1
  247. package/build-module/filters.js.map +0 -1
  248. package/build-module/item-actions.js.map +0 -1
  249. package/build-module/layouts.js +0 -30
  250. package/build-module/layouts.js.map +0 -1
  251. package/build-module/pagination.js.map +0 -1
  252. package/build-module/reset-filters.js.map +0 -1
  253. package/build-module/search-widget.js.map +0 -1
  254. package/build-module/search.js.map +0 -1
  255. package/build-module/single-selection-checkbox.js +0 -56
  256. package/build-module/single-selection-checkbox.js.map +0 -1
  257. package/build-module/view-actions.js.map +0 -1
  258. package/build-module/view-grid.js.map +0 -1
  259. package/build-module/view-list.js.map +0 -1
  260. package/build-module/view-table.js +0 -402
  261. package/build-module/view-table.js.map +0 -1
  262. package/build-types/add-filter.d.ts.map +0 -1
  263. package/build-types/bulk-actions-toolbar.d.ts +0 -12
  264. package/build-types/bulk-actions-toolbar.d.ts.map +0 -1
  265. package/build-types/bulk-actions.d.ts +0 -14
  266. package/build-types/bulk-actions.d.ts.map +0 -1
  267. package/build-types/dataviews.d.ts +0 -24
  268. package/build-types/dataviews.d.ts.map +0 -1
  269. package/build-types/filter-summary.d.ts.map +0 -1
  270. package/build-types/filters.d.ts +0 -13
  271. package/build-types/filters.d.ts.map +0 -1
  272. package/build-types/item-actions.d.ts +0 -35
  273. package/build-types/item-actions.d.ts.map +0 -1
  274. package/build-types/layouts.d.ts.map +0 -1
  275. package/build-types/pagination.d.ts +0 -16
  276. package/build-types/pagination.d.ts.map +0 -1
  277. package/build-types/reset-filters.d.ts.map +0 -1
  278. package/build-types/search-widget.d.ts.map +0 -1
  279. package/build-types/search.d.ts +0 -13
  280. package/build-types/search.d.ts.map +0 -1
  281. package/build-types/single-selection-checkbox.d.ts +0 -17
  282. package/build-types/single-selection-checkbox.d.ts.map +0 -1
  283. package/build-types/stories/fixtures.d.ts.map +0 -1
  284. package/build-types/stories/index.story.d.ts +0 -15
  285. package/build-types/stories/index.story.d.ts.map +0 -1
  286. package/build-types/view-actions.d.ts +0 -12
  287. package/build-types/view-actions.d.ts.map +0 -1
  288. package/build-types/view-grid.d.ts +0 -4
  289. package/build-types/view-grid.d.ts.map +0 -1
  290. package/build-types/view-list.d.ts +0 -4
  291. package/build-types/view-list.d.ts.map +0 -1
  292. package/build-types/view-table.d.ts +0 -5
  293. package/build-types/view-table.d.ts.map +0 -1
  294. package/src/dataviews.tsx +0 -189
  295. package/src/layouts.ts +0 -39
  296. package/src/single-selection-checkbox.tsx +0 -80
  297. package/src/stories/index.story.js +0 -64
  298. package/src/view-table.tsx +0 -603
@@ -19,15 +19,15 @@ import { __ } from '@wordpress/i18n';
19
19
  /**
20
20
  * Internal dependencies
21
21
  */
22
- import ItemActions from './item-actions';
23
- import SingleSelectionCheckbox from './single-selection-checkbox';
24
- import { useHasAPossibleBulkAction } from './bulk-actions';
25
- import type { Action, AnyItem, NormalizedField, ViewGridProps } from './types';
22
+ import ItemActions from '../../components/dataviews-item-actions';
23
+ import SingleSelectionCheckbox from '../../components/dataviews-selection-checkbox';
24
+ import { useHasAPossibleBulkAction } from '../../components/dataviews-bulk-actions';
25
+ import type { Action, NormalizedField, ViewGridProps } from '../../types';
26
+ import type { SetSelection } from '../../private-types';
26
27
 
27
- interface GridItemProps< Item extends AnyItem > {
28
+ interface GridItemProps< Item > {
28
29
  selection: string[];
29
- data: Item[];
30
- onSelectionChange: ( items: Item[] ) => void;
30
+ onChangeSelection: SetSelection;
31
31
  getItemId: ( item: Item ) => string;
32
32
  item: Item;
33
33
  actions: Action< Item >[];
@@ -38,10 +38,9 @@ interface GridItemProps< Item extends AnyItem > {
38
38
  columnFields?: string[];
39
39
  }
40
40
 
41
- function GridItem< Item extends AnyItem >( {
41
+ function GridItem< Item >( {
42
42
  selection,
43
- data,
44
- onSelectionChange,
43
+ onChangeSelection,
45
44
  getItemId,
46
45
  item,
47
46
  actions,
@@ -54,6 +53,12 @@ function GridItem< Item extends AnyItem >( {
54
53
  const hasBulkAction = useHasAPossibleBulkAction( actions, item );
55
54
  const id = getItemId( item );
56
55
  const isSelected = selection.includes( id );
56
+ const renderedMediaField = mediaField?.render ? (
57
+ <mediaField.render item={ item } />
58
+ ) : null;
59
+ const renderedPrimaryField = primaryField?.render ? (
60
+ <primaryField.render item={ item } />
61
+ ) : null;
57
62
  return (
58
63
  <VStack
59
64
  spacing={ 0 }
@@ -68,32 +73,16 @@ function GridItem< Item extends AnyItem >( {
68
73
  if ( ! hasBulkAction ) {
69
74
  return;
70
75
  }
71
- if ( ! isSelected ) {
72
- onSelectionChange(
73
- data.filter( ( _item ) => {
74
- const itemId = getItemId?.( _item );
75
- return (
76
- itemId === id ||
77
- selection.includes( itemId )
78
- );
79
- } )
80
- );
81
- } else {
82
- onSelectionChange(
83
- data.filter( ( _item ) => {
84
- const itemId = getItemId?.( _item );
85
- return (
86
- itemId !== id &&
87
- selection.includes( itemId )
88
- );
89
- } )
90
- );
91
- }
76
+ onChangeSelection(
77
+ selection.includes( id )
78
+ ? selection.filter( ( itemId ) => id !== itemId )
79
+ : [ ...selection, id ]
80
+ );
92
81
  }
93
82
  } }
94
83
  >
95
84
  <div className="dataviews-view-grid__media">
96
- { mediaField?.render( { item } ) }
85
+ { renderedMediaField }
97
86
  </div>
98
87
  <HStack
99
88
  justify="space-between"
@@ -102,14 +91,13 @@ function GridItem< Item extends AnyItem >( {
102
91
  <SingleSelectionCheckbox
103
92
  item={ item }
104
93
  selection={ selection }
105
- onSelectionChange={ onSelectionChange }
94
+ onChangeSelection={ onChangeSelection }
106
95
  getItemId={ getItemId }
107
- data={ data }
108
96
  primaryField={ primaryField }
109
97
  disabled={ ! hasBulkAction }
110
98
  />
111
99
  <HStack className="dataviews-view-grid__primary-field">
112
- { primaryField?.render( { item } ) }
100
+ { renderedPrimaryField }
113
101
  </HStack>
114
102
  <ItemActions item={ item } actions={ actions } isCompact />
115
103
  </HStack>
@@ -122,32 +110,20 @@ function GridItem< Item extends AnyItem >( {
122
110
  justify="flex-start"
123
111
  >
124
112
  { badgeFields.map( ( field ) => {
125
- const renderedValue = field.render( {
126
- item,
127
- } );
128
- if ( ! renderedValue ) {
129
- return null;
130
- }
131
113
  return (
132
114
  <FlexItem
133
115
  key={ field.id }
134
116
  className="dataviews-view-grid__field-value"
135
117
  >
136
- { renderedValue }
118
+ <field.render item={ item } />
137
119
  </FlexItem>
138
120
  );
139
121
  } ) }
140
122
  </HStack>
141
123
  ) }
142
124
  { !! visibleFields?.length && (
143
- <VStack className="dataviews-view-grid__fields" spacing={ 3 }>
125
+ <VStack className="dataviews-view-grid__fields" spacing={ 1 }>
144
126
  { visibleFields.map( ( field ) => {
145
- const renderedValue = field.render( {
146
- item,
147
- } );
148
- if ( ! renderedValue ) {
149
- return null;
150
- }
151
127
  return (
152
128
  <Flex
153
129
  className={ clsx(
@@ -169,13 +145,13 @@ function GridItem< Item extends AnyItem >( {
169
145
  >
170
146
  <>
171
147
  <FlexItem className="dataviews-view-grid__field-name">
172
- { field.header }
148
+ { field.label }
173
149
  </FlexItem>
174
150
  <FlexItem
175
151
  className="dataviews-view-grid__field-value"
176
152
  style={ { maxHeight: 'none' } }
177
153
  >
178
- { renderedValue }
154
+ <field.render item={ item } />
179
155
  </FlexItem>
180
156
  </>
181
157
  </Flex>
@@ -187,35 +163,38 @@ function GridItem< Item extends AnyItem >( {
187
163
  );
188
164
  }
189
165
 
190
- export default function ViewGrid< Item extends AnyItem >( {
166
+ export default function ViewGrid< Item >( {
191
167
  actions,
192
168
  data,
193
169
  fields,
194
170
  getItemId,
195
171
  isLoading,
196
- onSelectionChange,
172
+ onChangeSelection,
197
173
  selection,
198
174
  view,
175
+ density,
199
176
  }: ViewGridProps< Item > ) {
200
177
  const mediaField = fields.find(
201
- ( field ) => field.id === view.layout.mediaField
178
+ ( field ) => field.id === view.layout?.mediaField
202
179
  );
203
180
  const primaryField = fields.find(
204
- ( field ) => field.id === view.layout.primaryField
181
+ ( field ) => field.id === view.layout?.primaryField
205
182
  );
183
+ const viewFields = view.fields || fields.map( ( field ) => field.id );
206
184
  const { visibleFields, badgeFields } = fields.reduce(
207
185
  ( accumulator: Record< string, NormalizedField< Item >[] >, field ) => {
208
186
  if (
209
- view.hiddenFields.includes( field.id ) ||
210
- [ view.layout.mediaField, view.layout.primaryField ].includes(
211
- field.id
212
- )
187
+ ! viewFields.includes( field.id ) ||
188
+ [
189
+ view.layout?.mediaField,
190
+ view?.layout?.primaryField,
191
+ ].includes( field.id )
213
192
  ) {
214
193
  return accumulator;
215
194
  }
216
195
  // If the field is a badge field, add it to the badgeFields array
217
196
  // otherwise add it to the rest visibleFields array.
218
- const key = view.layout.badgeFields?.includes( field.id )
197
+ const key = view.layout?.badgeFields?.includes( field.id )
219
198
  ? 'badgeFields'
220
199
  : 'visibleFields';
221
200
  accumulator[ key ].push( field );
@@ -224,6 +203,9 @@ export default function ViewGrid< Item extends AnyItem >( {
224
203
  { visibleFields: [], badgeFields: [] }
225
204
  );
226
205
  const hasData = !! data?.length;
206
+ const gridStyle = density
207
+ ? { gridTemplateColumns: `repeat(${ density }, minmax(0, 1fr))` }
208
+ : {};
227
209
  return (
228
210
  <>
229
211
  { hasData && (
@@ -232,6 +214,7 @@ export default function ViewGrid< Item extends AnyItem >( {
232
214
  columns={ 2 }
233
215
  alignment="top"
234
216
  className="dataviews-view-grid"
217
+ style={ gridStyle }
235
218
  aria-busy={ isLoading }
236
219
  >
237
220
  { data.map( ( item ) => {
@@ -239,8 +222,7 @@ export default function ViewGrid< Item extends AnyItem >( {
239
222
  <GridItem
240
223
  key={ getItemId( item ) }
241
224
  selection={ selection }
242
- data={ data }
243
- onSelectionChange={ onSelectionChange }
225
+ onChangeSelection={ onChangeSelection }
244
226
  getItemId={ getItemId }
245
227
  item={ item }
246
228
  actions={ actions }
@@ -248,7 +230,7 @@ export default function ViewGrid< Item extends AnyItem >( {
248
230
  primaryField={ primaryField }
249
231
  visibleFields={ visibleFields }
250
232
  badgeFields={ badgeFields }
251
- columnFields={ view.layout.columnFields }
233
+ columnFields={ view.layout?.columnFields }
252
234
  />
253
235
  );
254
236
  } ) }
@@ -0,0 +1,140 @@
1
+ .dataviews-view-grid {
2
+ margin-bottom: auto;
3
+ grid-template-rows: max-content;
4
+ padding: 0 $grid-unit-60 $grid-unit-30;
5
+ transition: padding ease-out 0.1s;
6
+ @include reduce-motion("transition");
7
+
8
+
9
+ .dataviews-view-grid__card {
10
+ height: 100%;
11
+ justify-content: flex-start;
12
+
13
+ .dataviews-view-grid__title-actions {
14
+ padding: $grid-unit-10 0 $grid-unit-05;
15
+ }
16
+
17
+ .dataviews-view-grid__primary-field {
18
+ min-height: $grid-unit-40; // Preserve layout when there is no ellipsis button
19
+ }
20
+
21
+ &.is-selected {
22
+ .dataviews-view-grid__fields .dataviews-view-grid__field .dataviews-view-grid__field-value {
23
+ color: $gray-900;
24
+ }
25
+ }
26
+ }
27
+
28
+ .dataviews-view-grid__media {
29
+ width: 100%;
30
+ min-height: 200px;
31
+ aspect-ratio: 1/1;
32
+ background-color: $gray-100;
33
+ border-radius: $grid-unit-05;
34
+ position: relative;
35
+
36
+ img {
37
+ object-fit: cover;
38
+ width: 100%;
39
+ height: 100%;
40
+ }
41
+
42
+ &::after {
43
+ content: "";
44
+ position: absolute;
45
+ top: 0;
46
+ left: 0;
47
+ width: 100%;
48
+ height: 100%;
49
+ box-shadow: inset 0 0 0 $border-width rgba(0, 0, 0, 0.1);
50
+ border-radius: $grid-unit-05;
51
+ pointer-events: none;
52
+ }
53
+ }
54
+
55
+ .dataviews-view-grid__fields {
56
+ position: relative;
57
+ font-size: 12px;
58
+ line-height: 16px;
59
+
60
+ &:not(:empty) {
61
+ padding: 0 0 $grid-unit-15;
62
+ }
63
+
64
+ .dataviews-view-grid__field {
65
+ align-items: flex-start;
66
+ min-height: $grid-unit-30;
67
+
68
+ &:not(.is-column) {
69
+ align-items: center;
70
+
71
+ .dataviews-view-grid__field-name {
72
+ width: 35%;
73
+ }
74
+
75
+ .dataviews-view-grid__field-value {
76
+ width: 65%;
77
+ overflow: hidden;
78
+ text-overflow: ellipsis;
79
+ white-space: nowrap;
80
+ }
81
+ }
82
+
83
+ &.is-column {
84
+ & + .is-row {
85
+ margin-top: $grid-unit-05;
86
+ }
87
+ }
88
+
89
+ .dataviews-view-grid__field-name {
90
+ color: $gray-700;
91
+ }
92
+ }
93
+ }
94
+
95
+ .dataviews-view-grid__badge-fields {
96
+ &:not(:empty) {
97
+ padding-bottom: $grid-unit-15;
98
+ }
99
+
100
+ .dataviews-view-grid__field-value {
101
+ width: fit-content;
102
+ background: $gray-100;
103
+ padding: 0 $grid-unit-10;
104
+ min-height: $grid-unit-30;
105
+ border-radius: $radius-block-ui;
106
+ display: flex;
107
+ align-items: center;
108
+ font-size: 12px;
109
+ }
110
+ }
111
+ }
112
+
113
+ .dataviews-view-grid.dataviews-view-grid {
114
+ grid-template-columns: repeat(1, minmax(0, 1fr));
115
+
116
+ @include break-mobile() {
117
+ grid-template-columns: repeat(2, minmax(0, 1fr));
118
+ }
119
+
120
+ @include break-xlarge() {
121
+ grid-template-columns: repeat(3, minmax(0, 1fr));
122
+ }
123
+
124
+ @include break-huge() {
125
+ grid-template-columns: repeat(4, minmax(0, 1fr));
126
+ }
127
+
128
+ @include break-xhuge() {
129
+ grid-template-columns: repeat(5, minmax(0, 1fr));
130
+ }
131
+ }
132
+
133
+ .dataviews-density-picker__range-control {
134
+ width: 200px;
135
+ }
136
+
137
+ .dataviews-view-grid__field-value:empty,
138
+ .dataviews-view-grid__field:empty {
139
+ display: none;
140
+ }
@@ -0,0 +1,66 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { __, isRTL } from '@wordpress/i18n';
5
+ import {
6
+ blockTable,
7
+ category,
8
+ formatListBullets,
9
+ formatListBulletsRTL,
10
+ } from '@wordpress/icons';
11
+
12
+ /**
13
+ * Internal dependencies
14
+ */
15
+ import ViewTable from './table';
16
+ import ViewGrid from './grid';
17
+ import ViewList from './list';
18
+ import { LAYOUT_GRID, LAYOUT_LIST, LAYOUT_TABLE } from '../constants';
19
+ import type { View } from '../types';
20
+
21
+ export const VIEW_LAYOUTS = [
22
+ {
23
+ type: LAYOUT_TABLE,
24
+ label: __( 'Table' ),
25
+ component: ViewTable,
26
+ icon: blockTable,
27
+ },
28
+ {
29
+ type: LAYOUT_GRID,
30
+ label: __( 'Grid' ),
31
+ component: ViewGrid,
32
+ icon: category,
33
+ },
34
+ {
35
+ type: LAYOUT_LIST,
36
+ label: __( 'List' ),
37
+ component: ViewList,
38
+ icon: isRTL() ? formatListBulletsRTL : formatListBullets,
39
+ },
40
+ ];
41
+
42
+ export function getMandatoryFields( view: View ): string[] {
43
+ if ( view.type === 'table' ) {
44
+ return [ view.layout?.primaryField ]
45
+ .concat(
46
+ view.layout?.combinedFields?.flatMap(
47
+ ( field ) => field.children
48
+ ) ?? []
49
+ )
50
+ .filter( ( item ): item is string => !! item );
51
+ }
52
+
53
+ if ( view.type === 'grid' ) {
54
+ return [ view.layout?.primaryField, view.layout?.mediaField ].filter(
55
+ ( item ): item is string => !! item
56
+ );
57
+ }
58
+
59
+ if ( view.type === 'list' ) {
60
+ return [ view.layout?.primaryField, view.layout?.mediaField ].filter(
61
+ ( item ): item is string => !! item
62
+ );
63
+ }
64
+
65
+ return [];
66
+ }
@@ -32,12 +32,14 @@ import { useRegistry } from '@wordpress/data';
32
32
  /**
33
33
  * Internal dependencies
34
34
  */
35
- import { unlock } from './lock-unlock';
36
- import type { Action, AnyItem, NormalizedField, ViewListProps } from './types';
37
-
38
- import { ActionsDropdownMenuGroup, ActionModal } from './item-actions';
35
+ import { unlock } from '../../lock-unlock';
36
+ import {
37
+ ActionsDropdownMenuGroup,
38
+ ActionModal,
39
+ } from '../../components/dataviews-item-actions';
40
+ import type { Action, NormalizedField, ViewListProps } from '../../types';
39
41
 
40
- interface ListViewItemProps< Item extends AnyItem > {
42
+ interface ListViewItemProps< Item > {
41
43
  actions: Action< Item >[];
42
44
  id?: string;
43
45
  isSelected: boolean;
@@ -57,7 +59,7 @@ const {
57
59
  DropdownMenuV2: DropdownMenu,
58
60
  } = unlock( componentsPrivateApis );
59
61
 
60
- function ListItem< Item extends AnyItem >( {
62
+ function ListItem< Item >( {
61
63
  actions,
62
64
  id,
63
65
  isSelected,
@@ -113,6 +115,16 @@ function ListItem< Item extends AnyItem >( {
113
115
  ? primaryAction.label
114
116
  : primaryAction.label( [ item ] ) );
115
117
 
118
+ const renderedMediaField = mediaField?.render ? (
119
+ <mediaField.render item={ item } />
120
+ ) : (
121
+ <div className="dataviews-view-list__media-placeholder"></div>
122
+ );
123
+
124
+ const renderedPrimaryField = primaryField?.render ? (
125
+ <primaryField.render item={ item } />
126
+ ) : null;
127
+
116
128
  return (
117
129
  <CompositeRow
118
130
  ref={ itemRef }
@@ -148,16 +160,17 @@ function ListItem< Item extends AnyItem >( {
148
160
  alignment="flex-start"
149
161
  >
150
162
  <div className="dataviews-view-list__media-wrapper">
151
- { mediaField?.render( { item } ) || (
152
- <div className="dataviews-view-list__media-placeholder"></div>
153
- ) }
163
+ { renderedMediaField }
154
164
  </div>
155
- <VStack spacing={ 0 }>
165
+ <VStack
166
+ spacing={ 1 }
167
+ className="dataviews-view-list__field-wrapper"
168
+ >
156
169
  <span
157
170
  className="dataviews-view-list__primary-field"
158
171
  id={ labelId }
159
172
  >
160
- { primaryField?.render( { item } ) }
173
+ { renderedPrimaryField }
161
174
  </span>
162
175
  <div
163
176
  className="dataviews-view-list__fields"
@@ -172,10 +185,10 @@ function ListItem< Item extends AnyItem >( {
172
185
  as="span"
173
186
  className="dataviews-view-list__field-label"
174
187
  >
175
- { field.header }
188
+ { field.label }
176
189
  </VisuallyHidden>
177
190
  <span className="dataviews-view-list__field-value">
178
- { field.render( { item } ) }
191
+ <field.render item={ item } />
179
192
  </span>
180
193
  </div>
181
194
  ) ) }
@@ -186,7 +199,7 @@ function ListItem< Item extends AnyItem >( {
186
199
  </div>
187
200
  { eligibleActions?.length > 0 && (
188
201
  <HStack
189
- spacing={ 1 }
202
+ spacing={ 3 }
190
203
  justify="flex-end"
191
204
  className="dataviews-view-list__item-actions"
192
205
  style={ {
@@ -205,7 +218,7 @@ function ListItem< Item extends AnyItem >( {
205
218
  isDestructive={
206
219
  primaryAction.isDestructive
207
220
  }
208
- size="compact"
221
+ size="small"
209
222
  onClick={ () =>
210
223
  setIsModalOpen( true )
211
224
  }
@@ -236,7 +249,7 @@ function ListItem< Item extends AnyItem >( {
236
249
  isDestructive={
237
250
  primaryAction.isDestructive
238
251
  }
239
- size="compact"
252
+ size="small"
240
253
  onClick={ () => {
241
254
  primaryAction.callback(
242
255
  [ item ],
@@ -255,10 +268,10 @@ function ListItem< Item extends AnyItem >( {
255
268
  store={ store }
256
269
  render={
257
270
  <Button
258
- size="compact"
271
+ size="small"
259
272
  icon={ moreVertical }
260
273
  label={ __( 'Actions' ) }
261
- __experimentalIsFocusable
274
+ accessibleWhenDisabled
262
275
  disabled={ ! actions.length }
263
276
  onKeyDown={ ( event: {
264
277
  key: string;
@@ -303,16 +316,14 @@ function ListItem< Item extends AnyItem >( {
303
316
  );
304
317
  }
305
318
 
306
- export default function ViewList< Item extends AnyItem >(
307
- props: ViewListProps< Item >
308
- ) {
319
+ export default function ViewList< Item >( props: ViewListProps< Item > ) {
309
320
  const {
310
321
  actions,
311
322
  data,
312
323
  fields,
313
324
  getItemId,
314
325
  isLoading,
315
- onSelectionChange,
326
+ onChangeSelection,
316
327
  selection,
317
328
  view,
318
329
  } = props;
@@ -322,23 +333,22 @@ export default function ViewList< Item extends AnyItem >(
322
333
  );
323
334
 
324
335
  const mediaField = fields.find(
325
- ( field ) => field.id === view.layout.mediaField
336
+ ( field ) => field.id === view.layout?.mediaField
326
337
  );
327
338
  const primaryField = fields.find(
328
- ( field ) => field.id === view.layout.primaryField
339
+ ( field ) => field.id === view.layout?.primaryField
329
340
  );
341
+ const viewFields = view.fields || fields.map( ( field ) => field.id );
330
342
  const visibleFields = fields.filter(
331
343
  ( field ) =>
332
- ! view.hiddenFields.includes( field.id ) &&
333
- ! [ view.layout.primaryField, view.layout.mediaField ].includes(
344
+ viewFields.includes( field.id ) &&
345
+ ! [ view.layout?.primaryField, view.layout?.mediaField ].includes(
334
346
  field.id
335
347
  )
336
348
  );
337
349
 
338
- const onSelect = useCallback(
339
- ( item: Item ) => onSelectionChange( [ item ] ),
340
- [ onSelectionChange ]
341
- );
350
+ const onSelect = ( item: Item ) =>
351
+ onChangeSelection( [ getItemId( item ) ] );
342
352
 
343
353
  const getItemDomId = useCallback(
344
354
  ( item?: Item ) =>