@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
@@ -0,0 +1,146 @@
1
+ 'use client';
2
+
3
+ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
4
+ import { RestrictToVerticalAxis } from '@dnd-kit/abstract/modifiers';
5
+ import { DragDropProvider } from '@dnd-kit/react';
6
+ import { useOverlayService, Header, Button, Content } from '@react-fabric/core';
7
+ import { isArray } from '@react-fabric/utilities';
8
+ import { useState, useCallback } from 'react';
9
+ import { useFormContext, useFieldArray } from 'react-hook-form';
10
+ import { DATA_TYPES } from '../../types/schema.js';
11
+ import { AddSchemaFields } from './AddSchemaFields.js';
12
+ import { SchemaField } from './SchemaField.js';
13
+ import { jsxs, jsx } from 'react/jsx-runtime';
14
+
15
+ function Wrapper(_ref) {
16
+ var children = _ref.children,
17
+ fields = _ref.fields,
18
+ onMove = _ref.onMove;
19
+ // pass id list to dnd context
20
+ var idMap = fields.map(function (item) {
21
+ return item.__ID__;
22
+ });
23
+ var handleDragEnd = function handleDragEnd(e) {
24
+ var _e$operation$source, _e$operation$target;
25
+ if (((_e$operation$source = e.operation.source) === null || _e$operation$source === void 0 ? void 0 : _e$operation$source.id) !== ((_e$operation$target = e.operation.target) === null || _e$operation$target === void 0 ? void 0 : _e$operation$target.id)) {
26
+ var _e$operation$source2, _e$operation$target2;
27
+ // find index of item and drop over
28
+ var active = idMap.indexOf("".concat((_e$operation$source2 = e.operation.source) === null || _e$operation$source2 === void 0 ? void 0 : _e$operation$source2.id));
29
+ var end = idMap.indexOf("".concat((_e$operation$target2 = e.operation.target) === null || _e$operation$target2 === void 0 ? void 0 : _e$operation$target2.id));
30
+ onMove(active, end);
31
+ }
32
+ };
33
+ return /*#__PURE__*/jsx(DragDropProvider, {
34
+ onDragEnd: handleDragEnd,
35
+ modifiers: [RestrictToVerticalAxis],
36
+ children: children
37
+ });
38
+ }
39
+
40
+ // Need to disable prop-types lint due to uknown lint error
41
+ function SchemaArrayForm(_ref2) {
42
+ var dynamic = _ref2.dynamic,
43
+ acceptableTypes = _ref2.acceptableTypes,
44
+ optionLists = _ref2.optionLists;
45
+ var form = useFormContext();
46
+ var _useState = useState(true),
47
+ _useState2 = _slicedToArray(_useState, 2),
48
+ defaultOpen = _useState2[0],
49
+ setDefaultOpen = _useState2[1];
50
+ var _useFieldArray = useFieldArray({
51
+ name: "schema",
52
+ control: form.control
53
+ }),
54
+ fields = _useFieldArray.fields,
55
+ append = _useFieldArray.append,
56
+ remove = _useFieldArray.remove,
57
+ move = _useFieldArray.move;
58
+ var handleTypeChange = useCallback(function (index, val) {
59
+ form.setValue("schema.".concat(index), val);
60
+ }, [form]);
61
+ var handleRemove = useCallback(function (index) {
62
+ remove(index);
63
+ }, [remove]);
64
+ var _useOverlayService = useOverlayService(AddSchemaFields),
65
+ _useOverlayService2 = _slicedToArray(_useOverlayService, 2),
66
+ renderModal = _useOverlayService2[0],
67
+ openAddfields = _useOverlayService2[1];
68
+ var handleAdd = useCallback(function () {
69
+ void openAddfields().then(function (fields) {
70
+ if (isArray(fields)) {
71
+ var existing = form.getValues().schema.map(function (field) {
72
+ return field.id;
73
+ });
74
+ fields.forEach(function (field) {
75
+ if (!existing.includes(field)) {
76
+ append({
77
+ id: field,
78
+ datatype: DATA_TYPES.STRING,
79
+ label: ""
80
+ });
81
+ }
82
+ });
83
+ }
84
+ });
85
+ // eslint-disable-next-line @eslint-react/exhaustive-deps
86
+ }, []);
87
+ return /*#__PURE__*/jsxs(Wrapper, {
88
+ onMove: move,
89
+ fields: fields,
90
+ children: [/*#__PURE__*/jsxs(Header, {
91
+ flex: true,
92
+ justify: "end",
93
+ className: "gap-1 px-2",
94
+ children: [dynamic && /*#__PURE__*/jsx(Button, {
95
+ size: "sm",
96
+ variant: "link",
97
+ icon: "icon-[mdi--plus-circle-outline]",
98
+ "aria-label": "add field",
99
+ onClick: handleAdd
100
+ }), /*#__PURE__*/jsx(Button, {
101
+ size: "sm",
102
+ variant: "link",
103
+ icon: "icon-[mdi--arrow-collapse-vertical]",
104
+ "aria-label": "collapse all",
105
+ onClick: function onClick() {
106
+ return setDefaultOpen(false);
107
+ }
108
+ }), /*#__PURE__*/jsx(Button, {
109
+ size: "sm",
110
+ variant: "link",
111
+ icon: "icon-[mdi--arrow-expand-vertical]",
112
+ "aria-label": "expand all",
113
+ onClick: function onClick() {
114
+ return setDefaultOpen(true);
115
+ }
116
+ })]
117
+ }), /*#__PURE__*/jsx(Content, {
118
+ className: "divide-y",
119
+ children: fields.map(function (field, index) {
120
+ return /*#__PURE__*/jsx(SchemaField
121
+ // eslint-disable-next-line @eslint-react/no-array-index-key
122
+ , {
123
+ index: index,
124
+ defaultOpen: defaultOpen,
125
+ id: form.getValues().schema[index].id,
126
+ fieldId: field.id,
127
+ field: "schema.".concat(index),
128
+ dynamic: dynamic,
129
+ optionLists: optionLists,
130
+ onRemove: function onRemove() {
131
+ return handleRemove(index);
132
+ },
133
+ getModel: function getModel() {
134
+ return form.getValues().schema[index];
135
+ },
136
+ onTypeChange: function onTypeChange(val) {
137
+ return handleTypeChange(index, val);
138
+ },
139
+ acceptableTypes: acceptableTypes !== null && acceptableTypes !== void 0 ? acceptableTypes : Object.values(DATA_TYPES)
140
+ }, index);
141
+ })
142
+ }), renderModal()]
143
+ });
144
+ }
145
+
146
+ export { SchemaArrayForm };
@@ -0,0 +1,423 @@
1
+ 'use client';
2
+
3
+ import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
4
+ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
5
+ import _defineProperty from '@babel/runtime/helpers/defineProperty';
6
+ import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
7
+ import { useSortable } from '@dnd-kit/react/sortable';
8
+ import { useOverlayService, Collapsable, Button, ToggleButtonGroup, Modal, Content, Footer } from '@react-fabric/core';
9
+ import { EMPTY_ARRAY, cn } from '@react-fabric/utilities';
10
+ import { useState, useEffect, useCallback, Fragment } from 'react';
11
+ import { Controller } from '../../form/Controller.js';
12
+ import { ArrayInput } from '../../input/ArrayInput.js';
13
+ import { Checkbox } from '../../input/Checkbox.js';
14
+ import { DateInput } from '../../input/DateInput.js';
15
+ import { Field } from '../../input/Field.js';
16
+ import { HiddenInput } from '../../input/Hidden.js';
17
+ import { Input } from '../../input/Input.js';
18
+ import { Number } from '../../input/Number.js';
19
+ import { Select } from '../../select/Select.js';
20
+ import { SCHEMA_CUSTOM_LIST, DATA_TYPES } from '../../types/schema.js';
21
+ import { jsx, jsxs } from 'react/jsx-runtime';
22
+
23
+ var _excluded = ["field"];
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), 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; }
26
+ function SortableItem(_ref) {
27
+ var id = _ref.id,
28
+ index = _ref.index,
29
+ dynamic = _ref.dynamic,
30
+ children = _ref.children,
31
+ className = _ref.className;
32
+ var _useSortable = useSortable({
33
+ id: id,
34
+ index: index,
35
+ disabled: !dynamic
36
+ }),
37
+ ref = _useSortable.ref,
38
+ handleRef = _useSortable.handleRef,
39
+ isDragging = _useSortable.isDragging;
40
+ if (dynamic) {
41
+ return /*#__PURE__*/jsxs("div", {
42
+ className: className,
43
+ ref: ref,
44
+ children: [/*#__PURE__*/jsx("div", {
45
+ ref: handleRef,
46
+ className: cn("invisible group-hover/field:visible my-2 w-4", isDragging ? "cursor-grabbing bg-default" : "cursor-grab"),
47
+ style: {
48
+ 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 \")"
49
+ }
50
+ }), children]
51
+ });
52
+ }
53
+ return /*#__PURE__*/jsx("div", {
54
+ className: className,
55
+ children: children
56
+ });
57
+ }
58
+ function OptionModal(_ref2) {
59
+ var field = _ref2.field,
60
+ props = _objectWithoutProperties(_ref2, _excluded);
61
+ return /*#__PURE__*/jsxs(Modal, _objectSpread(_objectSpread({}, props), {}, {
62
+ children: [/*#__PURE__*/jsx(Content, {
63
+ children: /*#__PURE__*/jsx(ArrayInput, {
64
+ name: "".concat(field, ".options"),
65
+ onAdd: function onAdd() {
66
+ return String("");
67
+ },
68
+ children: /*#__PURE__*/jsx(Controller, {
69
+ children: /*#__PURE__*/jsx(Input, {})
70
+ })
71
+ })
72
+ }), /*#__PURE__*/jsx(Footer, {
73
+ flex: true,
74
+ justify: "end",
75
+ className: "sticky bottom-0 border-t bg-default px-6 py-2",
76
+ children: /*#__PURE__*/jsx(Button, {
77
+ variant: "link",
78
+ onClick: props.onClose,
79
+ children: "Close"
80
+ })
81
+ })]
82
+ }));
83
+ }
84
+ function SchemaField(_ref3) {
85
+ var id = _ref3.id,
86
+ index = _ref3.index,
87
+ field = _ref3.field,
88
+ fieldId = _ref3.fieldId,
89
+ getModel = _ref3.getModel,
90
+ onRemove = _ref3.onRemove,
91
+ _ref3$defaultOpen = _ref3.defaultOpen,
92
+ defaultOpen = _ref3$defaultOpen === void 0 ? true : _ref3$defaultOpen,
93
+ _ref3$optionLists = _ref3.optionLists,
94
+ optionLists = _ref3$optionLists === void 0 ? EMPTY_ARRAY : _ref3$optionLists,
95
+ dynamic = _ref3.dynamic,
96
+ onTypeChange = _ref3.onTypeChange,
97
+ acceptableTypes = _ref3.acceptableTypes;
98
+ var _useState = useState(),
99
+ _useState2 = _slicedToArray(_useState, 2),
100
+ type = _useState2[0],
101
+ setType = _useState2[1];
102
+ var _useState3 = useState(false),
103
+ _useState4 = _slicedToArray(_useState3, 2),
104
+ multiple = _useState4[0],
105
+ setMultiple = _useState4[1];
106
+ var _useState5 = useState(false),
107
+ _useState6 = _slicedToArray(_useState5, 2),
108
+ hasOptions = _useState6[0],
109
+ setHasOptions = _useState6[1];
110
+ var _useState7 = useState(false),
111
+ _useState8 = _slicedToArray(_useState7, 2),
112
+ customOptions = _useState8[0],
113
+ setCustomOptions = _useState8[1];
114
+ var _useOverlayService = useOverlayService(OptionModal),
115
+ _useOverlayService2 = _slicedToArray(_useOverlayService, 2),
116
+ renderOptionModal = _useOverlayService2[0],
117
+ openOptionModal = _useOverlayService2[1];
118
+ useEffect(function () {
119
+ var tmr = setTimeout(function () {
120
+ var model = getModel();
121
+ setType(model.datatype);
122
+ setMultiple(!!model.multiple);
123
+ if ("optionList" in model) {
124
+ setHasOptions(!!model.optionList);
125
+ setCustomOptions(model.optionList === SCHEMA_CUSTOM_LIST);
126
+ }
127
+ }, 10);
128
+ return function () {
129
+ clearTimeout(tmr);
130
+ };
131
+ // eslint-disable-next-line @eslint-react/exhaustive-deps
132
+ }, []);
133
+ var handleTypeChange = useCallback(function (type) {
134
+ if (type) {
135
+ var modelRef = getModel();
136
+ var reset = {
137
+ datatype: type,
138
+ id: id,
139
+ label: modelRef.label,
140
+ defaultValue: modelRef.defaultValue,
141
+ required: modelRef.required,
142
+ multiple: type === DATA_TYPES.AVATAR ? false : modelRef.multiple,
143
+ minItems: modelRef.minItems,
144
+ maxItems: modelRef.maxItems
145
+ };
146
+ if (type === DATA_TYPES.STRING) {
147
+ reset = Object.assign(reset, {
148
+ optionList: modelRef.optionList,
149
+ options: modelRef.options,
150
+ regex: modelRef.regex
151
+ });
152
+ } else if (type === DATA_TYPES.DATE) {
153
+ reset = Object.assign(reset, {
154
+ min: modelRef.min,
155
+ max: modelRef.max
156
+ });
157
+ } else if (type === DATA_TYPES.NUMBER || type === DATA_TYPES.RANGE) {
158
+ reset = Object.assign(reset, {
159
+ min: modelRef.min,
160
+ max: modelRef.max,
161
+ step: modelRef.step
162
+ });
163
+ }
164
+ if (type === DATA_TYPES.AVATAR) {
165
+ setMultiple(false);
166
+ }
167
+ onTypeChange(reset);
168
+ setType(type);
169
+ }
170
+ },
171
+ // eslint-disable-next-line @eslint-react/exhaustive-deps
172
+ [id]);
173
+ return /*#__PURE__*/jsx(SortableItem, {
174
+ id: fieldId,
175
+ index: index,
176
+ dynamic: !!dynamic,
177
+ className: "flex flex-nowrap gap-1 group/field",
178
+ children: /*#__PURE__*/jsxs(Collapsable, {
179
+ open: defaultOpen,
180
+ className: "flex-1",
181
+ children: [/*#__PURE__*/jsxs("div", {
182
+ className: "flex flex-nowrap items-center",
183
+ children: [/*#__PURE__*/jsx("span", {
184
+ className: "flex-1 truncate",
185
+ children: id
186
+ }), dynamic && /*#__PURE__*/jsx(Button, {
187
+ size: "sm",
188
+ color: "danger",
189
+ variant: "link",
190
+ "aria-label": "Delete",
191
+ icon: "icon-[mdi--trash-can-outline]",
192
+ onClick: onRemove,
193
+ className: "invisible group-hover/field:visible"
194
+ })]
195
+ }), /*#__PURE__*/jsxs("div", {
196
+ className: "flex flex-col gap-1 pb-4",
197
+ children: [/*#__PURE__*/jsx(Controller, {
198
+ name: "".concat(field, ".id"),
199
+ children: /*#__PURE__*/jsx(HiddenInput, {
200
+ hiddenValue: id
201
+ })
202
+ }), /*#__PURE__*/jsx(Controller, {
203
+ name: "".concat(field, ".datatype"),
204
+ children: /*#__PURE__*/jsx(Select, {
205
+ inline: true,
206
+ label: "Type",
207
+ placeholder: "Data type",
208
+ options: acceptableTypes !== null && acceptableTypes !== void 0 ? acceptableTypes : EMPTY_ARRAY,
209
+ onChange: function onChange(val) {
210
+ return handleTypeChange(val);
211
+ }
212
+ })
213
+ }), /*#__PURE__*/jsx(Controller, {
214
+ name: "".concat(field, ".label"),
215
+ children: /*#__PURE__*/jsx(Input, {
216
+ inline: true,
217
+ label: "Label",
218
+ allowClear: true,
219
+ placeholder: "Label...",
220
+ decorateEndShowWhenEmpty: true,
221
+ decorateEnd: /*#__PURE__*/jsx("span", {
222
+ className: "text-sm text-tint-300 px-1",
223
+ children: "OPTIONAL"
224
+ })
225
+ })
226
+ }), type === DATA_TYPES.STRING && /*#__PURE__*/jsxs(Fragment, {
227
+ children: [/*#__PURE__*/jsx(Controller, {
228
+ name: "".concat(field, ".regex"),
229
+ children: /*#__PURE__*/jsx(Input, {
230
+ inline: true,
231
+ label: "Regex validation",
232
+ allowClear: true,
233
+ placeholder: "Regex value...",
234
+ decorateEndShowWhenEmpty: true,
235
+ decorateEnd: /*#__PURE__*/jsx("span", {
236
+ className: "text-sm text-tint-300 px-1",
237
+ children: "OPTIONAL"
238
+ })
239
+ })
240
+ }), /*#__PURE__*/jsxs(Field, {
241
+ inline: true,
242
+ label: "Option list",
243
+ children: [/*#__PURE__*/jsx(Controller, {
244
+ name: "".concat(field, ".optionList"),
245
+ children: /*#__PURE__*/jsx(Select, {
246
+ allowClear: true,
247
+ options: [SCHEMA_CUSTOM_LIST].concat(_toConsumableArray(optionLists)),
248
+ onChange: function onChange(v) {
249
+ return setCustomOptions(v === SCHEMA_CUSTOM_LIST);
250
+ }
251
+ })
252
+ }), customOptions && /*#__PURE__*/jsx(Button, {
253
+ icon: "icon-[mdi--list-box-outline]",
254
+ "aria-label": "Custom options",
255
+ onClick: function onClick() {
256
+ void openOptionModal({
257
+ field: field,
258
+ title: "".concat(id, " Options")
259
+ });
260
+ }
261
+ })]
262
+ }), renderOptionModal()]
263
+ }), type === DATA_TYPES.FILE && /*#__PURE__*/jsx(Fragment, {
264
+ children: /*#__PURE__*/jsx(Controller, {
265
+ name: "".concat(field, ".accept"),
266
+ children: /*#__PURE__*/jsx(Input, {
267
+ inline: true,
268
+ label: "Accept types",
269
+ allowClear: true,
270
+ placeholder: "Accept value...",
271
+ decorateEndShowWhenEmpty: true,
272
+ decorateEnd: /*#__PURE__*/jsx("span", {
273
+ className: "text-sm text-tint-300 px-1",
274
+ children: "OPTIONAL"
275
+ })
276
+ })
277
+ })
278
+ }), [DATA_TYPES.NUMBER, DATA_TYPES.RANGE].includes(type) && /*#__PURE__*/jsxs(Fragment, {
279
+ children: [/*#__PURE__*/jsx(Controller, {
280
+ name: "".concat(field, ".min"),
281
+ children: /*#__PURE__*/jsx(Number, {
282
+ inline: true,
283
+ label: "Min value",
284
+ allowClear: true,
285
+ placeholder: "Minimum value...",
286
+ decorateEndShowWhenEmpty: true,
287
+ decorateEnd: /*#__PURE__*/jsx("span", {
288
+ className: "text-sm text-tint-300 px-1 absolute inset-e-4 top-1 pointer-events-none",
289
+ children: "OPTIONAL"
290
+ })
291
+ })
292
+ }), /*#__PURE__*/jsx(Controller, {
293
+ name: "".concat(field, ".max"),
294
+ children: /*#__PURE__*/jsx(Number, {
295
+ inline: true,
296
+ label: "Max value",
297
+ allowClear: true,
298
+ placeholder: "Maximum value...",
299
+ decorateEndShowWhenEmpty: true,
300
+ decorateEnd: /*#__PURE__*/jsx("span", {
301
+ className: "text-sm text-tint-300 px-1 absolute inset-e-4 top-1 pointer-events-none",
302
+ children: "OPTIONAL"
303
+ })
304
+ })
305
+ }), /*#__PURE__*/jsx(Controller, {
306
+ name: "".concat(field, ".step"),
307
+ children: /*#__PURE__*/jsx(Number, {
308
+ inline: true,
309
+ label: "Step value",
310
+ allowClear: true,
311
+ placeholder: "Step value...",
312
+ decorateEndShowWhenEmpty: true,
313
+ decorateEnd: /*#__PURE__*/jsx("span", {
314
+ className: "text-sm text-tint-300 px-1 absolute inset-e-4 top-1 pointer-events-none",
315
+ children: "OPTIONAL"
316
+ })
317
+ })
318
+ })]
319
+ }), type === DATA_TYPES.DATE && /*#__PURE__*/jsxs(Fragment, {
320
+ children: [/*#__PURE__*/jsx(Field, {
321
+ inline: true,
322
+ label: "Type",
323
+ plain: true,
324
+ children: /*#__PURE__*/jsx(Controller, {
325
+ name: "".concat(field, ".type"),
326
+ children: /*#__PURE__*/jsxs(ToggleButtonGroup, {
327
+ value: "",
328
+ fullWidth: true,
329
+ className: "flex-1",
330
+ children: [/*#__PURE__*/jsx(Button, {
331
+ className: "flex-1",
332
+ value: "date",
333
+ children: "Date"
334
+ }), /*#__PURE__*/jsx(Button, {
335
+ className: "flex-1",
336
+ value: "datetime",
337
+ children: "Date Time"
338
+ })]
339
+ })
340
+ })
341
+ }), /*#__PURE__*/jsx(Controller, {
342
+ name: "".concat(field, ".min"),
343
+ children: /*#__PURE__*/jsx(DateInput, {
344
+ inline: true,
345
+ label: "Min value",
346
+ allowClear: true,
347
+ placeholder: "Minimum value...",
348
+ decorateEndShowWhenEmpty: true,
349
+ decorateEnd: /*#__PURE__*/jsx("span", {
350
+ className: "text-sm text-tint-300 px-1",
351
+ children: "OPTIONAL"
352
+ })
353
+ })
354
+ }), /*#__PURE__*/jsx(Controller, {
355
+ name: "".concat(field, ".max"),
356
+ children: /*#__PURE__*/jsx(DateInput, {
357
+ inline: true,
358
+ label: "Max value",
359
+ allowClear: true,
360
+ placeholder: "Maximum value...",
361
+ decorateEndShowWhenEmpty: true,
362
+ decorateEnd: /*#__PURE__*/jsx("span", {
363
+ className: "text-sm text-tint-300 px-1",
364
+ children: "OPTIONAL"
365
+ })
366
+ })
367
+ })]
368
+ }), /*#__PURE__*/jsxs(Field, {
369
+ label: " ",
370
+ inline: true,
371
+ plain: true,
372
+ children: [/*#__PURE__*/jsx(Controller, {
373
+ name: "".concat(field, ".required"),
374
+ children: /*#__PURE__*/jsx(Checkbox, {
375
+ label: "Required"
376
+ })
377
+ }), type !== DATA_TYPES.AVATAR && /*#__PURE__*/jsx(Controller, {
378
+ name: "".concat(field, ".multiple"),
379
+ children: /*#__PURE__*/jsx(Checkbox, {
380
+ label: "Multiple",
381
+ onChange: setMultiple
382
+ })
383
+ }), hasOptions && /*#__PURE__*/jsx(Controller, {
384
+ name: "".concat(field, ".allowCustom"),
385
+ children: /*#__PURE__*/jsx(Checkbox, {
386
+ label: "Allow custom value"
387
+ })
388
+ })]
389
+ }), multiple && /*#__PURE__*/jsxs(Fragment, {
390
+ children: [/*#__PURE__*/jsx(Controller, {
391
+ name: "".concat(field, ".minItems"),
392
+ children: /*#__PURE__*/jsx(Number, {
393
+ inline: true,
394
+ label: "Min items",
395
+ allowClear: true,
396
+ placeholder: "Minimum items...",
397
+ decorateEndShowWhenEmpty: true,
398
+ decorateEnd: /*#__PURE__*/jsx("span", {
399
+ className: "text-sm text-tint-300 px-1 absolute inset-e-4 top-1 pointer-events-none",
400
+ children: "OPTIONAL"
401
+ })
402
+ })
403
+ }), /*#__PURE__*/jsx(Controller, {
404
+ name: "".concat(field, ".maxItems"),
405
+ children: /*#__PURE__*/jsx(Number, {
406
+ inline: true,
407
+ label: "Max items",
408
+ allowClear: true,
409
+ placeholder: "Maximum items...",
410
+ decorateEndShowWhenEmpty: true,
411
+ decorateEnd: /*#__PURE__*/jsx("span", {
412
+ className: "text-sm text-tint-300 px-1 absolute inset-e-4 top-1 pointer-events-none",
413
+ children: "OPTIONAL"
414
+ })
415
+ })
416
+ })]
417
+ })]
418
+ })]
419
+ }, fieldId)
420
+ });
421
+ }
422
+
423
+ export { SchemaField };
@@ -9,29 +9,75 @@ import { jsx } from 'react/jsx-runtime';
9
9
  var _excluded = ["name", "children"],
10
10
  _excluded2 = ["ref", "onChange"];
11
11
  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; }
12
- 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; }
13
- var Controller = function Controller(_ref) {
14
- var name = _ref.name,
15
- children = _ref.children,
16
- rest = _objectWithoutProperties(_ref, _excluded);
12
+ 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; }
13
+ /**
14
+ * This component is used to wrap form controls
15
+ * and provide them with the necessary props and state management.
16
+ *
17
+ * It uses the `Controller` component from `react-hook-form`
18
+ * to manage the form state and validation.
19
+ *
20
+ * It accepts a `name` prop to identify the form control,
21
+ * and a `children` prop which can either be a React element
22
+ * or a function that receives the necessary props to render the control.
23
+ *
24
+ * The component will pass down the following props to the child:
25
+ * - `name`: the name of the form control
26
+ * - `error`: any validation error message
27
+ * - `checked`: whether the control is checked (for checkboxes/radios)
28
+ * - `value`: the current value of the control
29
+ * - `invalid`: whether the control is invalid
30
+ * - `readOnly`: whether the control is read-only (disabled during submission)
31
+ * - `disabled`: whether the control is disabled
32
+ * - `onBlur`: function to call when the control loses focus
33
+ * - `onChange`: function to call when the control value changes
34
+ * - `ref`: a ref to the control element
35
+ * * The component also handles the `ref` prop to ensure that it is passed correctly
36
+ * to the child component, allowing for proper focus management and DOM access.
37
+ *
38
+ * @example
39
+ * ```jsx
40
+ * <Controller
41
+ * name="username"
42
+ * children={({ name, error, checked, value, invalid, readOnly, onChange }) => (
43
+ * <input
44
+ * type="text"
45
+ * name={name}
46
+ * onChange={onChange}
47
+ * readOnly={readOnly}
48
+ * aria-invalid={invalid}
49
+ * value={value}
50
+ * />
51
+ * )}
52
+ * />
53
+ * ```
54
+ */
55
+ function Controller(props) {
56
+ var name = props.name,
57
+ children = props.children,
58
+ rest = _objectWithoutProperties(props, _excluded);
17
59
  if (!name) throw Error("Form Controller missing `name` prop");
18
60
  return /*#__PURE__*/jsx(Controller$1, {
19
61
  name: name,
20
- render: function render(_ref2) {
62
+ render: function render(_ref) {
21
63
  var _error$message;
22
- var _ref2$field = _ref2.field,
23
- _ref3 = _ref2$field.ref,
24
- _onChange = _ref2$field.onChange,
25
- field = _objectWithoutProperties(_ref2$field, _excluded2),
26
- error = _ref2.fieldState.error,
27
- isSubmitting = _ref2.formState.isSubmitting;
28
- return /*#__PURE__*/isValidElement(children) ? /*#__PURE__*/cloneElement(Children.only(children), _objectSpread(_objectSpread(_objectSpread({}, field), rest), {}, {
64
+ var _ref$field = _ref.field,
65
+ _ref2 = _ref$field.ref,
66
+ _onChange = _ref$field.onChange,
67
+ field = _objectWithoutProperties(_ref$field, _excluded2),
68
+ error = _ref.fieldState.error,
69
+ isSubmitting = _ref.formState.isSubmitting;
70
+ return /*#__PURE__*/isValidElement(children) ?
71
+ /*#__PURE__*/
72
+ // eslint-disable-next-line @eslint-react/no-children-only
73
+ cloneElement(Children.only(children), _objectSpread(_objectSpread(_objectSpread({}, field), rest), {}, {
29
74
  ref: function ref(el) {
30
- el && _ref3(el);
75
+ if (el) _ref2(el);
31
76
  try {
32
- var _children$props$ref;
77
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
33
78
  if (children.props.ref && "current" in children.props.ref) children.props.ref.current = el;
34
- if ((_children$props$ref = children.props.ref) !== null && _children$props$ref !== void 0 && _children$props$ref.prototype) children.props.ref(el);
79
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call
80
+ if (typeof children.props.ref === "function") children.props.ref(el);
35
81
  } catch (_) {
36
82
  //
37
83
  }
@@ -43,11 +89,12 @@ var Controller = function Controller(_ref) {
43
89
  onChange: function onChange(v) {
44
90
  var _children$props$onCha, _children$props;
45
91
  _onChange(v);
92
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call
46
93
  (_children$props$onCha = (_children$props = children.props).onChange) === null || _children$props$onCha === void 0 || _children$props$onCha.call(_children$props, v);
47
94
  }
48
95
  })) : children(_objectSpread(_objectSpread(_objectSpread({}, field), rest), {}, {
49
- inputRef: function inputRef(el) {
50
- el && _ref3(el);
96
+ ref: function ref(el) {
97
+ if (el) _ref2(el);
51
98
  },
52
99
  readOnly: isSubmitting,
53
100
  invalid: !!(error !== null && error !== void 0 && error.message),
@@ -59,6 +106,6 @@ var Controller = function Controller(_ref) {
59
106
  }));
60
107
  }
61
108
  });
62
- };
109
+ }
63
110
 
64
111
  export { Controller };