@firecms/core 3.0.0-canary.99 → 3.0.0-rc.2
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 +2 -2
- package/dist/app/Drawer.d.ts +0 -1
- package/dist/app/Scaffold.d.ts +4 -0
- package/dist/components/ArrayContainer.d.ts +31 -12
- package/dist/components/{DeleteConfirmationDialog.d.ts → ConfirmationDialog.d.ts} +1 -1
- package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +3 -1
- package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +2 -2
- package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +17 -3
- package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +1 -1
- package/dist/components/EntityCollectionTable/index.d.ts +1 -1
- package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +6 -3
- package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +8 -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 -6
- 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 +3 -2
- package/dist/components/HomePage/NavigationGroup.d.ts +8 -1
- package/dist/components/HomePage/RenameGroupDialog.d.ts +9 -0
- package/dist/components/PropertyConfigBadge.d.ts +2 -1
- package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
- package/dist/components/SelectableTable/SelectableTable.d.ts +13 -3
- package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +1 -1
- package/dist/components/UnsavedChangesDialog.d.ts +8 -0
- package/dist/components/UserDisplay.d.ts +7 -0
- package/dist/components/VirtualTable/VirtualTableProps.d.ts +11 -2
- package/dist/components/VirtualTable/fields/VirtualTableUserSelect.d.ts +12 -0
- package/dist/components/common/default_entity_actions.d.ts +0 -2
- package/dist/components/common/index.d.ts +1 -1
- package/dist/components/common/useColumnsIds.d.ts +1 -0
- package/dist/components/common/{useDataSourceEntityCollectionTableController.d.ts → useDataSourceTableController.d.ts} +10 -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 +3 -1
- package/dist/contexts/BreacrumbsContext.d.ts +8 -0
- package/dist/contexts/InternalUserManagementContext.d.ts +3 -0
- package/dist/core/DefaultAppBar.d.ts +8 -2
- package/dist/core/DrawerNavigationItem.d.ts +2 -1
- package/dist/core/EntityEditView.d.ts +40 -22
- 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 +0 -1
- package/dist/core/SideDialogs.d.ts +4 -2
- package/dist/core/field_configs.d.ts +1 -1
- package/dist/core/index.d.ts +2 -1
- package/dist/form/EntityForm.d.ts +50 -0
- package/dist/form/EntityFormActions.d.ts +21 -0
- package/dist/form/PropertyFieldBinding.d.ts +1 -1
- 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/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 +4 -10
- 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 +17 -16
- package/dist/form/useClearRestoreValue.d.ts +2 -2
- package/dist/hooks/data/delete.d.ts +4 -4
- package/dist/hooks/data/save.d.ts +3 -3
- package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
- package/dist/hooks/data/useEntityFetch.d.ts +4 -3
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/useAuthController.d.ts +1 -1
- package/dist/hooks/useBreadcrumbsController.d.ts +26 -0
- package/dist/hooks/useBuildNavigationController.d.ts +57 -12
- 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 +7 -1
- package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
- package/dist/hooks/useValidateAuthenticator.d.ts +3 -3
- package/dist/index.es.js +20480 -14434
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +20250 -14209
- package/dist/index.umd.js.map +1 -1
- package/dist/internal/useBuildDataSource.d.ts +3 -2
- package/dist/internal/useBuildSideEntityController.d.ts +3 -3
- package/dist/internal/useUnsavedChangesDialog.d.ts +7 -9
- package/dist/preview/PropertyPreviewProps.d.ts +1 -1
- package/dist/preview/components/EnumValuesChip.d.ts +1 -1
- package/dist/preview/components/ReferencePreview.d.ts +2 -2
- 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 +7 -9
- package/dist/types/collections.d.ts +88 -25
- package/dist/types/customization_controller.d.ts +8 -0
- package/dist/types/datasource.d.ts +19 -17
- package/dist/types/dialogs_controller.d.ts +7 -3
- package/dist/types/entities.d.ts +7 -2
- package/dist/types/entity_actions.d.ts +58 -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 +43 -17
- package/dist/types/firecms.d.ts +31 -3
- package/dist/types/firecms_context.d.ts +17 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/internal_user_management.d.ts +20 -0
- package/dist/types/navigation.d.ts +60 -17
- package/dist/types/permissions.d.ts +4 -4
- package/dist/types/plugins.d.ts +44 -9
- package/dist/types/properties.d.ts +74 -22
- 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/createFormexStub.d.ts +2 -0
- package/dist/util/entities.d.ts +2 -2
- package/dist/util/entity_actions.d.ts +2 -0
- package/dist/util/entity_cache.d.ts +23 -0
- package/dist/util/icon_synonyms.d.ts +0 -1
- package/dist/util/icons.d.ts +5 -2
- package/dist/util/index.d.ts +3 -0
- package/dist/util/navigation_from_path.d.ts +10 -1
- package/dist/util/navigation_utils.d.ts +13 -1
- package/dist/util/objects.d.ts +2 -1
- package/dist/util/permissions.d.ts +4 -4
- package/dist/util/property_utils.d.ts +4 -4
- package/dist/util/references.d.ts +2 -2
- package/dist/util/resolutions.d.ts +30 -6
- package/dist/util/storage.d.ts +1 -1
- package/dist/util/useStorageUploadController.d.ts +2 -2
- package/package.json +133 -125
- package/src/app/Drawer.tsx +0 -1
- package/src/app/Scaffold.tsx +33 -29
- package/src/components/ArrayContainer.tsx +447 -229
- package/src/components/CircularProgressCenter.tsx +1 -1
- package/src/components/ClearFilterSortButton.tsx +1 -1
- package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +12 -11
- package/src/components/DeleteEntityDialog.tsx +13 -20
- package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +59 -25
- package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +23 -17
- package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +20 -3
- package/src/components/EntityCollectionTable/PropertyTableCell.tsx +47 -9
- package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +21 -16
- package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +6 -12
- package/src/components/EntityCollectionTable/index.tsx +1 -1
- package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +6 -6
- package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +35 -26
- package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +20 -8
- package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +132 -101
- package/src/components/EntityCollectionTable/internal/popup_field/useDraggable.tsx +9 -9
- package/src/components/EntityCollectionView/EntityCollectionView.tsx +178 -85
- package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +7 -4
- package/src/components/EntityCollectionView/useSelectionController.tsx +5 -4
- package/src/components/EntityCollectionView/utils.ts +19 -0
- package/src/components/EntityJsonPreview.tsx +66 -0
- package/src/components/EntityPreview.tsx +75 -57
- package/src/components/EntityView.tsx +8 -5
- package/src/components/ErrorView.tsx +3 -3
- package/src/components/FireCMSLogo.tsx +7 -51
- package/src/components/HomePage/DefaultHomePage.tsx +506 -161
- package/src/components/HomePage/FavouritesView.tsx +9 -14
- package/src/components/HomePage/HomePageDnD.tsx +600 -0
- package/src/components/HomePage/NavigationCard.tsx +47 -38
- package/src/components/HomePage/NavigationCardBinding.tsx +16 -15
- package/src/components/HomePage/NavigationGroup.tsx +144 -30
- package/src/components/HomePage/RenameGroupDialog.tsx +123 -0
- package/src/components/HomePage/SmallNavigationCard.tsx +1 -2
- package/src/components/NotFoundPage.tsx +2 -2
- package/src/components/PropertyConfigBadge.tsx +10 -4
- package/src/components/PropertyIdCopyTooltip.tsx +47 -0
- package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +22 -13
- package/src/components/SearchIconsView.tsx +2 -2
- package/src/components/SelectableTable/SelectableTable.tsx +154 -142
- package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +4 -2
- package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +10 -8
- package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +60 -11
- package/src/components/UnsavedChangesDialog.tsx +46 -0
- package/src/components/UserDisplay.tsx +55 -0
- package/src/components/VirtualTable/VirtualTable.tsx +65 -44
- package/src/components/VirtualTable/VirtualTableCell.tsx +0 -8
- package/src/components/VirtualTable/VirtualTableHeader.tsx +8 -8
- package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +1 -1
- package/src/components/VirtualTable/VirtualTableProps.tsx +12 -2
- package/src/components/VirtualTable/VirtualTableRow.tsx +1 -1
- package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +4 -4
- 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/common/default_entity_actions.tsx +62 -42
- package/src/components/common/index.ts +1 -1
- package/src/components/common/useColumnsIds.tsx +2 -9
- 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 +1 -0
- package/src/components/index.tsx +4 -1
- package/src/contexts/BreacrumbsContext.tsx +38 -0
- package/src/contexts/DialogsProvider.tsx +3 -2
- 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 +124 -85
- package/src/core/DefaultDrawer.tsx +30 -22
- package/src/core/DrawerNavigationItem.tsx +32 -28
- package/src/core/EntityEditView.tsx +388 -995
- package/src/core/EntityEditViewFormActions.tsx +329 -0
- package/src/core/EntitySidePanel.tsx +88 -20
- package/src/core/FireCMS.tsx +58 -28
- package/src/core/FireCMSRouter.tsx +17 -0
- package/src/core/NavigationRoutes.tsx +23 -32
- package/src/core/SideDialogs.tsx +22 -12
- package/src/core/field_configs.tsx +39 -11
- package/src/core/index.tsx +4 -2
- package/src/form/EntityForm.tsx +814 -0
- package/src/form/EntityFormActions.tsx +211 -0
- package/src/form/PropertyFieldBinding.tsx +59 -41
- package/src/form/components/CustomIdField.tsx +9 -3
- package/src/form/components/FieldHelperText.tsx +1 -1
- 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 +5 -4
- package/src/form/components/StorageUploadProgress.tsx +2 -3
- package/src/form/components/index.tsx +3 -1
- package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +30 -18
- package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +47 -36
- package/src/form/field_bindings/BlockFieldBinding.tsx +55 -33
- package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -14
- package/src/form/field_bindings/KeyValueFieldBinding.tsx +19 -15
- package/src/form/field_bindings/MapFieldBinding.tsx +72 -62
- 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 +10 -8
- package/src/form/field_bindings/ReferenceAsStringFieldBinding.tsx +135 -0
- package/src/form/field_bindings/ReferenceFieldBinding.tsx +28 -19
- package/src/form/field_bindings/RepeatFieldBinding.tsx +56 -32
- package/src/form/field_bindings/SelectFieldBinding.tsx +22 -13
- package/src/form/field_bindings/StorageUploadFieldBinding.tsx +247 -168
- 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 +17 -37
- package/src/form/useClearRestoreValue.tsx +2 -2
- package/src/form/validation.ts +12 -6
- package/src/hooks/data/delete.ts +6 -5
- package/src/hooks/data/save.ts +26 -35
- package/src/hooks/data/useCollectionFetch.tsx +3 -3
- package/src/hooks/data/useDataSource.tsx +10 -2
- package/src/hooks/data/useEntityFetch.tsx +10 -6
- package/src/hooks/index.tsx +3 -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/useBuildModeController.tsx +15 -28
- package/src/hooks/useBuildNavigationController.tsx +386 -124
- 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 +16 -5
- package/src/hooks/useResolvedNavigationFrom.tsx +9 -11
- package/src/hooks/useValidateAuthenticator.tsx +3 -3
- package/src/internal/useBuildDataSource.ts +67 -80
- package/src/internal/useBuildSideDialogsController.tsx +4 -2
- package/src/internal/useBuildSideEntityController.tsx +149 -86
- package/src/internal/useUnsavedChangesDialog.tsx +127 -91
- package/src/preview/PropertyPreview.tsx +36 -12
- package/src/preview/PropertyPreviewProps.tsx +1 -1
- package/src/preview/components/BooleanPreview.tsx +1 -1
- package/src/preview/components/EmptyValue.tsx +1 -1
- package/src/preview/components/EnumValuesChip.tsx +1 -1
- package/src/preview/components/ImagePreview.tsx +10 -9
- package/src/preview/components/ReferencePreview.tsx +10 -18
- package/src/preview/components/UrlComponentPreview.tsx +20 -21
- package/src/preview/components/UserPreview.tsx +27 -0
- package/src/preview/index.ts +1 -0
- package/src/preview/property_previews/ArrayOfMapsPreview.tsx +6 -5
- package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +5 -4
- package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +5 -3
- package/src/preview/property_previews/ArrayOfStringsPreview.tsx +4 -3
- package/src/preview/property_previews/ArrayOneOfPreview.tsx +6 -4
- package/src/preview/property_previews/ArrayPropertyPreview.tsx +6 -4
- package/src/preview/property_previews/MapPropertyPreview.tsx +7 -6
- package/src/preview/property_previews/SkeletonPropertyComponent.tsx +13 -13
- package/src/preview/property_previews/StringPropertyPreview.tsx +2 -2
- 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 +8 -12
- package/src/types/collections.ts +103 -28
- package/src/types/customization_controller.tsx +9 -0
- package/src/types/datasource.ts +21 -20
- package/src/types/dialogs_controller.tsx +7 -3
- package/src/types/entities.ts +10 -2
- package/src/types/entity_actions.tsx +71 -8
- 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 +52 -19
- package/src/types/firecms.tsx +34 -4
- package/src/types/firecms_context.tsx +18 -1
- package/src/types/index.ts +1 -0
- package/src/types/internal_user_management.ts +24 -0
- package/src/types/navigation.ts +76 -22
- package/src/types/permissions.ts +5 -5
- package/src/types/plugins.tsx +53 -9
- package/src/types/properties.ts +84 -22
- 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 +82 -0
- package/src/types/user.ts +3 -1
- 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 +6 -4
- package/src/util/entity_actions.ts +28 -0
- package/src/util/entity_cache.ts +204 -0
- package/src/util/icon_list.ts +1 -1
- package/src/util/icon_synonyms.ts +0 -1
- package/src/util/icons.tsx +36 -11
- package/src/util/index.ts +3 -0
- package/src/util/join_collections.ts +9 -2
- package/src/util/make_properties_editable.ts +13 -5
- package/src/util/navigation_from_path.ts +33 -12
- package/src/util/navigation_utils.ts +135 -19
- package/src/util/objects.ts +74 -14
- package/src/util/parent_references_from_path.ts +3 -3
- package/src/util/permissions.ts +8 -8
- package/src/util/property_utils.tsx +17 -6
- package/src/util/references.ts +19 -8
- package/src/util/resolutions.ts +93 -24
- package/src/util/storage.ts +6 -2
- package/src/util/useStorageUploadController.tsx +74 -29
- package/dist/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.d.ts +0 -5
- package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
- package/dist/form/PropertiesForm.d.ts +0 -8
- package/dist/form/components/FormikArrayContainer.d.ts +0 -18
- package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
- package/src/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.tsx +0 -59
- package/src/components/PropertyIdCopyTooltipContent.tsx +0 -27
- package/src/components/common/useDataSourceEntityCollectionTableController.tsx +0 -236
- package/src/form/PropertiesForm.tsx +0 -81
- package/src/form/components/FormikArrayContainer.tsx +0 -44
- package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -695
- /package/src/util/{common.tsx → common.ts} +0 -0
|
@@ -7,7 +7,9 @@ import {
|
|
|
7
7
|
CollectionSize,
|
|
8
8
|
Entity,
|
|
9
9
|
EntityAction,
|
|
10
|
-
EntityCollection,
|
|
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";
|
|
@@ -46,6 +51,7 @@ import {
|
|
|
46
51
|
AddIcon,
|
|
47
52
|
Button,
|
|
48
53
|
cls,
|
|
54
|
+
focusedDisabled,
|
|
49
55
|
IconButton,
|
|
50
56
|
KeyboardTabIcon,
|
|
51
57
|
Markdown,
|
|
@@ -58,6 +64,10 @@ import {
|
|
|
58
64
|
import { setIn } from "@firecms/formex";
|
|
59
65
|
import { getSubcollectionColumnId } from "../EntityCollectionTable/internal/common";
|
|
60
66
|
import {
|
|
67
|
+
COLLECTION_GROUP_PARENT_ID,
|
|
68
|
+
copyEntityAction,
|
|
69
|
+
deleteEntityAction,
|
|
70
|
+
editEntityAction,
|
|
61
71
|
OnCellValueChange,
|
|
62
72
|
OnColumnResizeParams,
|
|
63
73
|
UniqueFieldValidator,
|
|
@@ -66,13 +76,14 @@ import {
|
|
|
66
76
|
} from "../common";
|
|
67
77
|
import { PopupFormField } from "../EntityCollectionTable/internal/popup_field/PopupFormField";
|
|
68
78
|
import { GetPropertyForProps } from "../EntityCollectionTable/EntityCollectionTableProps";
|
|
69
|
-
import { copyEntityAction, deleteEntityAction, editEntityAction } from "../common/default_entity_actions";
|
|
70
79
|
import { DeleteEntityDialog } from "../DeleteEntityDialog";
|
|
71
80
|
import { useAnalyticsController } from "../../hooks/useAnalyticsController";
|
|
72
81
|
import { useSelectionController } from "./useSelectionController";
|
|
73
82
|
import { EntityCollectionViewStartActions } from "./EntityCollectionViewStartActions";
|
|
83
|
+
import { addRecentId, getRecentIds } from "./utils";
|
|
84
|
+
import { useScrollRestoration } from "../common/useScrollRestoration";
|
|
74
85
|
|
|
75
|
-
const
|
|
86
|
+
const DEFAULT_ENTITY_OPEN_MODE: "side_panel" | "full_screen" = "side_panel";
|
|
76
87
|
|
|
77
88
|
/**
|
|
78
89
|
* @group Components
|
|
@@ -83,6 +94,10 @@ export type EntityCollectionViewProps<M extends Record<string, any>> = {
|
|
|
83
94
|
* It defaults to the collection path if not provided.
|
|
84
95
|
*/
|
|
85
96
|
fullPath?: string;
|
|
97
|
+
/**
|
|
98
|
+
* Full path using navigation ids.
|
|
99
|
+
*/
|
|
100
|
+
fullIdPath?: string;
|
|
86
101
|
/**
|
|
87
102
|
* If this is a subcollection, specify the parent collection ids.
|
|
88
103
|
*/
|
|
@@ -94,6 +109,11 @@ export type EntityCollectionViewProps<M extends Record<string, any>> = {
|
|
|
94
109
|
|
|
95
110
|
className?: string;
|
|
96
111
|
|
|
112
|
+
/**
|
|
113
|
+
* If true, this view will store its filter and sorting status in the url params
|
|
114
|
+
*/
|
|
115
|
+
updateUrl?: boolean;
|
|
116
|
+
|
|
97
117
|
} & EntityCollection<M>;
|
|
98
118
|
|
|
99
119
|
/**
|
|
@@ -123,17 +143,19 @@ export type EntityCollectionViewProps<M extends Record<string, any>> = {
|
|
|
123
143
|
export const EntityCollectionView = React.memo(
|
|
124
144
|
function EntityCollectionView<M extends Record<string, any>>({
|
|
125
145
|
fullPath: fullPathProp,
|
|
146
|
+
fullIdPath,
|
|
126
147
|
parentCollectionIds,
|
|
127
148
|
isSubCollection,
|
|
128
149
|
className,
|
|
150
|
+
updateUrl,
|
|
129
151
|
...collectionProp
|
|
130
152
|
}: EntityCollectionViewProps<M>
|
|
131
153
|
) {
|
|
132
154
|
|
|
133
155
|
const context = useFireCMSContext();
|
|
156
|
+
const navigation = useNavigationController();
|
|
134
157
|
const fullPath = fullPathProp ?? collectionProp.path;
|
|
135
158
|
const dataSource = useDataSource(collectionProp);
|
|
136
|
-
const navigation = useNavigationController();
|
|
137
159
|
const sideEntityController = useSideEntityController();
|
|
138
160
|
const authController = useAuthController();
|
|
139
161
|
const userConfigPersistence = useUserConfigurationPersistence();
|
|
@@ -142,11 +164,15 @@ export const EntityCollectionView = React.memo(
|
|
|
142
164
|
|
|
143
165
|
const containerRef = React.useRef<HTMLDivElement>(null);
|
|
144
166
|
|
|
167
|
+
const scrollRestoration = useScrollRestoration();
|
|
168
|
+
|
|
145
169
|
const collection = useMemo(() => {
|
|
146
170
|
const userOverride = userConfigPersistence?.getCollectionConfig<M>(fullPath);
|
|
147
171
|
return (userOverride ? mergeDeep(collectionProp, userOverride) : collectionProp) as EntityCollection<M>;
|
|
148
172
|
}, [collectionProp, fullPath, userConfigPersistence?.getCollectionConfig]);
|
|
149
173
|
|
|
174
|
+
const openEntityMode = collection?.openEntityMode ?? DEFAULT_ENTITY_OPEN_MODE;
|
|
175
|
+
|
|
150
176
|
const collectionRef = React.useRef(collection);
|
|
151
177
|
useEffect(() => {
|
|
152
178
|
collectionRef.current = collection;
|
|
@@ -189,14 +215,12 @@ export const EntityCollectionView = React.memo(
|
|
|
189
215
|
setSelectedEntities
|
|
190
216
|
} = usedSelectionController;
|
|
191
217
|
|
|
192
|
-
|
|
193
|
-
// setDeleteEntityClicked(undefined);
|
|
194
|
-
// }, [selectedEntities]);
|
|
195
|
-
|
|
196
|
-
const tableController = useDataSourceEntityCollectionTableController<M>({
|
|
218
|
+
const tableController = useDataSourceTableController<M>({
|
|
197
219
|
fullPath,
|
|
198
220
|
collection,
|
|
199
|
-
lastDeleteTimestamp
|
|
221
|
+
lastDeleteTimestamp,
|
|
222
|
+
scrollRestoration,
|
|
223
|
+
updateUrl
|
|
200
224
|
});
|
|
201
225
|
|
|
202
226
|
const tableKey = React.useRef<string>(Math.random().toString(36));
|
|
@@ -207,34 +231,45 @@ export const EntityCollectionView = React.memo(
|
|
|
207
231
|
}, [tableController.setPopupCell]);
|
|
208
232
|
|
|
209
233
|
const onEntityClick = useCallback((clickedEntity: Entity<M>) => {
|
|
210
|
-
console.log("Entity clicked", clickedEntity)
|
|
211
234
|
const collection = collectionRef.current;
|
|
212
235
|
setHighlightedEntity(clickedEntity);
|
|
213
236
|
analyticsController.onAnalyticsEvent?.("edit_entity_clicked", {
|
|
214
237
|
path: clickedEntity.path,
|
|
215
238
|
entityId: clickedEntity.id
|
|
216
239
|
});
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
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,
|
|
220
252
|
collection,
|
|
221
|
-
|
|
222
|
-
onClose: unselectNavigatedEntity,
|
|
253
|
+
entityId: clickedEntity.id
|
|
223
254
|
});
|
|
255
|
+
|
|
224
256
|
}, [unselectNavigatedEntity, sideEntityController]);
|
|
225
257
|
|
|
226
258
|
const onNewClick = useCallback(() => {
|
|
227
|
-
|
|
228
259
|
const collection = collectionRef.current;
|
|
229
260
|
analyticsController.onAnalyticsEvent?.("new_entity_click", {
|
|
230
261
|
path: fullPath
|
|
231
262
|
});
|
|
232
|
-
|
|
233
|
-
|
|
263
|
+
navigateToEntity({
|
|
264
|
+
openEntityMode,
|
|
234
265
|
collection,
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
266
|
+
entityId: undefined,
|
|
267
|
+
path: fullPath,
|
|
268
|
+
fullIdPath,
|
|
269
|
+
sideEntityController,
|
|
270
|
+
navigation,
|
|
271
|
+
onClose: unselectNavigatedEntity
|
|
272
|
+
})
|
|
238
273
|
}, [fullPath, sideEntityController]);
|
|
239
274
|
|
|
240
275
|
const onMultipleDeleteClick = () => {
|
|
@@ -306,7 +341,7 @@ export const EntityCollectionView = React.memo(
|
|
|
306
341
|
value,
|
|
307
342
|
property,
|
|
308
343
|
entityId
|
|
309
|
-
}) => dataSource.checkUniqueField(fullPath, name, value, entityId),
|
|
344
|
+
}) => dataSource.checkUniqueField(fullPath, name, value, entityId, collection),
|
|
310
345
|
[fullPath]);
|
|
311
346
|
|
|
312
347
|
const onValueChange: OnCellValueChange<any, any> = ({
|
|
@@ -320,7 +355,7 @@ export const EntityCollectionView = React.memo(
|
|
|
320
355
|
const updatedValues = setIn({ ...entity.values }, propertyKey, value);
|
|
321
356
|
|
|
322
357
|
const saveProps: SaveEntityProps = {
|
|
323
|
-
path: fullPath,
|
|
358
|
+
path: entity.path ?? fullPath,
|
|
324
359
|
entityId: entity.id,
|
|
325
360
|
values: updatedValues,
|
|
326
361
|
previousValues: entity.values,
|
|
@@ -346,11 +381,12 @@ export const EntityCollectionView = React.memo(
|
|
|
346
381
|
|
|
347
382
|
};
|
|
348
383
|
|
|
349
|
-
const resolvedFullPath = navigation.
|
|
384
|
+
const resolvedFullPath = navigation.resolveIdsFrom(fullPath);
|
|
350
385
|
const resolvedCollection = useMemo(() => resolveCollection<M>({
|
|
351
386
|
collection,
|
|
352
387
|
path: fullPath,
|
|
353
|
-
|
|
388
|
+
propertyConfigs: customizationController.propertyConfigs,
|
|
389
|
+
authController,
|
|
354
390
|
}), [collection, fullPath]);
|
|
355
391
|
|
|
356
392
|
const getPropertyFor = useCallback(({
|
|
@@ -371,7 +407,8 @@ export const EntityCollectionView = React.memo(
|
|
|
371
407
|
path: entity.path,
|
|
372
408
|
values: entity.values,
|
|
373
409
|
entityId: entity.id,
|
|
374
|
-
|
|
410
|
+
propertyConfigs: customizationController.propertyConfigs,
|
|
411
|
+
authController
|
|
375
412
|
});
|
|
376
413
|
}, [collection.properties, customizationController.propertyConfigs, resolvedCollection.properties]);
|
|
377
414
|
|
|
@@ -387,16 +424,20 @@ export const EntityCollectionView = React.memo(
|
|
|
387
424
|
Builder: ({ entity }) => (
|
|
388
425
|
<Button color={"primary"}
|
|
389
426
|
variant={"outlined"}
|
|
427
|
+
className={"max-w-full truncate justify-start"}
|
|
390
428
|
startIcon={<KeyboardTabIcon size={"small"}/>}
|
|
391
429
|
onClick={(event: any) => {
|
|
392
430
|
event.stopPropagation();
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
entityId: entity.id,
|
|
396
|
-
selectedSubPath: subcollection.id ?? subcollection.path,
|
|
431
|
+
navigateToEntity({
|
|
432
|
+
openEntityMode,
|
|
397
433
|
collection,
|
|
398
|
-
|
|
399
|
-
|
|
434
|
+
entityId: entity.id,
|
|
435
|
+
selectedTab: subcollection.id ?? subcollection.path,
|
|
436
|
+
path: fullPath,
|
|
437
|
+
fullIdPath,
|
|
438
|
+
navigation,
|
|
439
|
+
sideEntityController
|
|
440
|
+
})
|
|
400
441
|
}}>
|
|
401
442
|
{subcollection.name}
|
|
402
443
|
</Button>
|
|
@@ -419,7 +460,7 @@ export const EntityCollectionView = React.memo(
|
|
|
419
460
|
<ReferencePreview
|
|
420
461
|
key={reference.path + "/" + reference.id}
|
|
421
462
|
reference={reference}
|
|
422
|
-
size={"
|
|
463
|
+
size={"small"}/>
|
|
423
464
|
);
|
|
424
465
|
})}
|
|
425
466
|
</div>
|
|
@@ -455,7 +496,7 @@ export const EntityCollectionView = React.memo(
|
|
|
455
496
|
if (deleteEnabled)
|
|
456
497
|
actions.push(deleteEntityAction);
|
|
457
498
|
if (customEntityActions)
|
|
458
|
-
actions
|
|
499
|
+
return mergeEntityActions(actions, customEntityActions);
|
|
459
500
|
return actions;
|
|
460
501
|
};
|
|
461
502
|
|
|
@@ -468,22 +509,25 @@ export const EntityCollectionView = React.memo(
|
|
|
468
509
|
};
|
|
469
510
|
|
|
470
511
|
const tableRowActionsBuilder = useCallback(({
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
512
|
+
entity,
|
|
513
|
+
size,
|
|
514
|
+
width,
|
|
515
|
+
frozen
|
|
516
|
+
}: {
|
|
476
517
|
entity: Entity<any>,
|
|
477
518
|
size: CollectionSize,
|
|
478
519
|
width: number,
|
|
479
520
|
frozen?: boolean
|
|
480
521
|
}) => {
|
|
481
522
|
|
|
482
|
-
const isSelected = usedSelectionController.selectedEntities.
|
|
523
|
+
const isSelected = Boolean(usedSelectionController.selectedEntities.find(e => e.id == entity.id && e.path == entity.path));
|
|
524
|
+
const customEntityActions = (collection.entityActions ?? [])
|
|
525
|
+
.map(action => resolveEntityAction(action, customizationController.entityActions))
|
|
526
|
+
.filter(Boolean) as EntityAction[];
|
|
483
527
|
|
|
484
528
|
const actions = getActionsForEntity({
|
|
485
529
|
entity,
|
|
486
|
-
customEntityActions
|
|
530
|
+
customEntityActions
|
|
487
531
|
});
|
|
488
532
|
|
|
489
533
|
return (
|
|
@@ -498,10 +542,12 @@ export const EntityCollectionView = React.memo(
|
|
|
498
542
|
unhighlightEntity={unselectNavigatedEntity}
|
|
499
543
|
collection={collection}
|
|
500
544
|
fullPath={fullPath}
|
|
545
|
+
fullIdPath={fullIdPath}
|
|
501
546
|
actions={actions}
|
|
502
547
|
hideId={collection?.hideIdFromCollection}
|
|
503
548
|
onCollectionChange={updateLastDeleteTimestamp}
|
|
504
549
|
selectionController={usedSelectionController}
|
|
550
|
+
openEntityMode={openEntityMode}
|
|
505
551
|
/>
|
|
506
552
|
);
|
|
507
553
|
|
|
@@ -535,7 +581,7 @@ export const EntityCollectionView = React.memo(
|
|
|
535
581
|
</div>}
|
|
536
582
|
>
|
|
537
583
|
|
|
538
|
-
{collection.description && <div className="m-4 text-
|
|
584
|
+
{collection.description && <div className="m-4 text-surface-900 dark:text-white">
|
|
539
585
|
<Markdown source={collection.description}/>
|
|
540
586
|
</div>}
|
|
541
587
|
|
|
@@ -614,6 +660,8 @@ export const EntityCollectionView = React.memo(
|
|
|
614
660
|
properties={resolvedCollection.properties}
|
|
615
661
|
getPropertyFor={getPropertyFor}
|
|
616
662
|
onTextSearchClick={textSearchInitialised ? undefined : onTextSearchClick}
|
|
663
|
+
onScroll={tableController.onScroll}
|
|
664
|
+
initialScroll={tableController.initialScroll}
|
|
617
665
|
textSearchLoading={textSearchLoading}
|
|
618
666
|
textSearchEnabled={textSearchEnabled}
|
|
619
667
|
actionsStart={<EntityCollectionViewStartActions
|
|
@@ -658,22 +706,24 @@ export const EntityCollectionView = React.memo(
|
|
|
658
706
|
getIdColumnWidth={getIdColumnWidth}
|
|
659
707
|
additionalIDHeaderWidget={<EntityIdHeaderWidget
|
|
660
708
|
path={fullPath}
|
|
709
|
+
fullIdPath={fullIdPath ?? fullPath}
|
|
661
710
|
collection={collection}/>}
|
|
711
|
+
openEntityMode={openEntityMode}
|
|
662
712
|
/>
|
|
663
713
|
|
|
664
|
-
<PopupFormField
|
|
665
|
-
key={`popup_form_${popupCell?.propertyKey}_${popupCell?.
|
|
714
|
+
{popupCell && <PopupFormField
|
|
715
|
+
key={`popup_form_${popupCell?.propertyKey}_${popupCell?.entityId}`}
|
|
666
716
|
open={Boolean(popupCell)}
|
|
667
717
|
onClose={onPopupClose}
|
|
668
718
|
cellRect={popupCell?.cellRect}
|
|
669
719
|
propertyKey={popupCell?.propertyKey}
|
|
670
720
|
collection={collection}
|
|
671
|
-
|
|
721
|
+
entityId={popupCell.entityId}
|
|
672
722
|
tableKey={tableKey.current}
|
|
673
723
|
customFieldValidator={uniqueFieldValidator}
|
|
674
724
|
path={resolvedFullPath}
|
|
675
725
|
onCellValueChange={onValueChange}
|
|
676
|
-
container={containerRef.current}/>
|
|
726
|
+
container={containerRef.current}/>}
|
|
677
727
|
|
|
678
728
|
{deleteEntityClicked &&
|
|
679
729
|
<DeleteEntityDialog
|
|
@@ -689,7 +739,7 @@ export const EntityCollectionView = React.memo(
|
|
|
689
739
|
</div>
|
|
690
740
|
);
|
|
691
741
|
}, (a, b) => {
|
|
692
|
-
return equal(a.
|
|
742
|
+
return equal(a.path, b.path) &&
|
|
693
743
|
equal(a.parentCollectionIds, b.parentCollectionIds) &&
|
|
694
744
|
equal(a.isSubCollection, b.isSubCollection) &&
|
|
695
745
|
equal(a.className, b.className) &&
|
|
@@ -703,9 +753,13 @@ export const EntityCollectionView = React.memo(
|
|
|
703
753
|
equal(a.defaultSize, b.defaultSize) &&
|
|
704
754
|
equal(a.initialFilter, b.initialFilter) &&
|
|
705
755
|
equal(a.initialSort, b.initialSort) &&
|
|
756
|
+
equal(a.includeJsonView, b.includeJsonView) &&
|
|
706
757
|
equal(a.textSearchEnabled, b.textSearchEnabled) &&
|
|
707
758
|
equal(a.additionalFields, b.additionalFields) &&
|
|
708
759
|
equal(a.sideDialogWidth, b.sideDialogWidth) &&
|
|
760
|
+
equal(a.openEntityMode, b.openEntityMode) &&
|
|
761
|
+
equal(a.exportable, b.exportable) &&
|
|
762
|
+
equal(a.history, b.history) &&
|
|
709
763
|
equal(a.forceFilter, b.forceFilter);
|
|
710
764
|
}) as React.FunctionComponent<EntityCollectionViewProps<any>>
|
|
711
765
|
|
|
@@ -730,7 +784,7 @@ function EntitiesCount({
|
|
|
730
784
|
|
|
731
785
|
const sortByProperty = sortBy ? sortBy[0] : undefined;
|
|
732
786
|
const currentSort = sortBy ? sortBy[1] : undefined;
|
|
733
|
-
const resolvedPath = useMemo(() => navigation.
|
|
787
|
+
const resolvedPath = useMemo(() => navigation.resolveIdsFrom(fullPath), [fullPath, navigation.resolveIdsFrom]);
|
|
734
788
|
|
|
735
789
|
useEffect(() => {
|
|
736
790
|
if (dataSource.countEntities)
|
|
@@ -772,55 +826,94 @@ function buildPropertyWidthOverwrite(key: string, width: number): PartialEntityC
|
|
|
772
826
|
|
|
773
827
|
function EntityIdHeaderWidget({
|
|
774
828
|
collection,
|
|
775
|
-
path
|
|
829
|
+
path,
|
|
830
|
+
fullIdPath
|
|
776
831
|
}: {
|
|
777
832
|
collection: EntityCollection,
|
|
778
|
-
path: string
|
|
833
|
+
path: string,
|
|
834
|
+
fullIdPath: string
|
|
779
835
|
}) {
|
|
836
|
+
|
|
837
|
+
const navigation = useNavigationController();
|
|
780
838
|
const [openPopup, setOpenPopup] = React.useState(false);
|
|
781
839
|
const [searchString, setSearchString] = React.useState("");
|
|
840
|
+
const [recentIds, setRecentIds] = React.useState<string[]>(getRecentIds(collection.id));
|
|
782
841
|
const sideEntityController = useSideEntityController();
|
|
842
|
+
|
|
843
|
+
const openEntityMode = collection?.openEntityMode ?? DEFAULT_ENTITY_OPEN_MODE;
|
|
844
|
+
|
|
783
845
|
return (
|
|
784
|
-
<Tooltip title={!openPopup ? "Find by ID" : undefined}>
|
|
846
|
+
<Tooltip title={!openPopup ? "Find by ID" : undefined} asChild={false}>
|
|
785
847
|
<Popover
|
|
786
848
|
open={openPopup}
|
|
787
849
|
onOpenChange={setOpenPopup}
|
|
850
|
+
sideOffset={0}
|
|
851
|
+
align={"start"}
|
|
852
|
+
alignOffset={-117}
|
|
788
853
|
trigger={
|
|
789
854
|
<IconButton size={"small"}>
|
|
790
855
|
<SearchIcon size={"small"}/>
|
|
791
856
|
</IconButton>
|
|
792
|
-
}
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
e
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
entityId
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
857
|
+
}>
|
|
858
|
+
<div
|
|
859
|
+
className={cls("my-2 rounded-lg bg-surface-50 dark:bg-surface-950 text-surface-900 dark:text-white")}>
|
|
860
|
+
<form noValidate={true}
|
|
861
|
+
onSubmit={(e) => {
|
|
862
|
+
e.preventDefault();
|
|
863
|
+
if (!searchString) return;
|
|
864
|
+
setOpenPopup(false);
|
|
865
|
+
const entityId = searchString.trim();
|
|
866
|
+
setRecentIds(addRecentId(collection.id, entityId));
|
|
867
|
+
navigateToEntity({
|
|
868
|
+
openEntityMode,
|
|
869
|
+
collection,
|
|
870
|
+
entityId,
|
|
871
|
+
path,
|
|
872
|
+
fullIdPath,
|
|
873
|
+
sideEntityController,
|
|
874
|
+
navigation
|
|
875
|
+
})
|
|
876
|
+
}}
|
|
877
|
+
className={"w-96 max-w-full"}>
|
|
878
|
+
|
|
879
|
+
<div className="flex p-2 w-full gap-2">
|
|
880
|
+
<input
|
|
881
|
+
autoFocus={openPopup}
|
|
882
|
+
placeholder={"Find entity by ID"}
|
|
883
|
+
// size={"small"}
|
|
884
|
+
onChange={(e) => {
|
|
885
|
+
setSearchString(e.target.value);
|
|
886
|
+
}}
|
|
887
|
+
value={searchString}
|
|
888
|
+
className={"rounded-lg bg-white dark:bg-surface-800 flex-grow bg-transparent outline-none p-2 " + focusedDisabled}/>
|
|
889
|
+
<Button variant={"text"}
|
|
890
|
+
disabled={!(searchString.trim())}
|
|
891
|
+
type={"submit"}
|
|
892
|
+
><KeyboardTabIcon/></Button>
|
|
893
|
+
</div>
|
|
894
|
+
</form>
|
|
895
|
+
{recentIds && recentIds.length > 0 && <div className="flex flex-col gap-2 p-2">
|
|
896
|
+
{recentIds.map(id => (
|
|
897
|
+
<ReferencePreview reference={new EntityReference(id, path)}
|
|
898
|
+
key={id}
|
|
899
|
+
hover={true}
|
|
900
|
+
onClick={() => {
|
|
901
|
+
setOpenPopup(false);
|
|
902
|
+
navigateToEntity({
|
|
903
|
+
openEntityMode,
|
|
904
|
+
collection,
|
|
905
|
+
entityId: id,
|
|
906
|
+
path,
|
|
907
|
+
fullIdPath,
|
|
908
|
+
sideEntityController,
|
|
909
|
+
navigation
|
|
910
|
+
})
|
|
911
|
+
}}
|
|
912
|
+
includeEntityLink={false}
|
|
913
|
+
size={"small"}/>
|
|
914
|
+
))}
|
|
915
|
+
</div>}
|
|
916
|
+
</div>
|
|
824
917
|
</Popover>
|
|
825
918
|
|
|
826
919
|
</Tooltip>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
|
|
3
|
-
import { canCreateEntity, canDeleteEntity
|
|
3
|
+
import { canCreateEntity, canDeleteEntity } from "../../util";
|
|
4
4
|
import { useAuthController, useCustomizationController, useFireCMSContext, useLargeLayout } from "../../hooks";
|
|
5
5
|
import { CollectionActionsProps, EntityCollection, EntityTableController, SelectionController } from "../../types";
|
|
6
6
|
import { AddIcon, Button, DeleteIcon, IconButton, Tooltip } from "@firecms/ui";
|
|
@@ -71,7 +71,7 @@ export function EntityCollectionViewActions<M extends Record<string, any>>({
|
|
|
71
71
|
? <Button
|
|
72
72
|
variant={"text"}
|
|
73
73
|
disabled={!(selectedEntities?.length) || !multipleDeleteEnabled}
|
|
74
|
-
startIcon={<DeleteIcon/>}
|
|
74
|
+
startIcon={<DeleteIcon size={"small"}/>}
|
|
75
75
|
onClick={onMultipleDeleteClick}
|
|
76
76
|
color={"primary"}
|
|
77
77
|
className="lg:w-20"
|
|
@@ -79,10 +79,11 @@ export function EntityCollectionViewActions<M extends Record<string, any>>({
|
|
|
79
79
|
({selectedEntities?.length})
|
|
80
80
|
</Button>
|
|
81
81
|
: <IconButton
|
|
82
|
+
size={"small"}
|
|
82
83
|
color={"primary"}
|
|
83
84
|
disabled={!(selectedEntities?.length) || !multipleDeleteEnabled}
|
|
84
85
|
onClick={onMultipleDeleteClick}>
|
|
85
|
-
<DeleteIcon/>
|
|
86
|
+
<DeleteIcon size={"small"}/>
|
|
86
87
|
</IconButton>;
|
|
87
88
|
multipleDeleteButton =
|
|
88
89
|
<Tooltip
|
|
@@ -124,7 +125,9 @@ export function EntityCollectionViewActions<M extends Record<string, any>>({
|
|
|
124
125
|
|
|
125
126
|
return (
|
|
126
127
|
<>
|
|
127
|
-
|
|
128
|
+
<ErrorBoundary>
|
|
129
|
+
{actions}
|
|
130
|
+
</ErrorBoundary>
|
|
128
131
|
{multipleDeleteButton}
|
|
129
132
|
{addButton}
|
|
130
133
|
</>
|
|
@@ -10,9 +10,10 @@ export function useSelectionController<M extends Record<string, any> = any>(
|
|
|
10
10
|
const toggleEntitySelection = useCallback((entity: Entity<M>, newSelectedState?: boolean) => {
|
|
11
11
|
let newValue;
|
|
12
12
|
if (newSelectedState === undefined) {
|
|
13
|
-
|
|
13
|
+
const isSelected = Boolean(selectedEntities.find(e => e.id === entity.id && e.path === entity.path));
|
|
14
|
+
if (isSelected) {
|
|
14
15
|
onSelectionChange?.(entity, false);
|
|
15
|
-
newValue = selectedEntities.filter((item: Entity<M>) => item.id
|
|
16
|
+
newValue = selectedEntities.filter((item: Entity<M>) => !(item.id === entity.id && item.path === entity.path));
|
|
16
17
|
} else {
|
|
17
18
|
onSelectionChange?.(entity, true);
|
|
18
19
|
newValue = [...selectedEntities, entity];
|
|
@@ -23,14 +24,14 @@ export function useSelectionController<M extends Record<string, any> = any>(
|
|
|
23
24
|
newValue = [...selectedEntities, entity];
|
|
24
25
|
} else {
|
|
25
26
|
onSelectionChange?.(entity, false);
|
|
26
|
-
newValue = selectedEntities.filter((item: Entity<M>) => item.id
|
|
27
|
+
newValue = selectedEntities.filter((item: Entity<M>) => !(item.id === entity.id && item.path === entity.path));
|
|
27
28
|
}
|
|
28
29
|
}
|
|
29
30
|
setSelectedEntities(newValue);
|
|
30
31
|
}, [selectedEntities]);
|
|
31
32
|
|
|
32
33
|
const isEntitySelected = useCallback((entity: Entity<M>) => {
|
|
33
|
-
return selectedEntities.
|
|
34
|
+
return Boolean(selectedEntities.find(e => e.id === entity.id && e.path === entity.path));
|
|
34
35
|
}, [selectedEntities]);
|
|
35
36
|
|
|
36
37
|
return {
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export function addRecentId(collectionId: string, id: string) {
|
|
2
|
+
const recentIds = getRecentIds(collectionId);
|
|
3
|
+
const newRecentIds = [id, ...recentIds.filter(i => i !== id)];
|
|
4
|
+
if (newRecentIds.length > 5) {
|
|
5
|
+
newRecentIds.pop();
|
|
6
|
+
}
|
|
7
|
+
saveSearchedIdsLocally(collectionId, newRecentIds);
|
|
8
|
+
return newRecentIds;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function saveSearchedIdsLocally(collectionId: string, ids: string[]) {
|
|
12
|
+
localStorage.setItem("recent_id_searches::" + collectionId, JSON.stringify(ids));
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function getRecentIds(collectionId: string): string[] {
|
|
16
|
+
const stored = localStorage.getItem("recent_id_searches::" + collectionId);
|
|
17
|
+
if (!stored) return [];
|
|
18
|
+
return JSON.parse(stored);
|
|
19
|
+
}
|