@firecms/core 3.0.0-canary.21 → 3.0.0-canary.211
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 +23 -6
- package/dist/components/CircularProgressCenter.d.ts +1 -1
- package/dist/components/ClearFilterSortButton.d.ts +5 -0
- package/dist/components/{DeleteConfirmationDialog.d.ts → ConfirmationDialog.d.ts} +1 -1
- package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +13 -13
- package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +2 -2
- package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +22 -6
- package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +1 -0
- package/dist/components/EntityCollectionTable/column_utils.d.ts +1 -2
- package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +3 -1
- package/dist/components/EntityCollectionTable/index.d.ts +1 -1
- package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +1 -4
- package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +2 -2
- package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +7 -4
- package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +16 -2
- package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
- package/dist/components/EntityCollectionView/utils.d.ts +3 -0
- package/dist/components/EntityJsonPreview.d.ts +3 -0
- package/dist/components/EntityPreview.d.ts +5 -4
- package/dist/components/ErrorView.d.ts +1 -1
- package/dist/components/HomePage/DefaultHomePage.d.ts +1 -1
- package/dist/components/HomePage/NavigationCardBinding.d.ts +1 -1
- package/dist/components/PropertyConfigBadge.d.ts +2 -1
- package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
- package/dist/components/ReferenceWidget.d.ts +3 -1
- package/dist/components/SelectableTable/SelectableTable.d.ts +13 -3
- package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
- package/dist/components/UnsavedChangesDialog.d.ts +8 -0
- package/dist/components/VirtualTable/VirtualTableProps.d.ts +28 -12
- package/dist/components/VirtualTable/types.d.ts +3 -3
- package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -3
- package/dist/components/common/index.d.ts +2 -1
- package/dist/components/common/table_height.d.ts +5 -0
- package/dist/components/common/types.d.ts +4 -6
- package/dist/components/common/useColumnsIds.d.ts +3 -1
- package/dist/components/common/{useDataSourceEntityCollectionTableController.d.ts → useDataSourceTableController.d.ts} +13 -2
- package/dist/components/common/useDebouncedCallback.d.ts +1 -0
- package/dist/components/common/useScrollRestoration.d.ts +14 -0
- package/dist/components/index.d.ts +4 -2
- package/dist/contexts/BreacrumbsContext.d.ts +8 -0
- package/dist/core/DefaultAppBar.d.ts +29 -0
- package/dist/core/DefaultDrawer.d.ts +19 -0
- package/dist/core/DrawerNavigationItem.d.ts +10 -0
- package/dist/core/EntityEditView.d.ts +35 -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 +37 -69
- 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 +21921 -14330
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +24271 -588
- package/dist/index.umd.js.map +1 -1
- package/dist/internal/useBuildDataSource.d.ts +1 -16
- package/dist/internal/useBuildSideEntityController.d.ts +2 -2
- 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 +77 -22
- package/dist/types/datasource.d.ts +52 -36
- package/dist/types/dialogs_controller.d.ts +7 -3
- package/dist/types/entities.d.ts +7 -2
- package/dist/types/entity_actions.d.ts +28 -4
- package/dist/types/entity_callbacks.d.ts +16 -16
- package/dist/types/entity_overrides.d.ts +2 -2
- package/dist/types/export_import.d.ts +4 -4
- package/dist/types/fields.d.ts +71 -42
- package/dist/types/firecms.d.ts +6 -2
- package/dist/types/firecms_context.d.ts +1 -1
- package/dist/types/index.d.ts +0 -1
- package/dist/types/navigation.d.ts +32 -14
- package/dist/types/permissions.d.ts +4 -4
- package/dist/types/plugins.d.ts +23 -12
- package/dist/types/properties.d.ts +52 -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/entities.d.ts +3 -3
- package/dist/util/entity_actions.d.ts +2 -0
- package/dist/util/entity_cache.d.ts +23 -0
- package/dist/util/icon_list.d.ts +5 -1
- package/dist/util/icon_synonyms.d.ts +1 -98
- package/dist/util/icons.d.ts +6 -3
- package/dist/util/index.d.ts +2 -0
- package/dist/util/navigation_from_path.d.ts +6 -1
- package/dist/util/navigation_utils.d.ts +14 -3
- package/dist/util/objects.d.ts +2 -1
- package/dist/util/permissions.d.ts +4 -4
- package/dist/util/plurals.d.ts +0 -2
- package/dist/util/property_utils.d.ts +3 -3
- package/dist/util/resolutions.d.ts +36 -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 +127 -41
- 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 +10 -19
- package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +54 -37
- 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 +81 -80
- package/src/components/EntityCollectionView/EntityCollectionView.tsx +207 -113
- package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +4 -2
- package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
- package/src/components/EntityCollectionView/useSelectionController.tsx +20 -7
- package/src/components/EntityCollectionView/utils.ts +19 -0
- package/src/components/EntityJsonPreview.tsx +66 -0
- package/src/components/EntityPreview.tsx +62 -52
- package/src/components/EntityView.tsx +10 -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 +19 -13
- package/src/components/ReferenceWidget.tsx +21 -11
- package/src/components/SearchIconsView.tsx +10 -7
- package/src/components/SelectableTable/SelectableTable.tsx +27 -12
- package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
- package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +25 -8
- package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +36 -12
- package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +92 -23
- package/src/components/UnsavedChangesDialog.tsx +42 -0
- package/src/components/VirtualTable/VirtualTable.tsx +96 -48
- package/src/components/VirtualTable/VirtualTableCell.tsx +1 -9
- package/src/components/VirtualTable/VirtualTableHeader.tsx +10 -10
- package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
- package/src/components/VirtualTable/VirtualTableProps.tsx +33 -14
- package/src/components/VirtualTable/VirtualTableRow.tsx +5 -6
- package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +5 -5
- package/src/components/VirtualTable/fields/VirtualTableInput.tsx +3 -2
- package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
- package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +16 -28
- package/src/components/VirtualTable/types.tsx +2 -3
- package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +33 -40
- package/src/components/common/index.ts +2 -1
- package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
- package/src/components/common/types.tsx +4 -6
- package/src/components/common/useColumnsIds.tsx +24 -3
- package/src/components/common/useDataSourceTableController.tsx +420 -0
- package/src/components/common/useDebouncedCallback.tsx +20 -0
- package/src/components/common/useScrollRestoration.tsx +68 -0
- package/src/components/common/useTableSearchHelper.ts +53 -12
- package/src/components/index.tsx +4 -2
- package/src/contexts/BreacrumbsContext.tsx +38 -0
- package/src/contexts/DialogsProvider.tsx +5 -4
- package/src/contexts/ModeController.tsx +1 -3
- package/src/contexts/SnackbarProvider.tsx +2 -0
- package/src/core/DefaultAppBar.tsx +219 -0
- package/src/core/DefaultDrawer.tsx +185 -0
- package/src/core/DrawerNavigationItem.tsx +66 -0
- package/src/core/EntityEditView.tsx +345 -480
- package/src/core/EntityEditViewFormActions.tsx +199 -0
- package/src/core/EntitySidePanel.tsx +86 -17
- package/src/core/FireCMS.tsx +56 -49
- 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 +585 -539
- package/src/form/EntityFormActions.tsx +169 -0
- package/src/form/PropertyFieldBinding.tsx +85 -44
- 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 +31 -19
- package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +47 -35
- package/src/form/field_bindings/BlockFieldBinding.tsx +56 -34
- package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -14
- package/src/form/field_bindings/KeyValueFieldBinding.tsx +60 -51
- package/src/form/field_bindings/MapFieldBinding.tsx +71 -54
- package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +153 -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 +56 -35
- package/src/form/field_bindings/SelectFieldBinding.tsx +22 -14
- package/src/form/field_bindings/StorageUploadFieldBinding.tsx +42 -50
- 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 +13 -9
- package/src/hooks/data/useCollectionFetch.tsx +3 -3
- package/src/hooks/data/useDataSource.tsx +11 -3
- package/src/hooks/data/useEntityFetch.tsx +10 -6
- package/src/hooks/index.tsx +1 -0
- package/src/hooks/useAuthController.tsx +1 -1
- package/src/hooks/useBreadcrumbsController.tsx +31 -0
- package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
- package/src/hooks/useBuildModeController.tsx +22 -29
- package/src/hooks/useBuildNavigationController.tsx +159 -54
- package/src/hooks/useFireCMSContext.tsx +5 -5
- 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 +72 -82
- package/src/internal/useBuildSideDialogsController.tsx +4 -2
- package/src/internal/useBuildSideEntityController.tsx +194 -73
- package/src/internal/useUnsavedChangesDialog.tsx +127 -91
- package/src/preview/PropertyPreview.tsx +17 -24
- 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 +2 -3
- package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +4 -3
- package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +2 -3
- package/src/preview/property_previews/ArrayOfStringsPreview.tsx +1 -2
- package/src/preview/property_previews/ArrayOneOfPreview.tsx +4 -5
- package/src/preview/property_previews/ArrayPropertyPreview.tsx +4 -5
- package/src/preview/property_previews/MapPropertyPreview.tsx +12 -11
- package/src/preview/property_previews/SkeletonPropertyComponent.tsx +12 -12
- package/src/preview/property_previews/StringPropertyPreview.tsx +3 -3
- package/src/preview/util.ts +10 -10
- package/src/routes/CustomCMSRoute.tsx +21 -0
- package/src/routes/FireCMSRoute.tsx +235 -0
- package/src/routes/HomePageRoute.tsx +17 -0
- package/src/types/auth.tsx +9 -13
- package/src/types/collections.ts +94 -27
- package/src/types/customization_controller.tsx +0 -1
- package/src/types/datasource.ts +61 -43
- package/src/types/dialogs_controller.tsx +7 -3
- package/src/types/entities.ts +12 -2
- package/src/types/entity_actions.tsx +32 -7
- package/src/types/entity_callbacks.ts +18 -18
- package/src/types/entity_overrides.tsx +2 -2
- package/src/types/export_import.ts +4 -4
- package/src/types/fields.tsx +81 -46
- package/src/types/firecms.tsx +7 -2
- package/src/types/firecms_context.tsx +1 -1
- package/src/types/index.ts +0 -1
- package/src/types/navigation.ts +38 -18
- package/src/types/permissions.ts +5 -5
- package/src/types/plugins.tsx +25 -14
- package/src/types/properties.ts +60 -25
- package/src/types/property_config.tsx +0 -2
- package/src/types/side_dialogs_controller.tsx +15 -0
- package/src/types/side_entity_controller.tsx +6 -1
- package/src/types/storage.ts +94 -3
- package/src/types/user.ts +2 -0
- package/src/util/builders.ts +10 -8
- package/src/util/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 +3 -0
- package/src/util/make_properties_editable.ts +13 -5
- package/src/util/navigation_from_path.ts +13 -6
- package/src/util/navigation_utils.ts +59 -7
- package/src/util/objects.ts +48 -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 +11 -4
- package/src/util/references.ts +11 -2
- package/src/util/resolutions.ts +100 -46
- package/src/util/storage.ts +79 -21
- package/src/util/strings.ts +2 -2
- package/src/util/useStorageUploadController.tsx +71 -27
- 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
|
@@ -5,7 +5,7 @@ import { ResolvedProperty } from "../../types";
|
|
|
5
5
|
import { useCustomizationController } from "../../hooks";
|
|
6
6
|
import { PreviewSize, PropertyPreviewProps } from "../PropertyPreviewProps";
|
|
7
7
|
import { PropertyPreview } from "../PropertyPreview";
|
|
8
|
-
import {
|
|
8
|
+
import { cls, defaultBorderMixin } from "@firecms/ui";
|
|
9
9
|
import { ErrorBoundary } from "../../components";
|
|
10
10
|
|
|
11
11
|
/**
|
|
@@ -23,8 +23,7 @@ export function ArrayPropertyPreview({
|
|
|
23
23
|
const property = resolveArrayProperty({
|
|
24
24
|
propertyKey,
|
|
25
25
|
property: inputProperty,
|
|
26
|
-
|
|
27
|
-
fields: customizationController.propertyConfigs
|
|
26
|
+
propertyConfigs: customizationController.propertyConfigs
|
|
28
27
|
});
|
|
29
28
|
|
|
30
29
|
if (!property.of) {
|
|
@@ -38,7 +37,7 @@ export function ArrayPropertyPreview({
|
|
|
38
37
|
|
|
39
38
|
if (!values) return null;
|
|
40
39
|
|
|
41
|
-
const childSize: PreviewSize = size === "medium" ? "
|
|
40
|
+
const childSize: PreviewSize = size === "medium" ? "medium" : "small";
|
|
42
41
|
|
|
43
42
|
return (
|
|
44
43
|
<div className="flex flex-col gap-2">
|
|
@@ -49,7 +48,7 @@ export function ArrayPropertyPreview({
|
|
|
49
48
|
return of
|
|
50
49
|
? <React.Fragment
|
|
51
50
|
key={"preview_array_" + index}>
|
|
52
|
-
<div className={
|
|
51
|
+
<div className={cls(defaultBorderMixin, "m-1 border-b last:border-b-0")}>
|
|
53
52
|
<ErrorBoundary>
|
|
54
53
|
<PropertyPreview
|
|
55
54
|
propertyKey={propertyKey}
|
|
@@ -3,7 +3,7 @@ import React from "react";
|
|
|
3
3
|
import { ResolvedMapProperty } from "../../types";
|
|
4
4
|
import { PropertyPreviewProps } from "../PropertyPreviewProps";
|
|
5
5
|
import { PropertyPreview } from "../PropertyPreview";
|
|
6
|
-
import {
|
|
6
|
+
import { cls, defaultBorderMixin, Typography } from "@firecms/ui";
|
|
7
7
|
import { ErrorBoundary } from "../../components";
|
|
8
8
|
import { EmptyValue } from "../components/EmptyValue";
|
|
9
9
|
|
|
@@ -34,7 +34,7 @@ export function MapPropertyPreview<T extends Record<string, any> = Record<string
|
|
|
34
34
|
|
|
35
35
|
const mapPropertyKeys: string[] = Object.keys(mapProperty.properties)
|
|
36
36
|
|
|
37
|
-
if (size === "
|
|
37
|
+
if (size === "small")
|
|
38
38
|
return (
|
|
39
39
|
<div className="w-full flex flex-col space-y-1 md:space-y-2">
|
|
40
40
|
{mapPropertyKeys.map((key, index) => (
|
|
@@ -58,10 +58,11 @@ export function MapPropertyPreview<T extends Record<string, any> = Record<string
|
|
|
58
58
|
{mapPropertyKeys &&
|
|
59
59
|
mapPropertyKeys.map((key, index) => {
|
|
60
60
|
const childProperty = mapProperty.properties![key];
|
|
61
|
+
const isArrayOrMap = childProperty.dataType === "map" || childProperty === "array";
|
|
61
62
|
return (
|
|
62
63
|
<div
|
|
63
64
|
key={`map_preview_table_${key}}`}
|
|
64
|
-
className={
|
|
65
|
+
className={cls(defaultBorderMixin, "last:border-b-0 border-b")}>
|
|
65
66
|
<div
|
|
66
67
|
className={"flex flex-row pt-0.5 pb-0.5 gap-2"}>
|
|
67
68
|
<div
|
|
@@ -75,7 +76,7 @@ export function MapPropertyPreview<T extends Record<string, any> = Record<string
|
|
|
75
76
|
<div
|
|
76
77
|
className="flex-grow max-w-[75%]">
|
|
77
78
|
<ErrorBoundary>
|
|
78
|
-
{!
|
|
79
|
+
{!isArrayOrMap &&
|
|
79
80
|
<PropertyPreview
|
|
80
81
|
propertyKey={key}
|
|
81
82
|
value={(value)[key]}
|
|
@@ -86,8 +87,8 @@ export function MapPropertyPreview<T extends Record<string, any> = Record<string
|
|
|
86
87
|
</div>
|
|
87
88
|
</div>
|
|
88
89
|
|
|
89
|
-
{
|
|
90
|
-
<div className={
|
|
90
|
+
{isArrayOrMap &&
|
|
91
|
+
<div className={cls(defaultBorderMixin, "border-l pl-4 ml-2 my-2")}>
|
|
91
92
|
<PropertyPreview
|
|
92
93
|
propertyKey={key}
|
|
93
94
|
value={(value)[key]}
|
|
@@ -110,10 +111,10 @@ export function KeyValuePreview({ value }: { value: any }) {
|
|
|
110
111
|
return <div
|
|
111
112
|
className="flex flex-col gap-1 w-full">
|
|
112
113
|
{
|
|
113
|
-
Object.entries(value).map(([key, childValue]) => (
|
|
114
|
+
Object.entries(value).map(([key, childValue]: [string, any]) => (
|
|
114
115
|
<div
|
|
115
116
|
key={`map_preview_table_${key}}`}
|
|
116
|
-
className={
|
|
117
|
+
className={cls(defaultBorderMixin, "last:border-b-0 border-b")}>
|
|
117
118
|
<div
|
|
118
119
|
className={"flex flex-row pt-0.5 pb-0.5 gap-2"}>
|
|
119
120
|
<div
|
|
@@ -127,15 +128,15 @@ export function KeyValuePreview({ value }: { value: any }) {
|
|
|
127
128
|
</div>
|
|
128
129
|
<div
|
|
129
130
|
className="flex-grow max-w-[75%]">
|
|
130
|
-
{
|
|
131
|
+
{childValue && <Typography>
|
|
131
132
|
<ErrorBoundary>
|
|
132
|
-
{childValue
|
|
133
|
+
{childValue.toString()}
|
|
133
134
|
</ErrorBoundary>
|
|
134
135
|
</Typography>}
|
|
135
136
|
</div>
|
|
136
137
|
</div>
|
|
137
138
|
{typeof childValue === "object" &&
|
|
138
|
-
<div className={
|
|
139
|
+
<div className={cls(defaultBorderMixin, "border-l pl-4")}>
|
|
139
140
|
<KeyValuePreview value={childValue}/>
|
|
140
141
|
</div>
|
|
141
142
|
}
|
|
@@ -81,17 +81,17 @@ function renderMap<T extends Record<string, any>>(property: ResolvedMapProperty<
|
|
|
81
81
|
return <></>;
|
|
82
82
|
|
|
83
83
|
let mapPropertyKeys: string[];
|
|
84
|
-
if (size === "
|
|
84
|
+
if (size === "large") {
|
|
85
85
|
mapPropertyKeys = Object.keys(property.properties);
|
|
86
86
|
} else {
|
|
87
87
|
mapPropertyKeys = (property.previewProperties || Object.keys(property.properties)) as string[];
|
|
88
|
-
if (size === "
|
|
88
|
+
if (size === "medium")
|
|
89
89
|
mapPropertyKeys = mapPropertyKeys.slice(0, 3);
|
|
90
|
-
else if (size === "
|
|
90
|
+
else if (size === "small")
|
|
91
91
|
mapPropertyKeys = mapPropertyKeys.slice(0, 1);
|
|
92
92
|
}
|
|
93
93
|
|
|
94
|
-
if (size !== "
|
|
94
|
+
if (size !== "large")
|
|
95
95
|
return (
|
|
96
96
|
<div
|
|
97
97
|
className="w-full flex flex-col space-y-4"
|
|
@@ -101,7 +101,7 @@ function renderMap<T extends Record<string, any>>(property: ResolvedMapProperty<
|
|
|
101
101
|
{property.properties && property.properties[key] &&
|
|
102
102
|
<SkeletonPropertyComponent
|
|
103
103
|
property={property.properties[key]}
|
|
104
|
-
size={"
|
|
104
|
+
size={"medium"}/>}
|
|
105
105
|
</div>
|
|
106
106
|
))}
|
|
107
107
|
</div>
|
|
@@ -128,7 +128,7 @@ function renderMap<T extends Record<string, any>>(property: ResolvedMapProperty<
|
|
|
128
128
|
{property.properties && property.properties[key] &&
|
|
129
129
|
<SkeletonPropertyComponent
|
|
130
130
|
property={property.properties[key]}
|
|
131
|
-
size={"
|
|
131
|
+
size={"medium"}/>}
|
|
132
132
|
</th>
|
|
133
133
|
</tr>
|
|
134
134
|
);
|
|
@@ -160,7 +160,7 @@ function renderArrayOfMaps<M extends Record<string, any>>(properties: ResolvedPr
|
|
|
160
160
|
>
|
|
161
161
|
<SkeletonPropertyComponent
|
|
162
162
|
property={(properties)[key]}
|
|
163
|
-
size={"
|
|
163
|
+
size={"medium"}/>
|
|
164
164
|
</th>
|
|
165
165
|
)
|
|
166
166
|
)}
|
|
@@ -210,7 +210,7 @@ function renderGenericArrayCell(
|
|
|
210
210
|
<>
|
|
211
211
|
<SkeletonPropertyComponent key={`i_${index}`}
|
|
212
212
|
property={property}
|
|
213
|
-
size={"
|
|
213
|
+
size={"medium"}/>
|
|
214
214
|
</>
|
|
215
215
|
)}
|
|
216
216
|
</div>
|
|
@@ -226,7 +226,7 @@ function renderUrlAudioComponent() {
|
|
|
226
226
|
|
|
227
227
|
export function renderSkeletonImageThumbnail(size: PreviewSize) {
|
|
228
228
|
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
229
|
-
const imageSize = size === "
|
|
229
|
+
const imageSize = size === "small" ? 40 : size === "medium" ? 100 : 200;
|
|
230
230
|
return (
|
|
231
231
|
<Skeleton width={imageSize}
|
|
232
232
|
height={imageSize}/>
|
|
@@ -236,8 +236,8 @@ export function renderSkeletonImageThumbnail(size: PreviewSize) {
|
|
|
236
236
|
function renderUrlVideo(size: PreviewSize) {
|
|
237
237
|
|
|
238
238
|
return (
|
|
239
|
-
<Skeleton width={size !== "
|
|
240
|
-
height={size !== "
|
|
239
|
+
<Skeleton width={size !== "large" ? 300 : 500}
|
|
240
|
+
height={size !== "large" ? 200 : 250}/>
|
|
241
241
|
);
|
|
242
242
|
}
|
|
243
243
|
|
|
@@ -245,7 +245,7 @@ function renderReference() {
|
|
|
245
245
|
return <Skeleton width={200} height={100}/>;
|
|
246
246
|
}
|
|
247
247
|
|
|
248
|
-
function renderUrlComponent(property: ResolvedStringProperty, size: PreviewSize = "
|
|
248
|
+
function renderUrlComponent(property: ResolvedStringProperty, size: PreviewSize = "large") {
|
|
249
249
|
|
|
250
250
|
if (typeof property.url === "boolean") {
|
|
251
251
|
return <div style={{
|
|
@@ -6,7 +6,7 @@ import { PreviewType } from "../../types";
|
|
|
6
6
|
import { UrlComponentPreview } from "../components/UrlComponentPreview";
|
|
7
7
|
import { PropertyPreviewProps } from "../PropertyPreviewProps";
|
|
8
8
|
import { ErrorBoundary } from "../../components";
|
|
9
|
-
import { Chip,
|
|
9
|
+
import { Chip, cls, getColorSchemeForSeed } from "@firecms/ui";
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* @group Preview components
|
|
@@ -45,14 +45,14 @@ export function StringPropertyPreview({
|
|
|
45
45
|
if (!value) return <></>;
|
|
46
46
|
const lines = value.split("\n");
|
|
47
47
|
return value && value.includes("\n")
|
|
48
|
-
? <div className={
|
|
48
|
+
? <div className={cls("overflow-x-scroll", size === "small" ? "text-sm" : "")}>
|
|
49
49
|
{lines.map((str, index) =>
|
|
50
50
|
<React.Fragment key={`string_preview_${index}`}>
|
|
51
51
|
<span>{str}</span>
|
|
52
52
|
{index !== lines.length - 1 && <br/>}
|
|
53
53
|
</React.Fragment>)}
|
|
54
54
|
</div>
|
|
55
|
-
: (size === "
|
|
55
|
+
: (size === "small"
|
|
56
56
|
? <span className={"text-sm"}>{value}</span>
|
|
57
57
|
: <>{value}</>
|
|
58
58
|
);
|
package/src/preview/util.ts
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { CollectionSize } from "../types";
|
|
2
2
|
import { PreviewSize } from "./PropertyPreviewProps";
|
|
3
3
|
|
|
4
|
-
export const
|
|
5
|
-
export const
|
|
6
|
-
export const
|
|
4
|
+
export const SMALL_THUMBNAIL = 40;
|
|
5
|
+
export const MEDIUM_THUMBNAIL = 100;
|
|
6
|
+
export const LARGE_THUMBNAIL = 200;
|
|
7
7
|
|
|
8
8
|
export function getThumbnailMeasure(size: PreviewSize): number {
|
|
9
|
-
if (size === "
|
|
10
|
-
return TINY_THUMBNAIL;
|
|
11
|
-
else if (size === "small")
|
|
9
|
+
if (size === "small")
|
|
12
10
|
return SMALL_THUMBNAIL;
|
|
13
11
|
else if (size === "medium")
|
|
14
|
-
return
|
|
12
|
+
return MEDIUM_THUMBNAIL;
|
|
13
|
+
else if (size === "large")
|
|
14
|
+
return LARGE_THUMBNAIL;
|
|
15
15
|
else throw Error("Thumbnail size not mapped");
|
|
16
16
|
}
|
|
17
17
|
|
|
@@ -19,12 +19,12 @@ export function getPreviewSizeFrom(size: CollectionSize): PreviewSize {
|
|
|
19
19
|
switch (size) {
|
|
20
20
|
case "xs":
|
|
21
21
|
case "s":
|
|
22
|
-
return "tiny";
|
|
23
|
-
case "m":
|
|
24
22
|
return "small";
|
|
23
|
+
case "m":
|
|
24
|
+
return "medium";
|
|
25
25
|
case "l":
|
|
26
26
|
case "xl":
|
|
27
|
-
return "
|
|
27
|
+
return "large";
|
|
28
28
|
default:
|
|
29
29
|
throw Error("Missing mapping value in getPreviewSizeFrom: " + size);
|
|
30
30
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { CMSView } from "../types";
|
|
2
|
+
import { useBreadcrumbsController } from "../hooks/useBreadcrumbsController";
|
|
3
|
+
import { useEffect } from "react";
|
|
4
|
+
|
|
5
|
+
export function CustomCMSRoute({ cmsView }: {
|
|
6
|
+
cmsView: CMSView
|
|
7
|
+
}) {
|
|
8
|
+
|
|
9
|
+
const breadcrumbs = useBreadcrumbsController();
|
|
10
|
+
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
breadcrumbs.set({
|
|
13
|
+
breadcrumbs: [{
|
|
14
|
+
title: cmsView.name,
|
|
15
|
+
url: cmsView.path
|
|
16
|
+
}]
|
|
17
|
+
});
|
|
18
|
+
}, [cmsView.path]);
|
|
19
|
+
|
|
20
|
+
return cmsView.view;
|
|
21
|
+
}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { Blocker, useBlocker, useLocation } from "react-router";
|
|
2
|
+
import { EntityEditView } from "../core/EntityEditView";
|
|
3
|
+
import { useNavigationController } from "../hooks";
|
|
4
|
+
import { useEffect, useRef, useState } from "react";
|
|
5
|
+
import { useNavigate } from "react-router-dom";
|
|
6
|
+
import {
|
|
7
|
+
getNavigationEntriesFromPath,
|
|
8
|
+
NavigationViewCollectionInternal,
|
|
9
|
+
NavigationViewEntityCustomInternal,
|
|
10
|
+
NavigationViewInternal
|
|
11
|
+
} from "../util/navigation_from_path";
|
|
12
|
+
import { useBreadcrumbsController } from "../hooks/useBreadcrumbsController";
|
|
13
|
+
import { toArray } from "../util/arrays";
|
|
14
|
+
import { EntityCollectionView, NotFoundPage } from "../components";
|
|
15
|
+
import { UnsavedChangesDialog } from "../components/UnsavedChangesDialog";
|
|
16
|
+
|
|
17
|
+
export function FireCMSRoute() {
|
|
18
|
+
|
|
19
|
+
const location = useLocation();
|
|
20
|
+
const navigation = useNavigationController();
|
|
21
|
+
const breadcrumbs = useBreadcrumbsController();
|
|
22
|
+
|
|
23
|
+
const hash = location.hash;
|
|
24
|
+
const isSidePanel = hash.includes("#side");
|
|
25
|
+
const isNew = hash.includes("#new") || hash.includes("#new_side");
|
|
26
|
+
const isCopy = hash.includes("#copy");
|
|
27
|
+
|
|
28
|
+
const pathname = location.pathname;
|
|
29
|
+
const navigationPath = navigation.urlPathToDataPath(pathname);
|
|
30
|
+
|
|
31
|
+
const navigationEntries = getNavigationEntriesFromPath({
|
|
32
|
+
path: navigationPath,
|
|
33
|
+
collections: navigation.collections ?? []
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
breadcrumbs.set({
|
|
38
|
+
breadcrumbs: navigationEntries.map(entry => {
|
|
39
|
+
if (entry.type === "entity") {
|
|
40
|
+
return ({
|
|
41
|
+
title: entry.entityId,
|
|
42
|
+
url: navigation.buildUrlCollectionPath(entry.fullPath)
|
|
43
|
+
});
|
|
44
|
+
} else if (entry.type === "custom_view") {
|
|
45
|
+
return ({
|
|
46
|
+
title: entry.view.name,
|
|
47
|
+
url: navigation.buildUrlCollectionPath(entry.fullPath)
|
|
48
|
+
});
|
|
49
|
+
} else if (entry.type === "collection") {
|
|
50
|
+
return ({
|
|
51
|
+
title: entry.collection.name,
|
|
52
|
+
url: navigation.buildUrlCollectionPath(entry.fullPath)
|
|
53
|
+
});
|
|
54
|
+
} else {
|
|
55
|
+
throw new Error("Unexpected navigation entry type");
|
|
56
|
+
}
|
|
57
|
+
})
|
|
58
|
+
});
|
|
59
|
+
}, [navigationEntries.map(entry => entry.path).join(",")]);
|
|
60
|
+
|
|
61
|
+
if (isNew) {
|
|
62
|
+
return <EntityFullScreenRoute
|
|
63
|
+
pathname={pathname}
|
|
64
|
+
navigationEntries={navigationEntries}
|
|
65
|
+
isNew={true}
|
|
66
|
+
isCopy={false}
|
|
67
|
+
/>;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (navigationEntries.length === 1 && navigationEntries[0].type === "collection") {
|
|
71
|
+
const collection = navigation.getCollection(navigationEntries[0].path);
|
|
72
|
+
if (!collection)
|
|
73
|
+
return null;
|
|
74
|
+
return <EntityCollectionView
|
|
75
|
+
key={`collection_view_${collection.id ?? collection.path}`}
|
|
76
|
+
isSubCollection={false}
|
|
77
|
+
parentCollectionIds={[]}
|
|
78
|
+
fullPath={collection.id}
|
|
79
|
+
updateUrl={true}
|
|
80
|
+
{...collection}
|
|
81
|
+
Actions={toArray(collection.Actions)}/>
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (isSidePanel) {
|
|
85
|
+
const lastCollectionEntry = navigationEntries.findLast((entry) => entry.type === "collection");
|
|
86
|
+
if (lastCollectionEntry) {
|
|
87
|
+
const collection = navigation.getCollection(lastCollectionEntry.path);
|
|
88
|
+
if (!collection)
|
|
89
|
+
return null;
|
|
90
|
+
return <EntityCollectionView
|
|
91
|
+
key={`collection_view_${collection.id ?? collection.path}`}
|
|
92
|
+
isSubCollection={false}
|
|
93
|
+
parentCollectionIds={[]}
|
|
94
|
+
fullPath={collection.id}
|
|
95
|
+
updateUrl={true}
|
|
96
|
+
{...collection}
|
|
97
|
+
Actions={toArray(collection.Actions)}/>;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return <EntityFullScreenRoute
|
|
102
|
+
pathname={pathname}
|
|
103
|
+
navigationEntries={navigationEntries}
|
|
104
|
+
isNew={isNew}
|
|
105
|
+
isCopy={isCopy}
|
|
106
|
+
/>;
|
|
107
|
+
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function getSelectedTabFromUrl(isNew: boolean, lastCustomView: NavigationViewCollectionInternal<any> | NavigationViewEntityCustomInternal<any> | undefined) {
|
|
111
|
+
if (isNew) {
|
|
112
|
+
return undefined;
|
|
113
|
+
} else if (lastCustomView) {
|
|
114
|
+
if (lastCustomView.type === "custom_view") {
|
|
115
|
+
return lastCustomView.view.key;
|
|
116
|
+
} else if (lastCustomView.type === "collection") {
|
|
117
|
+
return lastCustomView.id ?? lastCustomView.path;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return undefined;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function EntityFullScreenRoute({
|
|
124
|
+
pathname,
|
|
125
|
+
navigationEntries,
|
|
126
|
+
isNew,
|
|
127
|
+
isCopy
|
|
128
|
+
}: {
|
|
129
|
+
pathname: string;
|
|
130
|
+
navigationEntries: NavigationViewInternal[],
|
|
131
|
+
isNew: boolean,
|
|
132
|
+
isCopy: boolean
|
|
133
|
+
}) {
|
|
134
|
+
|
|
135
|
+
const navigation = useNavigationController();
|
|
136
|
+
const navigate = useNavigate();
|
|
137
|
+
|
|
138
|
+
const navigationPath = navigation.urlPathToDataPath(pathname);
|
|
139
|
+
|
|
140
|
+
// is navigating away blocked
|
|
141
|
+
const blocked = useRef(false);
|
|
142
|
+
|
|
143
|
+
const lastEntityEntry = navigationEntries.findLast((entry) => entry.type === "entity");
|
|
144
|
+
const navigationEntriesAfterEntity = lastEntityEntry ? navigationEntries.slice(navigationEntries.indexOf(lastEntityEntry) + 1) : [];
|
|
145
|
+
|
|
146
|
+
const lastCustomView = navigationEntriesAfterEntity.findLast(
|
|
147
|
+
(entry) => entry.type === "custom_view" || entry.type === "collection"
|
|
148
|
+
) as NavigationViewCollectionInternal<any> | NavigationViewEntityCustomInternal<any> | undefined;
|
|
149
|
+
|
|
150
|
+
const entityId = lastEntityEntry?.entityId;
|
|
151
|
+
|
|
152
|
+
const urlTab = getSelectedTabFromUrl(isNew, lastCustomView);
|
|
153
|
+
const [selectedTab, setSelectedTab] = useState<string | undefined>(urlTab);
|
|
154
|
+
|
|
155
|
+
const parentCollectionIds = navigation.getParentCollectionIds(navigationPath);
|
|
156
|
+
useEffect(() => {
|
|
157
|
+
if (urlTab !== selectedTab) {
|
|
158
|
+
setSelectedTab(urlTab);
|
|
159
|
+
}
|
|
160
|
+
}, [urlTab]);
|
|
161
|
+
|
|
162
|
+
const basePath = !entityId || isNew
|
|
163
|
+
? pathname
|
|
164
|
+
: pathname.substring(0, pathname.lastIndexOf(`/${entityId}`));
|
|
165
|
+
|
|
166
|
+
const entityPath = basePath + `/${entityId}`;
|
|
167
|
+
|
|
168
|
+
let blocker: Blocker | undefined = undefined;
|
|
169
|
+
try {
|
|
170
|
+
blocker = useBlocker(({
|
|
171
|
+
nextLocation
|
|
172
|
+
}) => {
|
|
173
|
+
if (nextLocation.pathname.startsWith(entityPath))
|
|
174
|
+
return false;
|
|
175
|
+
return blocked.current;
|
|
176
|
+
});
|
|
177
|
+
} catch (e) {
|
|
178
|
+
console.warn("Blocker not available, navigation will not be blocked");
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
const lastCollectionEntry = navigationEntries.findLast((entry) => entry.type === "collection");
|
|
182
|
+
|
|
183
|
+
if (isNew && !lastCollectionEntry) {
|
|
184
|
+
throw new Error("INTERNAL: No collection found in the navigation");
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
if (!isNew && !lastEntityEntry) {
|
|
188
|
+
return <NotFoundPage/>;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
const collection = isNew ? lastCollectionEntry!.collection : lastEntityEntry!.parentCollection;
|
|
192
|
+
const collectionPath = navigation.resolveIdsFrom(isNew ? lastCollectionEntry!.path : lastEntityEntry!.path);
|
|
193
|
+
|
|
194
|
+
return <>
|
|
195
|
+
<EntityEditView
|
|
196
|
+
key={collection.id + "_" + (isNew ? "new" : (isCopy ? entityId + "_copy" : entityId))}
|
|
197
|
+
entityId={isNew ? undefined : entityId}
|
|
198
|
+
collection={collection}
|
|
199
|
+
layout={"full_screen"}
|
|
200
|
+
path={collectionPath}
|
|
201
|
+
copy={isCopy}
|
|
202
|
+
selectedTab={selectedTab ?? undefined}
|
|
203
|
+
onValuesModified={(modified) => blocked.current = modified}
|
|
204
|
+
onSaved={(params) => {
|
|
205
|
+
const newSelectedTab = params.selectedTab;
|
|
206
|
+
const newEntityId = params.entityId;
|
|
207
|
+
if (newSelectedTab) {
|
|
208
|
+
navigate(`${basePath}/${newEntityId}/${newSelectedTab}`, { replace: true });
|
|
209
|
+
} else {
|
|
210
|
+
navigate(`${basePath}/${newEntityId}`, { replace: true });
|
|
211
|
+
}
|
|
212
|
+
}}
|
|
213
|
+
onTabChange={(params) => {
|
|
214
|
+
setSelectedTab(params.selectedTab);
|
|
215
|
+
if (isNew) {
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
const newSelectedTab = params.selectedTab;
|
|
219
|
+
if (newSelectedTab) {
|
|
220
|
+
navigate(`${basePath}/${entityId}/${newSelectedTab}`, { replace: true });
|
|
221
|
+
} else {
|
|
222
|
+
navigate(`${basePath}/${entityId}`, { replace: true });
|
|
223
|
+
}
|
|
224
|
+
}}
|
|
225
|
+
parentCollectionIds={parentCollectionIds}
|
|
226
|
+
/>
|
|
227
|
+
|
|
228
|
+
<UnsavedChangesDialog
|
|
229
|
+
open={blocker?.state === "blocked"}
|
|
230
|
+
handleOk={() => blocker?.proceed?.()}
|
|
231
|
+
handleCancel={() => blocker?.reset?.()}
|
|
232
|
+
body={"You have unsaved changes in this entity."}/>
|
|
233
|
+
|
|
234
|
+
</>;
|
|
235
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { useBreadcrumbsController } from "../hooks/useBreadcrumbsController";
|
|
2
|
+
import { useEffect } from "react";
|
|
3
|
+
|
|
4
|
+
export function HomePageRoute({ children }: {
|
|
5
|
+
children: React.ReactNode;
|
|
6
|
+
}) {
|
|
7
|
+
|
|
8
|
+
const breadcrumbs = useBreadcrumbsController();
|
|
9
|
+
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
breadcrumbs.set({
|
|
12
|
+
breadcrumbs: []
|
|
13
|
+
});
|
|
14
|
+
}, []);
|
|
15
|
+
|
|
16
|
+
return children;
|
|
17
|
+
}
|
package/src/types/auth.tsx
CHANGED
|
@@ -9,18 +9,13 @@ import { StorageSource } from "./storage";
|
|
|
9
9
|
* to do it as the result of a hook.
|
|
10
10
|
* @group Hooks and utilities
|
|
11
11
|
*/
|
|
12
|
-
export type AuthController<
|
|
12
|
+
export type AuthController<USER extends User = any, ExtraData = any> = {
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
15
|
* The user currently logged in
|
|
16
16
|
* The values can be: the user object, null if they skipped login
|
|
17
17
|
*/
|
|
18
|
-
user:
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Roles related to the logged user
|
|
22
|
-
*/
|
|
23
|
-
roles?: Role[];
|
|
18
|
+
user: USER | null;
|
|
24
19
|
|
|
25
20
|
/**
|
|
26
21
|
* Initial loading flag. It is used not to display the login screen
|
|
@@ -38,7 +33,7 @@ export type AuthController<UserType extends User = any, ExtraData extends any =
|
|
|
38
33
|
/**
|
|
39
34
|
* Sign out
|
|
40
35
|
*/
|
|
41
|
-
signOut: () => void
|
|
36
|
+
signOut: () => Promise<void>;
|
|
42
37
|
|
|
43
38
|
/**
|
|
44
39
|
* Error initializing the authentication
|
|
@@ -64,26 +59,27 @@ export type AuthController<UserType extends User = any, ExtraData extends any =
|
|
|
64
59
|
|
|
65
60
|
setExtra: (extra: ExtraData) => void;
|
|
66
61
|
|
|
67
|
-
|
|
62
|
+
setUser?: (user: USER | null) => void;
|
|
63
|
+
|
|
64
|
+
setUserRoles?: (roles: Role[]) => void;
|
|
68
65
|
|
|
69
|
-
// setRoles?: (roles: Role[]) => void;
|
|
70
66
|
};
|
|
71
67
|
|
|
72
68
|
/**
|
|
73
69
|
* Implement this function to allow access to specific users.
|
|
74
70
|
* @group Hooks and utilities
|
|
75
71
|
*/
|
|
76
|
-
export type Authenticator<
|
|
72
|
+
export type Authenticator<USER extends User = User> = (props: {
|
|
77
73
|
|
|
78
74
|
/**
|
|
79
75
|
* Logged-in user or null
|
|
80
76
|
*/
|
|
81
|
-
user:
|
|
77
|
+
user: USER | null;
|
|
82
78
|
|
|
83
79
|
/**
|
|
84
80
|
* AuthController
|
|
85
81
|
*/
|
|
86
|
-
authController:
|
|
82
|
+
authController: AuthController<USER>;
|
|
87
83
|
|
|
88
84
|
/**
|
|
89
85
|
* Connector to your database, e.g. your Firestore database
|