@maxal_studio/kratosjs-react 1.0.0

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 (529) hide show
  1. package/README.md +44 -0
  2. package/dist/FieldRenderer.d.ts +13 -0
  3. package/dist/FieldRenderer.js +62 -0
  4. package/dist/FormRenderer.d.ts +7 -0
  5. package/dist/FormRenderer.js +78 -0
  6. package/dist/TableRenderer.d.ts +2 -0
  7. package/dist/TableRenderer.js +1 -0
  8. package/dist/api/actionsApi.d.ts +23 -0
  9. package/dist/api/actionsApi.js +46 -0
  10. package/dist/api/authenticatedFetch.d.ts +8 -0
  11. package/dist/api/authenticatedFetch.js +31 -0
  12. package/dist/api/exportApi.d.ts +18 -0
  13. package/dist/api/exportApi.js +50 -0
  14. package/dist/api/http.d.ts +24 -0
  15. package/dist/api/http.js +52 -0
  16. package/dist/api/resourceApi.d.ts +37 -0
  17. package/dist/api/resourceApi.js +52 -0
  18. package/dist/api/tableApi.d.ts +83 -0
  19. package/dist/api/tableApi.js +51 -0
  20. package/dist/api/urls.d.ts +19 -0
  21. package/dist/api/urls.js +46 -0
  22. package/dist/app.d.ts +101 -0
  23. package/dist/app.js +89 -0
  24. package/dist/auth/AuthContext.d.ts +22 -0
  25. package/dist/auth/AuthContext.js +147 -0
  26. package/dist/auth/LoginPage.d.ts +10 -0
  27. package/dist/auth/LoginPage.js +179 -0
  28. package/dist/auth/ProtectedRoute.d.ts +12 -0
  29. package/dist/auth/ProtectedRoute.js +22 -0
  30. package/dist/auth/authApiClient.d.ts +24 -0
  31. package/dist/auth/authApiClient.js +95 -0
  32. package/dist/auth/types.d.ts +103 -0
  33. package/dist/auth/types.js +1 -0
  34. package/dist/components/ActionFormModal.d.ts +22 -0
  35. package/dist/components/ActionFormModal.js +8 -0
  36. package/dist/components/AdminPanel.d.ts +11 -0
  37. package/dist/components/AdminPanel.js +194 -0
  38. package/dist/components/Checkbox.d.ts +10 -0
  39. package/dist/components/Checkbox.js +8 -0
  40. package/dist/components/CheckboxField.d.ts +7 -0
  41. package/dist/components/CheckboxField.js +26 -0
  42. package/dist/components/ColorPickerField.d.ts +7 -0
  43. package/dist/components/ColorPickerField.js +26 -0
  44. package/dist/components/DateTimePickerField.d.ts +7 -0
  45. package/dist/components/DateTimePickerField.js +64 -0
  46. package/dist/components/FileUploadField.d.ts +9 -0
  47. package/dist/components/FileUploadField.js +478 -0
  48. package/dist/components/GlobalSearch.d.ts +22 -0
  49. package/dist/components/GlobalSearch.js +181 -0
  50. package/dist/components/GroupField.d.ts +7 -0
  51. package/dist/components/GroupField.js +23 -0
  52. package/dist/components/HiddenField.d.ts +3 -0
  53. package/dist/components/HiddenField.js +10 -0
  54. package/dist/components/ModalBreadcrumb.d.ts +5 -0
  55. package/dist/components/ModalBreadcrumb.js +33 -0
  56. package/dist/components/ModalDrawer.d.ts +15 -0
  57. package/dist/components/ModalDrawer.js +40 -0
  58. package/dist/components/RadioField.d.ts +7 -0
  59. package/dist/components/RadioField.js +26 -0
  60. package/dist/components/RepeaterField.d.ts +3 -0
  61. package/dist/components/RepeaterField.js +191 -0
  62. package/dist/components/ResourceModalRenderer.d.ts +10 -0
  63. package/dist/components/ResourceModalRenderer.js +80 -0
  64. package/dist/components/RichEditorField.d.ts +3 -0
  65. package/dist/components/RichEditorField.js +655 -0
  66. package/dist/components/SectionField.d.ts +9 -0
  67. package/dist/components/SectionField.js +111 -0
  68. package/dist/components/SelectField.d.ts +8 -0
  69. package/dist/components/SelectField.js +523 -0
  70. package/dist/components/TabsField.d.ts +10 -0
  71. package/dist/components/TabsField.js +214 -0
  72. package/dist/components/TagsInputField.d.ts +7 -0
  73. package/dist/components/TagsInputField.js +172 -0
  74. package/dist/components/TextInputField.d.ts +7 -0
  75. package/dist/components/TextInputField.js +44 -0
  76. package/dist/components/TextareaField.d.ts +7 -0
  77. package/dist/components/TextareaField.js +31 -0
  78. package/dist/components/ToggleField.d.ts +7 -0
  79. package/dist/components/ToggleField.js +57 -0
  80. package/dist/components/ViewModal.d.ts +25 -0
  81. package/dist/components/ViewModal.js +159 -0
  82. package/dist/components/blocks/BlockRenderer.d.ts +7 -0
  83. package/dist/components/blocks/BlockRenderer.js +36 -0
  84. package/dist/components/blocks/FormBlockRenderer.d.ts +6 -0
  85. package/dist/components/blocks/FormBlockRenderer.js +110 -0
  86. package/dist/components/blocks/TableBlockRenderer.d.ts +6 -0
  87. package/dist/components/blocks/TableBlockRenderer.js +12 -0
  88. package/dist/components/blocks/TabsBlockRenderer.d.ts +7 -0
  89. package/dist/components/blocks/TabsBlockRenderer.js +11 -0
  90. package/dist/components/blocks/WidgetBlockRenderer.d.ts +6 -0
  91. package/dist/components/blocks/WidgetBlockRenderer.js +11 -0
  92. package/dist/components/columns/CheckboxColumnComponent.d.ts +6 -0
  93. package/dist/components/columns/CheckboxColumnComponent.js +21 -0
  94. package/dist/components/columns/ColorColumnComponent.d.ts +3 -0
  95. package/dist/components/columns/ColorColumnComponent.js +11 -0
  96. package/dist/components/columns/DeeplinkWrapper.d.ts +15 -0
  97. package/dist/components/columns/DeeplinkWrapper.js +85 -0
  98. package/dist/components/columns/IconColumnComponent.d.ts +3 -0
  99. package/dist/components/columns/IconColumnComponent.js +52 -0
  100. package/dist/components/columns/ImageColumnComponent.d.ts +3 -0
  101. package/dist/components/columns/ImageColumnComponent.js +98 -0
  102. package/dist/components/columns/MediaColumnComponent.d.ts +3 -0
  103. package/dist/components/columns/MediaColumnComponent.js +160 -0
  104. package/dist/components/columns/SelectColumnComponent.d.ts +6 -0
  105. package/dist/components/columns/SelectColumnComponent.js +26 -0
  106. package/dist/components/columns/TagsColumnComponent.d.ts +3 -0
  107. package/dist/components/columns/TagsColumnComponent.js +18 -0
  108. package/dist/components/columns/TextColumnComponent.d.ts +11 -0
  109. package/dist/components/columns/TextColumnComponent.js +107 -0
  110. package/dist/components/columns/TextInputColumnComponent.d.ts +6 -0
  111. package/dist/components/columns/TextInputColumnComponent.js +18 -0
  112. package/dist/components/columns/ToggleColumnComponent.d.ts +6 -0
  113. package/dist/components/columns/ToggleColumnComponent.js +25 -0
  114. package/dist/components/columns/VideoColumnComponent.d.ts +3 -0
  115. package/dist/components/columns/VideoColumnComponent.js +125 -0
  116. package/dist/components/columns/ViewColumnComponent.d.ts +3 -0
  117. package/dist/components/columns/ViewColumnComponent.js +7 -0
  118. package/dist/components/errors/ErrorBoundary.d.ts +23 -0
  119. package/dist/components/errors/ErrorBoundary.js +33 -0
  120. package/dist/components/filters/CustomFilterComponent.d.ts +10 -0
  121. package/dist/components/filters/CustomFilterComponent.js +33 -0
  122. package/dist/components/filters/DateFilterComponent.d.ts +15 -0
  123. package/dist/components/filters/DateFilterComponent.js +132 -0
  124. package/dist/components/filters/QueryBuilderFilterComponent.d.ts +11 -0
  125. package/dist/components/filters/QueryBuilderFilterComponent.js +200 -0
  126. package/dist/components/layout/Header.d.ts +10 -0
  127. package/dist/components/layout/Header.js +70 -0
  128. package/dist/components/layout/PanelBrandMark.d.ts +8 -0
  129. package/dist/components/layout/PanelBrandMark.js +28 -0
  130. package/dist/components/layout/Sidebar.d.ts +35 -0
  131. package/dist/components/layout/Sidebar.js +125 -0
  132. package/dist/components/modals/RelationCreateModal.d.ts +19 -0
  133. package/dist/components/modals/RelationCreateModal.js +57 -0
  134. package/dist/components/modals/ResourceFormModal.d.ts +37 -0
  135. package/dist/components/modals/ResourceFormModal.js +44 -0
  136. package/dist/components/modals/useResourceForm.d.ts +40 -0
  137. package/dist/components/modals/useResourceForm.js +138 -0
  138. package/dist/components/modals/view/RecordActions.d.ts +17 -0
  139. package/dist/components/modals/view/RecordActions.js +16 -0
  140. package/dist/components/modals/view/RecordDetails.d.ts +13 -0
  141. package/dist/components/modals/view/RecordDetails.js +29 -0
  142. package/dist/components/modals/view/RelationPanel.d.ts +18 -0
  143. package/dist/components/modals/view/RelationPanel.js +16 -0
  144. package/dist/components/modals/view/RelationTabs.d.ts +32 -0
  145. package/dist/components/modals/view/RelationTabs.js +42 -0
  146. package/dist/components/modals/view/useRecordView.d.ts +18 -0
  147. package/dist/components/modals/view/useRecordView.js +114 -0
  148. package/dist/components/pages/PageRenderer.d.ts +6 -0
  149. package/dist/components/pages/PageRenderer.js +107 -0
  150. package/dist/components/table/ColumnTogglePopup.d.ts +11 -0
  151. package/dist/components/table/ColumnTogglePopup.js +16 -0
  152. package/dist/components/table/GridCard.d.ts +21 -0
  153. package/dist/components/table/GridCard.js +30 -0
  154. package/dist/components/table/GridView.d.ts +23 -0
  155. package/dist/components/table/GridView.js +49 -0
  156. package/dist/components/table/LayoutToggle.d.ts +7 -0
  157. package/dist/components/table/LayoutToggle.js +9 -0
  158. package/dist/components/table/TableActionsDropdown.d.ts +13 -0
  159. package/dist/components/table/TableActionsDropdown.js +46 -0
  160. package/dist/components/table/TableBulkActions.d.ts +11 -0
  161. package/dist/components/table/TableBulkActions.js +21 -0
  162. package/dist/components/table/TableHeader.d.ts +14 -0
  163. package/dist/components/table/TableHeader.js +23 -0
  164. package/dist/components/table/TablePagination.d.ts +13 -0
  165. package/dist/components/table/TablePagination.js +55 -0
  166. package/dist/components/table/TableRow.d.ts +21 -0
  167. package/dist/components/table/TableRow.js +32 -0
  168. package/dist/components/table/TableSearchBar.d.ts +11 -0
  169. package/dist/components/table/TableSearchBar.js +12 -0
  170. package/dist/components/table/TableTabs.d.ts +14 -0
  171. package/dist/components/table/TableTabs.js +8 -0
  172. package/dist/components/ui/Badge.d.ts +6 -0
  173. package/dist/components/ui/Badge.js +12 -0
  174. package/dist/components/ui/Button.d.ts +22 -0
  175. package/dist/components/ui/Button.js +22 -0
  176. package/dist/components/ui/Card.d.ts +7 -0
  177. package/dist/components/ui/Card.js +5 -0
  178. package/dist/components/ui/ConfirmDialog.d.ts +19 -0
  179. package/dist/components/ui/ConfirmDialog.js +45 -0
  180. package/dist/components/ui/EmptyState.d.ts +9 -0
  181. package/dist/components/ui/EmptyState.js +6 -0
  182. package/dist/components/ui/ErrorAlert.d.ts +7 -0
  183. package/dist/components/ui/ErrorAlert.js +9 -0
  184. package/dist/components/ui/Input.d.ts +11 -0
  185. package/dist/components/ui/Input.js +10 -0
  186. package/dist/components/ui/Label.d.ts +5 -0
  187. package/dist/components/ui/Label.js +5 -0
  188. package/dist/components/ui/PillButton.d.ts +14 -0
  189. package/dist/components/ui/PillButton.js +19 -0
  190. package/dist/components/ui/Select.d.ts +7 -0
  191. package/dist/components/ui/Select.js +7 -0
  192. package/dist/components/ui/Spinner.d.ts +8 -0
  193. package/dist/components/ui/Spinner.js +14 -0
  194. package/dist/components/ui/Toast.d.ts +21 -0
  195. package/dist/components/ui/Toast.js +47 -0
  196. package/dist/components/ui/index.d.ts +24 -0
  197. package/dist/components/ui/index.js +12 -0
  198. package/dist/components/utils/HintDisplay.d.ts +11 -0
  199. package/dist/components/utils/HintDisplay.js +12 -0
  200. package/dist/components/utils/Icon.d.ts +22 -0
  201. package/dist/components/utils/Icon.js +22 -0
  202. package/dist/components/utils/MediaPreviewModal.d.ts +14 -0
  203. package/dist/components/utils/MediaPreviewModal.js +32 -0
  204. package/dist/components/utils/ViewFieldWrapper.d.ts +11 -0
  205. package/dist/components/utils/ViewFieldWrapper.js +9 -0
  206. package/dist/components/utils/layoutHelpers.d.ts +19 -0
  207. package/dist/components/utils/layoutHelpers.js +257 -0
  208. package/dist/components/widgets/ChartWidget.d.ts +16 -0
  209. package/dist/components/widgets/ChartWidget.js +192 -0
  210. package/dist/components/widgets/StatsWidget.d.ts +16 -0
  211. package/dist/components/widgets/StatsWidget.js +39 -0
  212. package/dist/components/widgets/WidgetRenderer.d.ts +10 -0
  213. package/dist/components/widgets/WidgetRenderer.js +50 -0
  214. package/dist/components/widgets/WidgetShell.d.ts +9 -0
  215. package/dist/components/widgets/WidgetShell.js +7 -0
  216. package/dist/contexts/AuthChallengeRegistryContext.d.ts +15 -0
  217. package/dist/contexts/AuthChallengeRegistryContext.js +15 -0
  218. package/dist/contexts/BlockRegistryContext.d.ts +18 -0
  219. package/dist/contexts/BlockRegistryContext.js +8 -0
  220. package/dist/contexts/ColumnRegistryContext.d.ts +8 -0
  221. package/dist/contexts/ColumnRegistryContext.js +30 -0
  222. package/dist/contexts/FieldRegistryContext.d.ts +13 -0
  223. package/dist/contexts/FieldRegistryContext.js +46 -0
  224. package/dist/contexts/PanelMetadataContext.d.ts +26 -0
  225. package/dist/contexts/PanelMetadataContext.js +26 -0
  226. package/dist/contexts/PanelProviders.d.ts +27 -0
  227. package/dist/contexts/PanelProviders.js +24 -0
  228. package/dist/contexts/ResourceModalContext.d.ts +26 -0
  229. package/dist/contexts/ResourceModalContext.js +76 -0
  230. package/dist/contexts/SlotRegistryContext.d.ts +19 -0
  231. package/dist/contexts/SlotRegistryContext.js +24 -0
  232. package/dist/contexts/TableRefreshContext.d.ts +10 -0
  233. package/dist/contexts/TableRefreshContext.js +30 -0
  234. package/dist/contexts/WidgetRegistryContext.d.ts +17 -0
  235. package/dist/contexts/WidgetRegistryContext.js +14 -0
  236. package/dist/contexts/createRegistryContext.d.ts +19 -0
  237. package/dist/contexts/createRegistryContext.js +20 -0
  238. package/dist/hooks/useAfterStateUpdated.d.ts +6 -0
  239. package/dist/hooks/useAfterStateUpdated.js +62 -0
  240. package/dist/hooks/useValidation.d.ts +26 -0
  241. package/dist/hooks/useValidation.js +76 -0
  242. package/dist/i18n/I18nProvider.d.ts +27 -0
  243. package/dist/i18n/I18nProvider.js +101 -0
  244. package/dist/i18n/LocaleSwitcher.d.ts +10 -0
  245. package/dist/i18n/LocaleSwitcher.js +30 -0
  246. package/dist/i18n/activeLocale.d.ts +11 -0
  247. package/dist/i18n/activeLocale.js +34 -0
  248. package/dist/i18n/buildClientI18n.d.ts +28 -0
  249. package/dist/i18n/buildClientI18n.js +67 -0
  250. package/dist/i18n/index.d.ts +11 -0
  251. package/dist/i18n/index.js +9 -0
  252. package/dist/i18n/locales/core/en.d.ts +225 -0
  253. package/dist/i18n/locales/core/en.js +252 -0
  254. package/dist/i18n/locales/core/index.d.ts +2 -0
  255. package/dist/i18n/locales/core/index.js +4 -0
  256. package/dist/i18n/locales/core/sq.d.ts +253 -0
  257. package/dist/i18n/locales/core/sq.js +255 -0
  258. package/dist/i18n/useFormatter.d.ts +18 -0
  259. package/dist/i18n/useFormatter.js +37 -0
  260. package/dist/i18n/useLocale.d.ts +11 -0
  261. package/dist/i18n/useLocale.js +11 -0
  262. package/dist/i18n/useTranslation.d.ts +12 -0
  263. package/dist/i18n/useTranslation.js +12 -0
  264. package/dist/index.d.ts +106 -0
  265. package/dist/index.js +101 -0
  266. package/dist/pages/ResourceListPage.d.ts +8 -0
  267. package/dist/pages/ResourceListPage.js +139 -0
  268. package/dist/plugin.d.ts +79 -0
  269. package/dist/plugin.js +34 -0
  270. package/dist/runtime/conditions.d.ts +35 -0
  271. package/dist/runtime/conditions.js +97 -0
  272. package/dist/runtime/formTraversal.d.ts +25 -0
  273. package/dist/runtime/formTraversal.js +37 -0
  274. package/dist/runtime/serializedFunctions.d.ts +41 -0
  275. package/dist/runtime/serializedFunctions.js +264 -0
  276. package/dist/slots/Slot.d.ts +24 -0
  277. package/dist/slots/Slot.js +29 -0
  278. package/dist/slots/SlotCluster.d.ts +22 -0
  279. package/dist/slots/SlotCluster.js +49 -0
  280. package/dist/slots/index.d.ts +7 -0
  281. package/dist/slots/index.js +4 -0
  282. package/dist/slots/mergeSlots.d.ts +18 -0
  283. package/dist/slots/mergeSlots.js +35 -0
  284. package/dist/slots/types.d.ts +87 -0
  285. package/dist/slots/types.js +30 -0
  286. package/dist/styles.css +1 -0
  287. package/dist/table/TableContext.d.ts +36 -0
  288. package/dist/table/TableContext.js +13 -0
  289. package/dist/table/TableRenderer.d.ts +29 -0
  290. package/dist/table/TableRenderer.js +159 -0
  291. package/dist/table/components/FiltersPanel.d.ts +11 -0
  292. package/dist/table/components/FiltersPanel.js +52 -0
  293. package/dist/table/components/TableToolbar.d.ts +28 -0
  294. package/dist/table/components/TableToolbar.js +27 -0
  295. package/dist/table/components/TableToolbarButton.d.ts +6 -0
  296. package/dist/table/components/TableToolbarButton.js +9 -0
  297. package/dist/table/components/TableView.d.ts +12 -0
  298. package/dist/table/components/TableView.js +21 -0
  299. package/dist/table/defaultRowActions.d.ts +21 -0
  300. package/dist/table/defaultRowActions.js +37 -0
  301. package/dist/table/hooks/useColumnVisibility.d.ts +13 -0
  302. package/dist/table/hooks/useColumnVisibility.js +59 -0
  303. package/dist/table/hooks/useEditableRows.d.ts +22 -0
  304. package/dist/table/hooks/useEditableRows.js +63 -0
  305. package/dist/table/hooks/useTableActions.d.ts +54 -0
  306. package/dist/table/hooks/useTableActions.js +313 -0
  307. package/dist/table/hooks/useTableData.d.ts +28 -0
  308. package/dist/table/hooks/useTableData.js +63 -0
  309. package/dist/table/hooks/useTableLayout.d.ts +12 -0
  310. package/dist/table/hooks/useTableLayout.js +31 -0
  311. package/dist/table/hooks/useTableQuery.d.ts +29 -0
  312. package/dist/table/hooks/useTableQuery.js +135 -0
  313. package/dist/types/index.d.ts +224 -0
  314. package/dist/types/index.js +6 -0
  315. package/dist/utils/classNames.d.ts +7 -0
  316. package/dist/utils/classNames.js +9 -0
  317. package/dist/utils/columnMediaDimensions.d.ts +13 -0
  318. package/dist/utils/columnMediaDimensions.js +29 -0
  319. package/dist/utils/columnVisibilityStorage.d.ts +22 -0
  320. package/dist/utils/columnVisibilityStorage.js +56 -0
  321. package/dist/utils/fieldErrors.d.ts +13 -0
  322. package/dist/utils/fieldErrors.js +25 -0
  323. package/dist/utils/formatValue.d.ts +28 -0
  324. package/dist/utils/formatValue.js +109 -0
  325. package/dist/utils/layoutStorage.d.ts +23 -0
  326. package/dist/utils/layoutStorage.js +53 -0
  327. package/dist/utils/redirectHandler.d.ts +7 -0
  328. package/dist/utils/redirectHandler.js +25 -0
  329. package/dist/utils/tableFormatters.d.ts +14 -0
  330. package/dist/utils/tableFormatters.js +93 -0
  331. package/dist/utils/widgetVisibilityStorage.d.ts +11 -0
  332. package/dist/utils/widgetVisibilityStorage.js +39 -0
  333. package/package.json +101 -0
  334. package/src/FieldRenderer.test.tsx +44 -0
  335. package/src/FieldRenderer.tsx +104 -0
  336. package/src/FormRenderer.containers.test.tsx +121 -0
  337. package/src/FormRenderer.test.tsx +174 -0
  338. package/src/FormRenderer.tsx +140 -0
  339. package/src/TableRenderer.tsx +2 -0
  340. package/src/api/actionsApi.ts +76 -0
  341. package/src/api/authenticatedFetch.ts +40 -0
  342. package/src/api/exportApi.ts +66 -0
  343. package/src/api/http.test.ts +58 -0
  344. package/src/api/http.ts +68 -0
  345. package/src/api/resourceApi.ts +88 -0
  346. package/src/api/tableApi.test.ts +108 -0
  347. package/src/api/tableApi.ts +107 -0
  348. package/src/api/urls.ts +50 -0
  349. package/src/app.test.tsx +67 -0
  350. package/src/app.tsx +181 -0
  351. package/src/auth/AuthContext.tsx +188 -0
  352. package/src/auth/LoginPage.tsx +380 -0
  353. package/src/auth/ProtectedRoute.tsx +39 -0
  354. package/src/auth/authApiClient.ts +109 -0
  355. package/src/auth/authFlow.test.tsx +168 -0
  356. package/src/auth/types.ts +104 -0
  357. package/src/components/ActionFormModal.tsx +45 -0
  358. package/src/components/AdminPanel.tsx +368 -0
  359. package/src/components/Checkbox.tsx +59 -0
  360. package/src/components/CheckboxField.tsx +88 -0
  361. package/src/components/ColorPickerField.tsx +93 -0
  362. package/src/components/DateTimePickerField.tsx +112 -0
  363. package/src/components/FileUploadField.tsx +841 -0
  364. package/src/components/GlobalSearch.tsx +436 -0
  365. package/src/components/GroupField.tsx +85 -0
  366. package/src/components/HiddenField.tsx +14 -0
  367. package/src/components/ModalBreadcrumb.tsx +74 -0
  368. package/src/components/ModalDrawer.tsx +137 -0
  369. package/src/components/RadioField.tsx +80 -0
  370. package/src/components/RepeaterField.tsx +546 -0
  371. package/src/components/ResourceModalRenderer.tsx +144 -0
  372. package/src/components/RichEditorField.tsx +942 -0
  373. package/src/components/SectionField.tsx +242 -0
  374. package/src/components/SelectField.tsx +843 -0
  375. package/src/components/TabsField.test.tsx +151 -0
  376. package/src/components/TabsField.tsx +386 -0
  377. package/src/components/TagsInputField.tsx +411 -0
  378. package/src/components/TextInputField.tsx +91 -0
  379. package/src/components/TextareaField.tsx +110 -0
  380. package/src/components/ToggleField.tsx +126 -0
  381. package/src/components/ViewModal.tsx +353 -0
  382. package/src/components/blocks/BlockRenderer.tsx +56 -0
  383. package/src/components/blocks/FormBlockRenderer.tsx +160 -0
  384. package/src/components/blocks/TableBlockRenderer.tsx +33 -0
  385. package/src/components/blocks/TabsBlockRenderer.tsx +49 -0
  386. package/src/components/blocks/WidgetBlockRenderer.tsx +19 -0
  387. package/src/components/columns/CheckboxColumnComponent.tsx +38 -0
  388. package/src/components/columns/ColorColumnComponent.tsx +23 -0
  389. package/src/components/columns/CustomColumn.test.tsx +55 -0
  390. package/src/components/columns/DeeplinkWrapper.tsx +103 -0
  391. package/src/components/columns/IconColumnComponent.tsx +55 -0
  392. package/src/components/columns/ImageColumnComponent.tsx +220 -0
  393. package/src/components/columns/MediaColumnComponent.tsx +294 -0
  394. package/src/components/columns/SelectColumnComponent.tsx +49 -0
  395. package/src/components/columns/TagsColumnComponent.tsx +46 -0
  396. package/src/components/columns/TextColumnComponent.tsx +191 -0
  397. package/src/components/columns/TextInputColumnComponent.tsx +35 -0
  398. package/src/components/columns/ToggleColumnComponent.tsx +56 -0
  399. package/src/components/columns/VideoColumnComponent.tsx +236 -0
  400. package/src/components/columns/ViewColumnComponent.tsx +9 -0
  401. package/src/components/errors/ErrorBoundary.tsx +58 -0
  402. package/src/components/filters/CustomFilterComponent.tsx +130 -0
  403. package/src/components/filters/DateFilterComponent.tsx +272 -0
  404. package/src/components/filters/QueryBuilderFilterComponent.tsx +502 -0
  405. package/src/components/layout/Header.tsx +212 -0
  406. package/src/components/layout/PanelBrandMark.tsx +61 -0
  407. package/src/components/layout/Sidebar.tsx +283 -0
  408. package/src/components/modals/RelationCreateModal.tsx +107 -0
  409. package/src/components/modals/ResourceFormModal.test.tsx +119 -0
  410. package/src/components/modals/ResourceFormModal.tsx +128 -0
  411. package/src/components/modals/useResourceForm.ts +207 -0
  412. package/src/components/modals/view/RecordActions.tsx +69 -0
  413. package/src/components/modals/view/RecordDetails.tsx +60 -0
  414. package/src/components/modals/view/RelationPanel.tsx +76 -0
  415. package/src/components/modals/view/RelationTabs.tsx +145 -0
  416. package/src/components/modals/view/useRecordView.ts +134 -0
  417. package/src/components/pages/PageRenderer.tsx +173 -0
  418. package/src/components/table/ColumnTogglePopup.tsx +85 -0
  419. package/src/components/table/GridCard.tsx +155 -0
  420. package/src/components/table/GridView.tsx +138 -0
  421. package/src/components/table/LayoutToggle.tsx +24 -0
  422. package/src/components/table/TableActionsDropdown.tsx +114 -0
  423. package/src/components/table/TableBulkActions.tsx +65 -0
  424. package/src/components/table/TableHeader.tsx +96 -0
  425. package/src/components/table/TablePagination.tsx +169 -0
  426. package/src/components/table/TableRow.tsx +155 -0
  427. package/src/components/table/TableSearchBar.tsx +66 -0
  428. package/src/components/table/TableTabs.tsx +49 -0
  429. package/src/components/ui/Badge.tsx +30 -0
  430. package/src/components/ui/Button.test.tsx +78 -0
  431. package/src/components/ui/Button.tsx +102 -0
  432. package/src/components/ui/Card.tsx +23 -0
  433. package/src/components/ui/ConfirmDialog.tsx +112 -0
  434. package/src/components/ui/EmptyState.tsx +24 -0
  435. package/src/components/ui/ErrorAlert.tsx +37 -0
  436. package/src/components/ui/Input.tsx +48 -0
  437. package/src/components/ui/Label.tsx +15 -0
  438. package/src/components/ui/PillButton.tsx +72 -0
  439. package/src/components/ui/Select.tsx +33 -0
  440. package/src/components/ui/Spinner.tsx +39 -0
  441. package/src/components/ui/Toast.tsx +105 -0
  442. package/src/components/ui/index.ts +24 -0
  443. package/src/components/utils/HintDisplay.tsx +26 -0
  444. package/src/components/utils/Icon.tsx +36 -0
  445. package/src/components/utils/MediaPreviewModal.tsx +114 -0
  446. package/src/components/utils/ViewFieldWrapper.tsx +23 -0
  447. package/src/components/utils/layoutHelpers.ts +267 -0
  448. package/src/components/widgets/ChartWidget.tsx +247 -0
  449. package/src/components/widgets/StatsWidget.tsx +72 -0
  450. package/src/components/widgets/WidgetRenderer.tsx +108 -0
  451. package/src/components/widgets/WidgetShell.tsx +37 -0
  452. package/src/contexts/AuthChallengeRegistryContext.tsx +29 -0
  453. package/src/contexts/BlockRegistryContext.tsx +28 -0
  454. package/src/contexts/ColumnRegistryContext.tsx +38 -0
  455. package/src/contexts/FieldRegistryContext.tsx +56 -0
  456. package/src/contexts/PanelMetadataContext.tsx +60 -0
  457. package/src/contexts/PanelProviders.tsx +85 -0
  458. package/src/contexts/ResourceModalContext.tsx +137 -0
  459. package/src/contexts/SlotRegistryContext.tsx +35 -0
  460. package/src/contexts/TableRefreshContext.tsx +44 -0
  461. package/src/contexts/WidgetRegistryContext.tsx +34 -0
  462. package/src/contexts/createRegistryContext.tsx +29 -0
  463. package/src/hooks/useAfterStateUpdated.ts +70 -0
  464. package/src/hooks/useValidation.test.ts +59 -0
  465. package/src/hooks/useValidation.ts +95 -0
  466. package/src/i18n/I18nProvider.tsx +128 -0
  467. package/src/i18n/LocaleSwitcher.tsx +50 -0
  468. package/src/i18n/activeLocale.ts +39 -0
  469. package/src/i18n/buildClientI18n.ts +101 -0
  470. package/src/i18n/i18n.test.tsx +140 -0
  471. package/src/i18n/index.ts +12 -0
  472. package/src/i18n/locales/core/en.ts +274 -0
  473. package/src/i18n/locales/core/index.ts +5 -0
  474. package/src/i18n/locales/core/sq.ts +275 -0
  475. package/src/i18n/useFormatter.ts +42 -0
  476. package/src/i18n/useLocale.ts +16 -0
  477. package/src/i18n/useTranslation.ts +17 -0
  478. package/src/index.ts +244 -0
  479. package/src/pages/ResourceListPage.tsx +205 -0
  480. package/src/plugin.ts +110 -0
  481. package/src/runtime/conditions.test.ts +99 -0
  482. package/src/runtime/conditions.ts +148 -0
  483. package/src/runtime/formTraversal.ts +41 -0
  484. package/src/runtime/serializedFunctions.test.ts +59 -0
  485. package/src/runtime/serializedFunctions.ts +284 -0
  486. package/src/slots/Slot.test.tsx +89 -0
  487. package/src/slots/Slot.tsx +47 -0
  488. package/src/slots/SlotCluster.test.tsx +95 -0
  489. package/src/slots/SlotCluster.tsx +107 -0
  490. package/src/slots/index.ts +15 -0
  491. package/src/slots/mergeSlots.test.ts +71 -0
  492. package/src/slots/mergeSlots.ts +40 -0
  493. package/src/slots/slotNames.test.ts +21 -0
  494. package/src/slots/types.ts +119 -0
  495. package/src/styles.css +437 -0
  496. package/src/table/TableContext.tsx +41 -0
  497. package/src/table/TableRenderer.test.tsx +197 -0
  498. package/src/table/TableRenderer.tsx +390 -0
  499. package/src/table/components/FiltersPanel.tsx +193 -0
  500. package/src/table/components/TableToolbar.tsx +153 -0
  501. package/src/table/components/TableToolbarButton.tsx +14 -0
  502. package/src/table/components/TableView.tsx +106 -0
  503. package/src/table/defaultRowActions.ts +43 -0
  504. package/src/table/hooks/useColumnVisibility.test.ts +51 -0
  505. package/src/table/hooks/useColumnVisibility.ts +71 -0
  506. package/src/table/hooks/useEditableRows.test.ts +69 -0
  507. package/src/table/hooks/useEditableRows.ts +89 -0
  508. package/src/table/hooks/useTableActions.ts +393 -0
  509. package/src/table/hooks/useTableData.ts +89 -0
  510. package/src/table/hooks/useTableLayout.ts +45 -0
  511. package/src/table/hooks/useTableQuery.test.ts +116 -0
  512. package/src/table/hooks/useTableQuery.ts +172 -0
  513. package/src/test/mockFetch.ts +67 -0
  514. package/src/test/setup.ts +25 -0
  515. package/src/types/index.ts +228 -0
  516. package/src/utils/classNames.ts +10 -0
  517. package/src/utils/columnMediaDimensions.ts +45 -0
  518. package/src/utils/columnVisibilityStorage.ts +55 -0
  519. package/src/utils/fieldErrors.test.ts +35 -0
  520. package/src/utils/fieldErrors.ts +27 -0
  521. package/src/utils/formatValue.test.tsx +65 -0
  522. package/src/utils/formatValue.tsx +117 -0
  523. package/src/utils/layoutStorage.ts +52 -0
  524. package/src/utils/redirectHandler.ts +29 -0
  525. package/src/utils/tableFormatters.test.ts +54 -0
  526. package/src/utils/tableFormatters.ts +104 -0
  527. package/src/utils/widgetVisibilityStorage.ts +38 -0
  528. package/tailwind.config.js +9 -0
  529. package/vite.config.ts +17 -0
@@ -0,0 +1,109 @@
1
+ import { AuthUser, AuthProvider, AuthTokens, LoginCredentials, LoginResult } from './types';
2
+
3
+ /**
4
+ * API client for authentication endpoints.
5
+ * Tokens are managed via HTTP-only cookies set by the server — no localStorage involved.
6
+ */
7
+ export class AuthApiClient {
8
+ constructor(private apiBaseUrl: string) {}
9
+
10
+ async getProviders(): Promise<AuthProvider[]> {
11
+ const response = await fetch(`${this.apiBaseUrl}/auth/providers`, {
12
+ credentials: 'include',
13
+ });
14
+ if (!response.ok) {
15
+ throw new Error('Failed to fetch providers');
16
+ }
17
+ const data = await response.json();
18
+ return data.providers || [];
19
+ }
20
+
21
+ /**
22
+ * Attempt login. Returns a discriminated result: `authenticated` (session cookie set)
23
+ * or `challenge` (a verification step like 2FA is required before tokens are issued).
24
+ */
25
+ async login(provider: string, credentials: LoginCredentials): Promise<LoginResult> {
26
+ const response = await fetch(`${this.apiBaseUrl}/auth/login`, {
27
+ method: 'POST',
28
+ headers: { 'Content-Type': 'application/json' },
29
+ credentials: 'include',
30
+ body: JSON.stringify({ provider, ...credentials }),
31
+ });
32
+
33
+ if (!response.ok) {
34
+ const error = await response.json();
35
+ throw new Error(error.error || 'Login failed');
36
+ }
37
+
38
+ return response.json();
39
+ }
40
+
41
+ /**
42
+ * Respond to a pending login challenge. Returns the next `LoginResult` — either
43
+ * `authenticated` (all steps cleared) or another `challenge` (chained step).
44
+ */
45
+ async verifyChallenge(challengeToken: string, type: string, payload: unknown): Promise<LoginResult> {
46
+ const response = await fetch(`${this.apiBaseUrl}/auth/challenge`, {
47
+ method: 'POST',
48
+ headers: { 'Content-Type': 'application/json' },
49
+ credentials: 'include',
50
+ body: JSON.stringify({ challengeToken, type, payload }),
51
+ });
52
+
53
+ if (!response.ok) {
54
+ const error = await response.json();
55
+ throw new Error(error.error || 'Verification failed');
56
+ }
57
+
58
+ return response.json();
59
+ }
60
+
61
+ async getCurrentUser(): Promise<AuthUser | null> {
62
+ const response = await fetch(`${this.apiBaseUrl}/auth/me`, {
63
+ credentials: 'include',
64
+ });
65
+
66
+ if (!response.ok) {
67
+ if (response.status === 401) {
68
+ const error: any = new Error('Unauthorized');
69
+ error.status = 401;
70
+ throw error;
71
+ }
72
+ throw new Error('Failed to get current user');
73
+ }
74
+
75
+ const data = await response.json();
76
+ return data.user || null;
77
+ }
78
+
79
+ async refreshToken(): Promise<AuthTokens | null> {
80
+ const response = await fetch(`${this.apiBaseUrl}/auth/refresh`, {
81
+ method: 'POST',
82
+ headers: { 'Content-Type': 'application/json' },
83
+ credentials: 'include',
84
+ body: JSON.stringify({}),
85
+ });
86
+
87
+ if (!response.ok) {
88
+ return null;
89
+ }
90
+
91
+ const data = await response.json();
92
+ return data.tokens || null;
93
+ }
94
+
95
+ async logout(): Promise<void> {
96
+ try {
97
+ await fetch(`${this.apiBaseUrl}/auth/logout`, {
98
+ method: 'POST',
99
+ credentials: 'include',
100
+ });
101
+ } catch {
102
+ // Ignore errors — server-side cookie clearing is best-effort
103
+ }
104
+ }
105
+
106
+ getAuthHeaders(): HeadersInit {
107
+ return {};
108
+ }
109
+ }
@@ -0,0 +1,168 @@
1
+ import React from 'react';
2
+ import { describe, expect, it, vi, beforeEach } from 'vitest';
3
+ import { render, screen, waitFor } from '@testing-library/react';
4
+ import userEvent from '@testing-library/user-event';
5
+ import { AuthProvider, useAuth } from './AuthContext';
6
+ import { LoginPage } from './LoginPage';
7
+ import { AuthChallengeRegistryProvider } from '../contexts/AuthChallengeRegistryContext';
8
+ import { resolveRegistries } from '../app';
9
+ import { definePluginClient } from '../plugin';
10
+ import type { AuthChallengeProps } from './types';
11
+
12
+ // Minimal fetch Response stand-in for the auth client.
13
+ function resp(data: any, ok = true, status = 200) {
14
+ return { ok, status, json: async () => data } as Response;
15
+ }
16
+
17
+ const challengeResp = {
18
+ status: 'challenge',
19
+ challenge: { type: '2fa-totp', challengeToken: 'ct-1', data: { hint: 'authenticator' } },
20
+ };
21
+ const authResp = {
22
+ status: 'authenticated',
23
+ user: { id: '1', email: 'alice@example.com' },
24
+ tokens: { expiresIn: 900 },
25
+ };
26
+
27
+ /** Route fetch by URL; /auth/me + /auth/refresh resolve to "not logged in". */
28
+ function makeFetch(routes: { login: () => Response; challenge?: () => Response }) {
29
+ return vi.fn(async (url: string | URL) => {
30
+ const u = String(url);
31
+ if (u.includes('/auth/login')) return routes.login();
32
+ if (u.includes('/auth/challenge')) return (routes.challenge ?? (() => resp(authResp)))();
33
+ if (u.includes('/auth/me')) return resp({}, false, 401);
34
+ if (u.includes('/auth/refresh')) return resp(null, false, 401);
35
+ if (u.includes('/auth/providers'))
36
+ return resp({ providers: [{ name: 'email', label: 'Email', type: 'credentials' }] });
37
+ if (u.includes('/meta')) return resp({ title: 'Test Panel' });
38
+ return resp({}, false, 404);
39
+ });
40
+ }
41
+
42
+ beforeEach(() => {
43
+ if (!window.matchMedia) {
44
+ window.matchMedia = vi.fn().mockImplementation((query: string) => ({
45
+ matches: false,
46
+ media: query,
47
+ onchange: null,
48
+ addEventListener: () => {},
49
+ removeEventListener: () => {},
50
+ addListener: () => {},
51
+ removeListener: () => {},
52
+ dispatchEvent: () => false,
53
+ })) as any;
54
+ }
55
+ });
56
+
57
+ function Consumer() {
58
+ const { user, pendingChallenge, login, verifyChallenge } = useAuth();
59
+ return (
60
+ <div>
61
+ <div data-testid="user">{user ? user.email : 'none'}</div>
62
+ <div data-testid="challenge">{pendingChallenge ? pendingChallenge.type : 'none'}</div>
63
+ <button onClick={() => login('email', { email: 'a@b.c', password: 'x' })}>do-login</button>
64
+ <button onClick={() => verifyChallenge({ code: '123456' })}>do-verify</button>
65
+ </div>
66
+ );
67
+ }
68
+
69
+ describe('AuthContext multi-step login', () => {
70
+ it('a challenge login sets pendingChallenge and leaves the user null', async () => {
71
+ vi.stubGlobal('fetch', makeFetch({ login: () => resp(challengeResp) }));
72
+
73
+ render(
74
+ <AuthProvider apiBaseUrl="/api">
75
+ <Consumer />
76
+ </AuthProvider>,
77
+ );
78
+ await waitFor(() => expect(screen.getByTestId('user').textContent).toBe('none'));
79
+
80
+ await userEvent.click(screen.getByText('do-login'));
81
+
82
+ await waitFor(() => expect(screen.getByTestId('challenge').textContent).toBe('2fa-totp'));
83
+ expect(screen.getByTestId('user').textContent).toBe('none');
84
+ });
85
+
86
+ it('verifying the challenge sets the user and clears pendingChallenge', async () => {
87
+ vi.stubGlobal('fetch', makeFetch({ login: () => resp(challengeResp), challenge: () => resp(authResp) }));
88
+
89
+ render(
90
+ <AuthProvider apiBaseUrl="/api">
91
+ <Consumer />
92
+ </AuthProvider>,
93
+ );
94
+ await waitFor(() => expect(screen.getByTestId('user').textContent).toBe('none'));
95
+
96
+ await userEvent.click(screen.getByText('do-login'));
97
+ await waitFor(() => expect(screen.getByTestId('challenge').textContent).toBe('2fa-totp'));
98
+
99
+ await userEvent.click(screen.getByText('do-verify'));
100
+ await waitFor(() => expect(screen.getByTestId('user').textContent).toBe('alice@example.com'));
101
+ expect(screen.getByTestId('challenge').textContent).toBe('none');
102
+ });
103
+ });
104
+
105
+ describe('LoginPage challenge rendering', () => {
106
+ it('renders the registered challenge component for the pending type', async () => {
107
+ vi.stubGlobal('fetch', makeFetch({ login: () => resp(challengeResp) }));
108
+
109
+ const TotpUI = ({ onSubmit, submitting }: AuthChallengeProps) => (
110
+ <div>
111
+ <div>Enter your authenticator code</div>
112
+ <button onClick={() => onSubmit({ code: '123456' })} disabled={submitting}>
113
+ submit-code
114
+ </button>
115
+ </div>
116
+ );
117
+
118
+ render(
119
+ <AuthProvider apiBaseUrl="/api">
120
+ <AuthChallengeRegistryProvider customAuthChallenges={{ '2fa-totp': TotpUI }}>
121
+ <LoginPage apiBaseUrl="/api" />
122
+ </AuthChallengeRegistryProvider>
123
+ </AuthProvider>,
124
+ );
125
+
126
+ const email = await screen.findByPlaceholderText('you@company.com');
127
+ await userEvent.type(email, 'a@b.c');
128
+ await userEvent.type(screen.getByPlaceholderText('Enter your password'), 'secret');
129
+ await userEvent.click(screen.getByRole('button', { name: 'Sign in' }));
130
+
131
+ expect(await screen.findByText('Enter your authenticator code')).toBeTruthy();
132
+ });
133
+
134
+ it('shows a fallback when no component is registered for the challenge type', async () => {
135
+ vi.stubGlobal('fetch', makeFetch({ login: () => resp(challengeResp) }));
136
+
137
+ render(
138
+ <AuthProvider apiBaseUrl="/api">
139
+ <AuthChallengeRegistryProvider customAuthChallenges={{}}>
140
+ <LoginPage apiBaseUrl="/api" />
141
+ </AuthChallengeRegistryProvider>
142
+ </AuthProvider>,
143
+ );
144
+
145
+ const email = await screen.findByPlaceholderText('you@company.com');
146
+ await userEvent.type(email, 'a@b.c');
147
+ await userEvent.type(screen.getByPlaceholderText('Enter your password'), 'secret');
148
+ await userEvent.click(screen.getByRole('button', { name: 'Sign in' }));
149
+
150
+ expect(await screen.findByText(/No UI is registered for challenge type/)).toBeTruthy();
151
+ });
152
+ });
153
+
154
+ describe('resolveRegistries authChallenges', () => {
155
+ it('merges plugin authChallenges and lets app entries win', () => {
156
+ const PluginUI = () => null;
157
+ const AppUI = () => null;
158
+ const plugin = definePluginClient({ name: '2fa', authChallenges: { '2fa-totp': PluginUI } });
159
+
160
+ const registries = resolveRegistries({
161
+ plugins: [plugin],
162
+ authChallenges: { 'email-code': AppUI },
163
+ });
164
+
165
+ expect(registries.authChallenges['2fa-totp']).toBe(PluginUI);
166
+ expect(registries.authChallenges['email-code']).toBe(AppUI);
167
+ });
168
+ });
@@ -0,0 +1,104 @@
1
+ import type { ComponentType } from 'react';
2
+
3
+ /**
4
+ * Authenticated user interface
5
+ */
6
+ export interface AuthUser {
7
+ /** Unique identifier */
8
+ id: string;
9
+ /** Email address */
10
+ email: string;
11
+ /** Display name */
12
+ name?: string;
13
+ /** Role/title (e.g., 'admin', 'editor') */
14
+ role?: string;
15
+ /** Avatar image URL */
16
+ avatarUrl?: string;
17
+ /** Preferred theme */
18
+ theme?: string;
19
+ /** Provider-specific metadata */
20
+ _auth?: Record<string, any>;
21
+ /** Additional custom fields */
22
+ [key: string]: any;
23
+ }
24
+
25
+ /**
26
+ * Authentication provider configuration
27
+ */
28
+ export interface AuthProvider {
29
+ /** Provider name */
30
+ name: string;
31
+ /** Display label */
32
+ label: string;
33
+ /** Icon name (Lucide) */
34
+ icon?: string;
35
+ /** Provider type */
36
+ type: 'credentials' | 'oauth';
37
+ /** Button styling */
38
+ buttonStyle?: {
39
+ backgroundColor?: string;
40
+ textColor?: string;
41
+ borderColor?: string;
42
+ };
43
+ /** Required fields for credentials type */
44
+ fields?: string[];
45
+ }
46
+
47
+ /**
48
+ * Authentication tokens
49
+ */
50
+ export interface AuthTokens {
51
+ /** JWT access token */
52
+ accessToken: string;
53
+ /** JWT refresh token */
54
+ refreshToken: string;
55
+ /** Access token expiration in seconds */
56
+ expiresIn: number;
57
+ }
58
+
59
+ /**
60
+ * Login credentials
61
+ */
62
+ export interface LoginCredentials {
63
+ email: string;
64
+ password: string;
65
+ }
66
+
67
+ /**
68
+ * A pending login challenge returned by the server (e.g. 2FA). The `challengeToken` is an
69
+ * opaque continuation token the client must echo back to `/auth/challenge` — never decode
70
+ * it for trust decisions. `data` carries non-secret hints for the challenge UI.
71
+ */
72
+ export interface PendingChallenge {
73
+ type: string;
74
+ challengeToken: string;
75
+ data?: unknown;
76
+ }
77
+
78
+ /**
79
+ * Discriminated result of a login attempt or a challenge verification, mirroring the
80
+ * backend `LoginResult`. `authenticated` → the session cookie is set; `challenge` → one or
81
+ * more steps remain and no session cookie was set.
82
+ */
83
+ export type LoginResult =
84
+ | { status: 'authenticated'; user: AuthUser; tokens: { expiresIn: number } }
85
+ | { status: 'challenge'; challenge: PendingChallenge };
86
+
87
+ /**
88
+ * Props passed to a challenge UI component registered under `authChallenges`.
89
+ */
90
+ export interface AuthChallengeProps {
91
+ /** Non-secret data sent by the server with the challenge. */
92
+ data?: unknown;
93
+ /** Submit the user's response; resolves when verified (or rejects on error). */
94
+ onSubmit: (payload: unknown) => Promise<void>;
95
+ /** Abandon the challenge and return to the login form. */
96
+ onCancel: () => void;
97
+ /** Verification error to display, if any. */
98
+ error?: string | null;
99
+ /** Whether a verification request is in flight. */
100
+ submitting?: boolean;
101
+ }
102
+
103
+ /** A React component that renders a challenge step. */
104
+ export type AuthChallengeComponent = ComponentType<AuthChallengeProps>;
@@ -0,0 +1,45 @@
1
+ import React from 'react';
2
+ import { SerializedForm } from '@maxal_studio/kratosjs';
3
+ import { ResourceFormModal } from './modals/ResourceFormModal';
4
+
5
+ export interface ActionFormModalProps {
6
+ isOpen: boolean;
7
+ onClose: () => void;
8
+ actionName: string;
9
+ actionLabel?: string;
10
+ formSchema: SerializedForm;
11
+ recordIds: string[];
12
+ isBulk?: boolean;
13
+ requiresConfirmation?: boolean;
14
+ modalDescription?: string;
15
+ apiBaseUrl: string;
16
+ resourceSlug: string;
17
+ onSuccess?: () => void;
18
+ depth?: number;
19
+ onCloseAll?: () => void;
20
+ }
21
+
22
+ /**
23
+ * Thin wrapper over ResourceFormModal for actions that collect form input.
24
+ */
25
+ export function ActionFormModal(props: ActionFormModalProps) {
26
+ return (
27
+ <ResourceFormModal
28
+ isOpen={props.isOpen}
29
+ onClose={props.onClose}
30
+ mode="action"
31
+ resourceSlug={props.resourceSlug}
32
+ apiBaseUrl={props.apiBaseUrl}
33
+ formSchema={props.formSchema}
34
+ recordIds={props.recordIds}
35
+ actionName={props.actionName}
36
+ actionLabel={props.actionLabel}
37
+ isBulk={props.isBulk}
38
+ requiresConfirmation={props.requiresConfirmation}
39
+ modalDescription={props.modalDescription}
40
+ onSuccess={props.onSuccess}
41
+ depth={props.depth}
42
+ onCloseAll={props.onCloseAll}
43
+ />
44
+ );
45
+ }