@mantine/form 9.0.0-alpha.5 → 9.0.0-alpha.7
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/cjs/FormProvider/FormProvider.cjs +26 -21
- package/cjs/FormProvider/FormProvider.cjs.map +1 -1
- package/cjs/_virtual/_rolldown/runtime.cjs +24 -0
- package/cjs/actions/actions.cjs +86 -117
- package/cjs/actions/actions.cjs.map +1 -1
- package/cjs/form-index.cjs +5 -5
- package/cjs/form-index.cjs.map +1 -1
- package/cjs/get-input-on-change/get-input-on-change.cjs +15 -25
- package/cjs/get-input-on-change/get-input-on-change.cjs.map +1 -1
- package/cjs/get-status/get-status.cjs +11 -11
- package/cjs/get-status/get-status.cjs.map +1 -1
- package/cjs/hooks/use-form-errors/filter-errors/filter-errors.cjs +11 -15
- package/cjs/hooks/use-form-errors/filter-errors/filter-errors.cjs.map +1 -1
- package/cjs/hooks/use-form-errors/use-form-errors.cjs +39 -48
- package/cjs/hooks/use-form-errors/use-form-errors.cjs.map +1 -1
- package/cjs/hooks/use-form-list/use-form-list.cjs +47 -51
- package/cjs/hooks/use-form-list/use-form-list.cjs.map +1 -1
- package/cjs/hooks/use-form-status/use-form-status.cjs +95 -128
- package/cjs/hooks/use-form-status/use-form-status.cjs.map +1 -1
- package/cjs/hooks/use-form-validating/use-form-validating.cjs +49 -51
- package/cjs/hooks/use-form-validating/use-form-validating.cjs.map +1 -1
- package/cjs/hooks/use-form-values/use-form-values.cjs +92 -107
- package/cjs/hooks/use-form-values/use-form-values.cjs.map +1 -1
- package/cjs/hooks/use-form-watch/use-form-watch.cjs +41 -57
- package/cjs/hooks/use-form-watch/use-form-watch.cjs.map +1 -1
- package/cjs/index.cjs +35 -38
- package/cjs/lists/change-error-indices.cjs +34 -41
- package/cjs/lists/change-error-indices.cjs.map +1 -1
- package/cjs/lists/clear-list-state.cjs +11 -15
- package/cjs/lists/clear-list-state.cjs.map +1 -1
- package/cjs/lists/reorder-errors.cjs +30 -32
- package/cjs/lists/reorder-errors.cjs.map +1 -1
- package/cjs/paths/get-data-path.cjs +6 -6
- package/cjs/paths/get-data-path.cjs.map +1 -1
- package/cjs/paths/get-path.cjs +14 -19
- package/cjs/paths/get-path.cjs.map +1 -1
- package/cjs/paths/get-splitted-path.cjs +7 -9
- package/cjs/paths/get-splitted-path.cjs.map +1 -1
- package/cjs/paths/insert-path.cjs +12 -15
- package/cjs/paths/insert-path.cjs.map +1 -1
- package/cjs/paths/remove-path.cjs +10 -17
- package/cjs/paths/remove-path.cjs.map +1 -1
- package/cjs/paths/reorder-path.cjs +14 -17
- package/cjs/paths/reorder-path.cjs.map +1 -1
- package/cjs/paths/replace-path.cjs +13 -18
- package/cjs/paths/replace-path.cjs.map +1 -1
- package/cjs/paths/set-path.cjs +22 -26
- package/cjs/paths/set-path.cjs.map +1 -1
- package/cjs/schema-resolver.cjs +24 -0
- package/cjs/schema-resolver.cjs.map +1 -0
- package/cjs/use-field.cjs +94 -131
- package/cjs/use-field.cjs.map +1 -1
- package/cjs/use-form.cjs +316 -379
- package/cjs/use-form.cjs.map +1 -1
- package/cjs/validate/get-rule-for-path.cjs +16 -24
- package/cjs/validate/get-rule-for-path.cjs.map +1 -1
- package/cjs/validate/should-validate-on-change.cjs +10 -17
- package/cjs/validate/should-validate-on-change.cjs.map +1 -1
- package/cjs/validate/validate-field-value.cjs +58 -54
- package/cjs/validate/validate-field-value.cjs.map +1 -1
- package/cjs/validate/validate-values.cjs +77 -108
- package/cjs/validate/validate-values.cjs.map +1 -1
- package/cjs/validators/has-length/has-length.cjs +17 -27
- package/cjs/validators/has-length/has-length.cjs.map +1 -1
- package/cjs/validators/is-email/is-email.cjs +7 -8
- package/cjs/validators/is-email/is-email.cjs.map +1 -1
- package/cjs/validators/is-in-range/is-in-range.cjs +13 -19
- package/cjs/validators/is-in-range/is-in-range.cjs.map +1 -1
- package/cjs/validators/is-json-string/is-json-string.cjs +15 -17
- package/cjs/validators/is-json-string/is-json-string.cjs.map +1 -1
- package/cjs/validators/is-not-empty/is-not-empty.cjs +13 -21
- package/cjs/validators/is-not-empty/is-not-empty.cjs.map +1 -1
- package/cjs/validators/is-not-empty-html/is-not-empty-html.cjs +11 -13
- package/cjs/validators/is-not-empty-html/is-not-empty-html.cjs.map +1 -1
- package/cjs/validators/is-one-of/is-one-of.cjs +9 -9
- package/cjs/validators/is-one-of/is-one-of.cjs.map +1 -1
- package/cjs/validators/is-url/is-url.cjs +25 -33
- package/cjs/validators/is-url/is-url.cjs.map +1 -1
- package/cjs/validators/matches/matches.cjs +10 -12
- package/cjs/validators/matches/matches.cjs.map +1 -1
- package/cjs/validators/matches-field/matches-field.cjs +10 -12
- package/cjs/validators/matches-field/matches-field.cjs.map +1 -1
- package/esm/FormProvider/FormProvider.mjs +25 -19
- package/esm/FormProvider/FormProvider.mjs.map +1 -1
- package/esm/actions/actions.mjs +85 -114
- package/esm/actions/actions.mjs.map +1 -1
- package/esm/form-index.mjs +5 -3
- package/esm/form-index.mjs.map +1 -1
- package/esm/get-input-on-change/get-input-on-change.mjs +15 -23
- package/esm/get-input-on-change/get-input-on-change.mjs.map +1 -1
- package/esm/get-status/get-status.mjs +11 -9
- package/esm/get-status/get-status.mjs.map +1 -1
- package/esm/hooks/use-form-errors/filter-errors/filter-errors.mjs +11 -13
- package/esm/hooks/use-form-errors/filter-errors/filter-errors.mjs.map +1 -1
- package/esm/hooks/use-form-errors/use-form-errors.mjs +38 -46
- package/esm/hooks/use-form-errors/use-form-errors.mjs.map +1 -1
- package/esm/hooks/use-form-list/use-form-list.mjs +46 -49
- package/esm/hooks/use-form-list/use-form-list.mjs.map +1 -1
- package/esm/hooks/use-form-status/use-form-status.mjs +93 -122
- package/esm/hooks/use-form-status/use-form-status.mjs.map +1 -1
- package/esm/hooks/use-form-validating/use-form-validating.mjs +48 -49
- package/esm/hooks/use-form-validating/use-form-validating.mjs.map +1 -1
- package/esm/hooks/use-form-values/use-form-values.mjs +91 -105
- package/esm/hooks/use-form-values/use-form-values.mjs.map +1 -1
- package/esm/hooks/use-form-watch/use-form-watch.mjs +40 -55
- package/esm/hooks/use-form-watch/use-form-watch.mjs.map +1 -1
- package/esm/index.mjs +18 -17
- package/esm/lists/change-error-indices.mjs +34 -39
- package/esm/lists/change-error-indices.mjs.map +1 -1
- package/esm/lists/clear-list-state.mjs +11 -13
- package/esm/lists/clear-list-state.mjs.map +1 -1
- package/esm/lists/reorder-errors.mjs +30 -30
- package/esm/lists/reorder-errors.mjs.map +1 -1
- package/esm/paths/get-data-path.mjs +6 -4
- package/esm/paths/get-data-path.mjs.map +1 -1
- package/esm/paths/get-path.mjs +14 -17
- package/esm/paths/get-path.mjs.map +1 -1
- package/esm/paths/get-splitted-path.mjs +7 -7
- package/esm/paths/get-splitted-path.mjs.map +1 -1
- package/esm/paths/insert-path.mjs +12 -13
- package/esm/paths/insert-path.mjs.map +1 -1
- package/esm/paths/remove-path.mjs +10 -15
- package/esm/paths/remove-path.mjs.map +1 -1
- package/esm/paths/reorder-path.mjs +14 -15
- package/esm/paths/reorder-path.mjs.map +1 -1
- package/esm/paths/replace-path.mjs +13 -16
- package/esm/paths/replace-path.mjs.map +1 -1
- package/esm/paths/set-path.mjs +21 -24
- package/esm/paths/set-path.mjs.map +1 -1
- package/esm/schema-resolver.mjs +24 -0
- package/esm/schema-resolver.mjs.map +1 -0
- package/esm/use-field.mjs +93 -129
- package/esm/use-field.mjs.map +1 -1
- package/esm/use-form.mjs +315 -377
- package/esm/use-form.mjs.map +1 -1
- package/esm/validate/get-rule-for-path.mjs +16 -22
- package/esm/validate/get-rule-for-path.mjs.map +1 -1
- package/esm/validate/should-validate-on-change.mjs +10 -15
- package/esm/validate/should-validate-on-change.mjs.map +1 -1
- package/esm/validate/validate-field-value.mjs +58 -52
- package/esm/validate/validate-field-value.mjs.map +1 -1
- package/esm/validate/validate-values.mjs +77 -106
- package/esm/validate/validate-values.mjs.map +1 -1
- package/esm/validators/has-length/has-length.mjs +17 -25
- package/esm/validators/has-length/has-length.mjs.map +1 -1
- package/esm/validators/is-email/is-email.mjs +7 -6
- package/esm/validators/is-email/is-email.mjs.map +1 -1
- package/esm/validators/is-in-range/is-in-range.mjs +13 -17
- package/esm/validators/is-in-range/is-in-range.mjs.map +1 -1
- package/esm/validators/is-json-string/is-json-string.mjs +15 -15
- package/esm/validators/is-json-string/is-json-string.mjs.map +1 -1
- package/esm/validators/is-not-empty/is-not-empty.mjs +13 -19
- package/esm/validators/is-not-empty/is-not-empty.mjs.map +1 -1
- package/esm/validators/is-not-empty-html/is-not-empty-html.mjs +11 -11
- package/esm/validators/is-not-empty-html/is-not-empty-html.mjs.map +1 -1
- package/esm/validators/is-one-of/is-one-of.mjs +9 -7
- package/esm/validators/is-one-of/is-one-of.mjs.map +1 -1
- package/esm/validators/is-url/is-url.mjs +25 -31
- package/esm/validators/is-url/is-url.mjs.map +1 -1
- package/esm/validators/matches/matches.mjs +10 -10
- package/esm/validators/matches/matches.mjs.map +1 -1
- package/esm/validators/matches-field/matches-field.mjs +10 -10
- package/esm/validators/matches-field/matches-field.mjs.map +1 -1
- package/lib/hooks/use-form-status/use-form-status.d.ts +2 -2
- package/lib/hooks/use-form-values/use-form-values.d.ts +9 -9
- package/lib/hooks/use-form-watch/use-form-watch.d.ts +5 -5
- package/lib/index.d.mts +1 -0
- package/lib/index.d.ts +1 -0
- package/lib/schema-resolver.d.ts +5 -0
- package/lib/types.d.ts +19 -18
- package/package.json +5 -1
- package/cjs/index.cjs.map +0 -1
- package/esm/index.mjs.map +0 -1
package/cjs/paths/set-path.cjs
CHANGED
|
@@ -1,29 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
"use client";
|
|
2
|
+
require("../_virtual/_rolldown/runtime.cjs");
|
|
3
|
+
const require_get_splitted_path = require("./get-splitted-path.cjs");
|
|
4
|
+
let klona_full = require("klona/full");
|
|
5
|
+
//#region packages/@mantine/form/src/paths/set-path.ts
|
|
7
6
|
function setPath(path, value, values) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
val = val[splittedPath[i]];
|
|
23
|
-
}
|
|
24
|
-
val[splittedPath[splittedPath.length - 1]] = value;
|
|
25
|
-
return cloned;
|
|
7
|
+
const splittedPath = require_get_splitted_path.getSplittedPath(path);
|
|
8
|
+
if (splittedPath.length === 0) return values;
|
|
9
|
+
const cloned = (0, klona_full.klona)(values);
|
|
10
|
+
if (splittedPath.length === 1) {
|
|
11
|
+
cloned[splittedPath[0]] = value;
|
|
12
|
+
return cloned;
|
|
13
|
+
}
|
|
14
|
+
let val = cloned[splittedPath[0]];
|
|
15
|
+
for (let i = 1; i < splittedPath.length - 1; i += 1) {
|
|
16
|
+
if (val === void 0) return cloned;
|
|
17
|
+
val = val[splittedPath[i]];
|
|
18
|
+
}
|
|
19
|
+
val[splittedPath[splittedPath.length - 1]] = value;
|
|
20
|
+
return cloned;
|
|
26
21
|
}
|
|
27
|
-
|
|
22
|
+
//#endregion
|
|
28
23
|
exports.setPath = setPath;
|
|
29
|
-
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=set-path.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set-path.cjs","sources":["../../src/paths/set-path.ts"],"sourcesContent":["import { klona } from 'klona/full';\nimport { getSplittedPath } from './get-splitted-path';\n\nexport function setPath<T>(path: unknown, value: unknown, values: T): T {\n const splittedPath = getSplittedPath(path);\n\n if (splittedPath.length === 0) {\n return values;\n }\n\n const cloned: any = klona(values);\n\n if (splittedPath.length === 1) {\n cloned[splittedPath[0]] = value;\n return cloned;\n }\n\n let val = cloned[splittedPath[0]];\n\n for (let i = 1; i < splittedPath.length - 1; i += 1) {\n if (val === undefined) {\n return cloned;\n }\n\n val = val[splittedPath[i]];\n }\n\n val[splittedPath[splittedPath.length - 1]] = value;\n\n return cloned;\n}\n"],"
|
|
1
|
+
{"version":3,"file":"set-path.cjs","names":["getSplittedPath"],"sources":["../../src/paths/set-path.ts"],"sourcesContent":["import { klona } from 'klona/full';\nimport { getSplittedPath } from './get-splitted-path';\n\nexport function setPath<T>(path: unknown, value: unknown, values: T): T {\n const splittedPath = getSplittedPath(path);\n\n if (splittedPath.length === 0) {\n return values;\n }\n\n const cloned: any = klona(values);\n\n if (splittedPath.length === 1) {\n cloned[splittedPath[0]] = value;\n return cloned;\n }\n\n let val = cloned[splittedPath[0]];\n\n for (let i = 1; i < splittedPath.length - 1; i += 1) {\n if (val === undefined) {\n return cloned;\n }\n\n val = val[splittedPath[i]];\n }\n\n val[splittedPath[splittedPath.length - 1]] = value;\n\n return cloned;\n}\n"],"mappings":";;;;;AAGA,SAAgB,QAAW,MAAe,OAAgB,QAAc;CACtE,MAAM,eAAeA,0BAAAA,gBAAgB,KAAK;AAE1C,KAAI,aAAa,WAAW,EAC1B,QAAO;CAGT,MAAM,UAAA,GAAA,WAAA,OAAoB,OAAO;AAEjC,KAAI,aAAa,WAAW,GAAG;AAC7B,SAAO,aAAa,MAAM;AAC1B,SAAO;;CAGT,IAAI,MAAM,OAAO,aAAa;AAE9B,MAAK,IAAI,IAAI,GAAG,IAAI,aAAa,SAAS,GAAG,KAAK,GAAG;AACnD,MAAI,QAAQ,KAAA,EACV,QAAO;AAGT,QAAM,IAAI,aAAa;;AAGzB,KAAI,aAAa,aAAa,SAAS,MAAM;AAE7C,QAAO"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
const require_filter_errors = require("./hooks/use-form-errors/filter-errors/filter-errors.cjs");
|
|
3
|
+
//#region packages/@mantine/form/src/schema-resolver.ts
|
|
4
|
+
function issuesToFormErrors(issues) {
|
|
5
|
+
const errors = {};
|
|
6
|
+
for (const issue of issues) {
|
|
7
|
+
const path = issue.path ? issue.path.map((segment) => typeof segment === "object" ? segment.key : segment).join(".") : "";
|
|
8
|
+
if (!errors[path]) errors[path] = issue.message;
|
|
9
|
+
}
|
|
10
|
+
return require_filter_errors.filterErrors(errors);
|
|
11
|
+
}
|
|
12
|
+
function schemaResolver(schema, _options) {
|
|
13
|
+
const sync = _options?.sync ?? false;
|
|
14
|
+
return ((values) => {
|
|
15
|
+
const result = schema["~standard"].validate(values);
|
|
16
|
+
if (result instanceof Promise) return result.then((resolved) => resolved.issues ? issuesToFormErrors(resolved.issues) : {});
|
|
17
|
+
const errors = result.issues ? issuesToFormErrors(result.issues) : {};
|
|
18
|
+
return sync ? errors : Promise.resolve(errors);
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
//#endregion
|
|
22
|
+
exports.schemaResolver = schemaResolver;
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=schema-resolver.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-resolver.cjs","names":["filterErrors"],"sources":["../src/schema-resolver.ts"],"sourcesContent":["import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { filterErrors } from './hooks/use-form-errors/filter-errors/filter-errors';\nimport type { FormErrors } from './types';\n\nfunction issuesToFormErrors(issues: ReadonlyArray<StandardSchemaV1.Issue>): FormErrors {\n const errors: FormErrors = {};\n for (const issue of issues) {\n const path = issue.path\n ? issue.path.map((segment) => (typeof segment === 'object' ? segment.key : segment)).join('.')\n : '';\n if (!errors[path]) {\n errors[path] = issue.message;\n }\n }\n return filterErrors(errors);\n}\n\nexport function schemaResolver<Sync extends boolean = false>(\n schema: StandardSchemaV1,\n _options?: { sync?: Sync }\n): Sync extends true ? (values: any) => FormErrors : (values: any) => Promise<FormErrors> {\n const sync = _options?.sync ?? false;\n return ((values: any) => {\n const result = schema['~standard'].validate(values);\n if (result instanceof Promise) {\n return result.then((resolved) =>\n resolved.issues ? issuesToFormErrors(resolved.issues) : {}\n );\n }\n const errors = result.issues ? issuesToFormErrors(result.issues) : {};\n return sync ? errors : Promise.resolve(errors);\n }) as any;\n}\n"],"mappings":";;;AAIA,SAAS,mBAAmB,QAA2D;CACrF,MAAM,SAAqB,EAAE;AAC7B,MAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,OAAO,MAAM,OACf,MAAM,KAAK,KAAK,YAAa,OAAO,YAAY,WAAW,QAAQ,MAAM,QAAS,CAAC,KAAK,IAAI,GAC5F;AACJ,MAAI,CAAC,OAAO,MACV,QAAO,QAAQ,MAAM;;AAGzB,QAAOA,sBAAAA,aAAa,OAAO;;AAG7B,SAAgB,eACd,QACA,UACwF;CACxF,MAAM,OAAO,UAAU,QAAQ;AAC/B,UAAS,WAAgB;EACvB,MAAM,SAAS,OAAO,aAAa,SAAS,OAAO;AACnD,MAAI,kBAAkB,QACpB,QAAO,OAAO,MAAM,aAClB,SAAS,SAAS,mBAAmB,SAAS,OAAO,GAAG,EAAE,CAC3D;EAEH,MAAM,SAAS,OAAO,SAAS,mBAAmB,OAAO,OAAO,GAAG,EAAE;AACrE,SAAO,OAAO,SAAS,QAAQ,QAAQ,OAAO"}
|
package/cjs/use-field.cjs
CHANGED
|
@@ -1,133 +1,96 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
if (withError) {
|
|
93
|
-
payload.error = error;
|
|
94
|
-
}
|
|
95
|
-
if (type === "checkbox") {
|
|
96
|
-
payload[mode === "controlled" ? "checked" : "defaultChecked"] = valueRef.current;
|
|
97
|
-
} else if (type === "radio") {
|
|
98
|
-
payload[mode === "controlled" ? "checked" : "defaultChecked"] = valueRef.current === otherOptions.value;
|
|
99
|
-
payload.value = otherOptions.value;
|
|
100
|
-
} else {
|
|
101
|
-
payload[mode === "controlled" ? "value" : "defaultValue"] = valueRef.current;
|
|
102
|
-
}
|
|
103
|
-
if (withFocus) {
|
|
104
|
-
payload.onFocus = () => {
|
|
105
|
-
setTouched(true);
|
|
106
|
-
};
|
|
107
|
-
payload.onBlur = () => {
|
|
108
|
-
if (shouldValidateOnChange.shouldValidateOnChange("", !!validateOnBlur)) {
|
|
109
|
-
_validate();
|
|
110
|
-
}
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
return payload;
|
|
114
|
-
};
|
|
115
|
-
const resetTouched = react.useCallback(() => setTouched(false), []);
|
|
116
|
-
return {
|
|
117
|
-
key,
|
|
118
|
-
getValue,
|
|
119
|
-
setValue,
|
|
120
|
-
reset,
|
|
121
|
-
getInputProps,
|
|
122
|
-
isValidating,
|
|
123
|
-
validate: _validate,
|
|
124
|
-
error,
|
|
125
|
-
setError,
|
|
126
|
-
isTouched,
|
|
127
|
-
isDirty,
|
|
128
|
-
resetTouched
|
|
129
|
-
};
|
|
1
|
+
"use client";
|
|
2
|
+
require("./_virtual/_rolldown/runtime.cjs");
|
|
3
|
+
const require_get_input_on_change = require("./get-input-on-change/get-input-on-change.cjs");
|
|
4
|
+
const require_should_validate_on_change = require("./validate/should-validate-on-change.cjs");
|
|
5
|
+
let react = require("react");
|
|
6
|
+
//#region packages/@mantine/form/src/use-field.ts
|
|
7
|
+
function useField({ mode = "controlled", clearErrorOnChange = true, initialValue, initialError = null, initialTouched = false, onValueChange, validateOnChange = false, validateOnBlur = false, validate, resolveValidationError, type = "input" }) {
|
|
8
|
+
const [valueState, setValueState] = (0, react.useState)(initialValue);
|
|
9
|
+
const valueRef = (0, react.useRef)(valueState);
|
|
10
|
+
const [key, setKey] = (0, react.useState)(0);
|
|
11
|
+
const [error, setError] = (0, react.useState)(initialError || null);
|
|
12
|
+
const touchedRef = (0, react.useRef)(initialTouched || false);
|
|
13
|
+
const [, setTouchedState] = (0, react.useState)(touchedRef.current);
|
|
14
|
+
const [isValidating, setIsValidating] = (0, react.useState)(false);
|
|
15
|
+
const errorResolver = (0, react.useMemo)(() => resolveValidationError || ((err) => err), [resolveValidationError]);
|
|
16
|
+
const setTouched = (0, react.useCallback)((val, { updateState = mode === "controlled" } = {}) => {
|
|
17
|
+
touchedRef.current = val;
|
|
18
|
+
updateState && setTouchedState(val);
|
|
19
|
+
}, []);
|
|
20
|
+
const setValue = (0, react.useCallback)((value, { updateKey = mode === "uncontrolled", updateState = mode === "controlled" } = {}) => {
|
|
21
|
+
if (valueRef.current === value) return;
|
|
22
|
+
valueRef.current = value;
|
|
23
|
+
onValueChange?.(value);
|
|
24
|
+
if (clearErrorOnChange && error !== null) setError(null);
|
|
25
|
+
if (updateState) setValueState(value);
|
|
26
|
+
if (updateKey) setKey((currentKey) => currentKey + 1);
|
|
27
|
+
if (validateOnChange) _validate();
|
|
28
|
+
}, [
|
|
29
|
+
error,
|
|
30
|
+
clearErrorOnChange,
|
|
31
|
+
onValueChange
|
|
32
|
+
]);
|
|
33
|
+
const reset = (0, react.useCallback)(() => {
|
|
34
|
+
setValue(initialValue);
|
|
35
|
+
setError(null);
|
|
36
|
+
setTouched(false);
|
|
37
|
+
}, [initialValue]);
|
|
38
|
+
const getValue = (0, react.useCallback)(() => valueRef.current, []);
|
|
39
|
+
const isTouched = (0, react.useCallback)(() => touchedRef.current, []);
|
|
40
|
+
const isDirty = (0, react.useCallback)(() => valueRef.current !== initialValue, [initialValue]);
|
|
41
|
+
const _validate = (0, react.useCallback)(async () => {
|
|
42
|
+
const validationResult = validate?.(valueRef.current);
|
|
43
|
+
if (validationResult instanceof Promise) {
|
|
44
|
+
setIsValidating(true);
|
|
45
|
+
try {
|
|
46
|
+
const result = await validationResult;
|
|
47
|
+
setIsValidating(false);
|
|
48
|
+
setError(result);
|
|
49
|
+
} catch (err) {
|
|
50
|
+
setIsValidating(false);
|
|
51
|
+
const resolvedError = errorResolver(err);
|
|
52
|
+
setError(resolvedError);
|
|
53
|
+
return resolvedError;
|
|
54
|
+
}
|
|
55
|
+
} else {
|
|
56
|
+
setError(validationResult);
|
|
57
|
+
return validationResult;
|
|
58
|
+
}
|
|
59
|
+
}, []);
|
|
60
|
+
const getInputProps = ({ withError = true, withFocus = true, ...otherOptions } = {}) => {
|
|
61
|
+
const payload = { onChange: require_get_input_on_change.getInputOnChange((val) => setValue(val, { updateKey: false })) };
|
|
62
|
+
if (withError) payload.error = error;
|
|
63
|
+
if (type === "checkbox") payload[mode === "controlled" ? "checked" : "defaultChecked"] = valueRef.current;
|
|
64
|
+
else if (type === "radio") {
|
|
65
|
+
payload[mode === "controlled" ? "checked" : "defaultChecked"] = valueRef.current === otherOptions.value;
|
|
66
|
+
payload.value = otherOptions.value;
|
|
67
|
+
} else payload[mode === "controlled" ? "value" : "defaultValue"] = valueRef.current;
|
|
68
|
+
if (withFocus) {
|
|
69
|
+
payload.onFocus = () => {
|
|
70
|
+
setTouched(true);
|
|
71
|
+
};
|
|
72
|
+
payload.onBlur = () => {
|
|
73
|
+
if (require_should_validate_on_change.shouldValidateOnChange("", !!validateOnBlur)) _validate();
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
return payload;
|
|
77
|
+
};
|
|
78
|
+
return {
|
|
79
|
+
key,
|
|
80
|
+
getValue,
|
|
81
|
+
setValue,
|
|
82
|
+
reset,
|
|
83
|
+
getInputProps,
|
|
84
|
+
isValidating,
|
|
85
|
+
validate: _validate,
|
|
86
|
+
error,
|
|
87
|
+
setError,
|
|
88
|
+
isTouched,
|
|
89
|
+
isDirty,
|
|
90
|
+
resetTouched: (0, react.useCallback)(() => setTouched(false), [])
|
|
91
|
+
};
|
|
130
92
|
}
|
|
131
|
-
|
|
93
|
+
//#endregion
|
|
132
94
|
exports.useField = useField;
|
|
133
|
-
|
|
95
|
+
|
|
96
|
+
//# sourceMappingURL=use-field.cjs.map
|
package/cjs/use-field.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-field.cjs","sources":["../src/use-field.ts"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from 'react';\nimport { getInputOnChange } from './get-input-on-change';\nimport { FormMode, GetInputPropsType } from './types';\nimport { shouldValidateOnChange } from './validate';\n\ntype UseFieldErrorResolver = (error: unknown) => React.ReactNode;\n\nexport interface UseFieldInput<\n T,\n FieldType extends GetInputPropsType = 'input',\n Mode extends FormMode = 'controlled',\n> {\n /** Field mode, controlled by default */\n mode?: Mode;\n\n /** Initial field value */\n initialValue: T;\n\n /** Initial touched value */\n initialTouched?: boolean;\n\n /** Initial field error message */\n initialError?: React.ReactNode;\n\n /** Called with updated value when the field value changes */\n onValueChange?: (value: T) => void;\n\n /** Determines whether the field should be validated when value changes, false by default */\n validateOnChange?: boolean;\n\n /** Determines whether the field should be validated when it loses focus, false by default */\n validateOnBlur?: boolean;\n\n /** Determines whether the field should clear error message when value changes, true by default */\n clearErrorOnChange?: boolean;\n\n /** A function to validate field value, can be sync or async */\n validate?: (value: T) => React.ReactNode | Promise<React.ReactNode>;\n\n /** Field type, input by default */\n type?: FieldType;\n\n /** A function to resolve validation error from the result returned from validate function, should return react node */\n resolveValidationError?: UseFieldErrorResolver;\n}\n\ninterface SetValueOptions {\n updateState?: boolean;\n updateKey?: boolean;\n}\n\ninterface GetInputPropsOptions {\n withError?: boolean;\n withFocus?: boolean;\n [key: string]: any;\n}\n\ninterface GetInputPropsSharedReturn {\n error?: React.ReactNode;\n onFocus?: () => void;\n onBlur: () => void;\n onChange: (value: any) => void;\n}\n\ntype GetInputPropsTypeValue<\n T,\n FieldType extends GetInputPropsType,\n Mode extends FormMode,\n> = FieldType extends 'checkbox'\n ? Mode extends 'controlled'\n ? { checked: boolean }\n : { defaultChecked: boolean }\n : FieldType extends 'radio'\n ? Mode extends 'controlled'\n ? { checked: boolean; value: T }\n : { defaultChecked: boolean; value: T }\n : Mode extends 'controlled'\n ? { value: T }\n : { defaultValue: T };\n\ntype GetInputPropsReturnType<\n T,\n FieldType extends GetInputPropsType,\n Mode extends FormMode,\n> = GetInputPropsSharedReturn & GetInputPropsTypeValue<T, FieldType, Mode>;\n\nexport interface UseFieldReturnType<\n T,\n FieldType extends GetInputPropsType = 'input',\n Mode extends FormMode = 'controlled',\n> {\n /** Returns props to pass to the input element */\n getInputProps: (options?: GetInputPropsOptions) => GetInputPropsReturnType<T, FieldType, Mode>;\n\n /** Returns current input value */\n getValue: () => T;\n\n /** Sets input value to the given value */\n setValue: (value: T) => void;\n\n /** Resets field value to initial state, sets touched state to false, sets error to null */\n reset: () => void;\n\n /** Validates current input value when called */\n validate: () => Promise<React.ReactNode | void>;\n\n /** Set to true when async validate function is called, stays true until the returned promise resolves */\n isValidating: boolean;\n\n /** Current error message */\n error: React.ReactNode;\n\n /** Sets error message to the given react node */\n setError: (error: React.ReactNode) => void;\n\n /** Returns true if the input has been focused at least once */\n isTouched: () => boolean;\n\n /** Returns true if input value is different from the initial value */\n isDirty: () => boolean;\n\n /** Resets touched state to false */\n resetTouched: () => void;\n\n /** Key that should be added to the input when mode is uncontrolled */\n key: number;\n}\n\nexport function useField<\n T,\n Mode extends FormMode = 'controlled',\n FieldType extends GetInputPropsType = 'input',\n>({\n mode = 'controlled' as Mode,\n clearErrorOnChange = true,\n initialValue,\n initialError = null,\n initialTouched = false,\n onValueChange,\n validateOnChange = false,\n validateOnBlur = false,\n validate,\n resolveValidationError,\n type = 'input' as FieldType,\n}: UseFieldInput<T, FieldType, Mode>): UseFieldReturnType<T, FieldType, Mode> {\n const [valueState, setValueState] = useState(initialValue);\n const valueRef = useRef(valueState);\n const [key, setKey] = useState(0);\n const [error, setError] = useState<React.ReactNode>(initialError || null);\n const touchedRef = useRef(initialTouched || false);\n const [, setTouchedState] = useState(touchedRef.current);\n const [isValidating, setIsValidating] = useState(false);\n const errorResolver: UseFieldErrorResolver = useMemo(\n () => resolveValidationError || ((err) => err as React.ReactNode),\n [resolveValidationError]\n );\n\n const setTouched = useCallback((val: boolean, { updateState = mode === 'controlled' } = {}) => {\n touchedRef.current = val;\n updateState && setTouchedState(val);\n }, []);\n\n const setValue = useCallback(\n (\n value: T,\n {\n updateKey = mode === 'uncontrolled',\n updateState = mode === 'controlled',\n }: SetValueOptions = {}\n ) => {\n if (valueRef.current === value) {\n return;\n }\n\n valueRef.current = value;\n\n onValueChange?.(value);\n\n if (clearErrorOnChange && error !== null) {\n setError(null);\n }\n\n if (updateState) {\n setValueState(value);\n }\n\n if (updateKey) {\n setKey((currentKey) => currentKey + 1);\n }\n\n if (validateOnChange) {\n _validate();\n }\n },\n [error, clearErrorOnChange, onValueChange]\n );\n\n const reset = useCallback(() => {\n setValue(initialValue);\n setError(null);\n setTouched(false);\n }, [initialValue]);\n\n const getValue = useCallback(() => valueRef.current, []);\n\n const isTouched = useCallback(() => touchedRef.current, []);\n\n const isDirty = useCallback(() => valueRef.current !== initialValue, [initialValue]);\n\n const _validate = useCallback(async () => {\n const validationResult = validate?.(valueRef.current);\n\n if (validationResult instanceof Promise) {\n setIsValidating(true);\n try {\n const result = await validationResult;\n setIsValidating(false);\n setError(result);\n } catch (err) {\n setIsValidating(false);\n const resolvedError = errorResolver(err);\n setError(resolvedError);\n return resolvedError;\n }\n } else {\n setError(validationResult);\n return validationResult;\n }\n }, []);\n\n const getInputProps = ({ withError = true, withFocus = true, ...otherOptions }: any = {}) => {\n const onChange = getInputOnChange<T>((val) => setValue(val as any, { updateKey: false }));\n\n const payload: any = { onChange };\n\n if (withError) {\n payload.error = error;\n }\n\n if (type === 'checkbox') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] = valueRef.current;\n } else if (type === 'radio') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] =\n valueRef.current === otherOptions.value;\n payload.value = otherOptions.value;\n } else {\n payload[mode === 'controlled' ? 'value' : 'defaultValue'] = valueRef.current;\n }\n\n if (withFocus) {\n payload.onFocus = () => {\n setTouched(true);\n };\n\n payload.onBlur = () => {\n if (shouldValidateOnChange('', !!validateOnBlur)) {\n _validate();\n }\n };\n }\n\n return payload;\n };\n\n const resetTouched = useCallback(() => setTouched(false), []);\n\n return {\n key,\n getValue,\n setValue,\n reset,\n getInputProps,\n\n isValidating,\n validate: _validate,\n\n error,\n setError,\n\n isTouched,\n isDirty,\n resetTouched,\n };\n}\n"],"names":["useState","useRef","useMemo","useCallback","getInputOnChange","shouldValidateOnChange"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-field.cjs","names":["getInputOnChange","shouldValidateOnChange"],"sources":["../src/use-field.ts"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from 'react';\nimport { getInputOnChange } from './get-input-on-change';\nimport { FormMode, GetInputPropsType } from './types';\nimport { shouldValidateOnChange } from './validate';\n\ntype UseFieldErrorResolver = (error: unknown) => React.ReactNode;\n\nexport interface UseFieldInput<\n T,\n FieldType extends GetInputPropsType = 'input',\n Mode extends FormMode = 'controlled',\n> {\n /** Field mode, controlled by default */\n mode?: Mode;\n\n /** Initial field value */\n initialValue: T;\n\n /** Initial touched value */\n initialTouched?: boolean;\n\n /** Initial field error message */\n initialError?: React.ReactNode;\n\n /** Called with updated value when the field value changes */\n onValueChange?: (value: T) => void;\n\n /** Determines whether the field should be validated when value changes, false by default */\n validateOnChange?: boolean;\n\n /** Determines whether the field should be validated when it loses focus, false by default */\n validateOnBlur?: boolean;\n\n /** Determines whether the field should clear error message when value changes, true by default */\n clearErrorOnChange?: boolean;\n\n /** A function to validate field value, can be sync or async */\n validate?: (value: T) => React.ReactNode | Promise<React.ReactNode>;\n\n /** Field type, input by default */\n type?: FieldType;\n\n /** A function to resolve validation error from the result returned from validate function, should return react node */\n resolveValidationError?: UseFieldErrorResolver;\n}\n\ninterface SetValueOptions {\n updateState?: boolean;\n updateKey?: boolean;\n}\n\ninterface GetInputPropsOptions {\n withError?: boolean;\n withFocus?: boolean;\n [key: string]: any;\n}\n\ninterface GetInputPropsSharedReturn {\n error?: React.ReactNode;\n onFocus?: () => void;\n onBlur: () => void;\n onChange: (value: any) => void;\n}\n\ntype GetInputPropsTypeValue<\n T,\n FieldType extends GetInputPropsType,\n Mode extends FormMode,\n> = FieldType extends 'checkbox'\n ? Mode extends 'controlled'\n ? { checked: boolean }\n : { defaultChecked: boolean }\n : FieldType extends 'radio'\n ? Mode extends 'controlled'\n ? { checked: boolean; value: T }\n : { defaultChecked: boolean; value: T }\n : Mode extends 'controlled'\n ? { value: T }\n : { defaultValue: T };\n\ntype GetInputPropsReturnType<\n T,\n FieldType extends GetInputPropsType,\n Mode extends FormMode,\n> = GetInputPropsSharedReturn & GetInputPropsTypeValue<T, FieldType, Mode>;\n\nexport interface UseFieldReturnType<\n T,\n FieldType extends GetInputPropsType = 'input',\n Mode extends FormMode = 'controlled',\n> {\n /** Returns props to pass to the input element */\n getInputProps: (options?: GetInputPropsOptions) => GetInputPropsReturnType<T, FieldType, Mode>;\n\n /** Returns current input value */\n getValue: () => T;\n\n /** Sets input value to the given value */\n setValue: (value: T) => void;\n\n /** Resets field value to initial state, sets touched state to false, sets error to null */\n reset: () => void;\n\n /** Validates current input value when called */\n validate: () => Promise<React.ReactNode | void>;\n\n /** Set to true when async validate function is called, stays true until the returned promise resolves */\n isValidating: boolean;\n\n /** Current error message */\n error: React.ReactNode;\n\n /** Sets error message to the given react node */\n setError: (error: React.ReactNode) => void;\n\n /** Returns true if the input has been focused at least once */\n isTouched: () => boolean;\n\n /** Returns true if input value is different from the initial value */\n isDirty: () => boolean;\n\n /** Resets touched state to false */\n resetTouched: () => void;\n\n /** Key that should be added to the input when mode is uncontrolled */\n key: number;\n}\n\nexport function useField<\n T,\n Mode extends FormMode = 'controlled',\n FieldType extends GetInputPropsType = 'input',\n>({\n mode = 'controlled' as Mode,\n clearErrorOnChange = true,\n initialValue,\n initialError = null,\n initialTouched = false,\n onValueChange,\n validateOnChange = false,\n validateOnBlur = false,\n validate,\n resolveValidationError,\n type = 'input' as FieldType,\n}: UseFieldInput<T, FieldType, Mode>): UseFieldReturnType<T, FieldType, Mode> {\n const [valueState, setValueState] = useState(initialValue);\n const valueRef = useRef(valueState);\n const [key, setKey] = useState(0);\n const [error, setError] = useState<React.ReactNode>(initialError || null);\n const touchedRef = useRef(initialTouched || false);\n const [, setTouchedState] = useState(touchedRef.current);\n const [isValidating, setIsValidating] = useState(false);\n const errorResolver: UseFieldErrorResolver = useMemo(\n () => resolveValidationError || ((err) => err as React.ReactNode),\n [resolveValidationError]\n );\n\n const setTouched = useCallback((val: boolean, { updateState = mode === 'controlled' } = {}) => {\n touchedRef.current = val;\n updateState && setTouchedState(val);\n }, []);\n\n const setValue = useCallback(\n (\n value: T,\n {\n updateKey = mode === 'uncontrolled',\n updateState = mode === 'controlled',\n }: SetValueOptions = {}\n ) => {\n if (valueRef.current === value) {\n return;\n }\n\n valueRef.current = value;\n\n onValueChange?.(value);\n\n if (clearErrorOnChange && error !== null) {\n setError(null);\n }\n\n if (updateState) {\n setValueState(value);\n }\n\n if (updateKey) {\n setKey((currentKey) => currentKey + 1);\n }\n\n if (validateOnChange) {\n _validate();\n }\n },\n [error, clearErrorOnChange, onValueChange]\n );\n\n const reset = useCallback(() => {\n setValue(initialValue);\n setError(null);\n setTouched(false);\n }, [initialValue]);\n\n const getValue = useCallback(() => valueRef.current, []);\n\n const isTouched = useCallback(() => touchedRef.current, []);\n\n const isDirty = useCallback(() => valueRef.current !== initialValue, [initialValue]);\n\n const _validate = useCallback(async () => {\n const validationResult = validate?.(valueRef.current);\n\n if (validationResult instanceof Promise) {\n setIsValidating(true);\n try {\n const result = await validationResult;\n setIsValidating(false);\n setError(result);\n } catch (err) {\n setIsValidating(false);\n const resolvedError = errorResolver(err);\n setError(resolvedError);\n return resolvedError;\n }\n } else {\n setError(validationResult);\n return validationResult;\n }\n }, []);\n\n const getInputProps = ({ withError = true, withFocus = true, ...otherOptions }: any = {}) => {\n const onChange = getInputOnChange<T>((val) => setValue(val as any, { updateKey: false }));\n\n const payload: any = { onChange };\n\n if (withError) {\n payload.error = error;\n }\n\n if (type === 'checkbox') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] = valueRef.current;\n } else if (type === 'radio') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] =\n valueRef.current === otherOptions.value;\n payload.value = otherOptions.value;\n } else {\n payload[mode === 'controlled' ? 'value' : 'defaultValue'] = valueRef.current;\n }\n\n if (withFocus) {\n payload.onFocus = () => {\n setTouched(true);\n };\n\n payload.onBlur = () => {\n if (shouldValidateOnChange('', !!validateOnBlur)) {\n _validate();\n }\n };\n }\n\n return payload;\n };\n\n const resetTouched = useCallback(() => setTouched(false), []);\n\n return {\n key,\n getValue,\n setValue,\n reset,\n getInputProps,\n\n isValidating,\n validate: _validate,\n\n error,\n setError,\n\n isTouched,\n isDirty,\n resetTouched,\n };\n}\n"],"mappings":"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"}
|