@ekz/formix 2.1.1 → 2.1.2

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.
Files changed (73) hide show
  1. package/lib/cjs/FieldState.d.ts +17 -0
  2. package/lib/cjs/FieldState.js +33 -0
  3. package/lib/cjs/FieldState.js.map +1 -0
  4. package/lib/cjs/fields.d.ts +15 -0
  5. package/lib/cjs/fields.js +121 -0
  6. package/lib/cjs/fields.js.map +1 -0
  7. package/lib/cjs/form.d.ts +13 -0
  8. package/lib/cjs/form.js +119 -0
  9. package/lib/cjs/form.js.map +1 -0
  10. package/lib/cjs/index.d.ts +5 -0
  11. package/lib/cjs/index.js +25 -0
  12. package/lib/cjs/index.js.map +1 -0
  13. package/lib/cjs/references.d.ts +5 -0
  14. package/lib/cjs/references.js +34 -0
  15. package/lib/cjs/references.js.map +1 -0
  16. package/lib/cjs/types.d.ts +111 -0
  17. package/lib/cjs/types.js +3 -0
  18. package/lib/cjs/types.js.map +1 -0
  19. package/lib/cjs/validation/fields.d.ts +5 -0
  20. package/lib/cjs/validation/fields.js +114 -0
  21. package/lib/cjs/validation/fields.js.map +1 -0
  22. package/lib/cjs/validation/form.d.ts +2 -0
  23. package/lib/cjs/validation/form.js +62 -0
  24. package/lib/cjs/validation/form.js.map +1 -0
  25. package/lib/esm/FieldState.d.ts +17 -0
  26. package/lib/esm/FieldState.js +30 -0
  27. package/lib/esm/FieldState.js.map +1 -0
  28. package/lib/esm/fields.d.ts +15 -0
  29. package/lib/esm/fields.js +114 -0
  30. package/lib/esm/fields.js.map +1 -0
  31. package/lib/esm/form.d.ts +13 -0
  32. package/lib/esm/form.js +111 -0
  33. package/lib/esm/form.js.map +1 -0
  34. package/lib/esm/index.d.ts +5 -0
  35. package/lib/esm/index.js +5 -0
  36. package/lib/esm/index.js.map +1 -0
  37. package/lib/esm/references.d.ts +5 -0
  38. package/lib/esm/references.js +27 -0
  39. package/lib/esm/references.js.map +1 -0
  40. package/lib/esm/types.d.ts +111 -0
  41. package/lib/esm/types.js +2 -0
  42. package/lib/esm/types.js.map +1 -0
  43. package/lib/esm/validation/fields.d.ts +5 -0
  44. package/lib/esm/validation/fields.js +107 -0
  45. package/lib/esm/validation/fields.js.map +1 -0
  46. package/lib/esm/validation/form.d.ts +2 -0
  47. package/lib/esm/validation/form.js +58 -0
  48. package/lib/esm/validation/form.js.map +1 -0
  49. package/lib/esnext/FieldState.d.ts +17 -0
  50. package/lib/esnext/FieldState.js +34 -0
  51. package/lib/esnext/FieldState.js.map +1 -0
  52. package/lib/esnext/fields.d.ts +15 -0
  53. package/lib/esnext/fields.js +114 -0
  54. package/lib/esnext/fields.js.map +1 -0
  55. package/lib/esnext/form.d.ts +13 -0
  56. package/lib/esnext/form.js +111 -0
  57. package/lib/esnext/form.js.map +1 -0
  58. package/lib/esnext/index.d.ts +5 -0
  59. package/lib/esnext/index.js +5 -0
  60. package/lib/esnext/index.js.map +1 -0
  61. package/lib/esnext/references.d.ts +5 -0
  62. package/lib/esnext/references.js +29 -0
  63. package/lib/esnext/references.js.map +1 -0
  64. package/lib/esnext/types.d.ts +111 -0
  65. package/lib/esnext/types.js +2 -0
  66. package/lib/esnext/types.js.map +1 -0
  67. package/lib/esnext/validation/fields.d.ts +5 -0
  68. package/lib/esnext/validation/fields.js +107 -0
  69. package/lib/esnext/validation/fields.js.map +1 -0
  70. package/lib/esnext/validation/form.d.ts +2 -0
  71. package/lib/esnext/validation/form.js +58 -0
  72. package/lib/esnext/validation/form.js.map +1 -0
  73. package/package.json +3 -3
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useFieldValidation = useFieldValidation;
4
+ exports.useAsyncFieldValidation = useAsyncFieldValidation;
5
+ exports.useFieldStateValidation = useFieldStateValidation;
6
+ exports.useAsyncFieldStateValidation = useAsyncFieldStateValidation;
7
+ const tslib_1 = require("tslib");
8
+ const React = tslib_1.__importStar(require("react"));
9
+ const form_1 = require("../form");
10
+ function useFieldValidation(fieldRef, validate, deps) {
11
+ const { getValues, registerValidation } = (0, form_1.useForm)();
12
+ const value = getValues(fieldRef);
13
+ const dependentValues = React.useMemo(() => {
14
+ return (deps ?? []).map(getValues);
15
+ // eslint-disable-next-line react-hooks/exhaustive-deps
16
+ }, [getValues, ...(deps ?? [])]);
17
+ const error = React.useMemo(() => {
18
+ return validate(value, dependentValues);
19
+ // validate should not be considered for changes
20
+ // eslint-disable-next-line react-hooks/exhaustive-deps
21
+ }, [value, ...dependentValues]);
22
+ const validation = React.useMemo(() => ({
23
+ fieldRef,
24
+ error,
25
+ pending: false
26
+ }), [fieldRef, error]);
27
+ React.useLayoutEffect(() => registerValidation(validation), [registerValidation, validation]);
28
+ }
29
+ function useAsyncValidationResult(validate, debounceMs, deps) {
30
+ const [result, setResult] = React.useState({
31
+ pending: false,
32
+ error: null
33
+ });
34
+ React.useEffect(() => {
35
+ let mounted = true;
36
+ setResult((previous) => ({ pending: true, error: previous.error }));
37
+ const timeoutId = setTimeout(() => {
38
+ validate()
39
+ .then((error) => {
40
+ if (mounted) {
41
+ setResult({ pending: false, error: error });
42
+ }
43
+ })
44
+ .catch((error) => {
45
+ if (mounted) {
46
+ setResult({ pending: false, error: 'Unexpected error' });
47
+ }
48
+ console.warn('[Unhandled Validation Error]', error);
49
+ console.warn('An async validator should never throw, but it should resolve with the validation result.');
50
+ });
51
+ }, debounceMs);
52
+ return () => {
53
+ mounted = false;
54
+ clearTimeout(timeoutId);
55
+ };
56
+ // validate should not be considered for changes
57
+ // eslint-disable-next-line react-hooks/exhaustive-deps
58
+ }, [debounceMs, ...deps]);
59
+ return result;
60
+ }
61
+ function useAsyncFieldValidation(fieldRef, validate, deps, debounceMs = 200) {
62
+ const { getValues, registerValidation } = (0, form_1.useForm)();
63
+ const value = getValues(fieldRef);
64
+ const dependentValues = React.useMemo(() => {
65
+ return (deps ?? []).map(getValues);
66
+ // eslint-disable-next-line react-hooks/exhaustive-deps
67
+ }, [getValues, ...(deps ?? [])]);
68
+ const result = useAsyncValidationResult(() => {
69
+ return validate(value, dependentValues);
70
+ }, debounceMs, [value, ...dependentValues]);
71
+ const validation = React.useMemo(() => ({
72
+ fieldRef,
73
+ error: result.error,
74
+ pending: result.pending
75
+ }), [fieldRef, result.error, result.pending]);
76
+ React.useLayoutEffect(() => registerValidation(validation), [registerValidation, validation]);
77
+ }
78
+ function useFieldStateValidation(fieldRef, validate, deps) {
79
+ const { getStates, registerValidation } = (0, form_1.useForm)();
80
+ const fieldState = getStates(fieldRef);
81
+ const dependentStates = React.useMemo(() => {
82
+ return (deps ?? []).map(getStates);
83
+ // eslint-disable-next-line react-hooks/exhaustive-deps
84
+ }, [getStates, ...(deps ?? [])]);
85
+ const error = React.useMemo(() => {
86
+ return validate(fieldState, dependentStates);
87
+ // validate should not be considered for changes
88
+ // eslint-disable-next-line react-hooks/exhaustive-deps
89
+ }, [fieldState, ...dependentStates]);
90
+ const validation = React.useMemo(() => ({
91
+ fieldRef,
92
+ error,
93
+ pending: false
94
+ }), [fieldRef, error]);
95
+ React.useLayoutEffect(() => registerValidation(validation), [registerValidation, validation]);
96
+ }
97
+ function useAsyncFieldStateValidation(fieldRef, validate, deps, debounceMs = 200) {
98
+ const { getStates, registerValidation } = (0, form_1.useForm)();
99
+ const fieldState = getStates(fieldRef);
100
+ const dependentValues = React.useMemo(() => {
101
+ return (deps ?? []).map(getStates);
102
+ // eslint-disable-next-line react-hooks/exhaustive-deps
103
+ }, [getStates, ...(deps ?? [])]);
104
+ const result = useAsyncValidationResult(() => {
105
+ return validate(fieldState, dependentValues);
106
+ }, debounceMs, [fieldState, ...dependentValues]);
107
+ const validation = React.useMemo(() => ({
108
+ fieldRef,
109
+ error: result.error,
110
+ pending: result.pending
111
+ }), [fieldRef, result.error, result.pending]);
112
+ React.useLayoutEffect(() => registerValidation(validation), [registerValidation, validation]);
113
+ }
114
+ //# sourceMappingURL=fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fields.js","sourceRoot":"","sources":["../../../src/main/web/validation/fields.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { FormApi, FormValidationApi } from '../types';
2
+ export declare function useFormValidation(getFieldState: FormApi['getFieldState']): FormValidationApi;
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useFormValidation = useFormValidation;
4
+ const tslib_1 = require("tslib");
5
+ const immutable_1 = require("immutable");
6
+ const React = tslib_1.__importStar(require("react"));
7
+ const references_1 = require("../references");
8
+ function useFormValidation(getFieldState) {
9
+ const [validations, setValidations] = React.useState(immutable_1.Map);
10
+ const registerValidation = React.useCallback((validation) => {
11
+ setValidations((previous) => previous.update(validation.fieldRef, (0, immutable_1.OrderedSet)(), (validations) => validations.add(validation)));
12
+ return () => setValidations((previous) => previous.update(validation.fieldRef, (0, immutable_1.OrderedSet)(), (validations) => validations.remove(validation)));
13
+ }, []);
14
+ const getValidationResult = React.useCallback((fieldRef) => {
15
+ const result = validations.get(fieldRef, (0, immutable_1.OrderedSet)()).reduce((result, validation) => ({
16
+ error: result.error || validation.error,
17
+ pending: result.pending || validation.pending
18
+ }), EmptyValidationResult);
19
+ // The reduce allocates a fresh object even for a passing field, which makes every
20
+ // `useField` on a validated field unstable across renders. Collapse the no-error,
21
+ // no-pending case back to the frozen singleton so identity stays stable.
22
+ return result.error == null && !result.pending ? EmptyValidationResult : result;
23
+ }, [validations]);
24
+ const isFieldValid = React.useCallback((fieldRef) => {
25
+ function flatten(field) {
26
+ if ((0, references_1.isArrayFieldRef)(field)) {
27
+ return getFieldState(field).value.flatMap(flatten);
28
+ }
29
+ else if ((0, references_1.isFieldRef)(field)) {
30
+ return immutable_1.List.of(field);
31
+ }
32
+ else {
33
+ return immutable_1.Seq.Keyed(field).valueSeq().flatMap(flatten).toList();
34
+ }
35
+ }
36
+ const fields = flatten(fieldRef).toSet();
37
+ return validations
38
+ .filter((_, field) => fields.has(field))
39
+ .valueSeq()
40
+ .flatMap((v) => v)
41
+ .every((v) => v.error == null && !v.pending);
42
+ }, [getFieldState, validations]);
43
+ const pending = React.useMemo(() => {
44
+ return validations
45
+ .valueSeq()
46
+ .flatMap((v) => v)
47
+ .some((v) => v.pending);
48
+ }, [validations]);
49
+ const valid = React.useMemo(() => {
50
+ return (!pending &&
51
+ validations
52
+ .valueSeq()
53
+ .flatMap((v) => v)
54
+ .every((v) => v.error == null));
55
+ }, [pending, validations]);
56
+ return { registerValidation, getValidationResult, isFieldValid, valid, pending };
57
+ }
58
+ const EmptyValidationResult = Object.freeze({
59
+ error: null,
60
+ pending: false
61
+ });
62
+ //# sourceMappingURL=form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.js","sourceRoot":"","sources":["../../../src/main/web/validation/form.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { FieldMetadata, FieldValue, FieldState as IFieldState } from './types';
2
+ export default class FieldState<T> implements IFieldState<T> {
3
+ readonly value: T;
4
+ readonly disabled: boolean;
5
+ readonly active: boolean;
6
+ readonly touched: boolean;
7
+ constructor(value: T, disabled: boolean, active: boolean, touched: boolean);
8
+ updated(fields: Partial<FieldValue<T> & FieldMetadata>): FieldState<T>;
9
+ /**
10
+ * `equals` only takes the value and disabled properties into consideration.
11
+ */
12
+ equals(other: FieldState<T> | null | undefined): boolean;
13
+ /**
14
+ * `hashCode` only takes the value and disabled properties into consideration.
15
+ */
16
+ hashCode(): number;
17
+ }
@@ -0,0 +1,30 @@
1
+ import { hash, is } from 'immutable';
2
+ export default class FieldState {
3
+ constructor(value, disabled, active, touched) {
4
+ this.value = value;
5
+ this.disabled = disabled;
6
+ this.active = active;
7
+ this.touched = touched;
8
+ this.value = value;
9
+ this.disabled = disabled;
10
+ this.active = active;
11
+ this.touched = touched;
12
+ }
13
+ updated(fields) {
14
+ const o = { value: this.value, ...fields };
15
+ return new FieldState(o.value, fields.disabled ?? this.disabled, fields.active ?? this.active, fields.touched ?? this.touched);
16
+ }
17
+ /**
18
+ * `equals` only takes the value and disabled properties into consideration.
19
+ */
20
+ equals(other) {
21
+ return other != null && is(this.value, other.value) && this.disabled === other.disabled;
22
+ }
23
+ /**
24
+ * `hashCode` only takes the value and disabled properties into consideration.
25
+ */
26
+ hashCode() {
27
+ return hash(this.value) & hash(this.disabled);
28
+ }
29
+ }
30
+ //# sourceMappingURL=FieldState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldState.js","sourceRoot":"","sources":["../../src/main/web/FieldState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AAIrC,MAAM,CAAC,OAAO,OAAO,UAAU;IAC3B,YACoB,KAAQ,EACR,QAAiB,EACjB,MAAe,EACf,OAAgB;QAHhB,UAAK,GAAL,KAAK,CAAG;QACR,aAAQ,GAAR,QAAQ,CAAS;QACjB,WAAM,GAAN,MAAM,CAAS;QACf,YAAO,GAAP,OAAO,CAAS;QAEhC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED,OAAO,CAAC,MAA8C;QAClD,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,MAAM,EAAE,CAAC;QAC3C,OAAO,IAAI,UAAU,CACjB,CAAC,CAAC,KAAK,EACP,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAChC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,EAC5B,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CACjC,CAAC;IACN,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAuC;QAC1C,OAAO,KAAK,IAAI,IAAI,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,CAAC;IAC5F,CAAC;IAED;;OAEG;IACH,QAAQ;QACJ,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC;CACJ"}
@@ -0,0 +1,15 @@
1
+ import * as React from 'react';
2
+ import type { ArrayField, ArrayFieldRef, Field, FieldRef, GenericFieldRef } from './types';
3
+ export declare function useField<T>(fieldRef: FieldRef<T>): Field<T>;
4
+ export declare function useArrayField<T extends GenericFieldRef, V>(fieldRef: ArrayFieldRef<T, V>): ArrayField<T, V>;
5
+ type UseFieldProps<T> = {
6
+ field: FieldRef<T>;
7
+ render(field: Field<T>): React.ReactNode;
8
+ };
9
+ export declare function UseField<T>(props: UseFieldProps<T>): React.ReactElement;
10
+ type UseArrayFieldProps<T extends GenericFieldRef, V> = {
11
+ field: ArrayFieldRef<T, V>;
12
+ render(field: ArrayField<T, V>): React.ReactNode;
13
+ };
14
+ export declare function UseArrayField<T extends GenericFieldRef, V>(props: UseArrayFieldProps<T, V>): React.ReactElement;
15
+ export {};
@@ -0,0 +1,114 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from 'react';
3
+ import { useForm } from './form';
4
+ export function useField(fieldRef) {
5
+ const { getFieldState, setFieldState, getValidationResult } = useForm();
6
+ const fieldState = getFieldState(fieldRef);
7
+ const validationResult = getValidationResult(fieldRef);
8
+ const setValue = React.useCallback((value) => {
9
+ setFieldState(fieldRef, (previousState) => {
10
+ const nextValue =
11
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
12
+ // @ts-ignore
13
+ typeof value === 'function' ? value(previousState.value) : value;
14
+ return previousState.value === nextValue
15
+ ? previousState
16
+ : previousState.updated({
17
+ value: nextValue,
18
+ touched: true
19
+ });
20
+ });
21
+ }, [fieldRef, setFieldState]);
22
+ const setDisabled = React.useCallback((disabled) => setFieldState(fieldRef, (state) => state.updated({ disabled })), [fieldRef, setFieldState]);
23
+ const onFocus = React.useCallback(() => setFieldState(fieldRef, (state) => state.updated({ active: true, touched: true })), [fieldRef, setFieldState]);
24
+ const onBlur = React.useCallback(() => setFieldState(fieldRef, (state) => state.updated({ active: false })), [fieldRef, setFieldState]);
25
+ return React.useMemo(() => ({
26
+ value: fieldState.value,
27
+ ...validationResult,
28
+ disabled: fieldState.disabled,
29
+ active: fieldState.active,
30
+ touched: fieldState.touched,
31
+ setValue,
32
+ setDisabled,
33
+ onFocus,
34
+ onBlur
35
+ }), [fieldState, validationResult, setValue, setDisabled, onFocus, onBlur]);
36
+ }
37
+ export function useArrayField(fieldRef) {
38
+ const { getValidationResult } = useForm();
39
+ const { value: items, setValue, disabled, active, touched, setDisabled, onBlur, onFocus } = useField(fieldRef);
40
+ const validationResult = getValidationResult(fieldRef);
41
+ const unshift = React.useCallback((value) => {
42
+ const item = fieldRef.itemTemplate(value);
43
+ setValue((previous) => previous.unshift(item));
44
+ return item;
45
+ }, [setValue, fieldRef]);
46
+ const push = React.useCallback((value) => {
47
+ const item = fieldRef.itemTemplate(value);
48
+ setValue((previous) => previous.push(item));
49
+ return item;
50
+ }, [setValue, fieldRef]);
51
+ const insert = React.useCallback((index, value) => {
52
+ const item = fieldRef.itemTemplate(value);
53
+ setValue((items) => items.insert(index, item));
54
+ return item;
55
+ }, [setValue, fieldRef]);
56
+ const remove = React.useCallback((value) => {
57
+ setValue((previous) => {
58
+ const index = previous.indexOf(value);
59
+ return index !== -1 ? previous.remove(index) : previous;
60
+ });
61
+ }, [setValue]);
62
+ const swap = React.useCallback((indexA, indexB) => {
63
+ setValue((previous) => {
64
+ const itemA = previous.get(indexA);
65
+ const itemB = previous.get(indexB);
66
+ if (itemA == null || itemB == null) {
67
+ throw new Error('Invalid element access');
68
+ }
69
+ return previous
70
+ .remove(indexA)
71
+ .insert(indexA, itemB)
72
+ .remove(indexB)
73
+ .insert(indexB, itemA);
74
+ });
75
+ }, [setValue]);
76
+ return React.useMemo(() => ({
77
+ items,
78
+ ...validationResult,
79
+ unshift,
80
+ push,
81
+ insert,
82
+ remove,
83
+ swap,
84
+ disabled,
85
+ active,
86
+ touched,
87
+ setDisabled,
88
+ onBlur,
89
+ onFocus
90
+ }), [
91
+ items,
92
+ validationResult,
93
+ unshift,
94
+ push,
95
+ insert,
96
+ remove,
97
+ swap,
98
+ disabled,
99
+ active,
100
+ touched,
101
+ setDisabled,
102
+ onBlur,
103
+ onFocus
104
+ ]);
105
+ }
106
+ export function UseField(props) {
107
+ const field = useField(props.field);
108
+ return _jsx(React.Fragment, { children: props.render(field) });
109
+ }
110
+ export function UseArrayField(props) {
111
+ const field = useArrayField(props.field);
112
+ return _jsx(React.Fragment, { children: props.render(field) });
113
+ }
114
+ //# sourceMappingURL=fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fields.js","sourceRoot":"","sources":["../../src/main/web/fields.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import * as React from 'react';
2
+ import type { GenericFieldRef, FormApi, FormWithFields } from './types';
3
+ export declare function FormProvider(props: {
4
+ children: React.ReactNode;
5
+ }): React.ReactElement;
6
+ export declare function useForm(): FormApi;
7
+ export declare function useFormWithFields<Deps extends unknown[], F extends GenericFieldRef>(fieldsCreator: (...deps: [...Deps]) => F, deps: [...Deps]): FormWithFields<F>;
8
+ export declare function withForm<Props>(Component: React.ComponentType<Props>): React.ComponentType<Props>;
9
+ type UseFormProps = {
10
+ children: (form: FormApi) => React.ReactNode;
11
+ };
12
+ export declare function UseForm(props: UseFormProps): React.ReactElement;
13
+ export {};
@@ -0,0 +1,111 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Map, Seq } from 'immutable';
3
+ import * as React from 'react';
4
+ import { isArrayFieldRef, isFieldRef } from './references';
5
+ import { useFormValidation } from './validation/form';
6
+ function useFormApi() {
7
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
8
+ const [fieldStates, setFieldStates] = React.useState(Map);
9
+ const getFieldState = React.useCallback(function getFieldState(fieldRef) {
10
+ return fieldStates.get(fieldRef, fieldRef.initialState);
11
+ }, [fieldStates]);
12
+ const getFieldValue = React.useCallback((fieldRef) => getFieldState(fieldRef).value, [getFieldState]);
13
+ const setFieldState = React.useCallback(function setFieldState(fieldRef, state) {
14
+ setFieldStates((xs) => typeof state === 'function'
15
+ ? xs.update(fieldRef, fieldRef.initialState, state)
16
+ : xs.set(fieldRef, state));
17
+ }, []);
18
+ const extract = React.useCallback((fields, type) => {
19
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
20
+ function extractField(field) {
21
+ if (isArrayFieldRef(field)) {
22
+ return getFieldState(field).value.map(extractField);
23
+ }
24
+ else if (isFieldRef(field)) {
25
+ const state = getFieldState(field);
26
+ return type === 'value' ? state.value : state;
27
+ }
28
+ else {
29
+ return Seq.Keyed(field)
30
+ .map((value) => extractField(value))
31
+ .toObject();
32
+ }
33
+ }
34
+ return extractField(fields);
35
+ }, [getFieldState]);
36
+ const getStates = React.useCallback((fields) => extract(fields, 'state'), [extract]);
37
+ const getValues = React.useCallback((fields) => extract(fields, 'value'), [extract]);
38
+ const reset = React.useCallback(() => setFieldStates(Map()), [setFieldStates]);
39
+ const modified = React.useMemo(() => {
40
+ return fieldStates.some((state, fieldRef) => !state.equals(fieldRef.initialState));
41
+ }, [fieldStates]);
42
+ const formValidation = useFormValidation(getFieldState);
43
+ return React.useMemo(() => ({
44
+ getFieldState,
45
+ getFieldValue,
46
+ setFieldState,
47
+ getStates,
48
+ getValues,
49
+ reset,
50
+ modified,
51
+ ...formValidation
52
+ }), [
53
+ getFieldState,
54
+ getFieldValue,
55
+ setFieldState,
56
+ getStates,
57
+ getValues,
58
+ reset,
59
+ modified,
60
+ formValidation
61
+ ]);
62
+ }
63
+ function noop() {
64
+ throw new Error('Cannot call method on empty context. Did you forget <Form />?');
65
+ }
66
+ const FormContext = React.createContext({
67
+ getFieldState: noop,
68
+ getFieldValue: noop,
69
+ setFieldState: noop,
70
+ getStates: noop,
71
+ getValues: noop,
72
+ getValidationResult: noop,
73
+ registerValidation: noop,
74
+ isFieldValid: noop,
75
+ reset: noop,
76
+ pending: false,
77
+ valid: false,
78
+ modified: false
79
+ });
80
+ export function FormProvider(props) {
81
+ const api = useFormApi();
82
+ return _jsx(FormContext.Provider, { value: api, children: props.children });
83
+ }
84
+ export function useForm() {
85
+ return React.useContext(FormContext);
86
+ }
87
+ export function useFormWithFields(fieldsCreator, deps) {
88
+ const { reset, ...form } = useForm();
89
+ const fields = React.useMemo(() => {
90
+ return fieldsCreator(...deps);
91
+ // eslint-disable-next-line react-hooks/exhaustive-deps
92
+ }, deps);
93
+ React.useLayoutEffect(() => {
94
+ reset();
95
+ }, [reset, fields]);
96
+ return React.useMemo(() => ({
97
+ ...form,
98
+ reset,
99
+ fields
100
+ }), [form, reset, fields]);
101
+ }
102
+ export function withForm(Component) {
103
+ return function WithForm(props) {
104
+ return (_jsx(FormProvider, { children: _jsx(Component, { ...props }) }));
105
+ };
106
+ }
107
+ export function UseForm(props) {
108
+ const form = useForm();
109
+ return _jsx(React.Fragment, { children: props.children(form) });
110
+ }
111
+ //# sourceMappingURL=form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.js","sourceRoot":"","sources":["../../src/main/web/form.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { useField, useArrayField, UseField, UseArrayField } from './fields';
2
+ export { FormProvider, UseForm, useForm, useFormWithFields, withForm } from './form';
3
+ export { defineField, isFieldRef, defineArrayField, isArrayFieldRef } from './references';
4
+ export { useAsyncFieldStateValidation, useAsyncFieldValidation, useFieldStateValidation, useFieldValidation } from './validation/fields';
5
+ export type { GenericFieldRef, FieldRef, ArrayFieldRef, Field, ArrayField, FieldValue, FieldState, FieldMetadata, FieldMetadataUpdaters, FormStates, FieldRefStates, FormValues, FieldRefValues, FormApi, FormWithFields, ValidationError, ValidationResult, FieldValidation, FormValidationApi, FormValidations } from './types';
@@ -0,0 +1,5 @@
1
+ export { useField, useArrayField, UseField, UseArrayField } from './fields';
2
+ export { FormProvider, UseForm, useForm, useFormWithFields, withForm } from './form';
3
+ export { defineField, isFieldRef, defineArrayField, isArrayFieldRef } from './references';
4
+ export { useAsyncFieldStateValidation, useAsyncFieldValidation, useFieldStateValidation, useFieldValidation } from './validation/fields';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/main/web/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE5E,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAErF,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE1F,OAAO,EACH,4BAA4B,EAC5B,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EACrB,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { ArrayFieldRef, FieldRef, GenericFieldRef } from './types';
2
+ export declare function defineField<V>(initialValue: V, initialDisabled?: boolean): FieldRef<V>;
3
+ export declare function isFieldRef(field: unknown): field is FieldRef<unknown>;
4
+ export declare function defineArrayField<T extends GenericFieldRef, V>(initialItems: Iterable<V>, itemTemplate: (value: V) => T, initialDisabled?: boolean): ArrayFieldRef<T, V>;
5
+ export declare function isArrayFieldRef(field: unknown): field is ArrayFieldRef<GenericFieldRef, unknown>;
@@ -0,0 +1,27 @@
1
+ import { List, Seq } from 'immutable';
2
+ import FieldStateImpl from './FieldState';
3
+ class FieldRefImpl {
4
+ constructor(initialValue, initialDisabled) {
5
+ this.initialState = new FieldStateImpl(initialValue, initialDisabled, false, false);
6
+ }
7
+ }
8
+ export function defineField(initialValue, initialDisabled = false) {
9
+ return new FieldRefImpl(initialValue, initialDisabled);
10
+ }
11
+ export function isFieldRef(field) {
12
+ return field instanceof FieldRefImpl;
13
+ }
14
+ class ArrayFieldRefImpl extends FieldRefImpl {
15
+ constructor(initialItems, itemTemplate, initialDisabled) {
16
+ super(initialItems, initialDisabled);
17
+ this.itemTemplate = itemTemplate;
18
+ this.itemTemplate = itemTemplate;
19
+ }
20
+ }
21
+ export function defineArrayField(initialItems, itemTemplate, initialDisabled = false) {
22
+ return new ArrayFieldRefImpl(Seq(initialItems).map(itemTemplate).toList(), itemTemplate, initialDisabled);
23
+ }
24
+ export function isArrayFieldRef(field) {
25
+ return field instanceof ArrayFieldRefImpl;
26
+ }
27
+ //# sourceMappingURL=references.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"references.js","sourceRoot":"","sources":["../../src/main/web/references.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,cAAc,MAAM,cAAc,CAAC;AAG1C,MAAM,YAAY;IAGd,YAAY,YAAe,EAAE,eAAwB;QACjD,IAAI,CAAC,YAAY,GAAG,IAAI,cAAc,CAAC,YAAY,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACxF,CAAC;CACJ;AAED,MAAM,UAAU,WAAW,CAAI,YAAe,EAAE,eAAe,GAAG,KAAK;IACnE,OAAO,IAAI,YAAY,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAc;IACrC,OAAO,KAAK,YAAY,YAAY,CAAC;AACzC,CAAC;AAED,MAAM,iBACF,SAAQ,YAAqB;IAG7B,YACI,YAAqB,EACZ,YAA6B,EACtC,eAAwB;QAExB,KAAK,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;QAH5B,iBAAY,GAAZ,YAAY,CAAiB;QAItC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACrC,CAAC;CACJ;AAED,MAAM,UAAU,gBAAgB,CAC5B,YAAyB,EACzB,YAA6B,EAC7B,eAAe,GAAG,KAAK;IAEvB,OAAO,IAAI,iBAAiB,CACxB,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,EAC5C,YAAY,EACZ,eAAe,CAClB,CAAC;AACN,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAc;IAC1C,OAAO,KAAK,YAAY,iBAAiB,CAAC;AAC9C,CAAC"}