@firecms/core 3.0.0-canary.9 → 3.0.0-canary.90

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 (246) 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/CircularProgressCenter.d.ts +1 -1
  8. package/dist/components/ClearFilterSortButton.d.ts +5 -0
  9. package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +11 -12
  10. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +1 -1
  11. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +5 -3
  12. package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +1 -0
  13. package/dist/components/EntityCollectionTable/column_utils.d.ts +1 -2
  14. package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +2 -0
  15. package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +1 -4
  16. package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +2 -2
  17. package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +1 -1
  18. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +12 -2
  19. package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
  20. package/dist/components/EntityPreview.d.ts +5 -4
  21. package/dist/components/ErrorView.d.ts +1 -1
  22. package/dist/components/HomePage/DefaultHomePage.d.ts +1 -1
  23. package/dist/components/HomePage/NavigationCardBinding.d.ts +1 -1
  24. package/dist/components/ReferenceWidget.d.ts +3 -1
  25. package/dist/components/SelectableTable/SelectableTable.d.ts +1 -1
  26. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
  27. package/dist/components/VirtualTable/VirtualTableProps.d.ts +15 -12
  28. package/dist/components/VirtualTable/types.d.ts +3 -3
  29. package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -1
  30. package/dist/components/common/index.d.ts +1 -0
  31. package/dist/components/common/table_height.d.ts +5 -0
  32. package/dist/components/common/types.d.ts +4 -6
  33. package/dist/components/common/useDataSourceEntityCollectionTableController.d.ts +3 -0
  34. package/dist/components/index.d.ts +2 -1
  35. package/dist/contexts/AuthControllerContext.d.ts +1 -1
  36. package/dist/{components/FireCMSAppBar.d.ts → core/DefaultAppBar.d.ts} +6 -9
  37. package/dist/core/DefaultDrawer.d.ts +19 -0
  38. package/dist/core/DrawerNavigationItem.d.ts +9 -0
  39. package/dist/core/EntityEditView.d.ts +17 -3
  40. package/dist/core/FireCMS.d.ts +1 -1
  41. package/dist/core/NavigationRoutes.d.ts +3 -3
  42. package/dist/core/index.d.ts +3 -4
  43. package/dist/form/PropertiesForm.d.ts +8 -0
  44. package/dist/form/components/ErrorFocus.d.ts +1 -1
  45. package/dist/form/components/FieldHelperText.d.ts +3 -3
  46. package/dist/form/components/StorageItemPreview.d.ts +4 -4
  47. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  48. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +2 -4
  49. package/dist/form/index.d.ts +0 -2
  50. package/dist/hooks/data/delete.d.ts +2 -2
  51. package/dist/hooks/data/save.d.ts +2 -3
  52. package/dist/hooks/data/useDataSource.d.ts +1 -1
  53. package/dist/hooks/data/useEntityFetch.d.ts +3 -3
  54. package/dist/hooks/index.d.ts +2 -0
  55. package/dist/hooks/useBuildNavigationController.d.ts +1 -2
  56. package/dist/hooks/useProjectLog.d.ts +2 -2
  57. package/dist/hooks/useValidateAuthenticator.d.ts +21 -0
  58. package/dist/index.d.ts +1 -0
  59. package/dist/index.es.js +15552 -11933
  60. package/dist/index.es.js.map +1 -1
  61. package/dist/index.umd.js +19643 -7
  62. package/dist/index.umd.js.map +1 -1
  63. package/dist/internal/useBuildDataSource.d.ts +1 -16
  64. package/dist/internal/useRestoreScroll.d.ts +1 -1
  65. package/dist/preview/PropertyPreviewProps.d.ts +6 -4
  66. package/dist/preview/components/ReferencePreview.d.ts +2 -1
  67. package/dist/preview/components/StorageThumbnail.d.ts +2 -1
  68. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  69. package/dist/types/auth.d.ts +26 -2
  70. package/dist/types/collections.d.ts +31 -7
  71. package/dist/types/datasource.d.ts +34 -20
  72. package/dist/types/entities.d.ts +5 -1
  73. package/dist/types/entity_actions.d.ts +14 -0
  74. package/dist/types/entity_callbacks.d.ts +2 -2
  75. package/dist/types/fields.d.ts +31 -30
  76. package/dist/types/index.d.ts +0 -1
  77. package/dist/types/navigation.d.ts +5 -5
  78. package/dist/types/plugins.d.ts +16 -6
  79. package/dist/types/properties.d.ts +17 -4
  80. package/dist/types/storage.d.ts +11 -3
  81. package/dist/util/collections.d.ts +1 -1
  82. package/dist/util/entities.d.ts +1 -1
  83. package/dist/util/icon_synonyms.d.ts +1 -97
  84. package/dist/util/icons.d.ts +2 -2
  85. package/dist/util/navigation_utils.d.ts +2 -2
  86. package/dist/util/objects.d.ts +1 -1
  87. package/dist/util/plurals.d.ts +0 -2
  88. package/dist/util/resolutions.d.ts +13 -13
  89. package/dist/util/storage.d.ts +23 -2
  90. package/dist/util/useStorageUploadController.d.ts +1 -1
  91. package/dist/util/useTraceUpdate.d.ts +1 -0
  92. package/package.json +130 -119
  93. package/src/app/AppBar.tsx +18 -0
  94. package/src/app/Drawer.tsx +25 -0
  95. package/src/app/Scaffold.tsx +249 -0
  96. package/src/app/index.ts +4 -0
  97. package/src/app/useApp.tsx +32 -0
  98. package/src/components/CircularProgressCenter.tsx +1 -1
  99. package/src/components/ClearFilterSortButton.tsx +41 -0
  100. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +9 -18
  101. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +21 -20
  102. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +10 -6
  103. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +38 -34
  104. package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
  105. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +11 -2
  106. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +14 -6
  107. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +29 -34
  108. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +16 -12
  109. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +4 -5
  110. package/src/components/EntityCollectionView/EntityCollectionView.tsx +69 -45
  111. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
  112. package/src/components/EntityCollectionView/useSelectionController.tsx +19 -7
  113. package/src/components/EntityPreview.tsx +15 -9
  114. package/src/components/EntityView.tsx +5 -5
  115. package/src/components/ErrorView.tsx +1 -1
  116. package/src/components/HomePage/DefaultHomePage.tsx +3 -3
  117. package/src/components/HomePage/NavigationCard.tsx +3 -3
  118. package/src/components/HomePage/NavigationCardBinding.tsx +1 -1
  119. package/src/components/HomePage/SmallNavigationCard.tsx +5 -5
  120. package/src/components/PropertyIdCopyTooltipContent.tsx +2 -3
  121. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +1 -0
  122. package/src/components/ReferenceWidget.tsx +22 -12
  123. package/src/components/SearchIconsView.tsx +5 -5
  124. package/src/components/SelectableTable/SelectableTable.tsx +7 -7
  125. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
  126. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +22 -7
  127. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +28 -6
  128. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +35 -15
  129. package/src/components/VirtualTable/VirtualTable.tsx +70 -37
  130. package/src/components/VirtualTable/VirtualTableCell.tsx +1 -1
  131. package/src/components/VirtualTable/VirtualTableHeader.tsx +4 -4
  132. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
  133. package/src/components/VirtualTable/VirtualTableProps.tsx +18 -14
  134. package/src/components/VirtualTable/VirtualTableRow.tsx +4 -5
  135. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +1 -1
  136. package/src/components/VirtualTable/types.tsx +2 -3
  137. package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +2 -2
  138. package/src/components/common/index.ts +1 -0
  139. package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
  140. package/src/components/common/types.tsx +4 -6
  141. package/src/components/common/useColumnsIds.tsx +10 -2
  142. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +11 -0
  143. package/src/components/common/useTableSearchHelper.ts +52 -12
  144. package/src/components/index.tsx +2 -1
  145. package/src/contexts/AuthControllerContext.tsx +1 -1
  146. package/src/contexts/DialogsProvider.tsx +2 -2
  147. package/src/{components/FireCMSAppBar.tsx → core/DefaultAppBar.tsx} +52 -37
  148. package/src/core/DefaultDrawer.tsx +177 -0
  149. package/src/core/DrawerNavigationItem.tsx +62 -0
  150. package/src/core/EntityEditView.tsx +676 -133
  151. package/src/core/EntitySidePanel.tsx +1 -2
  152. package/src/core/FireCMS.tsx +39 -44
  153. package/src/core/NavigationRoutes.tsx +7 -8
  154. package/src/core/field_configs.tsx +2 -3
  155. package/src/core/index.tsx +3 -4
  156. package/src/form/PropertiesForm.tsx +81 -0
  157. package/src/form/PropertyFieldBinding.tsx +29 -7
  158. package/src/form/components/FieldHelperText.tsx +3 -3
  159. package/src/form/components/StorageItemPreview.tsx +20 -11
  160. package/src/form/components/StorageUploadProgress.tsx +3 -3
  161. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +8 -5
  162. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +8 -5
  163. package/src/form/field_bindings/BlockFieldBinding.tsx +2 -2
  164. package/src/form/field_bindings/KeyValueFieldBinding.tsx +44 -39
  165. package/src/form/field_bindings/MapFieldBinding.tsx +11 -3
  166. package/src/form/field_bindings/MarkdownFieldBinding.tsx +2 -2
  167. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +2 -9
  168. package/src/form/field_bindings/ReferenceFieldBinding.tsx +15 -13
  169. package/src/form/field_bindings/RepeatFieldBinding.tsx +10 -7
  170. package/src/form/field_bindings/SelectFieldBinding.tsx +3 -3
  171. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +22 -43
  172. package/src/form/field_bindings/SwitchFieldBinding.tsx +1 -1
  173. package/src/form/index.tsx +4 -4
  174. package/src/form/validation.ts +1 -17
  175. package/src/hooks/data/delete.ts +3 -3
  176. package/src/hooks/data/save.ts +4 -2
  177. package/src/hooks/data/useDataSource.tsx +2 -2
  178. package/src/hooks/data/useEntityFetch.tsx +3 -3
  179. package/src/hooks/index.tsx +3 -0
  180. package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
  181. package/src/hooks/useBuildModeController.tsx +11 -5
  182. package/src/hooks/useBuildNavigationController.tsx +137 -61
  183. package/src/hooks/useProjectLog.tsx +21 -8
  184. package/src/hooks/useResolvedNavigationFrom.tsx +1 -1
  185. package/src/hooks/useValidateAuthenticator.tsx +115 -0
  186. package/src/index.ts +1 -0
  187. package/src/internal/useBuildDataSource.ts +56 -49
  188. package/src/internal/useBuildSideEntityController.tsx +88 -21
  189. package/src/preview/PropertyPreview.tsx +9 -16
  190. package/src/preview/PropertyPreviewProps.tsx +4 -8
  191. package/src/preview/components/BooleanPreview.tsx +4 -2
  192. package/src/preview/components/EnumValuesChip.tsx +1 -1
  193. package/src/preview/components/ImagePreview.tsx +21 -33
  194. package/src/preview/components/ReferencePreview.tsx +23 -23
  195. package/src/preview/components/StorageThumbnail.tsx +5 -1
  196. package/src/preview/components/UrlComponentPreview.tsx +44 -11
  197. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +0 -1
  198. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +2 -1
  199. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +0 -1
  200. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +0 -1
  201. package/src/preview/property_previews/ArrayOneOfPreview.tsx +2 -3
  202. package/src/preview/property_previews/ArrayPropertyPreview.tsx +2 -3
  203. package/src/preview/property_previews/MapPropertyPreview.tsx +5 -5
  204. package/src/preview/property_previews/StringPropertyPreview.tsx +2 -2
  205. package/src/types/auth.tsx +35 -2
  206. package/src/types/collections.ts +37 -8
  207. package/src/types/customization_controller.tsx +0 -1
  208. package/src/types/datasource.ts +41 -24
  209. package/src/types/entities.ts +9 -1
  210. package/src/types/entity_actions.tsx +16 -3
  211. package/src/types/entity_callbacks.ts +2 -2
  212. package/src/types/fields.tsx +33 -33
  213. package/src/types/index.ts +0 -1
  214. package/src/types/navigation.ts +6 -7
  215. package/src/types/plugins.tsx +18 -8
  216. package/src/types/properties.ts +22 -6
  217. package/src/types/storage.ts +12 -3
  218. package/src/util/collections.ts +1 -1
  219. package/src/util/entities.ts +5 -4
  220. package/src/util/enums.ts +1 -1
  221. package/src/util/icon_list.ts +2 -2
  222. package/src/util/icon_synonyms.ts +3 -99
  223. package/src/util/navigation_utils.ts +6 -6
  224. package/src/util/objects.ts +25 -28
  225. package/src/util/permissions.ts +1 -0
  226. package/src/util/plurals.ts +0 -2
  227. package/src/util/resolutions.ts +32 -31
  228. package/src/util/storage.ts +75 -21
  229. package/src/util/strings.ts +2 -2
  230. package/src/util/useStorageUploadController.tsx +21 -3
  231. package/src/util/useTraceUpdate.tsx +2 -1
  232. package/dist/components/VirtualTable/common.d.ts +0 -2
  233. package/dist/core/Drawer.d.ts +0 -23
  234. package/dist/core/Scaffold.d.ts +0 -55
  235. package/dist/core/SideEntityView.d.ts +0 -7
  236. package/dist/form/EntityForm.d.ts +0 -77
  237. package/dist/internal/useBuildCustomizationController.d.ts +0 -2
  238. package/dist/internal/useLocaleConfig.d.ts +0 -1
  239. package/dist/types/appcheck.d.ts +0 -26
  240. package/src/core/Drawer.tsx +0 -191
  241. package/src/core/Scaffold.tsx +0 -281
  242. package/src/core/SideEntityView.tsx +0 -38
  243. package/src/form/EntityForm.tsx +0 -728
  244. package/src/internal/useBuildCustomizationController.tsx +0 -5
  245. package/src/internal/useLocaleConfig.tsx +0 -18
  246. package/src/types/appcheck.ts +0 -29
@@ -1,191 +0,0 @@
1
- import React, { useCallback } from "react";
2
-
3
- import { useLargeLayout, useNavigationController } from "../hooks";
4
-
5
- import { NavLink, useNavigate } from "react-router-dom";
6
- import { CMSAnalyticsEvent, TopNavigationEntry, TopNavigationResult } from "../types";
7
- import { IconForView } from "../util";
8
- import { cn, IconButton, Menu, MenuItem, MoreVertIcon, Tooltip, Typography } from "@firecms/ui";
9
- import { useAnalyticsController } from "../hooks/useAnalyticsController";
10
-
11
- /**
12
- * Props used in case you need to override the default drawer
13
- * @group Core
14
- */
15
- export type DrawerProps<T = {}> = T & {
16
- hovered: boolean,
17
- drawerOpen: boolean,
18
- closeDrawer: () => any,
19
- }
20
-
21
- /**
22
- * Default drawer used in the CMS
23
- * @group Core
24
- */
25
- export function Drawer({
26
- hovered,
27
- drawerOpen,
28
- closeDrawer
29
- }: DrawerProps) {
30
-
31
- const analyticsController = useAnalyticsController();
32
- const navigation = useNavigationController();
33
-
34
- const tooltipsOpen = hovered && !drawerOpen;
35
- const largeLayout = useLargeLayout();
36
- const navigate = useNavigate();
37
-
38
- const [adminMenuOpen, setAdminMenuOpen] = React.useState(false);
39
-
40
- if (!navigation.topLevelNavigation)
41
- throw Error("Navigation not ready in Drawer");
42
-
43
- const {
44
- navigationEntries,
45
- groups
46
- }: TopNavigationResult = navigation.topLevelNavigation;
47
-
48
- const adminViews = navigationEntries.filter(e => e.type === "admin") ?? [];
49
- const groupsWithoutAdmin = groups.filter(g => g !== "Admin");
50
-
51
- const buildGroupHeader = useCallback((group?: string) => {
52
- if (!drawerOpen) return <div className="h-12 w-full"/>;
53
- return <div
54
- className="pt-8 pl-6 pr-8 pb-2 flex flex-row items-center">
55
- <Typography variant={"caption"}
56
- color={"secondary"}
57
- className="font-medium flex-grow line-clamp-1">
58
- {group ? group.toUpperCase() : "Views".toUpperCase()}
59
- </Typography>
60
-
61
- </div>;
62
- }, [drawerOpen]);
63
-
64
- const onClick = (view: TopNavigationEntry) => {
65
- const eventName: CMSAnalyticsEvent = view.type === "collection"
66
- ? "drawer_navigate_to_collection"
67
- : (view.type === "view" ? "drawer_navigate_to_view" : "unmapped_event");
68
- analyticsController.onAnalyticsEvent?.(eventName, { url: view.url });
69
- if (!largeLayout)
70
- closeDrawer();
71
- };
72
-
73
- return (
74
- <>
75
-
76
- <div className={"flex-grow overflow-scroll no-scrollbar"}>
77
-
78
- {groupsWithoutAdmin.map((group) => (
79
- <React.Fragment
80
- key={`drawer_group_${group}`}>
81
- {buildGroupHeader(group)}
82
- {Object.values(navigationEntries)
83
- .filter(e => e.group === group)
84
- .map((view, index) =>
85
- <DrawerNavigationItem
86
- key={`navigation_${index}`}
87
- icon={<IconForView collectionOrView={view.collection ?? view.view}/>}
88
- tooltipsOpen={tooltipsOpen}
89
- drawerOpen={drawerOpen}
90
- onClick={() => onClick(view)}
91
- url={view.url}
92
- name={view.name}/>)}
93
- </React.Fragment>
94
- ))}
95
-
96
- </div>
97
-
98
- {adminViews.length > 0 && <Menu
99
- open={adminMenuOpen}
100
- onOpenChange={setAdminMenuOpen}
101
- trigger={
102
- <IconButton
103
- shape={"square"}
104
- className={"m-4 text-gray-900 dark:text-white w-fit"}>
105
- <Tooltip title={"Admin"}
106
- open={tooltipsOpen}
107
- side={"right"} sideOffset={28}>
108
- <MoreVertIcon/>
109
- </Tooltip>
110
- {drawerOpen && <div
111
- className={cn(
112
- drawerOpen ? "opacity-100" : "opacity-0 hidden",
113
- "mx-4 font-inherit text-inherit"
114
- )}>
115
- ADMIN
116
- </div>}
117
- </IconButton>}
118
- >
119
- {adminViews.map((entry, index) =>
120
- <MenuItem
121
- onClick={(event) => {
122
- event.preventDefault();
123
- navigate(entry.path);
124
- }}
125
- key={`navigation_${index}`}>
126
- {<IconForView collectionOrView={entry.view}/>}
127
- {entry.name}
128
- </MenuItem>)}
129
-
130
- </Menu>}
131
- </>
132
- );
133
- }
134
-
135
- export function DrawerNavigationItem({
136
- name,
137
- icon,
138
- drawerOpen,
139
- tooltipsOpen,
140
- url,
141
- onClick
142
- }: {
143
- icon: React.ReactElement,
144
- name: string,
145
- tooltipsOpen: boolean,
146
- drawerOpen: boolean,
147
- url: string,
148
- onClick?: () => void,
149
- }) {
150
-
151
- const iconWrap = <div
152
- className={"text-gray-600 dark:text-gray-500"}>
153
- {icon}
154
- </div>;
155
-
156
- const listItem = <NavLink
157
- onClick={onClick}
158
- style={{
159
- width: !drawerOpen ? "72px" : "280px",
160
- transition: drawerOpen ? "width 150ms ease-in" : undefined
161
- }}
162
- className={({ isActive }: any) => cn("rounded-r-xl truncate",
163
- "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",
164
- "flex flex-row items-center mr-8",
165
- // "transition-all ease-in-out delay-100 duration-300",
166
- // drawerOpen ? "w-full" : "w-18",
167
- drawerOpen ? "pl-8 h-12" : "pl-6 h-11",
168
- "font-medium text-sm",
169
- isActive ? "bg-slate-200 bg-opacity-75 dark:bg-gray-800" : ""
170
- )}
171
- to={url}
172
- >
173
-
174
- {iconWrap}
175
-
176
- <div
177
- className={cn(
178
- drawerOpen ? "opacity-100" : "opacity-0 hidden",
179
- "ml-4 font-inherit text-inherit"
180
- )}>
181
- {name.toUpperCase()}
182
- </div>
183
- </NavLink>;
184
-
185
- return <Tooltip
186
- open={drawerOpen ? false : tooltipsOpen}
187
- side="right"
188
- title={name}>
189
- {listItem}
190
- </Tooltip>;
191
- }
@@ -1,281 +0,0 @@
1
- import React, { PropsWithChildren, useCallback } from "react";
2
- import equal from "react-fast-compare"
3
- import { Link } from "react-router-dom";
4
-
5
- import { Drawer as DefaultDrawer, DrawerProps } from "./Drawer";
6
- import { useLargeLayout, useNavigationController } from "../hooks";
7
- import { ErrorBoundary, FireCMSAppBar as DefaultFireCMSAppBar, FireCMSAppBarProps, FireCMSLogo } from "../components";
8
- import { ChevronLeftIcon, cn, defaultBorderMixin, IconButton, MenuIcon, Sheet, Tooltip } from "@firecms/ui";
9
-
10
- export const DRAWER_WIDTH = 280;
11
-
12
- /**
13
- * @group Core
14
- */
15
- export interface ScaffoldProps<ExtraDrawerProps = object, ExtraAppbarProps = object> {
16
-
17
- /**
18
- * Name of the app, displayed as the main title and in the tab title
19
- */
20
- name: string;
21
-
22
- /**
23
- * Logo to be displayed in the drawer of the CMS
24
- */
25
- logo?: string;
26
-
27
- /**
28
- * Whether to include the drawer in the scaffold
29
- */
30
- includeDrawer?: boolean;
31
-
32
- /**
33
- * In case you need to override the view that gets rendered as a drawer
34
- * @see DefaultDrawer
35
- */
36
- Drawer?: React.ComponentType<DrawerProps<ExtraDrawerProps>>;
37
-
38
- /**
39
- * Additional props passed to the custom Drawer
40
- */
41
- drawerProps?: Partial<DrawerProps> & ExtraDrawerProps;
42
-
43
- /**
44
- * Open the drawer on hover
45
- */
46
- autoOpenDrawer?: boolean;
47
-
48
- /**
49
- * A component that gets rendered on the upper side of the main toolbar.
50
- * `toolbarExtraWidget` has no effect if this is set.
51
- */
52
- FireCMSAppBar?: React.ComponentType<FireCMSAppBarProps<ExtraAppbarProps>>;
53
-
54
- /**
55
- * Additional props passed to the custom AppBar
56
- */
57
- fireCMSAppBarProps?: Partial<FireCMSAppBarProps> & ExtraAppbarProps;
58
-
59
- }
60
-
61
- /**
62
- * This view acts as a scaffold for FireCMS.
63
- *
64
- * It is in charge of displaying the navigation drawer, top bar and main
65
- * collection views.
66
- * This component needs a parent {@link FireCMS}
67
- *
68
- * @param props
69
- * @constructor
70
- * @group Core
71
- */
72
- export const Scaffold = React.memo<PropsWithChildren<ScaffoldProps>>(
73
- function Scaffold(props: PropsWithChildren<ScaffoldProps>) {
74
-
75
- const {
76
- children,
77
- name,
78
- logo,
79
- includeDrawer = true,
80
- autoOpenDrawer,
81
- Drawer = DefaultDrawer,
82
- drawerProps,
83
- FireCMSAppBar = DefaultFireCMSAppBar,
84
- fireCMSAppBarProps,
85
- } = props;
86
-
87
- const largeLayout = useLargeLayout();
88
-
89
- const [drawerOpen, setDrawerOpen] = React.useState(false);
90
- const [onHover, setOnHover] = React.useState(false);
91
-
92
- const setOnHoverTrue = useCallback(() => setOnHover(true), []);
93
- const setOnHoverFalse = useCallback(() => setOnHover(false), []);
94
-
95
- const handleDrawerClose = useCallback(() => {
96
- setDrawerOpen(false);
97
- }, []);
98
-
99
- const computedDrawerOpen: boolean = drawerOpen || Boolean(largeLayout && autoOpenDrawer && onHover);
100
- return (
101
- <div
102
- className="flex h-screen w-screen bg-gray-50 dark:bg-gray-900 text-gray-900 dark:text-white overflow-hidden"
103
- style={{
104
- paddingTop: "env(safe-area-inset-top)",
105
- paddingLeft: "env(safe-area-inset-left)",
106
- paddingRight: "env(safe-area-inset-right)",
107
- paddingBottom: "env(safe-area-inset-bottom)",
108
- height: "100dvh"
109
- // "@supports (height: 100dvh)": {
110
- // height: "100dvh"
111
- // }
112
- }}>
113
-
114
- <FireCMSAppBar title={name}
115
- includeDrawer={includeDrawer}
116
- drawerOpen={computedDrawerOpen}
117
- {...fireCMSAppBarProps}/>
118
-
119
- <StyledDrawer
120
- displayed={includeDrawer}
121
- onMouseEnter={setOnHoverTrue}
122
- onMouseMove={setOnHoverTrue}
123
- onMouseLeave={setOnHoverFalse}
124
- open={computedDrawerOpen}
125
- logo={logo}
126
- hovered={onHover}
127
- setDrawerOpen={setDrawerOpen}>
128
- {includeDrawer && (
129
- <Drawer
130
- hovered={onHover}
131
- drawerOpen={computedDrawerOpen}
132
- closeDrawer={handleDrawerClose}
133
- {...drawerProps}/>)}
134
- </StyledDrawer>
135
-
136
- <main
137
- className="flex flex-col flex-grow overflow-auto">
138
- <DrawerHeader/>
139
- <div
140
- className={cn(defaultBorderMixin, "flex-grow overflow-auto lg:m-0 lg:mx-4 lg:mb-4 lg:rounded-lg lg:border lg:border-solid m-0 mt-1")}>
141
-
142
- <ErrorBoundary>
143
- {children}
144
- </ErrorBoundary>
145
-
146
- </div>
147
- </main>
148
- </div>
149
- );
150
- },
151
- equal
152
- )
153
-
154
- const DrawerHeader = () => {
155
- return (
156
- <div className="flex flex-col min-h-[68px]"></div>
157
- );
158
- };
159
-
160
- function StyledDrawer(props: {
161
- children: React.ReactNode,
162
- displayed: boolean,
163
- open: boolean,
164
- logo?: string,
165
- hovered: boolean,
166
- setDrawerOpen: (open: boolean) => void,
167
- onMouseEnter: () => void,
168
- onMouseMove: () => void,
169
- onMouseLeave: () => void
170
- }) {
171
-
172
- const navigation = useNavigationController();
173
-
174
- const width = !props.displayed ? 0 : (props.open ? DRAWER_WIDTH : 72);
175
- const innerDrawer = <div
176
- className={"relative h-full no-scrollbar overflow-y-auto overflow-x-hidden"}
177
- style={{
178
- width,
179
- transition: "left 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms, opacity 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms, width 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms"
180
- }}
181
- >
182
-
183
- {!props.open && props.displayed && (
184
- <Tooltip title="Open menu"
185
- side="right"
186
- sideOffset={12}
187
- className="fixed top-2 left-3 !bg-gray-50 dark:!bg-gray-900 rounded-full w-fit"
188
- >
189
- <IconButton
190
- color="inherit"
191
- aria-label="Open menu"
192
- className="sticky top-2 left-3 "
193
- onClick={() => props.setDrawerOpen(true)}
194
- size="large"
195
- >
196
- <MenuIcon/>
197
- </IconButton>
198
- </Tooltip>
199
- )}
200
-
201
- <div className={"flex flex-col h-full"}>
202
- <div
203
- style={{
204
- transition: "padding 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms",
205
- padding: props.open ? "32px 144px 0px 24px" : "72px 16px 0px"
206
- }}
207
- className={cn("cursor-pointer")}>
208
-
209
- <Tooltip title={"Home"}
210
- sideOffset={20}
211
- side="right">
212
- <Link
213
- to={navigation.basePath}>
214
- {props.logo
215
- ? <img src={props.logo}
216
- alt="Logo"
217
- className={cn("max-w-full max-h-full",
218
- props.open ?? "w-[112px] h-[112px]")}/>
219
- : <FireCMSLogo/>}
220
-
221
- </Link>
222
- </Tooltip>
223
- </div>
224
-
225
- {props.children}
226
- </div>
227
-
228
- </div>;
229
-
230
- const largeLayout = useLargeLayout();
231
- if (!largeLayout) {
232
- if (!props.displayed)
233
- return null;
234
- return <>
235
- <IconButton
236
- color="inherit"
237
- aria-label="Open drawer"
238
- onClick={() => props.setDrawerOpen(true)}
239
- size="large"
240
- className="absolute top-2 left-6"
241
- >
242
- <MenuIcon/>
243
- </IconButton>
244
- <Sheet side={"left"}
245
- transparent={true}
246
- open={props.open}
247
- onOpenChange={props.setDrawerOpen}
248
- >
249
- {innerDrawer}
250
- </Sheet>
251
- </>;
252
- }
253
-
254
- return (
255
- <div
256
- className="relative"
257
- onMouseEnter={props.onMouseEnter}
258
- onMouseMove={props.onMouseMove}
259
- onMouseLeave={props.onMouseLeave}
260
- style={{
261
- width,
262
- transition: "left 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms, opacity 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms, width 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms"
263
- }}>
264
-
265
- {innerDrawer}
266
-
267
- <div
268
- className={`absolute right-0 top-4 ${
269
- props.open ? "opacity-100" : "opacity-0 invisible"
270
- } transition-opacity duration-1000 ease-in-out`}>
271
- <IconButton
272
- aria-label="Close drawer"
273
- onClick={() => props.setDrawerOpen(false)}
274
- >
275
- <ChevronLeftIcon/>
276
- </IconButton>
277
- </div>
278
-
279
- </div>
280
- );
281
- }
@@ -1,38 +0,0 @@
1
- import { User } from "../types";
2
- import { useSideDialogContext } from "./SideDialogs";
3
- import { useSideEntityController } from "../hooks";
4
- import { FORM_CONTAINER_WIDTH } from "../internal/common";
5
- import { EntityEditViewProps } from "./EntityEditView";
6
-
7
- export type SideEntityViewProps<M extends Record<string, any>> = EntityEditViewProps<M> & {
8
- formWidth?: number | string;
9
- onClose?: () => void;
10
- }
11
-
12
- export function SideEntityView<M extends Record<string, any>, UserType extends User>({
13
- path,
14
- entityId,
15
- selectedSubPath,
16
- copy,
17
- collection,
18
- parentCollectionIds,
19
- onValuesAreModified,
20
- formWidth,
21
- onUpdate,
22
- onClose
23
- }: SideEntityViewProps<M>) {
24
-
25
- const sideDialogContext = useSideDialogContext();
26
- const sideEntityController = useSideEntityController();
27
- const resolvedFormWidth: string = typeof formWidth === "number" ? `${formWidth}px` : formWidth ?? FORM_CONTAINER_WIDTH;
28
-
29
- const onCloseHandler = () => {
30
- if (onClose) {
31
- onClose();
32
- } else {
33
- sideDialogContext.close();
34
- }
35
- }
36
-
37
- return <></>;
38
- }