@firecms/core 3.0.0-canary.21 → 3.0.0-canary.210
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/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 +33 -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 +21823 -14330
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +24174 -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 +61 -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/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 +321 -479
- 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 +193 -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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
|
|
3
|
-
import { canCreateEntity, canDeleteEntity
|
|
3
|
+
import { canCreateEntity, canDeleteEntity } from "../../util";
|
|
4
4
|
import { useAuthController, useCustomizationController, useFireCMSContext, useLargeLayout } from "../../hooks";
|
|
5
5
|
import { CollectionActionsProps, EntityCollection, EntityTableController, SelectionController } from "../../types";
|
|
6
6
|
import { AddIcon, Button, DeleteIcon, IconButton, Tooltip } from "@firecms/ui";
|
|
@@ -124,7 +124,9 @@ export function EntityCollectionViewActions<M extends Record<string, any>>({
|
|
|
124
124
|
|
|
125
125
|
return (
|
|
126
126
|
<>
|
|
127
|
-
|
|
127
|
+
<ErrorBoundary>
|
|
128
|
+
{actions}
|
|
129
|
+
</ErrorBoundary>
|
|
128
130
|
{multipleDeleteButton}
|
|
129
131
|
{addButton}
|
|
130
132
|
</>
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { useCustomizationController, useFireCMSContext } from "../../hooks";
|
|
3
|
+
import { CollectionActionsProps, EntityCollection, EntityTableController, SelectionController } from "../../types";
|
|
4
|
+
import { toArray } from "../../util/arrays";
|
|
5
|
+
import { ErrorBoundary } from "../ErrorBoundary";
|
|
6
|
+
import { ClearFilterSortButton } from "../ClearFilterSortButton";
|
|
7
|
+
|
|
8
|
+
export type EntityCollectionViewStartActionsProps<M extends Record<string, any>> = {
|
|
9
|
+
collection: EntityCollection<M>;
|
|
10
|
+
path: string;
|
|
11
|
+
relativePath: string;
|
|
12
|
+
parentCollectionIds: string[];
|
|
13
|
+
selectionController: SelectionController<M>;
|
|
14
|
+
tableController: EntityTableController<M>;
|
|
15
|
+
collectionEntitiesCount: number;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function EntityCollectionViewStartActions<M extends Record<string, any>>({
|
|
19
|
+
collection,
|
|
20
|
+
relativePath,
|
|
21
|
+
parentCollectionIds,
|
|
22
|
+
path,
|
|
23
|
+
selectionController,
|
|
24
|
+
tableController,
|
|
25
|
+
collectionEntitiesCount
|
|
26
|
+
}: EntityCollectionViewStartActionsProps<M>) {
|
|
27
|
+
|
|
28
|
+
const context = useFireCMSContext();
|
|
29
|
+
|
|
30
|
+
const customizationController = useCustomizationController();
|
|
31
|
+
const plugins = customizationController.plugins ?? [];
|
|
32
|
+
|
|
33
|
+
const actionProps: CollectionActionsProps = {
|
|
34
|
+
path,
|
|
35
|
+
relativePath,
|
|
36
|
+
parentCollectionIds,
|
|
37
|
+
collection,
|
|
38
|
+
selectionController,
|
|
39
|
+
context,
|
|
40
|
+
tableController,
|
|
41
|
+
collectionEntitiesCount
|
|
42
|
+
};
|
|
43
|
+
const actions: React.ReactNode[] = [
|
|
44
|
+
<ClearFilterSortButton
|
|
45
|
+
key={"clear_filter"}
|
|
46
|
+
tableController={tableController}
|
|
47
|
+
enabled={!collection.forceFilter}/>
|
|
48
|
+
];
|
|
49
|
+
|
|
50
|
+
if (plugins) {
|
|
51
|
+
plugins.forEach((plugin, i) => {
|
|
52
|
+
if (plugin.collectionView?.CollectionActionsStart) {
|
|
53
|
+
actions.push(...toArray(plugin.collectionView?.CollectionActionsStart)
|
|
54
|
+
.map((Action, j) => (
|
|
55
|
+
<ErrorBoundary key={`plugin_actions_${i}_${j}`}>
|
|
56
|
+
<Action {...actionProps} {...plugin.collectionView?.collectionActionsStartProps}/>
|
|
57
|
+
</ErrorBoundary>
|
|
58
|
+
)));
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return (
|
|
64
|
+
<>
|
|
65
|
+
{actions}
|
|
66
|
+
</>
|
|
67
|
+
);
|
|
68
|
+
}
|
|
@@ -7,19 +7,32 @@ export function useSelectionController<M extends Record<string, any> = any>(
|
|
|
7
7
|
|
|
8
8
|
const [selectedEntities, setSelectedEntities] = useState<Entity<M>[]>([]);
|
|
9
9
|
|
|
10
|
-
const toggleEntitySelection = useCallback((entity: Entity<M
|
|
10
|
+
const toggleEntitySelection = useCallback((entity: Entity<M>, newSelectedState?: boolean) => {
|
|
11
11
|
let newValue;
|
|
12
|
-
if (
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
if (newSelectedState === undefined) {
|
|
13
|
+
const isSelected = Boolean(selectedEntities.find(e => e.id === entity.id && e.path === entity.path));
|
|
14
|
+
if (isSelected) {
|
|
15
|
+
onSelectionChange?.(entity, false);
|
|
16
|
+
newValue = selectedEntities.filter((item: Entity<M>) => !(item.id === entity.id && item.path === entity.path));
|
|
17
|
+
} else {
|
|
18
|
+
onSelectionChange?.(entity, true);
|
|
19
|
+
newValue = [...selectedEntities, entity];
|
|
20
|
+
}
|
|
15
21
|
} else {
|
|
16
|
-
|
|
17
|
-
|
|
22
|
+
if (newSelectedState) {
|
|
23
|
+
onSelectionChange?.(entity, true);
|
|
24
|
+
newValue = [...selectedEntities, entity];
|
|
25
|
+
} else {
|
|
26
|
+
onSelectionChange?.(entity, false);
|
|
27
|
+
newValue = selectedEntities.filter((item: Entity<M>) => !(item.id === entity.id && item.path === entity.path));
|
|
28
|
+
}
|
|
18
29
|
}
|
|
19
30
|
setSelectedEntities(newValue);
|
|
20
31
|
}, [selectedEntities]);
|
|
21
32
|
|
|
22
|
-
const isEntitySelected = useCallback((entity: Entity<M>) =>
|
|
33
|
+
const isEntitySelected = useCallback((entity: Entity<M>) => {
|
|
34
|
+
return Boolean(selectedEntities.find(e => e.id === entity.id && e.path === entity.path));
|
|
35
|
+
}, [selectedEntities]);
|
|
23
36
|
|
|
24
37
|
return {
|
|
25
38
|
selectedEntities,
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export function addRecentId(collectionId: string, id: string) {
|
|
2
|
+
const recentIds = getRecentIds(collectionId);
|
|
3
|
+
const newRecentIds = [id, ...recentIds.filter(i => i !== id)];
|
|
4
|
+
if (newRecentIds.length > 5) {
|
|
5
|
+
newRecentIds.pop();
|
|
6
|
+
}
|
|
7
|
+
saveSearchedIdsLocally(collectionId, newRecentIds);
|
|
8
|
+
return newRecentIds;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function saveSearchedIdsLocally(collectionId: string, ids: string[]) {
|
|
12
|
+
localStorage.setItem("recent_id_searches::" + collectionId, JSON.stringify(ids));
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function getRecentIds(collectionId: string): string[] {
|
|
16
|
+
const stored = localStorage.getItem("recent_id_searches::" + collectionId);
|
|
17
|
+
if (!stored) return [];
|
|
18
|
+
return JSON.parse(stored);
|
|
19
|
+
}
|
|
@@ -8,9 +8,10 @@ import {
|
|
|
8
8
|
getEntityPreviewKeys,
|
|
9
9
|
getEntityTitlePropertyKey,
|
|
10
10
|
getValueInPath,
|
|
11
|
+
IconForView,
|
|
11
12
|
resolveCollection
|
|
12
13
|
} from "../util";
|
|
13
|
-
import {
|
|
14
|
+
import { cls, defaultBorderMixin, IconButton, KeyboardTabIcon, Skeleton, Tooltip, Typography } from "@firecms/ui";
|
|
14
15
|
import { PreviewSize, PropertyPreview, SkeletonPropertyComponent } from "../preview";
|
|
15
16
|
import { useCustomizationController, useNavigationController, useSideEntityController } from "../hooks";
|
|
16
17
|
import { useAnalyticsController } from "../hooks/useAnalyticsController";
|
|
@@ -21,9 +22,10 @@ export type EntityPreviewProps = {
|
|
|
21
22
|
collection?: EntityCollection,
|
|
22
23
|
hover?: boolean;
|
|
23
24
|
previewProperties?: string[],
|
|
24
|
-
disabled
|
|
25
|
+
disabled?: boolean,
|
|
25
26
|
entity: Entity<any>,
|
|
26
|
-
|
|
27
|
+
includeId?: boolean,
|
|
28
|
+
includeEntityLink?: boolean,
|
|
27
29
|
onClick?: (e: React.SyntheticEvent) => void;
|
|
28
30
|
};
|
|
29
31
|
|
|
@@ -39,7 +41,8 @@ export function EntityPreview({
|
|
|
39
41
|
previewProperties,
|
|
40
42
|
onClick,
|
|
41
43
|
size,
|
|
42
|
-
|
|
44
|
+
includeId = true,
|
|
45
|
+
includeEntityLink = true,
|
|
43
46
|
entity
|
|
44
47
|
}: EntityPreviewProps) {
|
|
45
48
|
|
|
@@ -59,39 +62,47 @@ export function EntityPreview({
|
|
|
59
62
|
collection,
|
|
60
63
|
path: entity.path,
|
|
61
64
|
values: entity.values,
|
|
62
|
-
|
|
65
|
+
propertyConfigs: customizationController.propertyConfigs
|
|
63
66
|
}), [collection]);
|
|
64
67
|
|
|
65
|
-
const listProperties = useMemo(() => getEntityPreviewKeys(resolvedCollection, customizationController.propertyConfigs, previewProperties, size === "
|
|
68
|
+
const listProperties = useMemo(() => getEntityPreviewKeys(resolvedCollection, customizationController.propertyConfigs, previewProperties, size === "medium" || size === "large" ? 3 : 1),
|
|
66
69
|
[previewProperties, resolvedCollection, size]);
|
|
67
70
|
|
|
68
71
|
const titleProperty = getEntityTitlePropertyKey(resolvedCollection, customizationController.propertyConfigs);
|
|
69
72
|
const imagePropertyKey = getEntityImagePreviewPropertyKey(resolvedCollection);
|
|
70
73
|
const imageProperty = imagePropertyKey ? resolvedCollection.properties[imagePropertyKey] : undefined;
|
|
71
|
-
|
|
74
|
+
const usedImageProperty = imageProperty && "of" in imageProperty ? imageProperty.of : imageProperty;
|
|
72
75
|
const restProperties = listProperties.filter(p => p !== titleProperty && p !== imagePropertyKey);
|
|
73
76
|
|
|
77
|
+
const imageValue = imagePropertyKey ? getValueInPath(entity.values, imagePropertyKey) : undefined;
|
|
78
|
+
const usedImageValue = imageProperty !== undefined ? ("of" in imageProperty
|
|
79
|
+
? ((imageValue ?? []).length > 0
|
|
80
|
+
? imageValue[0] : undefined)
|
|
81
|
+
: imageValue)
|
|
82
|
+
: undefined;
|
|
83
|
+
|
|
74
84
|
return <EntityPreviewContainer onClick={disabled ? undefined : onClick}
|
|
75
85
|
hover={disabled ? undefined : hover}
|
|
76
86
|
size={size}>
|
|
77
|
-
{
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
87
|
+
<div className={cls("flex w-10 h-10 ml-1 mr-2 shrink-0", size === "small" ? "my-0.5" : "m-2 self-start")}>
|
|
88
|
+
{usedImageProperty && usedImageValue && <PropertyPreview property={usedImageProperty}
|
|
89
|
+
propertyKey={imagePropertyKey as string}
|
|
90
|
+
size={"small"}
|
|
91
|
+
value={usedImageValue}/>}
|
|
92
|
+
{(!usedImageProperty || !usedImageValue) && <IconForView collectionOrView={collection}
|
|
93
|
+
color={"primary"}
|
|
94
|
+
size={size}
|
|
95
|
+
className={"m-auto p-1"}/>}
|
|
96
|
+
</div>
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
<div className={"flex flex-col grow-1 w-full m-1 shrink-1"} style={{
|
|
100
|
+
"maxWidth": "calc(100% - 96px)"
|
|
101
|
+
}}>
|
|
102
|
+
|
|
103
|
+
{size !== "small" && includeId && (
|
|
89
104
|
entity
|
|
90
|
-
? <div className={
|
|
91
|
-
size !== "medium"
|
|
92
|
-
? "block whitespace-nowrap overflow-hidden truncate"
|
|
93
|
-
: ""
|
|
94
|
-
}`}>
|
|
105
|
+
? <div className={"block whitespace-nowrap overflow-hidden truncate"}>
|
|
95
106
|
<Typography variant={"caption"}
|
|
96
107
|
color={"disabled"}
|
|
97
108
|
className={"font-mono"}>
|
|
@@ -101,17 +112,17 @@ export function EntityPreview({
|
|
|
101
112
|
: <Skeleton/>)}
|
|
102
113
|
|
|
103
114
|
{titleProperty && (
|
|
104
|
-
<div className={"my-0.5 text-sm font-medium"}>
|
|
115
|
+
<div className={"truncate my-0.5 text-sm font-medium"}>
|
|
105
116
|
{
|
|
106
117
|
entity
|
|
107
118
|
? <PropertyPreview
|
|
108
119
|
propertyKey={titleProperty as string}
|
|
109
120
|
value={getValueInPath(entity.values, titleProperty)}
|
|
110
121
|
property={resolvedCollection.properties[titleProperty as string] as ResolvedProperty}
|
|
111
|
-
size={"
|
|
122
|
+
size={"large"}/>
|
|
112
123
|
: <SkeletonPropertyComponent
|
|
113
124
|
property={resolvedCollection.properties[titleProperty as string] as ResolvedProperty}
|
|
114
|
-
size={"
|
|
125
|
+
size={"large"}/>
|
|
115
126
|
}
|
|
116
127
|
</div>
|
|
117
128
|
)}
|
|
@@ -122,17 +133,17 @@ export function EntityPreview({
|
|
|
122
133
|
|
|
123
134
|
return (
|
|
124
135
|
<div key={"ref_prev_" + key}
|
|
125
|
-
className={restProperties.length > 1 ? "my-0.5" : "my-0"}>
|
|
136
|
+
className={cls("truncate", restProperties.length > 1 ? "my-0.5" : "my-0")}>
|
|
126
137
|
{
|
|
127
138
|
entity
|
|
128
139
|
? <PropertyPreview
|
|
129
140
|
propertyKey={key as string}
|
|
130
141
|
value={getValueInPath(entity.values, key)}
|
|
131
142
|
property={childProperty as ResolvedProperty}
|
|
132
|
-
size={"
|
|
143
|
+
size={"small"}/>
|
|
133
144
|
: <SkeletonPropertyComponent
|
|
134
145
|
property={childProperty as ResolvedProperty}
|
|
135
|
-
size={"
|
|
146
|
+
size={"small"}/>
|
|
136
147
|
}
|
|
137
148
|
</div>
|
|
138
149
|
);
|
|
@@ -140,12 +151,12 @@ export function EntityPreview({
|
|
|
140
151
|
|
|
141
152
|
</div>
|
|
142
153
|
|
|
143
|
-
{entity &&
|
|
144
|
-
<Tooltip title={`See details for ${entity.id}`}
|
|
145
|
-
className={size !== "tiny" ? "self-start" : ""}>
|
|
154
|
+
{entity && includeEntityLink &&
|
|
155
|
+
<Tooltip title={`See details for ${entity.id}`} className={"shrink-0"}>
|
|
146
156
|
<IconButton
|
|
147
157
|
color={"inherit"}
|
|
148
|
-
size={"
|
|
158
|
+
size={"medium"}
|
|
159
|
+
className={size !== "small" ? "self-start" : ""}
|
|
149
160
|
onClick={(e) => {
|
|
150
161
|
e.stopPropagation();
|
|
151
162
|
analyticsController.onAnalyticsEvent?.("entity_click_from_reference", {
|
|
@@ -159,7 +170,7 @@ export function EntityPreview({
|
|
|
159
170
|
updateUrl: true
|
|
160
171
|
});
|
|
161
172
|
}}>
|
|
162
|
-
<KeyboardTabIcon size={"
|
|
173
|
+
<KeyboardTabIcon size={"medium"}/>
|
|
163
174
|
</IconButton>
|
|
164
175
|
</Tooltip>}
|
|
165
176
|
|
|
@@ -178,16 +189,16 @@ export type EntityPreviewContainerProps = {
|
|
|
178
189
|
onClick?: (e: React.SyntheticEvent) => void;
|
|
179
190
|
};
|
|
180
191
|
|
|
181
|
-
const
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
192
|
+
export const EntityPreviewContainer = React.forwardRef<HTMLDivElement, EntityPreviewContainerProps>(({
|
|
193
|
+
children,
|
|
194
|
+
hover,
|
|
195
|
+
onClick,
|
|
196
|
+
size,
|
|
197
|
+
style,
|
|
198
|
+
className,
|
|
199
|
+
fullwidth = true,
|
|
200
|
+
...props
|
|
201
|
+
}, ref) => {
|
|
191
202
|
return <div
|
|
192
203
|
ref={ref}
|
|
193
204
|
style={{
|
|
@@ -195,12 +206,13 @@ const EntityPreviewContainerInner = React.forwardRef<HTMLDivElement, EntityPrevi
|
|
|
195
206
|
// @ts-ignore
|
|
196
207
|
tabindex: 0
|
|
197
208
|
}}
|
|
198
|
-
className={
|
|
199
|
-
"bg-white dark:bg-
|
|
209
|
+
className={cls(
|
|
210
|
+
"bg-white dark:bg-surface-900",
|
|
211
|
+
"min-h-[42px]",
|
|
200
212
|
fullwidth ? "w-full" : "",
|
|
201
213
|
"items-center",
|
|
202
|
-
hover ? "hover:bg-
|
|
203
|
-
size === "
|
|
214
|
+
hover ? "hover:bg-surface-accent-50 dark:hover:bg-surface-800 group-hover:bg-surface-accent-50 dark:group-hover:bg-surface-800" : "",
|
|
215
|
+
size === "small" ? "p-1" : "px-2 py-1",
|
|
204
216
|
"flex border rounded-lg",
|
|
205
217
|
onClick ? "cursor-pointer" : "",
|
|
206
218
|
defaultBorderMixin,
|
|
@@ -216,6 +228,4 @@ const EntityPreviewContainerInner = React.forwardRef<HTMLDivElement, EntityPrevi
|
|
|
216
228
|
</div>;
|
|
217
229
|
});
|
|
218
230
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
export const EntityPreviewContainer = React.memo(EntityPreviewContainerInner) as React.FC<EntityPreviewContainerProps>;
|
|
231
|
+
EntityPreviewContainer.displayName = "EntityPreviewContainer";
|
|
@@ -2,7 +2,7 @@ import React, { useMemo } from "react";
|
|
|
2
2
|
import { PropertyPreview } from "../preview";
|
|
3
3
|
import { Entity, EntityCollection, ResolvedEntityCollection, ResolvedProperties } from "../types";
|
|
4
4
|
import { resolveCollection } from "../util";
|
|
5
|
-
import {
|
|
5
|
+
import { cls, defaultBorderMixin, IconButton, OpenInNewIcon } from "@firecms/ui";
|
|
6
6
|
import { CustomizationController } from "../types/customization_controller";
|
|
7
7
|
import { useCustomizationController } from "../hooks/useCustomizationController";
|
|
8
8
|
|
|
@@ -30,20 +30,20 @@ export function EntityView<M extends Record<string, any>>(
|
|
|
30
30
|
path,
|
|
31
31
|
entityId: entity.id,
|
|
32
32
|
values: entity.values,
|
|
33
|
-
|
|
34
|
-
}), [collection, path, entity]);
|
|
33
|
+
propertyConfigs: customizationController.propertyConfigs
|
|
34
|
+
}), [collection, path, entity, customizationController.propertyConfigs]);
|
|
35
35
|
|
|
36
36
|
const properties: ResolvedProperties = resolvedCollection.properties;
|
|
37
37
|
|
|
38
38
|
return (
|
|
39
39
|
<div className={"w-full " + className}>
|
|
40
40
|
<div className={"w-full mb-4"}>
|
|
41
|
-
<div className={
|
|
41
|
+
<div className={cls(defaultBorderMixin, "flex justify-between py-2 border-b last:border-b-0")}>
|
|
42
42
|
<div className="flex items-center w-1/4">
|
|
43
|
-
<span className="pl-2 text-sm text-
|
|
43
|
+
<span className="pl-2 text-sm text-surface-600">Id</span>
|
|
44
44
|
</div>
|
|
45
45
|
<div
|
|
46
|
-
className="flex-grow p-2 ml-2 w-3/4 text-
|
|
46
|
+
className="flex-grow p-2 ml-2 w-3/4 text-surface-900 dark:text-white min-h-[56px] flex items-center">
|
|
47
47
|
<span className="flex-grow mr-2">{entity.id}</span>
|
|
48
48
|
{customizationController?.entityLinkBuilder &&
|
|
49
49
|
<a href={customizationController.entityLinkBuilder({ entity })}
|
|
@@ -58,16 +58,16 @@ export function EntityView<M extends Record<string, any>>(
|
|
|
58
58
|
</div>
|
|
59
59
|
{Object.entries(properties)
|
|
60
60
|
.map(([key, property]) => {
|
|
61
|
-
const value =
|
|
61
|
+
const value = entity.values?.[key];
|
|
62
62
|
return (
|
|
63
63
|
<div
|
|
64
64
|
key={`reference_previews_${key}`}
|
|
65
|
-
className={
|
|
65
|
+
className={cls(defaultBorderMixin, "flex justify-between py-2 border-b last:border-b-0")}>
|
|
66
66
|
<div className="flex items-center w-1/4">
|
|
67
|
-
<span className="pl-2 text-sm text-
|
|
67
|
+
<span className="pl-2 text-sm text-surface-600">{property.name}</span>
|
|
68
68
|
</div>
|
|
69
69
|
<div
|
|
70
|
-
className="flex-grow p-2 ml-2 w-3/4 text-
|
|
70
|
+
className="flex-grow p-2 ml-2 w-3/4 text-surface-900 dark:text-white min-h-[56px] flex items-center">
|
|
71
71
|
<PropertyPreview
|
|
72
72
|
propertyKey={key}
|
|
73
73
|
value={value}
|
|
@@ -17,7 +17,7 @@ export interface ErrorViewProps {
|
|
|
17
17
|
* @param title
|
|
18
18
|
* @param error
|
|
19
19
|
* @param tooltip
|
|
20
|
-
|
|
20
|
+
|
|
21
21
|
* @group Components
|
|
22
22
|
*/
|
|
23
23
|
export function ErrorView({
|
|
@@ -26,13 +26,13 @@ export function ErrorView({
|
|
|
26
26
|
tooltip
|
|
27
27
|
}: ErrorViewProps): React.ReactElement {
|
|
28
28
|
const component = error instanceof Error ? error.message : error;
|
|
29
|
-
console.
|
|
29
|
+
console.warn("ErrorView", error)
|
|
30
30
|
|
|
31
31
|
const body = (
|
|
32
32
|
<div
|
|
33
33
|
className="flex items-center m-2">
|
|
34
|
-
<ErrorIcon size={"small"} color={"error"}/>
|
|
35
|
-
<div className="pl-
|
|
34
|
+
<ErrorIcon className={"mx-2"} size={"small"} color={"error"}/>
|
|
35
|
+
<div className="pl-4">
|
|
36
36
|
{title && <Typography
|
|
37
37
|
variant={"body2"}
|
|
38
38
|
className="font-medium">{title}</Typography>}
|
|
@@ -1,29 +1,27 @@
|
|
|
1
|
-
import React, { useCallback, useEffect, useState } from "react";
|
|
1
|
+
import React, { useCallback, useEffect, useRef, useState } from "react";
|
|
2
2
|
|
|
3
3
|
import { useCustomizationController, useFireCMSContext, useNavigationController } from "../../hooks";
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
CMSAnalyticsEvent,
|
|
6
|
+
PluginGenericProps,
|
|
7
|
+
PluginHomePageAdditionalCardsProps,
|
|
8
|
+
TopNavigationEntry
|
|
9
|
+
} from "../../types";
|
|
5
10
|
|
|
6
11
|
import { toArray } from "../../util/arrays";
|
|
7
12
|
import { NavigationGroup } from "./NavigationGroup";
|
|
8
13
|
import { NavigationCardBinding } from "./NavigationCardBinding";
|
|
9
14
|
|
|
10
|
-
|
|
11
|
-
import * as JsSearch from "js-search";
|
|
15
|
+
import Fuse from "fuse.js"
|
|
12
16
|
|
|
13
17
|
import { Container, SearchBar } from "@firecms/ui";
|
|
14
18
|
import { FavouritesView } from "./FavouritesView";
|
|
15
19
|
import { useRestoreScroll } from "../../internal/useRestoreScroll";
|
|
16
20
|
|
|
17
|
-
const search = new JsSearch.Search("url");
|
|
18
|
-
search.addIndex("name");
|
|
19
|
-
search.addIndex("description");
|
|
20
|
-
search.addIndex("group");
|
|
21
|
-
search.addIndex("path");
|
|
22
|
-
|
|
23
21
|
/**
|
|
24
22
|
* Default entry view for the CMS. This component renders navigation cards
|
|
25
23
|
* for each collection defined in the navigation.
|
|
26
|
-
|
|
24
|
+
|
|
27
25
|
* @group Components
|
|
28
26
|
*/
|
|
29
27
|
export function DefaultHomePage({
|
|
@@ -49,6 +47,8 @@ export function DefaultHomePage({
|
|
|
49
47
|
const customizationController = useCustomizationController();
|
|
50
48
|
const navigationController = useNavigationController();
|
|
51
49
|
|
|
50
|
+
const fuse = useRef<Fuse<TopNavigationEntry> | null>(null);
|
|
51
|
+
|
|
52
52
|
if (!navigationController.topLevelNavigation)
|
|
53
53
|
throw Error("Navigation not ready in FireCMSHomePage");
|
|
54
54
|
|
|
@@ -64,13 +64,16 @@ export function DefaultHomePage({
|
|
|
64
64
|
} = navigationController.topLevelNavigation;
|
|
65
65
|
|
|
66
66
|
const [filteredUrls, setFilteredUrls] = useState<string[] | null>(null);
|
|
67
|
+
const performingSearch = Boolean(filteredUrls);
|
|
67
68
|
|
|
68
69
|
const filteredNavigationEntries = filteredUrls
|
|
69
|
-
?
|
|
70
|
+
? filteredUrls.map(url => navigationEntries.find(e => e.url === url)).filter(Boolean) as TopNavigationEntry[]
|
|
70
71
|
: navigationEntries;
|
|
71
72
|
|
|
72
73
|
useEffect(() => {
|
|
73
|
-
|
|
74
|
+
fuse.current = new Fuse(navigationEntries, {
|
|
75
|
+
keys: ["name", "description", "group", "path"]
|
|
76
|
+
});
|
|
74
77
|
}, [navigationEntries]);
|
|
75
78
|
|
|
76
79
|
const updateSearchResults = useCallback(
|
|
@@ -78,12 +81,15 @@ export function DefaultHomePage({
|
|
|
78
81
|
if (!value || value === "") {
|
|
79
82
|
setFilteredUrls(null);
|
|
80
83
|
} else {
|
|
81
|
-
const searchResult =
|
|
82
|
-
|
|
84
|
+
const searchResult = fuse.current?.search(value);
|
|
85
|
+
if (searchResult) {
|
|
86
|
+
setFilteredUrls(searchResult.map((e) => e.item.url));
|
|
87
|
+
}
|
|
83
88
|
}
|
|
84
89
|
}, []);
|
|
85
90
|
|
|
86
|
-
const
|
|
91
|
+
const filteredGroups = filteredUrls ? filteredNavigationEntries.map(entry => entry.group) : [];
|
|
92
|
+
const allGroups: Array<string | undefined> = filteredUrls ? filteredGroups.filter((group, index) => filteredGroups.indexOf(group) === index) : [...groups];
|
|
87
93
|
if (filteredNavigationEntries.filter(e => !e.group).length > 0 || filteredNavigationEntries.length === 0) {
|
|
88
94
|
allGroups.push(undefined);
|
|
89
95
|
}
|
|
@@ -134,12 +140,13 @@ export function DefaultHomePage({
|
|
|
134
140
|
<SearchBar onTextSearch={updateSearchResults}
|
|
135
141
|
placeholder={"Search collections"}
|
|
136
142
|
large={false}
|
|
143
|
+
autoFocus={true}
|
|
137
144
|
innerClassName={"w-full"}
|
|
138
145
|
className={"w-full flex-grow"}/>
|
|
139
146
|
{additionalActions}
|
|
140
147
|
</div>
|
|
141
148
|
|
|
142
|
-
<FavouritesView hidden={
|
|
149
|
+
<FavouritesView hidden={performingSearch}/>
|
|
143
150
|
|
|
144
151
|
{additionalChildrenStart}
|
|
145
152
|
|
|
@@ -163,7 +170,7 @@ export function DefaultHomePage({
|
|
|
163
170
|
|
|
164
171
|
const thisGroupCollections = filteredNavigationEntries
|
|
165
172
|
.filter((entry) => entry.group === group || (!entry.group && group === undefined));
|
|
166
|
-
if (thisGroupCollections.length === 0 && AdditionalCards.length === 0)
|
|
173
|
+
if (thisGroupCollections.length === 0 && (AdditionalCards.length === 0 || performingSearch))
|
|
167
174
|
return null;
|
|
168
175
|
return (
|
|
169
176
|
<NavigationGroup
|
|
@@ -191,7 +198,7 @@ export function DefaultHomePage({
|
|
|
191
198
|
/>
|
|
192
199
|
</div>
|
|
193
200
|
))}
|
|
194
|
-
{AdditionalCards &&
|
|
201
|
+
{group?.toLowerCase() !== "admin" && AdditionalCards &&
|
|
195
202
|
AdditionalCards.map((AdditionalCard, i) => (
|
|
196
203
|
<div key={`nav_${group}_add_${i}`}>
|
|
197
204
|
<AdditionalCard {...actionProps} />
|
|
@@ -2,7 +2,7 @@ import { useNavigate } from "react-router-dom";
|
|
|
2
2
|
import { useNavigationController } from "../../hooks";
|
|
3
3
|
import { useUserConfigurationPersistence } from "../../hooks/useUserConfigurationPersistence";
|
|
4
4
|
import { TopNavigationEntry } from "../../types";
|
|
5
|
-
import { Chip, Collapse,
|
|
5
|
+
import { Chip, Collapse, StarIcon } from "@firecms/ui";
|
|
6
6
|
|
|
7
7
|
function NavigationChip({ entry }: { entry: TopNavigationEntry }) {
|
|
8
8
|
|
|
@@ -29,16 +29,11 @@ function NavigationChip({ entry }: { entry: TopNavigationEntry }) {
|
|
|
29
29
|
return <Chip
|
|
30
30
|
key={entry.path}
|
|
31
31
|
onClick={() => navigate(entry.url)}
|
|
32
|
-
icon={
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
className={"text-secondary"}/>
|
|
38
|
-
: <StarBorderIcon
|
|
39
|
-
onClick={onIconClick}
|
|
40
|
-
size={18}
|
|
41
|
-
className={"text-gray-400 dark:text-gray-500"}/>}>
|
|
32
|
+
icon={<StarIcon
|
|
33
|
+
onClick={onIconClick}
|
|
34
|
+
size={18}
|
|
35
|
+
className={favourite ? "text-secondary" : "text-surface-400 dark:text-surface-500"}/>
|
|
36
|
+
}>
|
|
42
37
|
{entry.name}
|
|
43
38
|
</Chip>;
|
|
44
39
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ArrowForwardIcon, Card,
|
|
1
|
+
import { ArrowForwardIcon, Card, cls, Markdown, Typography, } from "@firecms/ui";
|
|
2
2
|
|
|
3
3
|
export type NavigationCardProps = {
|
|
4
4
|
name: string,
|
|
@@ -17,7 +17,7 @@ export function NavigationCard({
|
|
|
17
17
|
}: NavigationCardProps) {
|
|
18
18
|
|
|
19
19
|
return (<Card
|
|
20
|
-
className={
|
|
20
|
+
className={cls("h-full p-4 cursor-pointer min-h-[230px]")}
|
|
21
21
|
onClick={() => {
|
|
22
22
|
onClick?.();
|
|
23
23
|
}}>
|
|
@@ -27,7 +27,7 @@ export function NavigationCard({
|
|
|
27
27
|
className="flex-grow w-full">
|
|
28
28
|
|
|
29
29
|
<div
|
|
30
|
-
className="h-10 flex items-center w-full justify-between text-
|
|
30
|
+
className="h-10 flex items-center w-full justify-between text-surface-300 dark:text-surface-600">
|
|
31
31
|
|
|
32
32
|
{icon}
|
|
33
33
|
|