@wordpress/dataviews 11.0.0 → 11.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/README.md +140 -93
- package/build/components/dataviews-filters/filter.js +25 -267
- package/build/components/dataviews-filters/filter.js.map +2 -2
- package/build/components/dataviews-filters/input-widget.js +1 -4
- package/build/components/dataviews-filters/input-widget.js.map +2 -2
- package/build/components/dataviews-filters/use-filters.js +3 -3
- package/build/components/dataviews-filters/use-filters.js.map +2 -2
- package/build/constants.js +5 -142
- package/build/constants.js.map +2 -2
- package/build/dataform-controls/number.js +2 -1
- package/build/dataform-controls/number.js.map +2 -2
- package/build/dataform-controls/textarea.js +3 -1
- package/build/dataform-controls/textarea.js.map +2 -2
- package/build/dataform-controls/utils/get-custom-validity.js +8 -0
- package/build/dataform-controls/utils/get-custom-validity.js.map +2 -2
- package/build/dataform-controls/utils/validated-input.js +4 -2
- package/build/dataform-controls/utils/validated-input.js.map +2 -2
- package/build/dataform-controls/utils/validated-number.js +4 -2
- package/build/dataform-controls/utils/validated-number.js.map +2 -2
- package/build/dataform-layouts/panel/modal.js +14 -5
- package/build/dataform-layouts/panel/modal.js.map +2 -2
- package/build/dataviews-layouts/grid/composite-grid.js +39 -37
- package/build/dataviews-layouts/grid/composite-grid.js.map +3 -3
- package/build/dataviews-layouts/table/index.js +8 -3
- package/build/dataviews-layouts/table/index.js.map +2 -2
- package/build/field-types/array.js +27 -14
- package/build/field-types/array.js.map +3 -3
- package/build/field-types/boolean.js +13 -10
- package/build/field-types/boolean.js.map +3 -3
- package/build/field-types/color.js +14 -11
- package/build/field-types/color.js.map +3 -3
- package/build/field-types/date.js +11 -8
- package/build/field-types/date.js.map +3 -3
- package/build/field-types/datetime.js +7 -5
- package/build/field-types/datetime.js.map +3 -3
- package/build/field-types/email.js +20 -11
- package/build/field-types/email.js.map +3 -3
- package/build/field-types/index.js +12 -14
- package/build/field-types/index.js.map +3 -3
- package/build/field-types/integer.js +63 -14
- package/build/field-types/integer.js.map +3 -3
- package/build/field-types/media.js +5 -5
- package/build/field-types/media.js.map +2 -2
- package/build/field-types/no-type.js +9 -6
- package/build/field-types/no-type.js.map +3 -3
- package/build/field-types/number.js +51 -15
- package/build/field-types/number.js.map +3 -3
- package/build/field-types/password.js +13 -5
- package/build/field-types/password.js.map +3 -3
- package/build/field-types/telephone.js +13 -5
- package/build/field-types/telephone.js.map +3 -3
- package/build/field-types/text.js +13 -5
- package/build/field-types/text.js.map +3 -3
- package/build/field-types/url.js +13 -5
- package/build/field-types/url.js.map +3 -3
- package/build/field-types/utils/get-is-valid.js +89 -0
- package/build/field-types/utils/get-is-valid.js.map +7 -0
- package/build/field-types/utils/is-valid-elements.js +35 -0
- package/build/field-types/utils/is-valid-elements.js.map +7 -0
- package/build/field-types/utils/is-valid-max-length.js +36 -0
- package/build/field-types/utils/is-valid-max-length.js.map +7 -0
- package/build/field-types/utils/is-valid-max.js +36 -0
- package/build/field-types/utils/is-valid-max.js.map +7 -0
- package/build/field-types/utils/is-valid-min-length.js +36 -0
- package/build/field-types/utils/is-valid-min-length.js.map +7 -0
- package/build/field-types/utils/is-valid-min.js +36 -0
- package/build/field-types/utils/is-valid-min.js.map +7 -0
- package/build/field-types/utils/is-valid-pattern.js +41 -0
- package/build/field-types/utils/is-valid-pattern.js.map +7 -0
- package/build/field-types/utils/is-valid-required-for-array.js +32 -0
- package/build/field-types/utils/is-valid-required-for-array.js.map +7 -0
- package/build/field-types/utils/is-valid-required-for-bool.js +30 -0
- package/build/field-types/utils/is-valid-required-for-bool.js.map +7 -0
- package/build/field-types/utils/is-valid-required.js +30 -0
- package/build/field-types/utils/is-valid-required.js.map +7 -0
- package/build/hooks/use-form-validity.js +52 -102
- package/build/hooks/use-form-validity.js.map +2 -2
- package/build/types/field-api.js.map +1 -1
- package/build/types/private.js.map +1 -1
- package/build/utils/filter-sort-and-paginate.js +5 -0
- package/build/utils/filter-sort-and-paginate.js.map +3 -3
- package/build/utils/operators.js +399 -0
- package/build/utils/operators.js.map +7 -0
- package/build-module/components/dataviews-filters/filter.js +26 -292
- package/build-module/components/dataviews-filters/filter.js.map +2 -2
- package/build-module/components/dataviews-filters/input-widget.js +1 -4
- package/build-module/components/dataviews-filters/input-widget.js.map +2 -2
- package/build-module/components/dataviews-filters/use-filters.js +6 -3
- package/build-module/components/dataviews-filters/use-filters.js.map +2 -2
- package/build-module/constants.js +5 -139
- package/build-module/constants.js.map +2 -2
- package/build-module/dataform-controls/number.js +2 -1
- package/build-module/dataform-controls/number.js.map +2 -2
- package/build-module/dataform-controls/textarea.js +3 -1
- package/build-module/dataform-controls/textarea.js.map +2 -2
- package/build-module/dataform-controls/utils/get-custom-validity.js +8 -0
- package/build-module/dataform-controls/utils/get-custom-validity.js.map +2 -2
- package/build-module/dataform-controls/utils/validated-input.js +4 -2
- package/build-module/dataform-controls/utils/validated-input.js.map +2 -2
- package/build-module/dataform-controls/utils/validated-number.js +4 -2
- package/build-module/dataform-controls/utils/validated-number.js.map +2 -2
- package/build-module/dataform-layouts/panel/modal.js +14 -5
- package/build-module/dataform-layouts/panel/modal.js.map +2 -2
- package/build-module/dataviews-layouts/grid/composite-grid.js +40 -38
- package/build-module/dataviews-layouts/grid/composite-grid.js.map +3 -3
- package/build-module/dataviews-layouts/table/index.js +8 -3
- package/build-module/dataviews-layouts/table/index.js.map +2 -2
- package/build-module/field-types/array.js +17 -14
- package/build-module/field-types/array.js.map +2 -2
- package/build-module/field-types/boolean.js +13 -10
- package/build-module/field-types/boolean.js.map +2 -2
- package/build-module/field-types/color.js +14 -11
- package/build-module/field-types/color.js.map +2 -2
- package/build-module/field-types/date.js +11 -8
- package/build-module/field-types/date.js.map +2 -2
- package/build-module/field-types/datetime.js +7 -5
- package/build-module/field-types/datetime.js.map +2 -2
- package/build-module/field-types/email.js +20 -11
- package/build-module/field-types/email.js.map +2 -2
- package/build-module/field-types/index.js +12 -14
- package/build-module/field-types/index.js.map +2 -2
- package/build-module/field-types/integer.js +58 -13
- package/build-module/field-types/integer.js.map +2 -2
- package/build-module/field-types/media.js +5 -5
- package/build-module/field-types/media.js.map +2 -2
- package/build-module/field-types/no-type.js +10 -7
- package/build-module/field-types/no-type.js.map +2 -2
- package/build-module/field-types/number.js +47 -15
- package/build-module/field-types/number.js.map +2 -2
- package/build-module/field-types/password.js +13 -5
- package/build-module/field-types/password.js.map +2 -2
- package/build-module/field-types/telephone.js +13 -5
- package/build-module/field-types/telephone.js.map +2 -2
- package/build-module/field-types/text.js +13 -5
- package/build-module/field-types/text.js.map +2 -2
- package/build-module/field-types/url.js +13 -5
- package/build-module/field-types/url.js.map +2 -2
- package/build-module/field-types/utils/get-is-valid.js +68 -0
- package/build-module/field-types/utils/get-is-valid.js.map +7 -0
- package/build-module/field-types/utils/is-valid-elements.js +14 -0
- package/build-module/field-types/utils/is-valid-elements.js.map +7 -0
- package/build-module/field-types/utils/is-valid-max-length.js +15 -0
- package/build-module/field-types/utils/is-valid-max-length.js.map +7 -0
- package/build-module/field-types/utils/is-valid-max.js +15 -0
- package/build-module/field-types/utils/is-valid-max.js.map +7 -0
- package/build-module/field-types/utils/is-valid-min-length.js +15 -0
- package/build-module/field-types/utils/is-valid-min-length.js.map +7 -0
- package/build-module/field-types/utils/is-valid-min.js +15 -0
- package/build-module/field-types/utils/is-valid-min.js.map +7 -0
- package/build-module/field-types/utils/is-valid-pattern.js +20 -0
- package/build-module/field-types/utils/is-valid-pattern.js.map +7 -0
- package/build-module/field-types/utils/is-valid-required-for-array.js +11 -0
- package/build-module/field-types/utils/is-valid-required-for-array.js.map +7 -0
- package/build-module/field-types/utils/is-valid-required-for-bool.js +9 -0
- package/build-module/field-types/utils/is-valid-required-for-bool.js.map +7 -0
- package/build-module/field-types/utils/is-valid-required.js +9 -0
- package/build-module/field-types/utils/is-valid-required.js.map +7 -0
- package/build-module/hooks/use-form-validity.js +52 -102
- package/build-module/hooks/use-form-validity.js.map +2 -2
- package/build-module/utils/filter-sort-and-paginate.js +5 -0
- package/build-module/utils/filter-sort-and-paginate.js.map +2 -2
- package/build-module/utils/operators.js +394 -0
- package/build-module/utils/operators.js.map +7 -0
- package/build-style/style-rtl.css +13 -80
- package/build-style/style.css +13 -80
- package/build-types/components/dataviews-filters/filter.d.ts.map +1 -1
- package/build-types/components/dataviews-filters/input-widget.d.ts.map +1 -1
- package/build-types/components/dataviews-filters/use-filters.d.ts.map +1 -1
- package/build-types/constants.d.ts +6 -12
- package/build-types/constants.d.ts.map +1 -1
- package/build-types/dataform-controls/number.d.ts.map +1 -1
- package/build-types/dataform-controls/textarea.d.ts.map +1 -1
- package/build-types/dataform-controls/utils/get-custom-validity.d.ts +2 -2
- package/build-types/dataform-controls/utils/get-custom-validity.d.ts.map +1 -1
- package/build-types/dataform-controls/utils/validated-input.d.ts.map +1 -1
- package/build-types/dataform-controls/utils/validated-number.d.ts.map +1 -1
- package/build-types/dataform-layouts/panel/modal.d.ts.map +1 -1
- package/build-types/dataviews-layouts/grid/composite-grid.d.ts.map +1 -1
- package/build-types/dataviews-layouts/table/index.d.ts.map +1 -1
- package/build-types/field-types/array.d.ts +9 -2
- package/build-types/field-types/array.d.ts.map +1 -1
- package/build-types/field-types/boolean.d.ts +9 -2
- package/build-types/field-types/boolean.d.ts.map +1 -1
- package/build-types/field-types/color.d.ts +9 -2
- package/build-types/field-types/color.d.ts.map +1 -1
- package/build-types/field-types/date.d.ts +6 -4
- package/build-types/field-types/date.d.ts.map +1 -1
- package/build-types/field-types/datetime.d.ts +6 -4
- package/build-types/field-types/datetime.d.ts.map +1 -1
- package/build-types/field-types/email.d.ts +15 -2
- package/build-types/field-types/email.d.ts.map +1 -1
- package/build-types/field-types/index.d.ts.map +1 -1
- package/build-types/field-types/integer.d.ts +17 -4
- package/build-types/field-types/integer.d.ts.map +1 -1
- package/build-types/field-types/media.d.ts +1 -4
- package/build-types/field-types/media.d.ts.map +1 -1
- package/build-types/field-types/no-type.d.ts +6 -4
- package/build-types/field-types/no-type.d.ts.map +1 -1
- package/build-types/field-types/number.d.ts +17 -4
- package/build-types/field-types/number.d.ts.map +1 -1
- package/build-types/field-types/password.d.ts +12 -4
- package/build-types/field-types/password.d.ts.map +1 -1
- package/build-types/field-types/telephone.d.ts +12 -4
- package/build-types/field-types/telephone.d.ts.map +1 -1
- package/build-types/field-types/text.d.ts +12 -4
- package/build-types/field-types/text.d.ts.map +1 -1
- package/build-types/field-types/url.d.ts +12 -4
- package/build-types/field-types/url.d.ts.map +1 -1
- package/build-types/field-types/utils/get-is-valid.d.ts +7 -0
- package/build-types/field-types/utils/get-is-valid.d.ts.map +1 -0
- package/build-types/field-types/utils/is-valid-elements.d.ts +6 -0
- package/build-types/field-types/utils/is-valid-elements.d.ts.map +1 -0
- package/build-types/field-types/utils/is-valid-max-length.d.ts +6 -0
- package/build-types/field-types/utils/is-valid-max-length.d.ts.map +1 -0
- package/build-types/field-types/utils/is-valid-max.d.ts +6 -0
- package/build-types/field-types/utils/is-valid-max.d.ts.map +1 -0
- package/build-types/field-types/utils/is-valid-min-length.d.ts +6 -0
- package/build-types/field-types/utils/is-valid-min-length.d.ts.map +1 -0
- package/build-types/field-types/utils/is-valid-min.d.ts +6 -0
- package/build-types/field-types/utils/is-valid-min.d.ts.map +1 -0
- package/build-types/field-types/utils/is-valid-pattern.d.ts +6 -0
- package/build-types/field-types/utils/is-valid-pattern.d.ts.map +1 -0
- package/build-types/field-types/utils/is-valid-required-for-array.d.ts +6 -0
- package/build-types/field-types/utils/is-valid-required-for-array.d.ts.map +1 -0
- package/build-types/field-types/utils/is-valid-required-for-bool.d.ts +6 -0
- package/build-types/field-types/utils/is-valid-required-for-bool.d.ts.map +1 -0
- package/build-types/field-types/utils/is-valid-required.d.ts +6 -0
- package/build-types/field-types/utils/is-valid-required.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 +9 -1
- package/build-types/stories/dataform.story.d.ts.map +1 -1
- package/build-types/stories/dataviews-picker.story.d.ts.map +1 -1
- package/build-types/stories/dataviews.story.d.ts +27 -2
- package/build-types/stories/dataviews.story.d.ts.map +1 -1
- package/build-types/stories/field-types.story.d.ts +39 -2
- package/build-types/stories/field-types.story.d.ts.map +1 -1
- package/build-types/types/field-api.d.ts +72 -4
- package/build-types/types/field-api.d.ts.map +1 -1
- package/build-types/types/private.d.ts +13 -3
- package/build-types/types/private.d.ts.map +1 -1
- package/build-types/utils/filter-sort-and-paginate.d.ts.map +1 -1
- package/build-types/utils/operators.d.ts +16 -0
- package/build-types/utils/operators.d.ts.map +1 -0
- package/build-wp/index.js +1548 -1452
- package/package.json +17 -16
- package/src/components/dataviews/style.scss +3 -28
- package/src/components/dataviews-filters/filter.tsx +34 -321
- package/src/components/dataviews-filters/input-widget.tsx +7 -5
- package/src/components/dataviews-filters/use-filters.ts +6 -3
- package/src/components/dataviews-footer/style.scss +1 -7
- package/src/constants.ts +6 -140
- package/src/dataform-controls/number.tsx +3 -3
- package/src/dataform-controls/textarea.tsx +7 -1
- package/src/dataform-controls/utils/get-custom-validity.ts +10 -2
- package/src/dataform-controls/utils/validated-input.tsx +8 -2
- package/src/dataform-controls/utils/validated-number.tsx +3 -1
- package/src/dataform-layouts/panel/modal.tsx +14 -5
- package/src/dataviews-layouts/activity/style.scss +1 -1
- package/src/dataviews-layouts/grid/composite-grid.tsx +64 -57
- package/src/dataviews-layouts/grid/style.scss +3 -12
- package/src/dataviews-layouts/table/index.tsx +9 -3
- package/src/dataviews-layouts/table/style.scss +4 -15
- package/src/dataviews-layouts/utils/grid-items.scss +1 -9
- package/src/field-types/array.tsx +26 -19
- package/src/field-types/boolean.tsx +22 -15
- package/src/field-types/color.tsx +22 -15
- package/src/field-types/date.tsx +14 -11
- package/src/field-types/datetime.tsx +6 -4
- package/src/field-types/email.tsx +24 -15
- package/src/field-types/index.tsx +12 -14
- package/src/field-types/integer.tsx +83 -17
- package/src/field-types/media.tsx +4 -4
- package/src/field-types/no-type.tsx +9 -6
- package/src/field-types/number.tsx +82 -16
- package/src/field-types/password.tsx +12 -4
- package/src/field-types/telephone.tsx +12 -4
- package/src/field-types/text.tsx +12 -4
- package/src/field-types/url.tsx +12 -4
- package/src/field-types/utils/get-is-valid.ts +103 -0
- package/src/field-types/utils/is-valid-elements.ts +20 -0
- package/src/field-types/utils/is-valid-max-length.ts +23 -0
- package/src/field-types/utils/is-valid-max.ts +23 -0
- package/src/field-types/utils/is-valid-min-length.ts +23 -0
- package/src/field-types/utils/is-valid-min.ts +23 -0
- package/src/field-types/utils/is-valid-pattern.ts +29 -0
- package/src/field-types/utils/is-valid-required-for-array.ts +18 -0
- package/src/field-types/utils/is-valid-required-for-bool.ts +13 -0
- package/src/field-types/utils/is-valid-required.ts +13 -0
- package/src/hooks/use-form-validity.ts +78 -156
- package/src/stories/dataform.story.tsx +126 -30
- package/src/stories/dataviews-picker.story.tsx +27 -17
- package/src/stories/dataviews.story.tsx +79 -30
- package/src/stories/field-types.story.tsx +86 -4
- package/src/test/filter-sort-and-paginate.js +2 -1
- package/src/test/normalize-fields.ts +87 -11
- package/src/test/use-form-validity.ts +796 -31
- package/src/types/field-api.ts +90 -4
- package/src/types/private.ts +26 -8
- package/src/utils/filter-sort-and-paginate.ts +5 -0
- package/src/utils/operators.tsx +448 -0
- package/tsconfig.json +1 -0
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// packages/dataviews/src/field-types/utils/is-valid-required-for-array.ts
|
|
21
|
+
var is_valid_required_for_array_exports = {};
|
|
22
|
+
__export(is_valid_required_for_array_exports, {
|
|
23
|
+
default: () => isValidRequiredForArray
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(is_valid_required_for_array_exports);
|
|
26
|
+
function isValidRequiredForArray(item, field) {
|
|
27
|
+
const value = field.getValue({ item });
|
|
28
|
+
return Array.isArray(value) && value.length > 0 && value.every(
|
|
29
|
+
(element) => ![void 0, "", null].includes(element)
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=is-valid-required-for-array.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/field-types/utils/is-valid-required-for-array.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Internal dependencies\n */\nimport type { NormalizedField } from '../../types';\n\nexport default function isValidRequiredForArray< Item >(\n\titem: Item,\n\tfield: NormalizedField< Item >\n) {\n\tconst value = field.getValue( { item } );\n\treturn (\n\t\tArray.isArray( value ) &&\n\t\tvalue.length > 0 &&\n\t\tvalue.every(\n\t\t\t( element: any ) => ! [ undefined, '', null ].includes( element )\n\t\t)\n\t);\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAKe,SAAR,wBACN,MACA,OACC;AACD,QAAM,QAAQ,MAAM,SAAU,EAAE,KAAK,CAAE;AACvC,SACC,MAAM,QAAS,KAAM,KACrB,MAAM,SAAS,KACf,MAAM;AAAA,IACL,CAAE,YAAkB,CAAE,CAAE,QAAW,IAAI,IAAK,EAAE,SAAU,OAAQ;AAAA,EACjE;AAEF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// packages/dataviews/src/field-types/utils/is-valid-required-for-bool.ts
|
|
21
|
+
var is_valid_required_for_bool_exports = {};
|
|
22
|
+
__export(is_valid_required_for_bool_exports, {
|
|
23
|
+
default: () => isValidRequiredForBool
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(is_valid_required_for_bool_exports);
|
|
26
|
+
function isValidRequiredForBool(item, field) {
|
|
27
|
+
const value = field.getValue({ item });
|
|
28
|
+
return value === true;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=is-valid-required-for-bool.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/field-types/utils/is-valid-required-for-bool.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Internal dependencies\n */\nimport type { NormalizedField } from '../../types';\n\nexport default function isValidRequiredForBool< Item >(\n\titem: Item,\n\tfield: NormalizedField< Item >\n) {\n\tconst value = field.getValue( { item } );\n\n\treturn value === true;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAKe,SAAR,uBACN,MACA,OACC;AACD,QAAM,QAAQ,MAAM,SAAU,EAAE,KAAK,CAAE;AAEvC,SAAO,UAAU;AAClB;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// packages/dataviews/src/field-types/utils/is-valid-required.ts
|
|
21
|
+
var is_valid_required_exports = {};
|
|
22
|
+
__export(is_valid_required_exports, {
|
|
23
|
+
default: () => isValidRequired
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(is_valid_required_exports);
|
|
26
|
+
function isValidRequired(item, field) {
|
|
27
|
+
const value = field.getValue({ item });
|
|
28
|
+
return ![void 0, "", null].includes(value);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=is-valid-required.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/field-types/utils/is-valid-required.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Internal dependencies\n */\nimport type { NormalizedField } from '../../types';\n\nexport default function isValidRequired< Item >(\n\titem: Item,\n\tfield: NormalizedField< Item >\n) {\n\tconst value = field.getValue( { item } );\n\n\treturn ! [ undefined, '', null ].includes( value );\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAKe,SAAR,gBACN,MACA,OACC;AACD,QAAM,QAAQ,MAAM,SAAU,EAAE,KAAK,CAAE;AAEvC,SAAO,CAAE,CAAE,QAAW,IAAI,IAAK,EAAE,SAAU,KAAM;AAClD;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -40,16 +40,6 @@ var import_element = require("@wordpress/element");
|
|
|
40
40
|
var import_i18n = require("@wordpress/i18n");
|
|
41
41
|
var import_field_types = __toESM(require("../field-types"));
|
|
42
42
|
var import_normalize_form = __toESM(require("../dataform-layouts/normalize-form"));
|
|
43
|
-
var isEmptyNullOrUndefined = (value) => [void 0, "", null].includes(value);
|
|
44
|
-
var isArrayOrElementsEmptyNullOrUndefined = (value) => {
|
|
45
|
-
return !Array.isArray(value) || value.length === 0 || value.every((element) => isEmptyNullOrUndefined(element));
|
|
46
|
-
};
|
|
47
|
-
function isInvalidForRequired(fieldType, value) {
|
|
48
|
-
if (fieldType === void 0 && isEmptyNullOrUndefined(value) || fieldType === "text" && isEmptyNullOrUndefined(value) || fieldType === "email" && isEmptyNullOrUndefined(value) || fieldType === "url" && isEmptyNullOrUndefined(value) || fieldType === "telephone" && isEmptyNullOrUndefined(value) || fieldType === "password" && isEmptyNullOrUndefined(value) || fieldType === "integer" && isEmptyNullOrUndefined(value) || fieldType === "number" && isEmptyNullOrUndefined(value) || fieldType === "array" && isArrayOrElementsEmptyNullOrUndefined(value) || fieldType === "boolean" && value !== true) {
|
|
49
|
-
return true;
|
|
50
|
-
}
|
|
51
|
-
return false;
|
|
52
|
-
}
|
|
53
43
|
function isFormValid(formValidity) {
|
|
54
44
|
if (!formValidity) {
|
|
55
45
|
return true;
|
|
@@ -157,42 +147,10 @@ function handleElementsValidationAsync(promise, formField, promiseHandler) {
|
|
|
157
147
|
});
|
|
158
148
|
return;
|
|
159
149
|
}
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
prev,
|
|
165
|
-
{
|
|
166
|
-
elements: {
|
|
167
|
-
type: "invalid",
|
|
168
|
-
message: (0, import_i18n.__)(
|
|
169
|
-
"Value must be one of the elements."
|
|
170
|
-
)
|
|
171
|
-
}
|
|
172
|
-
},
|
|
173
|
-
[...path, formField.id]
|
|
174
|
-
);
|
|
175
|
-
return newFormValidity;
|
|
176
|
-
});
|
|
177
|
-
return;
|
|
178
|
-
}
|
|
179
|
-
if (!!formField.field && formField.field.type === "array" && !Array.isArray(formField.field.getValue({ item }))) {
|
|
180
|
-
setFormValidity((prev) => {
|
|
181
|
-
const newFormValidity = setValidityAtPath(
|
|
182
|
-
prev,
|
|
183
|
-
{
|
|
184
|
-
elements: {
|
|
185
|
-
type: "invalid",
|
|
186
|
-
message: (0, import_i18n.__)("Value must be an array.")
|
|
187
|
-
}
|
|
188
|
-
},
|
|
189
|
-
[...path, formField.id]
|
|
190
|
-
);
|
|
191
|
-
return newFormValidity;
|
|
192
|
-
});
|
|
193
|
-
return;
|
|
194
|
-
}
|
|
195
|
-
if (!!formField.field && formField.field.type === "array" && formField.field.getValue({ item }).some((v) => !validValues.includes(v))) {
|
|
150
|
+
if (formField.field?.isValid.elements && !formField.field.isValid.elements.validate(item, {
|
|
151
|
+
...formField.field,
|
|
152
|
+
elements: result
|
|
153
|
+
})) {
|
|
196
154
|
setFormValidity((prev) => {
|
|
197
155
|
const newFormValidity = setValidityAtPath(
|
|
198
156
|
prev,
|
|
@@ -317,66 +275,58 @@ function handleCustomValidationAsync(promise, formField, promiseHandler) {
|
|
|
317
275
|
});
|
|
318
276
|
}
|
|
319
277
|
function validateFormField(item, formField, promiseHandler) {
|
|
320
|
-
if (
|
|
321
|
-
formField.field.type,
|
|
322
|
-
formField.field.getValue({ item })
|
|
323
|
-
)) {
|
|
278
|
+
if (formField.field?.isValid.required && !formField.field.isValid.required.validate(item, formField.field)) {
|
|
324
279
|
return {
|
|
325
280
|
required: { type: "invalid" }
|
|
326
281
|
};
|
|
327
282
|
}
|
|
328
|
-
if (
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
if (!regex.test(String(value))) {
|
|
334
|
-
return {
|
|
335
|
-
pattern: {
|
|
336
|
-
type: "invalid",
|
|
337
|
-
message: (0, import_i18n.__)(
|
|
338
|
-
"Value does not match the required pattern."
|
|
339
|
-
)
|
|
340
|
-
}
|
|
341
|
-
};
|
|
342
|
-
}
|
|
343
|
-
} catch (error) {
|
|
344
|
-
return {
|
|
345
|
-
pattern: {
|
|
346
|
-
type: "invalid",
|
|
347
|
-
message: (0, import_i18n.__)("Invalid pattern configuration.")
|
|
348
|
-
}
|
|
349
|
-
};
|
|
283
|
+
if (formField.field?.isValid.pattern && !formField.field.isValid.pattern.validate(item, formField.field)) {
|
|
284
|
+
return {
|
|
285
|
+
pattern: {
|
|
286
|
+
type: "invalid",
|
|
287
|
+
message: (0, import_i18n.__)("Value does not match the required pattern.")
|
|
350
288
|
}
|
|
351
|
-
}
|
|
289
|
+
};
|
|
352
290
|
}
|
|
353
|
-
if (
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
291
|
+
if (formField.field?.isValid.min && !formField.field.isValid.min.validate(item, formField.field)) {
|
|
292
|
+
return {
|
|
293
|
+
min: {
|
|
294
|
+
type: "invalid",
|
|
295
|
+
message: (0, import_i18n.__)("Value is below the minimum.")
|
|
296
|
+
}
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
if (formField.field?.isValid.max && !formField.field.isValid.max.validate(item, formField.field)) {
|
|
300
|
+
return {
|
|
301
|
+
max: {
|
|
302
|
+
type: "invalid",
|
|
303
|
+
message: (0, import_i18n.__)("Value is above the maximum.")
|
|
304
|
+
}
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
if (formField.field?.isValid.minLength && !formField.field.isValid.minLength.validate(item, formField.field)) {
|
|
308
|
+
return {
|
|
309
|
+
minLength: {
|
|
310
|
+
type: "invalid",
|
|
311
|
+
message: (0, import_i18n.__)("Value is too short.")
|
|
312
|
+
}
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
if (formField.field?.isValid.maxLength && !formField.field.isValid.maxLength.validate(item, formField.field)) {
|
|
316
|
+
return {
|
|
317
|
+
maxLength: {
|
|
318
|
+
type: "invalid",
|
|
319
|
+
message: (0, import_i18n.__)("Value is too long.")
|
|
320
|
+
}
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
if (formField.field?.isValid.elements && formField.field.hasElements && !formField.field.getElements && Array.isArray(formField.field.elements) && !formField.field.isValid.elements.validate(item, formField.field)) {
|
|
324
|
+
return {
|
|
325
|
+
elements: {
|
|
326
|
+
type: "invalid",
|
|
327
|
+
message: (0, import_i18n.__)("Value must be one of the elements.")
|
|
328
|
+
}
|
|
329
|
+
};
|
|
380
330
|
}
|
|
381
331
|
if (!!formField.field && formField.field.isValid.elements && formField.field.hasElements && typeof formField.field.getElements === "function") {
|
|
382
332
|
handleElementsValidationAsync(
|
|
@@ -392,10 +342,10 @@ function validateFormField(item, formField, promiseHandler) {
|
|
|
392
342
|
};
|
|
393
343
|
}
|
|
394
344
|
let customError;
|
|
395
|
-
if (!!formField.field) {
|
|
345
|
+
if (!!formField.field && formField.field.isValid.custom) {
|
|
396
346
|
try {
|
|
397
347
|
const value = formField.field.getValue({ item });
|
|
398
|
-
customError = formField.field.isValid
|
|
348
|
+
customError = formField.field.isValid.custom(
|
|
399
349
|
(0, import_deepmerge.default)(
|
|
400
350
|
item,
|
|
401
351
|
formField.field.setValue({
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/hooks/use-form-validity.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * External dependencies\n */\nimport deepMerge from 'deepmerge';\nimport fastDeepEqual from 'fast-deep-equal/es6';\n\n/**\n * WordPress dependencies\n */\nimport { useCallback, useEffect, useRef, useState } from '@wordpress/element';\nimport { __ } from '@wordpress/i18n';\n\n/**\n * Internal dependencies\n */\nimport normalizeFields from '../field-types';\nimport normalizeForm from '../dataform-layouts/normalize-form';\nimport type {\n\tField,\n\tFieldValidity,\n\tForm,\n\tFormValidity,\n\tNormalizedField,\n\tNormalizedFormField,\n} from '../types';\nconst isEmptyNullOrUndefined = ( value: any ) =>\n\t[ undefined, '', null ].includes( value );\n\nconst isArrayOrElementsEmptyNullOrUndefined = ( value: any ) => {\n\treturn (\n\t\t! Array.isArray( value ) ||\n\t\tvalue.length === 0 ||\n\t\tvalue.every( ( element: any ) => isEmptyNullOrUndefined( element ) )\n\t);\n};\n\nfunction isInvalidForRequired( fieldType: string | undefined, value: any ) {\n\tif (\n\t\t( fieldType === undefined && isEmptyNullOrUndefined( value ) ) ||\n\t\t( fieldType === 'text' && isEmptyNullOrUndefined( value ) ) ||\n\t\t( fieldType === 'email' && isEmptyNullOrUndefined( value ) ) ||\n\t\t( fieldType === 'url' && isEmptyNullOrUndefined( value ) ) ||\n\t\t( fieldType === 'telephone' && isEmptyNullOrUndefined( value ) ) ||\n\t\t( fieldType === 'password' && isEmptyNullOrUndefined( value ) ) ||\n\t\t( fieldType === 'integer' && isEmptyNullOrUndefined( value ) ) ||\n\t\t( fieldType === 'number' && isEmptyNullOrUndefined( value ) ) ||\n\t\t( fieldType === 'array' &&\n\t\t\tisArrayOrElementsEmptyNullOrUndefined( value ) ) ||\n\t\t( fieldType === 'boolean' && value !== true )\n\t) {\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nfunction isFormValid( formValidity: FormValidity | undefined ): boolean {\n\tif ( ! formValidity ) {\n\t\treturn true;\n\t}\n\n\treturn Object.values( formValidity ).every( ( fieldValidation ) => {\n\t\treturn Object.entries( fieldValidation ).every(\n\t\t\t( [ key, validation ] ) => {\n\t\t\t\tif (\n\t\t\t\t\tkey === 'children' &&\n\t\t\t\t\tvalidation &&\n\t\t\t\t\ttypeof validation === 'object'\n\t\t\t\t) {\n\t\t\t\t\t// Recursively check children validations\n\t\t\t\t\treturn isFormValid( validation as FormValidity );\n\t\t\t\t}\n\t\t\t\treturn validation.type === 'valid';\n\t\t\t}\n\t\t);\n\t} );\n}\n\ntype FormFieldToValidate< Item > = {\n\tid: string;\n\tchildren: FormFieldToValidate< Item >[];\n\tfield?: NormalizedField< Item >;\n};\n\nfunction getFormFieldsToValidate< Item >(\n\tform: Form,\n\tfields: Field< Item >[]\n): FormFieldToValidate< Item >[] {\n\tconst normalizedForm = normalizeForm( form );\n\tif ( normalizedForm.fields.length === 0 ) {\n\t\treturn [];\n\t}\n\n\t// Create a map of field IDs to Field definitions for fast lookup\n\tconst fieldsMap = new Map< string, Field< Item > >();\n\tfields.forEach( ( field ) => {\n\t\tfieldsMap.set( field.id, field );\n\t} );\n\n\t// Recursive function to process form fields and their children\n\tfunction processFormField(\n\t\tformField: NormalizedFormField\n\t): FormFieldToValidate< Item > | null {\n\t\t// Handle combined fields (fields with children)\n\t\tif ( 'children' in formField && Array.isArray( formField.children ) ) {\n\t\t\tconst processedChildren = formField.children\n\t\t\t\t.map( processFormField )\n\t\t\t\t.filter( ( child ) => child !== null );\n\n\t\t\tif ( processedChildren.length === 0 ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst fieldDef = fieldsMap.get( formField.id );\n\t\t\tif ( fieldDef ) {\n\t\t\t\tconst [ normalizedField ] = normalizeFields< Item >( [\n\t\t\t\t\tfieldDef,\n\t\t\t\t] );\n\n\t\t\t\treturn {\n\t\t\t\t\tid: formField.id,\n\t\t\t\t\tchildren: processedChildren,\n\t\t\t\t\tfield: normalizedField,\n\t\t\t\t} satisfies FormFieldToValidate< Item >;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tid: formField.id,\n\t\t\t\tchildren: processedChildren,\n\t\t\t} satisfies FormFieldToValidate< Item >;\n\t\t}\n\n\t\t// Handle leaf fields (fields without children)\n\t\tconst fieldDef = fieldsMap.get( formField.id );\n\t\tif ( ! fieldDef ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst [ normalizedField ] = normalizeFields< Item >( [ fieldDef ] );\n\t\treturn {\n\t\t\tid: formField.id,\n\t\t\tchildren: [],\n\t\t\tfield: normalizedField,\n\t\t} as FormFieldToValidate< Item >;\n\t}\n\n\tconst toValidate = normalizedForm.fields\n\t\t.map( processFormField )\n\t\t.filter( ( field ) => field !== null );\n\n\treturn toValidate;\n}\n\nfunction setValidityAtPath(\n\tformValidity: FormValidity | undefined,\n\tfieldValidity: FieldValidity,\n\tpath: string[]\n): FormValidity {\n\t// Handle empty validity or empty path\n\tif ( ! formValidity ) {\n\t\tformValidity = {};\n\t}\n\n\tif ( path.length === 0 ) {\n\t\treturn formValidity;\n\t}\n\n\t// Clone the root to avoid mutations\n\tconst result = { ...formValidity };\n\n\t// Navigate through the result tree,\n\t// setting up empty paths if they don't exist.\n\tlet current: any = result;\n\tfor ( let i = 0; i < path.length - 1; i++ ) {\n\t\tconst segment = path[ i ];\n\t\tif ( ! current[ segment ] ) {\n\t\t\tcurrent[ segment ] = {};\n\t\t}\n\n\t\tcurrent = current[ segment ];\n\t}\n\n\t// At the final destination, merge the new validity with the existing.\n\tconst finalKey = path[ path.length - 1 ];\n\tcurrent[ finalKey ] = {\n\t\t...( current[ finalKey ] || {} ),\n\t\t...fieldValidity,\n\t};\n\n\treturn result;\n}\n\nfunction handleElementsValidationAsync< Item >(\n\tpromise: Promise< any >,\n\tformField: FormFieldToValidate< Item >,\n\tpromiseHandler: PromiseHandler< Item >\n) {\n\tconst { elementsCounterRef, setFormValidity, path, item } = promiseHandler;\n\tconst currentToken =\n\t\t( elementsCounterRef.current[ formField.id ] || 0 ) + 1;\n\telementsCounterRef.current[ formField.id ] = currentToken;\n\n\tpromise\n\t\t.then( ( result ) => {\n\t\t\tif ( currentToken !== elementsCounterRef.current[ formField.id ] ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( ! Array.isArray( result ) ) {\n\t\t\t\tsetFormValidity( ( prev ) => {\n\t\t\t\t\tconst newFormValidity = setValidityAtPath(\n\t\t\t\t\t\tprev,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\telements: {\n\t\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\t\tmessage: __( 'Could not validate elements.' ),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[ ...path, formField.id ]\n\t\t\t\t\t);\n\t\t\t\t\treturn newFormValidity;\n\t\t\t\t} );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst validValues = result.map( ( el ) => el.value );\n\t\t\tif (\n\t\t\t\t!! formField.field &&\n\t\t\t\tformField.field.type !== 'array' &&\n\t\t\t\t! validValues.includes( formField.field.getValue( { item } ) )\n\t\t\t) {\n\t\t\t\tsetFormValidity( ( prev ) => {\n\t\t\t\t\tconst newFormValidity = setValidityAtPath(\n\t\t\t\t\t\tprev,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\telements: {\n\t\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\t\tmessage: __(\n\t\t\t\t\t\t\t\t\t'Value must be one of the elements.'\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[ ...path, formField.id ]\n\t\t\t\t\t);\n\t\t\t\t\treturn newFormValidity;\n\t\t\t\t} );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t!! formField.field &&\n\t\t\t\tformField.field.type === 'array' &&\n\t\t\t\t! Array.isArray( formField.field.getValue( { item } ) )\n\t\t\t) {\n\t\t\t\tsetFormValidity( ( prev ) => {\n\t\t\t\t\tconst newFormValidity = setValidityAtPath(\n\t\t\t\t\t\tprev,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\telements: {\n\t\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\t\tmessage: __( 'Value must be an array.' ),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[ ...path, formField.id ]\n\t\t\t\t\t);\n\t\t\t\t\treturn newFormValidity;\n\t\t\t\t} );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t!! formField.field &&\n\t\t\t\tformField.field.type === 'array' &&\n\t\t\t\tformField.field\n\t\t\t\t\t.getValue( { item } )\n\t\t\t\t\t.some( ( v: any ) => ! validValues.includes( v ) )\n\t\t\t) {\n\t\t\t\tsetFormValidity( ( prev ) => {\n\t\t\t\t\tconst newFormValidity = setValidityAtPath(\n\t\t\t\t\t\tprev,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\telements: {\n\t\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\t\tmessage: __(\n\t\t\t\t\t\t\t\t\t'Value must be one of the elements.'\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[ ...path, formField.id ]\n\t\t\t\t\t);\n\t\t\t\t\treturn newFormValidity;\n\t\t\t\t} );\n\t\t\t}\n\t\t} )\n\t\t.catch( ( error ) => {\n\t\t\tif ( currentToken !== elementsCounterRef.current[ formField.id ] ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet errorMessage;\n\t\t\tif ( error instanceof Error ) {\n\t\t\t\terrorMessage = error.message;\n\t\t\t} else {\n\t\t\t\terrorMessage =\n\t\t\t\t\tString( error ) ||\n\t\t\t\t\t__(\n\t\t\t\t\t\t'Unknown error when running elements validation asynchronously.'\n\t\t\t\t\t);\n\t\t\t}\n\n\t\t\tsetFormValidity( ( prev ) => {\n\t\t\t\tconst newFormValidity = setValidityAtPath(\n\t\t\t\t\tprev,\n\t\t\t\t\t{\n\t\t\t\t\t\telements: {\n\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\tmessage: errorMessage,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t[ ...path, formField.id ]\n\t\t\t\t);\n\t\t\t\treturn newFormValidity;\n\t\t\t} );\n\t\t} );\n}\n\nfunction handleCustomValidationAsync< Item >(\n\tpromise: Promise< any >,\n\tformField: FormFieldToValidate< Item >,\n\tpromiseHandler: PromiseHandler< Item >\n) {\n\tconst { customCounterRef, setFormValidity, path } = promiseHandler;\n\tconst currentToken = ( customCounterRef.current[ formField.id ] || 0 ) + 1;\n\tcustomCounterRef.current[ formField.id ] = currentToken;\n\n\tpromise\n\t\t.then( ( result ) => {\n\t\t\tif ( currentToken !== customCounterRef.current[ formField.id ] ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( result === null ) {\n\t\t\t\tsetFormValidity( ( prev ) => {\n\t\t\t\t\tconst newFormValidity = setValidityAtPath(\n\t\t\t\t\t\tprev,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcustom: {\n\t\t\t\t\t\t\t\ttype: 'valid',\n\t\t\t\t\t\t\t\tmessage: __( 'Valid' ),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[ ...path, formField.id ]\n\t\t\t\t\t);\n\t\t\t\t\treturn newFormValidity;\n\t\t\t\t} );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( typeof result === 'string' ) {\n\t\t\t\tsetFormValidity( ( prev ) => {\n\t\t\t\t\tconst newFormValidity = setValidityAtPath(\n\t\t\t\t\t\tprev,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcustom: {\n\t\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\t\tmessage: result,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[ ...path, formField.id ]\n\t\t\t\t\t);\n\t\t\t\t\treturn newFormValidity;\n\t\t\t\t} );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetFormValidity( ( prev ) => {\n\t\t\t\tconst newFormValidity = setValidityAtPath(\n\t\t\t\t\tprev,\n\t\t\t\t\t{\n\t\t\t\t\t\tcustom: {\n\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\tmessage: __( 'Validation could not be processed.' ),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t[ ...path, formField.id ]\n\t\t\t\t);\n\t\t\t\treturn newFormValidity;\n\t\t\t} );\n\t\t} )\n\t\t.catch( ( error ) => {\n\t\t\tif ( currentToken !== customCounterRef.current[ formField.id ] ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet errorMessage;\n\t\t\tif ( error instanceof Error ) {\n\t\t\t\terrorMessage = error.message;\n\t\t\t} else {\n\t\t\t\terrorMessage =\n\t\t\t\t\tString( error ) ||\n\t\t\t\t\t__(\n\t\t\t\t\t\t'Unknown error when running custom validation asynchronously.'\n\t\t\t\t\t);\n\t\t\t}\n\n\t\t\tsetFormValidity( ( prev ) => {\n\t\t\t\tconst newFormValidity = setValidityAtPath(\n\t\t\t\t\tprev,\n\t\t\t\t\t{\n\t\t\t\t\t\tcustom: {\n\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\tmessage: errorMessage,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t[ ...path, formField.id ]\n\t\t\t\t);\n\t\t\t\treturn newFormValidity;\n\t\t\t} );\n\t\t} );\n}\n\ntype PromiseHandler< Item > = {\n\tcustomCounterRef: React.MutableRefObject< Record< string, number > >;\n\telementsCounterRef: React.MutableRefObject< Record< string, number > >;\n\tsetFormValidity: React.Dispatch< React.SetStateAction< FormValidity > >;\n\tpath: string[];\n\titem: Item;\n};\n\nfunction validateFormField< Item >(\n\titem: Item,\n\tformField: FormFieldToValidate< Item >,\n\tpromiseHandler: PromiseHandler< Item >\n): FieldValidity | undefined {\n\t// Validate the field: isValid.required\n\tif (\n\t\t!! formField.field &&\n\t\tformField.field.isValid.required &&\n\t\tisInvalidForRequired(\n\t\t\tformField.field.type,\n\t\t\tformField.field.getValue( { item } )\n\t\t)\n\t) {\n\t\treturn {\n\t\t\trequired: { type: 'invalid' },\n\t\t};\n\t}\n\n\t// Validate the field: isValid.pattern\n\tif (\n\t\t!! formField.field &&\n\t\tformField.field.isValid.pattern &&\n\t\t( formField.field.type === 'text' ||\n\t\t\tformField.field.type === 'email' ||\n\t\t\tformField.field.type === 'url' ||\n\t\t\tformField.field.type === 'telephone' ||\n\t\t\tformField.field.type === 'password' )\n\t) {\n\t\tconst value = formField.field.getValue( { item } );\n\t\t// Only validate pattern if the value is not empty\n\t\tif ( ! isEmptyNullOrUndefined( value ) ) {\n\t\t\ttry {\n\t\t\t\tconst regex = new RegExp( formField.field.isValid.pattern );\n\t\t\t\tif ( ! regex.test( String( value ) ) ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tpattern: {\n\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\tmessage: __(\n\t\t\t\t\t\t\t\t'Value does not match the required pattern.'\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t} catch ( error ) {\n\t\t\t\treturn {\n\t\t\t\t\tpattern: {\n\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\tmessage: __( 'Invalid pattern configuration.' ),\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\n\t// Validate the field: isValid.elements (static)\n\tif (\n\t\t!! formField.field &&\n\t\tformField.field.isValid.elements &&\n\t\tformField.field.hasElements &&\n\t\t! formField.field.getElements &&\n\t\tArray.isArray( formField.field.elements )\n\t) {\n\t\tconst value = formField.field.getValue( { item } );\n\t\tconst validValues = formField.field.elements.map( ( el ) => el.value );\n\n\t\tif (\n\t\t\tformField.field.type !== 'array' &&\n\t\t\t! validValues.includes( value )\n\t\t) {\n\t\t\treturn {\n\t\t\t\telements: {\n\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\tmessage: __( 'Value must be one of the elements.' ),\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tif ( formField.field.type === 'array' && ! Array.isArray( value ) ) {\n\t\t\treturn {\n\t\t\t\telements: {\n\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\tmessage: __( 'Value must be an array.' ),\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tif (\n\t\t\tformField.field.type === 'array' &&\n\t\t\tvalue.some( ( v: any ) => ! validValues.includes( v ) )\n\t\t) {\n\t\t\treturn {\n\t\t\t\telements: {\n\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\tmessage: __( 'Value must be one of the elements.' ),\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t}\n\n\t// Validate the field: isValid.elements (async)\n\tif (\n\t\t!! formField.field &&\n\t\tformField.field.isValid.elements &&\n\t\tformField.field.hasElements &&\n\t\ttypeof formField.field.getElements === 'function'\n\t) {\n\t\thandleElementsValidationAsync(\n\t\t\tformField.field.getElements(),\n\t\t\tformField,\n\t\t\tpromiseHandler\n\t\t);\n\n\t\treturn {\n\t\t\telements: {\n\t\t\t\ttype: 'validating',\n\t\t\t\tmessage: __( 'Validating\u2026' ),\n\t\t\t},\n\t\t};\n\t}\n\n\t// Validate the field: isValid.custom (sync)\n\tlet customError;\n\tif ( !! formField.field ) {\n\t\ttry {\n\t\t\tconst value = formField.field.getValue( { item } );\n\t\t\tcustomError = formField.field.isValid?.custom?.(\n\t\t\t\tdeepMerge(\n\t\t\t\t\titem,\n\t\t\t\t\tformField.field.setValue( {\n\t\t\t\t\t\titem,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t} ) as Partial< Item >\n\t\t\t\t),\n\t\t\t\tformField.field\n\t\t\t);\n\t\t} catch ( error ) {\n\t\t\tlet errorMessage;\n\t\t\tif ( error instanceof Error ) {\n\t\t\t\terrorMessage = error.message;\n\t\t\t} else {\n\t\t\t\terrorMessage =\n\t\t\t\t\tString( error ) ||\n\t\t\t\t\t__( 'Unknown error when running custom validation.' );\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tcustom: {\n\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\tmessage: errorMessage,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t}\n\n\tif ( typeof customError === 'string' ) {\n\t\treturn {\n\t\t\tcustom: {\n\t\t\t\ttype: 'invalid',\n\t\t\t\tmessage: customError,\n\t\t\t},\n\t\t};\n\t}\n\n\t// Validate the field: isValid.custom (async)\n\tif ( customError instanceof Promise ) {\n\t\thandleCustomValidationAsync( customError, formField, promiseHandler );\n\n\t\treturn {\n\t\t\tcustom: {\n\t\t\t\ttype: 'validating',\n\t\t\t\tmessage: __( 'Validating\u2026' ),\n\t\t\t},\n\t\t};\n\t}\n\n\t// Validate its children.\n\tif ( formField.children.length > 0 ) {\n\t\tconst result: Record< string, FieldValidity | undefined > = {};\n\t\tformField.children.forEach( ( child ) => {\n\t\t\tresult[ child.id ] = validateFormField( item, child, {\n\t\t\t\t...promiseHandler,\n\t\t\t\tpath: [ ...promiseHandler.path, formField.id, 'children' ],\n\t\t\t} );\n\t\t} );\n\n\t\tconst filteredResult: Record< string, FieldValidity > = {};\n\t\tObject.entries( result ).forEach( ( [ key, value ] ) => {\n\t\t\tif ( value !== undefined ) {\n\t\t\t\tfilteredResult[ key ] = value;\n\t\t\t}\n\t\t} );\n\n\t\tif ( Object.keys( filteredResult ).length === 0 ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn {\n\t\t\tchildren: filteredResult,\n\t\t};\n\t}\n\n\t// No errors for this field or its children.\n\treturn undefined;\n}\n\nfunction getFormFieldValue< Item >(\n\tformField: FormFieldToValidate< Item >,\n\titem: Item\n): any {\n\tconst fieldValue = formField?.field?.getValue( { item } );\n\tif ( formField.children.length === 0 ) {\n\t\treturn fieldValue;\n\t}\n\n\tconst childrenValues = formField.children.map( ( child ) =>\n\t\tgetFormFieldValue( child, item )\n\t);\n\tif ( ! childrenValues ) {\n\t\treturn fieldValue;\n\t}\n\n\treturn {\n\t\tvalue: fieldValue,\n\t\tchildren: childrenValues,\n\t};\n}\n\n/**\n * Hook that validates a form item and returns an object with error messages for each field.\n *\n * @param item The item to validate.\n * @param fields Fields config.\n * @param form Form config.\n *\n * @return Record of field IDs to error messages (undefined means no error).\n */\nexport function useFormValidity< Item >(\n\titem: Item,\n\tfields: Field< Item >[],\n\tform: Form\n): { validity: FormValidity; isValid: boolean } {\n\tconst [ formValidity, setFormValidity ] = useState< FormValidity >();\n\tconst customCounterRef = useRef< Record< string, number > >( {} );\n\tconst elementsCounterRef = useRef< Record< string, number > >( {} );\n\tconst previousValuesRef = useRef< Record< string, any > >( {} );\n\n\tconst validate = useCallback( () => {\n\t\tconst promiseHandler = {\n\t\t\tcustomCounterRef,\n\t\t\telementsCounterRef,\n\t\t\tsetFormValidity,\n\t\t\tpath: [],\n\t\t\titem,\n\t\t};\n\n\t\tconst formFieldsToValidate = getFormFieldsToValidate( form, fields );\n\t\tif ( formFieldsToValidate.length === 0 ) {\n\t\t\tsetFormValidity( undefined );\n\t\t\treturn;\n\t\t}\n\n\t\tconst newFormValidity: FormValidity = {};\n\t\tconst untouchedFields: string[] = [];\n\t\tformFieldsToValidate.forEach( ( formField ) => {\n\t\t\t// Skip fields that did not change.\n\t\t\tconst value = getFormFieldValue< Item >( formField, item );\n\t\t\tif (\n\t\t\t\tpreviousValuesRef.current.hasOwnProperty( formField.id ) &&\n\t\t\t\tfastDeepEqual(\n\t\t\t\t\tpreviousValuesRef.current[ formField.id ],\n\t\t\t\t\tvalue\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tuntouchedFields.push( formField.id );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpreviousValuesRef.current[ formField.id ] = value;\n\n\t\t\t// Calculate validity for those fields that changed.\n\t\t\tconst fieldValidity = validateFormField(\n\t\t\t\titem,\n\t\t\t\tformField,\n\t\t\t\tpromiseHandler\n\t\t\t);\n\t\t\tif ( fieldValidity !== undefined ) {\n\t\t\t\tnewFormValidity[ formField.id ] = fieldValidity;\n\t\t\t}\n\t\t} );\n\n\t\tsetFormValidity( ( existingFormValidity ) => {\n\t\t\tlet validity: FormValidity = {\n\t\t\t\t...existingFormValidity,\n\t\t\t\t...newFormValidity,\n\t\t\t};\n\n\t\t\tconst fieldsToKeep = [\n\t\t\t\t...untouchedFields,\n\t\t\t\t...Object.keys( newFormValidity ),\n\t\t\t];\n\t\t\tObject.keys( validity ).forEach( ( key ) => {\n\t\t\t\tif ( validity && ! fieldsToKeep.includes( key ) ) {\n\t\t\t\t\tdelete validity[ key ];\n\t\t\t\t}\n\t\t\t} );\n\t\t\tif ( Object.keys( validity ).length === 0 ) {\n\t\t\t\tvalidity = undefined;\n\t\t\t}\n\n\t\t\tconst areEqual = fastDeepEqual( existingFormValidity, validity );\n\t\t\tif ( areEqual ) {\n\t\t\t\treturn existingFormValidity;\n\t\t\t}\n\n\t\t\treturn validity;\n\t\t} );\n\t}, [ item, fields, form ] );\n\n\tuseEffect( () => {\n\t\tvalidate();\n\t}, [ validate ] );\n\n\treturn {\n\t\tvalidity: formValidity,\n\t\tisValid: isFormValid( formValidity ),\n\t};\n}\n\nexport default useFormValidity;\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/**\n * External dependencies\n */\nimport deepMerge from 'deepmerge';\nimport fastDeepEqual from 'fast-deep-equal/es6';\n\n/**\n * WordPress dependencies\n */\nimport { useCallback, useEffect, useRef, useState } from '@wordpress/element';\nimport { __ } from '@wordpress/i18n';\n\n/**\n * Internal dependencies\n */\nimport normalizeFields from '../field-types';\nimport normalizeForm from '../dataform-layouts/normalize-form';\nimport type {\n\tField,\n\tFieldValidity,\n\tForm,\n\tFormValidity,\n\tNormalizedField,\n\tNormalizedFormField,\n} from '../types';\n\nfunction isFormValid( formValidity: FormValidity | undefined ): boolean {\n\tif ( ! formValidity ) {\n\t\treturn true;\n\t}\n\n\treturn Object.values( formValidity ).every( ( fieldValidation ) => {\n\t\treturn Object.entries( fieldValidation ).every(\n\t\t\t( [ key, validation ] ) => {\n\t\t\t\tif (\n\t\t\t\t\tkey === 'children' &&\n\t\t\t\t\tvalidation &&\n\t\t\t\t\ttypeof validation === 'object'\n\t\t\t\t) {\n\t\t\t\t\t// Recursively check children validations\n\t\t\t\t\treturn isFormValid( validation as FormValidity );\n\t\t\t\t}\n\t\t\t\treturn validation.type === 'valid';\n\t\t\t}\n\t\t);\n\t} );\n}\n\ntype FormFieldToValidate< Item > = {\n\tid: string;\n\tchildren: FormFieldToValidate< Item >[];\n\tfield?: NormalizedField< Item >;\n};\n\nfunction getFormFieldsToValidate< Item >(\n\tform: Form,\n\tfields: Field< Item >[]\n): FormFieldToValidate< Item >[] {\n\tconst normalizedForm = normalizeForm( form );\n\tif ( normalizedForm.fields.length === 0 ) {\n\t\treturn [];\n\t}\n\n\t// Create a map of field IDs to Field definitions for fast lookup\n\tconst fieldsMap = new Map< string, Field< Item > >();\n\tfields.forEach( ( field ) => {\n\t\tfieldsMap.set( field.id, field );\n\t} );\n\n\t// Recursive function to process form fields and their children\n\tfunction processFormField(\n\t\tformField: NormalizedFormField\n\t): FormFieldToValidate< Item > | null {\n\t\t// Handle combined fields (fields with children)\n\t\tif ( 'children' in formField && Array.isArray( formField.children ) ) {\n\t\t\tconst processedChildren = formField.children\n\t\t\t\t.map( processFormField )\n\t\t\t\t.filter( ( child ) => child !== null );\n\n\t\t\tif ( processedChildren.length === 0 ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst fieldDef = fieldsMap.get( formField.id );\n\t\t\tif ( fieldDef ) {\n\t\t\t\tconst [ normalizedField ] = normalizeFields< Item >( [\n\t\t\t\t\tfieldDef,\n\t\t\t\t] );\n\n\t\t\t\treturn {\n\t\t\t\t\tid: formField.id,\n\t\t\t\t\tchildren: processedChildren,\n\t\t\t\t\tfield: normalizedField,\n\t\t\t\t} satisfies FormFieldToValidate< Item >;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tid: formField.id,\n\t\t\t\tchildren: processedChildren,\n\t\t\t} satisfies FormFieldToValidate< Item >;\n\t\t}\n\n\t\t// Handle leaf fields (fields without children)\n\t\tconst fieldDef = fieldsMap.get( formField.id );\n\t\tif ( ! fieldDef ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst [ normalizedField ] = normalizeFields< Item >( [ fieldDef ] );\n\t\treturn {\n\t\t\tid: formField.id,\n\t\t\tchildren: [],\n\t\t\tfield: normalizedField,\n\t\t} as FormFieldToValidate< Item >;\n\t}\n\n\tconst toValidate = normalizedForm.fields\n\t\t.map( processFormField )\n\t\t.filter( ( field ) => field !== null );\n\n\treturn toValidate;\n}\n\nfunction setValidityAtPath(\n\tformValidity: FormValidity | undefined,\n\tfieldValidity: FieldValidity,\n\tpath: string[]\n): FormValidity {\n\t// Handle empty validity or empty path\n\tif ( ! formValidity ) {\n\t\tformValidity = {};\n\t}\n\n\tif ( path.length === 0 ) {\n\t\treturn formValidity;\n\t}\n\n\t// Clone the root to avoid mutations\n\tconst result = { ...formValidity };\n\n\t// Navigate through the result tree,\n\t// setting up empty paths if they don't exist.\n\tlet current: any = result;\n\tfor ( let i = 0; i < path.length - 1; i++ ) {\n\t\tconst segment = path[ i ];\n\t\tif ( ! current[ segment ] ) {\n\t\t\tcurrent[ segment ] = {};\n\t\t}\n\n\t\tcurrent = current[ segment ];\n\t}\n\n\t// At the final destination, merge the new validity with the existing.\n\tconst finalKey = path[ path.length - 1 ];\n\tcurrent[ finalKey ] = {\n\t\t...( current[ finalKey ] || {} ),\n\t\t...fieldValidity,\n\t};\n\n\treturn result;\n}\n\nfunction handleElementsValidationAsync< Item >(\n\tpromise: Promise< any >,\n\tformField: FormFieldToValidate< Item >,\n\tpromiseHandler: PromiseHandler< Item >\n) {\n\tconst { elementsCounterRef, setFormValidity, path, item } = promiseHandler;\n\tconst currentToken =\n\t\t( elementsCounterRef.current[ formField.id ] || 0 ) + 1;\n\telementsCounterRef.current[ formField.id ] = currentToken;\n\n\tpromise\n\t\t.then( ( result ) => {\n\t\t\tif ( currentToken !== elementsCounterRef.current[ formField.id ] ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( ! Array.isArray( result ) ) {\n\t\t\t\tsetFormValidity( ( prev ) => {\n\t\t\t\t\tconst newFormValidity = setValidityAtPath(\n\t\t\t\t\t\tprev,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\telements: {\n\t\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\t\tmessage: __( 'Could not validate elements.' ),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[ ...path, formField.id ]\n\t\t\t\t\t);\n\t\t\t\t\treturn newFormValidity;\n\t\t\t\t} );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tformField.field?.isValid.elements &&\n\t\t\t\t! formField.field.isValid.elements.validate( item, {\n\t\t\t\t\t...formField.field,\n\t\t\t\t\telements: result,\n\t\t\t\t} )\n\t\t\t) {\n\t\t\t\tsetFormValidity( ( prev ) => {\n\t\t\t\t\tconst newFormValidity = setValidityAtPath(\n\t\t\t\t\t\tprev,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\telements: {\n\t\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\t\tmessage: __(\n\t\t\t\t\t\t\t\t\t'Value must be one of the elements.'\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[ ...path, formField.id ]\n\t\t\t\t\t);\n\t\t\t\t\treturn newFormValidity;\n\t\t\t\t} );\n\t\t\t}\n\t\t} )\n\t\t.catch( ( error ) => {\n\t\t\tif ( currentToken !== elementsCounterRef.current[ formField.id ] ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet errorMessage;\n\t\t\tif ( error instanceof Error ) {\n\t\t\t\terrorMessage = error.message;\n\t\t\t} else {\n\t\t\t\terrorMessage =\n\t\t\t\t\tString( error ) ||\n\t\t\t\t\t__(\n\t\t\t\t\t\t'Unknown error when running elements validation asynchronously.'\n\t\t\t\t\t);\n\t\t\t}\n\n\t\t\tsetFormValidity( ( prev ) => {\n\t\t\t\tconst newFormValidity = setValidityAtPath(\n\t\t\t\t\tprev,\n\t\t\t\t\t{\n\t\t\t\t\t\telements: {\n\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\tmessage: errorMessage,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t[ ...path, formField.id ]\n\t\t\t\t);\n\t\t\t\treturn newFormValidity;\n\t\t\t} );\n\t\t} );\n}\n\nfunction handleCustomValidationAsync< Item >(\n\tpromise: Promise< any >,\n\tformField: FormFieldToValidate< Item >,\n\tpromiseHandler: PromiseHandler< Item >\n) {\n\tconst { customCounterRef, setFormValidity, path } = promiseHandler;\n\tconst currentToken = ( customCounterRef.current[ formField.id ] || 0 ) + 1;\n\tcustomCounterRef.current[ formField.id ] = currentToken;\n\n\tpromise\n\t\t.then( ( result ) => {\n\t\t\tif ( currentToken !== customCounterRef.current[ formField.id ] ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( result === null ) {\n\t\t\t\tsetFormValidity( ( prev ) => {\n\t\t\t\t\tconst newFormValidity = setValidityAtPath(\n\t\t\t\t\t\tprev,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcustom: {\n\t\t\t\t\t\t\t\ttype: 'valid',\n\t\t\t\t\t\t\t\tmessage: __( 'Valid' ),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[ ...path, formField.id ]\n\t\t\t\t\t);\n\t\t\t\t\treturn newFormValidity;\n\t\t\t\t} );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( typeof result === 'string' ) {\n\t\t\t\tsetFormValidity( ( prev ) => {\n\t\t\t\t\tconst newFormValidity = setValidityAtPath(\n\t\t\t\t\t\tprev,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcustom: {\n\t\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\t\tmessage: result,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[ ...path, formField.id ]\n\t\t\t\t\t);\n\t\t\t\t\treturn newFormValidity;\n\t\t\t\t} );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetFormValidity( ( prev ) => {\n\t\t\t\tconst newFormValidity = setValidityAtPath(\n\t\t\t\t\tprev,\n\t\t\t\t\t{\n\t\t\t\t\t\tcustom: {\n\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\tmessage: __( 'Validation could not be processed.' ),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t[ ...path, formField.id ]\n\t\t\t\t);\n\t\t\t\treturn newFormValidity;\n\t\t\t} );\n\t\t} )\n\t\t.catch( ( error ) => {\n\t\t\tif ( currentToken !== customCounterRef.current[ formField.id ] ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet errorMessage;\n\t\t\tif ( error instanceof Error ) {\n\t\t\t\terrorMessage = error.message;\n\t\t\t} else {\n\t\t\t\terrorMessage =\n\t\t\t\t\tString( error ) ||\n\t\t\t\t\t__(\n\t\t\t\t\t\t'Unknown error when running custom validation asynchronously.'\n\t\t\t\t\t);\n\t\t\t}\n\n\t\t\tsetFormValidity( ( prev ) => {\n\t\t\t\tconst newFormValidity = setValidityAtPath(\n\t\t\t\t\tprev,\n\t\t\t\t\t{\n\t\t\t\t\t\tcustom: {\n\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\tmessage: errorMessage,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t[ ...path, formField.id ]\n\t\t\t\t);\n\t\t\t\treturn newFormValidity;\n\t\t\t} );\n\t\t} );\n}\n\ntype PromiseHandler< Item > = {\n\tcustomCounterRef: React.MutableRefObject< Record< string, number > >;\n\telementsCounterRef: React.MutableRefObject< Record< string, number > >;\n\tsetFormValidity: React.Dispatch< React.SetStateAction< FormValidity > >;\n\tpath: string[];\n\titem: Item;\n};\n\nfunction validateFormField< Item >(\n\titem: Item,\n\tformField: FormFieldToValidate< Item >,\n\tpromiseHandler: PromiseHandler< Item >\n): FieldValidity | undefined {\n\t// Validate the field: isValid.required\n\tif (\n\t\tformField.field?.isValid.required &&\n\t\t! formField.field.isValid.required.validate( item, formField.field )\n\t) {\n\t\treturn {\n\t\t\trequired: { type: 'invalid' },\n\t\t};\n\t}\n\n\t// Validate the field: isValid.pattern\n\tif (\n\t\tformField.field?.isValid.pattern &&\n\t\t! formField.field.isValid.pattern.validate( item, formField.field )\n\t) {\n\t\treturn {\n\t\t\tpattern: {\n\t\t\t\ttype: 'invalid',\n\t\t\t\tmessage: __( 'Value does not match the required pattern.' ),\n\t\t\t},\n\t\t};\n\t}\n\n\t// Validate the field: isValid.min\n\tif (\n\t\tformField.field?.isValid.min &&\n\t\t! formField.field.isValid.min.validate( item, formField.field )\n\t) {\n\t\treturn {\n\t\t\tmin: {\n\t\t\t\ttype: 'invalid',\n\t\t\t\tmessage: __( 'Value is below the minimum.' ),\n\t\t\t},\n\t\t};\n\t}\n\n\t// Validate the field: isValid.max\n\tif (\n\t\tformField.field?.isValid.max &&\n\t\t! formField.field.isValid.max.validate( item, formField.field )\n\t) {\n\t\treturn {\n\t\t\tmax: {\n\t\t\t\ttype: 'invalid',\n\t\t\t\tmessage: __( 'Value is above the maximum.' ),\n\t\t\t},\n\t\t};\n\t}\n\n\t// Validate the field: isValid.minLength\n\tif (\n\t\tformField.field?.isValid.minLength &&\n\t\t! formField.field.isValid.minLength.validate( item, formField.field )\n\t) {\n\t\treturn {\n\t\t\tminLength: {\n\t\t\t\ttype: 'invalid',\n\t\t\t\tmessage: __( 'Value is too short.' ),\n\t\t\t},\n\t\t};\n\t}\n\n\t// Validate the field: isValid.maxLength\n\tif (\n\t\tformField.field?.isValid.maxLength &&\n\t\t! formField.field.isValid.maxLength.validate( item, formField.field )\n\t) {\n\t\treturn {\n\t\t\tmaxLength: {\n\t\t\t\ttype: 'invalid',\n\t\t\t\tmessage: __( 'Value is too long.' ),\n\t\t\t},\n\t\t};\n\t}\n\n\t// Validate the field: isValid.elements (static)\n\tif (\n\t\tformField.field?.isValid.elements &&\n\t\tformField.field.hasElements &&\n\t\t! formField.field.getElements &&\n\t\tArray.isArray( formField.field.elements ) &&\n\t\t! formField.field.isValid.elements.validate( item, formField.field )\n\t) {\n\t\treturn {\n\t\t\telements: {\n\t\t\t\ttype: 'invalid',\n\t\t\t\tmessage: __( 'Value must be one of the elements.' ),\n\t\t\t},\n\t\t};\n\t}\n\n\t// Validate the field: isValid.elements (async)\n\tif (\n\t\t!! formField.field &&\n\t\tformField.field.isValid.elements &&\n\t\tformField.field.hasElements &&\n\t\ttypeof formField.field.getElements === 'function'\n\t) {\n\t\thandleElementsValidationAsync(\n\t\t\tformField.field.getElements(),\n\t\t\tformField,\n\t\t\tpromiseHandler\n\t\t);\n\n\t\treturn {\n\t\t\telements: {\n\t\t\t\ttype: 'validating',\n\t\t\t\tmessage: __( 'Validating\u2026' ),\n\t\t\t},\n\t\t};\n\t}\n\n\t// Validate the field: isValid.custom (sync)\n\tlet customError;\n\tif ( !! formField.field && formField.field.isValid.custom ) {\n\t\ttry {\n\t\t\tconst value = formField.field.getValue( { item } );\n\t\t\tcustomError = formField.field.isValid.custom(\n\t\t\t\tdeepMerge(\n\t\t\t\t\titem,\n\t\t\t\t\tformField.field.setValue( {\n\t\t\t\t\t\titem,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t} ) as Partial< Item >\n\t\t\t\t),\n\t\t\t\tformField.field\n\t\t\t);\n\t\t} catch ( error ) {\n\t\t\tlet errorMessage;\n\t\t\tif ( error instanceof Error ) {\n\t\t\t\terrorMessage = error.message;\n\t\t\t} else {\n\t\t\t\terrorMessage =\n\t\t\t\t\tString( error ) ||\n\t\t\t\t\t__( 'Unknown error when running custom validation.' );\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tcustom: {\n\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\tmessage: errorMessage,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t}\n\n\tif ( typeof customError === 'string' ) {\n\t\treturn {\n\t\t\tcustom: {\n\t\t\t\ttype: 'invalid',\n\t\t\t\tmessage: customError,\n\t\t\t},\n\t\t};\n\t}\n\n\t// Validate the field: isValid.custom (async)\n\tif ( customError instanceof Promise ) {\n\t\thandleCustomValidationAsync( customError, formField, promiseHandler );\n\n\t\treturn {\n\t\t\tcustom: {\n\t\t\t\ttype: 'validating',\n\t\t\t\tmessage: __( 'Validating\u2026' ),\n\t\t\t},\n\t\t};\n\t}\n\n\t// Validate its children.\n\tif ( formField.children.length > 0 ) {\n\t\tconst result: Record< string, FieldValidity | undefined > = {};\n\t\tformField.children.forEach( ( child ) => {\n\t\t\tresult[ child.id ] = validateFormField( item, child, {\n\t\t\t\t...promiseHandler,\n\t\t\t\tpath: [ ...promiseHandler.path, formField.id, 'children' ],\n\t\t\t} );\n\t\t} );\n\n\t\tconst filteredResult: Record< string, FieldValidity > = {};\n\t\tObject.entries( result ).forEach( ( [ key, value ] ) => {\n\t\t\tif ( value !== undefined ) {\n\t\t\t\tfilteredResult[ key ] = value;\n\t\t\t}\n\t\t} );\n\n\t\tif ( Object.keys( filteredResult ).length === 0 ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn {\n\t\t\tchildren: filteredResult,\n\t\t};\n\t}\n\n\t// No errors for this field or its children.\n\treturn undefined;\n}\n\nfunction getFormFieldValue< Item >(\n\tformField: FormFieldToValidate< Item >,\n\titem: Item\n): any {\n\tconst fieldValue = formField?.field?.getValue( { item } );\n\tif ( formField.children.length === 0 ) {\n\t\treturn fieldValue;\n\t}\n\n\tconst childrenValues = formField.children.map( ( child ) =>\n\t\tgetFormFieldValue( child, item )\n\t);\n\tif ( ! childrenValues ) {\n\t\treturn fieldValue;\n\t}\n\n\treturn {\n\t\tvalue: fieldValue,\n\t\tchildren: childrenValues,\n\t};\n}\n\n/**\n * Hook that validates a form item and returns an object with error messages for each field.\n *\n * @param item The item to validate.\n * @param fields Fields config.\n * @param form Form config.\n *\n * @return Record of field IDs to error messages (undefined means no error).\n */\nexport function useFormValidity< Item >(\n\titem: Item,\n\tfields: Field< Item >[],\n\tform: Form\n): { validity: FormValidity; isValid: boolean } {\n\tconst [ formValidity, setFormValidity ] = useState< FormValidity >();\n\tconst customCounterRef = useRef< Record< string, number > >( {} );\n\tconst elementsCounterRef = useRef< Record< string, number > >( {} );\n\tconst previousValuesRef = useRef< Record< string, any > >( {} );\n\n\tconst validate = useCallback( () => {\n\t\tconst promiseHandler = {\n\t\t\tcustomCounterRef,\n\t\t\telementsCounterRef,\n\t\t\tsetFormValidity,\n\t\t\tpath: [],\n\t\t\titem,\n\t\t};\n\n\t\tconst formFieldsToValidate = getFormFieldsToValidate( form, fields );\n\t\tif ( formFieldsToValidate.length === 0 ) {\n\t\t\tsetFormValidity( undefined );\n\t\t\treturn;\n\t\t}\n\n\t\tconst newFormValidity: FormValidity = {};\n\t\tconst untouchedFields: string[] = [];\n\t\tformFieldsToValidate.forEach( ( formField ) => {\n\t\t\t// Skip fields that did not change.\n\t\t\tconst value = getFormFieldValue< Item >( formField, item );\n\t\t\tif (\n\t\t\t\tpreviousValuesRef.current.hasOwnProperty( formField.id ) &&\n\t\t\t\tfastDeepEqual(\n\t\t\t\t\tpreviousValuesRef.current[ formField.id ],\n\t\t\t\t\tvalue\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tuntouchedFields.push( formField.id );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpreviousValuesRef.current[ formField.id ] = value;\n\n\t\t\t// Calculate validity for those fields that changed.\n\t\t\tconst fieldValidity = validateFormField(\n\t\t\t\titem,\n\t\t\t\tformField,\n\t\t\t\tpromiseHandler\n\t\t\t);\n\t\t\tif ( fieldValidity !== undefined ) {\n\t\t\t\tnewFormValidity[ formField.id ] = fieldValidity;\n\t\t\t}\n\t\t} );\n\n\t\tsetFormValidity( ( existingFormValidity ) => {\n\t\t\tlet validity: FormValidity = {\n\t\t\t\t...existingFormValidity,\n\t\t\t\t...newFormValidity,\n\t\t\t};\n\n\t\t\tconst fieldsToKeep = [\n\t\t\t\t...untouchedFields,\n\t\t\t\t...Object.keys( newFormValidity ),\n\t\t\t];\n\t\t\tObject.keys( validity ).forEach( ( key ) => {\n\t\t\t\tif ( validity && ! fieldsToKeep.includes( key ) ) {\n\t\t\t\t\tdelete validity[ key ];\n\t\t\t\t}\n\t\t\t} );\n\t\t\tif ( Object.keys( validity ).length === 0 ) {\n\t\t\t\tvalidity = undefined;\n\t\t\t}\n\n\t\t\tconst areEqual = fastDeepEqual( existingFormValidity, validity );\n\t\t\tif ( areEqual ) {\n\t\t\t\treturn existingFormValidity;\n\t\t\t}\n\n\t\t\treturn validity;\n\t\t} );\n\t}, [ item, fields, form ] );\n\n\tuseEffect( () => {\n\t\tvalidate();\n\t}, [ validate ] );\n\n\treturn {\n\t\tvalidity: formValidity,\n\t\tisValid: isFormValid( formValidity ),\n\t};\n}\n\nexport default useFormValidity;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["normalizeForm", "fieldDef", "normalizedField", "normalizeFields", "deepMerge", "fastDeepEqual"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/types/field-api.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * External dependencies\n */\nimport type { ReactElement, ComponentType } from 'react';\n\n/**\n * Utility type that makes all properties of T optional recursively.\n * Used by field setValue functions to allow partial item updates.\n */\nexport type DeepPartial< T > = {\n\t[ P in keyof T ]?: T[ P ] extends object ? DeepPartial< T[ P ] > : T[ P ];\n};\n\nexport type SortDirection = 'asc' | 'desc';\n\n/**\n * Generic option type.\n */\nexport interface Option< Value extends any = any > {\n\tvalue: Value;\n\tlabel: string;\n\tdescription?: string;\n}\n\nexport interface FilterByConfig {\n\t/**\n\t * The list of operators supported by the field.\n\t */\n\toperators?: Operator[];\n\n\t/**\n\t * Whether it is a primary filter.\n\t *\n\t * A primary filter is always visible and is not listed in the \"Add filter\" component,\n\t * except for the list layout where it behaves like a secondary filter.\n\t */\n\tisPrimary?: boolean;\n}\n\nexport type Operator =\n\t| 'is'\n\t| 'isNot'\n\t| 'isAny'\n\t| 'isNone'\n\t| 'isAll'\n\t| 'isNotAll'\n\t| 'lessThan'\n\t| 'greaterThan'\n\t| 'lessThanOrEqual'\n\t| 'greaterThanOrEqual'\n\t| 'before'\n\t| 'after'\n\t| 'beforeInc'\n\t| 'afterInc'\n\t| 'contains'\n\t| 'notContains'\n\t| 'startsWith'\n\t| 'between'\n\t| 'on'\n\t| 'notOn'\n\t| 'inThePast'\n\t| 'over';\n\nexport type FieldTypeName =\n\t| 'text'\n\t| 'integer'\n\t| 'number'\n\t| 'datetime'\n\t| 'date'\n\t| 'media'\n\t| 'boolean'\n\t| 'email'\n\t| 'password'\n\t| 'telephone'\n\t| 'color'\n\t| 'url'\n\t| 'array';\n\nexport type Rules< Item > = {\n\trequired?: boolean;\n\telements?: boolean;\n\tpattern?: string;\n\tcustom?:\n\t\t| ( ( item: Item, field: NormalizedField< Item > ) => null | string )\n\t\t| ( (\n\t\t\t\titem: Item,\n\t\t\t\tfield: NormalizedField< Item >\n\t\t ) => Promise< null | string > );\n};\n\n/**\n * Edit configuration for textarea controls.\n */\nexport type EditConfigTextarea = {\n\tcontrol: 'textarea';\n\t/**\n\t * Number of rows for the textarea.\n\t */\n\trows?: number;\n};\n\n/**\n * Edit configuration for text controls.\n */\nexport type EditConfigText = {\n\tcontrol: 'text';\n\t/**\n\t * Prefix component to display before the input.\n\t */\n\tprefix?: React.ComponentType;\n\t/**\n\t * Suffix component to display after the input.\n\t */\n\tsuffix?: React.ComponentType;\n};\n\n/**\n * Edit configuration for other control types (excluding 'text' and 'textarea').\n */\nexport type EditConfigGeneric = {\n\tcontrol: Exclude< FieldTypeName, 'text' | 'textarea' >;\n};\n\n/**\n * Edit configuration object with type-safe control options.\n * Each control type has its own specific configuration properties.\n */\nexport type EditConfig =\n\t| EditConfigTextarea\n\t| EditConfigText\n\t| EditConfigGeneric;\n\n/**\n * A dataview field for a specific property of a data type.\n */\nexport type Field< Item > = {\n\t/**\n\t * Type of the fields.\n\t */\n\ttype?: FieldTypeName;\n\n\t/**\n\t * The unique identifier of the field.\n\t */\n\tid: string;\n\n\t/**\n\t * The label of the field. Defaults to the id.\n\t */\n\tlabel?: string;\n\n\t/**\n\t * The header of the field. Defaults to the label.\n\t * It allows the usage of a React Element to render the field labels.\n\t */\n\theader?: string | ReactElement;\n\n\t/**\n\t * A description of the field.\n\t */\n\tdescription?: string;\n\n\t/**\n\t * Placeholder for the field.\n\t */\n\tplaceholder?: string;\n\n\t/**\n\t * Callback used to render the field. Defaults to `field.getValue`.\n\t */\n\trender?: ComponentType< DataViewRenderFieldProps< Item > >;\n\n\t/**\n\t * Callback used to render an edit control for the field.\n\t */\n\tEdit?: ComponentType< DataFormControlProps< Item > > | string | EditConfig;\n\n\t/**\n\t * Callback used to sort the field.\n\t */\n\tsort?: ( a: Item, b: Item, direction: SortDirection ) => number;\n\n\t/**\n\t * Callback used to validate the field.\n\t */\n\tisValid?: Rules< Item >;\n\n\t/**\n\t * Callback used to decide if a field should be displayed.\n\t */\n\tisVisible?: ( item: Item ) => boolean;\n\n\t/**\n\t * Whether the field is sortable.\n\t */\n\tenableSorting?: boolean;\n\n\t/**\n\t * Whether the field is searchable.\n\t */\n\tenableGlobalSearch?: boolean;\n\n\t/**\n\t * Whether the field can be hidden in the UI.\n\t */\n\tenableHiding?: boolean;\n\n\t/**\n\t * The list of options to pick from when using the field as a filter.\n\t */\n\telements?: Option[];\n\n\t/**\n\t * Retrieval function for elements.\n\t */\n\tgetElements?: () => Promise< Option[] >;\n\n\t/**\n\t * Filter config for the field.\n\t */\n\tfilterBy?: FilterByConfig | false;\n\n\t/**\n\t * Whether the field is readOnly.\n\t * If `true`, the value will be rendered using the `render` callback.\n\t */\n\treadOnly?: boolean;\n\n\t/**\n\t * Callback used to retrieve the value of the field from the item.\n\t * Defaults to `item[ field.id ]`.\n\t */\n\tgetValue?: ( args: { item: Item } ) => any;\n\n\t/**\n\t * Callback used to set the value of the field on the item.\n\t * Used for editing operations to update field values.\n\t */\n\tsetValue?: ( args: { item: Item; value: any } ) => DeepPartial< Item >;\n\n\t/**\n\t * Display format configuration for fields.\n\t */\n\tformat?: FormatDate;\n};\n\n/**\n * Format for date fields:\n *\n * - date: the format string (e.g., 'F j, Y' for WordPress default format like 'March 10, 2023')\n * - weekStartsOn: to specify the first day of the week ('sunday', 'monday', etc.).\n *\n * If not provided, defaults to WordPress date format settings.\n */\nexport type FormatDate = {\n\tdate?: string;\n\tweekStartsOn?: DayNumber;\n};\nexport type DayNumber = 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\ntype NormalizedFieldBase< Item > = Omit< Field< Item >, 'Edit' > & {\n\tlabel: string;\n\theader: string | ReactElement;\n\tgetValue: ( args: { item: Item } ) => any;\n\tsetValue: ( args: { item: Item; value: any } ) => DeepPartial< Item >;\n\trender: ComponentType< DataViewRenderFieldProps< Item > >;\n\tEdit: ComponentType< DataFormControlProps< Item > > | null;\n\thasElements: boolean;\n\tsort: ( a: Item, b: Item, direction: SortDirection ) => number;\n\tisValid: Rules< Item >;\n\tenableHiding: boolean;\n\tenableSorting: boolean;\n\tfilterBy: Required< FilterByConfig > | false;\n\treadOnly: boolean;\n\tformat: {};\n};\n\nexport type NormalizedFieldDate< Item > = NormalizedFieldBase< Item > & {\n\ttype: 'date';\n\tformat: Required< FormatDate >;\n};\n\nexport type NormalizedField< Item > =\n\t| NormalizedFieldBase< Item >\n\t| NormalizedFieldDate< Item >;\n\n/**\n * A collection of dataview fields for a data type.\n */\nexport type Fields< Item > = Field< Item >[];\n\nexport type FieldValidity = {\n\trequired?: {\n\t\ttype: 'valid' | 'invalid' | 'validating';\n\t\tmessage?: string;\n\t};\n\tpattern?: {\n\t\ttype: 'valid' | 'invalid' | 'validating';\n\t\tmessage: string;\n\t};\n\telements?: {\n\t\ttype: 'valid' | 'invalid' | 'validating';\n\t\tmessage: string;\n\t};\n\tcustom?: {\n\t\ttype: 'valid' | 'invalid' | 'validating';\n\t\tmessage: string;\n\t};\n\tchildren?: Record< string, FieldValidity >;\n};\n\nexport type DataFormControlProps< Item > = {\n\tdata: Item;\n\tfield: NormalizedField< Item >;\n\tonChange: ( value: DeepPartial< Item > ) => void;\n\thideLabelFromVision?: boolean;\n\t/**\n\t * The currently selected filter operator for this field.\n\t *\n\t * Used by DataViews filters to determine which control to render based on the operator type.\n\t */\n\toperator?: Operator;\n\t/**\n\t * Validity information for the field, if any.\n\t */\n\tvalidity?: FieldValidity;\n\t/**\n\t * Configuration object for the control.\n\t */\n\tconfig?: {\n\t\tprefix?: React.ComponentType;\n\t\tsuffix?: React.ComponentType;\n\t\trows?: number;\n\t};\n};\n\nexport type DataViewRenderFieldProps< Item > = {\n\titem: Item;\n\tfield: NormalizedField< Item >;\n\tconfig?: {\n\t\tsizes: string;\n\t};\n};\n"],
|
|
4
|
+
"sourcesContent": ["/**\n * External dependencies\n */\nimport type { ReactElement, ComponentType } from 'react';\n\n/**\n * Utility type that makes all properties of T optional recursively.\n * Used by field setValue functions to allow partial item updates.\n */\nexport type DeepPartial< T > = {\n\t[ P in keyof T ]?: T[ P ] extends object ? DeepPartial< T[ P ] > : T[ P ];\n};\n\nexport type SortDirection = 'asc' | 'desc';\n\n/**\n * Generic option type.\n */\nexport interface Option< Value extends any = any > {\n\tvalue: Value;\n\tlabel: string;\n\tdescription?: string;\n}\n\nexport interface FilterByConfig {\n\t/**\n\t * The list of operators supported by the field.\n\t */\n\toperators?: Operator[];\n\n\t/**\n\t * Whether it is a primary filter.\n\t *\n\t * A primary filter is always visible and is not listed in the \"Add filter\" component,\n\t * except for the list layout where it behaves like a secondary filter.\n\t */\n\tisPrimary?: boolean;\n}\n\nexport type Operator =\n\t| 'is'\n\t| 'isNot'\n\t| 'isAny'\n\t| 'isNone'\n\t| 'isAll'\n\t| 'isNotAll'\n\t| 'lessThan'\n\t| 'greaterThan'\n\t| 'lessThanOrEqual'\n\t| 'greaterThanOrEqual'\n\t| 'before'\n\t| 'after'\n\t| 'beforeInc'\n\t| 'afterInc'\n\t| 'contains'\n\t| 'notContains'\n\t| 'startsWith'\n\t| 'between'\n\t| 'on'\n\t| 'notOn'\n\t| 'inThePast'\n\t| 'over';\n\nexport type FieldTypeName =\n\t| 'text'\n\t| 'integer'\n\t| 'number'\n\t| 'datetime'\n\t| 'date'\n\t| 'media'\n\t| 'boolean'\n\t| 'email'\n\t| 'password'\n\t| 'telephone'\n\t| 'color'\n\t| 'url'\n\t| 'array';\n\nexport type Rules< Item > = {\n\trequired?: boolean;\n\telements?: boolean;\n\tpattern?: string;\n\tminLength?: number;\n\tmaxLength?: number;\n\tmin?: number;\n\tmax?: number;\n\tcustom?:\n\t\t| ( ( item: Item, field: NormalizedField< Item > ) => null | string )\n\t\t| ( (\n\t\t\t\titem: Item,\n\t\t\t\tfield: NormalizedField< Item >\n\t\t ) => Promise< null | string > );\n};\n\nexport type Validator< Item > = (\n\titem: Item,\n\tfield: NormalizedField< Item >\n) => boolean;\n\nexport type CustomValidator< Item > =\n\t| ( ( item: Item, field: NormalizedField< Item > ) => null | string )\n\t| ( (\n\t\t\titem: Item,\n\t\t\tfield: NormalizedField< Item >\n\t ) => Promise< null | string > );\n\ntype NormalizedRule< Item, ConstraintType > = {\n\tconstraint: ConstraintType;\n\tvalidate: Validator< Item >;\n};\n\nexport type NormalizedRules< Item > = {\n\trequired?: NormalizedRule< Item, boolean >;\n\telements?: NormalizedRule< Item, boolean >;\n\tpattern?: NormalizedRule< Item, string >;\n\tminLength?: NormalizedRule< Item, number >;\n\tmaxLength?: NormalizedRule< Item, number >;\n\tmin?: NormalizedRule< Item, number >;\n\tmax?: NormalizedRule< Item, number >;\n\tcustom?: CustomValidator< Item >;\n};\n\n/**\n * Edit configuration for textarea controls.\n */\nexport type EditConfigTextarea = {\n\tcontrol: 'textarea';\n\t/**\n\t * Number of rows for the textarea.\n\t */\n\trows?: number;\n};\n\n/**\n * Edit configuration for text controls.\n */\nexport type EditConfigText = {\n\tcontrol: 'text';\n\t/**\n\t * Prefix component to display before the input.\n\t */\n\tprefix?: React.ComponentType;\n\t/**\n\t * Suffix component to display after the input.\n\t */\n\tsuffix?: React.ComponentType;\n};\n\n/**\n * Edit configuration for other control types (excluding 'text' and 'textarea').\n */\nexport type EditConfigGeneric = {\n\tcontrol: Exclude< FieldTypeName, 'text' | 'textarea' >;\n};\n\n/**\n * Edit configuration object with type-safe control options.\n * Each control type has its own specific configuration properties.\n */\nexport type EditConfig =\n\t| EditConfigTextarea\n\t| EditConfigText\n\t| EditConfigGeneric;\n\n/**\n * A dataview field for a specific property of a data type.\n */\nexport type Field< Item > = {\n\t/**\n\t * Type of the fields.\n\t */\n\ttype?: FieldTypeName;\n\n\t/**\n\t * The unique identifier of the field.\n\t */\n\tid: string;\n\n\t/**\n\t * The label of the field. Defaults to the id.\n\t */\n\tlabel?: string;\n\n\t/**\n\t * The header of the field. Defaults to the label.\n\t * It allows the usage of a React Element to render the field labels.\n\t */\n\theader?: string | ReactElement;\n\n\t/**\n\t * A description of the field.\n\t */\n\tdescription?: string;\n\n\t/**\n\t * Placeholder for the field.\n\t */\n\tplaceholder?: string;\n\n\t/**\n\t * Callback used to render the field. Defaults to `field.getValue`.\n\t */\n\trender?: ComponentType< DataViewRenderFieldProps< Item > >;\n\n\t/**\n\t * Callback used to render an edit control for the field.\n\t */\n\tEdit?: ComponentType< DataFormControlProps< Item > > | string | EditConfig;\n\n\t/**\n\t * Callback used to sort the field.\n\t */\n\tsort?: ( a: Item, b: Item, direction: SortDirection ) => number;\n\n\t/**\n\t * Callback used to validate the field.\n\t */\n\tisValid?: Rules< Item >;\n\n\t/**\n\t * Callback used to decide if a field should be displayed.\n\t */\n\tisVisible?: ( item: Item ) => boolean;\n\n\t/**\n\t * Whether the field is sortable.\n\t */\n\tenableSorting?: boolean;\n\n\t/**\n\t * Whether the field is searchable.\n\t */\n\tenableGlobalSearch?: boolean;\n\n\t/**\n\t * Whether the field can be hidden in the UI.\n\t */\n\tenableHiding?: boolean;\n\n\t/**\n\t * The list of options to pick from when using the field as a filter.\n\t */\n\telements?: Option[];\n\n\t/**\n\t * Retrieval function for elements.\n\t */\n\tgetElements?: () => Promise< Option[] >;\n\n\t/**\n\t * Filter config for the field.\n\t */\n\tfilterBy?: FilterByConfig | false;\n\n\t/**\n\t * Whether the field is readOnly.\n\t * If `true`, the value will be rendered using the `render` callback.\n\t */\n\treadOnly?: boolean;\n\n\t/**\n\t * Callback used to retrieve the value of the field from the item.\n\t * Defaults to `item[ field.id ]`.\n\t */\n\tgetValue?: ( args: { item: Item } ) => any;\n\n\t/**\n\t * Callback used to set the value of the field on the item.\n\t * Used for editing operations to update field values.\n\t */\n\tsetValue?: ( args: { item: Item; value: any } ) => DeepPartial< Item >;\n\n\t/**\n\t * Display format configuration for fields.\n\t */\n\tformat?: FormatDate | FormatNumber | FormatInteger;\n};\n\n/**\n * Format for date fields:\n *\n * - date: the format string (e.g., 'F j, Y' for WordPress default format like 'March 10, 2023')\n * - weekStartsOn: to specify the first day of the week ('sunday', 'monday', etc.).\n *\n * If not provided, defaults to WordPress date format settings.\n */\nexport type FormatDate = {\n\tdate?: string;\n\tweekStartsOn?: DayNumber;\n};\nexport type DayNumber = 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\n/**\n * Format for number fields:\n *\n * - separatorThousand: character to use for thousand separators (e.g., ',')\n * - separatorDecimal: character to use for decimal point (e.g., '.')\n * - decimals: number of decimal places to display (e.g., 2)\n *\n * If not provided, defaults to ',' for thousands, '.' for decimal, 2 decimals.\n */\nexport type FormatNumber = {\n\tseparatorThousand?: string;\n\tseparatorDecimal?: string;\n\tdecimals?: number;\n};\n\n/**\n * Format for integer fields:\n *\n * - separatorThousand: character to use for thousand separators (e.g., ',')\n *\n * If not provided, defaults to ',' for thousands.\n */\nexport type FormatInteger = {\n\tseparatorThousand?: string;\n};\n\ntype NormalizedFieldBase< Item > = Omit< Field< Item >, 'Edit' | 'isValid' > & {\n\tlabel: string;\n\theader: string | ReactElement;\n\tgetValue: ( args: { item: Item } ) => any;\n\tsetValue: ( args: { item: Item; value: any } ) => DeepPartial< Item >;\n\trender: ComponentType< DataViewRenderFieldProps< Item > >;\n\tEdit: ComponentType< DataFormControlProps< Item > > | null;\n\thasElements: boolean;\n\tsort: ( a: Item, b: Item, direction: SortDirection ) => number;\n\tisValid: NormalizedRules< Item >;\n\tenableHiding: boolean;\n\tenableSorting: boolean;\n\tfilterBy: Required< FilterByConfig > | false;\n\treadOnly: boolean;\n\tformat: {};\n};\n\nexport type NormalizedFieldDate< Item > = NormalizedFieldBase< Item > & {\n\ttype: 'date';\n\tformat: Required< FormatDate >;\n};\n\nexport type NormalizedFieldNumber< Item > = NormalizedFieldBase< Item > & {\n\ttype: 'number';\n\tformat: Required< FormatNumber >;\n};\n\nexport type NormalizedFieldInteger< Item > = NormalizedFieldBase< Item > & {\n\ttype: 'integer';\n\tformat: Required< FormatInteger >;\n};\n\nexport type NormalizedField< Item > =\n\t| NormalizedFieldBase< Item >\n\t| NormalizedFieldDate< Item >\n\t| NormalizedFieldNumber< Item >\n\t| NormalizedFieldInteger< Item >;\n\n/**\n * A collection of dataview fields for a data type.\n */\nexport type Fields< Item > = Field< Item >[];\n\nexport type FieldValidity = {\n\trequired?: {\n\t\ttype: 'valid' | 'invalid' | 'validating';\n\t\tmessage?: string;\n\t};\n\tpattern?: {\n\t\ttype: 'valid' | 'invalid' | 'validating';\n\t\tmessage: string;\n\t};\n\tmin?: {\n\t\ttype: 'valid' | 'invalid' | 'validating';\n\t\tmessage: string;\n\t};\n\tmax?: {\n\t\ttype: 'valid' | 'invalid' | 'validating';\n\t\tmessage: string;\n\t};\n\tminLength?: {\n\t\ttype: 'valid' | 'invalid' | 'validating';\n\t\tmessage: string;\n\t};\n\tmaxLength?: {\n\t\ttype: 'valid' | 'invalid' | 'validating';\n\t\tmessage: string;\n\t};\n\telements?: {\n\t\ttype: 'valid' | 'invalid' | 'validating';\n\t\tmessage: string;\n\t};\n\tcustom?: {\n\t\ttype: 'valid' | 'invalid' | 'validating';\n\t\tmessage: string;\n\t};\n\tchildren?: Record< string, FieldValidity >;\n};\n\nexport type DataFormControlProps< Item > = {\n\tdata: Item;\n\tfield: NormalizedField< Item >;\n\tonChange: ( value: DeepPartial< Item > ) => void;\n\thideLabelFromVision?: boolean;\n\t/**\n\t * The currently selected filter operator for this field.\n\t *\n\t * Used by DataViews filters to determine which control to render based on the operator type.\n\t */\n\toperator?: Operator;\n\t/**\n\t * Validity information for the field, if any.\n\t */\n\tvalidity?: FieldValidity;\n\t/**\n\t * Configuration object for the control.\n\t */\n\tconfig?: {\n\t\tprefix?: React.ComponentType;\n\t\tsuffix?: React.ComponentType;\n\t\trows?: number;\n\t};\n};\n\nexport type DataViewRenderFieldProps< Item > = {\n\titem: Item;\n\tfield: NormalizedField< Item >;\n\tconfig?: {\n\t\tsizes: string;\n\t};\n};\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;AAAA;AAAA;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/types/private.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Internal dependencies\n */\nimport type {
|
|
4
|
+
"sourcesContent": ["/**\n * Internal dependencies\n */\nimport type {\n\tCustomValidator,\n\tField,\n\tFormatDate,\n\tFormatInteger,\n\tFormatNumber,\n\tNormalizedField,\n\tOperator,\n\tValidator,\n} from './field-api';\n\nexport type SelectionOrUpdater = string[] | ( ( prev: string[] ) => string[] );\nexport type SetSelection = ( selection: SelectionOrUpdater ) => void;\nexport type FieldType< Item > = Pick<\n\tNormalizedField< Item >,\n\t'type' | 'render' | 'sort' | 'enableSorting' | 'enableGlobalSearch'\n> & {\n\tEdit: string | null;\n\tvalidOperators: Operator[];\n\tdefaultOperators: Operator[];\n\tgetFormat: (\n\t\tfield: Field< Item >\n\t) =>\n\t\t| Record< string, any >\n\t\t| Required< FormatDate >\n\t\t| Required< FormatNumber >\n\t\t| Required< FormatInteger >;\n\tvalidate: {\n\t\trequired?: Validator< Item >;\n\t\telements?: Validator< Item >;\n\t\tpattern?: Validator< Item >;\n\t\tminLength?: Validator< Item >;\n\t\tmaxLength?: Validator< Item >;\n\t\tmin?: Validator< Item >;\n\t\tmax?: Validator< Item >;\n\t\tcustom?: CustomValidator< Item >;\n\t};\n};\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;AAAA;AAAA;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -35,6 +35,7 @@ __export(filter_sort_and_paginate_exports, {
|
|
|
35
35
|
module.exports = __toCommonJS(filter_sort_and_paginate_exports);
|
|
36
36
|
var import_remove_accents = __toESM(require("remove-accents"));
|
|
37
37
|
var import_date_fns = require("date-fns");
|
|
38
|
+
var import_deprecated = __toESM(require("@wordpress/deprecated"));
|
|
38
39
|
var import_date = require("@wordpress/date");
|
|
39
40
|
var import_constants = require("../constants");
|
|
40
41
|
var import_field_types = __toESM(require("../field-types"));
|
|
@@ -116,6 +117,10 @@ function filterSortAndPaginate(data, view, fields) {
|
|
|
116
117
|
});
|
|
117
118
|
});
|
|
118
119
|
} else if (filter.operator === import_constants.OPERATOR_IS_NOT_ALL && filter?.value?.length > 0) {
|
|
120
|
+
(0, import_deprecated.default)("The 'isNotAll' filter operator", {
|
|
121
|
+
since: "7.0",
|
|
122
|
+
alternative: "'isNone'"
|
|
123
|
+
});
|
|
119
124
|
filteredData = filteredData.filter((item) => {
|
|
120
125
|
return filter.value.every((value) => {
|
|
121
126
|
return !field.getValue({ item })?.includes(value);
|