@firecms/core 3.0.0-canary.29 → 3.0.0-canary.290
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 +77 -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/PropertyCollectionView.d.ts +23 -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/UserDisplay.d.ts +7 -0
- package/dist/components/VirtualTable/VirtualTableProps.d.ts +24 -12
- package/dist/components/VirtualTable/fields/VirtualTableUserSelect.d.ts +12 -0
- 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/contexts/InternalUserManagementContext.d.ts +3 -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 +49 -11
- package/dist/core/EntityEditViewFormActions.d.ts +2 -0
- package/dist/core/FireCMS.d.ts +2 -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 +40 -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/LocalChangesMenu.d.ts +11 -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/field_bindings/UserSelectFieldBinding.d.ts +12 -0
- package/dist/form/index.d.ts +18 -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 +3 -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/useInternalUserManagementController.d.ts +12 -0
- 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 +24546 -13965
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +27256 -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/components/UserPreview.d.ts +8 -0
- package/dist/preview/index.d.ts +1 -0
- 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 +123 -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 +12 -3
- 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 +79 -39
- package/dist/types/firecms.d.ts +31 -3
- package/dist/types/firecms_context.d.ts +17 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/internal_user_management.d.ts +20 -0
- package/dist/types/navigation.d.ts +62 -19
- package/dist/types/permissions.d.ts +4 -4
- package/dist/types/plugins.d.ts +58 -13
- package/dist/types/properties.d.ts +122 -31
- 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 +2 -1
- package/dist/util/builders.d.ts +3 -3
- package/dist/util/callbacks.d.ts +2 -0
- package/dist/util/collections.d.ts +1 -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 +28 -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/make_properties_editable.d.ts +1 -2
- 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 +3 -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 +4 -3
- package/package.json +70 -53
- 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 +87 -62
- package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +38 -31
- package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +30 -9
- package/src/components/EntityCollectionTable/PropertyTableCell.tsx +84 -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 +241 -119
- 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 +34 -42
- package/src/components/ErrorView.tsx +4 -4
- package/src/components/FireCMSLogo.tsx +7 -51
- package/src/components/HomePage/DefaultHomePage.tsx +516 -158
- package/src/components/HomePage/FavouritesView.tsx +9 -14
- package/src/components/HomePage/HomePageDnD.tsx +702 -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 +123 -0
- package/src/components/HomePage/SmallNavigationCard.tsx +5 -6
- package/src/components/NotFoundPage.tsx +2 -2
- package/src/components/PropertyCollectionView.tsx +329 -0
- package/src/components/PropertyConfigBadge.tsx +10 -4
- 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 -157
- package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
- package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +27 -9
- package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +36 -12
- package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +92 -24
- package/src/components/UnsavedChangesDialog.tsx +46 -0
- package/src/components/UserDisplay.tsx +55 -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/fields/VirtualTableUserSelect.tsx +99 -0
- 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 +16 -2
- 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/InternalUserManagementContext.tsx +4 -0
- 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 +447 -469
- package/src/core/EntityEditViewFormActions.tsx +344 -0
- package/src/core/EntitySidePanel.tsx +96 -23
- package/src/core/FireCMS.tsx +85 -60
- 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 +41 -14
- package/src/core/index.tsx +6 -5
- package/src/form/EntityForm.tsx +740 -523
- package/src/form/EntityFormActions.tsx +226 -0
- package/src/form/PropertyFieldBinding.tsx +88 -41
- package/src/form/components/CustomIdField.tsx +9 -3
- package/src/form/components/ErrorFocus.tsx +22 -29
- 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/LocalChangesMenu.tsx +144 -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 -33
- 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/field_bindings/UserSelectFieldBinding.tsx +94 -0
- package/src/form/index.tsx +21 -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 +4 -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 +515 -121
- package/src/hooks/useCollapsedGroups.ts +64 -0
- package/src/hooks/useFireCMSContext.tsx +9 -35
- package/src/hooks/useInternalUserManagementController.tsx +16 -0
- 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 +42 -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 +30 -38
- package/src/preview/components/StorageThumbnail.tsx +5 -1
- package/src/preview/components/UrlComponentPreview.tsx +60 -28
- package/src/preview/components/UserPreview.tsx +27 -0
- package/src/preview/index.ts +1 -0
- 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 +8 -7
- package/src/preview/property_previews/MapPropertyPreview.tsx +14 -13
- package/src/preview/property_previews/NumberPropertyPreview.tsx +2 -2
- 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 +146 -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 +19 -3
- 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 +91 -42
- package/src/types/firecms.tsx +34 -4
- package/src/types/firecms_context.tsx +18 -1
- package/src/types/index.ts +1 -1
- package/src/types/internal_user_management.ts +24 -0
- package/src/types/navigation.ts +77 -24
- package/src/types/permissions.ts +5 -5
- package/src/types/plugins.tsx +69 -15
- package/src/types/properties.ts +141 -33
- package/src/types/property_config.tsx +2 -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 +3 -1
- package/src/util/builders.ts +10 -8
- package/src/util/callbacks.ts +119 -0
- package/src/util/collections.ts +8 -0
- package/src/util/createFormexStub.tsx +66 -0
- package/src/util/entities.ts +11 -8
- package/src/util/entity_actions.ts +28 -0
- package/src/util/entity_cache.ts +223 -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 +11 -4
- package/src/util/make_properties_editable.ts +5 -19
- package/src/util/navigation_from_path.ts +33 -12
- package/src/util/navigation_utils.ts +141 -25
- package/src/util/objects.ts +128 -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 +162 -62
- 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,29 +366,36 @@ 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);
|
|
334
378
|
setError(e);
|
|
379
|
+
},
|
|
380
|
+
onPreSaveHookError: (e: Error) => {
|
|
381
|
+
console.error("Pre-save hook error");
|
|
382
|
+
console.error(e);
|
|
383
|
+
setError(e);
|
|
335
384
|
}
|
|
336
385
|
});
|
|
337
386
|
|
|
338
387
|
};
|
|
339
388
|
|
|
340
|
-
const resolvedFullPath = navigation.
|
|
389
|
+
const resolvedFullPath = navigation.resolveIdsFrom(fullPath);
|
|
341
390
|
const resolvedCollection = useMemo(() => resolveCollection<M>({
|
|
342
391
|
collection,
|
|
343
392
|
path: fullPath,
|
|
344
|
-
|
|
393
|
+
propertyConfigs: customizationController.propertyConfigs,
|
|
394
|
+
authController,
|
|
345
395
|
}), [collection, fullPath]);
|
|
346
396
|
|
|
347
397
|
const getPropertyFor = useCallback(({
|
|
348
398
|
propertyKey,
|
|
349
|
-
propertyValue,
|
|
350
399
|
entity
|
|
351
400
|
}: GetPropertyForProps<M>) => {
|
|
352
401
|
let propertyOrBuilder: PropertyOrBuilder<any, M> | undefined = getPropertyInPath<M>(collection.properties, propertyKey);
|
|
@@ -360,13 +409,13 @@ export const EntityCollectionView = React.memo(
|
|
|
360
409
|
return resolveProperty({
|
|
361
410
|
propertyKey,
|
|
362
411
|
propertyOrBuilder,
|
|
363
|
-
path:
|
|
364
|
-
propertyValue,
|
|
412
|
+
path: entity.path,
|
|
365
413
|
values: entity.values,
|
|
366
414
|
entityId: entity.id,
|
|
367
|
-
|
|
415
|
+
propertyConfigs: customizationController.propertyConfigs,
|
|
416
|
+
authController
|
|
368
417
|
});
|
|
369
|
-
}, [collection.properties, customizationController.propertyConfigs,
|
|
418
|
+
}, [collection.properties, customizationController.propertyConfigs, resolvedCollection.properties]);
|
|
370
419
|
|
|
371
420
|
const displayedColumnIds = useColumnIds(resolvedCollection, true);
|
|
372
421
|
|
|
@@ -380,16 +429,20 @@ export const EntityCollectionView = React.memo(
|
|
|
380
429
|
Builder: ({ entity }) => (
|
|
381
430
|
<Button color={"primary"}
|
|
382
431
|
variant={"outlined"}
|
|
432
|
+
className={"max-w-full truncate justify-start"}
|
|
383
433
|
startIcon={<KeyboardTabIcon size={"small"}/>}
|
|
384
434
|
onClick={(event: any) => {
|
|
385
435
|
event.stopPropagation();
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
entityId: entity.id,
|
|
389
|
-
selectedSubPath: subcollection.id ?? subcollection.path,
|
|
436
|
+
navigateToEntity({
|
|
437
|
+
openEntityMode,
|
|
390
438
|
collection,
|
|
391
|
-
|
|
392
|
-
|
|
439
|
+
entityId: entity.id,
|
|
440
|
+
selectedTab: subcollection.id ?? subcollection.path,
|
|
441
|
+
path: fullPath,
|
|
442
|
+
fullIdPath,
|
|
443
|
+
navigation,
|
|
444
|
+
sideEntityController
|
|
445
|
+
})
|
|
393
446
|
}}>
|
|
394
447
|
{subcollection.name}
|
|
395
448
|
</Button>
|
|
@@ -406,16 +459,16 @@ export const EntityCollectionView = React.memo(
|
|
|
406
459
|
Builder: ({ entity }) => {
|
|
407
460
|
const collectionsWithPath = navigation.getParentReferencesFromPath(entity.path);
|
|
408
461
|
return (
|
|
409
|
-
|
|
462
|
+
<div className={"flex flex-col gap-2 w-full"}>
|
|
410
463
|
{collectionsWithPath.map((reference) => {
|
|
411
464
|
return (
|
|
412
465
|
<ReferencePreview
|
|
413
466
|
key={reference.path + "/" + reference.id}
|
|
414
467
|
reference={reference}
|
|
415
|
-
size={"
|
|
468
|
+
size={"small"}/>
|
|
416
469
|
);
|
|
417
470
|
})}
|
|
418
|
-
|
|
471
|
+
</div>
|
|
419
472
|
);
|
|
420
473
|
}
|
|
421
474
|
}]
|
|
@@ -448,7 +501,7 @@ export const EntityCollectionView = React.memo(
|
|
|
448
501
|
if (deleteEnabled)
|
|
449
502
|
actions.push(deleteEntityAction);
|
|
450
503
|
if (customEntityActions)
|
|
451
|
-
actions
|
|
504
|
+
return mergeEntityActions(actions, customEntityActions);
|
|
452
505
|
return actions;
|
|
453
506
|
};
|
|
454
507
|
|
|
@@ -460,23 +513,26 @@ export const EntityCollectionView = React.memo(
|
|
|
460
513
|
return (largeLayout ? (80 + actionsWidth) : (70 + actionsWidth)) + (collapsedActions.length > 0 ? (largeLayout ? 40 : 30) : 0);
|
|
461
514
|
};
|
|
462
515
|
|
|
463
|
-
const tableRowActionsBuilder = ({
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
516
|
+
const tableRowActionsBuilder = useCallback(({
|
|
517
|
+
entity,
|
|
518
|
+
size,
|
|
519
|
+
width,
|
|
520
|
+
frozen
|
|
521
|
+
}: {
|
|
469
522
|
entity: Entity<any>,
|
|
470
523
|
size: CollectionSize,
|
|
471
524
|
width: number,
|
|
472
525
|
frozen?: boolean
|
|
473
526
|
}) => {
|
|
474
527
|
|
|
475
|
-
const isSelected =
|
|
528
|
+
const isSelected = Boolean(usedSelectionController.selectedEntities.find(e => e.id == entity.id && e.path == entity.path));
|
|
529
|
+
const customEntityActions = (collection.entityActions ?? [])
|
|
530
|
+
.map(action => resolveEntityAction(action, customizationController.entityActions))
|
|
531
|
+
.filter(Boolean) as EntityAction[];
|
|
476
532
|
|
|
477
533
|
const actions = getActionsForEntity({
|
|
478
534
|
entity,
|
|
479
|
-
customEntityActions
|
|
535
|
+
customEntityActions
|
|
480
536
|
});
|
|
481
537
|
|
|
482
538
|
return (
|
|
@@ -487,18 +543,20 @@ export const EntityCollectionView = React.memo(
|
|
|
487
543
|
isSelected={isSelected}
|
|
488
544
|
selectionEnabled={selectionEnabled}
|
|
489
545
|
size={size}
|
|
490
|
-
highlightEntity={
|
|
546
|
+
highlightEntity={setHighlightedEntity}
|
|
491
547
|
unhighlightEntity={unselectNavigatedEntity}
|
|
492
548
|
collection={collection}
|
|
493
549
|
fullPath={fullPath}
|
|
550
|
+
fullIdPath={fullIdPath}
|
|
494
551
|
actions={actions}
|
|
495
552
|
hideId={collection?.hideIdFromCollection}
|
|
496
553
|
onCollectionChange={updateLastDeleteTimestamp}
|
|
497
554
|
selectionController={usedSelectionController}
|
|
555
|
+
openEntityMode={openEntityMode}
|
|
498
556
|
/>
|
|
499
557
|
);
|
|
500
558
|
|
|
501
|
-
};
|
|
559
|
+
}, [updateLastDeleteTimestamp, usedSelectionController]);
|
|
502
560
|
|
|
503
561
|
const title = <Popover
|
|
504
562
|
open={popOverOpen}
|
|
@@ -528,7 +586,7 @@ export const EntityCollectionView = React.memo(
|
|
|
528
586
|
</div>}
|
|
529
587
|
>
|
|
530
588
|
|
|
531
|
-
{collection.description && <div className="m-4 text-
|
|
589
|
+
{collection.description && <div className="m-4 text-surface-900 dark:text-white">
|
|
532
590
|
<Markdown source={collection.description}/>
|
|
533
591
|
</div>}
|
|
534
592
|
|
|
@@ -557,6 +615,7 @@ export const EntityCollectionView = React.memo(
|
|
|
557
615
|
property={property}
|
|
558
616
|
fullPath={fullPath}
|
|
559
617
|
collection={collection}
|
|
618
|
+
tableController={tableController}
|
|
560
619
|
parentCollectionIds={parentCollectionIds ?? []}/>;
|
|
561
620
|
})}
|
|
562
621
|
</>;
|
|
@@ -567,7 +626,8 @@ export const EntityCollectionView = React.memo(
|
|
|
567
626
|
if (typeof AddColumnComponent === "function")
|
|
568
627
|
return <AddColumnComponent fullPath={fullPath}
|
|
569
628
|
parentCollectionIds={parentCollectionIds ?? []}
|
|
570
|
-
collection={collection}
|
|
629
|
+
collection={collection}
|
|
630
|
+
tableController={tableController}/>;
|
|
571
631
|
return null;
|
|
572
632
|
}
|
|
573
633
|
: undefined;
|
|
@@ -584,12 +644,13 @@ export const EntityCollectionView = React.memo(
|
|
|
584
644
|
});
|
|
585
645
|
|
|
586
646
|
return (
|
|
587
|
-
<div className={
|
|
647
|
+
<div className={cls("overflow-hidden h-full w-full rounded-md", className)}
|
|
588
648
|
ref={containerRef}>
|
|
589
649
|
<EntityCollectionTable
|
|
590
650
|
key={`collection_table_${fullPath}`}
|
|
591
651
|
additionalFields={additionalFields}
|
|
592
652
|
tableController={tableController}
|
|
653
|
+
enablePopupIcon={true}
|
|
593
654
|
displayedColumnIds={displayedColumnIds}
|
|
594
655
|
onSizeChanged={onSizeChanged}
|
|
595
656
|
onEntityClick={onEntityClick}
|
|
@@ -599,13 +660,23 @@ export const EntityCollectionView = React.memo(
|
|
|
599
660
|
uniqueFieldValidator={uniqueFieldValidator}
|
|
600
661
|
title={title}
|
|
601
662
|
selectionController={usedSelectionController}
|
|
602
|
-
highlightedEntities={
|
|
663
|
+
highlightedEntities={highlightedEntity ? [highlightedEntity] : []}
|
|
603
664
|
defaultSize={collection.defaultSize}
|
|
604
665
|
properties={resolvedCollection.properties}
|
|
605
666
|
getPropertyFor={getPropertyFor}
|
|
606
667
|
onTextSearchClick={textSearchInitialised ? undefined : onTextSearchClick}
|
|
668
|
+
onScroll={tableController.onScroll}
|
|
669
|
+
initialScroll={tableController.initialScroll}
|
|
607
670
|
textSearchLoading={textSearchLoading}
|
|
608
671
|
textSearchEnabled={textSearchEnabled}
|
|
672
|
+
actionsStart={<EntityCollectionViewStartActions
|
|
673
|
+
parentCollectionIds={parentCollectionIds ?? []}
|
|
674
|
+
collection={collection}
|
|
675
|
+
tableController={tableController}
|
|
676
|
+
path={fullPath}
|
|
677
|
+
relativePath={collection.path}
|
|
678
|
+
selectionController={usedSelectionController}
|
|
679
|
+
collectionEntitiesCount={docsCount}/>}
|
|
609
680
|
actions={<EntityCollectionViewActions
|
|
610
681
|
parentCollectionIds={parentCollectionIds ?? []}
|
|
611
682
|
collection={collection}
|
|
@@ -628,7 +699,7 @@ export const EntityCollectionView = React.memo(
|
|
|
628
699
|
className="mt-4"
|
|
629
700
|
>
|
|
630
701
|
<AddIcon/>
|
|
631
|
-
Create your first
|
|
702
|
+
Create your first entry
|
|
632
703
|
</Button>
|
|
633
704
|
</div>
|
|
634
705
|
: <Typography variant={"label"}>No results with the applied filter/sort</Typography>
|
|
@@ -640,22 +711,24 @@ export const EntityCollectionView = React.memo(
|
|
|
640
711
|
getIdColumnWidth={getIdColumnWidth}
|
|
641
712
|
additionalIDHeaderWidget={<EntityIdHeaderWidget
|
|
642
713
|
path={fullPath}
|
|
714
|
+
fullIdPath={fullIdPath ?? fullPath}
|
|
643
715
|
collection={collection}/>}
|
|
716
|
+
openEntityMode={openEntityMode}
|
|
644
717
|
/>
|
|
645
718
|
|
|
646
|
-
<PopupFormField
|
|
647
|
-
key={`popup_form_${popupCell?.propertyKey}_${popupCell?.
|
|
719
|
+
{popupCell && <PopupFormField
|
|
720
|
+
key={`popup_form_${popupCell?.propertyKey}_${popupCell?.entityId}`}
|
|
648
721
|
open={Boolean(popupCell)}
|
|
649
722
|
onClose={onPopupClose}
|
|
650
723
|
cellRect={popupCell?.cellRect}
|
|
651
724
|
propertyKey={popupCell?.propertyKey}
|
|
652
725
|
collection={collection}
|
|
653
|
-
|
|
726
|
+
entityId={popupCell.entityId}
|
|
654
727
|
tableKey={tableKey.current}
|
|
655
728
|
customFieldValidator={uniqueFieldValidator}
|
|
656
729
|
path={resolvedFullPath}
|
|
657
730
|
onCellValueChange={onValueChange}
|
|
658
|
-
container={containerRef.current}/>
|
|
731
|
+
container={containerRef.current}/>}
|
|
659
732
|
|
|
660
733
|
{deleteEntityClicked &&
|
|
661
734
|
<DeleteEntityDialog
|
|
@@ -671,7 +744,7 @@ export const EntityCollectionView = React.memo(
|
|
|
671
744
|
</div>
|
|
672
745
|
);
|
|
673
746
|
}, (a, b) => {
|
|
674
|
-
return equal(a.
|
|
747
|
+
return equal(a.path, b.path) &&
|
|
675
748
|
equal(a.parentCollectionIds, b.parentCollectionIds) &&
|
|
676
749
|
equal(a.isSubCollection, b.isSubCollection) &&
|
|
677
750
|
equal(a.className, b.className) &&
|
|
@@ -683,8 +756,15 @@ export const EntityCollectionView = React.memo(
|
|
|
683
756
|
equal(a.selectionController, b.selectionController) &&
|
|
684
757
|
equal(a.Actions, b.Actions) &&
|
|
685
758
|
equal(a.defaultSize, b.defaultSize) &&
|
|
759
|
+
equal(a.initialFilter, b.initialFilter) &&
|
|
760
|
+
equal(a.initialSort, b.initialSort) &&
|
|
761
|
+
equal(a.includeJsonView, b.includeJsonView) &&
|
|
686
762
|
equal(a.textSearchEnabled, b.textSearchEnabled) &&
|
|
687
763
|
equal(a.additionalFields, b.additionalFields) &&
|
|
764
|
+
equal(a.sideDialogWidth, b.sideDialogWidth) &&
|
|
765
|
+
equal(a.openEntityMode, b.openEntityMode) &&
|
|
766
|
+
equal(a.exportable, b.exportable) &&
|
|
767
|
+
equal(a.history, b.history) &&
|
|
688
768
|
equal(a.forceFilter, b.forceFilter);
|
|
689
769
|
}) as React.FunctionComponent<EntityCollectionViewProps<any>>
|
|
690
770
|
|
|
@@ -709,7 +789,7 @@ function EntitiesCount({
|
|
|
709
789
|
|
|
710
790
|
const sortByProperty = sortBy ? sortBy[0] : undefined;
|
|
711
791
|
const currentSort = sortBy ? sortBy[1] : undefined;
|
|
712
|
-
const resolvedPath = useMemo(() => navigation.
|
|
792
|
+
const resolvedPath = useMemo(() => navigation.resolveIdsFrom(fullPath), [fullPath, navigation.resolveIdsFrom]);
|
|
713
793
|
|
|
714
794
|
useEffect(() => {
|
|
715
795
|
if (dataSource.countEntities)
|
|
@@ -724,6 +804,7 @@ function EntitiesCount({
|
|
|
724
804
|
|
|
725
805
|
useEffect(() => {
|
|
726
806
|
if (onCountChange) {
|
|
807
|
+
setError(undefined);
|
|
727
808
|
onCountChange(count ?? 0);
|
|
728
809
|
}
|
|
729
810
|
}, [onCountChange, count]);
|
|
@@ -750,53 +831,94 @@ function buildPropertyWidthOverwrite(key: string, width: number): PartialEntityC
|
|
|
750
831
|
|
|
751
832
|
function EntityIdHeaderWidget({
|
|
752
833
|
collection,
|
|
753
|
-
path
|
|
834
|
+
path,
|
|
835
|
+
fullIdPath
|
|
754
836
|
}: {
|
|
755
837
|
collection: EntityCollection,
|
|
756
|
-
path: string
|
|
838
|
+
path: string,
|
|
839
|
+
fullIdPath: string
|
|
757
840
|
}) {
|
|
841
|
+
|
|
842
|
+
const navigation = useNavigationController();
|
|
758
843
|
const [openPopup, setOpenPopup] = React.useState(false);
|
|
759
844
|
const [searchString, setSearchString] = React.useState("");
|
|
845
|
+
const [recentIds, setRecentIds] = React.useState<string[]>(getRecentIds(collection.id));
|
|
760
846
|
const sideEntityController = useSideEntityController();
|
|
847
|
+
|
|
848
|
+
const openEntityMode = collection?.openEntityMode ?? DEFAULT_ENTITY_OPEN_MODE;
|
|
849
|
+
|
|
761
850
|
return (
|
|
762
|
-
<Tooltip title={!openPopup ? "Find by ID" : undefined}>
|
|
851
|
+
<Tooltip title={!openPopup ? "Find by ID" : undefined} asChild={false}>
|
|
763
852
|
<Popover
|
|
764
853
|
open={openPopup}
|
|
765
854
|
onOpenChange={setOpenPopup}
|
|
855
|
+
sideOffset={0}
|
|
856
|
+
align={"start"}
|
|
857
|
+
alignOffset={-117}
|
|
766
858
|
trigger={
|
|
767
859
|
<IconButton size={"small"}>
|
|
768
860
|
<SearchIcon size={"small"}/>
|
|
769
861
|
</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
|
-
|
|
862
|
+
}>
|
|
863
|
+
<div
|
|
864
|
+
className={cls("my-2 rounded-lg bg-surface-50 dark:bg-surface-950 text-surface-900 dark:text-white")}>
|
|
865
|
+
<form noValidate={true}
|
|
866
|
+
onSubmit={(e) => {
|
|
867
|
+
e.preventDefault();
|
|
868
|
+
if (!searchString) return;
|
|
869
|
+
setOpenPopup(false);
|
|
870
|
+
const entityId = searchString.trim();
|
|
871
|
+
setRecentIds(addRecentId(collection.id, entityId));
|
|
872
|
+
navigateToEntity({
|
|
873
|
+
openEntityMode,
|
|
874
|
+
collection,
|
|
875
|
+
entityId,
|
|
876
|
+
path,
|
|
877
|
+
fullIdPath,
|
|
878
|
+
sideEntityController,
|
|
879
|
+
navigation
|
|
880
|
+
})
|
|
881
|
+
}}
|
|
882
|
+
className={"w-96 max-w-full"}>
|
|
883
|
+
|
|
884
|
+
<div className="flex p-2 w-full gap-2">
|
|
885
|
+
<input
|
|
886
|
+
autoFocus={openPopup}
|
|
887
|
+
placeholder={"Find entity by ID"}
|
|
888
|
+
// size={"small"}
|
|
889
|
+
onChange={(e) => {
|
|
890
|
+
setSearchString(e.target.value);
|
|
891
|
+
}}
|
|
892
|
+
value={searchString}
|
|
893
|
+
className={"rounded-lg bg-white dark:bg-surface-800 flex-grow bg-transparent outline-none p-2 " + focusedDisabled}/>
|
|
894
|
+
<Button variant={"text"}
|
|
895
|
+
disabled={!(searchString.trim())}
|
|
896
|
+
type={"submit"}
|
|
897
|
+
><KeyboardTabIcon/></Button>
|
|
898
|
+
</div>
|
|
899
|
+
</form>
|
|
900
|
+
{recentIds && recentIds.length > 0 && <div className="flex flex-col gap-2 p-2">
|
|
901
|
+
{recentIds.map(id => (
|
|
902
|
+
<ReferencePreview reference={new EntityReference(id, path)}
|
|
903
|
+
key={id}
|
|
904
|
+
hover={true}
|
|
905
|
+
onClick={() => {
|
|
906
|
+
setOpenPopup(false);
|
|
907
|
+
navigateToEntity({
|
|
908
|
+
openEntityMode,
|
|
909
|
+
collection,
|
|
910
|
+
entityId: id,
|
|
911
|
+
path,
|
|
912
|
+
fullIdPath,
|
|
913
|
+
sideEntityController,
|
|
914
|
+
navigation
|
|
915
|
+
})
|
|
916
|
+
}}
|
|
917
|
+
includeEntityLink={false}
|
|
918
|
+
size={"small"}/>
|
|
919
|
+
))}
|
|
920
|
+
</div>}
|
|
921
|
+
</div>
|
|
800
922
|
</Popover>
|
|
801
923
|
|
|
802
924
|
</Tooltip>
|