@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.
- package/CHANGELOG.md +18 -1
- package/README.md +19 -3
- package/build/components/dataform-controls/datetime.cjs +8 -4
- package/build/components/dataform-controls/datetime.cjs.map +2 -2
- package/build/components/dataform-layouts/card/index.cjs +132 -128
- package/build/components/dataform-layouts/card/index.cjs.map +3 -3
- package/build/components/dataviews-bulk-actions/index.cjs +28 -5
- package/build/components/dataviews-bulk-actions/index.cjs.map +2 -2
- package/build/components/dataviews-context/index.cjs +2 -2
- package/build/components/dataviews-context/index.cjs.map +2 -2
- package/build/components/dataviews-footer/index.cjs +2 -3
- package/build/components/dataviews-footer/index.cjs.map +2 -2
- package/build/components/dataviews-layout/index.cjs +12 -3
- package/build/components/dataviews-layout/index.cjs.map +2 -2
- package/build/components/dataviews-layouts/grid/composite-grid.cjs +378 -245
- package/build/components/dataviews-layouts/grid/composite-grid.cjs.map +2 -2
- package/build/components/dataviews-layouts/index.cjs +3 -3
- package/build/components/dataviews-layouts/index.cjs.map +3 -3
- package/build/components/dataviews-layouts/picker-grid/index.cjs +76 -32
- package/build/components/dataviews-layouts/picker-grid/index.cjs.map +2 -2
- package/build/components/dataviews-layouts/picker-table/index.cjs +34 -22
- package/build/components/dataviews-layouts/picker-table/index.cjs.map +2 -2
- package/build/components/dataviews-layouts/table/index.cjs +97 -88
- package/build/components/dataviews-layouts/table/index.cjs.map +2 -2
- package/build/components/dataviews-layouts/table/{use-is-horizontal-scroll-end.cjs → use-scroll-state.cjs} +29 -33
- package/build/components/dataviews-layouts/table/use-scroll-state.cjs.map +7 -0
- package/build/components/dataviews-layouts/utils/density-picker.cjs.map +2 -2
- package/build/components/dataviews-layouts/utils/grid-config-options.cjs +45 -0
- package/build/components/dataviews-layouts/utils/grid-config-options.cjs.map +7 -0
- package/build/components/dataviews-layouts/utils/use-infinite-scroll.cjs +62 -0
- package/build/components/dataviews-layouts/utils/use-infinite-scroll.cjs.map +7 -0
- package/build/components/dataviews-picker-footer/index.cjs +23 -4
- package/build/components/dataviews-picker-footer/index.cjs.map +2 -2
- package/build/components/dataviews-search/index.cjs +2 -1
- package/build/components/dataviews-search/index.cjs.map +2 -2
- package/build/components/dataviews-selection-checkbox/index.cjs +3 -2
- package/build/components/dataviews-selection-checkbox/index.cjs.map +2 -2
- package/build/components/dataviews-view-config/index.cjs +0 -2
- package/build/components/dataviews-view-config/index.cjs.map +3 -3
- package/build/components/dataviews-view-config/infinite-scroll-toggle.cjs +0 -3
- package/build/components/dataviews-view-config/infinite-scroll-toggle.cjs.map +2 -2
- package/build/dataviews/index.cjs +38 -34
- package/build/dataviews/index.cjs.map +3 -3
- package/build/dataviews-picker/index.cjs +26 -25
- package/build/dataviews-picker/index.cjs.map +3 -3
- package/build/hooks/index.cjs +11 -2
- package/build/hooks/index.cjs.map +2 -2
- package/build/hooks/use-data.cjs +146 -9
- package/build/hooks/use-data.cjs.map +2 -2
- package/build/hooks/use-infinite-scroll.cjs +208 -0
- package/build/hooks/use-infinite-scroll.cjs.map +7 -0
- package/build/hooks/use-selected-items.cjs +57 -0
- package/build/hooks/use-selected-items.cjs.map +7 -0
- package/build/types/dataviews.cjs.map +1 -1
- package/build/types/field-api.cjs.map +1 -1
- package/build/utils/filter-sort-and-paginate.cjs +5 -1
- package/build/utils/filter-sort-and-paginate.cjs.map +2 -2
- package/build/utils/get-footer-message.cjs +8 -8
- package/build/utils/get-footer-message.cjs.map +2 -2
- package/build-module/components/dataform-controls/datetime.mjs +8 -4
- package/build-module/components/dataform-controls/datetime.mjs.map +2 -2
- package/build-module/components/dataform-layouts/card/index.mjs +132 -133
- package/build-module/components/dataform-layouts/card/index.mjs.map +2 -2
- package/build-module/components/dataviews-bulk-actions/index.mjs +28 -5
- package/build-module/components/dataviews-bulk-actions/index.mjs.map +2 -2
- package/build-module/components/dataviews-context/index.mjs +2 -2
- package/build-module/components/dataviews-context/index.mjs.map +2 -2
- package/build-module/components/dataviews-footer/index.mjs +2 -3
- package/build-module/components/dataviews-footer/index.mjs.map +2 -2
- package/build-module/components/dataviews-layout/index.mjs +12 -3
- package/build-module/components/dataviews-layout/index.mjs.map +2 -2
- package/build-module/components/dataviews-layouts/grid/composite-grid.mjs +387 -246
- package/build-module/components/dataviews-layouts/grid/composite-grid.mjs.map +2 -2
- package/build-module/components/dataviews-layouts/index.mjs +3 -3
- package/build-module/components/dataviews-layouts/index.mjs.map +2 -2
- package/build-module/components/dataviews-layouts/picker-grid/index.mjs +80 -33
- package/build-module/components/dataviews-layouts/picker-grid/index.mjs.map +2 -2
- package/build-module/components/dataviews-layouts/picker-table/index.mjs +34 -22
- package/build-module/components/dataviews-layouts/picker-table/index.mjs.map +2 -2
- package/build-module/components/dataviews-layouts/table/index.mjs +97 -88
- package/build-module/components/dataviews-layouts/table/index.mjs.map +2 -2
- package/build-module/components/dataviews-layouts/table/use-scroll-state.mjs +46 -0
- package/build-module/components/dataviews-layouts/table/use-scroll-state.mjs.map +7 -0
- package/build-module/components/dataviews-layouts/utils/density-picker.mjs.map +2 -2
- package/build-module/components/dataviews-layouts/utils/grid-config-options.mjs +14 -0
- package/build-module/components/dataviews-layouts/utils/grid-config-options.mjs.map +7 -0
- package/build-module/components/dataviews-layouts/utils/use-infinite-scroll.mjs +26 -0
- package/build-module/components/dataviews-layouts/utils/use-infinite-scroll.mjs.map +7 -0
- package/build-module/components/dataviews-picker-footer/index.mjs +23 -4
- package/build-module/components/dataviews-picker-footer/index.mjs.map +2 -2
- package/build-module/components/dataviews-search/index.mjs +2 -1
- package/build-module/components/dataviews-search/index.mjs.map +2 -2
- package/build-module/components/dataviews-selection-checkbox/index.mjs +3 -2
- package/build-module/components/dataviews-selection-checkbox/index.mjs.map +2 -2
- package/build-module/components/dataviews-view-config/index.mjs +0 -2
- package/build-module/components/dataviews-view-config/index.mjs.map +2 -2
- package/build-module/components/dataviews-view-config/infinite-scroll-toggle.mjs +0 -3
- package/build-module/components/dataviews-view-config/infinite-scroll-toggle.mjs.map +2 -2
- package/build-module/dataviews/index.mjs +46 -36
- package/build-module/dataviews/index.mjs.map +2 -2
- package/build-module/dataviews-picker/index.mjs +34 -27
- package/build-module/dataviews-picker/index.mjs.map +2 -2
- package/build-module/hooks/index.mjs +7 -1
- package/build-module/hooks/index.mjs.map +2 -2
- package/build-module/hooks/use-data.mjs +147 -10
- package/build-module/hooks/use-data.mjs.map +2 -2
- package/build-module/hooks/use-infinite-scroll.mjs +188 -0
- package/build-module/hooks/use-infinite-scroll.mjs.map +7 -0
- package/build-module/hooks/use-selected-items.mjs +36 -0
- package/build-module/hooks/use-selected-items.mjs.map +7 -0
- package/build-module/utils/filter-sort-and-paginate.mjs +5 -1
- package/build-module/utils/filter-sort-and-paginate.mjs.map +2 -2
- package/build-module/utils/get-footer-message.mjs +8 -8
- package/build-module/utils/get-footer-message.mjs.map +2 -2
- package/build-style/style-rtl.css +107 -41
- package/build-style/style.css +107 -41
- package/build-types/components/dataform-controls/datetime.d.ts +1 -1
- package/build-types/components/dataform-controls/datetime.d.ts.map +1 -1
- package/build-types/components/dataform-layouts/card/index.d.ts.map +1 -1
- package/build-types/components/dataviews-bulk-actions/index.d.ts +2 -1
- package/build-types/components/dataviews-bulk-actions/index.d.ts.map +1 -1
- package/build-types/components/dataviews-context/index.d.ts +1 -1
- package/build-types/components/dataviews-context/index.d.ts.map +1 -1
- package/build-types/components/dataviews-footer/index.d.ts.map +1 -1
- package/build-types/components/dataviews-layout/index.d.ts.map +1 -1
- package/build-types/components/dataviews-layouts/grid/composite-grid.d.ts.map +1 -1
- package/build-types/components/dataviews-layouts/index.d.ts +3 -3
- package/build-types/components/dataviews-layouts/index.d.ts.map +1 -1
- package/build-types/components/dataviews-layouts/picker-grid/index.d.ts.map +1 -1
- package/build-types/components/dataviews-layouts/picker-table/index.d.ts.map +1 -1
- package/build-types/components/dataviews-layouts/table/index.d.ts.map +1 -1
- package/build-types/components/dataviews-layouts/table/use-scroll-state.d.ts +25 -0
- package/build-types/components/dataviews-layouts/table/use-scroll-state.d.ts.map +1 -0
- package/build-types/components/dataviews-layouts/utils/density-picker.d.ts.map +1 -1
- package/build-types/components/dataviews-layouts/utils/grid-config-options.d.ts +2 -0
- package/build-types/components/dataviews-layouts/utils/grid-config-options.d.ts.map +1 -0
- package/build-types/components/dataviews-layouts/utils/use-infinite-scroll.d.ts +22 -0
- package/build-types/components/dataviews-layouts/utils/use-infinite-scroll.d.ts.map +1 -0
- package/build-types/components/dataviews-picker-footer/index.d.ts.map +1 -1
- package/build-types/components/dataviews-search/index.d.ts.map +1 -1
- package/build-types/components/dataviews-selection-checkbox/index.d.ts.map +1 -1
- package/build-types/components/dataviews-view-config/index.d.ts.map +1 -1
- package/build-types/components/dataviews-view-config/infinite-scroll-toggle.d.ts +1 -1
- package/build-types/components/dataviews-view-config/infinite-scroll-toggle.d.ts.map +1 -1
- package/build-types/dataviews/index.d.ts +0 -1
- package/build-types/dataviews/index.d.ts.map +1 -1
- package/build-types/dataviews/stories/empty.d.ts +1 -2
- package/build-types/dataviews/stories/empty.d.ts.map +1 -1
- package/build-types/dataviews/stories/fixtures.d.ts.map +1 -1
- package/build-types/dataviews/stories/free-composition.d.ts.map +1 -1
- package/build-types/dataviews/stories/index.story.d.ts +18 -10
- package/build-types/dataviews/stories/index.story.d.ts.map +1 -1
- package/build-types/dataviews/stories/infinite-scroll.d.ts.map +1 -1
- package/build-types/dataviews/stories/layout-activity.d.ts.map +1 -1
- package/build-types/dataviews/stories/layout-custom.d.ts +3 -1
- package/build-types/dataviews/stories/layout-custom.d.ts.map +1 -1
- package/build-types/dataviews/stories/layout-grid.d.ts.map +1 -1
- package/build-types/dataviews/stories/layout-list.d.ts.map +1 -1
- package/build-types/dataviews/stories/layout-table.d.ts.map +1 -1
- package/build-types/dataviews/stories/with-card.d.ts +3 -1
- package/build-types/dataviews/stories/with-card.d.ts.map +1 -1
- package/build-types/dataviews-picker/index.d.ts +0 -1
- package/build-types/dataviews-picker/index.d.ts.map +1 -1
- package/build-types/dataviews-picker/stories/fixtures.d.ts.map +1 -1
- package/build-types/dataviews-picker/stories/index.story.d.ts.map +1 -1
- package/build-types/field-types/stories/index.story.d.ts.map +1 -1
- package/build-types/hooks/index.d.ts +3 -0
- package/build-types/hooks/index.d.ts.map +1 -1
- package/build-types/hooks/test/use-data.d.ts +2 -0
- package/build-types/hooks/test/use-data.d.ts.map +1 -0
- package/build-types/hooks/use-data.d.ts +41 -3
- package/build-types/hooks/use-data.d.ts.map +1 -1
- package/build-types/hooks/use-infinite-scroll.d.ts +21 -0
- package/build-types/hooks/use-infinite-scroll.d.ts.map +1 -0
- package/build-types/hooks/use-selected-items.d.ts +19 -0
- package/build-types/hooks/use-selected-items.d.ts.map +1 -0
- package/build-types/types/dataviews.d.ts +15 -1
- package/build-types/types/dataviews.d.ts.map +1 -1
- package/build-types/types/field-api.d.ts +15 -4
- package/build-types/types/field-api.d.ts.map +1 -1
- package/build-types/utils/filter-sort-and-paginate.d.ts.map +1 -1
- package/build-types/utils/get-footer-message.d.ts +3 -2
- package/build-types/utils/get-footer-message.d.ts.map +1 -1
- package/build-wp/index.js +3202 -2761
- package/package.json +19 -19
- package/src/components/dataform-controls/datetime.tsx +19 -11
- package/src/components/dataform-layouts/card/index.tsx +171 -146
- package/src/components/dataform-layouts/card/style.scss +8 -5
- package/src/components/dataviews-bulk-actions/index.tsx +28 -1
- package/src/components/dataviews-context/index.ts +2 -2
- package/src/components/dataviews-footer/index.tsx +1 -6
- package/src/components/dataviews-layout/index.tsx +41 -19
- package/src/components/dataviews-layout/style.scss +8 -0
- package/src/components/dataviews-layouts/grid/composite-grid.tsx +433 -278
- package/src/components/dataviews-layouts/grid/style.scss +22 -2
- package/src/components/dataviews-layouts/index.ts +3 -3
- package/src/components/dataviews-layouts/picker-grid/index.tsx +70 -17
- package/src/components/dataviews-layouts/picker-grid/style.scss +10 -0
- package/src/components/dataviews-layouts/picker-table/index.tsx +42 -22
- package/src/components/dataviews-layouts/table/index.tsx +10 -4
- package/src/components/dataviews-layouts/table/style.scss +13 -0
- package/src/components/dataviews-layouts/table/use-scroll-state.ts +79 -0
- package/src/components/dataviews-layouts/utils/density-picker.tsx +12 -2
- package/src/components/dataviews-layouts/utils/grid-config-options.tsx +14 -0
- package/src/components/dataviews-layouts/utils/grid-items.scss +9 -1
- package/src/components/dataviews-layouts/utils/use-infinite-scroll.ts +64 -0
- package/src/components/dataviews-picker-footer/index.tsx +21 -1
- package/src/components/dataviews-search/index.tsx +2 -1
- package/src/components/dataviews-selection-checkbox/index.tsx +4 -2
- package/src/components/dataviews-view-config/index.tsx +0 -2
- package/src/components/dataviews-view-config/infinite-scroll-toggle.tsx +0 -5
- package/src/dataviews/index.tsx +58 -45
- package/src/dataviews/stories/empty.tsx +1 -3
- package/src/dataviews/stories/fixtures.tsx +288 -0
- package/src/dataviews/stories/free-composition.tsx +44 -45
- package/src/dataviews/stories/index.story.tsx +31 -8
- package/src/dataviews/stories/infinite-scroll.tsx +7 -93
- package/src/dataviews/stories/layout-activity.tsx +1 -0
- package/src/dataviews/stories/layout-custom.tsx +7 -3
- package/src/dataviews/stories/layout-grid.tsx +1 -0
- package/src/dataviews/stories/layout-list.tsx +1 -0
- package/src/dataviews/stories/layout-table.tsx +1 -0
- package/src/dataviews/stories/style.css +0 -5
- package/src/dataviews/stories/with-card.tsx +35 -24
- package/src/dataviews/style.scss +5 -8
- package/src/dataviews/test/dataviews.tsx +54 -1
- package/src/dataviews-picker/index.tsx +41 -35
- package/src/dataviews-picker/stories/fixtures.tsx +270 -0
- package/src/dataviews-picker/stories/index.story.tsx +62 -129
- package/src/field-types/stories/index.story.tsx +12 -0
- package/src/hooks/index.ts +3 -0
- package/src/hooks/test/use-data.ts +791 -0
- package/src/hooks/use-data.ts +288 -21
- package/src/hooks/use-infinite-scroll.ts +304 -0
- package/src/hooks/use-selected-items.ts +72 -0
- package/src/style.scss +1 -0
- package/src/types/dataviews.ts +18 -1
- package/src/types/field-api.ts +16 -3
- package/src/utils/filter-sort-and-paginate.ts +13 -1
- package/src/utils/get-footer-message.ts +12 -9
- package/src/utils/test/filter-sort-and-paginate.js +78 -54
- package/build/components/dataviews-layouts/table/use-is-horizontal-scroll-end.cjs.map +0 -7
- package/build-module/components/dataviews-layouts/table/use-is-horizontal-scroll-end.mjs +0 -50
- package/build-module/components/dataviews-layouts/table/use-is-horizontal-scroll-end.mjs.map +0 -7
- package/build-types/components/dataviews-layouts/table/use-is-horizontal-scroll-end.d.ts +0 -19
- package/build-types/components/dataviews-layouts/table/use-is-horizontal-scroll-end.d.ts.map +0 -1
- 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 *;
|
package/src/types/dataviews.ts
CHANGED
|
@@ -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
|
|
package/src/types/field-api.ts
CHANGED
|
@@ -157,10 +157,21 @@ export type EditConfigText = {
|
|
|
157
157
|
};
|
|
158
158
|
|
|
159
159
|
/**
|
|
160
|
-
* Edit configuration for
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
29
|
+
// No selection - show item count
|
|
30
|
+
if ( onlyTotalCount || totalItems <= itemsCount ) {
|
|
28
31
|
return sprintf(
|
|
29
|
-
/* translators: %
|
|
30
|
-
_n( '%
|
|
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',
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
932
|
+
expect( result ).toHaveLength( 37 );
|
|
915
933
|
|
|
916
|
-
expect( result[ 0 ].type ).toBe( '
|
|
917
|
-
expect( result[
|
|
918
|
-
expect( result[
|
|
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[
|
|
922
|
-
expect( result[
|
|
923
|
-
expect( result[
|
|
924
|
-
expect( result[
|
|
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(
|
|
931
|
-
expect( satelliteItems[ 0 ].name.title ).toBe( '
|
|
932
|
-
expect( satelliteItems[ 1 ].name.title ).toBe( '
|
|
933
|
-
expect( satelliteItems[ 2 ].name.title ).toBe( '
|
|
934
|
-
expect( satelliteItems[ 3 ].name.title ).toBe( '
|
|
935
|
-
expect( satelliteItems[ 4 ].name.title ).toBe( '
|
|
936
|
-
expect( satelliteItems[ 5 ].name.title ).toBe( '
|
|
937
|
-
expect( satelliteItems[ 6 ].name.title ).toBe( '
|
|
938
|
-
expect( satelliteItems[ 7 ].name.title ).toBe( '
|
|
939
|
-
expect( satelliteItems[ 8 ].name.title ).toBe( '
|
|
940
|
-
expect( satelliteItems[ 9 ].name.title ).toBe( '
|
|
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(
|
|
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( '
|
|
999
|
+
expect( result[ 4 ].name.title ).toBe( 'Umbriel' );
|
|
978
1000
|
expect( result[ 5 ].type ).toBe( 'Satellite' );
|
|
979
|
-
expect( result[ 5 ].name.title ).toBe( '
|
|
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(
|
|
986
|
-
expect( satelliteItems[ 0 ].name.title ).toBe( '
|
|
987
|
-
expect( satelliteItems[ 1 ].name.title ).toBe( '
|
|
988
|
-
expect( satelliteItems[ 2 ].name.title ).toBe( '
|
|
989
|
-
expect( satelliteItems[ 3 ].name.title ).toBe( '
|
|
990
|
-
expect( satelliteItems[ 4 ].name.title ).toBe( '
|
|
991
|
-
expect( satelliteItems[ 5 ].name.title ).toBe( '
|
|
992
|
-
expect( satelliteItems[ 6 ].name.title ).toBe( '
|
|
993
|
-
expect( satelliteItems[ 7 ].name.title ).toBe( '
|
|
994
|
-
expect( satelliteItems[ 8 ].name.title ).toBe( '
|
|
995
|
-
expect( satelliteItems[ 9 ].name.title ).toBe( '
|
|
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(
|
|
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(
|
|
1073
|
+
expect( resultDesc ).toHaveLength( 37 );
|
|
1052
1074
|
expect( resultDesc[ 0 ].name.title ).toBe( 'Europa' );
|
|
1053
|
-
expect( resultDesc[ 1 ].name.title ).toBe( '
|
|
1075
|
+
expect( resultDesc[ 1 ].name.title ).toBe( 'Ceres' );
|
|
1054
1076
|
// Skip intermediate items
|
|
1055
|
-
expect( resultDesc[ resultDesc.length - 2 ].name.title ).toBe(
|
|
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(
|
|
1091
|
+
expect( resultAsc ).toHaveLength( 37 );
|
|
1068
1092
|
expect( resultAsc[ 0 ].name.title ).toBe( 'Jupiter' );
|
|
1069
|
-
expect( resultAsc[ 1 ].name.title ).toBe( '
|
|
1093
|
+
expect( resultAsc[ 1 ].name.title ).toBe( 'Deimos' );
|
|
1070
1094
|
// Skip intermediate items
|
|
1071
|
-
expect( resultAsc[ resultAsc.length - 2 ].name.title ).toBe( '
|
|
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(
|
|
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(
|
|
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:
|
|
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
|
package/build-module/components/dataviews-layouts/table/use-is-horizontal-scroll-end.mjs.map
DELETED
|
@@ -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
|
package/build-types/components/dataviews-layouts/table/use-is-horizontal-scroll-end.d.ts.map
DELETED
|
@@ -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
|
-
}
|