@firecms/core 3.0.0-canary.20 → 3.0.0-canary.200

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 (378) 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 +30 -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/EntityPreview.d.ts +5 -4
  25. package/dist/components/ErrorView.d.ts +1 -1
  26. package/dist/components/HomePage/DefaultHomePage.d.ts +1 -1
  27. package/dist/components/HomePage/NavigationCardBinding.d.ts +1 -1
  28. package/dist/components/PropertyConfigBadge.d.ts +2 -1
  29. package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
  30. package/dist/components/ReferenceWidget.d.ts +3 -1
  31. package/dist/components/SelectableTable/SelectableTable.d.ts +13 -3
  32. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
  33. package/dist/components/UnsavedChangesDialog.d.ts +8 -0
  34. package/dist/components/VirtualTable/VirtualTableProps.d.ts +28 -12
  35. package/dist/components/VirtualTable/types.d.ts +3 -3
  36. package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -3
  37. package/dist/components/common/index.d.ts +2 -1
  38. package/dist/components/common/table_height.d.ts +5 -0
  39. package/dist/components/common/types.d.ts +4 -6
  40. package/dist/components/common/useColumnsIds.d.ts +3 -1
  41. package/dist/components/common/{useDataSourceEntityCollectionTableController.d.ts → useDataSourceTableController.d.ts} +13 -2
  42. package/dist/components/common/useDebouncedCallback.d.ts +1 -0
  43. package/dist/components/common/useScrollRestoration.d.ts +14 -0
  44. package/dist/components/index.d.ts +4 -2
  45. package/dist/contexts/BreacrumbsContext.d.ts +8 -0
  46. package/dist/{components/FireCMSAppBar.d.ts → core/DefaultAppBar.d.ts} +6 -9
  47. package/dist/core/DefaultDrawer.d.ts +19 -0
  48. package/dist/core/DrawerNavigationItem.d.ts +10 -0
  49. package/dist/core/EntityEditView.d.ts +33 -11
  50. package/dist/core/EntityEditViewFormActions.d.ts +2 -0
  51. package/dist/core/FireCMS.d.ts +2 -2
  52. package/dist/core/FireCMSRouter.d.ts +4 -0
  53. package/dist/core/NavigationRoutes.d.ts +2 -3
  54. package/dist/core/SideDialogs.d.ts +4 -2
  55. package/dist/core/index.d.ts +4 -4
  56. package/dist/form/EntityForm.d.ts +45 -69
  57. package/dist/form/EntityFormActions.d.ts +17 -0
  58. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  59. package/dist/form/components/ErrorFocus.d.ts +1 -1
  60. package/dist/form/components/FieldHelperText.d.ts +3 -3
  61. package/dist/form/components/FormEntry.d.ts +6 -0
  62. package/dist/form/components/FormLayout.d.ts +5 -0
  63. package/dist/form/components/LabelWithIcon.d.ts +1 -1
  64. package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
  65. package/dist/form/components/StorageItemPreview.d.ts +4 -4
  66. package/dist/form/components/index.d.ts +3 -1
  67. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
  68. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
  69. package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
  70. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
  71. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  72. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
  73. package/dist/form/field_bindings/{MultiSelectBinding.d.ts → MultiSelectFieldBinding.d.ts} +1 -1
  74. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
  75. package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -2
  76. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
  77. package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
  78. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +3 -5
  79. package/dist/form/field_bindings/SwitchFieldBinding.d.ts +1 -2
  80. package/dist/form/field_bindings/TextFieldBinding.d.ts +1 -1
  81. package/dist/form/index.d.ts +16 -18
  82. package/dist/form/useClearRestoreValue.d.ts +2 -2
  83. package/dist/hooks/data/delete.d.ts +4 -4
  84. package/dist/hooks/data/save.d.ts +4 -5
  85. package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
  86. package/dist/hooks/data/useEntityFetch.d.ts +4 -3
  87. package/dist/hooks/index.d.ts +1 -0
  88. package/dist/hooks/useAuthController.d.ts +1 -1
  89. package/dist/hooks/useBreadcrumbsController.d.ts +26 -0
  90. package/dist/hooks/useBuildNavigationController.d.ts +7 -5
  91. package/dist/hooks/useFireCMSContext.d.ts +1 -1
  92. package/dist/hooks/useModeController.d.ts +1 -2
  93. package/dist/hooks/useProjectLog.d.ts +8 -2
  94. package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
  95. package/dist/hooks/useValidateAuthenticator.d.ts +4 -8
  96. package/dist/index.d.ts +1 -0
  97. package/dist/index.es.js +22071 -14330
  98. package/dist/index.es.js.map +1 -1
  99. package/dist/index.umd.js +24420 -588
  100. package/dist/index.umd.js.map +1 -1
  101. package/dist/internal/useBuildDataSource.d.ts +1 -16
  102. package/dist/internal/useUnsavedChangesDialog.d.ts +7 -9
  103. package/dist/preview/PropertyPreviewProps.d.ts +6 -1
  104. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  105. package/dist/preview/components/ReferencePreview.d.ts +3 -2
  106. package/dist/preview/components/StorageThumbnail.d.ts +2 -1
  107. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  108. package/dist/preview/util.d.ts +3 -3
  109. package/dist/routes/CustomCMSRoute.d.ts +4 -0
  110. package/dist/routes/FireCMSRoute.d.ts +1 -0
  111. package/dist/routes/HomePageRoute.d.ts +3 -0
  112. package/dist/types/auth.d.ts +8 -10
  113. package/dist/types/collections.d.ts +71 -22
  114. package/dist/types/datasource.d.ts +52 -36
  115. package/dist/types/dialogs_controller.d.ts +7 -3
  116. package/dist/types/entities.d.ts +7 -2
  117. package/dist/types/entity_actions.d.ts +28 -4
  118. package/dist/types/entity_callbacks.d.ts +16 -16
  119. package/dist/types/entity_overrides.d.ts +2 -2
  120. package/dist/types/export_import.d.ts +4 -4
  121. package/dist/types/fields.d.ts +71 -42
  122. package/dist/types/firecms.d.ts +6 -2
  123. package/dist/types/firecms_context.d.ts +1 -1
  124. package/dist/types/index.d.ts +0 -1
  125. package/dist/types/navigation.d.ts +32 -14
  126. package/dist/types/permissions.d.ts +4 -4
  127. package/dist/types/plugins.d.ts +23 -12
  128. package/dist/types/properties.d.ts +52 -24
  129. package/dist/types/property_config.d.ts +0 -2
  130. package/dist/types/side_dialogs_controller.d.ts +10 -0
  131. package/dist/types/side_entity_controller.d.ts +6 -1
  132. package/dist/types/storage.d.ts +86 -3
  133. package/dist/types/user.d.ts +1 -0
  134. package/dist/util/builders.d.ts +3 -3
  135. package/dist/util/entities.d.ts +3 -3
  136. package/dist/util/entity_actions.d.ts +2 -0
  137. package/dist/util/entity_cache.d.ts +23 -0
  138. package/dist/util/icon_list.d.ts +5 -1
  139. package/dist/util/icon_synonyms.d.ts +1 -98
  140. package/dist/util/icons.d.ts +6 -3
  141. package/dist/util/index.d.ts +2 -0
  142. package/dist/util/navigation_from_path.d.ts +6 -1
  143. package/dist/util/navigation_utils.d.ts +14 -3
  144. package/dist/util/objects.d.ts +2 -1
  145. package/dist/util/permissions.d.ts +4 -4
  146. package/dist/util/plurals.d.ts +0 -2
  147. package/dist/util/property_utils.d.ts +3 -3
  148. package/dist/util/resolutions.d.ts +30 -16
  149. package/dist/util/storage.d.ts +23 -2
  150. package/dist/util/useStorageUploadController.d.ts +3 -3
  151. package/package.json +61 -48
  152. package/src/app/AppBar.tsx +18 -0
  153. package/src/app/Drawer.tsx +24 -0
  154. package/src/app/Scaffold.tsx +243 -0
  155. package/src/app/index.ts +4 -0
  156. package/src/app/useApp.tsx +32 -0
  157. package/src/components/ArrayContainer.tsx +126 -40
  158. package/src/components/CircularProgressCenter.tsx +2 -2
  159. package/src/components/ClearFilterSortButton.tsx +41 -0
  160. package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +3 -3
  161. package/src/components/DeleteEntityDialog.tsx +10 -19
  162. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +54 -37
  163. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +38 -31
  164. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +30 -9
  165. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +47 -39
  166. package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
  167. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +30 -16
  168. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +19 -17
  169. package/src/components/EntityCollectionTable/index.tsx +1 -1
  170. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +31 -36
  171. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +36 -34
  172. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +20 -8
  173. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +81 -80
  174. package/src/components/EntityCollectionView/EntityCollectionView.tsx +207 -113
  175. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +4 -2
  176. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
  177. package/src/components/EntityCollectionView/useSelectionController.tsx +20 -7
  178. package/src/components/EntityCollectionView/utils.ts +19 -0
  179. package/src/components/EntityPreview.tsx +62 -52
  180. package/src/components/EntityView.tsx +10 -10
  181. package/src/components/ErrorView.tsx +4 -4
  182. package/src/components/HomePage/DefaultHomePage.tsx +26 -19
  183. package/src/components/HomePage/FavouritesView.tsx +6 -11
  184. package/src/components/HomePage/NavigationCard.tsx +3 -3
  185. package/src/components/HomePage/NavigationCardBinding.tsx +5 -10
  186. package/src/components/HomePage/NavigationGroup.tsx +2 -2
  187. package/src/components/HomePage/SmallNavigationCard.tsx +5 -6
  188. package/src/components/NotFoundPage.tsx +2 -2
  189. package/src/components/PropertyConfigBadge.tsx +9 -3
  190. package/src/components/PropertyIdCopyTooltip.tsx +47 -0
  191. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +19 -13
  192. package/src/components/ReferenceWidget.tsx +21 -11
  193. package/src/components/SearchIconsView.tsx +10 -7
  194. package/src/components/SelectableTable/SelectableTable.tsx +27 -12
  195. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
  196. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +25 -8
  197. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +36 -12
  198. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +92 -23
  199. package/src/components/UnsavedChangesDialog.tsx +42 -0
  200. package/src/components/VirtualTable/VirtualTable.tsx +96 -48
  201. package/src/components/VirtualTable/VirtualTableCell.tsx +1 -9
  202. package/src/components/VirtualTable/VirtualTableHeader.tsx +10 -10
  203. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
  204. package/src/components/VirtualTable/VirtualTableProps.tsx +33 -14
  205. package/src/components/VirtualTable/VirtualTableRow.tsx +5 -6
  206. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +5 -5
  207. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +3 -2
  208. package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
  209. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +16 -28
  210. package/src/components/VirtualTable/types.tsx +2 -3
  211. package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +33 -40
  212. package/src/components/common/index.ts +2 -1
  213. package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
  214. package/src/components/common/types.tsx +4 -6
  215. package/src/components/common/useColumnsIds.tsx +24 -3
  216. package/src/components/common/useDataSourceTableController.tsx +420 -0
  217. package/src/components/common/useDebouncedCallback.tsx +20 -0
  218. package/src/components/common/useScrollRestoration.tsx +68 -0
  219. package/src/components/common/useTableSearchHelper.ts +53 -12
  220. package/src/components/index.tsx +4 -2
  221. package/src/contexts/BreacrumbsContext.tsx +38 -0
  222. package/src/contexts/DialogsProvider.tsx +5 -4
  223. package/src/contexts/ModeController.tsx +1 -3
  224. package/src/contexts/SnackbarProvider.tsx +2 -0
  225. package/src/core/DefaultAppBar.tsx +207 -0
  226. package/src/core/DefaultDrawer.tsx +185 -0
  227. package/src/core/DrawerNavigationItem.tsx +66 -0
  228. package/src/core/EntityEditView.tsx +374 -480
  229. package/src/core/EntityEditViewFormActions.tsx +199 -0
  230. package/src/core/EntitySidePanel.tsx +86 -17
  231. package/src/core/FireCMS.tsx +56 -49
  232. package/src/core/FireCMSRouter.tsx +17 -0
  233. package/src/core/NavigationRoutes.tsx +28 -38
  234. package/src/core/SideDialogs.tsx +22 -12
  235. package/src/core/field_configs.tsx +11 -12
  236. package/src/core/index.tsx +6 -5
  237. package/src/form/EntityForm.tsx +562 -524
  238. package/src/form/EntityFormActions.tsx +169 -0
  239. package/src/form/PropertyFieldBinding.tsx +85 -44
  240. package/src/form/components/CustomIdField.tsx +6 -2
  241. package/src/form/components/FieldHelperText.tsx +4 -4
  242. package/src/form/components/FormEntry.tsx +22 -0
  243. package/src/form/components/FormLayout.tsx +16 -0
  244. package/src/form/components/LabelWithIcon.tsx +30 -19
  245. package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
  246. package/src/form/components/StorageItemPreview.tsx +22 -12
  247. package/src/form/components/StorageUploadProgress.tsx +4 -5
  248. package/src/form/components/index.tsx +3 -1
  249. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +31 -19
  250. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +47 -35
  251. package/src/form/field_bindings/BlockFieldBinding.tsx +56 -34
  252. package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -14
  253. package/src/form/field_bindings/KeyValueFieldBinding.tsx +60 -51
  254. package/src/form/field_bindings/MapFieldBinding.tsx +71 -54
  255. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +153 -0
  256. package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +25 -20
  257. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +11 -16
  258. package/src/form/field_bindings/ReferenceFieldBinding.tsx +42 -31
  259. package/src/form/field_bindings/RepeatFieldBinding.tsx +56 -35
  260. package/src/form/field_bindings/SelectFieldBinding.tsx +22 -14
  261. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +42 -50
  262. package/src/form/field_bindings/SwitchFieldBinding.tsx +29 -24
  263. package/src/form/field_bindings/TextFieldBinding.tsx +28 -24
  264. package/src/form/index.tsx +16 -37
  265. package/src/form/useClearRestoreValue.tsx +2 -2
  266. package/src/form/validation.ts +13 -23
  267. package/src/hooks/data/delete.ts +6 -5
  268. package/src/hooks/data/save.ts +13 -9
  269. package/src/hooks/data/useCollectionFetch.tsx +3 -3
  270. package/src/hooks/data/useDataSource.tsx +11 -3
  271. package/src/hooks/data/useEntityFetch.tsx +10 -6
  272. package/src/hooks/index.tsx +1 -0
  273. package/src/hooks/useAuthController.tsx +1 -1
  274. package/src/hooks/useBreadcrumbsController.tsx +31 -0
  275. package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
  276. package/src/hooks/useBuildModeController.tsx +22 -29
  277. package/src/hooks/useBuildNavigationController.tsx +159 -52
  278. package/src/hooks/useFireCMSContext.tsx +5 -5
  279. package/src/hooks/useLargeLayout.tsx +0 -35
  280. package/src/hooks/useModeController.tsx +1 -2
  281. package/src/hooks/useProjectLog.tsx +32 -10
  282. package/src/hooks/useResolvedNavigationFrom.tsx +10 -12
  283. package/src/hooks/useValidateAuthenticator.tsx +17 -37
  284. package/src/index.ts +1 -0
  285. package/src/internal/useBuildDataSource.ts +72 -82
  286. package/src/internal/useBuildSideDialogsController.tsx +4 -2
  287. package/src/internal/useBuildSideEntityController.tsx +177 -70
  288. package/src/internal/useUnsavedChangesDialog.tsx +127 -91
  289. package/src/preview/PropertyPreview.tsx +17 -24
  290. package/src/preview/PropertyPreviewProps.tsx +7 -1
  291. package/src/preview/components/BooleanPreview.tsx +2 -2
  292. package/src/preview/components/EmptyValue.tsx +1 -1
  293. package/src/preview/components/EnumValuesChip.tsx +2 -2
  294. package/src/preview/components/ImagePreview.tsx +25 -36
  295. package/src/preview/components/ReferencePreview.tsx +22 -33
  296. package/src/preview/components/StorageThumbnail.tsx +5 -1
  297. package/src/preview/components/UrlComponentPreview.tsx +60 -28
  298. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +2 -3
  299. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +4 -3
  300. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +2 -3
  301. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +1 -2
  302. package/src/preview/property_previews/ArrayOneOfPreview.tsx +4 -5
  303. package/src/preview/property_previews/ArrayPropertyPreview.tsx +4 -5
  304. package/src/preview/property_previews/MapPropertyPreview.tsx +12 -11
  305. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +12 -12
  306. package/src/preview/property_previews/StringPropertyPreview.tsx +3 -3
  307. package/src/preview/util.ts +10 -10
  308. package/src/routes/CustomCMSRoute.tsx +21 -0
  309. package/src/routes/FireCMSRoute.tsx +236 -0
  310. package/src/routes/HomePageRoute.tsx +17 -0
  311. package/src/types/auth.tsx +9 -13
  312. package/src/types/collections.ts +87 -27
  313. package/src/types/customization_controller.tsx +0 -1
  314. package/src/types/datasource.ts +61 -43
  315. package/src/types/dialogs_controller.tsx +7 -3
  316. package/src/types/entities.ts +12 -2
  317. package/src/types/entity_actions.tsx +32 -7
  318. package/src/types/entity_callbacks.ts +18 -18
  319. package/src/types/entity_overrides.tsx +2 -2
  320. package/src/types/export_import.ts +4 -4
  321. package/src/types/fields.tsx +81 -46
  322. package/src/types/firecms.tsx +7 -2
  323. package/src/types/firecms_context.tsx +1 -1
  324. package/src/types/index.ts +0 -1
  325. package/src/types/navigation.ts +38 -18
  326. package/src/types/permissions.ts +5 -5
  327. package/src/types/plugins.tsx +25 -14
  328. package/src/types/properties.ts +60 -25
  329. package/src/types/property_config.tsx +0 -2
  330. package/src/types/side_dialogs_controller.tsx +15 -0
  331. package/src/types/side_entity_controller.tsx +6 -1
  332. package/src/types/storage.ts +94 -3
  333. package/src/types/user.ts +2 -0
  334. package/src/util/builders.ts +10 -8
  335. package/src/util/entities.ts +9 -6
  336. package/src/util/entity_actions.ts +28 -0
  337. package/src/util/entity_cache.ts +204 -0
  338. package/src/util/enums.ts +1 -1
  339. package/src/util/icon_list.ts +16 -10
  340. package/src/util/icon_synonyms.ts +3 -100
  341. package/src/util/icons.tsx +17 -7
  342. package/src/util/index.ts +2 -0
  343. package/src/util/join_collections.ts +3 -0
  344. package/src/util/make_properties_editable.ts +13 -5
  345. package/src/util/navigation_from_path.ts +13 -6
  346. package/src/util/navigation_utils.ts +59 -7
  347. package/src/util/objects.ts +45 -28
  348. package/src/util/parent_references_from_path.ts +3 -3
  349. package/src/util/permissions.ts +9 -8
  350. package/src/util/plurals.ts +0 -2
  351. package/src/util/property_utils.tsx +11 -4
  352. package/src/util/references.ts +11 -2
  353. package/src/util/resolutions.ts +79 -46
  354. package/src/util/storage.ts +79 -21
  355. package/src/util/strings.ts +2 -2
  356. package/src/util/useStorageUploadController.tsx +71 -27
  357. package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
  358. package/dist/components/VirtualTable/common.d.ts +0 -2
  359. package/dist/core/Drawer.d.ts +0 -23
  360. package/dist/core/Scaffold.d.ts +0 -55
  361. package/dist/core/SideEntityView.d.ts +0 -7
  362. package/dist/form/components/FormikArrayContainer.d.ts +0 -18
  363. package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
  364. package/dist/internal/useBuildCustomizationController.d.ts +0 -2
  365. package/dist/internal/useLocaleConfig.d.ts +0 -1
  366. package/dist/types/appcheck.d.ts +0 -26
  367. package/src/components/FireCMSAppBar.tsx +0 -165
  368. package/src/components/PropertyIdCopyTooltipContent.tsx +0 -28
  369. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +0 -225
  370. package/src/core/Drawer.tsx +0 -191
  371. package/src/core/Scaffold.tsx +0 -281
  372. package/src/core/SideEntityView.tsx +0 -38
  373. package/src/form/components/FormikArrayContainer.tsx +0 -44
  374. package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -695
  375. package/src/internal/useBuildCustomizationController.tsx +0 -5
  376. package/src/internal/useLocaleConfig.tsx +0 -18
  377. package/src/types/appcheck.ts +0 -29
  378. /package/src/util/{common.tsx → common.ts} +0 -0
@@ -9,6 +9,7 @@ import {
9
9
  EntityCollection,
10
10
  EntityCollectionsBuilder,
11
11
  EntityReference,
12
+ NavigationBlocker,
12
13
  NavigationController,
13
14
  PermissionsBuilder,
14
15
  TopNavigationEntry,
@@ -20,19 +21,21 @@ import {
20
21
  applyPermissionsFunctionIfEmpty,
21
22
  getCollectionByPathOrId,
22
23
  mergeDeep,
24
+ removeFunctions,
23
25
  removeInitialAndTrailingSlashes,
24
26
  resolveCollectionPathIds,
25
27
  resolvePermissions
26
28
  } from "../util";
27
29
  import { getParentReferencesFromPath } from "../util/parent_references_from_path";
30
+ import { useBlocker, useNavigate } from "react-router-dom";
28
31
 
29
32
  const DEFAULT_BASE_PATH = "/";
30
33
  const DEFAULT_COLLECTION_PATH = "/c";
31
34
 
32
- type BuildNavigationContextProps<EC extends EntityCollection, UserType extends User> = {
35
+ export type BuildNavigationContextProps<EC extends EntityCollection, USER extends User> = {
33
36
  basePath?: string,
34
37
  baseCollectionPath?: string,
35
- authController: AuthController<UserType>;
38
+ authController: AuthController<USER>;
36
39
  collections?: EC[] | EntityCollectionsBuilder<EC>;
37
40
  collectionPermissions?: PermissionsBuilder;
38
41
  views?: CMSView[] | CMSViewsBuilder;
@@ -48,9 +51,14 @@ type BuildNavigationContextProps<EC extends EntityCollection, UserType extends U
48
51
  * @param collections
49
52
  */
50
53
  injectCollections?: (collections: EntityCollection[]) => EntityCollection[];
54
+
55
+ /**
56
+ * If true, the navigation logic will not be updated until this flag is false
57
+ */
58
+ disabled?: boolean;
51
59
  };
52
60
 
53
- export function useBuildNavigationController<EC extends EntityCollection, UserType extends User>(props: BuildNavigationContextProps<EC, UserType>): NavigationController {
61
+ export function useBuildNavigationController<EC extends EntityCollection, USER extends User>(props: BuildNavigationContextProps<EC, USER>): NavigationController {
54
62
  const {
55
63
  basePath = DEFAULT_BASE_PATH,
56
64
  baseCollectionPath = DEFAULT_COLLECTION_PATH,
@@ -62,9 +70,12 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
62
70
  viewsOrder,
63
71
  userConfigPersistence,
64
72
  dataSourceDelegate,
65
- injectCollections
73
+ injectCollections,
74
+ disabled
66
75
  } = props;
67
76
 
77
+ const navigate = useNavigate();
78
+
68
79
  const collectionsRef = useRef<EntityCollection[] | undefined>();
69
80
  const viewsRef = useRef<CMSView[] | undefined>();
70
81
  const adminViewsRef = useRef<CMSView[] | undefined>();
@@ -130,6 +141,30 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
130
141
  .filter(Boolean) as TopNavigationEntry[]
131
142
  ];
132
143
 
144
+ // Sort by group, entries with group "Admin" will go last, and second to last will be the group "Views"
145
+ navigationEntries = navigationEntries.sort((a, b) => {
146
+ if (a.group !== "Views" && a.group !== "Admin" && (b.group === "Views" || b.group === "Admin")) {
147
+ return -1;
148
+ }
149
+ if (b.group !== "Views" && b.group !== "Admin" && (a.group === "Views" || a.group === "Admin")) {
150
+ return 1;
151
+ }
152
+ if (a.group === "Admin" && b.group !== "Admin") {
153
+ return 1;
154
+ }
155
+ if (a.group !== "Admin" && b.group === "Admin") {
156
+ return -1;
157
+ }
158
+ if (a.group === "Views" && b.group !== "Views") {
159
+ return -1;
160
+ }
161
+ if (a.group !== "Views" && b.group === "Views") {
162
+ return 1;
163
+ }
164
+ return 0;
165
+
166
+ });
167
+
133
168
  if (viewsOrder) {
134
169
  navigationEntries = navigationEntries.sort((a, b) => {
135
170
  const aIndex = viewsOrder.indexOf(a.path);
@@ -160,11 +195,13 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
160
195
 
161
196
  const refreshNavigation = useCallback(async () => {
162
197
 
163
- if (authController.initialLoading)
198
+ if (disabled || authController.initialLoading)
164
199
  return;
165
200
 
201
+ console.debug("Refreshing navigation");
202
+
166
203
  try {
167
- console.debug("Refreshing navigation")
204
+
168
205
  const [resolvedCollections = [], resolvedViews, resolvedAdminViews = []] = await Promise.all([
169
206
  resolveCollections(collectionsProp, collectionPermissions, authController, dataSourceDelegate, injectCollections),
170
207
  resolveCMSViews(viewsProp, authController, dataSourceDelegate),
@@ -172,30 +209,45 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
172
209
  ]
173
210
  );
174
211
 
175
- if (
176
- !equal(collectionsRef.current, resolvedCollections) ||
177
- !equal(viewsRef.current, resolvedViews) ||
178
- !equal(adminViewsRef.current, resolvedAdminViews) ||
179
- !equal(topLevelNavigation, computeTopNavigation(resolvedCollections, resolvedViews, resolvedAdminViews, viewsOrder))
180
- ) {
212
+ let shouldUpdateTopLevelNav = false;
213
+ if (!areCollectionListsEqual(collectionsRef.current ?? [], resolvedCollections)) {
214
+ collectionsRef.current = resolvedCollections;
215
+ console.log("Collections have changed", resolvedCollections);
216
+ shouldUpdateTopLevelNav = true;
217
+ }
218
+ if (collectionsRef.current === undefined) {
181
219
  collectionsRef.current = resolvedCollections;
220
+ shouldUpdateTopLevelNav = true;
221
+ }
222
+ if (!equal(viewsRef.current, resolvedViews)) {
182
223
  viewsRef.current = resolvedViews;
224
+ shouldUpdateTopLevelNav = true;
225
+ }
226
+ if (!equal(adminViewsRef.current, resolvedAdminViews)) {
183
227
  adminViewsRef.current = resolvedAdminViews;
184
- setTopLevelNavigation(computeTopNavigation(resolvedCollections ?? [], resolvedViews, resolvedAdminViews, viewsOrder));
228
+ shouldUpdateTopLevelNav = true;
229
+ }
230
+
231
+ const computedTopLevelNav = computeTopNavigation(resolvedCollections, resolvedViews, resolvedAdminViews, viewsOrder);
232
+ if (shouldUpdateTopLevelNav && !equal(topLevelNavigation, computedTopLevelNav)) {
233
+ setTopLevelNavigation(computedTopLevelNav);
185
234
  }
186
235
  } catch (e) {
187
236
  console.error(e);
188
237
  setNavigationLoadingError(e as any);
189
238
  }
190
239
 
191
- setNavigationLoading(false);
192
- setInitialised(true);
240
+ if (navigationLoading)
241
+ setNavigationLoading(false);
242
+ if (!initialised)
243
+ setInitialised(true);
193
244
 
194
245
  }, [
195
246
  collectionsProp,
196
247
  collectionPermissions,
197
248
  authController.user,
198
249
  authController.initialLoading,
250
+ disabled,
199
251
  viewsProp,
200
252
  adminViewsProp,
201
253
  computeTopNavigation,
@@ -208,7 +260,6 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
208
260
 
209
261
  const getCollection = useCallback((
210
262
  idOrPath: string,
211
- entityId?: string,
212
263
  includeUserOverride = false
213
264
  ): EC | undefined => {
214
265
  const collections = collectionsRef.current;
@@ -218,8 +269,7 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
218
269
  const baseCollection = getCollectionByPathOrId(removeInitialAndTrailingSlashes(idOrPath), collections);
219
270
 
220
271
  const userOverride = includeUserOverride ? userConfigPersistence?.getCollectionConfig(idOrPath) : undefined;
221
-
222
- const overriddenCollection = baseCollection ? mergeDeep(baseCollection, userOverride) : undefined;
272
+ const overriddenCollection = baseCollection ? mergeDeep(baseCollection, userOverride ?? {}) : undefined;
223
273
 
224
274
  let result: Partial<EntityCollection> | undefined = overriddenCollection;
225
275
 
@@ -244,9 +294,9 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
244
294
  const getCollectionFromPaths = useCallback(<EC extends EntityCollection>(pathSegments: string[]): EC | undefined => {
245
295
 
246
296
  const collections = collectionsRef.current;
297
+ if (collections === undefined)
298
+ throw Error("getCollectionFromPaths: Collections have not been initialised yet");
247
299
  let currentCollections: EntityCollection[] | undefined = [...(collections ?? [])];
248
- if (!currentCollections)
249
- throw Error("Collections have not been initialised yet");
250
300
 
251
301
  for (let i = 0; i < pathSegments.length; i++) {
252
302
  const pathSegment = pathSegments[i];
@@ -265,9 +315,9 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
265
315
  const getCollectionFromIds = useCallback(<EC extends EntityCollection>(ids: string[]): EC | undefined => {
266
316
 
267
317
  const collections = collectionsRef.current;
318
+ if (collections === undefined)
319
+ throw Error("getCollectionFromIds: Collections have not been initialised yet");
268
320
  let currentCollections: EntityCollection[] | undefined = [...(collections ?? [])];
269
- if (!currentCollections)
270
- throw Error("Collections have not been initialised yet");
271
321
 
272
322
  for (let i = 0; i < ids.length; i++) {
273
323
  const id = ids[i];
@@ -293,19 +343,8 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
293
343
  throw Error("Expected path starting with " + fullCollectionPath);
294
344
  }, [fullCollectionPath]);
295
345
 
296
- const buildUrlEditCollectionPath = useCallback(({
297
- path
298
- }: {
299
- path: string
300
- }): string => {
301
- return `s/edit/${encodePath(path)}`;
302
- },
303
- []);
304
-
305
- const resolveAliasesFrom = useCallback((path: string): string => {
306
- const collections = collectionsRef.current;
307
- if (!collections)
308
- throw Error("Collections have not been initialised yet");
346
+ const resolveIdsFrom = useCallback((path: string): string => {
347
+ const collections = collectionsRef.current ?? [];
309
348
  return resolveCollectionPathIds(path, collections);
310
349
  }, []);
311
350
 
@@ -364,24 +403,16 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
364
403
  isUrlCollectionPath,
365
404
  urlPathToDataPath,
366
405
  buildUrlCollectionPath,
367
- buildUrlEditCollectionPath,
368
- buildCMSUrlPath,
369
- resolveAliasesFrom,
406
+ resolveIdsFrom,
370
407
  topLevelNavigation,
371
408
  refreshNavigation,
372
409
  getParentReferencesFromPath: getAllParentReferencesForPath,
373
410
  getParentCollectionIds,
374
- convertIdsToPaths
411
+ convertIdsToPaths,
412
+ navigate,
375
413
  };
376
414
  }
377
415
 
378
- export function getSidePanelKey(path: string, entityId?: string) {
379
- if (entityId)
380
- return `${removeInitialAndTrailingSlashes(path)}/${removeInitialAndTrailingSlashes(entityId)}`;
381
- else
382
- return removeInitialAndTrailingSlashes(path);
383
- }
384
-
385
416
  function encodePath(input: string) {
386
417
  return encodeURIComponent(removeInitialAndTrailingSlashes(input))
387
418
  .replaceAll("%2F", "/")
@@ -390,9 +421,10 @@ function encodePath(input: string) {
390
421
 
391
422
  function filterOutNotAllowedCollections(resolvedCollections: EntityCollection[], authController: AuthController<User>): EntityCollection[] {
392
423
  return resolvedCollections
424
+ .filter((c) => Boolean(c.path))
393
425
  .filter((c) => {
394
426
  if (!c.permissions) return true;
395
- const resolvedPermissions = resolvePermissions(c, authController, c.path, null)
427
+ const resolvedPermissions = resolvePermissions(c, authController, c.path, null);
396
428
  return resolvedPermissions?.read !== false;
397
429
  })
398
430
  .map((c) => {
@@ -408,7 +440,7 @@ async function resolveCollections(collections: undefined | EntityCollection[] |
408
440
  collectionPermissions: PermissionsBuilder | undefined,
409
441
  authController: AuthController,
410
442
  dataSource: DataSourceDelegate,
411
- injectCollections?: (collections: EntityCollection[]) => EntityCollection[]) {
443
+ injectCollections?: (collections: EntityCollection[]) => EntityCollection[]): Promise<EntityCollection[]> {
412
444
  let resolvedCollections: EntityCollection[] = [];
413
445
  if (typeof collections === "function") {
414
446
  resolvedCollections = await collections({
@@ -420,14 +452,12 @@ async function resolveCollections(collections: undefined | EntityCollection[] |
420
452
  resolvedCollections = collections;
421
453
  }
422
454
 
423
- resolvedCollections = applyPermissionsFunctionIfEmpty(resolvedCollections, collectionPermissions);
424
-
425
- resolvedCollections = filterOutNotAllowedCollections(resolvedCollections, authController);
426
-
427
455
  if (injectCollections) {
428
456
  resolvedCollections = injectCollections(resolvedCollections ?? []);
429
457
  }
430
458
 
459
+ resolvedCollections = applyPermissionsFunctionIfEmpty(resolvedCollections, collectionPermissions);
460
+ resolvedCollections = filterOutNotAllowedCollections(resolvedCollections, authController);
431
461
  return resolvedCollections;
432
462
  }
433
463
 
@@ -452,3 +482,80 @@ function getGroup(collectionOrView: EntityCollection<any, any> | CMSView) {
452
482
  }
453
483
  return trimmed ?? "Views";
454
484
  }
485
+
486
+ function areCollectionListsEqual(a: EntityCollection[], b: EntityCollection[]) {
487
+ if (a.length !== b.length) {
488
+ return false;
489
+ }
490
+ const aCopy = [...a];
491
+ const bCopy = [...b];
492
+ const aSorted = aCopy.sort((x, y) => x.id.localeCompare(y.id));
493
+ const bSorted = bCopy.sort((x, y) => x.id.localeCompare(y.id));
494
+ return aSorted.every((value, index) => areCollectionsEqual(value, bSorted[index]));
495
+ }
496
+
497
+ function areCollectionsEqual(a: EntityCollection, b: EntityCollection) {
498
+ const {
499
+ subcollections: subcollectionsA,
500
+ ...restA
501
+ } = a;
502
+ const {
503
+ subcollections: subcollectionsB,
504
+ ...restB
505
+ } = b;
506
+ if (!areCollectionListsEqual(subcollectionsA ?? [], subcollectionsB ?? [])) {
507
+ return false;
508
+ }
509
+ return equal(removeFunctions(restA), removeFunctions(restB));
510
+ }
511
+
512
+ function useCustomBlocker(): NavigationBlocker {
513
+ const [blockListeners, setBlockListeners] = useState<Record<string, {
514
+ block: boolean,
515
+ basePath?: string
516
+ }>>({});
517
+
518
+ const shouldBlock = Object.values(blockListeners).some(b => b.block);
519
+
520
+ let blocker: any;
521
+ try {
522
+ blocker = useBlocker(({
523
+ nextLocation
524
+ }) => {
525
+ const allBasePaths = Object.values(blockListeners).map(b => b.basePath).filter(Boolean) as string[];
526
+ if (allBasePaths && allBasePaths.some(path => nextLocation.pathname.startsWith(path)))
527
+ return false;
528
+ return shouldBlock;
529
+ });
530
+ } catch (e) {
531
+ console.warn("Blocker not available, navigation will not be blocked");
532
+ }
533
+
534
+ const updateBlockListener = (path: string, block: boolean, basePath?: string) => {
535
+ setBlockListeners(prev => ({
536
+ ...prev,
537
+ [path]: {
538
+ block,
539
+ basePath
540
+ }
541
+ }));
542
+ return () => setBlockListeners(prev => {
543
+ const {
544
+ [path]: removed,
545
+ ...rest
546
+ } = prev;
547
+ return rest;
548
+ })
549
+ };
550
+
551
+ const isBlocked = (path: string) => {
552
+ return (blockListeners[path]?.block ?? false) && blocker?.state === "blocked";
553
+ }
554
+
555
+ return {
556
+ updateBlockListener,
557
+ isBlocked,
558
+ proceed: blocker?.proceed,
559
+ reset: blocker?.reset
560
+ }
561
+ }
@@ -21,9 +21,9 @@ import React, { useEffect } from "react";
21
21
  * @see FireCMSContext
22
22
  * @group Hooks and utilities
23
23
  */
24
- export const useFireCMSContext = <UserType extends User = User, AuthControllerType extends AuthController<UserType> = AuthController<UserType>>(): FireCMSContext<UserType, AuthControllerType> => {
24
+ export const useFireCMSContext = <USER extends User = User, AuthControllerType extends AuthController<USER> = AuthController<USER>>(): FireCMSContext<USER, AuthControllerType> => {
25
25
 
26
- const authController = useAuthController<UserType, AuthControllerType>();
26
+ const authController = useAuthController<USER, AuthControllerType>();
27
27
  const sideDialogsController = useSideDialogsController();
28
28
  const sideEntityController = useSideEntityController();
29
29
  const navigation = useNavigationController();
@@ -35,7 +35,7 @@ export const useFireCMSContext = <UserType extends User = User, AuthControllerTy
35
35
  const customizationController = useCustomizationController();
36
36
  const analyticsController = useAnalyticsController();
37
37
 
38
- const fireCMSContextRef = React.useRef<FireCMSContext<UserType, AuthControllerType>>({
38
+ const fireCMSContextRef = React.useRef<FireCMSContext<USER, AuthControllerType>>({
39
39
  authController,
40
40
  sideDialogsController,
41
41
  sideEntityController,
@@ -68,9 +68,9 @@ export const useFireCMSContext = <UserType extends User = User, AuthControllerTy
68
68
  return fireCMSContextRef.current;
69
69
  }
70
70
 
71
- // export const useFireCMSContext = <UserType extends User = User, AuthControllerType extends AuthController<UserType> = AuthController<UserType>>(): FireCMSContext<UserType, AuthControllerType> => {
71
+ // export const useFireCMSContext = <USER extends User = User, AuthControllerType extends AuthController<USER> = AuthController<USER>>(): FireCMSContext<USER, AuthControllerType> => {
72
72
  //
73
- // const authController = useAuthController<UserType, AuthControllerType>();
73
+ // const authController = useAuthController<USER, AuthControllerType>();
74
74
  // const sideDialogsController = useSideDialogsController();
75
75
  // const sideEntityController = useSideEntityController();
76
76
  // const navigation = useNavigationController();
@@ -63,38 +63,3 @@ function checkLargeLayout(breakpoint: "xs" | "sm" | "md" | "lg" | "xl" | "2xl" |
63
63
  return false;
64
64
  return window.matchMedia(`(min-width: ${breakpoints[breakpoint] + 1}px)`).matches;
65
65
  }
66
-
67
- // import { useEffect, useState } from "react";
68
- //
69
- // const breakpoints = {
70
- // xs: 0,
71
- // sm: 640,
72
- // md: 768,
73
- // lg: 1024,
74
- // xl: 1280,
75
- // "2xl": 1536,
76
- // "3xl": 1920
77
- // }
78
- // export const useLargeLayout = (breakpoint: "xs" | "sm" | "md" | "lg" | "xl" | "2xl" | "3xl" = "lg"): boolean => {
79
- // const [isLargeLayout, setIsLargeLayout] = useState<boolean>(false);
80
- //
81
- // useEffect(() => {
82
- // const handleResize = () => {
83
- // const matched = window.matchMedia(`(min-width: ${breakpoints[breakpoint] + 1}px)`).matches;
84
- // setIsLargeLayout(matched);
85
- // };
86
- //
87
- // // Set initial state
88
- // handleResize();
89
- //
90
- // // Set up event listener for resize events
91
- // window.addEventListener("resize", handleResize);
92
- //
93
- // // Clean up event listener when component unmounts
94
- // return () => {
95
- // window.removeEventListener("resize", handleResize);
96
- // };
97
- // }, []);
98
- //
99
- // return isLargeLayout;
100
- // };
@@ -7,8 +7,7 @@ import { useContext } from "react";
7
7
  */
8
8
  export interface ModeController {
9
9
  mode: "light" | "dark";
10
- setMode: (mode: "light" | "dark") => void;
11
- toggleMode: () => void;
10
+ setMode: (mode: "light" | "dark" | "system") => void;
12
11
  }
13
12
 
14
13
  /**
@@ -1,5 +1,5 @@
1
1
  import { useEffect, useRef, useState } from "react";
2
- import { AuthController, FireCMSPlugin } from "../types";
2
+ import { AuthController, DataSourceDelegate, FireCMSPlugin } from "../types";
3
3
 
4
4
  export const DEFAULT_SERVER_DEV = "https://api-kdoe6pj3qq-ey.a.run.app";
5
5
  export const DEFAULT_SERVER = "https://api-drplyi3b6q-ey.a.run.app";
@@ -9,33 +9,55 @@ export type AccessResponse = {
9
9
  message?: string;
10
10
  }
11
11
 
12
- async function makeRequest(authController: AuthController, pluginKeys: string | undefined) {
13
- const firebaseToken = await authController.getAuthToken();
12
+ async function makeRequest(authController: AuthController, dataSourceKey: string, pluginKeys: string[] | undefined, apiKey?: string): Promise<AccessResponse> {
13
+ let idToken: string | null;
14
+ try {
15
+ idToken = await authController.getAuthToken();
16
+ } catch (e) {
17
+ idToken = null;
18
+ }
14
19
  return fetch(DEFAULT_SERVER + "/access_log",
15
20
  {
16
21
  // mode: "no-cors",
17
22
  method: "POST",
18
23
  headers: {
19
24
  "Content-Type": "application/json",
20
- Authorization: `Basic ${firebaseToken}`,
25
+ Authorization: `Basic ${idToken}`
21
26
  },
22
- body: JSON.stringify({ plugins: pluginKeys })
27
+ body: JSON.stringify({
28
+ apiKey,
29
+ email: authController.user?.email ?? null,
30
+ datasource: dataSourceKey,
31
+ plugins: pluginKeys
32
+ })
23
33
  })
24
34
  .then(async (res) => {
25
35
  return res.json();
26
36
  });
27
37
  }
28
38
 
29
- export function useProjectLog(authController: AuthController,
30
- plugins?: FireCMSPlugin<any, any, any>[]): AccessResponse | null {
39
+ export interface UseProjectLogParams {
40
+ apiKey?: string;
41
+ authController: AuthController;
42
+ dataSourceDelegate: DataSourceDelegate;
43
+ plugins?: FireCMSPlugin<any, any, any>[];
44
+ }
45
+
46
+ export function useProjectLog({
47
+ authController,
48
+ dataSourceDelegate,
49
+ plugins,
50
+ apiKey
51
+ }: UseProjectLogParams): AccessResponse | null {
31
52
  const [accessResponse, setAccessResponse] = useState<AccessResponse | null>(null);
32
53
  const accessedUserRef = useRef<string | null>(null);
33
- const pluginKeys = plugins?.map(plugin => plugin.key).join(",");
54
+ const dataSourceKey = dataSourceDelegate.key;
55
+ const pluginKeys = plugins?.map(plugin => plugin.key);
34
56
  useEffect(() => {
35
57
  if (authController.user && authController.user.uid !== accessedUserRef.current && !authController.initialLoading) {
36
- makeRequest(authController, pluginKeys).then(setAccessResponse);
58
+ makeRequest(authController, dataSourceKey, pluginKeys, apiKey).then(setAccessResponse);
37
59
  accessedUserRef.current = authController.user.uid;
38
60
  }
39
- }, [authController]);
61
+ }, [authController, dataSourceKey, pluginKeys]);
40
62
  return accessResponse;
41
63
  }
@@ -1,6 +1,6 @@
1
1
  import { Entity, EntityCollection, EntityCustomView, FireCMSContext, User } from "../types";
2
2
  import { useEffect, useState } from "react";
3
- import { getNavigationEntriesFromPathInternal } from "../util/navigation_from_path";
3
+ import { getNavigationEntriesFromPath } from "../util/navigation_from_path";
4
4
  import { useFireCMSContext } from "./useFireCMSContext";
5
5
 
6
6
  /**
@@ -55,22 +55,22 @@ interface ResolvedNavigationEntityCustom<M extends Record<string, any>> {
55
55
  * @param context
56
56
  * @group Hooks and utilities
57
57
  */
58
- export function resolveNavigationFrom<M extends Record<string, any>, UserType extends User>({
58
+ export function resolveNavigationFrom<M extends Record<string, any>, USER extends User>({
59
59
  path,
60
60
  context
61
61
  }: {
62
62
  path: string,
63
- context: FireCMSContext<UserType>
63
+ context: FireCMSContext<USER>
64
64
  }): Promise<ResolvedNavigationEntry<M>[]> {
65
65
 
66
66
  const dataSource = context.dataSource;
67
67
  const navigation = context.navigation;
68
68
 
69
69
  if (!navigation) {
70
- throw Error("Calling getNavigationFrom, but main navigation has not yet been initialised");
70
+ throw Error("Calling resolveNavigationFrom, but main navigation has not yet been initialised");
71
71
  }
72
72
 
73
- const navigationEntries = getNavigationEntriesFromPathInternal({
73
+ const navigationEntries = getNavigationEntriesFromPath({
74
74
  path,
75
75
  collections: navigation.collections ?? []
76
76
  });
@@ -80,7 +80,7 @@ export function resolveNavigationFrom<M extends Record<string, any>, UserType ex
80
80
  if (entry.type === "collection") {
81
81
  return Promise.resolve(entry);
82
82
  } else if (entry.type === "entity") {
83
- const collection = navigation.getCollection(entry.path, entry.entityId);
83
+ const collection = navigation.getCollection(entry.path);
84
84
  if (!collection) {
85
85
  throw Error(`No collection defined in the navigation for the entity with path ${entry.path}`);
86
86
  }
@@ -126,12 +126,12 @@ export interface NavigationFrom<M extends Record<string, any>> {
126
126
  * in any React component that lives under `FireCMS`
127
127
  * @group Hooks and utilities
128
128
  */
129
- export function useResolvedNavigationFrom<M extends Record<string, any>, UserType extends User>(
129
+ export function useResolvedNavigationFrom<M extends Record<string, any>, USER extends User>(
130
130
  {
131
131
  path
132
132
  }: NavigationFromProps): NavigationFrom<M> {
133
133
 
134
- const context: FireCMSContext<UserType> = useFireCMSContext();
134
+ const context: FireCMSContext<USER> = useFireCMSContext();
135
135
 
136
136
  const [data, setData] = useState<ResolvedNavigationEntry<M>[] | undefined>();
137
137
  const [dataLoading, setDataLoading] = useState<boolean>(false);
@@ -142,10 +142,8 @@ export function useResolvedNavigationFrom<M extends Record<string, any>, UserTyp
142
142
  if (navigation) {
143
143
  setDataLoading(true);
144
144
  setDataLoadingError(undefined);
145
- resolveNavigationFrom<M, UserType>({ path, context })
146
- .then((res) => {
147
- setData(res);
148
- })
145
+ resolveNavigationFrom<M, USER>({ path, context })
146
+ .then(setData)
149
147
  .catch((e) => setDataLoadingError(e))
150
148
  .finally(() => setDataLoading(false));
151
149
  }