@wordpress/dataviews 13.1.1-next.v.202603102151.0 → 14.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 (247) hide show
  1. package/CHANGELOG.md +18 -1
  2. package/README.md +19 -3
  3. package/build/components/dataform-controls/datetime.cjs +8 -4
  4. package/build/components/dataform-controls/datetime.cjs.map +2 -2
  5. package/build/components/dataform-layouts/card/index.cjs +132 -128
  6. package/build/components/dataform-layouts/card/index.cjs.map +3 -3
  7. package/build/components/dataviews-bulk-actions/index.cjs +28 -5
  8. package/build/components/dataviews-bulk-actions/index.cjs.map +2 -2
  9. package/build/components/dataviews-context/index.cjs +2 -2
  10. package/build/components/dataviews-context/index.cjs.map +2 -2
  11. package/build/components/dataviews-footer/index.cjs +2 -3
  12. package/build/components/dataviews-footer/index.cjs.map +2 -2
  13. package/build/components/dataviews-layout/index.cjs +12 -3
  14. package/build/components/dataviews-layout/index.cjs.map +2 -2
  15. package/build/components/dataviews-layouts/grid/composite-grid.cjs +378 -245
  16. package/build/components/dataviews-layouts/grid/composite-grid.cjs.map +2 -2
  17. package/build/components/dataviews-layouts/index.cjs +3 -3
  18. package/build/components/dataviews-layouts/index.cjs.map +3 -3
  19. package/build/components/dataviews-layouts/picker-grid/index.cjs +76 -32
  20. package/build/components/dataviews-layouts/picker-grid/index.cjs.map +2 -2
  21. package/build/components/dataviews-layouts/picker-table/index.cjs +34 -22
  22. package/build/components/dataviews-layouts/picker-table/index.cjs.map +2 -2
  23. package/build/components/dataviews-layouts/table/index.cjs +97 -88
  24. package/build/components/dataviews-layouts/table/index.cjs.map +2 -2
  25. package/build/components/dataviews-layouts/table/{use-is-horizontal-scroll-end.cjs → use-scroll-state.cjs} +29 -33
  26. package/build/components/dataviews-layouts/table/use-scroll-state.cjs.map +7 -0
  27. package/build/components/dataviews-layouts/utils/density-picker.cjs.map +2 -2
  28. package/build/components/dataviews-layouts/utils/grid-config-options.cjs +45 -0
  29. package/build/components/dataviews-layouts/utils/grid-config-options.cjs.map +7 -0
  30. package/build/components/dataviews-layouts/utils/use-infinite-scroll.cjs +62 -0
  31. package/build/components/dataviews-layouts/utils/use-infinite-scroll.cjs.map +7 -0
  32. package/build/components/dataviews-picker-footer/index.cjs +23 -4
  33. package/build/components/dataviews-picker-footer/index.cjs.map +2 -2
  34. package/build/components/dataviews-search/index.cjs +2 -1
  35. package/build/components/dataviews-search/index.cjs.map +2 -2
  36. package/build/components/dataviews-selection-checkbox/index.cjs +3 -2
  37. package/build/components/dataviews-selection-checkbox/index.cjs.map +2 -2
  38. package/build/components/dataviews-view-config/index.cjs +0 -2
  39. package/build/components/dataviews-view-config/index.cjs.map +3 -3
  40. package/build/components/dataviews-view-config/infinite-scroll-toggle.cjs +0 -3
  41. package/build/components/dataviews-view-config/infinite-scroll-toggle.cjs.map +2 -2
  42. package/build/dataviews/index.cjs +38 -34
  43. package/build/dataviews/index.cjs.map +3 -3
  44. package/build/dataviews-picker/index.cjs +26 -25
  45. package/build/dataviews-picker/index.cjs.map +3 -3
  46. package/build/hooks/index.cjs +11 -2
  47. package/build/hooks/index.cjs.map +2 -2
  48. package/build/hooks/use-data.cjs +146 -9
  49. package/build/hooks/use-data.cjs.map +2 -2
  50. package/build/hooks/use-infinite-scroll.cjs +208 -0
  51. package/build/hooks/use-infinite-scroll.cjs.map +7 -0
  52. package/build/hooks/use-selected-items.cjs +57 -0
  53. package/build/hooks/use-selected-items.cjs.map +7 -0
  54. package/build/types/dataviews.cjs.map +1 -1
  55. package/build/types/field-api.cjs.map +1 -1
  56. package/build/utils/filter-sort-and-paginate.cjs +5 -1
  57. package/build/utils/filter-sort-and-paginate.cjs.map +2 -2
  58. package/build/utils/get-footer-message.cjs +8 -8
  59. package/build/utils/get-footer-message.cjs.map +2 -2
  60. package/build-module/components/dataform-controls/datetime.mjs +8 -4
  61. package/build-module/components/dataform-controls/datetime.mjs.map +2 -2
  62. package/build-module/components/dataform-layouts/card/index.mjs +132 -133
  63. package/build-module/components/dataform-layouts/card/index.mjs.map +2 -2
  64. package/build-module/components/dataviews-bulk-actions/index.mjs +28 -5
  65. package/build-module/components/dataviews-bulk-actions/index.mjs.map +2 -2
  66. package/build-module/components/dataviews-context/index.mjs +2 -2
  67. package/build-module/components/dataviews-context/index.mjs.map +2 -2
  68. package/build-module/components/dataviews-footer/index.mjs +2 -3
  69. package/build-module/components/dataviews-footer/index.mjs.map +2 -2
  70. package/build-module/components/dataviews-layout/index.mjs +12 -3
  71. package/build-module/components/dataviews-layout/index.mjs.map +2 -2
  72. package/build-module/components/dataviews-layouts/grid/composite-grid.mjs +387 -246
  73. package/build-module/components/dataviews-layouts/grid/composite-grid.mjs.map +2 -2
  74. package/build-module/components/dataviews-layouts/index.mjs +3 -3
  75. package/build-module/components/dataviews-layouts/index.mjs.map +2 -2
  76. package/build-module/components/dataviews-layouts/picker-grid/index.mjs +80 -33
  77. package/build-module/components/dataviews-layouts/picker-grid/index.mjs.map +2 -2
  78. package/build-module/components/dataviews-layouts/picker-table/index.mjs +34 -22
  79. package/build-module/components/dataviews-layouts/picker-table/index.mjs.map +2 -2
  80. package/build-module/components/dataviews-layouts/table/index.mjs +97 -88
  81. package/build-module/components/dataviews-layouts/table/index.mjs.map +2 -2
  82. package/build-module/components/dataviews-layouts/table/use-scroll-state.mjs +46 -0
  83. package/build-module/components/dataviews-layouts/table/use-scroll-state.mjs.map +7 -0
  84. package/build-module/components/dataviews-layouts/utils/density-picker.mjs.map +2 -2
  85. package/build-module/components/dataviews-layouts/utils/grid-config-options.mjs +14 -0
  86. package/build-module/components/dataviews-layouts/utils/grid-config-options.mjs.map +7 -0
  87. package/build-module/components/dataviews-layouts/utils/use-infinite-scroll.mjs +26 -0
  88. package/build-module/components/dataviews-layouts/utils/use-infinite-scroll.mjs.map +7 -0
  89. package/build-module/components/dataviews-picker-footer/index.mjs +23 -4
  90. package/build-module/components/dataviews-picker-footer/index.mjs.map +2 -2
  91. package/build-module/components/dataviews-search/index.mjs +2 -1
  92. package/build-module/components/dataviews-search/index.mjs.map +2 -2
  93. package/build-module/components/dataviews-selection-checkbox/index.mjs +3 -2
  94. package/build-module/components/dataviews-selection-checkbox/index.mjs.map +2 -2
  95. package/build-module/components/dataviews-view-config/index.mjs +0 -2
  96. package/build-module/components/dataviews-view-config/index.mjs.map +2 -2
  97. package/build-module/components/dataviews-view-config/infinite-scroll-toggle.mjs +0 -3
  98. package/build-module/components/dataviews-view-config/infinite-scroll-toggle.mjs.map +2 -2
  99. package/build-module/dataviews/index.mjs +46 -36
  100. package/build-module/dataviews/index.mjs.map +2 -2
  101. package/build-module/dataviews-picker/index.mjs +34 -27
  102. package/build-module/dataviews-picker/index.mjs.map +2 -2
  103. package/build-module/hooks/index.mjs +7 -1
  104. package/build-module/hooks/index.mjs.map +2 -2
  105. package/build-module/hooks/use-data.mjs +147 -10
  106. package/build-module/hooks/use-data.mjs.map +2 -2
  107. package/build-module/hooks/use-infinite-scroll.mjs +188 -0
  108. package/build-module/hooks/use-infinite-scroll.mjs.map +7 -0
  109. package/build-module/hooks/use-selected-items.mjs +36 -0
  110. package/build-module/hooks/use-selected-items.mjs.map +7 -0
  111. package/build-module/utils/filter-sort-and-paginate.mjs +5 -1
  112. package/build-module/utils/filter-sort-and-paginate.mjs.map +2 -2
  113. package/build-module/utils/get-footer-message.mjs +8 -8
  114. package/build-module/utils/get-footer-message.mjs.map +2 -2
  115. package/build-style/style-rtl.css +107 -41
  116. package/build-style/style.css +107 -41
  117. package/build-types/components/dataform-controls/datetime.d.ts +1 -1
  118. package/build-types/components/dataform-controls/datetime.d.ts.map +1 -1
  119. package/build-types/components/dataform-layouts/card/index.d.ts.map +1 -1
  120. package/build-types/components/dataviews-bulk-actions/index.d.ts +2 -1
  121. package/build-types/components/dataviews-bulk-actions/index.d.ts.map +1 -1
  122. package/build-types/components/dataviews-context/index.d.ts +1 -1
  123. package/build-types/components/dataviews-context/index.d.ts.map +1 -1
  124. package/build-types/components/dataviews-footer/index.d.ts.map +1 -1
  125. package/build-types/components/dataviews-layout/index.d.ts.map +1 -1
  126. package/build-types/components/dataviews-layouts/grid/composite-grid.d.ts.map +1 -1
  127. package/build-types/components/dataviews-layouts/index.d.ts +3 -3
  128. package/build-types/components/dataviews-layouts/index.d.ts.map +1 -1
  129. package/build-types/components/dataviews-layouts/picker-grid/index.d.ts.map +1 -1
  130. package/build-types/components/dataviews-layouts/picker-table/index.d.ts.map +1 -1
  131. package/build-types/components/dataviews-layouts/table/index.d.ts.map +1 -1
  132. package/build-types/components/dataviews-layouts/table/use-scroll-state.d.ts +25 -0
  133. package/build-types/components/dataviews-layouts/table/use-scroll-state.d.ts.map +1 -0
  134. package/build-types/components/dataviews-layouts/utils/density-picker.d.ts.map +1 -1
  135. package/build-types/components/dataviews-layouts/utils/grid-config-options.d.ts +2 -0
  136. package/build-types/components/dataviews-layouts/utils/grid-config-options.d.ts.map +1 -0
  137. package/build-types/components/dataviews-layouts/utils/use-infinite-scroll.d.ts +22 -0
  138. package/build-types/components/dataviews-layouts/utils/use-infinite-scroll.d.ts.map +1 -0
  139. package/build-types/components/dataviews-picker-footer/index.d.ts.map +1 -1
  140. package/build-types/components/dataviews-search/index.d.ts.map +1 -1
  141. package/build-types/components/dataviews-selection-checkbox/index.d.ts.map +1 -1
  142. package/build-types/components/dataviews-view-config/index.d.ts.map +1 -1
  143. package/build-types/components/dataviews-view-config/infinite-scroll-toggle.d.ts +1 -1
  144. package/build-types/components/dataviews-view-config/infinite-scroll-toggle.d.ts.map +1 -1
  145. package/build-types/dataviews/index.d.ts +0 -1
  146. package/build-types/dataviews/index.d.ts.map +1 -1
  147. package/build-types/dataviews/stories/empty.d.ts +1 -2
  148. package/build-types/dataviews/stories/empty.d.ts.map +1 -1
  149. package/build-types/dataviews/stories/fixtures.d.ts.map +1 -1
  150. package/build-types/dataviews/stories/free-composition.d.ts.map +1 -1
  151. package/build-types/dataviews/stories/index.story.d.ts +18 -10
  152. package/build-types/dataviews/stories/index.story.d.ts.map +1 -1
  153. package/build-types/dataviews/stories/infinite-scroll.d.ts.map +1 -1
  154. package/build-types/dataviews/stories/layout-activity.d.ts.map +1 -1
  155. package/build-types/dataviews/stories/layout-custom.d.ts +3 -1
  156. package/build-types/dataviews/stories/layout-custom.d.ts.map +1 -1
  157. package/build-types/dataviews/stories/layout-grid.d.ts.map +1 -1
  158. package/build-types/dataviews/stories/layout-list.d.ts.map +1 -1
  159. package/build-types/dataviews/stories/layout-table.d.ts.map +1 -1
  160. package/build-types/dataviews/stories/with-card.d.ts +3 -1
  161. package/build-types/dataviews/stories/with-card.d.ts.map +1 -1
  162. package/build-types/dataviews-picker/index.d.ts +0 -1
  163. package/build-types/dataviews-picker/index.d.ts.map +1 -1
  164. package/build-types/dataviews-picker/stories/fixtures.d.ts.map +1 -1
  165. package/build-types/dataviews-picker/stories/index.story.d.ts.map +1 -1
  166. package/build-types/field-types/stories/index.story.d.ts.map +1 -1
  167. package/build-types/hooks/index.d.ts +3 -0
  168. package/build-types/hooks/index.d.ts.map +1 -1
  169. package/build-types/hooks/test/use-data.d.ts +2 -0
  170. package/build-types/hooks/test/use-data.d.ts.map +1 -0
  171. package/build-types/hooks/use-data.d.ts +41 -3
  172. package/build-types/hooks/use-data.d.ts.map +1 -1
  173. package/build-types/hooks/use-infinite-scroll.d.ts +21 -0
  174. package/build-types/hooks/use-infinite-scroll.d.ts.map +1 -0
  175. package/build-types/hooks/use-selected-items.d.ts +19 -0
  176. package/build-types/hooks/use-selected-items.d.ts.map +1 -0
  177. package/build-types/types/dataviews.d.ts +15 -1
  178. package/build-types/types/dataviews.d.ts.map +1 -1
  179. package/build-types/types/field-api.d.ts +15 -4
  180. package/build-types/types/field-api.d.ts.map +1 -1
  181. package/build-types/utils/filter-sort-and-paginate.d.ts.map +1 -1
  182. package/build-types/utils/get-footer-message.d.ts +3 -2
  183. package/build-types/utils/get-footer-message.d.ts.map +1 -1
  184. package/build-wp/index.js +3202 -2761
  185. package/package.json +19 -19
  186. package/src/components/dataform-controls/datetime.tsx +19 -11
  187. package/src/components/dataform-layouts/card/index.tsx +171 -146
  188. package/src/components/dataform-layouts/card/style.scss +8 -5
  189. package/src/components/dataviews-bulk-actions/index.tsx +28 -1
  190. package/src/components/dataviews-context/index.ts +2 -2
  191. package/src/components/dataviews-footer/index.tsx +1 -6
  192. package/src/components/dataviews-layout/index.tsx +41 -19
  193. package/src/components/dataviews-layout/style.scss +8 -0
  194. package/src/components/dataviews-layouts/grid/composite-grid.tsx +433 -278
  195. package/src/components/dataviews-layouts/grid/style.scss +22 -2
  196. package/src/components/dataviews-layouts/index.ts +3 -3
  197. package/src/components/dataviews-layouts/picker-grid/index.tsx +70 -17
  198. package/src/components/dataviews-layouts/picker-grid/style.scss +10 -0
  199. package/src/components/dataviews-layouts/picker-table/index.tsx +42 -22
  200. package/src/components/dataviews-layouts/table/index.tsx +10 -4
  201. package/src/components/dataviews-layouts/table/style.scss +13 -0
  202. package/src/components/dataviews-layouts/table/use-scroll-state.ts +79 -0
  203. package/src/components/dataviews-layouts/utils/density-picker.tsx +12 -2
  204. package/src/components/dataviews-layouts/utils/grid-config-options.tsx +14 -0
  205. package/src/components/dataviews-layouts/utils/grid-items.scss +9 -1
  206. package/src/components/dataviews-layouts/utils/use-infinite-scroll.ts +64 -0
  207. package/src/components/dataviews-picker-footer/index.tsx +21 -1
  208. package/src/components/dataviews-search/index.tsx +2 -1
  209. package/src/components/dataviews-selection-checkbox/index.tsx +4 -2
  210. package/src/components/dataviews-view-config/index.tsx +0 -2
  211. package/src/components/dataviews-view-config/infinite-scroll-toggle.tsx +0 -5
  212. package/src/dataviews/index.tsx +58 -45
  213. package/src/dataviews/stories/empty.tsx +1 -3
  214. package/src/dataviews/stories/fixtures.tsx +288 -0
  215. package/src/dataviews/stories/free-composition.tsx +44 -45
  216. package/src/dataviews/stories/index.story.tsx +31 -8
  217. package/src/dataviews/stories/infinite-scroll.tsx +7 -93
  218. package/src/dataviews/stories/layout-activity.tsx +1 -0
  219. package/src/dataviews/stories/layout-custom.tsx +7 -3
  220. package/src/dataviews/stories/layout-grid.tsx +1 -0
  221. package/src/dataviews/stories/layout-list.tsx +1 -0
  222. package/src/dataviews/stories/layout-table.tsx +1 -0
  223. package/src/dataviews/stories/style.css +0 -5
  224. package/src/dataviews/stories/with-card.tsx +35 -24
  225. package/src/dataviews/style.scss +5 -8
  226. package/src/dataviews/test/dataviews.tsx +54 -1
  227. package/src/dataviews-picker/index.tsx +41 -35
  228. package/src/dataviews-picker/stories/fixtures.tsx +270 -0
  229. package/src/dataviews-picker/stories/index.story.tsx +62 -129
  230. package/src/field-types/stories/index.story.tsx +12 -0
  231. package/src/hooks/index.ts +3 -0
  232. package/src/hooks/test/use-data.ts +791 -0
  233. package/src/hooks/use-data.ts +288 -21
  234. package/src/hooks/use-infinite-scroll.ts +304 -0
  235. package/src/hooks/use-selected-items.ts +72 -0
  236. package/src/style.scss +1 -0
  237. package/src/types/dataviews.ts +18 -1
  238. package/src/types/field-api.ts +16 -3
  239. package/src/utils/filter-sort-and-paginate.ts +13 -1
  240. package/src/utils/get-footer-message.ts +12 -9
  241. package/src/utils/test/filter-sort-and-paginate.js +78 -54
  242. package/build/components/dataviews-layouts/table/use-is-horizontal-scroll-end.cjs.map +0 -7
  243. package/build-module/components/dataviews-layouts/table/use-is-horizontal-scroll-end.mjs +0 -50
  244. package/build-module/components/dataviews-layouts/table/use-is-horizontal-scroll-end.mjs.map +0 -7
  245. package/build-types/components/dataviews-layouts/table/use-is-horizontal-scroll-end.d.ts +0 -19
  246. package/build-types/components/dataviews-layouts/table/use-is-horizontal-scroll-end.d.ts.map +0 -1
  247. package/src/components/dataviews-layouts/table/use-is-horizontal-scroll-end.ts +0 -82
@@ -11,7 +11,12 @@ import { Stack } from "@wordpress/ui";
11
11
  import { __, sprintf } from "@wordpress/i18n";
12
12
  import { useInstanceId } from "@wordpress/compose";
13
13
  import { isAppleOS } from "@wordpress/keycodes";
14
- import { useContext, forwardRef } from "@wordpress/element";
14
+ import {
15
+ useCallback,
16
+ useContext,
17
+ useRef,
18
+ forwardRef
19
+ } from "@wordpress/element";
15
20
  import { unlock } from "../../../lock-unlock.mjs";
16
21
  import ItemActions from "../../dataviews-item-actions/index.mjs";
17
22
  import DataViewsSelectionCheckbox from "../../dataviews-selection-checkbox/index.mjs";
@@ -22,6 +27,11 @@ import {
22
27
  } from "../../dataviews-bulk-actions/index.mjs";
23
28
  import { ItemClickWrapper } from "../utils/item-click-wrapper.mjs";
24
29
  import { useGridColumns } from "./preview-size-picker.mjs";
30
+ import { GridItems } from "../utils/grid-items.mjs";
31
+ import {
32
+ useIntersectionObserver,
33
+ usePlaceholdersNeeded
34
+ } from "../utils/use-infinite-scroll.mjs";
25
35
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
26
36
  var { Badge } = unlock(componentsPrivateApis);
27
37
  function chunk(array, size) {
@@ -31,206 +41,238 @@ function chunk(array, size) {
31
41
  }
32
42
  return chunks;
33
43
  }
34
- var GridItem = forwardRef(function GridItem2({
35
- view,
36
- selection,
37
- onChangeSelection,
38
- onClickItem,
39
- isItemClickable,
40
- renderItemLink,
41
- getItemId,
42
- item,
43
- actions,
44
- mediaField,
45
- titleField,
46
- descriptionField,
47
- regularFields,
48
- badgeFields,
49
- hasBulkActions,
50
- config,
51
- ...props
52
- }, ref) {
53
- const { showTitle = true, showMedia = true, showDescription = true } = view;
54
- const hasBulkAction = useHasAPossibleBulkAction(actions, item);
55
- const id = getItemId(item);
56
- const instanceId = useInstanceId(GridItem2);
57
- const isSelected = selection.includes(id);
58
- const mediaPlaceholder = /* @__PURE__ */ jsx("span", { className: "dataviews-view-grid__media-placeholder" });
59
- const rendersMediaField = showMedia && mediaField?.render;
60
- const renderedMediaField = rendersMediaField ? /* @__PURE__ */ jsx(
61
- mediaField.render,
62
- {
63
- item,
64
- field: mediaField,
65
- config
66
- }
67
- ) : mediaPlaceholder;
68
- const renderedTitleField = showTitle && titleField?.render ? /* @__PURE__ */ jsx(titleField.render, { item, field: titleField }) : null;
69
- let mediaA11yProps;
70
- let titleA11yProps;
71
- if (isItemClickable(item) && onClickItem) {
72
- if (renderedTitleField) {
73
- mediaA11yProps = {
74
- "aria-labelledby": `dataviews-view-grid__title-field-${instanceId}`
75
- };
76
- titleA11yProps = {
77
- id: `dataviews-view-grid__title-field-${instanceId}`
78
- };
79
- } else {
80
- mediaA11yProps = {
81
- "aria-label": __("Navigate to item")
82
- };
83
- }
84
- }
85
- return /* @__PURE__ */ jsxs(
86
- Stack,
87
- {
88
- direction: "column",
89
- ...props,
90
- ref,
91
- className: clsx(
92
- props.className,
93
- "dataviews-view-grid__row__gridcell",
94
- "dataviews-view-grid__card",
95
- {
96
- "is-selected": hasBulkAction && isSelected
97
- }
98
- ),
99
- onClickCapture: (event) => {
100
- props.onClickCapture?.(event);
101
- if (isAppleOS() ? event.metaKey : event.ctrlKey) {
102
- event.stopPropagation();
103
- event.preventDefault();
104
- if (!hasBulkAction) {
105
- return;
106
- }
107
- onChangeSelection(
108
- selection.includes(id) ? selection.filter((itemId) => id !== itemId) : [...selection, id]
109
- );
44
+ var GridItem = forwardRef(
45
+ function GridItem2({
46
+ view,
47
+ selection,
48
+ onChangeSelection,
49
+ onClickItem,
50
+ isItemClickable,
51
+ renderItemLink,
52
+ getItemId,
53
+ item,
54
+ actions,
55
+ mediaField,
56
+ titleField,
57
+ descriptionField,
58
+ regularFields,
59
+ badgeFields,
60
+ hasBulkActions,
61
+ config,
62
+ posinset,
63
+ setsize,
64
+ ...props
65
+ }, forwardedRef) {
66
+ const {
67
+ showTitle = true,
68
+ showMedia = true,
69
+ showDescription = true
70
+ } = view;
71
+ const hasBulkAction = useHasAPossibleBulkAction(actions, item);
72
+ const id = getItemId(item);
73
+ const elementRef = useRef(null);
74
+ const setRefs = useCallback(
75
+ (node) => {
76
+ elementRef.current = node;
77
+ if (typeof forwardedRef === "function") {
78
+ forwardedRef(node);
79
+ } else if (forwardedRef) {
80
+ forwardedRef.current = node;
110
81
  }
111
82
  },
112
- children: [
113
- /* @__PURE__ */ jsx(
114
- ItemClickWrapper,
115
- {
116
- item,
117
- isItemClickable,
118
- onClickItem,
119
- renderItemLink,
120
- className: clsx("dataviews-view-grid__media", {
121
- "dataviews-view-grid__media--placeholder": !rendersMediaField
122
- }),
123
- ...mediaA11yProps,
124
- children: renderedMediaField
125
- }
126
- ),
127
- hasBulkActions && /* @__PURE__ */ jsx(
128
- DataViewsSelectionCheckbox,
83
+ [forwardedRef]
84
+ );
85
+ useIntersectionObserver(elementRef, posinset);
86
+ const instanceId = useInstanceId(GridItem2);
87
+ const isSelected = selection.includes(id);
88
+ const mediaPlaceholder = /* @__PURE__ */ jsx("span", { className: "dataviews-view-grid__media-placeholder" });
89
+ const rendersMediaField = showMedia && mediaField?.render;
90
+ const renderedMediaField = rendersMediaField ? /* @__PURE__ */ jsx(
91
+ mediaField.render,
92
+ {
93
+ item,
94
+ field: mediaField,
95
+ config
96
+ }
97
+ ) : mediaPlaceholder;
98
+ const renderedTitleField = showTitle && titleField?.render ? /* @__PURE__ */ jsx(titleField.render, { item, field: titleField }) : null;
99
+ let mediaA11yProps;
100
+ let titleA11yProps;
101
+ if (isItemClickable(item) && onClickItem) {
102
+ if (renderedTitleField) {
103
+ mediaA11yProps = {
104
+ "aria-labelledby": `dataviews-view-grid__title-field-${instanceId}`
105
+ };
106
+ titleA11yProps = {
107
+ id: `dataviews-view-grid__title-field-${instanceId}`
108
+ };
109
+ } else {
110
+ mediaA11yProps = {
111
+ "aria-label": __("Navigate to item")
112
+ };
113
+ }
114
+ }
115
+ return /* @__PURE__ */ jsxs(
116
+ Stack,
117
+ {
118
+ direction: "column",
119
+ ...props,
120
+ ref: setRefs,
121
+ "aria-setsize": setsize,
122
+ "aria-posinset": posinset,
123
+ className: clsx(
124
+ props.className,
125
+ "dataviews-view-grid__row__gridcell",
126
+ "dataviews-view-grid__card",
129
127
  {
130
- item,
131
- selection,
132
- onChangeSelection,
133
- getItemId,
134
- titleField,
135
- disabled: !hasBulkAction
128
+ "is-selected": hasBulkAction && isSelected
136
129
  }
137
130
  ),
138
- !!actions?.length && /* @__PURE__ */ jsx("div", { className: "dataviews-view-grid__media-actions", children: /* @__PURE__ */ jsx(ItemActions, { item, actions, isCompact: true }) }),
139
- showTitle && /* @__PURE__ */ jsx("div", { className: "dataviews-view-grid__title", children: /* @__PURE__ */ jsx(
140
- ItemClickWrapper,
141
- {
142
- item,
143
- isItemClickable,
144
- onClickItem,
145
- renderItemLink,
146
- className: "dataviews-view-grid__title-field dataviews-title-field",
147
- ...titleA11yProps,
148
- title: titleField?.getValueFormatted({
149
- item,
150
- field: titleField
151
- }) || void 0,
152
- children: renderedTitleField
131
+ onClickCapture: (event) => {
132
+ props.onClickCapture?.(event);
133
+ if (isAppleOS() ? event.metaKey : event.ctrlKey) {
134
+ event.stopPropagation();
135
+ event.preventDefault();
136
+ if (!hasBulkAction) {
137
+ return;
138
+ }
139
+ onChangeSelection(
140
+ isSelected ? selection.filter(
141
+ (itemId) => id !== itemId
142
+ ) : [...selection, id]
143
+ );
153
144
  }
154
- ) }),
155
- /* @__PURE__ */ jsxs(Stack, { direction: "column", gap: "xs", children: [
156
- showDescription && descriptionField?.render && /* @__PURE__ */ jsx(
157
- descriptionField.render,
145
+ },
146
+ children: [
147
+ /* @__PURE__ */ jsx(
148
+ ItemClickWrapper,
158
149
  {
159
150
  item,
160
- field: descriptionField
151
+ isItemClickable,
152
+ onClickItem,
153
+ renderItemLink,
154
+ className: clsx("dataviews-view-grid__media", {
155
+ "dataviews-view-grid__media--placeholder": !rendersMediaField
156
+ }),
157
+ ...mediaA11yProps,
158
+ children: renderedMediaField
161
159
  }
162
160
  ),
163
- !!badgeFields?.length && /* @__PURE__ */ jsx(
164
- Stack,
161
+ hasBulkActions && /* @__PURE__ */ jsx(
162
+ DataViewsSelectionCheckbox,
165
163
  {
166
- direction: "row",
167
- className: "dataviews-view-grid__badge-fields",
168
- gap: "sm",
169
- wrap: "wrap",
170
- align: "top",
171
- justify: "flex-start",
172
- children: badgeFields.map((field) => {
173
- return /* @__PURE__ */ jsx(
174
- Badge,
175
- {
176
- className: "dataviews-view-grid__field-value",
177
- children: /* @__PURE__ */ jsx(
178
- field.render,
179
- {
180
- item,
181
- field
182
- }
183
- )
184
- },
185
- field.id
186
- );
187
- })
164
+ item,
165
+ selection,
166
+ onChangeSelection,
167
+ getItemId,
168
+ titleField,
169
+ disabled: !hasBulkAction
188
170
  }
189
171
  ),
190
- !!regularFields?.length && /* @__PURE__ */ jsx(
191
- Stack,
172
+ !!actions?.length && /* @__PURE__ */ jsx("div", { className: "dataviews-view-grid__media-actions", children: /* @__PURE__ */ jsx(
173
+ ItemActions,
192
174
  {
193
- direction: "column",
194
- className: "dataviews-view-grid__fields",
195
- gap: "xs",
196
- children: regularFields.map((field) => {
197
- return /* @__PURE__ */ jsx(
198
- Flex,
199
- {
200
- className: "dataviews-view-grid__field",
201
- gap: 1,
202
- justify: "flex-start",
203
- expanded: true,
204
- style: { height: "auto" },
205
- direction: "row",
206
- children: /* @__PURE__ */ jsxs(Fragment, { children: [
207
- /* @__PURE__ */ jsx(Tooltip, { text: field.label, children: /* @__PURE__ */ jsx(FlexItem, { className: "dataviews-view-grid__field-name", children: field.header }) }),
208
- /* @__PURE__ */ jsx(
209
- FlexItem,
175
+ item,
176
+ actions,
177
+ isCompact: true
178
+ }
179
+ ) }),
180
+ showTitle && /* @__PURE__ */ jsx("div", { className: "dataviews-view-grid__title", children: /* @__PURE__ */ jsx(
181
+ ItemClickWrapper,
182
+ {
183
+ item,
184
+ isItemClickable,
185
+ onClickItem,
186
+ renderItemLink,
187
+ className: "dataviews-view-grid__title-field dataviews-title-field",
188
+ ...titleA11yProps,
189
+ title: titleField?.getValueFormatted({
190
+ item,
191
+ field: titleField
192
+ }) || void 0,
193
+ children: renderedTitleField
194
+ }
195
+ ) }),
196
+ /* @__PURE__ */ jsxs(Stack, { direction: "column", gap: "xs", children: [
197
+ showDescription && descriptionField?.render && /* @__PURE__ */ jsx(
198
+ descriptionField.render,
199
+ {
200
+ item,
201
+ field: descriptionField
202
+ }
203
+ ),
204
+ !!badgeFields?.length && /* @__PURE__ */ jsx(
205
+ Stack,
206
+ {
207
+ direction: "row",
208
+ className: "dataviews-view-grid__badge-fields",
209
+ gap: "sm",
210
+ wrap: "wrap",
211
+ align: "top",
212
+ justify: "flex-start",
213
+ children: badgeFields.map((field) => {
214
+ return /* @__PURE__ */ jsx(
215
+ Badge,
216
+ {
217
+ className: "dataviews-view-grid__field-value",
218
+ children: /* @__PURE__ */ jsx(
219
+ field.render,
210
220
  {
211
- className: "dataviews-view-grid__field-value",
212
- style: { maxHeight: "none" },
213
- children: /* @__PURE__ */ jsx(
214
- field.render,
215
- {
216
- item,
217
- field
218
- }
219
- )
221
+ item,
222
+ field
220
223
  }
221
224
  )
222
- ] })
223
- },
224
- field.id
225
- );
226
- })
227
- }
228
- )
229
- ] })
230
- ]
231
- }
232
- );
233
- });
225
+ },
226
+ field.id
227
+ );
228
+ })
229
+ }
230
+ ),
231
+ !!regularFields?.length && /* @__PURE__ */ jsx(
232
+ Stack,
233
+ {
234
+ direction: "column",
235
+ className: "dataviews-view-grid__fields",
236
+ gap: "xs",
237
+ children: regularFields.map((field) => {
238
+ return /* @__PURE__ */ jsx(
239
+ Flex,
240
+ {
241
+ className: "dataviews-view-grid__field",
242
+ gap: 1,
243
+ justify: "flex-start",
244
+ expanded: true,
245
+ style: { height: "auto" },
246
+ direction: "row",
247
+ children: /* @__PURE__ */ jsxs(Fragment, { children: [
248
+ /* @__PURE__ */ jsx(Tooltip, { text: field.label, children: /* @__PURE__ */ jsx(FlexItem, { className: "dataviews-view-grid__field-name", children: field.header }) }),
249
+ /* @__PURE__ */ jsx(
250
+ FlexItem,
251
+ {
252
+ className: "dataviews-view-grid__field-value",
253
+ style: { maxHeight: "none" },
254
+ children: /* @__PURE__ */ jsx(
255
+ field.render,
256
+ {
257
+ item,
258
+ field
259
+ }
260
+ )
261
+ }
262
+ )
263
+ ] })
264
+ },
265
+ field.id
266
+ );
267
+ })
268
+ }
269
+ )
270
+ ] })
271
+ ]
272
+ }
273
+ );
274
+ }
275
+ );
234
276
  function CompositeGrid({
235
277
  data,
236
278
  isInfiniteScroll,
@@ -274,76 +316,175 @@ function CompositeGrid({
274
316
  );
275
317
  const size = "900px";
276
318
  const totalRows = Math.ceil(data.length / gridColumns);
277
- return /* @__PURE__ */ jsx(
278
- Composite,
279
- {
280
- role: isInfiniteScroll ? "feed" : "grid",
281
- className: clsx("dataviews-view-grid", className),
282
- focusWrap: true,
283
- "aria-busy": isLoading,
284
- "aria-rowcount": isInfiniteScroll ? void 0 : totalRows,
285
- ref: resizeObserverRef,
286
- inert,
287
- children: chunk(data, gridColumns).map((row, i) => /* @__PURE__ */ jsx(
288
- Composite.Row,
319
+ const placeholdersNeeded = usePlaceholdersNeeded(
320
+ data,
321
+ isInfiniteScroll,
322
+ gridColumns
323
+ );
324
+ return /* @__PURE__ */ jsxs(Fragment, {
325
+ // Render infinite scroll layout (no rows, feed semantics)
326
+ children: [
327
+ isInfiniteScroll && /* @__PURE__ */ jsxs(
328
+ Composite,
289
329
  {
290
330
  render: /* @__PURE__ */ jsx(
291
- "div",
331
+ GridItems,
292
332
  {
293
- role: "row",
294
- "aria-rowindex": i + 1,
295
- "aria-label": sprintf(
296
- /* translators: %d: The row number in the grid */
297
- __("Row %d"),
298
- i + 1
333
+ className: clsx(
334
+ "dataviews-view-grid-infinite-scroll",
335
+ className,
336
+ {
337
+ [`has-${view.layout?.density}-density`]: view.layout?.density && [
338
+ "compact",
339
+ "comfortable"
340
+ ].includes(view.layout.density)
341
+ }
299
342
  ),
300
- className: "dataviews-view-grid__row",
301
- style: {
302
- gridTemplateColumns: `repeat( ${gridColumns}, minmax(0, 1fr) )`
303
- }
343
+ previewSize: view.layout?.previewSize,
344
+ "aria-busy": isLoading,
345
+ ref: resizeObserverRef
304
346
  }
305
347
  ),
306
- children: row.map((item, indexInRow) => {
307
- const index = i * gridColumns + indexInRow;
308
- return /* @__PURE__ */ jsx(
309
- Composite.Item,
310
- {
311
- render: (props) => /* @__PURE__ */ jsx(
312
- GridItem,
313
- {
314
- ...props,
315
- role: isInfiniteScroll ? "article" : "gridcell",
316
- "aria-setsize": isInfiniteScroll ? paginationInfo.totalItems : void 0,
317
- "aria-posinset": isInfiniteScroll ? index + 1 : void 0,
318
- view,
319
- selection,
320
- onChangeSelection,
321
- onClickItem,
322
- isItemClickable,
323
- renderItemLink,
324
- getItemId,
325
- item,
326
- actions,
327
- mediaField,
328
- titleField,
329
- descriptionField,
330
- regularFields,
331
- badgeFields,
332
- hasBulkActions,
333
- config: {
334
- sizes: size
348
+ role: "feed",
349
+ focusWrap: true,
350
+ inert,
351
+ children: [
352
+ Array.from({ length: placeholdersNeeded }).map(
353
+ (_, index) => /* @__PURE__ */ jsx(
354
+ Composite.Item,
355
+ {
356
+ render: (props) => /* @__PURE__ */ jsx(
357
+ Stack,
358
+ {
359
+ ...props,
360
+ direction: "column",
361
+ role: "article",
362
+ className: "dataviews-view-grid__row__gridcell dataviews-view-grid__card dataviews-view-grid__placeholder"
363
+ }
364
+ ),
365
+ "aria-hidden": true,
366
+ tabIndex: -1
367
+ },
368
+ `placeholder-${index}`
369
+ )
370
+ ),
371
+ data.map((item) => {
372
+ const itemId = getItemId(item);
373
+ const stablePosition = item.position;
374
+ return /* @__PURE__ */ jsx(
375
+ Composite.Item,
376
+ {
377
+ render: (props) => /* @__PURE__ */ jsx(
378
+ GridItem,
379
+ {
380
+ ...props,
381
+ id: itemId,
382
+ role: "article",
383
+ view,
384
+ selection,
385
+ onChangeSelection,
386
+ onClickItem,
387
+ isItemClickable,
388
+ renderItemLink,
389
+ getItemId,
390
+ item,
391
+ actions,
392
+ mediaField,
393
+ titleField,
394
+ descriptionField,
395
+ regularFields,
396
+ badgeFields,
397
+ hasBulkActions,
398
+ posinset: stablePosition,
399
+ setsize: paginationInfo.totalItems,
400
+ config: {
401
+ sizes: size
402
+ }
335
403
  }
404
+ )
405
+ },
406
+ itemId
407
+ );
408
+ })
409
+ ]
410
+ }
411
+ ),
412
+ // Render standard grid layout (with rows, grid semantics)
413
+ !isInfiniteScroll && /* @__PURE__ */ jsx(
414
+ Composite,
415
+ {
416
+ role: "grid",
417
+ className: clsx("dataviews-view-grid", className, {
418
+ [`has-${view.layout?.density}-density`]: view.layout?.density && ["compact", "comfortable"].includes(
419
+ view.layout.density
420
+ )
421
+ }),
422
+ focusWrap: true,
423
+ "aria-busy": isLoading,
424
+ "aria-rowcount": totalRows,
425
+ ref: resizeObserverRef,
426
+ inert,
427
+ children: chunk(data, gridColumns).map((row, i) => /* @__PURE__ */ jsx(
428
+ Composite.Row,
429
+ {
430
+ render: /* @__PURE__ */ jsx(
431
+ "div",
432
+ {
433
+ role: "row",
434
+ "aria-rowindex": i + 1,
435
+ "aria-label": sprintf(
436
+ /* translators: %d: The row number in the grid */
437
+ __("Row %d"),
438
+ i + 1
439
+ ),
440
+ className: "dataviews-view-grid__row",
441
+ style: {
442
+ gridTemplateColumns: `repeat( ${gridColumns}, minmax(0, 1fr) )`
336
443
  }
337
- )
338
- },
339
- getItemId(item)
340
- );
341
- })
342
- },
343
- i
344
- ))
345
- }
346
- );
444
+ }
445
+ ),
446
+ children: row.map((item) => {
447
+ const itemId = getItemId(item);
448
+ return /* @__PURE__ */ jsx(
449
+ Composite.Item,
450
+ {
451
+ render: (props) => /* @__PURE__ */ jsx(
452
+ GridItem,
453
+ {
454
+ ...props,
455
+ id: itemId,
456
+ role: "gridcell",
457
+ view,
458
+ selection,
459
+ onChangeSelection,
460
+ onClickItem,
461
+ isItemClickable,
462
+ renderItemLink,
463
+ getItemId,
464
+ item,
465
+ actions,
466
+ mediaField,
467
+ titleField,
468
+ descriptionField,
469
+ regularFields,
470
+ badgeFields,
471
+ hasBulkActions,
472
+ config: {
473
+ sizes: size
474
+ }
475
+ }
476
+ )
477
+ },
478
+ itemId
479
+ );
480
+ })
481
+ },
482
+ i
483
+ ))
484
+ }
485
+ )
486
+ ]
487
+ });
347
488
  }
348
489
  export {
349
490
  CompositeGrid as default