@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
|
@@ -6,7 +6,7 @@ import type { Meta } from '@storybook/react-vite';
|
|
|
6
6
|
/**
|
|
7
7
|
* WordPress dependencies
|
|
8
8
|
*/
|
|
9
|
-
import { useState, useMemo,
|
|
9
|
+
import { useState, useMemo, useEffect } from '@wordpress/element';
|
|
10
10
|
import { Modal, Button } from '@wordpress/components';
|
|
11
11
|
import { Stack } from '@wordpress/ui';
|
|
12
12
|
|
|
@@ -14,7 +14,7 @@ import { Stack } from '@wordpress/ui';
|
|
|
14
14
|
* Internal dependencies
|
|
15
15
|
*/
|
|
16
16
|
import DataViewsPicker from '../index';
|
|
17
|
-
import { LAYOUT_PICKER_GRID
|
|
17
|
+
import { LAYOUT_PICKER_GRID } from '../../constants';
|
|
18
18
|
import filterSortAndPaginate from '../../utils/filter-sort-and-paginate';
|
|
19
19
|
import type { ActionButton, View } from '../../types';
|
|
20
20
|
import { data, fields, type SpaceObject } from './fixtures';
|
|
@@ -70,32 +70,66 @@ const DataViewsPickerContent = ( {
|
|
|
70
70
|
actions: customActions,
|
|
71
71
|
selection: customSelection,
|
|
72
72
|
}: PickerContentProps ) => {
|
|
73
|
-
const [ view, setView ] = useState< View >( {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
73
|
+
const [ view, setView ] = useState< View >( () => {
|
|
74
|
+
const baseView: View = {
|
|
75
|
+
fields: [],
|
|
76
|
+
titleField: 'title',
|
|
77
|
+
mediaField: 'image',
|
|
78
|
+
search: '',
|
|
79
|
+
filters: [],
|
|
80
|
+
type: LAYOUT_PICKER_GRID,
|
|
81
|
+
groupBy: isGrouped
|
|
82
|
+
? { field: 'type', direction: 'asc' as const }
|
|
83
|
+
: undefined,
|
|
84
|
+
infiniteScrollEnabled,
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
if ( infiniteScrollEnabled ) {
|
|
88
|
+
return {
|
|
89
|
+
...baseView,
|
|
90
|
+
startPosition: 1,
|
|
91
|
+
perPage: 10,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return {
|
|
96
|
+
...baseView,
|
|
97
|
+
page: 1,
|
|
98
|
+
perPage: 10,
|
|
99
|
+
};
|
|
84
100
|
} );
|
|
85
|
-
const { data: shownData, paginationInfo
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
}, [ view ] );
|
|
101
|
+
const { data: shownData, paginationInfo } = useMemo( () => {
|
|
102
|
+
return filterSortAndPaginate( data, view, fields );
|
|
103
|
+
}, [ view ] );
|
|
89
104
|
|
|
90
105
|
useEffect( () => {
|
|
91
|
-
setView( ( prevView ) =>
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
106
|
+
setView( ( prevView ) => {
|
|
107
|
+
const baseUpdates = {
|
|
108
|
+
groupBy:
|
|
109
|
+
isGrouped && ! infiniteScrollEnabled
|
|
110
|
+
? { field: 'type', direction: 'asc' as const }
|
|
111
|
+
: undefined,
|
|
112
|
+
infiniteScrollEnabled,
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
if ( infiniteScrollEnabled ) {
|
|
116
|
+
return {
|
|
117
|
+
...prevView,
|
|
118
|
+
...baseUpdates,
|
|
119
|
+
startPosition: 1,
|
|
120
|
+
perPage: 15,
|
|
121
|
+
page: undefined,
|
|
122
|
+
} as View;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return {
|
|
126
|
+
...prevView,
|
|
127
|
+
...baseUpdates,
|
|
128
|
+
page: prevView.page ?? 1,
|
|
129
|
+
perPage: prevView.perPage ?? 10,
|
|
130
|
+
startPosition: undefined,
|
|
131
|
+
} as View;
|
|
132
|
+
} );
|
|
99
133
|
}, [ isGrouped, infiniteScrollEnabled ] );
|
|
100
134
|
|
|
101
135
|
const [ selection, setSelection ] = useState< string[] >(
|
|
@@ -129,24 +163,12 @@ const DataViewsPickerContent = ( {
|
|
|
129
163
|
},
|
|
130
164
|
];
|
|
131
165
|
|
|
132
|
-
const {
|
|
133
|
-
data: infiniteScrollData,
|
|
134
|
-
paginationInfo: infiniteScrollPaginationInfo,
|
|
135
|
-
isLoadingMore,
|
|
136
|
-
} = useInfiniteScroll( {
|
|
137
|
-
view,
|
|
138
|
-
setView,
|
|
139
|
-
data: shownData,
|
|
140
|
-
getItemId: ( item ) => item.id.toString(),
|
|
141
|
-
totalDataLength: data.length,
|
|
142
|
-
} );
|
|
143
|
-
|
|
144
166
|
return (
|
|
145
167
|
<>
|
|
146
168
|
{ infiniteScrollEnabled && (
|
|
147
169
|
<style>{ `
|
|
148
170
|
.dataviews-picker-wrapper {
|
|
149
|
-
height:
|
|
171
|
+
height: 750px;
|
|
150
172
|
overflow: auto;
|
|
151
173
|
}
|
|
152
174
|
` }</style>
|
|
@@ -158,22 +180,13 @@ const DataViewsPickerContent = ( {
|
|
|
158
180
|
setSelection( selectedIds );
|
|
159
181
|
} }
|
|
160
182
|
getItemId={ ( item ) => item.id.toString() }
|
|
161
|
-
paginationInfo={
|
|
162
|
-
|
|
163
|
-
? infiniteScrollPaginationInfo
|
|
164
|
-
: normalPaginationInfo
|
|
165
|
-
}
|
|
166
|
-
data={ infiniteScrollEnabled ? infiniteScrollData : shownData }
|
|
167
|
-
isLoading={ infiniteScrollEnabled ? isLoadingMore : undefined }
|
|
183
|
+
paginationInfo={ paginationInfo }
|
|
184
|
+
data={ shownData }
|
|
168
185
|
view={ view }
|
|
169
186
|
fields={ fields }
|
|
170
187
|
onChangeView={ setView }
|
|
171
188
|
config={ { perPageSizes } }
|
|
172
189
|
itemListLabel="Galactic Bodies"
|
|
173
|
-
defaultLayouts={ {
|
|
174
|
-
[ LAYOUT_PICKER_GRID ]: {},
|
|
175
|
-
[ LAYOUT_PICKER_TABLE ]: { perPage: 20 },
|
|
176
|
-
} }
|
|
177
190
|
/>
|
|
178
191
|
</>
|
|
179
192
|
);
|
|
@@ -296,87 +309,3 @@ export const WithModal = ( {
|
|
|
296
309
|
|
|
297
310
|
WithModal.args = storyArgs;
|
|
298
311
|
WithModal.argTypes = storyArgTypes;
|
|
299
|
-
|
|
300
|
-
function useInfiniteScroll( {
|
|
301
|
-
view,
|
|
302
|
-
setView,
|
|
303
|
-
data: shownData,
|
|
304
|
-
getItemId,
|
|
305
|
-
totalDataLength,
|
|
306
|
-
}: {
|
|
307
|
-
view: View;
|
|
308
|
-
setView: ( view: View ) => void;
|
|
309
|
-
data: SpaceObject[];
|
|
310
|
-
getItemId: ( item: SpaceObject ) => string;
|
|
311
|
-
totalDataLength: number;
|
|
312
|
-
} ): {
|
|
313
|
-
data: SpaceObject[];
|
|
314
|
-
paginationInfo: {
|
|
315
|
-
totalItems: number;
|
|
316
|
-
totalPages: number;
|
|
317
|
-
infiniteScrollHandler?: ( () => void ) | undefined;
|
|
318
|
-
};
|
|
319
|
-
isLoadingMore: boolean;
|
|
320
|
-
hasMoreData: boolean;
|
|
321
|
-
} {
|
|
322
|
-
// Custom pagination handler that simulates server-side pagination
|
|
323
|
-
const [ allLoadedRecords, setAllLoadedRecords ] = useState< SpaceObject[] >(
|
|
324
|
-
[]
|
|
325
|
-
);
|
|
326
|
-
const [ isLoadingMore, setIsLoadingMore ] = useState( false );
|
|
327
|
-
|
|
328
|
-
const totalItems = totalDataLength;
|
|
329
|
-
const totalPages = Math.ceil( totalItems / ( view.perPage || 10 ) );
|
|
330
|
-
const currentPage = view.page || 1;
|
|
331
|
-
const hasMoreData = currentPage < totalPages;
|
|
332
|
-
|
|
333
|
-
const infiniteScrollHandler = useCallback( () => {
|
|
334
|
-
if ( isLoadingMore || currentPage >= totalPages ) {
|
|
335
|
-
return;
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
setIsLoadingMore( true );
|
|
339
|
-
|
|
340
|
-
setView( {
|
|
341
|
-
...view,
|
|
342
|
-
page: currentPage + 1,
|
|
343
|
-
} );
|
|
344
|
-
}, [ isLoadingMore, currentPage, totalPages, view, setView ] );
|
|
345
|
-
|
|
346
|
-
// Initialize data on first load or when view changes significantly
|
|
347
|
-
useEffect( () => {
|
|
348
|
-
if ( currentPage === 1 || ! view.infiniteScrollEnabled ) {
|
|
349
|
-
// First page - replace all data
|
|
350
|
-
setAllLoadedRecords( shownData );
|
|
351
|
-
} else {
|
|
352
|
-
// Subsequent pages - append to existing data
|
|
353
|
-
setAllLoadedRecords( ( prev ) => {
|
|
354
|
-
const existingIds = new Set( prev.map( getItemId ) );
|
|
355
|
-
const newRecords = shownData.filter(
|
|
356
|
-
( record ) => ! existingIds.has( getItemId( record ) )
|
|
357
|
-
);
|
|
358
|
-
return [ ...prev, ...newRecords ];
|
|
359
|
-
} );
|
|
360
|
-
}
|
|
361
|
-
setIsLoadingMore( false );
|
|
362
|
-
}, [
|
|
363
|
-
view.search,
|
|
364
|
-
view.filters,
|
|
365
|
-
view.perPage,
|
|
366
|
-
currentPage,
|
|
367
|
-
view.infiniteScrollEnabled,
|
|
368
|
-
] );
|
|
369
|
-
|
|
370
|
-
const paginationInfo = {
|
|
371
|
-
totalItems,
|
|
372
|
-
totalPages,
|
|
373
|
-
infiniteScrollHandler,
|
|
374
|
-
};
|
|
375
|
-
|
|
376
|
-
return {
|
|
377
|
-
data: allLoadedRecords,
|
|
378
|
-
paginationInfo,
|
|
379
|
-
isLoadingMore,
|
|
380
|
-
hasMoreData,
|
|
381
|
-
};
|
|
382
|
-
}
|
|
@@ -14,7 +14,12 @@ import { useMemo, useState } from '@wordpress/element';
|
|
|
14
14
|
*/
|
|
15
15
|
import DataViewsPicker from '../index';
|
|
16
16
|
import { LAYOUT_PICKER_GRID } from '../../constants';
|
|
17
|
-
import type {
|
|
17
|
+
import type {
|
|
18
|
+
ActionButton,
|
|
19
|
+
SupportedLayouts,
|
|
20
|
+
View,
|
|
21
|
+
ViewPickerGrid,
|
|
22
|
+
} from '../../types';
|
|
18
23
|
import filterSortAndPaginate from '../../utils/filter-sort-and-paginate';
|
|
19
24
|
|
|
20
25
|
type Data = {
|
|
@@ -107,7 +112,7 @@ function Picker( {
|
|
|
107
112
|
paginationInfo,
|
|
108
113
|
data: shownData,
|
|
109
114
|
view,
|
|
110
|
-
defaultLayouts: { [ LAYOUT_PICKER_GRID ]:
|
|
115
|
+
defaultLayouts: { [ LAYOUT_PICKER_GRID ]: true } as SupportedLayouts,
|
|
111
116
|
fields: [],
|
|
112
117
|
onChangeView: setView,
|
|
113
118
|
multiselect,
|
|
@@ -475,4 +480,76 @@ describe( 'DataViews Picker', () => {
|
|
|
475
480
|
} );
|
|
476
481
|
} );
|
|
477
482
|
} );
|
|
483
|
+
|
|
484
|
+
describe( 'Default layouts', () => {
|
|
485
|
+
/**
|
|
486
|
+
* A minimal Picker that intentionally omits the `defaultLayouts` prop so
|
|
487
|
+
* that DataViewsPicker falls back to its internal DEFAULT_PICKER_LAYOUTS
|
|
488
|
+
* constant ({ pickerGrid: true, pickerTable: true }).
|
|
489
|
+
*/
|
|
490
|
+
function PickerWithoutDefaultLayouts() {
|
|
491
|
+
const [ view, setView ] = useState< View >( {
|
|
492
|
+
type: LAYOUT_PICKER_GRID,
|
|
493
|
+
fields: [],
|
|
494
|
+
titleField: 'title',
|
|
495
|
+
mediaField: 'image',
|
|
496
|
+
search: '',
|
|
497
|
+
page: 1,
|
|
498
|
+
perPage: 10,
|
|
499
|
+
filters: [],
|
|
500
|
+
} satisfies ViewPickerGrid );
|
|
501
|
+
|
|
502
|
+
const [ selection, setSelection ] = useState< string[] >( [] );
|
|
503
|
+
|
|
504
|
+
const { data: shownData, paginationInfo } = useMemo( () => {
|
|
505
|
+
return filterSortAndPaginate( data, view, [] );
|
|
506
|
+
}, [ view ] );
|
|
507
|
+
|
|
508
|
+
return (
|
|
509
|
+
<DataViewsPicker
|
|
510
|
+
getItemId={ ( item: Data ) => item.id.toString() }
|
|
511
|
+
paginationInfo={ paginationInfo }
|
|
512
|
+
data={ shownData }
|
|
513
|
+
view={ view }
|
|
514
|
+
fields={ [] }
|
|
515
|
+
onChangeView={ setView }
|
|
516
|
+
selection={ selection }
|
|
517
|
+
onChangeSelection={ setSelection }
|
|
518
|
+
// No `defaultLayouts` prop falls back to DEFAULT_PICKER_LAYOUTS
|
|
519
|
+
/>
|
|
520
|
+
);
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
it( 'renders both picker layout options when defaultLayouts is not provided', async () => {
|
|
524
|
+
render( <PickerWithoutDefaultLayouts /> );
|
|
525
|
+
|
|
526
|
+
const user = userEvent.setup();
|
|
527
|
+
|
|
528
|
+
// Both picker layouts are available, so the Layout switcher button
|
|
529
|
+
// (rendered by ViewTypeMenu) must be present.
|
|
530
|
+
const layoutButton = screen.getByRole( 'button', {
|
|
531
|
+
name: 'Layout',
|
|
532
|
+
} );
|
|
533
|
+
expect( layoutButton ).toBeInTheDocument();
|
|
534
|
+
|
|
535
|
+
// Open the layout menu.
|
|
536
|
+
await user.click( layoutButton );
|
|
537
|
+
|
|
538
|
+
// Both "Grid" and "Table" picker layout options must appear in the menu.
|
|
539
|
+
expect(
|
|
540
|
+
screen.getByRole( 'menuitemradio', { name: 'Grid' } )
|
|
541
|
+
).toBeInTheDocument();
|
|
542
|
+
expect(
|
|
543
|
+
screen.getByRole( 'menuitemradio', { name: 'Table' } )
|
|
544
|
+
).toBeInTheDocument();
|
|
545
|
+
|
|
546
|
+
// The grid layout is active by default.
|
|
547
|
+
expect(
|
|
548
|
+
screen.getByRole( 'menuitemradio', { name: 'Grid' } )
|
|
549
|
+
).toBeChecked();
|
|
550
|
+
expect(
|
|
551
|
+
screen.getByRole( 'menuitemradio', { name: 'Table' } )
|
|
552
|
+
).not.toBeChecked();
|
|
553
|
+
} );
|
|
554
|
+
} );
|
|
478
555
|
} );
|
package/src/field-types/date.tsx
CHANGED
|
@@ -21,6 +21,7 @@ import {
|
|
|
21
21
|
OPERATOR_BETWEEN,
|
|
22
22
|
} from '../constants';
|
|
23
23
|
import isValidRequired from './utils/is-valid-required';
|
|
24
|
+
import { isValidMaxDate, isValidMinDate } from './utils/is-valid-date-boundary';
|
|
24
25
|
import render from './utils/render-default';
|
|
25
26
|
|
|
26
27
|
const format = {
|
|
@@ -91,5 +92,7 @@ export default {
|
|
|
91
92
|
validate: {
|
|
92
93
|
required: isValidRequired,
|
|
93
94
|
elements: isValidElements,
|
|
95
|
+
min: isValidMinDate,
|
|
96
|
+
max: isValidMaxDate,
|
|
94
97
|
},
|
|
95
98
|
} satisfies FieldType< any >;
|
|
@@ -20,6 +20,7 @@ import {
|
|
|
20
20
|
OPERATOR_OVER,
|
|
21
21
|
} from '../constants';
|
|
22
22
|
import isValidRequired from './utils/is-valid-required';
|
|
23
|
+
import { isValidMaxDate, isValidMinDate } from './utils/is-valid-date-boundary';
|
|
23
24
|
import render from './utils/render-default';
|
|
24
25
|
|
|
25
26
|
const format = {
|
|
@@ -88,5 +89,7 @@ export default {
|
|
|
88
89
|
validate: {
|
|
89
90
|
required: isValidRequired,
|
|
90
91
|
elements: isValidElements,
|
|
92
|
+
min: isValidMinDate,
|
|
93
|
+
max: isValidMaxDate,
|
|
91
94
|
},
|
|
92
95
|
} satisfies FieldType< any >;
|
|
@@ -96,6 +96,10 @@ export default function normalizeFields< Item >(
|
|
|
96
96
|
getElements: field.getElements,
|
|
97
97
|
hasElements: hasElements( field ),
|
|
98
98
|
isVisible: field.isVisible,
|
|
99
|
+
isDisabled:
|
|
100
|
+
typeof field.isDisabled === 'function'
|
|
101
|
+
? field.isDisabled
|
|
102
|
+
: () => !! field.isDisabled,
|
|
99
103
|
enableHiding: field.enableHiding ?? true,
|
|
100
104
|
readOnly: field.readOnly ?? false,
|
|
101
105
|
// The type provides defaults for the following props
|