@react-fabric/form 1.0.0-beta.33 → 1.0.0-beta.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/dist/cjs/builder/FormField.js +3 -3
  2. package/dist/cjs/builder/SchemaEditor.js +43 -404
  3. package/dist/cjs/builder/components/AddSchemaFields.js +62 -0
  4. package/dist/cjs/builder/components/SchemaArrayForm.js +144 -0
  5. package/dist/cjs/builder/components/SchemaField.js +411 -0
  6. package/dist/cjs/form/Form.js +11 -8
  7. package/dist/cjs/index.js +1 -0
  8. package/dist/cjs/input/ColorInput.js +1 -1
  9. package/dist/cjs/input/DateInput.js +2 -2
  10. package/dist/cjs/input/File.js +1 -1
  11. package/dist/cjs/input/Hidden.js +1 -1
  12. package/dist/cjs/input/Input.js +1 -1
  13. package/dist/cjs/input/Number.js +1 -1
  14. package/dist/cjs/input/Password.js +1 -1
  15. package/dist/cjs/input/RangeSlider.js +1 -1
  16. package/dist/cjs/input/Search.js +1 -1
  17. package/dist/cjs/input/Slider.js +1 -1
  18. package/dist/cjs/input/Textarea.js +1 -1
  19. package/dist/cjs/types/schema.js +2 -0
  20. package/dist/esm/builder/FormField.js +3 -3
  21. package/dist/esm/builder/SchemaEditor.js +45 -406
  22. package/dist/esm/builder/components/AddSchemaFields.js +62 -0
  23. package/dist/esm/builder/components/SchemaArrayForm.js +144 -0
  24. package/dist/esm/builder/components/SchemaField.js +411 -0
  25. package/dist/esm/form/Form.js +11 -8
  26. package/dist/esm/index.js +1 -1
  27. package/dist/esm/input/ColorInput.js +1 -1
  28. package/dist/esm/input/DateInput.js +2 -2
  29. package/dist/esm/input/File.js +1 -1
  30. package/dist/esm/input/Hidden.js +1 -1
  31. package/dist/esm/input/Input.js +1 -1
  32. package/dist/esm/input/Number.js +1 -1
  33. package/dist/esm/input/Password.js +1 -1
  34. package/dist/esm/input/RangeSlider.js +1 -1
  35. package/dist/esm/input/Search.js +1 -1
  36. package/dist/esm/input/Slider.js +1 -1
  37. package/dist/esm/input/Textarea.js +1 -1
  38. package/dist/esm/types/schema.js +2 -1
  39. package/dist/types/builder/SchemaEditor.d.ts +2 -10
  40. package/dist/types/builder/components/AddSchemaFields.d.ts +2 -0
  41. package/dist/types/builder/components/SchemaArrayForm.d.ts +2 -0
  42. package/dist/types/builder/components/SchemaField.d.ts +10 -0
  43. package/dist/types/form/Form.d.ts +1 -5
  44. package/dist/types/index.d.ts +1 -1
  45. package/dist/types/input/ColorInput.d.ts +1 -1
  46. package/dist/types/types/index.d.ts +1 -1
  47. package/dist/types/types/schema.d.ts +26 -0
  48. package/package.json +5 -5
  49. package/src/builder/FormField.tsx +3 -3
  50. package/src/builder/SchemaEditor.tsx +24 -398
  51. package/src/builder/components/AddSchemaFields.tsx +74 -0
  52. package/src/builder/components/SchemaArrayForm.tsx +158 -0
  53. package/src/builder/components/SchemaField.tsx +432 -0
  54. package/src/form/Form.tsx +6 -9
  55. package/src/index.ts +6 -1
  56. package/src/input/ArrayInput.tsx +1 -0
  57. package/src/input/ColorInput.tsx +5 -2
  58. package/src/input/DateInput.tsx +2 -2
  59. package/src/input/File.tsx +1 -1
  60. package/src/input/Hidden.tsx +4 -3
  61. package/src/input/Input.tsx +1 -1
  62. package/src/input/Number.tsx +1 -1
  63. package/src/input/Password.tsx +1 -1
  64. package/src/input/RangeSlider.tsx +1 -1
  65. package/src/input/Search.tsx +1 -1
  66. package/src/input/Slider.tsx +1 -1
  67. package/src/input/Textarea.tsx +1 -1
  68. package/src/types/index.ts +1 -1
  69. package/src/types/schema.ts +30 -0
@@ -0,0 +1,144 @@
1
+ 'use client';
2
+
3
+ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
4
+ import { DndContext } from '@dnd-kit/core';
5
+ import { restrictToVerticalAxis } from '@dnd-kit/modifiers';
6
+ import { SortableContext } from '@dnd-kit/sortable';
7
+ import { useOverlayService, Header, Button, CoreIcons, Content } from '@react-fabric/core';
8
+ import { isArray } from '@react-fabric/utilities';
9
+ import { useState, useCallback } from 'react';
10
+ import { useFormContext, useFieldArray } from 'react-hook-form';
11
+ import { DATA_TYPES } from '../../types/schema.js';
12
+ import { AddSchemaFields } from './AddSchemaFields.js';
13
+ import { SchemaField } from './SchemaField.js';
14
+ import { jsx, jsxs } from 'react/jsx-runtime';
15
+
16
+ var SchemaArrayForm = function SchemaArrayForm(_ref) {
17
+ var dynamic = _ref.dynamic,
18
+ acceptableTypes = _ref.acceptableTypes,
19
+ optionLists = _ref.optionLists;
20
+ var form = useFormContext();
21
+ var _useState = useState(true),
22
+ _useState2 = _slicedToArray(_useState, 2),
23
+ defaultOpen = _useState2[0],
24
+ setDefaultOpen = _useState2[1];
25
+ var _useFieldArray = useFieldArray({
26
+ name: "schema",
27
+ control: form.control
28
+ }),
29
+ fields = _useFieldArray.fields,
30
+ append = _useFieldArray.append,
31
+ remove = _useFieldArray.remove,
32
+ update = _useFieldArray.update,
33
+ move = _useFieldArray.move;
34
+ var handleTypeChange = useCallback(function (index, val) {
35
+ update(index, val);
36
+ }, []);
37
+ var handleRemove = useCallback(function (index) {
38
+ remove(index);
39
+ }, []);
40
+ var _useOverlayService = useOverlayService(AddSchemaFields),
41
+ _useOverlayService2 = _slicedToArray(_useOverlayService, 2),
42
+ AddModal = _useOverlayService2[0],
43
+ openAddfields = _useOverlayService2[1];
44
+ var handleAdd = useCallback(function () {
45
+ void openAddfields().then(function (fields) {
46
+ if (isArray(fields)) {
47
+ var existing = form.getValues().schema.map(function (field) {
48
+ return field.id;
49
+ });
50
+ fields.forEach(function (field) {
51
+ if (!existing.includes(field)) {
52
+ append({
53
+ id: field,
54
+ datatype: DATA_TYPES.STRING,
55
+ label: ""
56
+ });
57
+ }
58
+ });
59
+ }
60
+ });
61
+ }, []);
62
+ var Wrapper = useCallback(function (_ref2) {
63
+ var children = _ref2.children;
64
+ if (dynamic) {
65
+ // pass id list to dnd context
66
+ var idMap = fields.map(function (item) {
67
+ return item.id;
68
+ });
69
+ var handleDragEnd = function handleDragEnd(e) {
70
+ if (e.over && e.active.id !== e.over.id) {
71
+ // find index of item and drop over
72
+ var active = idMap.indexOf("".concat(e.active.id));
73
+ var end = idMap.indexOf("".concat(e.over.id));
74
+ move(active, end);
75
+ }
76
+ };
77
+ return /*#__PURE__*/jsx(DndContext, {
78
+ onDragEnd: handleDragEnd,
79
+ modifiers: [restrictToVerticalAxis],
80
+ children: /*#__PURE__*/jsx(SortableContext, {
81
+ items: idMap,
82
+ children: children
83
+ })
84
+ });
85
+ }
86
+ return children;
87
+ }, [dynamic, fields]);
88
+ // @ts-expect-error ignore
89
+ Wrapper.displayName = "SortableWrapper";
90
+ return /*#__PURE__*/jsxs(Wrapper, {
91
+ children: [/*#__PURE__*/jsxs(Header, {
92
+ flex: true,
93
+ justify: "end",
94
+ className: "gap-1 px-2",
95
+ children: [dynamic && /*#__PURE__*/jsx(Button, {
96
+ size: "sm",
97
+ variant: "link",
98
+ icon: CoreIcons.insert,
99
+ "aria-label": "add field",
100
+ onClick: handleAdd
101
+ }), /*#__PURE__*/jsx(Button, {
102
+ size: "sm",
103
+ variant: "link",
104
+ icon: CoreIcons.colapseAllVar,
105
+ "aria-label": "collapse all",
106
+ onClick: function onClick() {
107
+ return setDefaultOpen(false);
108
+ }
109
+ }), /*#__PURE__*/jsx(Button, {
110
+ size: "sm",
111
+ variant: "link",
112
+ icon: CoreIcons.expandAllVar,
113
+ "aria-label": "expand all",
114
+ onClick: function onClick() {
115
+ return setDefaultOpen(true);
116
+ }
117
+ })]
118
+ }), /*#__PURE__*/jsx(Content, {
119
+ className: "divide-y",
120
+ children: fields.map(function (field, index) {
121
+ return /*#__PURE__*/jsx(SchemaField, {
122
+ defaultOpen: defaultOpen,
123
+ id: form.getValues().schema[index].id,
124
+ fieldId: field.id,
125
+ field: "schema.".concat(index),
126
+ dynamic: dynamic,
127
+ optionLists: optionLists,
128
+ onRemove: function onRemove() {
129
+ return handleRemove(index);
130
+ },
131
+ getModel: function getModel() {
132
+ return form.getValues().schema[index];
133
+ },
134
+ onTypeChange: function onTypeChange(val) {
135
+ return handleTypeChange(index, val);
136
+ },
137
+ acceptableTypes: acceptableTypes !== null && acceptableTypes !== void 0 ? acceptableTypes : Object.values(DATA_TYPES)
138
+ }, index);
139
+ })
140
+ }), AddModal]
141
+ });
142
+ };
143
+
144
+ export { SchemaArrayForm };
@@ -0,0 +1,411 @@
1
+ 'use client';
2
+
3
+ import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
4
+ import _defineProperty from '@babel/runtime/helpers/defineProperty';
5
+ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
6
+ import { useSortable } from '@dnd-kit/sortable';
7
+ import { CSS } from '@dnd-kit/utilities';
8
+ import { useOverlayService, Modal, Content, Footer, Button, Collapsable, CoreIcons, ToggleButtonGroup } from '@react-fabric/core';
9
+ import { EMPTY_ARRAY } from '@react-fabric/utilities';
10
+ import classNames from 'classnames';
11
+ import { useState, useCallback, useEffect, Fragment } from 'react';
12
+ import { Controller } from '../../form/Controller.js';
13
+ import { ArrayInput } from '../../input/ArrayInput.js';
14
+ import { Checkbox } from '../../input/Checkbox.js';
15
+ import { DateInput } from '../../input/DateInput.js';
16
+ import { Field } from '../../input/Field.js';
17
+ import { HiddenInput } from '../../input/Hidden.js';
18
+ import { Input } from '../../input/Input.js';
19
+ import { Number } from '../../input/Number.js';
20
+ import { Select } from '../../select/Select.js';
21
+ import { SCHEMA_CUSTOM_LIST, DATA_TYPES } from '../../types/schema.js';
22
+ import { jsxs, jsx } from 'react/jsx-runtime';
23
+
24
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
25
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
26
+ var SchemaField = function SchemaField(_ref) {
27
+ var id = _ref.id,
28
+ field = _ref.field,
29
+ fieldId = _ref.fieldId,
30
+ getModel = _ref.getModel,
31
+ onRemove = _ref.onRemove,
32
+ _ref$defaultOpen = _ref.defaultOpen,
33
+ defaultOpen = _ref$defaultOpen === void 0 ? true : _ref$defaultOpen,
34
+ _ref$optionLists = _ref.optionLists,
35
+ optionLists = _ref$optionLists === void 0 ? EMPTY_ARRAY : _ref$optionLists,
36
+ dynamic = _ref.dynamic,
37
+ onTypeChange = _ref.onTypeChange,
38
+ acceptableTypes = _ref.acceptableTypes;
39
+ var _useState = useState(),
40
+ _useState2 = _slicedToArray(_useState, 2),
41
+ type = _useState2[0],
42
+ setType = _useState2[1];
43
+ var _useState3 = useState(false),
44
+ _useState4 = _slicedToArray(_useState3, 2),
45
+ multiple = _useState4[0],
46
+ setMultiple = _useState4[1];
47
+ var _useState5 = useState(false),
48
+ _useState6 = _slicedToArray(_useState5, 2),
49
+ hasOptions = _useState6[0],
50
+ setHasOptions = _useState6[1];
51
+ var _useState7 = useState(false),
52
+ _useState8 = _slicedToArray(_useState7, 2),
53
+ customOptions = _useState8[0],
54
+ setCustomOptions = _useState8[1];
55
+ var SortableItem = useCallback(function (_ref2) {
56
+ var id = _ref2.id,
57
+ children = _ref2.children,
58
+ className = _ref2.className;
59
+ if (dynamic) {
60
+ var _useSortable = useSortable({
61
+ id: id
62
+ }),
63
+ attributes = _useSortable.attributes,
64
+ listeners = _useSortable.listeners,
65
+ setNodeRef = _useSortable.setNodeRef,
66
+ transform = _useSortable.transform,
67
+ transition = _useSortable.transition,
68
+ isDragging = _useSortable.isDragging;
69
+ return /*#__PURE__*/jsxs("div", {
70
+ className: className,
71
+ ref: setNodeRef,
72
+ style: {
73
+ transform: CSS.Transform.toString(transform),
74
+ transition: transition
75
+ },
76
+ children: [/*#__PURE__*/jsx("div", _objectSpread(_objectSpread(_objectSpread({
77
+ className: classNames("invisible group-hover/field:visible my-2 w-4", isDragging ? "cursor-grabbing" : "cursor-grab")
78
+ }, attributes), listeners), {}, {
79
+ style: {
80
+ backgroundImage: "url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' height='4' width='4'%3E%3Ccircle cx='2' cy='2' r='1' fill='%238888' /%3E%3C/svg%3E \")"
81
+ }
82
+ })), children]
83
+ });
84
+ }
85
+ return /*#__PURE__*/jsx("div", {
86
+ className: className,
87
+ children: children
88
+ });
89
+ }, [dynamic]);
90
+ // @ts-expect-error ignore
91
+ SortableItem.displayName = "SortableItem";
92
+ var _useOverlayService = useOverlayService(function (props) {
93
+ return /*#__PURE__*/jsxs(Modal, _objectSpread(_objectSpread({}, props), {}, {
94
+ children: [/*#__PURE__*/jsx(Content, {
95
+ children: /*#__PURE__*/jsx(ArrayInput, {
96
+ name: "".concat(field, ".options"),
97
+ onAdd: function onAdd() {
98
+ return String("");
99
+ },
100
+ children: /*#__PURE__*/jsx(Controller, {
101
+ children: /*#__PURE__*/jsx(Input, {})
102
+ })
103
+ })
104
+ }), /*#__PURE__*/jsx(Footer, {
105
+ flex: true,
106
+ justify: "end",
107
+ className: "sticky bottom-0 border-t bg-base px-6 py-2",
108
+ children: /*#__PURE__*/jsx(Button, {
109
+ variant: "link",
110
+ onClick: props.onClose,
111
+ children: "Close"
112
+ })
113
+ })]
114
+ }));
115
+ }),
116
+ _useOverlayService2 = _slicedToArray(_useOverlayService, 2),
117
+ OptionModal = _useOverlayService2[0],
118
+ openOptionModal = _useOverlayService2[1];
119
+ useEffect(function () {
120
+ setTimeout(function () {
121
+ var model = getModel();
122
+ setType(model.datatype);
123
+ setMultiple(model.multiple);
124
+ setHasOptions(!!model.optionList);
125
+ setCustomOptions(model.optionList === SCHEMA_CUSTOM_LIST);
126
+ }, 10);
127
+ }, []);
128
+ var handleTypeChange = useCallback(function (type) {
129
+ if (type) {
130
+ var modelRef = getModel();
131
+ var reset = {
132
+ datatype: type,
133
+ id: field,
134
+ label: modelRef.label,
135
+ defaultValue: modelRef.defaultValue,
136
+ required: modelRef.required,
137
+ multiple: type === DATA_TYPES.AVATAR ? false : modelRef.multiple,
138
+ minItems: modelRef.minItems,
139
+ maxItems: modelRef.maxItems
140
+ };
141
+ if (type === DATA_TYPES.STRING) {
142
+ reset = Object.assign(reset, {
143
+ optionList: modelRef.optionList,
144
+ options: modelRef.options,
145
+ regex: modelRef.regex
146
+ });
147
+ } else if (type === DATA_TYPES.DATE) {
148
+ reset = Object.assign(reset, {
149
+ type: "date"
150
+ });
151
+ } else if (type === DATA_TYPES.NUMBER || type === DATA_TYPES.RANGE) {
152
+ reset = Object.assign(reset, {
153
+ min: modelRef.min,
154
+ max: modelRef.max,
155
+ step: modelRef.step
156
+ });
157
+ }
158
+ if (type === DATA_TYPES.AVATAR) {
159
+ setMultiple(false);
160
+ }
161
+ onTypeChange(reset);
162
+ setType(type);
163
+ }
164
+ }, []);
165
+ return /*#__PURE__*/jsx(SortableItem, {
166
+ id: fieldId,
167
+ className: "flex flex-nowrap gap-1 group/field",
168
+ children: /*#__PURE__*/jsxs(Collapsable, {
169
+ open: defaultOpen,
170
+ className: "flex-1",
171
+ children: [/*#__PURE__*/jsxs("div", {
172
+ className: "flex flex-nowrap items-center",
173
+ children: [/*#__PURE__*/jsx("span", {
174
+ className: "flex-1 truncate",
175
+ children: id
176
+ }), dynamic && /*#__PURE__*/jsx(Button, {
177
+ size: "sm",
178
+ color: "danger",
179
+ variant: "link",
180
+ "aria-label": "Delete",
181
+ stopPropagation: true,
182
+ icon: CoreIcons.trash,
183
+ onClick: onRemove,
184
+ className: "invisible group-hover/field:visible"
185
+ })]
186
+ }), /*#__PURE__*/jsxs("div", {
187
+ className: "flex flex-col gap-1 pb-4",
188
+ children: [/*#__PURE__*/jsx(Controller, {
189
+ name: "".concat(field, ".id"),
190
+ children: /*#__PURE__*/jsx(HiddenInput, {
191
+ hiddenValue: id
192
+ })
193
+ }), /*#__PURE__*/jsx(Controller, {
194
+ name: "".concat(field, ".datatype"),
195
+ children: /*#__PURE__*/jsx(Select, {
196
+ inline: true,
197
+ label: "Type",
198
+ placeholder: "Data type",
199
+ options: acceptableTypes,
200
+ onChange: function onChange(val) {
201
+ return handleTypeChange(val);
202
+ }
203
+ })
204
+ }), /*#__PURE__*/jsx(Controller, {
205
+ name: "".concat(field, ".label"),
206
+ children: /*#__PURE__*/jsx(Input, {
207
+ inline: true,
208
+ label: "Label",
209
+ allowClear: true,
210
+ placeholder: "Label...",
211
+ decorateEndShowWhenEmpty: true,
212
+ decorateEnd: /*#__PURE__*/jsx("span", {
213
+ className: "text-sm text-muted/50 px-1",
214
+ children: "OPTIONAL"
215
+ })
216
+ })
217
+ }), type === DATA_TYPES.STRING && /*#__PURE__*/jsxs(Fragment, {
218
+ children: [/*#__PURE__*/jsx(Controller, {
219
+ name: "".concat(field, ".regex"),
220
+ children: /*#__PURE__*/jsx(Input, {
221
+ inline: true,
222
+ label: "Regex validation",
223
+ allowClear: true,
224
+ placeholder: "Regex value...",
225
+ decorateEndShowWhenEmpty: true,
226
+ decorateEnd: /*#__PURE__*/jsx("span", {
227
+ className: "text-sm text-muted/50 px-1",
228
+ children: "OPTIONAL"
229
+ })
230
+ })
231
+ }), /*#__PURE__*/jsxs(Field, {
232
+ inline: true,
233
+ label: "Option list",
234
+ children: [/*#__PURE__*/jsx(Controller, {
235
+ name: "".concat(field, ".optionList"),
236
+ children: /*#__PURE__*/jsx(Select, {
237
+ allowClear: true,
238
+ options: [SCHEMA_CUSTOM_LIST].concat(_toConsumableArray(optionLists)),
239
+ onChange: function onChange(v) {
240
+ return setCustomOptions(v === SCHEMA_CUSTOM_LIST);
241
+ }
242
+ })
243
+ }), customOptions && /*#__PURE__*/jsx(Button, {
244
+ icon: CoreIcons.list,
245
+ "aria-label": "Custom options",
246
+ onClick: function onClick() {
247
+ void openOptionModal();
248
+ }
249
+ })]
250
+ }), OptionModal]
251
+ }), type === DATA_TYPES.FILE && /*#__PURE__*/jsx(Fragment, {
252
+ children: /*#__PURE__*/jsx(Controller, {
253
+ name: "".concat(field, ".accept"),
254
+ children: /*#__PURE__*/jsx(Input, {
255
+ inline: true,
256
+ label: "Accept types",
257
+ allowClear: true,
258
+ placeholder: "Accept value...",
259
+ decorateEndShowWhenEmpty: true,
260
+ decorateEnd: /*#__PURE__*/jsx("span", {
261
+ className: "text-sm text-muted/50 px-1",
262
+ children: "OPTIONAL"
263
+ })
264
+ })
265
+ })
266
+ }), [DATA_TYPES.NUMBER, DATA_TYPES.RANGE].includes(type) && /*#__PURE__*/jsxs(Fragment, {
267
+ children: [/*#__PURE__*/jsx(Controller, {
268
+ name: "".concat(field, ".min"),
269
+ children: /*#__PURE__*/jsx(Number, {
270
+ inline: true,
271
+ label: "Min value",
272
+ allowClear: true,
273
+ placeholder: "Minimum value...",
274
+ decorateEndShowWhenEmpty: true,
275
+ decorateEnd: /*#__PURE__*/jsx("span", {
276
+ className: "text-sm text-muted/50 px-1",
277
+ children: "OPTIONAL"
278
+ })
279
+ })
280
+ }), /*#__PURE__*/jsx(Controller, {
281
+ name: "".concat(field, ".max"),
282
+ children: /*#__PURE__*/jsx(Number, {
283
+ inline: true,
284
+ label: "Max value",
285
+ allowClear: true,
286
+ placeholder: "Maximum value...",
287
+ decorateEndShowWhenEmpty: true,
288
+ decorateEnd: /*#__PURE__*/jsx("span", {
289
+ className: "text-sm text-muted/50 px-1",
290
+ children: "OPTIONAL"
291
+ })
292
+ })
293
+ }), /*#__PURE__*/jsx(Controller, {
294
+ name: "".concat(field, ".step"),
295
+ children: /*#__PURE__*/jsx(Number, {
296
+ inline: true,
297
+ label: "Step value",
298
+ allowClear: true,
299
+ placeholder: "Step value...",
300
+ decorateEndShowWhenEmpty: true,
301
+ decorateEnd: /*#__PURE__*/jsx("span", {
302
+ className: "text-sm text-muted/50 px-1",
303
+ children: "OPTIONAL"
304
+ })
305
+ })
306
+ })]
307
+ }), type === DATA_TYPES.DATE && /*#__PURE__*/jsxs(Fragment, {
308
+ children: [/*#__PURE__*/jsx(Field, {
309
+ inline: true,
310
+ label: "Type",
311
+ plain: true,
312
+ children: /*#__PURE__*/jsx(Controller, {
313
+ name: "".concat(field, ".type"),
314
+ children: /*#__PURE__*/jsxs(ToggleButtonGroup, {
315
+ value: "",
316
+ fullWidth: true,
317
+ className: "flex-1",
318
+ children: [/*#__PURE__*/jsx(Button, {
319
+ className: "flex-1",
320
+ value: "date",
321
+ children: "Date"
322
+ }), /*#__PURE__*/jsx(Button, {
323
+ className: "flex-1",
324
+ value: "datetime",
325
+ children: "Date Time"
326
+ })]
327
+ })
328
+ })
329
+ }), /*#__PURE__*/jsx(Controller, {
330
+ name: "".concat(field, ".min"),
331
+ children: /*#__PURE__*/jsx(DateInput, {
332
+ inline: true,
333
+ label: "Min value",
334
+ allowClear: true,
335
+ placeholder: "Minimum value...",
336
+ decorateEndShowWhenEmpty: true,
337
+ decorateEnd: /*#__PURE__*/jsx("span", {
338
+ className: "text-sm text-muted/50 px-1",
339
+ children: "OPTIONAL"
340
+ })
341
+ })
342
+ }), /*#__PURE__*/jsx(Controller, {
343
+ name: "".concat(field, ".max"),
344
+ children: /*#__PURE__*/jsx(DateInput, {
345
+ inline: true,
346
+ label: "Max value",
347
+ allowClear: true,
348
+ placeholder: "Maximum value...",
349
+ decorateEndShowWhenEmpty: true,
350
+ decorateEnd: /*#__PURE__*/jsx("span", {
351
+ className: "text-sm text-muted/50 px-1",
352
+ children: "OPTIONAL"
353
+ })
354
+ })
355
+ })]
356
+ }), /*#__PURE__*/jsxs(Field, {
357
+ label: " ",
358
+ inline: true,
359
+ plain: true,
360
+ children: [/*#__PURE__*/jsx(Controller, {
361
+ name: "".concat(field, ".required"),
362
+ children: /*#__PURE__*/jsx(Checkbox, {
363
+ label: "Required"
364
+ })
365
+ }), type !== DATA_TYPES.AVATAR && /*#__PURE__*/jsx(Controller, {
366
+ name: "".concat(field, ".multiple"),
367
+ children: /*#__PURE__*/jsx(Checkbox, {
368
+ label: "Multiple",
369
+ onChange: setMultiple
370
+ })
371
+ }), hasOptions && /*#__PURE__*/jsx(Controller, {
372
+ name: "".concat(field, ".allowCustom"),
373
+ children: /*#__PURE__*/jsx(Checkbox, {
374
+ label: "Allow custom value"
375
+ })
376
+ })]
377
+ }), multiple && /*#__PURE__*/jsxs(Fragment, {
378
+ children: [/*#__PURE__*/jsx(Controller, {
379
+ name: "".concat(field, ".minItems"),
380
+ children: /*#__PURE__*/jsx(Number, {
381
+ inline: true,
382
+ label: "Min items",
383
+ allowClear: true,
384
+ placeholder: "Minimum items...",
385
+ decorateEndShowWhenEmpty: true,
386
+ decorateEnd: /*#__PURE__*/jsx("span", {
387
+ className: "text-sm text-muted/50 px-1",
388
+ children: "OPTIONAL"
389
+ })
390
+ })
391
+ }), /*#__PURE__*/jsx(Controller, {
392
+ name: "".concat(field, ".maxItems"),
393
+ children: /*#__PURE__*/jsx(Number, {
394
+ inline: true,
395
+ label: "Max items",
396
+ allowClear: true,
397
+ placeholder: "Maximum items...",
398
+ decorateEndShowWhenEmpty: true,
399
+ decorateEnd: /*#__PURE__*/jsx("span", {
400
+ className: "text-sm text-muted/50 px-1",
401
+ children: "OPTIONAL"
402
+ })
403
+ })
404
+ })]
405
+ })]
406
+ })]
407
+ }, fieldId)
408
+ });
409
+ };
410
+
411
+ export { SchemaField };
@@ -7,11 +7,12 @@ import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProper
7
7
  import _regeneratorRuntime from '@babel/runtime/regenerator';
8
8
  import { yupResolver } from '@hookform/resolvers/yup';
9
9
  import { useDebounce } from '@react-fabric/core';
10
+ import { EMPTY_OBJECT } from '@react-fabric/utilities';
10
11
  import { useRef, useTransition, useEffect, useCallback, useImperativeHandle } from 'react';
11
12
  import { useForm, FormProvider } from 'react-hook-form';
12
13
  import { jsx, jsxs } from 'react/jsx-runtime';
13
14
 
14
- var _excluded = ["formRef", "schema", "children", "values", "defaultValues", "onSubmit", "onChange"];
15
+ var _excluded = ["formRef", "schema", "children", "defaultValues", "onSubmit", "onChange"];
15
16
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
16
17
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
17
18
  var DEFAULT_SUBMIT = function DEFAULT_SUBMIT() {
@@ -21,15 +22,14 @@ var Form = function Form(_ref) {
21
22
  var formRef = _ref.formRef,
22
23
  schema = _ref.schema,
23
24
  children = _ref.children,
24
- values = _ref.values,
25
- defaultValues = _ref.defaultValues,
25
+ _ref$defaultValues = _ref.defaultValues,
26
+ defaultValues = _ref$defaultValues === void 0 ? EMPTY_OBJECT : _ref$defaultValues,
26
27
  _ref$onSubmit = _ref.onSubmit,
27
- onSubmit = _ref$onSubmit === void 0 ? DEFAULT_SUBMIT : _ref$onSubmit,
28
+ _onSubmit = _ref$onSubmit === void 0 ? DEFAULT_SUBMIT : _ref$onSubmit,
28
29
  onChange = _ref.onChange,
29
30
  rest = _objectWithoutProperties(_ref, _excluded);
30
31
  var ref = useRef(null);
31
32
  var form = useForm({
32
- values: values,
33
33
  shouldFocusError: true,
34
34
  resolver: schema && yupResolver(schema),
35
35
  defaultValues: defaultValues
@@ -65,7 +65,7 @@ var Form = function Form(_ref) {
65
65
  return handleReset();
66
66
  },
67
67
  submit: function submit() {
68
- return form.handleSubmit(onSubmit);
68
+ return form.handleSubmit(_onSubmit);
69
69
  },
70
70
  validate: function () {
71
71
  var _validate = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
@@ -104,7 +104,7 @@ var Form = function Form(_ref) {
104
104
  }, 50);
105
105
  }
106
106
  };
107
- }, [onSubmit, form, form.formState, defaultValues]);
107
+ }, [_onSubmit, form, form.formState, defaultValues]);
108
108
  var onInvalid = useCallback(function (_, e) {
109
109
  var el = e.target;
110
110
  setTimeout(function () {
@@ -118,7 +118,10 @@ var Form = function Form(_ref) {
118
118
  onReset: function onReset() {
119
119
  return handleReset(defaultValues);
120
120
  },
121
- onSubmit: form.handleSubmit(onSubmit, onInvalid),
121
+ onSubmit: function onSubmit(e) {
122
+ e.stopPropagation();
123
+ void form.handleSubmit(_onSubmit, onInvalid)(e);
124
+ },
122
125
  "data-loading": form.formState.isSubmitting,
123
126
  className: "contents",
124
127
  autoComplete: "off"
package/dist/esm/index.js CHANGED
@@ -6,7 +6,7 @@ export { Form } from './form/Form.js';
6
6
  export { SchemaEditor } from './builder/SchemaEditor.js';
7
7
  export { useFileUploader } from './hooks/useFileUploader.js';
8
8
  export { useFormBuilder } from './hooks/useFormBuilder.js';
9
- export { DATA_TYPES } from './types/schema.js';
9
+ export { DATA_TYPES, SCHEMA_CUSTOM_LIST } from './types/schema.js';
10
10
  export { ArrayInput } from './input/ArrayInput.js';
11
11
  export { Checkbox } from './input/Checkbox.js';
12
12
  export { ColorInput } from './input/ColorInput.js';
@@ -41,7 +41,7 @@ var ColorInput = function ColorInput(_ref) {
41
41
  var handleChange = useCallback(function (e) {
42
42
  setActualValue(e !== null && e !== void 0 ? e : defaultColor);
43
43
  onChange != null && startTransition(function () {
44
- return onChange(e);
44
+ return onChange(e !== null && e !== void 0 ? e : null);
45
45
  });
46
46
  }, [onChange]);
47
47
  var arrowRef = useRef(null);
@@ -68,7 +68,7 @@ var DateInput = function DateInput(_ref) {
68
68
  setActualValue("");
69
69
  setInputValue("");
70
70
  onChange != null && startTransition(function () {
71
- return onChange("");
71
+ return onChange(null);
72
72
  });
73
73
  }
74
74
  }, [onChange, inputFormat]);
@@ -86,7 +86,7 @@ var DateInput = function DateInput(_ref) {
86
86
  setActualValue("");
87
87
  setInputValue("");
88
88
  onChange != null && startTransition(function () {
89
- return onChange("");
89
+ return onChange(null);
90
90
  });
91
91
  }
92
92
  }, [onChange, inputFormat]);
@@ -90,7 +90,7 @@ var FileInput = function FileInput(_ref) {
90
90
  } else {
91
91
  var _e$target$files, _e$target$files$item, _e$target$files2;
92
92
  setActualValue(e === null || e === void 0 || (_e$target$files = e.target.files) === null || _e$target$files === void 0 ? void 0 : _e$target$files.item(0));
93
- onChange === null || onChange === void 0 || onChange((_e$target$files$item = e === null || e === void 0 || (_e$target$files2 = e.target.files) === null || _e$target$files2 === void 0 ? void 0 : _e$target$files2.item(0)) !== null && _e$target$files$item !== void 0 ? _e$target$files$item : undefined);
93
+ onChange === null || onChange === void 0 || onChange((_e$target$files$item = e === null || e === void 0 || (_e$target$files2 = e.target.files) === null || _e$target$files2 === void 0 ? void 0 : _e$target$files2.item(0)) !== null && _e$target$files$item !== void 0 ? _e$target$files$item : null);
94
94
  if (!e && inputRef.current) inputRef.current.value = "";
95
95
  }
96
96
  }, [onChange, multiple, showList]);
@@ -36,7 +36,7 @@ var HiddenInput = function HiddenInput(_ref) {
36
36
  value = _ref$value === void 0 ? "" : _ref$value,
37
37
  name = _ref.name;
38
38
  useEffect(function () {
39
- setTimeout(function () {
39
+ hiddenValue && setTimeout(function () {
40
40
  onChange === null || onChange === void 0 || onChange(hiddenValue);
41
41
  }, 50);
42
42
  }, [hiddenValue]);