@wordpress/dataviews 3.0.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 (274) hide show
  1. package/CHANGELOG.md +8 -1
  2. package/README.md +19 -4
  3. package/build/{dataform.js → components/dataform/index.js} +5 -5
  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 -19
  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} +2 -2
  14. package/build/components/dataviews-filters/add-filter.js.map +1 -0
  15. package/build/{filter-summary.js → components/dataviews-filters/filter-summary.js} +9 -9
  16. package/build/components/dataviews-filters/filter-summary.js.map +1 -0
  17. package/build/{filters.js → components/dataviews-filters/index.js} +14 -15
  18. package/build/components/dataviews-filters/index.js.map +1 -0
  19. package/build/components/dataviews-filters/reset-filters.js.map +1 -0
  20. package/build/{search-widget.js → components/dataviews-filters/search-widget.js} +13 -13
  21. package/build/components/dataviews-filters/search-widget.js.map +1 -0
  22. package/build/{item-actions.js → components/dataviews-item-actions/index.js} +2 -2
  23. package/build/components/dataviews-item-actions/index.js.map +1 -0
  24. package/build/components/dataviews-layout/index.js +53 -0
  25. package/build/components/dataviews-layout/index.js.map +1 -0
  26. package/build/{pagination.js → components/dataviews-pagination/index.js} +16 -13
  27. package/build/components/dataviews-pagination/index.js.map +1 -0
  28. package/build/{search.js → components/dataviews-search/index.js} +10 -6
  29. package/build/components/dataviews-search/index.js.map +1 -0
  30. package/build/{single-selection-checkbox.js → components/dataviews-selection-checkbox/index.js} +6 -6
  31. package/build/components/dataviews-selection-checkbox/index.js.map +1 -0
  32. package/build/{view-actions.js → components/dataviews-view-config/index.js} +19 -16
  33. package/build/components/dataviews-view-config/index.js.map +1 -0
  34. package/build/index.js +2 -2
  35. package/build/index.js.map +1 -1
  36. package/build/layouts/grid/density-picker.js +143 -0
  37. package/build/layouts/grid/density-picker.js.map +1 -0
  38. package/build/{view-grid.js → layouts/grid/index.js} +34 -35
  39. package/build/layouts/grid/index.js.map +1 -0
  40. package/build/layouts/index.js +52 -0
  41. package/build/layouts/index.js.map +1 -0
  42. package/build/{view-list.js → layouts/list/index.js} +26 -23
  43. package/build/layouts/list/index.js.map +1 -0
  44. package/build/layouts/table/column-header-menu.js +196 -0
  45. package/build/layouts/table/column-header-menu.js.map +1 -0
  46. package/build/layouts/table/index.js +350 -0
  47. package/build/layouts/table/index.js.map +1 -0
  48. package/build/normalize-fields.js +1 -1
  49. package/build/normalize-fields.js.map +1 -1
  50. package/build/types.js.map +1 -1
  51. package/build-module/{dataform.js → components/dataform/index.js} +5 -5
  52. package/build-module/components/dataform/index.js.map +1 -0
  53. package/build-module/components/dataviews/index.js +108 -0
  54. package/build-module/components/dataviews/index.js.map +1 -0
  55. package/build-module/{bulk-actions.js → components/dataviews-bulk-actions/index.js} +39 -17
  56. package/build-module/components/dataviews-bulk-actions/index.js.map +1 -0
  57. package/build-module/{bulk-actions-toolbar.js → components/dataviews-bulk-actions-toolbar/index.js} +35 -19
  58. package/build-module/components/dataviews-bulk-actions-toolbar/index.js.map +1 -0
  59. package/build-module/components/dataviews-context/index.js +30 -0
  60. package/build-module/components/dataviews-context/index.js.map +1 -0
  61. package/build-module/{add-filter.js → components/dataviews-filters/add-filter.js} +2 -2
  62. package/build-module/components/dataviews-filters/add-filter.js.map +1 -0
  63. package/build-module/{filter-summary.js → components/dataviews-filters/filter-summary.js} +9 -9
  64. package/build-module/components/dataviews-filters/filter-summary.js.map +1 -0
  65. package/build-module/{filters.js → components/dataviews-filters/index.js} +15 -16
  66. package/build-module/components/dataviews-filters/index.js.map +1 -0
  67. package/build-module/components/dataviews-filters/reset-filters.js.map +1 -0
  68. package/build-module/{search-widget.js → components/dataviews-filters/search-widget.js} +13 -13
  69. package/build-module/components/dataviews-filters/search-widget.js.map +1 -0
  70. package/build-module/{item-actions.js → components/dataviews-item-actions/index.js} +2 -2
  71. package/build-module/components/dataviews-item-actions/index.js.map +1 -0
  72. package/build-module/components/dataviews-layout/index.js +45 -0
  73. package/build-module/components/dataviews-layout/index.js.map +1 -0
  74. package/build-module/{pagination.js → components/dataviews-pagination/index.js} +17 -15
  75. package/build-module/components/dataviews-pagination/index.js.map +1 -0
  76. package/build-module/{search.js → components/dataviews-search/index.js} +10 -7
  77. package/build-module/components/dataviews-search/index.js.map +1 -0
  78. package/build-module/{single-selection-checkbox.js → components/dataviews-selection-checkbox/index.js} +5 -5
  79. package/build-module/components/dataviews-selection-checkbox/index.js.map +1 -0
  80. package/build-module/{view-actions.js → components/dataviews-view-config/index.js} +19 -17
  81. package/build-module/components/dataviews-view-config/index.js.map +1 -0
  82. package/build-module/index.js +2 -2
  83. package/build-module/index.js.map +1 -1
  84. package/build-module/layouts/grid/density-picker.js +138 -0
  85. package/build-module/layouts/grid/density-picker.js.map +1 -0
  86. package/build-module/{view-grid.js → layouts/grid/index.js} +31 -32
  87. package/build-module/layouts/grid/index.js.map +1 -0
  88. package/build-module/layouts/index.js +43 -0
  89. package/build-module/layouts/index.js.map +1 -0
  90. package/build-module/{view-list.js → layouts/list/index.js} +24 -21
  91. package/build-module/layouts/list/index.js.map +1 -0
  92. package/build-module/layouts/table/column-header-menu.js +190 -0
  93. package/build-module/layouts/table/column-header-menu.js.map +1 -0
  94. package/build-module/layouts/table/index.js +344 -0
  95. package/build-module/layouts/table/index.js.map +1 -0
  96. package/build-module/normalize-fields.js +1 -1
  97. package/build-module/normalize-fields.js.map +1 -1
  98. package/build-module/types.js.map +1 -1
  99. package/build-style/style-rtl.css +607 -545
  100. package/build-style/style.css +607 -545
  101. package/build-types/{dataform.d.ts → components/dataform/index.d.ts} +2 -2
  102. package/build-types/components/dataform/index.d.ts.map +1 -0
  103. package/build-types/components/dataform/stories/index.story.d.ts +11 -0
  104. package/build-types/components/dataform/stories/index.story.d.ts.map +1 -0
  105. package/build-types/{dataviews.d.ts → components/dataviews/index.d.ts} +9 -7
  106. package/build-types/components/dataviews/index.d.ts.map +1 -0
  107. package/build-types/{stories → components/dataviews/stories}/fixtures.d.ts +7 -19
  108. package/build-types/components/dataviews/stories/fixtures.d.ts.map +1 -0
  109. package/build-types/components/dataviews/stories/index.story.d.ts +46 -0
  110. package/build-types/components/dataviews/stories/index.story.d.ts.map +1 -0
  111. package/build-types/components/dataviews-bulk-actions/index.d.ts +5 -0
  112. package/build-types/components/dataviews-bulk-actions/index.d.ts.map +1 -0
  113. package/build-types/components/dataviews-bulk-actions-toolbar/index.d.ts +2 -0
  114. package/build-types/components/dataviews-bulk-actions-toolbar/index.d.ts.map +1 -0
  115. package/build-types/components/dataviews-context/index.d.ts +26 -0
  116. package/build-types/components/dataviews-context/index.d.ts.map +1 -0
  117. package/build-types/{add-filter.d.ts → components/dataviews-filters/add-filter.d.ts} +1 -2
  118. package/build-types/components/dataviews-filters/add-filter.d.ts.map +1 -0
  119. package/build-types/{filter-summary.d.ts → components/dataviews-filters/filter-summary.d.ts} +1 -1
  120. package/build-types/components/dataviews-filters/filter-summary.d.ts.map +1 -0
  121. package/build-types/components/dataviews-filters/index.d.ts +4 -0
  122. package/build-types/components/dataviews-filters/index.d.ts.map +1 -0
  123. package/build-types/{reset-filters.d.ts → components/dataviews-filters/reset-filters.d.ts} +1 -2
  124. package/build-types/components/dataviews-filters/reset-filters.d.ts.map +1 -0
  125. package/build-types/{search-widget.d.ts → components/dataviews-filters/search-widget.d.ts} +1 -2
  126. package/build-types/components/dataviews-filters/search-widget.d.ts.map +1 -0
  127. package/build-types/{item-actions.d.ts → components/dataviews-item-actions/index.d.ts} +2 -2
  128. package/build-types/components/dataviews-item-actions/index.d.ts.map +1 -0
  129. package/build-types/components/dataviews-layout/index.d.ts +2 -0
  130. package/build-types/components/dataviews-layout/index.d.ts.map +1 -0
  131. package/build-types/components/dataviews-pagination/index.d.ts +4 -0
  132. package/build-types/components/dataviews-pagination/index.d.ts.map +1 -0
  133. package/build-types/components/dataviews-search/index.d.ts +6 -0
  134. package/build-types/components/dataviews-search/index.d.ts.map +1 -0
  135. package/build-types/components/dataviews-selection-checkbox/index.d.ts +16 -0
  136. package/build-types/components/dataviews-selection-checkbox/index.d.ts.map +1 -0
  137. package/build-types/components/dataviews-view-config/index.d.ts +8 -0
  138. package/build-types/components/dataviews-view-config/index.d.ts.map +1 -0
  139. package/build-types/index.d.ts +2 -2
  140. package/build-types/index.d.ts.map +1 -1
  141. package/build-types/layouts/grid/density-picker.d.ts +5 -0
  142. package/build-types/layouts/grid/density-picker.d.ts.map +1 -0
  143. package/build-types/layouts/grid/index.d.ts +3 -0
  144. package/build-types/layouts/grid/index.d.ts.map +1 -0
  145. package/build-types/{layouts.d.ts → layouts/index.d.ts} +6 -5
  146. package/build-types/layouts/index.d.ts.map +1 -0
  147. package/build-types/layouts/list/index.d.ts +3 -0
  148. package/build-types/layouts/list/index.d.ts.map +1 -0
  149. package/build-types/layouts/table/column-header-menu.d.ts +17 -0
  150. package/build-types/layouts/table/column-header-menu.d.ts.map +1 -0
  151. package/build-types/layouts/table/index.d.ts +4 -0
  152. package/build-types/layouts/table/index.d.ts.map +1 -0
  153. package/build-types/types.d.ts +42 -23
  154. package/build-types/types.d.ts.map +1 -1
  155. package/package.json +10 -10
  156. package/src/{dataform.tsx → components/dataform/index.tsx} +5 -5
  157. package/src/components/dataform/stories/index.story.tsx +42 -0
  158. package/src/components/dataviews/index.tsx +149 -0
  159. package/src/{stories → components/dataviews/stories}/fixtures.js +7 -11
  160. package/src/{stories → components/dataviews/stories}/index.story.js +17 -3
  161. package/src/components/dataviews/style.scss +97 -0
  162. package/src/{bulk-actions.tsx → components/dataviews-bulk-actions/index.tsx} +46 -29
  163. package/src/components/dataviews-bulk-actions/style.scss +7 -0
  164. package/src/{bulk-actions-toolbar.tsx → components/dataviews-bulk-actions-toolbar/index.tsx} +42 -30
  165. package/src/components/dataviews-bulk-actions-toolbar/style.scss +45 -0
  166. package/src/components/dataviews-context/index.ts +49 -0
  167. package/src/{add-filter.tsx → components/dataviews-filters/add-filter.tsx} +3 -3
  168. package/src/{filter-summary.tsx → components/dataviews-filters/filter-summary.tsx} +18 -10
  169. package/src/{filters.tsx → components/dataviews-filters/index.tsx} +10 -24
  170. package/src/{reset-filters.tsx → components/dataviews-filters/reset-filters.tsx} +1 -1
  171. package/src/{search-widget.tsx → components/dataviews-filters/search-widget.tsx} +14 -14
  172. package/src/components/dataviews-filters/style.scss +252 -0
  173. package/src/{item-actions.tsx → components/dataviews-item-actions/index.tsx} +2 -2
  174. package/src/components/dataviews-item-actions/style.scss +3 -0
  175. package/src/components/dataviews-layout/index.tsx +51 -0
  176. package/src/{pagination.tsx → components/dataviews-pagination/index.tsx} +13 -21
  177. package/src/components/dataviews-pagination/style.scss +26 -0
  178. package/src/{search.tsx → components/dataviews-search/index.tsx} +5 -10
  179. package/src/{single-selection-checkbox.tsx → components/dataviews-selection-checkbox/index.tsx} +9 -9
  180. package/src/components/dataviews-selection-checkbox/style.scss +14 -0
  181. package/src/{view-actions.tsx → components/dataviews-view-config/index.tsx} +16 -22
  182. package/src/index.ts +2 -2
  183. package/src/layouts/grid/density-picker.tsx +136 -0
  184. package/src/{view-grid.tsx → layouts/grid/index.tsx} +28 -29
  185. package/src/layouts/grid/style.scss +140 -0
  186. package/src/layouts/index.ts +66 -0
  187. package/src/{view-list.tsx → layouts/list/index.tsx} +30 -17
  188. package/src/layouts/list/style.scss +189 -0
  189. package/src/layouts/table/column-header-menu.tsx +268 -0
  190. package/src/layouts/table/index.tsx +471 -0
  191. package/src/layouts/table/style.scss +201 -0
  192. package/src/normalize-fields.ts +1 -1
  193. package/src/style.scss +11 -907
  194. package/src/test/filter-and-sort-data-view.js +1 -1
  195. package/src/types.ts +48 -24
  196. package/tsconfig.tsbuildinfo +1 -1
  197. package/build/add-filter.js.map +0 -1
  198. package/build/bulk-actions-toolbar.js.map +0 -1
  199. package/build/bulk-actions.js.map +0 -1
  200. package/build/dataform.js.map +0 -1
  201. package/build/dataviews.js +0 -125
  202. package/build/dataviews.js.map +0 -1
  203. package/build/filter-summary.js.map +0 -1
  204. package/build/filters.js.map +0 -1
  205. package/build/item-actions.js.map +0 -1
  206. package/build/layouts.js +0 -38
  207. package/build/layouts.js.map +0 -1
  208. package/build/pagination.js.map +0 -1
  209. package/build/reset-filters.js.map +0 -1
  210. package/build/search-widget.js.map +0 -1
  211. package/build/search.js.map +0 -1
  212. package/build/single-selection-checkbox.js.map +0 -1
  213. package/build/view-actions.js.map +0 -1
  214. package/build/view-grid.js.map +0 -1
  215. package/build/view-list.js.map +0 -1
  216. package/build/view-table.js +0 -400
  217. package/build/view-table.js.map +0 -1
  218. package/build-module/add-filter.js.map +0 -1
  219. package/build-module/bulk-actions-toolbar.js.map +0 -1
  220. package/build-module/bulk-actions.js.map +0 -1
  221. package/build-module/dataform.js.map +0 -1
  222. package/build-module/dataviews.js +0 -116
  223. package/build-module/dataviews.js.map +0 -1
  224. package/build-module/filter-summary.js.map +0 -1
  225. package/build-module/filters.js.map +0 -1
  226. package/build-module/item-actions.js.map +0 -1
  227. package/build-module/layouts.js +0 -30
  228. package/build-module/layouts.js.map +0 -1
  229. package/build-module/pagination.js.map +0 -1
  230. package/build-module/reset-filters.js.map +0 -1
  231. package/build-module/search-widget.js.map +0 -1
  232. package/build-module/search.js.map +0 -1
  233. package/build-module/single-selection-checkbox.js.map +0 -1
  234. package/build-module/view-actions.js.map +0 -1
  235. package/build-module/view-grid.js.map +0 -1
  236. package/build-module/view-list.js.map +0 -1
  237. package/build-module/view-table.js +0 -393
  238. package/build-module/view-table.js.map +0 -1
  239. package/build-types/add-filter.d.ts.map +0 -1
  240. package/build-types/bulk-actions-toolbar.d.ts +0 -13
  241. package/build-types/bulk-actions-toolbar.d.ts.map +0 -1
  242. package/build-types/bulk-actions.d.ts +0 -15
  243. package/build-types/bulk-actions.d.ts.map +0 -1
  244. package/build-types/dataform.d.ts.map +0 -1
  245. package/build-types/dataviews.d.ts.map +0 -1
  246. package/build-types/filter-summary.d.ts.map +0 -1
  247. package/build-types/filters.d.ts +0 -13
  248. package/build-types/filters.d.ts.map +0 -1
  249. package/build-types/item-actions.d.ts.map +0 -1
  250. package/build-types/layouts.d.ts.map +0 -1
  251. package/build-types/pagination.d.ts +0 -16
  252. package/build-types/pagination.d.ts.map +0 -1
  253. package/build-types/reset-filters.d.ts.map +0 -1
  254. package/build-types/search-widget.d.ts.map +0 -1
  255. package/build-types/search.d.ts +0 -13
  256. package/build-types/search.d.ts.map +0 -1
  257. package/build-types/single-selection-checkbox.d.ts +0 -17
  258. package/build-types/single-selection-checkbox.d.ts.map +0 -1
  259. package/build-types/stories/fixtures.d.ts.map +0 -1
  260. package/build-types/stories/index.story.d.ts +0 -29
  261. package/build-types/stories/index.story.d.ts.map +0 -1
  262. package/build-types/view-actions.d.ts +0 -12
  263. package/build-types/view-actions.d.ts.map +0 -1
  264. package/build-types/view-grid.d.ts +0 -4
  265. package/build-types/view-grid.d.ts.map +0 -1
  266. package/build-types/view-list.d.ts +0 -4
  267. package/build-types/view-list.d.ts.map +0 -1
  268. package/build-types/view-table.d.ts +0 -5
  269. package/build-types/view-table.d.ts.map +0 -1
  270. package/src/dataviews.tsx +0 -183
  271. package/src/layouts.ts +0 -39
  272. package/src/view-table.tsx +0 -592
  273. /package/build/{reset-filters.js → components/dataviews-filters/reset-filters.js} +0 -0
  274. /package/build-module/{reset-filters.js → components/dataviews-filters/reset-filters.js} +0 -0
@@ -0,0 +1,136 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { RangeControl, Button } from '@wordpress/components';
5
+ import { __ } from '@wordpress/i18n';
6
+ import { useViewportMatch } from '@wordpress/compose';
7
+ import { plus, lineSolid } from '@wordpress/icons';
8
+ import { useEffect } from '@wordpress/element';
9
+
10
+ const viewportBreaks = {
11
+ xhuge: { min: 3, max: 6, default: 5 },
12
+ huge: { min: 2, max: 4, default: 4 },
13
+ xlarge: { min: 2, max: 3, default: 3 },
14
+ large: { min: 1, max: 2, default: 2 },
15
+ mobile: { min: 1, max: 2, default: 2 },
16
+ };
17
+
18
+ function useViewPortBreakpoint() {
19
+ const isXHuge = useViewportMatch( 'xhuge', '>=' );
20
+ const isHuge = useViewportMatch( 'huge', '>=' );
21
+ const isXlarge = useViewportMatch( 'xlarge', '>=' );
22
+ const isLarge = useViewportMatch( 'large', '>=' );
23
+ const isMobile = useViewportMatch( 'mobile', '>=' );
24
+
25
+ if ( isXHuge ) {
26
+ return 'xhuge';
27
+ }
28
+ if ( isHuge ) {
29
+ return 'huge';
30
+ }
31
+ if ( isXlarge ) {
32
+ return 'xlarge';
33
+ }
34
+ if ( isLarge ) {
35
+ return 'large';
36
+ }
37
+ if ( isMobile ) {
38
+ return 'mobile';
39
+ }
40
+ return null;
41
+ }
42
+
43
+ // Value is number from 0 to 100 representing how big an item is in the grid
44
+ // 100 being the biggest and 0 being the smallest.
45
+ // The size is relative to the viewport size, if one a given viewport the
46
+ // number of allowed items in a grid is 3 to 6 a 0 ( the smallest ) will mean that the grid will
47
+ // have 6 items in a row, a 100 ( the biggest ) will mean that the grid will have 3 items in a row.
48
+ // A value of 75 will mean that the grid will have 4 items in a row.
49
+ function getRangeValue(
50
+ density: number,
51
+ breakValues: { min: number; max: number; default: number }
52
+ ) {
53
+ const inverseDensity = breakValues.max - density;
54
+ const max = breakValues.max - breakValues.min;
55
+ return Math.round( ( inverseDensity * 100 ) / max );
56
+ }
57
+
58
+ export default function DensityPicker( {
59
+ density,
60
+ setDensity,
61
+ }: {
62
+ density: number;
63
+ setDensity: React.Dispatch< React.SetStateAction< number > >;
64
+ } ) {
65
+ const viewport = useViewPortBreakpoint();
66
+ useEffect( () => {
67
+ setDensity( ( _density ) => {
68
+ if ( ! viewport || ! _density ) {
69
+ return 0;
70
+ }
71
+ const breakValues = viewportBreaks[ viewport ];
72
+ if ( _density < breakValues.min ) {
73
+ return breakValues.min;
74
+ }
75
+ if ( _density > breakValues.max ) {
76
+ return breakValues.max;
77
+ }
78
+ return _density;
79
+ } );
80
+ }, [ setDensity, viewport ] );
81
+ if ( ! viewport ) {
82
+ return null;
83
+ }
84
+ const breakValues = viewportBreaks[ viewport ];
85
+ const densityToUse = density || breakValues.default;
86
+ const rangeValue = getRangeValue( densityToUse, breakValues );
87
+
88
+ const step = 100 / ( breakValues.max - breakValues.min + 1 );
89
+ return (
90
+ <>
91
+ <Button
92
+ size="compact"
93
+ icon={ lineSolid }
94
+ disabled={ rangeValue <= 0 }
95
+ accessibleWhenDisabled
96
+ label={ __( 'Decrease size' ) }
97
+ onClick={ () => {
98
+ setDensity( densityToUse + 1 );
99
+ } }
100
+ />
101
+ <RangeControl
102
+ __nextHasNoMarginBottom
103
+ showTooltip={ false }
104
+ className="dataviews-density-picker__range-control"
105
+ label={ __( 'Item size' ) }
106
+ hideLabelFromVision
107
+ value={ rangeValue }
108
+ min={ 0 }
109
+ max={ 100 }
110
+ withInputField={ false }
111
+ onChange={ ( value = 0 ) => {
112
+ const inverseValue = 100 - value;
113
+ setDensity(
114
+ Math.round(
115
+ ( inverseValue *
116
+ ( breakValues.max - breakValues.min ) ) /
117
+ 100 +
118
+ breakValues.min
119
+ )
120
+ );
121
+ } }
122
+ step={ step }
123
+ />
124
+ <Button
125
+ size="compact"
126
+ icon={ plus }
127
+ disabled={ rangeValue >= 100 }
128
+ accessibleWhenDisabled
129
+ label={ __( 'Increase size' ) }
130
+ onClick={ () => {
131
+ setDensity( densityToUse - 1 );
132
+ } }
133
+ />
134
+ </>
135
+ );
136
+ }
@@ -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, NormalizedField, ViewGridProps } from './types';
26
- import type { SetSelection } from './private-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';
27
27
 
28
28
  interface GridItemProps< Item > {
29
29
  selection: string[];
30
- onSelectionChange: SetSelection;
30
+ onChangeSelection: SetSelection;
31
31
  getItemId: ( item: Item ) => string;
32
32
  item: Item;
33
33
  actions: Action< Item >[];
@@ -40,7 +40,7 @@ interface GridItemProps< Item > {
40
40
 
41
41
  function GridItem< Item >( {
42
42
  selection,
43
- onSelectionChange,
43
+ onChangeSelection,
44
44
  getItemId,
45
45
  item,
46
46
  actions,
@@ -53,6 +53,12 @@ function GridItem< Item >( {
53
53
  const hasBulkAction = useHasAPossibleBulkAction( actions, item );
54
54
  const id = getItemId( item );
55
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;
56
62
  return (
57
63
  <VStack
58
64
  spacing={ 0 }
@@ -67,7 +73,7 @@ function GridItem< Item >( {
67
73
  if ( ! hasBulkAction ) {
68
74
  return;
69
75
  }
70
- onSelectionChange(
76
+ onChangeSelection(
71
77
  selection.includes( id )
72
78
  ? selection.filter( ( itemId ) => id !== itemId )
73
79
  : [ ...selection, id ]
@@ -76,7 +82,7 @@ function GridItem< Item >( {
76
82
  } }
77
83
  >
78
84
  <div className="dataviews-view-grid__media">
79
- { mediaField?.render( { item } ) }
85
+ { renderedMediaField }
80
86
  </div>
81
87
  <HStack
82
88
  justify="space-between"
@@ -85,13 +91,13 @@ function GridItem< Item >( {
85
91
  <SingleSelectionCheckbox
86
92
  item={ item }
87
93
  selection={ selection }
88
- onSelectionChange={ onSelectionChange }
94
+ onChangeSelection={ onChangeSelection }
89
95
  getItemId={ getItemId }
90
96
  primaryField={ primaryField }
91
97
  disabled={ ! hasBulkAction }
92
98
  />
93
99
  <HStack className="dataviews-view-grid__primary-field">
94
- { primaryField?.render( { item } ) }
100
+ { renderedPrimaryField }
95
101
  </HStack>
96
102
  <ItemActions item={ item } actions={ actions } isCompact />
97
103
  </HStack>
@@ -104,32 +110,20 @@ function GridItem< Item >( {
104
110
  justify="flex-start"
105
111
  >
106
112
  { badgeFields.map( ( field ) => {
107
- const renderedValue = field.render( {
108
- item,
109
- } );
110
- if ( ! renderedValue ) {
111
- return null;
112
- }
113
113
  return (
114
114
  <FlexItem
115
115
  key={ field.id }
116
116
  className="dataviews-view-grid__field-value"
117
117
  >
118
- { renderedValue }
118
+ <field.render item={ item } />
119
119
  </FlexItem>
120
120
  );
121
121
  } ) }
122
122
  </HStack>
123
123
  ) }
124
124
  { !! visibleFields?.length && (
125
- <VStack className="dataviews-view-grid__fields" spacing={ 3 }>
125
+ <VStack className="dataviews-view-grid__fields" spacing={ 1 }>
126
126
  { visibleFields.map( ( field ) => {
127
- const renderedValue = field.render( {
128
- item,
129
- } );
130
- if ( ! renderedValue ) {
131
- return null;
132
- }
133
127
  return (
134
128
  <Flex
135
129
  className={ clsx(
@@ -151,13 +145,13 @@ function GridItem< Item >( {
151
145
  >
152
146
  <>
153
147
  <FlexItem className="dataviews-view-grid__field-name">
154
- { field.header }
148
+ { field.label }
155
149
  </FlexItem>
156
150
  <FlexItem
157
151
  className="dataviews-view-grid__field-value"
158
152
  style={ { maxHeight: 'none' } }
159
153
  >
160
- { renderedValue }
154
+ <field.render item={ item } />
161
155
  </FlexItem>
162
156
  </>
163
157
  </Flex>
@@ -175,9 +169,10 @@ export default function ViewGrid< Item >( {
175
169
  fields,
176
170
  getItemId,
177
171
  isLoading,
178
- onSelectionChange,
172
+ onChangeSelection,
179
173
  selection,
180
174
  view,
175
+ density,
181
176
  }: ViewGridProps< Item > ) {
182
177
  const mediaField = fields.find(
183
178
  ( field ) => field.id === view.layout?.mediaField
@@ -208,6 +203,9 @@ export default function ViewGrid< Item >( {
208
203
  { visibleFields: [], badgeFields: [] }
209
204
  );
210
205
  const hasData = !! data?.length;
206
+ const gridStyle = density
207
+ ? { gridTemplateColumns: `repeat(${ density }, minmax(0, 1fr))` }
208
+ : {};
211
209
  return (
212
210
  <>
213
211
  { hasData && (
@@ -216,6 +214,7 @@ export default function ViewGrid< Item >( {
216
214
  columns={ 2 }
217
215
  alignment="top"
218
216
  className="dataviews-view-grid"
217
+ style={ gridStyle }
219
218
  aria-busy={ isLoading }
220
219
  >
221
220
  { data.map( ( item ) => {
@@ -223,7 +222,7 @@ export default function ViewGrid< Item >( {
223
222
  <GridItem
224
223
  key={ getItemId( item ) }
225
224
  selection={ selection }
226
- onSelectionChange={ onSelectionChange }
225
+ onChangeSelection={ onChangeSelection }
227
226
  getItemId={ getItemId }
228
227
  item={ item }
229
228
  actions={ actions }
@@ -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,10 +32,12 @@ import { useRegistry } from '@wordpress/data';
32
32
  /**
33
33
  * Internal dependencies
34
34
  */
35
- import { unlock } from './lock-unlock';
36
- import type { Action, 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
42
  interface ListViewItemProps< Item > {
41
43
  actions: Action< Item >[];
@@ -113,6 +115,16 @@ function ListItem< Item >( {
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 >( {
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 >( {
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 >( {
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 >( {
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 >( {
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,7 +268,7 @@ function ListItem< Item >( {
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
274
  accessibleWhenDisabled
@@ -310,7 +323,7 @@ export default function ViewList< Item >( props: ViewListProps< Item > ) {
310
323
  fields,
311
324
  getItemId,
312
325
  isLoading,
313
- onSelectionChange,
326
+ onChangeSelection,
314
327
  selection,
315
328
  view,
316
329
  } = props;
@@ -335,7 +348,7 @@ export default function ViewList< Item >( props: ViewListProps< Item > ) {
335
348
  );
336
349
 
337
350
  const onSelect = ( item: Item ) =>
338
- onSelectionChange( [ getItemId( item ) ] );
351
+ onChangeSelection( [ getItemId( item ) ] );
339
352
 
340
353
  const getItemDomId = useCallback(
341
354
  ( item?: Item ) =>