@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,135 @@
1
+ import { useEffect, useMemo, useState } from 'react';
2
+ /**
3
+ * All list-query state for a table: search, sort, filters, query builders,
4
+ * tabs, and pagination — plus the handlers that keep them consistent
5
+ * (changing any criterion resets to page 1; manual filtering clears the tab).
6
+ */
7
+ export function useTableQuery(schema) {
8
+ // Filter defaults come from the schema
9
+ const initialFilters = useMemo(() => {
10
+ const defaults = {};
11
+ schema.filters?.forEach(filter => {
12
+ if (filter.default !== undefined && filter.type !== 'queryBuilder') {
13
+ defaults[filter.name] = filter.default;
14
+ }
15
+ });
16
+ return defaults;
17
+ }, [schema.filters]);
18
+ const initialQueryBuilders = useMemo(() => {
19
+ const defaults = {};
20
+ schema.filters?.forEach(filter => {
21
+ if (filter.type === 'queryBuilder' && Array.isArray(filter.default)) {
22
+ defaults[filter.name] = filter.default;
23
+ }
24
+ });
25
+ return defaults;
26
+ }, [schema.filters]);
27
+ const [searchQuery, setSearchQuery] = useState('');
28
+ const [sortColumn, setSortColumn] = useState(schema.defaultSort?.column);
29
+ const [sortDirection, setSortDirection] = useState(schema.defaultSort?.direction || 'asc');
30
+ const [filters, setFilters] = useState(initialFilters);
31
+ const [queryBuilders, setQueryBuilders] = useState(initialQueryBuilders);
32
+ const [activeTab, setActiveTab] = useState(() => {
33
+ const tabs = schema.tabs;
34
+ return tabs?.find(tab => tab.default === true)?.key ?? null;
35
+ });
36
+ const [currentPage, setCurrentPage] = useState(1);
37
+ const [perPage, setPerPage] = useState(schema.recordsPerPage || 10);
38
+ // Reset filters to defaults when the schema changes
39
+ useEffect(() => {
40
+ setFilters(initialFilters);
41
+ setQueryBuilders(initialQueryBuilders);
42
+ }, [initialFilters, initialQueryBuilders]);
43
+ const handleSearch = (query) => {
44
+ setSearchQuery(query);
45
+ setCurrentPage(1);
46
+ };
47
+ const handleSort = (column) => {
48
+ setSortDirection(sortColumn === column && sortDirection === 'asc' ? 'desc' : 'asc');
49
+ setSortColumn(column);
50
+ setCurrentPage(1);
51
+ };
52
+ const handleFilterChange = (name, value, isQueryBuilder = false) => {
53
+ // Manual filtering clears the active tab
54
+ setActiveTab(null);
55
+ if (isQueryBuilder) {
56
+ setQueryBuilders(prev => {
57
+ const next = { ...prev };
58
+ if (value === undefined || (Array.isArray(value) && value.length === 0)) {
59
+ delete next[name];
60
+ }
61
+ else {
62
+ next[name] = value;
63
+ }
64
+ return next;
65
+ });
66
+ }
67
+ else {
68
+ setFilters(prev => {
69
+ const next = { ...prev };
70
+ if (value === '' || value === undefined) {
71
+ delete next[name];
72
+ }
73
+ else {
74
+ next[name] = value;
75
+ }
76
+ return next;
77
+ });
78
+ }
79
+ setCurrentPage(1);
80
+ };
81
+ const handleTabClick = (tabKey) => {
82
+ setActiveTab(tabKey);
83
+ setCurrentPage(1);
84
+ };
85
+ const handleClearFilters = () => {
86
+ setFilters(initialFilters);
87
+ setQueryBuilders(initialQueryBuilders);
88
+ setCurrentPage(1);
89
+ };
90
+ const handlePageChange = (page) => {
91
+ setCurrentPage(page);
92
+ };
93
+ const handlePageSizeChange = (size) => {
94
+ setPerPage(size);
95
+ setCurrentPage(1);
96
+ };
97
+ const queryParams = useMemo(() => {
98
+ // Merge the active tab's query-builder rules into the request
99
+ const finalQueryBuilders = { ...queryBuilders };
100
+ const tabs = schema.tabs;
101
+ if (activeTab && tabs) {
102
+ const selectedTab = tabs.find(tab => tab.key === activeTab);
103
+ if (selectedTab?.queryBuilder && selectedTab.queryBuilder.length > 0) {
104
+ finalQueryBuilders.__activeTab = selectedTab.queryBuilder;
105
+ }
106
+ }
107
+ return {
108
+ page: currentPage,
109
+ perPage,
110
+ search: searchQuery || undefined,
111
+ sort: sortColumn,
112
+ sortDirection,
113
+ filters,
114
+ queryBuilders: Object.keys(finalQueryBuilders).length > 0 ? finalQueryBuilders : undefined,
115
+ };
116
+ }, [queryBuilders, schema.tabs, activeTab, currentPage, perPage, searchQuery, sortColumn, sortDirection, filters]);
117
+ return {
118
+ searchQuery,
119
+ sortColumn,
120
+ sortDirection,
121
+ filters,
122
+ queryBuilders,
123
+ activeTab,
124
+ currentPage,
125
+ perPage,
126
+ handleSearch,
127
+ handleSort,
128
+ handleFilterChange,
129
+ handleTabClick,
130
+ handleClearFilters,
131
+ handlePageChange,
132
+ handlePageSizeChange,
133
+ queryParams,
134
+ };
135
+ }
@@ -0,0 +1,224 @@
1
+ import { SerializedForm, ValidationRules as KratosJsValidationRules } from '@maxal_studio/kratosjs';
2
+ import { ColumnRegistry } from '../contexts/ColumnRegistryContext';
3
+ import { WidgetComponent } from '../contexts/WidgetRegistryContext';
4
+ import type { CustomBlockComponent } from '../contexts/BlockRegistryContext';
5
+ import type { AuthChallengeRegistry } from '../contexts/AuthChallengeRegistryContext';
6
+ import type { ClientI18nConfig } from '../i18n/buildClientI18n';
7
+ import type { ResolvedSlots } from '../slots/types';
8
+ /**
9
+ * Props passed to all field components
10
+ */
11
+ export interface FieldProps {
12
+ type: string;
13
+ name: string;
14
+ label?: string;
15
+ statePath?: string;
16
+ default?: any;
17
+ hidden?: boolean;
18
+ disabled?: boolean;
19
+ mode?: 'edit' | 'view';
20
+ value?: any;
21
+ extraAttributes?: Record<string, any>;
22
+ validation?: KratosJsValidationRules;
23
+ helperText?: string;
24
+ hint?: string;
25
+ hintIcon?: string;
26
+ hintColor?: string;
27
+ autofocus?: boolean;
28
+ placeholder?: string;
29
+ readOnly?: boolean;
30
+ /** When true, view mode displays the value as HTML (TextInput, Textarea, TagsInput) */
31
+ renderHtml?: boolean;
32
+ inputType?: string;
33
+ minLength?: number;
34
+ maxLength?: number;
35
+ min?: number;
36
+ max?: number;
37
+ step?: number;
38
+ mask?: string;
39
+ prefix?: string;
40
+ suffix?: string;
41
+ options?: Record<string | number, string>;
42
+ multiple?: boolean;
43
+ isMultiple?: boolean;
44
+ searchable?: boolean;
45
+ creatable?: boolean;
46
+ relationship?: {
47
+ name: string;
48
+ titleAttribute: string;
49
+ resource?: string;
50
+ };
51
+ createOptionForm?: any[];
52
+ createOptionModalHeading?: string;
53
+ optionLabelFormatter?: string;
54
+ tags?: string[];
55
+ separator?: string;
56
+ suggestions?: string[];
57
+ /** When true, view mode shows tags in a popup (e.g. "N tags" click to open) */
58
+ showInPopup?: boolean;
59
+ selectablePlaceholder?: boolean;
60
+ rows?: number;
61
+ cols?: number;
62
+ format?: string;
63
+ displayFormat?: string;
64
+ minDate?: string;
65
+ maxDate?: string;
66
+ enableTime?: boolean;
67
+ onColor?: string;
68
+ offColor?: string;
69
+ onIcon?: string;
70
+ offIcon?: string;
71
+ schema?: FieldProps[];
72
+ defaultItems?: number;
73
+ minItems?: number;
74
+ maxItems?: number;
75
+ addable?: boolean;
76
+ deletable?: boolean;
77
+ reorderable?: boolean;
78
+ itemLabel?: string;
79
+ acceptedFileTypes?: string[];
80
+ maxSize?: number;
81
+ minSize?: number;
82
+ maxFiles?: number;
83
+ disk?: string;
84
+ directory?: string;
85
+ visibility?: 'public' | 'private';
86
+ toolbarButtons?: string[];
87
+ fileAttachments?: boolean;
88
+ embeds?: boolean;
89
+ htmlSource?: boolean;
90
+ extensions?: string[];
91
+ heading?: string;
92
+ icon?: string;
93
+ collapsible?: boolean;
94
+ collapsed?: boolean;
95
+ compact?: boolean;
96
+ aside?: boolean;
97
+ columns?: number | Record<string, number>;
98
+ columnSpan?: number | string | Record<string, number | string>;
99
+ columnStart?: number | Record<string, number>;
100
+ required?: boolean;
101
+ /** Operation for conditional visibility (e.g. hidden(context => context.operation === 'view')) */
102
+ operation?: 'create' | 'edit' | 'view';
103
+ [key: string]: any;
104
+ }
105
+ /**
106
+ * Field component type
107
+ */
108
+ export type FieldComponent = React.ComponentType<FieldProps>;
109
+ /**
110
+ * Field registry mapping field types to components
111
+ */
112
+ export type FieldRegistry = Record<string, FieldComponent>;
113
+ /**
114
+ * Props for FormRenderer component
115
+ */
116
+ export interface FormRendererProps {
117
+ schema: SerializedForm;
118
+ onSubmit: (data: any) => void | Promise<void>;
119
+ defaultValues?: Record<string, any>;
120
+ className?: string;
121
+ /** Base URL for API requests (e.g., 'http://localhost:3001/kratosjs/api') */
122
+ apiBaseUrl?: string;
123
+ /** Resource slug for media endpoints (e.g., 'users') */
124
+ resource?: string;
125
+ /** Operation type for conditional field visibility (e.g., 'create' | 'edit' | 'view') */
126
+ operation?: 'create' | 'edit' | 'view';
127
+ /** Children to render inside FormProvider (for watching form values) */
128
+ children?: React.ReactNode;
129
+ }
130
+ /**
131
+ * Props for FieldRenderer component
132
+ */
133
+ export interface FieldRendererProps {
134
+ field: FieldProps;
135
+ }
136
+ /**
137
+ * Validation rules from React Hook Form (converted format)
138
+ */
139
+ export interface RHFValidationRules {
140
+ required?: string | {
141
+ value: boolean;
142
+ message: string;
143
+ };
144
+ pattern?: {
145
+ value: RegExp;
146
+ message: string;
147
+ };
148
+ minLength?: {
149
+ value: number;
150
+ message: string;
151
+ };
152
+ maxLength?: {
153
+ value: number;
154
+ message: string;
155
+ };
156
+ min?: {
157
+ value: number;
158
+ message: string;
159
+ };
160
+ max?: {
161
+ value: number;
162
+ message: string;
163
+ };
164
+ validate?: Record<string, (value: any, formValues?: any) => boolean | string>;
165
+ }
166
+ /**
167
+ * Redirect response from API
168
+ */
169
+ export interface RedirectResponse {
170
+ redirect: string;
171
+ message?: string;
172
+ [key: string]: any;
173
+ }
174
+ /**
175
+ * Type guard to check if response is a redirect response
176
+ */
177
+ export declare function isRedirectResponse(data: any): data is RedirectResponse;
178
+ /**
179
+ * Relation metadata served by GET /:slug/relations, consumed by the view modal
180
+ */
181
+ export interface SerializedRelation {
182
+ name: string;
183
+ type: 'hasMany';
184
+ canCreate?: boolean;
185
+ canEdit?: boolean;
186
+ canDelete?: boolean;
187
+ canView?: boolean;
188
+ resourceSlug: string;
189
+ /** Full API URL for the related resource */
190
+ resourceApiUrl?: string;
191
+ label: string;
192
+ pluralLabel: string;
193
+ icon?: string;
194
+ localKey: string;
195
+ foreignKey: string;
196
+ relatedKey: string;
197
+ groupKey?: string;
198
+ groupLabel?: string;
199
+ groupIcon?: string;
200
+ }
201
+ /**
202
+ * Widget registry mapping widget types to components
203
+ */
204
+ export type WidgetRegistry = Record<string, WidgetComponent>;
205
+ /**
206
+ * Block registry mapping custom block types to components
207
+ */
208
+ export type BlockRegistry = Record<string, CustomBlockComponent>;
209
+ /**
210
+ * Props for AdminPanel component
211
+ */
212
+ export interface AdminPanelProps {
213
+ apiBaseUrl: string;
214
+ panelId?: string;
215
+ customFields?: FieldRegistry;
216
+ customColumns?: ColumnRegistry;
217
+ customWidgets?: WidgetRegistry;
218
+ customBlocks?: BlockRegistry;
219
+ customAuthChallenges?: AuthChallengeRegistry;
220
+ /** Merged, resolved slot contributions keyed by slot name. */
221
+ customSlots?: ResolvedSlots;
222
+ /** i18n config for UI chrome + app frontend strings (server-injected). */
223
+ i18nConfig?: ClientI18nConfig;
224
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Type guard to check if response is a redirect response
3
+ */
4
+ export function isRedirectResponse(data) {
5
+ return typeof data === 'object' && data !== null && typeof data.redirect === 'string';
6
+ }
@@ -0,0 +1,7 @@
1
+ import { ClassValue } from 'clsx';
2
+ /**
3
+ * Utility function to combine class names
4
+ * @param classes Class names to combine
5
+ * @returns Combined class name string
6
+ */
7
+ export declare function cn(...classes: ClassValue[]): string;
@@ -0,0 +1,9 @@
1
+ import clsx from 'clsx';
2
+ /**
3
+ * Utility function to combine class names
4
+ * @param classes Class names to combine
5
+ * @returns Combined class name string
6
+ */
7
+ export function cn(...classes) {
8
+ return clsx(classes);
9
+ }
@@ -0,0 +1,13 @@
1
+ import type { CSSProperties } from 'react';
2
+ interface ColumnMediaSizeOptions {
3
+ width?: number | string;
4
+ height?: number | string;
5
+ ratio?: string;
6
+ circular?: boolean;
7
+ }
8
+ /**
9
+ * Dimensions for image/media/video column thumbnails.
10
+ * Circular columns always render as a true square (1:1) so rounded-full clips a circle.
11
+ */
12
+ export declare function getColumnMediaDimensions(column: ColumnMediaSizeOptions, defaultSize?: number | string): CSSProperties;
13
+ export {};
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Dimensions for image/media/video column thumbnails.
3
+ * Circular columns always render as a true square (1:1) so rounded-full clips a circle.
4
+ */
5
+ export function getColumnMediaDimensions(column, defaultSize = 40) {
6
+ if (column.circular) {
7
+ const raw = column.width ?? column.height ?? defaultSize;
8
+ const size = typeof raw === 'number' ? `${raw}px` : raw;
9
+ return {
10
+ width: size,
11
+ height: size,
12
+ minWidth: size,
13
+ minHeight: size,
14
+ flexShrink: 0,
15
+ aspectRatio: '1 / 1',
16
+ };
17
+ }
18
+ const ratio = column.ratio || '16/9';
19
+ if (column.width) {
20
+ const w = typeof column.width === 'number' ? `${column.width}px` : column.width;
21
+ return { width: w, minWidth: w, flexShrink: 0, aspectRatio: ratio };
22
+ }
23
+ if (column.height) {
24
+ const h = typeof column.height === 'number' ? `${column.height}px` : column.height;
25
+ return { height: h, minHeight: h, flexShrink: 0, aspectRatio: ratio };
26
+ }
27
+ const w = typeof defaultSize === 'number' ? `${defaultSize}px` : defaultSize;
28
+ return { width: w, minWidth: w, flexShrink: 0, aspectRatio: ratio };
29
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Column visibility storage utilities for managing column visibility preferences in localStorage
3
+ */
4
+ export declare const columnVisibilityStorage: {
5
+ /**
6
+ * Get hidden columns for a resource
7
+ * @param resourceKey Unique identifier for the resource (e.g., 'users', 'users_posts')
8
+ * @returns Array of hidden column names, or null if not found (never been set)
9
+ */
10
+ getHiddenColumns(resourceKey: string): string[] | null;
11
+ /**
12
+ * Set hidden columns for a resource
13
+ * @param resourceKey Unique identifier for the resource
14
+ * @param hiddenColumns Array of column names that should be hidden
15
+ */
16
+ setHiddenColumns(resourceKey: string, hiddenColumns: string[]): void;
17
+ /**
18
+ * Clear stored column visibility preferences for a resource
19
+ * @param resourceKey Unique identifier for the resource
20
+ */
21
+ clearHiddenColumns(resourceKey: string): void;
22
+ };
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Column visibility storage utilities for managing column visibility preferences in localStorage
3
+ */
4
+ export const columnVisibilityStorage = {
5
+ /**
6
+ * Get hidden columns for a resource
7
+ * @param resourceKey Unique identifier for the resource (e.g., 'users', 'users_posts')
8
+ * @returns Array of hidden column names, or null if not found (never been set)
9
+ */
10
+ getHiddenColumns(resourceKey) {
11
+ try {
12
+ const key = `kratosjs_column_visibility_${resourceKey}`;
13
+ const stored = localStorage.getItem(key);
14
+ if (stored === null) {
15
+ return null;
16
+ }
17
+ const parsed = JSON.parse(stored);
18
+ if (Array.isArray(parsed)) {
19
+ return parsed;
20
+ }
21
+ return null;
22
+ }
23
+ catch (error) {
24
+ console.warn('Failed to parse column visibility from localStorage:', error);
25
+ return null;
26
+ }
27
+ },
28
+ /**
29
+ * Set hidden columns for a resource
30
+ * @param resourceKey Unique identifier for the resource
31
+ * @param hiddenColumns Array of column names that should be hidden
32
+ */
33
+ setHiddenColumns(resourceKey, hiddenColumns) {
34
+ try {
35
+ const key = `kratosjs_column_visibility_${resourceKey}`;
36
+ localStorage.setItem(key, JSON.stringify(hiddenColumns));
37
+ }
38
+ catch (error) {
39
+ // Handle quota exceeded or other localStorage errors
40
+ if (error instanceof Error && error.name === 'QuotaExceededError') {
41
+ console.warn('localStorage quota exceeded, column visibility preferences not saved');
42
+ }
43
+ else {
44
+ console.warn('Failed to save column visibility to localStorage:', error);
45
+ }
46
+ }
47
+ },
48
+ /**
49
+ * Clear stored column visibility preferences for a resource
50
+ * @param resourceKey Unique identifier for the resource
51
+ */
52
+ clearHiddenColumns(resourceKey) {
53
+ const key = `kratosjs_column_visibility_${resourceKey}`;
54
+ localStorage.removeItem(key);
55
+ },
56
+ };
@@ -0,0 +1,13 @@
1
+ import type { FieldErrors, FieldError } from 'react-hook-form';
2
+ /**
3
+ * Resolve a React Hook Form error by its (possibly nested) field-name path.
4
+ *
5
+ * RHF stores errors for nested / array fields as nested objects — e.g. a field
6
+ * registered as `items.0.name` lives at `errors.items[0].name`, NOT at the flat
7
+ * key `errors['items.0.name']`. Field components therefore can't find the error
8
+ * for a Repeater row (or any dotted name) with a plain `errors[name]` lookup.
9
+ *
10
+ * This walks the dot/bracket path so both flat names (`email`) and nested ones
11
+ * (`items.0.name`, `items[0].name`) resolve correctly.
12
+ */
13
+ export declare function getFieldError(errors: FieldErrors | undefined, name: string | undefined): FieldError | undefined;
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Resolve a React Hook Form error by its (possibly nested) field-name path.
3
+ *
4
+ * RHF stores errors for nested / array fields as nested objects — e.g. a field
5
+ * registered as `items.0.name` lives at `errors.items[0].name`, NOT at the flat
6
+ * key `errors['items.0.name']`. Field components therefore can't find the error
7
+ * for a Repeater row (or any dotted name) with a plain `errors[name]` lookup.
8
+ *
9
+ * This walks the dot/bracket path so both flat names (`email`) and nested ones
10
+ * (`items.0.name`, `items[0].name`) resolve correctly.
11
+ */
12
+ export function getFieldError(errors, name) {
13
+ if (!errors || !name)
14
+ return undefined;
15
+ const segments = name.split(/[.[\]]+/).filter(Boolean);
16
+ let current = errors;
17
+ for (const segment of segments) {
18
+ if (current == null)
19
+ return undefined;
20
+ current = current[segment];
21
+ }
22
+ // A resolved node is an error only when it carries a `type`/`message`; nested
23
+ // containers (e.g. the array node `errors.items`) are not field errors.
24
+ return current && (current.type || current.message) ? current : undefined;
25
+ }
@@ -0,0 +1,28 @@
1
+ import React from 'react';
2
+ /**
3
+ * Utility functions for formatting field values in view mode
4
+ */
5
+ /**
6
+ * Format a date value according to the specified format
7
+ */
8
+ export declare function formatDate(value: any, format?: string): string;
9
+ /**
10
+ * Format a number value with optional options
11
+ */
12
+ export declare function formatNumber(value: any, options?: {
13
+ decimals?: number;
14
+ currency?: string;
15
+ }): string;
16
+ /**
17
+ * Format a boolean value
18
+ */
19
+ export declare function formatBoolean(value: any): string;
20
+ /**
21
+ * Format a select value to display option labels
22
+ */
23
+ export declare function formatSelectLabel(value: any, options?: Record<string | number, string>, isMultiple?: boolean): string;
24
+ /**
25
+ * Format a textarea value preserving line breaks
26
+ * Returns an array of React elements for rendering
27
+ */
28
+ export declare function formatTextarea(value: any): React.ReactNode;
@@ -0,0 +1,109 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { getActiveLocale, translate } from '../i18n/activeLocale';
4
+ /**
5
+ * Utility functions for formatting field values in view mode
6
+ */
7
+ /**
8
+ * Format a date value according to the specified format
9
+ */
10
+ export function formatDate(value, format) {
11
+ if (!value)
12
+ return '-';
13
+ try {
14
+ const date = new Date(value);
15
+ if (isNaN(date.getTime()))
16
+ return String(value);
17
+ if (format) {
18
+ // Simple format support - can be extended
19
+ const year = date.getFullYear();
20
+ const month = String(date.getMonth() + 1).padStart(2, '0');
21
+ const day = String(date.getDate()).padStart(2, '0');
22
+ const hours = String(date.getHours()).padStart(2, '0');
23
+ const minutes = String(date.getMinutes()).padStart(2, '0');
24
+ const seconds = String(date.getSeconds()).padStart(2, '0');
25
+ return format
26
+ .replace('YYYY', String(year))
27
+ .replace('MM', month)
28
+ .replace('DD', day)
29
+ .replace('HH', hours)
30
+ .replace('mm', minutes)
31
+ .replace('ss', seconds);
32
+ }
33
+ return date.toLocaleString(getActiveLocale());
34
+ }
35
+ catch {
36
+ return String(value);
37
+ }
38
+ }
39
+ /**
40
+ * Format a number value with optional options
41
+ */
42
+ export function formatNumber(value, options) {
43
+ if (value === null || value === undefined)
44
+ return '-';
45
+ const num = Number(value);
46
+ if (isNaN(num))
47
+ return String(value);
48
+ if (options?.currency) {
49
+ return new Intl.NumberFormat(getActiveLocale(), {
50
+ style: 'currency',
51
+ currency: options.currency,
52
+ minimumFractionDigits: options.decimals ?? 2,
53
+ maximumFractionDigits: options.decimals ?? 2,
54
+ }).format(num);
55
+ }
56
+ if (options?.decimals !== undefined) {
57
+ return num.toFixed(options.decimals);
58
+ }
59
+ return num.toLocaleString(getActiveLocale());
60
+ }
61
+ /**
62
+ * Format a boolean value
63
+ */
64
+ export function formatBoolean(value) {
65
+ if (value === null || value === undefined)
66
+ return '-';
67
+ return value ? translate('core:common.yes') : translate('core:common.no');
68
+ }
69
+ /**
70
+ * Format a select value to display option labels
71
+ */
72
+ export function formatSelectLabel(value, options, isMultiple) {
73
+ if (!value)
74
+ return '-';
75
+ if (isMultiple && Array.isArray(value)) {
76
+ if (value.length === 0)
77
+ return '-';
78
+ if (!options)
79
+ return value.join(', ');
80
+ return value
81
+ .map(v => {
82
+ const key = String(v);
83
+ return options[key] || key;
84
+ })
85
+ .join(', ');
86
+ }
87
+ if (!options)
88
+ return String(value);
89
+ const key = String(value);
90
+ return options[key] || key;
91
+ }
92
+ /**
93
+ * Format a textarea value preserving line breaks
94
+ * Returns an array of React elements for rendering
95
+ */
96
+ export function formatTextarea(value) {
97
+ if (value === null || value === undefined)
98
+ return '-';
99
+ // If is js object, return json string
100
+ let text = value;
101
+ if (typeof value === 'object') {
102
+ text = JSON.stringify(value, null, 2);
103
+ }
104
+ else {
105
+ text = String(value);
106
+ }
107
+ const lines = text.split('\n');
108
+ return lines.map((line, i) => (_jsxs(React.Fragment, { children: [line, i < lines.length - 1 && _jsx("br", {})] }, i)));
109
+ }