@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,329 @@
1
+ import React, { useMemo } from "react";
2
+ import {
3
+ Entity,
4
+ EntityAction,
5
+ EntityActionClickProps,
6
+ FireCMSContext,
7
+ FormContext,
8
+ ResolvedEntityCollection,
9
+ SideEntityController
10
+ } from "../types";
11
+
12
+ import { copyEntityAction, deleteEntityAction } from "../components";
13
+ import { canCreateEntity, canDeleteEntity, mergeEntityActions, resolveEntityAction } from "../util";
14
+ import {
15
+ Button,
16
+ CircularProgress,
17
+ cls,
18
+ defaultBorderMixin,
19
+ DialogActions,
20
+ IconButton,
21
+ LoadingButton,
22
+ Tooltip,
23
+ Typography
24
+ } from "@firecms/ui";
25
+ import {
26
+ useAuthController,
27
+ useCustomizationController,
28
+ useFireCMSContext,
29
+ useSideEntityController,
30
+ useSnackbarController
31
+ } from "../hooks";
32
+ import { EntityFormActionsProps } from "../form/EntityFormActions";
33
+ import { SideDialogController, useSideDialogContext } from "./SideDialogs";
34
+
35
+ export function EntityEditViewFormActions({
36
+ collection,
37
+ path,
38
+ entity,
39
+ layout,
40
+ savingError,
41
+ formex,
42
+ disabled,
43
+ status,
44
+ pluginActions,
45
+ openEntityMode,
46
+ showDefaultActions = true,
47
+ navigateBack,
48
+ formContext
49
+ }: EntityFormActionsProps) {
50
+
51
+ const authController = useAuthController();
52
+ const context = useFireCMSContext();
53
+ const sideEntityController = useSideEntityController();
54
+ const sideDialogContext = useSideDialogContext();
55
+ const customizationController = useCustomizationController();
56
+
57
+ const entityActions = useMemo((): EntityAction[] => {
58
+ const customEntityActions = (collection.entityActions ?? [])
59
+ .map(action => resolveEntityAction(action, customizationController.entityActions))
60
+ .filter(Boolean) as EntityAction[];
61
+ const createEnabled = canCreateEntity(collection, authController, path, null);
62
+ const deleteEnabled = entity ? canDeleteEntity(collection, authController, path, entity) : false;
63
+ const actions: EntityAction[] = [];
64
+ if (createEnabled)
65
+ actions.push(copyEntityAction);
66
+ if (deleteEnabled)
67
+ actions.push(deleteEntityAction);
68
+ if (customEntityActions)
69
+ return mergeEntityActions(actions, customEntityActions);
70
+ return actions;
71
+ }, [authController, collection, path, customizationController.entityActions?.length]);
72
+
73
+ const formActions = showDefaultActions ? entityActions.filter(a => a.includeInForm === undefined || a.includeInForm) : [];
74
+
75
+ return layout === "bottom"
76
+ ? buildBottomActions({
77
+ savingError,
78
+ entity,
79
+ formActions,
80
+ collection,
81
+ context,
82
+ sideEntityController,
83
+ isSubmitting: formex.isSubmitting,
84
+ disabled,
85
+ status,
86
+ sideDialogContext,
87
+ pluginActions,
88
+ openEntityMode,
89
+ navigateBack,
90
+ formContext
91
+ })
92
+ : buildSideActions({
93
+ savingError,
94
+ entity,
95
+ formActions,
96
+ collection,
97
+ context,
98
+ sideEntityController,
99
+ isSubmitting: formex.isSubmitting,
100
+ sideDialogContext,
101
+ disabled,
102
+ status,
103
+ pluginActions,
104
+ openEntityMode,
105
+ navigateBack,
106
+ formContext
107
+ });
108
+ }
109
+
110
+ type ActionsViewProps<M extends object> = {
111
+ savingError: Error | undefined,
112
+ entity: Entity<M> | undefined,
113
+ formActions: EntityAction[],
114
+ collection: ResolvedEntityCollection,
115
+ context: FireCMSContext,
116
+ sideEntityController: SideEntityController,
117
+ isSubmitting: boolean,
118
+ disabled: boolean,
119
+ status: "new" | "existing" | "copy",
120
+ sideDialogContext: SideDialogController,
121
+ pluginActions?: React.ReactNode[],
122
+ openEntityMode: "side_panel" | "full_screen";
123
+ navigateBack: () => void;
124
+ formContext: FormContext
125
+ };
126
+
127
+ function buildBottomActions<M extends object>({
128
+ savingError,
129
+ entity,
130
+ formActions,
131
+ collection,
132
+ context,
133
+ sideEntityController,
134
+ isSubmitting,
135
+ disabled,
136
+ status,
137
+ sideDialogContext,
138
+ pluginActions,
139
+ openEntityMode,
140
+ navigateBack,
141
+ formContext
142
+ }: ActionsViewProps<M>) {
143
+
144
+ const canClose = openEntityMode === "side_panel";
145
+ return <DialogActions
146
+ position={"absolute"}>
147
+ {savingError &&
148
+ <div className="text-right">
149
+ <Typography color={"error"}>{savingError.message}</Typography>
150
+ </div>
151
+ }
152
+
153
+ {formActions.length > 0 && <div className="flex-grow flex overflow-auto no-scrollbar">
154
+ {formActions.map(action => {
155
+
156
+ const props = {
157
+ view: "form",
158
+ entity,
159
+ fullPath: collection.path,
160
+ collection: collection,
161
+ context,
162
+ sideEntityController,
163
+ openEntityMode,
164
+ navigateBack,
165
+ formContext
166
+ } satisfies EntityActionClickProps<any>;
167
+
168
+ const isEnabled = !action.isEnabled || action.isEnabled(props);
169
+ return (
170
+ <EntityActionButton
171
+ key={action.key}
172
+ action={action}
173
+ enabled={isEnabled}
174
+ props={props}
175
+ />
176
+ );
177
+ })}
178
+ </div>}
179
+
180
+ {pluginActions}
181
+
182
+ <Button variant="text"
183
+ color="primary"
184
+ disabled={disabled || isSubmitting}
185
+ type="reset">
186
+ {status === "existing" ? "Discard" : "Clear"}
187
+ </Button>
188
+ <Button variant={canClose ? "text" : "filled"}
189
+ color="primary"
190
+ type="submit"
191
+ disabled={disabled || isSubmitting}
192
+ onClick={() => {
193
+ sideDialogContext.setPendingClose(false);
194
+ }}>
195
+ {status === "existing" && "Save"}
196
+ {status === "copy" && "Create copy"}
197
+ {status === "new" && "Create"}
198
+ </Button>
199
+ {canClose && <LoadingButton variant="filled"
200
+ color="primary"
201
+ type="submit"
202
+ loading={isSubmitting}
203
+ disabled={disabled}
204
+ onClick={() => {
205
+ sideDialogContext.setPendingClose?.(true);
206
+ }}>
207
+ {status === "existing" && "Save and close"}
208
+ {status === "copy" && "Create copy and close"}
209
+ {status === "new" && "Create and close"}
210
+ </LoadingButton>}
211
+ </DialogActions>;
212
+ }
213
+
214
+ function buildSideActions<M extends object>({
215
+ savingError,
216
+ entity,
217
+ formActions,
218
+ collection,
219
+ context,
220
+ sideEntityController,
221
+ isSubmitting,
222
+ disabled,
223
+ status,
224
+ sideDialogContext,
225
+ pluginActions,
226
+ openEntityMode,
227
+ navigateBack,
228
+ formContext
229
+ }: ActionsViewProps<M>) {
230
+
231
+ return <div
232
+ className={cls("overflow-auto h-full flex flex-col gap-2 w-80 2xl:w-96 px-4 py-16 sticky top-0 border-l", defaultBorderMixin)}>
233
+ <LoadingButton fullWidth={true} variant="filled" color="primary" type="submit" size={"large"}
234
+ disabled={disabled || isSubmitting} onClick={() => {
235
+ sideDialogContext.setPendingClose?.(false);
236
+ }}>
237
+ {status === "existing" && "Save"}
238
+ {status === "copy" && "Create copy"}
239
+ {status === "new" && "Create"}
240
+ </LoadingButton>
241
+
242
+ <Button fullWidth={true} variant="text" disabled={disabled || isSubmitting} type="reset">
243
+ {status === "existing" ? "Discard" : "Clear"}
244
+ </Button>
245
+
246
+ {pluginActions}
247
+
248
+ {formActions.length > 0 && <div className="flex flex-row flex-wrap mt-2">
249
+ {formActions.map(action => {
250
+ const props = {
251
+ view: "form",
252
+ entity,
253
+ fullPath: collection.path,
254
+ collection: collection,
255
+ context,
256
+ sideEntityController,
257
+ openEntityMode,
258
+ navigateBack,
259
+ formContext
260
+ } satisfies EntityActionClickProps<any>;
261
+ const isEnabled = !action.isEnabled || action.isEnabled(props);
262
+ return (
263
+ <EntityActionButton key={action.key} action={action} enabled={isEnabled} props={props}/>
264
+ );
265
+ })}
266
+ </div>}
267
+
268
+ {savingError &&
269
+ <div className="text-right">
270
+ <Typography color={"error"}>{savingError.message}</Typography>
271
+ </div>
272
+ }
273
+ </div>;
274
+ }
275
+
276
+ function EntityActionButton({
277
+ action,
278
+ enabled,
279
+ props
280
+ }: {
281
+ action: EntityAction,
282
+ enabled: boolean,
283
+ props: EntityActionClickProps<any, any>
284
+ }) {
285
+ const snackbarController = useSnackbarController();
286
+ const [loading, setLoading] = React.useState(false);
287
+ return <Tooltip
288
+ title={action.name}>
289
+ <IconButton
290
+ color="primary"
291
+ disabled={!enabled}
292
+ onClick={(event) => {
293
+ console.debug("Executing action", action.key, props);
294
+ try {
295
+ event.stopPropagation();
296
+ if (props.entity) {
297
+ const onClick = action.onClick(props);
298
+ // If the action returns a promise, we can handle it
299
+ if (onClick instanceof Promise) {
300
+ setLoading(true);
301
+ onClick
302
+ .catch((error) => {
303
+ console.error("Error executing action", action.key, error);
304
+ snackbarController.open({
305
+ message: `Error executing action: ${error.message}`,
306
+ type: "error"
307
+ })
308
+ })
309
+ .finally(() => setLoading(false));
310
+ } else {
311
+ snackbarController.open({
312
+ message: `Action ${action.name} executed successfully`,
313
+ type: "success"
314
+ });
315
+ }
316
+
317
+ }
318
+ } catch (e: any) {
319
+ console.error("Error executing action", action.key, e);
320
+ snackbarController.open({
321
+ message: `Error executing action: ${e.message}`,
322
+ type: "error"
323
+ });
324
+ }
325
+ }}>
326
+ {loading ? <CircularProgress size={"smallest"}/> : action.icon}
327
+ </IconButton>
328
+ </Tooltip>;
329
+ }
@@ -1,11 +1,13 @@
1
1
  import React, { useCallback, useEffect, useMemo } from "react";
2
2
 
3
3
  import { EntitySidePanelProps } from "../types";
4
- import { useNavigationController } from "../hooks";
4
+ import { useNavigationController, useSideEntityController } from "../hooks";
5
5
 
6
6
  import { ErrorBoundary } from "../components";
7
- import { EntityEditView } from "./EntityEditView";
7
+ import { EntityEditView, OnUpdateParams } from "./EntityEditView";
8
8
  import { useSideDialogContext } from "./SideDialogs";
9
+ import { CloseIcon, IconButton, OpenInFullIcon } from "@firecms/ui";
10
+ import { useLocation, useNavigate } from "react-router-dom";
9
11
 
10
12
  /**
11
13
  * This is the component in charge of rendering the side dialog used
@@ -17,33 +19,64 @@ import { useSideDialogContext } from "./SideDialogs";
17
19
  */
18
20
  export function EntitySidePanel(props: EntitySidePanelProps) {
19
21
 
22
+ const {
23
+ allowFullScreen = true,
24
+ path,
25
+ entityId,
26
+ fullIdPath,
27
+ formProps,
28
+ } = props;
29
+
20
30
  const {
21
31
  blocked,
22
32
  setBlocked,
23
- setBlockedNavigationMessage
33
+ setBlockedNavigationMessage,
34
+ close,
24
35
  } = useSideDialogContext();
25
36
 
37
+ const navigate = useNavigate();
38
+ const location = useLocation();
39
+
40
+ const sideEntityController = useSideEntityController();
26
41
  const navigationController = useNavigationController();
42
+ const sideDialogsController = useSideDialogContext();
27
43
 
28
- const parentCollectionIds = useMemo(() => {
29
- return navigationController.getParentCollectionIds(props.path);
30
- }, [navigationController, props.path]);
44
+ const onClose = () => {
45
+ if (props.onClose) {
46
+ props.onClose();
47
+ }
31
48
 
32
- const collection = useMemo(() => {
33
- if (!props) return undefined;
34
- let usedCollection = props.collection;
49
+ setBlocked(false);
50
+ close(true);
51
+ }
35
52
 
36
- const registryCollection = navigationController.getCollection(props.path);
37
- if (registryCollection) {
38
- usedCollection = registryCollection;
53
+ const onUpdate = (params: OnUpdateParams) => {
54
+ if (props.onUpdate) {
55
+ props.onUpdate(params);
56
+ }
57
+ if (params.status !== "existing") {
58
+ sideEntityController.replace({
59
+ path: params.path,
60
+ entityId: params.entityId,
61
+ fullIdPath: props.fullIdPath,
62
+ selectedTab: params.selectedTab,
63
+ updateUrl: true,
64
+ collection: params.collection,
65
+ });
39
66
  }
40
- if (!usedCollection) {
41
- console.error("ERROR: No collection found in path `", props.path, "`. Entity id: ", props.entityId);
42
- throw Error("ERROR: No collection found in path `" + props.path + "`. Make sure you have defined a collection for this path in the root navigation.");
67
+
68
+ if (sideDialogsController.pendingClose) {
69
+ sideDialogsController.setPendingClose(false);
70
+ onClose();
43
71
  }
44
72
 
45
- return usedCollection;
46
- }, [navigationController, props]);
73
+ }
74
+
75
+ const parentCollectionIds = useMemo(() => {
76
+ return navigationController.getParentCollectionIds(path);
77
+ }, [navigationController, path]);
78
+
79
+ const collection = navigationController.getCollection(fullIdPath ?? path) ?? props.collection;
47
80
 
48
81
  useEffect(() => {
49
82
  function beforeunload(e: any) {
@@ -63,11 +96,11 @@ export function EntitySidePanel(props: EntitySidePanelProps) {
63
96
 
64
97
  }, [blocked, collection]);
65
98
 
66
- const onValuesAreModified = useCallback((modified: boolean) => {
67
- setBlocked(modified);
99
+ const onValuesModified = useCallback((modified: boolean) => {
68
100
  setBlockedNavigationMessage(modified
69
101
  ? <> You have unsaved changes in this <b>{collection?.singularName ?? collection?.name}</b>.</>
70
102
  : undefined)
103
+ setBlocked(modified);
71
104
  }, [collection?.name, setBlocked, setBlockedNavigationMessage]);
72
105
 
73
106
  if (!props || !collection) {
@@ -79,9 +112,44 @@ export function EntitySidePanel(props: EntitySidePanelProps) {
79
112
  <ErrorBoundary>
80
113
  <EntityEditView
81
114
  {...props}
115
+ fullIdPath={fullIdPath}
116
+ layout={"side_panel"}
82
117
  collection={collection}
83
118
  parentCollectionIds={parentCollectionIds}
84
- onValuesAreModified={onValuesAreModified}
119
+ onValuesModified={onValuesModified}
120
+ onSaved={onUpdate}
121
+ barActions={<>
122
+ <IconButton
123
+ className="self-center"
124
+ onClick={onClose}>
125
+ <CloseIcon size={"small"}/>
126
+ </IconButton>
127
+ {allowFullScreen && <IconButton
128
+ className="self-center"
129
+ onClick={() => {
130
+ if (entityId)
131
+ navigate(location.pathname);
132
+ else
133
+ navigate(location.pathname + "#new");
134
+ }}>
135
+ <OpenInFullIcon size={"small"}/>
136
+ </IconButton>}
137
+ </>}
138
+ onTabChange={({
139
+ entityId,
140
+ selectedTab,
141
+ collection,
142
+ }) => {
143
+ sideEntityController.replace({
144
+ path,
145
+ entityId,
146
+ fullIdPath: props.fullIdPath,
147
+ selectedTab,
148
+ updateUrl: true,
149
+ collection,
150
+ });
151
+ }}
152
+ formProps={formProps}
85
153
  />
86
154
  </ErrorBoundary>
87
155
 
@@ -1,6 +1,8 @@
1
- import React, { useMemo } from "react";
1
+ "use client";
2
2
 
3
- import { CustomizationController, EntityCollection, FireCMSContext, FireCMSPlugin, FireCMSProps, User } from "../types";
3
+ import React, { useMemo } from "react";
4
+ import { CenteredView, Typography } from "@firecms/ui";
5
+ import { CustomizationController, FireCMSContext, FireCMSPlugin, FireCMSProps, User } from "../types";
4
6
  import { AuthControllerContext } from "../contexts";
5
7
  import { useBuildSideEntityController } from "../internal/useBuildSideEntityController";
6
8
  import { useCustomizationController, useFireCMSContext } from "../hooks";
@@ -12,12 +14,13 @@ import { DataSourceContext } from "../contexts/DataSourceContext";
12
14
  import { SideEntityControllerContext } from "../contexts/SideEntityControllerContext";
13
15
  import { NavigationContext } from "../contexts/NavigationContext";
14
16
  import { SideDialogsControllerContext } from "../contexts/SideDialogsControllerContext";
15
- import { CenteredView, Typography, useLocaleConfig } from "@firecms/ui";
16
17
  import { DialogsProvider } from "../contexts/DialogsProvider";
17
18
  import { useBuildDataSource } from "../internal/useBuildDataSource";
18
19
  import { CustomizationControllerContext } from "../contexts/CustomizationControllerContext";
19
20
  import { AnalyticsContext } from "../contexts/AnalyticsContext";
20
21
  import { useProjectLog } from "../hooks/useProjectLog";
22
+ import { BreadcrumbsProvider } from "../contexts/BreacrumbsContext";
23
+ import { InternalUserManagementContext } from "../contexts/InternalUserManagementContext";
21
24
 
22
25
  /**
23
26
  * If you are using independent components of the CMS
@@ -28,10 +31,9 @@ import { useProjectLog } from "../hooks/useProjectLog";
28
31
  *
29
32
  * You only need to use this component if you are building a custom app.
30
33
  *
31
-
32
34
  * @group Core
33
35
  */
34
- export function FireCMS<UserType extends User, EC extends EntityCollection>(props: FireCMSProps<UserType, EC>) {
36
+ export function FireCMS<USER extends User>(props: FireCMSProps<USER>) {
35
37
 
36
38
  const {
37
39
  children,
@@ -42,27 +44,31 @@ export function FireCMS<UserType extends User, EC extends EntityCollection>(prop
42
44
  authController,
43
45
  storageSource,
44
46
  dataSourceDelegate,
45
- plugins,
47
+ plugins: _pluginsProp,
46
48
  onAnalyticsEvent,
47
49
  propertyConfigs,
48
50
  entityViews,
51
+ entityActions,
49
52
  components,
50
53
  navigationController,
54
+ apiKey,
55
+ userManagement: _userManagement
51
56
  } = props;
52
57
 
53
- useLocaleConfig(locale);
58
+ if (_pluginsProp) {
59
+ console.warn("The `plugins` prop is deprecated in the FireCMS component. You should pass your plugins to `useBuildNavigationController` instead.");
60
+ }
54
61
 
55
- /**
56
- * Controller in charge of fetching and persisting data
57
- */
58
- const dataSource = useBuildDataSource({
59
- delegate: dataSourceDelegate,
60
- propertyConfigs,
61
- navigationController
62
- });
62
+ const plugins = navigationController.plugins ?? _pluginsProp;
63
+ const userManagement = plugins?.find(p => p.userManagement)?.userManagement
64
+ ?? _userManagement
65
+ ?? {
66
+ users: [],
67
+ getUser: (uid: string) => null
68
+ };
63
69
 
64
70
  const sideDialogsController = useBuildSideDialogsController();
65
- const sideEntityController = useBuildSideEntityController(navigationController, sideDialogsController);
71
+ const sideEntityController = useBuildSideEntityController(navigationController, sideDialogsController, authController);
66
72
 
67
73
  const pluginsLoading = plugins?.some(p => p.loading) ?? false;
68
74
 
@@ -74,6 +80,7 @@ export function FireCMS<UserType extends User, EC extends EntityCollection>(prop
74
80
  entityLinkBuilder,
75
81
  plugins,
76
82
  entityViews: entityViews ?? [],
83
+ entityActions: entityActions ?? [],
77
84
  propertyConfigs: propertyConfigs ?? {},
78
85
  components
79
86
  };
@@ -82,7 +89,26 @@ export function FireCMS<UserType extends User, EC extends EntityCollection>(prop
82
89
  onAnalyticsEvent
83
90
  }), []);
84
91
 
85
- const accessResponse = useProjectLog(authController, dataSourceDelegate, plugins);
92
+ const accessResponse = useProjectLog({
93
+ apiKey,
94
+ authController,
95
+ dataSourceDelegate,
96
+ plugins
97
+ });
98
+
99
+ /**
100
+ * Controller in charge of fetching and persisting data
101
+ */
102
+ const dataSource = useBuildDataSource({
103
+ delegate: dataSourceDelegate,
104
+ propertyConfigs,
105
+ navigationController,
106
+ authController
107
+ });
108
+
109
+ if (accessResponse?.message) {
110
+ console.warn(accessResponse.message);
111
+ }
86
112
 
87
113
  if (navigationController.navigationLoadingError) {
88
114
  return (
@@ -106,16 +132,16 @@ export function FireCMS<UserType extends User, EC extends EntityCollection>(prop
106
132
 
107
133
  if (accessResponse?.blocked) {
108
134
  return (
109
- <CenteredView maxWidth={"md"} fullScreen={true}>
110
- <Typography variant={"h4"}>
111
- Access blocked
135
+ <CenteredView maxWidth={"md"} fullScreen={true} className={"flex flex-col gap-2"}>
136
+ <Typography variant={"h4"} gutterBottom>
137
+ License needed
112
138
  </Typography>
113
139
  <Typography>
114
- This app has been blocked. Please reach out at <a
140
+ You need a valid license to use FireCMS PRO. Please reach out at <a
115
141
  href={"mailto:hello@firecms.co"}>hello@firecms.co</a> for more information.
116
142
  </Typography>
117
143
  {accessResponse?.message &&
118
- <Typography>Response from the server: {accessResponse?.message}</Typography>}
144
+ <Typography>{accessResponse?.message}</Typography>}
119
145
  </CenteredView>
120
146
  );
121
147
  }
@@ -137,12 +163,16 @@ export function FireCMS<UserType extends User, EC extends EntityCollection>(prop
137
163
  value={sideEntityController}>
138
164
  <NavigationContext.Provider
139
165
  value={navigationController}>
140
- <DialogsProvider>
141
- <FireCMSInternal
142
- loading={loading}>
143
- {children}
144
- </FireCMSInternal>
145
- </DialogsProvider>
166
+ <InternalUserManagementContext.Provider value={userManagement}>
167
+ <DialogsProvider>
168
+ <BreadcrumbsProvider>
169
+ <FireCMSInternal
170
+ loading={loading}>
171
+ {children}
172
+ </FireCMSInternal>
173
+ </BreadcrumbsProvider>
174
+ </DialogsProvider>
175
+ </InternalUserManagementContext.Provider>
146
176
  </NavigationContext.Provider>
147
177
  </SideEntityControllerContext.Provider>
148
178
  </SideDialogsControllerContext.Provider>
@@ -0,0 +1,17 @@
1
+ import { createBrowserRouter, RouterProvider } from "react-router-dom"
2
+ import { removeInitialAndTrailingSlashes } from "../util";
3
+
4
+ export function FireCMSRouter({
5
+ children,
6
+ basePath
7
+ }: {
8
+ children: React.ReactNode,
9
+ basePath?: string;
10
+ }) {
11
+ return <RouterProvider router={createBrowserRouter([
12
+ {
13
+ path: basePath ? `${removeInitialAndTrailingSlashes(basePath)}/*` : "/*",
14
+ element: children
15
+ }
16
+ ])}/>;
17
+ }