@firecms/core 3.0.0-canary.24 → 3.0.0-canary.240

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 (387) 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 +30 -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 +20 -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 +8 -5
  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 +14 -4
  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 +5 -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 +40 -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 +36 -64
  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 -12
  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 +21573 -13895
  99. package/dist/index.es.js.map +1 -1
  100. package/dist/index.umd.js +24361 -588
  101. package/dist/index.umd.js.map +1 -1
  102. package/dist/internal/useBuildDataSource.d.ts +3 -17
  103. package/dist/internal/useBuildSideEntityController.d.ts +3 -3
  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 +97 -23
  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 +74 -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 +36 -14
  128. package/dist/types/permissions.d.ts +4 -4
  129. package/dist/types/plugins.d.ts +36 -12
  130. package/dist/types/properties.d.ts +73 -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 +10 -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/callbacks.d.ts +2 -0
  138. package/dist/util/createFormexStub.d.ts +2 -0
  139. package/dist/util/entities.d.ts +3 -3
  140. package/dist/util/entity_actions.d.ts +2 -0
  141. package/dist/util/entity_cache.d.ts +23 -0
  142. package/dist/util/icon_list.d.ts +5 -1
  143. package/dist/util/icon_synonyms.d.ts +1 -98
  144. package/dist/util/icons.d.ts +6 -3
  145. package/dist/util/index.d.ts +3 -0
  146. package/dist/util/navigation_from_path.d.ts +6 -1
  147. package/dist/util/navigation_utils.d.ts +15 -3
  148. package/dist/util/objects.d.ts +2 -1
  149. package/dist/util/permissions.d.ts +4 -4
  150. package/dist/util/plurals.d.ts +0 -2
  151. package/dist/util/property_utils.d.ts +4 -4
  152. package/dist/util/references.d.ts +2 -2
  153. package/dist/util/resolutions.d.ts +41 -17
  154. package/dist/util/storage.d.ts +23 -2
  155. package/dist/util/useStorageUploadController.d.ts +3 -3
  156. package/package.json +62 -48
  157. package/src/app/AppBar.tsx +18 -0
  158. package/src/app/Drawer.tsx +24 -0
  159. package/src/app/Scaffold.tsx +253 -0
  160. package/src/app/index.ts +4 -0
  161. package/src/app/useApp.tsx +32 -0
  162. package/src/components/ArrayContainer.tsx +149 -46
  163. package/src/components/CircularProgressCenter.tsx +2 -2
  164. package/src/components/ClearFilterSortButton.tsx +41 -0
  165. package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +11 -11
  166. package/src/components/DeleteEntityDialog.tsx +13 -20
  167. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +59 -40
  168. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +38 -31
  169. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +30 -9
  170. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +48 -40
  171. package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
  172. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +30 -16
  173. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +19 -17
  174. package/src/components/EntityCollectionTable/index.tsx +1 -1
  175. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +32 -37
  176. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +36 -34
  177. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +20 -8
  178. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +84 -80
  179. package/src/components/EntityCollectionView/EntityCollectionView.tsx +229 -117
  180. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +4 -2
  181. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
  182. package/src/components/EntityCollectionView/useSelectionController.tsx +20 -7
  183. package/src/components/EntityCollectionView/utils.ts +19 -0
  184. package/src/components/EntityJsonPreview.tsx +66 -0
  185. package/src/components/EntityPreview.tsx +80 -59
  186. package/src/components/EntityView.tsx +13 -10
  187. package/src/components/ErrorView.tsx +4 -4
  188. package/src/components/HomePage/DefaultHomePage.tsx +27 -20
  189. package/src/components/HomePage/FavouritesView.tsx +6 -11
  190. package/src/components/HomePage/NavigationCard.tsx +3 -3
  191. package/src/components/HomePage/NavigationCardBinding.tsx +5 -10
  192. package/src/components/HomePage/NavigationGroup.tsx +2 -2
  193. package/src/components/HomePage/SmallNavigationCard.tsx +5 -6
  194. package/src/components/NotFoundPage.tsx +2 -2
  195. package/src/components/PropertyConfigBadge.tsx +9 -3
  196. package/src/components/PropertyIdCopyTooltip.tsx +47 -0
  197. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +21 -13
  198. package/src/components/ReferenceWidget.tsx +21 -11
  199. package/src/components/SearchIconsView.tsx +10 -7
  200. package/src/components/SelectableTable/SelectableTable.tsx +157 -145
  201. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
  202. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +25 -8
  203. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +36 -12
  204. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +92 -23
  205. package/src/components/UnsavedChangesDialog.tsx +42 -0
  206. package/src/components/VirtualTable/VirtualTable.tsx +130 -51
  207. package/src/components/VirtualTable/VirtualTableCell.tsx +1 -9
  208. package/src/components/VirtualTable/VirtualTableHeader.tsx +10 -10
  209. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
  210. package/src/components/VirtualTable/VirtualTableProps.tsx +33 -14
  211. package/src/components/VirtualTable/VirtualTableRow.tsx +5 -6
  212. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +5 -5
  213. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +3 -2
  214. package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
  215. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +16 -28
  216. package/src/components/VirtualTable/types.tsx +2 -3
  217. package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +44 -40
  218. package/src/components/common/index.ts +2 -1
  219. package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
  220. package/src/components/common/types.tsx +4 -6
  221. package/src/components/common/useColumnsIds.tsx +24 -3
  222. package/src/components/common/useDataSourceTableController.tsx +420 -0
  223. package/src/components/common/useDebouncedCallback.tsx +20 -0
  224. package/src/components/common/useScrollRestoration.tsx +68 -0
  225. package/src/components/common/useTableSearchHelper.ts +53 -12
  226. package/src/components/index.tsx +6 -2
  227. package/src/contexts/BreacrumbsContext.tsx +38 -0
  228. package/src/contexts/DialogsProvider.tsx +5 -4
  229. package/src/contexts/ModeController.tsx +1 -3
  230. package/src/contexts/SnackbarProvider.tsx +2 -0
  231. package/src/core/DefaultAppBar.tsx +219 -0
  232. package/src/core/DefaultDrawer.tsx +185 -0
  233. package/src/core/DrawerNavigationItem.tsx +66 -0
  234. package/src/core/EntityEditView.tsx +406 -478
  235. package/src/core/EntityEditViewFormActions.tsx +199 -0
  236. package/src/core/EntitySidePanel.tsx +95 -19
  237. package/src/core/FireCMS.tsx +67 -59
  238. package/src/core/FireCMSRouter.tsx +17 -0
  239. package/src/core/NavigationRoutes.tsx +28 -38
  240. package/src/core/SideDialogs.tsx +22 -12
  241. package/src/core/field_configs.tsx +11 -12
  242. package/src/core/index.tsx +6 -5
  243. package/src/form/EntityForm.tsx +589 -535
  244. package/src/form/EntityFormActions.tsx +169 -0
  245. package/src/form/PropertyFieldBinding.tsx +89 -45
  246. package/src/form/components/CustomIdField.tsx +6 -2
  247. package/src/form/components/FieldHelperText.tsx +4 -4
  248. package/src/form/components/FormEntry.tsx +22 -0
  249. package/src/form/components/FormLayout.tsx +16 -0
  250. package/src/form/components/LabelWithIcon.tsx +30 -19
  251. package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
  252. package/src/form/components/StorageItemPreview.tsx +22 -12
  253. package/src/form/components/StorageUploadProgress.tsx +4 -5
  254. package/src/form/components/index.tsx +3 -1
  255. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +34 -19
  256. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +48 -35
  257. package/src/form/field_bindings/BlockFieldBinding.tsx +56 -34
  258. package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -14
  259. package/src/form/field_bindings/KeyValueFieldBinding.tsx +61 -52
  260. package/src/form/field_bindings/MapFieldBinding.tsx +71 -54
  261. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +157 -0
  262. package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +25 -20
  263. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +11 -16
  264. package/src/form/field_bindings/ReferenceFieldBinding.tsx +42 -31
  265. package/src/form/field_bindings/RepeatFieldBinding.tsx +62 -35
  266. package/src/form/field_bindings/SelectFieldBinding.tsx +23 -15
  267. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +47 -52
  268. package/src/form/field_bindings/SwitchFieldBinding.tsx +29 -24
  269. package/src/form/field_bindings/TextFieldBinding.tsx +28 -24
  270. package/src/form/index.tsx +16 -37
  271. package/src/form/useClearRestoreValue.tsx +2 -2
  272. package/src/form/validation.ts +13 -23
  273. package/src/hooks/data/delete.ts +6 -5
  274. package/src/hooks/data/save.ts +32 -33
  275. package/src/hooks/data/useCollectionFetch.tsx +3 -3
  276. package/src/hooks/data/useDataSource.tsx +11 -3
  277. package/src/hooks/data/useEntityFetch.tsx +10 -6
  278. package/src/hooks/index.tsx +1 -0
  279. package/src/hooks/useAuthController.tsx +1 -1
  280. package/src/hooks/useBreadcrumbsController.tsx +31 -0
  281. package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
  282. package/src/hooks/useBuildModeController.tsx +22 -29
  283. package/src/hooks/useBuildNavigationController.tsx +193 -68
  284. package/src/hooks/useFireCMSContext.tsx +3 -33
  285. package/src/hooks/useLargeLayout.tsx +0 -35
  286. package/src/hooks/useModeController.tsx +1 -2
  287. package/src/hooks/useProjectLog.tsx +32 -10
  288. package/src/hooks/useResolvedNavigationFrom.tsx +10 -12
  289. package/src/hooks/useValidateAuthenticator.tsx +17 -37
  290. package/src/index.ts +1 -0
  291. package/src/internal/useBuildDataSource.ts +79 -85
  292. package/src/internal/useBuildSideDialogsController.tsx +4 -2
  293. package/src/internal/useBuildSideEntityController.tsx +201 -75
  294. package/src/internal/useUnsavedChangesDialog.tsx +127 -91
  295. package/src/preview/PropertyPreview.tsx +20 -25
  296. package/src/preview/PropertyPreviewProps.tsx +7 -1
  297. package/src/preview/components/BooleanPreview.tsx +2 -2
  298. package/src/preview/components/EmptyValue.tsx +1 -1
  299. package/src/preview/components/EnumValuesChip.tsx +2 -2
  300. package/src/preview/components/ImagePreview.tsx +25 -36
  301. package/src/preview/components/ReferencePreview.tsx +23 -34
  302. package/src/preview/components/StorageThumbnail.tsx +5 -1
  303. package/src/preview/components/UrlComponentPreview.tsx +60 -28
  304. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +6 -6
  305. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +7 -5
  306. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +5 -4
  307. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +4 -4
  308. package/src/preview/property_previews/ArrayOneOfPreview.tsx +7 -6
  309. package/src/preview/property_previews/ArrayPropertyPreview.tsx +7 -6
  310. package/src/preview/property_previews/MapPropertyPreview.tsx +12 -11
  311. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +13 -13
  312. package/src/preview/property_previews/StringPropertyPreview.tsx +3 -3
  313. package/src/preview/util.ts +10 -10
  314. package/src/routes/CustomCMSRoute.tsx +21 -0
  315. package/src/routes/FireCMSRoute.tsx +246 -0
  316. package/src/routes/HomePageRoute.tsx +17 -0
  317. package/src/types/auth.tsx +9 -13
  318. package/src/types/collections.ts +118 -28
  319. package/src/types/customization_controller.tsx +0 -1
  320. package/src/types/datasource.ts +61 -43
  321. package/src/types/dialogs_controller.tsx +7 -3
  322. package/src/types/entities.ts +12 -2
  323. package/src/types/entity_actions.tsx +32 -7
  324. package/src/types/entity_callbacks.ts +18 -18
  325. package/src/types/entity_overrides.tsx +2 -2
  326. package/src/types/export_import.ts +4 -4
  327. package/src/types/fields.tsx +85 -46
  328. package/src/types/firecms.tsx +7 -3
  329. package/src/types/firecms_context.tsx +1 -1
  330. package/src/types/index.ts +0 -1
  331. package/src/types/navigation.ts +43 -18
  332. package/src/types/permissions.ts +5 -5
  333. package/src/types/plugins.tsx +42 -14
  334. package/src/types/properties.ts +87 -26
  335. package/src/types/property_config.tsx +0 -2
  336. package/src/types/side_dialogs_controller.tsx +15 -0
  337. package/src/types/side_entity_controller.tsx +11 -1
  338. package/src/types/storage.ts +94 -3
  339. package/src/types/user.ts +2 -0
  340. package/src/util/builders.ts +10 -8
  341. package/src/util/callbacks.ts +119 -0
  342. package/src/util/createFormexStub.tsx +62 -0
  343. package/src/util/entities.ts +9 -6
  344. package/src/util/entity_actions.ts +28 -0
  345. package/src/util/entity_cache.ts +204 -0
  346. package/src/util/enums.ts +1 -1
  347. package/src/util/icon_list.ts +16 -10
  348. package/src/util/icon_synonyms.ts +3 -100
  349. package/src/util/icons.tsx +17 -7
  350. package/src/util/index.ts +3 -0
  351. package/src/util/join_collections.ts +6 -1
  352. package/src/util/make_properties_editable.ts +13 -5
  353. package/src/util/navigation_from_path.ts +18 -7
  354. package/src/util/navigation_utils.ts +141 -25
  355. package/src/util/objects.ts +52 -28
  356. package/src/util/parent_references_from_path.ts +3 -3
  357. package/src/util/permissions.ts +9 -8
  358. package/src/util/plurals.ts +0 -2
  359. package/src/util/property_utils.tsx +17 -6
  360. package/src/util/references.ts +19 -8
  361. package/src/util/resolutions.ts +110 -48
  362. package/src/util/storage.ts +79 -21
  363. package/src/util/strings.ts +2 -2
  364. package/src/util/useStorageUploadController.tsx +91 -28
  365. package/dist/components/FireCMSAppBar.d.ts +0 -26
  366. package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
  367. package/dist/components/VirtualTable/common.d.ts +0 -2
  368. package/dist/core/Drawer.d.ts +0 -23
  369. package/dist/core/Scaffold.d.ts +0 -55
  370. package/dist/core/SideEntityView.d.ts +0 -7
  371. package/dist/form/components/FormikArrayContainer.d.ts +0 -18
  372. package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
  373. package/dist/internal/useBuildCustomizationController.d.ts +0 -2
  374. package/dist/internal/useLocaleConfig.d.ts +0 -1
  375. package/dist/types/appcheck.d.ts +0 -26
  376. package/src/components/FireCMSAppBar.tsx +0 -165
  377. package/src/components/PropertyIdCopyTooltipContent.tsx +0 -28
  378. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +0 -225
  379. package/src/core/Drawer.tsx +0 -191
  380. package/src/core/Scaffold.tsx +0 -281
  381. package/src/core/SideEntityView.tsx +0 -38
  382. package/src/form/components/FormikArrayContainer.tsx +0 -44
  383. package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -695
  384. package/src/internal/useBuildCustomizationController.tsx +0 -5
  385. package/src/internal/useLocaleConfig.tsx +0 -18
  386. package/src/types/appcheck.ts +0 -29
  387. /package/src/util/{common.tsx → common.ts} +0 -0
@@ -9,6 +9,8 @@ import {
9
9
  EntityCollection,
10
10
  EntityCollectionsBuilder,
11
11
  EntityReference,
12
+ FireCMSPlugin,
13
+ NavigationBlocker,
12
14
  NavigationController,
13
15
  PermissionsBuilder,
14
16
  TopNavigationEntry,
@@ -20,19 +22,21 @@ import {
20
22
  applyPermissionsFunctionIfEmpty,
21
23
  getCollectionByPathOrId,
22
24
  mergeDeep,
25
+ removeFunctions,
23
26
  removeInitialAndTrailingSlashes,
24
27
  resolveCollectionPathIds,
25
28
  resolvePermissions
26
29
  } from "../util";
27
30
  import { getParentReferencesFromPath } from "../util/parent_references_from_path";
31
+ import { useBlocker, useNavigate } from "react-router-dom";
28
32
 
29
33
  const DEFAULT_BASE_PATH = "/";
30
34
  const DEFAULT_COLLECTION_PATH = "/c";
31
35
 
32
- type BuildNavigationContextProps<EC extends EntityCollection, UserType extends User> = {
36
+ export type BuildNavigationContextProps<EC extends EntityCollection, USER extends User> = {
33
37
  basePath?: string,
34
38
  baseCollectionPath?: string,
35
- authController: AuthController<UserType>;
39
+ authController: AuthController<USER>;
36
40
  collections?: EC[] | EntityCollectionsBuilder<EC>;
37
41
  collectionPermissions?: PermissionsBuilder;
38
42
  views?: CMSView[] | CMSViewsBuilder;
@@ -40,17 +44,14 @@ type BuildNavigationContextProps<EC extends EntityCollection, UserType extends U
40
44
  viewsOrder?: string[];
41
45
  userConfigPersistence?: UserConfigurationPersistence;
42
46
  dataSourceDelegate: DataSourceDelegate;
47
+ plugins?: FireCMSPlugin[];
43
48
  /**
44
- * Use this method to inject collections to the CMS.
45
- * You receive the current collections as a parameter, and you can return
46
- * a new list of collections.
47
- * @see {@link joinCollectionLists}
48
- * @param collections
49
+ * If true, the navigation logic will not be updated until this flag is false
49
50
  */
50
- injectCollections?: (collections: EntityCollection[]) => EntityCollection[];
51
+ disabled?: boolean;
51
52
  };
52
53
 
53
- export function useBuildNavigationController<EC extends EntityCollection, UserType extends User>(props: BuildNavigationContextProps<EC, UserType>): NavigationController {
54
+ export function useBuildNavigationController<EC extends EntityCollection, USER extends User>(props: BuildNavigationContextProps<EC, USER>): NavigationController {
54
55
  const {
55
56
  basePath = DEFAULT_BASE_PATH,
56
57
  baseCollectionPath = DEFAULT_COLLECTION_PATH,
@@ -60,11 +61,14 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
60
61
  views: viewsProp,
61
62
  adminViews: adminViewsProp,
62
63
  viewsOrder,
64
+ plugins,
63
65
  userConfigPersistence,
64
66
  dataSourceDelegate,
65
- injectCollections
67
+ disabled
66
68
  } = props;
67
69
 
70
+ const navigate = useNavigate();
71
+
68
72
  const collectionsRef = useRef<EntityCollection[] | undefined>();
69
73
  const viewsRef = useRef<CMSView[] | undefined>();
70
74
  const adminViewsRef = useRef<CMSView[] | undefined>();
@@ -130,6 +134,30 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
130
134
  .filter(Boolean) as TopNavigationEntry[]
131
135
  ];
132
136
 
137
+ // Sort by group, entries with group "Admin" will go last, and second to last will be the group "Views"
138
+ navigationEntries = navigationEntries.sort((a, b) => {
139
+ if (a.group !== "Views" && a.group !== "Admin" && (b.group === "Views" || b.group === "Admin")) {
140
+ return -1;
141
+ }
142
+ if (b.group !== "Views" && b.group !== "Admin" && (a.group === "Views" || a.group === "Admin")) {
143
+ return 1;
144
+ }
145
+ if (a.group === "Admin" && b.group !== "Admin") {
146
+ return 1;
147
+ }
148
+ if (a.group !== "Admin" && b.group === "Admin") {
149
+ return -1;
150
+ }
151
+ if (a.group === "Views" && b.group !== "Views") {
152
+ return -1;
153
+ }
154
+ if (a.group !== "Views" && b.group === "Views") {
155
+ return 1;
156
+ }
157
+ return 0;
158
+
159
+ });
160
+
133
161
  if (viewsOrder) {
134
162
  navigationEntries = navigationEntries.sort((a, b) => {
135
163
  const aIndex = viewsOrder.indexOf(a.path);
@@ -160,48 +188,62 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
160
188
 
161
189
  const refreshNavigation = useCallback(async () => {
162
190
 
163
- if (authController.initialLoading)
191
+ if (disabled || authController.initialLoading)
164
192
  return;
165
193
 
194
+ console.debug("Refreshing navigation");
195
+
166
196
  try {
167
- console.debug("Refreshing navigation", {
168
- authController
169
- })
197
+
170
198
  const [resolvedCollections = [], resolvedViews, resolvedAdminViews = []] = await Promise.all([
171
- resolveCollections(collectionsProp, collectionPermissions, authController, dataSourceDelegate, injectCollections),
199
+ resolveCollections(collectionsProp, collectionPermissions, authController, dataSourceDelegate, plugins),
172
200
  resolveCMSViews(viewsProp, authController, dataSourceDelegate),
173
201
  resolveCMSViews(adminViewsProp, authController, dataSourceDelegate)
174
202
  ]
175
203
  );
176
204
 
177
- if (
178
- !equal(collectionsRef.current, resolvedCollections) ||
179
- !equal(viewsRef.current, resolvedViews) ||
180
- !equal(adminViewsRef.current, resolvedAdminViews) ||
181
- !equal(topLevelNavigation, computeTopNavigation(resolvedCollections, resolvedViews, resolvedAdminViews, viewsOrder))
182
- ) {
205
+ let shouldUpdateTopLevelNav = false;
206
+ if (!areCollectionListsEqual(collectionsRef.current ?? [], resolvedCollections)) {
207
+ collectionsRef.current = resolvedCollections;
208
+ console.debug("Collections have changed", resolvedCollections);
209
+ shouldUpdateTopLevelNav = true;
210
+ }
211
+ if (collectionsRef.current === undefined) {
183
212
  collectionsRef.current = resolvedCollections;
213
+ shouldUpdateTopLevelNav = true;
214
+ }
215
+ if (!equal(viewsRef.current, resolvedViews)) {
184
216
  viewsRef.current = resolvedViews;
217
+ shouldUpdateTopLevelNav = true;
218
+ }
219
+ if (!equal(adminViewsRef.current, resolvedAdminViews)) {
185
220
  adminViewsRef.current = resolvedAdminViews;
186
- setTopLevelNavigation(computeTopNavigation(resolvedCollections ?? [], resolvedViews, resolvedAdminViews, viewsOrder));
221
+ shouldUpdateTopLevelNav = true;
222
+ }
223
+
224
+ const computedTopLevelNav = computeTopNavigation(resolvedCollections, resolvedViews, resolvedAdminViews, viewsOrder);
225
+ if (shouldUpdateTopLevelNav && !equal(topLevelNavigation, computedTopLevelNav)) {
226
+ setTopLevelNavigation(computedTopLevelNav);
187
227
  }
188
228
  } catch (e) {
189
229
  console.error(e);
190
230
  setNavigationLoadingError(e as any);
191
231
  }
192
232
 
193
- setNavigationLoading(false);
194
- setInitialised(true);
233
+ if (navigationLoading)
234
+ setNavigationLoading(false);
235
+ if (!initialised)
236
+ setInitialised(true);
195
237
 
196
238
  }, [
197
239
  collectionsProp,
198
240
  collectionPermissions,
199
241
  authController.user,
200
242
  authController.initialLoading,
243
+ disabled,
201
244
  viewsProp,
202
245
  adminViewsProp,
203
- computeTopNavigation,
204
- injectCollections
246
+ computeTopNavigation
205
247
  ]);
206
248
 
207
249
  useEffect(() => {
@@ -210,7 +252,6 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
210
252
 
211
253
  const getCollection = useCallback((
212
254
  idOrPath: string,
213
- entityId?: string,
214
255
  includeUserOverride = false
215
256
  ): EC | undefined => {
216
257
  const collections = collectionsRef.current;
@@ -220,8 +261,7 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
220
261
  const baseCollection = getCollectionByPathOrId(removeInitialAndTrailingSlashes(idOrPath), collections);
221
262
 
222
263
  const userOverride = includeUserOverride ? userConfigPersistence?.getCollectionConfig(idOrPath) : undefined;
223
-
224
- const overriddenCollection = baseCollection ? mergeDeep(baseCollection, userOverride) : undefined;
264
+ const overriddenCollection = baseCollection ? mergeDeep(baseCollection, userOverride ?? {}) : undefined;
225
265
 
226
266
  let result: Partial<EntityCollection> | undefined = overriddenCollection;
227
267
 
@@ -243,12 +283,22 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
243
283
 
244
284
  }, [userConfigPersistence]);
245
285
 
286
+ const getCollectionById = useCallback((id: string): EC | undefined => {
287
+ const collections = collectionsRef.current;
288
+ if (collections === undefined)
289
+ throw Error("getCollectionById: Collections have not been initialised yet");
290
+ const collection: EntityCollection | undefined = collections.find(c => c.id === id);
291
+ if (!collection)
292
+ return undefined;
293
+ return collection as EC;
294
+ }, []);
295
+
246
296
  const getCollectionFromPaths = useCallback(<EC extends EntityCollection>(pathSegments: string[]): EC | undefined => {
247
297
 
248
298
  const collections = collectionsRef.current;
299
+ if (collections === undefined)
300
+ throw Error("getCollectionFromPaths: Collections have not been initialised yet");
249
301
  let currentCollections: EntityCollection[] | undefined = [...(collections ?? [])];
250
- if (!currentCollections)
251
- throw Error("Collections have not been initialised yet");
252
302
 
253
303
  for (let i = 0; i < pathSegments.length; i++) {
254
304
  const pathSegment = pathSegments[i];
@@ -267,9 +317,9 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
267
317
  const getCollectionFromIds = useCallback(<EC extends EntityCollection>(ids: string[]): EC | undefined => {
268
318
 
269
319
  const collections = collectionsRef.current;
320
+ if (collections === undefined)
321
+ throw Error("getCollectionFromIds: Collections have not been initialised yet");
270
322
  let currentCollections: EntityCollection[] | undefined = [...(collections ?? [])];
271
- if (!currentCollections)
272
- throw Error("Collections have not been initialised yet");
273
323
 
274
324
  for (let i = 0; i < ids.length; i++) {
275
325
  const id = ids[i];
@@ -295,19 +345,8 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
295
345
  throw Error("Expected path starting with " + fullCollectionPath);
296
346
  }, [fullCollectionPath]);
297
347
 
298
- const buildUrlEditCollectionPath = useCallback(({
299
- path
300
- }: {
301
- path: string
302
- }): string => {
303
- return `s/edit/${encodePath(path)}`;
304
- },
305
- []);
306
-
307
- const resolveAliasesFrom = useCallback((path: string): string => {
308
- const collections = collectionsRef.current;
309
- if (!collections)
310
- throw Error("Collections have not been initialised yet");
348
+ const resolveIdsFrom = useCallback((path: string): string => {
349
+ const collections = collectionsRef.current ?? [];
311
350
  return resolveCollectionPathIds(path, collections);
312
351
  }, []);
313
352
 
@@ -350,10 +389,6 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
350
389
  return paths;
351
390
  }, [getCollectionFromIds]);
352
391
 
353
- console.debug("Navigation", {
354
- initialised,
355
- navigationLoading
356
- });
357
392
  return {
358
393
  collections: collectionsRef.current,
359
394
  views: viewsRef.current,
@@ -365,29 +400,22 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
365
400
  baseCollectionPath,
366
401
  initialised,
367
402
  getCollection,
403
+ getCollectionById,
368
404
  getCollectionFromPaths,
369
405
  getCollectionFromIds,
370
406
  isUrlCollectionPath,
371
407
  urlPathToDataPath,
372
408
  buildUrlCollectionPath,
373
- buildUrlEditCollectionPath,
374
- buildCMSUrlPath,
375
- resolveAliasesFrom,
409
+ resolveIdsFrom,
376
410
  topLevelNavigation,
377
411
  refreshNavigation,
378
412
  getParentReferencesFromPath: getAllParentReferencesForPath,
379
413
  getParentCollectionIds,
380
- convertIdsToPaths
414
+ convertIdsToPaths,
415
+ navigate,
381
416
  };
382
417
  }
383
418
 
384
- export function getSidePanelKey(path: string, entityId?: string) {
385
- if (entityId)
386
- return `${removeInitialAndTrailingSlashes(path)}/${removeInitialAndTrailingSlashes(entityId)}`;
387
- else
388
- return removeInitialAndTrailingSlashes(path);
389
- }
390
-
391
419
  function encodePath(input: string) {
392
420
  return encodeURIComponent(removeInitialAndTrailingSlashes(input))
393
421
  .replaceAll("%2F", "/")
@@ -396,9 +424,10 @@ function encodePath(input: string) {
396
424
 
397
425
  function filterOutNotAllowedCollections(resolvedCollections: EntityCollection[], authController: AuthController<User>): EntityCollection[] {
398
426
  return resolvedCollections
427
+ .filter((c) => Boolean(c.path))
399
428
  .filter((c) => {
400
429
  if (!c.permissions) return true;
401
- const resolvedPermissions = resolvePermissions(c, authController, c.path, null)
430
+ const resolvedPermissions = resolvePermissions(c, authController, c.path, null);
402
431
  return resolvedPermissions?.read !== false;
403
432
  })
404
433
  .map((c) => {
@@ -410,11 +439,24 @@ function filterOutNotAllowedCollections(resolvedCollections: EntityCollection[],
410
439
  });
411
440
  }
412
441
 
442
+ function applyPluginModifyCollection(resolvedCollections: EntityCollection[], modifyCollection: (collection: EntityCollection) => EntityCollection) {
443
+ return resolvedCollections.map((collection: EntityCollection): EntityCollection => {
444
+ const modifiedCollection = modifyCollection(collection);
445
+ if (modifiedCollection.subcollections) {
446
+ return {
447
+ ...modifiedCollection,
448
+ subcollections: applyPluginModifyCollection(modifiedCollection.subcollections, modifyCollection)
449
+ } satisfies EntityCollection;
450
+ }
451
+ return modifiedCollection;
452
+ });
453
+ }
454
+
413
455
  async function resolveCollections(collections: undefined | EntityCollection[] | EntityCollectionsBuilder<any>,
414
456
  collectionPermissions: PermissionsBuilder | undefined,
415
457
  authController: AuthController,
416
458
  dataSource: DataSourceDelegate,
417
- injectCollections?: (collections: EntityCollection[]) => EntityCollection[]) {
459
+ plugins: FireCMSPlugin[] | undefined): Promise<EntityCollection[]> {
418
460
  let resolvedCollections: EntityCollection[] = [];
419
461
  if (typeof collections === "function") {
420
462
  resolvedCollections = await collections({
@@ -426,14 +468,20 @@ async function resolveCollections(collections: undefined | EntityCollection[] |
426
468
  resolvedCollections = collections;
427
469
  }
428
470
 
429
- resolvedCollections = applyPermissionsFunctionIfEmpty(resolvedCollections, collectionPermissions);
430
-
431
- resolvedCollections = filterOutNotAllowedCollections(resolvedCollections, authController);
471
+ if (plugins) {
472
+ for (const plugin of plugins) {
473
+ if (plugin.collection?.modifyCollection) {
474
+ resolvedCollections = applyPluginModifyCollection(resolvedCollections, plugin.collection.modifyCollection);
475
+ }
432
476
 
433
- if (injectCollections) {
434
- resolvedCollections = injectCollections(resolvedCollections ?? []);
477
+ if (plugin.collection?.injectCollections) {
478
+ resolvedCollections = plugin.collection.injectCollections(resolvedCollections ?? []);
479
+ }
480
+ }
435
481
  }
436
482
 
483
+ resolvedCollections = applyPermissionsFunctionIfEmpty(resolvedCollections, collectionPermissions);
484
+ resolvedCollections = filterOutNotAllowedCollections(resolvedCollections, authController);
437
485
  return resolvedCollections;
438
486
  }
439
487
 
@@ -458,3 +506,80 @@ function getGroup(collectionOrView: EntityCollection<any, any> | CMSView) {
458
506
  }
459
507
  return trimmed ?? "Views";
460
508
  }
509
+
510
+ function areCollectionListsEqual(a: EntityCollection[], b: EntityCollection[]) {
511
+ if (a.length !== b.length) {
512
+ return false;
513
+ }
514
+ const aCopy = [...a];
515
+ const bCopy = [...b];
516
+ const aSorted = aCopy.sort((x, y) => x.id.localeCompare(y.id));
517
+ const bSorted = bCopy.sort((x, y) => x.id.localeCompare(y.id));
518
+ return aSorted.every((value, index) => areCollectionsEqual(value, bSorted[index]));
519
+ }
520
+
521
+ function areCollectionsEqual(a: EntityCollection, b: EntityCollection) {
522
+ const {
523
+ subcollections: subcollectionsA,
524
+ ...restA
525
+ } = a;
526
+ const {
527
+ subcollections: subcollectionsB,
528
+ ...restB
529
+ } = b;
530
+ if (!areCollectionListsEqual(subcollectionsA ?? [], subcollectionsB ?? [])) {
531
+ return false;
532
+ }
533
+ return equal(removeFunctions(restA), removeFunctions(restB));
534
+ }
535
+
536
+ function useCustomBlocker(): NavigationBlocker {
537
+ const [blockListeners, setBlockListeners] = useState<Record<string, {
538
+ block: boolean,
539
+ basePath?: string
540
+ }>>({});
541
+
542
+ const shouldBlock = Object.values(blockListeners).some(b => b.block);
543
+
544
+ let blocker: any;
545
+ try {
546
+ blocker = useBlocker(({
547
+ nextLocation
548
+ }) => {
549
+ const allBasePaths = Object.values(blockListeners).map(b => b.basePath).filter(Boolean) as string[];
550
+ if (allBasePaths && allBasePaths.some(path => nextLocation.pathname.startsWith(path)))
551
+ return false;
552
+ return shouldBlock;
553
+ });
554
+ } catch (e) {
555
+ // console.warn("Blocker not available, navigation will not be blocked");
556
+ }
557
+
558
+ const updateBlockListener = (path: string, block: boolean, basePath?: string) => {
559
+ setBlockListeners(prev => ({
560
+ ...prev,
561
+ [path]: {
562
+ block,
563
+ basePath
564
+ }
565
+ }));
566
+ return () => setBlockListeners(prev => {
567
+ const {
568
+ [path]: removed,
569
+ ...rest
570
+ } = prev;
571
+ return rest;
572
+ })
573
+ };
574
+
575
+ const isBlocked = (path: string) => {
576
+ return (blockListeners[path]?.block ?? false) && blocker?.state === "blocked";
577
+ }
578
+
579
+ return {
580
+ updateBlockListener,
581
+ isBlocked,
582
+ proceed: blocker?.proceed,
583
+ reset: blocker?.reset
584
+ }
585
+ }
@@ -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,
@@ -67,33 +67,3 @@ export const useFireCMSContext = <UserType extends User = User, AuthControllerTy
67
67
 
68
68
  return fireCMSContextRef.current;
69
69
  }
70
-
71
- // export const useFireCMSContext = <UserType extends User = User, AuthControllerType extends AuthController<UserType> = AuthController<UserType>>(): FireCMSContext<UserType, AuthControllerType> => {
72
- //
73
- // const authController = useAuthController<UserType, AuthControllerType>();
74
- // const sideDialogsController = useSideDialogsController();
75
- // const sideEntityController = useSideEntityController();
76
- // const navigation = useNavigationController();
77
- // const dataSource = useDataSource();
78
- // const storageSource = useStorageSource();
79
- // const snackbarController = useSnackbarController();
80
- // const userConfigPersistence = useUserConfigurationPersistence();
81
- // const dialogsController = useDialogsController();
82
- // const customizationController = useCustomizationController();
83
- // const analyticsController = useAnalyticsController();
84
- //
85
- // return {
86
- // authController,
87
- // sideDialogsController,
88
- // sideEntityController,
89
- // navigation,
90
- // dataSource,
91
- // storageSource,
92
- // snackbarController,
93
- // userConfigPersistence,
94
- // dialogsController,
95
- // customizationController,
96
- // analyticsController
97
- // };
98
- //
99
- // };
@@ -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
  }