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