@tsed/react-formio 3.0.0-alpha.8 → 3.0.0-rc.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 (447) hide show
  1. package/dist/all.d.ts +0 -0
  2. package/dist/all.js +38 -0
  3. package/dist/all.js.map +1 -0
  4. package/dist/atoms/icon/Icon.d.ts +4 -3
  5. package/dist/atoms/icon/Icon.js +9 -8
  6. package/dist/atoms/icon/Icon.js.map +1 -1
  7. package/dist/chunks/_commonjsHelpers.js +30 -3
  8. package/dist/chunks/_commonjsHelpers.js.map +1 -1
  9. package/dist/chunks/index.js +33 -30
  10. package/dist/chunks/index.js.map +1 -1
  11. package/dist/chunks/index.module.js +16 -16
  12. package/dist/chunks/index.module.js.map +1 -1
  13. package/dist/chunks/index2.js +56953 -0
  14. package/dist/chunks/index2.js.map +1 -0
  15. package/dist/chunks/react-select-animated.esm.js +3616 -0
  16. package/dist/chunks/react-select-animated.esm.js.map +1 -0
  17. package/dist/contexts/FormioContext.d.ts +19 -0
  18. package/dist/contexts/FormioContext.js +35 -0
  19. package/dist/contexts/FormioContext.js.map +1 -0
  20. package/dist/hooks/keyboard.constants.d.ts +38 -0
  21. package/dist/hooks/keyboard.constants.js +7 -0
  22. package/dist/hooks/keyboard.constants.js.map +1 -0
  23. package/dist/hooks/useFormioContext.d.ts +10 -0
  24. package/dist/hooks/useFormioContext.js +12 -0
  25. package/dist/hooks/useFormioContext.js.map +1 -0
  26. package/dist/hooks/useI18n.d.ts +4 -0
  27. package/dist/hooks/useI18n.js +9 -0
  28. package/dist/hooks/useI18n.js.map +1 -0
  29. package/dist/hooks/useKeyboardControls.d.ts +12 -0
  30. package/dist/hooks/useKeyboardControls.js +35 -0
  31. package/dist/hooks/useKeyboardControls.js.map +1 -0
  32. package/dist/hooks/useTooltip.js.map +1 -1
  33. package/dist/index.d.ts +1 -6
  34. package/dist/index.js +18 -13
  35. package/dist/index.js.map +1 -1
  36. package/dist/interfaces/ComponentType.d.ts +6 -2
  37. package/dist/interfaces/FormBuilderOptions.d.ts +7 -0
  38. package/dist/interfaces/FormBuilderOptions.js +2 -0
  39. package/dist/interfaces/FormBuilderOptions.js.map +1 -0
  40. package/dist/interfaces/FormOptions.d.ts +6 -13
  41. package/dist/interfaces/FormType.d.ts +4 -11
  42. package/dist/interfaces/Operation.d.ts +13 -4
  43. package/dist/interfaces/SubmissionType.d.ts +5 -10
  44. package/dist/interfaces/index.d.ts +1 -0
  45. package/dist/molecules/alert/Alert.js.map +1 -1
  46. package/dist/molecules/button/Button.d.ts +18 -5
  47. package/dist/molecules/button/Button.js +24 -28
  48. package/dist/molecules/button/Button.js.map +1 -1
  49. package/dist/molecules/card/Card.js +9 -7
  50. package/dist/molecules/card/Card.js.map +1 -1
  51. package/dist/molecules/forms/form-control/FormControl.d.ts +14 -12
  52. package/dist/molecules/forms/form-control/FormControl.js +46 -22
  53. package/dist/molecules/forms/form-control/FormControl.js.map +1 -1
  54. package/dist/molecules/forms/input-tags/InputTags.d.ts +2 -8
  55. package/dist/molecules/forms/input-tags/InputTags.interface.d.ts +7 -0
  56. package/dist/molecules/forms/input-tags/InputTags.interface.js +2 -0
  57. package/dist/molecules/forms/input-tags/InputTags.interface.js.map +1 -0
  58. package/dist/molecules/forms/input-tags/InputTags.js +21 -27
  59. package/dist/molecules/forms/input-tags/InputTags.js.map +1 -1
  60. package/dist/molecules/forms/input-tags/all.d.ts +2 -0
  61. package/dist/molecules/forms/input-tags/all.js +9 -0
  62. package/dist/molecules/forms/input-tags/all.js.map +1 -0
  63. package/dist/molecules/forms/input-tags/components/ChoicesTags.d.ts +307 -0
  64. package/dist/molecules/forms/input-tags/components/ChoicesTags.js +51 -0
  65. package/dist/molecules/forms/input-tags/components/ChoicesTags.js.map +1 -0
  66. package/dist/molecules/forms/input-tags/components/ReactTags.d.ts +2 -0
  67. package/dist/molecules/forms/input-tags/components/ReactTags.js +1926 -0
  68. package/dist/molecules/forms/input-tags/components/ReactTags.js.map +1 -0
  69. package/dist/molecules/forms/input-text/InputText.d.ts +2 -14
  70. package/dist/molecules/forms/input-text/InputText.interface.d.ts +4 -0
  71. package/dist/molecules/forms/input-text/InputText.interface.js +2 -0
  72. package/dist/molecules/forms/input-text/InputText.interface.js.map +1 -0
  73. package/dist/molecules/forms/input-text/InputText.js +46 -56
  74. package/dist/molecules/forms/input-text/InputText.js.map +1 -1
  75. package/dist/molecules/forms/select/Select.d.ts +1 -1
  76. package/dist/molecules/forms/select/{Select.interfaces.d.ts → Select.interface.d.ts} +8 -10
  77. package/dist/molecules/forms/select/Select.interface.js +2 -0
  78. package/dist/molecules/forms/select/Select.interface.js.map +1 -0
  79. package/dist/molecules/forms/select/Select.js +9 -10
  80. package/dist/molecules/forms/select/Select.js.map +1 -1
  81. package/dist/molecules/forms/select/all.d.ts +1 -1
  82. package/dist/molecules/forms/select/all.js +1 -0
  83. package/dist/molecules/forms/select/all.js.map +1 -1
  84. package/dist/molecules/forms/select/components/ChoicesSelect.d.ts +1 -1
  85. package/dist/molecules/forms/select/components/ChoicesSelect.js +72 -83
  86. package/dist/molecules/forms/select/components/ChoicesSelect.js.map +1 -1
  87. package/dist/molecules/forms/select/components/HtmlSelect.d.ts +1 -1
  88. package/dist/molecules/forms/select/components/HtmlSelect.js +17 -16
  89. package/dist/molecules/forms/select/components/HtmlSelect.js.map +1 -1
  90. package/dist/molecules/forms/select/components/ReactSelect.d.ts +1 -1
  91. package/dist/molecules/forms/select/components/ReactSelect.js +28 -3034
  92. package/dist/molecules/forms/select/components/ReactSelect.js.map +1 -1
  93. package/dist/molecules/forms/select/components/choices.template.js +2340 -2257
  94. package/dist/molecules/forms/select/components/choices.template.js.map +1 -1
  95. package/dist/molecules/forms/select/hooks/useOptions.d.ts +3 -3
  96. package/dist/molecules/forms/select/hooks/useOptions.js +15 -15
  97. package/dist/molecules/forms/select/hooks/useOptions.js.map +1 -1
  98. package/dist/molecules/loader/Loader.d.ts +4 -4
  99. package/dist/molecules/loader/Loader.js +16 -8
  100. package/dist/molecules/loader/Loader.js.map +1 -1
  101. package/dist/molecules/modal/Modal.js +23 -24
  102. package/dist/molecules/modal/Modal.js.map +1 -1
  103. package/dist/molecules/pagination/Pagination.d.ts +7 -6
  104. package/dist/molecules/pagination/Pagination.js +48 -57
  105. package/dist/molecules/pagination/Pagination.js.map +1 -1
  106. package/dist/molecules/pagination/PaginationButton.js +10 -10
  107. package/dist/molecules/pagination/PaginationButton.js.map +1 -1
  108. package/dist/molecules/pagination/all.js +5 -4
  109. package/dist/molecules/pagination/all.js.map +1 -1
  110. package/dist/molecules/pagination/utils/getPageNumbers.js.map +1 -0
  111. package/dist/molecules/table/Table.d.ts +16 -2
  112. package/dist/molecules/table/Table.js +53 -77
  113. package/dist/molecules/table/Table.js.map +1 -1
  114. package/dist/molecules/table/all.d.ts +0 -0
  115. package/dist/molecules/table/all.js +19 -0
  116. package/dist/molecules/table/all.js.map +1 -0
  117. package/dist/molecules/table/components/DefaultArrowSort.d.ts +5 -1
  118. package/dist/molecules/table/components/DefaultArrowSort.js +17 -5
  119. package/dist/molecules/table/components/DefaultArrowSort.js.map +1 -1
  120. package/dist/molecules/table/components/DefaultCell.d.ts +5 -1
  121. package/dist/molecules/table/components/DefaultCell.js +8 -6
  122. package/dist/molecules/table/components/DefaultCell.js.map +1 -1
  123. package/dist/molecules/table/components/DefaultCellFooter.d.ts +6 -0
  124. package/dist/molecules/table/components/DefaultCellFooter.js +12 -0
  125. package/dist/molecules/table/components/DefaultCellFooter.js.map +1 -0
  126. package/dist/molecules/table/components/DefaultCellHeader.d.ts +5 -8
  127. package/dist/molecules/table/components/DefaultCellHeader.js +25 -9
  128. package/dist/molecules/table/components/DefaultCellHeader.js.map +1 -1
  129. package/dist/molecules/table/components/DefaultCellOperations.d.ts +16 -10
  130. package/dist/molecules/table/components/DefaultCellOperations.js +23 -14
  131. package/dist/molecules/table/components/DefaultCellOperations.js.map +1 -1
  132. package/dist/molecules/table/components/DefaultFilter.d.ts +11 -0
  133. package/dist/molecules/table/components/DefaultFilter.js +15 -0
  134. package/dist/molecules/table/components/DefaultFilter.js.map +1 -0
  135. package/dist/molecules/table/components/DefaultOperationButton.d.ts +16 -12
  136. package/dist/molecules/table/components/DefaultOperationButton.js +16 -31
  137. package/dist/molecules/table/components/DefaultOperationButton.js.map +1 -1
  138. package/dist/molecules/table/filters/Filters.d.js +2 -0
  139. package/dist/molecules/table/filters/Filters.d.js.map +1 -0
  140. package/dist/molecules/table/filters/RangeFilter.d.ts +3 -0
  141. package/dist/molecules/table/filters/RangeFilter.js +41 -0
  142. package/dist/molecules/table/filters/RangeFilter.js.map +1 -0
  143. package/dist/molecules/table/filters/SelectFilter.d.ts +3 -0
  144. package/dist/molecules/table/filters/SelectFilter.js +33 -0
  145. package/dist/molecules/table/filters/SelectFilter.js.map +1 -0
  146. package/dist/molecules/table/filters/TextFieldFilter.d.ts +3 -0
  147. package/dist/molecules/table/filters/TextFieldFilter.js +27 -0
  148. package/dist/molecules/table/filters/TextFieldFilter.js.map +1 -0
  149. package/dist/molecules/table/hooks/useTable.d.ts +23 -0
  150. package/dist/molecules/table/hooks/useTable.js +35 -0
  151. package/dist/molecules/table/hooks/useTable.js.map +1 -0
  152. package/dist/molecules/table/hooks/useUniqValues.d.ts +5 -0
  153. package/dist/molecules/table/hooks/useUniqValues.js +11 -0
  154. package/dist/molecules/table/hooks/useUniqValues.js.map +1 -0
  155. package/dist/molecules/table/interfaces/extends.d.ts +14 -0
  156. package/dist/molecules/table/interfaces/extends.js +2 -0
  157. package/dist/molecules/table/interfaces/extends.js.map +1 -0
  158. package/dist/molecules/table/utils/mapFormToColumns.d.ts +2 -2
  159. package/dist/molecules/table/utils/mapFormToColumns.js +34 -18
  160. package/dist/molecules/table/utils/mapFormToColumns.js.map +1 -1
  161. package/dist/molecules/tabs/Tab.d.ts +13 -0
  162. package/dist/molecules/tabs/Tab.js +66 -0
  163. package/dist/molecules/tabs/Tab.js.map +1 -0
  164. package/dist/molecules/tabs/TabList.d.ts +2 -0
  165. package/dist/molecules/tabs/TabList.js +23 -0
  166. package/dist/molecules/tabs/TabList.js.map +1 -0
  167. package/dist/molecules/tabs/TabPanel.d.ts +9 -0
  168. package/dist/molecules/tabs/TabPanel.js +27 -0
  169. package/dist/molecules/tabs/TabPanel.js.map +1 -0
  170. package/dist/molecules/tabs/Tabs.d.ts +4 -16
  171. package/dist/molecules/tabs/Tabs.js +7 -67
  172. package/dist/molecules/tabs/Tabs.js.map +1 -1
  173. package/dist/molecules/tabs/TabsBody.d.ts +1 -0
  174. package/dist/molecules/tabs/TabsBody.js +10 -0
  175. package/dist/molecules/tabs/TabsBody.js.map +1 -0
  176. package/dist/molecules/tabs/TabsLegacy.d.ts +18 -0
  177. package/dist/molecules/tabs/TabsLegacy.js +49 -0
  178. package/dist/molecules/tabs/TabsLegacy.js.map +1 -0
  179. package/dist/molecules/tabs/all.d.ts +5 -0
  180. package/dist/molecules/tabs/all.js +13 -0
  181. package/dist/molecules/tabs/all.js.map +1 -0
  182. package/dist/molecules/tabs/context/TabControl.d.ts +52 -0
  183. package/dist/molecules/tabs/context/TabControl.js +85 -0
  184. package/dist/molecules/tabs/context/TabControl.js.map +1 -0
  185. package/dist/molecules/tabs/hooks/tabControl.d.ts +44 -0
  186. package/dist/molecules/tabs/hooks/tabControl.js +34 -0
  187. package/dist/molecules/tabs/hooks/tabControl.js.map +1 -0
  188. package/dist/organisms/form/Form.js.map +1 -1
  189. package/dist/organisms/form/access/FormAccess.js +41 -41
  190. package/dist/organisms/form/access/FormAccess.js.map +1 -1
  191. package/dist/organisms/form/access/FormAccess.schema.js +1 -0
  192. package/dist/organisms/form/access/FormAccess.schema.js.map +1 -1
  193. package/dist/organisms/form/access/FormAccess.utils.js +2 -2
  194. package/dist/organisms/form/access/FormAccess.utils.js.map +1 -1
  195. package/dist/organisms/form/actions/FormAction.js +34 -0
  196. package/dist/organisms/form/actions/FormAction.js.map +1 -0
  197. package/dist/organisms/form/builder/FormBuilder.js.map +1 -1
  198. package/dist/organisms/form/builder/FormEdit.d.ts +7 -3
  199. package/dist/organisms/form/builder/FormEdit.js +46 -42
  200. package/dist/organisms/form/builder/FormEdit.js.map +1 -1
  201. package/dist/organisms/form/builder/FormEdit.reducer.js.map +1 -1
  202. package/dist/organisms/form/builder/FormEditCtas.d.ts +2 -2
  203. package/dist/organisms/form/builder/FormEditCtas.js +36 -35
  204. package/dist/organisms/form/builder/FormEditCtas.js.map +1 -1
  205. package/dist/organisms/form/builder/FormParameters.d.ts +3 -2
  206. package/dist/organisms/form/builder/FormParameters.js +19 -18
  207. package/dist/organisms/form/builder/FormParameters.js.map +1 -1
  208. package/dist/organisms/form/builder/all.js +17 -13
  209. package/dist/organisms/form/builder/all.js.map +1 -1
  210. package/dist/organisms/form/builder/useFormBuilder.d.ts +4 -4
  211. package/dist/organisms/form/builder/useFormBuilder.js +36 -33
  212. package/dist/organisms/form/builder/useFormBuilder.js.map +1 -1
  213. package/dist/organisms/form/builder/useFormEdit.d.ts +2 -2
  214. package/dist/organisms/form/builder/useFormEdit.js +1 -1
  215. package/dist/organisms/form/builder/useFormEdit.js.map +1 -1
  216. package/dist/organisms/form/exports/FormExport.d.ts +6 -0
  217. package/dist/organisms/form/exports/FormExport.js +56 -0
  218. package/dist/organisms/form/exports/FormExport.js.map +1 -0
  219. package/dist/organisms/form/preview/FormPreview.d.ts +6 -0
  220. package/dist/organisms/form/preview/FormPreview.js +12 -0
  221. package/dist/organisms/form/preview/FormPreview.js.map +1 -0
  222. package/dist/organisms/form/settings/FormSettings.js +28 -28
  223. package/dist/organisms/form/settings/FormSettings.js.map +1 -1
  224. package/dist/organisms/form/settings/FormSettings.schema.js.map +1 -1
  225. package/dist/organisms/form/settings/FormSettings.utils.js.map +1 -1
  226. package/dist/organisms/form/useForm.d.ts +2 -1
  227. package/dist/organisms/form/useForm.js +664 -661
  228. package/dist/organisms/form/useForm.js.map +1 -1
  229. package/dist/organisms/modal/RemoveModal.js +16 -17
  230. package/dist/organisms/modal/RemoveModal.js.map +1 -1
  231. package/dist/organisms/table/actions/ActionsTable.d.ts +4 -3
  232. package/dist/organisms/table/actions/ActionsTable.js +21 -33
  233. package/dist/organisms/table/actions/ActionsTable.js.map +1 -1
  234. package/dist/organisms/table/forms/FormsTable.d.ts +2 -3
  235. package/dist/organisms/table/forms/FormsTable.js +48 -27
  236. package/dist/organisms/table/forms/FormsTable.js.map +1 -1
  237. package/dist/organisms/table/forms/components/FormsCell.d.ts +5 -0
  238. package/dist/organisms/table/forms/components/FormsCell.js +50 -0
  239. package/dist/organisms/table/forms/components/FormsCell.js.map +1 -0
  240. package/dist/organisms/table/submissions/SubmissionsTable.d.ts +12 -4
  241. package/dist/organisms/table/submissions/SubmissionsTable.js +10 -17
  242. package/dist/organisms/table/submissions/SubmissionsTable.js.map +1 -1
  243. package/dist/organisms/views/FormViews.d.ts +24 -0
  244. package/dist/organisms/views/FormViews.js +97 -0
  245. package/dist/organisms/views/FormViews.js.map +1 -0
  246. package/dist/registries/components.js +12 -11
  247. package/dist/registries/components.js.map +1 -1
  248. package/dist/utils/getEventValue.js.map +1 -1
  249. package/dist/utils/iconClass.js +4 -5
  250. package/dist/utils/iconClass.js.map +1 -1
  251. package/dist/utils/mapPagination.js.map +1 -1
  252. package/dist/utils/stopPropagationWrapper.js.map +1 -1
  253. package/package.json +10 -8
  254. package/readme.md +7 -8
  255. package/src/all.ts +34 -0
  256. package/src/atoms/icon/Icon.stories.tsx +71 -22
  257. package/src/atoms/icon/Icon.tsx +14 -4
  258. package/src/contexts/FormioContext.tsx +89 -0
  259. package/src/hooks/keyboard.constants.ts +40 -0
  260. package/src/hooks/useFormioContext.ts +13 -0
  261. package/src/hooks/useI18n.ts +9 -0
  262. package/src/hooks/useKeyboardControls.spec.tsx +208 -0
  263. package/src/hooks/useKeyboardControls.ts +84 -0
  264. package/src/index.ts +17 -13
  265. package/src/interfaces/ComponentType.ts +2 -2
  266. package/src/interfaces/FormBuilderOptions.ts +9 -0
  267. package/src/interfaces/FormOptions.ts +7 -13
  268. package/src/interfaces/FormType.ts +5 -11
  269. package/src/interfaces/Operation.ts +10 -4
  270. package/src/interfaces/SubmissionType.ts +9 -8
  271. package/src/interfaces/index.ts +1 -0
  272. package/src/molecules/__fixtures__/build.js +28 -0
  273. package/src/molecules/__fixtures__/form-schema.json +76 -195
  274. package/src/molecules/__fixtures__/form-submissions.json +11846 -46
  275. package/src/molecules/__fixtures__/products.json +81539 -0
  276. package/src/molecules/button/Button.stories.tsx +1 -1
  277. package/src/molecules/button/Button.tsx +43 -24
  278. package/src/molecules/card/Card.tsx +4 -0
  279. package/src/molecules/forms/form-control/FormControl.spec.tsx +7 -4
  280. package/src/molecules/forms/form-control/FormControl.stories.tsx +4 -4
  281. package/src/molecules/forms/form-control/FormControl.tsx +46 -20
  282. package/src/molecules/forms/input-tags/InputTags.interface.ts +9 -0
  283. package/src/molecules/forms/input-tags/InputTags.tsx +20 -42
  284. package/src/molecules/forms/input-tags/all.ts +6 -0
  285. package/src/molecules/forms/input-tags/components/ChoicesTags.stories.tsx +110 -0
  286. package/src/molecules/forms/input-tags/components/ChoicesTags.tsx +72 -0
  287. package/src/molecules/forms/input-tags/components/ReactTags.stories.tsx +140 -0
  288. package/src/molecules/forms/input-tags/components/ReactTags.tsx +38 -0
  289. package/src/molecules/forms/input-text/InputText.interface.ts +5 -0
  290. package/src/molecules/forms/input-text/InputText.spec.tsx +1 -1
  291. package/src/molecules/forms/input-text/InputText.stories.tsx +4 -4
  292. package/src/molecules/forms/input-text/InputText.tsx +38 -53
  293. package/src/molecules/forms/select/{Select.interfaces.ts → Select.interface.ts} +8 -10
  294. package/src/molecules/forms/select/Select.tsx +5 -3
  295. package/src/molecules/forms/select/all.ts +2 -1
  296. package/src/molecules/forms/select/components/ChoicesSelect.stories.tsx +8 -7
  297. package/src/molecules/forms/select/components/ChoicesSelect.tsx +9 -18
  298. package/src/molecules/forms/select/components/HtmlSelect.stories.tsx +7 -7
  299. package/src/molecules/forms/select/components/HtmlSelect.tsx +3 -2
  300. package/src/molecules/forms/select/components/ReactSelect.stories.tsx +10 -8
  301. package/src/molecules/forms/select/components/ReactSelect.tsx +1 -1
  302. package/src/molecules/forms/select/hooks/useOptions.ts +6 -2
  303. package/src/molecules/loader/Loader.spec.tsx +2 -2
  304. package/src/molecules/loader/Loader.stories.tsx +7 -4
  305. package/src/molecules/loader/Loader.tsx +16 -6
  306. package/src/molecules/modal/Modal.stories.tsx +1 -1
  307. package/src/molecules/pagination/Pagination.spec.tsx +11 -11
  308. package/src/molecules/pagination/Pagination.stories.tsx +32 -10
  309. package/src/molecules/pagination/Pagination.tsx +29 -26
  310. package/src/molecules/table/Table.stories.tsx +284 -101
  311. package/src/molecules/table/Table.tsx +91 -86
  312. package/src/molecules/table/all.ts +16 -0
  313. package/src/molecules/table/components/DefaultArrowSort.tsx +20 -4
  314. package/src/molecules/table/components/DefaultCell.tsx +10 -1
  315. package/src/molecules/table/components/DefaultCellFooter.tsx +16 -0
  316. package/src/molecules/table/components/DefaultCellHeader.tsx +33 -13
  317. package/src/molecules/table/components/DefaultCellOperations.tsx +31 -20
  318. package/src/molecules/table/components/DefaultFilter.tsx +42 -0
  319. package/src/molecules/table/components/DefaultOperationButton.tsx +19 -34
  320. package/src/molecules/table/filters/Filters.d.ts +31 -0
  321. package/src/molecules/table/filters/RangeFilter.tsx +43 -0
  322. package/src/molecules/table/filters/SelectFilter.tsx +47 -0
  323. package/src/molecules/table/filters/TextFieldFilter.tsx +36 -0
  324. package/src/molecules/table/hooks/useTable.tsx +76 -0
  325. package/src/molecules/table/hooks/useUniqValues.tsx +10 -0
  326. package/src/molecules/table/interfaces/extends.ts +18 -0
  327. package/src/molecules/table/utils/mapFormToColumns.tsx +69 -26
  328. package/src/molecules/tabs/Tab.tsx +106 -0
  329. package/src/molecules/tabs/TabList.tsx +37 -0
  330. package/src/molecules/tabs/TabPanel.tsx +37 -0
  331. package/src/molecules/tabs/Tabs.spec.tsx +126 -73
  332. package/src/molecules/tabs/Tabs.stories.tsx +298 -65
  333. package/src/molecules/tabs/Tabs.tsx +10 -81
  334. package/src/molecules/tabs/TabsBody.tsx +11 -0
  335. package/src/molecules/tabs/TabsLegacy.stories.tsx +103 -0
  336. package/src/molecules/tabs/TabsLegacy.tsx +86 -0
  337. package/src/molecules/tabs/all.ts +5 -0
  338. package/src/molecules/tabs/context/TabControl.tsx +166 -0
  339. package/src/molecules/tabs/hooks/tabControl.spec.tsx +388 -0
  340. package/src/molecules/tabs/hooks/tabControl.ts +52 -0
  341. package/src/organisms/__fixtures__/form-firstname.fixture.json +1 -0
  342. package/src/organisms/__fixtures__/form.fixture.json +1 -0
  343. package/src/organisms/form/Form.stories.tsx +104 -124
  344. package/src/organisms/form/access/FormAccess.schema.ts +1 -0
  345. package/src/organisms/form/access/FormAccess.stories.tsx +6 -4
  346. package/src/organisms/form/actions/FormAction.stories.tsx +426 -0
  347. package/src/organisms/form/{action → actions}/FormAction.tsx +2 -2
  348. package/src/organisms/form/builder/FormBuilder.stories.tsx +7 -4
  349. package/src/organisms/form/builder/FormEdit.reducer.spec.ts +136 -0
  350. package/src/organisms/form/builder/FormEdit.stories.tsx +16 -13
  351. package/src/organisms/form/builder/FormEdit.tsx +15 -7
  352. package/src/organisms/form/builder/FormEditCtas.tsx +10 -10
  353. package/src/organisms/form/builder/FormParameters.tsx +8 -4
  354. package/src/organisms/form/builder/all.ts +4 -0
  355. package/src/organisms/form/builder/useFormBuilder.ts +12 -7
  356. package/src/organisms/form/builder/useFormEdit.ts +3 -3
  357. package/src/organisms/form/exports/FormExport.stories.tsx +68 -0
  358. package/src/organisms/form/exports/FormExport.tsx +61 -0
  359. package/src/organisms/form/preview/FormPreview.stories.tsx +58 -0
  360. package/src/organisms/form/preview/FormPreview.tsx +23 -0
  361. package/src/organisms/form/settings/FormSettings.component.spec.tsx +3 -1
  362. package/src/organisms/form/settings/FormSettings.stories.tsx +2 -2
  363. package/src/organisms/form/settings/FormSettings.tsx +6 -6
  364. package/src/organisms/form/useForm.ts +2 -3
  365. package/src/organisms/modal/RemoveModal.stories.tsx +1 -1
  366. package/src/organisms/table/actions/ActionsTable.spec.tsx +7 -5
  367. package/src/organisms/table/actions/ActionsTable.stories.tsx +48 -45
  368. package/src/organisms/table/actions/ActionsTable.tsx +14 -18
  369. package/src/organisms/table/forms/FormsTable.stories.tsx +2 -0
  370. package/src/organisms/table/forms/FormsTable.tsx +53 -23
  371. package/src/organisms/table/forms/components/FormsCell.tsx +53 -0
  372. package/src/organisms/table/submissions/SubmissionsTable.stories.tsx +101 -57
  373. package/src/organisms/table/submissions/SubmissionsTable.tsx +12 -5
  374. package/src/organisms/views/FormViews.stories.tsx +221 -0
  375. package/src/organisms/views/FormViews.tsx +148 -0
  376. package/src/registries/components.ts +7 -1
  377. package/src/utils/iconClass.ts +1 -3
  378. package/vite.config.mts +2 -2
  379. package/dist/molecules/forms/select/Select.interfaces.js +0 -2
  380. package/dist/molecules/forms/select/Select.interfaces.js.map +0 -1
  381. package/dist/molecules/table/components/DefaultCells.d.ts +0 -4
  382. package/dist/molecules/table/components/DefaultCells.js +0 -23
  383. package/dist/molecules/table/components/DefaultCells.js.map +0 -1
  384. package/dist/molecules/table/components/DefaultRow.d.ts +0 -12
  385. package/dist/molecules/table/components/DefaultRow.js +0 -26
  386. package/dist/molecules/table/components/DefaultRow.js.map +0 -1
  387. package/dist/molecules/table/components/DragNDropContainer.d.ts +0 -4
  388. package/dist/molecules/table/components/DragNDropContainer.js +0 -10
  389. package/dist/molecules/table/components/DragNDropContainer.js.map +0 -1
  390. package/dist/molecules/table/filters/DefaultColumnFilter.d.ts +0 -10
  391. package/dist/molecules/table/filters/DefaultColumnFilter.js +0 -29
  392. package/dist/molecules/table/filters/DefaultColumnFilter.js.map +0 -1
  393. package/dist/molecules/table/filters/SelectColumnFilter.d.ts +0 -10
  394. package/dist/molecules/table/filters/SelectColumnFilter.js +0 -34
  395. package/dist/molecules/table/filters/SelectColumnFilter.js.map +0 -1
  396. package/dist/molecules/table/filters/SliderColumnFilter.d.ts +0 -9
  397. package/dist/molecules/table/filters/SliderColumnFilter.js +0 -27
  398. package/dist/molecules/table/filters/SliderColumnFilter.js.map +0 -1
  399. package/dist/molecules/table/hooks/useCustomTable.d.ts +0 -128
  400. package/dist/molecules/table/hooks/useCustomTable.js +0 -130
  401. package/dist/molecules/table/hooks/useCustomTable.js.map +0 -1
  402. package/dist/molecules/table/hooks/useDragnDropRow.d.ts +0 -272
  403. package/dist/molecules/table/hooks/useDragnDropRow.js +0 -40
  404. package/dist/molecules/table/hooks/useDragnDropRow.js.map +0 -1
  405. package/dist/molecules/table/hooks/useOperations.d.ts +0 -11
  406. package/dist/molecules/table/hooks/useOperations.js +0 -25
  407. package/dist/molecules/table/hooks/useOperations.js.map +0 -1
  408. package/dist/molecules/table/index.d.ts +0 -15
  409. package/dist/molecules/table/index.js +0 -35
  410. package/dist/molecules/table/index.js.map +0 -1
  411. package/dist/molecules/table/utils/getPageNumbers.js.map +0 -1
  412. package/dist/molecules/table/utils/swapElements.d.ts +0 -1
  413. package/dist/molecules/table/utils/swapElements.js +0 -5
  414. package/dist/molecules/table/utils/swapElements.js.map +0 -1
  415. package/dist/organisms/form/action/FormAction.js +0 -32
  416. package/dist/organisms/form/action/FormAction.js.map +0 -1
  417. package/dist/organisms/table/forms/components/FormCell.d.ts +0 -6
  418. package/dist/organisms/table/forms/components/FormCell.js +0 -50
  419. package/dist/organisms/table/forms/components/FormCell.js.map +0 -1
  420. package/dist/typings.d.js +0 -2
  421. package/dist/typings.d.js.map +0 -1
  422. package/src/molecules/forms/input-tags/InputTags.stories.tsx +0 -81
  423. package/src/molecules/table/components/DefaultCells.tsx +0 -30
  424. package/src/molecules/table/components/DefaultRow.tsx +0 -52
  425. package/src/molecules/table/components/DragNDropContainer.tsx +0 -7
  426. package/src/molecules/table/filters/DefaultColumnFilter.spec.tsx +0 -33
  427. package/src/molecules/table/filters/DefaultColumnFilter.tsx +0 -38
  428. package/src/molecules/table/filters/SelectColumnFilter.spec.tsx +0 -68
  429. package/src/molecules/table/filters/SelectColumnFilter.tsx +0 -51
  430. package/src/molecules/table/filters/SliderColumnFilter.tsx +0 -28
  431. package/src/molecules/table/hooks/useCustomTable.tsx +0 -268
  432. package/src/molecules/table/hooks/useDragnDropRow.ts +0 -80
  433. package/src/molecules/table/hooks/useOperations.tsx +0 -39
  434. package/src/molecules/table/index.ts +0 -15
  435. package/src/molecules/table/utils/swapElements.spec.ts +0 -7
  436. package/src/molecules/table/utils/swapElements.ts +0 -7
  437. package/src/organisms/form/action/FormAction.stories.tsx +0 -364
  438. package/src/organisms/table/forms/components/FormCell.tsx +0 -47
  439. package/src/typings.d.ts +0 -3
  440. package/tsconfig.app.json +0 -11
  441. package/tsconfig.json +0 -21
  442. package/tsconfig.node.json +0 -13
  443. package/tsconfig.spec.json +0 -14
  444. /package/dist/molecules/{table → pagination}/utils/getPageNumbers.d.ts +0 -0
  445. /package/dist/molecules/{table → pagination}/utils/getPageNumbers.js +0 -0
  446. /package/dist/organisms/form/{action → actions}/FormAction.d.ts +0 -0
  447. /package/src/molecules/{table → pagination}/utils/getPageNumbers.ts +0 -0
@@ -1,4 +1,7 @@
1
- import type { FormOptions } from "../../../interfaces";
1
+ import classnames from "classnames";
2
+ import type { CSSProperties } from "react";
3
+
4
+ import type { FormBuilderOptions, FormOptions } from "../../../interfaces/index.js";
2
5
  import { getComponent } from "../../../registries/components";
3
6
  import { FormBuilder as DefaultFormBuilder } from "./FormBuilder";
4
7
  import { FormEditCTAs as DefaultFormEditCTAs } from "./FormEditCtas";
@@ -7,7 +10,10 @@ import { FormBuilderEvents } from "./useFormBuilder";
7
10
  import { useFormEdit, UseFormEditHookProps } from "./useFormEdit";
8
11
 
9
12
  export interface FormEditProps extends UseFormEditHookProps, FormBuilderEvents {
10
- options?: FormOptions;
13
+ options?: FormBuilderOptions & FormOptions;
14
+ layout?: "html5" | "choicesjs" | "react";
15
+ className?: string;
16
+ style?: CSSProperties;
11
17
  }
12
18
 
13
19
  export function FormEdit({
@@ -17,6 +23,8 @@ export function FormEdit({
17
23
  enableTags,
18
24
  onSubmit: initialOnSubmit,
19
25
  onCopy: initialOnCopy,
26
+ className,
27
+ style,
20
28
  ...props
21
29
  }: FormEditProps) {
22
30
  const { form, isValid, setChange, hasRedo, hasChanged, hasUndo, redo, undo, reset, onSubmit, onCopy } = useFormEdit({
@@ -28,13 +36,12 @@ export function FormEdit({
28
36
  onCopy: initialOnCopy
29
37
  });
30
38
 
31
- const { options = {} } = props;
32
39
  const FormParameters = getComponent<typeof DefaultFormParameters>("FormParameters");
33
40
  const FormBuilder = getComponent<typeof DefaultFormBuilder>("FormBuilder");
34
41
  const FormEditCTAs = getComponent<typeof DefaultFormEditCTAs>("FormEditCTAs");
35
- console.log(FormParameters, FormBuilder, FormEditCTAs);
42
+
36
43
  return (
37
- <div className='form-edit-container'>
44
+ <div className={classnames("form-edit-container", className)} style={style}>
38
45
  <div className='form-edit'>
39
46
  <FormParameters
40
47
  enableTags={enableTags}
@@ -43,10 +50,11 @@ export function FormEdit({
43
50
  key={`form-settings-${form._id}`}
44
51
  form={form}
45
52
  onChange={setChange}
53
+ layout={props.layout}
46
54
  />
47
55
  <FormEditCTAs
48
56
  key={`form-edit-ctas-${form._id}`}
49
- options={options}
57
+ options={props.options}
50
58
  hasRedo={hasRedo}
51
59
  hasUndo={hasUndo}
52
60
  disabled={!(isValid && hasChanged)}
@@ -63,7 +71,7 @@ export function FormEdit({
63
71
  key={`form-builder-${form._id}`}
64
72
  components={form.components!}
65
73
  display={form.display}
66
- options={options}
74
+ options={props.options}
67
75
  onChange={(components) => {
68
76
  setChange("components", components);
69
77
  }}
@@ -1,8 +1,9 @@
1
1
  import { ReactElement } from "react";
2
2
 
3
3
  import { Icon as DefaultIcon } from "../../../atoms/icon/Icon";
4
+ import { useI18n } from "../../../hooks/useI18n";
4
5
  import { useTooltip } from "../../../hooks/useTooltip";
5
- import type { FormOptions } from "../../../interfaces";
6
+ import type { FormOptions } from "../../../interfaces/index.js";
6
7
  import { Button as DefaultButton } from "../../../molecules/button/Button";
7
8
  import { getComponent, registerComponent } from "../../../registries/components";
8
9
 
@@ -22,17 +23,16 @@ export interface FormEditCTAsProps extends Record<string, unknown> {
22
23
  export function FormEditCTAs({
23
24
  saveText = "Save",
24
25
  disabled,
25
- options = {},
26
26
  onCopy,
27
27
  hasUndo,
28
28
  hasRedo,
29
29
  onUndo,
30
30
  onRedo,
31
31
  onReset,
32
- onSubmit
32
+ onSubmit,
33
+ options
33
34
  }: FormEditCTAsProps): ReactElement {
34
- const { i18n: t = (t: string): string => t } = options;
35
-
35
+ const { t } = useI18n(options?.i18n);
36
36
  const copyTooltipRef: any = useTooltip({
37
37
  trigger: "hover",
38
38
  placement: "top",
@@ -64,29 +64,29 @@ export function FormEditCTAs({
64
64
  <div className={"form-edit__actions"}>
65
65
  <div>
66
66
  <Button variant='primary' className='btn-save' disabled={disabled} onClick={() => onSubmit?.()}>
67
- <Icon name='save' iconset={options.iconset} />
67
+ <Icon name='save' iconset={options?.iconset} />
68
68
  {saveText}
69
69
  </Button>
70
70
 
71
71
  <div>
72
72
  <Button variant='light' className='btn-undo' disabled={!hasUndo} onClick={() => onUndo?.()} ref={undoTooltipRef}>
73
- <Icon name='undo' iconset={options.iconset} />
73
+ <Icon name='undo' iconset={options?.iconset} />
74
74
  </Button>
75
75
 
76
76
  <Button variant='light' className='btn-redo' disabled={!hasRedo} onClick={() => onRedo?.()} ref={redoTooltipRef}>
77
- <Icon name='redo' iconset={options.iconset} />
77
+ <Icon name='redo' iconset={options?.iconset} />
78
78
  </Button>
79
79
  </div>
80
80
 
81
81
  <div>
82
82
  {onCopy && (
83
83
  <Button variant='light' className='btn-copy' onClick={() => onCopy()} ref={copyTooltipRef}>
84
- <Icon name='copy' iconset={options.iconset} />
84
+ <Icon name='copy' iconset={options?.iconset} />
85
85
  </Button>
86
86
  )}
87
87
 
88
88
  <Button variant='light' className='btn-reset' onClick={() => onReset && onReset()} ref={resetTooltipRef!}>
89
- <Icon name='reset' iconset={options.iconset} />
89
+ <Icon name='reset' iconset={options?.iconset} />
90
90
  </Button>
91
91
  </div>
92
92
  </div>
@@ -1,7 +1,7 @@
1
1
  import { ReactElement } from "react";
2
2
 
3
3
  import type { FormType } from "../../../interfaces";
4
- import { InputTags } from "../../../molecules/forms/input-tags/InputTags";
4
+ import { InputTags as DefaultInputTags } from "../../../molecules/forms/input-tags/InputTags";
5
5
  import { InputText as DefaultInputText } from "../../../molecules/forms/input-text/InputText";
6
6
  import { Select as DefaultSelect } from "../../../molecules/forms/select/Select";
7
7
  import { getComponent, registerComponent } from "../../../registries/components";
@@ -13,13 +13,14 @@ export const defaultDisplayChoices = [
13
13
  ];
14
14
 
15
15
  export interface FormParametersProps {
16
- onChange?: (name: string, value: any) => void;
16
+ onChange?: (name: string | undefined, value: any) => void;
17
17
  form: Partial<FormType>;
18
18
  typeChoices?: { label: string; value: any }[];
19
19
  displayChoices?: { label: string; value: any }[];
20
20
  enableTags?: boolean;
21
21
  className?: string;
22
22
  baseUrl?: string;
23
+ layout?: "html5" | "choicesjs" | "react";
23
24
  readonly?: Record<string, boolean>;
24
25
  }
25
26
 
@@ -31,12 +32,14 @@ export function FormParameters({
31
32
  displayChoices = defaultDisplayChoices,
32
33
  className = "",
33
34
  readonly = {},
35
+ layout,
34
36
  baseUrl = window.location.origin
35
37
  }: FormParametersProps): ReactElement {
36
38
  const hasTypeChoices = typeChoices && typeChoices.length > 1;
37
39
 
38
40
  const InputText = getComponent<typeof DefaultInputText>("InputText");
39
41
  const Select = getComponent<typeof DefaultSelect>("Select");
42
+ const InputTags = getComponent<typeof DefaultInputTags>("InputTags");
40
43
 
41
44
  return (
42
45
  <div className={`form-edit__settings ${className}`}>
@@ -83,6 +86,7 @@ export function FormParameters({
83
86
  </div>
84
87
  <div>
85
88
  <Select
89
+ layout={layout}
86
90
  label={"Display as"}
87
91
  name={"display"}
88
92
  disabled={readonly["display"]}
@@ -93,12 +97,12 @@ export function FormParameters({
93
97
  </div>
94
98
  {hasTypeChoices && (
95
99
  <div>
96
- <Select label={"Type"} name={"type"} value={form.type} options={typeChoices} onChange={onChange} />
100
+ <Select layout={layout} label={"Type"} name={"type"} value={form.type} options={typeChoices} onChange={onChange} />
97
101
  </div>
98
102
  )}
99
103
  {enableTags && (
100
104
  <div>
101
- <InputTags label={"Tags"} name={"tags"} value={form.tags} onChange={onChange} />
105
+ <InputTags layout={layout} label={"Tags"} name={"tags"} value={form.tags} onChange={onChange} />
102
106
  </div>
103
107
  )}
104
108
  </div>
@@ -3,7 +3,11 @@ import "../../../molecules/button/Button";
3
3
  import "../../../molecules/forms/input-text/InputText";
4
4
  import "../../../molecules/forms/select/Select";
5
5
  import "../../../molecules/forms/select/components/HtmlSelect";
6
+ import "../../../molecules/forms/select/components/ChoicesSelect";
7
+ import "../../../molecules/forms/select/components/ReactSelect";
6
8
  import "../../../molecules/forms/input-tags/InputTags";
9
+ import "../../../molecules/forms/input-tags/components/ReactTags";
10
+ import "../../../molecules/forms/input-tags/components/ChoicesTags";
7
11
 
8
12
  export * from "./FormBuilder";
9
13
  export * from "./FormEdit";
@@ -1,11 +1,11 @@
1
- import { FormBuilder as FormioFormBuilder } from "formiojs";
1
+ import { FormBuilder as FormioFormBuilder } from "@formio/js";
2
2
  import cloneDeep from "lodash/cloneDeep";
3
3
  import { useEffect, useRef, useState } from "react";
4
4
 
5
- import type { ComponentType, FormOptions, FormType } from "../../../interfaces";
5
+ import type { ComponentType, FormBuilderOptions, FormType } from "../../../interfaces";
6
6
 
7
7
  interface BuilderConstructor {
8
- new (element: HTMLDivElement, form: FormType, options: FormOptions): FormioFormBuilder;
8
+ new (element: HTMLDivElement, form: FormType, options: FormBuilderOptions): FormioFormBuilder;
9
9
  }
10
10
 
11
11
  const EVENTS = [
@@ -29,7 +29,7 @@ async function createBuilder(el: Element, { components = [], display, options, o
29
29
  components: [...components]
30
30
  };
31
31
 
32
- const builder = await new FormioFormBuilder(el, form, { ...options }).ready;
32
+ const builder = await new FormioFormBuilder(el as HTMLElement, form, { ...options }).ready;
33
33
 
34
34
  const handleEvent = (event: string) => {
35
35
  return (...args: any[]) => {
@@ -45,6 +45,7 @@ async function createBuilder(el: Element, { components = [], display, options, o
45
45
 
46
46
  return builder;
47
47
  }
48
+
48
49
  export interface FormBuilderEvents {
49
50
  onAddComponent?: Function;
50
51
  onRemoveComponent?: Function;
@@ -73,7 +74,7 @@ export interface UseFormBuilderProps extends FormBuilderEvents {
73
74
  Builder?: BuilderConstructor;
74
75
  components: ComponentType[];
75
76
  display?: string;
76
- options?: FormOptions;
77
+ options?: FormBuilderOptions;
77
78
  }
78
79
 
79
80
  export function useFormBuilder({ components, display, options = {}, onBuilderReady, onChange, ...props }: UseFormBuilderProps) {
@@ -111,7 +112,7 @@ export function useFormBuilder({ components, display, options = {}, onBuilderRea
111
112
 
112
113
  useEffect(() => {
113
114
  if (builderRef.current) {
114
- if (display !== builderRef.current.form.display) {
115
+ if (display !== (builderRef.current.form as FormType).display) {
115
116
  createBuilder(renderElement.current!.firstChild as Element, {
116
117
  display,
117
118
  options: { ...options },
@@ -124,7 +125,11 @@ export function useFormBuilder({ components, display, options = {}, onBuilderRea
124
125
  onBuilderReady && onBuilderReady(builderRef.current);
125
126
  })
126
127
  .catch((er) => {
127
- console.error(er);
128
+ console.error({
129
+ event: "FORM_BUILDER_RECREATE_ERROR",
130
+ message: er.message,
131
+ stack: er.stack
132
+ });
128
133
  });
129
134
  } else if (components !== currentComponents) {
130
135
  builderRef.current.form = {
@@ -28,7 +28,7 @@ export function useFormEdit(props: UseFormEditHookProps) {
28
28
  };
29
29
 
30
30
  useEffect(() => {
31
- if (props.form && (current._id !== props.form._id || current.modified !== props.form.modified)) {
31
+ if (props.form && (current?._id !== props.form._id || current.modified !== props.form.modified)) {
32
32
  dispatchFormAction({ type: "replaceForm", value: props.form });
33
33
  }
34
34
  }, [props.form]);
@@ -43,8 +43,8 @@ export function useFormEdit(props: UseFormEditHookProps) {
43
43
  const undo = () => dispatchFormAction({ type: "undo" });
44
44
  const reset = () => dispatchFormAction({ type: "reset" });
45
45
 
46
- const setChange = (path: string, value: any) => {
47
- formChange({ ...current, [path]: value });
46
+ const setChange = (path: string | undefined, value: any) => {
47
+ formChange({ ...current, [path!]: value });
48
48
  };
49
49
 
50
50
  return {
@@ -0,0 +1,68 @@
1
+ import "../../../molecules/card/Card.js";
2
+ import "../../../atoms/icon/Icon.js";
3
+
4
+ import { Meta, StoryObj } from "@storybook/react-vite";
5
+
6
+ import { FormExport } from "./FormExport.js";
7
+
8
+ /**
9
+ * FormExport component displays options to export form schema and submissions
10
+ */
11
+ export default {
12
+ title: "form/export/FormExport",
13
+ component: FormExport,
14
+ argTypes: {
15
+ i18n: {
16
+ description: "Internationalization function"
17
+ },
18
+ onClick: {
19
+ action: "clicked",
20
+ description: "Callback when an export button is clicked"
21
+ }
22
+ },
23
+ parameters: {
24
+ docs: {
25
+ description: {
26
+ component: "Component that displays options to export form schema as JSON and form submissions as JSON or CSV."
27
+ }
28
+ }
29
+ }
30
+ } satisfies Meta<typeof FormExport>;
31
+
32
+ type Story = StoryObj<typeof FormExport>;
33
+
34
+ /**
35
+ * Default view with form type set to "form"
36
+ */
37
+ export const Usage: Story = {
38
+ args: {
39
+ i18n: {},
40
+ onClick: (action: string, format: string) => console.log(`Action: ${action}, Format: ${format}`)
41
+ }
42
+ };
43
+
44
+ /**
45
+ * View with form type set to "resource"
46
+ */
47
+ export const Resource: Story = {
48
+ args: {
49
+ i18n: {},
50
+ onClick: (action: string, format: string) => console.log(`Action: ${action}, Format: ${format}`)
51
+ }
52
+ };
53
+
54
+ /**
55
+ * View with custom i18n function
56
+ */
57
+ export const Translated: Story = {
58
+ args: {
59
+ i18n: {
60
+ "Export schema": "Exporter le schéma",
61
+ "Export the formIO schema:": "Exporter le schéma formIO :",
62
+ Json: "Json",
63
+ Csv: "Csv",
64
+ "Export form submissions": "Exporter les soumissions du formulaire"
65
+ },
66
+ onClick: (action: string, format: string) => console.log(`Action: ${action}, Format: ${format}`)
67
+ }
68
+ };
@@ -0,0 +1,61 @@
1
+ import { Icon } from "../../../atoms/icon/Icon.js";
2
+ import { useI18n } from "../../../hooks/useI18n.js";
3
+ import { FormOptions } from "../../../interfaces/FormOptions.js";
4
+ import type { Card } from "../../../molecules/card/Card.js";
5
+ import { getComponent } from "../../../registries/components.js";
6
+
7
+ export interface FormExportProps {
8
+ i18n?: FormOptions["i18n"];
9
+ onClick?: (action: "export:form" | "export:submissions", format: "json" | "csv") => void;
10
+ }
11
+
12
+ export function FormExport({ onClick, ...props }: FormExportProps) {
13
+ const FCard = getComponent<typeof Card>("Card");
14
+ const { t } = useI18n(props?.i18n);
15
+
16
+ return (
17
+ <div>
18
+ <div className={"flex gap-3"}>
19
+ <div className={"sm:w-1/2"}>
20
+ <FCard
21
+ label={
22
+ (
23
+ <span className={"flex items-center"}>
24
+ <Icon name={"detail"} className={"mr-1 text-secondary"} /> {t(`Export schema`)}
25
+ </span>
26
+ ) as any
27
+ }
28
+ >
29
+ <p className={"mb-5"}>{t("Export the formIO schema:")}</p>
30
+ <div className={"flex items-center justify-center"}>
31
+ <button className={"btn btn-primary"} onClick={() => onClick?.("export:form", "json")}>
32
+ <Icon name={"code"} className={"mr-1"} /> {t(`Json`)}
33
+ </button>
34
+ </div>
35
+ </FCard>
36
+ </div>
37
+ <div className={"sm:w-1/2"}>
38
+ <FCard
39
+ label={
40
+ (
41
+ <span className={"flex items-center"}>
42
+ <Icon name={"data"} className={"mr-1 text-secondary"} /> {t(`Export submissions`)}
43
+ </span>
44
+ ) as any
45
+ }
46
+ >
47
+ <p className={"mb-5"}>{t("Export all submission as JSON or CSV:")}</p>
48
+ <div className={"flex items-center justify-center"}>
49
+ <button className={"btn btn-primary mr-4"} onClick={() => onClick?.("export:submissions", "json")}>
50
+ <Icon name={"code"} className={"mr-1"} /> {t(`Json`)}
51
+ </button>
52
+ <button className={"btn btn-primary"} onClick={() => onClick?.("export:submissions", "csv")}>
53
+ <Icon name={"spreadsheet"} className={"mr-1"} /> {t(`Csv`)}
54
+ </button>
55
+ </div>
56
+ </FCard>
57
+ </div>
58
+ </div>
59
+ </div>
60
+ );
61
+ }
@@ -0,0 +1,58 @@
1
+ import "../../../molecules/card/Card.js";
2
+ import "../Form.js";
3
+
4
+ import { Meta, StoryObj } from "@storybook/react-vite";
5
+
6
+ import formFirstname from "../../__fixtures__/form-firstname.fixture.json";
7
+ import { FormPreview } from "./FormPreview.js";
8
+
9
+ /**
10
+ * FormPreview component displays a form preview inside a card with a background
11
+ */
12
+ export default {
13
+ title: "form/preview/FormPreview",
14
+ component: FormPreview,
15
+ argTypes: {
16
+ form: {
17
+ description: "The form object to preview",
18
+ control: "object"
19
+ },
20
+ i18n: {
21
+ description: "Internationalization function"
22
+ }
23
+ },
24
+ parameters: {
25
+ docs: {
26
+ description: {
27
+ component: "Component that displays a form preview inside a card with a background."
28
+ }
29
+ }
30
+ }
31
+ } satisfies Meta<typeof FormPreview>;
32
+
33
+ type Story = StoryObj<typeof FormPreview>;
34
+
35
+ /**
36
+ * Basic form preview with a simple form
37
+ */
38
+ export const Usage: Story = {
39
+ args: {
40
+ form: formFirstname as any,
41
+ i18n: {}
42
+ }
43
+ };
44
+
45
+ /**
46
+ * Form preview with custom translations
47
+ */
48
+ export const Translated: Story = {
49
+ args: {
50
+ form: formFirstname as any,
51
+ i18n: {
52
+ "Form with First Name": "Formulaire avec prénom",
53
+ "First name": "Prénom",
54
+ "Last name": "Nom de famille",
55
+ Submit: "Soumettre"
56
+ }
57
+ }
58
+ };
@@ -0,0 +1,23 @@
1
+ import { useI18n } from "../../../hooks/useI18n.js";
2
+ import type { FormOptions, FormType } from "../../../interfaces/index.js";
3
+ import type { Card } from "../../../molecules/card/Card.js";
4
+ import { getComponent } from "../../../registries/components.js";
5
+ import { Form } from "../Form.js";
6
+
7
+ export interface FormPreviewProps {
8
+ form: FormType;
9
+ i18n?: FormOptions["i18n"];
10
+ }
11
+
12
+ export function FormPreview({ form, ...props }: FormPreviewProps) {
13
+ const { t } = useI18n(props?.i18n);
14
+ const FCard = getComponent<typeof Card>("Card");
15
+
16
+ return (
17
+ <div className='p-10 bg-gray-500'>
18
+ <FCard label={t(form.title || "")} className={"shadow"}>
19
+ <Form form={form} options={{ i18n: props.i18n }} />
20
+ </FCard>
21
+ </div>
22
+ );
23
+ }
@@ -51,7 +51,9 @@ describe("FormSettings", () => {
51
51
  <FormSettings
52
52
  {...Sandbox.args}
53
53
  options={{
54
- i18n: (f: string) => f + " i18N"
54
+ i18n: {
55
+ "Save settings": "Save settings i18N"
56
+ }
55
57
  }}
56
58
  />
57
59
  );
@@ -56,6 +56,6 @@ Sandbox.args = {
56
56
  name: "textField",
57
57
  path: "textfield",
58
58
  machineName: "tcspjwhsevrzpcd:textField"
59
- },
60
- options: { template: "tailwind", iconset: "bx" }
59
+ } as any,
60
+ options: { template: "tailwind", iconset: "lu" }
61
61
  };
@@ -2,6 +2,7 @@ import isEqual from "lodash/isEqual";
2
2
  import noop from "lodash/noop";
3
3
  import { useEffect, useState } from "react";
4
4
 
5
+ import { useI18n } from "../../../hooks/useI18n.js";
5
6
  import type { ChangedSubmission, FormOptions, FormType } from "../../../interfaces";
6
7
  import { Form } from "../../form/Form";
7
8
  import { getFormSettingsSchema } from "./FormSettings.schema";
@@ -13,7 +14,7 @@ export interface FormSettingsProps {
13
14
  options?: FormOptions;
14
15
  }
15
16
 
16
- function useFormSettings({ form: formDefinition, onSubmit = noop, options }: FormSettingsProps) {
17
+ function useFormSettings({ form: formDefinition, onSubmit = noop }: FormSettingsProps) {
17
18
  const form = getFormSettingsSchema();
18
19
  const [isValid, setIsValid] = useState(true);
19
20
  const [submission, setSubmission] = useState(() => formSettingsToSubmission(formDefinition));
@@ -33,7 +34,6 @@ function useFormSettings({ form: formDefinition, onSubmit = noop, options }: For
33
34
  }, [formDefinition?._id]);
34
35
 
35
36
  return {
36
- options,
37
37
  form,
38
38
  type: formDefinition.type,
39
39
  submission,
@@ -47,16 +47,16 @@ function useFormSettings({ form: formDefinition, onSubmit = noop, options }: For
47
47
  }
48
48
 
49
49
  export function FormSettings(props: FormSettingsProps) {
50
- const { form, submission, options = {}, onChange, onSubmit, isValid } = useFormSettings(props);
50
+ const { form, submission, onChange, onSubmit, isValid } = useFormSettings(props);
51
51
 
52
- const i18n = options.i18n || ((f: string) => f);
52
+ const { t } = useI18n(props?.options?.i18n);
53
53
 
54
54
  return (
55
55
  <div>
56
- <Form<FormSettingsType> form={form} submission={submission} onChange={onChange} options={options} />
56
+ <Form<FormSettingsType> form={form} submission={submission} onChange={onChange} options={props.options} />
57
57
 
58
58
  <button data-testid='submit' disabled={!isValid} className={"mt-5 btn btn-primary"} onClick={onSubmit} type={"submit"}>
59
- {i18n("Save settings")}
59
+ {t("Save settings")}
60
60
  </button>
61
61
  </div>
62
62
  );
@@ -1,5 +1,5 @@
1
+ import { Form } from "@formio/js";
1
2
  import { EventEmitter2 } from "eventemitter2";
2
- import { Form } from "formiojs";
3
3
  import { type MutableRefObject, useEffect, useRef, useState } from "react";
4
4
 
5
5
  import type { ChangedSubmission, ComponentType, FormOptions, FormType, JSON, SubmissionType } from "../../interfaces";
@@ -13,9 +13,8 @@ export interface UseFormProps<Data extends { [key: string]: JSON } = { [key: str
13
13
  url?: string;
14
14
  form?: FormType;
15
15
  submission?: SubmissionType<Data>;
16
- // TODO: once events is typed correctly in @formio/js options, we can remove this override
17
16
  options?: FormOptions;
18
- FormClass?: any;
17
+ FormClass?: typeof Form;
19
18
  onFormReady?: (instance: Webform) => void;
20
19
  onPrevPage?: (page: number, submission: SubmissionType<Data>) => void;
21
20
  onNextPage?: (page: number, submission: SubmissionType<Data>) => void;
@@ -1,4 +1,4 @@
1
- import { Meta, StoryObj } from "@storybook/react";
1
+ import { Meta, StoryObj } from "@storybook/react-vite";
2
2
 
3
3
  import { useModal } from "../../molecules/modal/Modal";
4
4
  import { RemoveModal, RemoveModalProps } from "./RemoveModal";
@@ -1,6 +1,7 @@
1
1
  import "../../../molecules/forms/select/all.ts";
2
+ import "../../../molecules/table/all.ts";
2
3
 
3
- import { fireEvent, render, screen } from "@testing-library/react";
4
+ import { fireEvent, render, screen, within } from "@testing-library/react";
4
5
  import userEvent from "@testing-library/user-event";
5
6
 
6
7
  import availableActions from "../../__fixtures__/form-actions.json";
@@ -44,12 +45,13 @@ describe("ActionsTable", () => {
44
45
 
45
46
  const btn = screen.getByTestId("action-table-add");
46
47
  const cells = screen.getAllByRole("cell");
47
- const options = screen.getAllByRole("option");
48
+ const options = within(screen.getByTestId("action-table-select")).getAllByRole("option");
48
49
 
49
50
  expect(btn).toHaveProperty("disabled");
50
51
  expect(btn.innerHTML).toMatch("Add action");
51
52
  expect(cells[0].innerHTML).toMatch("Save Submission");
52
- expect(options.length).toEqual(availableActions.length + 1);
53
+
54
+ expect(options.length).toEqual(17);
53
55
 
54
56
  expect(options[0].innerHTML).toMatch("Select an action");
55
57
  expect(options[1].innerHTML).toMatch("Webhook (Premium)");
@@ -70,9 +72,9 @@ describe("ActionsTable", () => {
70
72
  render(<ActionsTable {...args} onAddAction={onAddAction} />);
71
73
 
72
74
  const btn = screen.getByTestId("action-table-add");
73
- const select = screen.getByRole("combobox");
75
+ const select = screen.getByTestId("action-table-select");
74
76
 
75
- await userEvent.selectOptions(select, String(args.availableActions[1].value));
77
+ await userEvent.selectOptions(select, "sql");
76
78
 
77
79
  fireEvent.click(btn);
78
80