@firecms/core 3.0.0-canary.24 → 3.0.0-canary.240
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 +20 -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 +8 -5
- 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 +14 -4
- 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 +5 -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 +40 -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 -12
- 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 +21573 -13895
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +24361 -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 +97 -23
- 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 +36 -14
- package/dist/types/permissions.d.ts +4 -4
- package/dist/types/plugins.d.ts +36 -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 +10 -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/callbacks.d.ts +2 -0
- 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 +3 -0
- package/dist/util/navigation_from_path.d.ts +6 -1
- package/dist/util/navigation_utils.d.ts +15 -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} +11 -11
- 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 +48 -40
- 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 +32 -37
- 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 +229 -117
- 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 +80 -59
- package/src/components/EntityView.tsx +13 -10
- package/src/components/ErrorView.tsx +4 -4
- package/src/components/HomePage/DefaultHomePage.tsx +27 -20
- 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 +157 -145
- 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 +130 -51
- 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 +44 -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 +6 -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 +406 -478
- package/src/core/EntityEditViewFormActions.tsx +199 -0
- package/src/core/EntitySidePanel.tsx +95 -19
- 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 +48 -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 +193 -68
- 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 +201 -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 +23 -34
- package/src/preview/components/StorageThumbnail.tsx +5 -1
- package/src/preview/components/UrlComponentPreview.tsx +60 -28
- package/src/preview/property_previews/ArrayOfMapsPreview.tsx +6 -6
- 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 +13 -13
- 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 +246 -0
- package/src/routes/HomePageRoute.tsx +17 -0
- package/src/types/auth.tsx +9 -13
- package/src/types/collections.ts +118 -28
- 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 -3
- package/src/types/firecms_context.tsx +1 -1
- package/src/types/index.ts +0 -1
- package/src/types/navigation.ts +43 -18
- package/src/types/permissions.ts +5 -5
- package/src/types/plugins.tsx +42 -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 +11 -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/callbacks.ts +119 -0
- 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 +3 -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 +18 -7
- package/src/util/navigation_utils.ts +141 -25
- 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,8 @@ import {
|
|
|
9
9
|
EntityCollection,
|
|
10
10
|
EntityCollectionsBuilder,
|
|
11
11
|
EntityReference,
|
|
12
|
+
FireCMSPlugin,
|
|
13
|
+
NavigationBlocker,
|
|
12
14
|
NavigationController,
|
|
13
15
|
PermissionsBuilder,
|
|
14
16
|
TopNavigationEntry,
|
|
@@ -20,19 +22,21 @@ import {
|
|
|
20
22
|
applyPermissionsFunctionIfEmpty,
|
|
21
23
|
getCollectionByPathOrId,
|
|
22
24
|
mergeDeep,
|
|
25
|
+
removeFunctions,
|
|
23
26
|
removeInitialAndTrailingSlashes,
|
|
24
27
|
resolveCollectionPathIds,
|
|
25
28
|
resolvePermissions
|
|
26
29
|
} from "../util";
|
|
27
30
|
import { getParentReferencesFromPath } from "../util/parent_references_from_path";
|
|
31
|
+
import { useBlocker, useNavigate } from "react-router-dom";
|
|
28
32
|
|
|
29
33
|
const DEFAULT_BASE_PATH = "/";
|
|
30
34
|
const DEFAULT_COLLECTION_PATH = "/c";
|
|
31
35
|
|
|
32
|
-
type BuildNavigationContextProps<EC extends EntityCollection,
|
|
36
|
+
export type BuildNavigationContextProps<EC extends EntityCollection, USER extends User> = {
|
|
33
37
|
basePath?: string,
|
|
34
38
|
baseCollectionPath?: string,
|
|
35
|
-
authController: AuthController<
|
|
39
|
+
authController: AuthController<USER>;
|
|
36
40
|
collections?: EC[] | EntityCollectionsBuilder<EC>;
|
|
37
41
|
collectionPermissions?: PermissionsBuilder;
|
|
38
42
|
views?: CMSView[] | CMSViewsBuilder;
|
|
@@ -40,17 +44,14 @@ type BuildNavigationContextProps<EC extends EntityCollection, UserType extends U
|
|
|
40
44
|
viewsOrder?: string[];
|
|
41
45
|
userConfigPersistence?: UserConfigurationPersistence;
|
|
42
46
|
dataSourceDelegate: DataSourceDelegate;
|
|
47
|
+
plugins?: FireCMSPlugin[];
|
|
43
48
|
/**
|
|
44
|
-
*
|
|
45
|
-
* You receive the current collections as a parameter, and you can return
|
|
46
|
-
* a new list of collections.
|
|
47
|
-
* @see {@link joinCollectionLists}
|
|
48
|
-
* @param collections
|
|
49
|
+
* If true, the navigation logic will not be updated until this flag is false
|
|
49
50
|
*/
|
|
50
|
-
|
|
51
|
+
disabled?: boolean;
|
|
51
52
|
};
|
|
52
53
|
|
|
53
|
-
export function useBuildNavigationController<EC extends EntityCollection,
|
|
54
|
+
export function useBuildNavigationController<EC extends EntityCollection, USER extends User>(props: BuildNavigationContextProps<EC, USER>): NavigationController {
|
|
54
55
|
const {
|
|
55
56
|
basePath = DEFAULT_BASE_PATH,
|
|
56
57
|
baseCollectionPath = DEFAULT_COLLECTION_PATH,
|
|
@@ -60,11 +61,14 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
|
|
|
60
61
|
views: viewsProp,
|
|
61
62
|
adminViews: adminViewsProp,
|
|
62
63
|
viewsOrder,
|
|
64
|
+
plugins,
|
|
63
65
|
userConfigPersistence,
|
|
64
66
|
dataSourceDelegate,
|
|
65
|
-
|
|
67
|
+
disabled
|
|
66
68
|
} = props;
|
|
67
69
|
|
|
70
|
+
const navigate = useNavigate();
|
|
71
|
+
|
|
68
72
|
const collectionsRef = useRef<EntityCollection[] | undefined>();
|
|
69
73
|
const viewsRef = useRef<CMSView[] | undefined>();
|
|
70
74
|
const adminViewsRef = useRef<CMSView[] | undefined>();
|
|
@@ -130,6 +134,30 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
|
|
|
130
134
|
.filter(Boolean) as TopNavigationEntry[]
|
|
131
135
|
];
|
|
132
136
|
|
|
137
|
+
// Sort by group, entries with group "Admin" will go last, and second to last will be the group "Views"
|
|
138
|
+
navigationEntries = navigationEntries.sort((a, b) => {
|
|
139
|
+
if (a.group !== "Views" && a.group !== "Admin" && (b.group === "Views" || b.group === "Admin")) {
|
|
140
|
+
return -1;
|
|
141
|
+
}
|
|
142
|
+
if (b.group !== "Views" && b.group !== "Admin" && (a.group === "Views" || a.group === "Admin")) {
|
|
143
|
+
return 1;
|
|
144
|
+
}
|
|
145
|
+
if (a.group === "Admin" && b.group !== "Admin") {
|
|
146
|
+
return 1;
|
|
147
|
+
}
|
|
148
|
+
if (a.group !== "Admin" && b.group === "Admin") {
|
|
149
|
+
return -1;
|
|
150
|
+
}
|
|
151
|
+
if (a.group === "Views" && b.group !== "Views") {
|
|
152
|
+
return -1;
|
|
153
|
+
}
|
|
154
|
+
if (a.group !== "Views" && b.group === "Views") {
|
|
155
|
+
return 1;
|
|
156
|
+
}
|
|
157
|
+
return 0;
|
|
158
|
+
|
|
159
|
+
});
|
|
160
|
+
|
|
133
161
|
if (viewsOrder) {
|
|
134
162
|
navigationEntries = navigationEntries.sort((a, b) => {
|
|
135
163
|
const aIndex = viewsOrder.indexOf(a.path);
|
|
@@ -160,48 +188,62 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
|
|
|
160
188
|
|
|
161
189
|
const refreshNavigation = useCallback(async () => {
|
|
162
190
|
|
|
163
|
-
if (authController.initialLoading)
|
|
191
|
+
if (disabled || authController.initialLoading)
|
|
164
192
|
return;
|
|
165
193
|
|
|
194
|
+
console.debug("Refreshing navigation");
|
|
195
|
+
|
|
166
196
|
try {
|
|
167
|
-
|
|
168
|
-
authController
|
|
169
|
-
})
|
|
197
|
+
|
|
170
198
|
const [resolvedCollections = [], resolvedViews, resolvedAdminViews = []] = await Promise.all([
|
|
171
|
-
resolveCollections(collectionsProp, collectionPermissions, authController, dataSourceDelegate,
|
|
199
|
+
resolveCollections(collectionsProp, collectionPermissions, authController, dataSourceDelegate, plugins),
|
|
172
200
|
resolveCMSViews(viewsProp, authController, dataSourceDelegate),
|
|
173
201
|
resolveCMSViews(adminViewsProp, authController, dataSourceDelegate)
|
|
174
202
|
]
|
|
175
203
|
);
|
|
176
204
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
205
|
+
let shouldUpdateTopLevelNav = false;
|
|
206
|
+
if (!areCollectionListsEqual(collectionsRef.current ?? [], resolvedCollections)) {
|
|
207
|
+
collectionsRef.current = resolvedCollections;
|
|
208
|
+
console.debug("Collections have changed", resolvedCollections);
|
|
209
|
+
shouldUpdateTopLevelNav = true;
|
|
210
|
+
}
|
|
211
|
+
if (collectionsRef.current === undefined) {
|
|
183
212
|
collectionsRef.current = resolvedCollections;
|
|
213
|
+
shouldUpdateTopLevelNav = true;
|
|
214
|
+
}
|
|
215
|
+
if (!equal(viewsRef.current, resolvedViews)) {
|
|
184
216
|
viewsRef.current = resolvedViews;
|
|
217
|
+
shouldUpdateTopLevelNav = true;
|
|
218
|
+
}
|
|
219
|
+
if (!equal(adminViewsRef.current, resolvedAdminViews)) {
|
|
185
220
|
adminViewsRef.current = resolvedAdminViews;
|
|
186
|
-
|
|
221
|
+
shouldUpdateTopLevelNav = true;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
const computedTopLevelNav = computeTopNavigation(resolvedCollections, resolvedViews, resolvedAdminViews, viewsOrder);
|
|
225
|
+
if (shouldUpdateTopLevelNav && !equal(topLevelNavigation, computedTopLevelNav)) {
|
|
226
|
+
setTopLevelNavigation(computedTopLevelNav);
|
|
187
227
|
}
|
|
188
228
|
} catch (e) {
|
|
189
229
|
console.error(e);
|
|
190
230
|
setNavigationLoadingError(e as any);
|
|
191
231
|
}
|
|
192
232
|
|
|
193
|
-
|
|
194
|
-
|
|
233
|
+
if (navigationLoading)
|
|
234
|
+
setNavigationLoading(false);
|
|
235
|
+
if (!initialised)
|
|
236
|
+
setInitialised(true);
|
|
195
237
|
|
|
196
238
|
}, [
|
|
197
239
|
collectionsProp,
|
|
198
240
|
collectionPermissions,
|
|
199
241
|
authController.user,
|
|
200
242
|
authController.initialLoading,
|
|
243
|
+
disabled,
|
|
201
244
|
viewsProp,
|
|
202
245
|
adminViewsProp,
|
|
203
|
-
computeTopNavigation
|
|
204
|
-
injectCollections
|
|
246
|
+
computeTopNavigation
|
|
205
247
|
]);
|
|
206
248
|
|
|
207
249
|
useEffect(() => {
|
|
@@ -210,7 +252,6 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
|
|
|
210
252
|
|
|
211
253
|
const getCollection = useCallback((
|
|
212
254
|
idOrPath: string,
|
|
213
|
-
entityId?: string,
|
|
214
255
|
includeUserOverride = false
|
|
215
256
|
): EC | undefined => {
|
|
216
257
|
const collections = collectionsRef.current;
|
|
@@ -220,8 +261,7 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
|
|
|
220
261
|
const baseCollection = getCollectionByPathOrId(removeInitialAndTrailingSlashes(idOrPath), collections);
|
|
221
262
|
|
|
222
263
|
const userOverride = includeUserOverride ? userConfigPersistence?.getCollectionConfig(idOrPath) : undefined;
|
|
223
|
-
|
|
224
|
-
const overriddenCollection = baseCollection ? mergeDeep(baseCollection, userOverride) : undefined;
|
|
264
|
+
const overriddenCollection = baseCollection ? mergeDeep(baseCollection, userOverride ?? {}) : undefined;
|
|
225
265
|
|
|
226
266
|
let result: Partial<EntityCollection> | undefined = overriddenCollection;
|
|
227
267
|
|
|
@@ -243,12 +283,22 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
|
|
|
243
283
|
|
|
244
284
|
}, [userConfigPersistence]);
|
|
245
285
|
|
|
286
|
+
const getCollectionById = useCallback((id: string): EC | undefined => {
|
|
287
|
+
const collections = collectionsRef.current;
|
|
288
|
+
if (collections === undefined)
|
|
289
|
+
throw Error("getCollectionById: Collections have not been initialised yet");
|
|
290
|
+
const collection: EntityCollection | undefined = collections.find(c => c.id === id);
|
|
291
|
+
if (!collection)
|
|
292
|
+
return undefined;
|
|
293
|
+
return collection as EC;
|
|
294
|
+
}, []);
|
|
295
|
+
|
|
246
296
|
const getCollectionFromPaths = useCallback(<EC extends EntityCollection>(pathSegments: string[]): EC | undefined => {
|
|
247
297
|
|
|
248
298
|
const collections = collectionsRef.current;
|
|
299
|
+
if (collections === undefined)
|
|
300
|
+
throw Error("getCollectionFromPaths: Collections have not been initialised yet");
|
|
249
301
|
let currentCollections: EntityCollection[] | undefined = [...(collections ?? [])];
|
|
250
|
-
if (!currentCollections)
|
|
251
|
-
throw Error("Collections have not been initialised yet");
|
|
252
302
|
|
|
253
303
|
for (let i = 0; i < pathSegments.length; i++) {
|
|
254
304
|
const pathSegment = pathSegments[i];
|
|
@@ -267,9 +317,9 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
|
|
|
267
317
|
const getCollectionFromIds = useCallback(<EC extends EntityCollection>(ids: string[]): EC | undefined => {
|
|
268
318
|
|
|
269
319
|
const collections = collectionsRef.current;
|
|
320
|
+
if (collections === undefined)
|
|
321
|
+
throw Error("getCollectionFromIds: Collections have not been initialised yet");
|
|
270
322
|
let currentCollections: EntityCollection[] | undefined = [...(collections ?? [])];
|
|
271
|
-
if (!currentCollections)
|
|
272
|
-
throw Error("Collections have not been initialised yet");
|
|
273
323
|
|
|
274
324
|
for (let i = 0; i < ids.length; i++) {
|
|
275
325
|
const id = ids[i];
|
|
@@ -295,19 +345,8 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
|
|
|
295
345
|
throw Error("Expected path starting with " + fullCollectionPath);
|
|
296
346
|
}, [fullCollectionPath]);
|
|
297
347
|
|
|
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");
|
|
348
|
+
const resolveIdsFrom = useCallback((path: string): string => {
|
|
349
|
+
const collections = collectionsRef.current ?? [];
|
|
311
350
|
return resolveCollectionPathIds(path, collections);
|
|
312
351
|
}, []);
|
|
313
352
|
|
|
@@ -350,10 +389,6 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
|
|
|
350
389
|
return paths;
|
|
351
390
|
}, [getCollectionFromIds]);
|
|
352
391
|
|
|
353
|
-
console.debug("Navigation", {
|
|
354
|
-
initialised,
|
|
355
|
-
navigationLoading
|
|
356
|
-
});
|
|
357
392
|
return {
|
|
358
393
|
collections: collectionsRef.current,
|
|
359
394
|
views: viewsRef.current,
|
|
@@ -365,29 +400,22 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
|
|
|
365
400
|
baseCollectionPath,
|
|
366
401
|
initialised,
|
|
367
402
|
getCollection,
|
|
403
|
+
getCollectionById,
|
|
368
404
|
getCollectionFromPaths,
|
|
369
405
|
getCollectionFromIds,
|
|
370
406
|
isUrlCollectionPath,
|
|
371
407
|
urlPathToDataPath,
|
|
372
408
|
buildUrlCollectionPath,
|
|
373
|
-
|
|
374
|
-
buildCMSUrlPath,
|
|
375
|
-
resolveAliasesFrom,
|
|
409
|
+
resolveIdsFrom,
|
|
376
410
|
topLevelNavigation,
|
|
377
411
|
refreshNavigation,
|
|
378
412
|
getParentReferencesFromPath: getAllParentReferencesForPath,
|
|
379
413
|
getParentCollectionIds,
|
|
380
|
-
convertIdsToPaths
|
|
414
|
+
convertIdsToPaths,
|
|
415
|
+
navigate,
|
|
381
416
|
};
|
|
382
417
|
}
|
|
383
418
|
|
|
384
|
-
export function getSidePanelKey(path: string, entityId?: string) {
|
|
385
|
-
if (entityId)
|
|
386
|
-
return `${removeInitialAndTrailingSlashes(path)}/${removeInitialAndTrailingSlashes(entityId)}`;
|
|
387
|
-
else
|
|
388
|
-
return removeInitialAndTrailingSlashes(path);
|
|
389
|
-
}
|
|
390
|
-
|
|
391
419
|
function encodePath(input: string) {
|
|
392
420
|
return encodeURIComponent(removeInitialAndTrailingSlashes(input))
|
|
393
421
|
.replaceAll("%2F", "/")
|
|
@@ -396,9 +424,10 @@ function encodePath(input: string) {
|
|
|
396
424
|
|
|
397
425
|
function filterOutNotAllowedCollections(resolvedCollections: EntityCollection[], authController: AuthController<User>): EntityCollection[] {
|
|
398
426
|
return resolvedCollections
|
|
427
|
+
.filter((c) => Boolean(c.path))
|
|
399
428
|
.filter((c) => {
|
|
400
429
|
if (!c.permissions) return true;
|
|
401
|
-
const resolvedPermissions = resolvePermissions(c, authController, c.path, null)
|
|
430
|
+
const resolvedPermissions = resolvePermissions(c, authController, c.path, null);
|
|
402
431
|
return resolvedPermissions?.read !== false;
|
|
403
432
|
})
|
|
404
433
|
.map((c) => {
|
|
@@ -410,11 +439,24 @@ function filterOutNotAllowedCollections(resolvedCollections: EntityCollection[],
|
|
|
410
439
|
});
|
|
411
440
|
}
|
|
412
441
|
|
|
442
|
+
function applyPluginModifyCollection(resolvedCollections: EntityCollection[], modifyCollection: (collection: EntityCollection) => EntityCollection) {
|
|
443
|
+
return resolvedCollections.map((collection: EntityCollection): EntityCollection => {
|
|
444
|
+
const modifiedCollection = modifyCollection(collection);
|
|
445
|
+
if (modifiedCollection.subcollections) {
|
|
446
|
+
return {
|
|
447
|
+
...modifiedCollection,
|
|
448
|
+
subcollections: applyPluginModifyCollection(modifiedCollection.subcollections, modifyCollection)
|
|
449
|
+
} satisfies EntityCollection;
|
|
450
|
+
}
|
|
451
|
+
return modifiedCollection;
|
|
452
|
+
});
|
|
453
|
+
}
|
|
454
|
+
|
|
413
455
|
async function resolveCollections(collections: undefined | EntityCollection[] | EntityCollectionsBuilder<any>,
|
|
414
456
|
collectionPermissions: PermissionsBuilder | undefined,
|
|
415
457
|
authController: AuthController,
|
|
416
458
|
dataSource: DataSourceDelegate,
|
|
417
|
-
|
|
459
|
+
plugins: FireCMSPlugin[] | undefined): Promise<EntityCollection[]> {
|
|
418
460
|
let resolvedCollections: EntityCollection[] = [];
|
|
419
461
|
if (typeof collections === "function") {
|
|
420
462
|
resolvedCollections = await collections({
|
|
@@ -426,14 +468,20 @@ async function resolveCollections(collections: undefined | EntityCollection[] |
|
|
|
426
468
|
resolvedCollections = collections;
|
|
427
469
|
}
|
|
428
470
|
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
471
|
+
if (plugins) {
|
|
472
|
+
for (const plugin of plugins) {
|
|
473
|
+
if (plugin.collection?.modifyCollection) {
|
|
474
|
+
resolvedCollections = applyPluginModifyCollection(resolvedCollections, plugin.collection.modifyCollection);
|
|
475
|
+
}
|
|
432
476
|
|
|
433
|
-
|
|
434
|
-
|
|
477
|
+
if (plugin.collection?.injectCollections) {
|
|
478
|
+
resolvedCollections = plugin.collection.injectCollections(resolvedCollections ?? []);
|
|
479
|
+
}
|
|
480
|
+
}
|
|
435
481
|
}
|
|
436
482
|
|
|
483
|
+
resolvedCollections = applyPermissionsFunctionIfEmpty(resolvedCollections, collectionPermissions);
|
|
484
|
+
resolvedCollections = filterOutNotAllowedCollections(resolvedCollections, authController);
|
|
437
485
|
return resolvedCollections;
|
|
438
486
|
}
|
|
439
487
|
|
|
@@ -458,3 +506,80 @@ function getGroup(collectionOrView: EntityCollection<any, any> | CMSView) {
|
|
|
458
506
|
}
|
|
459
507
|
return trimmed ?? "Views";
|
|
460
508
|
}
|
|
509
|
+
|
|
510
|
+
function areCollectionListsEqual(a: EntityCollection[], b: EntityCollection[]) {
|
|
511
|
+
if (a.length !== b.length) {
|
|
512
|
+
return false;
|
|
513
|
+
}
|
|
514
|
+
const aCopy = [...a];
|
|
515
|
+
const bCopy = [...b];
|
|
516
|
+
const aSorted = aCopy.sort((x, y) => x.id.localeCompare(y.id));
|
|
517
|
+
const bSorted = bCopy.sort((x, y) => x.id.localeCompare(y.id));
|
|
518
|
+
return aSorted.every((value, index) => areCollectionsEqual(value, bSorted[index]));
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
function areCollectionsEqual(a: EntityCollection, b: EntityCollection) {
|
|
522
|
+
const {
|
|
523
|
+
subcollections: subcollectionsA,
|
|
524
|
+
...restA
|
|
525
|
+
} = a;
|
|
526
|
+
const {
|
|
527
|
+
subcollections: subcollectionsB,
|
|
528
|
+
...restB
|
|
529
|
+
} = b;
|
|
530
|
+
if (!areCollectionListsEqual(subcollectionsA ?? [], subcollectionsB ?? [])) {
|
|
531
|
+
return false;
|
|
532
|
+
}
|
|
533
|
+
return equal(removeFunctions(restA), removeFunctions(restB));
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
function useCustomBlocker(): NavigationBlocker {
|
|
537
|
+
const [blockListeners, setBlockListeners] = useState<Record<string, {
|
|
538
|
+
block: boolean,
|
|
539
|
+
basePath?: string
|
|
540
|
+
}>>({});
|
|
541
|
+
|
|
542
|
+
const shouldBlock = Object.values(blockListeners).some(b => b.block);
|
|
543
|
+
|
|
544
|
+
let blocker: any;
|
|
545
|
+
try {
|
|
546
|
+
blocker = useBlocker(({
|
|
547
|
+
nextLocation
|
|
548
|
+
}) => {
|
|
549
|
+
const allBasePaths = Object.values(blockListeners).map(b => b.basePath).filter(Boolean) as string[];
|
|
550
|
+
if (allBasePaths && allBasePaths.some(path => nextLocation.pathname.startsWith(path)))
|
|
551
|
+
return false;
|
|
552
|
+
return shouldBlock;
|
|
553
|
+
});
|
|
554
|
+
} catch (e) {
|
|
555
|
+
// console.warn("Blocker not available, navigation will not be blocked");
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
const updateBlockListener = (path: string, block: boolean, basePath?: string) => {
|
|
559
|
+
setBlockListeners(prev => ({
|
|
560
|
+
...prev,
|
|
561
|
+
[path]: {
|
|
562
|
+
block,
|
|
563
|
+
basePath
|
|
564
|
+
}
|
|
565
|
+
}));
|
|
566
|
+
return () => setBlockListeners(prev => {
|
|
567
|
+
const {
|
|
568
|
+
[path]: removed,
|
|
569
|
+
...rest
|
|
570
|
+
} = prev;
|
|
571
|
+
return rest;
|
|
572
|
+
})
|
|
573
|
+
};
|
|
574
|
+
|
|
575
|
+
const isBlocked = (path: string) => {
|
|
576
|
+
return (blockListeners[path]?.block ?? false) && blocker?.state === "blocked";
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
return {
|
|
580
|
+
updateBlockListener,
|
|
581
|
+
isBlocked,
|
|
582
|
+
proceed: blocker?.proceed,
|
|
583
|
+
reset: blocker?.reset
|
|
584
|
+
}
|
|
585
|
+
}
|
|
@@ -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
|
}
|