@react-fabric/form 1.0.0-beta.8 → 1.0.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.
Files changed (215) hide show
  1. package/{src/input/ArrayInput.module.css → css/_arrayInput.css} +8 -8
  2. package/css/_colorPicker.css +95 -0
  3. package/{src/internal/Field.module.css → css/_field.css} +94 -33
  4. package/{src/input/File.module.css → css/_file.css} +21 -6
  5. package/css/styles.css +27 -0
  6. package/dist/cjs/builder/FileField.js +107 -78
  7. package/dist/cjs/builder/FormField.js +60 -39
  8. package/dist/cjs/builder/SchemaEditor.js +72 -0
  9. package/dist/cjs/builder/components/AddSchemaFields.js +64 -0
  10. package/dist/cjs/builder/components/SchemaArrayForm.js +146 -0
  11. package/dist/cjs/builder/components/SchemaField.js +423 -0
  12. package/dist/cjs/form/Controller.js +66 -19
  13. package/dist/cjs/form/Form.js +97 -39
  14. package/dist/cjs/form/useForm.js +32 -0
  15. package/dist/cjs/hooks/useFileUploader.js +74 -45
  16. package/dist/cjs/hooks/useFormBuilder.js +85 -31
  17. package/dist/cjs/i18n/{ar.json.js → ar/form.json.js} +5 -4
  18. package/dist/cjs/i18n/{en.json.js → en/form.json.js} +5 -5
  19. package/dist/cjs/i18n/index.js +4 -4
  20. package/dist/cjs/index.js +41 -2
  21. package/dist/cjs/input/ArrayInput.js +259 -135
  22. package/dist/cjs/input/AvatarInput.js +99 -63
  23. package/dist/cjs/input/Checkbox.js +24 -25
  24. package/dist/cjs/input/ColorInput.js +138 -81
  25. package/dist/cjs/input/ColorPicker.js +78 -95
  26. package/dist/cjs/input/DateInput.js +192 -0
  27. package/dist/cjs/input/Field.js +21 -20
  28. package/dist/cjs/input/File.js +85 -80
  29. package/dist/cjs/input/Hidden.js +27 -13
  30. package/dist/cjs/input/Input.js +49 -48
  31. package/dist/cjs/input/Number.js +46 -44
  32. package/dist/cjs/input/Password.js +51 -49
  33. package/dist/cjs/input/Radio.js +26 -16
  34. package/dist/cjs/input/RadioGroup.js +26 -11
  35. package/dist/cjs/input/{Range.js → RangeSlider.js} +61 -66
  36. package/dist/cjs/input/Search.js +58 -64
  37. package/dist/cjs/input/Slider.js +57 -66
  38. package/dist/cjs/input/Switch.js +29 -27
  39. package/dist/cjs/input/Textarea.js +65 -53
  40. package/dist/cjs/internal/ErrorIcon.js +9 -9
  41. package/dist/cjs/internal/FieldWrapper.js +23 -13
  42. package/dist/cjs/internal/InputWrapper.js +85 -87
  43. package/dist/cjs/ranger/index.js +7 -7
  44. package/dist/cjs/ranger/utils.js +9 -4
  45. package/dist/cjs/select/AutoComplete.js +93 -76
  46. package/dist/cjs/select/DualList.js +235 -154
  47. package/dist/cjs/select/List.js +122 -89
  48. package/dist/cjs/select/Options.js +58 -54
  49. package/dist/cjs/select/Select.js +119 -89
  50. package/dist/cjs/select/helpers.js +5 -5
  51. package/dist/cjs/select/useSelect.js +83 -58
  52. package/dist/cjs/types/schema.js +43 -0
  53. package/dist/cjs/utils/eventHandlers.js +16 -6
  54. package/dist/cjs/utils/getColor.js +6 -6
  55. package/dist/cjs/utils/getProps.js +49 -0
  56. package/dist/esm/builder/FileField.js +109 -80
  57. package/dist/esm/builder/FormField.js +60 -39
  58. package/dist/esm/builder/SchemaEditor.js +72 -0
  59. package/dist/esm/builder/components/AddSchemaFields.js +64 -0
  60. package/dist/esm/builder/components/SchemaArrayForm.js +146 -0
  61. package/dist/esm/builder/components/SchemaField.js +423 -0
  62. package/dist/esm/form/Controller.js +66 -19
  63. package/dist/esm/form/Form.js +97 -39
  64. package/dist/esm/form/useForm.js +32 -0
  65. package/dist/esm/hooks/useFileUploader.js +75 -46
  66. package/dist/esm/hooks/useFormBuilder.js +84 -30
  67. package/dist/esm/i18n/{ar.json.js → ar/form.json.js} +5 -4
  68. package/dist/esm/i18n/{en.json.js → en/form.json.js} +5 -5
  69. package/dist/esm/i18n/index.js +2 -2
  70. package/dist/esm/index.js +36 -1
  71. package/dist/esm/input/ArrayInput.js +260 -136
  72. package/dist/esm/input/AvatarInput.js +99 -63
  73. package/dist/esm/input/Checkbox.js +26 -27
  74. package/dist/esm/input/ColorInput.js +141 -84
  75. package/dist/esm/input/ColorPicker.js +80 -97
  76. package/dist/esm/input/DateInput.js +192 -0
  77. package/dist/esm/input/Field.js +21 -20
  78. package/dist/esm/input/File.js +89 -84
  79. package/dist/esm/input/Hidden.js +28 -14
  80. package/dist/esm/input/Input.js +51 -50
  81. package/dist/esm/input/Number.js +48 -46
  82. package/dist/esm/input/Password.js +54 -52
  83. package/dist/esm/input/Radio.js +27 -17
  84. package/dist/esm/input/RadioGroup.js +27 -12
  85. package/dist/esm/input/{Range.js → RangeSlider.js} +62 -67
  86. package/dist/esm/input/Search.js +61 -67
  87. package/dist/esm/input/Slider.js +58 -67
  88. package/dist/esm/input/Switch.js +31 -29
  89. package/dist/esm/input/Textarea.js +67 -55
  90. package/dist/esm/internal/ErrorIcon.js +11 -11
  91. package/dist/esm/internal/FieldWrapper.js +23 -13
  92. package/dist/esm/internal/InputWrapper.js +88 -90
  93. package/dist/esm/ranger/index.js +7 -7
  94. package/dist/esm/ranger/utils.js +9 -4
  95. package/dist/esm/select/AutoComplete.js +95 -78
  96. package/dist/esm/select/DualList.js +233 -152
  97. package/dist/esm/select/List.js +125 -92
  98. package/dist/esm/select/Options.js +58 -54
  99. package/dist/esm/select/Select.js +122 -92
  100. package/dist/esm/select/helpers.js +5 -5
  101. package/dist/esm/select/useSelect.js +84 -59
  102. package/{src/input/ColorPicker.module.css → dist/esm/types/schema.js} +18 -27
  103. package/dist/esm/utils/eventHandlers.js +16 -6
  104. package/dist/esm/utils/getColor.js +6 -6
  105. package/dist/esm/utils/getProps.js +49 -0
  106. package/dist/types/builder/FileField.d.ts +7 -4
  107. package/dist/types/builder/FormField.d.ts +4 -2
  108. package/dist/types/builder/SchemaEditor.d.ts +6 -0
  109. package/dist/types/builder/components/AddSchemaFields.d.ts +2 -0
  110. package/dist/types/builder/components/SchemaArrayForm.d.ts +2 -0
  111. package/dist/types/builder/components/SchemaField.d.ts +12 -0
  112. package/dist/types/form/Controller.d.ts +45 -3
  113. package/dist/types/form/Form.d.ts +38 -7
  114. package/dist/types/form/useForm.d.ts +6 -0
  115. package/dist/types/hooks/useFileUploader.d.ts +24 -3
  116. package/dist/types/hooks/useFormBuilder.d.ts +41 -3
  117. package/dist/types/index.d.ts +32 -2
  118. package/dist/types/input/ArrayInput.d.ts +68 -13
  119. package/dist/types/input/AvatarInput.d.ts +23 -6
  120. package/dist/types/input/Checkbox.d.ts +12 -10
  121. package/dist/types/input/ColorInput.d.ts +15 -5
  122. package/dist/types/input/ColorPicker.d.ts +10 -2
  123. package/dist/types/input/DateInput.d.ts +21 -0
  124. package/dist/types/input/Field.d.ts +9 -36
  125. package/dist/types/input/File.d.ts +16 -4
  126. package/dist/types/input/Hidden.d.ts +7 -6
  127. package/dist/types/input/Input.d.ts +11 -4
  128. package/dist/types/input/Number.d.ts +9 -4
  129. package/dist/types/input/Password.d.ts +9 -4
  130. package/dist/types/input/Radio.d.ts +9 -4
  131. package/dist/types/input/RadioGroup.d.ts +14 -6
  132. package/dist/types/input/{Range.d.ts → RangeSlider.d.ts} +11 -6
  133. package/dist/types/input/Search.d.ts +14 -4
  134. package/dist/types/input/Slider.d.ts +9 -6
  135. package/dist/types/input/Switch.d.ts +13 -8
  136. package/dist/types/input/Textarea.d.ts +15 -4
  137. package/dist/types/internal/ErrorIcon.d.ts +4 -1
  138. package/dist/types/internal/FieldWrapper.d.ts +10 -1
  139. package/dist/types/internal/InputWrapper.d.ts +19 -1
  140. package/dist/types/ranger/index.d.ts +7 -3
  141. package/dist/types/ranger/utils.d.ts +2 -2
  142. package/dist/types/select/AutoComplete.d.ts +7 -2
  143. package/dist/types/select/DualList.d.ts +11 -37
  144. package/dist/types/select/List.d.ts +7 -2
  145. package/dist/types/select/Options.d.ts +8 -7
  146. package/dist/types/select/Select.d.ts +7 -2
  147. package/dist/types/select/helpers.d.ts +2 -2
  148. package/dist/types/select/useSelect.d.ts +10 -28
  149. package/dist/types/types/index.d.ts +73 -39
  150. package/dist/types/types/schema.d.ts +78 -32
  151. package/dist/types/utils/eventHandlers.d.ts +4 -4
  152. package/dist/types/utils/getColor.d.ts +4 -4
  153. package/dist/types/utils/getProps.d.ts +26 -0
  154. package/dist/types/utils/index.d.ts +1 -0
  155. package/package.json +25 -25
  156. package/src/builder/FileField.tsx +73 -56
  157. package/src/builder/FormField.tsx +66 -58
  158. package/src/builder/SchemaEditor.tsx +78 -0
  159. package/src/builder/components/AddSchemaFields.tsx +64 -0
  160. package/src/builder/components/SchemaArrayForm.tsx +146 -0
  161. package/src/builder/components/SchemaField.tsx +405 -0
  162. package/src/form/Controller.tsx +61 -24
  163. package/src/form/Form.tsx +74 -50
  164. package/src/form/useForm.ts +53 -0
  165. package/src/hooks/useFileUploader.ts +115 -84
  166. package/src/hooks/useFormBuilder.tsx +80 -41
  167. package/src/i18n/{ar.json → ar/form.json} +5 -4
  168. package/src/i18n/{en.json → en/form.json} +5 -5
  169. package/src/i18n/index.ts +2 -2
  170. package/src/index.ts +34 -20
  171. package/src/input/ArrayInput.tsx +255 -173
  172. package/src/input/AvatarInput.tsx +82 -39
  173. package/src/input/Checkbox.tsx +30 -54
  174. package/src/input/ColorInput.tsx +146 -105
  175. package/src/input/ColorPicker.tsx +76 -102
  176. package/src/input/DateInput.tsx +225 -0
  177. package/src/input/Field.tsx +23 -65
  178. package/src/input/File.tsx +76 -98
  179. package/src/input/Hidden.tsx +36 -24
  180. package/src/input/Input.tsx +55 -53
  181. package/src/input/Number.tsx +49 -54
  182. package/src/input/Password.tsx +61 -66
  183. package/src/input/Radio.tsx +28 -37
  184. package/src/input/RadioGroup.tsx +30 -25
  185. package/src/input/{Range.tsx → RangeSlider.tsx} +81 -109
  186. package/src/input/Search.tsx +64 -77
  187. package/src/input/Slider.tsx +80 -109
  188. package/src/input/Switch.tsx +39 -53
  189. package/src/input/Textarea.tsx +72 -59
  190. package/src/internal/ErrorIcon.tsx +22 -21
  191. package/src/internal/FieldWrapper.tsx +33 -23
  192. package/src/internal/InputWrapper.tsx +132 -143
  193. package/src/ranger/index.tsx +37 -117
  194. package/src/ranger/utils.ts +12 -11
  195. package/src/select/AutoComplete.tsx +113 -123
  196. package/src/select/DualList.tsx +218 -204
  197. package/src/select/List.tsx +130 -97
  198. package/src/select/Options.tsx +59 -57
  199. package/src/select/Select.tsx +148 -122
  200. package/src/select/helpers.ts +13 -8
  201. package/src/select/useSelect.tsx +110 -127
  202. package/src/types/index.ts +76 -45
  203. package/src/types/schema.ts +97 -40
  204. package/src/utils/eventHandlers.ts +24 -26
  205. package/src/utils/getColor.ts +9 -8
  206. package/src/utils/getProps.ts +47 -0
  207. package/src/utils/index.ts +1 -0
  208. package/dist/cjs/input/ArrayInput.module.css +0 -1
  209. package/dist/cjs/input/ColorPicker.module.css +0 -1
  210. package/dist/cjs/input/File.module.css +0 -1
  211. package/dist/cjs/internal/Field.module.css +0 -1
  212. package/dist/esm/input/ArrayInput.module.css +0 -1
  213. package/dist/esm/input/ColorPicker.module.css +0 -1
  214. package/dist/esm/input/File.module.css +0 -1
  215. package/dist/esm/internal/Field.module.css +0 -1
@@ -1,41 +1,86 @@
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');
9
+ var utilities = require('@react-fabric/utilities');
10
10
  var react = require('react');
11
11
  var reactHookForm = require('react-hook-form');
12
12
  var jsxRuntime = require('react/jsx-runtime');
13
13
 
14
- var _excluded = ["formRef", "schema", "children", "defaultValues", "onSubmit", "onChange"];
14
+ var _excluded = ["formRef", "resolver", "children", "resetOnChange", "defaultValues", "onSubmit", "onChange"];
15
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; }
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; }
16
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), true).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
17
  var DEFAULT_SUBMIT = function DEFAULT_SUBMIT() {
18
18
  return undefined;
19
19
  };
20
- var Form = function Form(_ref) {
20
+
21
+ /**
22
+ * Form component for managing form state and validation using react-hook-form and yup.
23
+ * It provides a simple interface for form handling, including submission, validation, and value management.
24
+ * It supports nested form structures and allows for custom validation schemas using Yup.
25
+ *
26
+ * @example
27
+ * ```jsx
28
+ * <Form
29
+ * formRef={formRef}
30
+ * resolver={hookformResolver(schema)}
31
+ * defaultValues={{ name: "", email: "" }}
32
+ * onSubmit={(values) => {
33
+ * console.log("Form submitted with values:", values);
34
+ * }}
35
+ * >
36
+ * <input name="name" ref={form.register} placeholder="Name" />
37
+ * <input name="email" ref={form.register} placeholder="Email" />
38
+ * <button type="submit">Submit</button>
39
+ * </Form>
40
+ * ```
41
+ *
42
+ * @see {@link https://react-hook-form.com/docs/useform} for more details on the properties.
43
+ */
44
+ function Form(_ref) {
21
45
  var formRef = _ref.formRef,
22
- schema = _ref.schema,
46
+ resolver = _ref.resolver,
23
47
  children = _ref.children,
24
- defaultValues = _ref.defaultValues,
48
+ resetOnChange = _ref.resetOnChange,
49
+ _ref$defaultValues = _ref.defaultValues,
50
+ _defaultValues = _ref$defaultValues === void 0 ? utilities.EMPTY_OBJECT : _ref$defaultValues,
25
51
  _ref$onSubmit = _ref.onSubmit,
26
- onSubmit = _ref$onSubmit === void 0 ? DEFAULT_SUBMIT : _ref$onSubmit,
52
+ _onSubmit = _ref$onSubmit === void 0 ? DEFAULT_SUBMIT : _ref$onSubmit,
27
53
  onChange = _ref.onChange,
28
54
  rest = _objectWithoutProperties(_ref, _excluded);
29
55
  var ref = react.useRef(null);
30
56
  var form = reactHookForm.useForm({
31
57
  shouldFocusError: true,
32
- resolver: schema && yup.yupResolver(schema),
33
- defaultValues: defaultValues
58
+ resolver: resolver,
59
+ defaultValues: function () {
60
+ var _defaultValues2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
61
+ return _regeneratorRuntime.wrap(function (_context) {
62
+ while (1) switch (_context.prev = _context.next) {
63
+ case 0:
64
+ _context.next = 1;
65
+ return Promise.resolve(_defaultValues);
66
+ case 1:
67
+ return _context.abrupt("return", _context.sent);
68
+ case 2:
69
+ case "end":
70
+ return _context.stop();
71
+ }
72
+ }, _callee);
73
+ }));
74
+ function defaultValues() {
75
+ return _defaultValues2.apply(this, arguments);
76
+ }
77
+ return defaultValues;
78
+ }()
34
79
  });
35
80
  var _useTransition = react.useTransition(),
36
81
  _useTransition2 = _slicedToArray(_useTransition, 2),
37
82
  startTransition = _useTransition2[1];
38
- var changeHandler = core.useDebounce(onChange, [onChange]);
83
+ var changeHandler = core.useDebounce(onChange, [onChange], 300);
39
84
  react.useEffect(function () {
40
85
  var subscription = form.watch(function (value) {
41
86
  startTransition(function () {
@@ -45,42 +90,49 @@ var Form = function Form(_ref) {
45
90
  return function () {
46
91
  return subscription.unsubscribe();
47
92
  };
48
- }, [form.watch, changeHandler]);
93
+ }, [form.watch, changeHandler, form]);
49
94
  var handleReset = react.useCallback(function () {
50
- var _ref$current;
51
95
  var reset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
52
- form.reset(reset);
53
- form.clearErrors();
54
- (_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();
55
- }, [defaultValues]);
96
+ void Promise.resolve(reset).then(function (resp) {
97
+ var _ref$current;
98
+ form.reset(resp);
99
+ form.clearErrors();
100
+ (_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();
101
+ });
102
+ }, [form]);
103
+ react.useEffect(function () {
104
+ if (resetOnChange) {
105
+ handleReset(_defaultValues);
106
+ }
107
+ }, [_defaultValues, handleReset, resetOnChange]);
56
108
  react.useImperativeHandle(formRef, function () {
57
109
  return {
58
110
  state: form.formState,
59
111
  reset: function reset() {
60
- return handleReset(defaultValues);
112
+ return handleReset(_defaultValues);
61
113
  },
62
114
  clear: function clear() {
63
115
  return handleReset();
64
116
  },
65
117
  submit: function submit() {
66
- return form.handleSubmit(onSubmit);
118
+ return form.handleSubmit(_onSubmit);
67
119
  },
68
120
  validate: function () {
69
- var _validate = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
70
- return _regeneratorRuntime.wrap(function _callee$(_context) {
71
- while (1) switch (_context.prev = _context.next) {
121
+ var _validate = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(fields) {
122
+ return _regeneratorRuntime.wrap(function (_context2) {
123
+ while (1) switch (_context2.prev = _context2.next) {
72
124
  case 0:
73
- _context.next = 2;
74
- return form.trigger();
125
+ _context2.next = 1;
126
+ return form.trigger(fields);
127
+ case 1:
128
+ return _context2.abrupt("return", _context2.sent);
75
129
  case 2:
76
- return _context.abrupt("return", _context.sent);
77
- case 3:
78
130
  case "end":
79
- return _context.stop();
131
+ return _context2.stop();
80
132
  }
81
- }, _callee);
133
+ }, _callee2);
82
134
  }));
83
- function validate() {
135
+ function validate(_x) {
84
136
  return _validate.apply(this, arguments);
85
137
  }
86
138
  return validate;
@@ -95,28 +147,34 @@ var Form = function Form(_ref) {
95
147
  },
96
148
  setValue: function setValue(k, v) {
97
149
  return setTimeout(function () {
98
- return form.setValue(k, v, {
99
- shouldDirty: false,
100
- shouldTouch: false
101
- });
150
+ return (
151
+ // @ts-expect-error ignore
152
+ form.setValue(k, v, {
153
+ shouldDirty: false,
154
+ shouldTouch: false
155
+ })
156
+ );
102
157
  }, 50);
103
158
  }
104
159
  };
105
- }, [onSubmit, form, form.formState, defaultValues]);
160
+ }, [_defaultValues, form, handleReset, _onSubmit]);
106
161
  var onInvalid = react.useCallback(function (_, e) {
107
- var el = e.target;
162
+ var el = e === null || e === void 0 ? void 0 : e.target;
108
163
  setTimeout(function () {
109
164
  var _el$querySelector;
110
- return (_el$querySelector = el.querySelector("input[aria-invalid='true'],textarea[aria-invalid='true']")) === null || _el$querySelector === void 0 ? void 0 : _el$querySelector.focus();
165
+ return el === null || el === void 0 || (_el$querySelector = el.querySelector("input[aria-invalid='true'],textarea[aria-invalid='true']")) === null || _el$querySelector === void 0 ? void 0 : _el$querySelector.focus();
111
166
  }, 10);
112
167
  }, []);
113
168
  return /*#__PURE__*/jsxRuntime.jsx(reactHookForm.FormProvider, _objectSpread(_objectSpread({}, form), {}, {
114
169
  children: /*#__PURE__*/jsxRuntime.jsxs("form", _objectSpread(_objectSpread({
115
170
  ref: ref,
116
171
  onReset: function onReset() {
117
- return handleReset(defaultValues);
172
+ return handleReset(_defaultValues);
173
+ },
174
+ onSubmit: function onSubmit(e) {
175
+ e.stopPropagation();
176
+ void form.handleSubmit(_onSubmit, onInvalid)(e);
118
177
  },
119
- onSubmit: form.handleSubmit(onSubmit, onInvalid),
120
178
  "data-loading": form.formState.isSubmitting,
121
179
  className: "contents",
122
180
  autoComplete: "off"
@@ -127,6 +185,6 @@ var Form = function Form(_ref) {
127
185
  })]
128
186
  }))
129
187
  }));
130
- };
188
+ }
131
189
 
132
190
  exports.Form = Form;
@@ -0,0 +1,32 @@
1
+ 'use strict';
2
+
3
+ var _defineProperty = require('@babel/runtime/helpers/defineProperty');
4
+ var reactHookForm = require('react-hook-form');
5
+
6
+ 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; }
7
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), true).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; }
8
+ function useForm() {
9
+ var _useFormContext = reactHookForm.useFormContext(),
10
+ formState = _useFormContext.formState,
11
+ getValues = _useFormContext.getValues,
12
+ setValue = _useFormContext.setValue,
13
+ watch = _useFormContext.watch,
14
+ reset = _useFormContext.reset,
15
+ resetField = _useFormContext.resetField,
16
+ setError = _useFormContext.setError,
17
+ setFocus = _useFormContext.setFocus;
18
+ var values = reactHookForm.useWatch();
19
+ return {
20
+ values: _objectSpread(_objectSpread({}, values), getValues()),
21
+ formState: formState,
22
+ getValues: getValues,
23
+ setValue: setValue,
24
+ watch: watch,
25
+ reset: reset,
26
+ resetField: resetField,
27
+ setError: setError,
28
+ setFocus: setFocus
29
+ };
30
+ }
31
+
32
+ exports.useForm = useForm;
@@ -11,9 +11,28 @@ var react = require('react');
11
11
  var _excluded = ["progress", "abort"],
12
12
  _excluded2 = ["file", "progress", "abort"];
13
13
  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; }
14
- 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; }
15
- var useFileUploader = function useFileUploader(uploader, initialList) {
16
- var multiple = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
14
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), true).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; }
15
+ /**
16
+ * useFileUploader hook provides a way to handle file uploads
17
+ * with progress tracking, error handling, and file management.
18
+ * It uses a reducer to manage the state of uploaded files and their statuses.
19
+ *
20
+ * @param uploader - The function that handles the file upload.
21
+ * @param initialList - Initial list of files to be managed by the uploader.
22
+ * @param multiple - Whether to allow multiple file uploads or not.
23
+ * @returns An object containing methods to upload, remove, retry files,
24
+ * and the current state of the uploader including pending uploads and file list.
25
+ *
26
+ * @example
27
+ * ```jsx
28
+ * const { upload, remove, retry, state } = useFileUploader(uploader, initialList, multiple);
29
+ * ```
30
+ */
31
+ function useFileUploader(uploader, initialList) {
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;
17
36
  var _useReducer = react.useReducer(function (state, action) {
18
37
  if (action.type === "start") {
19
38
  if (!multiple) state.files.clear();
@@ -60,40 +79,26 @@ var useFileUploader = function useFileUploader(uploader, initialList) {
60
79
  if (action.type === "remove") {
61
80
  state.files["delete"](action.key);
62
81
  }
63
- state.list = Array.from(state.files.values()).map(function (file) {
64
- return !file.progress && !file.error && {
65
- key: file.key,
66
- path: file.path,
67
- mime: file.mime,
68
- size: file.size,
69
- uploaded: file.uploaded,
70
- filename: file.filename
71
- };
72
- }).filter(Boolean);
73
- return _objectSpread({}, state);
74
- }, {
75
- files: new Map(),
76
- count: 0
77
- }, function (state) {
78
- if (initialList) {
79
- if (utilities.isString(initialList)) {
82
+ if (action.type === "init") {
83
+ state.files = new Map();
84
+ if (utilities.isString(action.initialList)) {
80
85
  var key = utilities.uuid();
81
86
  state.files.set(key, {
82
87
  key: key,
83
- path: initialList,
88
+ path: action.initialList,
84
89
  filename: "",
85
90
  size: 0,
86
91
  mime: ""
87
92
  });
88
93
  }
89
- if (utilities.isObject(initialList)) {
94
+ if (utilities.isObject(action.initialList)) {
90
95
  var _key = utilities.uuid();
91
- state.files.set(_key, _objectSpread(_objectSpread({}, initialList), {}, {
96
+ state.files.set(_key, _objectSpread(_objectSpread({}, action.initialList), {}, {
92
97
  key: _key
93
98
  }));
94
99
  }
95
- if (utilities.isArray(initialList)) {
96
- initialList.forEach(function (file) {
100
+ if (utilities.isArray(action.initialList)) {
101
+ action.initialList.forEach(function (file) {
97
102
  var key = utilities.uuid();
98
103
  state.files.set(key, _objectSpread(_objectSpread({}, file), {}, {
99
104
  key: key
@@ -101,21 +106,46 @@ var useFileUploader = function useFileUploader(uploader, initialList) {
101
106
  });
102
107
  }
103
108
  }
104
- state.list = Array.from(state.files.values());
105
- 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
+ // @ts-expect-error ignore
123
+ onChange === null || onChange === void 0 || onChange(multiple ? state.list : (_state$list$ = state.list[0]) !== null && _state$list$ !== void 0 ? _state$list$ : null);
124
+ }, 100);
125
+ }
126
+ return _objectSpread({}, state);
127
+ }, {
128
+ files: new Map(),
129
+ count: 0
106
130
  }),
107
131
  _useReducer2 = _slicedToArray(_useReducer, 2),
108
132
  state = _useReducer2[0],
109
133
  dispatch = _useReducer2[1];
110
- var doUpload = react.useCallback( /*#__PURE__*/function () {
111
- var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(key, file) {
112
- var data, _abort2;
113
- return _regeneratorRuntime.wrap(function _callee$(_context) {
134
+ react.useEffect(function () {
135
+ dispatch({
136
+ type: "init",
137
+ initialList: initialList
138
+ });
139
+ }, [initialList]);
140
+ var doUpload = react.useCallback(/*#__PURE__*/function () {
141
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(key, file) {
142
+ var data, _abort;
143
+ return _regeneratorRuntime.wrap(function (_context) {
114
144
  while (1) switch (_context.prev = _context.next) {
115
145
  case 0:
116
146
  data = new FormData();
117
147
  data.append("file", file);
118
- _abort2 = new AbortController();
148
+ _abort = new AbortController();
119
149
  dispatch({
120
150
  type: "start",
121
151
  key: key,
@@ -127,13 +157,13 @@ var useFileUploader = function useFileUploader(uploader, initialList) {
127
157
  filename: file.name,
128
158
  size: file.size,
129
159
  abort: function abort() {
130
- return _abort2.abort();
160
+ return _abort.abort();
131
161
  }
132
162
  }
133
163
  });
134
- _context.next = 6;
164
+ _context.next = 1;
135
165
  return uploader(data, {
136
- signal: _abort2.signal,
166
+ signal: _abort.signal,
137
167
  onUploadProgress: function onUploadProgress(progressEvent) {
138
168
  var _progressEvent$progre;
139
169
  dispatch({
@@ -149,7 +179,7 @@ var useFileUploader = function useFileUploader(uploader, initialList) {
149
179
  path: path
150
180
  });
151
181
  })["catch"](function (error) {
152
- var _error$message;
182
+ var _ref3;
153
183
  if (error.code === "ERR_CANCELED" || error.name === "AbortError") {
154
184
  return dispatch({
155
185
  type: "abort",
@@ -159,19 +189,19 @@ var useFileUploader = function useFileUploader(uploader, initialList) {
159
189
  dispatch({
160
190
  type: "error",
161
191
  key: key,
162
- error: (_error$message = error === null || error === void 0 ? void 0 : error.message) !== null && _error$message !== void 0 ? _error$message : "form:fileUploadFailed"
192
+ error: (_ref3 = error === null || error === void 0 ? void 0 : error.message) !== null && _ref3 !== void 0 ? _ref3 : "form:fileUploadFailed"
163
193
  });
164
194
  });
165
- case 6:
195
+ case 1:
166
196
  case "end":
167
197
  return _context.stop();
168
198
  }
169
199
  }, _callee);
170
200
  }));
171
201
  return function (_x, _x2) {
172
- return _ref.apply(this, arguments);
202
+ return _ref2.apply(this, arguments);
173
203
  };
174
- }(), []);
204
+ }(), [uploader]);
175
205
  var upload = react.useCallback(function (files) {
176
206
  if (!multiple) {
177
207
  var _Array$from$, _Array$from$$abort;
@@ -180,25 +210,24 @@ var useFileUploader = function useFileUploader(uploader, initialList) {
180
210
  Array.from(files !== null && files !== void 0 ? files : []).slice(0, multiple ? undefined : 1).forEach(function (file) {
181
211
  void doUpload(utilities.uuid(), file);
182
212
  });
183
- }, [multiple]);
213
+ }, [doUpload, multiple, state.files]);
184
214
  var retry = react.useCallback(function (key) {
185
215
  var fileObject = state.files.get(key);
186
216
  void ((fileObject === null || fileObject === void 0 ? void 0 : fileObject.file) && doUpload(key, fileObject.file));
187
- }, [state]);
217
+ }, [doUpload, state.files]);
188
218
  var remove = react.useCallback(function (key) {
189
219
  dispatch({
190
220
  type: "remove",
191
221
  key: key
192
222
  });
193
- }, [state]);
223
+ }, []);
194
224
  return {
195
225
  upload: upload,
196
226
  remove: remove,
197
227
  retry: retry,
198
228
  pending: state.count,
199
- list: state.list,
200
229
  files: Array.from(state.files.values())
201
230
  };
202
- };
231
+ }
203
232
 
204
233
  exports.useFileUploader = useFileUploader;
@@ -1,33 +1,45 @@
1
1
  'use strict';
2
2
 
3
3
  var _defineProperty = require('@babel/runtime/helpers/defineProperty');
4
+ var yup = require('@hookform/resolvers/yup');
5
+ var core = require('@react-fabric/core');
4
6
  var utilities = require('@react-fabric/utilities');
5
7
  var react = require('react');
6
8
  var FormField = require('../builder/FormField.js');
9
+ var schema = require('../types/schema.js');
7
10
  var jsxRuntime = require('react/jsx-runtime');
8
11
 
9
12
  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; }
10
- 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; }
11
- var makeYupField = function makeYupField(field) {
12
- var yupField = utilities.yup.string();
13
- if (field.datatype === "schema") {
13
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), true).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; }
14
+ function makeYupField(field) {
15
+ var yupField = utilities.yup.string().trim();
16
+ if (field.datatype === schema.DATA_TYPES.SCHEMA) {
14
17
  var child = Object.fromEntries(field.schema.map(function (field) {
15
18
  return [field.id, makeYupField(field)];
16
19
  }));
17
20
  yupField = utilities.yup.object(child);
18
21
  }
19
- if (field.datatype === "boolean") yupField = utilities.yup["boolean"]();
20
- if (field.datatype === "decimal" || field.datatype === "number" || field.datatype === "range") {
21
- yupField = utilities.yup.number();
22
- !utilities.isNil(field.min) && (yupField = yupField.min(field.min));
23
- !utilities.isNil(field.max) && (yupField = yupField.max(field.max));
24
- if (field.datatype === "range") yupField = utilities.yup.array(yupField);
22
+ if (field.datatype === schema.DATA_TYPES.BOOL) {
23
+ yupField = utilities.yup["boolean"]();
24
+ if (field.required) yupField = yupField.test({
25
+ test: function test(value) {
26
+ return !!value;
27
+ }
28
+ });
25
29
  }
26
- if (field.datatype === "string") {
27
- field.options && (yupField = yupField.oneOf(field.options));
28
- field.regex && (yupField = yupField.matches(new RegExp(field.regex)));
30
+ if (field.datatype === schema.DATA_TYPES.NUMBER || field.datatype === schema.DATA_TYPES.RANGE) {
31
+ var numberField = utilities.yup.number();
32
+ if (!utilities.isNil(field.min)) numberField = numberField.min(field.min);
33
+ if (!utilities.isNil(field.max)) numberField = numberField.max(field.max);
34
+ if (field.datatype === schema.DATA_TYPES.RANGE) yupField = utilities.yup.array(numberField);else yupField = numberField;
29
35
  }
30
- if (field.datatype === "file") {
36
+ if (field.datatype === schema.DATA_TYPES.STRING) {
37
+ var stringField = utilities.yup.string().trim();
38
+ if (field.options && !field.allowCustom) stringField = stringField.oneOf(field.options);
39
+ if (field.regex) stringField = stringField.matches(new RegExp(field.regex));
40
+ yupField = stringField;
41
+ }
42
+ if (field.datatype === schema.DATA_TYPES.FILE) {
31
43
  yupField = utilities.yup.object({
32
44
  filename: utilities.yup.string().required(),
33
45
  path: utilities.yup.string().required()
@@ -44,44 +56,86 @@ var makeYupField = function makeYupField(field) {
44
56
  });
45
57
  }
46
58
  }
47
- if (field.required) {
48
- yupField = yupField.required();
49
- }
50
59
  if (field.multiple) {
51
- yupField = utilities.yup.array(yupField);
52
- field.required && (yupField = yupField.required().min(1));
60
+ var arrayField = utilities.yup.array(yupField);
61
+ if (field.required) arrayField = arrayField.required().min(1);
62
+ yupField = arrayField;
63
+ } else {
64
+ if (field.required) {
65
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
66
+ yupField = yupField.required();
67
+ }
53
68
  }
54
69
  return yupField.label(field.label);
55
- };
56
- var useFormBuilder = function useFormBuilder(schema) {
70
+ }
71
+
72
+ /**
73
+ * useFormBuilder hook to create a form definition based on a schema.
74
+ * It generates a Yup validation schema and a form definition component.
75
+ *
76
+ * @param {FormSchema} schema - The schema defining the form fields.
77
+ * @param {Object} options - Optional parameters for the form builder.
78
+ * @returns An object containing the form definition and the Yup validation schema.
79
+ *
80
+ * @example
81
+ * ```jsx
82
+ * const { formDef, schemaDef } = useFormBuilder(schema, {
83
+ * prefix: "form",
84
+ * inline: true,
85
+ * fileUrl: (path) => `/files/${path}`,
86
+ * uploadHandler: async (file) => {
87
+ * // handle file upload
88
+ * },
89
+ * optionLists: {
90
+ * // define option lists for select fields
91
+ * }
92
+ * * });
93
+ * <FormBuilder
94
+ * schema={schemaDef}
95
+ * onSubmit={(data) => console.log(data)}
96
+ * >
97
+ * {formDef}
98
+ * </FormBuilder>
99
+ * ```
100
+ */
101
+ function useFormBuilder(schema$1) {
57
102
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
58
103
  var filteredSchema = react.useMemo(function () {
59
104
  var _schema$filter, _schema$filter2;
60
- return (_schema$filter = (_schema$filter2 = schema.filter) === null || _schema$filter2 === void 0 ? void 0 : _schema$filter2.call(schema, function (schm) {
105
+ return (_schema$filter = (_schema$filter2 = schema$1.filter) === null || _schema$filter2 === void 0 ? void 0 : _schema$filter2.call(schema$1, function (schm) {
61
106
  return !!schm.id;
62
107
  })) !== null && _schema$filter !== void 0 ? _schema$filter : [];
63
- }, [schema]);
64
- var schemaDef = utilities.yup.object(Object.fromEntries(filteredSchema.map(function (field) {
65
- return [field.id, makeYupField(field)];
66
- })));
67
- var formDef = /*#__PURE__*/jsxRuntime.jsx(react.Fragment, {
68
- children: filteredSchema.map(function (field, idx) {
108
+ }, [schema$1]);
109
+ var schemaDef = react.useMemo(function () {
110
+ return utilities.yup.object(Object.fromEntries(filteredSchema.map(function (field) {
111
+ return [field.id, makeYupField(field)];
112
+ })));
113
+ }, [filteredSchema]);
114
+ var resolver = react.useMemo(function () {
115
+ return yup.yupResolver(schemaDef);
116
+ }, [schemaDef]);
117
+ var formDef = /*#__PURE__*/jsxRuntime.jsxs(react.Fragment, {
118
+ children: [filteredSchema.map(function (field, idx) {
69
119
  return /*#__PURE__*/jsxRuntime.jsx("div", {
70
120
  className: "mb-4",
71
- children: field.datatype === "schema" ? null : /*#__PURE__*/jsxRuntime.jsx(FormField.FormField, _objectSpread(_objectSpread({}, field), {}, {
121
+ children: field.datatype === schema.DATA_TYPES.SCHEMA ? null : /*#__PURE__*/jsxRuntime.jsx(FormField.FormField, _objectSpread(_objectSpread({}, field), {}, {
72
122
  autoFocus: idx === 0,
73
123
  fileUrl: options.fileUrl,
124
+ optionLists: options.optionLists,
74
125
  uploadHandler: options.uploadHandler,
75
126
  inline: options.inline,
76
127
  prefix: options.prefix
77
128
  }))
78
129
  }, field.id);
79
- })
130
+ }), filteredSchema.length === 0 && /*#__PURE__*/jsxRuntime.jsx(core.EmptyContent, {
131
+ message: "No schema defined"
132
+ })]
80
133
  });
81
134
  return {
82
135
  formDef: formDef,
136
+ resolver: resolver,
83
137
  schemaDef: schemaDef
84
138
  };
85
- };
139
+ }
86
140
 
87
141
  exports.useFormBuilder = useFormBuilder;
@@ -4,17 +4,18 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var addArray = "اضافة عنصر";
6
6
  var password = {
7
- show: "عرض كلمة المرور",
8
- hide: "اخفاء كلمة المرور"
7
+ hide: "اخفاء كلمة المرور",
8
+ show: "عرض كلمة المرور"
9
9
  };
10
10
  var select = {
11
+ createOption: "إنشاء خيار جديد ل ",
11
12
  emptyList: "لا توجد خيارات متاحة",
12
- notFound: "لم يتم العثور على خيارات ل ",
13
- createOption: "إنشاء خيار جديد ل "
13
+ notFound: "لم يتم العثور على خيارات ل "
14
14
  };
15
15
  var yup = {
16
16
  arrayMax: "{{label}} حدد ما يصل {{max}} غرض",
17
17
  arrayMin: "{{label}} اختر على الأقل {{min}} غرض",
18
+ empty: "{{label}} يجب ألا يكون فارغًا",
18
19
  invalid: "{{label}} نوع بيانات غير صالح",
19
20
  invalidType: "{{label}} غير صالح",
20
21
  numberMax: "{{label}} الحد الأقصى {{max}}",