@firecms/core 3.0.0-canary.12 → 3.0.0-canary.120

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 (286) hide show
  1. package/README.md +1 -1
  2. package/dist/app/AppBar.d.ts +12 -0
  3. package/dist/app/Drawer.d.ts +17 -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 +2 -1
  8. package/dist/components/CircularProgressCenter.d.ts +1 -1
  9. package/dist/components/ClearFilterSortButton.d.ts +5 -0
  10. package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +11 -12
  11. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +1 -1
  12. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +5 -3
  13. package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +1 -0
  14. package/dist/components/EntityCollectionTable/column_utils.d.ts +1 -2
  15. package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +3 -1
  16. package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +1 -4
  17. package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +2 -2
  18. package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +2 -2
  19. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +12 -2
  20. package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
  21. package/dist/components/EntityPreview.d.ts +6 -5
  22. package/dist/components/ErrorView.d.ts +1 -1
  23. package/dist/components/HomePage/DefaultHomePage.d.ts +1 -1
  24. package/dist/components/HomePage/NavigationCardBinding.d.ts +1 -1
  25. package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
  26. package/dist/components/ReferenceWidget.d.ts +3 -1
  27. package/dist/components/SelectableTable/SelectableTable.d.ts +1 -1
  28. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
  29. package/dist/components/VirtualTable/VirtualTableProps.d.ts +15 -12
  30. package/dist/components/VirtualTable/types.d.ts +3 -3
  31. package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -1
  32. package/dist/components/common/index.d.ts +1 -0
  33. package/dist/components/common/table_height.d.ts +5 -0
  34. package/dist/components/common/types.d.ts +4 -6
  35. package/dist/components/common/useColumnsIds.d.ts +2 -1
  36. package/dist/components/common/useDataSourceEntityCollectionTableController.d.ts +3 -0
  37. package/dist/components/index.d.ts +3 -1
  38. package/dist/{components/FireCMSAppBar.d.ts → core/DefaultAppBar.d.ts} +6 -9
  39. package/dist/core/DefaultDrawer.d.ts +19 -0
  40. package/dist/core/DrawerNavigationItem.d.ts +10 -0
  41. package/dist/core/EntityEditView.d.ts +18 -4
  42. package/dist/core/FireCMS.d.ts +1 -1
  43. package/dist/core/NavigationRoutes.d.ts +3 -3
  44. package/dist/core/index.d.ts +3 -4
  45. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  46. package/dist/form/components/ErrorFocus.d.ts +1 -1
  47. package/dist/form/components/FieldHelperText.d.ts +3 -3
  48. package/dist/form/components/FormikArrayContainer.d.ts +2 -1
  49. package/dist/form/components/LabelWithIcon.d.ts +1 -1
  50. package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
  51. package/dist/form/components/StorageItemPreview.d.ts +4 -4
  52. package/dist/form/components/index.d.ts +1 -0
  53. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
  54. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
  55. package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
  56. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
  57. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  58. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
  59. package/dist/form/field_bindings/MultiSelectBinding.d.ts +1 -1
  60. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
  61. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
  62. package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
  63. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +3 -5
  64. package/dist/form/field_bindings/TextFieldBinding.d.ts +1 -1
  65. package/dist/form/index.d.ts +2 -4
  66. package/dist/form/useClearRestoreValue.d.ts +2 -2
  67. package/dist/hooks/data/save.d.ts +1 -2
  68. package/dist/hooks/index.d.ts +1 -0
  69. package/dist/hooks/useBuildNavigationController.d.ts +1 -2
  70. package/dist/hooks/useProjectLog.d.ts +2 -2
  71. package/dist/hooks/useValidateAuthenticator.d.ts +4 -8
  72. package/dist/index.d.ts +1 -0
  73. package/dist/index.es.js +15742 -12458
  74. package/dist/index.es.js.map +1 -1
  75. package/dist/index.umd.js +19965 -587
  76. package/dist/index.umd.js.map +1 -1
  77. package/dist/internal/useBuildDataSource.d.ts +1 -16
  78. package/dist/preview/PropertyPreviewProps.d.ts +6 -1
  79. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  80. package/dist/preview/components/ReferencePreview.d.ts +3 -2
  81. package/dist/preview/components/StorageThumbnail.d.ts +2 -1
  82. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  83. package/dist/types/auth.d.ts +3 -3
  84. package/dist/types/collections.d.ts +39 -5
  85. package/dist/types/datasource.d.ts +55 -35
  86. package/dist/types/entities.d.ts +6 -1
  87. package/dist/types/entity_actions.d.ts +14 -0
  88. package/dist/types/entity_overrides.d.ts +2 -2
  89. package/dist/types/fields.d.ts +47 -41
  90. package/dist/types/index.d.ts +0 -1
  91. package/dist/types/navigation.d.ts +6 -5
  92. package/dist/types/plugins.d.ts +14 -4
  93. package/dist/types/properties.d.ts +34 -21
  94. package/dist/types/side_dialogs_controller.d.ts +10 -0
  95. package/dist/types/storage.d.ts +11 -3
  96. package/dist/util/entities.d.ts +2 -2
  97. package/dist/util/icon_list.d.ts +5 -1
  98. package/dist/util/icon_synonyms.d.ts +1 -97
  99. package/dist/util/icons.d.ts +3 -2
  100. package/dist/util/index.d.ts +1 -0
  101. package/dist/util/navigation_utils.d.ts +2 -2
  102. package/dist/util/objects.d.ts +1 -1
  103. package/dist/util/plurals.d.ts +0 -2
  104. package/dist/util/property_utils.d.ts +1 -1
  105. package/dist/util/resolutions.d.ts +27 -13
  106. package/dist/util/storage.d.ts +23 -2
  107. package/dist/util/useStorageUploadController.d.ts +3 -3
  108. package/package.json +128 -119
  109. package/src/app/AppBar.tsx +18 -0
  110. package/src/app/Drawer.tsx +25 -0
  111. package/src/app/Scaffold.tsx +245 -0
  112. package/src/app/index.ts +4 -0
  113. package/src/app/useApp.tsx +32 -0
  114. package/src/components/ArrayContainer.tsx +15 -10
  115. package/src/components/CircularProgressCenter.tsx +1 -1
  116. package/src/components/ClearFilterSortButton.tsx +41 -0
  117. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +12 -19
  118. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +21 -20
  119. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +10 -6
  120. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +41 -35
  121. package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
  122. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +32 -17
  123. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +14 -6
  124. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +29 -34
  125. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +17 -13
  126. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +19 -7
  127. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +7 -10
  128. package/src/components/EntityCollectionView/EntityCollectionView.tsx +75 -51
  129. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
  130. package/src/components/EntityCollectionView/useSelectionController.tsx +19 -7
  131. package/src/components/EntityPreview.tsx +38 -34
  132. package/src/components/EntityView.tsx +5 -5
  133. package/src/components/ErrorView.tsx +1 -1
  134. package/src/components/HomePage/DefaultHomePage.tsx +26 -19
  135. package/src/components/HomePage/NavigationCard.tsx +3 -3
  136. package/src/components/HomePage/NavigationCardBinding.tsx +1 -1
  137. package/src/components/HomePage/SmallNavigationCard.tsx +5 -6
  138. package/src/components/PropertyIdCopyTooltip.tsx +48 -0
  139. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +8 -6
  140. package/src/components/ReferenceWidget.tsx +22 -12
  141. package/src/components/SearchIconsView.tsx +11 -7
  142. package/src/components/SelectableTable/SelectableTable.tsx +7 -7
  143. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
  144. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +22 -7
  145. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +28 -6
  146. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +35 -15
  147. package/src/components/VirtualTable/VirtualTable.tsx +70 -37
  148. package/src/components/VirtualTable/VirtualTableCell.tsx +1 -1
  149. package/src/components/VirtualTable/VirtualTableHeader.tsx +4 -4
  150. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
  151. package/src/components/VirtualTable/VirtualTableProps.tsx +18 -14
  152. package/src/components/VirtualTable/VirtualTableRow.tsx +4 -5
  153. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +4 -4
  154. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +2 -1
  155. package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
  156. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +0 -2
  157. package/src/components/VirtualTable/types.tsx +2 -3
  158. package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +2 -2
  159. package/src/components/common/index.ts +1 -0
  160. package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
  161. package/src/components/common/types.tsx +4 -6
  162. package/src/components/common/useColumnsIds.tsx +23 -2
  163. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +11 -0
  164. package/src/components/common/useTableSearchHelper.ts +53 -12
  165. package/src/components/index.tsx +3 -1
  166. package/src/contexts/DialogsProvider.tsx +2 -2
  167. package/src/{components/FireCMSAppBar.tsx → core/DefaultAppBar.tsx} +52 -37
  168. package/src/core/DefaultDrawer.tsx +179 -0
  169. package/src/core/DrawerNavigationItem.tsx +66 -0
  170. package/src/core/EntityEditView.tsx +716 -149
  171. package/src/core/EntitySidePanel.tsx +1 -2
  172. package/src/core/FireCMS.tsx +39 -44
  173. package/src/core/NavigationRoutes.tsx +7 -8
  174. package/src/core/SideDialogs.tsx +2 -0
  175. package/src/core/field_configs.tsx +4 -5
  176. package/src/core/index.tsx +3 -4
  177. package/src/form/PropertyFieldBinding.tsx +53 -21
  178. package/src/form/components/CustomIdField.tsx +4 -2
  179. package/src/form/components/FieldHelperText.tsx +4 -4
  180. package/src/form/components/FormikArrayContainer.tsx +4 -1
  181. package/src/form/components/LabelWithIcon.tsx +27 -19
  182. package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
  183. package/src/form/components/StorageItemPreview.tsx +21 -11
  184. package/src/form/components/StorageUploadProgress.tsx +3 -4
  185. package/src/form/components/index.tsx +1 -0
  186. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +26 -15
  187. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +29 -24
  188. package/src/form/field_bindings/BlockFieldBinding.tsx +14 -12
  189. package/src/form/field_bindings/DateTimeFieldBinding.tsx +17 -14
  190. package/src/form/field_bindings/KeyValueFieldBinding.tsx +52 -46
  191. package/src/form/field_bindings/MapFieldBinding.tsx +17 -17
  192. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +150 -0
  193. package/src/form/field_bindings/MultiSelectBinding.tsx +9 -5
  194. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +11 -16
  195. package/src/form/field_bindings/ReferenceFieldBinding.tsx +41 -30
  196. package/src/form/field_bindings/RepeatFieldBinding.tsx +32 -19
  197. package/src/form/field_bindings/SelectFieldBinding.tsx +20 -13
  198. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +36 -46
  199. package/src/form/field_bindings/SwitchFieldBinding.tsx +9 -5
  200. package/src/form/field_bindings/TextFieldBinding.tsx +26 -23
  201. package/src/form/index.tsx +2 -7
  202. package/src/form/useClearRestoreValue.tsx +2 -2
  203. package/src/form/validation.ts +1 -17
  204. package/src/hooks/data/delete.ts +2 -1
  205. package/src/hooks/data/save.ts +6 -1
  206. package/src/hooks/data/useDataSource.tsx +11 -3
  207. package/src/hooks/index.tsx +1 -0
  208. package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
  209. package/src/hooks/useBuildModeController.tsx +11 -5
  210. package/src/hooks/useBuildNavigationController.tsx +91 -31
  211. package/src/hooks/useProjectLog.tsx +19 -8
  212. package/src/hooks/useResolvedNavigationFrom.tsx +1 -1
  213. package/src/hooks/useValidateAuthenticator.tsx +21 -41
  214. package/src/index.ts +1 -0
  215. package/src/internal/useBuildDataSource.ts +77 -81
  216. package/src/internal/useBuildSideDialogsController.tsx +1 -0
  217. package/src/internal/useBuildSideEntityController.tsx +102 -22
  218. package/src/internal/useUnsavedChangesDialog.tsx +3 -1
  219. package/src/preview/PropertyPreview.tsx +10 -17
  220. package/src/preview/PropertyPreviewProps.tsx +7 -1
  221. package/src/preview/components/BooleanPreview.tsx +2 -2
  222. package/src/preview/components/EnumValuesChip.tsx +2 -2
  223. package/src/preview/components/ImagePreview.tsx +24 -34
  224. package/src/preview/components/ReferencePreview.tsx +23 -34
  225. package/src/preview/components/StorageThumbnail.tsx +5 -1
  226. package/src/preview/components/UrlComponentPreview.tsx +44 -11
  227. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +1 -2
  228. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +3 -2
  229. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +1 -2
  230. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +0 -1
  231. package/src/preview/property_previews/ArrayOneOfPreview.tsx +3 -4
  232. package/src/preview/property_previews/ArrayPropertyPreview.tsx +3 -4
  233. package/src/preview/property_previews/MapPropertyPreview.tsx +6 -6
  234. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +2 -2
  235. package/src/preview/property_previews/StringPropertyPreview.tsx +3 -3
  236. package/src/preview/util.ts +2 -2
  237. package/src/types/auth.tsx +3 -3
  238. package/src/types/collections.ts +48 -7
  239. package/src/types/customization_controller.tsx +0 -1
  240. package/src/types/datasource.ts +65 -43
  241. package/src/types/entities.ts +11 -1
  242. package/src/types/entity_actions.tsx +16 -3
  243. package/src/types/entity_overrides.tsx +2 -2
  244. package/src/types/fields.tsx +51 -45
  245. package/src/types/index.ts +0 -1
  246. package/src/types/navigation.ts +7 -7
  247. package/src/types/plugins.tsx +16 -6
  248. package/src/types/properties.ts +39 -22
  249. package/src/types/side_dialogs_controller.tsx +13 -0
  250. package/src/types/storage.ts +12 -3
  251. package/src/util/entities.ts +6 -5
  252. package/src/util/enums.ts +1 -1
  253. package/src/util/icon_list.ts +15 -10
  254. package/src/util/icon_synonyms.ts +3 -99
  255. package/src/util/icons.tsx +8 -2
  256. package/src/util/index.ts +1 -0
  257. package/src/util/navigation_utils.ts +6 -6
  258. package/src/util/objects.ts +25 -28
  259. package/src/util/permissions.ts +1 -0
  260. package/src/util/plurals.ts +0 -2
  261. package/src/util/property_utils.tsx +1 -1
  262. package/src/util/references.ts +3 -0
  263. package/src/util/resolutions.ts +74 -41
  264. package/src/util/storage.ts +79 -21
  265. package/src/util/strings.ts +2 -2
  266. package/src/util/useStorageUploadController.tsx +33 -7
  267. package/src/util/useTraceUpdate.tsx +1 -0
  268. package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
  269. package/dist/components/VirtualTable/common.d.ts +0 -2
  270. package/dist/core/Drawer.d.ts +0 -23
  271. package/dist/core/Scaffold.d.ts +0 -55
  272. package/dist/core/SideEntityView.d.ts +0 -7
  273. package/dist/form/EntityForm.d.ts +0 -77
  274. package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
  275. package/dist/internal/useBuildCustomizationController.d.ts +0 -2
  276. package/dist/internal/useLocaleConfig.d.ts +0 -1
  277. package/dist/types/appcheck.d.ts +0 -26
  278. package/src/components/PropertyIdCopyTooltipContent.tsx +0 -28
  279. package/src/core/Drawer.tsx +0 -191
  280. package/src/core/Scaffold.tsx +0 -281
  281. package/src/core/SideEntityView.tsx +0 -38
  282. package/src/form/EntityForm.tsx +0 -728
  283. package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -695
  284. package/src/internal/useBuildCustomizationController.tsx +0 -5
  285. package/src/internal/useLocaleConfig.tsx +0 -18
  286. package/src/types/appcheck.ts +0 -29
@@ -1,10 +1,10 @@
1
1
  import React from "react";
2
2
 
3
- import { Link as ReactLink } from "react-router-dom";
4
- import { ErrorBoundary } from "../components";
3
+ import { Link as ReactLink, useNavigate } from "react-router-dom";
4
+ import { ErrorBoundary, FireCMSLogo } from "../components";
5
5
  import {
6
6
  Avatar,
7
- cn,
7
+ cls,
8
8
  DarkModeIcon,
9
9
  IconButton,
10
10
  LightModeIcon,
@@ -16,9 +16,11 @@ import {
16
16
  } from "@firecms/ui";
17
17
  import { useAuthController, useLargeLayout, useModeController, useNavigationController } from "../hooks";
18
18
  import { User } from "../types";
19
+ import { useApp } from "../app/useApp";
19
20
 
20
- export type FireCMSAppBarProps<ADDITIONAL_PROPS = object> = {
21
- title: string;
21
+ export type DefaultAppBarProps<ADDITIONAL_PROPS = object> = {
22
+
23
+ title?: React.ReactNode;
22
24
  /**
23
25
  * A component that gets rendered on the upper side of the main toolbar
24
26
  */
@@ -28,14 +30,14 @@ export type FireCMSAppBarProps<ADDITIONAL_PROPS = object> = {
28
30
 
29
31
  dropDownActions?: React.ReactNode;
30
32
 
31
- includeDrawer?: boolean;
32
-
33
- drawerOpen: boolean;
33
+ includeModeToggle?: boolean;
34
34
 
35
35
  className?: string;
36
36
 
37
37
  style?: React.CSSProperties;
38
38
 
39
+ logo?: string;
40
+
39
41
  user?: User;
40
42
  } & ADDITIONAL_PROPS;
41
43
 
@@ -43,22 +45,24 @@ export type FireCMSAppBarProps<ADDITIONAL_PROPS = object> = {
43
45
  * This component renders the main app bar of FireCMS.
44
46
  * You will likely not need to use this component directly.
45
47
  *
46
- * @param title
47
- * @param toolbarExtraWidget
48
- * @param drawerOpen
49
- * @constructor
48
+
50
49
  */
51
- export const FireCMSAppBar = function FireCMSAppBar({
50
+ export const DefaultAppBar = function DefaultAppBar({
52
51
  title,
53
52
  endAdornment,
54
53
  startAdornment,
55
- drawerOpen,
56
54
  dropDownActions,
57
- includeDrawer,
55
+ includeModeToggle = true,
58
56
  className,
59
57
  style,
60
58
  user: userProp
61
- }: FireCMSAppBarProps) {
59
+ }: DefaultAppBarProps) {
60
+
61
+ const {
62
+ hasDrawer,
63
+ drawerOpen,
64
+ logo
65
+ } = useApp();
62
66
  const navigation = useNavigationController();
63
67
 
64
68
  const authController = useAuthController();
@@ -67,6 +71,8 @@ export const FireCMSAppBar = function FireCMSAppBar({
67
71
  toggleMode
68
72
  } = useModeController();
69
73
 
74
+ const navigate = useNavigate();
75
+
70
76
  const largeLayout = useLargeLayout();
71
77
 
72
78
  const user = userProp ?? authController.user;
@@ -89,40 +95,45 @@ export const FireCMSAppBar = function FireCMSAppBar({
89
95
  return (
90
96
  <div
91
97
  style={style}
92
- className={cn("pr-2",
98
+ className={cls("w-full h-16 transition-all ease-in duration-75 fixed",
93
99
  {
94
- "ml-[17rem]": drawerOpen && largeLayout,
95
- "ml-16": includeDrawer && !(drawerOpen && largeLayout) && !startAdornment,
96
- "h-16": true,
100
+ "pl-[17rem]": drawerOpen && largeLayout,
101
+ "pl-20": hasDrawer && !(drawerOpen && largeLayout),
97
102
  "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),
103
+ // "w-full": !hasDrawer,
104
+ // "w-[calc(100%-64px)]": hasDrawer && !(drawerOpen && largeLayout),
105
+ // "w-[calc(100%-17rem)]": hasDrawer && (drawerOpen && largeLayout),
104
106
  "duration-150": drawerOpen && largeLayout,
105
- fixed: true,
106
107
  },
107
108
  className)}>
108
109
 
109
110
  <div className="flex flex-row gap-2 px-4 h-full items-center">
110
111
 
111
- {startAdornment}
112
-
113
112
  {navigation && <div className="mr-8 hidden lg:block">
114
113
  <ReactLink
115
114
  className="visited:text-inherit visited:dark:text-inherit"
116
115
  to={navigation?.basePath ?? "/"}
117
116
  >
118
- <Typography variant="subtitle1"
119
- noWrap
120
- className={"ml-2 !font-medium"}>
121
- {title}
122
- </Typography>
117
+ <div className={"flex flex-row gap-4"}>
118
+ {!hasDrawer && (logo
119
+ ? <img src={logo}
120
+ alt="Logo"
121
+ className={cls("w-[32px] h-[32px] object-contain")}/>
122
+ : <FireCMSLogo width={"32px"} height={"32px"}/>)}
123
+
124
+ {typeof title === "string"
125
+ ? <Typography variant="subtitle1"
126
+ noWrap
127
+ className={cls("transition-all", drawerOpen ? "ml-2" : "")}>
128
+ {title}
129
+ </Typography>
130
+ : title}
131
+ </div>
123
132
  </ReactLink>
124
133
  </div>}
125
134
 
135
+ {startAdornment}
136
+
126
137
  <div className={"flex-grow"}/>
127
138
 
128
139
  {endAdornment &&
@@ -130,7 +141,7 @@ export const FireCMSAppBar = function FireCMSAppBar({
130
141
  {endAdornment}
131
142
  </ErrorBoundary>}
132
143
 
133
- <IconButton
144
+ {includeModeToggle && <IconButton
134
145
  color="inherit"
135
146
  aria-label="Open drawer"
136
147
  onClick={toggleMode}
@@ -138,7 +149,7 @@ export const FireCMSAppBar = function FireCMSAppBar({
138
149
  {mode === "dark"
139
150
  ? <DarkModeIcon/>
140
151
  : <LightModeIcon/>}
141
- </IconButton>
152
+ </IconButton>}
142
153
 
143
154
  <Menu trigger={avatarComponent}>
144
155
  {user && <div className={"px-4 py-2 mb-2"}>
@@ -152,7 +163,11 @@ export const FireCMSAppBar = function FireCMSAppBar({
152
163
 
153
164
  {dropDownActions}
154
165
 
155
- {!dropDownActions && <MenuItem onClick={authController.signOut}>
166
+ {!dropDownActions && <MenuItem onClick={async () => {
167
+ await authController.signOut();
168
+ // replace current route with home
169
+ navigate("/");
170
+ }}>
156
171
  <LogoutIcon/>
157
172
  Log Out
158
173
  </MenuItem>}
@@ -0,0 +1,179 @@
1
+ import React, { useCallback } from "react";
2
+
3
+ import { useLargeLayout, useNavigationController } from "../hooks";
4
+
5
+ import { Link, useNavigate } from "react-router-dom";
6
+ import { CMSAnalyticsEvent, TopNavigationEntry, TopNavigationResult } from "../types";
7
+ import { IconForView } from "../util";
8
+ import { cls, IconButton, Menu, MenuItem, MoreVertIcon, Tooltip, Typography } from "@firecms/ui";
9
+ import { useAnalyticsController } from "../hooks/useAnalyticsController";
10
+ import { DrawerNavigationItem } from "./DrawerNavigationItem";
11
+ import { FireCMSLogo } from "../components";
12
+ import { useApp } from "../app/useApp";
13
+
14
+ /**
15
+ * Default drawer used in the CMS
16
+ * @group Core
17
+ */
18
+ export function DefaultDrawer({
19
+ className,
20
+ style,
21
+ }: {
22
+ className?: string
23
+ style?: React.CSSProperties,
24
+ }) {
25
+
26
+ const {
27
+ drawerHovered,
28
+ drawerOpen,
29
+ closeDrawer,
30
+ logo
31
+ } = useApp();
32
+
33
+ const [adminMenuOpen, setAdminMenuOpen] = React.useState(false);
34
+
35
+ const analyticsController = useAnalyticsController();
36
+ const navigation = useNavigationController();
37
+
38
+ const tooltipsOpen = drawerHovered && !drawerOpen && !adminMenuOpen;
39
+ const largeLayout = useLargeLayout();
40
+ const navigate = useNavigate();
41
+
42
+ if (!navigation.topLevelNavigation)
43
+ throw Error("Navigation not ready in Drawer");
44
+
45
+ const {
46
+ navigationEntries,
47
+ groups
48
+ }: TopNavigationResult = navigation.topLevelNavigation;
49
+
50
+ const adminViews = navigationEntries.filter(e => e.type === "admin") ?? [];
51
+ const groupsWithoutAdmin = groups.filter(g => g !== "Admin");
52
+
53
+ const buildGroupHeader = useCallback((group?: string) => {
54
+ if (!drawerOpen) return <div className="h-12 w-full"/>;
55
+ return <div
56
+ className="pt-8 pl-6 pr-8 pb-2 flex flex-row items-center">
57
+ <Typography variant={"caption"}
58
+ color={"secondary"}
59
+ className="font-medium flex-grow line-clamp-1">
60
+ {group ? group.toUpperCase() : "Views".toUpperCase()}
61
+ </Typography>
62
+
63
+ </div>;
64
+ }, [drawerOpen]);
65
+
66
+ const onClick = (view: TopNavigationEntry) => {
67
+ const eventName: CMSAnalyticsEvent = view.type === "collection"
68
+ ? "drawer_navigate_to_collection"
69
+ : (view.type === "view" ? "drawer_navigate_to_view" : "unmapped_event");
70
+ analyticsController.onAnalyticsEvent?.(eventName, { url: view.url });
71
+ if (!largeLayout)
72
+ closeDrawer();
73
+ };
74
+
75
+ return (
76
+ <>
77
+ <div className={cls("flex flex-col h-full relative flex-grow w-full", className)} style={style}>
78
+
79
+ <DrawerLogo logo={logo}/>
80
+
81
+ <div className={"flex-grow overflow-scroll no-scrollbar"}>
82
+
83
+ {groupsWithoutAdmin.map((group) => (
84
+ <React.Fragment
85
+ key={`drawer_group_${group}`}>
86
+ {buildGroupHeader(group)}
87
+ {Object.values(navigationEntries)
88
+ .filter(e => e.group === group)
89
+ .map((view, index) =>
90
+ <DrawerNavigationItem
91
+ key={`navigation_${index}`}
92
+ icon={<IconForView collectionOrView={view.collection ?? view.view}/>}
93
+ tooltipsOpen={tooltipsOpen}
94
+ adminMenuOpen={adminMenuOpen}
95
+ drawerOpen={drawerOpen}
96
+ onClick={() => onClick(view)}
97
+ url={view.url}
98
+ name={view.name}/>)}
99
+ </React.Fragment>
100
+ ))}
101
+
102
+ </div>
103
+
104
+ {adminViews.length > 0 && <Menu
105
+ side={"right"}
106
+ open={adminMenuOpen}
107
+ onOpenChange={setAdminMenuOpen}
108
+ trigger={
109
+ <IconButton
110
+ shape={"square"}
111
+ className={"m-4 text-gray-900 dark:text-white w-fit"}>
112
+ <Tooltip title={"Admin"}
113
+ open={tooltipsOpen}
114
+ side={"right"} sideOffset={28}>
115
+ <MoreVertIcon/>
116
+ </Tooltip>
117
+ {drawerOpen && <div
118
+ className={cls(
119
+ drawerOpen ? "opacity-100" : "opacity-0 hidden",
120
+ "mx-4 font-inherit text-inherit"
121
+ )}>
122
+ ADMIN
123
+ </div>}
124
+ </IconButton>}
125
+ >
126
+ {adminViews.map((entry, index) =>
127
+ <MenuItem
128
+ onClick={(event) => {
129
+ event.preventDefault();
130
+ navigate(entry.path);
131
+ }}
132
+ key={`navigation_${index}`}>
133
+ {<IconForView collectionOrView={entry.view}/>}
134
+ {entry.name}
135
+ </MenuItem>)}
136
+
137
+ </Menu>}
138
+ </div>
139
+
140
+ </>
141
+ );
142
+ }
143
+
144
+ /**
145
+ * This is the logo displayed in the drawer
146
+ * It expands when the drawer is open.
147
+ *
148
+ * @param logo
149
+
150
+ */
151
+ export function DrawerLogo({ logo }: {
152
+ logo?: string;
153
+ }) {
154
+
155
+ const navigation = useNavigationController();
156
+ const { drawerOpen } = useApp();
157
+ return <div
158
+ style={{
159
+ transition: "padding 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms",
160
+ padding: drawerOpen ? "32px 144px 0px 24px" : "72px 16px 0px"
161
+ }}
162
+ className={cls("cursor-pointer")}>
163
+
164
+ <Tooltip title={"Home"}
165
+ sideOffset={20}
166
+ side="right">
167
+ <Link
168
+ to={navigation.basePath}>
169
+ {logo
170
+ ? <img src={logo}
171
+ alt="Logo"
172
+ className={cls("max-w-full max-h-full",
173
+ drawerOpen ?? "w-[112px] h-[112px]")}/>
174
+ : <FireCMSLogo/>}
175
+
176
+ </Link>
177
+ </Tooltip>
178
+ </div>;
179
+ }
@@ -0,0 +1,66 @@
1
+ import React from "react";
2
+
3
+ import { NavLink } from "react-router-dom";
4
+ import { cls, Tooltip } from "@firecms/ui";
5
+
6
+ export function DrawerNavigationItem({
7
+ name,
8
+ icon,
9
+ drawerOpen,
10
+ adminMenuOpen,
11
+ tooltipsOpen,
12
+ url,
13
+ onClick
14
+ }: {
15
+ icon: React.ReactElement,
16
+ name: string,
17
+ tooltipsOpen: boolean,
18
+ drawerOpen: boolean,
19
+ adminMenuOpen?: boolean,
20
+ url: string,
21
+ onClick?: () => void,
22
+ }) {
23
+
24
+ const iconWrap = <div
25
+ className={"text-gray-600 dark:text-gray-500"}>
26
+ {icon}
27
+ </div>;
28
+
29
+ const listItem = <div>
30
+ <NavLink
31
+ onClick={onClick}
32
+ style={{
33
+ width: !drawerOpen ? "72px" : "280px",
34
+ transition: drawerOpen ? "width 150ms ease-in" : undefined
35
+ }}
36
+ className={({ isActive }: any) => cls("rounded-r-lg truncate",
37
+ "hover:bg-slate-300 hover:bg-opacity-75 dark:hover:bg-gray-700 dark:hover:bg-opacity-75 text-gray-800 dark:text-gray-200 hover:text-gray-900 hover:dark:text-white",
38
+ "flex flex-row items-center mr-8",
39
+ // "transition-all ease-in-out delay-100 duration-300",
40
+ // drawerOpen ? "w-full" : "w-18",
41
+ drawerOpen ? "pl-8 h-12" : "pl-6 h-11",
42
+ "font-medium text-sm",
43
+ isActive ? "bg-slate-200 bg-opacity-60 dark:bg-gray-800 dark:bg-opacity-30" : ""
44
+ )}
45
+ to={url}
46
+ >
47
+
48
+ {iconWrap}
49
+
50
+ <div
51
+ className={cls(
52
+ drawerOpen ? "opacity-100" : "opacity-0 hidden",
53
+ "ml-4 font-inherit text-inherit"
54
+ )}>
55
+ {name.toUpperCase()}
56
+ </div>
57
+ </NavLink>
58
+ </div>;
59
+
60
+ return <Tooltip
61
+ open={drawerOpen || adminMenuOpen ? false : tooltipsOpen}
62
+ side="right"
63
+ title={name}>
64
+ {listItem}
65
+ </Tooltip>;
66
+ }