@firecms/core 3.0.0-canary.22 → 3.0.0-canary.220
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.
- package/README.md +3 -3
- package/dist/app/AppBar.d.ts +12 -0
- package/dist/app/Drawer.d.ts +16 -0
- package/dist/app/Scaffold.d.ts +34 -0
- package/dist/app/index.d.ts +4 -0
- package/dist/app/useApp.d.ts +16 -0
- package/dist/components/ArrayContainer.d.ts +30 -6
- package/dist/components/CircularProgressCenter.d.ts +1 -1
- package/dist/components/ClearFilterSortButton.d.ts +5 -0
- package/dist/components/{DeleteConfirmationDialog.d.ts → ConfirmationDialog.d.ts} +1 -1
- package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +13 -13
- package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +2 -2
- package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +22 -6
- package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +1 -0
- package/dist/components/EntityCollectionTable/column_utils.d.ts +1 -2
- package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +3 -1
- package/dist/components/EntityCollectionTable/index.d.ts +1 -1
- package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +1 -4
- package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +2 -2
- package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +7 -4
- package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +16 -2
- package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
- package/dist/components/EntityCollectionView/utils.d.ts +3 -0
- package/dist/components/EntityJsonPreview.d.ts +3 -0
- package/dist/components/EntityPreview.d.ts +5 -4
- package/dist/components/ErrorView.d.ts +1 -1
- package/dist/components/HomePage/DefaultHomePage.d.ts +1 -1
- package/dist/components/HomePage/NavigationCardBinding.d.ts +1 -1
- package/dist/components/PropertyConfigBadge.d.ts +2 -1
- package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
- package/dist/components/ReferenceWidget.d.ts +3 -1
- package/dist/components/SelectableTable/SelectableTable.d.ts +13 -3
- package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
- package/dist/components/UnsavedChangesDialog.d.ts +8 -0
- package/dist/components/VirtualTable/VirtualTableProps.d.ts +28 -12
- package/dist/components/VirtualTable/types.d.ts +3 -3
- package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -3
- package/dist/components/common/index.d.ts +2 -1
- package/dist/components/common/table_height.d.ts +5 -0
- package/dist/components/common/types.d.ts +4 -6
- package/dist/components/common/useColumnsIds.d.ts +3 -1
- package/dist/components/common/{useDataSourceEntityCollectionTableController.d.ts → useDataSourceTableController.d.ts} +13 -2
- package/dist/components/common/useDebouncedCallback.d.ts +1 -0
- package/dist/components/common/useScrollRestoration.d.ts +14 -0
- package/dist/components/index.d.ts +4 -2
- package/dist/contexts/BreacrumbsContext.d.ts +8 -0
- package/dist/core/DefaultAppBar.d.ts +29 -0
- package/dist/core/DefaultDrawer.d.ts +19 -0
- package/dist/core/DrawerNavigationItem.d.ts +10 -0
- package/dist/core/EntityEditView.d.ts +36 -11
- package/dist/core/EntityEditViewFormActions.d.ts +2 -0
- package/dist/core/FireCMS.d.ts +3 -3
- package/dist/core/FireCMSRouter.d.ts +4 -0
- package/dist/core/NavigationRoutes.d.ts +2 -3
- package/dist/core/SideDialogs.d.ts +4 -2
- package/dist/core/index.d.ts +4 -4
- package/dist/form/EntityForm.d.ts +36 -64
- package/dist/form/EntityFormActions.d.ts +17 -0
- package/dist/form/PropertyFieldBinding.d.ts +1 -1
- package/dist/form/components/ErrorFocus.d.ts +1 -1
- package/dist/form/components/FieldHelperText.d.ts +3 -3
- package/dist/form/components/FormEntry.d.ts +6 -0
- package/dist/form/components/FormLayout.d.ts +5 -0
- package/dist/form/components/LabelWithIcon.d.ts +1 -1
- package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
- package/dist/form/components/StorageItemPreview.d.ts +4 -4
- package/dist/form/components/index.d.ts +3 -1
- package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
- package/dist/form/field_bindings/{MultiSelectBinding.d.ts → MultiSelectFieldBinding.d.ts} +1 -1
- package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -2
- package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +3 -5
- package/dist/form/field_bindings/SwitchFieldBinding.d.ts +1 -2
- package/dist/form/field_bindings/TextFieldBinding.d.ts +1 -1
- package/dist/form/index.d.ts +16 -18
- package/dist/form/useClearRestoreValue.d.ts +2 -2
- package/dist/hooks/data/delete.d.ts +4 -4
- package/dist/hooks/data/save.d.ts +4 -5
- package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
- package/dist/hooks/data/useEntityFetch.d.ts +4 -3
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/useAuthController.d.ts +1 -1
- package/dist/hooks/useBreadcrumbsController.d.ts +26 -0
- package/dist/hooks/useBuildNavigationController.d.ts +7 -5
- package/dist/hooks/useFireCMSContext.d.ts +1 -1
- package/dist/hooks/useModeController.d.ts +1 -2
- package/dist/hooks/useProjectLog.d.ts +8 -2
- package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
- package/dist/hooks/useValidateAuthenticator.d.ts +4 -8
- package/dist/index.d.ts +1 -0
- package/dist/index.es.js +21368 -13885
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +24163 -588
- package/dist/index.umd.js.map +1 -1
- package/dist/internal/useBuildDataSource.d.ts +3 -17
- package/dist/internal/useBuildSideEntityController.d.ts +3 -3
- package/dist/internal/useUnsavedChangesDialog.d.ts +7 -9
- package/dist/preview/PropertyPreviewProps.d.ts +6 -1
- package/dist/preview/components/EnumValuesChip.d.ts +1 -1
- package/dist/preview/components/ReferencePreview.d.ts +3 -2
- package/dist/preview/components/StorageThumbnail.d.ts +2 -1
- package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
- package/dist/preview/util.d.ts +3 -3
- package/dist/routes/CustomCMSRoute.d.ts +4 -0
- package/dist/routes/FireCMSRoute.d.ts +1 -0
- package/dist/routes/HomePageRoute.d.ts +3 -0
- package/dist/types/auth.d.ts +8 -10
- package/dist/types/collections.d.ts +79 -22
- package/dist/types/datasource.d.ts +52 -36
- package/dist/types/dialogs_controller.d.ts +7 -3
- package/dist/types/entities.d.ts +7 -2
- package/dist/types/entity_actions.d.ts +28 -4
- package/dist/types/entity_callbacks.d.ts +16 -16
- package/dist/types/entity_overrides.d.ts +2 -2
- package/dist/types/export_import.d.ts +4 -4
- package/dist/types/fields.d.ts +74 -42
- package/dist/types/firecms.d.ts +6 -2
- package/dist/types/firecms_context.d.ts +1 -1
- package/dist/types/index.d.ts +0 -1
- package/dist/types/navigation.d.ts +32 -14
- package/dist/types/permissions.d.ts +4 -4
- package/dist/types/plugins.d.ts +24 -12
- package/dist/types/properties.d.ts +73 -24
- package/dist/types/property_config.d.ts +0 -2
- package/dist/types/side_dialogs_controller.d.ts +10 -0
- package/dist/types/side_entity_controller.d.ts +6 -1
- package/dist/types/storage.d.ts +86 -3
- package/dist/types/user.d.ts +1 -0
- package/dist/util/builders.d.ts +3 -3
- package/dist/util/createFormexStub.d.ts +2 -0
- package/dist/util/entities.d.ts +3 -3
- package/dist/util/entity_actions.d.ts +2 -0
- package/dist/util/entity_cache.d.ts +23 -0
- package/dist/util/icon_list.d.ts +5 -1
- package/dist/util/icon_synonyms.d.ts +1 -98
- package/dist/util/icons.d.ts +6 -3
- package/dist/util/index.d.ts +2 -0
- package/dist/util/navigation_from_path.d.ts +6 -1
- package/dist/util/navigation_utils.d.ts +14 -3
- package/dist/util/objects.d.ts +2 -1
- package/dist/util/permissions.d.ts +4 -4
- package/dist/util/plurals.d.ts +0 -2
- package/dist/util/property_utils.d.ts +4 -4
- package/dist/util/references.d.ts +2 -2
- package/dist/util/resolutions.d.ts +41 -17
- package/dist/util/storage.d.ts +23 -2
- package/dist/util/useStorageUploadController.d.ts +3 -3
- package/package.json +62 -48
- package/src/app/AppBar.tsx +18 -0
- package/src/app/Drawer.tsx +24 -0
- package/src/app/Scaffold.tsx +253 -0
- package/src/app/index.ts +4 -0
- package/src/app/useApp.tsx +32 -0
- package/src/components/ArrayContainer.tsx +149 -46
- package/src/components/CircularProgressCenter.tsx +2 -2
- package/src/components/ClearFilterSortButton.tsx +41 -0
- package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +3 -3
- package/src/components/DeleteEntityDialog.tsx +13 -20
- package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +59 -40
- package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +38 -31
- package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +30 -9
- package/src/components/EntityCollectionTable/PropertyTableCell.tsx +47 -39
- package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
- package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +30 -16
- package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +19 -17
- package/src/components/EntityCollectionTable/index.tsx +1 -1
- package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +31 -36
- package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +36 -34
- package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +20 -8
- package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +84 -80
- package/src/components/EntityCollectionView/EntityCollectionView.tsx +209 -113
- package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +4 -2
- package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
- package/src/components/EntityCollectionView/useSelectionController.tsx +20 -7
- package/src/components/EntityCollectionView/utils.ts +19 -0
- package/src/components/EntityJsonPreview.tsx +66 -0
- package/src/components/EntityPreview.tsx +70 -53
- package/src/components/EntityView.tsx +13 -10
- package/src/components/ErrorView.tsx +4 -4
- package/src/components/HomePage/DefaultHomePage.tsx +26 -19
- package/src/components/HomePage/FavouritesView.tsx +6 -11
- package/src/components/HomePage/NavigationCard.tsx +3 -3
- package/src/components/HomePage/NavigationCardBinding.tsx +5 -10
- package/src/components/HomePage/NavigationGroup.tsx +2 -2
- package/src/components/HomePage/SmallNavigationCard.tsx +5 -6
- package/src/components/NotFoundPage.tsx +2 -2
- package/src/components/PropertyConfigBadge.tsx +9 -3
- package/src/components/PropertyIdCopyTooltip.tsx +47 -0
- package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +21 -13
- package/src/components/ReferenceWidget.tsx +21 -11
- package/src/components/SearchIconsView.tsx +10 -7
- package/src/components/SelectableTable/SelectableTable.tsx +27 -12
- package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
- package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +25 -8
- package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +36 -12
- package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +92 -23
- package/src/components/UnsavedChangesDialog.tsx +42 -0
- package/src/components/VirtualTable/VirtualTable.tsx +96 -48
- package/src/components/VirtualTable/VirtualTableCell.tsx +1 -9
- package/src/components/VirtualTable/VirtualTableHeader.tsx +10 -10
- package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
- package/src/components/VirtualTable/VirtualTableProps.tsx +33 -14
- package/src/components/VirtualTable/VirtualTableRow.tsx +5 -6
- package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +5 -5
- package/src/components/VirtualTable/fields/VirtualTableInput.tsx +3 -2
- package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
- package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +16 -28
- package/src/components/VirtualTable/types.tsx +2 -3
- package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +33 -40
- package/src/components/common/index.ts +2 -1
- package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
- package/src/components/common/types.tsx +4 -6
- package/src/components/common/useColumnsIds.tsx +24 -3
- package/src/components/common/useDataSourceTableController.tsx +420 -0
- package/src/components/common/useDebouncedCallback.tsx +20 -0
- package/src/components/common/useScrollRestoration.tsx +68 -0
- package/src/components/common/useTableSearchHelper.ts +53 -12
- package/src/components/index.tsx +4 -2
- package/src/contexts/BreacrumbsContext.tsx +38 -0
- package/src/contexts/DialogsProvider.tsx +5 -4
- package/src/contexts/ModeController.tsx +1 -3
- package/src/contexts/SnackbarProvider.tsx +2 -0
- package/src/core/DefaultAppBar.tsx +219 -0
- package/src/core/DefaultDrawer.tsx +185 -0
- package/src/core/DrawerNavigationItem.tsx +66 -0
- package/src/core/EntityEditView.tsx +388 -478
- package/src/core/EntityEditViewFormActions.tsx +199 -0
- package/src/core/EntitySidePanel.tsx +86 -17
- package/src/core/FireCMS.tsx +67 -59
- package/src/core/FireCMSRouter.tsx +17 -0
- package/src/core/NavigationRoutes.tsx +28 -38
- package/src/core/SideDialogs.tsx +22 -12
- package/src/core/field_configs.tsx +11 -12
- package/src/core/index.tsx +6 -5
- package/src/form/EntityForm.tsx +589 -535
- package/src/form/EntityFormActions.tsx +169 -0
- package/src/form/PropertyFieldBinding.tsx +89 -45
- package/src/form/components/CustomIdField.tsx +6 -2
- package/src/form/components/FieldHelperText.tsx +4 -4
- package/src/form/components/FormEntry.tsx +22 -0
- package/src/form/components/FormLayout.tsx +16 -0
- package/src/form/components/LabelWithIcon.tsx +30 -19
- package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
- package/src/form/components/StorageItemPreview.tsx +22 -12
- package/src/form/components/StorageUploadProgress.tsx +4 -5
- package/src/form/components/index.tsx +3 -1
- package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +34 -19
- package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +47 -35
- package/src/form/field_bindings/BlockFieldBinding.tsx +56 -34
- package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -14
- package/src/form/field_bindings/KeyValueFieldBinding.tsx +61 -52
- package/src/form/field_bindings/MapFieldBinding.tsx +71 -54
- package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +157 -0
- package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +25 -20
- package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +11 -16
- package/src/form/field_bindings/ReferenceFieldBinding.tsx +42 -31
- package/src/form/field_bindings/RepeatFieldBinding.tsx +62 -35
- package/src/form/field_bindings/SelectFieldBinding.tsx +23 -15
- package/src/form/field_bindings/StorageUploadFieldBinding.tsx +47 -52
- package/src/form/field_bindings/SwitchFieldBinding.tsx +29 -24
- package/src/form/field_bindings/TextFieldBinding.tsx +28 -24
- package/src/form/index.tsx +16 -37
- package/src/form/useClearRestoreValue.tsx +2 -2
- package/src/form/validation.ts +13 -23
- package/src/hooks/data/delete.ts +6 -5
- package/src/hooks/data/save.ts +32 -33
- package/src/hooks/data/useCollectionFetch.tsx +3 -3
- package/src/hooks/data/useDataSource.tsx +11 -3
- package/src/hooks/data/useEntityFetch.tsx +10 -6
- package/src/hooks/index.tsx +1 -0
- package/src/hooks/useAuthController.tsx +1 -1
- package/src/hooks/useBreadcrumbsController.tsx +31 -0
- package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
- package/src/hooks/useBuildModeController.tsx +22 -29
- package/src/hooks/useBuildNavigationController.tsx +159 -54
- package/src/hooks/useFireCMSContext.tsx +3 -33
- package/src/hooks/useLargeLayout.tsx +0 -35
- package/src/hooks/useModeController.tsx +1 -2
- package/src/hooks/useProjectLog.tsx +32 -10
- package/src/hooks/useResolvedNavigationFrom.tsx +10 -12
- package/src/hooks/useValidateAuthenticator.tsx +17 -37
- package/src/index.ts +1 -0
- package/src/internal/useBuildDataSource.ts +79 -85
- package/src/internal/useBuildSideDialogsController.tsx +4 -2
- package/src/internal/useBuildSideEntityController.tsx +202 -75
- package/src/internal/useUnsavedChangesDialog.tsx +127 -91
- package/src/preview/PropertyPreview.tsx +20 -25
- package/src/preview/PropertyPreviewProps.tsx +7 -1
- package/src/preview/components/BooleanPreview.tsx +2 -2
- package/src/preview/components/EmptyValue.tsx +1 -1
- package/src/preview/components/EnumValuesChip.tsx +2 -2
- package/src/preview/components/ImagePreview.tsx +25 -36
- package/src/preview/components/ReferencePreview.tsx +22 -33
- package/src/preview/components/StorageThumbnail.tsx +5 -1
- package/src/preview/components/UrlComponentPreview.tsx +60 -28
- package/src/preview/property_previews/ArrayOfMapsPreview.tsx +5 -5
- package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +7 -5
- package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +5 -4
- package/src/preview/property_previews/ArrayOfStringsPreview.tsx +4 -4
- package/src/preview/property_previews/ArrayOneOfPreview.tsx +7 -6
- package/src/preview/property_previews/ArrayPropertyPreview.tsx +7 -6
- package/src/preview/property_previews/MapPropertyPreview.tsx +12 -11
- package/src/preview/property_previews/SkeletonPropertyComponent.tsx +12 -12
- package/src/preview/property_previews/StringPropertyPreview.tsx +3 -3
- package/src/preview/util.ts +10 -10
- package/src/routes/CustomCMSRoute.tsx +21 -0
- package/src/routes/FireCMSRoute.tsx +235 -0
- package/src/routes/HomePageRoute.tsx +17 -0
- package/src/types/auth.tsx +9 -13
- package/src/types/collections.ts +96 -27
- package/src/types/customization_controller.tsx +0 -1
- package/src/types/datasource.ts +61 -43
- package/src/types/dialogs_controller.tsx +7 -3
- package/src/types/entities.ts +12 -2
- package/src/types/entity_actions.tsx +32 -7
- package/src/types/entity_callbacks.ts +18 -18
- package/src/types/entity_overrides.tsx +2 -2
- package/src/types/export_import.ts +4 -4
- package/src/types/fields.tsx +85 -46
- package/src/types/firecms.tsx +7 -2
- package/src/types/firecms_context.tsx +1 -1
- package/src/types/index.ts +0 -1
- package/src/types/navigation.ts +38 -18
- package/src/types/permissions.ts +5 -5
- package/src/types/plugins.tsx +26 -14
- package/src/types/properties.ts +87 -26
- package/src/types/property_config.tsx +0 -2
- package/src/types/side_dialogs_controller.tsx +15 -0
- package/src/types/side_entity_controller.tsx +6 -1
- package/src/types/storage.ts +94 -3
- package/src/types/user.ts +2 -0
- package/src/util/builders.ts +10 -8
- package/src/util/createFormexStub.tsx +62 -0
- package/src/util/entities.ts +9 -6
- package/src/util/entity_actions.ts +28 -0
- package/src/util/entity_cache.ts +204 -0
- package/src/util/enums.ts +1 -1
- package/src/util/icon_list.ts +16 -10
- package/src/util/icon_synonyms.ts +3 -100
- package/src/util/icons.tsx +17 -7
- package/src/util/index.ts +2 -0
- package/src/util/join_collections.ts +6 -1
- package/src/util/make_properties_editable.ts +13 -5
- package/src/util/navigation_from_path.ts +13 -6
- package/src/util/navigation_utils.ts +59 -7
- package/src/util/objects.ts +52 -28
- package/src/util/parent_references_from_path.ts +3 -3
- package/src/util/permissions.ts +9 -8
- package/src/util/plurals.ts +0 -2
- package/src/util/property_utils.tsx +17 -6
- package/src/util/references.ts +19 -8
- package/src/util/resolutions.ts +110 -48
- package/src/util/storage.ts +79 -21
- package/src/util/strings.ts +2 -2
- package/src/util/useStorageUploadController.tsx +91 -28
- package/dist/components/FireCMSAppBar.d.ts +0 -26
- package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
- package/dist/components/VirtualTable/common.d.ts +0 -2
- package/dist/core/Drawer.d.ts +0 -23
- package/dist/core/Scaffold.d.ts +0 -55
- package/dist/core/SideEntityView.d.ts +0 -7
- package/dist/form/components/FormikArrayContainer.d.ts +0 -18
- package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
- package/dist/internal/useBuildCustomizationController.d.ts +0 -2
- package/dist/internal/useLocaleConfig.d.ts +0 -1
- package/dist/types/appcheck.d.ts +0 -26
- package/src/components/FireCMSAppBar.tsx +0 -165
- package/src/components/PropertyIdCopyTooltipContent.tsx +0 -28
- package/src/components/common/useDataSourceEntityCollectionTableController.tsx +0 -225
- package/src/core/Drawer.tsx +0 -191
- package/src/core/Scaffold.tsx +0 -281
- package/src/core/SideEntityView.tsx +0 -38
- package/src/form/components/FormikArrayContainer.tsx +0 -44
- package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -695
- package/src/internal/useBuildCustomizationController.tsx +0 -5
- package/src/internal/useLocaleConfig.tsx +0 -18
- package/src/types/appcheck.ts +0 -29
- /package/src/util/{common.tsx → common.ts} +0 -0
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
EntityCollection,
|
|
10
10
|
EntityCollectionsBuilder,
|
|
11
11
|
EntityReference,
|
|
12
|
+
NavigationBlocker,
|
|
12
13
|
NavigationController,
|
|
13
14
|
PermissionsBuilder,
|
|
14
15
|
TopNavigationEntry,
|
|
@@ -20,19 +21,21 @@ import {
|
|
|
20
21
|
applyPermissionsFunctionIfEmpty,
|
|
21
22
|
getCollectionByPathOrId,
|
|
22
23
|
mergeDeep,
|
|
24
|
+
removeFunctions,
|
|
23
25
|
removeInitialAndTrailingSlashes,
|
|
24
26
|
resolveCollectionPathIds,
|
|
25
27
|
resolvePermissions
|
|
26
28
|
} from "../util";
|
|
27
29
|
import { getParentReferencesFromPath } from "../util/parent_references_from_path";
|
|
30
|
+
import { useBlocker, useNavigate } from "react-router-dom";
|
|
28
31
|
|
|
29
32
|
const DEFAULT_BASE_PATH = "/";
|
|
30
33
|
const DEFAULT_COLLECTION_PATH = "/c";
|
|
31
34
|
|
|
32
|
-
type BuildNavigationContextProps<EC extends EntityCollection,
|
|
35
|
+
export type BuildNavigationContextProps<EC extends EntityCollection, USER extends User> = {
|
|
33
36
|
basePath?: string,
|
|
34
37
|
baseCollectionPath?: string,
|
|
35
|
-
authController: AuthController<
|
|
38
|
+
authController: AuthController<USER>;
|
|
36
39
|
collections?: EC[] | EntityCollectionsBuilder<EC>;
|
|
37
40
|
collectionPermissions?: PermissionsBuilder;
|
|
38
41
|
views?: CMSView[] | CMSViewsBuilder;
|
|
@@ -48,9 +51,14 @@ type BuildNavigationContextProps<EC extends EntityCollection, UserType extends U
|
|
|
48
51
|
* @param collections
|
|
49
52
|
*/
|
|
50
53
|
injectCollections?: (collections: EntityCollection[]) => EntityCollection[];
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* If true, the navigation logic will not be updated until this flag is false
|
|
57
|
+
*/
|
|
58
|
+
disabled?: boolean;
|
|
51
59
|
};
|
|
52
60
|
|
|
53
|
-
export function useBuildNavigationController<EC extends EntityCollection,
|
|
61
|
+
export function useBuildNavigationController<EC extends EntityCollection, USER extends User>(props: BuildNavigationContextProps<EC, USER>): NavigationController {
|
|
54
62
|
const {
|
|
55
63
|
basePath = DEFAULT_BASE_PATH,
|
|
56
64
|
baseCollectionPath = DEFAULT_COLLECTION_PATH,
|
|
@@ -62,9 +70,12 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
|
|
|
62
70
|
viewsOrder,
|
|
63
71
|
userConfigPersistence,
|
|
64
72
|
dataSourceDelegate,
|
|
65
|
-
injectCollections
|
|
73
|
+
injectCollections,
|
|
74
|
+
disabled
|
|
66
75
|
} = props;
|
|
67
76
|
|
|
77
|
+
const navigate = useNavigate();
|
|
78
|
+
|
|
68
79
|
const collectionsRef = useRef<EntityCollection[] | undefined>();
|
|
69
80
|
const viewsRef = useRef<CMSView[] | undefined>();
|
|
70
81
|
const adminViewsRef = useRef<CMSView[] | undefined>();
|
|
@@ -130,6 +141,30 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
|
|
|
130
141
|
.filter(Boolean) as TopNavigationEntry[]
|
|
131
142
|
];
|
|
132
143
|
|
|
144
|
+
// Sort by group, entries with group "Admin" will go last, and second to last will be the group "Views"
|
|
145
|
+
navigationEntries = navigationEntries.sort((a, b) => {
|
|
146
|
+
if (a.group !== "Views" && a.group !== "Admin" && (b.group === "Views" || b.group === "Admin")) {
|
|
147
|
+
return -1;
|
|
148
|
+
}
|
|
149
|
+
if (b.group !== "Views" && b.group !== "Admin" && (a.group === "Views" || a.group === "Admin")) {
|
|
150
|
+
return 1;
|
|
151
|
+
}
|
|
152
|
+
if (a.group === "Admin" && b.group !== "Admin") {
|
|
153
|
+
return 1;
|
|
154
|
+
}
|
|
155
|
+
if (a.group !== "Admin" && b.group === "Admin") {
|
|
156
|
+
return -1;
|
|
157
|
+
}
|
|
158
|
+
if (a.group === "Views" && b.group !== "Views") {
|
|
159
|
+
return -1;
|
|
160
|
+
}
|
|
161
|
+
if (a.group !== "Views" && b.group === "Views") {
|
|
162
|
+
return 1;
|
|
163
|
+
}
|
|
164
|
+
return 0;
|
|
165
|
+
|
|
166
|
+
});
|
|
167
|
+
|
|
133
168
|
if (viewsOrder) {
|
|
134
169
|
navigationEntries = navigationEntries.sort((a, b) => {
|
|
135
170
|
const aIndex = viewsOrder.indexOf(a.path);
|
|
@@ -160,13 +195,13 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
|
|
|
160
195
|
|
|
161
196
|
const refreshNavigation = useCallback(async () => {
|
|
162
197
|
|
|
163
|
-
if (authController.initialLoading)
|
|
198
|
+
if (disabled || authController.initialLoading)
|
|
164
199
|
return;
|
|
165
200
|
|
|
201
|
+
console.debug("Refreshing navigation");
|
|
202
|
+
|
|
166
203
|
try {
|
|
167
|
-
|
|
168
|
-
authController
|
|
169
|
-
})
|
|
204
|
+
|
|
170
205
|
const [resolvedCollections = [], resolvedViews, resolvedAdminViews = []] = await Promise.all([
|
|
171
206
|
resolveCollections(collectionsProp, collectionPermissions, authController, dataSourceDelegate, injectCollections),
|
|
172
207
|
resolveCMSViews(viewsProp, authController, dataSourceDelegate),
|
|
@@ -174,30 +209,45 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
|
|
|
174
209
|
]
|
|
175
210
|
);
|
|
176
211
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
212
|
+
let shouldUpdateTopLevelNav = false;
|
|
213
|
+
if (!areCollectionListsEqual(collectionsRef.current ?? [], resolvedCollections)) {
|
|
214
|
+
collectionsRef.current = resolvedCollections;
|
|
215
|
+
console.debug("Collections have changed", resolvedCollections);
|
|
216
|
+
shouldUpdateTopLevelNav = true;
|
|
217
|
+
}
|
|
218
|
+
if (collectionsRef.current === undefined) {
|
|
183
219
|
collectionsRef.current = resolvedCollections;
|
|
220
|
+
shouldUpdateTopLevelNav = true;
|
|
221
|
+
}
|
|
222
|
+
if (!equal(viewsRef.current, resolvedViews)) {
|
|
184
223
|
viewsRef.current = resolvedViews;
|
|
224
|
+
shouldUpdateTopLevelNav = true;
|
|
225
|
+
}
|
|
226
|
+
if (!equal(adminViewsRef.current, resolvedAdminViews)) {
|
|
185
227
|
adminViewsRef.current = resolvedAdminViews;
|
|
186
|
-
|
|
228
|
+
shouldUpdateTopLevelNav = true;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
const computedTopLevelNav = computeTopNavigation(resolvedCollections, resolvedViews, resolvedAdminViews, viewsOrder);
|
|
232
|
+
if (shouldUpdateTopLevelNav && !equal(topLevelNavigation, computedTopLevelNav)) {
|
|
233
|
+
setTopLevelNavigation(computedTopLevelNav);
|
|
187
234
|
}
|
|
188
235
|
} catch (e) {
|
|
189
236
|
console.error(e);
|
|
190
237
|
setNavigationLoadingError(e as any);
|
|
191
238
|
}
|
|
192
239
|
|
|
193
|
-
|
|
194
|
-
|
|
240
|
+
if (navigationLoading)
|
|
241
|
+
setNavigationLoading(false);
|
|
242
|
+
if (!initialised)
|
|
243
|
+
setInitialised(true);
|
|
195
244
|
|
|
196
245
|
}, [
|
|
197
246
|
collectionsProp,
|
|
198
247
|
collectionPermissions,
|
|
199
248
|
authController.user,
|
|
200
249
|
authController.initialLoading,
|
|
250
|
+
disabled,
|
|
201
251
|
viewsProp,
|
|
202
252
|
adminViewsProp,
|
|
203
253
|
computeTopNavigation,
|
|
@@ -210,7 +260,6 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
|
|
|
210
260
|
|
|
211
261
|
const getCollection = useCallback((
|
|
212
262
|
idOrPath: string,
|
|
213
|
-
entityId?: string,
|
|
214
263
|
includeUserOverride = false
|
|
215
264
|
): EC | undefined => {
|
|
216
265
|
const collections = collectionsRef.current;
|
|
@@ -220,8 +269,7 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
|
|
|
220
269
|
const baseCollection = getCollectionByPathOrId(removeInitialAndTrailingSlashes(idOrPath), collections);
|
|
221
270
|
|
|
222
271
|
const userOverride = includeUserOverride ? userConfigPersistence?.getCollectionConfig(idOrPath) : undefined;
|
|
223
|
-
|
|
224
|
-
const overriddenCollection = baseCollection ? mergeDeep(baseCollection, userOverride) : undefined;
|
|
272
|
+
const overriddenCollection = baseCollection ? mergeDeep(baseCollection, userOverride ?? {}) : undefined;
|
|
225
273
|
|
|
226
274
|
let result: Partial<EntityCollection> | undefined = overriddenCollection;
|
|
227
275
|
|
|
@@ -246,9 +294,9 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
|
|
|
246
294
|
const getCollectionFromPaths = useCallback(<EC extends EntityCollection>(pathSegments: string[]): EC | undefined => {
|
|
247
295
|
|
|
248
296
|
const collections = collectionsRef.current;
|
|
297
|
+
if (collections === undefined)
|
|
298
|
+
throw Error("getCollectionFromPaths: Collections have not been initialised yet");
|
|
249
299
|
let currentCollections: EntityCollection[] | undefined = [...(collections ?? [])];
|
|
250
|
-
if (!currentCollections)
|
|
251
|
-
throw Error("Collections have not been initialised yet");
|
|
252
300
|
|
|
253
301
|
for (let i = 0; i < pathSegments.length; i++) {
|
|
254
302
|
const pathSegment = pathSegments[i];
|
|
@@ -267,9 +315,9 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
|
|
|
267
315
|
const getCollectionFromIds = useCallback(<EC extends EntityCollection>(ids: string[]): EC | undefined => {
|
|
268
316
|
|
|
269
317
|
const collections = collectionsRef.current;
|
|
318
|
+
if (collections === undefined)
|
|
319
|
+
throw Error("getCollectionFromIds: Collections have not been initialised yet");
|
|
270
320
|
let currentCollections: EntityCollection[] | undefined = [...(collections ?? [])];
|
|
271
|
-
if (!currentCollections)
|
|
272
|
-
throw Error("Collections have not been initialised yet");
|
|
273
321
|
|
|
274
322
|
for (let i = 0; i < ids.length; i++) {
|
|
275
323
|
const id = ids[i];
|
|
@@ -295,19 +343,8 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
|
|
|
295
343
|
throw Error("Expected path starting with " + fullCollectionPath);
|
|
296
344
|
}, [fullCollectionPath]);
|
|
297
345
|
|
|
298
|
-
const
|
|
299
|
-
|
|
300
|
-
}: {
|
|
301
|
-
path: string
|
|
302
|
-
}): string => {
|
|
303
|
-
return `s/edit/${encodePath(path)}`;
|
|
304
|
-
},
|
|
305
|
-
[]);
|
|
306
|
-
|
|
307
|
-
const resolveAliasesFrom = useCallback((path: string): string => {
|
|
308
|
-
const collections = collectionsRef.current;
|
|
309
|
-
if (!collections)
|
|
310
|
-
throw Error("Collections have not been initialised yet");
|
|
346
|
+
const resolveIdsFrom = useCallback((path: string): string => {
|
|
347
|
+
const collections = collectionsRef.current ?? [];
|
|
311
348
|
return resolveCollectionPathIds(path, collections);
|
|
312
349
|
}, []);
|
|
313
350
|
|
|
@@ -366,24 +403,16 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
|
|
|
366
403
|
isUrlCollectionPath,
|
|
367
404
|
urlPathToDataPath,
|
|
368
405
|
buildUrlCollectionPath,
|
|
369
|
-
|
|
370
|
-
buildCMSUrlPath,
|
|
371
|
-
resolveAliasesFrom,
|
|
406
|
+
resolveIdsFrom,
|
|
372
407
|
topLevelNavigation,
|
|
373
408
|
refreshNavigation,
|
|
374
409
|
getParentReferencesFromPath: getAllParentReferencesForPath,
|
|
375
410
|
getParentCollectionIds,
|
|
376
|
-
convertIdsToPaths
|
|
411
|
+
convertIdsToPaths,
|
|
412
|
+
navigate,
|
|
377
413
|
};
|
|
378
414
|
}
|
|
379
415
|
|
|
380
|
-
export function getSidePanelKey(path: string, entityId?: string) {
|
|
381
|
-
if (entityId)
|
|
382
|
-
return `${removeInitialAndTrailingSlashes(path)}/${removeInitialAndTrailingSlashes(entityId)}`;
|
|
383
|
-
else
|
|
384
|
-
return removeInitialAndTrailingSlashes(path);
|
|
385
|
-
}
|
|
386
|
-
|
|
387
416
|
function encodePath(input: string) {
|
|
388
417
|
return encodeURIComponent(removeInitialAndTrailingSlashes(input))
|
|
389
418
|
.replaceAll("%2F", "/")
|
|
@@ -392,9 +421,10 @@ function encodePath(input: string) {
|
|
|
392
421
|
|
|
393
422
|
function filterOutNotAllowedCollections(resolvedCollections: EntityCollection[], authController: AuthController<User>): EntityCollection[] {
|
|
394
423
|
return resolvedCollections
|
|
424
|
+
.filter((c) => Boolean(c.path))
|
|
395
425
|
.filter((c) => {
|
|
396
426
|
if (!c.permissions) return true;
|
|
397
|
-
const resolvedPermissions = resolvePermissions(c, authController, c.path, null)
|
|
427
|
+
const resolvedPermissions = resolvePermissions(c, authController, c.path, null);
|
|
398
428
|
return resolvedPermissions?.read !== false;
|
|
399
429
|
})
|
|
400
430
|
.map((c) => {
|
|
@@ -410,7 +440,7 @@ async function resolveCollections(collections: undefined | EntityCollection[] |
|
|
|
410
440
|
collectionPermissions: PermissionsBuilder | undefined,
|
|
411
441
|
authController: AuthController,
|
|
412
442
|
dataSource: DataSourceDelegate,
|
|
413
|
-
injectCollections?: (collections: EntityCollection[]) => EntityCollection[]) {
|
|
443
|
+
injectCollections?: (collections: EntityCollection[]) => EntityCollection[]): Promise<EntityCollection[]> {
|
|
414
444
|
let resolvedCollections: EntityCollection[] = [];
|
|
415
445
|
if (typeof collections === "function") {
|
|
416
446
|
resolvedCollections = await collections({
|
|
@@ -422,14 +452,12 @@ async function resolveCollections(collections: undefined | EntityCollection[] |
|
|
|
422
452
|
resolvedCollections = collections;
|
|
423
453
|
}
|
|
424
454
|
|
|
425
|
-
resolvedCollections = applyPermissionsFunctionIfEmpty(resolvedCollections, collectionPermissions);
|
|
426
|
-
|
|
427
|
-
resolvedCollections = filterOutNotAllowedCollections(resolvedCollections, authController);
|
|
428
|
-
|
|
429
455
|
if (injectCollections) {
|
|
430
456
|
resolvedCollections = injectCollections(resolvedCollections ?? []);
|
|
431
457
|
}
|
|
432
458
|
|
|
459
|
+
resolvedCollections = applyPermissionsFunctionIfEmpty(resolvedCollections, collectionPermissions);
|
|
460
|
+
resolvedCollections = filterOutNotAllowedCollections(resolvedCollections, authController);
|
|
433
461
|
return resolvedCollections;
|
|
434
462
|
}
|
|
435
463
|
|
|
@@ -454,3 +482,80 @@ function getGroup(collectionOrView: EntityCollection<any, any> | CMSView) {
|
|
|
454
482
|
}
|
|
455
483
|
return trimmed ?? "Views";
|
|
456
484
|
}
|
|
485
|
+
|
|
486
|
+
function areCollectionListsEqual(a: EntityCollection[], b: EntityCollection[]) {
|
|
487
|
+
if (a.length !== b.length) {
|
|
488
|
+
return false;
|
|
489
|
+
}
|
|
490
|
+
const aCopy = [...a];
|
|
491
|
+
const bCopy = [...b];
|
|
492
|
+
const aSorted = aCopy.sort((x, y) => x.id.localeCompare(y.id));
|
|
493
|
+
const bSorted = bCopy.sort((x, y) => x.id.localeCompare(y.id));
|
|
494
|
+
return aSorted.every((value, index) => areCollectionsEqual(value, bSorted[index]));
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
function areCollectionsEqual(a: EntityCollection, b: EntityCollection) {
|
|
498
|
+
const {
|
|
499
|
+
subcollections: subcollectionsA,
|
|
500
|
+
...restA
|
|
501
|
+
} = a;
|
|
502
|
+
const {
|
|
503
|
+
subcollections: subcollectionsB,
|
|
504
|
+
...restB
|
|
505
|
+
} = b;
|
|
506
|
+
if (!areCollectionListsEqual(subcollectionsA ?? [], subcollectionsB ?? [])) {
|
|
507
|
+
return false;
|
|
508
|
+
}
|
|
509
|
+
return equal(removeFunctions(restA), removeFunctions(restB));
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
function useCustomBlocker(): NavigationBlocker {
|
|
513
|
+
const [blockListeners, setBlockListeners] = useState<Record<string, {
|
|
514
|
+
block: boolean,
|
|
515
|
+
basePath?: string
|
|
516
|
+
}>>({});
|
|
517
|
+
|
|
518
|
+
const shouldBlock = Object.values(blockListeners).some(b => b.block);
|
|
519
|
+
|
|
520
|
+
let blocker: any;
|
|
521
|
+
try {
|
|
522
|
+
blocker = useBlocker(({
|
|
523
|
+
nextLocation
|
|
524
|
+
}) => {
|
|
525
|
+
const allBasePaths = Object.values(blockListeners).map(b => b.basePath).filter(Boolean) as string[];
|
|
526
|
+
if (allBasePaths && allBasePaths.some(path => nextLocation.pathname.startsWith(path)))
|
|
527
|
+
return false;
|
|
528
|
+
return shouldBlock;
|
|
529
|
+
});
|
|
530
|
+
} catch (e) {
|
|
531
|
+
// console.warn("Blocker not available, navigation will not be blocked");
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
const updateBlockListener = (path: string, block: boolean, basePath?: string) => {
|
|
535
|
+
setBlockListeners(prev => ({
|
|
536
|
+
...prev,
|
|
537
|
+
[path]: {
|
|
538
|
+
block,
|
|
539
|
+
basePath
|
|
540
|
+
}
|
|
541
|
+
}));
|
|
542
|
+
return () => setBlockListeners(prev => {
|
|
543
|
+
const {
|
|
544
|
+
[path]: removed,
|
|
545
|
+
...rest
|
|
546
|
+
} = prev;
|
|
547
|
+
return rest;
|
|
548
|
+
})
|
|
549
|
+
};
|
|
550
|
+
|
|
551
|
+
const isBlocked = (path: string) => {
|
|
552
|
+
return (blockListeners[path]?.block ?? false) && blocker?.state === "blocked";
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
return {
|
|
556
|
+
updateBlockListener,
|
|
557
|
+
isBlocked,
|
|
558
|
+
proceed: blocker?.proceed,
|
|
559
|
+
reset: blocker?.reset
|
|
560
|
+
}
|
|
561
|
+
}
|
|
@@ -21,9 +21,9 @@ import React, { useEffect } from "react";
|
|
|
21
21
|
* @see FireCMSContext
|
|
22
22
|
* @group Hooks and utilities
|
|
23
23
|
*/
|
|
24
|
-
export const useFireCMSContext = <
|
|
24
|
+
export const useFireCMSContext = <USER extends User = User, AuthControllerType extends AuthController<USER> = AuthController<USER>>(): FireCMSContext<USER, AuthControllerType> => {
|
|
25
25
|
|
|
26
|
-
const authController = useAuthController<
|
|
26
|
+
const authController = useAuthController<USER, AuthControllerType>();
|
|
27
27
|
const sideDialogsController = useSideDialogsController();
|
|
28
28
|
const sideEntityController = useSideEntityController();
|
|
29
29
|
const navigation = useNavigationController();
|
|
@@ -35,7 +35,7 @@ export const useFireCMSContext = <UserType extends User = User, AuthControllerTy
|
|
|
35
35
|
const customizationController = useCustomizationController();
|
|
36
36
|
const analyticsController = useAnalyticsController();
|
|
37
37
|
|
|
38
|
-
const fireCMSContextRef = React.useRef<FireCMSContext<
|
|
38
|
+
const fireCMSContextRef = React.useRef<FireCMSContext<USER, AuthControllerType>>({
|
|
39
39
|
authController,
|
|
40
40
|
sideDialogsController,
|
|
41
41
|
sideEntityController,
|
|
@@ -67,33 +67,3 @@ export const useFireCMSContext = <UserType extends User = User, AuthControllerTy
|
|
|
67
67
|
|
|
68
68
|
return fireCMSContextRef.current;
|
|
69
69
|
}
|
|
70
|
-
|
|
71
|
-
// export const useFireCMSContext = <UserType extends User = User, AuthControllerType extends AuthController<UserType> = AuthController<UserType>>(): FireCMSContext<UserType, AuthControllerType> => {
|
|
72
|
-
//
|
|
73
|
-
// const authController = useAuthController<UserType, AuthControllerType>();
|
|
74
|
-
// const sideDialogsController = useSideDialogsController();
|
|
75
|
-
// const sideEntityController = useSideEntityController();
|
|
76
|
-
// const navigation = useNavigationController();
|
|
77
|
-
// const dataSource = useDataSource();
|
|
78
|
-
// const storageSource = useStorageSource();
|
|
79
|
-
// const snackbarController = useSnackbarController();
|
|
80
|
-
// const userConfigPersistence = useUserConfigurationPersistence();
|
|
81
|
-
// const dialogsController = useDialogsController();
|
|
82
|
-
// const customizationController = useCustomizationController();
|
|
83
|
-
// const analyticsController = useAnalyticsController();
|
|
84
|
-
//
|
|
85
|
-
// return {
|
|
86
|
-
// authController,
|
|
87
|
-
// sideDialogsController,
|
|
88
|
-
// sideEntityController,
|
|
89
|
-
// navigation,
|
|
90
|
-
// dataSource,
|
|
91
|
-
// storageSource,
|
|
92
|
-
// snackbarController,
|
|
93
|
-
// userConfigPersistence,
|
|
94
|
-
// dialogsController,
|
|
95
|
-
// customizationController,
|
|
96
|
-
// analyticsController
|
|
97
|
-
// };
|
|
98
|
-
//
|
|
99
|
-
// };
|
|
@@ -63,38 +63,3 @@ function checkLargeLayout(breakpoint: "xs" | "sm" | "md" | "lg" | "xl" | "2xl" |
|
|
|
63
63
|
return false;
|
|
64
64
|
return window.matchMedia(`(min-width: ${breakpoints[breakpoint] + 1}px)`).matches;
|
|
65
65
|
}
|
|
66
|
-
|
|
67
|
-
// import { useEffect, useState } from "react";
|
|
68
|
-
//
|
|
69
|
-
// const breakpoints = {
|
|
70
|
-
// xs: 0,
|
|
71
|
-
// sm: 640,
|
|
72
|
-
// md: 768,
|
|
73
|
-
// lg: 1024,
|
|
74
|
-
// xl: 1280,
|
|
75
|
-
// "2xl": 1536,
|
|
76
|
-
// "3xl": 1920
|
|
77
|
-
// }
|
|
78
|
-
// export const useLargeLayout = (breakpoint: "xs" | "sm" | "md" | "lg" | "xl" | "2xl" | "3xl" = "lg"): boolean => {
|
|
79
|
-
// const [isLargeLayout, setIsLargeLayout] = useState<boolean>(false);
|
|
80
|
-
//
|
|
81
|
-
// useEffect(() => {
|
|
82
|
-
// const handleResize = () => {
|
|
83
|
-
// const matched = window.matchMedia(`(min-width: ${breakpoints[breakpoint] + 1}px)`).matches;
|
|
84
|
-
// setIsLargeLayout(matched);
|
|
85
|
-
// };
|
|
86
|
-
//
|
|
87
|
-
// // Set initial state
|
|
88
|
-
// handleResize();
|
|
89
|
-
//
|
|
90
|
-
// // Set up event listener for resize events
|
|
91
|
-
// window.addEventListener("resize", handleResize);
|
|
92
|
-
//
|
|
93
|
-
// // Clean up event listener when component unmounts
|
|
94
|
-
// return () => {
|
|
95
|
-
// window.removeEventListener("resize", handleResize);
|
|
96
|
-
// };
|
|
97
|
-
// }, []);
|
|
98
|
-
//
|
|
99
|
-
// return isLargeLayout;
|
|
100
|
-
// };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useEffect, useRef, useState } from "react";
|
|
2
|
-
import { AuthController, FireCMSPlugin } from "../types";
|
|
2
|
+
import { AuthController, DataSourceDelegate, FireCMSPlugin } from "../types";
|
|
3
3
|
|
|
4
4
|
export const DEFAULT_SERVER_DEV = "https://api-kdoe6pj3qq-ey.a.run.app";
|
|
5
5
|
export const DEFAULT_SERVER = "https://api-drplyi3b6q-ey.a.run.app";
|
|
@@ -9,33 +9,55 @@ export type AccessResponse = {
|
|
|
9
9
|
message?: string;
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
async function makeRequest(authController: AuthController, pluginKeys: string | undefined) {
|
|
13
|
-
|
|
12
|
+
async function makeRequest(authController: AuthController, dataSourceKey: string, pluginKeys: string[] | undefined, apiKey?: string): Promise<AccessResponse> {
|
|
13
|
+
let idToken: string | null;
|
|
14
|
+
try {
|
|
15
|
+
idToken = await authController.getAuthToken();
|
|
16
|
+
} catch (e) {
|
|
17
|
+
idToken = null;
|
|
18
|
+
}
|
|
14
19
|
return fetch(DEFAULT_SERVER + "/access_log",
|
|
15
20
|
{
|
|
16
21
|
// mode: "no-cors",
|
|
17
22
|
method: "POST",
|
|
18
23
|
headers: {
|
|
19
24
|
"Content-Type": "application/json",
|
|
20
|
-
Authorization: `Basic ${
|
|
25
|
+
Authorization: `Basic ${idToken}`
|
|
21
26
|
},
|
|
22
|
-
body: JSON.stringify({
|
|
27
|
+
body: JSON.stringify({
|
|
28
|
+
apiKey,
|
|
29
|
+
email: authController.user?.email ?? null,
|
|
30
|
+
datasource: dataSourceKey,
|
|
31
|
+
plugins: pluginKeys
|
|
32
|
+
})
|
|
23
33
|
})
|
|
24
34
|
.then(async (res) => {
|
|
25
35
|
return res.json();
|
|
26
36
|
});
|
|
27
37
|
}
|
|
28
38
|
|
|
29
|
-
export
|
|
30
|
-
|
|
39
|
+
export interface UseProjectLogParams {
|
|
40
|
+
apiKey?: string;
|
|
41
|
+
authController: AuthController;
|
|
42
|
+
dataSourceDelegate: DataSourceDelegate;
|
|
43
|
+
plugins?: FireCMSPlugin<any, any, any>[];
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function useProjectLog({
|
|
47
|
+
authController,
|
|
48
|
+
dataSourceDelegate,
|
|
49
|
+
plugins,
|
|
50
|
+
apiKey
|
|
51
|
+
}: UseProjectLogParams): AccessResponse | null {
|
|
31
52
|
const [accessResponse, setAccessResponse] = useState<AccessResponse | null>(null);
|
|
32
53
|
const accessedUserRef = useRef<string | null>(null);
|
|
33
|
-
const
|
|
54
|
+
const dataSourceKey = dataSourceDelegate.key;
|
|
55
|
+
const pluginKeys = plugins?.map(plugin => plugin.key);
|
|
34
56
|
useEffect(() => {
|
|
35
57
|
if (authController.user && authController.user.uid !== accessedUserRef.current && !authController.initialLoading) {
|
|
36
|
-
makeRequest(authController, pluginKeys).then(setAccessResponse);
|
|
58
|
+
makeRequest(authController, dataSourceKey, pluginKeys, apiKey).then(setAccessResponse);
|
|
37
59
|
accessedUserRef.current = authController.user.uid;
|
|
38
60
|
}
|
|
39
|
-
}, [authController]);
|
|
61
|
+
}, [authController, dataSourceKey, pluginKeys]);
|
|
40
62
|
return accessResponse;
|
|
41
63
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Entity, EntityCollection, EntityCustomView, FireCMSContext, User } from "../types";
|
|
2
2
|
import { useEffect, useState } from "react";
|
|
3
|
-
import {
|
|
3
|
+
import { getNavigationEntriesFromPath } from "../util/navigation_from_path";
|
|
4
4
|
import { useFireCMSContext } from "./useFireCMSContext";
|
|
5
5
|
|
|
6
6
|
/**
|
|
@@ -55,22 +55,22 @@ interface ResolvedNavigationEntityCustom<M extends Record<string, any>> {
|
|
|
55
55
|
* @param context
|
|
56
56
|
* @group Hooks and utilities
|
|
57
57
|
*/
|
|
58
|
-
export function resolveNavigationFrom<M extends Record<string, any>,
|
|
58
|
+
export function resolveNavigationFrom<M extends Record<string, any>, USER extends User>({
|
|
59
59
|
path,
|
|
60
60
|
context
|
|
61
61
|
}: {
|
|
62
62
|
path: string,
|
|
63
|
-
context: FireCMSContext<
|
|
63
|
+
context: FireCMSContext<USER>
|
|
64
64
|
}): Promise<ResolvedNavigationEntry<M>[]> {
|
|
65
65
|
|
|
66
66
|
const dataSource = context.dataSource;
|
|
67
67
|
const navigation = context.navigation;
|
|
68
68
|
|
|
69
69
|
if (!navigation) {
|
|
70
|
-
throw Error("Calling
|
|
70
|
+
throw Error("Calling resolveNavigationFrom, but main navigation has not yet been initialised");
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
-
const navigationEntries =
|
|
73
|
+
const navigationEntries = getNavigationEntriesFromPath({
|
|
74
74
|
path,
|
|
75
75
|
collections: navigation.collections ?? []
|
|
76
76
|
});
|
|
@@ -80,7 +80,7 @@ export function resolveNavigationFrom<M extends Record<string, any>, UserType ex
|
|
|
80
80
|
if (entry.type === "collection") {
|
|
81
81
|
return Promise.resolve(entry);
|
|
82
82
|
} else if (entry.type === "entity") {
|
|
83
|
-
const collection = navigation.getCollection(entry.path
|
|
83
|
+
const collection = navigation.getCollection(entry.path);
|
|
84
84
|
if (!collection) {
|
|
85
85
|
throw Error(`No collection defined in the navigation for the entity with path ${entry.path}`);
|
|
86
86
|
}
|
|
@@ -126,12 +126,12 @@ export interface NavigationFrom<M extends Record<string, any>> {
|
|
|
126
126
|
* in any React component that lives under `FireCMS`
|
|
127
127
|
* @group Hooks and utilities
|
|
128
128
|
*/
|
|
129
|
-
export function useResolvedNavigationFrom<M extends Record<string, any>,
|
|
129
|
+
export function useResolvedNavigationFrom<M extends Record<string, any>, USER extends User>(
|
|
130
130
|
{
|
|
131
131
|
path
|
|
132
132
|
}: NavigationFromProps): NavigationFrom<M> {
|
|
133
133
|
|
|
134
|
-
const context: FireCMSContext<
|
|
134
|
+
const context: FireCMSContext<USER> = useFireCMSContext();
|
|
135
135
|
|
|
136
136
|
const [data, setData] = useState<ResolvedNavigationEntry<M>[] | undefined>();
|
|
137
137
|
const [dataLoading, setDataLoading] = useState<boolean>(false);
|
|
@@ -142,10 +142,8 @@ export function useResolvedNavigationFrom<M extends Record<string, any>, UserTyp
|
|
|
142
142
|
if (navigation) {
|
|
143
143
|
setDataLoading(true);
|
|
144
144
|
setDataLoadingError(undefined);
|
|
145
|
-
resolveNavigationFrom<M,
|
|
146
|
-
.then(
|
|
147
|
-
setData(res);
|
|
148
|
-
})
|
|
145
|
+
resolveNavigationFrom<M, USER>({ path, context })
|
|
146
|
+
.then(setData)
|
|
149
147
|
.catch((e) => setDataLoadingError(e))
|
|
150
148
|
.finally(() => setDataLoading(false));
|
|
151
149
|
}
|