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