@firecms/core 3.0.0-canary.5 → 3.0.0-canary.51

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 (218) hide show
  1. package/README.md +2 -2
  2. package/dist/components/ClearFilterSortButton.d.ts +5 -0
  3. package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +11 -11
  4. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +2 -2
  5. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +5 -3
  6. package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +3 -2
  7. package/dist/components/EntityCollectionTable/column_utils.d.ts +1 -2
  8. package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +1 -4
  9. package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +1 -1
  10. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +12 -3
  11. package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
  12. package/dist/components/EntityCollectionView/useSelectionController.d.ts +2 -0
  13. package/dist/components/EntityPreview.d.ts +25 -7
  14. package/dist/components/EntityView.d.ts +11 -0
  15. package/dist/components/FieldCaption.d.ts +5 -0
  16. package/dist/components/FireCMSAppBar.d.ts +3 -2
  17. package/dist/components/HomePage/NavigationCard.d.ts +8 -0
  18. package/dist/components/HomePage/{NavigationCollectionCard.d.ts → NavigationCardBinding.d.ts} +2 -2
  19. package/dist/components/HomePage/SmallNavigationCard.d.ts +6 -0
  20. package/dist/components/HomePage/index.d.ts +3 -1
  21. package/dist/components/SelectableTable/SelectableTable.d.ts +1 -1
  22. package/dist/components/VirtualTable/VirtualTableProps.d.ts +1 -1
  23. package/dist/components/common/types.d.ts +4 -6
  24. package/dist/components/common/useDataSourceEntityCollectionTableController.d.ts +3 -0
  25. package/dist/components/index.d.ts +4 -2
  26. package/dist/contexts/AuthControllerContext.d.ts +1 -1
  27. package/dist/core/Drawer.d.ts +5 -12
  28. package/dist/core/DrawerNavigationItem.d.ts +9 -0
  29. package/dist/core/{EntityView.d.ts → EntityEditView.d.ts} +2 -2
  30. package/dist/core/NavigationRoutes.d.ts +1 -1
  31. package/dist/core/Scaffold.d.ts +7 -10
  32. package/dist/core/index.d.ts +3 -4
  33. package/dist/form/EntityForm.d.ts +1 -1
  34. package/dist/form/components/ErrorFocus.d.ts +1 -1
  35. package/dist/form/components/StorageItemPreview.d.ts +3 -2
  36. package/dist/form/components/StorageUploadProgress.d.ts +1 -1
  37. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
  38. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  39. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +4 -3
  40. package/dist/form/field_bindings/TextFieldBinding.d.ts +2 -2
  41. package/dist/form/validation.d.ts +1 -1
  42. package/dist/hooks/data/delete.d.ts +2 -2
  43. package/dist/hooks/data/save.d.ts +2 -3
  44. package/dist/hooks/data/useDataSource.d.ts +2 -2
  45. package/dist/hooks/data/useEntityFetch.d.ts +3 -3
  46. package/dist/hooks/index.d.ts +2 -0
  47. package/dist/hooks/useBuildNavigationController.d.ts +6 -4
  48. package/dist/hooks/useProjectLog.d.ts +6 -2
  49. package/dist/hooks/useStorageSource.d.ts +2 -2
  50. package/dist/hooks/useValidateAuthenticator.d.ts +21 -0
  51. package/dist/index.es.js +9644 -9122
  52. package/dist/index.es.js.map +1 -1
  53. package/dist/index.umd.js +5 -5
  54. package/dist/index.umd.js.map +1 -1
  55. package/dist/internal/useBuildDataSource.d.ts +1 -12
  56. package/dist/preview/PropertyPreview.d.ts +1 -1
  57. package/dist/preview/PropertyPreviewProps.d.ts +1 -4
  58. package/dist/preview/components/BooleanPreview.d.ts +5 -1
  59. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  60. package/dist/preview/components/ReferencePreview.d.ts +1 -7
  61. package/dist/types/analytics.d.ts +1 -1
  62. package/dist/types/auth.d.ts +37 -1
  63. package/dist/types/collections.d.ts +29 -5
  64. package/dist/types/datasource.d.ts +3 -6
  65. package/dist/types/entities.d.ts +5 -1
  66. package/dist/types/entity_actions.d.ts +14 -0
  67. package/dist/types/entity_callbacks.d.ts +2 -2
  68. package/dist/types/entity_overrides.d.ts +6 -0
  69. package/dist/types/index.d.ts +2 -1
  70. package/dist/types/navigation.d.ts +14 -13
  71. package/dist/types/permissions.d.ts +5 -1
  72. package/dist/types/plugins.d.ts +20 -20
  73. package/dist/types/properties.d.ts +4 -4
  74. package/dist/types/property_config.d.ts +2 -2
  75. package/dist/types/roles.d.ts +31 -0
  76. package/dist/types/storage.d.ts +11 -3
  77. package/dist/types/user.d.ts +5 -0
  78. package/dist/util/collections.d.ts +9 -1
  79. package/dist/util/entities.d.ts +1 -1
  80. package/dist/util/icon_synonyms.d.ts +2 -4
  81. package/dist/util/icons.d.ts +8 -2
  82. package/dist/util/navigation_utils.d.ts +2 -2
  83. package/dist/util/permissions.d.ts +4 -4
  84. package/dist/util/references.d.ts +4 -2
  85. package/dist/util/resolutions.d.ts +9 -13
  86. package/dist/util/useTraceUpdate.d.ts +1 -0
  87. package/package.json +139 -119
  88. package/src/components/ClearFilterSortButton.tsx +41 -0
  89. package/src/components/DeleteEntityDialog.tsx +4 -4
  90. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +2 -2
  91. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +275 -278
  92. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +9 -5
  93. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +44 -44
  94. package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
  95. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +9 -16
  96. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +3 -3
  97. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +27 -32
  98. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +11 -6
  99. package/src/components/EntityCollectionTable/internal/default_entity_actions.tsx +9 -5
  100. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +2 -4
  101. package/src/components/EntityCollectionView/EntityCollectionView.tsx +560 -554
  102. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +5 -6
  103. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
  104. package/src/components/EntityCollectionView/useSelectionController.tsx +30 -0
  105. package/src/components/EntityPreview.tsx +207 -70
  106. package/src/components/EntityView.tsx +84 -0
  107. package/src/components/FieldCaption.tsx +14 -0
  108. package/src/components/FireCMSAppBar.tsx +33 -11
  109. package/src/components/HomePage/DefaultHomePage.tsx +15 -11
  110. package/src/components/HomePage/NavigationCard.tsx +69 -0
  111. package/src/components/HomePage/NavigationCardBinding.tsx +116 -0
  112. package/src/components/HomePage/SmallNavigationCard.tsx +45 -0
  113. package/src/components/HomePage/index.tsx +3 -1
  114. package/src/components/PropertyIdCopyTooltipContent.tsx +2 -3
  115. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +4 -4
  116. package/src/components/ReferenceWidget.tsx +5 -5
  117. package/src/components/SearchIconsView.tsx +4 -4
  118. package/src/components/SelectableTable/SelectableTable.tsx +1 -1
  119. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
  120. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +23 -8
  121. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +35 -24
  122. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +35 -15
  123. package/src/components/VirtualTable/VirtualTable.tsx +28 -20
  124. package/src/components/VirtualTable/VirtualTableProps.tsx +1 -1
  125. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +1 -1
  126. package/src/components/common/types.tsx +4 -6
  127. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +12 -1
  128. package/src/components/index.tsx +4 -2
  129. package/src/contexts/AuthControllerContext.tsx +1 -1
  130. package/src/core/Drawer.tsx +78 -103
  131. package/src/core/DrawerNavigationItem.tsx +62 -0
  132. package/src/core/{EntityView.tsx → EntityEditView.tsx} +21 -40
  133. package/src/core/EntitySidePanel.tsx +2 -2
  134. package/src/core/FireCMS.tsx +22 -7
  135. package/src/core/NavigationRoutes.tsx +11 -4
  136. package/src/core/Scaffold.tsx +76 -61
  137. package/src/core/field_configs.tsx +1 -2
  138. package/src/core/index.tsx +3 -4
  139. package/src/form/EntityForm.tsx +42 -22
  140. package/src/form/PropertyFieldBinding.tsx +0 -2
  141. package/src/form/components/StorageItemPreview.tsx +5 -3
  142. package/src/form/components/StorageUploadProgress.tsx +7 -6
  143. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +8 -12
  144. package/src/form/field_bindings/DateTimeFieldBinding.tsx +1 -1
  145. package/src/form/field_bindings/KeyValueFieldBinding.tsx +15 -15
  146. package/src/form/field_bindings/MapFieldBinding.tsx +15 -15
  147. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +1 -1
  148. package/src/form/field_bindings/ReferenceFieldBinding.tsx +1 -0
  149. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +14 -5
  150. package/src/form/field_bindings/TextFieldBinding.tsx +7 -5
  151. package/src/form/validation.ts +3 -4
  152. package/src/hooks/data/delete.ts +3 -3
  153. package/src/hooks/data/save.ts +2 -2
  154. package/src/hooks/data/useCollectionFetch.tsx +1 -1
  155. package/src/hooks/data/useDataSource.tsx +8 -3
  156. package/src/hooks/data/useEntityFetch.tsx +4 -4
  157. package/src/hooks/index.tsx +3 -0
  158. package/src/hooks/useBuildLocalConfigurationPersistence.tsx +9 -10
  159. package/src/hooks/useBuildModeController.tsx +11 -5
  160. package/src/hooks/useBuildNavigationController.tsx +199 -81
  161. package/src/hooks/useProjectLog.tsx +17 -7
  162. package/src/hooks/useReferenceDialog.tsx +2 -2
  163. package/src/hooks/useStorageSource.tsx +7 -2
  164. package/src/hooks/useValidateAuthenticator.tsx +115 -0
  165. package/src/internal/useBuildDataSource.ts +42 -44
  166. package/src/internal/useBuildSideEntityController.tsx +86 -20
  167. package/src/preview/PropertyPreview.tsx +3 -14
  168. package/src/preview/PropertyPreviewProps.tsx +1 -11
  169. package/src/preview/components/BooleanPreview.tsx +19 -4
  170. package/src/preview/components/EnumValuesChip.tsx +1 -1
  171. package/src/preview/components/ReferencePreview.tsx +55 -147
  172. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +0 -1
  173. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +0 -1
  174. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +0 -1
  175. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +0 -1
  176. package/src/preview/property_previews/ArrayOneOfPreview.tsx +0 -1
  177. package/src/preview/property_previews/ArrayPropertyPreview.tsx +0 -1
  178. package/src/preview/property_previews/StringPropertyPreview.tsx +8 -7
  179. package/src/types/analytics.ts +1 -0
  180. package/src/types/auth.tsx +50 -1
  181. package/src/types/collections.ts +33 -5
  182. package/src/types/datasource.ts +8 -5
  183. package/src/types/entities.ts +9 -1
  184. package/src/types/entity_actions.tsx +17 -0
  185. package/src/types/entity_callbacks.ts +2 -2
  186. package/src/types/entity_overrides.tsx +7 -0
  187. package/src/types/firecms.tsx +0 -1
  188. package/src/types/index.ts +2 -1
  189. package/src/types/navigation.ts +17 -16
  190. package/src/types/permissions.ts +6 -1
  191. package/src/types/plugins.tsx +26 -28
  192. package/src/types/properties.ts +8 -6
  193. package/src/types/property_config.tsx +2 -2
  194. package/src/types/roles.ts +41 -0
  195. package/src/types/side_entity_controller.tsx +1 -0
  196. package/src/types/storage.ts +12 -3
  197. package/src/types/user.ts +7 -0
  198. package/src/util/collections.ts +22 -0
  199. package/src/util/entities.ts +1 -1
  200. package/src/util/icon_list.ts +2 -2
  201. package/src/util/icon_synonyms.ts +4 -6
  202. package/src/util/icons.tsx +11 -3
  203. package/src/util/navigation_utils.ts +6 -6
  204. package/src/util/objects.ts +0 -14
  205. package/src/util/permissions.ts +11 -8
  206. package/src/util/references.ts +36 -5
  207. package/src/util/resolutions.ts +6 -24
  208. package/src/util/strings.ts +2 -2
  209. package/src/util/useTraceUpdate.tsx +2 -1
  210. package/dist/core/SideEntityView.d.ts +0 -7
  211. package/dist/internal/useBuildCustomizationController.d.ts +0 -2
  212. package/dist/internal/useLocaleConfig.d.ts +0 -1
  213. package/dist/types/appcheck.d.ts +0 -26
  214. package/src/components/HomePage/NavigationCollectionCard.tsx +0 -146
  215. package/src/core/SideEntityView.tsx +0 -38
  216. package/src/internal/useBuildCustomizationController.tsx +0 -5
  217. package/src/internal/useLocaleConfig.tsx +0 -18
  218. package/src/types/appcheck.ts +0 -29
@@ -9,10 +9,9 @@ import {
9
9
  FormContext,
10
10
  User
11
11
  } from "../types";
12
- import { CircularProgressCenter, EntityCollectionView, EntityPreview, ErrorBoundary, } from "../components";
12
+ import { CircularProgressCenter, EntityCollectionView, EntityView, ErrorBoundary, } from "../components";
13
13
  import {
14
14
  canEditEntity,
15
- fullPathToCollectionSegments,
16
15
  removeInitialAndTrailingSlashes,
17
16
  resolveDefaultSelectedView,
18
17
  resolveEntityView,
@@ -32,12 +31,11 @@ import {
32
31
  import { EntityForm } from "../form";
33
32
  import { CircularProgress, CloseIcon, cn, defaultBorderMixin, IconButton, Tab, Tabs, Typography } from "@firecms/ui";
34
33
  import { EntityFormSaveParams } from "../form/EntityForm";
35
- import { FORM_CONTAINER_WIDTH } from "../internal/common";
36
34
  import { useSideDialogContext } from "./index";
37
35
 
38
36
  const MAIN_TAB_VALUE = "main_##Q$SC^#S6";
39
37
 
40
- export interface EntityViewProps<M extends Record<string, any>> {
38
+ export interface EntityEditViewProps<M extends Record<string, any>> {
41
39
  path: string;
42
40
  collection: EntityCollection<M>;
43
41
  entityId?: string;
@@ -56,18 +54,18 @@ export interface EntityViewProps<M extends Record<string, any>> {
56
54
  * You probably don't want to use this view directly since it is bound to the
57
55
  * side panel. Instead, you might want to use {@link EntityForm} or {@link EntityCollectionView}
58
56
  */
59
- export function EntityView<M extends Record<string, any>, UserType extends User>({
60
- path,
61
- entityId,
62
- selectedSubPath,
63
- copy,
64
- collection,
65
- parentCollectionIds,
66
- onValuesAreModified,
67
- formWidth,
68
- onUpdate,
69
- onClose
70
- }: EntityViewProps<M>) {
57
+ export function EntityEditView<M extends Record<string, any>, UserType extends User>({
58
+ path,
59
+ entityId,
60
+ selectedSubPath,
61
+ copy,
62
+ collection,
63
+ parentCollectionIds,
64
+ onValuesAreModified,
65
+ formWidth,
66
+ onUpdate,
67
+ onClose,
68
+ }: EntityEditViewProps<M>) {
71
69
 
72
70
  if (collection.customId && collection.formAutoSave) {
73
71
  console.warn(`The collection ${collection.path} has customId and formAutoSave enabled. This is not supported and formAutoSave will be ignored`);
@@ -92,10 +90,9 @@ export function EntityView<M extends Record<string, any>, UserType extends User>
92
90
 
93
91
  // const largeLayout = useLargeLayout();
94
92
  // const largeLayoutTabSelected = useRef(!largeLayout);
93
+ // const resolvedFormWidth: string = typeof formWidth === "number" ? `${formWidth}px` : formWidth ?? FORM_CONTAINER_WIDTH;
95
94
 
96
- const resolvedFormWidth: string = typeof formWidth === "number" ? `${formWidth}px` : formWidth ?? FORM_CONTAINER_WIDTH;
97
-
98
- const dataSource = useDataSource();
95
+ const dataSource = useDataSource(collection);
99
96
  const sideDialogContext = useSideDialogContext();
100
97
  const sideEntityController = useSideEntityController();
101
98
  const snackbarController = useSnackbarController();
@@ -154,29 +151,12 @@ export function EntityView<M extends Record<string, any>, UserType extends User>
154
151
  if (status === "new") {
155
152
  setReadOnly(false);
156
153
  } else {
157
- const editEnabled = usedEntity ? canEditEntity(collection, authController, fullPathToCollectionSegments(path), usedEntity ?? null) : false;
154
+ const editEnabled = usedEntity ? canEditEntity(collection, authController, path, usedEntity ?? null) : false;
158
155
  if (usedEntity)
159
156
  setReadOnly(!editEnabled);
160
157
  }
161
158
  }, [authController, usedEntity, status]);
162
159
 
163
- // useEffect(() => {
164
- // if (largeLayoutTabSelected.current === largeLayout)
165
- // return;
166
- // // open first tab by default in large layouts
167
- // if (selectedSubPath !== defaultSelectedView) {
168
- // console.log("Replacing url 1", defaultSelectedView);
169
- // sideEntityController.replace({
170
- // path,
171
- // entityId,
172
- // selectedSubPath: defaultSelectedView,
173
- // updateUrl: true,
174
- // collection
175
- // });
176
- // }
177
- // largeLayoutTabSelected.current = largeLayout;
178
- // }, [defaultSelectedView, largeLayout, selectedSubPath]);
179
-
180
160
  const onPreSaveHookError = useCallback((e: Error) => {
181
161
  setSaving(false);
182
162
  snackbarController.open({
@@ -222,7 +202,7 @@ export function EntityView<M extends Record<string, any>, UserType extends User>
222
202
  entityId: updatedEntity.id,
223
203
  selectedSubPath: selectedTabRef.current,
224
204
  updateUrl: true,
225
- collection
205
+ collection,
226
206
  });
227
207
  }
228
208
 
@@ -302,6 +282,7 @@ export function EntityView<M extends Record<string, any>, UserType extends User>
302
282
  .map(e => resolveEntityView(e, customizationController.entityViews))
303
283
  .filter(Boolean) as EntityCustomView[]
304
284
  : [];
285
+
305
286
  const customViewsView: React.ReactNode[] | undefined = customViews && resolvedEntityViews
306
287
  .map(
307
288
  (customView, colIndex) => {
@@ -382,7 +363,7 @@ export function EntityView<M extends Record<string, any>, UserType extends User>
382
363
  entityId,
383
364
  selectedSubPath: value === MAIN_TAB_VALUE ? undefined : value,
384
365
  updateUrl: true,
385
- collection
366
+ collection,
386
367
  });
387
368
  };
388
369
 
@@ -463,7 +444,7 @@ export function EntityView<M extends Record<string, any>, UserType extends User>
463
444
  className={"mt-16 mb-8 mx-8"}
464
445
  variant={"h4"}>{collection.singularName ?? collection.name}
465
446
  </Typography>
466
- <EntityPreview
447
+ <EntityView
467
448
  className={"px-12"}
468
449
  entity={usedEntity as Entity<M>}
469
450
  path={path}
@@ -4,7 +4,7 @@ import { EntitySidePanelProps } from "../types";
4
4
  import { useNavigationController } from "../hooks";
5
5
 
6
6
  import { ErrorBoundary } from "../components";
7
- import { EntityView } from "./EntityView";
7
+ import { EntityEditView } from "./EntityEditView";
8
8
  import { useSideDialogContext } from "./SideDialogs";
9
9
 
10
10
  /**
@@ -77,7 +77,7 @@ export function EntitySidePanel(props: EntitySidePanelProps) {
77
77
  return (
78
78
  <>
79
79
  <ErrorBoundary>
80
- <EntityView
80
+ <EntityEditView
81
81
  {...props}
82
82
  formWidth={props.width}
83
83
  collection={collection}
@@ -1,6 +1,6 @@
1
1
  import React, { useMemo } from "react";
2
2
 
3
- import { EntityCollection, FireCMSContext, FireCMSPlugin, FireCMSProps, User } from "../types";
3
+ import { CustomizationController, EntityCollection, FireCMSContext, FireCMSPlugin, FireCMSProps, User } from "../types";
4
4
  import { AuthControllerContext, ModeControllerContext } from "../contexts";
5
5
  import { useBuildSideEntityController } from "../internal/useBuildSideEntityController";
6
6
  import { useCustomizationController, useFireCMSContext, useModeController } from "../hooks";
@@ -12,11 +12,9 @@ import { DataSourceContext } from "../contexts/DataSourceContext";
12
12
  import { SideEntityControllerContext } from "../contexts/SideEntityControllerContext";
13
13
  import { NavigationContext } from "../contexts/NavigationContext";
14
14
  import { SideDialogsControllerContext } from "../contexts/SideDialogsControllerContext";
15
- import { useLocaleConfig } from "../internal/useLocaleConfig";
16
- import { CenteredView } from "@firecms/ui";
15
+ import { CenteredView, Typography, useLocaleConfig } from "@firecms/ui";
17
16
  import { DialogsProvider } from "../contexts/DialogsProvider";
18
17
  import { useBuildDataSource } from "../internal/useBuildDataSource";
19
- import { useBuildCustomizationController } from "../internal/useBuildCustomizationController";
20
18
  import { CustomizationControllerContext } from "../contexts/CustomizationControllerContext";
21
19
  import { AnalyticsContext } from "../contexts/AnalyticsContext";
22
20
  import { useProjectLog } from "../hooks/useProjectLog";
@@ -55,6 +53,7 @@ export function FireCMS<UserType extends User, EC extends EntityCollection>(prop
55
53
 
56
54
  useLocaleConfig(locale);
57
55
 
56
+ console.debug("FireCMS propertyConfigs", propertyConfigs);
58
57
  /**
59
58
  * Controller in charge of fetching and persisting data
60
59
  */
@@ -71,7 +70,7 @@ export function FireCMS<UserType extends User, EC extends EntityCollection>(prop
71
70
 
72
71
  const loading = authController.initialLoading || navigationController.loading || pluginsLoading;
73
72
 
74
- const customizationController = useBuildCustomizationController({
73
+ const customizationController: CustomizationController = {
75
74
  dateTimeFormat,
76
75
  locale,
77
76
  entityLinkBuilder,
@@ -79,13 +78,13 @@ export function FireCMS<UserType extends User, EC extends EntityCollection>(prop
79
78
  entityViews: entityViews ?? [],
80
79
  propertyConfigs: propertyConfigs ?? {},
81
80
  components
82
- });
81
+ };
83
82
 
84
83
  const analyticsController = useMemo(() => ({
85
84
  onAnalyticsEvent
86
85
  }), []);
87
86
 
88
- useProjectLog(authController);
87
+ const accessResponse = useProjectLog(authController, plugins);
89
88
 
90
89
  if (navigationController.navigationLoadingError) {
91
90
  return (
@@ -107,6 +106,22 @@ export function FireCMS<UserType extends User, EC extends EntityCollection>(prop
107
106
  );
108
107
  }
109
108
 
109
+ if (accessResponse?.blocked) {
110
+ return (
111
+ <CenteredView maxWidth={"md"} fullScreen={true}>
112
+ <Typography variant={"h4"}>
113
+ Access blocked
114
+ </Typography>
115
+ <Typography>
116
+ This app has been blocked. Please reach out at <a
117
+ href={"mailto:hello@firecms.co"}>hello@firecms.co</a> for more information.
118
+ </Typography>
119
+ {accessResponse?.message &&
120
+ <Typography>Response from the server: {accessResponse?.message}</Typography>}
121
+ </CenteredView>
122
+ );
123
+ }
124
+
110
125
  return (
111
126
  <ModeControllerContext.Provider value={modeController}>
112
127
  <AnalyticsContext.Provider value={analyticsController}>
@@ -13,7 +13,7 @@ export type NavigationRoutesProps = {
13
13
  /**
14
14
  * In case you need to override the home page
15
15
  */
16
- HomePage?: React.ComponentType;
16
+ homePage?: React.ReactNode;
17
17
 
18
18
  customRoutes?: React.ReactNode[]
19
19
 
@@ -28,10 +28,9 @@ export type NavigationRoutesProps = {
28
28
  * @constructor
29
29
  * @group Components
30
30
  */
31
-
32
31
  export const NavigationRoutes = React.memo<NavigationRoutesProps>(
33
32
  function NavigationRoutes({
34
- HomePage = DefaultHomePage,
33
+ homePage = <DefaultHomePage/>,
35
34
  customRoutes
36
35
  }: NavigationRoutesProps) {
37
36
 
@@ -59,6 +58,14 @@ export const NavigationRoutes = React.memo<NavigationRoutesProps>(
59
58
  cmsViews.push(buildCMSViewRoute(cmsView.path, cmsView));
60
59
  });
61
60
  }
61
+ if (navigation.adminViews) {
62
+ navigation.adminViews.forEach((cmsView) => {
63
+ if (Array.isArray(cmsView.path))
64
+ cmsViews.push(...cmsView.path.map(path => buildCMSViewRoute(path, cmsView)));
65
+ else
66
+ cmsViews.push(buildCMSViewRoute(cmsView.path, cmsView));
67
+ });
68
+ }
62
69
 
63
70
  // we reorder collections so that nested paths are included first
64
71
  const sortedCollections = [...(navigation.collections ?? [])]
@@ -85,7 +92,7 @@ export const NavigationRoutes = React.memo<NavigationRoutesProps>(
85
92
 
86
93
  const homeRoute = (
87
94
  <Route path={"/"}
88
- element={<HomePage/>}/>
95
+ element={homePage}/>
89
96
  );
90
97
 
91
98
  const notFoundRoute = <Route path={"*"}
@@ -9,15 +9,31 @@ import { ChevronLeftIcon, cn, defaultBorderMixin, IconButton, MenuIcon, Sheet, T
9
9
 
10
10
  export const DRAWER_WIDTH = 280;
11
11
 
12
+ const DrawerContext = React.createContext<DrawerProps>({
13
+ hovered: false,
14
+ drawerOpen: false,
15
+ openDrawer: () => {
16
+ throw new Error("openDrawer not implemented");
17
+ },
18
+ closeDrawer: () => {
19
+ throw new Error("closeDrawer not implemented");
20
+ },
21
+ autoOpenDrawer: false
22
+ });
23
+
24
+ export function useDrawer() {
25
+ return React.useContext(DrawerContext);
26
+ }
27
+
12
28
  /**
13
29
  * @group Core
14
30
  */
15
- export interface ScaffoldProps<ExtraDrawerProps = object, ExtraAppbarProps = object> {
31
+ export interface ScaffoldProps<ExtraAppbarProps = object> {
16
32
 
17
33
  /**
18
34
  * Name of the app, displayed as the main title and in the tab title
19
35
  */
20
- name: string;
36
+ name: React.ReactNode;
21
37
 
22
38
  /**
23
39
  * Logo to be displayed in the drawer of the CMS
@@ -30,15 +46,10 @@ export interface ScaffoldProps<ExtraDrawerProps = object, ExtraAppbarProps = obj
30
46
  includeDrawer?: boolean;
31
47
 
32
48
  /**
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
49
+ * You can define a custom drawer to be displayed in the scaffold.
50
+ * Use the hook `useDrawer` to access the context values.
40
51
  */
41
- drawerProps?: Partial<DrawerProps> & ExtraDrawerProps;
52
+ drawer?: React.ReactNode;
42
53
 
43
54
  /**
44
55
  * Open the drawer on hover
@@ -78,8 +89,7 @@ export const Scaffold = React.memo<PropsWithChildren<ScaffoldProps>>(
78
89
  logo,
79
90
  includeDrawer = true,
80
91
  autoOpenDrawer,
81
- Drawer = DefaultDrawer,
82
- drawerProps,
92
+ drawer = <DefaultDrawer/>,
83
93
  FireCMSAppBar = DefaultFireCMSAppBar,
84
94
  fireCMSAppBarProps,
85
95
  } = props;
@@ -92,60 +102,65 @@ export const Scaffold = React.memo<PropsWithChildren<ScaffoldProps>>(
92
102
  const setOnHoverTrue = useCallback(() => setOnHover(true), []);
93
103
  const setOnHoverFalse = useCallback(() => setOnHover(false), []);
94
104
 
105
+ const handleDrawerOpen = useCallback(() => {
106
+ setDrawerOpen(true);
107
+ }, []);
108
+
95
109
  const handleDrawerClose = useCallback(() => {
96
110
  setDrawerOpen(false);
97
111
  }, []);
98
112
 
99
113
  const computedDrawerOpen: boolean = drawerOpen || Boolean(largeLayout && autoOpenDrawer && onHover);
114
+
100
115
  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>
116
+ <DrawerContext.Provider value={{
117
+ hovered: onHover,
118
+ drawerOpen: computedDrawerOpen,
119
+ closeDrawer: handleDrawerClose,
120
+ openDrawer: handleDrawerOpen,
121
+ autoOpenDrawer
122
+ }}>
123
+ <div
124
+ className="flex h-screen w-screen bg-gray-50 dark:bg-gray-900 text-gray-900 dark:text-white overflow-hidden"
125
+ style={{
126
+ paddingTop: "env(safe-area-inset-top)",
127
+ paddingLeft: "env(safe-area-inset-left)",
128
+ paddingRight: "env(safe-area-inset-right)",
129
+ paddingBottom: "env(safe-area-inset-bottom)",
130
+ height: "100dvh"
131
+ }}>
132
+
133
+ <FireCMSAppBar title={name}
134
+ includeDrawer={includeDrawer}
135
+ logo={logo}
136
+ drawerOpen={computedDrawerOpen}
137
+ {...fireCMSAppBarProps}/>
138
+ <DrawerWrapper
139
+ displayed={includeDrawer}
140
+ onMouseEnter={setOnHoverTrue}
141
+ onMouseMove={setOnHoverTrue}
142
+ onMouseLeave={setOnHoverFalse}
143
+ open={computedDrawerOpen}
144
+ logo={logo}
145
+ hovered={onHover}
146
+ setDrawerOpen={setDrawerOpen}>
147
+ {includeDrawer && drawer}
148
+ </DrawerWrapper>
149
+
150
+ <main
151
+ className="flex flex-col flex-grow overflow-auto">
152
+ <DrawerHeader/>
153
+ <div
154
+ 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")}>
155
+
156
+ <ErrorBoundary>
157
+ {children}
158
+ </ErrorBoundary>
159
+
160
+ </div>
161
+ </main>
162
+ </div>
163
+ </DrawerContext.Provider>
149
164
  );
150
165
  },
151
166
  equal
@@ -157,7 +172,7 @@ const DrawerHeader = () => {
157
172
  );
158
173
  };
159
174
 
160
- function StyledDrawer(props: {
175
+ function DrawerWrapper(props: {
161
176
  children: React.ReactNode,
162
177
  displayed: boolean,
163
178
  open: boolean,
@@ -359,8 +359,7 @@ export function getDefaultFieldId(property: Property | ResolvedProperty) {
359
359
  } else if (property.dataType === "map") {
360
360
  if (property.keyValue)
361
361
  return "key_value";
362
- if (property.properties)
363
- return "group";
362
+ return "group";
364
363
  } else if (property.dataType === "array") {
365
364
  const of = (property as ArrayProperty).of;
366
365
  const oneOf = (property as ArrayProperty).oneOf;
@@ -1,10 +1,9 @@
1
1
  export * from "./FireCMS";
2
2
 
3
- export type { ScaffoldProps } from "./Scaffold";
4
- export { Scaffold } from "./Scaffold";
3
+ export * from "./Scaffold";
5
4
 
6
- export type { DrawerProps } from "./Drawer";
7
- export { Drawer, DrawerNavigationItem } from "./Drawer";
5
+ export * from "./Drawer";
6
+ export * from "./DrawerNavigationItem";
8
7
 
9
8
  export * from "./field_configs";
10
9