@firecms/core 3.0.0-canary.2 → 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 (409) hide show
  1. package/README.md +4 -4
  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 +3 -3
  13. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +22 -6
  14. package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +3 -2
  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 +17 -4
  22. package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
  23. package/dist/components/EntityCollectionView/useSelectionController.d.ts +2 -0
  24. package/dist/components/EntityCollectionView/utils.d.ts +3 -0
  25. package/dist/components/EntityPreview.d.ts +26 -7
  26. package/dist/components/EntityView.d.ts +11 -0
  27. package/dist/components/ErrorView.d.ts +1 -1
  28. package/dist/components/FieldCaption.d.ts +5 -0
  29. package/dist/components/HomePage/DefaultHomePage.d.ts +1 -1
  30. package/dist/components/HomePage/NavigationCard.d.ts +8 -0
  31. package/dist/components/HomePage/{NavigationCollectionCard.d.ts → NavigationCardBinding.d.ts} +3 -3
  32. package/dist/components/HomePage/SmallNavigationCard.d.ts +6 -0
  33. package/dist/components/HomePage/index.d.ts +3 -1
  34. package/dist/components/PropertyConfigBadge.d.ts +2 -1
  35. package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
  36. package/dist/components/ReferenceWidget.d.ts +6 -4
  37. package/dist/components/SelectableTable/SelectableTable.d.ts +13 -3
  38. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
  39. package/dist/components/UnsavedChangesDialog.d.ts +8 -0
  40. package/dist/components/VirtualTable/VirtualTableProps.d.ts +29 -13
  41. package/dist/components/VirtualTable/types.d.ts +3 -3
  42. package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -3
  43. package/dist/components/common/index.d.ts +2 -1
  44. package/dist/components/common/table_height.d.ts +5 -0
  45. package/dist/components/common/types.d.ts +4 -6
  46. package/dist/components/common/useColumnsIds.d.ts +3 -1
  47. package/dist/components/common/{useDataSourceEntityCollectionTableController.d.ts → useDataSourceTableController.d.ts} +13 -2
  48. package/dist/components/common/useDebouncedCallback.d.ts +1 -0
  49. package/dist/components/common/useScrollRestoration.d.ts +14 -0
  50. package/dist/components/index.d.ts +8 -5
  51. package/dist/contexts/AuthControllerContext.d.ts +1 -1
  52. package/dist/contexts/BreacrumbsContext.d.ts +8 -0
  53. package/dist/{components/FireCMSAppBar.d.ts → core/DefaultAppBar.d.ts} +6 -9
  54. package/dist/core/DefaultDrawer.d.ts +19 -0
  55. package/dist/core/DrawerNavigationItem.d.ts +10 -0
  56. package/dist/core/EntityEditView.d.ts +44 -0
  57. package/dist/core/EntityEditViewFormActions.d.ts +2 -0
  58. package/dist/core/FireCMS.d.ts +2 -2
  59. package/dist/core/FireCMSRouter.d.ts +4 -0
  60. package/dist/core/NavigationRoutes.d.ts +2 -3
  61. package/dist/core/SideDialogs.d.ts +4 -2
  62. package/dist/core/index.d.ts +4 -6
  63. package/dist/form/EntityForm.d.ts +45 -69
  64. package/dist/form/EntityFormActions.d.ts +17 -0
  65. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  66. package/dist/form/components/ErrorFocus.d.ts +1 -1
  67. package/dist/form/components/FieldHelperText.d.ts +3 -3
  68. package/dist/form/components/FormEntry.d.ts +6 -0
  69. package/dist/form/components/FormLayout.d.ts +5 -0
  70. package/dist/{components → form/components}/LabelWithIcon.d.ts +1 -1
  71. package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
  72. package/dist/form/components/StorageItemPreview.d.ts +4 -3
  73. package/dist/form/components/StorageUploadProgress.d.ts +1 -1
  74. package/dist/form/components/index.d.ts +4 -1
  75. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
  76. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
  77. package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
  78. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
  79. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  80. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
  81. package/dist/form/field_bindings/{MultiSelectBinding.d.ts → MultiSelectFieldBinding.d.ts} +1 -1
  82. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
  83. package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -2
  84. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
  85. package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
  86. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +3 -4
  87. package/dist/form/field_bindings/SwitchFieldBinding.d.ts +1 -2
  88. package/dist/form/field_bindings/TextFieldBinding.d.ts +2 -2
  89. package/dist/form/index.d.ts +17 -18
  90. package/dist/form/useClearRestoreValue.d.ts +2 -2
  91. package/dist/form/validation.d.ts +1 -1
  92. package/dist/hooks/data/delete.d.ts +4 -4
  93. package/dist/hooks/data/save.d.ts +4 -5
  94. package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
  95. package/dist/hooks/data/useDataSource.d.ts +2 -2
  96. package/dist/hooks/data/useEntityFetch.d.ts +4 -3
  97. package/dist/hooks/index.d.ts +4 -1
  98. package/dist/hooks/useAuthController.d.ts +1 -1
  99. package/dist/hooks/useBreadcrumbsController.d.ts +26 -0
  100. package/dist/{core → hooks}/useBuildModeController.d.ts +1 -1
  101. package/dist/hooks/useBuildNavigationController.d.ts +11 -6
  102. package/dist/hooks/useFireCMSContext.d.ts +1 -1
  103. package/dist/hooks/useModeController.d.ts +1 -2
  104. package/dist/hooks/useProjectLog.d.ts +12 -2
  105. package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
  106. package/dist/hooks/useStorageSource.d.ts +2 -2
  107. package/dist/hooks/useValidateAuthenticator.d.ts +21 -0
  108. package/dist/index.d.ts +1 -0
  109. package/dist/index.es.js +22131 -14039
  110. package/dist/index.es.js.map +1 -1
  111. package/dist/index.umd.js +24420 -588
  112. package/dist/index.umd.js.map +1 -1
  113. package/dist/internal/useBuildDataSource.d.ts +1 -12
  114. package/dist/internal/useUnsavedChangesDialog.d.ts +7 -9
  115. package/dist/preview/PropertyPreview.d.ts +1 -1
  116. package/dist/preview/PropertyPreviewProps.d.ts +7 -5
  117. package/dist/preview/components/BooleanPreview.d.ts +5 -1
  118. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  119. package/dist/preview/components/ReferencePreview.d.ts +4 -9
  120. package/dist/preview/components/StorageThumbnail.d.ts +2 -1
  121. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  122. package/dist/preview/util.d.ts +3 -3
  123. package/dist/routes/CustomCMSRoute.d.ts +4 -0
  124. package/dist/routes/FireCMSRoute.d.ts +1 -0
  125. package/dist/routes/HomePageRoute.d.ts +3 -0
  126. package/dist/types/analytics.d.ts +1 -1
  127. package/dist/types/auth.d.ts +37 -3
  128. package/dist/types/collections.d.ts +86 -24
  129. package/dist/types/datasource.d.ts +53 -37
  130. package/dist/types/dialogs_controller.d.ts +7 -3
  131. package/dist/types/entities.d.ts +8 -2
  132. package/dist/types/entity_actions.d.ts +28 -4
  133. package/dist/types/entity_callbacks.d.ts +16 -16
  134. package/dist/types/entity_overrides.d.ts +6 -0
  135. package/dist/types/export_import.d.ts +4 -4
  136. package/dist/types/fields.d.ts +71 -42
  137. package/dist/types/firecms.d.ts +6 -2
  138. package/dist/types/firecms_context.d.ts +1 -1
  139. package/dist/types/index.d.ts +2 -1
  140. package/dist/types/navigation.d.ts +45 -26
  141. package/dist/types/permissions.d.ts +8 -4
  142. package/dist/types/plugins.d.ts +40 -31
  143. package/dist/types/properties.d.ts +54 -26
  144. package/dist/types/property_config.d.ts +2 -4
  145. package/dist/types/roles.d.ts +31 -0
  146. package/dist/types/side_dialogs_controller.d.ts +10 -0
  147. package/dist/types/side_entity_controller.d.ts +6 -1
  148. package/dist/types/storage.d.ts +86 -3
  149. package/dist/types/user.d.ts +6 -0
  150. package/dist/util/builders.d.ts +3 -3
  151. package/dist/util/collections.d.ts +9 -1
  152. package/dist/util/entities.d.ts +3 -3
  153. package/dist/util/entity_actions.d.ts +2 -0
  154. package/dist/util/entity_cache.d.ts +23 -0
  155. package/dist/util/icon_list.d.ts +5 -1
  156. package/dist/util/icon_synonyms.d.ts +1 -98
  157. package/dist/util/icons.d.ts +13 -4
  158. package/dist/util/index.d.ts +2 -0
  159. package/dist/util/navigation_from_path.d.ts +6 -1
  160. package/dist/util/navigation_utils.d.ts +14 -3
  161. package/dist/util/objects.d.ts +2 -1
  162. package/dist/util/permissions.d.ts +4 -4
  163. package/dist/util/plurals.d.ts +0 -2
  164. package/dist/util/property_utils.d.ts +3 -3
  165. package/dist/util/references.d.ts +4 -2
  166. package/dist/util/resolutions.d.ts +31 -17
  167. package/dist/util/storage.d.ts +23 -2
  168. package/dist/util/useStorageUploadController.d.ts +3 -3
  169. package/dist/util/useTraceUpdate.d.ts +1 -0
  170. package/package.json +64 -51
  171. package/src/app/AppBar.tsx +18 -0
  172. package/src/app/Drawer.tsx +24 -0
  173. package/src/app/Scaffold.tsx +243 -0
  174. package/src/app/index.ts +4 -0
  175. package/src/app/useApp.tsx +32 -0
  176. package/src/components/ArrayContainer.tsx +126 -40
  177. package/src/components/CircularProgressCenter.tsx +2 -2
  178. package/src/components/ClearFilterSortButton.tsx +41 -0
  179. package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +3 -3
  180. package/src/components/DeleteEntityDialog.tsx +14 -23
  181. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +56 -39
  182. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +283 -280
  183. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +29 -8
  184. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +58 -50
  185. package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
  186. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +40 -33
  187. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +22 -20
  188. package/src/components/EntityCollectionTable/index.tsx +1 -1
  189. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +31 -36
  190. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +36 -34
  191. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +20 -8
  192. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +81 -80
  193. package/src/components/EntityCollectionView/EntityCollectionView.tsx +228 -155
  194. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +9 -8
  195. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
  196. package/src/components/EntityCollectionView/useSelectionController.tsx +43 -0
  197. package/src/components/EntityCollectionView/utils.ts +19 -0
  198. package/src/components/EntityPreview.tsx +218 -71
  199. package/src/components/EntityView.tsx +84 -0
  200. package/src/components/ErrorView.tsx +4 -4
  201. package/src/components/FieldCaption.tsx +14 -0
  202. package/src/components/HomePage/DefaultHomePage.tsx +39 -28
  203. package/src/components/HomePage/FavouritesView.tsx +6 -11
  204. package/src/components/HomePage/NavigationCard.tsx +69 -0
  205. package/src/components/HomePage/NavigationCardBinding.tsx +111 -0
  206. package/src/components/HomePage/NavigationGroup.tsx +2 -2
  207. package/src/components/HomePage/SmallNavigationCard.tsx +44 -0
  208. package/src/components/HomePage/index.tsx +3 -1
  209. package/src/components/NotFoundPage.tsx +2 -2
  210. package/src/components/PropertyConfigBadge.tsx +9 -3
  211. package/src/components/PropertyIdCopyTooltip.tsx +47 -0
  212. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +22 -17
  213. package/src/components/ReferenceWidget.tsx +26 -16
  214. package/src/components/SearchIconsView.tsx +10 -7
  215. package/src/components/SelectableTable/SelectableTable.tsx +27 -12
  216. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
  217. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +25 -8
  218. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +46 -30
  219. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +92 -23
  220. package/src/components/UnsavedChangesDialog.tsx +42 -0
  221. package/src/components/VirtualTable/VirtualTable.tsx +96 -48
  222. package/src/components/VirtualTable/VirtualTableCell.tsx +1 -9
  223. package/src/components/VirtualTable/VirtualTableHeader.tsx +10 -10
  224. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
  225. package/src/components/VirtualTable/VirtualTableProps.tsx +34 -15
  226. package/src/components/VirtualTable/VirtualTableRow.tsx +5 -6
  227. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +5 -5
  228. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +3 -2
  229. package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
  230. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +16 -28
  231. package/src/components/VirtualTable/types.tsx +2 -3
  232. package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +40 -43
  233. package/src/components/common/index.ts +2 -1
  234. package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
  235. package/src/components/common/types.tsx +4 -6
  236. package/src/components/common/useColumnsIds.tsx +24 -3
  237. package/src/components/common/useDataSourceTableController.tsx +420 -0
  238. package/src/components/common/useDebouncedCallback.tsx +20 -0
  239. package/src/components/common/useScrollRestoration.tsx +68 -0
  240. package/src/components/common/useTableSearchHelper.ts +53 -12
  241. package/src/components/index.tsx +8 -5
  242. package/src/contexts/AuthControllerContext.tsx +1 -1
  243. package/src/contexts/BreacrumbsContext.tsx +38 -0
  244. package/src/contexts/DialogsProvider.tsx +5 -4
  245. package/src/contexts/ModeController.tsx +1 -3
  246. package/src/contexts/SnackbarProvider.tsx +2 -0
  247. package/src/core/DefaultAppBar.tsx +207 -0
  248. package/src/core/DefaultDrawer.tsx +185 -0
  249. package/src/core/DrawerNavigationItem.tsx +66 -0
  250. package/src/core/EntityEditView.tsx +455 -0
  251. package/src/core/EntityEditViewFormActions.tsx +199 -0
  252. package/src/core/EntitySidePanel.tsx +87 -18
  253. package/src/core/FireCMS.tsx +67 -44
  254. package/src/core/FireCMSRouter.tsx +17 -0
  255. package/src/core/NavigationRoutes.tsx +36 -38
  256. package/src/core/SideDialogs.tsx +22 -12
  257. package/src/core/field_configs.tsx +11 -12
  258. package/src/core/index.tsx +6 -7
  259. package/src/form/EntityForm.tsx +565 -519
  260. package/src/form/EntityFormActions.tsx +169 -0
  261. package/src/form/PropertyFieldBinding.tsx +85 -44
  262. package/src/form/components/CustomIdField.tsx +6 -2
  263. package/src/form/components/FieldHelperText.tsx +4 -4
  264. package/src/form/components/FormEntry.tsx +22 -0
  265. package/src/form/components/FormLayout.tsx +16 -0
  266. package/src/form/components/LabelWithIcon.tsx +44 -0
  267. package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
  268. package/src/form/components/StorageItemPreview.tsx +23 -11
  269. package/src/form/components/StorageUploadProgress.tsx +9 -9
  270. package/src/form/components/index.tsx +4 -1
  271. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +32 -21
  272. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +54 -45
  273. package/src/form/field_bindings/BlockFieldBinding.tsx +57 -36
  274. package/src/form/field_bindings/DateTimeFieldBinding.tsx +21 -17
  275. package/src/form/field_bindings/KeyValueFieldBinding.tsx +76 -67
  276. package/src/form/field_bindings/MapFieldBinding.tsx +82 -65
  277. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +153 -0
  278. package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +26 -22
  279. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +12 -17
  280. package/src/form/field_bindings/ReferenceFieldBinding.tsx +47 -34
  281. package/src/form/field_bindings/RepeatFieldBinding.tsx +57 -36
  282. package/src/form/field_bindings/SelectFieldBinding.tsx +24 -17
  283. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +47 -46
  284. package/src/form/field_bindings/SwitchFieldBinding.tsx +31 -27
  285. package/src/form/field_bindings/TextFieldBinding.tsx +35 -30
  286. package/src/form/index.tsx +17 -37
  287. package/src/form/useClearRestoreValue.tsx +2 -2
  288. package/src/form/validation.ts +15 -26
  289. package/src/hooks/data/delete.ts +7 -6
  290. package/src/hooks/data/save.ts +13 -9
  291. package/src/hooks/data/useCollectionFetch.tsx +4 -4
  292. package/src/hooks/data/useDataSource.tsx +15 -2
  293. package/src/hooks/data/useEntityFetch.tsx +11 -7
  294. package/src/hooks/index.tsx +6 -1
  295. package/src/hooks/useAuthController.tsx +1 -1
  296. package/src/hooks/useBreadcrumbsController.tsx +31 -0
  297. package/src/{core → hooks}/useBuildLocalConfigurationPersistence.tsx +8 -10
  298. package/src/{core → hooks}/useBuildModeController.tsx +23 -30
  299. package/src/hooks/useBuildNavigationController.tsx +278 -117
  300. package/src/hooks/useFireCMSContext.tsx +5 -5
  301. package/src/hooks/useLargeLayout.tsx +0 -35
  302. package/src/hooks/useModeController.tsx +1 -2
  303. package/src/hooks/useProjectLog.tsx +41 -9
  304. package/src/hooks/useReferenceDialog.tsx +2 -2
  305. package/src/hooks/useResolvedNavigationFrom.tsx +10 -12
  306. package/src/hooks/useStorageSource.tsx +7 -2
  307. package/src/hooks/useValidateAuthenticator.tsx +115 -0
  308. package/src/index.ts +1 -0
  309. package/src/internal/useBuildDataSource.ts +72 -77
  310. package/src/internal/useBuildSideDialogsController.tsx +4 -2
  311. package/src/internal/useBuildSideEntityController.tsx +177 -70
  312. package/src/internal/useUnsavedChangesDialog.tsx +127 -91
  313. package/src/preview/PropertyPreview.tsx +19 -26
  314. package/src/preview/PropertyPreviewProps.tsx +5 -9
  315. package/src/preview/components/BooleanPreview.tsx +19 -4
  316. package/src/preview/components/EmptyValue.tsx +1 -1
  317. package/src/preview/components/EnumValuesChip.tsx +2 -2
  318. package/src/preview/components/ImagePreview.tsx +25 -36
  319. package/src/preview/components/ReferencePreview.tsx +73 -176
  320. package/src/preview/components/StorageThumbnail.tsx +5 -1
  321. package/src/preview/components/UrlComponentPreview.tsx +60 -28
  322. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +2 -3
  323. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +4 -3
  324. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +2 -3
  325. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +1 -2
  326. package/src/preview/property_previews/ArrayOneOfPreview.tsx +4 -5
  327. package/src/preview/property_previews/ArrayPropertyPreview.tsx +4 -5
  328. package/src/preview/property_previews/MapPropertyPreview.tsx +12 -11
  329. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +12 -12
  330. package/src/preview/property_previews/StringPropertyPreview.tsx +8 -7
  331. package/src/preview/util.ts +10 -10
  332. package/src/routes/CustomCMSRoute.tsx +21 -0
  333. package/src/routes/FireCMSRoute.tsx +236 -0
  334. package/src/routes/HomePageRoute.tsx +17 -0
  335. package/src/types/analytics.ts +1 -0
  336. package/src/types/auth.tsx +48 -3
  337. package/src/types/collections.ts +102 -27
  338. package/src/types/customization_controller.tsx +0 -1
  339. package/src/types/datasource.ts +62 -44
  340. package/src/types/dialogs_controller.tsx +7 -3
  341. package/src/types/entities.ts +16 -2
  342. package/src/types/entity_actions.tsx +33 -4
  343. package/src/types/entity_callbacks.ts +18 -18
  344. package/src/types/entity_overrides.tsx +7 -0
  345. package/src/types/export_import.ts +4 -4
  346. package/src/types/fields.tsx +81 -46
  347. package/src/types/firecms.tsx +6 -2
  348. package/src/types/firecms_context.tsx +1 -1
  349. package/src/types/index.ts +2 -1
  350. package/src/types/navigation.ts +52 -31
  351. package/src/types/permissions.ts +10 -5
  352. package/src/types/plugins.tsx +47 -39
  353. package/src/types/properties.ts +63 -27
  354. package/src/types/property_config.tsx +2 -4
  355. package/src/types/roles.ts +41 -0
  356. package/src/types/side_dialogs_controller.tsx +15 -0
  357. package/src/types/side_entity_controller.tsx +7 -1
  358. package/src/types/storage.ts +94 -3
  359. package/src/types/user.ts +9 -0
  360. package/src/util/builders.ts +10 -8
  361. package/src/util/collections.ts +22 -0
  362. package/src/util/entities.ts +9 -6
  363. package/src/util/entity_actions.ts +28 -0
  364. package/src/util/entity_cache.ts +204 -0
  365. package/src/util/enums.ts +1 -1
  366. package/src/util/icon_list.ts +16 -10
  367. package/src/util/icon_synonyms.ts +3 -100
  368. package/src/util/icons.tsx +26 -8
  369. package/src/util/index.ts +2 -0
  370. package/src/util/join_collections.ts +3 -0
  371. package/src/util/make_properties_editable.ts +13 -5
  372. package/src/util/navigation_from_path.ts +13 -6
  373. package/src/util/navigation_utils.ts +59 -7
  374. package/src/util/objects.ts +45 -28
  375. package/src/util/parent_references_from_path.ts +3 -3
  376. package/src/util/permissions.ts +20 -16
  377. package/src/util/plurals.ts +0 -2
  378. package/src/util/property_utils.tsx +11 -4
  379. package/src/util/references.ts +45 -5
  380. package/src/util/resolutions.ts +79 -46
  381. package/src/util/storage.ts +79 -21
  382. package/src/util/strings.ts +2 -2
  383. package/src/util/useStorageUploadController.tsx +71 -27
  384. package/src/util/useTraceUpdate.tsx +2 -1
  385. package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
  386. package/dist/components/VirtualTable/common.d.ts +0 -2
  387. package/dist/core/Drawer.d.ts +0 -23
  388. package/dist/core/Scaffold.d.ts +0 -55
  389. package/dist/form/components/FormikArrayContainer.d.ts +0 -18
  390. package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
  391. package/dist/internal/EntityView.d.ts +0 -22
  392. package/dist/internal/useBuildCustomizationController.d.ts +0 -2
  393. package/dist/internal/useLocaleConfig.d.ts +0 -1
  394. package/dist/types/appcheck.d.ts +0 -26
  395. package/src/components/FireCMSAppBar.tsx +0 -157
  396. package/src/components/HomePage/NavigationCollectionCard.tsx +0 -146
  397. package/src/components/LabelWithIcon.tsx +0 -33
  398. package/src/components/PropertyIdCopyTooltipContent.tsx +0 -28
  399. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +0 -225
  400. package/src/core/Drawer.tsx +0 -164
  401. package/src/core/Scaffold.tsx +0 -281
  402. package/src/form/components/FormikArrayContainer.tsx +0 -44
  403. package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -696
  404. package/src/internal/EntityView.tsx +0 -578
  405. package/src/internal/useBuildCustomizationController.tsx +0 -5
  406. package/src/internal/useLocaleConfig.tsx +0 -18
  407. package/src/types/appcheck.ts +0 -29
  408. /package/dist/{core → hooks}/useBuildLocalConfigurationPersistence.d.ts +0 -0
  409. /package/src/util/{common.tsx → common.ts} +0 -0
@@ -1,22 +1,39 @@
1
1
  import {
2
+ ArrayProperty,
2
3
  EntityValues,
4
+ PropertyOrBuilder,
3
5
  ResolvedArrayProperty,
4
6
  ResolvedStringProperty,
5
7
  StorageConfig,
8
+ StringProperty,
6
9
  UploadedFileContext
7
10
  } from "../types";
8
11
  import { randomString } from "./strings";
9
12
 
10
- export async function resolveFilenameString<M extends object>(
11
- input: string | ((context: UploadedFileContext) => Promise<string> | string),
12
- storage: StorageConfig,
13
- values: EntityValues<M>,
14
- entityId: string,
15
- path: string,
13
+ interface ResolveFilenameStringParams<M extends object> {
14
+ input: string | ((context: UploadedFileContext) => (Promise<string> | string));
15
+ storage: StorageConfig;
16
+ values: EntityValues<M>;
17
+ entityId: string;
18
+ path?: string;
16
19
  property: ResolvedStringProperty | ResolvedArrayProperty<string[]>,
17
- file: File,
18
- propertyKey: string): Promise<string> {
20
+ file: File;
21
+ propertyKey: string;
22
+ }
23
+
24
+ export async function resolveStorageFilenameString<M extends object>(
25
+ {
26
+ input,
27
+ storage,
28
+ values,
29
+ entityId,
30
+ path,
31
+ property,
32
+ file,
33
+ propertyKey
34
+ }: ResolveFilenameStringParams<M>): Promise<string> {
19
35
  let result;
36
+
20
37
  if (typeof input === "function") {
21
38
  result = await input({
22
39
  path,
@@ -30,7 +47,13 @@ export async function resolveFilenameString<M extends object>(
30
47
  if (!result)
31
48
  console.warn("Storage callback returned empty result. Using default name value")
32
49
  } else {
33
- result = replacePlaceholders(file, input, entityId, propertyKey, path);
50
+ result = replacePlaceholders({
51
+ file,
52
+ input,
53
+ entityId,
54
+ propertyKey,
55
+ path
56
+ });
34
57
  }
35
58
 
36
59
  if (!result)
@@ -39,15 +62,28 @@ export async function resolveFilenameString<M extends object>(
39
62
  return result;
40
63
  }
41
64
 
65
+ interface ResolveStoragePathStringParams<M extends object> {
66
+ input: string | ((context: UploadedFileContext) => string);
67
+ storage: StorageConfig;
68
+ values: EntityValues<M>;
69
+ entityId: string;
70
+ path?: string;
71
+ property: ResolvedStringProperty | ResolvedArrayProperty<string[]>;
72
+ file: File;
73
+ propertyKey: string;
74
+ }
75
+
42
76
  export function resolveStoragePathString<M extends object>(
43
- input: string | ((context: UploadedFileContext) => string),
44
- storage: StorageConfig,
45
- values: EntityValues<M>,
46
- entityId: string,
47
- path: string,
48
- property: ResolvedStringProperty | ResolvedArrayProperty<string[]>,
49
- file: File,
50
- propertyKey: string): string {
77
+ {
78
+ input,
79
+ storage,
80
+ values,
81
+ entityId,
82
+ path,
83
+ property,
84
+ file,
85
+ propertyKey
86
+ }: ResolveStoragePathStringParams<M>): string {
51
87
  let result;
52
88
  if (typeof input === "function") {
53
89
  result = input({
@@ -62,7 +98,13 @@ export function resolveStoragePathString<M extends object>(
62
98
  if (!result)
63
99
  console.warn("Storage callback returned empty result. Using default name value")
64
100
  } else {
65
- result = replacePlaceholders(file, input, entityId, propertyKey, path);
101
+ result = replacePlaceholders({
102
+ file,
103
+ input,
104
+ entityId,
105
+ propertyKey,
106
+ path
107
+ });
66
108
  }
67
109
 
68
110
  if (!result)
@@ -71,14 +113,30 @@ export function resolveStoragePathString<M extends object>(
71
113
  return result;
72
114
  }
73
115
 
74
- function replacePlaceholders(file: File, input: string, entityId: string, propertyKey: string, path: string) {
116
+ interface Placeholders {
117
+ file: File;
118
+ input: string;
119
+ entityId: string;
120
+ propertyKey: string;
121
+ path?: string;
122
+ }
123
+
124
+ function replacePlaceholders({
125
+ file,
126
+ input,
127
+ entityId,
128
+ propertyKey,
129
+ path
130
+ }: Placeholders) {
75
131
  const ext = file.name.split(".").pop();
76
132
  let result = input.replace("{entityId}", entityId)
77
133
  .replace("{propertyKey}", propertyKey)
78
134
  .replace("{rand}", randomString())
79
135
  .replace("{file}", file.name)
80
- .replace("{file.type}", file.type)
81
- .replace("{path}", path);
136
+ .replace("{file.type}", file.type);
137
+ if (path) {
138
+ result = result.replace("{path}", path);
139
+ }
82
140
  if (ext) {
83
141
  result = result.replace("{file.ext}", ext);
84
142
  const name = file.name.replace(`.${ext}`, "");
@@ -56,8 +56,8 @@ export function unslugify(slug?: string): string {
56
56
  const result = slug.replace(/[-_]/g, " ");
57
57
  return result.replace(/\w\S*/g, function (txt) {
58
58
  return txt.charAt(0).toUpperCase() + txt.substr(1);
59
- });
59
+ }).trim();
60
60
  } else {
61
- return slug;
61
+ return slug.trim();
62
62
  }
63
63
  }
@@ -2,9 +2,11 @@ import Resizer from "react-image-file-resizer";
2
2
  import equal from "react-fast-compare";
3
3
 
4
4
  import {
5
+ ArrayProperty,
5
6
  EntityValues,
6
7
  ImageCompression,
7
8
  Property,
9
+ PropertyOrBuilder,
8
10
  ResolvedArrayProperty,
9
11
  ResolvedStringProperty,
10
12
  StorageConfig,
@@ -14,7 +16,8 @@ import {
14
16
  import { useCallback, useEffect, useState } from "react";
15
17
  import { PreviewSize } from "../preview";
16
18
  import { randomString } from "./strings";
17
- import { resolveFilenameString, resolveStoragePathString } from "./storage";
19
+ import { resolveStorageFilenameString, resolveStoragePathString } from "./storage";
20
+ import { resolveProperty } from "./resolutions";
18
21
 
19
22
  /**
20
23
  * Internal representation of an item in the storage
@@ -31,6 +34,7 @@ export interface StorageFieldItem {
31
34
  size: PreviewSize
32
35
  }
33
36
 
37
+
34
38
  export function useStorageUploadController<M extends object>({
35
39
  entityId,
36
40
  entityValues,
@@ -42,17 +46,17 @@ export function useStorageUploadController<M extends object>({
42
46
  disabled,
43
47
  onChange
44
48
  }:
45
- {
46
- entityId: string,
47
- entityValues: EntityValues<M>,
48
- value: string | string[] | null;
49
- path: string,
50
- propertyKey: string,
51
- property: ResolvedStringProperty | ResolvedArrayProperty<string[]>,
52
- storageSource: StorageSource,
53
- disabled: boolean,
54
- onChange: (value: string | string[] | null) => void
55
- }) {
49
+ {
50
+ entityId: string,
51
+ entityValues: EntityValues<M>,
52
+ value: string | string[] | null;
53
+ path?: string,
54
+ propertyKey: string,
55
+ property: StringProperty | ArrayProperty<string[]> | ResolvedStringProperty | ResolvedArrayProperty<string[]>,
56
+ storageSource: StorageSource,
57
+ disabled: boolean,
58
+ onChange: (value: string | string[] | null) => void
59
+ }) {
56
60
 
57
61
  const storage: StorageConfig | undefined = property.dataType === "string"
58
62
  ? property.storage
@@ -67,21 +71,12 @@ export function useStorageUploadController<M extends object>({
67
71
  throw Error("Storage meta must be specified");
68
72
 
69
73
  const metadata: Record<string, any> | undefined = storage?.metadata;
70
- const size = multipleFilesSupported ? "small" : "medium";
74
+ const size = multipleFilesSupported ? "medium" : "large";
71
75
 
72
76
  const compression: ImageCompression | undefined = storage?.imageCompression;
73
77
 
74
78
  const internalInitialValue: StorageFieldItem[] =
75
- (multipleFilesSupported
76
- ? (value ?? []) as string[]
77
- : value ? [value as string] : []).map(entry => (
78
- {
79
- id: getRandomId(),
80
- storagePathOrDownloadUrl: entry,
81
- metadata,
82
- size
83
- }
84
- ));
79
+ getInternalInitialValue(multipleFilesSupported, value, metadata, size);
85
80
 
86
81
  const [initialValue, setInitialValue] = useState<string | string[] | null>(value);
87
82
  const [internalValue, setInternalValue] = useState<StorageFieldItem[]>(internalInitialValue);
@@ -93,20 +88,43 @@ export function useStorageUploadController<M extends object>({
93
88
  }
94
89
  }, [internalInitialValue, value, initialValue]);
95
90
 
91
+ const resolvedProperty = resolveProperty({
92
+ propertyOrBuilder: property as PropertyOrBuilder,
93
+ values: entityValues
94
+ }) as ResolvedStringProperty | ResolvedArrayProperty<string[]>;
95
+
96
96
  const fileNameBuilder = useCallback(async (file: File) => {
97
97
  if (storage.fileName) {
98
- const fileName = await resolveFilenameString(storage.fileName, storage, entityValues, entityId, path, property, file, propertyKey);
98
+ const fileName = await resolveStorageFilenameString({
99
+ input: storage.fileName,
100
+ storage,
101
+ values: entityValues,
102
+ entityId,
103
+ path,
104
+ property: resolvedProperty,
105
+ file,
106
+ propertyKey
107
+ });
99
108
  if (!fileName || fileName.length === 0) {
100
109
  throw Error("You need to return a valid filename");
101
110
  }
102
111
  return fileName;
103
112
  }
104
113
  return randomString() + "_" + file.name;
105
- }, [entityId, entityValues, path, property, propertyKey, storage]);
114
+ }, [entityId, entityValues, path, resolvedProperty, propertyKey, storage]);
106
115
 
107
116
  const storagePathBuilder = useCallback((file: File) => {
108
- return resolveStoragePathString(storage.storagePath, storage, entityValues, entityId, path, property, file, propertyKey) ?? "/";
109
- }, [entityId, entityValues, path, property, propertyKey, storage]);
117
+ return resolveStoragePathString({
118
+ input: storage.storagePath,
119
+ storage,
120
+ values: entityValues,
121
+ entityId,
122
+ path,
123
+ property: resolvedProperty,
124
+ file,
125
+ propertyKey
126
+ }) ?? "/";
127
+ }, [entityId, entityValues, path, resolvedProperty, propertyKey, storage]);
110
128
 
111
129
  const onFileUploadComplete = useCallback(async (uploadedPath: string,
112
130
  entry: StorageFieldItem,
@@ -200,6 +218,32 @@ export function useStorageUploadController<M extends object>({
200
218
  }
201
219
  }
202
220
 
221
+ function getInternalInitialValue(multipleFilesSupported: boolean,
222
+ value: string | string[] | null,
223
+ metadata: Record<string, any> | undefined,
224
+ size: PreviewSize): StorageFieldItem[] {
225
+ let strings: string[] = [];
226
+ if (multipleFilesSupported) {
227
+ if (Array.isArray(value) && value.every((v) => typeof v === "string")) {
228
+ strings = (value ?? []) as string[];
229
+ }
230
+ } else {
231
+ if (typeof value === "string") {
232
+ strings = value ? [value as string] : [];
233
+ }
234
+ }
235
+
236
+ return strings
237
+ .map(entry => (
238
+ {
239
+ id: getRandomId(),
240
+ storagePathOrDownloadUrl: entry,
241
+ metadata,
242
+ size
243
+ }
244
+ ));
245
+ }
246
+
203
247
  function removeDuplicates(items: StorageFieldItem[]) {
204
248
  return items.filter(
205
249
  (item, i) => {
@@ -1,6 +1,6 @@
1
1
  import { useEffect, useRef } from "react";
2
2
 
3
- function printChanged(props: any, prev: any, path = "", depth = 0, maxDepth: number) {
3
+ export function printChanged(props: any, prev: any, path: string | undefined = "", depth: number | undefined = 0, maxDepth: number | undefined = 10) {
4
4
  if (depth > maxDepth) {
5
5
  return;
6
6
  }
@@ -17,6 +17,7 @@ function printChanged(props: any, prev: any, path = "", depth = 0, maxDepth: num
17
17
  export function useTraceUpdate(props: any, maxDepth = 3) {
18
18
  const prev = useRef(props);
19
19
  useEffect(() => {
20
+ console.log("Changed props:");
20
21
  printChanged(props, prev.current, "", 0, maxDepth);
21
22
  prev.current = props;
22
23
  });
@@ -1,3 +0,0 @@
1
- export declare function PropertyIdCopyTooltipContent({ propertyId }: {
2
- propertyId: string;
3
- }): import("react/jsx-runtime").JSX.Element;
@@ -1,2 +0,0 @@
1
- import { VirtualTableSize } from "./VirtualTableProps";
2
- export declare function getRowHeight(size: VirtualTableSize): number;
@@ -1,23 +0,0 @@
1
- import React from "react";
2
- /**
3
- * Props used in case you need to override the default drawer
4
- * @group Core
5
- */
6
- export type DrawerProps<T = {}> = T & {
7
- hovered: boolean;
8
- drawerOpen: boolean;
9
- closeDrawer: () => any;
10
- };
11
- /**
12
- * Default drawer used in the CMS
13
- * @group Core
14
- */
15
- export declare function Drawer({ hovered, drawerOpen, closeDrawer }: DrawerProps): import("react/jsx-runtime").JSX.Element;
16
- export declare function DrawerNavigationItem({ name, icon, drawerOpen, tooltipsOpen, url, onClick }: {
17
- icon: React.ReactElement;
18
- name: string;
19
- tooltipsOpen: boolean;
20
- drawerOpen: boolean;
21
- url: string;
22
- onClick?: () => void;
23
- }): import("react/jsx-runtime").JSX.Element;
@@ -1,55 +0,0 @@
1
- import React from "react";
2
- import { DrawerProps } from "./Drawer";
3
- import { FireCMSAppBarProps } from "../components";
4
- export declare const DRAWER_WIDTH = 280;
5
- /**
6
- * @group Core
7
- */
8
- export interface ScaffoldProps<ExtraDrawerProps = object, ExtraAppbarProps = object> {
9
- /**
10
- * Name of the app, displayed as the main title and in the tab title
11
- */
12
- name: string;
13
- /**
14
- * Logo to be displayed in the drawer of the CMS
15
- */
16
- logo?: string;
17
- /**
18
- * Whether to include the drawer in the scaffold
19
- */
20
- includeDrawer?: boolean;
21
- /**
22
- * In case you need to override the view that gets rendered as a drawer
23
- * @see DefaultDrawer
24
- */
25
- Drawer?: React.ComponentType<DrawerProps<ExtraDrawerProps>>;
26
- /**
27
- * Additional props passed to the custom Drawer
28
- */
29
- drawerProps?: Partial<DrawerProps> & ExtraDrawerProps;
30
- /**
31
- * Open the drawer on hover
32
- */
33
- autoOpenDrawer?: boolean;
34
- /**
35
- * A component that gets rendered on the upper side of the main toolbar.
36
- * `toolbarExtraWidget` has no effect if this is set.
37
- */
38
- FireCMSAppBar?: React.ComponentType<FireCMSAppBarProps<ExtraAppbarProps>>;
39
- /**
40
- * Additional props passed to the custom AppBar
41
- */
42
- fireCMSAppBarProps?: Partial<FireCMSAppBarProps> & ExtraAppbarProps;
43
- }
44
- /**
45
- * This view acts as a scaffold for FireCMS.
46
- *
47
- * It is in charge of displaying the navigation drawer, top bar and main
48
- * collection views.
49
- * This component needs a parent {@link FireCMS}
50
- *
51
- * @param props
52
- * @constructor
53
- * @group Core
54
- */
55
- export declare const Scaffold: React.NamedExoticComponent<React.PropsWithChildren<ScaffoldProps<object, object>>>;
@@ -1,18 +0,0 @@
1
- import React from "react";
2
- interface ArrayContainerProps<T> {
3
- value: T[];
4
- name: string;
5
- addLabel: string;
6
- buildEntry: (index: number, internalId: number) => React.ReactNode;
7
- disabled?: boolean;
8
- small?: boolean;
9
- onInternalIdAdded?: (id: number) => void;
10
- includeAddButton?: boolean;
11
- newDefaultEntry?: T | null;
12
- setFieldValue: (field: string, value: any, shouldValidate?: boolean | undefined) => void;
13
- }
14
- /**
15
- * @group Form custom fields
16
- */
17
- export declare function FormikArrayContainer<T>({ name, addLabel, value, disabled, buildEntry, small, onInternalIdAdded, includeAddButton, newDefaultEntry, setFieldValue }: ArrayContainerProps<T>): import("react/jsx-runtime").JSX.Element;
18
- export {};
@@ -1,9 +0,0 @@
1
- import { FieldProps } from "../../types";
2
- /**
3
- * Render a markdown field that allows edition and seeing the preview.
4
- *
5
- * This is one of the internal components that get mapped natively inside forms
6
- * and tables to the specified properties.
7
- * @group Form fields
8
- */
9
- export declare function MarkdownFieldBinding({ propertyKey, value, setValue, error, showError, disabled, autoFocus, touched, property, tableMode, includeDescription, context }: FieldProps<string>): import("react/jsx-runtime").JSX.Element;
@@ -1,22 +0,0 @@
1
- import { Entity, EntityCollection, User } from "../types";
2
- export interface EntityViewProps<M extends Record<string, any>> {
3
- path: string;
4
- collection: EntityCollection<M>;
5
- entityId?: string;
6
- copy?: boolean;
7
- selectedSubPath?: string;
8
- parentCollectionIds: string[];
9
- formWidth?: number | string;
10
- onValuesAreModified: (modified: boolean) => void;
11
- onUpdate?: (params: {
12
- entity: Entity<any>;
13
- }) => void;
14
- onClose?: () => void;
15
- }
16
- /**
17
- * This is the default view that is used as the content of a side panel when
18
- * an entity is opened.
19
- * You probably don't want to use this view directly since it is bound to the
20
- * side panel. Instead, you might want to use {@link EntityForm} or {@link EntityCollectionView}
21
- */
22
- export declare function EntityView<M extends Record<string, any>, UserType extends User>({ path, entityId, selectedSubPath, copy, collection, parentCollectionIds, onValuesAreModified, formWidth, onUpdate, onClose }: EntityViewProps<M>): import("react/jsx-runtime").JSX.Element;
@@ -1,2 +0,0 @@
1
- import { CustomizationController } from "../types/customization_controller";
2
- export declare function useBuildCustomizationController(controller: CustomizationController): CustomizationController;
@@ -1 +0,0 @@
1
- export declare function useLocaleConfig(locale?: string): void;
@@ -1,26 +0,0 @@
1
- import { FirebaseApp } from "firebase/app";
2
- /**
3
- * @group Firebase
4
- */
5
- export interface AppCheck {
6
- firebaseApp?: FirebaseApp;
7
- }
8
- /**
9
- * @group Firebase
10
- */
11
- export interface AppCheckOptions {
12
- providerKey: string;
13
- useEnterpriseRecaptcha: boolean;
14
- isTokenAutoRefreshEnabled?: boolean;
15
- debugToken?: string;
16
- forceRefresh?: boolean;
17
- }
18
- /**
19
- * @group Firebase
20
- */
21
- export declare interface AppCheckTokenResult {
22
- /**
23
- * The token string in JWT format.
24
- */
25
- readonly token: string;
26
- }
@@ -1,157 +0,0 @@
1
- import React from "react";
2
-
3
- import { Link as ReactLink } from "react-router-dom";
4
- import { ErrorBoundary } from "../components";
5
- import {
6
- Avatar,
7
- cn,
8
- DarkModeIcon,
9
- IconButton,
10
- LightModeIcon,
11
- LogoutIcon,
12
- Menu,
13
- MenuItem,
14
- Skeleton,
15
- Typography
16
- } from "@firecms/ui";
17
- import { useAuthController, useLargeLayout, useModeController, useNavigationController } from "../hooks";
18
- import { User } from "../types";
19
-
20
- export type FireCMSAppBarProps<ADDITIONAL_PROPS = object> = {
21
- title: string;
22
- /**
23
- * A component that gets rendered on the upper side of the main toolbar
24
- */
25
- endAdornment?: React.ReactNode;
26
-
27
- startAdornment?: React.ReactNode;
28
-
29
- dropDownActions?: React.ReactNode;
30
-
31
- includeDrawer?: boolean;
32
-
33
- drawerOpen: boolean;
34
-
35
- className?: string;
36
-
37
- style?: React.CSSProperties;
38
-
39
- user?: User;
40
- } & ADDITIONAL_PROPS;
41
-
42
- /**
43
- * This component renders the main app bar of FireCMS.
44
- * You will likely not need to use this component directly.
45
- *
46
- * @param title
47
- * @param toolbarExtraWidget
48
- * @param drawerOpen
49
- * @constructor
50
- */
51
- export const FireCMSAppBar = function FireCMSAppBar({
52
- title,
53
- endAdornment,
54
- startAdornment,
55
- drawerOpen,
56
- dropDownActions,
57
- includeDrawer,
58
- className,
59
- style,
60
- user: userProp
61
- }: FireCMSAppBarProps) {
62
- const navigation = useNavigationController();
63
-
64
- const authController = useAuthController();
65
- const {
66
- mode,
67
- toggleMode
68
- } = useModeController();
69
-
70
- const largeLayout = useLargeLayout();
71
-
72
- const user = userProp ?? authController.user;
73
-
74
- let avatarComponent: JSX.Element;
75
- if (user && user.photoURL) {
76
- avatarComponent = <Avatar
77
- src={user.photoURL}/>;
78
- } else if (user === undefined || authController.initialLoading) {
79
- avatarComponent = <div className={"p-1 flex justify-center"}>
80
- <Skeleton className={"w-10 h-10 rounded-full"}/>
81
- </div>;
82
- } else {
83
- const initial = user?.displayName
84
- ? user.displayName[0].toUpperCase()
85
- : (user?.email ? user.email[0].toUpperCase() : "A");
86
- avatarComponent = <Avatar>{initial}</Avatar>;
87
- }
88
-
89
- return (
90
- <div
91
- style={style}
92
- className={cn("pr-2",
93
- {
94
- "ml-[17rem]": drawerOpen && largeLayout,
95
- "ml-16": includeDrawer && !(drawerOpen && largeLayout) && !startAdornment,
96
- "h-16": true,
97
- "z-10": largeLayout,
98
- "transition-all": true,
99
- "ease-in": true,
100
- "duration-75": true,
101
- "w-full": !includeDrawer,
102
- "w-[calc(100%-64px)]": includeDrawer && !(drawerOpen && largeLayout),
103
- "w-[calc(100%-17rem)]": includeDrawer && (drawerOpen && largeLayout),
104
- "duration-150": drawerOpen && largeLayout,
105
- fixed: true,
106
- },
107
- className)}>
108
-
109
- <div className="flex flex-row gap-2 px-4 h-full items-center">
110
-
111
- {startAdornment}
112
-
113
- {navigation && <div className="mr-8 hidden lg:block">
114
- <ReactLink
115
- className="visited:text-inherit visited:dark:text-inherit"
116
- to={navigation?.basePath ?? "/"}
117
- >
118
- <Typography variant="subtitle1"
119
- noWrap
120
- className={"ml-2 !font-medium"}>
121
- {title}
122
- </Typography>
123
- </ReactLink>
124
- </div>}
125
-
126
- <div className={"flex-grow"}/>
127
-
128
- {endAdornment &&
129
- <ErrorBoundary>
130
- {endAdornment}
131
- </ErrorBoundary>}
132
-
133
- <IconButton
134
- color="inherit"
135
- aria-label="Open drawer"
136
- onClick={toggleMode}
137
- size="large">
138
- {mode === "dark"
139
- ? <DarkModeIcon/>
140
- : <LightModeIcon/>}
141
- </IconButton>
142
-
143
- <Menu trigger={avatarComponent}>
144
-
145
- {dropDownActions}
146
-
147
- {!dropDownActions && <MenuItem onClick={authController.signOut}>
148
- <LogoutIcon/>
149
- Log Out
150
- </MenuItem>}
151
-
152
- </Menu>
153
-
154
- </div>
155
- </div>
156
- );
157
- }