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