@firecms/core 3.0.0-canary.99 → 3.0.0-rc.2

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 (371) hide show
  1. package/README.md +2 -2
  2. package/dist/app/Drawer.d.ts +0 -1
  3. package/dist/app/Scaffold.d.ts +4 -0
  4. package/dist/components/ArrayContainer.d.ts +31 -12
  5. package/dist/components/{DeleteConfirmationDialog.d.ts → ConfirmationDialog.d.ts} +1 -1
  6. package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +3 -1
  7. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +2 -2
  8. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +17 -3
  9. package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +1 -1
  10. package/dist/components/EntityCollectionTable/index.d.ts +1 -1
  11. package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +6 -3
  12. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +8 -0
  13. package/dist/components/EntityCollectionView/utils.d.ts +3 -0
  14. package/dist/components/EntityJsonPreview.d.ts +3 -0
  15. package/dist/components/EntityPreview.d.ts +8 -6
  16. package/dist/components/HomePage/DefaultHomePage.d.ts +2 -15
  17. package/dist/components/HomePage/HomePageDnD.d.ts +76 -0
  18. package/dist/components/HomePage/NavigationCard.d.ts +3 -1
  19. package/dist/components/HomePage/NavigationCardBinding.d.ts +3 -2
  20. package/dist/components/HomePage/NavigationGroup.d.ts +8 -1
  21. package/dist/components/HomePage/RenameGroupDialog.d.ts +9 -0
  22. package/dist/components/PropertyConfigBadge.d.ts +2 -1
  23. package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
  24. package/dist/components/SelectableTable/SelectableTable.d.ts +13 -3
  25. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +1 -1
  26. package/dist/components/UnsavedChangesDialog.d.ts +8 -0
  27. package/dist/components/UserDisplay.d.ts +7 -0
  28. package/dist/components/VirtualTable/VirtualTableProps.d.ts +11 -2
  29. package/dist/components/VirtualTable/fields/VirtualTableUserSelect.d.ts +12 -0
  30. package/dist/components/common/default_entity_actions.d.ts +0 -2
  31. package/dist/components/common/index.d.ts +1 -1
  32. package/dist/components/common/useColumnsIds.d.ts +1 -0
  33. package/dist/components/common/{useDataSourceEntityCollectionTableController.d.ts → useDataSourceTableController.d.ts} +10 -2
  34. package/dist/components/common/useDebouncedCallback.d.ts +1 -0
  35. package/dist/components/common/useScrollRestoration.d.ts +14 -0
  36. package/dist/components/index.d.ts +3 -1
  37. package/dist/contexts/BreacrumbsContext.d.ts +8 -0
  38. package/dist/contexts/InternalUserManagementContext.d.ts +3 -0
  39. package/dist/core/DefaultAppBar.d.ts +8 -2
  40. package/dist/core/DrawerNavigationItem.d.ts +2 -1
  41. package/dist/core/EntityEditView.d.ts +40 -22
  42. package/dist/core/EntityEditViewFormActions.d.ts +2 -0
  43. package/dist/core/FireCMS.d.ts +2 -3
  44. package/dist/core/FireCMSRouter.d.ts +4 -0
  45. package/dist/core/NavigationRoutes.d.ts +0 -1
  46. package/dist/core/SideDialogs.d.ts +4 -2
  47. package/dist/core/field_configs.d.ts +1 -1
  48. package/dist/core/index.d.ts +2 -1
  49. package/dist/form/EntityForm.d.ts +50 -0
  50. package/dist/form/EntityFormActions.d.ts +21 -0
  51. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  52. package/dist/form/components/FormEntry.d.ts +6 -0
  53. package/dist/form/components/FormLayout.d.ts +5 -0
  54. package/dist/form/components/LabelWithIcon.d.ts +1 -1
  55. package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
  56. package/dist/form/components/index.d.ts +3 -1
  57. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
  58. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
  59. package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
  60. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
  61. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  62. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
  63. package/dist/form/field_bindings/{MultiSelectBinding.d.ts → MultiSelectFieldBinding.d.ts} +1 -1
  64. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
  65. package/dist/form/field_bindings/ReferenceAsStringFieldBinding.d.ts +9 -0
  66. package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -2
  67. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
  68. package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
  69. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +4 -10
  70. package/dist/form/field_bindings/SwitchFieldBinding.d.ts +1 -2
  71. package/dist/form/field_bindings/TextFieldBinding.d.ts +1 -1
  72. package/dist/form/field_bindings/UserSelectFieldBinding.d.ts +12 -0
  73. package/dist/form/index.d.ts +17 -16
  74. package/dist/form/useClearRestoreValue.d.ts +2 -2
  75. package/dist/hooks/data/delete.d.ts +4 -4
  76. package/dist/hooks/data/save.d.ts +3 -3
  77. package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
  78. package/dist/hooks/data/useEntityFetch.d.ts +4 -3
  79. package/dist/hooks/index.d.ts +2 -0
  80. package/dist/hooks/useAuthController.d.ts +1 -1
  81. package/dist/hooks/useBreadcrumbsController.d.ts +26 -0
  82. package/dist/hooks/useBuildNavigationController.d.ts +57 -12
  83. package/dist/hooks/useCollapsedGroups.d.ts +9 -0
  84. package/dist/hooks/useFireCMSContext.d.ts +1 -1
  85. package/dist/hooks/useInternalUserManagementController.d.ts +12 -0
  86. package/dist/hooks/useModeController.d.ts +1 -2
  87. package/dist/hooks/useProjectLog.d.ts +7 -1
  88. package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
  89. package/dist/hooks/useValidateAuthenticator.d.ts +3 -3
  90. package/dist/index.es.js +20480 -14434
  91. package/dist/index.es.js.map +1 -1
  92. package/dist/index.umd.js +20250 -14209
  93. package/dist/index.umd.js.map +1 -1
  94. package/dist/internal/useBuildDataSource.d.ts +3 -2
  95. package/dist/internal/useBuildSideEntityController.d.ts +3 -3
  96. package/dist/internal/useUnsavedChangesDialog.d.ts +7 -9
  97. package/dist/preview/PropertyPreviewProps.d.ts +1 -1
  98. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  99. package/dist/preview/components/ReferencePreview.d.ts +2 -2
  100. package/dist/preview/components/UserPreview.d.ts +8 -0
  101. package/dist/preview/index.d.ts +1 -0
  102. package/dist/preview/util.d.ts +3 -3
  103. package/dist/routes/CustomCMSRoute.d.ts +4 -0
  104. package/dist/routes/FireCMSRoute.d.ts +1 -0
  105. package/dist/routes/HomePageRoute.d.ts +3 -0
  106. package/dist/types/analytics.d.ts +1 -1
  107. package/dist/types/auth.d.ts +7 -9
  108. package/dist/types/collections.d.ts +88 -25
  109. package/dist/types/customization_controller.d.ts +8 -0
  110. package/dist/types/datasource.d.ts +19 -17
  111. package/dist/types/dialogs_controller.d.ts +7 -3
  112. package/dist/types/entities.d.ts +7 -2
  113. package/dist/types/entity_actions.d.ts +58 -8
  114. package/dist/types/entity_callbacks.d.ts +16 -16
  115. package/dist/types/entity_overrides.d.ts +2 -2
  116. package/dist/types/export_import.d.ts +4 -4
  117. package/dist/types/fields.d.ts +43 -17
  118. package/dist/types/firecms.d.ts +31 -3
  119. package/dist/types/firecms_context.d.ts +17 -1
  120. package/dist/types/index.d.ts +1 -0
  121. package/dist/types/internal_user_management.d.ts +20 -0
  122. package/dist/types/navigation.d.ts +60 -17
  123. package/dist/types/permissions.d.ts +4 -4
  124. package/dist/types/plugins.d.ts +44 -9
  125. package/dist/types/properties.d.ts +74 -22
  126. package/dist/types/property_config.d.ts +1 -3
  127. package/dist/types/roles.d.ts +3 -0
  128. package/dist/types/side_dialogs_controller.d.ts +10 -0
  129. package/dist/types/side_entity_controller.d.ts +14 -1
  130. package/dist/types/storage.d.ts +75 -0
  131. package/dist/types/user.d.ts +2 -1
  132. package/dist/util/builders.d.ts +3 -3
  133. package/dist/util/callbacks.d.ts +2 -0
  134. package/dist/util/createFormexStub.d.ts +2 -0
  135. package/dist/util/entities.d.ts +2 -2
  136. package/dist/util/entity_actions.d.ts +2 -0
  137. package/dist/util/entity_cache.d.ts +23 -0
  138. package/dist/util/icon_synonyms.d.ts +0 -1
  139. package/dist/util/icons.d.ts +5 -2
  140. package/dist/util/index.d.ts +3 -0
  141. package/dist/util/navigation_from_path.d.ts +10 -1
  142. package/dist/util/navigation_utils.d.ts +13 -1
  143. package/dist/util/objects.d.ts +2 -1
  144. package/dist/util/permissions.d.ts +4 -4
  145. package/dist/util/property_utils.d.ts +4 -4
  146. package/dist/util/references.d.ts +2 -2
  147. package/dist/util/resolutions.d.ts +30 -6
  148. package/dist/util/storage.d.ts +1 -1
  149. package/dist/util/useStorageUploadController.d.ts +2 -2
  150. package/package.json +133 -125
  151. package/src/app/Drawer.tsx +0 -1
  152. package/src/app/Scaffold.tsx +33 -29
  153. package/src/components/ArrayContainer.tsx +447 -229
  154. package/src/components/CircularProgressCenter.tsx +1 -1
  155. package/src/components/ClearFilterSortButton.tsx +1 -1
  156. package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +12 -11
  157. package/src/components/DeleteEntityDialog.tsx +13 -20
  158. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +59 -25
  159. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +23 -17
  160. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +20 -3
  161. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +47 -9
  162. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +21 -16
  163. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +6 -12
  164. package/src/components/EntityCollectionTable/index.tsx +1 -1
  165. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +6 -6
  166. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +35 -26
  167. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +20 -8
  168. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +132 -101
  169. package/src/components/EntityCollectionTable/internal/popup_field/useDraggable.tsx +9 -9
  170. package/src/components/EntityCollectionView/EntityCollectionView.tsx +178 -85
  171. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +7 -4
  172. package/src/components/EntityCollectionView/useSelectionController.tsx +5 -4
  173. package/src/components/EntityCollectionView/utils.ts +19 -0
  174. package/src/components/EntityJsonPreview.tsx +66 -0
  175. package/src/components/EntityPreview.tsx +75 -57
  176. package/src/components/EntityView.tsx +8 -5
  177. package/src/components/ErrorView.tsx +3 -3
  178. package/src/components/FireCMSLogo.tsx +7 -51
  179. package/src/components/HomePage/DefaultHomePage.tsx +506 -161
  180. package/src/components/HomePage/FavouritesView.tsx +9 -14
  181. package/src/components/HomePage/HomePageDnD.tsx +600 -0
  182. package/src/components/HomePage/NavigationCard.tsx +47 -38
  183. package/src/components/HomePage/NavigationCardBinding.tsx +16 -15
  184. package/src/components/HomePage/NavigationGroup.tsx +144 -30
  185. package/src/components/HomePage/RenameGroupDialog.tsx +123 -0
  186. package/src/components/HomePage/SmallNavigationCard.tsx +1 -2
  187. package/src/components/NotFoundPage.tsx +2 -2
  188. package/src/components/PropertyConfigBadge.tsx +10 -4
  189. package/src/components/PropertyIdCopyTooltip.tsx +47 -0
  190. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +22 -13
  191. package/src/components/SearchIconsView.tsx +2 -2
  192. package/src/components/SelectableTable/SelectableTable.tsx +154 -142
  193. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +4 -2
  194. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +10 -8
  195. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +60 -11
  196. package/src/components/UnsavedChangesDialog.tsx +46 -0
  197. package/src/components/UserDisplay.tsx +55 -0
  198. package/src/components/VirtualTable/VirtualTable.tsx +65 -44
  199. package/src/components/VirtualTable/VirtualTableCell.tsx +0 -8
  200. package/src/components/VirtualTable/VirtualTableHeader.tsx +8 -8
  201. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +1 -1
  202. package/src/components/VirtualTable/VirtualTableProps.tsx +12 -2
  203. package/src/components/VirtualTable/VirtualTableRow.tsx +1 -1
  204. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +4 -4
  205. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +2 -2
  206. package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
  207. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +16 -28
  208. package/src/components/VirtualTable/fields/VirtualTableUserSelect.tsx +99 -0
  209. package/src/components/common/default_entity_actions.tsx +62 -42
  210. package/src/components/common/index.ts +1 -1
  211. package/src/components/common/useColumnsIds.tsx +2 -9
  212. package/src/components/common/useDataSourceTableController.tsx +420 -0
  213. package/src/components/common/useDebouncedCallback.tsx +20 -0
  214. package/src/components/common/useScrollRestoration.tsx +68 -0
  215. package/src/components/common/useTableSearchHelper.ts +1 -0
  216. package/src/components/index.tsx +4 -1
  217. package/src/contexts/BreacrumbsContext.tsx +38 -0
  218. package/src/contexts/DialogsProvider.tsx +3 -2
  219. package/src/contexts/InternalUserManagementContext.tsx +4 -0
  220. package/src/contexts/ModeController.tsx +1 -3
  221. package/src/contexts/SnackbarProvider.tsx +2 -0
  222. package/src/core/DefaultAppBar.tsx +124 -85
  223. package/src/core/DefaultDrawer.tsx +30 -22
  224. package/src/core/DrawerNavigationItem.tsx +32 -28
  225. package/src/core/EntityEditView.tsx +388 -995
  226. package/src/core/EntityEditViewFormActions.tsx +329 -0
  227. package/src/core/EntitySidePanel.tsx +88 -20
  228. package/src/core/FireCMS.tsx +58 -28
  229. package/src/core/FireCMSRouter.tsx +17 -0
  230. package/src/core/NavigationRoutes.tsx +23 -32
  231. package/src/core/SideDialogs.tsx +22 -12
  232. package/src/core/field_configs.tsx +39 -11
  233. package/src/core/index.tsx +4 -2
  234. package/src/form/EntityForm.tsx +814 -0
  235. package/src/form/EntityFormActions.tsx +211 -0
  236. package/src/form/PropertyFieldBinding.tsx +59 -41
  237. package/src/form/components/CustomIdField.tsx +9 -3
  238. package/src/form/components/FieldHelperText.tsx +1 -1
  239. package/src/form/components/FormEntry.tsx +22 -0
  240. package/src/form/components/FormLayout.tsx +16 -0
  241. package/src/form/components/LabelWithIcon.tsx +30 -19
  242. package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
  243. package/src/form/components/StorageItemPreview.tsx +5 -4
  244. package/src/form/components/StorageUploadProgress.tsx +2 -3
  245. package/src/form/components/index.tsx +3 -1
  246. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +30 -18
  247. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +47 -36
  248. package/src/form/field_bindings/BlockFieldBinding.tsx +55 -33
  249. package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -14
  250. package/src/form/field_bindings/KeyValueFieldBinding.tsx +19 -15
  251. package/src/form/field_bindings/MapFieldBinding.tsx +72 -62
  252. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +159 -0
  253. package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +26 -21
  254. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +10 -8
  255. package/src/form/field_bindings/ReferenceAsStringFieldBinding.tsx +135 -0
  256. package/src/form/field_bindings/ReferenceFieldBinding.tsx +28 -19
  257. package/src/form/field_bindings/RepeatFieldBinding.tsx +56 -32
  258. package/src/form/field_bindings/SelectFieldBinding.tsx +22 -13
  259. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +247 -168
  260. package/src/form/field_bindings/SwitchFieldBinding.tsx +29 -24
  261. package/src/form/field_bindings/TextFieldBinding.tsx +28 -24
  262. package/src/form/field_bindings/UserSelectFieldBinding.tsx +94 -0
  263. package/src/form/index.tsx +17 -37
  264. package/src/form/useClearRestoreValue.tsx +2 -2
  265. package/src/form/validation.ts +12 -6
  266. package/src/hooks/data/delete.ts +6 -5
  267. package/src/hooks/data/save.ts +26 -35
  268. package/src/hooks/data/useCollectionFetch.tsx +3 -3
  269. package/src/hooks/data/useDataSource.tsx +10 -2
  270. package/src/hooks/data/useEntityFetch.tsx +10 -6
  271. package/src/hooks/index.tsx +3 -0
  272. package/src/hooks/useAuthController.tsx +1 -1
  273. package/src/hooks/useBreadcrumbsController.tsx +31 -0
  274. package/src/hooks/useBrowserTitleAndIcon.tsx +1 -1
  275. package/src/hooks/useBuildModeController.tsx +15 -28
  276. package/src/hooks/useBuildNavigationController.tsx +386 -124
  277. package/src/hooks/useCollapsedGroups.ts +64 -0
  278. package/src/hooks/useFireCMSContext.tsx +9 -35
  279. package/src/hooks/useInternalUserManagementController.tsx +16 -0
  280. package/src/hooks/useLargeLayout.tsx +0 -35
  281. package/src/hooks/useModeController.tsx +1 -2
  282. package/src/hooks/useProjectLog.tsx +16 -5
  283. package/src/hooks/useResolvedNavigationFrom.tsx +9 -11
  284. package/src/hooks/useValidateAuthenticator.tsx +3 -3
  285. package/src/internal/useBuildDataSource.ts +67 -80
  286. package/src/internal/useBuildSideDialogsController.tsx +4 -2
  287. package/src/internal/useBuildSideEntityController.tsx +149 -86
  288. package/src/internal/useUnsavedChangesDialog.tsx +127 -91
  289. package/src/preview/PropertyPreview.tsx +36 -12
  290. package/src/preview/PropertyPreviewProps.tsx +1 -1
  291. package/src/preview/components/BooleanPreview.tsx +1 -1
  292. package/src/preview/components/EmptyValue.tsx +1 -1
  293. package/src/preview/components/EnumValuesChip.tsx +1 -1
  294. package/src/preview/components/ImagePreview.tsx +10 -9
  295. package/src/preview/components/ReferencePreview.tsx +10 -18
  296. package/src/preview/components/UrlComponentPreview.tsx +20 -21
  297. package/src/preview/components/UserPreview.tsx +27 -0
  298. package/src/preview/index.ts +1 -0
  299. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +6 -5
  300. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +5 -4
  301. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +5 -3
  302. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +4 -3
  303. package/src/preview/property_previews/ArrayOneOfPreview.tsx +6 -4
  304. package/src/preview/property_previews/ArrayPropertyPreview.tsx +6 -4
  305. package/src/preview/property_previews/MapPropertyPreview.tsx +7 -6
  306. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +13 -13
  307. package/src/preview/property_previews/StringPropertyPreview.tsx +2 -2
  308. package/src/preview/util.ts +10 -10
  309. package/src/routes/CustomCMSRoute.tsx +21 -0
  310. package/src/routes/FireCMSRoute.tsx +246 -0
  311. package/src/routes/HomePageRoute.tsx +17 -0
  312. package/src/types/analytics.ts +3 -0
  313. package/src/types/auth.tsx +8 -12
  314. package/src/types/collections.ts +103 -28
  315. package/src/types/customization_controller.tsx +9 -0
  316. package/src/types/datasource.ts +21 -20
  317. package/src/types/dialogs_controller.tsx +7 -3
  318. package/src/types/entities.ts +10 -2
  319. package/src/types/entity_actions.tsx +71 -8
  320. package/src/types/entity_callbacks.ts +18 -18
  321. package/src/types/entity_overrides.tsx +2 -2
  322. package/src/types/export_import.ts +4 -4
  323. package/src/types/fields.tsx +52 -19
  324. package/src/types/firecms.tsx +34 -4
  325. package/src/types/firecms_context.tsx +18 -1
  326. package/src/types/index.ts +1 -0
  327. package/src/types/internal_user_management.ts +24 -0
  328. package/src/types/navigation.ts +76 -22
  329. package/src/types/permissions.ts +5 -5
  330. package/src/types/plugins.tsx +53 -9
  331. package/src/types/properties.ts +84 -22
  332. package/src/types/property_config.tsx +2 -2
  333. package/src/types/roles.ts +3 -0
  334. package/src/types/side_dialogs_controller.tsx +15 -0
  335. package/src/types/side_entity_controller.tsx +16 -1
  336. package/src/types/storage.ts +82 -0
  337. package/src/types/user.ts +3 -1
  338. package/src/util/builders.ts +10 -8
  339. package/src/util/callbacks.ts +119 -0
  340. package/src/util/createFormexStub.tsx +62 -0
  341. package/src/util/entities.ts +6 -4
  342. package/src/util/entity_actions.ts +28 -0
  343. package/src/util/entity_cache.ts +204 -0
  344. package/src/util/icon_list.ts +1 -1
  345. package/src/util/icon_synonyms.ts +0 -1
  346. package/src/util/icons.tsx +36 -11
  347. package/src/util/index.ts +3 -0
  348. package/src/util/join_collections.ts +9 -2
  349. package/src/util/make_properties_editable.ts +13 -5
  350. package/src/util/navigation_from_path.ts +33 -12
  351. package/src/util/navigation_utils.ts +135 -19
  352. package/src/util/objects.ts +74 -14
  353. package/src/util/parent_references_from_path.ts +3 -3
  354. package/src/util/permissions.ts +8 -8
  355. package/src/util/property_utils.tsx +17 -6
  356. package/src/util/references.ts +19 -8
  357. package/src/util/resolutions.ts +93 -24
  358. package/src/util/storage.ts +6 -2
  359. package/src/util/useStorageUploadController.tsx +74 -29
  360. package/dist/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.d.ts +0 -5
  361. package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
  362. package/dist/form/PropertiesForm.d.ts +0 -8
  363. package/dist/form/components/FormikArrayContainer.d.ts +0 -18
  364. package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
  365. package/src/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.tsx +0 -59
  366. package/src/components/PropertyIdCopyTooltipContent.tsx +0 -27
  367. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +0 -236
  368. package/src/form/PropertiesForm.tsx +0 -81
  369. package/src/form/components/FormikArrayContainer.tsx +0 -44
  370. package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -695
  371. /package/src/util/{common.tsx → common.ts} +0 -0
@@ -0,0 +1,420 @@
1
+ import React, { useCallback, useEffect, useMemo, useState } from "react";
2
+
3
+ import { useDataSource, useFireCMSContext, useNavigationController } from "../../hooks";
4
+ import { useDataOrder } from "../../hooks/data/useDataOrder";
5
+ import {
6
+ Entity,
7
+ EntityCollection,
8
+ EntityReference,
9
+ EntityTableController,
10
+ FilterValues,
11
+ FireCMSContext,
12
+ SelectedCellProps,
13
+ User,
14
+ WhereFilterOp
15
+ } from "../../types";
16
+ import { useDebouncedData } from "./useDebouncedData";
17
+ import { ScrollRestorationController } from "./useScrollRestoration";
18
+
19
+ const DEFAULT_PAGE_SIZE = 50;
20
+
21
+ export type DataSourceTableControllerProps<M extends Record<string, any> = any> = {
22
+ /**
23
+ * Full path where the data of this table is located
24
+ */
25
+ fullPath: string;
26
+ /**
27
+ * The collection that is represented by this config.
28
+ */
29
+ collection: EntityCollection<M>;
30
+ /**
31
+ * List of entities that will be displayed on top, no matter the ordering.
32
+ * This is used for reference fields selection
33
+ */
34
+ entitiesDisplayedFirst?: Entity<M>[];
35
+
36
+ lastDeleteTimestamp?: number;
37
+
38
+ /**
39
+ * Force filter to be applied to the table.
40
+ */
41
+ forceFilter?: FilterValues<string>;
42
+
43
+ scrollRestoration?: ScrollRestorationController;
44
+
45
+ /**
46
+ * When set to true the filters and sort will be updated in the URL
47
+ */
48
+ updateUrl?: boolean;
49
+
50
+ }
51
+
52
+ /**
53
+ * Use this hook to build a controller for the {@link EntityCollectionTable}.
54
+ * This controller is bound to data in a path in your specified datasource.
55
+ *
56
+ * Note that you can build your own hook returning a {@link EntityTableController}
57
+ * if you would like to display different data.
58
+ *
59
+ * @param fullPath
60
+ * @param collection
61
+ * @param scrollRestoration
62
+ * @param entitiesDisplayedFirst
63
+ * @param lastDeleteTimestamp
64
+ * @param forceFilterFromProps
65
+ * @param updateUrl
66
+ */
67
+ export function useDataSourceTableController<M extends Record<string, any> = any, USER extends User = User>(
68
+ {
69
+ fullPath,
70
+ collection,
71
+ scrollRestoration,
72
+ entitiesDisplayedFirst,
73
+ lastDeleteTimestamp,
74
+ forceFilter: forceFilterFromProps,
75
+ updateUrl
76
+ }: DataSourceTableControllerProps<M>)
77
+ : EntityTableController<M> {
78
+
79
+ const {
80
+ initialFilter,
81
+ initialSort,
82
+ forceFilter: forceFilterFromCollection
83
+ } = collection;
84
+
85
+ const [popupCell, setPopupCell] = React.useState<SelectedCellProps<M> | undefined>(undefined);
86
+ const navigation = useNavigationController();
87
+ const dataSource = useDataSource(collection);
88
+ const resolvedPath = useMemo(() => navigation.resolveIdsFrom(fullPath), [fullPath, navigation.resolveIdsFrom]);
89
+
90
+ const forceFilter = forceFilterFromProps ?? forceFilterFromCollection;
91
+ const paginationEnabled = collection.pagination === undefined || Boolean(collection.pagination);
92
+ const pageSize = typeof collection.pagination === "number" ? collection.pagination : DEFAULT_PAGE_SIZE;
93
+
94
+ const [searchString, setSearchString] = React.useState<string | undefined>();
95
+
96
+ const checkFilterCombination = useCallback((filterValues: FilterValues<any>,
97
+ sortBy?: [string, "asc" | "desc"]) => {
98
+ if (!dataSource.isFilterCombinationValid)
99
+ return true;
100
+ return dataSource.isFilterCombinationValid({
101
+ path: resolvedPath,
102
+ collection,
103
+ filterValues,
104
+ sortBy
105
+ })
106
+ }, []);
107
+
108
+ const onScroll = ({
109
+ scrollOffset
110
+ }: {
111
+ scrollOffset: number
112
+ }) => {
113
+ if (scrollRestoration) {
114
+ scrollRestoration.updateCollectionScroll({
115
+ fullPath: resolvedPath,
116
+ scrollOffset,
117
+ data: rawData,
118
+ filters: filterValues
119
+ });
120
+ }
121
+ }
122
+
123
+ const initialSortInternal = useMemo(() => {
124
+ if (initialSort && forceFilter && !checkFilterCombination(forceFilter, initialSort)) {
125
+ console.warn("Initial sort is not compatible with the force filter. Ignoring initial sort");
126
+ return undefined;
127
+ }
128
+ return initialSort;
129
+ }, [initialSort, forceFilter]);
130
+
131
+ const {
132
+ filterValues: initialFilterUrl,
133
+ sortBy: initialSortUrl,
134
+ } = parseFilterAndSort(window.location.search);
135
+
136
+ const [filterValues, setFilterValues] = React.useState<FilterValues<Extract<keyof M, string>> | undefined>(forceFilter ?? (updateUrl ? initialFilterUrl : undefined) ?? initialFilter ?? undefined);
137
+ const [sortBy, setSortBy] = React.useState<[Extract<keyof M, string>, "asc" | "desc"] | undefined>((updateUrl ? initialSortUrl : undefined) ?? initialSortInternal);
138
+
139
+ useUpdateUrl(filterValues, sortBy, searchString, updateUrl);
140
+
141
+ const collectionScroll = scrollRestoration?.getCollectionScroll(fullPath, filterValues);
142
+ const initialItemCount = collectionScroll?.data.length ?? pageSize;
143
+
144
+ useEffect(() => {
145
+ if (scrollRestoration) {
146
+ scrollRestoration.updateCollectionScroll({
147
+ fullPath: resolvedPath,
148
+ scrollOffset: collectionScroll?.scrollOffset ?? 0,
149
+ data: rawData,
150
+ filters: filterValues
151
+ });
152
+ }
153
+ }, []);
154
+
155
+ const [itemCount, setItemCount] = React.useState<number | undefined>(paginationEnabled ? initialItemCount : undefined);
156
+
157
+ const sortByProperty = sortBy ? sortBy[0] : undefined;
158
+ const currentSort = sortBy ? sortBy[1] : undefined;
159
+
160
+ const context: FireCMSContext<USER> = useFireCMSContext();
161
+
162
+ const [rawData, setRawData] = useState<Entity<M>[]>(collectionScroll?.data ?? []);
163
+
164
+ const [dataLoading, setDataLoading] = useState<boolean>(false);
165
+ const [dataLoadingError, setDataLoadingError] = useState<Error | undefined>();
166
+ const [noMoreToLoad, setNoMoreToLoad] = useState<boolean>(false);
167
+
168
+ const clearFilter = useCallback(() => setFilterValues(forceFilter ?? undefined), [forceFilter]);
169
+
170
+ const updateFilterValues = useCallback((updatedFilter: FilterValues<Extract<keyof M, string>> | undefined) => {
171
+ if (forceFilter) {
172
+ console.warn("Filter is not compatible with the force filter. Ignoring filter");
173
+ return;
174
+ }
175
+ if (updatedFilter && Object.keys(updatedFilter).length === 0) {
176
+ setFilterValues(undefined);
177
+ } else {
178
+ setFilterValues(updatedFilter);
179
+ }
180
+ }, [forceFilter]);
181
+
182
+ useEffect(() => {
183
+
184
+ setDataLoading(true);
185
+
186
+ const onEntitiesUpdate = async (entities: Entity<M>[]) => {
187
+ if (collection.callbacks?.onFetch) {
188
+ try {
189
+ entities = await Promise.all(
190
+ entities.map((entity) =>
191
+ collection.callbacks!.onFetch!({
192
+ collection,
193
+ path: resolvedPath,
194
+ entity,
195
+ context
196
+ })));
197
+ } catch (e: any) {
198
+ console.error(e);
199
+ }
200
+ }
201
+ setDataLoading(false);
202
+ setDataLoadingError(undefined);
203
+ setRawData(entities.map(e => ({
204
+ ...e,
205
+ // values: sanitizeData(e.values, resolvedCollection.properties)
206
+ })));
207
+ setNoMoreToLoad(!itemCount || entities.length < itemCount);
208
+ };
209
+
210
+ const onError = (error: Error) => {
211
+ console.error("ERROR", error);
212
+ setDataLoading(false);
213
+ setRawData([]);
214
+ setDataLoadingError(error);
215
+ };
216
+
217
+ if (dataSource.listenCollection) {
218
+ return dataSource.listenCollection<M>({
219
+ path: resolvedPath,
220
+ collection,
221
+ onUpdate: onEntitiesUpdate,
222
+ onError,
223
+ searchString,
224
+ filter: filterValues,
225
+ limit: itemCount,
226
+ startAfter: undefined,
227
+ orderBy: sortByProperty,
228
+ order: currentSort
229
+ });
230
+ } else {
231
+ dataSource.fetchCollection<M>({
232
+ path: resolvedPath,
233
+ collection,
234
+ searchString,
235
+ filter: filterValues,
236
+ limit: itemCount,
237
+ startAfter: undefined,
238
+ orderBy: sortByProperty,
239
+ order: currentSort
240
+ })
241
+ .then(onEntitiesUpdate)
242
+ .catch(onError);
243
+ return () => {
244
+ };
245
+ }
246
+ }, [resolvedPath, itemCount, currentSort, sortByProperty, filterValues, searchString]);
247
+
248
+ const orderedData = useDataOrder({
249
+ data: rawData,
250
+ entitiesDisplayedFirst
251
+ });
252
+
253
+ // hack to fix Firestore listeners firing with incomplete data
254
+ const data = useDebouncedData(orderedData, {
255
+ filterValues,
256
+ sortBy,
257
+ searchString,
258
+ lastDeleteTimestamp
259
+ });
260
+
261
+ return {
262
+ data,
263
+ dataLoading,
264
+ noMoreToLoad,
265
+ dataLoadingError,
266
+ filterValues,
267
+ setFilterValues: updateFilterValues,
268
+ sortBy,
269
+ setSortBy,
270
+ searchString,
271
+ setSearchString,
272
+ clearFilter,
273
+ itemCount,
274
+ setItemCount,
275
+ initialScroll: collectionScroll?.scrollOffset,
276
+ onScroll,
277
+ paginationEnabled,
278
+ pageSize,
279
+ checkFilterCombination,
280
+ popupCell,
281
+ setPopupCell
282
+ }
283
+ }
284
+
285
+ function useUpdateUrl<M extends Record<string, any> = any>(
286
+ filterValues: FilterValues<Extract<keyof M, string>> | undefined,
287
+ sortBy: [Extract<keyof M, string>, "asc" | "desc"] | undefined,
288
+ searchString: string | undefined,
289
+ updateUrl: boolean | undefined
290
+ ) {
291
+
292
+ useEffect(() => {
293
+ if (updateUrl) {
294
+ const newUrl = encodeFilterAndSort(filterValues, sortBy);
295
+ const search = searchString ? `&search=${encodeURIComponent(searchString)}` : "";
296
+ const state = `${newUrl}${search}`;
297
+ const hash = window.location.hash;
298
+ if (state === "")
299
+ window.history.replaceState({}, "", `${window.location.pathname}${hash}`);
300
+ else
301
+ window.history.replaceState({}, "", `?${state}${hash}`);
302
+ }
303
+ }, [filterValues, sortBy, searchString, updateUrl]);
304
+ }
305
+
306
+ function encodeFilterAndSort(filterValues?: FilterValues<string>, sortBy?: [string, "asc" | "desc"] | undefined) {
307
+ const entries: Record<string, string> = {};
308
+ if (sortBy) {
309
+ entries["__sort"] = encodeURIComponent(sortBy[0]);
310
+ entries["__sort_order"] = encodeURIComponent(sortBy[1]);
311
+ }
312
+ if (filterValues) {
313
+ Object.entries(filterValues).forEach(([key, value]) => {
314
+ if (value) {
315
+ const [op, val] = value;
316
+ let encodedValue: any = val;
317
+ try {
318
+ if (typeof val === "object") {
319
+ if (val instanceof Date) {
320
+ encodedValue = val.toISOString();
321
+ } else if (Array.isArray(val)) {
322
+ encodedValue = JSON.stringify(val, (key, value) => {
323
+ if (value instanceof EntityReference) {
324
+ return encodeRef(value);
325
+ }
326
+ return value;
327
+ });
328
+ } else if (val instanceof EntityReference) {
329
+ encodedValue = encodeRef(val);
330
+ }
331
+ }
332
+ } catch (e) {
333
+ encodedValue = val;
334
+ }
335
+ if (encodedValue !== undefined) {
336
+ entries[encodeURIComponent(`${key}_op`)] = encodeURIComponent(op);
337
+ entries[encodeURIComponent(`${key}_value`)] = encodedValue ? encodeURIComponent(encodedValue.toString()) : "null";
338
+ }
339
+ }
340
+ });
341
+ }
342
+ if (!Object.keys(entries).length) {
343
+ return "";
344
+ }
345
+ return Object.entries(entries).map(([key, value]) => `${key}=${value}`).join("&");
346
+ }
347
+
348
+ function parseFilterAndSort<M>(search: string): {
349
+ filterValues: FilterValues<string> | undefined,
350
+ sortBy?: [Extract<keyof M, string>, "asc" | "desc"]
351
+ } {
352
+ const entries = new URLSearchParams(search);
353
+ const filterValues: FilterValues<string> = {};
354
+ let sortBy: [string, "asc" | "desc"] | undefined = undefined;
355
+ entries.forEach((value, key) => {
356
+ if (key === "__sort") {
357
+ sortBy = [decodeURIComponent(value), entries.get("__sort_order") as "asc" | "desc"];
358
+ } else if (key.endsWith("_op")) {
359
+ const field = key.replace("_op", "");
360
+ const filterOp = decodeURIComponent(value) as WhereFilterOp;
361
+ const filterValStr = entries.get(`${field}_value`);
362
+ if (filterValStr !== null) {
363
+ filterValues[field] = [filterOp, decodeString(filterValStr)];
364
+ }
365
+ }
366
+ });
367
+
368
+ return {
369
+ filterValues: Object.keys(filterValues).length ? filterValues : undefined,
370
+ sortBy
371
+ }
372
+ }
373
+
374
+ function isDate(dateString: string): boolean {
375
+ // Define a regex pattern that matches the exact date format: 2025-01-07T23:00:00.000Z
376
+ const regexPattern = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/;
377
+
378
+ // Test the dateString against the regex pattern
379
+ if (!regexPattern.test(dateString)) {
380
+ return false;
381
+ }
382
+
383
+ // If the regex matches, further validate if it is a valid UTC date
384
+ const date = new Date(dateString);
385
+ return date.toISOString() === dateString;
386
+ }
387
+
388
+ function encodeRef(val: EntityReference) {
389
+ return `ref::${val.path}/${val.id}`;
390
+ }
391
+
392
+ function decodeString(val: string): EntityReference | Date | string {
393
+ let parsedFilterVal: any = val;
394
+ if (isDate(val)) {
395
+ try {
396
+ parsedFilterVal = new Date(val);
397
+ } catch (e) {
398
+ // ignore
399
+ }
400
+ }
401
+ if (typeof parsedFilterVal === "string") {
402
+ try {
403
+ parsedFilterVal = JSON.parse(parsedFilterVal, (key, value) => {
404
+ if (typeof value === "string" && value.startsWith("ref::")) {
405
+ const [path, id] = value.substring(5).split("/");
406
+ return new EntityReference(id, path);
407
+ }
408
+ return value;
409
+ });
410
+ } catch (e) {
411
+ // ignore
412
+ }
413
+ }
414
+
415
+ if (typeof parsedFilterVal === "string" && parsedFilterVal.startsWith("ref::")) {
416
+ const [path, id] = parsedFilterVal.substring(5).split("/");
417
+ return new EntityReference(id, path);
418
+ }
419
+ return parsedFilterVal;
420
+ }
@@ -0,0 +1,20 @@
1
+ import { useCallback, useRef } from "react";
2
+
3
+ export function useDebounceCallback<T extends (...args: any[]) => any>(
4
+ callback?: T,
5
+ delay?: number
6
+ ): T {
7
+ const timeoutRef = useRef<number | null>(null);
8
+
9
+ const debouncedCallback = useCallback((...args: Parameters<T>) => {
10
+ if (timeoutRef.current !== null) {
11
+ clearTimeout(timeoutRef.current);
12
+ }
13
+
14
+ timeoutRef.current = window.setTimeout(() => {
15
+ callback?.(...args);
16
+ }, delay ?? 200);
17
+ }, [callback, delay]);
18
+
19
+ return debouncedCallback as T;
20
+ }
@@ -0,0 +1,68 @@
1
+ import { Entity, FilterValues } from "../../types";
2
+
3
+ const collectionScrollCache = new Map<string, { scrollOffset: number, data: Entity<any>[] }>();
4
+
5
+ export type ScrollRestorationController = {
6
+
7
+ getCollectionScroll: (fullPath: string,
8
+ filters?: FilterValues<any>) => {
9
+ scrollOffset: number,
10
+ data: Entity<any>[]
11
+ } | undefined;
12
+
13
+ updateCollectionScroll: (props: {
14
+ fullPath: string,
15
+ scrollOffset: number,
16
+ filters?: FilterValues<any>;
17
+ data: Entity<any>[]
18
+ }) => void;
19
+
20
+ }
21
+
22
+ export function useScrollRestoration(): ScrollRestorationController {
23
+
24
+ const updateCollectionScroll = ({
25
+ fullPath,
26
+ filters,
27
+ scrollOffset,
28
+ data
29
+ }: {
30
+ fullPath: string;
31
+ filters?: FilterValues<any>;
32
+ sort?: [string, "asc" | "desc"];
33
+ scrollOffset: number;
34
+ data: Entity<any>[]
35
+ }) => {
36
+ collectionScrollCache.set(
37
+ createCacheKey(fullPath, filters),
38
+ {
39
+ scrollOffset,
40
+ data
41
+ })
42
+ }
43
+
44
+ const getCollectionScroll = (fullPath: string,
45
+ filters?: FilterValues<any>) => {
46
+ return collectionScrollCache.get(createCacheKey(fullPath, filters));
47
+ }
48
+
49
+ return {
50
+ getCollectionScroll,
51
+ updateCollectionScroll
52
+ }
53
+ }
54
+
55
+ function createCacheKey(fullPath: string, filters?: FilterValues<any>) {
56
+
57
+ if (!filters) {
58
+ return fullPath;
59
+ }
60
+
61
+ // codify the filters into a url friendly string
62
+ const filtersString = filters ? Object.keys(filters).map(key => {
63
+ const value = JSON.stringify(filters[key]);
64
+ return `${key}=${value}`;
65
+ }).join("&") : "";
66
+
67
+ return `${fullPath}?${filtersString}`;
68
+ }
@@ -28,6 +28,7 @@ export function useTableSearchHelper<M extends Record<string, any>>({
28
28
  const props = {
29
29
  context,
30
30
  path: fullPath,
31
+ databaseId: collection.databaseId,
31
32
  collection,
32
33
  parentCollectionIds
33
34
  };
@@ -19,13 +19,14 @@ export * from "./EntityCollectionView/EntityCollectionViewActions";
19
19
  export * from "./EntityCollectionView/useSelectionController";
20
20
 
21
21
  export * from "./PropertyConfigBadge";
22
+ export * from "./PropertyIdCopyTooltip";
22
23
 
23
24
  export * from "./EntityCollectionTable";
24
25
  export * from "./NotFoundPage";
25
26
 
26
27
  export * from "./VirtualTable";
27
28
  export * from "./ErrorBoundary";
28
- export * from "./DeleteConfirmationDialog";
29
+ export * from "./ConfirmationDialog";
29
30
 
30
31
  export * from "./FireCMSLogo";
31
32
 
@@ -35,3 +36,5 @@ export * from "./ArrayContainer";
35
36
  export * from "./ReferenceWidget";
36
37
  export * from "./SearchIconsView";
37
38
  export * from "./FieldCaption";
39
+
40
+ export * from "./EntityPreview";
@@ -0,0 +1,38 @@
1
+ import React, { useState } from "react";
2
+ import { BreadcrumbEntry, BreadcrumbsController } from "../hooks/useBreadcrumbsController";
3
+
4
+ const DEFAULT_BREADCRUMBS_CONTROLLER = {
5
+ breadcrumbs: [],
6
+ set: (props: {
7
+ breadcrumbs: BreadcrumbEntry[];
8
+ }) => {
9
+ }
10
+ };
11
+
12
+ export const BreadcrumbContext = React.createContext<BreadcrumbsController>(DEFAULT_BREADCRUMBS_CONTROLLER);
13
+
14
+ interface BreadcrumbsProviderProps {
15
+ children: React.ReactNode;
16
+ }
17
+
18
+ export const BreadcrumbsProvider: React.FC<BreadcrumbsProviderProps> = ({ children }) => {
19
+
20
+ const [breadcrumbs, setBreadcrumbs] = useState<BreadcrumbEntry[]>([]);
21
+
22
+ const set = (props: {
23
+ breadcrumbs: BreadcrumbEntry[];
24
+ }) => {
25
+ setBreadcrumbs(props.breadcrumbs);
26
+ };
27
+
28
+ return (
29
+ <BreadcrumbContext.Provider
30
+ value={{
31
+ breadcrumbs,
32
+ set
33
+ }}
34
+ >
35
+ {children}
36
+ </BreadcrumbContext.Provider>
37
+ );
38
+ };
@@ -8,7 +8,7 @@ export const DialogsProvider: React.FC<PropsWithChildren<{}>> = ({ children }) =
8
8
  const [dialogEntries, setDialogEntries] = useState<DialogControllerEntryProps[]>([]);
9
9
  const dialogEntriesRef = useRef<DialogControllerEntryProps[]>(dialogEntries);
10
10
 
11
- const updateDialogEntries = (newPanels: DialogControllerEntryProps[]) => {
11
+ const updateDialogEntries = (newPanels: DialogControllerEntryProps<any>[]) => {
12
12
  dialogEntriesRef.current = newPanels;
13
13
  setDialogEntries(newPanels);
14
14
  };
@@ -23,7 +23,7 @@ export const DialogsProvider: React.FC<PropsWithChildren<{}>> = ({ children }) =
23
23
 
24
24
  }, [dialogEntries]);
25
25
 
26
- const open = useCallback((dialogEntry: DialogControllerEntryProps) => {
26
+ const open = useCallback(<T extends object = object>(dialogEntry: DialogControllerEntryProps<T>) => {
27
27
 
28
28
  const updatedPanels = [...dialogEntriesRef.current, dialogEntry];
29
29
  updateDialogEntries(updatedPanels);
@@ -46,6 +46,7 @@ export const DialogsProvider: React.FC<PropsWithChildren<{}>> = ({ children }) =
46
46
  key={`dialog_${i}`}
47
47
  open={true}
48
48
  closeDialog={close}
49
+ {...entry.props}
49
50
  />)}
50
51
  </DialogsControllerContext.Provider>
51
52
  );
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ import { InternalUserManagement, NavigationController } from "../types";
3
+
4
+ export const InternalUserManagementContext = React.createContext<InternalUserManagement<any>>({} as InternalUserManagement);
@@ -3,10 +3,8 @@ import { ModeController } from "../hooks";
3
3
 
4
4
  const DEFAULT_MODE_STATE: ModeController = {
5
5
  mode: "light",
6
- setMode: (mode: "light" | "dark") => {
6
+ setMode: (mode: "light" | "dark" | "system") => {
7
7
  },
8
- toggleMode: () => {
9
- }
10
8
  };
11
9
  export const ModeControllerContext = React.createContext<ModeController>(DEFAULT_MODE_STATE);
12
10
 
@@ -1,3 +1,5 @@
1
+ "use client";
2
+
1
3
  import React, { PropsWithChildren } from "react";
2
4
  import { SnackbarProvider as NotistackSnackbarProvider } from "notistack";
3
5