intelicoreact 1.8.3 → 1.8.5

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 (264) hide show
  1. package/dist/Atomic/FormElements/Dropdown/components/DropdownLoader.jsx +18 -0
  2. package/dist/Atomic/FormElements/FormattedRawSSN/FormattedRawSSN_old.jsx +121 -0
  3. package/dist/Atomic/FormElements/MobileCalendar/MobileCalendar.jsx +507 -0
  4. package/dist/Atomic/FormElements/MultiSelect/MultiSelect.jsx +46 -0
  5. package/dist/Atomic/FormElements/NumericInput/NumericInput.jsx +337 -0
  6. package/dist/Atomic/FormElements/RadioGroup/RadioGroup.jsx +66 -0
  7. package/dist/Atomic/FormElements/RadioGroupWithInput/RadioGroupWithInput.jsx +78 -0
  8. package/dist/Atomic/FormElements/RadioRowSwitcher/RadioRowSwitcher.jsx +54 -0
  9. package/dist/Atomic/FormElements/RangeCalendar/RangeCalendar.jsx +183 -0
  10. package/dist/Atomic/FormElements/RangeList/RangeList.jsx +181 -0
  11. package/dist/Atomic/FormElements/RangeList/partial/RangeListRow.jsx +41 -0
  12. package/dist/Atomic/FormElements/RangeSlider/RangeSlider.jsx +449 -0
  13. package/dist/Atomic/FormElements/RangeSlider2/RangeSlider2.jsx +865 -0
  14. package/dist/Atomic/FormElements/SwitchableRow/SwitchableRow.jsx +37 -0
  15. package/dist/Atomic/FormElements/SwitcherCheckbox/SwitcherCheckbox.jsx +48 -0
  16. package/dist/Atomic/FormElements/SwitcherRangeList/SwitcherRangeList.jsx +62 -0
  17. package/dist/Atomic/FormElements/SwitcherTagsDropdown/SwitcherTagsDropdown.jsx +175 -0
  18. package/dist/Atomic/FormElements/SwitcherTextarea/SwitcherTextarea.jsx +65 -0
  19. package/dist/Atomic/FormElements/TagListToDropdown/TagListToDropdown.jsx +118 -0
  20. package/dist/Atomic/FormElements/TagsDropdown/TagsDropdown.interface.ts +2 -0
  21. package/dist/Atomic/FormElements/TagsDropdown/TagsDropdown.js +1 -1
  22. package/dist/Atomic/FormElements/Text/Text.jsx +126 -0
  23. package/dist/Atomic/FormElements/Textarea/Textarea.jsx +61 -0
  24. package/dist/Atomic/FormElements/TieredCheckboxes/TieredCheckboxes.jsx +181 -0
  25. package/dist/Atomic/FormElements/TieredCheckboxes/partial/AccordionWithCheckbox.jsx +60 -0
  26. package/dist/Atomic/FormElements/VariantsListRadio/VariantsListRadio.jsx +83 -0
  27. package/dist/Atomic/FormElements/VariantsListRadio/partials/VariantsListRadioItem.jsx +80 -0
  28. package/dist/Atomic/FormElements/WidgetPseudoTable/WidgetPseudoTable.jsx +103 -0
  29. package/dist/Atomic/FormElements/WidgetWithSwitchableRows/WidgetWithSwitchableRows.jsx +115 -0
  30. package/dist/Atomic/Layout/Header/Header.jsx +86 -0
  31. package/dist/Atomic/UI/AccordionTable/AccordionTable.jsx +250 -0
  32. package/dist/Atomic/UI/AccordionText/AccordionText.jsx +68 -0
  33. package/dist/Atomic/UI/Arrow/Arrow.jsx +134 -0
  34. package/dist/Atomic/UI/Box/Box.jsx +53 -0
  35. package/dist/Atomic/UI/Chart/Chart.jsx +178 -0
  36. package/dist/Atomic/UI/Chart/partial/ChartTypeSwitcherIcon/ChartTypeSwitcherIcon.jsx +78 -0
  37. package/dist/Atomic/UI/Chart/partial/optionsConstructor.jsx +334 -0
  38. package/dist/Atomic/UI/CircleProgressBar/CircleProgressBar.jsx +111 -0
  39. package/dist/Atomic/UI/DateTime/DateTime.jsx +57 -0
  40. package/dist/Atomic/UI/DebugContainer/DebugContainer.jsx +44 -0
  41. package/dist/Atomic/UI/DebugContainer/useDebugContainer.jsx +15 -0
  42. package/dist/Atomic/UI/ExampleChartIntegration/ExampleChartIntegration.jsx +223 -0
  43. package/dist/Atomic/UI/MonoAccordion/MonoAccordion._test.jsx +75 -0
  44. package/dist/Atomic/UI/MonoAccordion/MonoAccordion.jsx +86 -0
  45. package/dist/Atomic/UI/PieChart/PieChart.jsx +41 -0
  46. package/dist/Atomic/UI/Table/Partials/TdCell.jsx +87 -0
  47. package/dist/Atomic/UI/Table/Partials/TdHeader.jsx +36 -0
  48. package/dist/Atomic/UI/Table/Partials/TdRow.jsx +103 -0
  49. package/dist/Atomic/UI/Table/Partials/TdTitle.jsx +55 -0
  50. package/dist/Atomic/UI/Table/Table.jsx +63 -0
  51. package/dist/Atomic/UI/Table/TdTypes/TdActions.jsx +80 -0
  52. package/dist/Atomic/UI/Table/TdTypes/TdPriority.jsx +26 -0
  53. package/dist/Atomic/UI/Table/TdTypes/TdRange.jsx +13 -0
  54. package/dist/Atomic/UI/Table/TdTypes/TdWeight.jsx +56 -0
  55. package/dist/Atomic/UI/Tag/Tag.interface.ts +1 -0
  56. package/dist/Atomic/UI/Tag/Tag.js +1 -1
  57. package/dist/Atomic/UI/TagList/TagList.jsx +256 -0
  58. package/dist/Atomic/UI/WizardStepper/constructor.jsx +86 -0
  59. package/dist/Classes/RESTAPI/partials/CredentialsProcessing.jsx +254 -0
  60. package/dist/Functions/customEventListener.jsx +96 -0
  61. package/dist/Functions/operations.jsx +138 -0
  62. package/dist/Functions/useFormTools/functions/RenderFields.jsx +108 -0
  63. package/dist/Functions/useFormTools/index.jsx +777 -0
  64. package/dist/Functions/usePasswordChecker.jsx +128 -0
  65. package/dist/Functions/utils.jsx +492 -0
  66. package/dist/Molecular/CustomIcons/components/AffiliateNetworks.jsx +22 -0
  67. package/dist/Molecular/CustomIcons/components/AlertCircle.jsx +24 -0
  68. package/dist/Molecular/CustomIcons/components/AppStore.jsx +30 -0
  69. package/dist/Molecular/CustomIcons/components/Arrow.jsx +33 -0
  70. package/dist/Molecular/CustomIcons/components/ArrowDown.jsx +18 -0
  71. package/dist/Molecular/CustomIcons/components/ArrowLeft.jsx +23 -0
  72. package/dist/Molecular/CustomIcons/components/ArrowRight.jsx +23 -0
  73. package/dist/Molecular/CustomIcons/components/ArrowUp.jsx +18 -0
  74. package/dist/Molecular/CustomIcons/components/Bell.jsx +16 -0
  75. package/dist/Molecular/CustomIcons/components/Button.jsx +13 -0
  76. package/dist/Molecular/CustomIcons/components/Campaigns.jsx +17 -0
  77. package/dist/Molecular/CustomIcons/components/Check.jsx +15 -0
  78. package/dist/Molecular/CustomIcons/components/Check2.jsx +13 -0
  79. package/dist/Molecular/CustomIcons/components/ChevronDown.jsx +13 -0
  80. package/dist/Molecular/CustomIcons/components/ChevronDownDisabled.jsx +12 -0
  81. package/dist/Molecular/CustomIcons/components/ChevronLeft.jsx +12 -0
  82. package/dist/Molecular/CustomIcons/components/ChevronRight.jsx +12 -0
  83. package/dist/Molecular/CustomIcons/components/ChevronUp.jsx +12 -0
  84. package/dist/Molecular/CustomIcons/components/ChevronUpDown.jsx +28 -0
  85. package/dist/Molecular/CustomIcons/components/Close.jsx +15 -0
  86. package/dist/Molecular/CustomIcons/components/ColumnsOrder.jsx +18 -0
  87. package/dist/Molecular/CustomIcons/components/Delete.jsx +17 -0
  88. package/dist/Molecular/CustomIcons/components/Edit.jsx +16 -0
  89. package/dist/Molecular/CustomIcons/components/Email.jsx +32 -0
  90. package/dist/Molecular/CustomIcons/components/FinturfLogo.jsx +19 -0
  91. package/dist/Molecular/CustomIcons/components/FinturfLogo2.jsx +36 -0
  92. package/dist/Molecular/CustomIcons/components/Flows.jsx +16 -0
  93. package/dist/Molecular/CustomIcons/components/Gift.jsx +26 -0
  94. package/dist/Molecular/CustomIcons/components/GoogleAuth.jsx +30 -0
  95. package/dist/Molecular/CustomIcons/components/GooglePlay.jsx +30 -0
  96. package/dist/Molecular/CustomIcons/components/HelpCircle.jsx +20 -0
  97. package/dist/Molecular/CustomIcons/components/HelpCircle2.jsx +21 -0
  98. package/dist/Molecular/CustomIcons/components/HelpCircleFilled.jsx +20 -0
  99. package/dist/Molecular/CustomIcons/components/Home.jsx +17 -0
  100. package/dist/Molecular/CustomIcons/components/Home2.jsx +23 -0
  101. package/dist/Molecular/CustomIcons/components/Key.jsx +24 -0
  102. package/dist/Molecular/CustomIcons/components/Landers.jsx +21 -0
  103. package/dist/Molecular/CustomIcons/components/Lock.jsx +16 -0
  104. package/dist/Molecular/CustomIcons/components/Mail.jsx +27 -0
  105. package/dist/Molecular/CustomIcons/components/Mastercard.jsx +74 -0
  106. package/dist/Molecular/CustomIcons/components/Minus.jsx +26 -0
  107. package/dist/Molecular/CustomIcons/components/Offers.jsx +17 -0
  108. package/dist/Molecular/CustomIcons/components/Pause.jsx +29 -0
  109. package/dist/Molecular/CustomIcons/components/PayPal.jsx +42 -0
  110. package/dist/Molecular/CustomIcons/components/PayPalLightLarge.jsx +29 -0
  111. package/dist/Molecular/CustomIcons/components/Phone.jsx +31 -0
  112. package/dist/Molecular/CustomIcons/components/Play.jsx +26 -0
  113. package/dist/Molecular/CustomIcons/components/Plus.jsx +26 -0
  114. package/dist/Molecular/CustomIcons/components/Profile.jsx +17 -0
  115. package/dist/Molecular/CustomIcons/components/QRCode.jsx +30 -0
  116. package/dist/Molecular/CustomIcons/components/Rectangle.jsx +13 -0
  117. package/dist/Molecular/CustomIcons/components/Revert.jsx +14 -0
  118. package/dist/Molecular/CustomIcons/components/Star.jsx +15 -0
  119. package/dist/Molecular/CustomIcons/components/Star2.jsx +17 -0
  120. package/dist/Molecular/CustomIcons/components/TrafficSources.jsx +15 -0
  121. package/dist/Molecular/CustomIcons/components/Trash.jsx +16 -0
  122. package/dist/Molecular/CustomIcons/components/TrashRed.jsx +16 -0
  123. package/dist/Molecular/CustomIcons/components/Triggers.jsx +16 -0
  124. package/dist/Molecular/CustomIcons/components/User.jsx +26 -0
  125. package/dist/Molecular/CustomIcons/components/Visa.jsx +32 -0
  126. package/dist/Molecular/CustomIcons/components/X.jsx +13 -0
  127. package/dist/Molecular/FormElement/FormElement.jsx +52 -0
  128. package/dist/Molecular/FormWithDependOn/FormWithDependOn.jsx +161 -0
  129. package/dist/Molecular/InputAddress/InputAddress.jsx +641 -0
  130. package/dist/Molecular/InputPassword/InputPassword.jsx +50 -0
  131. package/package.json +13 -6
  132. package/dist/Atomic/FormElements/Dropdown/components/DropdownLoader.js +0 -1
  133. package/dist/Atomic/FormElements/FormattedRawSSN/FormattedRawSSN_old.js +0 -1
  134. package/dist/Atomic/FormElements/MobileCalendar/MobileCalendar.js +0 -1
  135. package/dist/Atomic/FormElements/MultiSelect/MultiSelect.js +0 -1
  136. package/dist/Atomic/FormElements/NumericInput/NumericInput.js +0 -1
  137. package/dist/Atomic/FormElements/RadioGroup/RadioGroup.js +0 -1
  138. package/dist/Atomic/FormElements/RadioGroupWithInput/RadioGroupWithInput.js +0 -1
  139. package/dist/Atomic/FormElements/RadioRowSwitcher/RadioRowSwitcher.js +0 -1
  140. package/dist/Atomic/FormElements/RangeCalendar/RangeCalendar.js +0 -1
  141. package/dist/Atomic/FormElements/RangeList/RangeList.js +0 -1
  142. package/dist/Atomic/FormElements/RangeList/partial/RangeListRow.js +0 -1
  143. package/dist/Atomic/FormElements/RangeSlider/RangeSlider.js +0 -1
  144. package/dist/Atomic/FormElements/RangeSlider2/RangeSlider2.js +0 -1
  145. package/dist/Atomic/FormElements/SwitchableRow/SwitchableRow.js +0 -1
  146. package/dist/Atomic/FormElements/SwitcherCheckbox/SwitcherCheckbox.js +0 -1
  147. package/dist/Atomic/FormElements/SwitcherRangeList/SwitcherRangeList.js +0 -1
  148. package/dist/Atomic/FormElements/SwitcherTagsDropdown/SwitcherTagsDropdown.d.ts +0 -16
  149. package/dist/Atomic/FormElements/SwitcherTagsDropdown/SwitcherTagsDropdown.js +0 -1
  150. package/dist/Atomic/FormElements/SwitcherTextarea/SwitcherTextarea.js +0 -1
  151. package/dist/Atomic/FormElements/TagListToDropdown/TagListToDropdown.d.ts +0 -9
  152. package/dist/Atomic/FormElements/TagListToDropdown/TagListToDropdown.js +0 -1
  153. package/dist/Atomic/FormElements/TagsDropdown/TagsDropdown.d.ts +0 -5
  154. package/dist/Atomic/FormElements/TagsDropdown/TagsDropdown.interface.d.ts +0 -79
  155. package/dist/Atomic/FormElements/TagsDropdown/TagsDropdown.interface.js +0 -1
  156. package/dist/Atomic/FormElements/TagsDropdown/TagsDropdown.interface.js.map +0 -1
  157. package/dist/Atomic/FormElements/TagsDropdown/TagsDropdown.js.map +0 -1
  158. package/dist/Atomic/FormElements/Text/Text.js +0 -1
  159. package/dist/Atomic/FormElements/Textarea/Textarea.js +0 -1
  160. package/dist/Atomic/FormElements/TieredCheckboxes/TieredCheckboxes.js +0 -1
  161. package/dist/Atomic/FormElements/TieredCheckboxes/partial/AccordionWithCheckbox.js +0 -1
  162. package/dist/Atomic/FormElements/VariantsListRadio/VariantsListRadio.js +0 -1
  163. package/dist/Atomic/FormElements/VariantsListRadio/partials/VariantsListRadioItem.js +0 -1
  164. package/dist/Atomic/FormElements/WidgetPseudoTable/WidgetPseudoTable.js +0 -1
  165. package/dist/Atomic/FormElements/WidgetWithSwitchableRows/WidgetWithSwitchableRows.js +0 -1
  166. package/dist/Atomic/Layout/Header/Header.js +0 -1
  167. package/dist/Atomic/UI/AccordionTable/AccordionTable.js +0 -1
  168. package/dist/Atomic/UI/AccordionText/AccordionText.js +0 -1
  169. package/dist/Atomic/UI/Arrow/Arrow.js +0 -1
  170. package/dist/Atomic/UI/Box/Box.js +0 -1
  171. package/dist/Atomic/UI/Chart/Chart.js +0 -1
  172. package/dist/Atomic/UI/Chart/partial/ChartTypeSwitcherIcon/ChartTypeSwitcherIcon.js +0 -1
  173. package/dist/Atomic/UI/Chart/partial/optionsConstructor.js +0 -1
  174. package/dist/Atomic/UI/CircleProgressBar/CircleProgressBar.js +0 -1
  175. package/dist/Atomic/UI/DateTime/DateTime.js +0 -1
  176. package/dist/Atomic/UI/DebugContainer/DebugContainer.js +0 -1
  177. package/dist/Atomic/UI/DebugContainer/useDebugContainer.js +0 -1
  178. package/dist/Atomic/UI/ExampleChartIntegration/ExampleChartIntegration.js +0 -1
  179. package/dist/Atomic/UI/MonoAccordion/MonoAccordion._test.js +0 -1
  180. package/dist/Atomic/UI/MonoAccordion/MonoAccordion.js +0 -1
  181. package/dist/Atomic/UI/PieChart/PieChart.js +0 -1
  182. package/dist/Atomic/UI/Table/Partials/TdCell.js +0 -1
  183. package/dist/Atomic/UI/Table/Partials/TdHeader.js +0 -1
  184. package/dist/Atomic/UI/Table/Partials/TdRow.js +0 -1
  185. package/dist/Atomic/UI/Table/Partials/TdTitle.js +0 -1
  186. package/dist/Atomic/UI/Table/Table.js +0 -1
  187. package/dist/Atomic/UI/Table/TdTypes/TdActions.js +0 -1
  188. package/dist/Atomic/UI/Table/TdTypes/TdPriority.js +0 -1
  189. package/dist/Atomic/UI/Table/TdTypes/TdRange.js +0 -1
  190. package/dist/Atomic/UI/Table/TdTypes/TdWeight.js +0 -1
  191. package/dist/Atomic/UI/TagList/TagList.js +0 -1
  192. package/dist/Atomic/UI/WizardStepper/constructor.js +0 -1
  193. package/dist/Classes/RESTAPI/partials/CredentialsProcessing.js +0 -1
  194. package/dist/Functions/customEventListener.js +0 -1
  195. package/dist/Functions/operations.js +0 -1
  196. package/dist/Functions/useFormTools/functions/RenderFields.js +0 -1
  197. package/dist/Functions/useFormTools/index.js +0 -1
  198. package/dist/Functions/usePasswordChecker.js +0 -1
  199. package/dist/Functions/utils.js +0 -1
  200. package/dist/Molecular/CustomIcons/components/AffiliateNetworks.js +0 -1
  201. package/dist/Molecular/CustomIcons/components/AlertCircle.js +0 -1
  202. package/dist/Molecular/CustomIcons/components/AppStore.js +0 -1
  203. package/dist/Molecular/CustomIcons/components/Arrow.js +0 -1
  204. package/dist/Molecular/CustomIcons/components/ArrowDown.js +0 -1
  205. package/dist/Molecular/CustomIcons/components/ArrowLeft.js +0 -1
  206. package/dist/Molecular/CustomIcons/components/ArrowRight.js +0 -1
  207. package/dist/Molecular/CustomIcons/components/ArrowUp.js +0 -1
  208. package/dist/Molecular/CustomIcons/components/Bell.js +0 -1
  209. package/dist/Molecular/CustomIcons/components/Button.js +0 -1
  210. package/dist/Molecular/CustomIcons/components/Campaigns.js +0 -1
  211. package/dist/Molecular/CustomIcons/components/Check.js +0 -1
  212. package/dist/Molecular/CustomIcons/components/Check2.js +0 -1
  213. package/dist/Molecular/CustomIcons/components/ChevronDown.js +0 -1
  214. package/dist/Molecular/CustomIcons/components/ChevronDownDisabled.js +0 -1
  215. package/dist/Molecular/CustomIcons/components/ChevronLeft.js +0 -1
  216. package/dist/Molecular/CustomIcons/components/ChevronRight.js +0 -1
  217. package/dist/Molecular/CustomIcons/components/ChevronUp.js +0 -1
  218. package/dist/Molecular/CustomIcons/components/ChevronUpDown.js +0 -1
  219. package/dist/Molecular/CustomIcons/components/Close.js +0 -1
  220. package/dist/Molecular/CustomIcons/components/ColumnsOrder.js +0 -1
  221. package/dist/Molecular/CustomIcons/components/Delete.js +0 -1
  222. package/dist/Molecular/CustomIcons/components/Edit.js +0 -1
  223. package/dist/Molecular/CustomIcons/components/Email.js +0 -1
  224. package/dist/Molecular/CustomIcons/components/FinturfLogo.js +0 -1
  225. package/dist/Molecular/CustomIcons/components/FinturfLogo2.js +0 -1
  226. package/dist/Molecular/CustomIcons/components/Flows.js +0 -1
  227. package/dist/Molecular/CustomIcons/components/Gift.js +0 -1
  228. package/dist/Molecular/CustomIcons/components/GoogleAuth.js +0 -1
  229. package/dist/Molecular/CustomIcons/components/GooglePlay.js +0 -1
  230. package/dist/Molecular/CustomIcons/components/HelpCircle.js +0 -1
  231. package/dist/Molecular/CustomIcons/components/HelpCircle2.js +0 -1
  232. package/dist/Molecular/CustomIcons/components/HelpCircleFilled.js +0 -1
  233. package/dist/Molecular/CustomIcons/components/Home.js +0 -1
  234. package/dist/Molecular/CustomIcons/components/Home2.js +0 -1
  235. package/dist/Molecular/CustomIcons/components/Key.js +0 -1
  236. package/dist/Molecular/CustomIcons/components/Landers.js +0 -1
  237. package/dist/Molecular/CustomIcons/components/Lock.js +0 -1
  238. package/dist/Molecular/CustomIcons/components/Mail.js +0 -1
  239. package/dist/Molecular/CustomIcons/components/Mastercard.js +0 -1
  240. package/dist/Molecular/CustomIcons/components/Minus.js +0 -1
  241. package/dist/Molecular/CustomIcons/components/Offers.js +0 -1
  242. package/dist/Molecular/CustomIcons/components/Pause.js +0 -1
  243. package/dist/Molecular/CustomIcons/components/PayPal.js +0 -1
  244. package/dist/Molecular/CustomIcons/components/PayPalLightLarge.js +0 -1
  245. package/dist/Molecular/CustomIcons/components/Phone.js +0 -1
  246. package/dist/Molecular/CustomIcons/components/Play.js +0 -1
  247. package/dist/Molecular/CustomIcons/components/Plus.js +0 -1
  248. package/dist/Molecular/CustomIcons/components/Profile.js +0 -1
  249. package/dist/Molecular/CustomIcons/components/QRCode.js +0 -1
  250. package/dist/Molecular/CustomIcons/components/Rectangle.js +0 -1
  251. package/dist/Molecular/CustomIcons/components/Revert.js +0 -1
  252. package/dist/Molecular/CustomIcons/components/Star.js +0 -1
  253. package/dist/Molecular/CustomIcons/components/Star2.js +0 -1
  254. package/dist/Molecular/CustomIcons/components/TrafficSources.js +0 -1
  255. package/dist/Molecular/CustomIcons/components/Trash.js +0 -1
  256. package/dist/Molecular/CustomIcons/components/TrashRed.js +0 -1
  257. package/dist/Molecular/CustomIcons/components/Triggers.js +0 -1
  258. package/dist/Molecular/CustomIcons/components/User.js +0 -1
  259. package/dist/Molecular/CustomIcons/components/Visa.js +0 -1
  260. package/dist/Molecular/CustomIcons/components/X.js +0 -1
  261. package/dist/Molecular/FormElement/FormElement.js +0 -1
  262. package/dist/Molecular/FormWithDependOn/FormWithDependOn.js +0 -1
  263. package/dist/Molecular/InputAddress/InputAddress.js +0 -1
  264. package/dist/Molecular/InputPassword/InputPassword.js +0 -1
@@ -0,0 +1,777 @@
1
+ import { createRef, useEffect, useState } from 'react';
2
+
3
+ import ArrayWithObjects from './form-drivers/ArrayWithObjects';
4
+ import ObjectWithIterableObjects from './form-drivers/ObjectWithIterableObjects';
5
+ import ObjectWithNamedKeyObjects from './form-drivers/ObjectWithNamedKeyObjects';
6
+ import General from './functions/General';
7
+ import RenderFields from './functions/RenderFields';
8
+
9
+ const DefaultFocusControllerProps = {
10
+ setAutoFocus: true,
11
+ onlyEmptyFieldAutoFocus: false,
12
+ };
13
+
14
+ export default function useFormTools({
15
+ form,
16
+ setForm,
17
+ FormType,
18
+ FormFields,
19
+ FormDataDriverName = 'ArrayWithObjects'
20
+ || 'ObjectWithIterableObjects'
21
+ || 'ObjectWithNamedKeyObjects',
22
+ FormDataDriver = null,
23
+ FocusControllerProps = DefaultFocusControllerProps,
24
+ goToNextFieldOnEnterPressed = true,
25
+ } = {}) {
26
+ FocusControllerProps = {
27
+ ...DefaultFocusControllerProps,
28
+ ...FocusControllerProps,
29
+ };
30
+
31
+ const FormDataDrivers = {
32
+ ArrayWithObjects: {
33
+ handlers: ArrayWithObjects,
34
+ default: true,
35
+ },
36
+ ObjectWithIterableObjects: {
37
+ handlers: ObjectWithIterableObjects,
38
+ },
39
+ ObjectWithNamedKeyObjects: {
40
+ handlers: ObjectWithNamedKeyObjects,
41
+ },
42
+ };
43
+
44
+ const getFormDataDriver = (name) => {
45
+ return (
46
+ FormDataDriver
47
+ || FormDataDrivers[name]?.handlers
48
+ || Object.values(FormDataDrivers).find(df => df.default === true)?.handlers
49
+ || (() => ({}))
50
+ );
51
+ };
52
+ const getFormDataDriverInstance = (name, ...args) => {
53
+ return getFormDataDriver(name)(...args);
54
+ };
55
+
56
+ const { getFieldClassName, updateFormField } = General();
57
+
58
+ const {
59
+ getFieldData,
60
+ getFormField,
61
+ setFormFields,
62
+ setFormField,
63
+ getFormFieldsAsArray,
64
+ getFormFieldsKeys,
65
+ removeAllFormFields,
66
+ removeFormField,
67
+ removeFormFields,
68
+ } = getFormDataDriverInstance(FormDataDriverName, {
69
+ form,
70
+ setForm,
71
+ FormFields,
72
+ });
73
+
74
+ ///////////////////////////////////////////////////////////////
75
+ // --- OnChange Observer ---//--- START ---//
76
+ const [onChangeObservers, setOnChangeObservers] = useState({});
77
+ const addOnChangeObserver = (key, cb) => {
78
+ let observerId = null;
79
+
80
+ setOnChangeObservers((state) => {
81
+ // Set Default Value
82
+ if (!state[key]) state[key] = {};
83
+
84
+ observerId = state[key].length;
85
+
86
+ state[key][observerId] = cb;
87
+
88
+ return state;
89
+ });
90
+
91
+ return observerId;
92
+ };
93
+ const removeOnChangeObserver = (key, id) => {
94
+ setOnChangeObservers((state) => {
95
+ // Set Default Value
96
+ if (!state[key]) return state;
97
+
98
+ state[key] = Object.keys(state)
99
+ .filter(cbId => cbId !== id)
100
+ .map(cbId => state[key][cbId]);
101
+
102
+ return state;
103
+ });
104
+ };
105
+ const onChangeObserver = (key, value) => {
106
+ if (!onChangeObservers[key] || typeof onChangeObservers[key] !== 'object')
107
+ return;
108
+
109
+ const Observers = onChangeObservers[key];
110
+
111
+ Object.values(Observers).map((cb) => {
112
+ cb({ value, form });
113
+ return null;
114
+ });
115
+ };
116
+ const onFieldChange = (key, value) => {
117
+ if (value === getFormField(key)?.value) return false;
118
+
119
+ onChangeObserver(key, value);
120
+ setFormField(
121
+ field => ({
122
+ ...field,
123
+ error: '',
124
+ value,
125
+ }),
126
+ key,
127
+ );
128
+ };
129
+ // --- OnChange Observer ---//--- END ---//
130
+
131
+ ///////////////////////////////////////////////////////////////
132
+ ///////////////////////////////////////////////////////////////
133
+
134
+ // --- Form Submit Blocker ---//--- START ---//
135
+ const [formSubmitBlockers, setFormSubmitBlockers] = useState([]);
136
+ const toggleFormSubmitBlock = (key, value) => {
137
+ setFormSubmitBlockers(state =>
138
+ state.includes(key) || !value
139
+ ? [...state.filter(k => k !== key)]
140
+ : [...state, key],
141
+ );
142
+ };
143
+ const clearFormSubmitBlockers = () => setFormSubmitBlockers([]);
144
+ // --- Form Submit Blocker ---//--- END ---//
145
+
146
+ ///////////////////////////////////////////////////////////////
147
+ ///////////////////////////////////////////////////////////////
148
+
149
+ // --- Property Observer Blocker ---//--- START ---//
150
+ // const [propertyObservers, setPropertyObservers] = useState({});
151
+ // function addPropertyObserver () {
152
+ // };
153
+ // --- Property Observer Blocker ---//--- END ---//
154
+
155
+ ///////////////////////////////////////////////////////////////
156
+ ///////////////////////////////////////////////////////////////
157
+
158
+ // --- Render Fields Controller ---//--- START ---//
159
+ const [isFormFieldsAdded, setIsFormFieldsAdded] = useState(false);
160
+ const [renderFormFields, setRenderFormFieldsState] = useState([]);
161
+ const setRenderFormFields = (data) => {
162
+ setIsFormFieldsAdded(true);
163
+ // eslint-disable-next-line no-use-before-define
164
+ removeRenderFields(renderFormFields);
165
+ // eslint-disable-next-line no-use-before-define
166
+ resetIsInitFocused();
167
+ setRenderFormFieldsState(data);
168
+ };
169
+ const addRenderFields = (fields) => {
170
+ setRenderFormFieldsState(state => [...state, ...fields]);
171
+ };
172
+ const removeRenderFields = (fields) => {
173
+ setRenderFormFieldsState(state =>
174
+ state.filter(field => !fields.includes(field)),
175
+ );
176
+ };
177
+
178
+ const [isFormRendered, setIsFormRendered] = useState(false);
179
+ const submitIsFormRendered = () => setIsFormRendered(true);
180
+ const resetIsFormRendered = () => setIsFormRendered(false);
181
+
182
+ const onEnterDown = async (e) => {
183
+ if (!goToNextFieldOnEnterPressed) return false;
184
+
185
+ const focusable = document.querySelectorAll(
186
+ 'a, button, input, [tabindex]:not([tabindex="-1"])',
187
+ );
188
+ const currentIndex = await new Promise((resolve) => {
189
+ focusable.forEach((node, i) => {
190
+ if (node === e.target) resolve(i);
191
+ });
192
+ });
193
+
194
+ if (!currentIndex) return false;
195
+
196
+ const nextIndex = currentIndex + 1;
197
+
198
+ if (nextIndex >= focusable.length) return false;
199
+
200
+ const nextItem = focusable[nextIndex];
201
+
202
+ nextItem.focus();
203
+ };
204
+
205
+ const onKeyDown = (...args) => {
206
+ const event = args.reduce((e, item) => {
207
+ if (item?.nativeEvent instanceof KeyboardEvent) return item;
208
+ return e;
209
+ }, null);
210
+
211
+ if (!event) return false;
212
+
213
+ const { keyCode } = event;
214
+
215
+ switch (keyCode) {
216
+ // OnEnterDown
217
+ case 13:
218
+ onEnterDown(event);
219
+ break;
220
+
221
+ default:
222
+ break;
223
+ }
224
+ };
225
+
226
+ // On Type Change
227
+ useEffect(() => {
228
+ resetIsFormRendered();
229
+ }, [FormType]);
230
+
231
+ // On Render Fields Change
232
+ useEffect(() => {
233
+ if (isFormFieldsAdded) resetIsFormRendered(false);
234
+
235
+ // Add Form Fields
236
+ if (renderFormFields.length !== 0) {
237
+ setFormFields((fields) => {
238
+ return renderFormFields.reduce((result, key) => {
239
+ const fieldData = getFieldData(key);
240
+ const field = getFormField(key) ? getFormField(key) : fieldData;
241
+
242
+ if (
243
+ !field?.className
244
+ || field?.className?.indexOf(getFieldClassName(key, FormType)) === -1
245
+ ) {
246
+ field.className = `${field?.className} ${getFieldClassName(key, FormType)}`;
247
+ }
248
+
249
+ if (typeof fieldData?.label === 'object') {
250
+ field.label = fieldData.label[FormType] || fieldData.label.default;
251
+ }
252
+
253
+ field.ref = createRef();
254
+ field.wrapperRef = createRef();
255
+
256
+ field.isValueChangedByUser = false;
257
+
258
+ if (goToNextFieldOnEnterPressed) {
259
+ const onKeyDownProp = field.onKeyDown || (() => {});
260
+ field.onKeyDown = (...args) => {
261
+ onKeyDown(...args);
262
+ onKeyDownProp(...args);
263
+ };
264
+ }
265
+
266
+ // Is Field Value Changed By USER
267
+ // eslint-disable-next-line no-use-before-define
268
+ addOnFieldRenderedObserver(
269
+ key,
270
+ () => {
271
+ const element = getFormField(key)?.ref?.current?.querySelector(
272
+ field?.focusSelector || 'input',
273
+ );
274
+ const handler = () =>
275
+ setFormField({ isValueChangedByUser: true }, key);
276
+
277
+ element?.addEventListener('paste', handler, { once: true });
278
+ element?.addEventListener('keypress', handler, { once: true });
279
+ },
280
+ true,
281
+ );
282
+
283
+ return updateFormField(result, field, key);
284
+ }, fields);
285
+ });
286
+ }
287
+ }, [renderFormFields]);
288
+
289
+ const [onFormRenderObservers, setOnFormRenderObservers] = useState([]);
290
+ const addOnFormRenderObserver = (cb, { once = false } = {}) => {
291
+ setOnFormRenderObservers(state => [
292
+ ...state,
293
+ { cb, once, isWorkedOut: false },
294
+ ]);
295
+ };
296
+
297
+ const updateOnFormRenderObserver = (key, data) => {
298
+ setOnFormRenderObservers((state) => {
299
+ const copy = [...state];
300
+ copy[key] = { ...state[key], ...data };
301
+
302
+ return copy;
303
+ });
304
+ };
305
+ const removeOnFormRenderObserver = (key) => {
306
+ setOnFormRenderObservers(state =>
307
+ state.slice().filter((v, i) => i !== key),
308
+ );
309
+ };
310
+ const onFormRenderWorker = () => {
311
+ onFormRenderObservers.map(
312
+ ({ once, isWorkedOut, cb = () => {} } = {}, key) => {
313
+ if (once && isWorkedOut) return null;
314
+
315
+ cb(form);
316
+ if (once) removeOnFormRenderObserver(key);
317
+ else updateOnFormRenderObserver(key, { isWorkedOut: true });
318
+ return null;
319
+ },
320
+ );
321
+ };
322
+
323
+ // On Form Rendered
324
+ useEffect(() => {
325
+ if (!isFormRendered && onFormRenderObservers.length) {
326
+ const formFieldsKeys = getFormFieldsKeys(form);
327
+ const isAllFieldsRendered = renderFormFields.reduce((result, key) => {
328
+ if (!formFieldsKeys.includes(key)) result = false;
329
+
330
+ return result;
331
+ }, true);
332
+
333
+ if (isAllFieldsRendered) {
334
+ submitIsFormRendered(true);
335
+ onFormRenderWorker();
336
+ }
337
+ }
338
+ }, [form, renderFormFields, onFormRenderObservers]);
339
+ // --- Render Fields Controller ---//--- END ---//
340
+
341
+ ///////////////////////////////////////////////////////////////
342
+ ///////////////////////////////////////////////////////////////
343
+
344
+ // --- HIGHTLIGHT LABELS IF FIELD WITH ERROR ---//--- START ---//
345
+ const hightliteErrorLabels = () => {
346
+ const fields = getFormFieldsAsArray();
347
+
348
+ const filtered = fields?.reduce((result, field) => {
349
+ if (field?.errorLabelHightlite) {
350
+ result.push({
351
+ ...field,
352
+ className: getFieldClassName(field?.key, FormType),
353
+ });
354
+ }
355
+
356
+ return result;
357
+ }, []);
358
+
359
+ filtered?.map((field) => {
360
+ const formField = document.querySelector(`.${field?.className}`);
361
+
362
+ if (!formField) return null;
363
+
364
+ formField.classList.remove('errorLabelHightlite');
365
+
366
+ if (field?.error) {
367
+ formField.classList.add('errorLabelHightlite');
368
+ }
369
+
370
+ return null;
371
+ });
372
+ };
373
+ useEffect(() => {
374
+ hightliteErrorLabels();
375
+ }, [form]);
376
+ // --- HIGHTLIGHT LABELS IF FIELD WITH ERROR ---//--- END ---//
377
+
378
+ ///////////////////////////////////////////////////////////////
379
+ ///////////////////////////////////////////////////////////////
380
+
381
+ // --- Fields Focus Controller ---//--- START ---//
382
+ const [isInitFocused, setIsInitFocused] = useState(false);
383
+ const [autoFocusedField, setAutoFocusedField] = useState(null);
384
+
385
+ const setFirstFieldInitFocused = () => setIsInitFocused(true);
386
+ const resetIsInitFocused = () => setIsInitFocused(false);
387
+
388
+ const toggleFieldFocus = (
389
+ { key, cb = () => {}, form: argForm, field },
390
+ action = 'focus',
391
+ ) => {
392
+ if (!key && !field) return null;
393
+
394
+ if (!argForm) argForm = form;
395
+
396
+ const formField = field || getFormField(key, argForm);
397
+
398
+ if (!formField || !formField.ref) {
399
+ return false;
400
+ }
401
+
402
+ if (
403
+ action === 'focus'
404
+ && FocusControllerProps.onlyEmptyFieldAutoFocus
405
+ && Boolean(formField?.value)
406
+ ) {
407
+ return null;
408
+ }
409
+
410
+ setTimeout(() => {
411
+ formField.ref.current
412
+ ?.querySelector(formField?.focusSelector || 'input')
413
+ ?.[action]();
414
+ cb();
415
+ }, 50);
416
+ };
417
+
418
+ const setFieldFocus = ({ key, cb = () => {}, form: argForm, field }) =>
419
+ toggleFieldFocus({ key, cb, form: argForm, field }, 'focus');
420
+ const setFieldBlur = ({ key, cb = () => {}, form: argForm, field }) =>
421
+ toggleFieldFocus({ key, cb, form: argForm, field }, 'blur');
422
+
423
+ const setFirstFieldFocus = () => {
424
+ let field = null;
425
+
426
+ for (let i = 0; i < renderFormFields.length && !field; ++i) {
427
+ const key = renderFormFields[i];
428
+ const tmpField = getFormField(key);
429
+ if (tmpField && !tmpField?.disabled) field = tmpField;
430
+ }
431
+
432
+ if (!field) return false;
433
+
434
+ if (FocusControllerProps.onlyEmptyFieldAutoFocus && Boolean(field?.value)) {
435
+ setFirstFieldInitFocused();
436
+ return false;
437
+ }
438
+
439
+ setAutoFocusedField(field.key);
440
+
441
+ const callback = () => {
442
+ setFormField({ value: field.value }, field.key);
443
+ setFirstFieldInitFocused();
444
+ };
445
+
446
+ setTimeout(() => setFieldFocus({ key: field.key, cb: callback, form }), 50);
447
+ };
448
+
449
+ const [onFieldFocusCallbacks, setOnFieldFocusCallbacks] = useState({});
450
+ const addOnFieldFocusCallback = (key, cb) => {
451
+ setOnFieldFocusCallbacks((state) => {
452
+ const stateCopy = { ...state };
453
+
454
+ if (!state[key]) stateCopy[key] = [];
455
+
456
+ stateCopy[key].push(cb);
457
+
458
+ return stateCopy;
459
+ });
460
+ };
461
+ const callOnFieldFocusCallbacks = (key) => {
462
+ if (!Array.isArray(onFieldFocusCallbacks[key])) return null;
463
+
464
+ onFieldFocusCallbacks[key]?.map(cb => cb());
465
+ };
466
+
467
+ const [focusOnRenderFields, setFocusOnRenderFields] = useState([]);
468
+ const addFocusFieldOnRender = (key, cb) => {
469
+ setFocusOnRenderFields(state => [...state, key]);
470
+
471
+ if (cb) addOnFieldFocusCallback(key, cb);
472
+ };
473
+ const removeFocusFieldOnRender = (key) => {
474
+ setFocusOnRenderFields(state => state.filter(field => field !== key));
475
+ };
476
+
477
+ useEffect(() => {
478
+ if (
479
+ FocusControllerProps.setAutoFocus
480
+ && !isInitFocused
481
+ && !autoFocusedField
482
+ && isFormRendered
483
+ ) {
484
+ setFirstFieldFocus();
485
+ }
486
+
487
+ if (focusOnRenderFields.length) {
488
+ getFormFieldsKeys(form)?.map((key) => {
489
+ if (
490
+ focusOnRenderFields.includes(key)
491
+ && getFormField(key)?.value?.length === 0
492
+ ) {
493
+ const cb = () => {
494
+ removeFocusFieldOnRender(key);
495
+ callOnFieldFocusCallbacks(key);
496
+ };
497
+
498
+ setFieldFocus({ key, form, cb });
499
+ }
500
+ return null;
501
+ });
502
+ }
503
+ }, [form, focusOnRenderFields, isInitFocused, isFormRendered]);
504
+
505
+ useEffect(() => {
506
+ setAutoFocusedField(null);
507
+ }, [isInitFocused]);
508
+
509
+ useEffect(() => {
510
+ resetIsInitFocused();
511
+ }, [FormType]);
512
+
513
+ // Remove Focus From Autocomplete field !!! TODO
514
+ // useEffect(() => {
515
+ // if (!autoFocusedField) return null;
516
+ // const field = getFormField(autoFocusedField);
517
+
518
+ // if (field?.value !== '' && !field?.isValueChangedByUser) {
519
+ // setFieldBlur({key: autoFocusedField, form});
520
+ // }
521
+ // }, [autoFocusedField, form]);
522
+ // --- Fields Focus Controller ---//--- END ---//
523
+
524
+ ///////////////////////////////////////////////////////////////
525
+ ///////////////////////////////////////////////////////////////
526
+
527
+ // --- OnFieldRendered Observer ---//--- START ---//
528
+ const [onFieldRenderedObservers, setOnFieldRenderedObservers] = useState({});
529
+ const [isFieldObserversReset, setIsFieldObserversReset] = useState(false);
530
+
531
+ const resetOnFieldRenderObserversWorkedOut = () => {
532
+ if (!isFieldObserversReset && renderFormFields.length) {
533
+ renderFormFields.map((key) => {
534
+ setFormField({ isOnRenderObserversWorkedOut: false }, key);
535
+ return key;
536
+ });
537
+ setIsFieldObserversReset(true);
538
+ }
539
+ };
540
+ const addOnFieldRenderedObserver = (key, cb, isOnceCallable = true) => {
541
+ let observerId = null;
542
+
543
+ setOnFieldRenderedObservers((state) => {
544
+ // Set Default Value
545
+ if (!state[key]) state[key] = {};
546
+
547
+ observerId = Object.keys(state[key]).length || 0;
548
+
549
+ state[key][observerId] = {
550
+ f: cb,
551
+ isOnceCallable,
552
+ };
553
+
554
+ return state;
555
+ });
556
+
557
+ return observerId;
558
+ };
559
+ const updateOnFieldRenderedObserver = (key, id, data) => {
560
+ setOnFieldRenderedObservers((state) => {
561
+ // Set Default Value
562
+ if (!state[key]) return state;
563
+
564
+ state[key][id] = {
565
+ ...state[key][id],
566
+ ...data,
567
+ };
568
+
569
+ return state;
570
+ });
571
+ };
572
+ const removeOnFieldRenderedObserver = (key, id) => {
573
+ setOnFieldRenderedObservers((state) => {
574
+ // Set Default Value
575
+ if (!state[key]) return state;
576
+
577
+ state[key] = Object.keys(state)
578
+ .filter(cbId => cbId !== id)
579
+ .map(cbId => state[key][cbId]);
580
+
581
+ return state;
582
+ });
583
+ };
584
+ const onFieldRenderedObserver = (key, data) => {
585
+ if (
586
+ !onFieldRenderedObservers[key]
587
+ || typeof onFieldRenderedObservers[key] !== 'object'
588
+ ) {
589
+ return;
590
+ }
591
+
592
+ const Observers = onFieldRenderedObservers[key];
593
+ const FilteredObservers = Object.values(Observers).filter(
594
+ observer => !observer?.isObserverWorkedOut,
595
+ );
596
+
597
+ if (FilteredObservers.length === 0) return null;
598
+
599
+ setFormField({ isOnRenderObserversWorkedOut: true }, key);
600
+
601
+ FilteredObservers.map(({ f, isOnceCallable }, id) => {
602
+ f(data);
603
+ if (isOnceCallable)
604
+ updateOnFieldRenderedObserver(key, id, { isObserverWorkedOut: true });
605
+ return null;
606
+ });
607
+ };
608
+ const onRenderObserverWorker = () => {
609
+ return getFormFieldsKeys(form)?.map((key) => {
610
+ // OnFieldRendered
611
+ const fieldData = getFormField(key);
612
+ if (!fieldData?.isOnRenderObserversWorkedOut) {
613
+ onFieldRenderedObserver(key, fieldData);
614
+ return { key, isWorkedOut: true };
615
+ }
616
+
617
+ return { key, isWorkedOut: false };
618
+ });
619
+ };
620
+
621
+ useEffect(() => {
622
+ resetOnFieldRenderObserversWorkedOut();
623
+ onRenderObserverWorker();
624
+ }, [form]);
625
+
626
+ useEffect(() => {
627
+ setIsFieldObserversReset(false);
628
+ }, [FormType]);
629
+ // --- OnFieldRendered Observer ---//--- END ---//
630
+
631
+ ///////////////////////////////////////////////////////////////
632
+ ///////////////////////////////////////////////////////////////
633
+
634
+ // Detect What Changed || TRY TO DO
635
+ // const compare = async (prev, current) => {
636
+ // if (!prev) return current;
637
+
638
+ // return new Promise((resolve) => {
639
+ // Object.keys(current).reduce((result, key, i, arr) => {
640
+ // //If PROPERTY is NOT EXISTS BEFORE
641
+ // if ([null, undefined].includes(prev[key])) {
642
+ // result[key] = current[key];
643
+ // }
644
+ // //If PROPERTY is AN OBJECT
645
+ // else if (typeof current[key] === 'object') {
646
+ // //If PROPERTY is EXISTS BEFORE
647
+ // const innerCompare = compare(prev[key], current[key]);
648
+ // // //If SOMETHING CHANGED
649
+ // if (innerCompare?.length) result[key] = innerCompare;
650
+ // }
651
+ // //If PROPERTY is AN SIMPLE VALUE and PROPERTY CHANGED
652
+ // else if (prev[key] !== current[key]) {
653
+ // result[key] = current[key];
654
+ // }
655
+
656
+ // if (i === arr.length-1) {
657
+ // resolve(result);
658
+ // }
659
+
660
+ // return result;
661
+ // }, {});
662
+ // });
663
+ // };
664
+
665
+ ///////////////////////////////////////////////////////////////
666
+ ///////////////////////////////////////////////////////////////
667
+
668
+ // --- WindowScrollController ---//--- START ---//
669
+ const scrollToField = ({ key = null, field = null, form: argForm }) => {
670
+ if (!key && !field) return false;
671
+ if (!argForm) argForm = form;
672
+
673
+ if (!field) field = getFormField(key, argForm);
674
+
675
+ const wrapperRef = field?.wrapperRef || field?.ref;
676
+
677
+ const { top: topOffset } = wrapperRef?.current?.getBoundingClientRect();
678
+ const scrollTop
679
+ = Math.abs(Math.abs(topOffset) - Math.abs(window.scrollY)) - 16;
680
+ window.scrollTo({ top: scrollTop });
681
+ };
682
+
683
+ // --- WindowScrollController ---//--- END ---//
684
+
685
+ ///////////////////////////////////////////////////////////////
686
+ ///////////////////////////////////////////////////////////////
687
+
688
+ const addErrorsToForm = (errors, argForm = form) => {
689
+ if (!argForm) argForm = form;
690
+
691
+ setFormFields((fields) => {
692
+ return errors.reduce(
693
+ (fields, { message: error, propertyPath: errKey }) => {
694
+ return updateFormField(fields, { error }, errKey);
695
+ },
696
+ fields,
697
+ );
698
+ });
699
+ };
700
+
701
+ return {
702
+ FormDataDrivers,
703
+
704
+ // OnChangeObserver
705
+ addOnChangeObserver,
706
+ removeOnChangeObserver,
707
+ onChangeObservers,
708
+
709
+ // OnChangeHandler
710
+ onFieldChange,
711
+
712
+ // Form Submit Blocker
713
+ toggleFormSubmitBlock,
714
+ clearFormSubmitBlockers,
715
+ isFormSubmitBlocked: Boolean(formSubmitBlockers.length),
716
+
717
+ // Property Observers
718
+ // addPropertyObserver,
719
+
720
+ // Render Fields
721
+ renderFormFields,
722
+ setRenderFormFields,
723
+ addRenderFields,
724
+ removeRenderFields,
725
+
726
+ getFieldClassName,
727
+
728
+ // Field Focus Controller
729
+ isInitFocused,
730
+ setFirstFieldInitFocused,
731
+ resetIsInitFocused,
732
+ setFieldFocus,
733
+ setFieldBlur,
734
+ setFirstFieldFocus,
735
+ autoFocusedField,
736
+
737
+ addFocusFieldOnRender,
738
+ removeFocusFieldOnRender,
739
+
740
+ // Field Render Controller
741
+ addOnFieldRenderedObserver,
742
+ removeOnFieldRenderedObserver,
743
+ onFieldRenderedObservers,
744
+
745
+ updateFormField,
746
+ addOnFormRenderObserver,
747
+ submitIsFormRendered,
748
+ resetIsFormRendered,
749
+ renderFields: ({
750
+ form: argForm = form,
751
+ fields: argFields = renderFormFields,
752
+ cols: argCols = 1,
753
+ RenderFieldComponent,
754
+ }) =>
755
+ RenderFields({
756
+ form: argForm,
757
+ fields: argFields,
758
+ cols: argCols,
759
+ RenderFieldComponent,
760
+ onFieldChange,
761
+ FormDataDriver: getFormDataDriver(FormDataDriverName),
762
+ }),
763
+
764
+ scrollToField,
765
+
766
+ getFieldData,
767
+ getFormField,
768
+ setFormFields,
769
+ setFormField: (data, key) => setFormField(data, key),
770
+ getFormFieldsAsArray,
771
+ getFormFieldsKeys,
772
+ removeAllFormFields,
773
+ removeFormField,
774
+ removeFormFields,
775
+ addErrorsToForm,
776
+ };
777
+ }