@wordpress/dataviews 8.0.1-next.e256d081a.0 → 9.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +40 -1
- package/README.md +203 -13
- package/build/components/dataform-context/index.js +1 -0
- package/build/components/dataform-context/index.js.map +1 -1
- package/build/components/dataviews/index.js +11 -1
- package/build/components/dataviews/index.js.map +1 -1
- package/build/components/dataviews-context/index.js +1 -0
- package/build/components/dataviews-context/index.js.map +1 -1
- package/build/components/dataviews-filters/input-widget.js +48 -4
- package/build/components/dataviews-filters/input-widget.js.map +1 -1
- package/build/components/dataviews-layout/index.js +5 -2
- package/build/components/dataviews-layout/index.js.map +1 -1
- package/build/components/dataviews-picker/footer.js +145 -0
- package/build/components/dataviews-picker/footer.js.map +1 -0
- package/build/components/dataviews-picker/index.js +201 -0
- package/build/components/dataviews-picker/index.js.map +1 -0
- package/build/components/dataviews-selection-checkbox/index.js +4 -2
- package/build/components/dataviews-selection-checkbox/index.js.map +1 -1
- package/build/components/dataviews-view-config/index.js +1 -0
- package/build/components/dataviews-view-config/index.js.map +1 -1
- package/build/constants.js +4 -1
- package/build/constants.js.map +1 -1
- package/build/dataform-controls/array.js +9 -7
- package/build/dataform-controls/array.js.map +1 -1
- package/build/dataform-controls/checkbox.js +40 -8
- package/build/dataform-controls/checkbox.js.map +1 -1
- package/build/dataform-controls/color.js +133 -0
- package/build/dataform-controls/color.js.map +1 -0
- package/build/dataform-controls/date.js +32 -24
- package/build/dataform-controls/date.js.map +1 -1
- package/build/dataform-controls/datetime.js +133 -19
- package/build/dataform-controls/datetime.js.map +1 -1
- package/build/dataform-controls/email.js +15 -44
- package/build/dataform-controls/email.js.map +1 -1
- package/build/dataform-controls/index.js +35 -2
- package/build/dataform-controls/index.js.map +1 -1
- package/build/dataform-controls/integer.js +47 -34
- package/build/dataform-controls/integer.js.map +1 -1
- package/build/dataform-controls/password.js +47 -0
- package/build/dataform-controls/password.js.map +1 -0
- package/build/dataform-controls/radio.js +42 -9
- package/build/dataform-controls/radio.js.map +1 -1
- package/build/dataform-controls/relative-date-control.js +6 -10
- package/build/dataform-controls/relative-date-control.js.map +1 -1
- package/build/dataform-controls/select.js +41 -10
- package/build/dataform-controls/select.js.map +1 -1
- package/build/dataform-controls/telephone.js +40 -0
- package/build/dataform-controls/telephone.js.map +1 -0
- package/build/dataform-controls/text.js +14 -43
- package/build/dataform-controls/text.js.map +1 -1
- package/build/dataform-controls/textarea.js +81 -0
- package/build/dataform-controls/textarea.js.map +1 -0
- package/build/dataform-controls/toggle-group.js +36 -6
- package/build/dataform-controls/toggle-group.js.map +1 -1
- package/build/dataform-controls/toggle.js +77 -0
- package/build/dataform-controls/toggle.js.map +1 -0
- package/build/dataform-controls/url.js +40 -0
- package/build/dataform-controls/url.js.map +1 -0
- package/build/dataform-controls/utils/validated-input.js +83 -0
- package/build/dataform-controls/utils/validated-input.js.map +1 -0
- package/build/dataforms-layouts/card/index.js +6 -7
- package/build/dataforms-layouts/card/index.js.map +1 -1
- package/build/dataforms-layouts/data-form-layout.js +16 -4
- package/build/dataforms-layouts/data-form-layout.js.map +1 -1
- package/build/dataforms-layouts/index.js +31 -1
- package/build/dataforms-layouts/index.js.map +1 -1
- package/build/dataforms-layouts/panel/dropdown.js +10 -14
- package/build/dataforms-layouts/panel/dropdown.js.map +1 -1
- package/build/dataforms-layouts/panel/index.js +24 -11
- package/build/dataforms-layouts/panel/index.js.map +1 -1
- package/build/dataforms-layouts/panel/modal.js +22 -27
- package/build/dataforms-layouts/panel/modal.js.map +1 -1
- package/build/dataforms-layouts/panel/summary-button.js +67 -0
- package/build/dataforms-layouts/panel/summary-button.js.map +1 -0
- package/build/dataforms-layouts/regular/index.js +7 -9
- package/build/dataforms-layouts/regular/index.js.map +1 -1
- package/build/dataforms-layouts/row/index.js +113 -0
- package/build/dataforms-layouts/row/index.js.map +1 -0
- package/build/dataviews-layouts/grid/index.js +21 -26
- package/build/dataviews-layouts/grid/index.js.map +1 -1
- package/build/dataviews-layouts/index.js +9 -1
- package/build/dataviews-layouts/index.js.map +1 -1
- package/build/dataviews-layouts/list/index.js +47 -2
- package/build/dataviews-layouts/list/index.js.map +1 -1
- package/build/dataviews-layouts/picker-grid/index.js +347 -0
- package/build/dataviews-layouts/picker-grid/index.js.map +1 -0
- package/build/dataviews-layouts/table/index.js +5 -17
- package/build/dataviews-layouts/table/index.js.map +1 -1
- package/build/dataviews-layouts/utils/get-data-by-group.js +23 -0
- package/build/dataviews-layouts/utils/get-data-by-group.js.map +1 -0
- package/build/dataviews-layouts/utils/grid-items.js +37 -0
- package/build/dataviews-layouts/utils/grid-items.js.map +1 -0
- package/build/dataviews-layouts/utils/preview-size-picker.js +81 -0
- package/build/dataviews-layouts/utils/preview-size-picker.js.map +1 -0
- package/build/field-types/boolean.js +1 -1
- package/build/field-types/boolean.js.map +1 -1
- package/build/field-types/color.js +113 -0
- package/build/field-types/color.js.map +1 -0
- package/build/field-types/index.js +16 -0
- package/build/field-types/index.js.map +1 -1
- package/build/field-types/password.js +51 -0
- package/build/field-types/password.js.map +1 -0
- package/build/field-types/telephone.js +57 -0
- package/build/field-types/telephone.js.map +1 -0
- package/build/field-types/url.js +57 -0
- package/build/field-types/url.js.map +1 -0
- package/build/normalize-fields.js +17 -0
- package/build/normalize-fields.js.map +1 -1
- package/build/normalize-form-fields.js +6 -0
- package/build/normalize-form-fields.js.map +1 -1
- package/build/types.js.map +1 -1
- package/build/validation.js +1 -1
- package/build/validation.js.map +1 -1
- package/build-module/components/dataform-context/index.js +1 -0
- package/build-module/components/dataform-context/index.js.map +1 -1
- package/build-module/components/dataviews/index.js +11 -1
- package/build-module/components/dataviews/index.js.map +1 -1
- package/build-module/components/dataviews-context/index.js +1 -0
- package/build-module/components/dataviews-context/index.js.map +1 -1
- package/build-module/components/dataviews-filters/input-widget.js +48 -4
- package/build-module/components/dataviews-filters/input-widget.js.map +1 -1
- package/build-module/components/dataviews-layout/index.js +5 -2
- package/build-module/components/dataviews-layout/index.js.map +1 -1
- package/build-module/components/dataviews-picker/footer.js +136 -0
- package/build-module/components/dataviews-picker/footer.js.map +1 -0
- package/build-module/components/dataviews-picker/index.js +191 -0
- package/build-module/components/dataviews-picker/index.js.map +1 -0
- package/build-module/components/dataviews-selection-checkbox/index.js +4 -2
- package/build-module/components/dataviews-selection-checkbox/index.js.map +1 -1
- package/build-module/components/dataviews-view-config/index.js +1 -0
- package/build-module/components/dataviews-view-config/index.js.map +1 -1
- package/build-module/constants.js +3 -0
- package/build-module/constants.js.map +1 -1
- package/build-module/dataform-controls/array.js +9 -7
- package/build-module/dataform-controls/array.js.map +1 -1
- package/build-module/dataform-controls/checkbox.js +41 -9
- package/build-module/dataform-controls/checkbox.js.map +1 -1
- package/build-module/dataform-controls/color.js +126 -0
- package/build-module/dataform-controls/color.js.map +1 -0
- package/build-module/dataform-controls/date.js +32 -24
- package/build-module/dataform-controls/date.js.map +1 -1
- package/build-module/dataform-controls/datetime.js +135 -21
- package/build-module/dataform-controls/datetime.js.map +1 -1
- package/build-module/dataform-controls/email.js +15 -45
- package/build-module/dataform-controls/email.js.map +1 -1
- package/build-module/dataform-controls/index.js +35 -2
- package/build-module/dataform-controls/index.js.map +1 -1
- package/build-module/dataform-controls/integer.js +46 -34
- package/build-module/dataform-controls/integer.js.map +1 -1
- package/build-module/dataform-controls/password.js +38 -0
- package/build-module/dataform-controls/password.js.map +1 -0
- package/build-module/dataform-controls/radio.js +44 -11
- package/build-module/dataform-controls/radio.js.map +1 -1
- package/build-module/dataform-controls/relative-date-control.js +6 -10
- package/build-module/dataform-controls/relative-date-control.js.map +1 -1
- package/build-module/dataform-controls/select.js +43 -12
- package/build-module/dataform-controls/select.js.map +1 -1
- package/build-module/dataform-controls/telephone.js +33 -0
- package/build-module/dataform-controls/telephone.js.map +1 -0
- package/build-module/dataform-controls/text.js +14 -44
- package/build-module/dataform-controls/text.js.map +1 -1
- package/build-module/dataform-controls/textarea.js +74 -0
- package/build-module/dataform-controls/textarea.js.map +1 -0
- package/build-module/dataform-controls/toggle-group.js +38 -8
- package/build-module/dataform-controls/toggle-group.js.map +1 -1
- package/build-module/dataform-controls/toggle.js +70 -0
- package/build-module/dataform-controls/toggle.js.map +1 -0
- package/build-module/dataform-controls/url.js +33 -0
- package/build-module/dataform-controls/url.js.map +1 -0
- package/build-module/dataform-controls/utils/validated-input.js +76 -0
- package/build-module/dataform-controls/utils/validated-input.js.map +1 -0
- package/build-module/dataforms-layouts/card/index.js +6 -7
- package/build-module/dataforms-layouts/card/index.js.map +1 -1
- package/build-module/dataforms-layouts/data-form-layout.js +14 -4
- package/build-module/dataforms-layouts/data-form-layout.js.map +1 -1
- package/build-module/dataforms-layouts/index.js +32 -1
- package/build-module/dataforms-layouts/index.js.map +1 -1
- package/build-module/dataforms-layouts/panel/dropdown.js +10 -15
- package/build-module/dataforms-layouts/panel/dropdown.js.map +1 -1
- package/build-module/dataforms-layouts/panel/index.js +24 -11
- package/build-module/dataforms-layouts/panel/index.js.map +1 -1
- package/build-module/dataforms-layouts/panel/modal.js +22 -28
- package/build-module/dataforms-layouts/panel/modal.js.map +1 -1
- package/build-module/dataforms-layouts/panel/summary-button.js +60 -0
- package/build-module/dataforms-layouts/panel/summary-button.js.map +1 -0
- package/build-module/dataforms-layouts/regular/index.js +8 -10
- package/build-module/dataforms-layouts/regular/index.js.map +1 -1
- package/build-module/dataforms-layouts/row/index.js +106 -0
- package/build-module/dataforms-layouts/row/index.js.map +1 -0
- package/build-module/dataviews-layouts/grid/index.js +22 -27
- package/build-module/dataviews-layouts/grid/index.js.map +1 -1
- package/build-module/dataviews-layouts/index.js +10 -2
- package/build-module/dataviews-layouts/index.js.map +1 -1
- package/build-module/dataviews-layouts/list/index.js +48 -3
- package/build-module/dataviews-layouts/list/index.js.map +1 -1
- package/build-module/dataviews-layouts/picker-grid/index.js +338 -0
- package/build-module/dataviews-layouts/picker-grid/index.js.map +1 -0
- package/build-module/dataviews-layouts/table/index.js +5 -17
- package/build-module/dataviews-layouts/table/index.js.map +1 -1
- package/build-module/dataviews-layouts/utils/get-data-by-group.js +17 -0
- package/build-module/dataviews-layouts/utils/get-data-by-group.js.map +1 -0
- package/build-module/dataviews-layouts/utils/grid-items.js +29 -0
- package/build-module/dataviews-layouts/utils/grid-items.js.map +1 -0
- package/build-module/dataviews-layouts/utils/preview-size-picker.js +73 -0
- package/build-module/dataviews-layouts/utils/preview-size-picker.js.map +1 -0
- package/build-module/field-types/boolean.js +1 -1
- package/build-module/field-types/boolean.js.map +1 -1
- package/build-module/field-types/color.js +107 -0
- package/build-module/field-types/color.js.map +1 -0
- package/build-module/field-types/index.js +16 -0
- package/build-module/field-types/index.js.map +1 -1
- package/build-module/field-types/password.js +46 -0
- package/build-module/field-types/password.js.map +1 -0
- package/build-module/field-types/telephone.js +51 -0
- package/build-module/field-types/telephone.js.map +1 -0
- package/build-module/field-types/url.js +51 -0
- package/build-module/field-types/url.js.map +1 -0
- package/build-module/normalize-fields.js +15 -0
- package/build-module/normalize-fields.js.map +1 -1
- package/build-module/normalize-form-fields.js +6 -0
- package/build-module/normalize-form-fields.js.map +1 -1
- package/build-module/types.js.map +1 -1
- package/build-module/validation.js +1 -1
- package/build-module/validation.js.map +1 -1
- package/build-style/style-rtl.css +261 -18
- package/build-style/style.css +261 -18
- package/build-types/components/dataform/stories/index.story.d.ts +21 -17
- package/build-types/components/dataform/stories/index.story.d.ts.map +1 -1
- package/build-types/components/dataform-context/index.d.ts.map +1 -1
- package/build-types/components/dataviews/index.d.ts +1 -1
- package/build-types/components/dataviews/index.d.ts.map +1 -1
- package/build-types/components/dataviews/stories/fixtures.d.ts +4 -2
- package/build-types/components/dataviews/stories/fixtures.d.ts.map +1 -1
- package/build-types/components/dataviews/stories/index.story.d.ts.map +1 -1
- package/build-types/components/dataviews-context/index.d.ts +1 -0
- 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-layout/index.d.ts.map +1 -1
- package/build-types/components/dataviews-picker/footer.d.ts +4 -0
- package/build-types/components/dataviews-picker/footer.d.ts.map +1 -0
- package/build-types/components/dataviews-picker/index.d.ts +55 -0
- package/build-types/components/dataviews-picker/index.d.ts.map +1 -0
- package/build-types/components/dataviews-picker/stories/index.story.d.ts +42 -0
- package/build-types/components/dataviews-picker/stories/index.story.d.ts.map +1 -0
- package/build-types/components/dataviews-selection-checkbox/index.d.ts +2 -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/constants.d.ts +1 -0
- package/build-types/constants.d.ts.map +1 -1
- package/build-types/dataform-controls/array.d.ts.map +1 -1
- package/build-types/dataform-controls/checkbox.d.ts.map +1 -1
- package/build-types/dataform-controls/color.d.ts +6 -0
- package/build-types/dataform-controls/color.d.ts.map +1 -0
- package/build-types/dataform-controls/date.d.ts.map +1 -1
- package/build-types/dataform-controls/datetime.d.ts.map +1 -1
- package/build-types/dataform-controls/email.d.ts.map +1 -1
- package/build-types/dataform-controls/index.d.ts +1 -1
- package/build-types/dataform-controls/index.d.ts.map +1 -1
- package/build-types/dataform-controls/integer.d.ts.map +1 -1
- package/build-types/dataform-controls/password.d.ts +3 -0
- package/build-types/dataform-controls/password.d.ts.map +1 -0
- package/build-types/dataform-controls/radio.d.ts.map +1 -1
- package/build-types/dataform-controls/relative-date-control.d.ts +6 -5
- package/build-types/dataform-controls/relative-date-control.d.ts.map +1 -1
- package/build-types/dataform-controls/select.d.ts.map +1 -1
- package/build-types/dataform-controls/telephone.d.ts +6 -0
- package/build-types/dataform-controls/telephone.d.ts.map +1 -0
- package/build-types/dataform-controls/text.d.ts +1 -1
- package/build-types/dataform-controls/text.d.ts.map +1 -1
- package/build-types/dataform-controls/textarea.d.ts +6 -0
- package/build-types/dataform-controls/textarea.d.ts.map +1 -0
- package/build-types/dataform-controls/toggle-group.d.ts.map +1 -1
- package/build-types/dataform-controls/toggle.d.ts +6 -0
- package/build-types/dataform-controls/toggle.d.ts.map +1 -0
- package/build-types/dataform-controls/url.d.ts +6 -0
- package/build-types/dataform-controls/url.d.ts.map +1 -0
- package/build-types/dataform-controls/utils/validated-input.d.ts +20 -0
- package/build-types/dataform-controls/utils/validated-input.d.ts.map +1 -0
- package/build-types/dataforms-layouts/card/index.d.ts +0 -3
- package/build-types/dataforms-layouts/card/index.d.ts.map +1 -1
- package/build-types/dataforms-layouts/data-form-layout.d.ts +4 -1
- package/build-types/dataforms-layouts/data-form-layout.d.ts.map +1 -1
- package/build-types/dataforms-layouts/index.d.ts +10 -0
- package/build-types/dataforms-layouts/index.d.ts.map +1 -1
- package/build-types/dataforms-layouts/panel/dropdown.d.ts +2 -1
- package/build-types/dataforms-layouts/panel/dropdown.d.ts.map +1 -1
- package/build-types/dataforms-layouts/panel/index.d.ts.map +1 -1
- package/build-types/dataforms-layouts/panel/modal.d.ts +2 -1
- package/build-types/dataforms-layouts/panel/modal.d.ts.map +1 -1
- package/build-types/dataforms-layouts/panel/summary-button.d.ts +15 -0
- package/build-types/dataforms-layouts/panel/summary-button.d.ts.map +1 -0
- package/build-types/dataforms-layouts/regular/index.d.ts.map +1 -1
- package/build-types/dataforms-layouts/row/index.d.ts +6 -0
- package/build-types/dataforms-layouts/row/index.d.ts.map +1 -0
- package/build-types/dataviews-layouts/grid/index.d.ts.map +1 -1
- package/build-types/dataviews-layouts/index.d.ts +12 -1
- package/build-types/dataviews-layouts/index.d.ts.map +1 -1
- package/build-types/dataviews-layouts/list/index.d.ts.map +1 -1
- package/build-types/dataviews-layouts/picker-grid/index.d.ts +4 -0
- package/build-types/dataviews-layouts/picker-grid/index.d.ts.map +1 -0
- package/build-types/dataviews-layouts/table/index.d.ts.map +1 -1
- package/build-types/dataviews-layouts/utils/get-data-by-group.d.ts +6 -0
- package/build-types/dataviews-layouts/utils/get-data-by-group.d.ts.map +1 -0
- package/build-types/dataviews-layouts/utils/grid-items.d.ts +5 -0
- package/build-types/dataviews-layouts/utils/grid-items.d.ts.map +1 -0
- package/build-types/dataviews-layouts/utils/preview-size-picker.d.ts +2 -0
- package/build-types/dataviews-layouts/utils/preview-size-picker.d.ts.map +1 -0
- package/build-types/field-types/color.d.ts +20 -0
- package/build-types/field-types/color.d.ts.map +1 -0
- package/build-types/field-types/index.d.ts.map +1 -1
- package/build-types/field-types/password.d.ts +17 -0
- package/build-types/field-types/password.d.ts.map +1 -0
- package/build-types/field-types/stories/index.story.d.ts +85 -0
- package/build-types/field-types/stories/index.story.d.ts.map +1 -0
- package/build-types/field-types/telephone.d.ts +20 -0
- package/build-types/field-types/telephone.d.ts.map +1 -0
- package/build-types/field-types/url.d.ts +20 -0
- package/build-types/field-types/url.d.ts.map +1 -0
- package/build-types/normalize-fields.d.ts +3 -0
- package/build-types/normalize-fields.d.ts.map +1 -1
- package/build-types/normalize-form-fields.d.ts.map +1 -1
- package/build-types/test/dataviews-picker.d.ts +2 -0
- package/build-types/test/dataviews-picker.d.ts.map +1 -0
- package/build-types/types.d.ts +102 -8
- package/build-types/types.d.ts.map +1 -1
- package/build-types/validation.d.ts.map +1 -1
- package/build-wp/index.js +6380 -5012
- package/package.json +17 -15
- package/src/components/dataform/stories/index.story.tsx +822 -28
- package/src/components/dataform-context/index.tsx +1 -0
- package/src/components/dataviews/index.tsx +25 -1
- package/src/components/dataviews/stories/fixtures.tsx +100 -42
- package/src/components/dataviews/stories/index.story.tsx +16 -2
- package/src/components/dataviews/style.scss +4 -2
- package/src/components/dataviews-context/index.ts +3 -0
- package/src/components/dataviews-filters/input-widget.tsx +44 -5
- package/src/components/dataviews-layout/index.tsx +5 -3
- package/src/components/dataviews-picker/footer.tsx +207 -0
- package/src/components/dataviews-picker/index.tsx +284 -0
- package/src/components/dataviews-picker/stories/index.story.tsx +251 -0
- package/src/components/dataviews-picker/style.scss +10 -0
- package/src/components/dataviews-selection-checkbox/index.tsx +3 -0
- package/src/components/dataviews-view-config/index.tsx +1 -0
- package/src/constants.ts +3 -0
- package/src/dataform-controls/array.tsx +4 -6
- package/src/dataform-controls/checkbox.tsx +54 -7
- package/src/dataform-controls/color.tsx +148 -0
- package/src/dataform-controls/date.tsx +47 -21
- package/src/dataform-controls/datetime.tsx +171 -23
- package/src/dataform-controls/email.tsx +18 -52
- package/src/dataform-controls/index.tsx +38 -2
- package/src/dataform-controls/integer.tsx +82 -49
- package/src/dataform-controls/password.tsx +50 -0
- package/src/dataform-controls/radio.tsx +53 -11
- package/src/dataform-controls/relative-date-control.tsx +11 -10
- package/src/dataform-controls/select.tsx +53 -10
- package/src/dataform-controls/telephone.tsx +38 -0
- package/src/dataform-controls/text.tsx +12 -50
- package/src/dataform-controls/textarea.tsx +85 -0
- package/src/dataform-controls/toggle-group.tsx +50 -10
- package/src/dataform-controls/toggle.tsx +79 -0
- package/src/dataform-controls/url.tsx +38 -0
- package/src/dataform-controls/utils/validated-input.tsx +109 -0
- package/src/dataforms-layouts/card/index.tsx +5 -4
- package/src/dataforms-layouts/card/style.scss +7 -0
- package/src/dataforms-layouts/data-form-layout.tsx +15 -3
- package/src/dataforms-layouts/index.tsx +35 -0
- package/src/dataforms-layouts/panel/dropdown.tsx +12 -23
- package/src/dataforms-layouts/panel/index.tsx +39 -16
- package/src/dataforms-layouts/panel/modal.tsx +24 -30
- package/src/dataforms-layouts/panel/summary-button.tsx +92 -0
- package/src/dataforms-layouts/regular/index.tsx +9 -7
- package/src/dataforms-layouts/regular/style.scss +0 -6
- package/src/dataforms-layouts/row/index.tsx +115 -0
- package/src/dataforms-layouts/row/style.scss +3 -0
- package/src/dataviews-layouts/grid/index.tsx +47 -47
- package/src/dataviews-layouts/grid/style.scss +43 -20
- package/src/dataviews-layouts/index.ts +16 -2
- package/src/dataviews-layouts/list/index.tsx +74 -2
- package/src/dataviews-layouts/list/style.scss +8 -0
- package/src/dataviews-layouts/picker-grid/index.tsx +486 -0
- package/src/dataviews-layouts/picker-grid/style.scss +171 -0
- package/src/dataviews-layouts/table/index.tsx +10 -14
- package/src/dataviews-layouts/utils/get-data-by-group.ts +18 -0
- package/src/dataviews-layouts/utils/grid-items.scss +21 -0
- package/src/dataviews-layouts/utils/grid-items.tsx +35 -0
- package/src/dataviews-layouts/utils/preview-size-picker.tsx +87 -0
- package/src/field-types/boolean.tsx +1 -1
- package/src/field-types/color.tsx +115 -0
- package/src/field-types/index.tsx +20 -0
- package/src/field-types/password.tsx +46 -0
- package/src/field-types/stories/index.story.tsx +856 -0
- package/src/field-types/telephone.tsx +71 -0
- package/src/field-types/url.tsx +71 -0
- package/src/normalize-fields.ts +18 -0
- package/src/normalize-form-fields.ts +6 -0
- package/src/style.scss +4 -0
- package/src/test/dataform.tsx +2 -2
- package/src/test/dataviews-picker.tsx +478 -0
- package/src/test/dataviews.tsx +86 -0
- package/src/test/filter-and-sort-data-view.js +148 -138
- package/src/test/normalize-fields.ts +114 -0
- package/src/types.ts +130 -7
- package/src/validation.ts +5 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/build/dataform-controls/boolean.js +0 -64
- package/build/dataform-controls/boolean.js.map +0 -1
- package/build-module/dataform-controls/boolean.js +0 -58
- package/build-module/dataform-controls/boolean.js.map +0 -1
- package/build-types/components/stories/index.story.d.ts +0 -63
- package/build-types/components/stories/index.story.d.ts.map +0 -1
- package/build-types/dataform-controls/boolean.d.ts +0 -6
- package/build-types/dataform-controls/boolean.d.ts.map +0 -1
- package/src/components/stories/index.story.tsx +0 -372
- package/src/dataform-controls/boolean.tsx +0 -61
|
@@ -0,0 +1,478 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* External dependencies
|
|
3
|
+
*/
|
|
4
|
+
import { render, screen, within } from '@testing-library/react';
|
|
5
|
+
import userEvent from '@testing-library/user-event';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* WordPress dependencies
|
|
9
|
+
*/
|
|
10
|
+
import { useMemo, useState } from '@wordpress/element';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Internal dependencies
|
|
14
|
+
*/
|
|
15
|
+
import DataViewsPicker from '../components/dataviews-picker';
|
|
16
|
+
import { LAYOUT_PICKER_GRID } from '../constants';
|
|
17
|
+
import type { ActionButton, View, ViewPickerGrid } from '../types';
|
|
18
|
+
import { filterSortAndPaginate } from '../filter-and-sort-data-view';
|
|
19
|
+
|
|
20
|
+
type Data = {
|
|
21
|
+
id: number;
|
|
22
|
+
title: string;
|
|
23
|
+
author?: number;
|
|
24
|
+
order?: number;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const onChangeSelection = jest.fn();
|
|
28
|
+
|
|
29
|
+
const data: Data[] = [
|
|
30
|
+
{
|
|
31
|
+
id: 1,
|
|
32
|
+
title: 'Hello World',
|
|
33
|
+
author: 1,
|
|
34
|
+
order: 1,
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
id: 2,
|
|
38
|
+
title: 'Homepage',
|
|
39
|
+
author: 2,
|
|
40
|
+
order: 1,
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
id: 3,
|
|
44
|
+
title: 'Posts',
|
|
45
|
+
author: 2,
|
|
46
|
+
order: 1,
|
|
47
|
+
},
|
|
48
|
+
];
|
|
49
|
+
|
|
50
|
+
const singleSelectCallback = jest.fn();
|
|
51
|
+
const singleSelectActions: ActionButton< Data >[] = [
|
|
52
|
+
{
|
|
53
|
+
id: 'confirm',
|
|
54
|
+
label: 'Confirm',
|
|
55
|
+
supportsBulk: false,
|
|
56
|
+
isPrimary: true,
|
|
57
|
+
callback: singleSelectCallback,
|
|
58
|
+
},
|
|
59
|
+
];
|
|
60
|
+
|
|
61
|
+
const multiSelectCallback = jest.fn();
|
|
62
|
+
const multiSelectActions: ActionButton< Data >[] = [
|
|
63
|
+
{
|
|
64
|
+
id: 'confirm',
|
|
65
|
+
label: 'Confirm',
|
|
66
|
+
supportsBulk: true,
|
|
67
|
+
isPrimary: true,
|
|
68
|
+
icon: 'check',
|
|
69
|
+
callback: multiSelectCallback,
|
|
70
|
+
},
|
|
71
|
+
];
|
|
72
|
+
|
|
73
|
+
function Picker( {
|
|
74
|
+
view: additionalView,
|
|
75
|
+
actions,
|
|
76
|
+
label,
|
|
77
|
+
multiselect,
|
|
78
|
+
...props
|
|
79
|
+
}: {
|
|
80
|
+
actions?: ActionButton< Data >[];
|
|
81
|
+
view?: Partial< View >;
|
|
82
|
+
label?: string;
|
|
83
|
+
multiselect?: boolean;
|
|
84
|
+
} ) {
|
|
85
|
+
const [ view, setView ] = useState< View >( {
|
|
86
|
+
type: LAYOUT_PICKER_GRID,
|
|
87
|
+
fields: [],
|
|
88
|
+
titleField: 'title',
|
|
89
|
+
mediaField: 'image',
|
|
90
|
+
search: '',
|
|
91
|
+
page: 1,
|
|
92
|
+
perPage: 10,
|
|
93
|
+
filters: [],
|
|
94
|
+
...additionalView,
|
|
95
|
+
} as ViewPickerGrid );
|
|
96
|
+
|
|
97
|
+
const [ selection, setSelection ] = useState< string[] >( [] );
|
|
98
|
+
|
|
99
|
+
const { data: shownData, paginationInfo } = useMemo( () => {
|
|
100
|
+
return filterSortAndPaginate( data, view, [] );
|
|
101
|
+
}, [ view ] );
|
|
102
|
+
|
|
103
|
+
const dataViewProps = {
|
|
104
|
+
actions,
|
|
105
|
+
picker: true,
|
|
106
|
+
getItemId: ( item: Data ) => item.id.toString(),
|
|
107
|
+
paginationInfo,
|
|
108
|
+
data: shownData,
|
|
109
|
+
view,
|
|
110
|
+
defaultLayouts: { [ LAYOUT_PICKER_GRID ]: {} },
|
|
111
|
+
fields: [],
|
|
112
|
+
onChangeView: setView,
|
|
113
|
+
multiselect,
|
|
114
|
+
selection,
|
|
115
|
+
itemListLabel: label,
|
|
116
|
+
onChangeSelection: ( newSelection: string[] ) => {
|
|
117
|
+
onChangeSelection( newSelection );
|
|
118
|
+
setSelection( newSelection );
|
|
119
|
+
},
|
|
120
|
+
...props,
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
return <DataViewsPicker { ...dataViewProps } />;
|
|
124
|
+
}
|
|
125
|
+
describe( 'DataViews Picker', () => {
|
|
126
|
+
describe( 'Grid layout', () => {
|
|
127
|
+
it( 'renders the grid as a `listbox` role, with items as `option` roles', () => {
|
|
128
|
+
render( <Picker /> );
|
|
129
|
+
|
|
130
|
+
// Grid should have listbox role
|
|
131
|
+
expect( screen.getByRole( 'listbox' ) ).toBeInTheDocument();
|
|
132
|
+
|
|
133
|
+
// Each data item should have option role
|
|
134
|
+
const options = screen.getAllByRole( 'option' );
|
|
135
|
+
expect( options ).toHaveLength( data.length );
|
|
136
|
+
} );
|
|
137
|
+
|
|
138
|
+
it( 'supports specifying a `label` which is rendered as an aria-label', () => {
|
|
139
|
+
const testLabel = 'Select an item from the grid';
|
|
140
|
+
render( <Picker label={ testLabel } /> );
|
|
141
|
+
|
|
142
|
+
// Grid should have the specified aria-label
|
|
143
|
+
expect(
|
|
144
|
+
screen.getByRole( 'listbox', { name: testLabel } )
|
|
145
|
+
).toBeInTheDocument();
|
|
146
|
+
} );
|
|
147
|
+
|
|
148
|
+
it( 'implements single tab-stop composite pattern with aria-activedescendant', async () => {
|
|
149
|
+
render( <Picker /> );
|
|
150
|
+
|
|
151
|
+
// Grid should be tabbable as the main composite widget
|
|
152
|
+
const grid = screen.getByRole( 'listbox' );
|
|
153
|
+
expect( grid ).toHaveAttribute( 'tabindex', '0' );
|
|
154
|
+
|
|
155
|
+
// Individual options exist but are managed by composite pattern
|
|
156
|
+
const options = screen.getAllByRole( 'option' );
|
|
157
|
+
expect( options.length ).toBeGreaterThan( 0 );
|
|
158
|
+
|
|
159
|
+
const user = userEvent.setup();
|
|
160
|
+
|
|
161
|
+
const viewOptionsButton = screen.getByRole( 'button', {
|
|
162
|
+
name: 'View options',
|
|
163
|
+
} );
|
|
164
|
+
|
|
165
|
+
// Focus the viewOptions button, which is just before the grid.
|
|
166
|
+
viewOptionsButton.focus();
|
|
167
|
+
expect( viewOptionsButton ).toHaveFocus();
|
|
168
|
+
|
|
169
|
+
// Tab to the grid (single tab-stop for the entire grid)
|
|
170
|
+
await user.keyboard( '{Tab}' );
|
|
171
|
+
expect( grid ).toHaveFocus();
|
|
172
|
+
|
|
173
|
+
// Test aria-activedescendant behavior
|
|
174
|
+
// Trigger navigation to establish aria-activedescendant
|
|
175
|
+
await user.keyboard( '{ArrowRight}' );
|
|
176
|
+
await user.keyboard( '{ArrowLeft}' );
|
|
177
|
+
const firstActiveDescendant = grid.getAttribute(
|
|
178
|
+
'aria-activedescendant'
|
|
179
|
+
);
|
|
180
|
+
|
|
181
|
+
expect( firstActiveDescendant ).toBeTruthy();
|
|
182
|
+
expect( firstActiveDescendant ).toBe( options[ 0 ].id );
|
|
183
|
+
|
|
184
|
+
// Navigate with arrow keys to test aria-activedescendant changes
|
|
185
|
+
await user.keyboard( '{ArrowRight}' );
|
|
186
|
+
expect( grid ).toHaveFocus();
|
|
187
|
+
|
|
188
|
+
// Check that aria-activedescendant changed after navigation
|
|
189
|
+
const secondActiveDescendant = grid.getAttribute(
|
|
190
|
+
'aria-activedescendant'
|
|
191
|
+
);
|
|
192
|
+
expect( secondActiveDescendant ).toBeTruthy();
|
|
193
|
+
expect( secondActiveDescendant ).toBe( options[ 1 ].id );
|
|
194
|
+
expect( secondActiveDescendant ).not.toBe( firstActiveDescendant );
|
|
195
|
+
|
|
196
|
+
// Navigate to third option
|
|
197
|
+
await user.keyboard( '{ArrowRight}' );
|
|
198
|
+
expect( grid ).toHaveFocus();
|
|
199
|
+
|
|
200
|
+
const thirdActiveDescendant = grid.getAttribute(
|
|
201
|
+
'aria-activedescendant'
|
|
202
|
+
);
|
|
203
|
+
expect( thirdActiveDescendant ).toBeTruthy();
|
|
204
|
+
expect( thirdActiveDescendant ).toBe( options[ 2 ].id );
|
|
205
|
+
expect( thirdActiveDescendant ).not.toBe( firstActiveDescendant );
|
|
206
|
+
expect( thirdActiveDescendant ).not.toBe( secondActiveDescendant );
|
|
207
|
+
|
|
208
|
+
// Navigate back to first option
|
|
209
|
+
await user.keyboard( '{ArrowLeft}' );
|
|
210
|
+
expect( grid ).toHaveFocus();
|
|
211
|
+
|
|
212
|
+
await user.keyboard( '{ArrowLeft}' );
|
|
213
|
+
expect( grid ).toHaveFocus();
|
|
214
|
+
|
|
215
|
+
// Verify aria-activedescendant is back to first option
|
|
216
|
+
const backToFirstActiveDescendant = grid.getAttribute(
|
|
217
|
+
'aria-activedescendant'
|
|
218
|
+
);
|
|
219
|
+
expect( backToFirstActiveDescendant ).toBe( firstActiveDescendant );
|
|
220
|
+
expect( backToFirstActiveDescendant ).toBe( options[ 0 ].id );
|
|
221
|
+
|
|
222
|
+
// Tab should move focus away from the grid entirely
|
|
223
|
+
await user.keyboard( '{Tab}' );
|
|
224
|
+
expect( grid ).not.toHaveFocus();
|
|
225
|
+
|
|
226
|
+
// Shift+Tab should move back to the grid
|
|
227
|
+
await user.keyboard( '{Shift>}{Tab}{/Shift}' );
|
|
228
|
+
expect( grid ).toHaveFocus();
|
|
229
|
+
|
|
230
|
+
// aria-activedescendant should be maintained when returning to grid
|
|
231
|
+
expect( grid.getAttribute( 'aria-activedescendant' ) ).toBeTruthy();
|
|
232
|
+
} );
|
|
233
|
+
|
|
234
|
+
describe( 'Single selection', () => {
|
|
235
|
+
it( 'maintains only a single selected item and calls the `onChangeSelection` callback when the selection changes', async () => {
|
|
236
|
+
render( <Picker actions={ singleSelectActions } /> );
|
|
237
|
+
|
|
238
|
+
const user = userEvent.setup();
|
|
239
|
+
const listbox = screen.getByRole( 'listbox' );
|
|
240
|
+
const options = within( listbox ).getAllByRole( 'option' );
|
|
241
|
+
|
|
242
|
+
// Click first item
|
|
243
|
+
await user.click( options[ 0 ] );
|
|
244
|
+
expect( options[ 0 ] ).toHaveAttribute(
|
|
245
|
+
'aria-selected',
|
|
246
|
+
'true'
|
|
247
|
+
);
|
|
248
|
+
expect( options[ 1 ] ).toHaveAttribute(
|
|
249
|
+
'aria-selected',
|
|
250
|
+
'false'
|
|
251
|
+
);
|
|
252
|
+
expect( options[ 2 ] ).toHaveAttribute(
|
|
253
|
+
'aria-selected',
|
|
254
|
+
'false'
|
|
255
|
+
);
|
|
256
|
+
expect( onChangeSelection ).toHaveBeenCalledWith( [
|
|
257
|
+
data[ 0 ].id.toString(),
|
|
258
|
+
] );
|
|
259
|
+
|
|
260
|
+
// Click second item - should deselect first
|
|
261
|
+
await user.click( options[ 1 ] );
|
|
262
|
+
expect( options[ 0 ] ).toHaveAttribute(
|
|
263
|
+
'aria-selected',
|
|
264
|
+
'false'
|
|
265
|
+
);
|
|
266
|
+
expect( options[ 1 ] ).toHaveAttribute(
|
|
267
|
+
'aria-selected',
|
|
268
|
+
'true'
|
|
269
|
+
);
|
|
270
|
+
expect( options[ 2 ] ).toHaveAttribute(
|
|
271
|
+
'aria-selected',
|
|
272
|
+
'false'
|
|
273
|
+
);
|
|
274
|
+
expect( onChangeSelection ).toHaveBeenCalledWith( [
|
|
275
|
+
data[ 1 ].id.toString(),
|
|
276
|
+
] );
|
|
277
|
+
} );
|
|
278
|
+
|
|
279
|
+
it( 'calls the action callback when the action button is clicked', async () => {
|
|
280
|
+
render( <Picker actions={ singleSelectActions } /> );
|
|
281
|
+
|
|
282
|
+
const user = userEvent.setup();
|
|
283
|
+
const options = screen.getAllByRole( 'option' );
|
|
284
|
+
|
|
285
|
+
// Select first item
|
|
286
|
+
await user.click( options[ 0 ] );
|
|
287
|
+
expect( options[ 0 ] ).toHaveAttribute(
|
|
288
|
+
'aria-selected',
|
|
289
|
+
'true'
|
|
290
|
+
);
|
|
291
|
+
|
|
292
|
+
// Find the action button with correct label within the action buttons container
|
|
293
|
+
const confirmButton = screen.getByRole( 'button', {
|
|
294
|
+
name: 'Confirm',
|
|
295
|
+
} );
|
|
296
|
+
expect( confirmButton ).toBeInTheDocument();
|
|
297
|
+
|
|
298
|
+
// Clear any previous calls and click the action button
|
|
299
|
+
singleSelectCallback.mockClear();
|
|
300
|
+
await user.click( confirmButton );
|
|
301
|
+
|
|
302
|
+
// Verify the callback was called with correct parameters
|
|
303
|
+
expect( singleSelectCallback ).toHaveBeenCalledTimes( 1 );
|
|
304
|
+
} );
|
|
305
|
+
} );
|
|
306
|
+
|
|
307
|
+
describe( 'Multi selection', () => {
|
|
308
|
+
it( 'adds the `aria-multiselectable` attribute to the listbox', () => {
|
|
309
|
+
render( <Picker actions={ multiSelectActions } /> );
|
|
310
|
+
|
|
311
|
+
const listbox = screen.getByRole( 'listbox' );
|
|
312
|
+
expect( listbox ).toHaveAttribute(
|
|
313
|
+
'aria-multiselectable',
|
|
314
|
+
'true'
|
|
315
|
+
);
|
|
316
|
+
} );
|
|
317
|
+
|
|
318
|
+
it( 'supports multiple selected items and calls the `onChangeSelection` callback when the selection changes', async () => {
|
|
319
|
+
// Test multi-selection by clicking multiple items
|
|
320
|
+
render( <Picker actions={ multiSelectActions } /> );
|
|
321
|
+
|
|
322
|
+
const user = userEvent.setup();
|
|
323
|
+
const listbox = screen.getByRole( 'listbox' );
|
|
324
|
+
const options = within( listbox ).getAllByRole( 'option' );
|
|
325
|
+
|
|
326
|
+
// Click first item
|
|
327
|
+
await user.click( options[ 0 ] );
|
|
328
|
+
expect( options[ 0 ] ).toHaveAttribute(
|
|
329
|
+
'aria-selected',
|
|
330
|
+
'true'
|
|
331
|
+
);
|
|
332
|
+
expect( options[ 1 ] ).toHaveAttribute(
|
|
333
|
+
'aria-selected',
|
|
334
|
+
'false'
|
|
335
|
+
);
|
|
336
|
+
expect( onChangeSelection ).toHaveBeenCalledWith( [
|
|
337
|
+
data[ 0 ].id.toString(),
|
|
338
|
+
] );
|
|
339
|
+
|
|
340
|
+
// Click second item - both should remain selected in multi-select mode
|
|
341
|
+
await user.click( options[ 1 ] );
|
|
342
|
+
expect( options[ 0 ] ).toHaveAttribute(
|
|
343
|
+
'aria-selected',
|
|
344
|
+
'true'
|
|
345
|
+
);
|
|
346
|
+
expect( options[ 1 ] ).toHaveAttribute(
|
|
347
|
+
'aria-selected',
|
|
348
|
+
'true'
|
|
349
|
+
);
|
|
350
|
+
expect( onChangeSelection ).toHaveBeenCalledWith( [
|
|
351
|
+
data[ 0 ].id.toString(),
|
|
352
|
+
data[ 1 ].id.toString(),
|
|
353
|
+
] );
|
|
354
|
+
|
|
355
|
+
// Click first item again to deselect it
|
|
356
|
+
await user.click( options[ 0 ] );
|
|
357
|
+
expect( options[ 0 ] ).toHaveAttribute(
|
|
358
|
+
'aria-selected',
|
|
359
|
+
'false'
|
|
360
|
+
);
|
|
361
|
+
expect( options[ 1 ] ).toHaveAttribute(
|
|
362
|
+
'aria-selected',
|
|
363
|
+
'true'
|
|
364
|
+
);
|
|
365
|
+
expect( onChangeSelection ).toHaveBeenCalledWith( [
|
|
366
|
+
data[ 1 ].id.toString(),
|
|
367
|
+
] );
|
|
368
|
+
} );
|
|
369
|
+
|
|
370
|
+
it( 'calls the action callback when the action button is clicked', async () => {
|
|
371
|
+
render( <Picker actions={ multiSelectActions } /> );
|
|
372
|
+
|
|
373
|
+
const user = userEvent.setup();
|
|
374
|
+
const options = screen.getAllByRole( 'option' );
|
|
375
|
+
|
|
376
|
+
// Select multiple items
|
|
377
|
+
await user.click( options[ 0 ] );
|
|
378
|
+
await user.click( options[ 1 ] );
|
|
379
|
+
|
|
380
|
+
expect( options[ 0 ] ).toHaveAttribute(
|
|
381
|
+
'aria-selected',
|
|
382
|
+
'true'
|
|
383
|
+
);
|
|
384
|
+
expect( options[ 1 ] ).toHaveAttribute(
|
|
385
|
+
'aria-selected',
|
|
386
|
+
'true'
|
|
387
|
+
);
|
|
388
|
+
|
|
389
|
+
// Third item should remain unselected
|
|
390
|
+
expect( options[ 2 ] ).toHaveAttribute(
|
|
391
|
+
'aria-selected',
|
|
392
|
+
'false'
|
|
393
|
+
);
|
|
394
|
+
|
|
395
|
+
// Find the action button with correct label within the action buttons container
|
|
396
|
+
const confirmButton = screen.getByRole( 'button', {
|
|
397
|
+
name: 'Confirm',
|
|
398
|
+
} );
|
|
399
|
+
expect( confirmButton ).toBeInTheDocument();
|
|
400
|
+
|
|
401
|
+
// Clear any previous calls and click the action button
|
|
402
|
+
multiSelectCallback.mockClear();
|
|
403
|
+
await user.click( confirmButton );
|
|
404
|
+
|
|
405
|
+
// Verify the callback was called with correct parameters for multi-selection
|
|
406
|
+
expect( multiSelectCallback ).toHaveBeenCalledTimes( 1 );
|
|
407
|
+
} );
|
|
408
|
+
|
|
409
|
+
it( 'maintains the selected items when navigating between pages for a paginated view', async () => {
|
|
410
|
+
// Create a component with pagination (2 items per page)
|
|
411
|
+
render(
|
|
412
|
+
<Picker
|
|
413
|
+
actions={ multiSelectActions }
|
|
414
|
+
view={ {
|
|
415
|
+
type: LAYOUT_PICKER_GRID,
|
|
416
|
+
fields: [],
|
|
417
|
+
titleField: 'title',
|
|
418
|
+
mediaField: 'image',
|
|
419
|
+
search: '',
|
|
420
|
+
page: 1,
|
|
421
|
+
perPage: 2, // Only 2 items per page to force pagination
|
|
422
|
+
filters: [],
|
|
423
|
+
} }
|
|
424
|
+
/>
|
|
425
|
+
);
|
|
426
|
+
|
|
427
|
+
const user = userEvent.setup();
|
|
428
|
+
const listbox = screen.getByRole( 'listbox' );
|
|
429
|
+
|
|
430
|
+
// Page 1: Select first item
|
|
431
|
+
let options = within( listbox ).getAllByRole( 'option' );
|
|
432
|
+
expect( options ).toHaveLength( 2 ); // Should show 2 items per page
|
|
433
|
+
|
|
434
|
+
await user.click( options[ 0 ] );
|
|
435
|
+
expect( options[ 0 ] ).toHaveAttribute(
|
|
436
|
+
'aria-selected',
|
|
437
|
+
'true'
|
|
438
|
+
);
|
|
439
|
+
expect( onChangeSelection ).toHaveBeenCalledWith( [
|
|
440
|
+
data[ 0 ].id.toString(),
|
|
441
|
+
] );
|
|
442
|
+
|
|
443
|
+
// Navigate to page 2
|
|
444
|
+
const nextButton = screen.getByRole( 'button', {
|
|
445
|
+
name: /next/i,
|
|
446
|
+
} );
|
|
447
|
+
await user.click( nextButton );
|
|
448
|
+
|
|
449
|
+
// Page 2: Select another item
|
|
450
|
+
options = within( listbox ).getAllByRole( 'option' );
|
|
451
|
+
expect( options ).toHaveLength( 1 ); // Page 2 should have 1 item (item 3)
|
|
452
|
+
|
|
453
|
+
await user.click( options[ 0 ] );
|
|
454
|
+
expect( options[ 0 ] ).toHaveAttribute(
|
|
455
|
+
'aria-selected',
|
|
456
|
+
'true'
|
|
457
|
+
);
|
|
458
|
+
expect( onChangeSelection ).toHaveBeenCalledWith( [
|
|
459
|
+
data[ 0 ].id.toString(),
|
|
460
|
+
data[ 2 ].id.toString(),
|
|
461
|
+
] );
|
|
462
|
+
|
|
463
|
+
// Go back to page 1
|
|
464
|
+
const prevButton = screen.getByRole( 'button', {
|
|
465
|
+
name: /previous/i,
|
|
466
|
+
} );
|
|
467
|
+
await user.click( prevButton );
|
|
468
|
+
|
|
469
|
+
// Verify first item is still selected
|
|
470
|
+
options = within( listbox ).getAllByRole( 'option' );
|
|
471
|
+
expect( options[ 0 ] ).toHaveAttribute(
|
|
472
|
+
'aria-selected',
|
|
473
|
+
'true'
|
|
474
|
+
);
|
|
475
|
+
} );
|
|
476
|
+
} );
|
|
477
|
+
} );
|
|
478
|
+
} );
|
package/src/test/dataviews.tsx
CHANGED
|
@@ -510,6 +510,92 @@ describe( 'DataViews component', () => {
|
|
|
510
510
|
await user.keyboard( '{/Control}' );
|
|
511
511
|
} );
|
|
512
512
|
|
|
513
|
+
it( 'supports tabbing to selection and actions when title is visible', async () => {
|
|
514
|
+
render(
|
|
515
|
+
<DataViewWrapper
|
|
516
|
+
view={ {
|
|
517
|
+
...DEFAULT_VIEW,
|
|
518
|
+
type: 'grid',
|
|
519
|
+
fields: [],
|
|
520
|
+
mediaField: 'image',
|
|
521
|
+
titleField: 'title',
|
|
522
|
+
} }
|
|
523
|
+
isItemClickable={ () => true }
|
|
524
|
+
actions={ actions }
|
|
525
|
+
/>
|
|
526
|
+
);
|
|
527
|
+
|
|
528
|
+
// Double check that the title is being rendered.
|
|
529
|
+
expect( screen.getByText( data[ 0 ].title ) ).toBeInTheDocument();
|
|
530
|
+
|
|
531
|
+
const viewOptionsButton = screen.getByRole( 'button', {
|
|
532
|
+
name: 'View options',
|
|
533
|
+
} );
|
|
534
|
+
|
|
535
|
+
const user = userEvent.setup();
|
|
536
|
+
|
|
537
|
+
// Double click to open and then close view options. This is performed
|
|
538
|
+
// instead of a direct .focus() so that effects have time to complete.
|
|
539
|
+
await user.click( viewOptionsButton );
|
|
540
|
+
await user.click( viewOptionsButton );
|
|
541
|
+
|
|
542
|
+
await user.tab();
|
|
543
|
+
|
|
544
|
+
expect(
|
|
545
|
+
screen.getByRole( 'checkbox', { name: data[ 0 ].title } )
|
|
546
|
+
).toHaveFocus();
|
|
547
|
+
|
|
548
|
+
await user.tab();
|
|
549
|
+
|
|
550
|
+
expect(
|
|
551
|
+
screen.getAllByRole( 'button', { name: 'Actions' } )[ 0 ]
|
|
552
|
+
).toHaveFocus();
|
|
553
|
+
} );
|
|
554
|
+
|
|
555
|
+
it( 'supports tabbing to selection and actions when title is not visible', async () => {
|
|
556
|
+
render(
|
|
557
|
+
<DataViewWrapper
|
|
558
|
+
view={ {
|
|
559
|
+
...DEFAULT_VIEW,
|
|
560
|
+
type: 'grid',
|
|
561
|
+
fields: [],
|
|
562
|
+
mediaField: 'image',
|
|
563
|
+
titleField: 'title',
|
|
564
|
+
showTitle: false,
|
|
565
|
+
} }
|
|
566
|
+
isItemClickable={ () => true }
|
|
567
|
+
actions={ actions }
|
|
568
|
+
/>
|
|
569
|
+
);
|
|
570
|
+
|
|
571
|
+
// Double check that the title is not being rendered.
|
|
572
|
+
expect(
|
|
573
|
+
screen.queryByText( data[ 0 ].title )
|
|
574
|
+
).not.toBeInTheDocument();
|
|
575
|
+
|
|
576
|
+
const viewOptionsButton = screen.getByRole( 'button', {
|
|
577
|
+
name: 'View options',
|
|
578
|
+
} );
|
|
579
|
+
|
|
580
|
+
const user = userEvent.setup();
|
|
581
|
+
|
|
582
|
+
// Double click to open and then close view options. This is performed
|
|
583
|
+
// instead of a direct .focus() so that effects have time to complete.
|
|
584
|
+
await user.click( viewOptionsButton );
|
|
585
|
+
await user.click( viewOptionsButton );
|
|
586
|
+
await user.tab();
|
|
587
|
+
|
|
588
|
+
expect(
|
|
589
|
+
screen.getByRole( 'checkbox', { name: data[ 0 ].title } )
|
|
590
|
+
).toHaveFocus();
|
|
591
|
+
|
|
592
|
+
await user.tab();
|
|
593
|
+
|
|
594
|
+
expect(
|
|
595
|
+
screen.getAllByRole( 'button', { name: 'Actions' } )[ 0 ]
|
|
596
|
+
).toHaveFocus();
|
|
597
|
+
} );
|
|
598
|
+
|
|
513
599
|
it( 'accepts an invalid previewSize and the preview size picker falls back to another size', async () => {
|
|
514
600
|
render(
|
|
515
601
|
<DataViewWrapper
|