@ekz/formix 2.1.0 → 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.
- package/lib/cjs/FieldState.d.ts +17 -0
- package/lib/cjs/FieldState.js +33 -0
- package/lib/cjs/FieldState.js.map +1 -0
- package/lib/cjs/fields.d.ts +15 -0
- package/lib/cjs/fields.js +121 -0
- package/lib/cjs/fields.js.map +1 -0
- package/lib/cjs/form.d.ts +13 -0
- package/lib/cjs/form.js +119 -0
- package/lib/cjs/form.js.map +1 -0
- package/lib/cjs/index.d.ts +5 -0
- package/lib/cjs/index.js +25 -0
- package/lib/cjs/index.js.map +1 -0
- package/lib/cjs/references.d.ts +5 -0
- package/lib/cjs/references.js +34 -0
- package/lib/cjs/references.js.map +1 -0
- package/lib/cjs/types.d.ts +111 -0
- package/lib/cjs/types.js +3 -0
- package/lib/cjs/types.js.map +1 -0
- package/lib/cjs/validation/fields.d.ts +5 -0
- package/lib/cjs/validation/fields.js +114 -0
- package/lib/cjs/validation/fields.js.map +1 -0
- package/lib/cjs/validation/form.d.ts +2 -0
- package/lib/cjs/validation/form.js +62 -0
- package/lib/cjs/validation/form.js.map +1 -0
- package/lib/esm/FieldState.d.ts +17 -0
- package/lib/esm/FieldState.js +30 -0
- package/lib/esm/FieldState.js.map +1 -0
- package/lib/esm/fields.d.ts +15 -0
- package/lib/esm/fields.js +114 -0
- package/lib/esm/fields.js.map +1 -0
- package/lib/esm/form.d.ts +13 -0
- package/lib/esm/form.js +111 -0
- package/lib/esm/form.js.map +1 -0
- package/lib/esm/index.d.ts +5 -0
- package/lib/esm/index.js +5 -0
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/references.d.ts +5 -0
- package/lib/esm/references.js +27 -0
- package/lib/esm/references.js.map +1 -0
- package/lib/esm/types.d.ts +111 -0
- package/lib/esm/types.js +2 -0
- package/lib/esm/types.js.map +1 -0
- package/lib/esm/validation/fields.d.ts +5 -0
- package/lib/esm/validation/fields.js +107 -0
- package/lib/esm/validation/fields.js.map +1 -0
- package/lib/esm/validation/form.d.ts +2 -0
- package/lib/esm/validation/form.js +58 -0
- package/lib/esm/validation/form.js.map +1 -0
- package/lib/esnext/FieldState.d.ts +17 -0
- package/lib/esnext/FieldState.js +34 -0
- package/lib/esnext/FieldState.js.map +1 -0
- package/lib/esnext/fields.d.ts +15 -0
- package/lib/esnext/fields.js +114 -0
- package/lib/esnext/fields.js.map +1 -0
- package/lib/esnext/form.d.ts +13 -0
- package/lib/esnext/form.js +111 -0
- package/lib/esnext/form.js.map +1 -0
- package/lib/esnext/index.d.ts +5 -0
- package/lib/esnext/index.js +5 -0
- package/lib/esnext/index.js.map +1 -0
- package/lib/esnext/references.d.ts +5 -0
- package/lib/esnext/references.js +29 -0
- package/lib/esnext/references.js.map +1 -0
- package/lib/esnext/types.d.ts +111 -0
- package/lib/esnext/types.js +2 -0
- package/lib/esnext/types.js.map +1 -0
- package/lib/esnext/validation/fields.d.ts +5 -0
- package/lib/esnext/validation/fields.js +107 -0
- package/lib/esnext/validation/fields.js.map +1 -0
- package/lib/esnext/validation/form.d.ts +2 -0
- package/lib/esnext/validation/form.js +58 -0
- package/lib/esnext/validation/form.js.map +1 -0
- package/package.json +6 -5
|
@@ -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,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 {};
|
package/lib/esm/form.js
ADDED
|
@@ -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":";AAAA,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,SAAS,UAAU;IACf,8DAA8D;IAC9D,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAsC,GAAG,CAAC,CAAC;IAE/F,MAAM,aAAa,GAAG,KAAK,CAAC,WAAW,CACnC,SAAS,aAAa,CAAI,QAAqB;QAC3C,OAAO,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC5D,CAAC,EACD,CAAC,WAAW,CAAC,CAChB,CAAC;IAEF,MAAM,aAAa,GAAG,KAAK,CAAC,WAAW,CACnC,CAAC,QAAQ,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,KAAK,EAC3C,CAAC,aAAa,CAAC,CAClB,CAAC;IAEF,MAAM,aAAa,GAAG,KAAK,CAAC,WAAW,CAAC,SAAS,aAAa,CAC1D,QAAqB,EACrB,KAA0C;QAE1C,cAAc,CAAC,CAAC,EAAE,EAAE,EAAE,CAClB,OAAO,KAAK,KAAK,UAAU;YACvB,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC;YACnD,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAChC,CAAC;IACN,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,CAC7B,CAAC,MAAuB,EAAE,IAAuB,EAAE,EAAE;QACjD,8DAA8D;QAC9D,SAAS,YAAY,CAAC,KAAsB;YACxC,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YACxD,CAAC;iBAAM,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3B,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;gBACnC,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACJ,OAAO,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;qBAClB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;qBACnC,QAAQ,EAAE,CAAC;YACpB,CAAC;QACL,CAAC;QAED,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC,EACD,CAAC,aAAa,CAAC,CAClB,CAAC;IAEF,MAAM,SAAS,GAAyB,KAAK,CAAC,WAAW,CACrD,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,CAAC,OAAO,CAAC,CACZ,CAAC;IAEF,MAAM,SAAS,GAAyB,KAAK,CAAC,WAAW,CACrD,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,CAAC,OAAO,CAAC,CACZ,CAAC;IAEF,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IAE/E,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QAChC,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;IACvF,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,MAAM,cAAc,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAC;IAExD,OAAO,KAAK,CAAC,OAAO,CAChB,GAAG,EAAE,CAAC,CAAC;QACH,aAAa;QACb,aAAa;QACb,aAAa;QACb,SAAS;QACT,SAAS;QACT,KAAK;QACL,QAAQ;QACR,GAAG,cAAc;KACpB,CAAC,EACF;QACI,aAAa;QACb,aAAa;QACb,aAAa;QACb,SAAS;QACT,SAAS;QACT,KAAK;QACL,QAAQ;QACR,cAAc;KACjB,CACJ,CAAC;AACN,CAAC;AAED,SAAS,IAAI;IACT,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;AACrF,CAAC;AAED,MAAM,WAAW,GAAG,KAAK,CAAC,aAAa,CAAU;IAC7C,aAAa,EAAE,IAAI;IACnB,aAAa,EAAE,IAAI;IACnB,aAAa,EAAE,IAAI;IACnB,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,IAAI;IACf,mBAAmB,EAAE,IAAI;IACzB,kBAAkB,EAAE,IAAI;IACxB,YAAY,EAAE,IAAI;IAClB,KAAK,EAAE,IAAI;IACX,OAAO,EAAE,KAAK;IACd,KAAK,EAAE,KAAK;IACZ,QAAQ,EAAE,KAAK;CAClB,CAAC,CAAC;AAEH,MAAM,UAAU,YAAY,CAAC,KAAoC;IAC7D,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,OAAO,KAAC,WAAW,CAAC,QAAQ,IAAC,KAAK,EAAE,GAAG,YAAG,KAAK,CAAC,QAAQ,GAAwB,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,OAAO;IACnB,OAAO,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC7B,aAAwC,EACxC,IAAe;IAEf,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC;IAErC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QAC9B,OAAO,aAAa,CAAC,GAAG,IAAI,CAAC,CAAC;QAC9B,uDAAuD;IAC3D,CAAC,EAAE,IAAI,CAAC,CAAC;IAET,KAAK,CAAC,eAAe,CAAC,GAAG,EAAE;QACvB,KAAK,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAEpB,OAAO,KAAK,CAAC,OAAO,CAChB,GAAG,EAAE,CAAC,CAAC;QACH,GAAG,IAAI;QACP,KAAK;QACL,MAAM;KACT,CAAC,EACF,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CACxB,CAAC;AACN,CAAC;AAED,MAAM,UAAU,QAAQ,CAAQ,SAAqC;IACjE,OAAO,SAAS,QAAQ,CAAC,KAAY;QACjC,OAAO,CACH,KAAC,YAAY,cAGT,KAAC,SAAS,OAAK,KAAK,GAAI,GACb,CAClB,CAAC;IACN,CAAC,CAAC;AACN,CAAC;AAMD,MAAM,UAAU,OAAO,CAAC,KAAmB;IACvC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,OAAO,KAAC,KAAK,CAAC,QAAQ,cAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAkB,CAAC;AACnE,CAAC"}
|
|
@@ -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';
|
package/lib/esm/index.js
ADDED
|
@@ -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"}
|