@firecms/core 3.0.0-canary.27 → 3.0.0-canary.270
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 +31 -12
- 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 +14 -13
- package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +2 -2
- package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +22 -6
- package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +1 -0
- package/dist/components/EntityCollectionTable/column_utils.d.ts +1 -2
- package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +3 -1
- package/dist/components/EntityCollectionTable/index.d.ts +1 -1
- package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +1 -4
- package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +2 -2
- package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +7 -4
- package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +20 -2
- package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
- package/dist/components/EntityCollectionView/utils.d.ts +3 -0
- package/dist/components/EntityJsonPreview.d.ts +3 -0
- package/dist/components/EntityPreview.d.ts +10 -7
- package/dist/components/ErrorView.d.ts +1 -1
- package/dist/components/HomePage/DefaultHomePage.d.ts +2 -15
- package/dist/components/HomePage/HomePageDnD.d.ts +76 -0
- package/dist/components/HomePage/NavigationCard.d.ts +3 -1
- package/dist/components/HomePage/NavigationCardBinding.d.ts +4 -3
- package/dist/components/HomePage/NavigationGroup.d.ts +8 -1
- package/dist/components/HomePage/RenameGroupDialog.d.ts +9 -0
- package/dist/components/PropertyConfigBadge.d.ts +2 -1
- package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
- package/dist/components/ReferenceWidget.d.ts +3 -1
- package/dist/components/SelectableTable/SelectableTable.d.ts +14 -4
- package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
- package/dist/components/UnsavedChangesDialog.d.ts +8 -0
- package/dist/components/VirtualTable/VirtualTableProps.d.ts +24 -12
- package/dist/components/VirtualTable/types.d.ts +3 -3
- package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -3
- package/dist/components/common/index.d.ts +2 -1
- package/dist/components/common/table_height.d.ts +5 -0
- package/dist/components/common/types.d.ts +4 -6
- package/dist/components/common/useColumnsIds.d.ts +3 -1
- package/dist/components/common/{useDataSourceEntityCollectionTableController.d.ts → useDataSourceTableController.d.ts} +13 -2
- package/dist/components/common/useDebouncedCallback.d.ts +1 -0
- package/dist/components/common/useScrollRestoration.d.ts +14 -0
- package/dist/components/index.d.ts +5 -2
- package/dist/contexts/BreacrumbsContext.d.ts +8 -0
- package/dist/core/DefaultAppBar.d.ts +29 -0
- package/dist/core/DefaultDrawer.d.ts +19 -0
- package/dist/core/DrawerNavigationItem.d.ts +10 -0
- package/dist/core/EntityEditView.d.ts +43 -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/field_configs.d.ts +1 -1
- package/dist/core/index.d.ts +4 -4
- package/dist/form/EntityForm.d.ts +37 -64
- package/dist/form/EntityFormActions.d.ts +21 -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/ReferenceAsStringFieldBinding.d.ts +9 -0
- 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 +5 -13
- 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 +17 -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 +2 -0
- package/dist/hooks/useAuthController.d.ts +1 -1
- package/dist/hooks/useBreadcrumbsController.d.ts +26 -0
- package/dist/hooks/useBuildNavigationController.d.ts +57 -13
- package/dist/hooks/useCollapsedGroups.d.ts +9 -0
- 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 +23154 -13912
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +25917 -588
- package/dist/index.umd.js.map +1 -1
- package/dist/internal/useBuildDataSource.d.ts +3 -17
- package/dist/internal/useBuildSideEntityController.d.ts +3 -3
- package/dist/internal/useUnsavedChangesDialog.d.ts +7 -9
- package/dist/preview/PropertyPreviewProps.d.ts +6 -1
- package/dist/preview/components/EnumValuesChip.d.ts +1 -1
- package/dist/preview/components/ReferencePreview.d.ts +4 -3
- 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/analytics.d.ts +1 -1
- package/dist/types/auth.d.ts +8 -10
- package/dist/types/collections.d.ts +110 -25
- package/dist/types/customization_controller.d.ts +8 -0
- 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 +72 -8
- package/dist/types/entity_callbacks.d.ts +16 -16
- package/dist/types/entity_overrides.d.ts +2 -2
- package/dist/types/export_import.d.ts +4 -4
- package/dist/types/fields.d.ts +74 -42
- package/dist/types/firecms.d.ts +16 -3
- package/dist/types/firecms_context.d.ts +1 -1
- package/dist/types/index.d.ts +0 -1
- package/dist/types/navigation.d.ts +62 -19
- package/dist/types/permissions.d.ts +4 -4
- package/dist/types/plugins.d.ts +56 -13
- package/dist/types/properties.d.ts +81 -25
- package/dist/types/property_config.d.ts +1 -3
- package/dist/types/roles.d.ts +3 -0
- package/dist/types/side_dialogs_controller.d.ts +10 -0
- package/dist/types/side_entity_controller.d.ts +14 -1
- package/dist/types/storage.d.ts +75 -0
- package/dist/types/user.d.ts +1 -0
- package/dist/util/builders.d.ts +3 -3
- package/dist/util/callbacks.d.ts +2 -0
- package/dist/util/createFormexStub.d.ts +2 -0
- package/dist/util/entities.d.ts +3 -3
- package/dist/util/entity_actions.d.ts +2 -0
- package/dist/util/entity_cache.d.ts +23 -0
- package/dist/util/icon_list.d.ts +5 -1
- package/dist/util/icon_synonyms.d.ts +1 -98
- package/dist/util/icons.d.ts +7 -4
- package/dist/util/index.d.ts +3 -0
- package/dist/util/navigation_from_path.d.ts +10 -1
- package/dist/util/navigation_utils.d.ts +15 -3
- package/dist/util/objects.d.ts +2 -1
- package/dist/util/permissions.d.ts +4 -4
- package/dist/util/plurals.d.ts +0 -2
- package/dist/util/property_utils.d.ts +4 -4
- package/dist/util/references.d.ts +2 -2
- package/dist/util/resolutions.d.ts +42 -17
- package/dist/util/storage.d.ts +23 -2
- package/dist/util/useStorageUploadController.d.ts +3 -3
- package/package.json +69 -52
- 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 +447 -229
- package/src/components/CircularProgressCenter.tsx +2 -2
- package/src/components/ClearFilterSortButton.tsx +41 -0
- package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +12 -11
- package/src/components/DeleteEntityDialog.tsx +13 -20
- package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +65 -40
- package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +38 -31
- package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +30 -9
- package/src/components/EntityCollectionTable/PropertyTableCell.tsx +72 -42
- 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 +34 -39
- package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +49 -36
- package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +20 -8
- package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +135 -105
- package/src/components/EntityCollectionTable/internal/popup_field/useDraggable.tsx +9 -9
- package/src/components/EntityCollectionView/EntityCollectionView.tsx +235 -118
- package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +7 -4
- 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 +83 -62
- package/src/components/EntityView.tsx +13 -10
- package/src/components/ErrorView.tsx +4 -4
- package/src/components/FireCMSLogo.tsx +7 -51
- package/src/components/HomePage/DefaultHomePage.tsx +512 -157
- package/src/components/HomePage/FavouritesView.tsx +9 -14
- package/src/components/HomePage/HomePageDnD.tsx +599 -0
- package/src/components/HomePage/NavigationCard.tsx +48 -39
- package/src/components/HomePage/NavigationCardBinding.tsx +17 -16
- package/src/components/HomePage/NavigationGroup.tsx +144 -30
- package/src/components/HomePage/RenameGroupDialog.tsx +117 -0
- 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 +23 -13
- package/src/components/ReferenceWidget.tsx +21 -11
- package/src/components/SearchIconsView.tsx +10 -7
- package/src/components/SelectableTable/SelectableTable.tsx +157 -145
- package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
- package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +25 -8
- package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +36 -12
- package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +92 -23
- package/src/components/UnsavedChangesDialog.tsx +46 -0
- package/src/components/VirtualTable/VirtualTable.tsx +105 -51
- package/src/components/VirtualTable/VirtualTableCell.tsx +1 -9
- package/src/components/VirtualTable/VirtualTableHeader.tsx +10 -10
- package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
- package/src/components/VirtualTable/VirtualTableProps.tsx +28 -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 +2 -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 +64 -44
- package/src/components/common/index.ts +2 -1
- package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
- package/src/components/common/types.tsx +4 -6
- package/src/components/common/useColumnsIds.tsx +24 -3
- package/src/components/common/useDataSourceTableController.tsx +420 -0
- package/src/components/common/useDebouncedCallback.tsx +20 -0
- package/src/components/common/useScrollRestoration.tsx +68 -0
- package/src/components/common/useTableSearchHelper.ts +53 -12
- package/src/components/index.tsx +6 -2
- package/src/contexts/BreacrumbsContext.tsx +38 -0
- package/src/contexts/DialogsProvider.tsx +5 -4
- package/src/contexts/ModeController.tsx +1 -3
- package/src/contexts/SnackbarProvider.tsx +2 -0
- package/src/core/DefaultAppBar.tsx +219 -0
- package/src/core/DefaultDrawer.tsx +185 -0
- package/src/core/DrawerNavigationItem.tsx +66 -0
- package/src/core/EntityEditView.tsx +435 -470
- package/src/core/EntityEditViewFormActions.tsx +329 -0
- package/src/core/EntitySidePanel.tsx +88 -21
- package/src/core/FireCMS.tsx +74 -58
- package/src/core/FireCMSRouter.tsx +17 -0
- package/src/core/NavigationRoutes.tsx +28 -38
- package/src/core/SideDialogs.tsx +22 -12
- package/src/core/field_configs.tsx +26 -13
- package/src/core/index.tsx +6 -5
- package/src/form/EntityForm.tsx +620 -534
- package/src/form/EntityFormActions.tsx +211 -0
- package/src/form/PropertyFieldBinding.tsx +88 -45
- package/src/form/components/CustomIdField.tsx +9 -3
- 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 +23 -13
- package/src/form/components/StorageUploadProgress.tsx +5 -6
- package/src/form/components/index.tsx +3 -1
- package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +34 -19
- package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +50 -36
- package/src/form/field_bindings/BlockFieldBinding.tsx +56 -34
- package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -14
- package/src/form/field_bindings/KeyValueFieldBinding.tsx +61 -52
- package/src/form/field_bindings/MapFieldBinding.tsx +73 -55
- package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +159 -0
- package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +26 -21
- package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +11 -16
- package/src/form/field_bindings/ReferenceAsStringFieldBinding.tsx +135 -0
- package/src/form/field_bindings/ReferenceFieldBinding.tsx +42 -31
- package/src/form/field_bindings/RepeatFieldBinding.tsx +62 -35
- package/src/form/field_bindings/SelectFieldBinding.tsx +24 -15
- package/src/form/field_bindings/StorageUploadFieldBinding.tsx +257 -199
- package/src/form/field_bindings/SwitchFieldBinding.tsx +29 -24
- package/src/form/field_bindings/TextFieldBinding.tsx +28 -24
- package/src/form/index.tsx +17 -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 +26 -33
- package/src/hooks/data/useCollectionFetch.tsx +3 -3
- package/src/hooks/data/useDataSource.tsx +11 -3
- package/src/hooks/data/useEntityFetch.tsx +10 -6
- package/src/hooks/index.tsx +2 -0
- package/src/hooks/useAuthController.tsx +1 -1
- package/src/hooks/useBreadcrumbsController.tsx +31 -0
- package/src/hooks/useBrowserTitleAndIcon.tsx +1 -1
- package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
- package/src/hooks/useBuildModeController.tsx +22 -29
- package/src/hooks/useBuildNavigationController.tsx +440 -119
- package/src/hooks/useCollapsedGroups.ts +64 -0
- package/src/hooks/useFireCMSContext.tsx +3 -33
- package/src/hooks/useLargeLayout.tsx +0 -35
- package/src/hooks/useModeController.tsx +1 -2
- package/src/hooks/useProjectLog.tsx +32 -10
- package/src/hooks/useResolvedNavigationFrom.tsx +10 -12
- package/src/hooks/useValidateAuthenticator.tsx +17 -37
- package/src/index.ts +1 -0
- package/src/internal/useBuildDataSource.ts +79 -85
- package/src/internal/useBuildSideDialogsController.tsx +4 -2
- package/src/internal/useBuildSideEntityController.tsx +204 -77
- package/src/internal/useUnsavedChangesDialog.tsx +127 -91
- package/src/preview/PropertyPreview.tsx +34 -25
- package/src/preview/PropertyPreviewProps.tsx +7 -1
- package/src/preview/components/BooleanPreview.tsx +2 -2
- package/src/preview/components/EmptyValue.tsx +1 -1
- package/src/preview/components/EnumValuesChip.tsx +2 -2
- package/src/preview/components/ImagePreview.tsx +26 -37
- package/src/preview/components/ReferencePreview.tsx +26 -36
- package/src/preview/components/StorageThumbnail.tsx +5 -1
- package/src/preview/components/UrlComponentPreview.tsx +60 -28
- package/src/preview/property_previews/ArrayOfMapsPreview.tsx +6 -6
- package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +7 -5
- package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +5 -4
- package/src/preview/property_previews/ArrayOfStringsPreview.tsx +4 -4
- package/src/preview/property_previews/ArrayOneOfPreview.tsx +7 -6
- package/src/preview/property_previews/ArrayPropertyPreview.tsx +7 -6
- package/src/preview/property_previews/MapPropertyPreview.tsx +12 -11
- package/src/preview/property_previews/SkeletonPropertyComponent.tsx +13 -13
- package/src/preview/property_previews/StringPropertyPreview.tsx +3 -3
- package/src/preview/util.ts +10 -10
- package/src/routes/CustomCMSRoute.tsx +21 -0
- package/src/routes/FireCMSRoute.tsx +246 -0
- package/src/routes/HomePageRoute.tsx +17 -0
- package/src/types/analytics.ts +3 -0
- package/src/types/auth.tsx +9 -13
- package/src/types/collections.ts +132 -30
- package/src/types/customization_controller.tsx +9 -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 +86 -10
- package/src/types/entity_callbacks.ts +18 -18
- package/src/types/entity_overrides.tsx +2 -2
- package/src/types/export_import.ts +4 -4
- package/src/types/fields.tsx +85 -46
- package/src/types/firecms.tsx +18 -4
- package/src/types/firecms_context.tsx +1 -1
- package/src/types/index.ts +0 -1
- package/src/types/navigation.ts +77 -24
- package/src/types/permissions.ts +5 -5
- package/src/types/plugins.tsx +66 -15
- package/src/types/properties.ts +96 -27
- package/src/types/property_config.tsx +1 -2
- package/src/types/roles.ts +3 -0
- package/src/types/side_dialogs_controller.tsx +15 -0
- package/src/types/side_entity_controller.tsx +16 -1
- package/src/types/storage.ts +83 -1
- package/src/types/user.ts +2 -0
- package/src/util/builders.ts +10 -8
- package/src/util/callbacks.ts +119 -0
- package/src/util/createFormexStub.tsx +62 -0
- package/src/util/entities.ts +10 -7
- 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 +36 -11
- package/src/util/index.ts +3 -0
- package/src/util/join_collections.ts +9 -2
- package/src/util/make_properties_editable.ts +13 -5
- package/src/util/navigation_from_path.ts +33 -12
- package/src/util/navigation_utils.ts +141 -25
- package/src/util/objects.ts +90 -33
- package/src/util/parent_references_from_path.ts +3 -3
- package/src/util/permissions.ts +9 -8
- package/src/util/plurals.ts +0 -2
- package/src/util/property_utils.tsx +17 -6
- package/src/util/references.ts +19 -8
- package/src/util/resolutions.ts +122 -48
- package/src/util/storage.ts +79 -21
- package/src/util/strings.ts +2 -2
- package/src/util/useStorageUploadController.tsx +91 -28
- package/dist/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.d.ts +0 -5
- 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/EntityCollectionTable/internal/popup_field/ElementResizeListener.tsx +0 -59
- 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
|
@@ -8,6 +8,8 @@ import {
|
|
|
8
8
|
Entity,
|
|
9
9
|
EntityAction,
|
|
10
10
|
EntityCollection,
|
|
11
|
+
EntityReference,
|
|
12
|
+
EntityTableController,
|
|
11
13
|
FilterValues,
|
|
12
14
|
PartialEntityCollection,
|
|
13
15
|
PropertyOrBuilder,
|
|
@@ -17,7 +19,7 @@ import {
|
|
|
17
19
|
import {
|
|
18
20
|
EntityCollectionRowActions,
|
|
19
21
|
EntityCollectionTable,
|
|
20
|
-
|
|
22
|
+
useDataSourceTableController
|
|
21
23
|
} from "../EntityCollectionTable";
|
|
22
24
|
|
|
23
25
|
import {
|
|
@@ -26,7 +28,10 @@ import {
|
|
|
26
28
|
canEditEntity,
|
|
27
29
|
getPropertyInPath,
|
|
28
30
|
mergeDeep,
|
|
31
|
+
mergeEntityActions,
|
|
32
|
+
navigateToEntity,
|
|
29
33
|
resolveCollection,
|
|
34
|
+
resolveEntityAction,
|
|
30
35
|
resolveProperty
|
|
31
36
|
} from "../../util";
|
|
32
37
|
import { ReferencePreview } from "../../preview";
|
|
@@ -35,6 +40,7 @@ import {
|
|
|
35
40
|
useAuthController,
|
|
36
41
|
useCustomizationController,
|
|
37
42
|
useDataSource,
|
|
43
|
+
useFireCMSContext,
|
|
38
44
|
useLargeLayout,
|
|
39
45
|
useNavigationController,
|
|
40
46
|
useSideEntityController
|
|
@@ -44,7 +50,8 @@ import { EntityCollectionViewActions } from "./EntityCollectionViewActions";
|
|
|
44
50
|
import {
|
|
45
51
|
AddIcon,
|
|
46
52
|
Button,
|
|
47
|
-
|
|
53
|
+
cls,
|
|
54
|
+
focusedDisabled,
|
|
48
55
|
IconButton,
|
|
49
56
|
KeyboardTabIcon,
|
|
50
57
|
Markdown,
|
|
@@ -57,6 +64,10 @@ import {
|
|
|
57
64
|
import { setIn } from "@firecms/formex";
|
|
58
65
|
import { getSubcollectionColumnId } from "../EntityCollectionTable/internal/common";
|
|
59
66
|
import {
|
|
67
|
+
COLLECTION_GROUP_PARENT_ID,
|
|
68
|
+
copyEntityAction,
|
|
69
|
+
deleteEntityAction,
|
|
70
|
+
editEntityAction,
|
|
60
71
|
OnCellValueChange,
|
|
61
72
|
OnColumnResizeParams,
|
|
62
73
|
UniqueFieldValidator,
|
|
@@ -65,25 +76,44 @@ import {
|
|
|
65
76
|
} from "../common";
|
|
66
77
|
import { PopupFormField } from "../EntityCollectionTable/internal/popup_field/PopupFormField";
|
|
67
78
|
import { GetPropertyForProps } from "../EntityCollectionTable/EntityCollectionTableProps";
|
|
68
|
-
import {
|
|
69
|
-
copyEntityAction,
|
|
70
|
-
deleteEntityAction,
|
|
71
|
-
editEntityAction
|
|
72
|
-
} from "../EntityCollectionTable/internal/default_entity_actions";
|
|
73
79
|
import { DeleteEntityDialog } from "../DeleteEntityDialog";
|
|
74
80
|
import { useAnalyticsController } from "../../hooks/useAnalyticsController";
|
|
75
81
|
import { useSelectionController } from "./useSelectionController";
|
|
82
|
+
import { EntityCollectionViewStartActions } from "./EntityCollectionViewStartActions";
|
|
83
|
+
import { addRecentId, getRecentIds } from "./utils";
|
|
84
|
+
import { useScrollRestoration } from "../common/useScrollRestoration";
|
|
76
85
|
|
|
77
|
-
const
|
|
86
|
+
const DEFAULT_ENTITY_OPEN_MODE: "side_panel" | "full_screen" = "side_panel";
|
|
78
87
|
|
|
79
88
|
/**
|
|
80
89
|
* @group Components
|
|
81
90
|
*/
|
|
82
91
|
export type EntityCollectionViewProps<M extends Record<string, any>> = {
|
|
83
|
-
|
|
92
|
+
/**
|
|
93
|
+
* Complete path where this collection is located.
|
|
94
|
+
* It defaults to the collection path if not provided.
|
|
95
|
+
*/
|
|
96
|
+
fullPath?: string;
|
|
97
|
+
/**
|
|
98
|
+
* Full path using navigation ids.
|
|
99
|
+
*/
|
|
100
|
+
fullIdPath?: string;
|
|
101
|
+
/**
|
|
102
|
+
* If this is a subcollection, specify the parent collection ids.
|
|
103
|
+
*/
|
|
84
104
|
parentCollectionIds?: string[];
|
|
105
|
+
/**
|
|
106
|
+
* Whether this is a subcollection or not.
|
|
107
|
+
*/
|
|
85
108
|
isSubCollection?: boolean;
|
|
109
|
+
|
|
86
110
|
className?: string;
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* If true, this view will store its filter and sorting status in the url params
|
|
114
|
+
*/
|
|
115
|
+
updateUrl?: boolean;
|
|
116
|
+
|
|
87
117
|
} & EntityCollection<M>;
|
|
88
118
|
|
|
89
119
|
/**
|
|
@@ -107,42 +137,49 @@ export type EntityCollectionViewProps<M extends Record<string, any>> = {
|
|
|
107
137
|
*
|
|
108
138
|
* @param fullPath
|
|
109
139
|
* @param collection
|
|
110
|
-
|
|
140
|
+
|
|
111
141
|
* @group Components
|
|
112
142
|
*/
|
|
113
143
|
export const EntityCollectionView = React.memo(
|
|
114
144
|
function EntityCollectionView<M extends Record<string, any>>({
|
|
115
|
-
fullPath,
|
|
145
|
+
fullPath: fullPathProp,
|
|
146
|
+
fullIdPath,
|
|
116
147
|
parentCollectionIds,
|
|
117
148
|
isSubCollection,
|
|
118
149
|
className,
|
|
150
|
+
updateUrl,
|
|
119
151
|
...collectionProp
|
|
120
152
|
}: EntityCollectionViewProps<M>
|
|
121
153
|
) {
|
|
122
154
|
|
|
123
|
-
const
|
|
155
|
+
const context = useFireCMSContext();
|
|
124
156
|
const navigation = useNavigationController();
|
|
157
|
+
const fullPath = fullPathProp ?? collectionProp.path;
|
|
158
|
+
const dataSource = useDataSource(collectionProp);
|
|
125
159
|
const sideEntityController = useSideEntityController();
|
|
126
160
|
const authController = useAuthController();
|
|
127
161
|
const userConfigPersistence = useUserConfigurationPersistence();
|
|
128
162
|
const analyticsController = useAnalyticsController();
|
|
129
163
|
const customizationController = useCustomizationController();
|
|
130
164
|
|
|
131
|
-
|
|
132
165
|
const containerRef = React.useRef<HTMLDivElement>(null);
|
|
133
166
|
|
|
167
|
+
const scrollRestoration = useScrollRestoration();
|
|
168
|
+
|
|
134
169
|
const collection = useMemo(() => {
|
|
135
170
|
const userOverride = userConfigPersistence?.getCollectionConfig<M>(fullPath);
|
|
136
171
|
return (userOverride ? mergeDeep(collectionProp, userOverride) : collectionProp) as EntityCollection<M>;
|
|
137
172
|
}, [collectionProp, fullPath, userConfigPersistence?.getCollectionConfig]);
|
|
138
173
|
|
|
174
|
+
const openEntityMode = collection?.openEntityMode ?? DEFAULT_ENTITY_OPEN_MODE;
|
|
175
|
+
|
|
139
176
|
const collectionRef = React.useRef(collection);
|
|
140
177
|
useEffect(() => {
|
|
141
178
|
collectionRef.current = collection;
|
|
142
179
|
}, [collection]);
|
|
143
180
|
|
|
144
181
|
const canCreateEntities = canCreateEntity(collection, authController, fullPath, null);
|
|
145
|
-
const [
|
|
182
|
+
const [highlightedEntity, setHighlightedEntity] = useState<Entity<M> | undefined>(undefined);
|
|
146
183
|
const [deleteEntityClicked, setDeleteEntityClicked] = React.useState<Entity<M> | Entity<M>[] | undefined>(undefined);
|
|
147
184
|
|
|
148
185
|
const [lastDeleteTimestamp, setLastDeleteTimestamp] = React.useState<number>(0);
|
|
@@ -151,12 +188,12 @@ export const EntityCollectionView = React.memo(
|
|
|
151
188
|
const [docsCount, setDocsCount] = useState<number>(0);
|
|
152
189
|
|
|
153
190
|
const unselectNavigatedEntity = useCallback(() => {
|
|
154
|
-
const currentSelection =
|
|
191
|
+
const currentSelection = highlightedEntity;
|
|
155
192
|
setTimeout(() => {
|
|
156
|
-
if (currentSelection ===
|
|
157
|
-
|
|
193
|
+
if (currentSelection === highlightedEntity)
|
|
194
|
+
setHighlightedEntity(undefined);
|
|
158
195
|
}, 2400);
|
|
159
|
-
}, [
|
|
196
|
+
}, [highlightedEntity]);
|
|
160
197
|
|
|
161
198
|
const checkInlineEditing = useCallback((entity?: Entity<any>): boolean => {
|
|
162
199
|
const collection = collectionRef.current;
|
|
@@ -175,20 +212,15 @@ export const EntityCollectionView = React.memo(
|
|
|
175
212
|
const usedSelectionController = collection.selectionController ?? selectionController;
|
|
176
213
|
const {
|
|
177
214
|
selectedEntities,
|
|
178
|
-
toggleEntitySelection,
|
|
179
|
-
isEntitySelected,
|
|
180
215
|
setSelectedEntities
|
|
181
216
|
} = usedSelectionController;
|
|
182
217
|
|
|
183
|
-
|
|
184
|
-
setDeleteEntityClicked(undefined);
|
|
185
|
-
}, [selectedEntities]);
|
|
186
|
-
|
|
187
|
-
const tableController = useDataSourceEntityCollectionTableController<M>({
|
|
218
|
+
const tableController = useDataSourceTableController<M>({
|
|
188
219
|
fullPath,
|
|
189
|
-
collection
|
|
190
|
-
|
|
191
|
-
|
|
220
|
+
collection,
|
|
221
|
+
lastDeleteTimestamp,
|
|
222
|
+
scrollRestoration,
|
|
223
|
+
updateUrl
|
|
192
224
|
});
|
|
193
225
|
|
|
194
226
|
const tableKey = React.useRef<string>(Math.random().toString(36));
|
|
@@ -199,34 +231,45 @@ export const EntityCollectionView = React.memo(
|
|
|
199
231
|
}, [tableController.setPopupCell]);
|
|
200
232
|
|
|
201
233
|
const onEntityClick = useCallback((clickedEntity: Entity<M>) => {
|
|
202
|
-
console.log("Entity clicked", clickedEntity)
|
|
203
234
|
const collection = collectionRef.current;
|
|
204
|
-
|
|
235
|
+
setHighlightedEntity(clickedEntity);
|
|
205
236
|
analyticsController.onAnalyticsEvent?.("edit_entity_clicked", {
|
|
206
237
|
path: clickedEntity.path,
|
|
207
238
|
entityId: clickedEntity.id
|
|
208
239
|
});
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
240
|
+
|
|
241
|
+
if (collection) {
|
|
242
|
+
addRecentId(collection.id, clickedEntity.id);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
const path = collection?.collectionGroup ? clickedEntity.path : (fullPath ?? clickedEntity.path);
|
|
246
|
+
navigateToEntity({
|
|
247
|
+
navigation,
|
|
248
|
+
path,
|
|
249
|
+
fullIdPath,
|
|
250
|
+
sideEntityController,
|
|
251
|
+
openEntityMode,
|
|
212
252
|
collection,
|
|
213
|
-
|
|
214
|
-
onClose: unselectNavigatedEntity,
|
|
253
|
+
entityId: clickedEntity.id
|
|
215
254
|
});
|
|
255
|
+
|
|
216
256
|
}, [unselectNavigatedEntity, sideEntityController]);
|
|
217
257
|
|
|
218
258
|
const onNewClick = useCallback(() => {
|
|
219
|
-
|
|
220
259
|
const collection = collectionRef.current;
|
|
221
260
|
analyticsController.onAnalyticsEvent?.("new_entity_click", {
|
|
222
261
|
path: fullPath
|
|
223
262
|
});
|
|
224
|
-
|
|
225
|
-
|
|
263
|
+
navigateToEntity({
|
|
264
|
+
openEntityMode,
|
|
226
265
|
collection,
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
266
|
+
entityId: undefined,
|
|
267
|
+
path: fullPath,
|
|
268
|
+
fullIdPath,
|
|
269
|
+
sideEntityController,
|
|
270
|
+
navigation,
|
|
271
|
+
onClose: unselectNavigatedEntity
|
|
272
|
+
})
|
|
230
273
|
}, [fullPath, sideEntityController]);
|
|
231
274
|
|
|
232
275
|
const onMultipleDeleteClick = () => {
|
|
@@ -257,6 +300,7 @@ export const EntityCollectionView = React.memo(
|
|
|
257
300
|
fullPath: string,
|
|
258
301
|
parentCollectionIds: string[],
|
|
259
302
|
collection: EntityCollection;
|
|
303
|
+
tableController: EntityTableController;
|
|
260
304
|
}> | undefined
|
|
261
305
|
|
|
262
306
|
// we are only using the first plugin that implements this
|
|
@@ -297,23 +341,21 @@ export const EntityCollectionView = React.memo(
|
|
|
297
341
|
value,
|
|
298
342
|
property,
|
|
299
343
|
entityId
|
|
300
|
-
}) => dataSource.checkUniqueField(fullPath, name, value, entityId),
|
|
344
|
+
}) => dataSource.checkUniqueField(fullPath, name, value, entityId, collection),
|
|
301
345
|
[fullPath]);
|
|
302
346
|
|
|
303
347
|
const onValueChange: OnCellValueChange<any, any> = ({
|
|
304
|
-
fullPath,
|
|
305
|
-
context,
|
|
306
348
|
value,
|
|
307
349
|
propertyKey,
|
|
308
350
|
onValueUpdated,
|
|
309
351
|
setError,
|
|
310
|
-
entity,
|
|
352
|
+
data: entity,
|
|
311
353
|
}) => {
|
|
312
354
|
|
|
313
355
|
const updatedValues = setIn({ ...entity.values }, propertyKey, value);
|
|
314
356
|
|
|
315
357
|
const saveProps: SaveEntityProps = {
|
|
316
|
-
path: fullPath,
|
|
358
|
+
path: entity.path ?? fullPath,
|
|
317
359
|
entityId: entity.id,
|
|
318
360
|
values: updatedValues,
|
|
319
361
|
previousValues: entity.values,
|
|
@@ -324,10 +366,12 @@ export const EntityCollectionView = React.memo(
|
|
|
324
366
|
return saveEntityWithCallbacks({
|
|
325
367
|
...saveProps,
|
|
326
368
|
collection,
|
|
327
|
-
callbacks: collection.callbacks,
|
|
328
369
|
dataSource,
|
|
329
370
|
context,
|
|
330
|
-
onSaveSuccess: () =>
|
|
371
|
+
onSaveSuccess: () => {
|
|
372
|
+
setError(undefined);
|
|
373
|
+
onValueUpdated();
|
|
374
|
+
},
|
|
331
375
|
onSaveFailure: (e: Error) => {
|
|
332
376
|
console.error("Save failure");
|
|
333
377
|
console.error(e);
|
|
@@ -337,16 +381,16 @@ export const EntityCollectionView = React.memo(
|
|
|
337
381
|
|
|
338
382
|
};
|
|
339
383
|
|
|
340
|
-
const resolvedFullPath = navigation.
|
|
384
|
+
const resolvedFullPath = navigation.resolveIdsFrom(fullPath);
|
|
341
385
|
const resolvedCollection = useMemo(() => resolveCollection<M>({
|
|
342
386
|
collection,
|
|
343
387
|
path: fullPath,
|
|
344
|
-
|
|
388
|
+
propertyConfigs: customizationController.propertyConfigs,
|
|
389
|
+
authController,
|
|
345
390
|
}), [collection, fullPath]);
|
|
346
391
|
|
|
347
392
|
const getPropertyFor = useCallback(({
|
|
348
393
|
propertyKey,
|
|
349
|
-
propertyValue,
|
|
350
394
|
entity
|
|
351
395
|
}: GetPropertyForProps<M>) => {
|
|
352
396
|
let propertyOrBuilder: PropertyOrBuilder<any, M> | undefined = getPropertyInPath<M>(collection.properties, propertyKey);
|
|
@@ -360,13 +404,13 @@ export const EntityCollectionView = React.memo(
|
|
|
360
404
|
return resolveProperty({
|
|
361
405
|
propertyKey,
|
|
362
406
|
propertyOrBuilder,
|
|
363
|
-
path:
|
|
364
|
-
propertyValue,
|
|
407
|
+
path: entity.path,
|
|
365
408
|
values: entity.values,
|
|
366
409
|
entityId: entity.id,
|
|
367
|
-
|
|
410
|
+
propertyConfigs: customizationController.propertyConfigs,
|
|
411
|
+
authController
|
|
368
412
|
});
|
|
369
|
-
}, [collection.properties, customizationController.propertyConfigs,
|
|
413
|
+
}, [collection.properties, customizationController.propertyConfigs, resolvedCollection.properties]);
|
|
370
414
|
|
|
371
415
|
const displayedColumnIds = useColumnIds(resolvedCollection, true);
|
|
372
416
|
|
|
@@ -380,16 +424,20 @@ export const EntityCollectionView = React.memo(
|
|
|
380
424
|
Builder: ({ entity }) => (
|
|
381
425
|
<Button color={"primary"}
|
|
382
426
|
variant={"outlined"}
|
|
427
|
+
className={"max-w-full truncate justify-start"}
|
|
383
428
|
startIcon={<KeyboardTabIcon size={"small"}/>}
|
|
384
429
|
onClick={(event: any) => {
|
|
385
430
|
event.stopPropagation();
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
entityId: entity.id,
|
|
389
|
-
selectedSubPath: subcollection.id ?? subcollection.path,
|
|
431
|
+
navigateToEntity({
|
|
432
|
+
openEntityMode,
|
|
390
433
|
collection,
|
|
391
|
-
|
|
392
|
-
|
|
434
|
+
entityId: entity.id,
|
|
435
|
+
selectedTab: subcollection.id ?? subcollection.path,
|
|
436
|
+
path: fullPath,
|
|
437
|
+
fullIdPath,
|
|
438
|
+
navigation,
|
|
439
|
+
sideEntityController
|
|
440
|
+
})
|
|
393
441
|
}}>
|
|
394
442
|
{subcollection.name}
|
|
395
443
|
</Button>
|
|
@@ -406,16 +454,16 @@ export const EntityCollectionView = React.memo(
|
|
|
406
454
|
Builder: ({ entity }) => {
|
|
407
455
|
const collectionsWithPath = navigation.getParentReferencesFromPath(entity.path);
|
|
408
456
|
return (
|
|
409
|
-
|
|
457
|
+
<div className={"flex flex-col gap-2 w-full"}>
|
|
410
458
|
{collectionsWithPath.map((reference) => {
|
|
411
459
|
return (
|
|
412
460
|
<ReferencePreview
|
|
413
461
|
key={reference.path + "/" + reference.id}
|
|
414
462
|
reference={reference}
|
|
415
|
-
size={"
|
|
463
|
+
size={"small"}/>
|
|
416
464
|
);
|
|
417
465
|
})}
|
|
418
|
-
|
|
466
|
+
</div>
|
|
419
467
|
);
|
|
420
468
|
}
|
|
421
469
|
}]
|
|
@@ -448,7 +496,7 @@ export const EntityCollectionView = React.memo(
|
|
|
448
496
|
if (deleteEnabled)
|
|
449
497
|
actions.push(deleteEntityAction);
|
|
450
498
|
if (customEntityActions)
|
|
451
|
-
actions
|
|
499
|
+
return mergeEntityActions(actions, customEntityActions);
|
|
452
500
|
return actions;
|
|
453
501
|
};
|
|
454
502
|
|
|
@@ -460,23 +508,26 @@ export const EntityCollectionView = React.memo(
|
|
|
460
508
|
return (largeLayout ? (80 + actionsWidth) : (70 + actionsWidth)) + (collapsedActions.length > 0 ? (largeLayout ? 40 : 30) : 0);
|
|
461
509
|
};
|
|
462
510
|
|
|
463
|
-
const tableRowActionsBuilder = ({
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
511
|
+
const tableRowActionsBuilder = useCallback(({
|
|
512
|
+
entity,
|
|
513
|
+
size,
|
|
514
|
+
width,
|
|
515
|
+
frozen
|
|
516
|
+
}: {
|
|
469
517
|
entity: Entity<any>,
|
|
470
518
|
size: CollectionSize,
|
|
471
519
|
width: number,
|
|
472
520
|
frozen?: boolean
|
|
473
521
|
}) => {
|
|
474
522
|
|
|
475
|
-
const isSelected =
|
|
523
|
+
const isSelected = Boolean(usedSelectionController.selectedEntities.find(e => e.id == entity.id && e.path == entity.path));
|
|
524
|
+
const customEntityActions = (collection.entityActions ?? [])
|
|
525
|
+
.map(action => resolveEntityAction(action, customizationController.entityActions))
|
|
526
|
+
.filter(Boolean) as EntityAction[];
|
|
476
527
|
|
|
477
528
|
const actions = getActionsForEntity({
|
|
478
529
|
entity,
|
|
479
|
-
customEntityActions
|
|
530
|
+
customEntityActions
|
|
480
531
|
});
|
|
481
532
|
|
|
482
533
|
return (
|
|
@@ -487,18 +538,20 @@ export const EntityCollectionView = React.memo(
|
|
|
487
538
|
isSelected={isSelected}
|
|
488
539
|
selectionEnabled={selectionEnabled}
|
|
489
540
|
size={size}
|
|
490
|
-
highlightEntity={
|
|
541
|
+
highlightEntity={setHighlightedEntity}
|
|
491
542
|
unhighlightEntity={unselectNavigatedEntity}
|
|
492
543
|
collection={collection}
|
|
493
544
|
fullPath={fullPath}
|
|
545
|
+
fullIdPath={fullIdPath}
|
|
494
546
|
actions={actions}
|
|
495
547
|
hideId={collection?.hideIdFromCollection}
|
|
496
548
|
onCollectionChange={updateLastDeleteTimestamp}
|
|
497
549
|
selectionController={usedSelectionController}
|
|
550
|
+
openEntityMode={openEntityMode}
|
|
498
551
|
/>
|
|
499
552
|
);
|
|
500
553
|
|
|
501
|
-
};
|
|
554
|
+
}, [updateLastDeleteTimestamp, usedSelectionController]);
|
|
502
555
|
|
|
503
556
|
const title = <Popover
|
|
504
557
|
open={popOverOpen}
|
|
@@ -528,7 +581,7 @@ export const EntityCollectionView = React.memo(
|
|
|
528
581
|
</div>}
|
|
529
582
|
>
|
|
530
583
|
|
|
531
|
-
{collection.description && <div className="m-4 text-
|
|
584
|
+
{collection.description && <div className="m-4 text-surface-900 dark:text-white">
|
|
532
585
|
<Markdown source={collection.description}/>
|
|
533
586
|
</div>}
|
|
534
587
|
|
|
@@ -557,6 +610,7 @@ export const EntityCollectionView = React.memo(
|
|
|
557
610
|
property={property}
|
|
558
611
|
fullPath={fullPath}
|
|
559
612
|
collection={collection}
|
|
613
|
+
tableController={tableController}
|
|
560
614
|
parentCollectionIds={parentCollectionIds ?? []}/>;
|
|
561
615
|
})}
|
|
562
616
|
</>;
|
|
@@ -567,7 +621,8 @@ export const EntityCollectionView = React.memo(
|
|
|
567
621
|
if (typeof AddColumnComponent === "function")
|
|
568
622
|
return <AddColumnComponent fullPath={fullPath}
|
|
569
623
|
parentCollectionIds={parentCollectionIds ?? []}
|
|
570
|
-
collection={collection}
|
|
624
|
+
collection={collection}
|
|
625
|
+
tableController={tableController}/>;
|
|
571
626
|
return null;
|
|
572
627
|
}
|
|
573
628
|
: undefined;
|
|
@@ -584,12 +639,13 @@ export const EntityCollectionView = React.memo(
|
|
|
584
639
|
});
|
|
585
640
|
|
|
586
641
|
return (
|
|
587
|
-
<div className={
|
|
642
|
+
<div className={cls("overflow-hidden h-full w-full rounded-md", className)}
|
|
588
643
|
ref={containerRef}>
|
|
589
644
|
<EntityCollectionTable
|
|
590
645
|
key={`collection_table_${fullPath}`}
|
|
591
646
|
additionalFields={additionalFields}
|
|
592
647
|
tableController={tableController}
|
|
648
|
+
enablePopupIcon={true}
|
|
593
649
|
displayedColumnIds={displayedColumnIds}
|
|
594
650
|
onSizeChanged={onSizeChanged}
|
|
595
651
|
onEntityClick={onEntityClick}
|
|
@@ -599,13 +655,23 @@ export const EntityCollectionView = React.memo(
|
|
|
599
655
|
uniqueFieldValidator={uniqueFieldValidator}
|
|
600
656
|
title={title}
|
|
601
657
|
selectionController={usedSelectionController}
|
|
602
|
-
highlightedEntities={
|
|
658
|
+
highlightedEntities={highlightedEntity ? [highlightedEntity] : []}
|
|
603
659
|
defaultSize={collection.defaultSize}
|
|
604
660
|
properties={resolvedCollection.properties}
|
|
605
661
|
getPropertyFor={getPropertyFor}
|
|
606
662
|
onTextSearchClick={textSearchInitialised ? undefined : onTextSearchClick}
|
|
663
|
+
onScroll={tableController.onScroll}
|
|
664
|
+
initialScroll={tableController.initialScroll}
|
|
607
665
|
textSearchLoading={textSearchLoading}
|
|
608
666
|
textSearchEnabled={textSearchEnabled}
|
|
667
|
+
actionsStart={<EntityCollectionViewStartActions
|
|
668
|
+
parentCollectionIds={parentCollectionIds ?? []}
|
|
669
|
+
collection={collection}
|
|
670
|
+
tableController={tableController}
|
|
671
|
+
path={fullPath}
|
|
672
|
+
relativePath={collection.path}
|
|
673
|
+
selectionController={usedSelectionController}
|
|
674
|
+
collectionEntitiesCount={docsCount}/>}
|
|
609
675
|
actions={<EntityCollectionViewActions
|
|
610
676
|
parentCollectionIds={parentCollectionIds ?? []}
|
|
611
677
|
collection={collection}
|
|
@@ -640,22 +706,24 @@ export const EntityCollectionView = React.memo(
|
|
|
640
706
|
getIdColumnWidth={getIdColumnWidth}
|
|
641
707
|
additionalIDHeaderWidget={<EntityIdHeaderWidget
|
|
642
708
|
path={fullPath}
|
|
709
|
+
fullIdPath={fullIdPath ?? fullPath}
|
|
643
710
|
collection={collection}/>}
|
|
711
|
+
openEntityMode={openEntityMode}
|
|
644
712
|
/>
|
|
645
713
|
|
|
646
|
-
<PopupFormField
|
|
647
|
-
key={`popup_form_${popupCell?.propertyKey}_${popupCell?.
|
|
714
|
+
{popupCell && <PopupFormField
|
|
715
|
+
key={`popup_form_${popupCell?.propertyKey}_${popupCell?.entityId}`}
|
|
648
716
|
open={Boolean(popupCell)}
|
|
649
717
|
onClose={onPopupClose}
|
|
650
718
|
cellRect={popupCell?.cellRect}
|
|
651
719
|
propertyKey={popupCell?.propertyKey}
|
|
652
720
|
collection={collection}
|
|
653
|
-
|
|
721
|
+
entityId={popupCell.entityId}
|
|
654
722
|
tableKey={tableKey.current}
|
|
655
723
|
customFieldValidator={uniqueFieldValidator}
|
|
656
724
|
path={resolvedFullPath}
|
|
657
725
|
onCellValueChange={onValueChange}
|
|
658
|
-
container={containerRef.current}/>
|
|
726
|
+
container={containerRef.current}/>}
|
|
659
727
|
|
|
660
728
|
{deleteEntityClicked &&
|
|
661
729
|
<DeleteEntityDialog
|
|
@@ -671,7 +739,7 @@ export const EntityCollectionView = React.memo(
|
|
|
671
739
|
</div>
|
|
672
740
|
);
|
|
673
741
|
}, (a, b) => {
|
|
674
|
-
return equal(a.
|
|
742
|
+
return equal(a.path, b.path) &&
|
|
675
743
|
equal(a.parentCollectionIds, b.parentCollectionIds) &&
|
|
676
744
|
equal(a.isSubCollection, b.isSubCollection) &&
|
|
677
745
|
equal(a.className, b.className) &&
|
|
@@ -683,8 +751,15 @@ export const EntityCollectionView = React.memo(
|
|
|
683
751
|
equal(a.selectionController, b.selectionController) &&
|
|
684
752
|
equal(a.Actions, b.Actions) &&
|
|
685
753
|
equal(a.defaultSize, b.defaultSize) &&
|
|
754
|
+
equal(a.initialFilter, b.initialFilter) &&
|
|
755
|
+
equal(a.initialSort, b.initialSort) &&
|
|
756
|
+
equal(a.includeJsonView, b.includeJsonView) &&
|
|
686
757
|
equal(a.textSearchEnabled, b.textSearchEnabled) &&
|
|
687
758
|
equal(a.additionalFields, b.additionalFields) &&
|
|
759
|
+
equal(a.sideDialogWidth, b.sideDialogWidth) &&
|
|
760
|
+
equal(a.openEntityMode, b.openEntityMode) &&
|
|
761
|
+
equal(a.exportable, b.exportable) &&
|
|
762
|
+
equal(a.history, b.history) &&
|
|
688
763
|
equal(a.forceFilter, b.forceFilter);
|
|
689
764
|
}) as React.FunctionComponent<EntityCollectionViewProps<any>>
|
|
690
765
|
|
|
@@ -709,7 +784,7 @@ function EntitiesCount({
|
|
|
709
784
|
|
|
710
785
|
const sortByProperty = sortBy ? sortBy[0] : undefined;
|
|
711
786
|
const currentSort = sortBy ? sortBy[1] : undefined;
|
|
712
|
-
const resolvedPath = useMemo(() => navigation.
|
|
787
|
+
const resolvedPath = useMemo(() => navigation.resolveIdsFrom(fullPath), [fullPath, navigation.resolveIdsFrom]);
|
|
713
788
|
|
|
714
789
|
useEffect(() => {
|
|
715
790
|
if (dataSource.countEntities)
|
|
@@ -724,6 +799,7 @@ function EntitiesCount({
|
|
|
724
799
|
|
|
725
800
|
useEffect(() => {
|
|
726
801
|
if (onCountChange) {
|
|
802
|
+
setError(undefined);
|
|
727
803
|
onCountChange(count ?? 0);
|
|
728
804
|
}
|
|
729
805
|
}, [onCountChange, count]);
|
|
@@ -750,53 +826,94 @@ function buildPropertyWidthOverwrite(key: string, width: number): PartialEntityC
|
|
|
750
826
|
|
|
751
827
|
function EntityIdHeaderWidget({
|
|
752
828
|
collection,
|
|
753
|
-
path
|
|
829
|
+
path,
|
|
830
|
+
fullIdPath
|
|
754
831
|
}: {
|
|
755
832
|
collection: EntityCollection,
|
|
756
|
-
path: string
|
|
833
|
+
path: string,
|
|
834
|
+
fullIdPath: string
|
|
757
835
|
}) {
|
|
836
|
+
|
|
837
|
+
const navigation = useNavigationController();
|
|
758
838
|
const [openPopup, setOpenPopup] = React.useState(false);
|
|
759
839
|
const [searchString, setSearchString] = React.useState("");
|
|
840
|
+
const [recentIds, setRecentIds] = React.useState<string[]>(getRecentIds(collection.id));
|
|
760
841
|
const sideEntityController = useSideEntityController();
|
|
842
|
+
|
|
843
|
+
const openEntityMode = collection?.openEntityMode ?? DEFAULT_ENTITY_OPEN_MODE;
|
|
844
|
+
|
|
761
845
|
return (
|
|
762
|
-
<Tooltip title={!openPopup ? "Find by ID" : undefined}>
|
|
846
|
+
<Tooltip title={!openPopup ? "Find by ID" : undefined} asChild={false}>
|
|
763
847
|
<Popover
|
|
764
848
|
open={openPopup}
|
|
765
849
|
onOpenChange={setOpenPopup}
|
|
850
|
+
sideOffset={0}
|
|
851
|
+
align={"start"}
|
|
852
|
+
alignOffset={-117}
|
|
766
853
|
trigger={
|
|
767
854
|
<IconButton size={"small"}>
|
|
768
855
|
<SearchIcon size={"small"}/>
|
|
769
856
|
</IconButton>
|
|
770
|
-
}
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
e
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
entityId
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
857
|
+
}>
|
|
858
|
+
<div
|
|
859
|
+
className={cls("my-2 rounded-lg bg-surface-50 dark:bg-surface-950 text-surface-900 dark:text-white")}>
|
|
860
|
+
<form noValidate={true}
|
|
861
|
+
onSubmit={(e) => {
|
|
862
|
+
e.preventDefault();
|
|
863
|
+
if (!searchString) return;
|
|
864
|
+
setOpenPopup(false);
|
|
865
|
+
const entityId = searchString.trim();
|
|
866
|
+
setRecentIds(addRecentId(collection.id, entityId));
|
|
867
|
+
navigateToEntity({
|
|
868
|
+
openEntityMode,
|
|
869
|
+
collection,
|
|
870
|
+
entityId,
|
|
871
|
+
path,
|
|
872
|
+
fullIdPath,
|
|
873
|
+
sideEntityController,
|
|
874
|
+
navigation
|
|
875
|
+
})
|
|
876
|
+
}}
|
|
877
|
+
className={"w-96 max-w-full"}>
|
|
878
|
+
|
|
879
|
+
<div className="flex p-2 w-full gap-2">
|
|
880
|
+
<input
|
|
881
|
+
autoFocus={openPopup}
|
|
882
|
+
placeholder={"Find entity by ID"}
|
|
883
|
+
// size={"small"}
|
|
884
|
+
onChange={(e) => {
|
|
885
|
+
setSearchString(e.target.value);
|
|
886
|
+
}}
|
|
887
|
+
value={searchString}
|
|
888
|
+
className={"rounded-lg bg-white dark:bg-surface-800 flex-grow bg-transparent outline-none p-2 " + focusedDisabled}/>
|
|
889
|
+
<Button variant={"text"}
|
|
890
|
+
disabled={!(searchString.trim())}
|
|
891
|
+
type={"submit"}
|
|
892
|
+
><KeyboardTabIcon/></Button>
|
|
893
|
+
</div>
|
|
894
|
+
</form>
|
|
895
|
+
{recentIds && recentIds.length > 0 && <div className="flex flex-col gap-2 p-2">
|
|
896
|
+
{recentIds.map(id => (
|
|
897
|
+
<ReferencePreview reference={new EntityReference(id, path)}
|
|
898
|
+
key={id}
|
|
899
|
+
hover={true}
|
|
900
|
+
onClick={() => {
|
|
901
|
+
setOpenPopup(false);
|
|
902
|
+
navigateToEntity({
|
|
903
|
+
openEntityMode,
|
|
904
|
+
collection,
|
|
905
|
+
entityId: id,
|
|
906
|
+
path,
|
|
907
|
+
fullIdPath,
|
|
908
|
+
sideEntityController,
|
|
909
|
+
navigation
|
|
910
|
+
})
|
|
911
|
+
}}
|
|
912
|
+
includeEntityLink={false}
|
|
913
|
+
size={"small"}/>
|
|
914
|
+
))}
|
|
915
|
+
</div>}
|
|
916
|
+
</div>
|
|
800
917
|
</Popover>
|
|
801
918
|
|
|
802
919
|
</Tooltip>
|