@react-fabric/form 1.0.0-beta.60 → 1.0.0-beta.62

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 (91) hide show
  1. package/dist/cjs/builder/FileField.js +10 -7
  2. package/dist/cjs/builder/components/AddSchemaFields.js +2 -1
  3. package/dist/cjs/builder/components/SchemaArrayForm.js +4 -4
  4. package/dist/cjs/builder/components/SchemaField.js +4 -4
  5. package/dist/cjs/form/Form.js +44 -22
  6. package/dist/cjs/hooks/useFileUploader.js +40 -28
  7. package/dist/cjs/hooks/useFormBuilder.js +10 -3
  8. package/dist/cjs/i18n/index.js +4 -4
  9. package/dist/cjs/input/ArrayInput.js +3 -3
  10. package/dist/cjs/input/AvatarInput.js +17 -12
  11. package/dist/cjs/input/Checkbox.js +2 -2
  12. package/dist/cjs/input/ColorInput.js +2 -2
  13. package/dist/cjs/input/File.js +1 -1
  14. package/dist/cjs/input/Hidden.js +1 -10
  15. package/dist/cjs/input/Password.js +1 -1
  16. package/dist/cjs/input/Radio.js +2 -2
  17. package/dist/cjs/input/RadioGroup.js +3 -1
  18. package/dist/cjs/input/Search.js +2 -3
  19. package/dist/cjs/internal/ErrorIcon.js +1 -1
  20. package/dist/cjs/internal/InputWrapper.js +3 -3
  21. package/dist/cjs/select/AutoComplete.js +1 -2
  22. package/dist/cjs/select/DualList.js +5 -5
  23. package/dist/cjs/select/List.js +8 -24
  24. package/dist/cjs/select/Select.js +9 -28
  25. package/dist/esm/builder/FileField.js +11 -8
  26. package/dist/esm/builder/components/AddSchemaFields.js +2 -1
  27. package/dist/esm/builder/components/SchemaArrayForm.js +5 -5
  28. package/dist/esm/builder/components/SchemaField.js +5 -5
  29. package/dist/esm/form/Form.js +44 -22
  30. package/dist/esm/hooks/useFileUploader.js +41 -29
  31. package/dist/esm/hooks/useFormBuilder.js +10 -3
  32. package/dist/esm/i18n/index.js +2 -2
  33. package/dist/esm/input/ArrayInput.js +4 -4
  34. package/dist/esm/input/AvatarInput.js +18 -13
  35. package/dist/esm/input/Checkbox.js +3 -3
  36. package/dist/esm/input/ColorInput.js +3 -3
  37. package/dist/esm/input/File.js +2 -2
  38. package/dist/esm/input/Hidden.js +2 -11
  39. package/dist/esm/input/Password.js +2 -2
  40. package/dist/esm/input/Radio.js +3 -3
  41. package/dist/esm/input/RadioGroup.js +3 -1
  42. package/dist/esm/input/Search.js +3 -4
  43. package/dist/esm/internal/ErrorIcon.js +2 -2
  44. package/dist/esm/internal/InputWrapper.js +4 -4
  45. package/dist/esm/select/AutoComplete.js +2 -3
  46. package/dist/esm/select/DualList.js +6 -6
  47. package/dist/esm/select/List.js +8 -24
  48. package/dist/esm/select/Select.js +10 -29
  49. package/dist/types/builder/FileField.d.ts +2 -1
  50. package/dist/types/form/Form.d.ts +11 -10
  51. package/dist/types/hooks/useFileUploader.d.ts +4 -2
  52. package/dist/types/hooks/useFormBuilder.d.ts +6 -0
  53. package/dist/types/input/AvatarInput.d.ts +2 -2
  54. package/dist/types/input/Hidden.d.ts +3 -11
  55. package/dist/types/input/RadioGroup.d.ts +5 -1
  56. package/dist/types/select/DualList.d.ts +5 -6
  57. package/dist/types/select/Options.d.ts +1 -1
  58. package/dist/types/types/index.d.ts +7 -8
  59. package/package.json +5 -5
  60. package/src/builder/FileField.tsx +8 -12
  61. package/src/builder/components/AddSchemaFields.tsx +2 -1
  62. package/src/builder/components/SchemaArrayForm.tsx +5 -11
  63. package/src/builder/components/SchemaField.tsx +4 -5
  64. package/src/form/Form.tsx +30 -24
  65. package/src/hooks/useFileUploader.ts +41 -29
  66. package/src/hooks/useFormBuilder.tsx +12 -4
  67. package/src/i18n/index.ts +2 -2
  68. package/src/input/ArrayInput.tsx +4 -10
  69. package/src/input/AvatarInput.tsx +16 -16
  70. package/src/input/Checkbox.tsx +6 -3
  71. package/src/input/ColorInput.tsx +3 -7
  72. package/src/input/File.tsx +2 -2
  73. package/src/input/Hidden.tsx +4 -22
  74. package/src/input/Password.tsx +4 -2
  75. package/src/input/Radio.tsx +3 -3
  76. package/src/input/RadioGroup.tsx +6 -0
  77. package/src/input/Search.tsx +3 -3
  78. package/src/internal/ErrorIcon.tsx +2 -2
  79. package/src/internal/InputWrapper.tsx +8 -4
  80. package/src/select/AutoComplete.tsx +2 -3
  81. package/src/select/DualList.tsx +15 -12
  82. package/src/select/List.tsx +3 -3
  83. package/src/select/Options.tsx +1 -1
  84. package/src/select/Select.tsx +7 -8
  85. package/src/types/index.ts +8 -7
  86. /package/dist/cjs/i18n/{ar.json.js → ar/form.json.js} +0 -0
  87. /package/dist/cjs/i18n/{en.json.js → en/form.json.js} +0 -0
  88. /package/dist/esm/i18n/{ar.json.js → ar/form.json.js} +0 -0
  89. /package/dist/esm/i18n/{en.json.js → en/form.json.js} +0 -0
  90. /package/src/i18n/{ar.json → ar/form.json} +0 -0
  91. /package/src/i18n/{en.json → en/form.json} +0 -0
@@ -13,7 +13,7 @@ var Field = require('../input/Field.js');
13
13
  var Hidden = require('../input/Hidden.js');
14
14
  var jsxRuntime = require('react/jsx-runtime');
15
15
 
16
- var _excluded = ["uploadHandler", "inline", "label", "accept", "value", "fileUrl", "multiple", "invalid", "error"];
16
+ var _excluded = ["uploadHandler", "inline", "label", "accept", "value", "fileUrl", "onChange", "multiple", "invalid", "error"];
17
17
  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; }
18
18
  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; }
19
19
  var FileField = function FileField(_ref) {
@@ -24,7 +24,8 @@ var FileField = function FileField(_ref) {
24
24
  accept = _ref.accept,
25
25
  value = _ref.value;
26
26
  _ref.fileUrl;
27
- var multiple = _ref.multiple;
27
+ var onChange = _ref.onChange,
28
+ multiple = _ref.multiple;
28
29
  _ref.invalid;
29
30
  var error = _ref.error,
30
31
  rest = _objectWithoutProperties(_ref, _excluded);
@@ -48,10 +49,12 @@ var FileField = function FileField(_ref) {
48
49
  return function (_x, _x2) {
49
50
  return _ref2.apply(this, arguments);
50
51
  };
51
- }(), value, multiple),
52
+ }(), value, {
53
+ multiple: multiple,
54
+ onChange: onChange
55
+ }),
52
56
  pending = _useFileUploader.pending,
53
57
  files = _useFileUploader.files,
54
- list = _useFileUploader.list,
55
58
  upload = _useFileUploader.upload,
56
59
  remove = _useFileUploader.remove;
57
60
  return /*#__PURE__*/jsxRuntime.jsxs(react.Fragment, {
@@ -60,7 +63,7 @@ var FileField = function FileField(_ref) {
60
63
  inline: inline,
61
64
  label: label,
62
65
  children: /*#__PURE__*/jsxRuntime.jsx(Hidden.HiddenInput, _objectSpread({
63
- hiddenValue: multiple ? list : list === null || list === void 0 ? void 0 : list[0]
66
+ value: multiple ? files : files === null || files === void 0 ? void 0 : files[0]
64
67
  }, rest))
65
68
  }), /*#__PURE__*/jsxRuntime.jsx(core.Tooltip, {
66
69
  color: "danger-200",
@@ -110,7 +113,7 @@ var FileField = function FileField(_ref) {
110
113
  children: file.error
111
114
  })
112
115
  }), file.progress && /*#__PURE__*/jsxRuntime.jsx(core.Icon, {
113
- icon: core.CoreIcons.stop,
116
+ icon: "icon-[mdi--stop]",
114
117
  bg: "danger",
115
118
  color: "white",
116
119
  size: "sm",
@@ -121,7 +124,7 @@ var FileField = function FileField(_ref) {
121
124
  return (_file$abort = file.abort) === null || _file$abort === void 0 ? void 0 : _file$abort.call(file);
122
125
  }
123
126
  }), !file.progress && /*#__PURE__*/jsxRuntime.jsx(core.Icon, {
124
- icon: core.CoreIcons.trash,
127
+ icon: "icon-[mdi--trash-can-outline]",
125
128
  color: "danger",
126
129
  size: "sm",
127
130
  "aria-label": "remove",
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var _defineProperty = require('@babel/runtime/helpers/defineProperty');
4
+ var yup = require('@hookform/resolvers/yup');
4
5
  var core = require('@react-fabric/core');
5
6
  var utilities = require('@react-fabric/utilities');
6
7
  var react = require('react');
@@ -25,7 +26,7 @@ var AddSchemaFields = function AddSchemaFields(props) {
25
26
  }, []);
26
27
  return /*#__PURE__*/jsxRuntime.jsx(core.Modal, _objectSpread(_objectSpread({}, props), {}, {
27
28
  children: /*#__PURE__*/jsxRuntime.jsxs(Form.Form, {
28
- schema: fieldSchema,
29
+ resolver: yup.yupResolver(fieldSchema),
29
30
  defaultValues: {
30
31
  fields: [" "]
31
32
  },
@@ -96,13 +96,13 @@ var SchemaArrayForm = function SchemaArrayForm(_ref) {
96
96
  children: [dynamic && /*#__PURE__*/jsxRuntime.jsx(core.Button, {
97
97
  size: "sm",
98
98
  variant: "link",
99
- icon: core.CoreIcons.insert,
99
+ icon: "icon-[mdi--plus-circle-outline]",
100
100
  "aria-label": "add field",
101
101
  onClick: handleAdd
102
102
  }), /*#__PURE__*/jsxRuntime.jsx(core.Button, {
103
103
  size: "sm",
104
104
  variant: "link",
105
- icon: core.CoreIcons.colapseAllVar,
105
+ icon: "icon-[mdi--arrow-collapse-vertical]",
106
106
  "aria-label": "collapse all",
107
107
  onClick: function onClick() {
108
108
  return setDefaultOpen(false);
@@ -110,7 +110,7 @@ var SchemaArrayForm = function SchemaArrayForm(_ref) {
110
110
  }), /*#__PURE__*/jsxRuntime.jsx(core.Button, {
111
111
  size: "sm",
112
112
  variant: "link",
113
- icon: core.CoreIcons.expandAllVar,
113
+ icon: "icon-[mdi--arrow-expand-vertical]",
114
114
  "aria-label": "expand all",
115
115
  onClick: function onClick() {
116
116
  return setDefaultOpen(true);
@@ -138,7 +138,7 @@ var SchemaArrayForm = function SchemaArrayForm(_ref) {
138
138
  acceptableTypes: acceptableTypes !== null && acceptableTypes !== void 0 ? acceptableTypes : Object.values(schema.DATA_TYPES)
139
139
  }, index);
140
140
  })
141
- }), AddModal]
141
+ }), /*#__PURE__*/jsxRuntime.jsx(AddModal, {})]
142
142
  });
143
143
  };
144
144
 
@@ -180,7 +180,7 @@ var SchemaField = function SchemaField(_ref) {
180
180
  variant: "link",
181
181
  "aria-label": "Delete",
182
182
  stopPropagation: true,
183
- icon: core.CoreIcons.trash,
183
+ icon: "icon-[mdi--trash-can-outline]",
184
184
  onClick: onRemove,
185
185
  className: "invisible group-hover/field:visible"
186
186
  })]
@@ -189,7 +189,7 @@ var SchemaField = function SchemaField(_ref) {
189
189
  children: [/*#__PURE__*/jsxRuntime.jsx(Controller.Controller, {
190
190
  name: "".concat(field, ".id"),
191
191
  children: /*#__PURE__*/jsxRuntime.jsx(Hidden.HiddenInput, {
192
- hiddenValue: id
192
+ value: id
193
193
  })
194
194
  }), /*#__PURE__*/jsxRuntime.jsx(Controller.Controller, {
195
195
  name: "".concat(field, ".datatype"),
@@ -242,7 +242,7 @@ var SchemaField = function SchemaField(_ref) {
242
242
  }
243
243
  })
244
244
  }), customOptions && /*#__PURE__*/jsxRuntime.jsx(core.Button, {
245
- icon: core.CoreIcons.list,
245
+ icon: "icon-[mdi--list-box-outline]",
246
246
  "aria-label": "Custom options",
247
247
  onClick: function onClick() {
248
248
  void openOptionModal({
@@ -250,7 +250,7 @@ var SchemaField = function SchemaField(_ref) {
250
250
  });
251
251
  }
252
252
  })]
253
- }), OptionModal]
253
+ }), /*#__PURE__*/jsxRuntime.jsx(OptionModal, {})]
254
254
  }), type === schema.DATA_TYPES.FILE && /*#__PURE__*/jsxRuntime.jsx(react.Fragment, {
255
255
  children: /*#__PURE__*/jsxRuntime.jsx(Controller.Controller, {
256
256
  name: "".concat(field, ".accept"),
@@ -1,18 +1,17 @@
1
1
  'use strict';
2
2
 
3
3
  var _defineProperty = require('@babel/runtime/helpers/defineProperty');
4
- var _asyncToGenerator = require('@babel/runtime/helpers/asyncToGenerator');
5
4
  var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
5
+ var _asyncToGenerator = require('@babel/runtime/helpers/asyncToGenerator');
6
6
  var _objectWithoutProperties = require('@babel/runtime/helpers/objectWithoutProperties');
7
7
  var _regeneratorRuntime = require('@babel/runtime/regenerator');
8
- var yup = require('@hookform/resolvers/yup');
9
8
  var core = require('@react-fabric/core');
10
9
  var utilities = require('@react-fabric/utilities');
11
10
  var react = require('react');
12
11
  var reactHookForm = require('react-hook-form');
13
12
  var jsxRuntime = require('react/jsx-runtime');
14
13
 
15
- var _excluded = ["formRef", "schema", "children", "defaultValues", "onSubmit", "onChange"];
14
+ var _excluded = ["formRef", "resolver", "children", "resetOnChange", "defaultValues", "onSubmit", "onChange"];
16
15
  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; }
17
16
  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; }
18
17
  var DEFAULT_SUBMIT = function DEFAULT_SUBMIT() {
@@ -31,10 +30,7 @@ var DEFAULT_SUBMIT = function DEFAULT_SUBMIT() {
31
30
  * ```jsx
32
31
  * <Form
33
32
  * formRef={formRef}
34
- * schema={yup.object().shape({
35
- * name: yup.string().required("Name is required"),
36
- * email: yup.string().email("Invalid email").required("Email is required"),
37
- * })}
33
+ * resolver={hookformResolver(schema)}
38
34
  * defaultValues={{ name: "", email: "" }}
39
35
  * onSubmit={(values) => {
40
36
  * console.log("Form submitted with values:", values);
@@ -52,10 +48,11 @@ var DEFAULT_SUBMIT = function DEFAULT_SUBMIT() {
52
48
  */
53
49
  var Form = function Form(_ref) {
54
50
  var formRef = _ref.formRef,
55
- schema = _ref.schema,
51
+ resolver = _ref.resolver,
56
52
  children = _ref.children,
53
+ resetOnChange = _ref.resetOnChange,
57
54
  _ref$defaultValues = _ref.defaultValues,
58
- defaultValues = _ref$defaultValues === void 0 ? utilities.EMPTY_OBJECT : _ref$defaultValues,
55
+ _defaultValues = _ref$defaultValues === void 0 ? utilities.EMPTY_OBJECT : _ref$defaultValues,
59
56
  _ref$onSubmit = _ref.onSubmit,
60
57
  _onSubmit = _ref$onSubmit === void 0 ? DEFAULT_SUBMIT : _ref$onSubmit,
61
58
  onChange = _ref.onChange,
@@ -63,8 +60,27 @@ var Form = function Form(_ref) {
63
60
  var ref = react.useRef(null);
64
61
  var form = reactHookForm.useForm({
65
62
  shouldFocusError: true,
66
- resolver: schema && yup.yupResolver(schema),
67
- defaultValues: defaultValues
63
+ resolver: resolver,
64
+ defaultValues: function () {
65
+ var _defaultValues2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
66
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
67
+ while (1) switch (_context.prev = _context.next) {
68
+ case 0:
69
+ _context.next = 2;
70
+ return Promise.resolve(_defaultValues);
71
+ case 2:
72
+ return _context.abrupt("return", _context.sent);
73
+ case 3:
74
+ case "end":
75
+ return _context.stop();
76
+ }
77
+ }, _callee);
78
+ }));
79
+ function defaultValues() {
80
+ return _defaultValues2.apply(this, arguments);
81
+ }
82
+ return defaultValues;
83
+ }()
68
84
  });
69
85
  var _useTransition = react.useTransition(),
70
86
  _useTransition2 = _slicedToArray(_useTransition, 2),
@@ -86,12 +102,17 @@ var Form = function Form(_ref) {
86
102
  form.reset(reset);
87
103
  form.clearErrors();
88
104
  (_ref$current = ref.current) === null || _ref$current === void 0 || (_ref$current = _ref$current.querySelector("[auto-focus], input, textarea")) === null || _ref$current === void 0 || _ref$current.focus();
89
- }, [defaultValues]);
105
+ }, []);
106
+ react.useEffect(function () {
107
+ if (resetOnChange) {
108
+ handleReset(_defaultValues);
109
+ }
110
+ }, [_defaultValues, resetOnChange]);
90
111
  react.useImperativeHandle(formRef, function () {
91
112
  return {
92
113
  state: form.formState,
93
114
  reset: function reset() {
94
- return handleReset(defaultValues);
115
+ return handleReset(_defaultValues);
95
116
  },
96
117
  clear: function clear() {
97
118
  return handleReset();
@@ -100,19 +121,19 @@ var Form = function Form(_ref) {
100
121
  return form.handleSubmit(_onSubmit);
101
122
  },
102
123
  validate: function () {
103
- var _validate = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(fields) {
104
- return _regeneratorRuntime.wrap(function _callee$(_context) {
105
- while (1) switch (_context.prev = _context.next) {
124
+ var _validate = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(fields) {
125
+ return _regeneratorRuntime.wrap(function _callee2$(_context2) {
126
+ while (1) switch (_context2.prev = _context2.next) {
106
127
  case 0:
107
- _context.next = 2;
128
+ _context2.next = 2;
108
129
  return form.trigger(fields);
109
130
  case 2:
110
- return _context.abrupt("return", _context.sent);
131
+ return _context2.abrupt("return", _context2.sent);
111
132
  case 3:
112
133
  case "end":
113
- return _context.stop();
134
+ return _context2.stop();
114
135
  }
115
- }, _callee);
136
+ }, _callee2);
116
137
  }));
117
138
  function validate(_x) {
118
139
  return _validate.apply(this, arguments);
@@ -136,9 +157,10 @@ var Form = function Form(_ref) {
136
157
  }, 50);
137
158
  }
138
159
  };
139
- }, [_onSubmit, form, form.formState, defaultValues]);
160
+ }, [_onSubmit, form, form.formState, _defaultValues]);
140
161
  var onInvalid = react.useCallback(function (_, e) {
141
162
  var el = e.target;
163
+ console.log("Invalid:", _, e);
142
164
  setTimeout(function () {
143
165
  var _el$querySelector;
144
166
  return (_el$querySelector = el.querySelector("input[aria-invalid='true'],textarea[aria-invalid='true']")) === null || _el$querySelector === void 0 ? void 0 : _el$querySelector.focus();
@@ -148,7 +170,7 @@ var Form = function Form(_ref) {
148
170
  children: /*#__PURE__*/jsxRuntime.jsxs("form", _objectSpread(_objectSpread({
149
171
  ref: ref,
150
172
  onReset: function onReset() {
151
- return handleReset(defaultValues);
173
+ return handleReset(_defaultValues);
152
174
  },
153
175
  onSubmit: function onSubmit(e) {
154
176
  e.stopPropagation();
@@ -29,7 +29,10 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
29
29
  * ```
30
30
  */
31
31
  var useFileUploader = function useFileUploader(uploader, initialList) {
32
- var multiple = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
32
+ var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
33
+ _ref$multiple = _ref.multiple,
34
+ multiple = _ref$multiple === void 0 ? true : _ref$multiple,
35
+ onChange = _ref.onChange;
33
36
  var _useReducer = react.useReducer(function (state, action) {
34
37
  if (action.type === "start") {
35
38
  if (!multiple) state.files.clear();
@@ -76,40 +79,26 @@ var useFileUploader = function useFileUploader(uploader, initialList) {
76
79
  if (action.type === "remove") {
77
80
  state.files["delete"](action.key);
78
81
  }
79
- state.list = Array.from(state.files.values()).map(function (file) {
80
- return !file.progress && !file.error && {
81
- key: file.key,
82
- path: file.path,
83
- mime: file.mime,
84
- size: file.size,
85
- uploaded: file.uploaded,
86
- filename: file.filename
87
- };
88
- }).filter(Boolean);
89
- return _objectSpread({}, state);
90
- }, {
91
- files: new Map(),
92
- count: 0
93
- }, function (state) {
94
- if (initialList) {
95
- if (utilities.isString(initialList)) {
82
+ if (action.type === "init") {
83
+ state.files = new Map();
84
+ if (utilities.isString(action.initialList)) {
96
85
  var key = utilities.uuid();
97
86
  state.files.set(key, {
98
87
  key: key,
99
- path: initialList,
88
+ path: action.initialList,
100
89
  filename: "",
101
90
  size: 0,
102
91
  mime: ""
103
92
  });
104
93
  }
105
- if (utilities.isObject(initialList)) {
94
+ if (utilities.isObject(action.initialList)) {
106
95
  var _key = utilities.uuid();
107
- state.files.set(_key, _objectSpread(_objectSpread({}, initialList), {}, {
96
+ state.files.set(_key, _objectSpread(_objectSpread({}, action.initialList), {}, {
108
97
  key: _key
109
98
  }));
110
99
  }
111
- if (utilities.isArray(initialList)) {
112
- initialList.forEach(function (file) {
100
+ if (utilities.isArray(action.initialList)) {
101
+ action.initialList.forEach(function (file) {
113
102
  var key = utilities.uuid();
114
103
  state.files.set(key, _objectSpread(_objectSpread({}, file), {}, {
115
104
  key: key
@@ -117,14 +106,38 @@ var useFileUploader = function useFileUploader(uploader, initialList) {
117
106
  });
118
107
  }
119
108
  }
120
- state.list = Array.from(state.files.values());
121
- return state;
109
+ state.list = Array.from(state.files.values()).map(function (file) {
110
+ return !file.progress && !file.error && {
111
+ key: file.key,
112
+ path: file.path,
113
+ mime: file.mime,
114
+ size: file.size,
115
+ uploaded: file.uploaded,
116
+ filename: file.filename
117
+ };
118
+ }).filter(Boolean);
119
+ if (action.type === "remove" || action.type === "stop") {
120
+ setTimeout(function () {
121
+ var _state$list$;
122
+ onChange === null || onChange === void 0 || onChange(multiple ? state.list : (_state$list$ = state.list[0]) !== null && _state$list$ !== void 0 ? _state$list$ : null);
123
+ }, 100);
124
+ }
125
+ return _objectSpread({}, state);
126
+ }, {
127
+ files: new Map(),
128
+ count: 0
122
129
  }),
123
130
  _useReducer2 = _slicedToArray(_useReducer, 2),
124
131
  state = _useReducer2[0],
125
132
  dispatch = _useReducer2[1];
133
+ react.useEffect(function () {
134
+ dispatch({
135
+ type: "init",
136
+ initialList: initialList
137
+ });
138
+ }, [initialList]);
126
139
  var doUpload = react.useCallback( /*#__PURE__*/function () {
127
- var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(key, file) {
140
+ var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(key, file) {
128
141
  var data, _abort2;
129
142
  return _regeneratorRuntime.wrap(function _callee$(_context) {
130
143
  while (1) switch (_context.prev = _context.next) {
@@ -185,7 +198,7 @@ var useFileUploader = function useFileUploader(uploader, initialList) {
185
198
  }, _callee);
186
199
  }));
187
200
  return function (_x, _x2) {
188
- return _ref.apply(this, arguments);
201
+ return _ref2.apply(this, arguments);
189
202
  };
190
203
  }(), []);
191
204
  var upload = react.useCallback(function (files) {
@@ -212,7 +225,6 @@ var useFileUploader = function useFileUploader(uploader, initialList) {
212
225
  remove: remove,
213
226
  retry: retry,
214
227
  pending: state.count,
215
- list: state.list,
216
228
  files: Array.from(state.files.values())
217
229
  };
218
230
  };
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var _defineProperty = require('@babel/runtime/helpers/defineProperty');
4
+ var yup = require('@hookform/resolvers/yup');
4
5
  var core = require('@react-fabric/core');
5
6
  var utilities = require('@react-fabric/utilities');
6
7
  var react = require('react');
@@ -100,9 +101,14 @@ var useFormBuilder = function useFormBuilder(schema$1) {
100
101
  return !!schm.id;
101
102
  })) !== null && _schema$filter !== void 0 ? _schema$filter : [];
102
103
  }, [schema$1]);
103
- var schemaDef = utilities.yup.object(Object.fromEntries(filteredSchema.map(function (field) {
104
- return [field.id, makeYupField(field)];
105
- })));
104
+ var schemaDef = react.useMemo(function () {
105
+ return utilities.yup.object(Object.fromEntries(filteredSchema.map(function (field) {
106
+ return [field.id, makeYupField(field)];
107
+ })));
108
+ }, [filteredSchema]);
109
+ var resolver = react.useMemo(function () {
110
+ return yup.yupResolver(schemaDef);
111
+ }, [schemaDef]);
106
112
  var formDef = /*#__PURE__*/jsxRuntime.jsxs(react.Fragment, {
107
113
  children: [filteredSchema.map(function (field, idx) {
108
114
  return /*#__PURE__*/jsxRuntime.jsx("div", {
@@ -122,6 +128,7 @@ var useFormBuilder = function useFormBuilder(schema$1) {
122
128
  });
123
129
  return {
124
130
  formDef: formDef,
131
+ resolver: resolver,
125
132
  schemaDef: schemaDef
126
133
  };
127
134
  };
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  var core = require('@react-fabric/core');
4
- var ar = require('./ar.json.js');
5
- var en = require('./en.json.js');
4
+ var form$1 = require('./ar/form.json.js');
5
+ var form = require('./en/form.json.js');
6
6
 
7
7
  /*
8
8
  * React Fabric
@@ -28,6 +28,6 @@ var en = require('./en.json.js');
28
28
  */
29
29
 
30
30
  core.addTranslationBundle("form", {
31
- en: en.default,
32
- ar: ar.default
31
+ en: form.default,
32
+ ar: form$1.default
33
33
  });
@@ -196,7 +196,7 @@ var ArrayInput = function ArrayInput(_ref) {
196
196
  },
197
197
  children: [/*#__PURE__*/jsxRuntime.jsx(core$1.Icon, _objectSpread(_objectSpread({
198
198
  className: isDragging ? "cursor-grabbing" : "cursor-grab",
199
- icon: core$1.CoreIcons.dragHandle
199
+ icon: "icon-[mdi--drag-vertical]"
200
200
  }, attributes), listeners)), children]
201
201
  });
202
202
  }
@@ -219,7 +219,7 @@ var ArrayInput = function ArrayInput(_ref) {
219
219
  children: /*#__PURE__*/jsxRuntime.jsx(core$1.Button, {
220
220
  size: "sm",
221
221
  "aria-label": "Add item",
222
- icon: core$1.CoreIcons.insert,
222
+ icon: "icon-[mdi--plus-circle-outline]",
223
223
  onClick: function onClick() {
224
224
  return handleAdd(onAdd === null || onAdd === void 0 ? void 0 : onAdd());
225
225
  },
@@ -260,7 +260,7 @@ var ArrayInput = function ArrayInput(_ref) {
260
260
  }));
261
261
  }), canRemove !== false && /*#__PURE__*/jsxRuntime.jsx(core$1.Button, {
262
262
  "aria-label": "Remove item",
263
- icon: core$1.CoreIcons.remove,
263
+ icon: "icon-[mdi--minus-circle-outline]",
264
264
  color: "danger",
265
265
  variant: "link",
266
266
  className: "self-end",
@@ -6,13 +6,13 @@ var _asyncToGenerator = require('@babel/runtime/helpers/asyncToGenerator');
6
6
  var _objectWithoutProperties = require('@babel/runtime/helpers/objectWithoutProperties');
7
7
  var _regeneratorRuntime = require('@babel/runtime/regenerator');
8
8
  var core = require('@react-fabric/core');
9
+ var classNames = require('classnames');
9
10
  var react = require('react');
10
11
  var useFileUploader = require('../hooks/useFileUploader.js');
11
12
  var Hidden = require('./Hidden.js');
12
- var classNames = require('classnames');
13
13
  var jsxRuntime = require('react/jsx-runtime');
14
14
 
15
- var _excluded = ["size", "avatarName", "avatarClassName", "value", "rounded", "defaultValue", "fallbackIcon", "variant", "fileUrl", "uploadHandler"];
15
+ var _excluded = ["size", "avatarName", "avatarClassName", "value", "rounded", "defaultValue", "fallbackIcon", "variant", "fileUrl", "uploadHandler", "onChange"];
16
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; }
17
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; }
18
18
  /**
@@ -24,7 +24,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
24
24
  * @returns {JSX.Element} - The rendered AvatarInput component.
25
25
  */
26
26
  var AvatarInput = function AvatarInput(_ref) {
27
- var _list$;
27
+ var _files$2;
28
28
  var _ref$size = _ref.size,
29
29
  size = _ref$size === void 0 ? "6rem" : _ref$size,
30
30
  avatarName = _ref.avatarName,
@@ -36,6 +36,7 @@ var AvatarInput = function AvatarInput(_ref) {
36
36
  variant = _ref.variant,
37
37
  fileUrl = _ref.fileUrl,
38
38
  uploadHandler = _ref.uploadHandler,
39
+ _onChange = _ref.onChange,
39
40
  rest = _objectWithoutProperties(_ref, _excluded);
40
41
  var _useFileUploader = useFileUploader.useFileUploader( /*#__PURE__*/function () {
41
42
  var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(data, config) {
@@ -55,9 +56,14 @@ var AvatarInput = function AvatarInput(_ref) {
55
56
  return function (_x, _x2) {
56
57
  return _ref2.apply(this, arguments);
57
58
  };
58
- }(), value, false),
59
+ }(), value !== null && value !== void 0 ? value : defaultValue, {
60
+ multiple: false,
61
+ onChange: function onChange(files) {
62
+ var _files$path;
63
+ return _onChange === null || _onChange === void 0 ? void 0 : _onChange((_files$path = files === null || files === void 0 ? void 0 : files.path) !== null && _files$path !== void 0 ? _files$path : null);
64
+ }
65
+ }),
59
66
  files = _useFileUploader.files,
60
- list = _useFileUploader.list,
61
67
  upload = _useFileUploader.upload,
62
68
  remove = _useFileUploader.remove;
63
69
  var _useState = react.useState(""),
@@ -65,7 +71,7 @@ var AvatarInput = function AvatarInput(_ref) {
65
71
  base64 = _useState2[0],
66
72
  setBase64 = _useState2[1];
67
73
  react.useEffect(function () {
68
- if (list !== null && list !== void 0 && list.length) {
74
+ if (files !== null && files !== void 0 && files.length) {
69
75
  var _files$;
70
76
  var file = files === null || files === void 0 || (_files$ = files[0]) === null || _files$ === void 0 ? void 0 : _files$.file;
71
77
  void (file && new Response(file).blob().then(function (blob) {
@@ -82,14 +88,14 @@ var AvatarInput = function AvatarInput(_ref) {
82
88
  var _ref3, _fileUrl;
83
89
  setBase64((_ref3 = (_fileUrl = fileUrl === null || fileUrl === void 0 ? void 0 : fileUrl(defaultValue !== null && defaultValue !== void 0 ? defaultValue : "")) !== null && _fileUrl !== void 0 ? _fileUrl : defaultValue) !== null && _ref3 !== void 0 ? _ref3 : "");
84
90
  }
85
- }, [files, list, defaultValue]);
91
+ }, [files, defaultValue]);
86
92
  react.useEffect(function () {
87
93
  var _fileUrl2, _fileUrl3;
88
94
  !value && defaultValue && setBase64((_fileUrl2 = fileUrl === null || fileUrl === void 0 ? void 0 : fileUrl(defaultValue)) !== null && _fileUrl2 !== void 0 ? _fileUrl2 : defaultValue);
89
95
  value && setBase64((_fileUrl3 = fileUrl === null || fileUrl === void 0 ? void 0 : fileUrl(value)) !== null && _fileUrl3 !== void 0 ? _fileUrl3 : value);
90
96
  }, [value, defaultValue]);
91
97
  return /*#__PURE__*/jsxRuntime.jsxs("div", {
92
- className: "flex flex-nowrap items-end overflow-hidden",
98
+ className: "flex flex-nowrap items-end overflow-hidden p-px",
93
99
  children: [/*#__PURE__*/jsxRuntime.jsxs("div", {
94
100
  className: classNames("inline-block leading-none relative outline overflow-hidden", rounded && "rounded-full", !rounded && "rounded"),
95
101
  children: [/*#__PURE__*/jsxRuntime.jsx(core.Avatar, {
@@ -114,8 +120,7 @@ var AvatarInput = function AvatarInput(_ref) {
114
120
  })]
115
121
  })]
116
122
  }), /*#__PURE__*/jsxRuntime.jsx(Hidden.HiddenInput, _objectSpread({
117
- hiddenValue: list === null || list === void 0 || (_list$ = list[0]) === null || _list$ === void 0 ? void 0 : _list$.path,
118
- defaultValue: defaultValue
123
+ value: files === null || files === void 0 || (_files$2 = files[0]) === null || _files$2 === void 0 ? void 0 : _files$2.path
119
124
  }, rest)), files.map(function (file, idx) {
120
125
  return /*#__PURE__*/jsxRuntime.jsxs("div", {
121
126
  className: "px-2 py-1 flex-1 overflow-hidden",
@@ -128,7 +133,7 @@ var AvatarInput = function AvatarInput(_ref) {
128
133
  children: file.error
129
134
  })
130
135
  }), file.progress && /*#__PURE__*/jsxRuntime.jsx(core.Icon, {
131
- icon: core.CoreIcons.stop,
136
+ icon: "icon-[mdi--stop]",
132
137
  bg: "danger",
133
138
  color: "white",
134
139
  size: "sm",
@@ -139,7 +144,7 @@ var AvatarInput = function AvatarInput(_ref) {
139
144
  return (_file$abort = file.abort) === null || _file$abort === void 0 ? void 0 : _file$abort.call(file);
140
145
  }
141
146
  }), !file.progress && /*#__PURE__*/jsxRuntime.jsx(core.Icon, {
142
- icon: core.CoreIcons.trash,
147
+ icon: "icon-[mdi--trash-can-outline]",
143
148
  color: "danger",
144
149
  size: "sm",
145
150
  className: "flex-content",
@@ -43,10 +43,10 @@ var Checkbox = function Checkbox(_ref) {
43
43
  var deferred = react.useDeferredValue(!!checked);
44
44
  var iconOn = react.useMemo(function () {
45
45
  var _ref2;
46
- return (_ref2 = iconChecked !== null && iconChecked !== void 0 ? iconChecked : icon) !== null && _ref2 !== void 0 ? _ref2 : core.CoreIcons.checkboxOn;
46
+ return (_ref2 = iconChecked !== null && iconChecked !== void 0 ? iconChecked : icon) !== null && _ref2 !== void 0 ? _ref2 : "icon-[mdi--checkbox-marked]";
47
47
  }, [icon, iconChecked]);
48
48
  var iconOff = react.useMemo(function () {
49
- return icon !== null && icon !== void 0 ? icon : core.CoreIcons.checkboxOff;
49
+ return icon !== null && icon !== void 0 ? icon : "icon-[mdi--checkbox-blank-outline]";
50
50
  }, [icon]);
51
51
  react.useEffect(function () {
52
52
  setActualValue(deferred);
@@ -120,7 +120,7 @@ var ColorInput = function ColorInput(_ref) {
120
120
  children: !actualValue && /*#__PURE__*/jsxRuntime.jsx(core.Icon, {
121
121
  size: "md",
122
122
  className: "text-muted",
123
- icon: core.CoreIcons.colorSwatch
123
+ icon: "icon-[mdi--palette]"
124
124
  })
125
125
  })
126
126
  })), isOpen && /*#__PURE__*/jsxRuntime.jsxs("div", _objectSpread(_objectSpread({
@@ -142,7 +142,7 @@ var ColorInput = function ColorInput(_ref) {
142
142
  })]
143
143
  })), !disabled && showPicker && /*#__PURE__*/jsxRuntime.jsx(core.Icon, {
144
144
  className: "flex-content p-1",
145
- icon: core.CoreIcons.colorPicker,
145
+ icon: "icon-[mdi--eyedropper]",
146
146
  onClick: function onClick() {
147
147
  return window.EyeDropper && new window.EyeDropper().open().then(function (resp) {
148
148
  return handleChange(resp.sRGBHex);
@@ -132,7 +132,7 @@ var FileInput = function FileInput(_ref) {
132
132
  children: utilities.Format.bytes(file.size)
133
133
  }), /*#__PURE__*/jsxRuntime.jsx(core.Icon, {
134
134
  className: "cursor-pointer opacity-30 hover:opacity-80",
135
- icon: core.CoreIcons.close,
135
+ icon: "icon-[mdi--close]",
136
136
  onClick: function onClick() {
137
137
  removeFile(idx);
138
138
  }