@uxf/form 11.66.1 → 11.67.1

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/components.d.ts CHANGED
@@ -10,6 +10,7 @@ import * as datetimePickerInputStories from "./datetime-picker-input/datetime-pi
10
10
  import * as dropzoneStories from "./dropzone/dropzone.stories";
11
11
  import * as fileInputStories from "./file-input/file-input.stories";
12
12
  import * as formStories from "./form/form.stories";
13
+ import * as formRendererStories from "./form-renderer/form-renderer.stories";
13
14
  import * as gpsInputStories from "./gps-input/gps-input.stories";
14
15
  import * as moneyInputStories from "./money-input/money-input.stories";
15
16
  import * as multiComboboxStories from "./multi-combobox/multi-combobox.stories";
@@ -71,6 +72,10 @@ export declare const components: {
71
72
  readonly title: "Form";
72
73
  readonly stories: typeof formStories;
73
74
  };
75
+ readonly "form-renderer": {
76
+ readonly title: "FormRenderer";
77
+ readonly stories: typeof formRendererStories;
78
+ };
74
79
  readonly "gps-input": {
75
80
  readonly title: "GpsInput";
76
81
  readonly stories: typeof gpsInputStories;
package/components.js CHANGED
@@ -37,6 +37,7 @@ const datetimePickerInputStories = __importStar(require("./datetime-picker-input
37
37
  const dropzoneStories = __importStar(require("./dropzone/dropzone.stories"));
38
38
  const fileInputStories = __importStar(require("./file-input/file-input.stories"));
39
39
  const formStories = __importStar(require("./form/form.stories"));
40
+ const formRendererStories = __importStar(require("./form-renderer/form-renderer.stories"));
40
41
  const gpsInputStories = __importStar(require("./gps-input/gps-input.stories"));
41
42
  const moneyInputStories = __importStar(require("./money-input/money-input.stories"));
42
43
  const multiComboboxStories = __importStar(require("./multi-combobox/multi-combobox.stories"));
@@ -98,6 +99,10 @@ exports.components = {
98
99
  title: "Form",
99
100
  stories: formStories
100
101
  },
102
+ "form-renderer": {
103
+ title: "FormRenderer",
104
+ stories: formRendererStories
105
+ },
101
106
  "gps-input": {
102
107
  title: "GpsInput",
103
108
  stories: gpsInputStories
@@ -0,0 +1,9 @@
1
+ .uxf-form-renderer__footer {
2
+ display: flex;
3
+ justify-content: flex-end;
4
+ padding: theme("spacing.4");
5
+ }
6
+
7
+ .uxf-form-renderer__body {
8
+ @apply divide-lightBorder dark:divide-darkBorder divide-y;
9
+ }
@@ -0,0 +1 @@
1
+ # FormRenderer
@@ -0,0 +1,33 @@
1
+ export declare const schema: {
2
+ fields: ({
3
+ name: string;
4
+ type: string;
5
+ label: string;
6
+ required: boolean;
7
+ readOnly: boolean;
8
+ editable: boolean;
9
+ autocomplete: string;
10
+ options: null;
11
+ fields: never[];
12
+ } | {
13
+ name: string;
14
+ type: string;
15
+ label: string;
16
+ required: boolean;
17
+ readOnly: boolean;
18
+ editable: boolean;
19
+ autocomplete: null;
20
+ options: null;
21
+ fields: {
22
+ name: string;
23
+ type: string;
24
+ label: string;
25
+ required: boolean;
26
+ readOnly: boolean;
27
+ editable: boolean;
28
+ autocomplete: null;
29
+ options: null;
30
+ fields: never[];
31
+ }[];
32
+ })[];
33
+ };
@@ -0,0 +1,295 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.schema = void 0;
4
+ exports.schema = {
5
+ fields: [
6
+ {
7
+ name: "id",
8
+ type: "integer",
9
+ label: "Id",
10
+ required: true,
11
+ readOnly: true,
12
+ editable: true,
13
+ autocomplete: null,
14
+ options: null,
15
+ fields: [],
16
+ },
17
+ {
18
+ name: "textRequired",
19
+ type: "string",
20
+ label: "Text required",
21
+ required: true,
22
+ readOnly: false,
23
+ editable: true,
24
+ autocomplete: null,
25
+ options: null,
26
+ fields: [],
27
+ },
28
+ {
29
+ name: "textNotRequired",
30
+ type: "string",
31
+ label: "Text optional",
32
+ required: false,
33
+ readOnly: false,
34
+ editable: true,
35
+ autocomplete: null,
36
+ options: null,
37
+ fields: [],
38
+ },
39
+ {
40
+ name: "longTextRequired",
41
+ type: "text",
42
+ label: "LongText required",
43
+ required: true,
44
+ readOnly: false,
45
+ editable: true,
46
+ autocomplete: null,
47
+ options: null,
48
+ fields: [],
49
+ },
50
+ {
51
+ name: "longTextNotRequired",
52
+ type: "text",
53
+ label: "LongText optional",
54
+ required: false,
55
+ readOnly: false,
56
+ editable: true,
57
+ autocomplete: null,
58
+ options: null,
59
+ fields: [],
60
+ },
61
+ {
62
+ name: "imageNotRequired",
63
+ type: "image",
64
+ label: "Image optional",
65
+ required: false,
66
+ readOnly: false,
67
+ editable: true,
68
+ autocomplete: null,
69
+ options: null,
70
+ fields: [],
71
+ },
72
+ {
73
+ name: "fileNotRequired",
74
+ type: "file",
75
+ label: "File optional",
76
+ required: false,
77
+ readOnly: false,
78
+ editable: true,
79
+ autocomplete: null,
80
+ options: null,
81
+ fields: [],
82
+ },
83
+ {
84
+ name: "images",
85
+ type: "images",
86
+ label: "Images",
87
+ required: false,
88
+ readOnly: false,
89
+ editable: true,
90
+ autocomplete: null,
91
+ options: null,
92
+ fields: [],
93
+ },
94
+ {
95
+ name: "dateRequired",
96
+ type: "date",
97
+ label: "Date required",
98
+ required: true,
99
+ readOnly: false,
100
+ editable: true,
101
+ autocomplete: null,
102
+ options: null,
103
+ fields: [],
104
+ },
105
+ {
106
+ name: "dateNotRequired",
107
+ type: "date",
108
+ label: "Date optional",
109
+ required: false,
110
+ readOnly: false,
111
+ editable: true,
112
+ autocomplete: null,
113
+ options: null,
114
+ fields: [],
115
+ },
116
+ {
117
+ name: "dateTimeRequired",
118
+ type: "datetime",
119
+ label: "DateTime required",
120
+ required: true,
121
+ readOnly: false,
122
+ editable: true,
123
+ autocomplete: null,
124
+ options: null,
125
+ fields: [],
126
+ },
127
+ {
128
+ name: "dateTimeNotRequired",
129
+ type: "datetime",
130
+ label: "DateTime optional",
131
+ required: false,
132
+ readOnly: false,
133
+ editable: true,
134
+ autocomplete: null,
135
+ options: null,
136
+ fields: [],
137
+ },
138
+ {
139
+ name: "timeRequired",
140
+ type: "time",
141
+ label: "Time required",
142
+ required: true,
143
+ readOnly: false,
144
+ editable: true,
145
+ autocomplete: null,
146
+ options: null,
147
+ fields: [],
148
+ },
149
+ {
150
+ name: "timeNotRequired",
151
+ type: "time",
152
+ label: "Time optional",
153
+ required: false,
154
+ readOnly: false,
155
+ editable: true,
156
+ autocomplete: null,
157
+ options: null,
158
+ fields: [],
159
+ },
160
+ {
161
+ name: "integerRequired",
162
+ type: "integer",
163
+ label: "Integer required",
164
+ required: true,
165
+ readOnly: false,
166
+ editable: true,
167
+ autocomplete: null,
168
+ options: null,
169
+ fields: [],
170
+ },
171
+ {
172
+ name: "integerNotRequired",
173
+ type: "integer",
174
+ label: "Integer optional",
175
+ required: false,
176
+ readOnly: false,
177
+ editable: true,
178
+ autocomplete: null,
179
+ options: null,
180
+ fields: [],
181
+ },
182
+ {
183
+ name: "isBooleanNotRequired",
184
+ type: "boolean",
185
+ label: "Boolean optional",
186
+ required: false,
187
+ readOnly: false,
188
+ editable: true,
189
+ autocomplete: null,
190
+ options: null,
191
+ fields: [],
192
+ },
193
+ {
194
+ name: "manyToManyBigTest",
195
+ type: "manyToMany",
196
+ label: "ManyToMany",
197
+ required: false,
198
+ readOnly: false,
199
+ editable: true,
200
+ autocomplete: "big-test",
201
+ options: null,
202
+ fields: [],
203
+ },
204
+ {
205
+ name: "manyToOneBigTest",
206
+ type: "manyToOne",
207
+ label: "ManyToOne",
208
+ required: false,
209
+ readOnly: false,
210
+ editable: true,
211
+ autocomplete: "big-test",
212
+ options: null,
213
+ fields: [],
214
+ },
215
+ {
216
+ name: "embedded",
217
+ type: "embedded",
218
+ label: "Embedded",
219
+ required: true,
220
+ readOnly: false,
221
+ editable: true,
222
+ autocomplete: null,
223
+ options: null,
224
+ fields: [
225
+ {
226
+ name: "value",
227
+ type: "integer",
228
+ label: "value",
229
+ required: true,
230
+ readOnly: false,
231
+ editable: true,
232
+ autocomplete: null,
233
+ options: null,
234
+ fields: [],
235
+ },
236
+ {
237
+ name: "label",
238
+ type: "string",
239
+ label: "label",
240
+ required: true,
241
+ readOnly: false,
242
+ editable: true,
243
+ autocomplete: null,
244
+ options: null,
245
+ fields: [],
246
+ },
247
+ ],
248
+ },
249
+ {
250
+ name: "oneToMany",
251
+ type: "oneToMany",
252
+ label: "OneToMany",
253
+ required: true,
254
+ readOnly: false,
255
+ editable: true,
256
+ autocomplete: null,
257
+ options: null,
258
+ fields: [
259
+ {
260
+ name: "id",
261
+ type: "integer",
262
+ label: "Id",
263
+ required: true,
264
+ readOnly: true,
265
+ editable: true,
266
+ autocomplete: null,
267
+ options: null,
268
+ fields: [],
269
+ },
270
+ {
271
+ name: "value",
272
+ type: "integer",
273
+ label: "Big test one to many value",
274
+ required: true,
275
+ readOnly: false,
276
+ editable: true,
277
+ autocomplete: null,
278
+ options: null,
279
+ fields: [],
280
+ },
281
+ {
282
+ name: "label",
283
+ type: "string",
284
+ label: "Big test one to many label",
285
+ required: true,
286
+ readOnly: false,
287
+ editable: true,
288
+ autocomplete: null,
289
+ options: null,
290
+ fields: [],
291
+ },
292
+ ],
293
+ },
294
+ ],
295
+ };
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ import { FieldProps } from "../types";
3
+ export declare function BaseField(props: FieldProps): React.JSX.Element;
4
+ export default BaseField;
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.BaseField = BaseField;
7
+ const autocomplete_1 = require("@uxf/core/api/autocomplete");
8
+ const upload_file_1 = require("@uxf/core/api/upload-file");
9
+ const empty_array_1 = require("@uxf/core/constants/empty-array");
10
+ const checkbox_input_1 = require("@uxf/form/checkbox-input");
11
+ const combobox_1 = require("@uxf/form/combobox");
12
+ const date_picker_input_1 = require("@uxf/form/date-picker-input");
13
+ const datetime_picker_input_1 = require("@uxf/form/datetime-picker-input");
14
+ const dropzone_input_1 = require("@uxf/form/dropzone/dropzone-input");
15
+ const dropzone_list_1 = require("@uxf/form/dropzone/dropzone-list");
16
+ const file_input_1 = require("@uxf/form/file-input");
17
+ const multi_combobox_1 = require("@uxf/form/multi-combobox");
18
+ const number_input_1 = require("@uxf/form/number-input");
19
+ const select_1 = require("@uxf/form/select");
20
+ const text_input_1 = require("@uxf/form/text-input");
21
+ const textarea_1 = require("@uxf/form/textarea");
22
+ const time_picker_input_1 = require("@uxf/form/time-picker-input");
23
+ const label_1 = require("@uxf/ui/label");
24
+ const react_1 = __importDefault(require("react"));
25
+ const defaultUploadHandler = (0, upload_file_1.createUploadHandler)("default");
26
+ // eslint-disable-next-line complexity
27
+ function BaseField(props) {
28
+ var _a, _b, _c, _d, _e, _f, _g;
29
+ const { editable, label, name, readOnly, type } = props.fieldSchema;
30
+ const fieldName = `${(_a = props.prefix) !== null && _a !== void 0 ? _a : ""}${name}`;
31
+ const isDisabled = readOnly || (props.isEditing && !editable);
32
+ const isRequired = !isDisabled && props.fieldSchema.required;
33
+ const autocompleteHandler = (_c = (_b = props.overrides) === null || _b === void 0 ? void 0 : _b.autocomplete) !== null && _c !== void 0 ? _c : autocomplete_1.autocomplete;
34
+ const uploadHandler = (_e = (_d = props.overrides) === null || _d === void 0 ? void 0 : _d.upload) !== null && _e !== void 0 ? _e : defaultUploadHandler;
35
+ /*eslint complexity: ["error", 21]*/
36
+ switch (type) {
37
+ case "file":
38
+ case "logo":
39
+ case "image":
40
+ return (react_1.default.createElement(file_input_1.FileInput, { control: props.control, id: fieldName, isClearable: !isRequired, isDisabled: isDisabled, isRequired: isRequired, label: label, name: fieldName, onUploadFile: uploadHandler }));
41
+ case "enum":
42
+ return (react_1.default.createElement(select_1.Select, { control: props.control, isClearable: !isRequired, isDisabled: isDisabled, isRequired: isRequired, label: label, name: fieldName, options: (_f = props.fieldSchema.options) !== null && _f !== void 0 ? _f : empty_array_1.EMPTY_ARRAY }));
43
+ case "boolean":
44
+ return (react_1.default.createElement(checkbox_input_1.CheckboxInput, { control: props.control, isDisabled: isDisabled, isRequired: isRequired, label: label, name: fieldName }));
45
+ case "date":
46
+ return (react_1.default.createElement(date_picker_input_1.DatePickerInput, { control: props.control, isClearable: !isRequired, isDisabled: isDisabled, isRequired: isRequired, label: label, name: fieldName }));
47
+ case "datetime":
48
+ return (react_1.default.createElement(datetime_picker_input_1.DatetimePickerInput, { control: props.control, isClearable: !isRequired, isDisabled: isDisabled, isRequired: isRequired, label: label, name: fieldName }));
49
+ case "time":
50
+ return (react_1.default.createElement(time_picker_input_1.TimePickerInput, { control: props.control, isClearable: !isRequired, isDisabled: isDisabled, isRequired: isRequired, label: label, name: fieldName }));
51
+ case "files":
52
+ case "images":
53
+ return (react_1.default.createElement(react_1.default.Fragment, null,
54
+ react_1.default.createElement(label_1.Label, null, label),
55
+ react_1.default.createElement("div", { className: "mb-3" },
56
+ react_1.default.createElement(dropzone_input_1.DropzoneInput, { control: props.control, label: label, name: fieldName, onUploadFile: uploadHandler })),
57
+ react_1.default.createElement(dropzone_list_1.DropzoneList, { control: props.control, errorText: "Soubor se nepoda\u0159ilo nahr\u00E1t.", name: fieldName, onRemoveConfirm: (_g = props.overrides) === null || _g === void 0 ? void 0 : _g.onRemoveConfirm })));
58
+ case "manyToMany":
59
+ return (react_1.default.createElement(multi_combobox_1.MultiCombobox, { control: props.control, isDisabled: isDisabled, isRequired: isRequired, label: label, loadOptions: (term) => { var _a; return autocompleteHandler((_a = props.fieldSchema.autocomplete) !== null && _a !== void 0 ? _a : "", term); }, name: fieldName }));
60
+ case "manyToOne":
61
+ return (react_1.default.createElement(combobox_1.Combobox, { control: props.control, isClearable: !isRequired, isDisabled: isDisabled, isRequired: isRequired, label: label, loadOptions: (term) => { var _a; return autocompleteHandler((_a = props.fieldSchema.autocomplete) !== null && _a !== void 0 ? _a : "", term); }, name: fieldName }));
62
+ case "integer":
63
+ return (react_1.default.createElement(number_input_1.NumberInput, { control: props.control, isDisabled: isDisabled, isRequired: isRequired, label: label, name: fieldName }));
64
+ case "text":
65
+ return (react_1.default.createElement(textarea_1.Textarea, { control: props.control, isDisabled: isDisabled, isRequired: isRequired, label: label, name: fieldName }));
66
+ default:
67
+ return (react_1.default.createElement(text_input_1.TextInput, { control: props.control, isDisabled: isDisabled, isRequired: isRequired, label: label, name: fieldName }));
68
+ }
69
+ }
70
+ exports.default = BaseField;
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ import { FieldProps } from "../types";
3
+ declare function Field(props: FieldProps): React.JSX.Element | null;
4
+ export default Field;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const react_1 = __importDefault(require("react"));
7
+ function Field(props) {
8
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
9
+ if (props.fieldSchema.fields === null) {
10
+ return null;
11
+ }
12
+ return (react_1.default.createElement("div", { className: "grid gap-2" }, props.fieldSchema.fields.map((schema, i) => {
13
+ var _a;
14
+ const FieldComponent = (_a = props.fields[schema.type]) !== null && _a !== void 0 ? _a : props.fields.default;
15
+ return (react_1.default.createElement("div", { key: i },
16
+ react_1.default.createElement(FieldComponent, { ...props, fieldSchema: { ...schema, label: `${props.fieldSchema.label} ${schema.label}` }, prefix: `${props.fieldSchema.name}.` })));
17
+ })));
18
+ }
19
+ exports.default = Field;
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ import { FieldProps } from "../types";
3
+ declare function Field(props: FieldProps): React.JSX.Element;
4
+ export default Field;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ const icon_button_1 = require("@uxf/ui/icon-button");
27
+ const react_1 = __importStar(require("react"));
28
+ const react_hook_form_1 = require("react-hook-form");
29
+ function Field(props) {
30
+ const { fields, remove, append } = (0, react_hook_form_1.useFieldArray)({ control: props.control, name: props.fieldSchema.name });
31
+ return (react_1.default.createElement(react_1.default.Fragment, null,
32
+ react_1.default.createElement("p", { className: "mb-2 font-medium" }, props.fieldSchema.label),
33
+ react_1.default.createElement("div", { className: "grid gap-2" }, fields.map((name, index) => (react_1.default.createElement(react_1.Fragment, { key: name.id },
34
+ props.fieldSchema.fields.map((schema, i) => {
35
+ var _a;
36
+ if (schema.name === "id") {
37
+ return react_1.default.createElement("input", { key: `${schema.name}-${i}`, name: "id", type: "hidden" });
38
+ }
39
+ const FieldComponent = (_a = props.fields[schema.type]) !== null && _a !== void 0 ? _a : props.fields.default;
40
+ return (react_1.default.createElement("div", { key: `${schema.name}-${i}` },
41
+ react_1.default.createElement(FieldComponent, { ...props, fieldSchema: schema, prefix: props.prefix
42
+ ? `${props.prefix}.${props.fieldSchema.name}.${index}.`
43
+ : `${props.fieldSchema.name}.${index}.` })));
44
+ }),
45
+ react_1.default.createElement("div", { className: "flex justify-end" },
46
+ react_1.default.createElement(icon_button_1.IconButton, { iconName: "trash", label: "Smazat polo\u017Eku", onClick: () => remove(index), variant: "secondary" })))))),
47
+ react_1.default.createElement("div", { className: "mt-2" },
48
+ react_1.default.createElement(icon_button_1.IconButton, { iconName: "plus", label: "P\u0159idat polo\u017Eku", onClick: () => append({ id: null }), variant: "secondary" }))));
49
+ }
50
+ exports.default = Field;
@@ -0,0 +1,16 @@
1
+ import { FormProps as UXFFormProps } from "@uxf/form/form";
2
+ import React, { FunctionComponent } from "react";
3
+ import { FieldValues, FormState } from "react-hook-form";
4
+ import { FormRendererFields, FormSchema } from "./types";
5
+ type SubmitButtonComponent<TFieldValues extends FieldValues = FieldValues> = FunctionComponent<{
6
+ formState: FormState<TFieldValues>;
7
+ }>;
8
+ interface FormRendererProps<T extends FieldValues> extends Omit<UXFFormProps<T>, "children"> {
9
+ className?: string;
10
+ schema: FormSchema;
11
+ fields: FormRendererFields;
12
+ isEditing?: boolean;
13
+ SubmitButton?: SubmitButtonComponent<T>;
14
+ }
15
+ export declare function FormRenderer<T extends FieldValues>(props: FormRendererProps<T>): React.JSX.Element;
16
+ export {};
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.FormRenderer = FormRenderer;
7
+ const form_1 = require("@uxf/form/form");
8
+ const button_1 = require("@uxf/ui/button");
9
+ const react_1 = __importDefault(require("react"));
10
+ const BaseSubmitButton = (props) => {
11
+ const { isSubmitting } = props.formState;
12
+ return (react_1.default.createElement(button_1.Button, { isDisabled: isSubmitting, type: "submit" }, "Ulo\u017Eit"));
13
+ };
14
+ function FormRenderer(props) {
15
+ var _a;
16
+ const SubmitButton = (_a = props.SubmitButton) !== null && _a !== void 0 ? _a : BaseSubmitButton;
17
+ return (react_1.default.createElement(form_1.Form, { className: "uxf-form-renderer", formApi: props.formApi, id: props.id, onSubmit: props.onSubmit },
18
+ react_1.default.createElement("div", { className: "uxf-form-renderer__body" }, props.schema.fields.map((field, i) => {
19
+ var _a;
20
+ const Field = (_a = props.fields[field.type]) !== null && _a !== void 0 ? _a : props.fields.default;
21
+ return (react_1.default.createElement("div", { className: "p-4", key: i },
22
+ react_1.default.createElement(Field, { control: props.formApi.control, fieldSchema: field, fields: props.fields, isEditing: props.isEditing })));
23
+ })),
24
+ react_1.default.createElement("div", { className: "uxf-form-renderer__footer" },
25
+ react_1.default.createElement(SubmitButton, { formState: props.formApi.formState }))));
26
+ }
@@ -0,0 +1,2 @@
1
+ import React from "react";
2
+ export declare function Example(): React.JSX.Element;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ "use client";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.Example = Example;
8
+ const react_1 = __importDefault(require("react"));
9
+ const react_hook_form_1 = require("react-hook-form");
10
+ const big_test_schema_1 = require("./big-test-schema");
11
+ const base_field_1 = __importDefault(require("./field/base-field"));
12
+ const embedded_1 = __importDefault(require("./field/embedded"));
13
+ const one_to_many_1 = __importDefault(require("./field/one-to-many"));
14
+ const form_renderer_1 = require("./form-renderer");
15
+ const fields = {
16
+ default: base_field_1.default,
17
+ embedded: embedded_1.default,
18
+ oneToMany: one_to_many_1.default,
19
+ };
20
+ function Example() {
21
+ const formApi = (0, react_hook_form_1.useForm)({ defaultValues: {} });
22
+ return react_1.default.createElement(form_renderer_1.FormRenderer, { fields: fields, formApi: formApi, id: "example-form", onSubmit: console.log, schema: big_test_schema_1.schema });
23
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./form-renderer";
2
+ export * from "./types";
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./form-renderer"), exports);
18
+ __exportStar(require("./types"), exports);
@@ -0,0 +1,2 @@
1
+ import { FormSchema } from "./types";
2
+ export declare const mapToRequestObject: (values: any, schema: FormSchema) => any;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mapToRequestObject = void 0;
4
+ const empty_array_1 = require("@uxf/core/constants/empty-array");
5
+ const mapToRequestObject = (values, schema) => {
6
+ var _a, _b;
7
+ const requestObject = { ...values };
8
+ for (const field of schema.fields) {
9
+ const { name, type } = field;
10
+ const value = requestObject[name];
11
+ switch (type) {
12
+ case "boolean":
13
+ requestObject[name] = Boolean(value);
14
+ break;
15
+ case "file":
16
+ case "image":
17
+ requestObject[name] = value ? value.id : value;
18
+ break;
19
+ case "content":
20
+ // TODO search string
21
+ requestObject[name] = value ? { data: (_a = value.data) !== null && _a !== void 0 ? _a : empty_array_1.EMPTY_ARRAY, search: (_b = value.search) !== null && _b !== void 0 ? _b : "" } : null;
22
+ break;
23
+ case "embedded":
24
+ requestObject[name] = (0, exports.mapToRequestObject)(value, field);
25
+ break;
26
+ }
27
+ }
28
+ return requestObject;
29
+ };
30
+ exports.mapToRequestObject = mapToRequestObject;
@@ -0,0 +1,39 @@
1
+ import { Autocomplete } from "@uxf/core/api/autocomplete";
2
+ import { OnUploadFileHandler } from "@uxf/core/types";
3
+ import { DropzoneFile } from "@uxf/ui/dropzone/types";
4
+ import { FunctionComponent } from "react";
5
+ import { Control } from "react-hook-form";
6
+ export interface FieldSchema {
7
+ autocomplete: string | null;
8
+ name: string;
9
+ type: string;
10
+ label: string;
11
+ required: boolean;
12
+ readOnly: boolean;
13
+ editable: boolean;
14
+ fields: FieldSchema[];
15
+ options: Array<{
16
+ id: string | number;
17
+ label: string;
18
+ }> | null;
19
+ }
20
+ export interface FormSchema {
21
+ fields: FieldSchema[];
22
+ }
23
+ export interface FieldProps {
24
+ fieldSchema: FieldSchema;
25
+ fields: FormRendererFields;
26
+ isEditing?: boolean;
27
+ prefix?: string;
28
+ control: Control<any>;
29
+ overrides?: {
30
+ autocomplete?: Autocomplete;
31
+ upload?: OnUploadFileHandler;
32
+ onRemoveConfirm?: (file: DropzoneFile) => Promise<boolean>;
33
+ };
34
+ }
35
+ export type FieldComponent = FunctionComponent<FieldProps>;
36
+ export type FormRendererFields = {
37
+ [type: string]: FieldComponent;
38
+ default: FieldComponent;
39
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/package.json CHANGED
@@ -1,13 +1,14 @@
1
1
  {
2
2
  "name": "@uxf/form",
3
- "version": "11.66.1",
3
+ "version": "11.67.1",
4
4
  "description": "",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
8
8
  "scripts": {
9
- "build": "tsc -P tsconfig.json",
10
- "typecheck": "tsc --noEmit --skipLibCheck"
9
+ "build": "npm run css:prepare && tsc -P tsconfig.json",
10
+ "typecheck": "tsc --noEmit --skipLibCheck",
11
+ "css:prepare": "rm -rf ./css && mkdir css && cp ./**/*.css ./css/"
11
12
  },
12
13
  "author": "UX Fans s.r.o",
13
14
  "bin": {
@@ -15,7 +16,7 @@
15
16
  },
16
17
  "license": "MIT",
17
18
  "dependencies": {
18
- "@uxf/ui": "11.66.0",
19
+ "@uxf/ui": "11.67.0",
19
20
  "coordinate-parser": "1.0.7",
20
21
  "dayjs": "1.11.13",
21
22
  "react-hook-form": "7.53.0"
package/readmes.d.ts CHANGED
@@ -12,6 +12,7 @@ export declare const readmes: {
12
12
  readonly dropzone: typeof avatarFileInputReadme;
13
13
  readonly "file-input": typeof avatarFileInputReadme;
14
14
  readonly form: typeof avatarFileInputReadme;
15
+ readonly "form-renderer": typeof avatarFileInputReadme;
15
16
  readonly "gps-input": typeof avatarFileInputReadme;
16
17
  readonly "money-input": typeof avatarFileInputReadme;
17
18
  readonly "multi-combobox": typeof avatarFileInputReadme;
package/readmes.js CHANGED
@@ -17,18 +17,19 @@ const README_md_9 = __importDefault(require("./datetime-picker-input/README.md")
17
17
  const README_md_10 = __importDefault(require("./dropzone/README.md"));
18
18
  const README_md_11 = __importDefault(require("./file-input/README.md"));
19
19
  const README_md_12 = __importDefault(require("./form/README.md"));
20
- const README_md_13 = __importDefault(require("./gps-input/README.md"));
21
- const README_md_14 = __importDefault(require("./money-input/README.md"));
22
- const README_md_15 = __importDefault(require("./multi-combobox/README.md"));
23
- const README_md_16 = __importDefault(require("./multi-select/README.md"));
24
- const README_md_17 = __importDefault(require("./number-input/README.md"));
25
- const README_md_18 = __importDefault(require("./password-input/README.md"));
26
- const README_md_19 = __importDefault(require("./radio-group/README.md"));
27
- const README_md_20 = __importDefault(require("./select/README.md"));
28
- const README_md_21 = __importDefault(require("./text-input/README.md"));
29
- const README_md_22 = __importDefault(require("./textarea/README.md"));
30
- const README_md_23 = __importDefault(require("./time-picker-input/README.md"));
31
- const README_md_24 = __importDefault(require("./toggle/README.md"));
20
+ const README_md_13 = __importDefault(require("./form-renderer/README.md"));
21
+ const README_md_14 = __importDefault(require("./gps-input/README.md"));
22
+ const README_md_15 = __importDefault(require("./money-input/README.md"));
23
+ const README_md_16 = __importDefault(require("./multi-combobox/README.md"));
24
+ const README_md_17 = __importDefault(require("./multi-select/README.md"));
25
+ const README_md_18 = __importDefault(require("./number-input/README.md"));
26
+ const README_md_19 = __importDefault(require("./password-input/README.md"));
27
+ const README_md_20 = __importDefault(require("./radio-group/README.md"));
28
+ const README_md_21 = __importDefault(require("./select/README.md"));
29
+ const README_md_22 = __importDefault(require("./text-input/README.md"));
30
+ const README_md_23 = __importDefault(require("./textarea/README.md"));
31
+ const README_md_24 = __importDefault(require("./time-picker-input/README.md"));
32
+ const README_md_25 = __importDefault(require("./toggle/README.md"));
32
33
  exports.readmes = {
33
34
  "avatar-file-input": README_md_1.default,
34
35
  "checkbox-button": README_md_2.default,
@@ -42,16 +43,17 @@ exports.readmes = {
42
43
  "dropzone": README_md_10.default,
43
44
  "file-input": README_md_11.default,
44
45
  "form": README_md_12.default,
45
- "gps-input": README_md_13.default,
46
- "money-input": README_md_14.default,
47
- "multi-combobox": README_md_15.default,
48
- "multi-select": README_md_16.default,
49
- "number-input": README_md_17.default,
50
- "password-input": README_md_18.default,
51
- "radio-group": README_md_19.default,
52
- "select": README_md_20.default,
53
- "text-input": README_md_21.default,
54
- "textarea": README_md_22.default,
55
- "time-picker-input": README_md_23.default,
56
- "toggle": README_md_24.default,
46
+ "form-renderer": README_md_13.default,
47
+ "gps-input": README_md_14.default,
48
+ "money-input": README_md_15.default,
49
+ "multi-combobox": README_md_16.default,
50
+ "multi-select": README_md_17.default,
51
+ "number-input": README_md_18.default,
52
+ "password-input": README_md_19.default,
53
+ "radio-group": README_md_20.default,
54
+ "select": README_md_21.default,
55
+ "text-input": README_md_22.default,
56
+ "textarea": README_md_23.default,
57
+ "time-picker-input": README_md_24.default,
58
+ "toggle": README_md_25.default,
57
59
  };