zeus-form 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- package/lib/InputForm.d.ts +1 -1
- package/lib/InputForm.js +6 -3
- package/lib/InputForm.js.map +1 -1
- package/lib/deepMerge.d.ts +14 -0
- package/lib/deepMerge.js +51 -0
- package/lib/deepMerge.js.map +1 -0
- package/lib/models.d.ts +6 -2
- package/lib/outsideUse.d.ts +3 -5
- package/lib/outsideUse.js +56 -84
- package/lib/outsideUse.js.map +1 -1
- package/lib/renderer/index.js +13 -1
- package/lib/renderer/index.js.map +1 -1
- package/package.json +1 -1
- package/src/InputForm.tsx +21 -6
- package/src/deepMerge.ts +31 -0
- package/src/models.ts +4 -2
- package/src/outsideUse.tsx +56 -78
- package/src/renderer/index.tsx +12 -0
package/lib/InputForm.d.ts
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
/// <reference types="react" />
|
2
2
|
import { InputFormProps } from "./models";
|
3
|
-
export declare function InputForm<T>({ onChange, schema, values, inputName, ...props }: InputFormProps<T>): JSX.Element;
|
3
|
+
export declare function InputForm<T>({ onChange, schema, values, inputName, basicErrorMessages, override, ...props }: InputFormProps<T>): JSX.Element;
|
package/lib/InputForm.js
CHANGED
@@ -46,12 +46,14 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
46
46
|
};
|
47
47
|
Object.defineProperty(exports, "__esModule", { value: true });
|
48
48
|
exports.InputForm = void 0;
|
49
|
+
var deepMerge_1 = require("./deepMerge");
|
50
|
+
var outsideUse_1 = require("./outsideUse");
|
49
51
|
var renderer_1 = require("./renderer");
|
50
52
|
var resolve_1 = require("./resolve");
|
51
53
|
var graphql_js_tree_1 = require("graphql-js-tree");
|
52
54
|
var react_1 = __importStar(require("react"));
|
53
55
|
function InputForm(_a) {
|
54
|
-
var onChange = _a.onChange, schema = _a.schema, values = _a.values, inputName = _a.inputName, props = __rest(_a, ["onChange", "schema", "values", "inputName"]);
|
56
|
+
var onChange = _a.onChange, schema = _a.schema, values = _a.values, inputName = _a.inputName, basicErrorMessages = _a.basicErrorMessages, override = _a.override, props = __rest(_a, ["onChange", "schema", "values", "inputName", "basicErrorMessages", "override"]);
|
55
57
|
var nodes = (0, react_1.useMemo)(function () {
|
56
58
|
return graphql_js_tree_1.Parser.parse(schema).nodes;
|
57
59
|
}, [schema]);
|
@@ -69,9 +71,10 @@ function InputForm(_a) {
|
|
69
71
|
values: v,
|
70
72
|
});
|
71
73
|
}, [inputName, values]);
|
72
|
-
return (react_1.default.createElement(renderer_1.Renderer, __assign({}, props, { nodes: nodes, formObject: formObject, key: inputName, currentPath: inputName, onChange: function (changedForm) {
|
74
|
+
return (react_1.default.createElement(renderer_1.Renderer, __assign({}, props, { nodes: nodes, formObject: formObject, key: inputName, override: override, currentPath: inputName, onChange: function (changedForm) {
|
73
75
|
var toValue = (0, resolve_1.resolveQlValue)({ v: changedForm, nodes: nodes });
|
74
|
-
|
76
|
+
var validation = (0, outsideUse_1.validateForm)(basicErrorMessages)(changedForm);
|
77
|
+
onChange(override ? (0, deepMerge_1.mergeDeep)(toValue, override) : toValue, validation);
|
75
78
|
}, f: formObject.__form__node })));
|
76
79
|
}
|
77
80
|
exports.InputForm = InputForm;
|
package/lib/InputForm.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"InputForm.js","sourceRoot":"","sources":["../src/InputForm.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
1
|
+
{"version":3,"file":"InputForm.js","sourceRoot":"","sources":["../src/InputForm.tsx"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
/**
|
2
|
+
* Simple object check.
|
3
|
+
* @param item
|
4
|
+
* @returns {boolean}
|
5
|
+
*/
|
6
|
+
export declare function isObject(item: unknown): unknown;
|
7
|
+
/**
|
8
|
+
* Deep merge two objects.
|
9
|
+
* @param target
|
10
|
+
* @param ...sources
|
11
|
+
*/
|
12
|
+
export declare function mergeDeep<T extends {
|
13
|
+
[x: string]: any;
|
14
|
+
}>(target: T, ...sources: T[]): T;
|
package/lib/deepMerge.js
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
3
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
4
|
+
if (ar || !(i in from)) {
|
5
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
6
|
+
ar[i] = from[i];
|
7
|
+
}
|
8
|
+
}
|
9
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
10
|
+
};
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
12
|
+
exports.mergeDeep = exports.isObject = void 0;
|
13
|
+
/**
|
14
|
+
* Simple object check.
|
15
|
+
* @param item
|
16
|
+
* @returns {boolean}
|
17
|
+
*/
|
18
|
+
function isObject(item) {
|
19
|
+
return item && typeof item === 'object' && !Array.isArray(item);
|
20
|
+
}
|
21
|
+
exports.isObject = isObject;
|
22
|
+
/**
|
23
|
+
* Deep merge two objects.
|
24
|
+
* @param target
|
25
|
+
* @param ...sources
|
26
|
+
*/
|
27
|
+
function mergeDeep(target) {
|
28
|
+
var _a, _b;
|
29
|
+
var sources = [];
|
30
|
+
for (var _i = 1; _i < arguments.length; _i++) {
|
31
|
+
sources[_i - 1] = arguments[_i];
|
32
|
+
}
|
33
|
+
if (!sources.length)
|
34
|
+
return target;
|
35
|
+
var source = sources.shift();
|
36
|
+
if (isObject(target) && isObject(source)) {
|
37
|
+
for (var key in source) {
|
38
|
+
if (isObject(source[key])) {
|
39
|
+
if (!target[key])
|
40
|
+
Object.assign(target, (_a = {}, _a[key] = {}, _a));
|
41
|
+
mergeDeep(target[key], source[key]);
|
42
|
+
}
|
43
|
+
else {
|
44
|
+
Object.assign(target, (_b = {}, _b[key] = source[key], _b));
|
45
|
+
}
|
46
|
+
}
|
47
|
+
}
|
48
|
+
return mergeDeep.apply(void 0, __spreadArray([target], sources, false));
|
49
|
+
}
|
50
|
+
exports.mergeDeep = mergeDeep;
|
51
|
+
//# sourceMappingURL=deepMerge.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"deepMerge.js","sourceRoot":"","sources":["../src/deepMerge.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA;;;;GAIG;AACH,SAAgB,QAAQ,CAAC,IAAa;IAClC,OAAO,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACpE,CAAC;AAFD,4BAEC;AAED;;;;GAIG;AACH,SAAgB,SAAS,CAAiC,MAAS;;IAAE,iBAAe;SAAf,UAAe,EAAf,qBAAe,EAAf,IAAe;QAAf,gCAAe;;IAChF,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC;IACnC,IAAM,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAE/B,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE;QACtC,KAAK,IAAM,GAAG,IAAI,MAAM,EAAE;YACtB,IAAI,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE;gBACvB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;oBAAE,MAAM,CAAC,MAAM,CAAC,MAAM,YAAI,GAAC,GAAG,IAAG,EAAE,MAAG,CAAC;gBACvD,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;aACvC;iBAAM;gBACH,MAAM,CAAC,MAAM,CAAC,MAAM,YAAI,GAAC,GAAG,IAAG,MAAM,CAAC,GAAG,CAAC,MAAG,CAAC;aACjD;SACJ;KACJ;IAED,OAAO,SAAS,8BAAC,MAAM,GAAK,OAAO,UAAE;AACzC,CAAC;AAhBD,8BAgBC"}
|
package/lib/models.d.ts
CHANGED
@@ -35,12 +35,14 @@ export declare type PassedFormProps<WidgetData = ReturnedDictType> = {
|
|
35
35
|
onChange: (formObject: FormObject) => void;
|
36
36
|
required?: boolean;
|
37
37
|
widgetComponents: WidgetType[];
|
38
|
-
widgetVariants?: WidgetVariantType[];
|
39
38
|
currentPath: string;
|
40
39
|
widgets?: SavedWidgets;
|
41
40
|
widgetData?: WidgetData;
|
42
41
|
errors?: Errors;
|
43
42
|
children?: React.ReactNode;
|
43
|
+
override?: {
|
44
|
+
[x: string]: any;
|
45
|
+
};
|
44
46
|
components: {
|
45
47
|
ArrayField: FieldComponent;
|
46
48
|
ObjectField: FieldComponent;
|
@@ -60,8 +62,10 @@ export declare type FormFile = {
|
|
60
62
|
export declare type InputFormProps<InputZeusType> = Omit<PassedFormProps, 'formObject' | 'onChange' | 'f' | 'currentPath' | 'changeWidget' | 'widgets' | 'nodes' | 'formFile' | 'runQuery'> & {
|
61
63
|
schema: string;
|
62
64
|
inputName: string;
|
65
|
+
override?: Partial<InputZeusType>;
|
66
|
+
basicErrorMessages: Record<Errs, string>;
|
63
67
|
values: Partial<InputZeusType>;
|
64
|
-
onChange: (o: Partial<InputZeusType>) => void;
|
68
|
+
onChange: (o: Partial<InputZeusType>, errors?: Record<string, string>) => void;
|
65
69
|
};
|
66
70
|
export declare type InputFormLibraryProps<T> = Omit<InputFormProps<T>, 'required' | 'components'>;
|
67
71
|
export declare type WidgetProps<Props> = {
|
package/lib/outsideUse.d.ts
CHANGED
@@ -1,10 +1,8 @@
|
|
1
1
|
import { Errs, FormObject, FormValue, PassedFormProps } from "./models";
|
2
2
|
export declare const getWidgetFromProps: (props: PassedFormProps) => {
|
3
|
-
data:
|
3
|
+
data: import("./models").WidgetSavedData | undefined;
|
4
4
|
widget: import("./models").WidgetType;
|
5
5
|
} | undefined;
|
6
6
|
export declare const getErrorFromProps: (props: PassedFormProps) => string | undefined;
|
7
|
-
export declare const
|
8
|
-
|
9
|
-
validateValue: (f: FormValue, path: string, pushErrors: (path: string, value: Errs) => void) => void;
|
10
|
-
};
|
7
|
+
export declare const validateValue: (f: FormValue, path: string, pushErrors: (path: string, value: Errs) => void) => void;
|
8
|
+
export declare const validateForm: (errors: Record<Errs, string>) => (v: FormObject) => Record<string, string> | undefined;
|
package/lib/outsideUse.js
CHANGED
@@ -1,36 +1,14 @@
|
|
1
1
|
"use strict";
|
2
|
-
var __assign = (this && this.__assign) || function () {
|
3
|
-
__assign = Object.assign || function(t) {
|
4
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
5
|
-
s = arguments[i];
|
6
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
7
|
-
t[p] = s[p];
|
8
|
-
}
|
9
|
-
return t;
|
10
|
-
};
|
11
|
-
return __assign.apply(this, arguments);
|
12
|
-
};
|
13
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
14
|
-
exports.
|
3
|
+
exports.validateForm = exports.validateValue = exports.getErrorFromProps = exports.getWidgetFromProps = void 0;
|
15
4
|
var models_1 = require("./models");
|
16
5
|
var graphql_js_tree_1 = require("graphql-js-tree");
|
17
6
|
var getWidgetFromProps = function (props) {
|
18
|
-
var _a
|
7
|
+
var _a;
|
19
8
|
var w = (_a = props.widgets) === null || _a === void 0 ? void 0 : _a[props.currentPath];
|
20
9
|
var FoundBasicWidget = props.widgetComponents.find(function (wc) { return wc.name === (w === null || w === void 0 ? void 0 : w.widget); });
|
21
10
|
if (!FoundBasicWidget) {
|
22
|
-
|
23
|
-
if (!widgetVariant_1) {
|
24
|
-
return;
|
25
|
-
}
|
26
|
-
var FoundVariantWidget = props.widgetComponents.find(function (wc) { return wc.name === widgetVariant_1.widget; });
|
27
|
-
if (!FoundVariantWidget) {
|
28
|
-
return;
|
29
|
-
}
|
30
|
-
return {
|
31
|
-
data: __assign({ widget: widgetVariant_1.widget }, widgetVariant_1.data),
|
32
|
-
widget: FoundVariantWidget,
|
33
|
-
};
|
11
|
+
return;
|
34
12
|
}
|
35
13
|
return {
|
36
14
|
data: w,
|
@@ -43,70 +21,64 @@ var getErrorFromProps = function (props) {
|
|
43
21
|
return (_a = props.errors) === null || _a === void 0 ? void 0 : _a[props.currentPath];
|
44
22
|
};
|
45
23
|
exports.getErrorFromProps = getErrorFromProps;
|
46
|
-
var
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
if (__form__node.
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
validateValue(v, path, pushErrors);
|
75
|
-
}
|
24
|
+
var validateValue = function (f, path, pushErrors) {
|
25
|
+
if (f === null ||
|
26
|
+
typeof f === 'string' ||
|
27
|
+
typeof f === 'boolean' ||
|
28
|
+
typeof f === 'number' ||
|
29
|
+
typeof f === 'undefined') {
|
30
|
+
return;
|
31
|
+
}
|
32
|
+
if ('__form__node' in f &&
|
33
|
+
typeof f.__form__node === 'object' &&
|
34
|
+
f.__form__node !== null &&
|
35
|
+
'args' in f.__form__node &&
|
36
|
+
'data' in f.__form__node &&
|
37
|
+
typeof f.__form__node.data === 'object' &&
|
38
|
+
!!f.__form__node.data &&
|
39
|
+
'type' in f.__form__node.data &&
|
40
|
+
'directives' in f.__form__node) {
|
41
|
+
var _a = f, __form__node = _a.__form__node, __form__value = _a.__form__value;
|
42
|
+
if (__form__node.data.type === graphql_js_tree_1.ValueDefinition.InputValueDefinition) {
|
43
|
+
if (__form__node.type.fieldType.type === graphql_js_tree_1.Options.required &&
|
44
|
+
(0, graphql_js_tree_1.getTypeName)(__form__node.type.fieldType) !== graphql_js_tree_1.ScalarTypes.Boolean) {
|
45
|
+
if (typeof __form__value === 'undefined' || __form__value === '') {
|
46
|
+
pushErrors(path, models_1.Errs.REQUIRED);
|
47
|
+
}
|
48
|
+
if (Array.isArray(__form__value)) {
|
49
|
+
for (var _i = 0, __form__value_1 = __form__value; _i < __form__value_1.length; _i++) {
|
50
|
+
var v = __form__value_1[_i];
|
51
|
+
(0, exports.validateValue)(v, path, pushErrors);
|
76
52
|
}
|
77
53
|
}
|
78
54
|
}
|
79
55
|
}
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
if (typeof __form__value === 'object' && !!__form__value) {
|
87
|
-
Object.entries(__form__value).forEach(function (_a) {
|
88
|
-
var k = _a[0], v = _a[1];
|
89
|
-
return validateValue(v, "".concat(path, ".").concat(k), pushErrors);
|
90
|
-
});
|
91
|
-
return;
|
92
|
-
}
|
56
|
+
}
|
57
|
+
if ('__form__value' in f && !!f.__form__value) {
|
58
|
+
var __form__value = f.__form__value;
|
59
|
+
if (Array.isArray(__form__value)) {
|
60
|
+
__form__value.map(function (vv) { return (0, exports.validateValue)(vv, path, pushErrors); });
|
61
|
+
return;
|
93
62
|
}
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
Object.entries(v.__form__value).forEach(function (_a) {
|
99
|
-
var k = _a[0], val = _a[1];
|
100
|
-
validateValue(val, k, function (p, err) {
|
101
|
-
errorDict[p] = errors[err];
|
63
|
+
if (typeof __form__value === 'object' && !!__form__value) {
|
64
|
+
Object.entries(__form__value).forEach(function (_a) {
|
65
|
+
var k = _a[0], v = _a[1];
|
66
|
+
return (0, exports.validateValue)(v, path ? "".concat(path, ".").concat(k) : k, pushErrors);
|
102
67
|
});
|
103
|
-
|
104
|
-
|
105
|
-
}
|
106
|
-
return
|
107
|
-
validateForm: validateForm,
|
108
|
-
validateValue: validateValue,
|
109
|
-
};
|
68
|
+
return;
|
69
|
+
}
|
70
|
+
}
|
71
|
+
return;
|
110
72
|
};
|
111
|
-
exports.
|
73
|
+
exports.validateValue = validateValue;
|
74
|
+
var validateForm = function (errors) { return function (v) {
|
75
|
+
var errorDict = {};
|
76
|
+
(0, exports.validateValue)(v, v.__form__node.name, function (p, err) {
|
77
|
+
errorDict[p] = errors[err];
|
78
|
+
});
|
79
|
+
if (Object.keys(errorDict).length === 0)
|
80
|
+
return;
|
81
|
+
return errorDict;
|
82
|
+
}; };
|
83
|
+
exports.validateForm = validateForm;
|
112
84
|
//# sourceMappingURL=outsideUse.js.map
|
package/lib/outsideUse.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"outsideUse.js","sourceRoot":"","sources":["../src/outsideUse.tsx"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"outsideUse.js","sourceRoot":"","sources":["../src/outsideUse.tsx"],"names":[],"mappings":"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"}
|
package/lib/renderer/index.js
CHANGED
@@ -50,7 +50,7 @@ var fields_1 = require("./fields");
|
|
50
50
|
var graphql_js_tree_1 = require("graphql-js-tree");
|
51
51
|
var react_1 = __importStar(require("react"));
|
52
52
|
var Renderer = function (props) {
|
53
|
-
var formObject = props.formObject, f = props.f, nodes = props.nodes, _a = props.components, NullField = _a.NullField, FormLabel = _a.FormLabel, FormField = _a.FormField;
|
53
|
+
var formObject = props.formObject, f = props.f, nodes = props.nodes, override = props.override, currentPath = props.currentPath, _a = props.components, NullField = _a.NullField, FormLabel = _a.FormLabel, FormField = _a.FormField;
|
54
54
|
var children = props.children, allProps = __rest(props, ["children"]);
|
55
55
|
var seekNode = nodes.find(function (n) { return n.name === (0, graphql_js_tree_1.getTypeName)(f.type.fieldType); });
|
56
56
|
var isInput = (seekNode === null || seekNode === void 0 ? void 0 : seekNode.data.type) === graphql_js_tree_1.TypeDefinition.InputObjectTypeDefinition;
|
@@ -58,6 +58,18 @@ var Renderer = function (props) {
|
|
58
58
|
if (f.type.fieldType.type === graphql_js_tree_1.Options.required) {
|
59
59
|
return (react_1.default.createElement(exports.Renderer, __assign({}, props, { f: __assign(__assign({}, f), { type: __assign(__assign({}, f.type), { fieldType: __assign({}, f.type.fieldType.nest) }) }), required: true })));
|
60
60
|
}
|
61
|
+
if (override) {
|
62
|
+
var p = currentPath.split('.').slice(1);
|
63
|
+
if (p.length > 0) {
|
64
|
+
var overrides = p.reduce(function (a, b) {
|
65
|
+
if (!a)
|
66
|
+
return;
|
67
|
+
return a[b];
|
68
|
+
}, override);
|
69
|
+
if (overrides)
|
70
|
+
return null;
|
71
|
+
}
|
72
|
+
}
|
61
73
|
return (react_1.default.createElement(FormField, __assign({}, allProps),
|
62
74
|
react_1.default.createElement(FormLabel, __assign({}, allProps, { open: open, setOpen: setOpen, children: children })),
|
63
75
|
formObject.__form__value === null ? (react_1.default.createElement(NullField, __assign({}, allProps))) : (react_1.default.createElement(react_1.default.Fragment, null, (!isInput || open) && react_1.default.createElement(fields_1.Fields, __assign({}, allProps))))));
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/renderer/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,mCAA2C;AAC3C,mDAAuE;AACvE,6CAAwC;AAEjC,IAAM,QAAQ,GAA8B,UAAC,KAAK;IAEjD,IAAA,UAAU,
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/renderer/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,mCAA2C;AAC3C,mDAAuE;AACvE,6CAAwC;AAEjC,IAAM,QAAQ,GAA8B,UAAC,KAAK;IAEjD,IAAA,UAAU,GAMV,KAAK,WANK,EACV,CAAC,GAKD,KAAK,EALJ,EACD,KAAK,GAIL,KAAK,MAJA,EACL,QAAQ,GAGR,KAAK,SAHG,EACR,WAAW,GAEX,KAAK,YAFM,EACX,KACA,KAAK,WAD0C,EAAjC,SAAS,eAAA,EAAE,SAAS,eAAA,EAAE,SAAS,eAAE,CACzC;IACF,IAAA,QAAQ,GAAkB,KAAK,SAAvB,EAAK,QAAQ,UAAK,KAAK,EAAjC,YAAyB,CAAF,CAAW;IACxC,IAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,IAAI,KAAK,IAAA,6BAAW,EAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAxC,CAAwC,CAAC,CAAC;IAC7E,IAAM,OAAO,GAAG,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,CAAC,IAAI,MAAK,gCAAc,CAAC,yBAAyB,CAAC;IAC3E,IAAA,KAAkB,IAAA,gBAAQ,EAAC,KAAK,CAAC,QAAQ,CAAC,EAAzC,IAAI,QAAA,EAAE,OAAO,QAA4B,CAAC;IACjD,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,yBAAO,CAAC,QAAQ,EAAE;QAC5C,OAAO,CACH,8BAAC,gBAAQ,eACD,KAAK,IACT,CAAC,wBACM,CAAC,KACJ,IAAI,wBAAO,CAAC,CAAC,IAAI,KAAE,SAAS,eAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,SAE5D,QAAQ,EAAE,IAAI,IAChB,CACL,CAAC;KACL;IACD,IAAI,QAAQ,EAAE;QACV,IAAM,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1C,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;YACd,IAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,UAAC,CAAC,EAAE,CAAC;gBAC5B,IAAI,CAAC,CAAC;oBAAE,OAAO;gBACf,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YAChB,CAAC,EAAE,QAAQ,CAAC,CAAC;YACb,IAAI,SAAS;gBAAE,OAAO,IAAI,CAAC;SAC9B;KACJ;IACD,OAAO,CACH,8BAAC,SAAS,eAAK,QAAQ;QACnB,8BAAC,SAAS,eAAK,QAAQ,IAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,IAAI;QAC5E,UAAU,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,CACjC,8BAAC,SAAS,eAAK,QAAQ,EAAI,CAC9B,CAAC,CAAC,CAAC,CACA,8DAAG,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,8BAAC,eAAM,eAAK,QAAQ,EAAI,CAAI,CACxD,CACO,CACf,CAAC;AACN,CAAC,CAAC;AA7CW,QAAA,QAAQ,YA6CnB"}
|
package/package.json
CHANGED
package/src/InputForm.tsx
CHANGED
@@ -1,10 +1,20 @@
|
|
1
|
+
import { mergeDeep } from '@/deepMerge';
|
1
2
|
import { InputFormProps, FormObject, FormValue } from '@/models';
|
3
|
+
import { validateForm } from '@/outsideUse';
|
2
4
|
import { Renderer } from '@/renderer';
|
3
5
|
import { resolveQlValue } from '@/resolve';
|
4
6
|
import { getTypeName, Options, Parser, ParserField, TypeDefinition, ValueDefinition } from 'graphql-js-tree';
|
5
7
|
import React, { useMemo } from 'react';
|
6
8
|
|
7
|
-
export function InputForm<T>({
|
9
|
+
export function InputForm<T>({
|
10
|
+
onChange,
|
11
|
+
schema,
|
12
|
+
values,
|
13
|
+
inputName,
|
14
|
+
basicErrorMessages,
|
15
|
+
override,
|
16
|
+
...props
|
17
|
+
}: InputFormProps<T>) {
|
8
18
|
const nodes = useMemo(() => {
|
9
19
|
return Parser.parse(schema).nodes;
|
10
20
|
}, [schema]);
|
@@ -23,27 +33,32 @@ export function InputForm<T>({ onChange, schema, values, inputName, ...props }:
|
|
23
33
|
values: v,
|
24
34
|
});
|
25
35
|
}, [inputName, values]);
|
26
|
-
|
27
36
|
return (
|
28
37
|
<Renderer
|
29
38
|
{...props}
|
30
39
|
nodes={nodes}
|
31
40
|
formObject={formObject}
|
32
41
|
key={inputName}
|
42
|
+
override={override}
|
33
43
|
currentPath={inputName}
|
34
44
|
onChange={(changedForm: FormObject) => {
|
35
|
-
const toValue = resolveQlValue({ v: changedForm, nodes })
|
36
|
-
|
45
|
+
const toValue = resolveQlValue({ v: changedForm, nodes }) as Partial<T>;
|
46
|
+
const validation = validateForm(basicErrorMessages)(changedForm);
|
47
|
+
onChange(override ? mergeDeep(toValue, override) : toValue, validation);
|
37
48
|
}}
|
38
49
|
f={formObject.__form__node}
|
39
50
|
/>
|
40
51
|
);
|
41
52
|
}
|
42
53
|
|
43
|
-
function buildForm<
|
54
|
+
function buildForm<
|
55
|
+
T extends {
|
56
|
+
[x: string]: any;
|
57
|
+
},
|
58
|
+
>(props: {
|
44
59
|
node: ParserField;
|
45
60
|
nodes: ParserField[];
|
46
|
-
values?:
|
61
|
+
values?: T;
|
47
62
|
switchInput?: boolean;
|
48
63
|
switchFieldName?: string;
|
49
64
|
}): FormObject {
|
package/src/deepMerge.ts
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
/**
|
2
|
+
* Simple object check.
|
3
|
+
* @param item
|
4
|
+
* @returns {boolean}
|
5
|
+
*/
|
6
|
+
export function isObject(item: unknown) {
|
7
|
+
return item && typeof item === 'object' && !Array.isArray(item);
|
8
|
+
}
|
9
|
+
|
10
|
+
/**
|
11
|
+
* Deep merge two objects.
|
12
|
+
* @param target
|
13
|
+
* @param ...sources
|
14
|
+
*/
|
15
|
+
export function mergeDeep<T extends { [x: string]: any }>(target: T, ...sources: T[]): T {
|
16
|
+
if (!sources.length) return target;
|
17
|
+
const source = sources.shift();
|
18
|
+
|
19
|
+
if (isObject(target) && isObject(source)) {
|
20
|
+
for (const key in source) {
|
21
|
+
if (isObject(source[key])) {
|
22
|
+
if (!target[key]) Object.assign(target, { [key]: {} });
|
23
|
+
mergeDeep(target[key], source[key]);
|
24
|
+
} else {
|
25
|
+
Object.assign(target, { [key]: source[key] });
|
26
|
+
}
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
return mergeDeep(target, ...sources);
|
31
|
+
}
|
package/src/models.ts
CHANGED
@@ -42,12 +42,12 @@ export type PassedFormProps<WidgetData = ReturnedDictType> = {
|
|
42
42
|
onChange: (formObject: FormObject) => void;
|
43
43
|
required?: boolean;
|
44
44
|
widgetComponents: WidgetType[];
|
45
|
-
widgetVariants?: WidgetVariantType[];
|
46
45
|
currentPath: string;
|
47
46
|
widgets?: SavedWidgets;
|
48
47
|
widgetData?: WidgetData;
|
49
48
|
errors?: Errors;
|
50
49
|
children?: React.ReactNode;
|
50
|
+
override?: { [x: string]: any };
|
51
51
|
components: {
|
52
52
|
ArrayField: FieldComponent;
|
53
53
|
ObjectField: FieldComponent;
|
@@ -71,8 +71,10 @@ export type InputFormProps<InputZeusType> = Omit<
|
|
71
71
|
> & {
|
72
72
|
schema: string;
|
73
73
|
inputName: string;
|
74
|
+
override?: Partial<InputZeusType>;
|
75
|
+
basicErrorMessages: Record<Errs, string>;
|
74
76
|
values: Partial<InputZeusType>;
|
75
|
-
onChange: (o: Partial<InputZeusType>) => void;
|
77
|
+
onChange: (o: Partial<InputZeusType>, errors?: Record<string, string>) => void;
|
76
78
|
};
|
77
79
|
export type InputFormLibraryProps<T> = Omit<InputFormProps<T>, 'required' | 'components'>;
|
78
80
|
|
package/src/outsideUse.tsx
CHANGED
@@ -5,21 +5,7 @@ export const getWidgetFromProps = (props: PassedFormProps) => {
|
|
5
5
|
const w = props.widgets?.[props.currentPath];
|
6
6
|
const FoundBasicWidget = props.widgetComponents.find((wc) => wc.name === w?.widget);
|
7
7
|
if (!FoundBasicWidget) {
|
8
|
-
|
9
|
-
if (!widgetVariant) {
|
10
|
-
return;
|
11
|
-
}
|
12
|
-
const FoundVariantWidget = props.widgetComponents.find((wc) => wc.name === widgetVariant.widget);
|
13
|
-
if (!FoundVariantWidget) {
|
14
|
-
return;
|
15
|
-
}
|
16
|
-
return {
|
17
|
-
data: {
|
18
|
-
widget: widgetVariant.widget,
|
19
|
-
...widgetVariant.data,
|
20
|
-
},
|
21
|
-
widget: FoundVariantWidget,
|
22
|
-
};
|
8
|
+
return;
|
23
9
|
}
|
24
10
|
return {
|
25
11
|
data: w,
|
@@ -30,73 +16,65 @@ export const getErrorFromProps = (props: PassedFormProps) => {
|
|
30
16
|
return props.errors?.[props.currentPath];
|
31
17
|
};
|
32
18
|
|
33
|
-
export const
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
if (
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
) {
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
validateValue(v, path, pushErrors);
|
67
|
-
}
|
19
|
+
export const validateValue = (f: FormValue, path: string, pushErrors: (path: string, value: Errs) => void) => {
|
20
|
+
if (
|
21
|
+
f === null ||
|
22
|
+
typeof f === 'string' ||
|
23
|
+
typeof f === 'boolean' ||
|
24
|
+
typeof f === 'number' ||
|
25
|
+
typeof f === 'undefined'
|
26
|
+
) {
|
27
|
+
return;
|
28
|
+
}
|
29
|
+
if (
|
30
|
+
'__form__node' in f &&
|
31
|
+
typeof f.__form__node === 'object' &&
|
32
|
+
f.__form__node !== null &&
|
33
|
+
'args' in f.__form__node &&
|
34
|
+
'data' in f.__form__node &&
|
35
|
+
typeof f.__form__node.data === 'object' &&
|
36
|
+
!!f.__form__node.data &&
|
37
|
+
'type' in f.__form__node.data &&
|
38
|
+
'directives' in f.__form__node
|
39
|
+
) {
|
40
|
+
const { __form__node, __form__value } = f as FormObject;
|
41
|
+
if (__form__node.data.type === ValueDefinition.InputValueDefinition) {
|
42
|
+
if (
|
43
|
+
__form__node.type.fieldType.type === Options.required &&
|
44
|
+
getTypeName(__form__node.type.fieldType) !== ScalarTypes.Boolean
|
45
|
+
) {
|
46
|
+
if (typeof __form__value === 'undefined' || __form__value === '') {
|
47
|
+
pushErrors(path, Errs.REQUIRED);
|
48
|
+
}
|
49
|
+
if (Array.isArray(__form__value)) {
|
50
|
+
for (const v of __form__value) {
|
51
|
+
validateValue(v, path, pushErrors);
|
68
52
|
}
|
69
53
|
}
|
70
54
|
}
|
71
55
|
}
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
if (typeof __form__value === 'object' && !!__form__value) {
|
79
|
-
Object.entries(__form__value).forEach(([k, v]) =>
|
80
|
-
validateValue(v as FormObject, `${path}.${k}`, pushErrors),
|
81
|
-
);
|
82
|
-
return;
|
83
|
-
}
|
56
|
+
}
|
57
|
+
if ('__form__value' in f && !!f.__form__value) {
|
58
|
+
const { __form__value } = f;
|
59
|
+
if (Array.isArray(__form__value)) {
|
60
|
+
__form__value.map((vv) => validateValue(vv, path, pushErrors));
|
61
|
+
return;
|
84
62
|
}
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
});
|
95
|
-
return errorDict;
|
96
|
-
};
|
63
|
+
if (typeof __form__value === 'object' && !!__form__value) {
|
64
|
+
Object.entries(__form__value).forEach(([k, v]) =>
|
65
|
+
validateValue(v as FormObject, path ? `${path}.${k}` : k, pushErrors),
|
66
|
+
);
|
67
|
+
return;
|
68
|
+
}
|
69
|
+
}
|
70
|
+
return;
|
71
|
+
};
|
97
72
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
73
|
+
export const validateForm = (errors: Record<Errs, string>) => (v: FormObject) => {
|
74
|
+
const errorDict: Record<string, string> = {};
|
75
|
+
validateValue(v, v.__form__node.name, (p, err) => {
|
76
|
+
errorDict[p] = errors[err];
|
77
|
+
});
|
78
|
+
if (Object.keys(errorDict).length === 0) return;
|
79
|
+
return errorDict;
|
102
80
|
};
|
package/src/renderer/index.tsx
CHANGED
@@ -8,6 +8,8 @@ export const Renderer: React.FC<PassedFormProps> = (props) => {
|
|
8
8
|
formObject,
|
9
9
|
f,
|
10
10
|
nodes,
|
11
|
+
override,
|
12
|
+
currentPath,
|
11
13
|
components: { NullField, FormLabel, FormField },
|
12
14
|
} = props;
|
13
15
|
const { children, ...allProps } = props;
|
@@ -26,6 +28,16 @@ export const Renderer: React.FC<PassedFormProps> = (props) => {
|
|
26
28
|
/>
|
27
29
|
);
|
28
30
|
}
|
31
|
+
if (override) {
|
32
|
+
const p = currentPath.split('.').slice(1);
|
33
|
+
if (p.length > 0) {
|
34
|
+
const overrides = p.reduce((a, b) => {
|
35
|
+
if (!a) return;
|
36
|
+
return a[b];
|
37
|
+
}, override);
|
38
|
+
if (overrides) return null;
|
39
|
+
}
|
40
|
+
}
|
29
41
|
return (
|
30
42
|
<FormField {...allProps}>
|
31
43
|
<FormLabel {...allProps} open={open} setOpen={setOpen} children={children} />
|