@firecms/core 3.0.0-canary.24 → 3.0.0-canary.241
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 +21578 -13895
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +24366 -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 +8 -3
- package/dist/types/firecms_context.d.ts +1 -1
- package/dist/types/index.d.ts +0 -1
- package/dist/types/navigation.d.ts +41 -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 +72 -58
- 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 +194 -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 +26 -37
- 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 +9 -4
- package/src/types/firecms_context.tsx +1 -1
- package/src/types/index.ts +0 -1
- package/src/types/navigation.ts +49 -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,23 @@ 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,
|
|
416
|
+
plugins
|
|
381
417
|
};
|
|
382
418
|
}
|
|
383
419
|
|
|
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
420
|
function encodePath(input: string) {
|
|
392
421
|
return encodeURIComponent(removeInitialAndTrailingSlashes(input))
|
|
393
422
|
.replaceAll("%2F", "/")
|
|
@@ -396,9 +425,10 @@ function encodePath(input: string) {
|
|
|
396
425
|
|
|
397
426
|
function filterOutNotAllowedCollections(resolvedCollections: EntityCollection[], authController: AuthController<User>): EntityCollection[] {
|
|
398
427
|
return resolvedCollections
|
|
428
|
+
.filter((c) => Boolean(c.path))
|
|
399
429
|
.filter((c) => {
|
|
400
430
|
if (!c.permissions) return true;
|
|
401
|
-
const resolvedPermissions = resolvePermissions(c, authController, c.path, null)
|
|
431
|
+
const resolvedPermissions = resolvePermissions(c, authController, c.path, null);
|
|
402
432
|
return resolvedPermissions?.read !== false;
|
|
403
433
|
})
|
|
404
434
|
.map((c) => {
|
|
@@ -410,11 +440,24 @@ function filterOutNotAllowedCollections(resolvedCollections: EntityCollection[],
|
|
|
410
440
|
});
|
|
411
441
|
}
|
|
412
442
|
|
|
443
|
+
function applyPluginModifyCollection(resolvedCollections: EntityCollection[], modifyCollection: (collection: EntityCollection) => EntityCollection) {
|
|
444
|
+
return resolvedCollections.map((collection: EntityCollection): EntityCollection => {
|
|
445
|
+
const modifiedCollection = modifyCollection(collection);
|
|
446
|
+
if (modifiedCollection.subcollections) {
|
|
447
|
+
return {
|
|
448
|
+
...modifiedCollection,
|
|
449
|
+
subcollections: applyPluginModifyCollection(modifiedCollection.subcollections, modifyCollection)
|
|
450
|
+
} satisfies EntityCollection;
|
|
451
|
+
}
|
|
452
|
+
return modifiedCollection;
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
|
|
413
456
|
async function resolveCollections(collections: undefined | EntityCollection[] | EntityCollectionsBuilder<any>,
|
|
414
457
|
collectionPermissions: PermissionsBuilder | undefined,
|
|
415
458
|
authController: AuthController,
|
|
416
459
|
dataSource: DataSourceDelegate,
|
|
417
|
-
|
|
460
|
+
plugins: FireCMSPlugin[] | undefined): Promise<EntityCollection[]> {
|
|
418
461
|
let resolvedCollections: EntityCollection[] = [];
|
|
419
462
|
if (typeof collections === "function") {
|
|
420
463
|
resolvedCollections = await collections({
|
|
@@ -426,14 +469,20 @@ async function resolveCollections(collections: undefined | EntityCollection[] |
|
|
|
426
469
|
resolvedCollections = collections;
|
|
427
470
|
}
|
|
428
471
|
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
472
|
+
if (plugins) {
|
|
473
|
+
for (const plugin of plugins) {
|
|
474
|
+
if (plugin.collection?.modifyCollection) {
|
|
475
|
+
resolvedCollections = applyPluginModifyCollection(resolvedCollections, plugin.collection.modifyCollection);
|
|
476
|
+
}
|
|
432
477
|
|
|
433
|
-
|
|
434
|
-
|
|
478
|
+
if (plugin.collection?.injectCollections) {
|
|
479
|
+
resolvedCollections = plugin.collection.injectCollections(resolvedCollections ?? []);
|
|
480
|
+
}
|
|
481
|
+
}
|
|
435
482
|
}
|
|
436
483
|
|
|
484
|
+
resolvedCollections = applyPermissionsFunctionIfEmpty(resolvedCollections, collectionPermissions);
|
|
485
|
+
resolvedCollections = filterOutNotAllowedCollections(resolvedCollections, authController);
|
|
437
486
|
return resolvedCollections;
|
|
438
487
|
}
|
|
439
488
|
|
|
@@ -458,3 +507,80 @@ function getGroup(collectionOrView: EntityCollection<any, any> | CMSView) {
|
|
|
458
507
|
}
|
|
459
508
|
return trimmed ?? "Views";
|
|
460
509
|
}
|
|
510
|
+
|
|
511
|
+
function areCollectionListsEqual(a: EntityCollection[], b: EntityCollection[]) {
|
|
512
|
+
if (a.length !== b.length) {
|
|
513
|
+
return false;
|
|
514
|
+
}
|
|
515
|
+
const aCopy = [...a];
|
|
516
|
+
const bCopy = [...b];
|
|
517
|
+
const aSorted = aCopy.sort((x, y) => x.id.localeCompare(y.id));
|
|
518
|
+
const bSorted = bCopy.sort((x, y) => x.id.localeCompare(y.id));
|
|
519
|
+
return aSorted.every((value, index) => areCollectionsEqual(value, bSorted[index]));
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
function areCollectionsEqual(a: EntityCollection, b: EntityCollection) {
|
|
523
|
+
const {
|
|
524
|
+
subcollections: subcollectionsA,
|
|
525
|
+
...restA
|
|
526
|
+
} = a;
|
|
527
|
+
const {
|
|
528
|
+
subcollections: subcollectionsB,
|
|
529
|
+
...restB
|
|
530
|
+
} = b;
|
|
531
|
+
if (!areCollectionListsEqual(subcollectionsA ?? [], subcollectionsB ?? [])) {
|
|
532
|
+
return false;
|
|
533
|
+
}
|
|
534
|
+
return equal(removeFunctions(restA), removeFunctions(restB));
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
function useCustomBlocker(): NavigationBlocker {
|
|
538
|
+
const [blockListeners, setBlockListeners] = useState<Record<string, {
|
|
539
|
+
block: boolean,
|
|
540
|
+
basePath?: string
|
|
541
|
+
}>>({});
|
|
542
|
+
|
|
543
|
+
const shouldBlock = Object.values(blockListeners).some(b => b.block);
|
|
544
|
+
|
|
545
|
+
let blocker: any;
|
|
546
|
+
try {
|
|
547
|
+
blocker = useBlocker(({
|
|
548
|
+
nextLocation
|
|
549
|
+
}) => {
|
|
550
|
+
const allBasePaths = Object.values(blockListeners).map(b => b.basePath).filter(Boolean) as string[];
|
|
551
|
+
if (allBasePaths && allBasePaths.some(path => nextLocation.pathname.startsWith(path)))
|
|
552
|
+
return false;
|
|
553
|
+
return shouldBlock;
|
|
554
|
+
});
|
|
555
|
+
} catch (e) {
|
|
556
|
+
// console.warn("Blocker not available, navigation will not be blocked");
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
const updateBlockListener = (path: string, block: boolean, basePath?: string) => {
|
|
560
|
+
setBlockListeners(prev => ({
|
|
561
|
+
...prev,
|
|
562
|
+
[path]: {
|
|
563
|
+
block,
|
|
564
|
+
basePath
|
|
565
|
+
}
|
|
566
|
+
}));
|
|
567
|
+
return () => setBlockListeners(prev => {
|
|
568
|
+
const {
|
|
569
|
+
[path]: removed,
|
|
570
|
+
...rest
|
|
571
|
+
} = prev;
|
|
572
|
+
return rest;
|
|
573
|
+
})
|
|
574
|
+
};
|
|
575
|
+
|
|
576
|
+
const isBlocked = (path: string) => {
|
|
577
|
+
return (blockListeners[path]?.block ?? false) && blocker?.state === "blocked";
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
return {
|
|
581
|
+
updateBlockListener,
|
|
582
|
+
isBlocked,
|
|
583
|
+
proceed: blocker?.proceed,
|
|
584
|
+
reset: blocker?.reset
|
|
585
|
+
}
|
|
586
|
+
}
|
|
@@ -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
|
}
|