@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
@@ -5,7 +5,7 @@ import { ResolvedProperty } from "../../types";
5
5
  import { useCustomizationController } from "../../hooks";
6
6
  import { PreviewSize, PropertyPreviewProps } from "../PropertyPreviewProps";
7
7
  import { PropertyPreview } from "../PropertyPreview";
8
- import { cn, defaultBorderMixin } from "@firecms/ui";
8
+ import { cls, defaultBorderMixin } from "@firecms/ui";
9
9
  import { ErrorBoundary } from "../../components";
10
10
 
11
11
  /**
@@ -23,8 +23,7 @@ export function ArrayPropertyPreview({
23
23
  const property = resolveArrayProperty({
24
24
  propertyKey,
25
25
  property: inputProperty,
26
- propertyValue: value,
27
- fields: customizationController.propertyConfigs
26
+ propertyConfigs: customizationController.propertyConfigs
28
27
  });
29
28
 
30
29
  if (!property.of) {
@@ -38,7 +37,7 @@ export function ArrayPropertyPreview({
38
37
 
39
38
  if (!values) return null;
40
39
 
41
- const childSize: PreviewSize = size === "medium" ? "small" : "tiny";
40
+ const childSize: PreviewSize = size === "medium" ? "medium" : "small";
42
41
 
43
42
  return (
44
43
  <div className="flex flex-col gap-2">
@@ -49,7 +48,7 @@ export function ArrayPropertyPreview({
49
48
  return of
50
49
  ? <React.Fragment
51
50
  key={"preview_array_" + index}>
52
- <div className={cn(defaultBorderMixin, "m-1 border-b last:border-b-0")}>
51
+ <div className={cls(defaultBorderMixin, "m-1 border-b last:border-b-0")}>
53
52
  <ErrorBoundary>
54
53
  <PropertyPreview
55
54
  propertyKey={propertyKey}
@@ -3,7 +3,7 @@ import React from "react";
3
3
  import { ResolvedMapProperty } from "../../types";
4
4
  import { PropertyPreviewProps } from "../PropertyPreviewProps";
5
5
  import { PropertyPreview } from "../PropertyPreview";
6
- import { cn, defaultBorderMixin, Typography } from "@firecms/ui";
6
+ import { cls, defaultBorderMixin, Typography } from "@firecms/ui";
7
7
  import { ErrorBoundary } from "../../components";
8
8
  import { EmptyValue } from "../components/EmptyValue";
9
9
 
@@ -34,7 +34,7 @@ export function MapPropertyPreview<T extends Record<string, any> = Record<string
34
34
 
35
35
  const mapPropertyKeys: string[] = Object.keys(mapProperty.properties)
36
36
 
37
- if (size === "tiny")
37
+ if (size === "small")
38
38
  return (
39
39
  <div className="w-full flex flex-col space-y-1 md:space-y-2">
40
40
  {mapPropertyKeys.map((key, index) => (
@@ -58,10 +58,11 @@ export function MapPropertyPreview<T extends Record<string, any> = Record<string
58
58
  {mapPropertyKeys &&
59
59
  mapPropertyKeys.map((key, index) => {
60
60
  const childProperty = mapProperty.properties![key];
61
+ const isArrayOrMap = childProperty.dataType === "map" || childProperty === "array";
61
62
  return (
62
63
  <div
63
64
  key={`map_preview_table_${key}}`}
64
- className={cn(defaultBorderMixin, "last:border-b-0 border-b")}>
65
+ className={cls(defaultBorderMixin, "last:border-b-0 border-b")}>
65
66
  <div
66
67
  className={"flex flex-row pt-0.5 pb-0.5 gap-2"}>
67
68
  <div
@@ -75,7 +76,7 @@ export function MapPropertyPreview<T extends Record<string, any> = Record<string
75
76
  <div
76
77
  className="flex-grow max-w-[75%]">
77
78
  <ErrorBoundary>
78
- {!(childProperty.dataType === "map" || childProperty === "array") &&
79
+ {!isArrayOrMap &&
79
80
  <PropertyPreview
80
81
  propertyKey={key}
81
82
  value={(value)[key]}
@@ -86,8 +87,8 @@ export function MapPropertyPreview<T extends Record<string, any> = Record<string
86
87
  </div>
87
88
  </div>
88
89
 
89
- {(childProperty.dataType === "map" || childProperty === "array") &&
90
- <div className={cn(defaultBorderMixin, "border-l pl-4 ml-2 my-2")}>
90
+ {isArrayOrMap &&
91
+ <div className={cls(defaultBorderMixin, "border-l pl-4 ml-2 my-2")}>
91
92
  <PropertyPreview
92
93
  propertyKey={key}
93
94
  value={(value)[key]}
@@ -110,10 +111,10 @@ export function KeyValuePreview({ value }: { value: any }) {
110
111
  return <div
111
112
  className="flex flex-col gap-1 w-full">
112
113
  {
113
- Object.entries(value).map(([key, childValue]) => (
114
+ Object.entries(value).map(([key, childValue]: [string, any]) => (
114
115
  <div
115
116
  key={`map_preview_table_${key}}`}
116
- className={cn(defaultBorderMixin, "last:border-b-0 border-b")}>
117
+ className={cls(defaultBorderMixin, "last:border-b-0 border-b")}>
117
118
  <div
118
119
  className={"flex flex-row pt-0.5 pb-0.5 gap-2"}>
119
120
  <div
@@ -127,15 +128,15 @@ export function KeyValuePreview({ value }: { value: any }) {
127
128
  </div>
128
129
  <div
129
130
  className="flex-grow max-w-[75%]">
130
- {typeof childValue !== "object" && <Typography>
131
+ {childValue && <Typography>
131
132
  <ErrorBoundary>
132
- {childValue && childValue.toString()}
133
+ {childValue.toString()}
133
134
  </ErrorBoundary>
134
135
  </Typography>}
135
136
  </div>
136
137
  </div>
137
138
  {typeof childValue === "object" &&
138
- <div className={cn(defaultBorderMixin, "border-l pl-4")}>
139
+ <div className={cls(defaultBorderMixin, "border-l pl-4")}>
139
140
  <KeyValuePreview value={childValue}/>
140
141
  </div>
141
142
  }
@@ -81,17 +81,17 @@ function renderMap<T extends Record<string, any>>(property: ResolvedMapProperty<
81
81
  return <></>;
82
82
 
83
83
  let mapPropertyKeys: string[];
84
- if (size === "medium") {
84
+ if (size === "large") {
85
85
  mapPropertyKeys = Object.keys(property.properties);
86
86
  } else {
87
87
  mapPropertyKeys = (property.previewProperties || Object.keys(property.properties)) as string[];
88
- if (size === "small")
88
+ if (size === "medium")
89
89
  mapPropertyKeys = mapPropertyKeys.slice(0, 3);
90
- else if (size === "tiny")
90
+ else if (size === "small")
91
91
  mapPropertyKeys = mapPropertyKeys.slice(0, 1);
92
92
  }
93
93
 
94
- if (size !== "medium")
94
+ if (size !== "large")
95
95
  return (
96
96
  <div
97
97
  className="w-full flex flex-col space-y-4"
@@ -101,7 +101,7 @@ function renderMap<T extends Record<string, any>>(property: ResolvedMapProperty<
101
101
  {property.properties && property.properties[key] &&
102
102
  <SkeletonPropertyComponent
103
103
  property={property.properties[key]}
104
- size={"small"}/>}
104
+ size={"medium"}/>}
105
105
  </div>
106
106
  ))}
107
107
  </div>
@@ -128,7 +128,7 @@ function renderMap<T extends Record<string, any>>(property: ResolvedMapProperty<
128
128
  {property.properties && property.properties[key] &&
129
129
  <SkeletonPropertyComponent
130
130
  property={property.properties[key]}
131
- size={"small"}/>}
131
+ size={"medium"}/>}
132
132
  </th>
133
133
  </tr>
134
134
  );
@@ -160,7 +160,7 @@ function renderArrayOfMaps<M extends Record<string, any>>(properties: ResolvedPr
160
160
  >
161
161
  <SkeletonPropertyComponent
162
162
  property={(properties)[key]}
163
- size={"small"}/>
163
+ size={"medium"}/>
164
164
  </th>
165
165
  )
166
166
  )}
@@ -210,7 +210,7 @@ function renderGenericArrayCell(
210
210
  <>
211
211
  <SkeletonPropertyComponent key={`i_${index}`}
212
212
  property={property}
213
- size={"small"}/>
213
+ size={"medium"}/>
214
214
  </>
215
215
  )}
216
216
  </div>
@@ -226,7 +226,7 @@ function renderUrlAudioComponent() {
226
226
 
227
227
  export function renderSkeletonImageThumbnail(size: PreviewSize) {
228
228
  // eslint-disable-next-line react-hooks/rules-of-hooks
229
- const imageSize = size === "tiny" ? 40 : size === "small" ? 100 : 200;
229
+ const imageSize = size === "small" ? 40 : size === "medium" ? 100 : 200;
230
230
  return (
231
231
  <Skeleton width={imageSize}
232
232
  height={imageSize}/>
@@ -236,8 +236,8 @@ export function renderSkeletonImageThumbnail(size: PreviewSize) {
236
236
  function renderUrlVideo(size: PreviewSize) {
237
237
 
238
238
  return (
239
- <Skeleton width={size !== "medium" ? 300 : 500}
240
- height={size !== "medium" ? 200 : 250}/>
239
+ <Skeleton width={size !== "large" ? 300 : 500}
240
+ height={size !== "large" ? 200 : 250}/>
241
241
  );
242
242
  }
243
243
 
@@ -245,7 +245,7 @@ function renderReference() {
245
245
  return <Skeleton width={200} height={100}/>;
246
246
  }
247
247
 
248
- function renderUrlComponent(property: ResolvedStringProperty, size: PreviewSize = "medium") {
248
+ function renderUrlComponent(property: ResolvedStringProperty, size: PreviewSize = "large") {
249
249
 
250
250
  if (typeof property.url === "boolean") {
251
251
  return <div style={{
@@ -6,7 +6,7 @@ import { PreviewType } from "../../types";
6
6
  import { UrlComponentPreview } from "../components/UrlComponentPreview";
7
7
  import { PropertyPreviewProps } from "../PropertyPreviewProps";
8
8
  import { ErrorBoundary } from "../../components";
9
- import { Chip, cn, getColorSchemeForSeed } from "@firecms/ui";
9
+ import { Chip, cls, getColorSchemeForSeed } from "@firecms/ui";
10
10
 
11
11
  /**
12
12
  * @group Preview components
@@ -45,14 +45,14 @@ export function StringPropertyPreview({
45
45
  if (!value) return <></>;
46
46
  const lines = value.split("\n");
47
47
  return value && value.includes("\n")
48
- ? <div className={cn("overflow-x-scroll", size === "tiny" ? "text-sm" : "")}>
48
+ ? <div className={cls("overflow-x-scroll", size === "small" ? "text-sm" : "")}>
49
49
  {lines.map((str, index) =>
50
50
  <React.Fragment key={`string_preview_${index}`}>
51
51
  <span>{str}</span>
52
52
  {index !== lines.length - 1 && <br/>}
53
53
  </React.Fragment>)}
54
54
  </div>
55
- : (size === "tiny"
55
+ : (size === "small"
56
56
  ? <span className={"text-sm"}>{value}</span>
57
57
  : <>{value}</>
58
58
  );
@@ -1,17 +1,17 @@
1
1
  import { CollectionSize } from "../types";
2
2
  import { PreviewSize } from "./PropertyPreviewProps";
3
3
 
4
- export const TINY_THUMBNAIL = 40;
5
- export const SMALL_THUMBNAIL = 100;
6
- export const REGULAR_THUMBNAIL = 200;
4
+ export const SMALL_THUMBNAIL = 40;
5
+ export const MEDIUM_THUMBNAIL = 100;
6
+ export const LARGE_THUMBNAIL = 200;
7
7
 
8
8
  export function getThumbnailMeasure(size: PreviewSize): number {
9
- if (size === "tiny")
10
- return TINY_THUMBNAIL;
11
- else if (size === "small")
9
+ if (size === "small")
12
10
  return SMALL_THUMBNAIL;
13
11
  else if (size === "medium")
14
- return REGULAR_THUMBNAIL;
12
+ return MEDIUM_THUMBNAIL;
13
+ else if (size === "large")
14
+ return LARGE_THUMBNAIL;
15
15
  else throw Error("Thumbnail size not mapped");
16
16
  }
17
17
 
@@ -19,12 +19,12 @@ export function getPreviewSizeFrom(size: CollectionSize): PreviewSize {
19
19
  switch (size) {
20
20
  case "xs":
21
21
  case "s":
22
- return "tiny";
23
- case "m":
24
22
  return "small";
23
+ case "m":
24
+ return "medium";
25
25
  case "l":
26
26
  case "xl":
27
- return "medium";
27
+ return "large";
28
28
  default:
29
29
  throw Error("Missing mapping value in getPreviewSizeFrom: " + size);
30
30
  }
@@ -0,0 +1,21 @@
1
+ import { CMSView } from "../types";
2
+ import { useBreadcrumbsController } from "../hooks/useBreadcrumbsController";
3
+ import { useEffect } from "react";
4
+
5
+ export function CustomCMSRoute({ cmsView }: {
6
+ cmsView: CMSView
7
+ }) {
8
+
9
+ const breadcrumbs = useBreadcrumbsController();
10
+
11
+ useEffect(() => {
12
+ breadcrumbs.set({
13
+ breadcrumbs: [{
14
+ title: cmsView.name,
15
+ url: cmsView.path
16
+ }]
17
+ });
18
+ }, [cmsView.path]);
19
+
20
+ return cmsView.view;
21
+ }
@@ -0,0 +1,235 @@
1
+ import { Blocker, useBlocker, useLocation } from "react-router";
2
+ import { EntityEditView } from "../core/EntityEditView";
3
+ import { useNavigationController } from "../hooks";
4
+ import { useEffect, useRef, useState } from "react";
5
+ import { useNavigate } from "react-router-dom";
6
+ import {
7
+ getNavigationEntriesFromPath,
8
+ NavigationViewCollectionInternal,
9
+ NavigationViewEntityCustomInternal,
10
+ NavigationViewInternal
11
+ } from "../util/navigation_from_path";
12
+ import { useBreadcrumbsController } from "../hooks/useBreadcrumbsController";
13
+ import { toArray } from "../util/arrays";
14
+ import { EntityCollectionView, NotFoundPage } from "../components";
15
+ import { UnsavedChangesDialog } from "../components/UnsavedChangesDialog";
16
+
17
+ export function FireCMSRoute() {
18
+
19
+ const location = useLocation();
20
+ const navigation = useNavigationController();
21
+ const breadcrumbs = useBreadcrumbsController();
22
+
23
+ const hash = location.hash;
24
+ const isSidePanel = hash.includes("#side");
25
+ const isNew = hash.includes("#new") || hash.includes("#new_side");
26
+ const isCopy = hash.includes("#copy");
27
+
28
+ const pathname = location.pathname;
29
+ const navigationPath = navigation.urlPathToDataPath(pathname);
30
+
31
+ const navigationEntries = getNavigationEntriesFromPath({
32
+ path: navigationPath,
33
+ collections: navigation.collections ?? []
34
+ });
35
+
36
+ useEffect(() => {
37
+ breadcrumbs.set({
38
+ breadcrumbs: navigationEntries.map(entry => {
39
+ if (entry.type === "entity") {
40
+ return ({
41
+ title: entry.entityId,
42
+ url: navigation.buildUrlCollectionPath(entry.fullPath)
43
+ });
44
+ } else if (entry.type === "custom_view") {
45
+ return ({
46
+ title: entry.view.name,
47
+ url: navigation.buildUrlCollectionPath(entry.fullPath)
48
+ });
49
+ } else if (entry.type === "collection") {
50
+ return ({
51
+ title: entry.collection.name,
52
+ url: navigation.buildUrlCollectionPath(entry.fullPath)
53
+ });
54
+ } else {
55
+ throw new Error("Unexpected navigation entry type");
56
+ }
57
+ })
58
+ });
59
+ }, [navigationEntries.map(entry => entry.path).join(",")]);
60
+
61
+ if (isNew) {
62
+ return <EntityFullScreenRoute
63
+ pathname={pathname}
64
+ navigationEntries={navigationEntries}
65
+ isNew={true}
66
+ isCopy={false}
67
+ />;
68
+ }
69
+
70
+ if (navigationEntries.length === 1 && navigationEntries[0].type === "collection") {
71
+ const collection = navigation.getCollection(navigationEntries[0].path);
72
+ if (!collection)
73
+ return null;
74
+ return <EntityCollectionView
75
+ key={`collection_view_${collection.id ?? collection.path}`}
76
+ isSubCollection={false}
77
+ parentCollectionIds={[]}
78
+ fullPath={collection.id}
79
+ updateUrl={true}
80
+ {...collection}
81
+ Actions={toArray(collection.Actions)}/>
82
+ }
83
+
84
+ if (isSidePanel) {
85
+ const lastCollectionEntry = navigationEntries.findLast((entry) => entry.type === "collection");
86
+ if (lastCollectionEntry) {
87
+ const collection = navigation.getCollection(lastCollectionEntry.path);
88
+ if (!collection)
89
+ return null;
90
+ return <EntityCollectionView
91
+ key={`collection_view_${collection.id ?? collection.path}`}
92
+ isSubCollection={false}
93
+ parentCollectionIds={[]}
94
+ fullPath={collection.id}
95
+ updateUrl={true}
96
+ {...collection}
97
+ Actions={toArray(collection.Actions)}/>;
98
+ }
99
+ }
100
+
101
+ return <EntityFullScreenRoute
102
+ pathname={pathname}
103
+ navigationEntries={navigationEntries}
104
+ isNew={isNew}
105
+ isCopy={isCopy}
106
+ />;
107
+
108
+ }
109
+
110
+ function getSelectedTabFromUrl(isNew: boolean, lastCustomView: NavigationViewCollectionInternal<any> | NavigationViewEntityCustomInternal<any> | undefined) {
111
+ if (isNew) {
112
+ return undefined;
113
+ } else if (lastCustomView) {
114
+ if (lastCustomView.type === "custom_view") {
115
+ return lastCustomView.view.key;
116
+ } else if (lastCustomView.type === "collection") {
117
+ return lastCustomView.id ?? lastCustomView.path;
118
+ }
119
+ }
120
+ return undefined;
121
+ }
122
+
123
+ function EntityFullScreenRoute({
124
+ pathname,
125
+ navigationEntries,
126
+ isNew,
127
+ isCopy
128
+ }: {
129
+ pathname: string;
130
+ navigationEntries: NavigationViewInternal[],
131
+ isNew: boolean,
132
+ isCopy: boolean
133
+ }) {
134
+
135
+ const navigation = useNavigationController();
136
+ const navigate = useNavigate();
137
+
138
+ const navigationPath = navigation.urlPathToDataPath(pathname);
139
+
140
+ // is navigating away blocked
141
+ const blocked = useRef(false);
142
+
143
+ const lastEntityEntry = navigationEntries.findLast((entry) => entry.type === "entity");
144
+ const navigationEntriesAfterEntity = lastEntityEntry ? navigationEntries.slice(navigationEntries.indexOf(lastEntityEntry) + 1) : [];
145
+
146
+ const lastCustomView = navigationEntriesAfterEntity.findLast(
147
+ (entry) => entry.type === "custom_view" || entry.type === "collection"
148
+ ) as NavigationViewCollectionInternal<any> | NavigationViewEntityCustomInternal<any> | undefined;
149
+
150
+ const entityId = lastEntityEntry?.entityId;
151
+
152
+ const urlTab = getSelectedTabFromUrl(isNew, lastCustomView);
153
+ const [selectedTab, setSelectedTab] = useState<string | undefined>(urlTab);
154
+
155
+ const parentCollectionIds = navigation.getParentCollectionIds(navigationPath);
156
+ useEffect(() => {
157
+ if (urlTab !== selectedTab) {
158
+ setSelectedTab(urlTab);
159
+ }
160
+ }, [urlTab]);
161
+
162
+ const basePath = !entityId || isNew
163
+ ? pathname
164
+ : pathname.substring(0, pathname.lastIndexOf(`/${entityId}`));
165
+
166
+ const entityPath = basePath + `/${entityId}`;
167
+
168
+ let blocker: Blocker | undefined = undefined;
169
+ try {
170
+ blocker = useBlocker(({
171
+ nextLocation
172
+ }) => {
173
+ if (nextLocation.pathname.startsWith(entityPath))
174
+ return false;
175
+ return blocked.current;
176
+ });
177
+ } catch (e) {
178
+ console.warn("Blocker not available, navigation will not be blocked");
179
+ }
180
+
181
+ const lastCollectionEntry = navigationEntries.findLast((entry) => entry.type === "collection");
182
+
183
+ if (isNew && !lastCollectionEntry) {
184
+ throw new Error("INTERNAL: No collection found in the navigation");
185
+ }
186
+
187
+ if (!isNew && !lastEntityEntry) {
188
+ return <NotFoundPage/>;
189
+ }
190
+
191
+ const collection = isNew ? lastCollectionEntry!.collection : lastEntityEntry!.parentCollection;
192
+ const collectionPath = navigation.resolveIdsFrom(isNew ? lastCollectionEntry!.path : lastEntityEntry!.path);
193
+
194
+ return <>
195
+ <EntityEditView
196
+ key={collection.id + "_" + (isNew ? "new" : (isCopy ? entityId + "_copy" : entityId))}
197
+ entityId={isNew ? undefined : entityId}
198
+ collection={collection}
199
+ layout={"full_screen"}
200
+ path={collectionPath}
201
+ copy={isCopy}
202
+ selectedTab={selectedTab ?? undefined}
203
+ onValuesModified={(modified) => blocked.current = modified}
204
+ onSaved={(params) => {
205
+ const newSelectedTab = params.selectedTab;
206
+ const newEntityId = params.entityId;
207
+ if (newSelectedTab) {
208
+ navigate(`${basePath}/${newEntityId}/${newSelectedTab}`, { replace: true });
209
+ } else {
210
+ navigate(`${basePath}/${newEntityId}`, { replace: true });
211
+ }
212
+ }}
213
+ onTabChange={(params) => {
214
+ setSelectedTab(params.selectedTab);
215
+ if (isNew) {
216
+ return;
217
+ }
218
+ const newSelectedTab = params.selectedTab;
219
+ if (newSelectedTab) {
220
+ navigate(`${basePath}/${entityId}/${newSelectedTab}`, { replace: true });
221
+ } else {
222
+ navigate(`${basePath}/${entityId}`, { replace: true });
223
+ }
224
+ }}
225
+ parentCollectionIds={parentCollectionIds}
226
+ />
227
+
228
+ <UnsavedChangesDialog
229
+ open={blocker?.state === "blocked"}
230
+ handleOk={() => blocker?.proceed?.()}
231
+ handleCancel={() => blocker?.reset?.()}
232
+ body={"You have unsaved changes in this entity."}/>
233
+
234
+ </>;
235
+ }
@@ -0,0 +1,17 @@
1
+ import { useBreadcrumbsController } from "../hooks/useBreadcrumbsController";
2
+ import { useEffect } from "react";
3
+
4
+ export function HomePageRoute({ children }: {
5
+ children: React.ReactNode;
6
+ }) {
7
+
8
+ const breadcrumbs = useBreadcrumbsController();
9
+
10
+ useEffect(() => {
11
+ breadcrumbs.set({
12
+ breadcrumbs: []
13
+ });
14
+ }, []);
15
+
16
+ return children;
17
+ }
@@ -9,18 +9,13 @@ import { StorageSource } from "./storage";
9
9
  * to do it as the result of a hook.
10
10
  * @group Hooks and utilities
11
11
  */
12
- export type AuthController<UserType extends User = any, ExtraData extends any = any> = {
12
+ export type AuthController<USER extends User = any, ExtraData = any> = {
13
13
 
14
14
  /**
15
15
  * The user currently logged in
16
16
  * The values can be: the user object, null if they skipped login
17
17
  */
18
- user: UserType | null;
19
-
20
- /**
21
- * Roles related to the logged user
22
- */
23
- roles?: Role[];
18
+ user: USER | null;
24
19
 
25
20
  /**
26
21
  * Initial loading flag. It is used not to display the login screen
@@ -38,7 +33,7 @@ export type AuthController<UserType extends User = any, ExtraData extends any =
38
33
  /**
39
34
  * Sign out
40
35
  */
41
- signOut: () => void;
36
+ signOut: () => Promise<void>;
42
37
 
43
38
  /**
44
39
  * Error initializing the authentication
@@ -64,26 +59,27 @@ export type AuthController<UserType extends User = any, ExtraData extends any =
64
59
 
65
60
  setExtra: (extra: ExtraData) => void;
66
61
 
67
- // setUser?: (user: UserType | null) => void;
62
+ setUser?: (user: USER | null) => void;
63
+
64
+ setUserRoles?: (roles: Role[]) => void;
68
65
 
69
- // setRoles?: (roles: Role[]) => void;
70
66
  };
71
67
 
72
68
  /**
73
69
  * Implement this function to allow access to specific users.
74
70
  * @group Hooks and utilities
75
71
  */
76
- export type Authenticator<UserType extends User = User, Controller extends AuthController<UserType> = AuthController<UserType>> = (props: {
72
+ export type Authenticator<USER extends User = User> = (props: {
77
73
 
78
74
  /**
79
75
  * Logged-in user or null
80
76
  */
81
- user: UserType | null;
77
+ user: USER | null;
82
78
 
83
79
  /**
84
80
  * AuthController
85
81
  */
86
- authController: Controller;
82
+ authController: AuthController<USER>;
87
83
 
88
84
  /**
89
85
  * Connector to your database, e.g. your Firestore database