@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
|
@@ -66,12 +66,17 @@ const meta = {
|
|
|
66
66
|
'Add 10 more elements to push over the threshold and trigger Combobox rendering',
|
|
67
67
|
if: { arg: 'Edit', eq: 'adaptiveSelect' },
|
|
68
68
|
},
|
|
69
|
+
disabled: {
|
|
70
|
+
control: { type: 'boolean' },
|
|
71
|
+
description: 'Whether the field controls are disabled.',
|
|
72
|
+
},
|
|
69
73
|
},
|
|
70
74
|
args: {
|
|
71
75
|
type: 'regular',
|
|
72
76
|
Edit: 'default',
|
|
73
77
|
asyncElements: false,
|
|
74
78
|
manyElements: false,
|
|
79
|
+
disabled: false,
|
|
75
80
|
},
|
|
76
81
|
};
|
|
77
82
|
export default meta;
|
|
@@ -110,6 +115,7 @@ type DataType = {
|
|
|
110
115
|
booleanWithToggle: boolean;
|
|
111
116
|
booleanWithElements: boolean;
|
|
112
117
|
datetime: string;
|
|
118
|
+
datetimeCompact?: string;
|
|
113
119
|
datetimeWithElements: string;
|
|
114
120
|
date: string;
|
|
115
121
|
dateWithElements: string;
|
|
@@ -150,6 +156,7 @@ const data: DataType[] = [
|
|
|
150
156
|
booleanWithToggle: true,
|
|
151
157
|
booleanWithElements: true,
|
|
152
158
|
datetime: '2021-01-01T14:30:00Z',
|
|
159
|
+
datetimeCompact: '2021-01-01T14:30:00Z',
|
|
153
160
|
datetimeWithElements: '1982-05-10T20:30:00Z',
|
|
154
161
|
date: '2021-01-01',
|
|
155
162
|
dateWithElements: '2021-01-01',
|
|
@@ -303,6 +310,16 @@ const fields: Field< DataType >[] = [
|
|
|
303
310
|
label: 'Datetime',
|
|
304
311
|
description: 'Help for datetime.',
|
|
305
312
|
},
|
|
313
|
+
{
|
|
314
|
+
id: 'datetimeCompact',
|
|
315
|
+
type: 'datetime',
|
|
316
|
+
label: 'Datetime (compact)',
|
|
317
|
+
description: 'Datetime field without the calendar widget.',
|
|
318
|
+
Edit: {
|
|
319
|
+
control: 'datetime',
|
|
320
|
+
compact: true,
|
|
321
|
+
},
|
|
322
|
+
},
|
|
306
323
|
{
|
|
307
324
|
id: 'datetimeWithElements',
|
|
308
325
|
type: 'datetime',
|
|
@@ -578,6 +595,7 @@ interface FieldTypeStoryProps {
|
|
|
578
595
|
Edit: ControlTypes;
|
|
579
596
|
asyncElements: boolean;
|
|
580
597
|
manyElements: boolean;
|
|
598
|
+
disabled: boolean;
|
|
581
599
|
}
|
|
582
600
|
|
|
583
601
|
const FieldTypeStory = ( {
|
|
@@ -586,17 +604,27 @@ const FieldTypeStory = ( {
|
|
|
586
604
|
Edit,
|
|
587
605
|
asyncElements,
|
|
588
606
|
manyElements,
|
|
607
|
+
disabled,
|
|
589
608
|
}: FieldTypeStoryProps ) => {
|
|
590
609
|
const storyFields = useMemo( () => {
|
|
591
610
|
let fieldsToProcess = _fields;
|
|
592
611
|
|
|
593
|
-
if (
|
|
594
|
-
fieldsToProcess =
|
|
612
|
+
if ( disabled ) {
|
|
613
|
+
fieldsToProcess = fieldsToProcess.map( ( field ) => ( {
|
|
595
614
|
...field,
|
|
596
|
-
|
|
615
|
+
isDisabled: true,
|
|
597
616
|
} ) );
|
|
598
617
|
}
|
|
599
618
|
|
|
619
|
+
if ( Edit !== 'default' ) {
|
|
620
|
+
fieldsToProcess = fieldsToProcess.map(
|
|
621
|
+
( field: Field< DataType > ) => ( {
|
|
622
|
+
...field,
|
|
623
|
+
Edit,
|
|
624
|
+
} )
|
|
625
|
+
);
|
|
626
|
+
}
|
|
627
|
+
|
|
600
628
|
// Expand elements when adaptiveSelect is selected and manyElements is toggled
|
|
601
629
|
if ( Edit === 'adaptiveSelect' && manyElements ) {
|
|
602
630
|
fieldsToProcess = fieldsToProcess.map( ( field ) => {
|
|
@@ -636,7 +664,7 @@ const FieldTypeStory = ( {
|
|
|
636
664
|
}
|
|
637
665
|
|
|
638
666
|
return fieldsToProcess;
|
|
639
|
-
}, [ _fields, Edit, asyncElements, manyElements ] );
|
|
667
|
+
}, [ _fields, Edit, asyncElements, manyElements, disabled ] );
|
|
640
668
|
const form = useMemo(
|
|
641
669
|
() => ( {
|
|
642
670
|
layout: { type },
|
|
@@ -687,7 +715,7 @@ const FieldTypeStory = ( {
|
|
|
687
715
|
},
|
|
688
716
|
] }
|
|
689
717
|
defaultLayouts={ {
|
|
690
|
-
table:
|
|
718
|
+
table: true,
|
|
691
719
|
} }
|
|
692
720
|
selection={ selectedIds.map( ( id ) => id.toString() ) }
|
|
693
721
|
onChangeSelection={ ( newSelection ) =>
|
|
@@ -744,11 +772,13 @@ export const AllComponent = ( {
|
|
|
744
772
|
Edit,
|
|
745
773
|
asyncElements,
|
|
746
774
|
manyElements,
|
|
775
|
+
disabled,
|
|
747
776
|
}: {
|
|
748
777
|
type: PanelTypes;
|
|
749
778
|
Edit: ControlTypes;
|
|
750
779
|
asyncElements: boolean;
|
|
751
780
|
manyElements: boolean;
|
|
781
|
+
disabled: boolean;
|
|
752
782
|
} ) => {
|
|
753
783
|
return (
|
|
754
784
|
<FieldTypeStory
|
|
@@ -757,6 +787,7 @@ export const AllComponent = ( {
|
|
|
757
787
|
Edit={ Edit }
|
|
758
788
|
asyncElements={ asyncElements }
|
|
759
789
|
manyElements={ manyElements }
|
|
790
|
+
disabled={ disabled }
|
|
760
791
|
/>
|
|
761
792
|
);
|
|
762
793
|
};
|
|
@@ -767,11 +798,13 @@ export const TextComponent = ( {
|
|
|
767
798
|
Edit,
|
|
768
799
|
asyncElements,
|
|
769
800
|
manyElements,
|
|
801
|
+
disabled,
|
|
770
802
|
}: {
|
|
771
803
|
type: PanelTypes;
|
|
772
804
|
Edit: ControlTypes;
|
|
773
805
|
asyncElements: boolean;
|
|
774
806
|
manyElements: boolean;
|
|
807
|
+
disabled: boolean;
|
|
775
808
|
} ) => {
|
|
776
809
|
const textFields = useMemo(
|
|
777
810
|
() => fields.filter( ( field ) => field.type === 'text' ),
|
|
@@ -785,6 +818,7 @@ export const TextComponent = ( {
|
|
|
785
818
|
Edit={ Edit }
|
|
786
819
|
asyncElements={ asyncElements }
|
|
787
820
|
manyElements={ manyElements }
|
|
821
|
+
disabled={ disabled }
|
|
788
822
|
/>
|
|
789
823
|
);
|
|
790
824
|
};
|
|
@@ -796,12 +830,14 @@ export const IntegerComponent = ( {
|
|
|
796
830
|
asyncElements,
|
|
797
831
|
manyElements,
|
|
798
832
|
formatSeparatorThousand,
|
|
833
|
+
disabled,
|
|
799
834
|
}: {
|
|
800
835
|
type: PanelTypes;
|
|
801
836
|
Edit: ControlTypes;
|
|
802
837
|
asyncElements: boolean;
|
|
803
838
|
manyElements: boolean;
|
|
804
839
|
formatSeparatorThousand?: string;
|
|
840
|
+
disabled: boolean;
|
|
805
841
|
} ) => {
|
|
806
842
|
const integerFields = useMemo(
|
|
807
843
|
() =>
|
|
@@ -828,6 +864,7 @@ export const IntegerComponent = ( {
|
|
|
828
864
|
Edit={ Edit }
|
|
829
865
|
asyncElements={ asyncElements }
|
|
830
866
|
manyElements={ manyElements }
|
|
867
|
+
disabled={ disabled }
|
|
831
868
|
/>
|
|
832
869
|
);
|
|
833
870
|
};
|
|
@@ -851,6 +888,7 @@ export const NumberComponent = ( {
|
|
|
851
888
|
formatSeparatorThousand,
|
|
852
889
|
formatSeparatorDecimal,
|
|
853
890
|
formatDecimals,
|
|
891
|
+
disabled,
|
|
854
892
|
}: {
|
|
855
893
|
type: PanelTypes;
|
|
856
894
|
Edit: ControlTypes;
|
|
@@ -859,6 +897,7 @@ export const NumberComponent = ( {
|
|
|
859
897
|
formatSeparatorThousand?: string;
|
|
860
898
|
formatSeparatorDecimal?: string;
|
|
861
899
|
formatDecimals?: number;
|
|
900
|
+
disabled: boolean;
|
|
862
901
|
} ) => {
|
|
863
902
|
const numberFields = useMemo(
|
|
864
903
|
() =>
|
|
@@ -901,6 +940,7 @@ export const NumberComponent = ( {
|
|
|
901
940
|
Edit={ Edit }
|
|
902
941
|
asyncElements={ asyncElements }
|
|
903
942
|
manyElements={ manyElements }
|
|
943
|
+
disabled={ disabled }
|
|
904
944
|
/>
|
|
905
945
|
);
|
|
906
946
|
};
|
|
@@ -933,11 +973,13 @@ export const BooleanComponent = ( {
|
|
|
933
973
|
Edit,
|
|
934
974
|
asyncElements,
|
|
935
975
|
manyElements,
|
|
976
|
+
disabled,
|
|
936
977
|
}: {
|
|
937
978
|
type: PanelTypes;
|
|
938
979
|
Edit: ControlTypes;
|
|
939
980
|
asyncElements: boolean;
|
|
940
981
|
manyElements: boolean;
|
|
982
|
+
disabled: boolean;
|
|
941
983
|
} ) => {
|
|
942
984
|
const booleanFields = useMemo(
|
|
943
985
|
() => fields.filter( ( field ) => field.type === 'boolean' ),
|
|
@@ -951,6 +993,7 @@ export const BooleanComponent = ( {
|
|
|
951
993
|
Edit={ Edit }
|
|
952
994
|
asyncElements={ asyncElements }
|
|
953
995
|
manyElements={ manyElements }
|
|
996
|
+
disabled={ disabled }
|
|
954
997
|
/>
|
|
955
998
|
);
|
|
956
999
|
};
|
|
@@ -963,6 +1006,7 @@ export const DateTimeComponent = ( {
|
|
|
963
1006
|
manyElements,
|
|
964
1007
|
formatDatetime,
|
|
965
1008
|
formatWeekStartsOn,
|
|
1009
|
+
disabled,
|
|
966
1010
|
}: {
|
|
967
1011
|
type: PanelTypes;
|
|
968
1012
|
Edit: ControlTypes;
|
|
@@ -970,6 +1014,7 @@ export const DateTimeComponent = ( {
|
|
|
970
1014
|
manyElements: boolean;
|
|
971
1015
|
formatDatetime?: string;
|
|
972
1016
|
formatWeekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;
|
|
1017
|
+
disabled: boolean;
|
|
973
1018
|
} ) => {
|
|
974
1019
|
const datetimeFields = useMemo(
|
|
975
1020
|
() =>
|
|
@@ -994,7 +1039,7 @@ export const DateTimeComponent = ( {
|
|
|
994
1039
|
}
|
|
995
1040
|
return field;
|
|
996
1041
|
} ),
|
|
997
|
-
[
|
|
1042
|
+
[ formatDatetime, formatWeekStartsOn ]
|
|
998
1043
|
);
|
|
999
1044
|
|
|
1000
1045
|
return (
|
|
@@ -1004,6 +1049,7 @@ export const DateTimeComponent = ( {
|
|
|
1004
1049
|
Edit={ Edit }
|
|
1005
1050
|
asyncElements={ asyncElements }
|
|
1006
1051
|
manyElements={ manyElements }
|
|
1052
|
+
disabled={ disabled }
|
|
1007
1053
|
/>
|
|
1008
1054
|
);
|
|
1009
1055
|
};
|
|
@@ -1042,6 +1088,7 @@ export const DateComponent = ( {
|
|
|
1042
1088
|
manyElements,
|
|
1043
1089
|
formatDate,
|
|
1044
1090
|
formatWeekStartsOn,
|
|
1091
|
+
disabled,
|
|
1045
1092
|
}: {
|
|
1046
1093
|
type: PanelTypes;
|
|
1047
1094
|
Edit: ControlTypes;
|
|
@@ -1049,6 +1096,7 @@ export const DateComponent = ( {
|
|
|
1049
1096
|
manyElements: boolean;
|
|
1050
1097
|
formatDate?: string;
|
|
1051
1098
|
formatWeekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;
|
|
1099
|
+
disabled: boolean;
|
|
1052
1100
|
} ) => {
|
|
1053
1101
|
const dateFields = useMemo(
|
|
1054
1102
|
() =>
|
|
@@ -1083,6 +1131,7 @@ export const DateComponent = ( {
|
|
|
1083
1131
|
Edit={ Edit }
|
|
1084
1132
|
asyncElements={ asyncElements }
|
|
1085
1133
|
manyElements={ manyElements }
|
|
1134
|
+
disabled={ disabled }
|
|
1086
1135
|
/>
|
|
1087
1136
|
);
|
|
1088
1137
|
};
|
|
@@ -1119,11 +1168,13 @@ export const EmailComponent = ( {
|
|
|
1119
1168
|
Edit,
|
|
1120
1169
|
asyncElements,
|
|
1121
1170
|
manyElements,
|
|
1171
|
+
disabled,
|
|
1122
1172
|
}: {
|
|
1123
1173
|
type: PanelTypes;
|
|
1124
1174
|
Edit: ControlTypes;
|
|
1125
1175
|
asyncElements: boolean;
|
|
1126
1176
|
manyElements: boolean;
|
|
1177
|
+
disabled: boolean;
|
|
1127
1178
|
} ) => {
|
|
1128
1179
|
const emailFields = useMemo(
|
|
1129
1180
|
() => fields.filter( ( field ) => field.type === 'email' ),
|
|
@@ -1137,6 +1188,7 @@ export const EmailComponent = ( {
|
|
|
1137
1188
|
Edit={ Edit }
|
|
1138
1189
|
asyncElements={ asyncElements }
|
|
1139
1190
|
manyElements={ manyElements }
|
|
1191
|
+
disabled={ disabled }
|
|
1140
1192
|
/>
|
|
1141
1193
|
);
|
|
1142
1194
|
};
|
|
@@ -1147,11 +1199,13 @@ export const TelephoneComponent = ( {
|
|
|
1147
1199
|
Edit,
|
|
1148
1200
|
asyncElements,
|
|
1149
1201
|
manyElements,
|
|
1202
|
+
disabled,
|
|
1150
1203
|
}: {
|
|
1151
1204
|
type: PanelTypes;
|
|
1152
1205
|
Edit: ControlTypes;
|
|
1153
1206
|
asyncElements: boolean;
|
|
1154
1207
|
manyElements: boolean;
|
|
1208
|
+
disabled: boolean;
|
|
1155
1209
|
} ) => {
|
|
1156
1210
|
const telephoneFields = fields.filter( ( field ) =>
|
|
1157
1211
|
field.id.startsWith( 'telephone' )
|
|
@@ -1164,6 +1218,7 @@ export const TelephoneComponent = ( {
|
|
|
1164
1218
|
Edit={ Edit }
|
|
1165
1219
|
asyncElements={ asyncElements }
|
|
1166
1220
|
manyElements={ manyElements }
|
|
1221
|
+
disabled={ disabled }
|
|
1167
1222
|
/>
|
|
1168
1223
|
);
|
|
1169
1224
|
};
|
|
@@ -1174,11 +1229,13 @@ export const UrlComponent = ( {
|
|
|
1174
1229
|
Edit,
|
|
1175
1230
|
asyncElements,
|
|
1176
1231
|
manyElements,
|
|
1232
|
+
disabled,
|
|
1177
1233
|
}: {
|
|
1178
1234
|
type: PanelTypes;
|
|
1179
1235
|
Edit: ControlTypes;
|
|
1180
1236
|
asyncElements: boolean;
|
|
1181
1237
|
manyElements: boolean;
|
|
1238
|
+
disabled: boolean;
|
|
1182
1239
|
} ) => {
|
|
1183
1240
|
const urlFields = useMemo(
|
|
1184
1241
|
() => fields.filter( ( field ) => field.type === 'url' ),
|
|
@@ -1192,6 +1249,7 @@ export const UrlComponent = ( {
|
|
|
1192
1249
|
Edit={ Edit }
|
|
1193
1250
|
asyncElements={ asyncElements }
|
|
1194
1251
|
manyElements={ manyElements }
|
|
1252
|
+
disabled={ disabled }
|
|
1195
1253
|
/>
|
|
1196
1254
|
);
|
|
1197
1255
|
};
|
|
@@ -1202,11 +1260,13 @@ export const ColorComponent = ( {
|
|
|
1202
1260
|
Edit,
|
|
1203
1261
|
asyncElements,
|
|
1204
1262
|
manyElements,
|
|
1263
|
+
disabled,
|
|
1205
1264
|
}: {
|
|
1206
1265
|
type: PanelTypes;
|
|
1207
1266
|
Edit: ControlTypes;
|
|
1208
1267
|
asyncElements: boolean;
|
|
1209
1268
|
manyElements: boolean;
|
|
1269
|
+
disabled: boolean;
|
|
1210
1270
|
} ) => {
|
|
1211
1271
|
const colorFields = useMemo(
|
|
1212
1272
|
() => fields.filter( ( field ) => field.type === 'color' ),
|
|
@@ -1220,6 +1280,7 @@ export const ColorComponent = ( {
|
|
|
1220
1280
|
Edit={ Edit }
|
|
1221
1281
|
asyncElements={ asyncElements }
|
|
1222
1282
|
manyElements={ manyElements }
|
|
1283
|
+
disabled={ disabled }
|
|
1223
1284
|
/>
|
|
1224
1285
|
);
|
|
1225
1286
|
};
|
|
@@ -1230,11 +1291,13 @@ export const MediaComponent = ( {
|
|
|
1230
1291
|
Edit,
|
|
1231
1292
|
asyncElements,
|
|
1232
1293
|
manyElements,
|
|
1294
|
+
disabled,
|
|
1233
1295
|
}: {
|
|
1234
1296
|
type: PanelTypes;
|
|
1235
1297
|
Edit: ControlTypes;
|
|
1236
1298
|
asyncElements: boolean;
|
|
1237
1299
|
manyElements: boolean;
|
|
1300
|
+
disabled: boolean;
|
|
1238
1301
|
} ) => {
|
|
1239
1302
|
const mediaFields = useMemo(
|
|
1240
1303
|
() => fields.filter( ( field ) => field.type === 'media' ),
|
|
@@ -1248,6 +1311,7 @@ export const MediaComponent = ( {
|
|
|
1248
1311
|
Edit={ Edit }
|
|
1249
1312
|
asyncElements={ asyncElements }
|
|
1250
1313
|
manyElements={ manyElements }
|
|
1314
|
+
disabled={ disabled }
|
|
1251
1315
|
/>
|
|
1252
1316
|
);
|
|
1253
1317
|
};
|
|
@@ -1258,11 +1322,13 @@ export const ArrayComponent = ( {
|
|
|
1258
1322
|
Edit,
|
|
1259
1323
|
asyncElements,
|
|
1260
1324
|
manyElements,
|
|
1325
|
+
disabled,
|
|
1261
1326
|
}: {
|
|
1262
1327
|
type: PanelTypes;
|
|
1263
1328
|
Edit: ControlTypes;
|
|
1264
1329
|
asyncElements: boolean;
|
|
1265
1330
|
manyElements: boolean;
|
|
1331
|
+
disabled: boolean;
|
|
1266
1332
|
} ) => {
|
|
1267
1333
|
const arrayTextFields = useMemo(
|
|
1268
1334
|
() => fields.filter( ( field ) => field.type === 'array' ),
|
|
@@ -1276,6 +1342,7 @@ export const ArrayComponent = ( {
|
|
|
1276
1342
|
Edit={ Edit }
|
|
1277
1343
|
asyncElements={ asyncElements }
|
|
1278
1344
|
manyElements={ manyElements }
|
|
1345
|
+
disabled={ disabled }
|
|
1279
1346
|
/>
|
|
1280
1347
|
);
|
|
1281
1348
|
};
|
|
@@ -1286,11 +1353,13 @@ export const PasswordComponent = ( {
|
|
|
1286
1353
|
Edit,
|
|
1287
1354
|
asyncElements,
|
|
1288
1355
|
manyElements,
|
|
1356
|
+
disabled,
|
|
1289
1357
|
}: {
|
|
1290
1358
|
type: PanelTypes;
|
|
1291
1359
|
Edit: ControlTypes;
|
|
1292
1360
|
asyncElements: boolean;
|
|
1293
1361
|
manyElements: boolean;
|
|
1362
|
+
disabled: boolean;
|
|
1294
1363
|
} ) => {
|
|
1295
1364
|
const passwordFields = fields.filter( ( field ) =>
|
|
1296
1365
|
field.id.startsWith( 'password' )
|
|
@@ -1303,6 +1372,7 @@ export const PasswordComponent = ( {
|
|
|
1303
1372
|
Edit={ Edit }
|
|
1304
1373
|
asyncElements={ asyncElements }
|
|
1305
1374
|
manyElements={ manyElements }
|
|
1375
|
+
disabled={ disabled }
|
|
1306
1376
|
/>
|
|
1307
1377
|
);
|
|
1308
1378
|
};
|
|
@@ -1313,11 +1383,13 @@ export const NoTypeComponent = ( {
|
|
|
1313
1383
|
Edit,
|
|
1314
1384
|
asyncElements,
|
|
1315
1385
|
manyElements,
|
|
1386
|
+
disabled,
|
|
1316
1387
|
}: {
|
|
1317
1388
|
type: PanelTypes;
|
|
1318
1389
|
Edit: ControlTypes;
|
|
1319
1390
|
asyncElements: boolean;
|
|
1320
1391
|
manyElements: boolean;
|
|
1392
|
+
disabled: boolean;
|
|
1321
1393
|
} ) => {
|
|
1322
1394
|
const noTypeFields = useMemo(
|
|
1323
1395
|
() => fields.filter( ( field ) => field.type === undefined ),
|
|
@@ -1331,6 +1403,7 @@ export const NoTypeComponent = ( {
|
|
|
1331
1403
|
Edit={ Edit }
|
|
1332
1404
|
asyncElements={ asyncElements }
|
|
1333
1405
|
manyElements={ manyElements }
|
|
1406
|
+
disabled={ disabled }
|
|
1334
1407
|
/>
|
|
1335
1408
|
);
|
|
1336
1409
|
};
|
|
@@ -339,6 +339,50 @@ describe( 'normalizeFields: default getValue', () => {
|
|
|
339
339
|
} );
|
|
340
340
|
} );
|
|
341
341
|
|
|
342
|
+
describe( 'validation normalization', () => {
|
|
343
|
+
it( 'ignores string min/max rules on numeric fields', () => {
|
|
344
|
+
const fields: Field< {} >[] = [
|
|
345
|
+
{
|
|
346
|
+
id: 'price',
|
|
347
|
+
type: 'number',
|
|
348
|
+
isValid: {
|
|
349
|
+
min: '1',
|
|
350
|
+
max: '10',
|
|
351
|
+
},
|
|
352
|
+
},
|
|
353
|
+
];
|
|
354
|
+
const normalizedFields = normalizeFields( fields );
|
|
355
|
+
expect( normalizedFields[ 0 ].isValid.min ).toBeUndefined();
|
|
356
|
+
expect( normalizedFields[ 0 ].isValid.max ).toBeUndefined();
|
|
357
|
+
} );
|
|
358
|
+
|
|
359
|
+
it( 'ignores numeric min/max rules on date-like fields', () => {
|
|
360
|
+
const fields: Field< {} >[] = [
|
|
361
|
+
{
|
|
362
|
+
id: 'publishDate',
|
|
363
|
+
type: 'date',
|
|
364
|
+
isValid: {
|
|
365
|
+
min: 1,
|
|
366
|
+
max: 10,
|
|
367
|
+
},
|
|
368
|
+
},
|
|
369
|
+
{
|
|
370
|
+
id: 'publishedAt',
|
|
371
|
+
type: 'datetime',
|
|
372
|
+
isValid: {
|
|
373
|
+
min: 1,
|
|
374
|
+
max: 10,
|
|
375
|
+
},
|
|
376
|
+
},
|
|
377
|
+
];
|
|
378
|
+
const normalizedFields = normalizeFields( fields );
|
|
379
|
+
expect( normalizedFields[ 0 ].isValid.min ).toBeUndefined();
|
|
380
|
+
expect( normalizedFields[ 0 ].isValid.max ).toBeUndefined();
|
|
381
|
+
expect( normalizedFields[ 1 ].isValid.min ).toBeUndefined();
|
|
382
|
+
expect( normalizedFields[ 1 ].isValid.max ).toBeUndefined();
|
|
383
|
+
} );
|
|
384
|
+
} );
|
|
385
|
+
|
|
342
386
|
describe( 'format normalization', () => {
|
|
343
387
|
it( 'applies default format when not provided for date fields', () => {
|
|
344
388
|
const fields: Field< {} >[] = [
|
|
@@ -4,13 +4,42 @@
|
|
|
4
4
|
import type { Field, NormalizedRules } from '../../types';
|
|
5
5
|
import type { FieldType } from '../../types/private';
|
|
6
6
|
|
|
7
|
+
function supportsNumericRangeConstraint( type?: string ) {
|
|
8
|
+
return type === 'integer' || type === 'number';
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function supportsDateRangeConstraint( type?: string ) {
|
|
12
|
+
return type === 'date' || type === 'datetime';
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function normalizeRangeRule< Item >(
|
|
16
|
+
value: number | string | undefined,
|
|
17
|
+
fieldType: FieldType< Item >,
|
|
18
|
+
key: 'min' | 'max'
|
|
19
|
+
): NormalizedRules< Item >[ 'min' ] {
|
|
20
|
+
const validator = fieldType.validate[ key ];
|
|
21
|
+
if (
|
|
22
|
+
validator &&
|
|
23
|
+
( ( typeof value === 'number' &&
|
|
24
|
+
supportsNumericRangeConstraint( fieldType.type ) ) ||
|
|
25
|
+
( typeof value === 'string' &&
|
|
26
|
+
supportsDateRangeConstraint( fieldType.type ) ) )
|
|
27
|
+
) {
|
|
28
|
+
return { constraint: value, validate: validator } as NonNullable<
|
|
29
|
+
NormalizedRules< Item >[ typeof key ]
|
|
30
|
+
>;
|
|
31
|
+
}
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
|
|
7
35
|
export default function getIsValid< Item >(
|
|
8
36
|
field: Field< Item >,
|
|
9
37
|
fieldType: FieldType< Item >
|
|
10
38
|
): NormalizedRules< Item > {
|
|
39
|
+
const rules = field.isValid;
|
|
11
40
|
let required;
|
|
12
41
|
if (
|
|
13
|
-
|
|
42
|
+
rules?.required === true &&
|
|
14
43
|
fieldType.validate.required !== undefined
|
|
15
44
|
) {
|
|
16
45
|
required = {
|
|
@@ -21,9 +50,9 @@ export default function getIsValid< Item >(
|
|
|
21
50
|
|
|
22
51
|
let elements;
|
|
23
52
|
if (
|
|
24
|
-
(
|
|
53
|
+
( rules?.elements === true ||
|
|
25
54
|
// elements is enabled unless the field opts-out
|
|
26
|
-
(
|
|
55
|
+
( rules?.elements === undefined &&
|
|
27
56
|
( !! field.elements || !! field.getElements ) ) ) &&
|
|
28
57
|
fieldType.validate.elements !== undefined
|
|
29
58
|
) {
|
|
@@ -33,62 +62,46 @@ export default function getIsValid< Item >(
|
|
|
33
62
|
};
|
|
34
63
|
}
|
|
35
64
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
typeof field.isValid?.min === 'number' &&
|
|
39
|
-
fieldType.validate.min !== undefined
|
|
40
|
-
) {
|
|
41
|
-
min = {
|
|
42
|
-
constraint: field.isValid.min,
|
|
43
|
-
validate: fieldType.validate.min,
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
let max;
|
|
48
|
-
if (
|
|
49
|
-
typeof field.isValid?.max === 'number' &&
|
|
50
|
-
fieldType.validate.max !== undefined
|
|
51
|
-
) {
|
|
52
|
-
max = {
|
|
53
|
-
constraint: field.isValid.max,
|
|
54
|
-
validate: fieldType.validate.max,
|
|
55
|
-
};
|
|
56
|
-
}
|
|
65
|
+
const min = normalizeRangeRule( rules?.min, fieldType, 'min' );
|
|
66
|
+
const max = normalizeRangeRule( rules?.max, fieldType, 'max' );
|
|
57
67
|
|
|
68
|
+
const minLengthValue = rules?.minLength;
|
|
58
69
|
let minLength;
|
|
59
70
|
if (
|
|
60
|
-
typeof
|
|
71
|
+
typeof minLengthValue === 'number' &&
|
|
61
72
|
fieldType.validate.minLength !== undefined
|
|
62
73
|
) {
|
|
63
74
|
minLength = {
|
|
64
|
-
constraint:
|
|
75
|
+
constraint: minLengthValue,
|
|
65
76
|
validate: fieldType.validate.minLength,
|
|
66
77
|
};
|
|
67
78
|
}
|
|
68
79
|
|
|
80
|
+
const maxLengthValue = rules?.maxLength;
|
|
69
81
|
let maxLength;
|
|
70
82
|
if (
|
|
71
|
-
typeof
|
|
83
|
+
typeof maxLengthValue === 'number' &&
|
|
72
84
|
fieldType.validate.maxLength !== undefined
|
|
73
85
|
) {
|
|
74
86
|
maxLength = {
|
|
75
|
-
constraint:
|
|
87
|
+
constraint: maxLengthValue,
|
|
76
88
|
validate: fieldType.validate.maxLength,
|
|
77
89
|
};
|
|
78
90
|
}
|
|
79
91
|
|
|
92
|
+
const patternValue = rules?.pattern;
|
|
80
93
|
let pattern;
|
|
81
94
|
if (
|
|
82
|
-
|
|
95
|
+
patternValue !== undefined &&
|
|
83
96
|
fieldType.validate.pattern !== undefined
|
|
84
97
|
) {
|
|
85
98
|
pattern = {
|
|
86
|
-
constraint:
|
|
99
|
+
constraint: patternValue,
|
|
87
100
|
validate: fieldType.validate.pattern,
|
|
88
101
|
};
|
|
89
102
|
}
|
|
90
103
|
|
|
91
|
-
const custom =
|
|
104
|
+
const custom = rules?.custom ?? fieldType.validate.custom;
|
|
92
105
|
|
|
93
106
|
return {
|
|
94
107
|
required,
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* External dependencies
|
|
3
|
+
*/
|
|
4
|
+
import { isValid as isValidDate } from 'date-fns';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* WordPress dependencies
|
|
8
|
+
*/
|
|
9
|
+
import { getDate } from '@wordpress/date';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Internal dependencies
|
|
13
|
+
*/
|
|
14
|
+
import type { NormalizedField } from '../../types';
|
|
15
|
+
|
|
16
|
+
type Boundary = 'min' | 'max';
|
|
17
|
+
|
|
18
|
+
function parseDateLike( value?: string ) {
|
|
19
|
+
if ( ! value ) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Pre-check to avoid passing unparseable strings to getDate,
|
|
24
|
+
// which uses moment.js and emits deprecation warnings.
|
|
25
|
+
if ( ! isValidDate( new Date( value ) ) ) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const parsed = getDate( value );
|
|
30
|
+
return parsed && isValidDate( parsed ) ? parsed : null;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function validateDateLikeBoundary< Item >(
|
|
34
|
+
item: Item,
|
|
35
|
+
field: NormalizedField< Item >,
|
|
36
|
+
boundary: Boundary
|
|
37
|
+
): boolean {
|
|
38
|
+
const constraint = field.isValid[ boundary ]?.constraint;
|
|
39
|
+
if ( typeof constraint !== 'string' ) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const value = field.getValue( { item } );
|
|
44
|
+
const boundaryValue = Array.isArray( value )
|
|
45
|
+
? value[ boundary === 'min' ? 0 : value.length - 1 ]
|
|
46
|
+
: value;
|
|
47
|
+
|
|
48
|
+
if (
|
|
49
|
+
boundaryValue === undefined ||
|
|
50
|
+
boundaryValue === null ||
|
|
51
|
+
boundaryValue === ''
|
|
52
|
+
) {
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const parsedConstraint = parseDateLike( constraint );
|
|
57
|
+
const parsedValue = parseDateLike( String( boundaryValue ) );
|
|
58
|
+
|
|
59
|
+
return (
|
|
60
|
+
!! parsedConstraint &&
|
|
61
|
+
!! parsedValue &&
|
|
62
|
+
( boundary === 'min'
|
|
63
|
+
? parsedValue.getTime() >= parsedConstraint.getTime()
|
|
64
|
+
: parsedValue.getTime() <= parsedConstraint.getTime() )
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export function isValidMinDate< Item >(
|
|
69
|
+
item: Item,
|
|
70
|
+
field: NormalizedField< Item >
|
|
71
|
+
): boolean {
|
|
72
|
+
return validateDateLikeBoundary( item, field, 'min' );
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function isValidMaxDate< Item >(
|
|
76
|
+
item: Item,
|
|
77
|
+
field: NormalizedField< Item >
|
|
78
|
+
): boolean {
|
|
79
|
+
return validateDateLikeBoundary( item, field, 'max' );
|
|
80
|
+
}
|
package/src/hooks/index.ts
CHANGED
|
@@ -2,3 +2,6 @@
|
|
|
2
2
|
* Internal dependencies
|
|
3
3
|
*/
|
|
4
4
|
export { default as useFormValidity } from './use-form-validity';
|
|
5
|
+
export { default as useData } from './use-data';
|
|
6
|
+
export { useInfiniteScroll } from './use-infinite-scroll';
|
|
7
|
+
export { default as useSelectedItems } from './use-selected-items';
|