@bgroup/wise-form 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 (319) hide show
  1. package/README.md +34 -0
  2. package/dist/components/ui/Checkbox.d.ts +14 -0
  3. package/dist/components/ui/Checkbox.d.ts.map +1 -0
  4. package/dist/components/ui/Checkbox.js +43 -0
  5. package/dist/components/ui/Checkbox.js.map +1 -0
  6. package/dist/components/ui/CheckboxGroup.d.ts +15 -0
  7. package/dist/components/ui/CheckboxGroup.d.ts.map +1 -0
  8. package/dist/components/ui/CheckboxGroup.js +33 -0
  9. package/dist/components/ui/CheckboxGroup.js.map +1 -0
  10. package/dist/components/ui/Input.d.ts +14 -0
  11. package/dist/components/ui/Input.d.ts.map +1 -0
  12. package/dist/components/ui/Input.js +49 -0
  13. package/dist/components/ui/Input.js.map +1 -0
  14. package/dist/components/ui/Radio.d.ts +14 -0
  15. package/dist/components/ui/Radio.d.ts.map +1 -0
  16. package/dist/components/ui/Radio.js +43 -0
  17. package/dist/components/ui/Radio.js.map +1 -0
  18. package/dist/components/ui/Select.d.ts +18 -0
  19. package/dist/components/ui/Select.d.ts.map +1 -0
  20. package/dist/components/ui/Select.js +44 -0
  21. package/dist/components/ui/Select.js.map +1 -0
  22. package/dist/components/ui/Textarea.d.ts +13 -0
  23. package/dist/components/ui/Textarea.d.ts.map +1 -0
  24. package/dist/components/ui/Textarea.js +42 -0
  25. package/dist/components/ui/Textarea.js.map +1 -0
  26. package/dist/components/ui/index.d.ts +13 -0
  27. package/dist/components/ui/index.d.ts.map +1 -0
  28. package/dist/components/ui/index.js +7 -0
  29. package/dist/components/ui/index.js.map +1 -0
  30. package/dist/form/index.d.ts +10 -0
  31. package/dist/form/index.d.ts.map +1 -0
  32. package/dist/form/index.js +5 -0
  33. package/dist/form/index.js.map +1 -0
  34. package/dist/form/interfaces/field-container.d.ts +8 -0
  35. package/dist/form/interfaces/field-container.d.ts.map +1 -0
  36. package/dist/form/interfaces/field-container.js +2 -0
  37. package/dist/form/interfaces/field-container.js.map +1 -0
  38. package/dist/form/interfaces/interfaces.d.ts +8 -0
  39. package/dist/form/interfaces/interfaces.d.ts.map +1 -0
  40. package/dist/form/interfaces/interfaces.js +2 -0
  41. package/dist/form/interfaces/interfaces.js.map +1 -0
  42. package/dist/form/interfaces/settings.d.ts +10 -0
  43. package/dist/form/interfaces/settings.d.ts.map +1 -0
  44. package/dist/form/interfaces/settings.js +2 -0
  45. package/dist/form/interfaces/settings.js.map +1 -0
  46. package/dist/form/interfaces/template.d.ts +6 -0
  47. package/dist/form/interfaces/template.d.ts.map +1 -0
  48. package/dist/form/interfaces/template.js +2 -0
  49. package/dist/form/interfaces/template.js.map +1 -0
  50. package/dist/form/interfaces/wise-form-specs.d.ts +9 -0
  51. package/dist/form/interfaces/wise-form-specs.d.ts.map +1 -0
  52. package/dist/form/interfaces/wise-form-specs.js +2 -0
  53. package/dist/form/interfaces/wise-form-specs.js.map +1 -0
  54. package/dist/form/view/components/containers/index.d.ts +3 -0
  55. package/dist/form/view/components/containers/index.d.ts.map +1 -0
  56. package/dist/form/view/components/containers/index.js +12 -0
  57. package/dist/form/view/components/containers/index.js.map +1 -0
  58. package/dist/form/view/components/error.d.ts +5 -0
  59. package/dist/form/view/components/error.d.ts.map +1 -0
  60. package/dist/form/view/components/error.js +8 -0
  61. package/dist/form/view/components/error.js.map +1 -0
  62. package/dist/form/view/components/field/container.d.ts +5 -0
  63. package/dist/form/view/components/field/container.d.ts.map +1 -0
  64. package/dist/form/view/components/field/container.js +5 -0
  65. package/dist/form/view/components/field/container.js.map +1 -0
  66. package/dist/form/view/components/field/index.d.ts +18 -0
  67. package/dist/form/view/components/field/index.d.ts.map +1 -0
  68. package/dist/form/view/components/field/index.js +89 -0
  69. package/dist/form/view/components/field/index.js.map +1 -0
  70. package/dist/form/view/components/field/selection.d.ts +2 -0
  71. package/dist/form/view/components/field/selection.d.ts.map +1 -0
  72. package/dist/form/view/components/field/selection.js +35 -0
  73. package/dist/form/view/components/field/selection.js.map +1 -0
  74. package/dist/form/view/components/field/use-field.d.ts +4 -0
  75. package/dist/form/view/components/field/use-field.d.ts.map +1 -0
  76. package/dist/form/view/components/field/use-field.js +41 -0
  77. package/dist/form/view/components/field/use-field.js.map +1 -0
  78. package/dist/form/view/components/rows/row-container.d.ts +18 -0
  79. package/dist/form/view/components/rows/row-container.d.ts.map +1 -0
  80. package/dist/form/view/components/rows/row-container.js +89 -0
  81. package/dist/form/view/components/rows/row-container.js.map +1 -0
  82. package/dist/form/view/components/rows/wrapper.d.ts +12 -0
  83. package/dist/form/view/components/rows/wrapper.d.ts.map +1 -0
  84. package/dist/form/view/components/rows/wrapper.js +27 -0
  85. package/dist/form/view/components/rows/wrapper.js.map +1 -0
  86. package/dist/form/view/components/wrapped-form.d.ts +6 -0
  87. package/dist/form/view/components/wrapped-form.d.ts.map +1 -0
  88. package/dist/form/view/components/wrapped-form.js +26 -0
  89. package/dist/form/view/components/wrapped-form.js.map +1 -0
  90. package/dist/form/view/context.d.ts +23 -0
  91. package/dist/form/view/context.d.ts.map +1 -0
  92. package/dist/form/view/context.js +7 -0
  93. package/dist/form/view/context.js.map +1 -0
  94. package/dist/form/view/hooks/use-model.d.ts +10 -0
  95. package/dist/form/view/hooks/use-model.d.ts.map +1 -0
  96. package/dist/form/view/hooks/use-model.js +31 -0
  97. package/dist/form/view/hooks/use-model.js.map +1 -0
  98. package/dist/form/view/hooks/use-template.d.ts +14 -0
  99. package/dist/form/view/hooks/use-template.d.ts.map +1 -0
  100. package/dist/form/view/hooks/use-template.js +57 -0
  101. package/dist/form/view/hooks/use-template.js.map +1 -0
  102. package/dist/form/view/hooks/use-types.d.ts +2 -0
  103. package/dist/form/view/hooks/use-types.d.ts.map +1 -0
  104. package/dist/form/view/hooks/use-types.js +19 -0
  105. package/dist/form/view/hooks/use-types.js.map +1 -0
  106. package/dist/form/view/index.d.ts +3 -0
  107. package/dist/form/view/index.d.ts.map +1 -0
  108. package/dist/form/view/index.js +38 -0
  109. package/dist/form/view/index.js.map +1 -0
  110. package/dist/formulas/helpers/condition-types.d.ts +5 -0
  111. package/dist/formulas/helpers/condition-types.d.ts.map +1 -0
  112. package/dist/formulas/helpers/condition-types.js +5 -0
  113. package/dist/formulas/helpers/condition-types.js.map +1 -0
  114. package/dist/formulas/helpers/evaluations.d.ts +15 -0
  115. package/dist/formulas/helpers/evaluations.d.ts.map +1 -0
  116. package/dist/formulas/helpers/evaluations.js +44 -0
  117. package/dist/formulas/helpers/evaluations.js.map +1 -0
  118. package/dist/formulas/helpers/formula.d.ts +6 -0
  119. package/dist/formulas/helpers/formula.d.ts.map +1 -0
  120. package/dist/formulas/helpers/formula.js +26 -0
  121. package/dist/formulas/helpers/formula.js.map +1 -0
  122. package/dist/formulas/helpers/lexer.d.ts +10 -0
  123. package/dist/formulas/helpers/lexer.d.ts.map +1 -0
  124. package/dist/formulas/helpers/lexer.js +73 -0
  125. package/dist/formulas/helpers/lexer.js.map +1 -0
  126. package/dist/formulas/helpers/parser.d.ts +24 -0
  127. package/dist/formulas/helpers/parser.d.ts.map +1 -0
  128. package/dist/formulas/helpers/parser.js +48 -0
  129. package/dist/formulas/helpers/parser.js.map +1 -0
  130. package/dist/formulas/helpers/token.d.ts +14 -0
  131. package/dist/formulas/helpers/token.d.ts.map +1 -0
  132. package/dist/formulas/helpers/token.js +14 -0
  133. package/dist/formulas/helpers/token.js.map +1 -0
  134. package/dist/formulas/index.d.ts +59 -0
  135. package/dist/formulas/index.d.ts.map +1 -0
  136. package/dist/formulas/index.js +186 -0
  137. package/dist/formulas/index.js.map +1 -0
  138. package/dist/formulas/types/formulas.d.ts +68 -0
  139. package/dist/formulas/types/formulas.d.ts.map +1 -0
  140. package/dist/formulas/types/formulas.js +2 -0
  141. package/dist/formulas/types/formulas.js.map +1 -0
  142. package/dist/formulas/types/index.d.ts +5 -0
  143. package/dist/formulas/types/index.d.ts.map +1 -0
  144. package/dist/formulas/types/index.js +2 -0
  145. package/dist/formulas/types/index.js.map +1 -0
  146. package/dist/formulas/variants/array-formula.d.ts +24 -0
  147. package/dist/formulas/variants/array-formula.d.ts.map +1 -0
  148. package/dist/formulas/variants/array-formula.js +142 -0
  149. package/dist/formulas/variants/array-formula.js.map +1 -0
  150. package/dist/formulas/variants/base.d.ts +6 -0
  151. package/dist/formulas/variants/base.d.ts.map +1 -0
  152. package/dist/formulas/variants/base.js +3 -0
  153. package/dist/formulas/variants/base.js.map +1 -0
  154. package/dist/formulas/variants/basic.d.ts +18 -0
  155. package/dist/formulas/variants/basic.d.ts.map +1 -0
  156. package/dist/formulas/variants/basic.js +128 -0
  157. package/dist/formulas/variants/basic.js.map +1 -0
  158. package/dist/formulas/variants/comparison.d.ts +25 -0
  159. package/dist/formulas/variants/comparison.d.ts.map +1 -0
  160. package/dist/formulas/variants/comparison.js +153 -0
  161. package/dist/formulas/variants/comparison.js.map +1 -0
  162. package/dist/formulas/variants/conditional.d.ts +18 -0
  163. package/dist/formulas/variants/conditional.d.ts.map +1 -0
  164. package/dist/formulas/variants/conditional.js +183 -0
  165. package/dist/formulas/variants/conditional.js.map +1 -0
  166. package/dist/formulas/variants/iterative-array.d.ts +20 -0
  167. package/dist/formulas/variants/iterative-array.d.ts.map +1 -0
  168. package/dist/formulas/variants/iterative-array.js +155 -0
  169. package/dist/formulas/variants/iterative-array.js.map +1 -0
  170. package/dist/formulas/variants/per-value.d.ts +20 -0
  171. package/dist/formulas/variants/per-value.d.ts.map +1 -0
  172. package/dist/formulas/variants/per-value.js +154 -0
  173. package/dist/formulas/variants/per-value.js.map +1 -0
  174. package/dist/index.d.ts +5 -0
  175. package/dist/index.d.ts.map +1 -0
  176. package/dist/index.js +6 -0
  177. package/dist/index.js.map +1 -0
  178. package/dist/models/base.d.ts +55 -0
  179. package/dist/models/base.d.ts.map +1 -0
  180. package/dist/models/base.js +146 -0
  181. package/dist/models/base.js.map +1 -0
  182. package/dist/models/callback-manager.d.ts +7 -0
  183. package/dist/models/callback-manager.d.ts.map +1 -0
  184. package/dist/models/callback-manager.js +89 -0
  185. package/dist/models/callback-manager.js.map +1 -0
  186. package/dist/models/field.d.ts +121 -0
  187. package/dist/models/field.d.ts.map +1 -0
  188. package/dist/models/field.js +374 -0
  189. package/dist/models/field.js.map +1 -0
  190. package/dist/models/index.d.ts +13 -0
  191. package/dist/models/index.d.ts.map +1 -0
  192. package/dist/models/index.js +7 -0
  193. package/dist/models/index.js.map +1 -0
  194. package/dist/models/model.d.ts +37 -0
  195. package/dist/models/model.d.ts.map +1 -0
  196. package/dist/models/model.js +245 -0
  197. package/dist/models/model.js.map +1 -0
  198. package/dist/models/plugins/base.d.ts +9 -0
  199. package/dist/models/plugins/base.d.ts.map +1 -0
  200. package/dist/models/plugins/base.js +3 -0
  201. package/dist/models/plugins/base.js.map +1 -0
  202. package/dist/models/plugins/formula.d.ts +18 -0
  203. package/dist/models/plugins/formula.d.ts.map +1 -0
  204. package/dist/models/plugins/formula.js +82 -0
  205. package/dist/models/plugins/formula.js.map +1 -0
  206. package/dist/models/plugins/index.d.ts +11 -0
  207. package/dist/models/plugins/index.d.ts.map +1 -0
  208. package/dist/models/plugins/index.js +52 -0
  209. package/dist/models/plugins/index.js.map +1 -0
  210. package/dist/models/plugins/plugins.d.ts +7 -0
  211. package/dist/models/plugins/plugins.d.ts.map +1 -0
  212. package/dist/models/plugins/plugins.js +7 -0
  213. package/dist/models/plugins/plugins.js.map +1 -0
  214. package/dist/models/types/base-wise-model.d.ts +7 -0
  215. package/dist/models/types/base-wise-model.d.ts.map +1 -0
  216. package/dist/models/types/base-wise-model.js +2 -0
  217. package/dist/models/types/base-wise-model.js.map +1 -0
  218. package/dist/models/types/callbacks.d.ts +19 -0
  219. package/dist/models/types/callbacks.d.ts.map +1 -0
  220. package/dist/models/types/callbacks.js +2 -0
  221. package/dist/models/types/callbacks.js.map +1 -0
  222. package/dist/models/types/disabled.d.ts +8 -0
  223. package/dist/models/types/disabled.d.ts.map +1 -0
  224. package/dist/models/types/disabled.js +2 -0
  225. package/dist/models/types/disabled.js.map +1 -0
  226. package/dist/models/types/form-field.d.ts +25 -0
  227. package/dist/models/types/form-field.d.ts.map +1 -0
  228. package/dist/models/types/form-field.js +2 -0
  229. package/dist/models/types/form-field.js.map +1 -0
  230. package/dist/models/types/model.d.ts +13 -0
  231. package/dist/models/types/model.d.ts.map +1 -0
  232. package/dist/models/types/model.js +2 -0
  233. package/dist/models/types/model.js.map +1 -0
  234. package/dist/models/types/plugins.d.ts +13 -0
  235. package/dist/models/types/plugins.d.ts.map +1 -0
  236. package/dist/models/types/plugins.js +2 -0
  237. package/dist/models/types/plugins.js.map +1 -0
  238. package/dist/models/types/wrapped-form-model-props.d.ts +11 -0
  239. package/dist/models/types/wrapped-form-model-props.d.ts.map +1 -0
  240. package/dist/models/types/wrapped-form-model-props.js +2 -0
  241. package/dist/models/types/wrapped-form-model-props.js.map +1 -0
  242. package/dist/models/wrapper.d.ts +30 -0
  243. package/dist/models/wrapper.d.ts.map +1 -0
  244. package/dist/models/wrapper.js +213 -0
  245. package/dist/models/wrapper.js.map +1 -0
  246. package/dist/settings/index.d.ts +7 -0
  247. package/dist/settings/index.d.ts.map +1 -0
  248. package/dist/settings/index.js +26 -0
  249. package/dist/settings/index.js.map +1 -0
  250. package/dist/utils/pending-promise.d.ts +6 -0
  251. package/dist/utils/pending-promise.d.ts.map +1 -0
  252. package/dist/utils/pending-promise.js +24 -0
  253. package/dist/utils/pending-promise.js.map +1 -0
  254. package/package.json +38 -0
  255. package/src/components/ui/Checkbox.tsx +68 -0
  256. package/src/components/ui/CheckboxGroup.tsx +60 -0
  257. package/src/components/ui/Input.tsx +72 -0
  258. package/src/components/ui/Radio.tsx +68 -0
  259. package/src/components/ui/Select.tsx +73 -0
  260. package/src/components/ui/Textarea.tsx +63 -0
  261. package/src/components/ui/index.ts +14 -0
  262. package/src/form/index.ts +11 -0
  263. package/src/form/interfaces/field-container.ts +9 -0
  264. package/src/form/interfaces/interfaces.ts +12 -0
  265. package/src/form/interfaces/settings.ts +11 -0
  266. package/src/form/interfaces/template.ts +7 -0
  267. package/src/form/interfaces/wise-form-specs.ts +10 -0
  268. package/src/form/styles.css +40 -0
  269. package/src/form/view/components/containers/index.tsx +18 -0
  270. package/src/form/view/components/error.tsx +9 -0
  271. package/src/form/view/components/field/container.tsx +6 -0
  272. package/src/form/view/components/field/index.tsx +107 -0
  273. package/src/form/view/components/field/selection.tsx +39 -0
  274. package/src/form/view/components/field/use-field.tsx +49 -0
  275. package/src/form/view/components/rows/row-container.tsx +96 -0
  276. package/src/form/view/components/rows/wrapper.tsx +28 -0
  277. package/src/form/view/components/wrapped-form.tsx +32 -0
  278. package/src/form/view/context.tsx +26 -0
  279. package/src/form/view/hooks/use-model.ts +37 -0
  280. package/src/form/view/hooks/use-template.tsx +64 -0
  281. package/src/form/view/hooks/use-types.ts +21 -0
  282. package/src/form/view/index.tsx +48 -0
  283. package/src/formulas/helpers/condition-types.ts +5 -0
  284. package/src/formulas/helpers/evaluations.ts +48 -0
  285. package/src/formulas/helpers/formula.ts +27 -0
  286. package/src/formulas/helpers/lexer.ts +82 -0
  287. package/src/formulas/helpers/parser.ts +55 -0
  288. package/src/formulas/helpers/token.ts +22 -0
  289. package/src/formulas/index.ts +198 -0
  290. package/src/formulas/types/formulas.ts +72 -0
  291. package/src/formulas/types/index.ts +5 -0
  292. package/src/formulas/variants/array-formula.ts +138 -0
  293. package/src/formulas/variants/base.ts +6 -0
  294. package/src/formulas/variants/basic.ts +141 -0
  295. package/src/formulas/variants/comparison.ts +156 -0
  296. package/src/formulas/variants/conditional.ts +208 -0
  297. package/src/formulas/variants/iterative-array.ts +152 -0
  298. package/src/formulas/variants/per-value.ts +152 -0
  299. package/src/index.ts +6 -0
  300. package/src/models/base.ts +164 -0
  301. package/src/models/callback-manager.ts +102 -0
  302. package/src/models/field.ts +426 -0
  303. package/src/models/index.ts +14 -0
  304. package/src/models/model.ts +260 -0
  305. package/src/models/plugins/base.ts +11 -0
  306. package/src/models/plugins/formula.ts +80 -0
  307. package/src/models/plugins/index.ts +48 -0
  308. package/src/models/plugins/plugins.ts +8 -0
  309. package/src/models/types/base-wise-model.ts +7 -0
  310. package/src/models/types/callbacks.ts +23 -0
  311. package/src/models/types/disabled.ts +8 -0
  312. package/src/models/types/form-field.ts +22 -0
  313. package/src/models/types/model.ts +14 -0
  314. package/src/models/types/plugins.ts +15 -0
  315. package/src/models/types/wrapped-form-model-props.ts +9 -0
  316. package/src/models/wrapper.ts +242 -0
  317. package/src/settings/index.ts +11 -0
  318. package/src/utils/pending-promise.ts +29 -0
  319. package/tsconfig.json +39 -0
@@ -0,0 +1,72 @@
1
+ import React from 'react';
2
+
3
+ export interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {
4
+ name?: string;
5
+ value?: string | number;
6
+ onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void;
7
+ disabled?: boolean;
8
+ placeholder?: string;
9
+ type?: string;
10
+ className?: string;
11
+ id?: string;
12
+ [key: string]: any; // Allow additional props that will be filtered
13
+ }
14
+
15
+ // Helper function to filter out non-HTML attributes
16
+ const filterHtmlAttributes = (props: Record<string, any>): React.InputHTMLAttributes<HTMLInputElement> => {
17
+ const invalidAttributes = [
18
+ 'processing', 'processed', 'label', 'options', 'properties', 'specs',
19
+ 'hidden', 'identifier', 'queryValue', 'dependentOn', 'onChange', 'callbacks',
20
+ 'selectedOptionLabel', 'notTrigger', 'autoSelectFirst', 'disabledOptions',
21
+ 'fieldsToSetParameters', 'queryTrafficParameters', 'tooltipData', 'opened',
22
+ 'isVisibleHeader', 'entries', 'rows', 'total', 'selectedItem', 'selectedDelete',
23
+ 'keys', 'dataHead', 'textEmpty', 'actions', 'currentPage', 'limitDepdentOnItems',
24
+ 'showSelect', 'itemTable', 'className', 'variant', 'toFixed', 'decimalsLimit',
25
+ 'isPercent', 'condition', 'parameter', 'color', 'template', 'control'
26
+ ];
27
+
28
+ const filtered: any = {};
29
+
30
+ for (const key in props) {
31
+ // Skip invalid attributes
32
+ if (invalidAttributes.includes(key)) {
33
+ continue;
34
+ }
35
+
36
+ // Keep valid HTML attributes, event handlers, and data/aria attributes
37
+ if (
38
+ key.startsWith('on') ||
39
+ key.startsWith('data-') ||
40
+ key.startsWith('aria-') ||
41
+ !invalidAttributes.includes(key)
42
+ ) {
43
+ // Only include if it's a valid HTML attribute or event handler
44
+ const validHtmlAttrs = [
45
+ 'name', 'value', 'onChange', 'onBlur', 'onFocus', 'onKeyDown', 'onKeyUp',
46
+ 'onKeyPress', 'onClick', 'onDoubleClick', 'onMouseEnter', 'onMouseLeave',
47
+ 'disabled', 'readOnly', 'required', 'placeholder', 'type', 'id',
48
+ 'autoComplete', 'autoFocus', 'maxLength', 'minLength', 'pattern', 'step',
49
+ 'min', 'max', 'size', 'spellCheck', 'tabIndex', 'title', 'style',
50
+ 'accept', 'alt', 'checked', 'defaultValue', 'form', 'formAction',
51
+ 'formEncType', 'formMethod', 'formNoValidate', 'formTarget', 'height',
52
+ 'list', 'multiple', 'src', 'width'
53
+ ];
54
+
55
+ if (validHtmlAttrs.includes(key) || key.startsWith('on') || key.startsWith('data-') || key.startsWith('aria-')) {
56
+ filtered[key] = props[key];
57
+ }
58
+ }
59
+ }
60
+
61
+ return filtered;
62
+ };
63
+
64
+ export const Input = React.forwardRef<HTMLInputElement, InputProps>((props, ref) => {
65
+ const { className, ...rest } = props;
66
+ const validHtmlAttributes = filterHtmlAttributes(rest);
67
+
68
+ return <input ref={ref} className={className} {...validHtmlAttributes} />;
69
+ });
70
+
71
+ Input.displayName = 'Input';
72
+
@@ -0,0 +1,68 @@
1
+ import React from 'react';
2
+
3
+ export interface RadioProps extends React.InputHTMLAttributes<HTMLInputElement> {
4
+ name?: string;
5
+ value?: string | number;
6
+ checked?: boolean;
7
+ onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void;
8
+ disabled?: boolean;
9
+ className?: string;
10
+ id?: string;
11
+ label?: string;
12
+ [key: string]: any; // Allow additional props that will be filtered
13
+ }
14
+
15
+ // Helper function to filter out non-HTML attributes
16
+ const filterHtmlAttributes = (props: Record<string, any>): React.InputHTMLAttributes<HTMLInputElement> => {
17
+ const invalidAttributes = [
18
+ 'processing', 'processed', 'label', 'options', 'properties', 'specs',
19
+ 'hidden', 'identifier', 'queryValue', 'dependentOn', 'callbacks',
20
+ 'selectedOptionLabel', 'notTrigger', 'autoSelectFirst', 'disabledOptions',
21
+ 'fieldsToSetParameters', 'queryTrafficParameters', 'tooltipData', 'opened',
22
+ 'isVisibleHeader', 'entries', 'rows', 'total', 'selectedItem', 'selectedDelete',
23
+ 'keys', 'dataHead', 'textEmpty', 'actions', 'currentPage', 'limitDepdentOnItems',
24
+ 'showSelect', 'itemTable', 'variant', 'toFixed', 'decimalsLimit',
25
+ 'isPercent', 'condition', 'parameter', 'color', 'template', 'control'
26
+ ];
27
+
28
+ const filtered: any = {};
29
+
30
+ for (const key in props) {
31
+ if (invalidAttributes.includes(key)) {
32
+ continue;
33
+ }
34
+
35
+ if (
36
+ key.startsWith('on') ||
37
+ key.startsWith('data-') ||
38
+ key.startsWith('aria-') ||
39
+ !invalidAttributes.includes(key)
40
+ ) {
41
+ const validHtmlAttrs = [
42
+ 'name', 'value', 'checked', 'onChange', 'onBlur', 'onFocus', 'onKeyDown',
43
+ 'onKeyUp', 'onKeyPress', 'onClick', 'disabled', 'readOnly', 'required',
44
+ 'type', 'id', 'autoFocus', 'tabIndex', 'title', 'style', 'form'
45
+ ];
46
+
47
+ if (validHtmlAttrs.includes(key) || key.startsWith('on') || key.startsWith('data-') || key.startsWith('aria-')) {
48
+ filtered[key] = props[key];
49
+ }
50
+ }
51
+ }
52
+
53
+ return filtered;
54
+ };
55
+
56
+ export const Radio = React.forwardRef<HTMLInputElement, RadioProps>((props, ref) => {
57
+ const { className, label, ...rest } = props;
58
+ const validHtmlAttributes = filterHtmlAttributes(rest);
59
+ return (
60
+ <label>
61
+ <input ref={ref} type="radio" className={className} {...validHtmlAttributes} />
62
+ {label && <span>{label}</span>}
63
+ </label>
64
+ );
65
+ });
66
+
67
+ Radio.displayName = 'Radio';
68
+
@@ -0,0 +1,73 @@
1
+ import React from 'react';
2
+
3
+ export interface SelectProps extends React.SelectHTMLAttributes<HTMLSelectElement> {
4
+ name?: string;
5
+ value?: string | number;
6
+ onChange?: (event: React.ChangeEvent<HTMLSelectElement>) => void;
7
+ disabled?: boolean;
8
+ options?: Array<{ value: string | number; label?: string; [key: string]: any }>;
9
+ className?: string;
10
+ id?: string;
11
+ placeholder?: string;
12
+ [key: string]: any; // Allow additional props that will be filtered
13
+ }
14
+
15
+ // Helper function to filter out non-HTML attributes
16
+ const filterHtmlAttributes = (props: Record<string, any>): React.SelectHTMLAttributes<HTMLSelectElement> => {
17
+ const invalidAttributes = [
18
+ 'processing', 'processed', 'label', 'options', 'properties', 'specs',
19
+ 'hidden', 'identifier', 'queryValue', 'dependentOn', 'callbacks',
20
+ 'selectedOptionLabel', 'notTrigger', 'autoSelectFirst', 'disabledOptions',
21
+ 'fieldsToSetParameters', 'queryTrafficParameters', 'tooltipData', 'opened',
22
+ 'isVisibleHeader', 'entries', 'rows', 'total', 'selectedItem', 'selectedDelete',
23
+ 'keys', 'dataHead', 'textEmpty', 'actions', 'currentPage', 'limitDepdentOnItems',
24
+ 'showSelect', 'itemTable', 'variant', 'toFixed', 'decimalsLimit',
25
+ 'isPercent', 'condition', 'parameter', 'color', 'template', 'control'
26
+ ];
27
+
28
+ const filtered: any = {};
29
+
30
+ for (const key in props) {
31
+ if (invalidAttributes.includes(key)) {
32
+ continue;
33
+ }
34
+
35
+ if (
36
+ key.startsWith('on') ||
37
+ key.startsWith('data-') ||
38
+ key.startsWith('aria-') ||
39
+ !invalidAttributes.includes(key)
40
+ ) {
41
+ const validHtmlAttrs = [
42
+ 'name', 'value', 'onChange', 'onBlur', 'onFocus', 'onKeyDown', 'onKeyUp',
43
+ 'onKeyPress', 'onClick', 'disabled', 'readOnly', 'required',
44
+ 'type', 'id', 'autoFocus', 'tabIndex', 'title', 'style', 'form',
45
+ 'multiple', 'size'
46
+ ];
47
+
48
+ if (validHtmlAttrs.includes(key) || key.startsWith('on') || key.startsWith('data-') || key.startsWith('aria-')) {
49
+ filtered[key] = props[key];
50
+ }
51
+ }
52
+ }
53
+
54
+ return filtered;
55
+ };
56
+
57
+ export const Select = React.forwardRef<HTMLSelectElement, SelectProps>((props, ref) => {
58
+ const { className, options = [], placeholder, ...rest } = props;
59
+ const validHtmlAttributes = filterHtmlAttributes(rest);
60
+ return (
61
+ <select ref={ref} className={className} {...validHtmlAttributes}>
62
+ {placeholder && <option value="">{placeholder}</option>}
63
+ {options.map((option, index) => (
64
+ <option key={index} value={option.value}>
65
+ {option.label || option.value}
66
+ </option>
67
+ ))}
68
+ </select>
69
+ );
70
+ });
71
+
72
+ Select.displayName = 'Select';
73
+
@@ -0,0 +1,63 @@
1
+ import React from 'react';
2
+
3
+ export interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {
4
+ name?: string;
5
+ value?: string | number;
6
+ onChange?: (event: React.ChangeEvent<HTMLTextAreaElement>) => void;
7
+ disabled?: boolean;
8
+ placeholder?: string;
9
+ className?: string;
10
+ id?: string;
11
+ [key: string]: any; // Allow additional props that will be filtered
12
+ }
13
+
14
+ // Helper function to filter out non-HTML attributes
15
+ const filterHtmlAttributes = (props: Record<string, any>): React.TextareaHTMLAttributes<HTMLTextAreaElement> => {
16
+ const invalidAttributes = [
17
+ 'processing', 'processed', 'label', 'options', 'properties', 'specs',
18
+ 'hidden', 'identifier', 'queryValue', 'dependentOn', 'onChange', 'callbacks',
19
+ 'selectedOptionLabel', 'notTrigger', 'autoSelectFirst', 'disabledOptions',
20
+ 'fieldsToSetParameters', 'queryTrafficParameters', 'tooltipData', 'opened',
21
+ 'isVisibleHeader', 'entries', 'rows', 'total', 'selectedItem', 'selectedDelete',
22
+ 'keys', 'dataHead', 'textEmpty', 'actions', 'currentPage', 'limitDepdentOnItems',
23
+ 'showSelect', 'itemTable', 'className', 'variant', 'toFixed', 'decimalsLimit',
24
+ 'isPercent', 'condition', 'parameter', 'color', 'template', 'control'
25
+ ];
26
+
27
+ const filtered: any = {};
28
+
29
+ for (const key in props) {
30
+ if (invalidAttributes.includes(key)) {
31
+ continue;
32
+ }
33
+
34
+ if (
35
+ key.startsWith('on') ||
36
+ key.startsWith('data-') ||
37
+ key.startsWith('aria-') ||
38
+ !invalidAttributes.includes(key)
39
+ ) {
40
+ const validHtmlAttrs = [
41
+ 'name', 'value', 'onChange', 'onBlur', 'onFocus', 'onKeyDown', 'onKeyUp',
42
+ 'onKeyPress', 'onClick', 'disabled', 'readOnly', 'required', 'placeholder',
43
+ 'type', 'id', 'autoComplete', 'autoFocus', 'maxLength', 'minLength',
44
+ 'pattern', 'spellCheck', 'tabIndex', 'title', 'style', 'form', 'rows', 'cols'
45
+ ];
46
+
47
+ if (validHtmlAttrs.includes(key) || key.startsWith('on') || key.startsWith('data-') || key.startsWith('aria-')) {
48
+ filtered[key] = props[key];
49
+ }
50
+ }
51
+ }
52
+
53
+ return filtered;
54
+ };
55
+
56
+ export const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>((props, ref) => {
57
+ const { className, ...rest } = props;
58
+ const validHtmlAttributes = filterHtmlAttributes(rest);
59
+ return <textarea ref={ref} className={className} {...validHtmlAttributes} />;
60
+ });
61
+
62
+ Textarea.displayName = 'Textarea';
63
+
@@ -0,0 +1,14 @@
1
+ export { Input } from './Input';
2
+ export { Textarea } from './Textarea';
3
+ export { Checkbox } from './Checkbox';
4
+ export { CheckboxGroup } from './CheckboxGroup';
5
+ export { Radio } from './Radio';
6
+ export { Select } from './Select';
7
+
8
+ export type { InputProps } from './Input';
9
+ export type { TextareaProps } from './Textarea';
10
+ export type { CheckboxProps } from './Checkbox';
11
+ export type { CheckboxGroupProps } from './CheckboxGroup';
12
+ export type { RadioProps } from './Radio';
13
+ export type { SelectProps } from './Select';
14
+
@@ -0,0 +1,11 @@
1
+ export { WiseForm } from './view';
2
+ export { useWiseFormContext, useWrappedWiseFormContext } from './view/context';
3
+ export { WrappedForm } from './view/components/wrapped-form';
4
+ export { Control } from './view/components/field';
5
+
6
+ export type { IWiseFormSpecs } from './interfaces/wise-form-specs';
7
+ export type { IFormSettings } from './interfaces/settings';
8
+ export type { IFormTemplate } from './interfaces/template';
9
+ export type { IWiseForm, WiseFormField } from './interfaces/interfaces';
10
+ export type { IFieldContainer } from './interfaces/field-container';
11
+
@@ -0,0 +1,9 @@
1
+ import { WiseFormField } from './interfaces';
2
+
3
+ export interface IFieldContainer {
4
+ template: [number, string];
5
+ items: WiseFormField[];
6
+ styles?: any; // @todo: add correct type
7
+ model: any;
8
+ }
9
+
@@ -0,0 +1,12 @@
1
+ import type { FormField, WrappedFormModel } from '@bgroup/wise-form/models';
2
+
3
+ // Interface for individual form field elements
4
+ export type WiseFormField = (FormField | WrappedFormModel)[];
5
+
6
+ // Interface for the general form structure
7
+ export interface IWiseForm {
8
+ name: string;
9
+ template: string;
10
+ fields: WiseFormField;
11
+ }
12
+
@@ -0,0 +1,11 @@
1
+ import { WiseFormField } from './interfaces';
2
+ import { IFormTemplate } from './template';
3
+
4
+ export interface IFormSettings {
5
+ name: 'string';
6
+ template?: IFormTemplate;
7
+ values?: Record<string, string>;
8
+ fields: WiseFormField[];
9
+ gap?: number;
10
+ }
11
+
@@ -0,0 +1,7 @@
1
+ import { CSSProperties } from 'react';
2
+
3
+ export interface IFormTemplate extends CSSProperties {
4
+ structure?: string | (string | number | (string | number)[])[];
5
+ gap?: string;
6
+ }
7
+
@@ -0,0 +1,10 @@
1
+ import type { FormModel } from '@bgroup/wise-form/models';
2
+ import { IFormSettings } from './settings';
3
+
4
+ export interface IWiseFormSpecs {
5
+ children?: React.ReactNode;
6
+ settings?: IFormSettings;
7
+ model?: FormModel;
8
+ types?: Record<string, React.ReactNode>;
9
+ }
10
+
@@ -0,0 +1,40 @@
1
+ .reactive-form-container {
2
+ display: grid;
3
+ grid-gap: 1rem;
4
+ }
5
+
6
+ .reactive-form-container .rf-fields-container {
7
+ display: grid;
8
+ grid-gap: 0.5rem;
9
+ }
10
+
11
+ .reactive-form-container .rf-fields-container.fr-1 {
12
+ grid-template-columns: repeat(1, 1fr);
13
+ }
14
+
15
+ .reactive-form-container .rf-fields-container.fr-2 {
16
+ grid-template-columns: repeat(2, 1fr);
17
+ }
18
+
19
+ .reactive-form-container .rf-fields-container.fr-3 {
20
+ grid-template-columns: repeat(3, 1fr);
21
+ }
22
+
23
+ .reactive-form-container .rf-fields-container.fr-4 {
24
+ grid-template-columns: repeat(4, 1fr);
25
+ }
26
+
27
+ .reactive-form-container .rf-fields-container.fr-5 {
28
+ grid-template-columns: repeat(5, 1fr);
29
+ }
30
+
31
+ .reactive-form-container .rf-fields-container.fr-6 {
32
+ grid-template-columns: repeat(6, 1fr);
33
+ }
34
+
35
+ .reactive-form-container :not(.not-responsive) > .rf-fields-container {
36
+ @media (max-width: 768px) {
37
+ grid-template-columns: 1fr !important;
38
+ }
39
+ }
40
+
@@ -0,0 +1,18 @@
1
+ import React from "react";
2
+ import {useWiseFormContext} from "../../context";
3
+ import {RowFieldContainer} from "../rows/row-container";
4
+
5
+ export function Containers() {
6
+ const {
7
+ rows,
8
+ model,
9
+ template: {styles},
10
+ } = useWiseFormContext();
11
+
12
+ const fields = [...model.fields.values()];
13
+ return rows.map((num, index) => {
14
+ const items = fields.splice(0, num[0]) as any; // Type assertion needed due to TypeScript strictness
15
+ return <RowFieldContainer model={model} template={num} items={items} key={`rf-row--${index}.${num}`} styles={styles} />;
16
+ });
17
+ }
18
+
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+
3
+ export function ErrorRenderer({ error }) {
4
+ React.useEffect(() => {
5
+ console.error(error);
6
+ }, []);
7
+ return <div className='alert alert--error pui-alert'>{error}</div>;
8
+ }
9
+
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+
3
+ export function ControlFieldContainer({ children }) {
4
+ return <div className='rf-field-container'>{children}</div>;
5
+ }
6
+
@@ -0,0 +1,107 @@
1
+ import React from "react";
2
+ import { Input, Textarea } from "../../../../components/ui";
3
+ import { SelectionField } from "./selection";
4
+ import { ControlFieldContainer } from "./container";
5
+ import { useWiseFormContext } from "../../context";
6
+ import type { FormModel, WrappedFormModel, FormField } from "../../../../models";
7
+ import { useField } from "./use-field";
8
+
9
+ type WiseFormFieldControlProps = {
10
+ field: FormField | WrappedFormModel;
11
+ index: number;
12
+ model: FormModel | WrappedFormModel;
13
+ hidden?: boolean;
14
+ };
15
+ /**
16
+ *
17
+ * @param props.field WiseForm Json config
18
+ * @param props.index Index of the field
19
+ * @param props.model Field or Wrapper Model.
20
+ * @returns
21
+ */
22
+ export const Control = ({ field, index, model, hidden }: WiseFormFieldControlProps) => {
23
+ const { formTypes } = useWiseFormContext();
24
+ const fieldItem = field as any; // Using any to access dynamic properties
25
+
26
+ // Early return if field doesn't have a name (except for wrapper types and special types)
27
+ const specialTypes = ['wrapper', 'hr', 'button'];
28
+ const fieldType = fieldItem?.type;
29
+ const fieldName = fieldItem?.name;
30
+ if (!fieldName && !specialTypes.includes(fieldType)) {
31
+ console.warn('You need to provide a name to get a field in form', (model as any).name || 'unknown');
32
+ return null;
33
+ }
34
+
35
+ const { attrs } = useField(model, fieldItem);
36
+
37
+ // Estado reactivo para el valor de hidden del campo
38
+ const [isHidden, setIsHidden] = React.useState(() => {
39
+ if (hidden !== undefined) return hidden;
40
+ if (!fieldName) return false;
41
+ const fieldModel = model.getField(fieldName);
42
+ if (fieldModel) {
43
+ const properties = (fieldModel as FormField).getProperties();
44
+ return (properties as any).hidden ?? false;
45
+ }
46
+ return (fieldItem as any).hidden ?? false;
47
+ });
48
+
49
+ // Suscribirse a los cambios del modelo del campo
50
+ React.useEffect(() => {
51
+ if (!fieldName) return;
52
+ const fieldModel = model.getField(fieldName);
53
+ if (!fieldModel) return;
54
+
55
+ const onChange = () => {
56
+ const properties = (fieldModel as FormField).getProperties();
57
+ setIsHidden((properties as any).hidden ?? false);
58
+ };
59
+
60
+ fieldModel.on('change', onChange);
61
+ return () => {
62
+ fieldModel.off('change', onChange);
63
+ };
64
+ }, [model, fieldName]);
65
+
66
+ if (isHidden) return null;
67
+ const types = {
68
+ ...{
69
+ checkbox: SelectionField,
70
+ radio: SelectionField,
71
+ select: SelectionField,
72
+ textarea: Textarea,
73
+ text: Input,
74
+ password: Input,
75
+ default: Input,
76
+ },
77
+ ...formTypes,
78
+ };
79
+
80
+ const ControlComponent = types[fieldType] ?? types.default;
81
+
82
+ // Merge field properties with attrs to ensure custom components receive all necessary props
83
+ const fieldModel = fieldName ? model.getField(fieldName) : null;
84
+ const fieldProperties = fieldModel ? fieldModel.getProperties() : {};
85
+
86
+ // Also include original field item properties (like options, label, etc.)
87
+ const fieldItemProps = { ...fieldItem };
88
+ // Remove internal properties that shouldn't be passed to components
89
+ delete (fieldItemProps as any).name;
90
+ delete (fieldItemProps as any).type;
91
+
92
+ // Filter out non-HTML attributes from fieldProperties to prevent React warnings
93
+ const invalidAttributes = ['processing', 'processed', 'properties', 'specs', 'hidden', 'identifier'];
94
+ const filteredFieldProperties = Object.keys(fieldProperties).reduce((acc, key) => {
95
+ if (!invalidAttributes.includes(key)) {
96
+ acc[key] = fieldProperties[key];
97
+ }
98
+ return acc;
99
+ }, {} as any);
100
+
101
+ return (
102
+ <ControlFieldContainer>
103
+ <ControlComponent {...attrs} {...fieldItemProps} {...filteredFieldProperties} />
104
+ </ControlFieldContainer>
105
+ );
106
+ };
107
+
@@ -0,0 +1,39 @@
1
+ import React from 'react';
2
+ import { Checkbox, CheckboxGroup, Radio, Select } from '../../../../components/ui';
3
+ import { ErrorRenderer } from '../error';
4
+ import { useWiseFormContext } from '../../context';
5
+
6
+ export function SelectionField(props) {
7
+ if (!props.options) return <ErrorRenderer error={`the field does not have options, field: ${props.name}`} />;
8
+
9
+ const { name } = useWiseFormContext();
10
+ const types = {
11
+ checkbox: Checkbox,
12
+ radio: Radio,
13
+ select: SelectionField,
14
+ };
15
+
16
+ if (!types.hasOwnProperty(props.type)) return <ErrorRenderer error='the props type is not supported' />;
17
+ const Control = types[props.type];
18
+
19
+ // Filter out non-HTML attributes before passing to Select
20
+ const invalidAttributes = ['processing', 'processed', 'properties', 'specs', 'hidden', 'identifier'];
21
+ const filteredProps = Object.keys(props).reduce((acc, key) => {
22
+ if (!invalidAttributes.includes(key)) {
23
+ acc[key] = props[key];
24
+ }
25
+ return acc;
26
+ }, {} as any);
27
+
28
+ if (props.type === 'select') return <Select {...filteredProps} />;
29
+
30
+ if (props.type === 'checkbox') return <CheckboxGroup {...filteredProps} />;
31
+
32
+ const output = props.options.map((option, key) => {
33
+ const attributes = { ...option, name: props.name };
34
+ return <Control {...attributes} key={`${name}.${props.name}.${key}`} />;
35
+ });
36
+
37
+ return output;
38
+ }
39
+
@@ -0,0 +1,49 @@
1
+ import React from 'react';
2
+ import { useWiseFormContext } from '../../context';
3
+
4
+ export function useField(model, field) {
5
+ // Early return if field doesn't have a name
6
+ if (!field?.name) {
7
+ return { attrs: {} };
8
+ }
9
+
10
+ const fieldModel = model.getField(field.name);
11
+
12
+ const { values } = useWiseFormContext();
13
+ const value = fieldModel?.value ?? values[field.name];
14
+ const [attributes, setAttributes] = React.useState(fieldModel?.attributes || {});
15
+
16
+ const onChange = field.name ? (event) => {
17
+ if (event && event.target) {
18
+ model.setField(field.name, event.target.value);
19
+ }
20
+ } : undefined;
21
+
22
+ React.useEffect(() => {
23
+ if (!fieldModel || !field.name) return;
24
+
25
+ const onChange = () => {
26
+ setAttributes({ ...fieldModel.attributes, disabled: fieldModel.disabled });
27
+ };
28
+ fieldModel.on('change', onChange);
29
+ const cleanUp = () => {
30
+ fieldModel.off('change', onChange);
31
+ fieldModel.cleanUp();
32
+ };
33
+ return cleanUp;
34
+ }, [fieldModel?.name, field.name]);
35
+
36
+ /**
37
+ * It's necessary to change the field spread.
38
+ */
39
+
40
+ const attrs = {
41
+ value,
42
+ ...attributes,
43
+ ...(onChange && { onChange }),
44
+ disabled: fieldModel?.disabled ?? false
45
+ };
46
+
47
+ return { attrs };
48
+ }
49
+