@wordpress/dataviews 13.1.1-next.v.202603161435.0 → 14.1.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 +36 -6
- package/README.md +33 -7
- package/build/components/dataform-controls/array.cjs +2 -0
- package/build/components/dataform-controls/array.cjs.map +2 -2
- package/build/components/dataform-controls/checkbox.cjs +3 -1
- package/build/components/dataform-controls/checkbox.cjs.map +2 -2
- package/build/components/dataform-controls/color.cjs +8 -2
- package/build/components/dataform-controls/color.cjs.map +2 -2
- package/build/components/dataform-controls/date.cjs +31 -9
- package/build/components/dataform-controls/date.cjs.map +3 -3
- package/build/components/dataform-controls/datetime.cjs +17 -6
- package/build/components/dataform-controls/datetime.cjs.map +3 -3
- package/build/components/dataform-controls/password.cjs +4 -1
- package/build/components/dataform-controls/password.cjs.map +2 -2
- package/build/components/dataform-controls/radio.cjs +3 -1
- package/build/components/dataform-controls/radio.cjs.map +2 -2
- package/build/components/dataform-controls/select.cjs +3 -1
- package/build/components/dataform-controls/select.cjs.map +2 -2
- package/build/components/dataform-controls/textarea.cjs +2 -0
- package/build/components/dataform-controls/textarea.cjs.map +2 -2
- package/build/components/dataform-controls/toggle-group.cjs +3 -1
- package/build/components/dataform-controls/toggle-group.cjs.map +2 -2
- package/build/components/dataform-controls/toggle.cjs +3 -1
- package/build/components/dataform-controls/toggle.cjs.map +2 -2
- package/build/components/dataform-controls/utils/relative-date-control.cjs +5 -2
- package/build/components/dataform-controls/utils/relative-date-control.cjs.map +2 -2
- package/build/components/dataform-controls/utils/use-disabled-date-matchers.cjs +48 -0
- package/build/components/dataform-controls/utils/use-disabled-date-matchers.cjs.map +7 -0
- package/build/components/dataform-controls/utils/validated-input.cjs +2 -0
- package/build/components/dataform-controls/utils/validated-input.cjs.map +2 -2
- package/build/components/dataform-controls/utils/validated-number.cjs +3 -1
- package/build/components/dataform-controls/utils/validated-number.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/dataform-layouts/panel/summary-button.cjs +0 -1
- package/build/components/dataform-layouts/panel/summary-button.cjs.map +2 -2
- 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-filters/input-widget.cjs +4 -0
- package/build/components/dataviews-filters/input-widget.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-layouts/grid/composite-grid.cjs +378 -249
- package/build/components/dataviews-layouts/grid/composite-grid.cjs.map +2 -2
- package/build/components/dataviews-layouts/picker-grid/index.cjs +60 -30
- package/build/components/dataviews-layouts/picker-grid/index.cjs.map +2 -2
- package/build/components/dataviews-layouts/picker-table/index.cjs +45 -30
- package/build/components/dataviews-layouts/picker-table/index.cjs.map +2 -2
- package/build/components/dataviews-layouts/table/index.cjs +0 -1
- package/build/components/dataviews-layouts/table/index.cjs.map +2 -2
- 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-pagination/index.cjs +1 -0
- package/build/components/dataviews-pagination/index.cjs.map +2 -2
- 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 +47 -45
- package/build/dataviews/index.cjs.map +3 -3
- package/build/dataviews-picker/index.cjs +41 -33
- package/build/dataviews-picker/index.cjs.map +3 -3
- package/build/field-types/date.cjs +4 -1
- package/build/field-types/date.cjs.map +2 -2
- package/build/field-types/datetime.cjs +4 -1
- package/build/field-types/datetime.cjs.map +2 -2
- package/build/field-types/index.cjs +1 -0
- package/build/field-types/index.cjs.map +2 -2
- package/build/field-types/utils/get-is-valid.cjs +29 -24
- package/build/field-types/utils/get-is-valid.cjs.map +2 -2
- package/build/field-types/utils/is-valid-date-boundary.cjs +64 -0
- package/build/field-types/utils/is-valid-date-boundary.cjs.map +7 -0
- 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/array.mjs +2 -0
- package/build-module/components/dataform-controls/array.mjs.map +2 -2
- package/build-module/components/dataform-controls/checkbox.mjs +3 -1
- package/build-module/components/dataform-controls/checkbox.mjs.map +2 -2
- package/build-module/components/dataform-controls/color.mjs +8 -2
- package/build-module/components/dataform-controls/color.mjs.map +2 -2
- package/build-module/components/dataform-controls/date.mjs +31 -9
- package/build-module/components/dataform-controls/date.mjs.map +2 -2
- package/build-module/components/dataform-controls/datetime.mjs +17 -6
- package/build-module/components/dataform-controls/datetime.mjs.map +2 -2
- package/build-module/components/dataform-controls/password.mjs +4 -1
- package/build-module/components/dataform-controls/password.mjs.map +2 -2
- package/build-module/components/dataform-controls/radio.mjs +3 -1
- package/build-module/components/dataform-controls/radio.mjs.map +2 -2
- package/build-module/components/dataform-controls/select.mjs +3 -1
- package/build-module/components/dataform-controls/select.mjs.map +2 -2
- package/build-module/components/dataform-controls/textarea.mjs +2 -0
- package/build-module/components/dataform-controls/textarea.mjs.map +2 -2
- package/build-module/components/dataform-controls/toggle-group.mjs +3 -1
- package/build-module/components/dataform-controls/toggle-group.mjs.map +2 -2
- package/build-module/components/dataform-controls/toggle.mjs +3 -1
- package/build-module/components/dataform-controls/toggle.mjs.map +2 -2
- package/build-module/components/dataform-controls/utils/relative-date-control.mjs +5 -2
- package/build-module/components/dataform-controls/utils/relative-date-control.mjs.map +2 -2
- package/build-module/components/dataform-controls/utils/use-disabled-date-matchers.mjs +27 -0
- package/build-module/components/dataform-controls/utils/use-disabled-date-matchers.mjs.map +7 -0
- package/build-module/components/dataform-controls/utils/validated-input.mjs +2 -0
- package/build-module/components/dataform-controls/utils/validated-input.mjs.map +2 -2
- package/build-module/components/dataform-controls/utils/validated-number.mjs +3 -1
- package/build-module/components/dataform-controls/utils/validated-number.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/dataform-layouts/panel/summary-button.mjs +0 -1
- package/build-module/components/dataform-layouts/panel/summary-button.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-filters/input-widget.mjs +4 -0
- package/build-module/components/dataviews-filters/input-widget.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-layouts/grid/composite-grid.mjs +387 -250
- package/build-module/components/dataviews-layouts/grid/composite-grid.mjs.map +2 -2
- package/build-module/components/dataviews-layouts/picker-grid/index.mjs +64 -31
- package/build-module/components/dataviews-layouts/picker-grid/index.mjs.map +2 -2
- package/build-module/components/dataviews-layouts/picker-table/index.mjs +45 -30
- package/build-module/components/dataviews-layouts/picker-table/index.mjs.map +2 -2
- package/build-module/components/dataviews-layouts/table/index.mjs +0 -1
- package/build-module/components/dataviews-layouts/table/index.mjs.map +2 -2
- 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-pagination/index.mjs +1 -0
- package/build-module/components/dataviews-pagination/index.mjs.map +2 -2
- 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 +55 -47
- package/build-module/dataviews/index.mjs.map +2 -2
- package/build-module/dataviews-picker/index.mjs +49 -35
- package/build-module/dataviews-picker/index.mjs.map +2 -2
- package/build-module/field-types/date.mjs +4 -1
- package/build-module/field-types/date.mjs.map +2 -2
- package/build-module/field-types/datetime.mjs +4 -1
- package/build-module/field-types/datetime.mjs.map +2 -2
- package/build-module/field-types/index.mjs +1 -0
- package/build-module/field-types/index.mjs.map +2 -2
- package/build-module/field-types/utils/get-is-valid.mjs +29 -24
- package/build-module/field-types/utils/get-is-valid.mjs.map +2 -2
- package/build-module/field-types/utils/is-valid-date-boundary.mjs +38 -0
- package/build-module/field-types/utils/is-valid-date-boundary.mjs.map +7 -0
- 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 +75 -52
- package/build-style/style.css +75 -52
- package/build-types/components/dataform-controls/array.d.ts.map +1 -1
- package/build-types/components/dataform-controls/checkbox.d.ts.map +1 -1
- package/build-types/components/dataform-controls/color.d.ts.map +1 -1
- package/build-types/components/dataform-controls/date.d.ts.map +1 -1
- 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-controls/password.d.ts.map +1 -1
- package/build-types/components/dataform-controls/radio.d.ts.map +1 -1
- package/build-types/components/dataform-controls/select.d.ts.map +1 -1
- package/build-types/components/dataform-controls/textarea.d.ts.map +1 -1
- package/build-types/components/dataform-controls/toggle-group.d.ts.map +1 -1
- package/build-types/components/dataform-controls/toggle.d.ts.map +1 -1
- package/build-types/components/dataform-controls/utils/relative-date-control.d.ts.map +1 -1
- package/build-types/components/dataform-controls/utils/use-disabled-date-matchers.d.ts +16 -0
- package/build-types/components/dataform-controls/utils/use-disabled-date-matchers.d.ts.map +1 -0
- package/build-types/components/dataform-controls/utils/validated-input.d.ts.map +1 -1
- package/build-types/components/dataform-controls/utils/validated-number.d.ts.map +1 -1
- package/build-types/components/dataform-layouts/card/index.d.ts.map +1 -1
- package/build-types/components/dataform-layouts/panel/summary-button.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 +3 -3
- package/build-types/components/dataviews-context/index.d.ts.map +1 -1
- package/build-types/components/dataviews-filters/input-widget.d.ts.map +1 -1
- package/build-types/components/dataviews-footer/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 +6 -6
- 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/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-pagination/index.d.ts.map +1 -1
- package/build-types/components/dataviews-picker-footer/index.d.ts.map +1 -1
- package/build-types/components/dataviews-search/index.d.ts +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/constants.d.ts +2 -2
- package/build-types/dataform/stories/index.story.d.ts +11 -1
- package/build-types/dataform/stories/index.story.d.ts.map +1 -1
- package/build-types/dataform/stories/layout-regular.d.ts +2 -1
- package/build-types/dataform/stories/layout-regular.d.ts.map +1 -1
- package/build-types/dataform/stories/validation.d.ts.map +1 -1
- package/build-types/dataviews/index.d.ts +1 -2
- package/build-types/dataviews/index.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 +11 -0
- 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/with-card.d.ts.map +1 -1
- package/build-types/dataviews-picker/index.d.ts +3 -3
- 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/array.d.ts +1 -1
- package/build-types/field-types/array.d.ts.map +1 -1
- package/build-types/field-types/boolean.d.ts +1 -1
- package/build-types/field-types/boolean.d.ts.map +1 -1
- package/build-types/field-types/color.d.ts +1 -1
- package/build-types/field-types/color.d.ts.map +1 -1
- package/build-types/field-types/date.d.ts +3 -0
- package/build-types/field-types/date.d.ts.map +1 -1
- package/build-types/field-types/datetime.d.ts +3 -0
- package/build-types/field-types/datetime.d.ts.map +1 -1
- package/build-types/field-types/email.d.ts +1 -1
- package/build-types/field-types/email.d.ts.map +1 -1
- package/build-types/field-types/index.d.ts.map +1 -1
- package/build-types/field-types/integer.d.ts +1 -1
- package/build-types/field-types/integer.d.ts.map +1 -1
- package/build-types/field-types/number.d.ts +1 -1
- package/build-types/field-types/number.d.ts.map +1 -1
- package/build-types/field-types/stories/index.story.d.ts +37 -15
- package/build-types/field-types/stories/index.story.d.ts.map +1 -1
- package/build-types/field-types/utils/get-is-valid.d.ts.map +1 -1
- package/build-types/field-types/utils/is-valid-date-boundary.d.ts +7 -0
- package/build-types/field-types/utils/is-valid-date-boundary.d.ts.map +1 -0
- 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 +39 -13
- 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 +3264 -2713
- package/package.json +19 -19
- package/src/components/dataform-controls/array.tsx +2 -0
- package/src/components/dataform-controls/checkbox.tsx +2 -0
- package/src/components/dataform-controls/color.tsx +7 -0
- package/src/components/dataform-controls/date.tsx +30 -4
- package/src/components/dataform-controls/datetime.tsx +36 -11
- package/src/components/dataform-controls/password.tsx +3 -0
- package/src/components/dataform-controls/radio.tsx +2 -0
- package/src/components/dataform-controls/select.tsx +2 -0
- package/src/components/dataform-controls/textarea.tsx +2 -0
- package/src/components/dataform-controls/toggle-group.tsx +2 -0
- package/src/components/dataform-controls/toggle.tsx +2 -0
- package/src/components/dataform-controls/utils/relative-date-control.tsx +3 -0
- package/src/components/dataform-controls/utils/use-disabled-date-matchers.ts +48 -0
- package/src/components/dataform-controls/utils/validated-input.tsx +2 -0
- package/src/components/dataform-controls/utils/validated-number.tsx +2 -0
- package/src/components/dataform-layouts/card/index.tsx +171 -146
- package/src/components/dataform-layouts/card/style.scss +8 -5
- package/src/components/dataform-layouts/panel/style.scss +4 -5
- package/src/components/dataform-layouts/panel/summary-button.tsx +0 -1
- package/src/components/dataviews-bulk-actions/index.tsx +28 -1
- package/src/components/dataviews-context/index.ts +4 -4
- package/src/components/dataviews-filters/input-widget.tsx +4 -0
- package/src/components/dataviews-filters/style.scss +2 -2
- package/src/components/dataviews-footer/index.tsx +1 -6
- package/src/components/dataviews-layouts/activity/style.scss +3 -3
- package/src/components/dataviews-layouts/grid/composite-grid.tsx +433 -284
- package/src/components/dataviews-layouts/grid/style.scss +5 -1
- package/src/components/dataviews-layouts/list/style.scss +1 -1
- package/src/components/dataviews-layouts/picker-grid/index.tsx +49 -15
- package/src/components/dataviews-layouts/picker-grid/style.scss +1 -1
- package/src/components/dataviews-layouts/picker-table/index.tsx +45 -23
- package/src/components/dataviews-layouts/picker-table/style.scss +1 -1
- package/src/components/dataviews-layouts/table/index.tsx +0 -2
- package/src/components/dataviews-layouts/utils/use-infinite-scroll.ts +64 -0
- package/src/components/dataviews-pagination/index.tsx +1 -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/dataform/stories/content.story.tsx +1 -1
- package/src/dataform/stories/data-adapter.tsx +6 -6
- package/src/dataform/stories/index.story.tsx +7 -0
- package/src/dataform/stories/layout-card.tsx +5 -5
- package/src/dataform/stories/layout-details.tsx +5 -5
- package/src/dataform/stories/layout-panel.tsx +9 -9
- package/src/dataform/stories/layout-regular.tsx +31 -10
- package/src/dataform/stories/layout-row.tsx +9 -9
- package/src/dataform/stories/validation.tsx +25 -10
- package/src/dataviews/index.tsx +68 -59
- package/src/dataviews/stories/empty.tsx +4 -4
- package/src/dataviews/stories/fixtures.tsx +288 -0
- package/src/dataviews/stories/free-composition.tsx +14 -13
- package/src/dataviews/stories/index.story.tsx +19 -2
- package/src/dataviews/stories/infinite-scroll.tsx +16 -96
- package/src/dataviews/stories/layout-custom.tsx +1 -1
- package/src/dataviews/stories/layout-grid.tsx +1 -1
- package/src/dataviews/stories/layout-list.tsx +1 -1
- package/src/dataviews/stories/layout-table.tsx +1 -1
- package/src/dataviews/stories/minimal-ui.tsx +1 -1
- package/src/dataviews/stories/with-card.tsx +30 -23
- package/src/dataviews/style.scss +6 -8
- package/src/dataviews/test/dataviews.tsx +94 -15
- package/src/dataviews-picker/index.tsx +57 -41
- package/src/dataviews-picker/stories/fixtures.tsx +270 -0
- package/src/dataviews-picker/stories/index.story.tsx +62 -133
- package/src/dataviews-picker/test/dataviews-picker.tsx +79 -2
- package/src/field-types/date.tsx +3 -0
- package/src/field-types/datetime.tsx +3 -0
- package/src/field-types/index.tsx +4 -0
- package/src/field-types/stories/index.story.tsx +79 -6
- package/src/field-types/test/normalize-fields.ts +44 -0
- package/src/field-types/utils/get-is-valid.ts +44 -31
- package/src/field-types/utils/is-valid-date-boundary.ts +80 -0
- package/src/hooks/index.ts +3 -0
- package/src/hooks/test/use-data.ts +791 -0
- package/src/hooks/test/use-form-validity.ts +479 -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/types/dataviews.ts +17 -1
- package/src/types/field-api.ts +43 -12
- 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
|
@@ -123,7 +123,7 @@ const fields: Field< SamplePost >[] = [
|
|
|
123
123
|
},
|
|
124
124
|
{
|
|
125
125
|
id: 'filesize',
|
|
126
|
-
label: 'File
|
|
126
|
+
label: 'File size',
|
|
127
127
|
type: 'integer',
|
|
128
128
|
readOnly: true,
|
|
129
129
|
},
|
|
@@ -170,7 +170,7 @@ const fields: Field< SamplePost >[] = [
|
|
|
170
170
|
},
|
|
171
171
|
{
|
|
172
172
|
id: 'longDescription',
|
|
173
|
-
label: 'Long
|
|
173
|
+
label: 'Long description',
|
|
174
174
|
type: 'text',
|
|
175
175
|
Edit: {
|
|
176
176
|
control: 'textarea',
|
|
@@ -179,7 +179,7 @@ const fields: Field< SamplePost >[] = [
|
|
|
179
179
|
},
|
|
180
180
|
{
|
|
181
181
|
id: 'comment_status',
|
|
182
|
-
label: 'Comment
|
|
182
|
+
label: 'Comment status',
|
|
183
183
|
type: 'text',
|
|
184
184
|
Edit: 'radio',
|
|
185
185
|
elements: [
|
|
@@ -189,7 +189,7 @@ const fields: Field< SamplePost >[] = [
|
|
|
189
189
|
},
|
|
190
190
|
{
|
|
191
191
|
id: 'ping_status',
|
|
192
|
-
label: 'Allow
|
|
192
|
+
label: 'Allow pings/trackbacks',
|
|
193
193
|
type: 'boolean',
|
|
194
194
|
},
|
|
195
195
|
{
|
|
@@ -223,7 +223,7 @@ const fields: Field< SamplePost >[] = [
|
|
|
223
223
|
},
|
|
224
224
|
{
|
|
225
225
|
id: 'flight_status',
|
|
226
|
-
label: 'Flight
|
|
226
|
+
label: 'Flight status',
|
|
227
227
|
type: 'text',
|
|
228
228
|
Edit: 'radio',
|
|
229
229
|
elements: [
|
|
@@ -133,7 +133,7 @@ const fields: Field< SamplePost >[] = [
|
|
|
133
133
|
},
|
|
134
134
|
{
|
|
135
135
|
id: 'filesize',
|
|
136
|
-
label: 'File
|
|
136
|
+
label: 'File size',
|
|
137
137
|
type: 'integer',
|
|
138
138
|
readOnly: true,
|
|
139
139
|
},
|
|
@@ -180,7 +180,7 @@ const fields: Field< SamplePost >[] = [
|
|
|
180
180
|
},
|
|
181
181
|
{
|
|
182
182
|
id: 'longDescription',
|
|
183
|
-
label: 'Long
|
|
183
|
+
label: 'Long description',
|
|
184
184
|
type: 'text',
|
|
185
185
|
Edit: {
|
|
186
186
|
control: 'textarea',
|
|
@@ -189,7 +189,7 @@ const fields: Field< SamplePost >[] = [
|
|
|
189
189
|
},
|
|
190
190
|
{
|
|
191
191
|
id: 'comment_status',
|
|
192
|
-
label: 'Comment
|
|
192
|
+
label: 'Comment status',
|
|
193
193
|
type: 'text',
|
|
194
194
|
Edit: 'radio',
|
|
195
195
|
elements: [
|
|
@@ -199,7 +199,7 @@ const fields: Field< SamplePost >[] = [
|
|
|
199
199
|
},
|
|
200
200
|
{
|
|
201
201
|
id: 'ping_status',
|
|
202
|
-
label: 'Allow
|
|
202
|
+
label: 'Allow pings/trackbacks',
|
|
203
203
|
type: 'boolean',
|
|
204
204
|
},
|
|
205
205
|
{
|
|
@@ -233,7 +233,7 @@ const fields: Field< SamplePost >[] = [
|
|
|
233
233
|
},
|
|
234
234
|
{
|
|
235
235
|
id: 'flight_status',
|
|
236
|
-
label: 'Flight
|
|
236
|
+
label: 'Flight status',
|
|
237
237
|
type: 'text',
|
|
238
238
|
Edit: 'radio',
|
|
239
239
|
elements: [
|
|
@@ -360,7 +360,7 @@ const LayoutPanelComponent = ( {
|
|
|
360
360
|
'title',
|
|
361
361
|
{
|
|
362
362
|
id: 'status',
|
|
363
|
-
label: 'Status &
|
|
363
|
+
label: 'Status & visibility',
|
|
364
364
|
children: [ 'status', 'password' ],
|
|
365
365
|
},
|
|
366
366
|
'order',
|
|
@@ -375,12 +375,12 @@ const LayoutPanelComponent = ( {
|
|
|
375
375
|
},
|
|
376
376
|
{
|
|
377
377
|
id: 'address1',
|
|
378
|
-
label: 'Combined
|
|
378
|
+
label: 'Combined address',
|
|
379
379
|
children: [ 'address1', 'address2', 'city' ],
|
|
380
380
|
},
|
|
381
381
|
{
|
|
382
382
|
id: 'flight_info',
|
|
383
|
-
label: 'Flight
|
|
383
|
+
label: 'Flight information',
|
|
384
384
|
children: [
|
|
385
385
|
'origin',
|
|
386
386
|
'destination',
|
|
@@ -396,7 +396,7 @@ const LayoutPanelComponent = ( {
|
|
|
396
396
|
},
|
|
397
397
|
{
|
|
398
398
|
id: 'passenger_details',
|
|
399
|
-
label: 'Passenger
|
|
399
|
+
label: 'Passenger details',
|
|
400
400
|
children: [ 'author', 'seat' ],
|
|
401
401
|
layout: getPanelLayoutFromStoryArgs( {
|
|
402
402
|
summary: [ 'author', 'seat' ],
|
|
@@ -55,11 +55,16 @@ const fields: Field< SamplePost >[] = [
|
|
|
55
55
|
{
|
|
56
56
|
id: 'date',
|
|
57
57
|
label: 'Date',
|
|
58
|
+
type: 'date',
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
id: 'datetime',
|
|
62
|
+
label: 'DateTime',
|
|
58
63
|
type: 'datetime',
|
|
59
64
|
},
|
|
60
65
|
{
|
|
61
66
|
id: 'birthdate',
|
|
62
|
-
label: '
|
|
67
|
+
label: 'DateTime as options',
|
|
63
68
|
type: 'datetime',
|
|
64
69
|
elements: [
|
|
65
70
|
{ value: '', label: 'Select a date' },
|
|
@@ -126,11 +131,11 @@ const fields: Field< SamplePost >[] = [
|
|
|
126
131
|
id: 'can_comment',
|
|
127
132
|
label: 'Allow people to leave a comment',
|
|
128
133
|
type: 'boolean',
|
|
129
|
-
Edit: '
|
|
134
|
+
Edit: 'toggle',
|
|
130
135
|
},
|
|
131
136
|
{
|
|
132
137
|
id: 'filesize',
|
|
133
|
-
label: 'File
|
|
138
|
+
label: 'File size',
|
|
134
139
|
type: 'integer',
|
|
135
140
|
readOnly: true,
|
|
136
141
|
},
|
|
@@ -177,7 +182,7 @@ const fields: Field< SamplePost >[] = [
|
|
|
177
182
|
},
|
|
178
183
|
{
|
|
179
184
|
id: 'longDescription',
|
|
180
|
-
label: 'Long
|
|
185
|
+
label: 'Long description',
|
|
181
186
|
type: 'text',
|
|
182
187
|
Edit: {
|
|
183
188
|
control: 'textarea',
|
|
@@ -186,7 +191,7 @@ const fields: Field< SamplePost >[] = [
|
|
|
186
191
|
},
|
|
187
192
|
{
|
|
188
193
|
id: 'comment_status',
|
|
189
|
-
label: 'Comment
|
|
194
|
+
label: 'Comment status',
|
|
190
195
|
type: 'text',
|
|
191
196
|
Edit: 'radio',
|
|
192
197
|
elements: [
|
|
@@ -196,7 +201,7 @@ const fields: Field< SamplePost >[] = [
|
|
|
196
201
|
},
|
|
197
202
|
{
|
|
198
203
|
id: 'ping_status',
|
|
199
|
-
label: 'Allow
|
|
204
|
+
label: 'Allow pings/trackbacks',
|
|
200
205
|
type: 'boolean',
|
|
201
206
|
},
|
|
202
207
|
{
|
|
@@ -230,7 +235,7 @@ const fields: Field< SamplePost >[] = [
|
|
|
230
235
|
},
|
|
231
236
|
{
|
|
232
237
|
id: 'flight_status',
|
|
233
|
-
label: 'Flight
|
|
238
|
+
label: 'Flight status',
|
|
234
239
|
type: 'text',
|
|
235
240
|
Edit: 'radio',
|
|
236
241
|
elements: [
|
|
@@ -312,8 +317,10 @@ const getLayoutFromStoryArgs = ( {
|
|
|
312
317
|
|
|
313
318
|
const LayoutRegularComponent = ( {
|
|
314
319
|
labelPosition,
|
|
320
|
+
disabled = false,
|
|
315
321
|
}: {
|
|
316
322
|
labelPosition: 'default' | 'top' | 'side' | 'none';
|
|
323
|
+
disabled?: boolean;
|
|
317
324
|
} ) => {
|
|
318
325
|
const [ post, setPost ] = useState( {
|
|
319
326
|
title: 'Hello, World!',
|
|
@@ -322,7 +329,8 @@ const LayoutRegularComponent = ( {
|
|
|
322
329
|
status: 'draft',
|
|
323
330
|
reviewer: 'fulano',
|
|
324
331
|
email: 'hello@wordpress.org',
|
|
325
|
-
date: '2021-01-
|
|
332
|
+
date: '2021-01-01',
|
|
333
|
+
datetime: '2021-01-01T12:00:00',
|
|
326
334
|
birthdate: '1950-02-23T12:00:00',
|
|
327
335
|
sticky: false,
|
|
328
336
|
can_comment: false,
|
|
@@ -332,6 +340,18 @@ const LayoutRegularComponent = ( {
|
|
|
332
340
|
description: 'This is a sample description.',
|
|
333
341
|
} );
|
|
334
342
|
|
|
343
|
+
// Make fields disabled when control is set to disabled.
|
|
344
|
+
const _fields: Field< SamplePost >[] = useMemo( () => {
|
|
345
|
+
if ( ! disabled ) {
|
|
346
|
+
return fields;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
return fields.map( ( field ) => ( {
|
|
350
|
+
...field,
|
|
351
|
+
isDisabled: true,
|
|
352
|
+
} ) );
|
|
353
|
+
}, [ disabled ] );
|
|
354
|
+
|
|
335
355
|
const form: Form = useMemo(
|
|
336
356
|
() => ( {
|
|
337
357
|
layout: getLayoutFromStoryArgs( {
|
|
@@ -342,14 +362,15 @@ const LayoutRegularComponent = ( {
|
|
|
342
362
|
'title',
|
|
343
363
|
'order',
|
|
344
364
|
'sticky',
|
|
365
|
+
'can_comment',
|
|
345
366
|
'author',
|
|
346
367
|
'status',
|
|
347
368
|
'reviewer',
|
|
348
369
|
'email',
|
|
349
370
|
'password',
|
|
350
371
|
'date',
|
|
372
|
+
'datetime',
|
|
351
373
|
'birthdate',
|
|
352
|
-
'can_comment',
|
|
353
374
|
'filesize',
|
|
354
375
|
'dimensions',
|
|
355
376
|
'tags',
|
|
@@ -363,7 +384,7 @@ const LayoutRegularComponent = ( {
|
|
|
363
384
|
return (
|
|
364
385
|
<DataForm< SamplePost >
|
|
365
386
|
data={ post }
|
|
366
|
-
fields={
|
|
387
|
+
fields={ _fields }
|
|
367
388
|
form={ form }
|
|
368
389
|
onChange={ ( edits ) =>
|
|
369
390
|
setPost( ( prev ) => ( {
|
|
@@ -42,7 +42,7 @@ const LayoutRowComponent = ( {
|
|
|
42
42
|
const customerFields: Field< Customer >[] = [
|
|
43
43
|
{
|
|
44
44
|
id: 'name',
|
|
45
|
-
label: 'Customer
|
|
45
|
+
label: 'Customer name',
|
|
46
46
|
type: 'text',
|
|
47
47
|
},
|
|
48
48
|
{
|
|
@@ -57,37 +57,37 @@ const LayoutRowComponent = ( {
|
|
|
57
57
|
},
|
|
58
58
|
{
|
|
59
59
|
id: 'shippingAddress',
|
|
60
|
-
label: 'Shipping
|
|
60
|
+
label: 'Shipping address',
|
|
61
61
|
type: 'text',
|
|
62
62
|
},
|
|
63
63
|
{
|
|
64
64
|
id: 'shippingCity',
|
|
65
|
-
label: 'Shipping
|
|
65
|
+
label: 'Shipping city',
|
|
66
66
|
type: 'text',
|
|
67
67
|
},
|
|
68
68
|
{
|
|
69
69
|
id: 'shippingPostalCode',
|
|
70
|
-
label: 'Shipping
|
|
70
|
+
label: 'Shipping postal code',
|
|
71
71
|
type: 'text',
|
|
72
72
|
},
|
|
73
73
|
{
|
|
74
74
|
id: 'shippingCountry',
|
|
75
|
-
label: 'Shipping
|
|
75
|
+
label: 'Shipping country',
|
|
76
76
|
type: 'text',
|
|
77
77
|
},
|
|
78
78
|
{
|
|
79
79
|
id: 'billingAddress',
|
|
80
|
-
label: 'Billing
|
|
80
|
+
label: 'Billing address',
|
|
81
81
|
type: 'text',
|
|
82
82
|
},
|
|
83
83
|
{
|
|
84
84
|
id: 'billingCity',
|
|
85
|
-
label: 'Billing
|
|
85
|
+
label: 'Billing city',
|
|
86
86
|
type: 'text',
|
|
87
87
|
},
|
|
88
88
|
{
|
|
89
89
|
id: 'billingPostalCode',
|
|
90
|
-
label: 'Billing
|
|
90
|
+
label: 'Billing postal code',
|
|
91
91
|
type: 'text',
|
|
92
92
|
},
|
|
93
93
|
{
|
|
@@ -102,7 +102,7 @@ const LayoutRowComponent = ( {
|
|
|
102
102
|
},
|
|
103
103
|
{
|
|
104
104
|
id: 'hasDiscount',
|
|
105
|
-
label: 'Has
|
|
105
|
+
label: 'Has discount?',
|
|
106
106
|
type: 'boolean',
|
|
107
107
|
},
|
|
108
108
|
{
|
|
@@ -739,7 +739,7 @@ const ValidationComponent = ( {
|
|
|
739
739
|
},
|
|
740
740
|
{
|
|
741
741
|
id: 'customEdit',
|
|
742
|
-
label: 'Custom
|
|
742
|
+
label: 'Custom control',
|
|
743
743
|
Edit: CustomEditControl,
|
|
744
744
|
isValid: {
|
|
745
745
|
required,
|
|
@@ -783,7 +783,7 @@ const ValidationComponent = ( {
|
|
|
783
783
|
{
|
|
784
784
|
id: 'toggleGroup',
|
|
785
785
|
type: 'text',
|
|
786
|
-
label: 'Toggle
|
|
786
|
+
label: 'Toggle group',
|
|
787
787
|
Edit: 'toggleGroup',
|
|
788
788
|
elements:
|
|
789
789
|
elements === 'async'
|
|
@@ -849,31 +849,46 @@ const ValidationComponent = ( {
|
|
|
849
849
|
id: 'date',
|
|
850
850
|
type: 'date',
|
|
851
851
|
label: 'Date',
|
|
852
|
+
description: minMax
|
|
853
|
+
? 'Must be between Apr 1 and Apr 20, 2026'
|
|
854
|
+
: undefined,
|
|
852
855
|
isValid: {
|
|
853
856
|
required,
|
|
854
857
|
elements: elements !== 'none' ? true : false,
|
|
855
858
|
custom: maybeCustomRule( customDateRule ),
|
|
859
|
+
min: minMax ? '2026-04-01' : undefined,
|
|
860
|
+
max: minMax ? '2026-04-20' : undefined,
|
|
856
861
|
},
|
|
857
862
|
},
|
|
858
863
|
{
|
|
859
864
|
id: 'dateRange',
|
|
860
865
|
type: 'date',
|
|
861
|
-
label: 'Date
|
|
866
|
+
label: 'Date range',
|
|
862
867
|
Edit: DateRangeEdit,
|
|
868
|
+
description: minMax
|
|
869
|
+
? 'Must be between Apr 1 and Apr 20, 2026'
|
|
870
|
+
: undefined,
|
|
863
871
|
isValid: {
|
|
864
872
|
required,
|
|
865
873
|
elements: elements !== 'none' ? true : false,
|
|
866
874
|
custom: maybeCustomRule( customDateRangeRule ),
|
|
875
|
+
min: minMax ? '2026-04-01' : undefined,
|
|
876
|
+
max: minMax ? '2026-04-20' : undefined,
|
|
867
877
|
},
|
|
868
878
|
},
|
|
869
879
|
{
|
|
870
880
|
id: 'datetime',
|
|
871
881
|
type: 'datetime',
|
|
872
|
-
label: 'Date
|
|
882
|
+
label: 'Date time',
|
|
883
|
+
description: minMax
|
|
884
|
+
? 'Must be between Apr 1 and Apr 20, 2026'
|
|
885
|
+
: undefined,
|
|
873
886
|
isValid: {
|
|
874
887
|
required,
|
|
875
888
|
elements: elements !== 'none' ? true : false,
|
|
876
889
|
custom: maybeCustomRule( customDateTimeRule ),
|
|
890
|
+
min: minMax ? '2026-04-01T00:00:00.000Z' : undefined,
|
|
891
|
+
max: minMax ? '2026-04-20T23:59:59.000Z' : undefined,
|
|
877
892
|
},
|
|
878
893
|
},
|
|
879
894
|
];
|
|
@@ -947,34 +962,34 @@ const ValidationComponent = ( {
|
|
|
947
962
|
const groupedFields = [
|
|
948
963
|
{
|
|
949
964
|
id: 'textFields',
|
|
950
|
-
label: 'Text
|
|
965
|
+
label: 'Text fields',
|
|
951
966
|
children: [ 'text', 'textarea', 'password', 'customEdit' ],
|
|
952
967
|
},
|
|
953
968
|
{
|
|
954
969
|
id: 'numberFields',
|
|
955
|
-
label: 'Number
|
|
970
|
+
label: 'Number fields',
|
|
956
971
|
children: [ 'integer', 'number' ],
|
|
957
972
|
},
|
|
958
973
|
{
|
|
959
974
|
id: 'contactFields',
|
|
960
|
-
label: 'Contact
|
|
975
|
+
label: 'Contact fields',
|
|
961
976
|
children: [ 'email', 'telephone', 'url' ],
|
|
962
977
|
},
|
|
963
978
|
{
|
|
964
979
|
id: 'selectFields',
|
|
965
|
-
label: 'Selection
|
|
980
|
+
label: 'Selection fields',
|
|
966
981
|
children: [ 'select', 'combobox', 'textWithRadio' ],
|
|
967
982
|
},
|
|
968
983
|
{
|
|
969
984
|
id: 'booleanFields',
|
|
970
|
-
label: 'Boolean
|
|
985
|
+
label: 'Boolean fields',
|
|
971
986
|
children: [ 'boolean', 'toggle', 'toggleGroup' ],
|
|
972
987
|
},
|
|
973
988
|
{ id: 'color' },
|
|
974
989
|
{ id: 'array' },
|
|
975
990
|
{
|
|
976
991
|
id: 'dateFields',
|
|
977
|
-
label: 'Date
|
|
992
|
+
label: 'Date fields',
|
|
978
993
|
children: [ 'date', 'dateRange', 'datetime' ],
|
|
979
994
|
},
|
|
980
995
|
];
|
package/src/dataviews/index.tsx
CHANGED
|
@@ -2,12 +2,19 @@
|
|
|
2
2
|
* External dependencies
|
|
3
3
|
*/
|
|
4
4
|
import type { ReactNode, ComponentProps, ReactElement } from 'react';
|
|
5
|
+
import clsx from 'clsx';
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* WordPress dependencies
|
|
8
9
|
*/
|
|
9
|
-
import {
|
|
10
|
-
|
|
10
|
+
import {
|
|
11
|
+
useContext,
|
|
12
|
+
useEffect,
|
|
13
|
+
useMemo,
|
|
14
|
+
useRef,
|
|
15
|
+
useState,
|
|
16
|
+
} from '@wordpress/element';
|
|
17
|
+
import { useResizeObserver } from '@wordpress/compose';
|
|
11
18
|
import { Stack } from '@wordpress/ui';
|
|
12
19
|
|
|
13
20
|
/**
|
|
@@ -32,6 +39,7 @@ import DataViewsViewConfig, {
|
|
|
32
39
|
} from '../components/dataviews-view-config';
|
|
33
40
|
import normalizeFields from '../field-types';
|
|
34
41
|
import useData from '../hooks/use-data';
|
|
42
|
+
import { useInfiniteScroll } from '../hooks/use-infinite-scroll';
|
|
35
43
|
import type { Action, Field, View, SupportedLayouts } from '../types';
|
|
36
44
|
import type { SelectionOrUpdater } from '../types/private';
|
|
37
45
|
type ItemWithId = { id: string };
|
|
@@ -48,9 +56,8 @@ type DataViewsProps< Item > = {
|
|
|
48
56
|
paginationInfo: {
|
|
49
57
|
totalItems: number;
|
|
50
58
|
totalPages: number;
|
|
51
|
-
infiniteScrollHandler?: () => void;
|
|
52
59
|
};
|
|
53
|
-
defaultLayouts
|
|
60
|
+
defaultLayouts?: SupportedLayouts;
|
|
54
61
|
selection?: string[];
|
|
55
62
|
onChangeSelection?: ( items: string[] ) => void;
|
|
56
63
|
onClickItem?: ( item: Item ) => void;
|
|
@@ -75,6 +82,7 @@ type DataViewsProps< Item > = {
|
|
|
75
82
|
const defaultGetItemId = ( item: ItemWithId ) => item.id;
|
|
76
83
|
const defaultIsItemClickable = () => true;
|
|
77
84
|
const EMPTY_ARRAY: any[] = [];
|
|
85
|
+
const DEFAULT_LAYOUTS: SupportedLayouts = { table: {}, grid: {}, list: {} };
|
|
78
86
|
|
|
79
87
|
const dataViewsLayouts = VIEW_LAYOUTS.filter(
|
|
80
88
|
( viewLayout ) => ! viewLayout.isPicker
|
|
@@ -90,13 +98,18 @@ function DefaultUI( {
|
|
|
90
98
|
search = true,
|
|
91
99
|
searchLabel = undefined,
|
|
92
100
|
}: DefaultUIProps ) {
|
|
101
|
+
const { view } = useContext( DataViewsContext );
|
|
102
|
+
const isInfiniteScroll = view.infiniteScrollEnabled;
|
|
93
103
|
return (
|
|
94
104
|
<>
|
|
95
105
|
<Stack
|
|
96
106
|
direction="row"
|
|
97
107
|
align="top"
|
|
98
108
|
justify="space-between"
|
|
99
|
-
className=
|
|
109
|
+
className={ clsx( 'dataviews__view-actions', {
|
|
110
|
+
'dataviews__view-actions--infinite-scroll':
|
|
111
|
+
isInfiniteScroll,
|
|
112
|
+
} ) }
|
|
100
113
|
gap="xs"
|
|
101
114
|
>
|
|
102
115
|
<Stack
|
|
@@ -132,7 +145,7 @@ function DataViews< Item >( {
|
|
|
132
145
|
getItemLevel,
|
|
133
146
|
isLoading = false,
|
|
134
147
|
paginationInfo,
|
|
135
|
-
defaultLayouts: defaultLayoutsProperty,
|
|
148
|
+
defaultLayouts: defaultLayoutsProperty = DEFAULT_LAYOUTS,
|
|
136
149
|
selection: selectionProperty,
|
|
137
150
|
onChangeSelection,
|
|
138
151
|
onClickItem,
|
|
@@ -144,7 +157,31 @@ function DataViews< Item >( {
|
|
|
144
157
|
empty,
|
|
145
158
|
onReset,
|
|
146
159
|
}: DataViewsProps< Item > ) {
|
|
147
|
-
const
|
|
160
|
+
const [ selectionState, setSelectionState ] = useState< string[] >( [] );
|
|
161
|
+
const isUncontrolled =
|
|
162
|
+
selectionProperty === undefined || onChangeSelection === undefined;
|
|
163
|
+
const selection = isUncontrolled ? selectionState : selectionProperty;
|
|
164
|
+
|
|
165
|
+
// useData handles both infinite scroll and standard pagination paths,
|
|
166
|
+
// preserving previous data while loading and tracking initial load state.
|
|
167
|
+
const {
|
|
168
|
+
data: displayData,
|
|
169
|
+
paginationInfo: displayPaginationInfo,
|
|
170
|
+
hasInitiallyLoaded,
|
|
171
|
+
setVisibleEntries,
|
|
172
|
+
} = useData( {
|
|
173
|
+
view,
|
|
174
|
+
data: data as any,
|
|
175
|
+
getItemId: getItemId as any,
|
|
176
|
+
isLoading,
|
|
177
|
+
selection,
|
|
178
|
+
paginationInfo,
|
|
179
|
+
} ) as {
|
|
180
|
+
data: ( Item & { position?: number } )[];
|
|
181
|
+
paginationInfo: { totalItems: number; totalPages: number };
|
|
182
|
+
hasInitiallyLoaded: boolean;
|
|
183
|
+
setVisibleEntries?: React.Dispatch< React.SetStateAction< number[] > >;
|
|
184
|
+
};
|
|
148
185
|
const containerRef = useRef< HTMLDivElement >( null );
|
|
149
186
|
const [ containerWidth, setContainerWidth ] = useState( 0 );
|
|
150
187
|
const resizeObserverRef = useResizeObserver(
|
|
@@ -155,10 +192,6 @@ function DataViews< Item >( {
|
|
|
155
192
|
},
|
|
156
193
|
{ box: 'border-box' }
|
|
157
194
|
);
|
|
158
|
-
const [ selectionState, setSelectionState ] = useState< string[] >( [] );
|
|
159
|
-
const isUncontrolled =
|
|
160
|
-
selectionProperty === undefined || onChangeSelection === undefined;
|
|
161
|
-
const selection = isUncontrolled ? selectionState : selectionProperty;
|
|
162
195
|
const [ openedFilter, setOpenedFilter ] = useState< string | null >( null );
|
|
163
196
|
function setSelectionWithChange( value: SelectionOrUpdater ) {
|
|
164
197
|
const newValue =
|
|
@@ -171,11 +204,16 @@ function DataViews< Item >( {
|
|
|
171
204
|
}
|
|
172
205
|
}
|
|
173
206
|
const _fields = useMemo( () => normalizeFields( fields ), [ fields ] );
|
|
207
|
+
// When infinite scroll is enabled, don't filter selection by current data
|
|
208
|
+
// because items may be scrolled out of view but still selected.
|
|
174
209
|
const _selection = useMemo( () => {
|
|
210
|
+
if ( view.infiniteScrollEnabled ) {
|
|
211
|
+
return selection;
|
|
212
|
+
}
|
|
175
213
|
return selection.filter( ( id ) =>
|
|
176
214
|
data.some( ( item ) => getItemId( item ) === id )
|
|
177
215
|
);
|
|
178
|
-
}, [ selection, data, getItemId ] );
|
|
216
|
+
}, [ selection, data, getItemId, view.infiniteScrollEnabled ] );
|
|
179
217
|
|
|
180
218
|
const filters = useFilters( _fields, view );
|
|
181
219
|
const hasPrimaryOrLockedFilters = useMemo(
|
|
@@ -189,64 +227,35 @@ function DataViews< Item >( {
|
|
|
189
227
|
hasPrimaryOrLockedFilters
|
|
190
228
|
);
|
|
191
229
|
|
|
230
|
+
const { intersectionObserver } = useInfiniteScroll( {
|
|
231
|
+
view,
|
|
232
|
+
onChangeView,
|
|
233
|
+
isLoading,
|
|
234
|
+
paginationInfo,
|
|
235
|
+
containerRef,
|
|
236
|
+
setVisibleEntries,
|
|
237
|
+
} );
|
|
238
|
+
|
|
192
239
|
useEffect( () => {
|
|
193
240
|
if ( hasPrimaryOrLockedFilters && ! isShowingFilter ) {
|
|
194
241
|
setIsShowingFilter( true );
|
|
195
242
|
}
|
|
196
243
|
}, [ hasPrimaryOrLockedFilters, isShowingFilter ] );
|
|
197
244
|
|
|
198
|
-
|
|
199
|
-
data: displayData,
|
|
200
|
-
paginationInfo: displayPaginationInfo,
|
|
201
|
-
hasInitiallyLoaded,
|
|
202
|
-
} = useData( data, isLoading, paginationInfo );
|
|
203
|
-
|
|
204
|
-
// Attach scroll event listener for infinite scroll
|
|
205
|
-
useEffect( () => {
|
|
206
|
-
if (
|
|
207
|
-
! hasInitiallyLoaded ||
|
|
208
|
-
! view.infiniteScrollEnabled ||
|
|
209
|
-
! containerRef.current
|
|
210
|
-
) {
|
|
211
|
-
return;
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
const handleScroll = throttle( ( event: unknown ) => {
|
|
215
|
-
const target = ( event as Event ).target as HTMLElement;
|
|
216
|
-
const scrollTop = target.scrollTop;
|
|
217
|
-
const scrollHeight = target.scrollHeight;
|
|
218
|
-
const clientHeight = target.clientHeight;
|
|
219
|
-
|
|
220
|
-
// Check if user has scrolled near the bottom
|
|
221
|
-
if ( scrollTop + clientHeight >= scrollHeight - 100 ) {
|
|
222
|
-
infiniteScrollHandler?.();
|
|
223
|
-
}
|
|
224
|
-
}, 100 ); // Throttle to 100ms
|
|
225
|
-
|
|
226
|
-
const container = containerRef.current;
|
|
227
|
-
container.addEventListener( 'scroll', handleScroll );
|
|
228
|
-
|
|
229
|
-
return () => {
|
|
230
|
-
container.removeEventListener( 'scroll', handleScroll );
|
|
231
|
-
handleScroll.cancel(); // Cancel any pending throttled calls
|
|
232
|
-
};
|
|
233
|
-
}, [
|
|
234
|
-
hasInitiallyLoaded,
|
|
235
|
-
infiniteScrollHandler,
|
|
236
|
-
view.infiniteScrollEnabled,
|
|
237
|
-
] );
|
|
238
|
-
|
|
239
|
-
// Filter out DataViewsPicker layouts.
|
|
245
|
+
// Filter out DataViewsPicker layouts and normalize `true` to `{}`.
|
|
240
246
|
const defaultLayouts = useMemo(
|
|
241
247
|
() =>
|
|
242
248
|
Object.fromEntries(
|
|
243
|
-
Object.entries( defaultLayoutsProperty )
|
|
244
|
-
( [ layoutType ] ) => {
|
|
249
|
+
Object.entries( defaultLayoutsProperty )
|
|
250
|
+
.filter( ( [ layoutType ] ) => {
|
|
245
251
|
return dataViewsLayouts.some(
|
|
246
252
|
( viewLayout ) => viewLayout.type === layoutType
|
|
247
253
|
);
|
|
248
|
-
}
|
|
249
|
-
|
|
254
|
+
} )
|
|
255
|
+
.map( ( [ key, value ] ) => [
|
|
256
|
+
key,
|
|
257
|
+
value === true ? {} : value,
|
|
258
|
+
] )
|
|
250
259
|
),
|
|
251
260
|
[ defaultLayoutsProperty ]
|
|
252
261
|
);
|
|
@@ -284,8 +293,8 @@ function DataViews< Item >( {
|
|
|
284
293
|
config,
|
|
285
294
|
empty,
|
|
286
295
|
hasInitiallyLoaded,
|
|
287
|
-
hasInfiniteScrollHandler: !! infiniteScrollHandler,
|
|
288
296
|
onReset,
|
|
297
|
+
intersectionObserver,
|
|
289
298
|
} }
|
|
290
299
|
>
|
|
291
300
|
<div className="dataviews-wrapper">
|
|
@@ -79,10 +79,10 @@ const EmptyComponent = ( {
|
|
|
79
79
|
onChangeView={ setView }
|
|
80
80
|
actions={ actions }
|
|
81
81
|
defaultLayouts={ {
|
|
82
|
-
[ LAYOUT_TABLE ]:
|
|
83
|
-
[ LAYOUT_GRID ]:
|
|
84
|
-
[ LAYOUT_LIST ]:
|
|
85
|
-
[ LAYOUT_ACTIVITY ]:
|
|
82
|
+
[ LAYOUT_TABLE ]: true,
|
|
83
|
+
[ LAYOUT_GRID ]: true,
|
|
84
|
+
[ LAYOUT_LIST ]: true,
|
|
85
|
+
[ LAYOUT_ACTIVITY ]: true,
|
|
86
86
|
} }
|
|
87
87
|
isLoading={ isLoading }
|
|
88
88
|
empty={ customEmpty ? <CustomEmptyComponent /> : undefined }
|