@wordpress/dataviews 10.2.0 → 10.3.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 +25 -0
- package/README.md +108 -1
- package/build/components/dataform/index.js +6 -2
- package/build/components/dataform/index.js.map +3 -3
- package/build/components/dataform-context/index.js +4 -2
- package/build/components/dataform-context/index.js.map +1 -1
- package/build/components/dataviews/index.js +8 -6
- package/build/components/dataviews/index.js.map +1 -1
- package/build/components/dataviews-bulk-actions/index.js +4 -2
- package/build/components/dataviews-bulk-actions/index.js.map +1 -1
- package/build/components/dataviews-context/index.js +3 -1
- package/build/components/dataviews-context/index.js.map +1 -1
- package/build/components/dataviews-filters/add-filter.js +4 -2
- package/build/components/dataviews-filters/add-filter.js.map +1 -1
- package/build/components/dataviews-filters/filter.js +20 -5
- package/build/components/dataviews-filters/filter.js.map +3 -3
- package/build/components/dataviews-filters/filters-toggled.js +3 -1
- package/build/components/dataviews-filters/filters-toggled.js.map +1 -1
- package/build/components/dataviews-filters/filters.js +3 -1
- package/build/components/dataviews-filters/filters.js.map +1 -1
- package/build/components/dataviews-filters/index.js +2 -0
- package/build/components/dataviews-filters/index.js.map +1 -1
- package/build/components/dataviews-filters/input-widget.js +3 -1
- package/build/components/dataviews-filters/input-widget.js.map +1 -1
- package/build/components/dataviews-filters/reset-filters.js +3 -1
- package/build/components/dataviews-filters/reset-filters.js.map +1 -1
- package/build/components/dataviews-filters/search-widget.js +8 -6
- package/build/components/dataviews-filters/search-widget.js.map +2 -2
- package/build/components/dataviews-filters/toggle.js +3 -1
- package/build/components/dataviews-filters/toggle.js.map +1 -1
- package/build/components/dataviews-filters/use-filters.js +2 -0
- package/build/components/dataviews-filters/use-filters.js.map +1 -1
- package/build/components/dataviews-filters/utils.js +4 -2
- package/build/components/dataviews-filters/utils.js.map +1 -1
- package/build/components/dataviews-footer/index.js +4 -2
- package/build/components/dataviews-footer/index.js.map +1 -1
- package/build/components/dataviews-item-actions/index.js +23 -4
- package/build/components/dataviews-item-actions/index.js.map +2 -2
- package/build/components/dataviews-layout/index.js +3 -1
- package/build/components/dataviews-layout/index.js.map +1 -1
- package/build/components/dataviews-pagination/index.js +3 -1
- package/build/components/dataviews-pagination/index.js.map +1 -1
- package/build/components/dataviews-picker/footer.js +4 -2
- package/build/components/dataviews-picker/footer.js.map +1 -1
- package/build/components/dataviews-picker/index.js +8 -6
- package/build/components/dataviews-picker/index.js.map +1 -1
- package/build/components/dataviews-search/index.js +4 -2
- package/build/components/dataviews-search/index.js.map +1 -1
- package/build/components/dataviews-selection-checkbox/index.js +3 -1
- package/build/components/dataviews-selection-checkbox/index.js.map +1 -1
- package/build/components/dataviews-view-config/index.js +17 -400
- package/build/components/dataviews-view-config/index.js.map +3 -3
- package/build/components/dataviews-view-config/infinite-scroll-toggle.js +3 -1
- package/build/components/dataviews-view-config/infinite-scroll-toggle.js.map +1 -1
- package/build/components/dataviews-view-config/properties-section.js +177 -0
- package/build/components/dataviews-view-config/properties-section.js.map +7 -0
- package/build/constants.js +39 -34
- package/build/constants.js.map +2 -2
- package/build/dataform-controls/array.js +4 -2
- package/build/dataform-controls/array.js.map +1 -1
- package/build/dataform-controls/checkbox.js +4 -2
- package/build/dataform-controls/checkbox.js.map +1 -1
- package/build/dataform-controls/color.js +5 -3
- package/build/dataform-controls/color.js.map +1 -1
- package/build/dataform-controls/date.js +8 -6
- package/build/dataform-controls/date.js.map +1 -1
- package/build/dataform-controls/datetime.js +11 -15
- package/build/dataform-controls/datetime.js.map +3 -3
- package/build/dataform-controls/email.js +3 -1
- package/build/dataform-controls/email.js.map +1 -1
- package/build/dataform-controls/index.js +4 -2
- package/build/dataform-controls/index.js.map +1 -1
- package/build/dataform-controls/integer.js +3 -1
- package/build/dataform-controls/integer.js.map +1 -1
- package/build/dataform-controls/number.js +3 -1
- package/build/dataform-controls/number.js.map +1 -1
- package/build/dataform-controls/password.js +3 -1
- package/build/dataform-controls/password.js.map +1 -1
- package/build/dataform-controls/radio.js +4 -2
- package/build/dataform-controls/radio.js.map +1 -1
- package/build/dataform-controls/select.js +4 -2
- package/build/dataform-controls/select.js.map +1 -1
- package/build/dataform-controls/telephone.js +3 -1
- package/build/dataform-controls/telephone.js.map +1 -1
- package/build/dataform-controls/text.js +3 -1
- package/build/dataform-controls/text.js.map +1 -1
- package/build/dataform-controls/textarea.js +4 -2
- package/build/dataform-controls/textarea.js.map +1 -1
- package/build/dataform-controls/toggle-group.js +4 -2
- package/build/dataform-controls/toggle-group.js.map +1 -1
- package/build/dataform-controls/toggle.js +4 -2
- package/build/dataform-controls/toggle.js.map +1 -1
- package/build/dataform-controls/url.js +3 -1
- package/build/dataform-controls/url.js.map +1 -1
- package/build/dataform-controls/utils/get-custom-validity.js +2 -0
- package/build/dataform-controls/utils/get-custom-validity.js.map +1 -1
- package/build/dataform-controls/utils/relative-date-control.js +4 -2
- package/build/dataform-controls/utils/relative-date-control.js.map +1 -1
- package/build/dataform-controls/utils/validated-input.js +4 -2
- package/build/dataform-controls/utils/validated-input.js.map +1 -1
- package/build/dataform-controls/utils/validated-number.js +4 -2
- package/build/dataform-controls/utils/validated-number.js.map +1 -1
- package/build/dataform-layouts/card/index.js +65 -34
- package/build/dataform-layouts/card/index.js.map +3 -3
- package/build/dataform-layouts/data-form-layout.js +8 -14
- package/build/dataform-layouts/data-form-layout.js.map +3 -3
- package/build/dataform-layouts/details/index.js +78 -0
- package/build/dataform-layouts/details/index.js.map +7 -0
- package/build/dataform-layouts/get-summary-fields.js +3 -1
- package/build/dataform-layouts/get-summary-fields.js.map +1 -1
- package/build/dataform-layouts/index.js +9 -2
- package/build/dataform-layouts/index.js.map +3 -3
- package/build/dataform-layouts/{normalize-form-fields.js → normalize-form.js} +44 -22
- package/build/dataform-layouts/normalize-form.js.map +7 -0
- package/build/dataform-layouts/panel/dropdown.js +9 -8
- package/build/dataform-layouts/panel/dropdown.js.map +2 -2
- package/build/dataform-layouts/panel/index.js +10 -14
- package/build/dataform-layouts/panel/index.js.map +2 -2
- package/build/dataform-layouts/panel/modal.js +9 -8
- package/build/dataform-layouts/panel/modal.js.map +2 -2
- package/build/dataform-layouts/panel/summary-button.js +3 -1
- package/build/dataform-layouts/panel/summary-button.js.map +1 -1
- package/build/dataform-layouts/regular/index.js +8 -10
- package/build/dataform-layouts/regular/index.js.map +2 -2
- package/build/dataform-layouts/row/index.js +10 -33
- package/build/dataform-layouts/row/index.js.map +3 -3
- package/build/dataviews-layouts/grid/index.js +4 -2
- package/build/dataviews-layouts/grid/index.js.map +1 -1
- package/build/dataviews-layouts/grid/preview-size-picker.js +4 -2
- package/build/dataviews-layouts/grid/preview-size-picker.js.map +1 -1
- package/build/dataviews-layouts/index.js +12 -1
- package/build/dataviews-layouts/index.js.map +3 -3
- package/build/dataviews-layouts/list/index.js +6 -6
- package/build/dataviews-layouts/list/index.js.map +2 -2
- package/build/dataviews-layouts/picker-grid/index.js +4 -2
- package/build/dataviews-layouts/picker-grid/index.js.map +1 -1
- package/build/dataviews-layouts/picker-table/index.js +422 -0
- package/build/dataviews-layouts/picker-table/index.js.map +7 -0
- package/build/dataviews-layouts/table/column-header-menu.js +6 -4
- package/build/dataviews-layouts/table/column-header-menu.js.map +2 -2
- package/build/dataviews-layouts/table/column-primary.js +4 -7
- package/build/dataviews-layouts/table/column-primary.js.map +2 -2
- package/build/dataviews-layouts/table/density-picker.js +3 -1
- package/build/dataviews-layouts/table/density-picker.js.map +1 -1
- package/build/dataviews-layouts/table/index.js +48 -2
- package/build/dataviews-layouts/table/index.js.map +2 -2
- package/build/dataviews-layouts/table/use-is-horizontal-scroll-end.js +3 -1
- package/build/dataviews-layouts/table/use-is-horizontal-scroll-end.js.map +1 -1
- package/build/dataviews-layouts/utils/get-data-by-group.js +2 -0
- package/build/dataviews-layouts/utils/get-data-by-group.js.map +1 -1
- package/build/dataviews-layouts/utils/grid-items.js +4 -2
- package/build/dataviews-layouts/utils/grid-items.js.map +1 -1
- package/build/dataviews-layouts/utils/item-click-wrapper.js +3 -1
- package/build/dataviews-layouts/utils/item-click-wrapper.js.map +1 -1
- package/build/dataviews-layouts/utils/preview-size-picker.js +4 -2
- package/build/dataviews-layouts/utils/preview-size-picker.js.map +1 -1
- package/build/field-types/array.js +3 -1
- package/build/field-types/array.js.map +1 -1
- package/build/field-types/boolean.js +3 -1
- package/build/field-types/boolean.js.map +1 -1
- package/build/field-types/color.js +3 -1
- package/build/field-types/color.js.map +1 -1
- package/build/field-types/date.js +4 -2
- package/build/field-types/date.js.map +1 -1
- package/build/field-types/datetime.js +17 -2
- package/build/field-types/datetime.js.map +3 -3
- package/build/field-types/email.js +4 -2
- package/build/field-types/email.js.map +1 -1
- package/build/field-types/index.js +3 -1
- package/build/field-types/index.js.map +1 -1
- package/build/field-types/integer.js +3 -1
- package/build/field-types/integer.js.map +1 -1
- package/build/field-types/media.js +2 -0
- package/build/field-types/media.js.map +1 -1
- package/build/field-types/number.js +3 -1
- package/build/field-types/number.js.map +1 -1
- package/build/field-types/password.js +3 -1
- package/build/field-types/password.js.map +1 -1
- package/build/field-types/telephone.js +3 -1
- package/build/field-types/telephone.js.map +1 -1
- package/build/field-types/text.js +3 -1
- package/build/field-types/text.js.map +1 -1
- package/build/field-types/url.js +3 -1
- package/build/field-types/url.js.map +1 -1
- package/build/{dataform-layouts/is-combined-field.js → field-types/utils/parse-date-time.js} +15 -11
- package/build/field-types/utils/parse-date-time.js.map +7 -0
- package/build/field-types/utils/render-from-elements.js +2 -0
- package/build/field-types/utils/render-from-elements.js.map +1 -1
- package/build/hooks/index.js +2 -0
- package/build/hooks/index.js.map +1 -1
- package/build/hooks/use-elements.js +3 -1
- package/build/hooks/use-elements.js.map +1 -1
- package/build/hooks/use-form-validity.js +425 -321
- package/build/hooks/use-form-validity.js.map +3 -3
- package/build/index.js +2 -0
- package/build/index.js.map +1 -1
- package/build/lock-unlock.js +3 -1
- package/build/lock-unlock.js.map +1 -1
- package/build/types/dataform.js +2 -0
- package/build/types/dataform.js.map +2 -2
- package/build/types/dataviews.js +2 -0
- package/build/types/dataviews.js.map +2 -2
- package/build/types/field-api.js +2 -0
- package/build/types/field-api.js.map +1 -1
- package/build/types/index.js +2 -0
- package/build/types/index.js.map +1 -1
- package/build/types/private.js +2 -0
- package/build/types/private.js.map +1 -1
- package/build/utils/filter-sort-and-paginate.js +3 -1
- package/build/utils/filter-sort-and-paginate.js.map +1 -1
- package/build/utils/has-elements.js +2 -0
- package/build/utils/has-elements.js.map +1 -1
- package/build/utils/normalize-fields.js +4 -2
- package/build/utils/normalize-fields.js.map +1 -1
- package/build-module/components/dataform/index.js +5 -2
- package/build-module/components/dataform/index.js.map +2 -2
- package/build-module/components/dataform-context/index.js +3 -2
- package/build-module/components/dataform-context/index.js.map +1 -1
- package/build-module/components/dataviews/index.js +7 -6
- package/build-module/components/dataviews/index.js.map +1 -1
- package/build-module/components/dataviews-bulk-actions/index.js +3 -2
- package/build-module/components/dataviews-bulk-actions/index.js.map +1 -1
- package/build-module/components/dataviews-context/index.js +2 -1
- package/build-module/components/dataviews-context/index.js.map +1 -1
- package/build-module/components/dataviews-filters/add-filter.js +3 -2
- package/build-module/components/dataviews-filters/add-filter.js.map +1 -1
- package/build-module/components/dataviews-filters/filter.js +19 -5
- package/build-module/components/dataviews-filters/filter.js.map +2 -2
- package/build-module/components/dataviews-filters/filters-toggled.js +2 -1
- package/build-module/components/dataviews-filters/filters-toggled.js.map +1 -1
- package/build-module/components/dataviews-filters/filters.js +2 -1
- package/build-module/components/dataviews-filters/filters.js.map +1 -1
- package/build-module/components/dataviews-filters/index.js +1 -0
- package/build-module/components/dataviews-filters/index.js.map +1 -1
- package/build-module/components/dataviews-filters/input-widget.js +2 -1
- package/build-module/components/dataviews-filters/input-widget.js.map +1 -1
- package/build-module/components/dataviews-filters/reset-filters.js +2 -1
- package/build-module/components/dataviews-filters/reset-filters.js.map +1 -1
- package/build-module/components/dataviews-filters/search-widget.js +7 -6
- package/build-module/components/dataviews-filters/search-widget.js.map +2 -2
- package/build-module/components/dataviews-filters/toggle.js +2 -1
- package/build-module/components/dataviews-filters/toggle.js.map +1 -1
- package/build-module/components/dataviews-filters/use-filters.js +1 -0
- package/build-module/components/dataviews-filters/use-filters.js.map +1 -1
- package/build-module/components/dataviews-filters/utils.js +3 -2
- package/build-module/components/dataviews-filters/utils.js.map +1 -1
- package/build-module/components/dataviews-footer/index.js +3 -2
- package/build-module/components/dataviews-footer/index.js.map +1 -1
- package/build-module/components/dataviews-item-actions/index.js +22 -4
- package/build-module/components/dataviews-item-actions/index.js.map +2 -2
- package/build-module/components/dataviews-layout/index.js +2 -1
- package/build-module/components/dataviews-layout/index.js.map +1 -1
- package/build-module/components/dataviews-pagination/index.js +2 -1
- package/build-module/components/dataviews-pagination/index.js.map +1 -1
- package/build-module/components/dataviews-picker/footer.js +3 -2
- package/build-module/components/dataviews-picker/footer.js.map +1 -1
- package/build-module/components/dataviews-picker/index.js +7 -6
- package/build-module/components/dataviews-picker/index.js.map +1 -1
- package/build-module/components/dataviews-search/index.js +3 -2
- package/build-module/components/dataviews-search/index.js.map +1 -1
- package/build-module/components/dataviews-selection-checkbox/index.js +2 -1
- package/build-module/components/dataviews-selection-checkbox/index.js.map +1 -1
- package/build-module/components/dataviews-view-config/index.js +20 -416
- package/build-module/components/dataviews-view-config/index.js.map +2 -2
- package/build-module/components/dataviews-view-config/infinite-scroll-toggle.js +2 -1
- package/build-module/components/dataviews-view-config/infinite-scroll-toggle.js.map +1 -1
- package/build-module/components/dataviews-view-config/properties-section.js +149 -0
- package/build-module/components/dataviews-view-config/properties-section.js.map +7 -0
- package/build-module/constants.js +37 -34
- package/build-module/constants.js.map +2 -2
- package/build-module/dataform-controls/array.js +3 -2
- package/build-module/dataform-controls/array.js.map +1 -1
- package/build-module/dataform-controls/checkbox.js +3 -2
- package/build-module/dataform-controls/checkbox.js.map +1 -1
- package/build-module/dataform-controls/color.js +4 -3
- package/build-module/dataform-controls/color.js.map +1 -1
- package/build-module/dataform-controls/date.js +7 -6
- package/build-module/dataform-controls/date.js.map +1 -1
- package/build-module/dataform-controls/datetime.js +7 -12
- package/build-module/dataform-controls/datetime.js.map +2 -2
- package/build-module/dataform-controls/email.js +2 -1
- package/build-module/dataform-controls/email.js.map +1 -1
- package/build-module/dataform-controls/index.js +3 -2
- package/build-module/dataform-controls/index.js.map +1 -1
- package/build-module/dataform-controls/integer.js +2 -1
- package/build-module/dataform-controls/integer.js.map +1 -1
- package/build-module/dataform-controls/number.js +2 -1
- package/build-module/dataform-controls/number.js.map +1 -1
- package/build-module/dataform-controls/password.js +2 -1
- package/build-module/dataform-controls/password.js.map +1 -1
- package/build-module/dataform-controls/radio.js +3 -2
- package/build-module/dataform-controls/radio.js.map +1 -1
- package/build-module/dataform-controls/select.js +3 -2
- package/build-module/dataform-controls/select.js.map +1 -1
- package/build-module/dataform-controls/telephone.js +2 -1
- package/build-module/dataform-controls/telephone.js.map +1 -1
- package/build-module/dataform-controls/text.js +2 -1
- package/build-module/dataform-controls/text.js.map +1 -1
- package/build-module/dataform-controls/textarea.js +3 -2
- package/build-module/dataform-controls/textarea.js.map +1 -1
- package/build-module/dataform-controls/toggle-group.js +3 -2
- package/build-module/dataform-controls/toggle-group.js.map +1 -1
- package/build-module/dataform-controls/toggle.js +3 -2
- package/build-module/dataform-controls/toggle.js.map +1 -1
- package/build-module/dataform-controls/url.js +2 -1
- package/build-module/dataform-controls/url.js.map +1 -1
- package/build-module/dataform-controls/utils/get-custom-validity.js +1 -0
- package/build-module/dataform-controls/utils/get-custom-validity.js.map +1 -1
- package/build-module/dataform-controls/utils/relative-date-control.js +3 -2
- package/build-module/dataform-controls/utils/relative-date-control.js.map +1 -1
- package/build-module/dataform-controls/utils/validated-input.js +3 -2
- package/build-module/dataform-controls/utils/validated-input.js.map +1 -1
- package/build-module/dataform-controls/utils/validated-number.js +3 -2
- package/build-module/dataform-controls/utils/validated-number.js.map +1 -1
- package/build-module/dataform-layouts/card/index.js +63 -33
- package/build-module/dataform-layouts/card/index.js.map +3 -3
- package/build-module/dataform-layouts/data-form-layout.js +8 -15
- package/build-module/dataform-layouts/data-form-layout.js.map +2 -2
- package/build-module/dataform-layouts/details/index.js +47 -0
- package/build-module/dataform-layouts/details/index.js.map +7 -0
- package/build-module/dataform-layouts/get-summary-fields.js +2 -1
- package/build-module/dataform-layouts/get-summary-fields.js.map +1 -1
- package/build-module/dataform-layouts/index.js +8 -2
- package/build-module/dataform-layouts/index.js.map +2 -2
- package/build-module/dataform-layouts/{normalize-form-fields.js → normalize-form.js} +39 -17
- package/build-module/dataform-layouts/normalize-form.js.map +7 -0
- package/build-module/dataform-layouts/panel/dropdown.js +7 -7
- package/build-module/dataform-layouts/panel/dropdown.js.map +2 -2
- package/build-module/dataform-layouts/panel/index.js +9 -14
- package/build-module/dataform-layouts/panel/index.js.map +2 -2
- package/build-module/dataform-layouts/panel/modal.js +7 -7
- package/build-module/dataform-layouts/panel/modal.js.map +2 -2
- package/build-module/dataform-layouts/panel/summary-button.js +2 -1
- package/build-module/dataform-layouts/panel/summary-button.js.map +1 -1
- package/build-module/dataform-layouts/regular/index.js +6 -9
- package/build-module/dataform-layouts/regular/index.js.map +2 -2
- package/build-module/dataform-layouts/row/index.js +9 -23
- package/build-module/dataform-layouts/row/index.js.map +2 -2
- package/build-module/dataviews-layouts/grid/index.js +3 -2
- package/build-module/dataviews-layouts/grid/index.js.map +1 -1
- package/build-module/dataviews-layouts/grid/preview-size-picker.js +3 -2
- package/build-module/dataviews-layouts/grid/preview-size-picker.js.map +1 -1
- package/build-module/dataviews-layouts/index.js +13 -2
- package/build-module/dataviews-layouts/index.js.map +2 -2
- package/build-module/dataviews-layouts/list/index.js +5 -6
- package/build-module/dataviews-layouts/list/index.js.map +2 -2
- package/build-module/dataviews-layouts/picker-grid/index.js +3 -2
- package/build-module/dataviews-layouts/picker-grid/index.js.map +1 -1
- package/build-module/dataviews-layouts/picker-table/index.js +397 -0
- package/build-module/dataviews-layouts/picker-table/index.js.map +7 -0
- package/build-module/dataviews-layouts/table/column-header-menu.js +5 -4
- package/build-module/dataviews-layouts/table/column-header-menu.js.map +2 -2
- package/build-module/dataviews-layouts/table/column-primary.js +3 -7
- package/build-module/dataviews-layouts/table/column-primary.js.map +2 -2
- package/build-module/dataviews-layouts/table/density-picker.js +2 -1
- package/build-module/dataviews-layouts/table/density-picker.js.map +1 -1
- package/build-module/dataviews-layouts/table/index.js +48 -3
- package/build-module/dataviews-layouts/table/index.js.map +2 -2
- package/build-module/dataviews-layouts/table/use-is-horizontal-scroll-end.js +2 -1
- package/build-module/dataviews-layouts/table/use-is-horizontal-scroll-end.js.map +1 -1
- package/build-module/dataviews-layouts/utils/get-data-by-group.js +1 -0
- package/build-module/dataviews-layouts/utils/get-data-by-group.js.map +1 -1
- package/build-module/dataviews-layouts/utils/grid-items.js +3 -2
- package/build-module/dataviews-layouts/utils/grid-items.js.map +1 -1
- package/build-module/dataviews-layouts/utils/item-click-wrapper.js +2 -1
- package/build-module/dataviews-layouts/utils/item-click-wrapper.js.map +1 -1
- package/build-module/dataviews-layouts/utils/preview-size-picker.js +3 -2
- package/build-module/dataviews-layouts/utils/preview-size-picker.js.map +1 -1
- package/build-module/field-types/array.js +2 -1
- package/build-module/field-types/array.js.map +1 -1
- package/build-module/field-types/boolean.js +2 -1
- package/build-module/field-types/boolean.js.map +1 -1
- package/build-module/field-types/color.js +2 -1
- package/build-module/field-types/color.js.map +1 -1
- package/build-module/field-types/date.js +3 -2
- package/build-module/field-types/date.js.map +1 -1
- package/build-module/field-types/datetime.js +16 -2
- package/build-module/field-types/datetime.js.map +2 -2
- package/build-module/field-types/email.js +3 -2
- package/build-module/field-types/email.js.map +1 -1
- package/build-module/field-types/index.js +2 -1
- package/build-module/field-types/index.js.map +1 -1
- package/build-module/field-types/integer.js +2 -1
- package/build-module/field-types/integer.js.map +1 -1
- package/build-module/field-types/media.js +1 -0
- package/build-module/field-types/media.js.map +1 -1
- package/build-module/field-types/number.js +2 -1
- package/build-module/field-types/number.js.map +1 -1
- package/build-module/field-types/password.js +2 -1
- package/build-module/field-types/password.js.map +1 -1
- package/build-module/field-types/telephone.js +2 -1
- package/build-module/field-types/telephone.js.map +1 -1
- package/build-module/field-types/text.js +2 -1
- package/build-module/field-types/text.js.map +1 -1
- package/build-module/field-types/url.js +2 -1
- package/build-module/field-types/url.js.map +1 -1
- package/build-module/field-types/utils/parse-date-time.js +14 -0
- package/build-module/field-types/utils/parse-date-time.js.map +7 -0
- package/build-module/field-types/utils/render-from-elements.js +1 -0
- package/build-module/field-types/utils/render-from-elements.js.map +1 -1
- package/build-module/hooks/index.js +1 -0
- package/build-module/hooks/index.js.map +1 -1
- package/build-module/hooks/use-elements.js +2 -1
- package/build-module/hooks/use-elements.js.map +1 -1
- package/build-module/hooks/use-form-validity.js +424 -321
- package/build-module/hooks/use-form-validity.js.map +3 -3
- package/build-module/index.js +1 -0
- package/build-module/index.js.map +1 -1
- package/build-module/lock-unlock.js +2 -1
- package/build-module/lock-unlock.js.map +1 -1
- package/build-module/utils/filter-sort-and-paginate.js +2 -1
- package/build-module/utils/filter-sort-and-paginate.js.map +1 -1
- package/build-module/utils/has-elements.js +1 -0
- package/build-module/utils/has-elements.js.map +1 -1
- package/build-module/utils/normalize-fields.js +3 -2
- package/build-module/utils/normalize-fields.js.map +1 -1
- package/build-style/style-rtl.css +35 -40
- package/build-style/style.css +35 -40
- package/build-types/components/dataform/index.d.ts.map +1 -1
- package/build-types/components/dataviews-filters/filter.d.ts.map +1 -1
- package/build-types/components/dataviews-filters/utils.d.ts.map +1 -1
- package/build-types/components/dataviews-item-actions/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/properties-section.d.ts +4 -0
- package/build-types/components/dataviews-view-config/properties-section.d.ts.map +1 -0
- package/build-types/constants.d.ts +1 -0
- package/build-types/constants.d.ts.map +1 -1
- package/build-types/dataform-controls/datetime.d.ts.map +1 -1
- package/build-types/dataform-layouts/card/index.d.ts +1 -1
- package/build-types/dataform-layouts/card/index.d.ts.map +1 -1
- package/build-types/dataform-layouts/data-form-layout.d.ts +4 -4
- package/build-types/dataform-layouts/data-form-layout.d.ts.map +1 -1
- package/build-types/dataform-layouts/details/index.d.ts +6 -0
- package/build-types/dataform-layouts/details/index.d.ts.map +1 -0
- package/build-types/dataform-layouts/get-summary-fields.d.ts.map +1 -1
- package/build-types/dataform-layouts/index.d.ts +7 -2
- package/build-types/dataform-layouts/index.d.ts.map +1 -1
- package/build-types/dataform-layouts/normalize-form.d.ts +8 -0
- package/build-types/dataform-layouts/normalize-form.d.ts.map +1 -0
- package/build-types/dataform-layouts/panel/dropdown.d.ts +2 -2
- package/build-types/dataform-layouts/panel/dropdown.d.ts.map +1 -1
- package/build-types/dataform-layouts/panel/index.d.ts.map +1 -1
- package/build-types/dataform-layouts/panel/modal.d.ts +2 -2
- package/build-types/dataform-layouts/panel/modal.d.ts.map +1 -1
- package/build-types/dataform-layouts/regular/index.d.ts.map +1 -1
- package/build-types/dataform-layouts/row/index.d.ts.map +1 -1
- package/build-types/dataviews-layouts/index.d.ts +8 -0
- 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-table/index.d.ts +4 -0
- package/build-types/dataviews-layouts/picker-table/index.d.ts.map +1 -0
- package/build-types/dataviews-layouts/table/column-header-menu.d.ts +3 -3
- package/build-types/dataviews-layouts/table/column-header-menu.d.ts.map +1 -1
- package/build-types/dataviews-layouts/table/column-primary.d.ts.map +1 -1
- package/build-types/dataviews-layouts/table/index.d.ts.map +1 -1
- package/build-types/field-types/datetime.d.ts +1 -1
- package/build-types/field-types/datetime.d.ts.map +1 -1
- package/build-types/field-types/utils/parse-date-time.d.ts +2 -0
- package/build-types/field-types/utils/parse-date-time.d.ts.map +1 -0
- package/build-types/hooks/use-form-validity.d.ts.map +1 -1
- package/build-types/stories/dataform.story.d.ts +4 -10
- package/build-types/stories/dataform.story.d.ts.map +1 -1
- package/build-types/stories/dataviews-picker.story.d.ts +33 -0
- package/build-types/stories/dataviews-picker.story.d.ts.map +1 -1
- package/build-types/stories/dataviews.fixtures.d.ts.map +1 -1
- package/build-types/stories/dataviews.story.d.ts +7 -1
- package/build-types/stories/dataviews.story.d.ts.map +1 -1
- package/build-types/test/normalize-form.d.ts +2 -0
- package/build-types/test/normalize-form.d.ts.map +1 -0
- package/build-types/types/dataform.d.ts +23 -9
- package/build-types/types/dataform.d.ts.map +1 -1
- package/build-types/types/dataviews.d.ts +23 -2
- package/build-types/types/dataviews.d.ts.map +1 -1
- package/build-wp/index.js +2101 -1673
- package/package.json +15 -15
- package/src/components/dataform/index.tsx +3 -1
- package/src/components/dataviews-filters/filter.tsx +16 -1
- package/src/components/dataviews-item-actions/index.tsx +37 -14
- package/src/components/dataviews-view-config/index.tsx +8 -504
- package/src/components/dataviews-view-config/properties-section.tsx +201 -0
- package/src/components/dataviews-view-config/style.scss +2 -39
- package/src/constants.ts +1 -0
- package/src/dataform-controls/datetime.tsx +3 -10
- package/src/dataform-layouts/card/index.tsx +45 -21
- package/src/dataform-layouts/data-form-layout.tsx +12 -23
- package/src/dataform-layouts/details/index.tsx +71 -0
- package/src/dataform-layouts/details/style.scss +5 -0
- package/src/dataform-layouts/index.tsx +10 -3
- package/src/dataform-layouts/{normalize-form-fields.ts → normalize-form.ts} +45 -23
- package/src/dataform-layouts/panel/dropdown.tsx +10 -13
- package/src/dataform-layouts/panel/index.tsx +9 -24
- package/src/dataform-layouts/panel/modal.tsx +15 -15
- package/src/dataform-layouts/regular/index.tsx +7 -12
- package/src/dataform-layouts/row/index.tsx +13 -26
- package/src/dataviews-layouts/index.ts +10 -0
- package/src/dataviews-layouts/list/index.tsx +2 -5
- package/src/dataviews-layouts/picker-table/index.tsx +487 -0
- package/src/dataviews-layouts/picker-table/style.scss +45 -0
- package/src/dataviews-layouts/table/column-header-menu.tsx +3 -2
- package/src/dataviews-layouts/table/column-primary.tsx +4 -7
- package/src/dataviews-layouts/table/index.tsx +54 -2
- package/src/dataviews-layouts/table/style.scss +6 -1
- package/src/field-types/datetime.tsx +16 -5
- package/src/field-types/utils/parse-date-time.ts +17 -0
- package/src/hooks/use-form-validity.ts +572 -422
- package/src/stories/dataform.story.tsx +586 -454
- package/src/stories/dataviews-picker.story.tsx +166 -38
- package/src/stories/dataviews.fixtures.tsx +4 -1
- package/src/stories/dataviews.story.tsx +10 -2
- package/src/stories/field-types.story.tsx +7 -7
- package/src/style.scss +2 -0
- package/src/test/normalize-form.ts +568 -0
- package/src/test/use-form-validity.ts +318 -33
- package/src/types/dataform.ts +30 -11
- package/src/types/dataviews.ts +36 -2
- package/tsconfig.tsbuildinfo +1 -1
- package/build/dataform-layouts/is-combined-field.js.map +0 -7
- package/build/dataform-layouts/normalize-form-fields.js.map +0 -7
- package/build-module/dataform-layouts/is-combined-field.js +0 -7
- package/build-module/dataform-layouts/is-combined-field.js.map +0 -7
- package/build-module/dataform-layouts/normalize-form-fields.js.map +0 -7
- package/build-types/dataform-layouts/is-combined-field.d.ts +0 -6
- package/build-types/dataform-layouts/is-combined-field.d.ts.map +0 -1
- package/build-types/dataform-layouts/normalize-form-fields.d.ts +0 -19
- package/build-types/dataform-layouts/normalize-form-fields.d.ts.map +0 -1
- package/build-types/test/normalize-form-fields.d.ts +0 -2
- package/build-types/test/normalize-form-fields.d.ts.map +0 -1
- package/src/dataform-layouts/is-combined-field.ts +0 -10
- package/src/test/normalize-form-fields.ts +0 -324
|
@@ -268,6 +268,19 @@ const fields: Field< SamplePost >[] = [
|
|
|
268
268
|
label: 'Seat',
|
|
269
269
|
type: 'text',
|
|
270
270
|
},
|
|
271
|
+
{
|
|
272
|
+
id: 'metadata_summary',
|
|
273
|
+
label: 'Metadata',
|
|
274
|
+
type: 'text',
|
|
275
|
+
render: ( { item } ) => {
|
|
276
|
+
return (
|
|
277
|
+
<span>
|
|
278
|
+
<>Metadata</>
|
|
279
|
+
{ item.filesize ? `, ${ item.filesize } KB` : '' }
|
|
280
|
+
</span>
|
|
281
|
+
);
|
|
282
|
+
},
|
|
283
|
+
},
|
|
271
284
|
];
|
|
272
285
|
|
|
273
286
|
const LayoutRegularComponent = ( {
|
|
@@ -539,13 +552,11 @@ function CustomEditControl< Item >( {
|
|
|
539
552
|
const ValidationComponent = ( {
|
|
540
553
|
required,
|
|
541
554
|
elements,
|
|
542
|
-
type,
|
|
543
555
|
custom,
|
|
544
556
|
}: {
|
|
545
557
|
required: boolean;
|
|
546
558
|
elements: 'sync' | 'async' | 'none';
|
|
547
559
|
custom: 'sync' | 'async' | 'none';
|
|
548
|
-
type: 'regular' | 'panel';
|
|
549
560
|
} ) => {
|
|
550
561
|
type ValidatedItem = {
|
|
551
562
|
text: string;
|
|
@@ -570,10 +581,6 @@ const ValidationComponent = ( {
|
|
|
570
581
|
datetime?: string;
|
|
571
582
|
};
|
|
572
583
|
|
|
573
|
-
const DateRangeEdit = ( props: DataFormControlProps< ValidatedItem > ) => {
|
|
574
|
-
return <DateControl { ...props } operator="between" />;
|
|
575
|
-
};
|
|
576
|
-
|
|
577
584
|
const [ post, setPost ] = useState< ValidatedItem >( {
|
|
578
585
|
text: 'Can have letters and spaces',
|
|
579
586
|
select: undefined,
|
|
@@ -597,184 +604,6 @@ const ValidationComponent = ( {
|
|
|
597
604
|
datetime: undefined,
|
|
598
605
|
} );
|
|
599
606
|
|
|
600
|
-
const makeAsync = ( rule: ( item: ValidatedItem ) => null | string ) => {
|
|
601
|
-
return async ( value: ValidatedItem ) => {
|
|
602
|
-
return await new Promise< string | null >( ( resolve ) => {
|
|
603
|
-
setTimeout( () => {
|
|
604
|
-
const validationResult = rule( value );
|
|
605
|
-
resolve( validationResult );
|
|
606
|
-
}, 2000 );
|
|
607
|
-
} );
|
|
608
|
-
};
|
|
609
|
-
};
|
|
610
|
-
|
|
611
|
-
const customTextRule = ( value: ValidatedItem ) => {
|
|
612
|
-
if ( ! /^[a-zA-Z ]+$/.test( value.text ) ) {
|
|
613
|
-
return 'Value must only contain letters and spaces.';
|
|
614
|
-
}
|
|
615
|
-
|
|
616
|
-
return null;
|
|
617
|
-
};
|
|
618
|
-
|
|
619
|
-
const customSelectRule = ( value: ValidatedItem ) => {
|
|
620
|
-
if ( value.select !== 'option1' ) {
|
|
621
|
-
return 'Value must be Option 1.';
|
|
622
|
-
}
|
|
623
|
-
return null;
|
|
624
|
-
};
|
|
625
|
-
|
|
626
|
-
const customTextRadioRule = ( value: ValidatedItem ) => {
|
|
627
|
-
if ( value.textWithRadio !== 'item1' ) {
|
|
628
|
-
return 'Value must be Item 1.';
|
|
629
|
-
}
|
|
630
|
-
|
|
631
|
-
return null;
|
|
632
|
-
};
|
|
633
|
-
|
|
634
|
-
const customTextareaRule = ( value: ValidatedItem ) => {
|
|
635
|
-
if ( ! /^[a-zA-Z ]+$/.test( value.textarea ) ) {
|
|
636
|
-
return 'Value must only contain letters and spaces.';
|
|
637
|
-
}
|
|
638
|
-
|
|
639
|
-
return null;
|
|
640
|
-
};
|
|
641
|
-
const customEmailRule = ( value: ValidatedItem ) => {
|
|
642
|
-
if ( ! /^[a-zA-Z0-9._%+-]+@example\.com$/.test( value.email ) ) {
|
|
643
|
-
return 'Email address must be from @example.com domain.';
|
|
644
|
-
}
|
|
645
|
-
|
|
646
|
-
return null;
|
|
647
|
-
};
|
|
648
|
-
const customTelephoneRule = ( value: ValidatedItem ) => {
|
|
649
|
-
if ( ! /^\+30\d{10}$/.test( value.telephone ) ) {
|
|
650
|
-
return 'Telephone number must start with +30 and have 10 digits after.';
|
|
651
|
-
}
|
|
652
|
-
|
|
653
|
-
return null;
|
|
654
|
-
};
|
|
655
|
-
const customUrlRule = ( value: ValidatedItem ) => {
|
|
656
|
-
if ( ! /^https:\/\/example\.com$/.test( value.url ) ) {
|
|
657
|
-
return 'URL must be from https://example.com domain.';
|
|
658
|
-
}
|
|
659
|
-
|
|
660
|
-
return null;
|
|
661
|
-
};
|
|
662
|
-
const customColorRule = ( value: ValidatedItem ) => {
|
|
663
|
-
if ( ! /^#[0-9A-Fa-f]{6}$/.test( value.color ) ) {
|
|
664
|
-
return 'Color must be a valid hex format (e.g., #ff6600).';
|
|
665
|
-
}
|
|
666
|
-
|
|
667
|
-
return null;
|
|
668
|
-
};
|
|
669
|
-
const customIntegerRule = ( value: ValidatedItem ) => {
|
|
670
|
-
if ( value.integer % 2 !== 0 ) {
|
|
671
|
-
return 'Integer must be an even number.';
|
|
672
|
-
}
|
|
673
|
-
|
|
674
|
-
return null;
|
|
675
|
-
};
|
|
676
|
-
const customNumberRule = ( value: ValidatedItem ) => {
|
|
677
|
-
if ( ! /^\d+\.\d{2}$/.test( value?.number?.toString() ) ) {
|
|
678
|
-
return 'Number must have exactly two decimal places.';
|
|
679
|
-
}
|
|
680
|
-
|
|
681
|
-
return null;
|
|
682
|
-
};
|
|
683
|
-
const customBooleanRule = ( value: ValidatedItem ) => {
|
|
684
|
-
if ( value.boolean !== true ) {
|
|
685
|
-
return 'Boolean must be active.';
|
|
686
|
-
}
|
|
687
|
-
|
|
688
|
-
return null;
|
|
689
|
-
};
|
|
690
|
-
const customToggleRule = ( value: ValidatedItem ) => {
|
|
691
|
-
if ( value.toggle !== true ) {
|
|
692
|
-
return 'Toggle must be checked.';
|
|
693
|
-
}
|
|
694
|
-
|
|
695
|
-
return null;
|
|
696
|
-
};
|
|
697
|
-
const customToggleGroupRule = ( value: ValidatedItem ) => {
|
|
698
|
-
if ( value.toggleGroup !== 'option1' ) {
|
|
699
|
-
return 'Value must be Option 1.';
|
|
700
|
-
}
|
|
701
|
-
|
|
702
|
-
return null;
|
|
703
|
-
};
|
|
704
|
-
|
|
705
|
-
const customPasswordRule = ( value: ValidatedItem ) => {
|
|
706
|
-
if ( value.password.length < 8 ) {
|
|
707
|
-
return 'Password must be at least 8 characters long.';
|
|
708
|
-
}
|
|
709
|
-
if ( ! /[A-Z]/.test( value.password ) ) {
|
|
710
|
-
return 'Password must contain at least one uppercase letter.';
|
|
711
|
-
}
|
|
712
|
-
if ( ! /[0-9]/.test( value.password ) ) {
|
|
713
|
-
return 'Password must contain at least one number.';
|
|
714
|
-
}
|
|
715
|
-
|
|
716
|
-
return null;
|
|
717
|
-
};
|
|
718
|
-
|
|
719
|
-
const customDateRule = ( value: ValidatedItem ) => {
|
|
720
|
-
if ( ! value.date ) {
|
|
721
|
-
return null;
|
|
722
|
-
}
|
|
723
|
-
const selectedDate = new Date( value.date );
|
|
724
|
-
const today = new Date();
|
|
725
|
-
today.setHours( 0, 0, 0, 0 );
|
|
726
|
-
if ( selectedDate < today ) {
|
|
727
|
-
return 'Date must not be in the past.';
|
|
728
|
-
}
|
|
729
|
-
|
|
730
|
-
return null;
|
|
731
|
-
};
|
|
732
|
-
const customDateTimeRule = ( value: ValidatedItem ) => {
|
|
733
|
-
if ( ! value.datetime ) {
|
|
734
|
-
return null;
|
|
735
|
-
}
|
|
736
|
-
const selectedDateTime = new Date( value.datetime );
|
|
737
|
-
const now = new Date();
|
|
738
|
-
if ( selectedDateTime < now ) {
|
|
739
|
-
return 'Date and time must not be in the past.';
|
|
740
|
-
}
|
|
741
|
-
|
|
742
|
-
return null;
|
|
743
|
-
};
|
|
744
|
-
|
|
745
|
-
const customDateRangeRule = ( value: ValidatedItem ) => {
|
|
746
|
-
if ( ! value.dateRange ) {
|
|
747
|
-
return null;
|
|
748
|
-
}
|
|
749
|
-
const [ fromDate, toDate ] = value.dateRange;
|
|
750
|
-
if ( ! fromDate || ! toDate ) {
|
|
751
|
-
return null;
|
|
752
|
-
}
|
|
753
|
-
const from = new Date( fromDate );
|
|
754
|
-
const to = new Date( toDate );
|
|
755
|
-
const daysDiff = Math.ceil(
|
|
756
|
-
( to.getTime() - from.getTime() ) / ( 1000 * 60 * 60 * 24 )
|
|
757
|
-
);
|
|
758
|
-
if ( daysDiff > 30 ) {
|
|
759
|
-
return 'Date range must not exceed 30 days.';
|
|
760
|
-
}
|
|
761
|
-
return null;
|
|
762
|
-
};
|
|
763
|
-
|
|
764
|
-
const maybeCustomRule = (
|
|
765
|
-
rule: ( item: ValidatedItem ) => null | string
|
|
766
|
-
) => {
|
|
767
|
-
if ( custom === 'sync' ) {
|
|
768
|
-
return rule;
|
|
769
|
-
}
|
|
770
|
-
|
|
771
|
-
if ( custom === 'async' ) {
|
|
772
|
-
return makeAsync( rule );
|
|
773
|
-
}
|
|
774
|
-
|
|
775
|
-
return undefined;
|
|
776
|
-
};
|
|
777
|
-
|
|
778
607
|
// Cache for getElements functions - ensures promises are only created once
|
|
779
608
|
const getElements = useMemo( () => {
|
|
780
609
|
const promiseCache: Record< string, Promise< any > > = {};
|
|
@@ -810,8 +639,14 @@ const ValidationComponent = ( {
|
|
|
810
639
|
setTimeout(
|
|
811
640
|
() =>
|
|
812
641
|
resolve( [
|
|
813
|
-
{
|
|
814
|
-
|
|
642
|
+
{
|
|
643
|
+
value: 'item1',
|
|
644
|
+
label: 'Item 1',
|
|
645
|
+
},
|
|
646
|
+
{
|
|
647
|
+
value: 'item2',
|
|
648
|
+
label: 'Item 2',
|
|
649
|
+
},
|
|
815
650
|
] ),
|
|
816
651
|
3500
|
|
817
652
|
)
|
|
@@ -827,15 +662,27 @@ const ValidationComponent = ( {
|
|
|
827
662
|
value: 'us',
|
|
828
663
|
label: 'United States',
|
|
829
664
|
},
|
|
830
|
-
{
|
|
665
|
+
{
|
|
666
|
+
value: 'ca',
|
|
667
|
+
label: 'Canada',
|
|
668
|
+
},
|
|
831
669
|
{
|
|
832
670
|
value: 'uk',
|
|
833
671
|
label: 'United Kingdom',
|
|
834
672
|
},
|
|
835
|
-
{
|
|
836
|
-
|
|
673
|
+
{
|
|
674
|
+
value: 'fr',
|
|
675
|
+
label: 'France',
|
|
676
|
+
},
|
|
677
|
+
{
|
|
678
|
+
value: 'de',
|
|
679
|
+
label: 'Germany',
|
|
680
|
+
},
|
|
837
681
|
{ value: 'jp', label: 'Japan' },
|
|
838
|
-
{
|
|
682
|
+
{
|
|
683
|
+
value: 'au',
|
|
684
|
+
label: 'Australia',
|
|
685
|
+
},
|
|
839
686
|
] ),
|
|
840
687
|
3500
|
|
841
688
|
)
|
|
@@ -872,279 +719,503 @@ const ValidationComponent = ( {
|
|
|
872
719
|
return promiseCache[ fieldId ];
|
|
873
720
|
};
|
|
874
721
|
};
|
|
875
|
-
}, [
|
|
722
|
+
}, [] );
|
|
876
723
|
|
|
877
|
-
const _fields: Field< ValidatedItem >[] =
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
724
|
+
const _fields: Field< ValidatedItem >[] = useMemo( () => {
|
|
725
|
+
const DateRangeEdit = (
|
|
726
|
+
props: DataFormControlProps< ValidatedItem >
|
|
727
|
+
) => {
|
|
728
|
+
return <DateControl { ...props } operator="between" />;
|
|
729
|
+
};
|
|
730
|
+
const makeAsync = (
|
|
731
|
+
rule: ( item: ValidatedItem ) => null | string
|
|
732
|
+
) => {
|
|
733
|
+
return async ( value: ValidatedItem ) => {
|
|
734
|
+
return await new Promise< string | null >( ( resolve ) => {
|
|
735
|
+
setTimeout( () => {
|
|
736
|
+
const validationResult = rule( value );
|
|
737
|
+
resolve( validationResult );
|
|
738
|
+
}, 2000 );
|
|
739
|
+
} );
|
|
740
|
+
};
|
|
741
|
+
};
|
|
742
|
+
|
|
743
|
+
const customTextRule = ( value: ValidatedItem ) => {
|
|
744
|
+
if ( ! /^[a-zA-Z ]+$/.test( value.text ) ) {
|
|
745
|
+
return 'Value must only contain letters and spaces.';
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
return null;
|
|
749
|
+
};
|
|
750
|
+
|
|
751
|
+
const customSelectRule = ( value: ValidatedItem ) => {
|
|
752
|
+
if ( value.select !== 'option1' ) {
|
|
753
|
+
return 'Value must be Option 1.';
|
|
754
|
+
}
|
|
755
|
+
return null;
|
|
756
|
+
};
|
|
757
|
+
|
|
758
|
+
const customTextRadioRule = ( value: ValidatedItem ) => {
|
|
759
|
+
if ( value.textWithRadio !== 'item1' ) {
|
|
760
|
+
return 'Value must be Item 1.';
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
return null;
|
|
764
|
+
};
|
|
765
|
+
|
|
766
|
+
const customTextareaRule = ( value: ValidatedItem ) => {
|
|
767
|
+
if ( ! /^[a-zA-Z ]+$/.test( value.textarea ) ) {
|
|
768
|
+
return 'Value must only contain letters and spaces.';
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
return null;
|
|
772
|
+
};
|
|
773
|
+
const customEmailRule = ( value: ValidatedItem ) => {
|
|
774
|
+
if ( ! /^[a-zA-Z0-9._%+-]+@example\.com$/.test( value.email ) ) {
|
|
775
|
+
return 'Email address must be from @example.com domain.';
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
return null;
|
|
779
|
+
};
|
|
780
|
+
const customTelephoneRule = ( value: ValidatedItem ) => {
|
|
781
|
+
if ( ! /^\+30\d{10}$/.test( value.telephone ) ) {
|
|
782
|
+
return 'Telephone number must start with +30 and have 10 digits after.';
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
return null;
|
|
786
|
+
};
|
|
787
|
+
const customUrlRule = ( value: ValidatedItem ) => {
|
|
788
|
+
if ( ! /^https:\/\/example\.com$/.test( value.url ) ) {
|
|
789
|
+
return 'URL must be from https://example.com domain.';
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
return null;
|
|
793
|
+
};
|
|
794
|
+
const customColorRule = ( value: ValidatedItem ) => {
|
|
795
|
+
if ( ! /^#[0-9A-Fa-f]{6}$/.test( value.color ) ) {
|
|
796
|
+
return 'Color must be a valid hex format (e.g., #ff6600).';
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
return null;
|
|
800
|
+
};
|
|
801
|
+
const customIntegerRule = ( value: ValidatedItem ) => {
|
|
802
|
+
if ( value.integer % 2 !== 0 ) {
|
|
803
|
+
return 'Integer must be an even number.';
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
return null;
|
|
807
|
+
};
|
|
808
|
+
const customNumberRule = ( value: ValidatedItem ) => {
|
|
809
|
+
if ( ! /^\d+\.\d{2}$/.test( value?.number?.toString() ) ) {
|
|
810
|
+
return 'Number must have exactly two decimal places.';
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
return null;
|
|
814
|
+
};
|
|
815
|
+
const customBooleanRule = ( value: ValidatedItem ) => {
|
|
816
|
+
if ( value.boolean !== true ) {
|
|
817
|
+
return 'Boolean must be active.';
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
return null;
|
|
821
|
+
};
|
|
822
|
+
const customToggleRule = ( value: ValidatedItem ) => {
|
|
823
|
+
if ( value.toggle !== true ) {
|
|
824
|
+
return 'Toggle must be checked.';
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
return null;
|
|
828
|
+
};
|
|
829
|
+
const customToggleGroupRule = ( value: ValidatedItem ) => {
|
|
830
|
+
if ( value.toggleGroup !== 'option1' ) {
|
|
831
|
+
return 'Value must be Option 1.';
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
return null;
|
|
835
|
+
};
|
|
836
|
+
|
|
837
|
+
const customPasswordRule = ( value: ValidatedItem ) => {
|
|
838
|
+
if ( value.password.length < 8 ) {
|
|
839
|
+
return 'Password must be at least 8 characters long.';
|
|
840
|
+
}
|
|
841
|
+
if ( ! /[A-Z]/.test( value.password ) ) {
|
|
842
|
+
return 'Password must contain at least one uppercase letter.';
|
|
843
|
+
}
|
|
844
|
+
if ( ! /[0-9]/.test( value.password ) ) {
|
|
845
|
+
return 'Password must contain at least one number.';
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
return null;
|
|
849
|
+
};
|
|
850
|
+
|
|
851
|
+
const customDateRule = ( value: ValidatedItem ) => {
|
|
852
|
+
if ( ! value.date ) {
|
|
853
|
+
return null;
|
|
854
|
+
}
|
|
855
|
+
const selectedDate = new Date( value.date );
|
|
856
|
+
const today = new Date();
|
|
857
|
+
today.setHours( 0, 0, 0, 0 );
|
|
858
|
+
if ( selectedDate < today ) {
|
|
859
|
+
return 'Date must not be in the past.';
|
|
860
|
+
}
|
|
861
|
+
|
|
862
|
+
return null;
|
|
863
|
+
};
|
|
864
|
+
const customDateTimeRule = ( value: ValidatedItem ) => {
|
|
865
|
+
if ( ! value.datetime ) {
|
|
866
|
+
return null;
|
|
867
|
+
}
|
|
868
|
+
const selectedDateTime = new Date( value.datetime );
|
|
869
|
+
const now = new Date();
|
|
870
|
+
if ( selectedDateTime < now ) {
|
|
871
|
+
return 'Date and time must not be in the past.';
|
|
872
|
+
}
|
|
873
|
+
|
|
874
|
+
return null;
|
|
875
|
+
};
|
|
876
|
+
|
|
877
|
+
const customDateRangeRule = ( value: ValidatedItem ) => {
|
|
878
|
+
if ( ! value.dateRange ) {
|
|
879
|
+
return null;
|
|
880
|
+
}
|
|
881
|
+
const [ fromDate, toDate ] = value.dateRange;
|
|
882
|
+
if ( ! fromDate || ! toDate ) {
|
|
883
|
+
return null;
|
|
884
|
+
}
|
|
885
|
+
const from = new Date( fromDate );
|
|
886
|
+
const to = new Date( toDate );
|
|
887
|
+
const daysDiff = Math.ceil(
|
|
888
|
+
( to.getTime() - from.getTime() ) / ( 1000 * 60 * 60 * 24 )
|
|
889
|
+
);
|
|
890
|
+
if ( daysDiff > 30 ) {
|
|
891
|
+
return 'Date range must not exceed 30 days.';
|
|
892
|
+
}
|
|
893
|
+
return null;
|
|
894
|
+
};
|
|
895
|
+
|
|
896
|
+
const maybeCustomRule = (
|
|
897
|
+
rule: ( item: ValidatedItem ) => null | string
|
|
898
|
+
) => {
|
|
899
|
+
if ( custom === 'sync' ) {
|
|
900
|
+
return rule;
|
|
901
|
+
}
|
|
902
|
+
|
|
903
|
+
if ( custom === 'async' ) {
|
|
904
|
+
return makeAsync( rule );
|
|
905
|
+
}
|
|
906
|
+
|
|
907
|
+
return undefined;
|
|
908
|
+
};
|
|
909
|
+
|
|
910
|
+
return [
|
|
911
|
+
{
|
|
912
|
+
id: 'text',
|
|
913
|
+
type: 'text',
|
|
914
|
+
label: 'Text',
|
|
915
|
+
isValid: {
|
|
916
|
+
required,
|
|
917
|
+
elements: elements !== 'none' ? true : false,
|
|
918
|
+
custom: maybeCustomRule( customTextRule ),
|
|
919
|
+
},
|
|
905
920
|
},
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
:
|
|
923
|
-
|
|
924
|
-
required,
|
|
925
|
-
elements: elements !== 'none' ? true : false,
|
|
926
|
-
custom: maybeCustomRule( customTextRadioRule ),
|
|
921
|
+
{
|
|
922
|
+
id: 'select',
|
|
923
|
+
type: 'text',
|
|
924
|
+
label: 'Select',
|
|
925
|
+
elements:
|
|
926
|
+
elements === 'async'
|
|
927
|
+
? undefined
|
|
928
|
+
: [
|
|
929
|
+
{ value: 'option1', label: 'Option 1' },
|
|
930
|
+
{ value: 'option2', label: 'Option 2' },
|
|
931
|
+
],
|
|
932
|
+
getElements:
|
|
933
|
+
elements === 'async' ? getElements( 'select' ) : undefined,
|
|
934
|
+
isValid: {
|
|
935
|
+
required,
|
|
936
|
+
elements: elements !== 'none' ? true : false,
|
|
937
|
+
custom: maybeCustomRule( customSelectRule ),
|
|
938
|
+
},
|
|
927
939
|
},
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
940
|
+
{
|
|
941
|
+
id: 'textWithRadio',
|
|
942
|
+
type: 'text',
|
|
943
|
+
Edit: 'radio',
|
|
944
|
+
label: 'Text with radio',
|
|
945
|
+
elements:
|
|
946
|
+
elements === 'async'
|
|
947
|
+
? undefined
|
|
948
|
+
: [
|
|
949
|
+
{ value: 'item1', label: 'Item 1' },
|
|
950
|
+
{ value: 'item2', label: 'Item 2' },
|
|
951
|
+
],
|
|
952
|
+
getElements:
|
|
953
|
+
elements === 'async'
|
|
954
|
+
? getElements( 'textWithRadio' )
|
|
955
|
+
: undefined,
|
|
956
|
+
isValid: {
|
|
957
|
+
required,
|
|
958
|
+
elements: elements !== 'none' ? true : false,
|
|
959
|
+
custom: maybeCustomRule( customTextRadioRule ),
|
|
960
|
+
},
|
|
938
961
|
},
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
962
|
+
{
|
|
963
|
+
id: 'textarea',
|
|
964
|
+
type: 'text',
|
|
965
|
+
Edit: 'textarea',
|
|
966
|
+
label: 'Textarea',
|
|
967
|
+
isValid: {
|
|
968
|
+
required,
|
|
969
|
+
elements: elements !== 'none' ? true : false,
|
|
970
|
+
custom: maybeCustomRule( customTextareaRule ),
|
|
971
|
+
},
|
|
948
972
|
},
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
973
|
+
{
|
|
974
|
+
id: 'email',
|
|
975
|
+
type: 'email',
|
|
976
|
+
label: 'e-mail',
|
|
977
|
+
isValid: {
|
|
978
|
+
required,
|
|
979
|
+
elements: elements !== 'none' ? true : false,
|
|
980
|
+
custom: maybeCustomRule( customEmailRule ),
|
|
981
|
+
},
|
|
958
982
|
},
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
983
|
+
{
|
|
984
|
+
id: 'telephone',
|
|
985
|
+
type: 'telephone',
|
|
986
|
+
label: 'telephone',
|
|
987
|
+
isValid: {
|
|
988
|
+
required,
|
|
989
|
+
elements: elements !== 'none' ? true : false,
|
|
990
|
+
custom: maybeCustomRule( customTelephoneRule ),
|
|
991
|
+
},
|
|
968
992
|
},
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
993
|
+
{
|
|
994
|
+
id: 'url',
|
|
995
|
+
type: 'url',
|
|
996
|
+
label: 'URL',
|
|
997
|
+
isValid: {
|
|
998
|
+
required,
|
|
999
|
+
elements: elements !== 'none' ? true : false,
|
|
1000
|
+
custom: maybeCustomRule( customUrlRule ),
|
|
1001
|
+
},
|
|
978
1002
|
},
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
1003
|
+
{
|
|
1004
|
+
id: 'color',
|
|
1005
|
+
type: 'color',
|
|
1006
|
+
label: 'Color',
|
|
1007
|
+
isValid: {
|
|
1008
|
+
required,
|
|
1009
|
+
elements: elements !== 'none' ? true : false,
|
|
1010
|
+
custom: maybeCustomRule( customColorRule ),
|
|
1011
|
+
},
|
|
988
1012
|
},
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
1013
|
+
{
|
|
1014
|
+
id: 'integer',
|
|
1015
|
+
type: 'integer',
|
|
1016
|
+
label: 'Integer',
|
|
1017
|
+
isValid: {
|
|
1018
|
+
required,
|
|
1019
|
+
elements: elements !== 'none' ? true : false,
|
|
1020
|
+
custom: maybeCustomRule( customIntegerRule ),
|
|
1021
|
+
},
|
|
998
1022
|
},
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1023
|
+
{
|
|
1024
|
+
id: 'number',
|
|
1025
|
+
type: 'number',
|
|
1026
|
+
label: 'Number',
|
|
1027
|
+
isValid: {
|
|
1028
|
+
required,
|
|
1029
|
+
elements: elements !== 'none' ? true : false,
|
|
1030
|
+
custom: maybeCustomRule( customNumberRule ),
|
|
1031
|
+
},
|
|
1008
1032
|
},
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
elements: elements !== 'none' ? true : false,
|
|
1033
|
+
{
|
|
1034
|
+
id: 'boolean',
|
|
1035
|
+
type: 'boolean',
|
|
1036
|
+
label: 'Boolean',
|
|
1037
|
+
isValid: {
|
|
1038
|
+
required,
|
|
1039
|
+
elements: elements !== 'none' ? true : false,
|
|
1040
|
+
custom: maybeCustomRule( customBooleanRule ),
|
|
1041
|
+
},
|
|
1019
1042
|
},
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1043
|
+
{
|
|
1044
|
+
id: 'array',
|
|
1045
|
+
label: 'Array',
|
|
1046
|
+
type: 'array',
|
|
1047
|
+
placeholder: 'Select countries',
|
|
1048
|
+
description: 'Countries you have visited',
|
|
1049
|
+
isValid: {
|
|
1050
|
+
required,
|
|
1051
|
+
elements: elements !== 'none' ? true : false,
|
|
1052
|
+
},
|
|
1053
|
+
elements:
|
|
1054
|
+
elements === 'async'
|
|
1055
|
+
? undefined
|
|
1056
|
+
: [
|
|
1057
|
+
{ value: 'us', label: 'United States' },
|
|
1058
|
+
{ value: 'ca', label: 'Canada' },
|
|
1059
|
+
{ value: 'uk', label: 'United Kingdom' },
|
|
1060
|
+
{ value: 'fr', label: 'France' },
|
|
1061
|
+
{ value: 'de', label: 'Germany' },
|
|
1062
|
+
{ value: 'jp', label: 'Japan' },
|
|
1063
|
+
{ value: 'au', label: 'Australia' },
|
|
1064
|
+
],
|
|
1065
|
+
getElements:
|
|
1066
|
+
elements === 'async'
|
|
1067
|
+
? getElements( 'countries' )
|
|
1068
|
+
: undefined,
|
|
1042
1069
|
},
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
custom: maybeCustomRule( customPasswordRule ),
|
|
1070
|
+
{
|
|
1071
|
+
id: 'customEdit',
|
|
1072
|
+
label: 'Custom Control',
|
|
1073
|
+
Edit: CustomEditControl,
|
|
1074
|
+
isValid: {
|
|
1075
|
+
required,
|
|
1076
|
+
elements: elements !== 'none' ? true : false,
|
|
1077
|
+
},
|
|
1052
1078
|
},
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
custom: maybeCustomRule( customToggleRule ),
|
|
1079
|
+
{
|
|
1080
|
+
id: 'password',
|
|
1081
|
+
type: 'password',
|
|
1082
|
+
label: 'Password',
|
|
1083
|
+
isValid: {
|
|
1084
|
+
required,
|
|
1085
|
+
elements: elements !== 'none' ? true : false,
|
|
1086
|
+
custom: maybeCustomRule( customPasswordRule ),
|
|
1087
|
+
},
|
|
1063
1088
|
},
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
{ value: 'option1', label: 'Option 1' },
|
|
1075
|
-
{ value: 'option2', label: 'Option 2' },
|
|
1076
|
-
{ value: 'option3', label: 'Option 3' },
|
|
1077
|
-
],
|
|
1078
|
-
getElements:
|
|
1079
|
-
elements === 'async' ? getElements( 'toggleGroup' ) : undefined,
|
|
1080
|
-
isValid: {
|
|
1081
|
-
required,
|
|
1082
|
-
elements: elements !== 'none' ? true : false,
|
|
1083
|
-
custom: maybeCustomRule( customToggleGroupRule ),
|
|
1089
|
+
{
|
|
1090
|
+
id: 'toggle',
|
|
1091
|
+
type: 'boolean',
|
|
1092
|
+
label: 'Toggle',
|
|
1093
|
+
Edit: 'toggle',
|
|
1094
|
+
isValid: {
|
|
1095
|
+
required,
|
|
1096
|
+
elements: elements !== 'none' ? true : false,
|
|
1097
|
+
custom: maybeCustomRule( customToggleRule ),
|
|
1098
|
+
},
|
|
1084
1099
|
},
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1100
|
+
{
|
|
1101
|
+
id: 'toggleGroup',
|
|
1102
|
+
type: 'text',
|
|
1103
|
+
label: 'Toggle Group',
|
|
1104
|
+
Edit: 'toggleGroup',
|
|
1105
|
+
elements:
|
|
1106
|
+
elements === 'async'
|
|
1107
|
+
? undefined
|
|
1108
|
+
: [
|
|
1109
|
+
{ value: 'option1', label: 'Option 1' },
|
|
1110
|
+
{ value: 'option2', label: 'Option 2' },
|
|
1111
|
+
{ value: 'option3', label: 'Option 3' },
|
|
1112
|
+
],
|
|
1113
|
+
getElements:
|
|
1114
|
+
elements === 'async'
|
|
1115
|
+
? getElements( 'toggleGroup' )
|
|
1116
|
+
: undefined,
|
|
1117
|
+
isValid: {
|
|
1118
|
+
required,
|
|
1119
|
+
elements: elements !== 'none' ? true : false,
|
|
1120
|
+
custom: maybeCustomRule( customToggleGroupRule ),
|
|
1121
|
+
},
|
|
1094
1122
|
},
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
custom: maybeCustomRule( customDateRangeRule ),
|
|
1123
|
+
{
|
|
1124
|
+
id: 'date',
|
|
1125
|
+
type: 'date',
|
|
1126
|
+
label: 'Date',
|
|
1127
|
+
isValid: {
|
|
1128
|
+
required,
|
|
1129
|
+
elements: elements !== 'none' ? true : false,
|
|
1130
|
+
custom: maybeCustomRule( customDateRule ),
|
|
1131
|
+
},
|
|
1105
1132
|
},
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1133
|
+
{
|
|
1134
|
+
id: 'dateRange',
|
|
1135
|
+
type: 'date',
|
|
1136
|
+
label: 'Date Range',
|
|
1137
|
+
Edit: DateRangeEdit,
|
|
1138
|
+
isValid: {
|
|
1139
|
+
required,
|
|
1140
|
+
elements: elements !== 'none' ? true : false,
|
|
1141
|
+
custom: maybeCustomRule( customDateRangeRule ),
|
|
1142
|
+
},
|
|
1115
1143
|
},
|
|
1116
|
-
},
|
|
1117
|
-
];
|
|
1118
|
-
|
|
1119
|
-
const form = {
|
|
1120
|
-
layout: { type },
|
|
1121
|
-
fields: [
|
|
1122
|
-
// Use field object for testing purposes.
|
|
1123
|
-
{ id: 'text' },
|
|
1124
|
-
'select',
|
|
1125
|
-
'textWithRadio',
|
|
1126
|
-
'textarea',
|
|
1127
|
-
'email',
|
|
1128
|
-
'telephone',
|
|
1129
|
-
'url',
|
|
1130
|
-
'color',
|
|
1131
|
-
'integer',
|
|
1132
|
-
'number',
|
|
1133
|
-
'boolean',
|
|
1134
|
-
'categories',
|
|
1135
|
-
'countries',
|
|
1136
|
-
'toggle',
|
|
1137
|
-
'toggleGroup',
|
|
1138
|
-
'password',
|
|
1139
|
-
'customEdit',
|
|
1140
|
-
// Use field object with children for testing purposes.
|
|
1141
1144
|
{
|
|
1142
|
-
id: '
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
+
id: 'datetime',
|
|
1146
|
+
type: 'datetime',
|
|
1147
|
+
label: 'Date Time',
|
|
1148
|
+
isValid: {
|
|
1149
|
+
required,
|
|
1150
|
+
elements: elements !== 'none' ? true : false,
|
|
1151
|
+
custom: maybeCustomRule( customDateTimeRule ),
|
|
1152
|
+
},
|
|
1145
1153
|
},
|
|
1146
|
-
]
|
|
1147
|
-
};
|
|
1154
|
+
];
|
|
1155
|
+
}, [ elements, custom, required, getElements ] );
|
|
1156
|
+
|
|
1157
|
+
const form = useMemo(
|
|
1158
|
+
() => ( {
|
|
1159
|
+
fields: [
|
|
1160
|
+
'text',
|
|
1161
|
+
{ id: 'customEdit' },
|
|
1162
|
+
{
|
|
1163
|
+
id: 'level1Integer',
|
|
1164
|
+
children: [ 'integer' ],
|
|
1165
|
+
},
|
|
1166
|
+
{
|
|
1167
|
+
id: 'level1Number',
|
|
1168
|
+
children: [
|
|
1169
|
+
{ id: 'level2Number', children: [ 'number' ] },
|
|
1170
|
+
],
|
|
1171
|
+
},
|
|
1172
|
+
{
|
|
1173
|
+
id: 'level1Email',
|
|
1174
|
+
children: [
|
|
1175
|
+
{
|
|
1176
|
+
id: 'level2Email',
|
|
1177
|
+
children: [
|
|
1178
|
+
{ id: 'level3Email', children: [ 'email' ] },
|
|
1179
|
+
],
|
|
1180
|
+
},
|
|
1181
|
+
],
|
|
1182
|
+
},
|
|
1183
|
+
{
|
|
1184
|
+
id: 'level1Telephone',
|
|
1185
|
+
children: [
|
|
1186
|
+
{
|
|
1187
|
+
id: 'level2Telephone',
|
|
1188
|
+
children: [
|
|
1189
|
+
{
|
|
1190
|
+
id: 'level3Telephone',
|
|
1191
|
+
children: [
|
|
1192
|
+
{
|
|
1193
|
+
id: 'level4Telephone',
|
|
1194
|
+
children: [ 'telephone' ],
|
|
1195
|
+
},
|
|
1196
|
+
],
|
|
1197
|
+
},
|
|
1198
|
+
],
|
|
1199
|
+
},
|
|
1200
|
+
],
|
|
1201
|
+
},
|
|
1202
|
+
'url',
|
|
1203
|
+
'color',
|
|
1204
|
+
'password',
|
|
1205
|
+
'textarea',
|
|
1206
|
+
'select',
|
|
1207
|
+
'textWithRadio',
|
|
1208
|
+
'boolean',
|
|
1209
|
+
'toggle',
|
|
1210
|
+
'toggleGroup',
|
|
1211
|
+
'array',
|
|
1212
|
+
'date',
|
|
1213
|
+
'dateRange',
|
|
1214
|
+
'datetime',
|
|
1215
|
+
],
|
|
1216
|
+
} ),
|
|
1217
|
+
[]
|
|
1218
|
+
);
|
|
1148
1219
|
|
|
1149
1220
|
const { validity, isValid } = useFormValidity( post, _fields, form );
|
|
1150
1221
|
|
|
@@ -1326,7 +1397,7 @@ const LayoutCardComponent = ( {
|
|
|
1326
1397
|
isVisible: ( item ) => item.displayPayments,
|
|
1327
1398
|
render: ( { item } ) => {
|
|
1328
1399
|
return (
|
|
1329
|
-
<p>
|
|
1400
|
+
<p style={ { margin: 0 } }>
|
|
1330
1401
|
The customer has made a total of { item.totalOrders }{ ' ' }
|
|
1331
1402
|
orders, amounting to { item.totalRevenue } dollars. The
|
|
1332
1403
|
average order value is { item.averageOrderValue }{ ' ' }
|
|
@@ -1382,17 +1453,13 @@ const LayoutCardComponent = ( {
|
|
|
1382
1453
|
|
|
1383
1454
|
const form: Form = useMemo(
|
|
1384
1455
|
() => ( {
|
|
1385
|
-
layout: getLayoutFromStoryArgs( {
|
|
1386
|
-
type: 'card',
|
|
1387
|
-
withHeader,
|
|
1388
|
-
} ),
|
|
1389
1456
|
fields: [
|
|
1390
1457
|
{
|
|
1391
1458
|
id: 'customerCard',
|
|
1392
1459
|
layout: {
|
|
1393
1460
|
type: 'card',
|
|
1394
1461
|
summary: 'plan-summary',
|
|
1395
|
-
|
|
1462
|
+
withHeader,
|
|
1396
1463
|
},
|
|
1397
1464
|
label: 'Customer',
|
|
1398
1465
|
description:
|
|
@@ -1796,6 +1863,73 @@ const LayoutRowComponent = ( {
|
|
|
1796
1863
|
);
|
|
1797
1864
|
};
|
|
1798
1865
|
|
|
1866
|
+
const LayoutDetailsComponent = () => {
|
|
1867
|
+
const [ post, setPost ] = useState< SamplePost >( {
|
|
1868
|
+
title: 'Hello, World!',
|
|
1869
|
+
order: 2,
|
|
1870
|
+
author: 1,
|
|
1871
|
+
status: 'draft',
|
|
1872
|
+
reviewer: 'fulano',
|
|
1873
|
+
date: '2021-01-01T12:00:00',
|
|
1874
|
+
birthdate: '1950-02-23T12:00:00',
|
|
1875
|
+
filesize: 1024,
|
|
1876
|
+
dimensions: '1920x1080',
|
|
1877
|
+
comment_status: 'open',
|
|
1878
|
+
ping_status: true,
|
|
1879
|
+
tags: [ 'photography' ],
|
|
1880
|
+
} );
|
|
1881
|
+
|
|
1882
|
+
const form: Form = {
|
|
1883
|
+
fields: [
|
|
1884
|
+
{
|
|
1885
|
+
id: 'discussion',
|
|
1886
|
+
label: 'Discussion',
|
|
1887
|
+
children: [ 'comment_status', 'ping_status' ],
|
|
1888
|
+
layout: {
|
|
1889
|
+
type: 'details',
|
|
1890
|
+
summary: 'discussion',
|
|
1891
|
+
},
|
|
1892
|
+
},
|
|
1893
|
+
{
|
|
1894
|
+
id: 'metadata',
|
|
1895
|
+
label: 'Metadata',
|
|
1896
|
+
children: [ 'filesize', 'dimensions' ],
|
|
1897
|
+
layout: {
|
|
1898
|
+
type: 'details',
|
|
1899
|
+
summary: 'metadata_summary',
|
|
1900
|
+
},
|
|
1901
|
+
},
|
|
1902
|
+
{
|
|
1903
|
+
id: 'categorization',
|
|
1904
|
+
label: 'Categorization',
|
|
1905
|
+
children: [ 'tags', 'description' ],
|
|
1906
|
+
layout: { type: 'details' },
|
|
1907
|
+
},
|
|
1908
|
+
{
|
|
1909
|
+
id: 'scheduling',
|
|
1910
|
+
children: [ 'date', 'birthdate' ],
|
|
1911
|
+
layout: {
|
|
1912
|
+
type: 'details',
|
|
1913
|
+
},
|
|
1914
|
+
},
|
|
1915
|
+
],
|
|
1916
|
+
};
|
|
1917
|
+
|
|
1918
|
+
return (
|
|
1919
|
+
<DataForm< SamplePost >
|
|
1920
|
+
data={ post }
|
|
1921
|
+
fields={ fields }
|
|
1922
|
+
form={ form }
|
|
1923
|
+
onChange={ ( edits ) =>
|
|
1924
|
+
setPost( ( prev ) => ( {
|
|
1925
|
+
...prev,
|
|
1926
|
+
...edits,
|
|
1927
|
+
} ) )
|
|
1928
|
+
}
|
|
1929
|
+
/>
|
|
1930
|
+
);
|
|
1931
|
+
};
|
|
1932
|
+
|
|
1799
1933
|
const LayoutMixedComponent = () => {
|
|
1800
1934
|
const [ post, setPost ] = useState< SamplePost >( {
|
|
1801
1935
|
title: 'Hello, World!',
|
|
@@ -1923,6 +2057,10 @@ export const LayoutRow = {
|
|
|
1923
2057
|
},
|
|
1924
2058
|
};
|
|
1925
2059
|
|
|
2060
|
+
export const LayoutDetails = {
|
|
2061
|
+
render: LayoutDetailsComponent,
|
|
2062
|
+
};
|
|
2063
|
+
|
|
1926
2064
|
export const LayoutMixed = {
|
|
1927
2065
|
render: LayoutMixedComponent,
|
|
1928
2066
|
};
|
|
@@ -1946,17 +2084,11 @@ export const Validation = {
|
|
|
1946
2084
|
description: 'Whether or not the custom validation rule is active.',
|
|
1947
2085
|
options: [ 'sync', 'async', 'none' ],
|
|
1948
2086
|
},
|
|
1949
|
-
type: {
|
|
1950
|
-
control: { type: 'select' },
|
|
1951
|
-
description: 'Chooses the layout type.',
|
|
1952
|
-
options: [ 'regular', 'panel', 'card', 'row' ],
|
|
1953
|
-
},
|
|
1954
2087
|
},
|
|
1955
2088
|
args: {
|
|
1956
2089
|
required: true,
|
|
1957
2090
|
elements: 'sync',
|
|
1958
2091
|
custom: 'sync',
|
|
1959
|
-
type: 'regular',
|
|
1960
2092
|
},
|
|
1961
2093
|
};
|
|
1962
2094
|
|