@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
package/src/style.scss CHANGED
@@ -1,5 +1,6 @@
1
1
  @use "./dataviews/style.scss" as *;
2
2
  @use "./components/dataviews-bulk-actions/style.scss" as *;
3
+ @use "./components/dataviews-layout/style.scss" as *;
3
4
  @use "./components/dataviews-filters/style.scss" as *;
4
5
  @use "./components/dataviews-footer/style.scss" as *;
5
6
  @use "./components/dataviews-pagination/style.scss" as *;
@@ -133,7 +133,8 @@ interface ViewBase {
133
133
  page?: number;
134
134
 
135
135
  /**
136
- * The number of items per page
136
+ * The number of items per page.
137
+ * Also used as the batch size when infinite scroll is enabled.
137
138
  */
138
139
  perPage?: number;
139
140
 
@@ -203,6 +204,12 @@ interface ViewBase {
203
204
  * Whether infinite scroll is enabled.
204
205
  */
205
206
  infiniteScrollEnabled?: boolean;
207
+
208
+ /**
209
+ * The start position for infinite scroll (1-indexed).
210
+ * Used when infiniteScrollEnabled is true.
211
+ */
212
+ startPosition?: number;
206
213
  }
207
214
 
208
215
  export interface ColumnStyle {
@@ -285,6 +292,11 @@ export interface ViewGrid extends ViewBase {
285
292
  * The preview size of the grid.
286
293
  */
287
294
  previewSize?: number;
295
+
296
+ /**
297
+ * The density of the grid layout.
298
+ */
299
+ density?: Density;
288
300
  };
289
301
  }
290
302
 
@@ -301,6 +313,11 @@ export interface ViewPickerGrid extends ViewBase {
301
313
  * The preview size of the grid.
302
314
  */
303
315
  previewSize?: number;
316
+
317
+ /**
318
+ * The density of the grid layout.
319
+ */
320
+ density?: Density;
304
321
  };
305
322
  }
306
323
 
@@ -157,10 +157,21 @@ export type EditConfigText = {
157
157
  };
158
158
 
159
159
  /**
160
- * Edit configuration for other control types (excluding 'text' and 'textarea').
160
+ * Edit configuration for datetime controls.
161
+ */
162
+ export type EditConfigDatetime = {
163
+ control: 'datetime';
164
+ /**
165
+ * Whether to render a compact version without the calendar widget.
166
+ */
167
+ compact?: boolean;
168
+ };
169
+
170
+ /**
171
+ * Edit configuration for other control types (excluding 'text', 'textarea', and 'datetime').
161
172
  */
162
173
  export type EditConfigGeneric = {
163
- control: Exclude< FieldTypeName, 'text' | 'textarea' >;
174
+ control: Exclude< FieldTypeName, 'text' | 'textarea' | 'datetime' >;
164
175
  };
165
176
 
166
177
  /**
@@ -170,6 +181,7 @@ export type EditConfigGeneric = {
170
181
  export type EditConfig =
171
182
  | EditConfigTextarea
172
183
  | EditConfigText
184
+ | EditConfigDatetime
173
185
  | EditConfigGeneric;
174
186
 
175
187
  /**
@@ -200,7 +212,7 @@ export type Field< Item > = {
200
212
  /**
201
213
  * A description of the field.
202
214
  */
203
- description?: string;
215
+ description?: string | ReactElement;
204
216
 
205
217
  /**
206
218
  * Placeholder for the field.
@@ -449,6 +461,7 @@ export type DataFormControlProps< Item > = {
449
461
  prefix?: React.ComponentType;
450
462
  suffix?: React.ComponentType;
451
463
  rows?: number;
464
+ compact?: boolean;
452
465
  };
453
466
  };
454
467
 
@@ -135,7 +135,19 @@ export default function filterSortAndPaginate< Item >(
135
135
  // Handle pagination.
136
136
  let totalItems = filteredData.length;
137
137
  let totalPages = 1;
138
- if ( view.page !== undefined && view.perPage !== undefined ) {
138
+
139
+ // Use position-based pagination for infinite scroll
140
+ if (
141
+ view.infiniteScrollEnabled &&
142
+ view.startPosition !== undefined &&
143
+ view.perPage !== undefined
144
+ ) {
145
+ // Convert 1-indexed positions to 0-indexed array indices
146
+ const start = view.startPosition - 1;
147
+ const end = Math.min( start + view.perPage, totalItems );
148
+ filteredData = filteredData?.slice( start, end );
149
+ } else if ( view.page !== undefined && view.perPage !== undefined ) {
150
+ // Use traditional page-based pagination
139
151
  const start = ( view.page - 1 ) * view.perPage;
140
152
  totalItems = filteredData?.length || 0;
141
153
  totalPages = Math.ceil( totalItems / view.perPage );
@@ -6,15 +6,17 @@ import { _n, sprintf } from '@wordpress/i18n';
6
6
  /**
7
7
  * Get the footer message for the DataViews footer.
8
8
  *
9
- * @param selectionCount - The number of items selected.
9
+ * @param selectionCount - The number of selected items.
10
10
  * @param itemsCount - The number of items in the current page.
11
11
  * @param totalItems - The total number of items.
12
+ * @param onlyTotalCount - Whether to only show the total count (used with infinite scroll).
12
13
  * @return - The footer message.
13
14
  */
14
15
  export default function getFooterMessage(
15
16
  selectionCount: number,
16
17
  itemsCount: number,
17
- totalItems: number
18
+ totalItems: number,
19
+ onlyTotalCount = false
18
20
  ): string {
19
21
  if ( selectionCount > 0 ) {
20
22
  return sprintf(
@@ -24,18 +26,19 @@ export default function getFooterMessage(
24
26
  );
25
27
  }
26
28
 
27
- if ( totalItems > itemsCount ) {
29
+ // No selection - show item count
30
+ if ( onlyTotalCount || totalItems <= itemsCount ) {
28
31
  return sprintf(
29
- /* translators: %1$d: number of items. %2$d: total number of items. */
30
- _n( '%1$d of %2$d Item', '%1$d of %2$d Items', totalItems ),
31
- itemsCount,
32
+ /* translators: %d: number of items. */
33
+ _n( '%d Item', '%d Items', totalItems ),
32
34
  totalItems
33
35
  );
34
36
  }
35
37
 
36
38
  return sprintf(
37
- /* translators: %d: number of items. */
38
- _n( '%d Item', '%d Items', itemsCount ),
39
- itemsCount
39
+ /* translators: %1$d: number of items. %2$d: total number of items. */
40
+ _n( '%1$d of %2$d Item', '%1$d of %2$d Items', totalItems ),
41
+ itemsCount,
42
+ totalItems
40
43
  );
41
44
  }
@@ -41,7 +41,7 @@ describe( 'filters', () => {
41
41
  },
42
42
  fields
43
43
  );
44
- expect( result ).toHaveLength( 4 );
44
+ expect( result ).toHaveLength( 6 );
45
45
  expect(
46
46
  result.find( ( item ) => item.name.title === 'Neptune' )
47
47
  ).toBeDefined();
@@ -92,7 +92,7 @@ describe( 'filters', () => {
92
92
  );
93
93
 
94
94
  // Should find items with "Moon" in categories
95
- expect( result ).toHaveLength( 10 );
95
+ expect( result ).toHaveLength( 25 );
96
96
  expect( result.map( ( r ) => r.name.title ).sort() ).toContain(
97
97
  'Europa'
98
98
  );
@@ -119,7 +119,7 @@ describe( 'filters', () => {
119
119
  );
120
120
 
121
121
  // Should find items with "Planet" in categories (case-insensitive)
122
- expect( result ).toHaveLength( 9 );
122
+ expect( result ).toHaveLength( 13 );
123
123
  expect( result.map( ( r ) => r.name.title ) ).toContain( 'Neptune' );
124
124
  expect( result.map( ( r ) => r.name.title ) ).toContain( 'Mercury' );
125
125
  expect( result.map( ( r ) => r.name.title ) ).toContain( 'Earth' );
@@ -158,7 +158,7 @@ describe( 'filters', () => {
158
158
  },
159
159
  fields
160
160
  );
161
- expect( result ).toHaveLength( 17 );
161
+ expect( result ).toHaveLength( 35 );
162
162
  expect( result[ 0 ].name.title ).toBe( 'Moon' );
163
163
  expect( result[ 1 ].name.title ).toBe( 'Io' );
164
164
  expect( result[ 2 ].name.title ).toBe( 'Europa' );
@@ -213,7 +213,7 @@ describe( 'filters', () => {
213
213
  },
214
214
  fields
215
215
  );
216
- expect( result ).toHaveLength( 11 );
216
+ expect( result ).toHaveLength( 29 );
217
217
  expect( result[ 0 ].name.title ).toBe( 'Moon' );
218
218
  expect( result[ 1 ].name.title ).toBe( 'Io' );
219
219
  expect( result[ 2 ].name.title ).toBe( 'Europa' );
@@ -262,7 +262,7 @@ describe( 'filters', () => {
262
262
  },
263
263
  fields
264
264
  );
265
- expect( result ).toHaveLength( 15 );
265
+ expect( result ).toHaveLength( 33 );
266
266
  expect( result[ 0 ].name.title ).toBe( 'Moon' );
267
267
  expect( result[ 1 ].name.title ).toBe( 'Io' );
268
268
  expect( result[ 2 ].name.title ).toBe( 'Europa' );
@@ -322,7 +322,7 @@ describe( 'filters', () => {
322
322
  fields
323
323
  );
324
324
  expect( console ).toHaveWarned();
325
- expect( result ).toHaveLength( 10 );
325
+ expect( result ).toHaveLength( 28 );
326
326
  expect( result[ 0 ].name.title ).toBe( 'Moon' );
327
327
  expect( result[ 1 ].name.title ).toBe( 'Io' );
328
328
  expect( result[ 2 ].name.title ).toBe( 'Europa' );
@@ -349,7 +349,7 @@ describe( 'filters', () => {
349
349
  },
350
350
  fields
351
351
  );
352
- expect( result ).toHaveLength( 19 );
352
+ expect( result ).toHaveLength( 37 );
353
353
  expect( result[ 0 ].name.title ).toBe( 'Moon' );
354
354
  expect( result[ 1 ].name.title ).toBe( 'Io' );
355
355
  expect( result[ 2 ].name.title ).toBe( 'Europa' );
@@ -476,7 +476,7 @@ describe( 'filters', () => {
476
476
  fields
477
477
  );
478
478
  // Should return items that don't contain "Solar system" in description
479
- expect( result ).toHaveLength( 12 );
479
+ expect( result ).toHaveLength( 30 );
480
480
  expect(
481
481
  result.filter( ( r ) =>
482
482
  r.name.description.includes( 'Solar system' )
@@ -484,16 +484,34 @@ describe( 'filters', () => {
484
484
  ).toHaveLength( 0 );
485
485
  expect( result.map( ( r ) => r.name.title ).sort() ).toEqual( [
486
486
  'Amalthea',
487
+ 'Ariel',
487
488
  'Callisto',
489
+ 'Ceres',
490
+ 'Charon',
491
+ 'Deimos',
492
+ 'Dione',
493
+ 'Enceladus',
488
494
  'Europa',
489
495
  'Ganymede',
496
+ 'Haumea',
490
497
  'Himalia',
498
+ 'Iapetus',
491
499
  'Io',
500
+ 'Makemake',
501
+ 'Mimas',
502
+ 'Miranda',
492
503
  'Moon',
493
504
  'Nereid',
505
+ 'Oberon',
506
+ 'Phobos',
494
507
  'Proteus',
508
+ 'Rhea',
509
+ 'Tethys',
495
510
  'Thessalonikopolymnianebuchodonossarinacharybdis',
511
+ 'Titan',
512
+ 'Titania',
496
513
  'Triton',
514
+ 'Umbriel',
497
515
  'Venus',
498
516
  ] );
499
517
  } );
@@ -662,7 +680,7 @@ describe( 'filters', () => {
662
680
  },
663
681
  fields
664
682
  );
665
- expect( result.length ).toBe( 17 );
683
+ expect( result.length ).toBe( 35 );
666
684
  expect( result.map( ( r ) => r.name.title ) ).not.toContain(
667
685
  'Neptune'
668
686
  );
@@ -911,33 +929,37 @@ describe( 'sorting', () => {
911
929
  fields
912
930
  );
913
931
 
914
- expect( result ).toHaveLength( 19 );
932
+ expect( result ).toHaveLength( 37 );
915
933
 
916
- expect( result[ 0 ].type ).toBe( 'Gas giant' );
917
- expect( result[ 0 ].name.title ).toBe( 'Saturn' );
918
- expect( result[ 1 ].type ).toBe( 'Gas giant' );
919
- expect( result[ 1 ].name.title ).toBe( 'Jupiter' );
934
+ expect( result[ 0 ].type ).toBe( 'Dwarf planet' );
935
+ expect( result[ 1 ].type ).toBe( 'Dwarf planet' );
936
+ expect( result[ 2 ].type ).toBe( 'Dwarf planet' );
920
937
 
921
- expect( result[ 2 ].type ).toBe( 'Ice giant' );
922
- expect( result[ 2 ].name.title ).toBe( 'Uranus' );
923
- expect( result[ 3 ].type ).toBe( 'Ice giant' );
924
- expect( result[ 3 ].name.title ).toBe( 'Neptune' );
938
+ expect( result[ 3 ].type ).toBe( 'Gas giant' );
939
+ expect( result[ 3 ].name.title ).toBe( 'Saturn' );
940
+ expect( result[ 4 ].type ).toBe( 'Gas giant' );
941
+ expect( result[ 4 ].name.title ).toBe( 'Jupiter' );
942
+
943
+ expect( result[ 5 ].type ).toBe( 'Ice giant' );
944
+ expect( result[ 5 ].name.title ).toBe( 'Uranus' );
945
+ expect( result[ 6 ].type ).toBe( 'Ice giant' );
946
+ expect( result[ 6 ].name.title ).toBe( 'Neptune' );
925
947
 
926
948
  // All satellites should be grouped together
927
949
  const satelliteItems = result.filter(
928
950
  ( item ) => item.type === 'Satellite'
929
951
  );
930
- expect( satelliteItems ).toHaveLength( 10 );
931
- expect( satelliteItems[ 0 ].name.title ).toBe( 'Triton' );
932
- expect( satelliteItems[ 1 ].name.title ).toBe( 'Proteus' );
933
- expect( satelliteItems[ 2 ].name.title ).toBe( 'Nereid' );
934
- expect( satelliteItems[ 3 ].name.title ).toBe( 'Moon' );
935
- expect( satelliteItems[ 4 ].name.title ).toBe( 'Io' );
936
- expect( satelliteItems[ 5 ].name.title ).toBe( 'Himalia' );
937
- expect( satelliteItems[ 6 ].name.title ).toBe( 'Ganymede' );
938
- expect( satelliteItems[ 7 ].name.title ).toBe( 'Europa' );
939
- expect( satelliteItems[ 8 ].name.title ).toBe( 'Callisto' );
940
- expect( satelliteItems[ 9 ].name.title ).toBe( 'Amalthea' );
952
+ expect( satelliteItems ).toHaveLength( 25 );
953
+ expect( satelliteItems[ 0 ].name.title ).toBe( 'Umbriel' );
954
+ expect( satelliteItems[ 1 ].name.title ).toBe( 'Triton' );
955
+ expect( satelliteItems[ 2 ].name.title ).toBe( 'Titania' );
956
+ expect( satelliteItems[ 3 ].name.title ).toBe( 'Titan' );
957
+ expect( satelliteItems[ 4 ].name.title ).toBe( 'Tethys' );
958
+ expect( satelliteItems[ 5 ].name.title ).toBe( 'Rhea' );
959
+ expect( satelliteItems[ 6 ].name.title ).toBe( 'Proteus' );
960
+ expect( satelliteItems[ 7 ].name.title ).toBe( 'Phobos' );
961
+ expect( satelliteItems[ 8 ].name.title ).toBe( 'Oberon' );
962
+ expect( satelliteItems[ 9 ].name.title ).toBe( 'Nereid' );
941
963
 
942
964
  // All terrestrial planets should be grouped together
943
965
  const terrestrialItems = result.filter(
@@ -960,7 +982,7 @@ describe( 'sorting', () => {
960
982
  fields
961
983
  );
962
984
 
963
- expect( result ).toHaveLength( 19 );
985
+ expect( result ).toHaveLength( 37 );
964
986
 
965
987
  // Terrestrial group should come first (reverse alphabetical: T)
966
988
  expect( result[ 0 ].type ).toBe( 'Terrestrial' );
@@ -974,25 +996,25 @@ describe( 'sorting', () => {
974
996
 
975
997
  // Satellite group should come second (reverse alphabetical: S)
976
998
  expect( result[ 4 ].type ).toBe( 'Satellite' );
977
- expect( result[ 4 ].name.title ).toBe( 'Triton' );
999
+ expect( result[ 4 ].name.title ).toBe( 'Umbriel' );
978
1000
  expect( result[ 5 ].type ).toBe( 'Satellite' );
979
- expect( result[ 5 ].name.title ).toBe( 'Proteus' );
1001
+ expect( result[ 5 ].name.title ).toBe( 'Triton' );
980
1002
 
981
1003
  // Verify all satellites are grouped together
982
1004
  const satelliteItems = result.filter(
983
1005
  ( item ) => item.type === 'Satellite'
984
1006
  );
985
- expect( satelliteItems ).toHaveLength( 10 );
986
- expect( satelliteItems[ 0 ].name.title ).toBe( 'Triton' );
987
- expect( satelliteItems[ 1 ].name.title ).toBe( 'Proteus' );
988
- expect( satelliteItems[ 2 ].name.title ).toBe( 'Nereid' );
989
- expect( satelliteItems[ 3 ].name.title ).toBe( 'Moon' );
990
- expect( satelliteItems[ 4 ].name.title ).toBe( 'Io' );
991
- expect( satelliteItems[ 5 ].name.title ).toBe( 'Himalia' );
992
- expect( satelliteItems[ 6 ].name.title ).toBe( 'Ganymede' );
993
- expect( satelliteItems[ 7 ].name.title ).toBe( 'Europa' );
994
- expect( satelliteItems[ 8 ].name.title ).toBe( 'Callisto' );
995
- expect( satelliteItems[ 9 ].name.title ).toBe( 'Amalthea' );
1007
+ expect( satelliteItems ).toHaveLength( 25 );
1008
+ expect( satelliteItems[ 0 ].name.title ).toBe( 'Umbriel' );
1009
+ expect( satelliteItems[ 1 ].name.title ).toBe( 'Triton' );
1010
+ expect( satelliteItems[ 2 ].name.title ).toBe( 'Titania' );
1011
+ expect( satelliteItems[ 3 ].name.title ).toBe( 'Titan' );
1012
+ expect( satelliteItems[ 4 ].name.title ).toBe( 'Tethys' );
1013
+ expect( satelliteItems[ 5 ].name.title ).toBe( 'Rhea' );
1014
+ expect( satelliteItems[ 6 ].name.title ).toBe( 'Proteus' );
1015
+ expect( satelliteItems[ 7 ].name.title ).toBe( 'Phobos' );
1016
+ expect( satelliteItems[ 8 ].name.title ).toBe( 'Oberon' );
1017
+ expect( satelliteItems[ 9 ].name.title ).toBe( 'Nereid' );
996
1018
 
997
1019
  // Verify all terrestrial planets are grouped together
998
1020
  const terrestrialItems = result.filter(
@@ -1014,7 +1036,7 @@ describe( 'sorting', () => {
1014
1036
  fields
1015
1037
  );
1016
1038
 
1017
- expect( result ).toHaveLength( 19 );
1039
+ expect( result ).toHaveLength( 37 );
1018
1040
  expect( result[ 0 ].name.title ).toBe( 'Saturn' );
1019
1041
  expect( result[ 1 ].name.title ).toBe( 'Jupiter' );
1020
1042
  expect( result[ 2 ].name.title ).toBe( 'Uranus' );
@@ -1048,11 +1070,13 @@ describe( 'sorting', () => {
1048
1070
  },
1049
1071
  fields
1050
1072
  );
1051
- expect( resultDesc ).toHaveLength( 19 );
1073
+ expect( resultDesc ).toHaveLength( 37 );
1052
1074
  expect( resultDesc[ 0 ].name.title ).toBe( 'Europa' );
1053
- expect( resultDesc[ 1 ].name.title ).toBe( 'Earth' );
1075
+ expect( resultDesc[ 1 ].name.title ).toBe( 'Ceres' );
1054
1076
  // Skip intermediate items
1055
- expect( resultDesc[ resultDesc.length - 2 ].name.title ).toBe( 'Io' );
1077
+ expect( resultDesc[ resultDesc.length - 2 ].name.title ).toBe(
1078
+ 'Deimos'
1079
+ );
1056
1080
  expect( resultDesc[ resultDesc.length - 1 ].name.title ).toBe(
1057
1081
  'Jupiter'
1058
1082
  );
@@ -1064,11 +1088,11 @@ describe( 'sorting', () => {
1064
1088
  },
1065
1089
  fields
1066
1090
  );
1067
- expect( resultAsc ).toHaveLength( 19 );
1091
+ expect( resultAsc ).toHaveLength( 37 );
1068
1092
  expect( resultAsc[ 0 ].name.title ).toBe( 'Jupiter' );
1069
- expect( resultAsc[ 1 ].name.title ).toBe( 'Io' );
1093
+ expect( resultAsc[ 1 ].name.title ).toBe( 'Deimos' );
1070
1094
  // Skip intermediate items
1071
- expect( resultAsc[ resultAsc.length - 2 ].name.title ).toBe( 'Earth' );
1095
+ expect( resultAsc[ resultAsc.length - 2 ].name.title ).toBe( 'Ceres' );
1072
1096
  expect( resultAsc[ resultAsc.length - 1 ].name.title ).toBe( 'Europa' );
1073
1097
  } );
1074
1098
 
@@ -1086,7 +1110,7 @@ describe( 'sorting', () => {
1086
1110
  )
1087
1111
  );
1088
1112
 
1089
- expect( result ).toHaveLength( 19 );
1113
+ expect( result ).toHaveLength( 37 );
1090
1114
  expect( result[ 0 ].name.title ).toBe( 'Saturn' );
1091
1115
  expect( result[ 1 ].name.title ).toBe( 'Jupiter' );
1092
1116
  expect( result[ 2 ].name.title ).toBe( 'Uranus' );
@@ -1134,7 +1158,7 @@ describe( 'sorting', () => {
1134
1158
  }
1135
1159
  }
1136
1160
 
1137
- expect( groupCount ).toBe( 5 );
1161
+ expect( groupCount ).toBe( 6 );
1138
1162
  } );
1139
1163
 
1140
1164
  it( 'should NOT sort the data if gropuBy.field is not sortable', () => {
@@ -1202,7 +1226,7 @@ describe( 'pagination', () => {
1202
1226
  expect( result[ 1 ].name.title ).toBe( 'Ganymede' );
1203
1227
  expect( paginationInfo ).toStrictEqual( {
1204
1228
  totalItems: data.length,
1205
- totalPages: 10,
1229
+ totalPages: 19,
1206
1230
  } );
1207
1231
  } );
1208
1232
  } );
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/components/dataviews-layouts/table/use-is-horizontal-scroll-end.ts"],
4
- "sourcesContent": ["/**\n * External dependencies\n */\nimport type { MutableRefObject } from 'react';\n\n/**\n * WordPress dependencies\n */\nimport { useDebounce } from '@wordpress/compose';\nimport { useCallback, useEffect, useState } from '@wordpress/element';\nimport { isRTL } from '@wordpress/i18n';\n\nconst isScrolledToEnd = ( element: Element ) => {\n\tif ( isRTL() ) {\n\t\tconst scrollLeft = Math.abs( element.scrollLeft );\n\t\treturn scrollLeft <= 1;\n\t}\n\n\treturn element.scrollLeft + element.clientWidth >= element.scrollWidth - 1;\n};\n\n/**\n * A hook to check if a given scroll container has reached the horizontal scroll end.\n *\n * The current way receives \"refs\" as arguments, but it lacks a mechanism to detect when a ref has changed.\n * As a result, when the \"ref\" is updated and attached to a new div, the computation should trigger again.\n * However, this isn't possible in the current setup because the hook is unaware that the ref has changed.\n *\n * See https://github.com/Automattic/wp-calypso/pull/103005#discussion_r2077567912.\n *\n * @param {Object} params The parameters for the hook.\n * @param {MutableRefObject<HTMLDivElement | null>} params.scrollContainerRef The ref to the scroll container element.\n * @param {boolean} [params.enabled=false] Whether the hook is enabled.\n * @return {boolean} - Returns true if the scroll container is scrolled to the end or false otherwise.\n */\nexport function useIsHorizontalScrollEnd( {\n\tscrollContainerRef,\n\tenabled = false,\n}: {\n\tscrollContainerRef: React.MutableRefObject< HTMLDivElement | null >;\n\tenabled?: boolean;\n} ): boolean {\n\tconst [ isHorizontalScrollEnd, setIsHorizontalScrollEnd ] =\n\t\tuseState( false );\n\n\tconst handleIsHorizontalScrollEnd = useDebounce(\n\t\tuseCallback( () => {\n\t\t\tconst scrollContainer = scrollContainerRef.current;\n\t\t\tif ( scrollContainer ) {\n\t\t\t\tsetIsHorizontalScrollEnd( isScrolledToEnd( scrollContainer ) );\n\t\t\t}\n\t\t}, [ scrollContainerRef, setIsHorizontalScrollEnd ] ),\n\t\t200\n\t);\n\n\tuseEffect( () => {\n\t\tif (\n\t\t\ttypeof window === 'undefined' ||\n\t\t\t! enabled ||\n\t\t\t! scrollContainerRef.current\n\t\t) {\n\t\t\treturn () => {};\n\t\t}\n\n\t\thandleIsHorizontalScrollEnd();\n\t\tscrollContainerRef.current.addEventListener(\n\t\t\t'scroll',\n\t\t\thandleIsHorizontalScrollEnd\n\t\t);\n\t\twindow.addEventListener( 'resize', handleIsHorizontalScrollEnd );\n\n\t\treturn () => {\n\t\t\tscrollContainerRef.current?.removeEventListener(\n\t\t\t\t'scroll',\n\t\t\t\thandleIsHorizontalScrollEnd\n\t\t\t);\n\t\t\twindow.removeEventListener( 'resize', handleIsHorizontalScrollEnd );\n\t\t};\n\t}, [ scrollContainerRef, enabled ] );\n\n\treturn isHorizontalScrollEnd;\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,qBAA4B;AAC5B,qBAAiD;AACjD,kBAAsB;AAEtB,IAAM,kBAAkB,CAAE,YAAsB;AAC/C,UAAK,mBAAM,GAAI;AACd,UAAM,aAAa,KAAK,IAAK,QAAQ,UAAW;AAChD,WAAO,cAAc;AAAA,EACtB;AAEA,SAAO,QAAQ,aAAa,QAAQ,eAAe,QAAQ,cAAc;AAC1E;AAgBO,SAAS,yBAA0B;AAAA,EACzC;AAAA,EACA,UAAU;AACX,GAGa;AACZ,QAAM,CAAE,uBAAuB,wBAAyB,QACvD,yBAAU,KAAM;AAEjB,QAAM,kCAA8B;AAAA,QACnC,4BAAa,MAAM;AAClB,YAAM,kBAAkB,mBAAmB;AAC3C,UAAK,iBAAkB;AACtB,iCAA0B,gBAAiB,eAAgB,CAAE;AAAA,MAC9D;AAAA,IACD,GAAG,CAAE,oBAAoB,wBAAyB,CAAE;AAAA,IACpD;AAAA,EACD;AAEA,gCAAW,MAAM;AAChB,QACC,OAAO,WAAW,eAClB,CAAE,WACF,CAAE,mBAAmB,SACpB;AACD,aAAO,MAAM;AAAA,MAAC;AAAA,IACf;AAEA,gCAA4B;AAC5B,uBAAmB,QAAQ;AAAA,MAC1B;AAAA,MACA;AAAA,IACD;AACA,WAAO,iBAAkB,UAAU,2BAA4B;AAE/D,WAAO,MAAM;AACZ,yBAAmB,SAAS;AAAA,QAC3B;AAAA,QACA;AAAA,MACD;AACA,aAAO,oBAAqB,UAAU,2BAA4B;AAAA,IACnE;AAAA,EACD,GAAG,CAAE,oBAAoB,OAAQ,CAAE;AAEnC,SAAO;AACR;",
6
- "names": []
7
- }
@@ -1,50 +0,0 @@
1
- // packages/dataviews/src/components/dataviews-layouts/table/use-is-horizontal-scroll-end.ts
2
- import { useDebounce } from "@wordpress/compose";
3
- import { useCallback, useEffect, useState } from "@wordpress/element";
4
- import { isRTL } from "@wordpress/i18n";
5
- var isScrolledToEnd = (element) => {
6
- if (isRTL()) {
7
- const scrollLeft = Math.abs(element.scrollLeft);
8
- return scrollLeft <= 1;
9
- }
10
- return element.scrollLeft + element.clientWidth >= element.scrollWidth - 1;
11
- };
12
- function useIsHorizontalScrollEnd({
13
- scrollContainerRef,
14
- enabled = false
15
- }) {
16
- const [isHorizontalScrollEnd, setIsHorizontalScrollEnd] = useState(false);
17
- const handleIsHorizontalScrollEnd = useDebounce(
18
- useCallback(() => {
19
- const scrollContainer = scrollContainerRef.current;
20
- if (scrollContainer) {
21
- setIsHorizontalScrollEnd(isScrolledToEnd(scrollContainer));
22
- }
23
- }, [scrollContainerRef, setIsHorizontalScrollEnd]),
24
- 200
25
- );
26
- useEffect(() => {
27
- if (typeof window === "undefined" || !enabled || !scrollContainerRef.current) {
28
- return () => {
29
- };
30
- }
31
- handleIsHorizontalScrollEnd();
32
- scrollContainerRef.current.addEventListener(
33
- "scroll",
34
- handleIsHorizontalScrollEnd
35
- );
36
- window.addEventListener("resize", handleIsHorizontalScrollEnd);
37
- return () => {
38
- scrollContainerRef.current?.removeEventListener(
39
- "scroll",
40
- handleIsHorizontalScrollEnd
41
- );
42
- window.removeEventListener("resize", handleIsHorizontalScrollEnd);
43
- };
44
- }, [scrollContainerRef, enabled]);
45
- return isHorizontalScrollEnd;
46
- }
47
- export {
48
- useIsHorizontalScrollEnd
49
- };
50
- //# sourceMappingURL=use-is-horizontal-scroll-end.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/components/dataviews-layouts/table/use-is-horizontal-scroll-end.ts"],
4
- "sourcesContent": ["/**\n * External dependencies\n */\nimport type { MutableRefObject } from 'react';\n\n/**\n * WordPress dependencies\n */\nimport { useDebounce } from '@wordpress/compose';\nimport { useCallback, useEffect, useState } from '@wordpress/element';\nimport { isRTL } from '@wordpress/i18n';\n\nconst isScrolledToEnd = ( element: Element ) => {\n\tif ( isRTL() ) {\n\t\tconst scrollLeft = Math.abs( element.scrollLeft );\n\t\treturn scrollLeft <= 1;\n\t}\n\n\treturn element.scrollLeft + element.clientWidth >= element.scrollWidth - 1;\n};\n\n/**\n * A hook to check if a given scroll container has reached the horizontal scroll end.\n *\n * The current way receives \"refs\" as arguments, but it lacks a mechanism to detect when a ref has changed.\n * As a result, when the \"ref\" is updated and attached to a new div, the computation should trigger again.\n * However, this isn't possible in the current setup because the hook is unaware that the ref has changed.\n *\n * See https://github.com/Automattic/wp-calypso/pull/103005#discussion_r2077567912.\n *\n * @param {Object} params The parameters for the hook.\n * @param {MutableRefObject<HTMLDivElement | null>} params.scrollContainerRef The ref to the scroll container element.\n * @param {boolean} [params.enabled=false] Whether the hook is enabled.\n * @return {boolean} - Returns true if the scroll container is scrolled to the end or false otherwise.\n */\nexport function useIsHorizontalScrollEnd( {\n\tscrollContainerRef,\n\tenabled = false,\n}: {\n\tscrollContainerRef: React.MutableRefObject< HTMLDivElement | null >;\n\tenabled?: boolean;\n} ): boolean {\n\tconst [ isHorizontalScrollEnd, setIsHorizontalScrollEnd ] =\n\t\tuseState( false );\n\n\tconst handleIsHorizontalScrollEnd = useDebounce(\n\t\tuseCallback( () => {\n\t\t\tconst scrollContainer = scrollContainerRef.current;\n\t\t\tif ( scrollContainer ) {\n\t\t\t\tsetIsHorizontalScrollEnd( isScrolledToEnd( scrollContainer ) );\n\t\t\t}\n\t\t}, [ scrollContainerRef, setIsHorizontalScrollEnd ] ),\n\t\t200\n\t);\n\n\tuseEffect( () => {\n\t\tif (\n\t\t\ttypeof window === 'undefined' ||\n\t\t\t! enabled ||\n\t\t\t! scrollContainerRef.current\n\t\t) {\n\t\t\treturn () => {};\n\t\t}\n\n\t\thandleIsHorizontalScrollEnd();\n\t\tscrollContainerRef.current.addEventListener(\n\t\t\t'scroll',\n\t\t\thandleIsHorizontalScrollEnd\n\t\t);\n\t\twindow.addEventListener( 'resize', handleIsHorizontalScrollEnd );\n\n\t\treturn () => {\n\t\t\tscrollContainerRef.current?.removeEventListener(\n\t\t\t\t'scroll',\n\t\t\t\thandleIsHorizontalScrollEnd\n\t\t\t);\n\t\t\twindow.removeEventListener( 'resize', handleIsHorizontalScrollEnd );\n\t\t};\n\t}, [ scrollContainerRef, enabled ] );\n\n\treturn isHorizontalScrollEnd;\n}\n"],
5
- "mappings": ";AAQA,SAAS,mBAAmB;AAC5B,SAAS,aAAa,WAAW,gBAAgB;AACjD,SAAS,aAAa;AAEtB,IAAM,kBAAkB,CAAE,YAAsB;AAC/C,MAAK,MAAM,GAAI;AACd,UAAM,aAAa,KAAK,IAAK,QAAQ,UAAW;AAChD,WAAO,cAAc;AAAA,EACtB;AAEA,SAAO,QAAQ,aAAa,QAAQ,eAAe,QAAQ,cAAc;AAC1E;AAgBO,SAAS,yBAA0B;AAAA,EACzC;AAAA,EACA,UAAU;AACX,GAGa;AACZ,QAAM,CAAE,uBAAuB,wBAAyB,IACvD,SAAU,KAAM;AAEjB,QAAM,8BAA8B;AAAA,IACnC,YAAa,MAAM;AAClB,YAAM,kBAAkB,mBAAmB;AAC3C,UAAK,iBAAkB;AACtB,iCAA0B,gBAAiB,eAAgB,CAAE;AAAA,MAC9D;AAAA,IACD,GAAG,CAAE,oBAAoB,wBAAyB,CAAE;AAAA,IACpD;AAAA,EACD;AAEA,YAAW,MAAM;AAChB,QACC,OAAO,WAAW,eAClB,CAAE,WACF,CAAE,mBAAmB,SACpB;AACD,aAAO,MAAM;AAAA,MAAC;AAAA,IACf;AAEA,gCAA4B;AAC5B,uBAAmB,QAAQ;AAAA,MAC1B;AAAA,MACA;AAAA,IACD;AACA,WAAO,iBAAkB,UAAU,2BAA4B;AAE/D,WAAO,MAAM;AACZ,yBAAmB,SAAS;AAAA,QAC3B;AAAA,QACA;AAAA,MACD;AACA,aAAO,oBAAqB,UAAU,2BAA4B;AAAA,IACnE;AAAA,EACD,GAAG,CAAE,oBAAoB,OAAQ,CAAE;AAEnC,SAAO;AACR;",
6
- "names": []
7
- }
@@ -1,19 +0,0 @@
1
- /**
2
- * A hook to check if a given scroll container has reached the horizontal scroll end.
3
- *
4
- * The current way receives "refs" as arguments, but it lacks a mechanism to detect when a ref has changed.
5
- * As a result, when the "ref" is updated and attached to a new div, the computation should trigger again.
6
- * However, this isn't possible in the current setup because the hook is unaware that the ref has changed.
7
- *
8
- * See https://github.com/Automattic/wp-calypso/pull/103005#discussion_r2077567912.
9
- *
10
- * @param {Object} params The parameters for the hook.
11
- * @param {MutableRefObject<HTMLDivElement | null>} params.scrollContainerRef The ref to the scroll container element.
12
- * @param {boolean} [params.enabled=false] Whether the hook is enabled.
13
- * @return {boolean} - Returns true if the scroll container is scrolled to the end or false otherwise.
14
- */
15
- export declare function useIsHorizontalScrollEnd({ scrollContainerRef, enabled, }: {
16
- scrollContainerRef: React.MutableRefObject<HTMLDivElement | null>;
17
- enabled?: boolean;
18
- }): boolean;
19
- //# sourceMappingURL=use-is-horizontal-scroll-end.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-is-horizontal-scroll-end.d.ts","sourceRoot":"","sources":["../../../../src/components/dataviews-layouts/table/use-is-horizontal-scroll-end.ts"],"names":[],"mappings":"AAqBA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,wBAAwB,CAAE,EACzC,kBAAkB,EAClB,OAAe,GACf,EAAE;IACF,kBAAkB,EAAE,KAAK,CAAC,gBAAgB,CAAE,cAAc,GAAG,IAAI,CAAE,CAAC;IACpE,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB,GAAI,OAAO,CAwCX"}
@@ -1,82 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import type { MutableRefObject } from 'react';
5
-
6
- /**
7
- * WordPress dependencies
8
- */
9
- import { useDebounce } from '@wordpress/compose';
10
- import { useCallback, useEffect, useState } from '@wordpress/element';
11
- import { isRTL } from '@wordpress/i18n';
12
-
13
- const isScrolledToEnd = ( element: Element ) => {
14
- if ( isRTL() ) {
15
- const scrollLeft = Math.abs( element.scrollLeft );
16
- return scrollLeft <= 1;
17
- }
18
-
19
- return element.scrollLeft + element.clientWidth >= element.scrollWidth - 1;
20
- };
21
-
22
- /**
23
- * A hook to check if a given scroll container has reached the horizontal scroll end.
24
- *
25
- * The current way receives "refs" as arguments, but it lacks a mechanism to detect when a ref has changed.
26
- * As a result, when the "ref" is updated and attached to a new div, the computation should trigger again.
27
- * However, this isn't possible in the current setup because the hook is unaware that the ref has changed.
28
- *
29
- * See https://github.com/Automattic/wp-calypso/pull/103005#discussion_r2077567912.
30
- *
31
- * @param {Object} params The parameters for the hook.
32
- * @param {MutableRefObject<HTMLDivElement | null>} params.scrollContainerRef The ref to the scroll container element.
33
- * @param {boolean} [params.enabled=false] Whether the hook is enabled.
34
- * @return {boolean} - Returns true if the scroll container is scrolled to the end or false otherwise.
35
- */
36
- export function useIsHorizontalScrollEnd( {
37
- scrollContainerRef,
38
- enabled = false,
39
- }: {
40
- scrollContainerRef: React.MutableRefObject< HTMLDivElement | null >;
41
- enabled?: boolean;
42
- } ): boolean {
43
- const [ isHorizontalScrollEnd, setIsHorizontalScrollEnd ] =
44
- useState( false );
45
-
46
- const handleIsHorizontalScrollEnd = useDebounce(
47
- useCallback( () => {
48
- const scrollContainer = scrollContainerRef.current;
49
- if ( scrollContainer ) {
50
- setIsHorizontalScrollEnd( isScrolledToEnd( scrollContainer ) );
51
- }
52
- }, [ scrollContainerRef, setIsHorizontalScrollEnd ] ),
53
- 200
54
- );
55
-
56
- useEffect( () => {
57
- if (
58
- typeof window === 'undefined' ||
59
- ! enabled ||
60
- ! scrollContainerRef.current
61
- ) {
62
- return () => {};
63
- }
64
-
65
- handleIsHorizontalScrollEnd();
66
- scrollContainerRef.current.addEventListener(
67
- 'scroll',
68
- handleIsHorizontalScrollEnd
69
- );
70
- window.addEventListener( 'resize', handleIsHorizontalScrollEnd );
71
-
72
- return () => {
73
- scrollContainerRef.current?.removeEventListener(
74
- 'scroll',
75
- handleIsHorizontalScrollEnd
76
- );
77
- window.removeEventListener( 'resize', handleIsHorizontalScrollEnd );
78
- };
79
- }, [ scrollContainerRef, enabled ] );
80
-
81
- return isHorizontalScrollEnd;
82
- }