@firecms/core 3.0.0-canary.21 → 3.0.0-canary.211

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 (382) hide show
  1. package/README.md +3 -3
  2. package/dist/app/AppBar.d.ts +12 -0
  3. package/dist/app/Drawer.d.ts +16 -0
  4. package/dist/app/Scaffold.d.ts +34 -0
  5. package/dist/app/index.d.ts +4 -0
  6. package/dist/app/useApp.d.ts +16 -0
  7. package/dist/components/ArrayContainer.d.ts +23 -6
  8. package/dist/components/CircularProgressCenter.d.ts +1 -1
  9. package/dist/components/ClearFilterSortButton.d.ts +5 -0
  10. package/dist/components/{DeleteConfirmationDialog.d.ts → ConfirmationDialog.d.ts} +1 -1
  11. package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +13 -13
  12. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +2 -2
  13. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +22 -6
  14. package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +1 -0
  15. package/dist/components/EntityCollectionTable/column_utils.d.ts +1 -2
  16. package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +3 -1
  17. package/dist/components/EntityCollectionTable/index.d.ts +1 -1
  18. package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +1 -4
  19. package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +2 -2
  20. package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +7 -4
  21. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +16 -2
  22. package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
  23. package/dist/components/EntityCollectionView/utils.d.ts +3 -0
  24. package/dist/components/EntityJsonPreview.d.ts +3 -0
  25. package/dist/components/EntityPreview.d.ts +5 -4
  26. package/dist/components/ErrorView.d.ts +1 -1
  27. package/dist/components/HomePage/DefaultHomePage.d.ts +1 -1
  28. package/dist/components/HomePage/NavigationCardBinding.d.ts +1 -1
  29. package/dist/components/PropertyConfigBadge.d.ts +2 -1
  30. package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
  31. package/dist/components/ReferenceWidget.d.ts +3 -1
  32. package/dist/components/SelectableTable/SelectableTable.d.ts +13 -3
  33. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
  34. package/dist/components/UnsavedChangesDialog.d.ts +8 -0
  35. package/dist/components/VirtualTable/VirtualTableProps.d.ts +28 -12
  36. package/dist/components/VirtualTable/types.d.ts +3 -3
  37. package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -3
  38. package/dist/components/common/index.d.ts +2 -1
  39. package/dist/components/common/table_height.d.ts +5 -0
  40. package/dist/components/common/types.d.ts +4 -6
  41. package/dist/components/common/useColumnsIds.d.ts +3 -1
  42. package/dist/components/common/{useDataSourceEntityCollectionTableController.d.ts → useDataSourceTableController.d.ts} +13 -2
  43. package/dist/components/common/useDebouncedCallback.d.ts +1 -0
  44. package/dist/components/common/useScrollRestoration.d.ts +14 -0
  45. package/dist/components/index.d.ts +4 -2
  46. package/dist/contexts/BreacrumbsContext.d.ts +8 -0
  47. package/dist/core/DefaultAppBar.d.ts +29 -0
  48. package/dist/core/DefaultDrawer.d.ts +19 -0
  49. package/dist/core/DrawerNavigationItem.d.ts +10 -0
  50. package/dist/core/EntityEditView.d.ts +35 -11
  51. package/dist/core/EntityEditViewFormActions.d.ts +2 -0
  52. package/dist/core/FireCMS.d.ts +3 -3
  53. package/dist/core/FireCMSRouter.d.ts +4 -0
  54. package/dist/core/NavigationRoutes.d.ts +2 -3
  55. package/dist/core/SideDialogs.d.ts +4 -2
  56. package/dist/core/index.d.ts +4 -4
  57. package/dist/form/EntityForm.d.ts +37 -69
  58. package/dist/form/EntityFormActions.d.ts +17 -0
  59. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  60. package/dist/form/components/ErrorFocus.d.ts +1 -1
  61. package/dist/form/components/FieldHelperText.d.ts +3 -3
  62. package/dist/form/components/FormEntry.d.ts +6 -0
  63. package/dist/form/components/FormLayout.d.ts +5 -0
  64. package/dist/form/components/LabelWithIcon.d.ts +1 -1
  65. package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
  66. package/dist/form/components/StorageItemPreview.d.ts +4 -4
  67. package/dist/form/components/index.d.ts +3 -1
  68. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
  69. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
  70. package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
  71. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
  72. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  73. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
  74. package/dist/form/field_bindings/{MultiSelectBinding.d.ts → MultiSelectFieldBinding.d.ts} +1 -1
  75. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
  76. package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -2
  77. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
  78. package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
  79. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +3 -5
  80. package/dist/form/field_bindings/SwitchFieldBinding.d.ts +1 -2
  81. package/dist/form/field_bindings/TextFieldBinding.d.ts +1 -1
  82. package/dist/form/index.d.ts +16 -18
  83. package/dist/form/useClearRestoreValue.d.ts +2 -2
  84. package/dist/hooks/data/delete.d.ts +4 -4
  85. package/dist/hooks/data/save.d.ts +4 -5
  86. package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
  87. package/dist/hooks/data/useEntityFetch.d.ts +4 -3
  88. package/dist/hooks/index.d.ts +1 -0
  89. package/dist/hooks/useAuthController.d.ts +1 -1
  90. package/dist/hooks/useBreadcrumbsController.d.ts +26 -0
  91. package/dist/hooks/useBuildNavigationController.d.ts +7 -5
  92. package/dist/hooks/useFireCMSContext.d.ts +1 -1
  93. package/dist/hooks/useModeController.d.ts +1 -2
  94. package/dist/hooks/useProjectLog.d.ts +8 -2
  95. package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
  96. package/dist/hooks/useValidateAuthenticator.d.ts +4 -8
  97. package/dist/index.d.ts +1 -0
  98. package/dist/index.es.js +21921 -14330
  99. package/dist/index.es.js.map +1 -1
  100. package/dist/index.umd.js +24271 -588
  101. package/dist/index.umd.js.map +1 -1
  102. package/dist/internal/useBuildDataSource.d.ts +1 -16
  103. package/dist/internal/useBuildSideEntityController.d.ts +2 -2
  104. package/dist/internal/useUnsavedChangesDialog.d.ts +7 -9
  105. package/dist/preview/PropertyPreviewProps.d.ts +6 -1
  106. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  107. package/dist/preview/components/ReferencePreview.d.ts +3 -2
  108. package/dist/preview/components/StorageThumbnail.d.ts +2 -1
  109. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  110. package/dist/preview/util.d.ts +3 -3
  111. package/dist/routes/CustomCMSRoute.d.ts +4 -0
  112. package/dist/routes/FireCMSRoute.d.ts +1 -0
  113. package/dist/routes/HomePageRoute.d.ts +3 -0
  114. package/dist/types/auth.d.ts +8 -10
  115. package/dist/types/collections.d.ts +77 -22
  116. package/dist/types/datasource.d.ts +52 -36
  117. package/dist/types/dialogs_controller.d.ts +7 -3
  118. package/dist/types/entities.d.ts +7 -2
  119. package/dist/types/entity_actions.d.ts +28 -4
  120. package/dist/types/entity_callbacks.d.ts +16 -16
  121. package/dist/types/entity_overrides.d.ts +2 -2
  122. package/dist/types/export_import.d.ts +4 -4
  123. package/dist/types/fields.d.ts +71 -42
  124. package/dist/types/firecms.d.ts +6 -2
  125. package/dist/types/firecms_context.d.ts +1 -1
  126. package/dist/types/index.d.ts +0 -1
  127. package/dist/types/navigation.d.ts +32 -14
  128. package/dist/types/permissions.d.ts +4 -4
  129. package/dist/types/plugins.d.ts +23 -12
  130. package/dist/types/properties.d.ts +52 -24
  131. package/dist/types/property_config.d.ts +0 -2
  132. package/dist/types/side_dialogs_controller.d.ts +10 -0
  133. package/dist/types/side_entity_controller.d.ts +6 -1
  134. package/dist/types/storage.d.ts +86 -3
  135. package/dist/types/user.d.ts +1 -0
  136. package/dist/util/builders.d.ts +3 -3
  137. package/dist/util/entities.d.ts +3 -3
  138. package/dist/util/entity_actions.d.ts +2 -0
  139. package/dist/util/entity_cache.d.ts +23 -0
  140. package/dist/util/icon_list.d.ts +5 -1
  141. package/dist/util/icon_synonyms.d.ts +1 -98
  142. package/dist/util/icons.d.ts +6 -3
  143. package/dist/util/index.d.ts +2 -0
  144. package/dist/util/navigation_from_path.d.ts +6 -1
  145. package/dist/util/navigation_utils.d.ts +14 -3
  146. package/dist/util/objects.d.ts +2 -1
  147. package/dist/util/permissions.d.ts +4 -4
  148. package/dist/util/plurals.d.ts +0 -2
  149. package/dist/util/property_utils.d.ts +3 -3
  150. package/dist/util/resolutions.d.ts +36 -17
  151. package/dist/util/storage.d.ts +23 -2
  152. package/dist/util/useStorageUploadController.d.ts +3 -3
  153. package/package.json +62 -48
  154. package/src/app/AppBar.tsx +18 -0
  155. package/src/app/Drawer.tsx +24 -0
  156. package/src/app/Scaffold.tsx +253 -0
  157. package/src/app/index.ts +4 -0
  158. package/src/app/useApp.tsx +32 -0
  159. package/src/components/ArrayContainer.tsx +127 -41
  160. package/src/components/CircularProgressCenter.tsx +2 -2
  161. package/src/components/ClearFilterSortButton.tsx +41 -0
  162. package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +3 -3
  163. package/src/components/DeleteEntityDialog.tsx +10 -19
  164. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +54 -37
  165. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +38 -31
  166. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +30 -9
  167. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +47 -39
  168. package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
  169. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +30 -16
  170. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +19 -17
  171. package/src/components/EntityCollectionTable/index.tsx +1 -1
  172. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +31 -36
  173. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +36 -34
  174. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +20 -8
  175. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +81 -80
  176. package/src/components/EntityCollectionView/EntityCollectionView.tsx +207 -113
  177. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +4 -2
  178. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
  179. package/src/components/EntityCollectionView/useSelectionController.tsx +20 -7
  180. package/src/components/EntityCollectionView/utils.ts +19 -0
  181. package/src/components/EntityJsonPreview.tsx +66 -0
  182. package/src/components/EntityPreview.tsx +62 -52
  183. package/src/components/EntityView.tsx +10 -10
  184. package/src/components/ErrorView.tsx +4 -4
  185. package/src/components/HomePage/DefaultHomePage.tsx +26 -19
  186. package/src/components/HomePage/FavouritesView.tsx +6 -11
  187. package/src/components/HomePage/NavigationCard.tsx +3 -3
  188. package/src/components/HomePage/NavigationCardBinding.tsx +5 -10
  189. package/src/components/HomePage/NavigationGroup.tsx +2 -2
  190. package/src/components/HomePage/SmallNavigationCard.tsx +5 -6
  191. package/src/components/NotFoundPage.tsx +2 -2
  192. package/src/components/PropertyConfigBadge.tsx +9 -3
  193. package/src/components/PropertyIdCopyTooltip.tsx +47 -0
  194. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +19 -13
  195. package/src/components/ReferenceWidget.tsx +21 -11
  196. package/src/components/SearchIconsView.tsx +10 -7
  197. package/src/components/SelectableTable/SelectableTable.tsx +27 -12
  198. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
  199. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +25 -8
  200. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +36 -12
  201. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +92 -23
  202. package/src/components/UnsavedChangesDialog.tsx +42 -0
  203. package/src/components/VirtualTable/VirtualTable.tsx +96 -48
  204. package/src/components/VirtualTable/VirtualTableCell.tsx +1 -9
  205. package/src/components/VirtualTable/VirtualTableHeader.tsx +10 -10
  206. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
  207. package/src/components/VirtualTable/VirtualTableProps.tsx +33 -14
  208. package/src/components/VirtualTable/VirtualTableRow.tsx +5 -6
  209. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +5 -5
  210. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +3 -2
  211. package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
  212. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +16 -28
  213. package/src/components/VirtualTable/types.tsx +2 -3
  214. package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +33 -40
  215. package/src/components/common/index.ts +2 -1
  216. package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
  217. package/src/components/common/types.tsx +4 -6
  218. package/src/components/common/useColumnsIds.tsx +24 -3
  219. package/src/components/common/useDataSourceTableController.tsx +420 -0
  220. package/src/components/common/useDebouncedCallback.tsx +20 -0
  221. package/src/components/common/useScrollRestoration.tsx +68 -0
  222. package/src/components/common/useTableSearchHelper.ts +53 -12
  223. package/src/components/index.tsx +4 -2
  224. package/src/contexts/BreacrumbsContext.tsx +38 -0
  225. package/src/contexts/DialogsProvider.tsx +5 -4
  226. package/src/contexts/ModeController.tsx +1 -3
  227. package/src/contexts/SnackbarProvider.tsx +2 -0
  228. package/src/core/DefaultAppBar.tsx +219 -0
  229. package/src/core/DefaultDrawer.tsx +185 -0
  230. package/src/core/DrawerNavigationItem.tsx +66 -0
  231. package/src/core/EntityEditView.tsx +345 -480
  232. package/src/core/EntityEditViewFormActions.tsx +199 -0
  233. package/src/core/EntitySidePanel.tsx +86 -17
  234. package/src/core/FireCMS.tsx +56 -49
  235. package/src/core/FireCMSRouter.tsx +17 -0
  236. package/src/core/NavigationRoutes.tsx +28 -38
  237. package/src/core/SideDialogs.tsx +22 -12
  238. package/src/core/field_configs.tsx +11 -12
  239. package/src/core/index.tsx +6 -5
  240. package/src/form/EntityForm.tsx +585 -539
  241. package/src/form/EntityFormActions.tsx +169 -0
  242. package/src/form/PropertyFieldBinding.tsx +85 -44
  243. package/src/form/components/CustomIdField.tsx +6 -2
  244. package/src/form/components/FieldHelperText.tsx +4 -4
  245. package/src/form/components/FormEntry.tsx +22 -0
  246. package/src/form/components/FormLayout.tsx +16 -0
  247. package/src/form/components/LabelWithIcon.tsx +30 -19
  248. package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
  249. package/src/form/components/StorageItemPreview.tsx +22 -12
  250. package/src/form/components/StorageUploadProgress.tsx +4 -5
  251. package/src/form/components/index.tsx +3 -1
  252. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +31 -19
  253. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +47 -35
  254. package/src/form/field_bindings/BlockFieldBinding.tsx +56 -34
  255. package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -14
  256. package/src/form/field_bindings/KeyValueFieldBinding.tsx +60 -51
  257. package/src/form/field_bindings/MapFieldBinding.tsx +71 -54
  258. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +153 -0
  259. package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +25 -20
  260. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +11 -16
  261. package/src/form/field_bindings/ReferenceFieldBinding.tsx +42 -31
  262. package/src/form/field_bindings/RepeatFieldBinding.tsx +56 -35
  263. package/src/form/field_bindings/SelectFieldBinding.tsx +22 -14
  264. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +42 -50
  265. package/src/form/field_bindings/SwitchFieldBinding.tsx +29 -24
  266. package/src/form/field_bindings/TextFieldBinding.tsx +28 -24
  267. package/src/form/index.tsx +16 -37
  268. package/src/form/useClearRestoreValue.tsx +2 -2
  269. package/src/form/validation.ts +13 -23
  270. package/src/hooks/data/delete.ts +6 -5
  271. package/src/hooks/data/save.ts +13 -9
  272. package/src/hooks/data/useCollectionFetch.tsx +3 -3
  273. package/src/hooks/data/useDataSource.tsx +11 -3
  274. package/src/hooks/data/useEntityFetch.tsx +10 -6
  275. package/src/hooks/index.tsx +1 -0
  276. package/src/hooks/useAuthController.tsx +1 -1
  277. package/src/hooks/useBreadcrumbsController.tsx +31 -0
  278. package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
  279. package/src/hooks/useBuildModeController.tsx +22 -29
  280. package/src/hooks/useBuildNavigationController.tsx +159 -54
  281. package/src/hooks/useFireCMSContext.tsx +5 -5
  282. package/src/hooks/useLargeLayout.tsx +0 -35
  283. package/src/hooks/useModeController.tsx +1 -2
  284. package/src/hooks/useProjectLog.tsx +32 -10
  285. package/src/hooks/useResolvedNavigationFrom.tsx +10 -12
  286. package/src/hooks/useValidateAuthenticator.tsx +17 -37
  287. package/src/index.ts +1 -0
  288. package/src/internal/useBuildDataSource.ts +72 -82
  289. package/src/internal/useBuildSideDialogsController.tsx +4 -2
  290. package/src/internal/useBuildSideEntityController.tsx +194 -73
  291. package/src/internal/useUnsavedChangesDialog.tsx +127 -91
  292. package/src/preview/PropertyPreview.tsx +17 -24
  293. package/src/preview/PropertyPreviewProps.tsx +7 -1
  294. package/src/preview/components/BooleanPreview.tsx +2 -2
  295. package/src/preview/components/EmptyValue.tsx +1 -1
  296. package/src/preview/components/EnumValuesChip.tsx +2 -2
  297. package/src/preview/components/ImagePreview.tsx +25 -36
  298. package/src/preview/components/ReferencePreview.tsx +22 -33
  299. package/src/preview/components/StorageThumbnail.tsx +5 -1
  300. package/src/preview/components/UrlComponentPreview.tsx +60 -28
  301. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +2 -3
  302. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +4 -3
  303. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +2 -3
  304. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +1 -2
  305. package/src/preview/property_previews/ArrayOneOfPreview.tsx +4 -5
  306. package/src/preview/property_previews/ArrayPropertyPreview.tsx +4 -5
  307. package/src/preview/property_previews/MapPropertyPreview.tsx +12 -11
  308. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +12 -12
  309. package/src/preview/property_previews/StringPropertyPreview.tsx +3 -3
  310. package/src/preview/util.ts +10 -10
  311. package/src/routes/CustomCMSRoute.tsx +21 -0
  312. package/src/routes/FireCMSRoute.tsx +235 -0
  313. package/src/routes/HomePageRoute.tsx +17 -0
  314. package/src/types/auth.tsx +9 -13
  315. package/src/types/collections.ts +94 -27
  316. package/src/types/customization_controller.tsx +0 -1
  317. package/src/types/datasource.ts +61 -43
  318. package/src/types/dialogs_controller.tsx +7 -3
  319. package/src/types/entities.ts +12 -2
  320. package/src/types/entity_actions.tsx +32 -7
  321. package/src/types/entity_callbacks.ts +18 -18
  322. package/src/types/entity_overrides.tsx +2 -2
  323. package/src/types/export_import.ts +4 -4
  324. package/src/types/fields.tsx +81 -46
  325. package/src/types/firecms.tsx +7 -2
  326. package/src/types/firecms_context.tsx +1 -1
  327. package/src/types/index.ts +0 -1
  328. package/src/types/navigation.ts +38 -18
  329. package/src/types/permissions.ts +5 -5
  330. package/src/types/plugins.tsx +25 -14
  331. package/src/types/properties.ts +60 -25
  332. package/src/types/property_config.tsx +0 -2
  333. package/src/types/side_dialogs_controller.tsx +15 -0
  334. package/src/types/side_entity_controller.tsx +6 -1
  335. package/src/types/storage.ts +94 -3
  336. package/src/types/user.ts +2 -0
  337. package/src/util/builders.ts +10 -8
  338. package/src/util/entities.ts +9 -6
  339. package/src/util/entity_actions.ts +28 -0
  340. package/src/util/entity_cache.ts +204 -0
  341. package/src/util/enums.ts +1 -1
  342. package/src/util/icon_list.ts +16 -10
  343. package/src/util/icon_synonyms.ts +3 -100
  344. package/src/util/icons.tsx +17 -7
  345. package/src/util/index.ts +2 -0
  346. package/src/util/join_collections.ts +3 -0
  347. package/src/util/make_properties_editable.ts +13 -5
  348. package/src/util/navigation_from_path.ts +13 -6
  349. package/src/util/navigation_utils.ts +59 -7
  350. package/src/util/objects.ts +48 -28
  351. package/src/util/parent_references_from_path.ts +3 -3
  352. package/src/util/permissions.ts +9 -8
  353. package/src/util/plurals.ts +0 -2
  354. package/src/util/property_utils.tsx +11 -4
  355. package/src/util/references.ts +11 -2
  356. package/src/util/resolutions.ts +100 -46
  357. package/src/util/storage.ts +79 -21
  358. package/src/util/strings.ts +2 -2
  359. package/src/util/useStorageUploadController.tsx +71 -27
  360. package/dist/components/FireCMSAppBar.d.ts +0 -26
  361. package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
  362. package/dist/components/VirtualTable/common.d.ts +0 -2
  363. package/dist/core/Drawer.d.ts +0 -23
  364. package/dist/core/Scaffold.d.ts +0 -55
  365. package/dist/core/SideEntityView.d.ts +0 -7
  366. package/dist/form/components/FormikArrayContainer.d.ts +0 -18
  367. package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
  368. package/dist/internal/useBuildCustomizationController.d.ts +0 -2
  369. package/dist/internal/useLocaleConfig.d.ts +0 -1
  370. package/dist/types/appcheck.d.ts +0 -26
  371. package/src/components/FireCMSAppBar.tsx +0 -165
  372. package/src/components/PropertyIdCopyTooltipContent.tsx +0 -28
  373. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +0 -225
  374. package/src/core/Drawer.tsx +0 -191
  375. package/src/core/Scaffold.tsx +0 -281
  376. package/src/core/SideEntityView.tsx +0 -38
  377. package/src/form/components/FormikArrayContainer.tsx +0 -44
  378. package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -695
  379. package/src/internal/useBuildCustomizationController.tsx +0 -5
  380. package/src/internal/useLocaleConfig.tsx +0 -18
  381. package/src/types/appcheck.ts +0 -29
  382. /package/src/util/{common.tsx → common.ts} +0 -0
@@ -0,0 +1,199 @@
1
+ import React, { useMemo } from "react";
2
+ import { Entity, EntityAction, FireCMSContext, ResolvedEntityCollection, SideEntityController } from "../types";
3
+
4
+ import { copyEntityAction, deleteEntityAction } from "../components";
5
+ import { canCreateEntity, canDeleteEntity, mergeEntityActions } from "../util";
6
+ import { Button, cls, defaultBorderMixin, DialogActions, IconButton, LoadingButton, Typography } from "@firecms/ui";
7
+ import { useAuthController, useFireCMSContext, useSideEntityController } from "../hooks";
8
+ import { EntityFormActionsProps } from "../form/EntityFormActions";
9
+ import { SideDialogController, useSideDialogContext } from "./SideDialogs";
10
+
11
+ export function EntityEditViewFormActions({
12
+ collection,
13
+ path,
14
+ entity,
15
+ layout,
16
+ savingError,
17
+ formex,
18
+ disabled,
19
+ status,
20
+ pluginActions,
21
+ openEntityMode,
22
+ showDefaultActions = true
23
+ }: EntityFormActionsProps) {
24
+
25
+ const authController = useAuthController();
26
+ const context = useFireCMSContext();
27
+ const sideEntityController = useSideEntityController();
28
+ const sideDialogContext = useSideDialogContext();
29
+
30
+ const entityActions = useMemo((): EntityAction[] => {
31
+ const customEntityActions = collection.entityActions
32
+ const createEnabled = canCreateEntity(collection, authController, path, null);
33
+ const deleteEnabled = entity ? canDeleteEntity(collection, authController, path, entity) : false;
34
+ const actions: EntityAction[] = [];
35
+ if (createEnabled)
36
+ actions.push(copyEntityAction);
37
+ if (deleteEnabled)
38
+ actions.push(deleteEntityAction);
39
+ if (customEntityActions)
40
+ return mergeEntityActions(actions, customEntityActions);
41
+ return actions;
42
+ }, [authController, collection, path]);
43
+
44
+ const formActions = showDefaultActions ? entityActions.filter(a => a.includeInForm === undefined || a.includeInForm) : [];
45
+
46
+ return layout === "bottom"
47
+ ? buildBottomActions({
48
+ savingError,
49
+ entity,
50
+ formActions,
51
+ collection,
52
+ context,
53
+ sideEntityController,
54
+ isSubmitting: formex.isSubmitting,
55
+ disabled,
56
+ status,
57
+ sideDialogContext,
58
+ pluginActions,
59
+ openEntityMode,
60
+ })
61
+ : buildSideActions({
62
+ savingError,
63
+ entity,
64
+ formActions,
65
+ collection,
66
+ context,
67
+ sideEntityController,
68
+ isSubmitting: formex.isSubmitting,
69
+ sideDialogContext,
70
+ disabled,
71
+ status,
72
+ pluginActions,
73
+ openEntityMode,
74
+ });
75
+ }
76
+
77
+ type ActionsViewProps<M extends object> = {
78
+ savingError: Error | undefined,
79
+ entity: Entity<M> | undefined,
80
+ formActions: EntityAction[],
81
+ collection: ResolvedEntityCollection,
82
+ context: FireCMSContext,
83
+ sideEntityController: SideEntityController,
84
+ isSubmitting: boolean,
85
+ disabled: boolean,
86
+ status: "new" | "existing" | "copy",
87
+ sideDialogContext: SideDialogController,
88
+ pluginActions?: React.ReactNode[],
89
+ openEntityMode: "side_panel" | "full_screen";
90
+ };
91
+
92
+ function buildBottomActions<M extends object>({
93
+ savingError,
94
+ entity,
95
+ formActions,
96
+ collection,
97
+ context,
98
+ sideEntityController,
99
+ isSubmitting,
100
+ disabled,
101
+ status,
102
+ sideDialogContext,
103
+ pluginActions,
104
+ openEntityMode,
105
+ }: ActionsViewProps<M>) {
106
+
107
+ const canClose = openEntityMode === "side_panel";
108
+ return <DialogActions position={"absolute"}>
109
+ {savingError &&
110
+ <div className="text-right">
111
+ <Typography color={"error"}>{savingError.message}</Typography>
112
+ </div>
113
+ }
114
+ {entity && formActions.length > 0 && <div className="flex-grow flex overflow-auto no-scrollbar">
115
+ {formActions.map(action => (
116
+ <IconButton
117
+ key={action.name}
118
+ color="primary"
119
+ onClick={(event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
120
+ event.stopPropagation();
121
+ if (entity)
122
+ action.onClick({
123
+ entity,
124
+ fullPath: collection.path,
125
+ collection: collection,
126
+ context,
127
+ sideEntityController,
128
+ openEntityMode: openEntityMode
129
+ });
130
+ }}>
131
+ {action.icon}
132
+ </IconButton>
133
+ ))}
134
+ </div>}
135
+ {pluginActions}
136
+ <Button variant="text" disabled={disabled || isSubmitting} type="reset">
137
+ {status === "existing" ? "Discard" : "Clear"}
138
+ </Button>
139
+ <Button variant={canClose ? "text" : "filled"} color="primary" type="submit"
140
+ disabled={disabled || isSubmitting}
141
+ onClick={() => {
142
+ sideDialogContext.setPendingClose(false);
143
+ }}>
144
+ {status === "existing" && "Save"}
145
+ {status === "copy" && "Create copy"}
146
+ {status === "new" && "Create"}
147
+ </Button>
148
+ {canClose && <LoadingButton variant="filled"
149
+ color="primary"
150
+ type="submit"
151
+ loading={isSubmitting}
152
+ disabled={disabled}
153
+ onClick={() => {
154
+ sideDialogContext.setPendingClose?.(true);
155
+ }}>
156
+ {status === "existing" && "Save and close"}
157
+ {status === "copy" && "Create copy and close"}
158
+ {status === "new" && "Create and close"}
159
+ </LoadingButton>}
160
+ </DialogActions>;
161
+ }
162
+
163
+ function buildSideActions<M extends object>({
164
+ savingError,
165
+ entity,
166
+ formActions,
167
+ collection,
168
+ context,
169
+ sideEntityController,
170
+ isSubmitting,
171
+ disabled,
172
+ status,
173
+ sideDialogContext,
174
+ pluginActions
175
+ }: ActionsViewProps<M>) {
176
+
177
+ return <div
178
+ 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)}>
179
+ <LoadingButton fullWidth={true} variant="filled" color="primary" type="submit" size={"large"}
180
+ disabled={disabled || isSubmitting} onClick={() => {
181
+ sideDialogContext.setPendingClose?.(false);
182
+ }}>
183
+ {status === "existing" && "Save"}
184
+ {status === "copy" && "Create copy"}
185
+ {status === "new" && "Create"}
186
+ </LoadingButton>
187
+ <Button fullWidth={true} variant="text" disabled={disabled || isSubmitting} type="reset">
188
+ {status === "existing" ? "Discard" : "Clear"}
189
+ </Button>
190
+
191
+ {pluginActions}
192
+
193
+ {savingError &&
194
+ <div className="text-right">
195
+ <Typography color={"error"}>{savingError.message}</Typography>
196
+ </div>
197
+ }
198
+ </div>;
199
+ }
@@ -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
@@ -20,30 +22,64 @@ export function EntitySidePanel(props: EntitySidePanelProps) {
20
22
  const {
21
23
  blocked,
22
24
  setBlocked,
23
- setBlockedNavigationMessage
25
+ setBlockedNavigationMessage,
26
+ close
24
27
  } = useSideDialogContext();
25
28
 
29
+ const navigate = useNavigate();
30
+ const location = useLocation();
31
+
32
+ const sideEntityController = useSideEntityController();
26
33
  const navigationController = useNavigationController();
34
+ const sideDialogsController = useSideDialogContext();
35
+
36
+ const onClose = () => {
37
+ if (props.onClose) {
38
+ props.onClose();
39
+ }
40
+
41
+ setBlocked(false);
42
+ close(true);
43
+ }
44
+
45
+ const onUpdate = (params: OnUpdateParams) => {
46
+ if (props.onUpdate) {
47
+ props.onUpdate(params);
48
+ }
49
+ if (params.status !== "existing") {
50
+ sideEntityController.replace({
51
+ path: params.path,
52
+ entityId: params.entityId,
53
+ selectedTab: params.selectedTab,
54
+ updateUrl: true,
55
+ collection: params.collection,
56
+ });
57
+ }
58
+
59
+ if (sideDialogsController.pendingClose) {
60
+ sideDialogsController.setPendingClose(false);
61
+ onClose();
62
+ }
63
+
64
+ }
27
65
 
28
66
  const parentCollectionIds = useMemo(() => {
29
67
  return navigationController.getParentCollectionIds(props.path);
30
68
  }, [navigationController, props.path]);
31
69
 
32
70
  const collection = useMemo(() => {
33
- if (!props) return undefined;
34
- let usedCollection = props.collection;
71
+ if (props.collection) {
72
+ return props.collection;
73
+ }
35
74
 
36
- const registryCollection = navigationController.getCollection(props.path, props.entityId);
75
+ const registryCollection = navigationController.getCollection(props.path);
37
76
  if (registryCollection) {
38
- usedCollection = registryCollection;
39
- }
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.");
77
+ return registryCollection;
43
78
  }
44
79
 
45
- return usedCollection;
46
- }, [navigationController, props]);
80
+ console.error("ERROR: No collection found in path `", props.path, "`. Entity id: ", props.entityId);
81
+ throw Error("ERROR: No collection found in path `" + props.path + "`. Make sure you have defined a collection for this path in the root navigation.");
82
+ }, [navigationController, props.collection]);
47
83
 
48
84
  useEffect(() => {
49
85
  function beforeunload(e: any) {
@@ -63,11 +99,11 @@ export function EntitySidePanel(props: EntitySidePanelProps) {
63
99
 
64
100
  }, [blocked, collection]);
65
101
 
66
- const onValuesAreModified = useCallback((modified: boolean) => {
67
- setBlocked(modified);
102
+ const onValuesModified = useCallback((modified: boolean) => {
68
103
  setBlockedNavigationMessage(modified
69
104
  ? <> You have unsaved changes in this <b>{collection?.singularName ?? collection?.name}</b>.</>
70
105
  : undefined)
106
+ setBlocked(modified);
71
107
  }, [collection?.name, setBlocked, setBlockedNavigationMessage]);
72
108
 
73
109
  if (!props || !collection) {
@@ -79,10 +115,43 @@ export function EntitySidePanel(props: EntitySidePanelProps) {
79
115
  <ErrorBoundary>
80
116
  <EntityEditView
81
117
  {...props}
82
- formWidth={props.width}
118
+ layout={"side_panel"}
83
119
  collection={collection}
84
120
  parentCollectionIds={parentCollectionIds}
85
- onValuesAreModified={onValuesAreModified}
121
+ onValuesModified={onValuesModified}
122
+ onSaved={onUpdate}
123
+ barActions={<>
124
+ <IconButton
125
+ className="self-center"
126
+ onClick={onClose}>
127
+ <CloseIcon size={"small"}/>
128
+ </IconButton>
129
+ <IconButton
130
+ className="self-center"
131
+ onClick={() => {
132
+ if (props.entityId)
133
+ navigate(location.pathname);
134
+ else
135
+ navigate(location.pathname + "#new");
136
+ }}>
137
+ <OpenInFullIcon size={"small"}/>
138
+ </IconButton>
139
+ </>}
140
+ onTabChange={({
141
+ path,
142
+ entityId,
143
+ selectedTab,
144
+ collection,
145
+ }) => {
146
+ sideEntityController.replace({
147
+ path,
148
+ entityId,
149
+ selectedTab,
150
+ updateUrl: true,
151
+ collection,
152
+ });
153
+ }}
154
+ formProps={props.formProps}
86
155
  />
87
156
  </ErrorBoundary>
88
157
 
@@ -1,9 +1,11 @@
1
- import React, { useMemo } from "react";
1
+ "use client";
2
2
 
3
- import { EntityCollection, FireCMSContext, FireCMSPlugin, FireCMSProps, User } from "../types";
4
- import { AuthControllerContext, ModeControllerContext } from "../contexts";
3
+ import React, { useMemo } from "react";
4
+ import { CenteredView, Typography } from "@firecms/ui";
5
+ import { CustomizationController, EntityCollection, FireCMSContext, FireCMSPlugin, FireCMSProps, User } from "../types";
6
+ import { AuthControllerContext } from "../contexts";
5
7
  import { useBuildSideEntityController } from "../internal/useBuildSideEntityController";
6
- import { useCustomizationController, useFireCMSContext, useModeController } from "../hooks";
8
+ import { useCustomizationController, useFireCMSContext } from "../hooks";
7
9
  import { useBuildSideDialogsController } from "../internal/useBuildSideDialogsController";
8
10
  import { ErrorView } from "../components";
9
11
  import { StorageSourceContext } from "../contexts/StorageSourceContext";
@@ -12,14 +14,12 @@ 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 { useLocaleConfig } from "../internal/useLocaleConfig";
16
- import { CenteredView, Typography } from "@firecms/ui";
17
17
  import { DialogsProvider } from "../contexts/DialogsProvider";
18
18
  import { useBuildDataSource } from "../internal/useBuildDataSource";
19
- import { useBuildCustomizationController } from "../internal/useBuildCustomizationController";
20
19
  import { CustomizationControllerContext } from "../contexts/CustomizationControllerContext";
21
20
  import { AnalyticsContext } from "../contexts/AnalyticsContext";
22
21
  import { useProjectLog } from "../hooks/useProjectLog";
22
+ import { BreadcrumbsProvider } from "../contexts/BreacrumbsContext";
23
23
 
24
24
  /**
25
25
  * If you are using independent components of the CMS
@@ -30,12 +30,11 @@ import { useProjectLog } from "../hooks/useProjectLog";
30
30
  *
31
31
  * You only need to use this component if you are building a custom app.
32
32
  *
33
- * @constructor
33
+
34
34
  * @group Core
35
35
  */
36
- export function FireCMS<UserType extends User, EC extends EntityCollection>(props: FireCMSProps<UserType, EC>) {
36
+ export function FireCMS<USER extends User>(props: FireCMSProps<USER>) {
37
37
 
38
- const modeController = useModeController();
39
38
  const {
40
39
  children,
41
40
  entityLinkBuilder,
@@ -51,10 +50,9 @@ export function FireCMS<UserType extends User, EC extends EntityCollection>(prop
51
50
  entityViews,
52
51
  components,
53
52
  navigationController,
53
+ apiKey
54
54
  } = props;
55
55
 
56
- useLocaleConfig(locale);
57
-
58
56
  /**
59
57
  * Controller in charge of fetching and persisting data
60
58
  */
@@ -71,7 +69,7 @@ export function FireCMS<UserType extends User, EC extends EntityCollection>(prop
71
69
 
72
70
  const loading = authController.initialLoading || navigationController.loading || pluginsLoading;
73
71
 
74
- const customizationController = useBuildCustomizationController({
72
+ const customizationController: CustomizationController = {
75
73
  dateTimeFormat,
76
74
  locale,
77
75
  entityLinkBuilder,
@@ -79,13 +77,22 @@ export function FireCMS<UserType extends User, EC extends EntityCollection>(prop
79
77
  entityViews: entityViews ?? [],
80
78
  propertyConfigs: propertyConfigs ?? {},
81
79
  components
82
- });
80
+ };
83
81
 
84
82
  const analyticsController = useMemo(() => ({
85
83
  onAnalyticsEvent
86
84
  }), []);
87
85
 
88
- const accessResponse = useProjectLog(authController, plugins);
86
+ const accessResponse = useProjectLog({
87
+ apiKey,
88
+ authController,
89
+ dataSourceDelegate,
90
+ plugins
91
+ });
92
+
93
+ if (accessResponse?.message) {
94
+ console.warn(accessResponse.message);
95
+ }
89
96
 
90
97
  if (navigationController.navigationLoadingError) {
91
98
  return (
@@ -109,54 +116,54 @@ export function FireCMS<UserType extends User, EC extends EntityCollection>(prop
109
116
 
110
117
  if (accessResponse?.blocked) {
111
118
  return (
112
- <CenteredView maxWidth={"md"} fullScreen={true}>
113
- <Typography variant={"h4"}>
114
- Access blocked
119
+ <CenteredView maxWidth={"md"} fullScreen={true} className={"flex flex-col gap-2"}>
120
+ <Typography variant={"h4"} gutterBottom>
121
+ License needed
115
122
  </Typography>
116
123
  <Typography>
117
- This app has been blocked. Please reach out at <a
124
+ You need a valid license to use FireCMS PRO. Please reach out at <a
118
125
  href={"mailto:hello@firecms.co"}>hello@firecms.co</a> for more information.
119
126
  </Typography>
120
127
  {accessResponse?.message &&
121
- <Typography>Response from the server: {accessResponse?.message}</Typography>}
128
+ <Typography>{accessResponse?.message}</Typography>}
122
129
  </CenteredView>
123
130
  );
124
131
  }
125
132
 
126
133
  return (
127
- <ModeControllerContext.Provider value={modeController}>
128
- <AnalyticsContext.Provider value={analyticsController}>
129
- <CustomizationControllerContext.Provider value={customizationController}>
130
- <UserConfigurationPersistenceContext.Provider
131
- value={userConfigPersistence}>
132
- <StorageSourceContext.Provider
133
- value={storageSource}>
134
- <DataSourceContext.Provider
135
- value={dataSource}>
136
- <AuthControllerContext.Provider
137
- value={authController}>
138
- <SideDialogsControllerContext.Provider
139
- value={sideDialogsController}>
140
- <SideEntityControllerContext.Provider
141
- value={sideEntityController}>
142
- <NavigationContext.Provider
143
- value={navigationController}>
144
- <DialogsProvider>
134
+ <AnalyticsContext.Provider value={analyticsController}>
135
+ <CustomizationControllerContext.Provider value={customizationController}>
136
+ <UserConfigurationPersistenceContext.Provider
137
+ value={userConfigPersistence}>
138
+ <StorageSourceContext.Provider
139
+ value={storageSource}>
140
+ <DataSourceContext.Provider
141
+ value={dataSource}>
142
+ <AuthControllerContext.Provider
143
+ value={authController}>
144
+ <SideDialogsControllerContext.Provider
145
+ value={sideDialogsController}>
146
+ <SideEntityControllerContext.Provider
147
+ value={sideEntityController}>
148
+ <NavigationContext.Provider
149
+ value={navigationController}>
150
+ <DialogsProvider>
151
+ <BreadcrumbsProvider>
145
152
  <FireCMSInternal
146
153
  loading={loading}>
147
154
  {children}
148
155
  </FireCMSInternal>
149
- </DialogsProvider>
150
- </NavigationContext.Provider>
151
- </SideEntityControllerContext.Provider>
152
- </SideDialogsControllerContext.Provider>
153
- </AuthControllerContext.Provider>
154
- </DataSourceContext.Provider>
155
- </StorageSourceContext.Provider>
156
- </UserConfigurationPersistenceContext.Provider>
157
- </CustomizationControllerContext.Provider>
158
- </AnalyticsContext.Provider>
159
- </ModeControllerContext.Provider>
156
+ </BreadcrumbsProvider>
157
+ </DialogsProvider>
158
+ </NavigationContext.Provider>
159
+ </SideEntityControllerContext.Provider>
160
+ </SideDialogsControllerContext.Provider>
161
+ </AuthControllerContext.Provider>
162
+ </DataSourceContext.Provider>
163
+ </StorageSourceContext.Provider>
164
+ </UserConfigurationPersistenceContext.Provider>
165
+ </CustomizationControllerContext.Provider>
166
+ </AnalyticsContext.Provider>
160
167
  );
161
168
 
162
169
  }
@@ -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
+ }
@@ -2,9 +2,11 @@ import React from "react";
2
2
 
3
3
  import { Route, Routes, useLocation } from "react-router-dom";
4
4
  import { CMSView } from "../types";
5
- import { DefaultHomePage, EntityCollectionView, ErrorBoundary, NotFoundPage } from "../components";
5
+ import { DefaultHomePage, ErrorBoundary, NotFoundPage } from "../components";
6
6
  import { useNavigationController } from "../hooks";
7
- import { toArray } from "../util/arrays";
7
+ import { FireCMSRoute } from "../routes/FireCMSRoute";
8
+ import { CustomCMSRoute } from "../routes/CustomCMSRoute";
9
+ import { HomePageRoute } from "../routes/HomePageRoute";
8
10
 
9
11
  /**
10
12
  * @group Components
@@ -13,9 +15,9 @@ export type NavigationRoutesProps = {
13
15
  /**
14
16
  * In case you need to override the home page
15
17
  */
16
- HomePage?: React.ComponentType;
18
+ homePage?: React.ReactNode;
17
19
 
18
- customRoutes?: React.ReactNode[]
20
+ children?: React.ReactNode | React.ReactNode[]
19
21
 
20
22
  };
21
23
 
@@ -25,14 +27,12 @@ export type NavigationRoutesProps = {
25
27
  * or the home route) related to a {@link NavigationController}.
26
28
  * This component needs a parent {@link FireCMS}
27
29
  *
28
- * @constructor
29
30
  * @group Components
30
31
  */
31
-
32
32
  export const NavigationRoutes = React.memo<NavigationRoutesProps>(
33
33
  function NavigationRoutes({
34
- HomePage = DefaultHomePage,
35
- customRoutes
34
+ homePage = <DefaultHomePage/>,
35
+ children
36
36
  }: NavigationRoutesProps) {
37
37
 
38
38
  const location = useLocation();
@@ -68,43 +68,33 @@ export const NavigationRoutes = React.memo<NavigationRoutesProps>(
68
68
  });
69
69
  }
70
70
 
71
- // we reorder collections so that nested paths are included first
72
- const sortedCollections = [...(navigation.collections ?? [])]
73
- .sort((a, b) => b.path.length - a.path.length);
74
-
75
- const collectionRoutes = sortedCollections
76
- .map((collection) => {
77
- const urlPath = navigation.buildUrlCollectionPath(collection.id ?? collection.path);
78
- return <Route path={urlPath + "/*"}
79
- key={`navigation_${collection.id ?? collection.path}`}
80
- element={
81
- <ErrorBoundary>
82
- <EntityCollectionView
83
- key={`collection_view_${collection.id ?? collection.path}`}
84
- isSubCollection={false}
85
- parentCollectionIds={[]}
86
- fullPath={collection.id ?? collection.path}
87
- {...collection}
88
- Actions={toArray(collection.Actions)}/>
89
- </ErrorBoundary>
90
- }/>;
91
- }
92
- );
71
+ const collectionUrlPath = navigation.buildUrlCollectionPath("");
72
+ const collectionRoute = (
73
+ <Route path={collectionUrlPath + "/*"}
74
+ key={`navigation_entity`}
75
+ element={
76
+ <ErrorBoundary>
77
+ <FireCMSRoute/>
78
+ </ErrorBoundary>
79
+ }/>
80
+ );
93
81
 
94
82
  const homeRoute = (
95
83
  <Route path={"/"}
96
- element={<HomePage/>}/>
84
+ element={<HomePageRoute>{homePage}</HomePageRoute>}/>
97
85
  );
98
86
 
99
- const notFoundRoute = <Route path={"*"}
100
- element={
101
- <NotFoundPage/>
102
- }/>;
87
+ const notFoundRoute = (
88
+ <Route path={"*"}
89
+ element={
90
+ <NotFoundPage/>
91
+ }/>
92
+ );
103
93
 
104
94
  return (
105
95
  <Routes location={baseLocation}>
106
96
 
107
- {collectionRoutes}
97
+ {collectionRoute}
108
98
 
109
99
  {cmsViews}
110
100
 
@@ -112,7 +102,7 @@ export const NavigationRoutes = React.memo<NavigationRoutesProps>(
112
102
 
113
103
  {notFoundRoute}
114
104
 
115
- {customRoutes}
105
+ {children}
116
106
 
117
107
  </Routes>
118
108
  );
@@ -122,6 +112,6 @@ const buildCMSViewRoute = (path: string, cmsView: CMSView) => {
122
112
  return <Route
123
113
  key={"navigation_view_" + path}
124
114
  path={path}
125
- element={cmsView.view}
115
+ element={<CustomCMSRoute cmsView={cmsView}/>}
126
116
  />;
127
117
  };