@firecms/core 3.0.0-canary.12 → 3.0.0-canary.120
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 +1 -1
- package/dist/app/AppBar.d.ts +12 -0
- package/dist/app/Drawer.d.ts +17 -0
- package/dist/app/Scaffold.d.ts +30 -0
- package/dist/app/index.d.ts +4 -0
- package/dist/app/useApp.d.ts +16 -0
- package/dist/components/ArrayContainer.d.ts +2 -1
- package/dist/components/CircularProgressCenter.d.ts +1 -1
- package/dist/components/ClearFilterSortButton.d.ts +5 -0
- package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +11 -12
- package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +1 -1
- package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +5 -3
- 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/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 +2 -2
- package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +12 -2
- package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
- package/dist/components/EntityPreview.d.ts +6 -5
- package/dist/components/ErrorView.d.ts +1 -1
- package/dist/components/HomePage/DefaultHomePage.d.ts +1 -1
- package/dist/components/HomePage/NavigationCardBinding.d.ts +1 -1
- package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
- package/dist/components/ReferenceWidget.d.ts +3 -1
- package/dist/components/SelectableTable/SelectableTable.d.ts +1 -1
- package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
- package/dist/components/VirtualTable/VirtualTableProps.d.ts +15 -12
- package/dist/components/VirtualTable/types.d.ts +3 -3
- package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -1
- package/dist/components/common/index.d.ts +1 -0
- 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 +2 -1
- package/dist/components/common/useDataSourceEntityCollectionTableController.d.ts +3 -0
- package/dist/components/index.d.ts +3 -1
- package/dist/{components/FireCMSAppBar.d.ts → core/DefaultAppBar.d.ts} +6 -9
- package/dist/core/DefaultDrawer.d.ts +19 -0
- package/dist/core/DrawerNavigationItem.d.ts +10 -0
- package/dist/core/EntityEditView.d.ts +18 -4
- package/dist/core/FireCMS.d.ts +1 -1
- package/dist/core/NavigationRoutes.d.ts +3 -3
- package/dist/core/index.d.ts +3 -4
- 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/FormikArrayContainer.d.ts +2 -1
- package/dist/form/components/LabelWithIcon.d.ts +1 -1
- package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
- package/dist/form/components/StorageItemPreview.d.ts +4 -4
- package/dist/form/components/index.d.ts +1 -0
- 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 +1 -1
- package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +3 -5
- package/dist/form/field_bindings/TextFieldBinding.d.ts +1 -1
- package/dist/form/index.d.ts +2 -4
- package/dist/form/useClearRestoreValue.d.ts +2 -2
- package/dist/hooks/data/save.d.ts +1 -2
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/useBuildNavigationController.d.ts +1 -2
- package/dist/hooks/useProjectLog.d.ts +2 -2
- package/dist/hooks/useValidateAuthenticator.d.ts +4 -8
- package/dist/index.d.ts +1 -0
- package/dist/index.es.js +15742 -12458
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +19965 -587
- package/dist/index.umd.js.map +1 -1
- package/dist/internal/useBuildDataSource.d.ts +1 -16
- package/dist/preview/PropertyPreviewProps.d.ts +6 -1
- package/dist/preview/components/EnumValuesChip.d.ts +1 -1
- package/dist/preview/components/ReferencePreview.d.ts +3 -2
- package/dist/preview/components/StorageThumbnail.d.ts +2 -1
- package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
- package/dist/types/auth.d.ts +3 -3
- package/dist/types/collections.d.ts +39 -5
- package/dist/types/datasource.d.ts +55 -35
- package/dist/types/entities.d.ts +6 -1
- package/dist/types/entity_actions.d.ts +14 -0
- package/dist/types/entity_overrides.d.ts +2 -2
- package/dist/types/fields.d.ts +47 -41
- package/dist/types/index.d.ts +0 -1
- package/dist/types/navigation.d.ts +6 -5
- package/dist/types/plugins.d.ts +14 -4
- package/dist/types/properties.d.ts +34 -21
- package/dist/types/side_dialogs_controller.d.ts +10 -0
- package/dist/types/storage.d.ts +11 -3
- package/dist/util/entities.d.ts +2 -2
- package/dist/util/icon_list.d.ts +5 -1
- package/dist/util/icon_synonyms.d.ts +1 -97
- package/dist/util/icons.d.ts +3 -2
- package/dist/util/index.d.ts +1 -0
- package/dist/util/navigation_utils.d.ts +2 -2
- package/dist/util/objects.d.ts +1 -1
- package/dist/util/plurals.d.ts +0 -2
- package/dist/util/property_utils.d.ts +1 -1
- package/dist/util/resolutions.d.ts +27 -13
- package/dist/util/storage.d.ts +23 -2
- package/dist/util/useStorageUploadController.d.ts +3 -3
- package/package.json +128 -119
- package/src/app/AppBar.tsx +18 -0
- package/src/app/Drawer.tsx +25 -0
- package/src/app/Scaffold.tsx +245 -0
- package/src/app/index.ts +4 -0
- package/src/app/useApp.tsx +32 -0
- package/src/components/ArrayContainer.tsx +15 -10
- package/src/components/CircularProgressCenter.tsx +1 -1
- package/src/components/ClearFilterSortButton.tsx +41 -0
- package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +12 -19
- package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +21 -20
- package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +10 -6
- package/src/components/EntityCollectionTable/PropertyTableCell.tsx +41 -35
- package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
- package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +32 -17
- package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +14 -6
- package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +29 -34
- package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +17 -13
- package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +19 -7
- package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +7 -10
- package/src/components/EntityCollectionView/EntityCollectionView.tsx +75 -51
- package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
- package/src/components/EntityCollectionView/useSelectionController.tsx +19 -7
- package/src/components/EntityPreview.tsx +38 -34
- package/src/components/EntityView.tsx +5 -5
- package/src/components/ErrorView.tsx +1 -1
- package/src/components/HomePage/DefaultHomePage.tsx +26 -19
- package/src/components/HomePage/NavigationCard.tsx +3 -3
- package/src/components/HomePage/NavigationCardBinding.tsx +1 -1
- package/src/components/HomePage/SmallNavigationCard.tsx +5 -6
- package/src/components/PropertyIdCopyTooltip.tsx +48 -0
- package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +8 -6
- package/src/components/ReferenceWidget.tsx +22 -12
- package/src/components/SearchIconsView.tsx +11 -7
- package/src/components/SelectableTable/SelectableTable.tsx +7 -7
- package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
- package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +22 -7
- package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +28 -6
- package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +35 -15
- package/src/components/VirtualTable/VirtualTable.tsx +70 -37
- package/src/components/VirtualTable/VirtualTableCell.tsx +1 -1
- package/src/components/VirtualTable/VirtualTableHeader.tsx +4 -4
- package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
- package/src/components/VirtualTable/VirtualTableProps.tsx +18 -14
- package/src/components/VirtualTable/VirtualTableRow.tsx +4 -5
- package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +4 -4
- package/src/components/VirtualTable/fields/VirtualTableInput.tsx +2 -1
- package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
- package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +0 -2
- package/src/components/VirtualTable/types.tsx +2 -3
- package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +2 -2
- package/src/components/common/index.ts +1 -0
- 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 +23 -2
- package/src/components/common/useDataSourceEntityCollectionTableController.tsx +11 -0
- package/src/components/common/useTableSearchHelper.ts +53 -12
- package/src/components/index.tsx +3 -1
- package/src/contexts/DialogsProvider.tsx +2 -2
- package/src/{components/FireCMSAppBar.tsx → core/DefaultAppBar.tsx} +52 -37
- package/src/core/DefaultDrawer.tsx +179 -0
- package/src/core/DrawerNavigationItem.tsx +66 -0
- package/src/core/EntityEditView.tsx +716 -149
- package/src/core/EntitySidePanel.tsx +1 -2
- package/src/core/FireCMS.tsx +39 -44
- package/src/core/NavigationRoutes.tsx +7 -8
- package/src/core/SideDialogs.tsx +2 -0
- package/src/core/field_configs.tsx +4 -5
- package/src/core/index.tsx +3 -4
- package/src/form/PropertyFieldBinding.tsx +53 -21
- package/src/form/components/CustomIdField.tsx +4 -2
- package/src/form/components/FieldHelperText.tsx +4 -4
- package/src/form/components/FormikArrayContainer.tsx +4 -1
- package/src/form/components/LabelWithIcon.tsx +27 -19
- package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
- package/src/form/components/StorageItemPreview.tsx +21 -11
- package/src/form/components/StorageUploadProgress.tsx +3 -4
- package/src/form/components/index.tsx +1 -0
- package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +26 -15
- package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +29 -24
- package/src/form/field_bindings/BlockFieldBinding.tsx +14 -12
- package/src/form/field_bindings/DateTimeFieldBinding.tsx +17 -14
- package/src/form/field_bindings/KeyValueFieldBinding.tsx +52 -46
- package/src/form/field_bindings/MapFieldBinding.tsx +17 -17
- package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +150 -0
- package/src/form/field_bindings/MultiSelectBinding.tsx +9 -5
- package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +11 -16
- package/src/form/field_bindings/ReferenceFieldBinding.tsx +41 -30
- package/src/form/field_bindings/RepeatFieldBinding.tsx +32 -19
- package/src/form/field_bindings/SelectFieldBinding.tsx +20 -13
- package/src/form/field_bindings/StorageUploadFieldBinding.tsx +36 -46
- package/src/form/field_bindings/SwitchFieldBinding.tsx +9 -5
- package/src/form/field_bindings/TextFieldBinding.tsx +26 -23
- package/src/form/index.tsx +2 -7
- package/src/form/useClearRestoreValue.tsx +2 -2
- package/src/form/validation.ts +1 -17
- package/src/hooks/data/delete.ts +2 -1
- package/src/hooks/data/save.ts +6 -1
- package/src/hooks/data/useDataSource.tsx +11 -3
- package/src/hooks/index.tsx +1 -0
- package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
- package/src/hooks/useBuildModeController.tsx +11 -5
- package/src/hooks/useBuildNavigationController.tsx +91 -31
- package/src/hooks/useProjectLog.tsx +19 -8
- package/src/hooks/useResolvedNavigationFrom.tsx +1 -1
- package/src/hooks/useValidateAuthenticator.tsx +21 -41
- package/src/index.ts +1 -0
- package/src/internal/useBuildDataSource.ts +77 -81
- package/src/internal/useBuildSideDialogsController.tsx +1 -0
- package/src/internal/useBuildSideEntityController.tsx +102 -22
- package/src/internal/useUnsavedChangesDialog.tsx +3 -1
- package/src/preview/PropertyPreview.tsx +10 -17
- package/src/preview/PropertyPreviewProps.tsx +7 -1
- package/src/preview/components/BooleanPreview.tsx +2 -2
- package/src/preview/components/EnumValuesChip.tsx +2 -2
- package/src/preview/components/ImagePreview.tsx +24 -34
- package/src/preview/components/ReferencePreview.tsx +23 -34
- package/src/preview/components/StorageThumbnail.tsx +5 -1
- package/src/preview/components/UrlComponentPreview.tsx +44 -11
- package/src/preview/property_previews/ArrayOfMapsPreview.tsx +1 -2
- package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +3 -2
- package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +1 -2
- package/src/preview/property_previews/ArrayOfStringsPreview.tsx +0 -1
- package/src/preview/property_previews/ArrayOneOfPreview.tsx +3 -4
- package/src/preview/property_previews/ArrayPropertyPreview.tsx +3 -4
- package/src/preview/property_previews/MapPropertyPreview.tsx +6 -6
- package/src/preview/property_previews/SkeletonPropertyComponent.tsx +2 -2
- package/src/preview/property_previews/StringPropertyPreview.tsx +3 -3
- package/src/preview/util.ts +2 -2
- package/src/types/auth.tsx +3 -3
- package/src/types/collections.ts +48 -7
- package/src/types/customization_controller.tsx +0 -1
- package/src/types/datasource.ts +65 -43
- package/src/types/entities.ts +11 -1
- package/src/types/entity_actions.tsx +16 -3
- package/src/types/entity_overrides.tsx +2 -2
- package/src/types/fields.tsx +51 -45
- package/src/types/index.ts +0 -1
- package/src/types/navigation.ts +7 -7
- package/src/types/plugins.tsx +16 -6
- package/src/types/properties.ts +39 -22
- package/src/types/side_dialogs_controller.tsx +13 -0
- package/src/types/storage.ts +12 -3
- package/src/util/entities.ts +6 -5
- package/src/util/enums.ts +1 -1
- package/src/util/icon_list.ts +15 -10
- package/src/util/icon_synonyms.ts +3 -99
- package/src/util/icons.tsx +8 -2
- package/src/util/index.ts +1 -0
- package/src/util/navigation_utils.ts +6 -6
- package/src/util/objects.ts +25 -28
- package/src/util/permissions.ts +1 -0
- package/src/util/plurals.ts +0 -2
- package/src/util/property_utils.tsx +1 -1
- package/src/util/references.ts +3 -0
- package/src/util/resolutions.ts +74 -41
- package/src/util/storage.ts +79 -21
- package/src/util/strings.ts +2 -2
- package/src/util/useStorageUploadController.tsx +33 -7
- package/src/util/useTraceUpdate.tsx +1 -0
- 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/EntityForm.d.ts +0 -77
- 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/PropertyIdCopyTooltipContent.tsx +0 -28
- package/src/core/Drawer.tsx +0 -191
- package/src/core/Scaffold.tsx +0 -281
- package/src/core/SideEntityView.tsx +0 -38
- package/src/form/EntityForm.tsx +0 -728
- 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
|
@@ -1,43 +1,38 @@
|
|
|
1
1
|
import { useCallback, useEffect, useRef, useState } from "react";
|
|
2
2
|
import equal from "react-fast-compare";
|
|
3
3
|
|
|
4
|
-
import {
|
|
4
|
+
import { AuthController, Authenticator, DataSourceDelegate, StorageSource, User } from "../index";
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* This hook is used internally for validating an authenticator.
|
|
8
8
|
*
|
|
9
9
|
* @param authController
|
|
10
10
|
* @param authentication
|
|
11
|
-
* @param getAppCheckToken
|
|
12
|
-
* @param appCheckForceRefresh
|
|
13
11
|
* @param storageSource
|
|
14
|
-
* @param
|
|
12
|
+
* @param dataSourceDelegate
|
|
15
13
|
*/
|
|
16
|
-
export function useValidateAuthenticator<UserType extends User = User, Controller extends AuthController<UserType> = AuthController<UserType>>
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
dataSourceDelegate: DataSourceDelegate;
|
|
32
|
-
storageSource: StorageSource;
|
|
33
|
-
}): {
|
|
14
|
+
export function useValidateAuthenticator<UserType extends User = User, Controller extends AuthController<UserType> = AuthController<UserType>>
|
|
15
|
+
({
|
|
16
|
+
disabled,
|
|
17
|
+
authController,
|
|
18
|
+
authenticator,
|
|
19
|
+
storageSource,
|
|
20
|
+
dataSourceDelegate
|
|
21
|
+
}:
|
|
22
|
+
{
|
|
23
|
+
disabled?: boolean,
|
|
24
|
+
authController: Controller,
|
|
25
|
+
authenticator?: boolean | Authenticator<UserType, Controller>,
|
|
26
|
+
dataSourceDelegate: DataSourceDelegate;
|
|
27
|
+
storageSource: StorageSource;
|
|
28
|
+
}): {
|
|
34
29
|
canAccessMainView: boolean,
|
|
35
30
|
authLoading: boolean,
|
|
36
31
|
notAllowedError: any,
|
|
37
32
|
authVerified: boolean,
|
|
38
33
|
} {
|
|
39
34
|
|
|
40
|
-
const authenticationEnabled = Boolean(
|
|
35
|
+
const authenticationEnabled = Boolean(authenticator);
|
|
41
36
|
|
|
42
37
|
const [authLoading, setAuthLoading] = useState<boolean>(authenticationEnabled);
|
|
43
38
|
const [notAllowedError, setNotAllowedError] = useState<any>(false);
|
|
@@ -76,26 +71,11 @@ export function useValidateAuthenticator<UserType extends User = User, Controlle
|
|
|
76
71
|
}
|
|
77
72
|
|
|
78
73
|
const delegateUser = authController.user;
|
|
79
|
-
console.debug("Checking authentication for user", delegateUser);
|
|
80
74
|
|
|
81
|
-
if (
|
|
82
|
-
try {
|
|
83
|
-
if (!await getAppCheckToken(appCheckForceRefresh)) {
|
|
84
|
-
setNotAllowedError("App Check failed.");
|
|
85
|
-
authController.signOut();
|
|
86
|
-
} else {
|
|
87
|
-
console.debug("App Check success.");
|
|
88
|
-
}
|
|
89
|
-
} catch (e: any) {
|
|
90
|
-
setNotAllowedError(e.message);
|
|
91
|
-
authController.signOut();
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
if (authentication instanceof Function && delegateUser && !equal(checkedUserRef.current?.uid, delegateUser.uid)) {
|
|
75
|
+
if (authenticator instanceof Function && delegateUser && !equal(checkedUserRef.current?.uid, delegateUser.uid)) {
|
|
96
76
|
setAuthLoading(true);
|
|
97
77
|
try {
|
|
98
|
-
const allowed = await
|
|
78
|
+
const allowed = await authenticator({
|
|
99
79
|
user: delegateUser,
|
|
100
80
|
authController,
|
|
101
81
|
dataSourceDelegate,
|
|
@@ -120,7 +100,7 @@ export function useValidateAuthenticator<UserType extends User = User, Controlle
|
|
|
120
100
|
setAuthVerified(true);
|
|
121
101
|
}
|
|
122
102
|
|
|
123
|
-
}, [disabled, authController,
|
|
103
|
+
}, [disabled, authController, authenticator, dataSourceDelegate, storageSource]);
|
|
124
104
|
|
|
125
105
|
useEffect(() => {
|
|
126
106
|
checkAuthentication();
|
package/src/index.ts
CHANGED
|
@@ -5,12 +5,11 @@ import {
|
|
|
5
5
|
DeleteEntityProps,
|
|
6
6
|
Entity,
|
|
7
7
|
EntityCollection,
|
|
8
|
-
EntityReference,
|
|
9
8
|
EntityValues,
|
|
10
9
|
FetchCollectionProps,
|
|
11
10
|
FetchEntityProps,
|
|
12
11
|
FilterValues,
|
|
13
|
-
|
|
12
|
+
FireCMSContext,
|
|
14
13
|
ListenCollectionProps,
|
|
15
14
|
ListenEntityProps,
|
|
16
15
|
NavigationController,
|
|
@@ -53,23 +52,25 @@ export function useBuildDataSource({
|
|
|
53
52
|
*/
|
|
54
53
|
fetchCollection: useCallback(<M extends Record<string, any>>({
|
|
55
54
|
path,
|
|
56
|
-
collection
|
|
55
|
+
collection,
|
|
57
56
|
filter,
|
|
58
57
|
limit,
|
|
59
58
|
startAfter,
|
|
60
59
|
searchString,
|
|
61
60
|
orderBy,
|
|
62
|
-
order
|
|
61
|
+
order,
|
|
63
62
|
}: FetchCollectionProps<M>
|
|
64
63
|
): Promise<Entity<M>[]> => {
|
|
65
|
-
|
|
64
|
+
const usedDelegate = collection?.overrides?.dataSourceDelegate ?? delegate;
|
|
65
|
+
return usedDelegate.fetchCollection<M>({
|
|
66
66
|
path,
|
|
67
67
|
filter,
|
|
68
68
|
limit,
|
|
69
69
|
startAfter,
|
|
70
70
|
searchString,
|
|
71
71
|
orderBy,
|
|
72
|
-
order
|
|
72
|
+
order,
|
|
73
|
+
collection
|
|
73
74
|
});
|
|
74
75
|
}, [delegate]),
|
|
75
76
|
|
|
@@ -90,7 +91,6 @@ export function useBuildDataSource({
|
|
|
90
91
|
* @group Firestore
|
|
91
92
|
*/
|
|
92
93
|
listenCollection: delegate.listenCollection
|
|
93
|
-
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
94
94
|
? useCallback(<M extends Record<string, any>>(
|
|
95
95
|
{
|
|
96
96
|
path,
|
|
@@ -107,11 +107,12 @@ export function useBuildDataSource({
|
|
|
107
107
|
): () => void => {
|
|
108
108
|
|
|
109
109
|
const collection = collectionProp ?? navigationController.getCollection(path);
|
|
110
|
-
const
|
|
111
|
-
|
|
110
|
+
const usedDelegate = collection?.overrides?.dataSourceDelegate ?? delegate;
|
|
111
|
+
|
|
112
|
+
if (!usedDelegate.listenCollection)
|
|
112
113
|
throw Error("useBuildDataSource delegate not initialised");
|
|
113
114
|
|
|
114
|
-
return
|
|
115
|
+
return usedDelegate.listenCollection<M>({
|
|
115
116
|
path,
|
|
116
117
|
filter,
|
|
117
118
|
limit,
|
|
@@ -121,8 +122,7 @@ export function useBuildDataSource({
|
|
|
121
122
|
order,
|
|
122
123
|
onUpdate,
|
|
123
124
|
onError,
|
|
124
|
-
|
|
125
|
-
collection
|
|
125
|
+
collection,
|
|
126
126
|
});
|
|
127
127
|
}, [delegate, navigationController.getCollection])
|
|
128
128
|
: undefined,
|
|
@@ -136,12 +136,17 @@ export function useBuildDataSource({
|
|
|
136
136
|
*/
|
|
137
137
|
fetchEntity: useCallback(<M extends Record<string, any>>({
|
|
138
138
|
path,
|
|
139
|
-
entityId
|
|
139
|
+
entityId,
|
|
140
|
+
collection
|
|
140
141
|
}: FetchEntityProps<M>
|
|
141
|
-
): Promise<Entity<M> | undefined> =>
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
142
|
+
): Promise<Entity<M> | undefined> => {
|
|
143
|
+
const usedDelegate = collection?.overrides?.dataSourceDelegate ?? delegate;
|
|
144
|
+
return usedDelegate.fetchEntity({
|
|
145
|
+
path,
|
|
146
|
+
entityId,
|
|
147
|
+
collection
|
|
148
|
+
});
|
|
149
|
+
}, [delegate.fetchEntity]),
|
|
145
150
|
|
|
146
151
|
/**
|
|
147
152
|
*
|
|
@@ -154,7 +159,6 @@ export function useBuildDataSource({
|
|
|
154
159
|
* @group Firestore
|
|
155
160
|
*/
|
|
156
161
|
listenEntity: delegate.listenEntity
|
|
157
|
-
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
158
162
|
? useCallback(<M extends Record<string, any>>(
|
|
159
163
|
{
|
|
160
164
|
path,
|
|
@@ -163,14 +167,17 @@ export function useBuildDataSource({
|
|
|
163
167
|
onUpdate,
|
|
164
168
|
onError
|
|
165
169
|
}: ListenEntityProps<M>): () => void => {
|
|
166
|
-
|
|
170
|
+
const usedDelegate = collection?.overrides?.dataSourceDelegate ?? delegate;
|
|
171
|
+
|
|
172
|
+
if (!usedDelegate.listenEntity)
|
|
167
173
|
throw Error("useBuildDataSource delegate not initialised");
|
|
168
174
|
|
|
169
|
-
return
|
|
175
|
+
return usedDelegate.listenEntity<M>({
|
|
170
176
|
path,
|
|
171
177
|
entityId,
|
|
172
178
|
onUpdate,
|
|
173
|
-
onError
|
|
179
|
+
onError,
|
|
180
|
+
collection
|
|
174
181
|
})
|
|
175
182
|
}, [delegate.listenEntity]) : undefined,
|
|
176
183
|
|
|
@@ -195,6 +202,16 @@ export function useBuildDataSource({
|
|
|
195
202
|
}: SaveEntityProps<M>): Promise<Entity<M>> => {
|
|
196
203
|
|
|
197
204
|
const collection = collectionProp ?? navigationController.getCollection(path);
|
|
205
|
+
const usedDelegate = collection?.overrides?.dataSourceDelegate ?? delegate;
|
|
206
|
+
|
|
207
|
+
console.log("useBuildDatasource save", {
|
|
208
|
+
path,
|
|
209
|
+
entityId,
|
|
210
|
+
values,
|
|
211
|
+
collectionProp,
|
|
212
|
+
collection,
|
|
213
|
+
status
|
|
214
|
+
});
|
|
198
215
|
|
|
199
216
|
const resolvedCollection = collection
|
|
200
217
|
? resolveCollection<M>({
|
|
@@ -207,34 +224,32 @@ export function useBuildDataSource({
|
|
|
207
224
|
|
|
208
225
|
const properties: ResolvedProperties<M> | undefined = resolvedCollection?.properties;
|
|
209
226
|
|
|
210
|
-
const firestoreValues = cmsToDelegateModel(
|
|
227
|
+
const firestoreValues = usedDelegate.cmsToDelegateModel(
|
|
211
228
|
values,
|
|
212
|
-
delegate.buildReference,
|
|
213
|
-
delegate.buildGeoPoint,
|
|
214
|
-
delegate.buildDate,
|
|
215
|
-
delegate.buildDeleteFieldValue
|
|
216
229
|
);
|
|
217
|
-
|
|
230
|
+
|
|
231
|
+
const updatedValues: EntityValues<M> = properties
|
|
218
232
|
? updateDateAutoValues(
|
|
219
233
|
{
|
|
220
234
|
inputValues: firestoreValues,
|
|
221
235
|
properties,
|
|
222
236
|
status,
|
|
223
|
-
timestampNowValue:
|
|
224
|
-
setDateToMidnight:
|
|
237
|
+
timestampNowValue: usedDelegate.currentTime?.() ?? new Date(),
|
|
238
|
+
setDateToMidnight: usedDelegate.setDateToMidnight
|
|
225
239
|
})
|
|
226
240
|
: firestoreValues;
|
|
227
241
|
|
|
228
|
-
return
|
|
242
|
+
return usedDelegate.saveEntity({
|
|
229
243
|
path,
|
|
244
|
+
collection,
|
|
230
245
|
entityId,
|
|
231
|
-
values:
|
|
246
|
+
values: updatedValues,
|
|
232
247
|
status
|
|
233
248
|
}).then((res) => {
|
|
234
249
|
return {
|
|
235
250
|
id: res.id,
|
|
236
251
|
path: res.path,
|
|
237
|
-
values:
|
|
252
|
+
values: usedDelegate.delegateToCMSModel(updatedValues)
|
|
238
253
|
} as Entity<M>;
|
|
239
254
|
});
|
|
240
255
|
}, [delegate.saveEntity, navigationController.getCollection]),
|
|
@@ -247,10 +262,12 @@ export function useBuildDataSource({
|
|
|
247
262
|
*/
|
|
248
263
|
deleteEntity: useCallback(<M extends Record<string, any>>(
|
|
249
264
|
{
|
|
250
|
-
entity
|
|
265
|
+
entity,
|
|
266
|
+
collection
|
|
251
267
|
}: DeleteEntityProps<M>
|
|
252
268
|
): Promise<void> => {
|
|
253
|
-
|
|
269
|
+
const usedDelegate = collection?.overrides?.dataSourceDelegate ?? delegate;
|
|
270
|
+
return usedDelegate.deleteEntity({ entity, collection });
|
|
254
271
|
}, [delegate.deleteEntity]),
|
|
255
272
|
|
|
256
273
|
/**
|
|
@@ -267,13 +284,16 @@ export function useBuildDataSource({
|
|
|
267
284
|
path: string,
|
|
268
285
|
name: string,
|
|
269
286
|
value: any,
|
|
270
|
-
entityId?: string
|
|
287
|
+
entityId?: string,
|
|
288
|
+
collection?: EntityCollection
|
|
271
289
|
): Promise<boolean> => {
|
|
272
|
-
|
|
290
|
+
const usedDelegate = collection?.overrides?.dataSourceDelegate ?? delegate;
|
|
291
|
+
return usedDelegate.checkUniqueField(path, name, value, entityId, collection);
|
|
273
292
|
}, [delegate.checkUniqueField]),
|
|
274
293
|
|
|
275
|
-
generateEntityId: useCallback((path: string): string => {
|
|
276
|
-
|
|
294
|
+
generateEntityId: useCallback((path: string, collection: EntityCollection): string => {
|
|
295
|
+
const usedDelegate = collection?.overrides?.dataSourceDelegate ?? delegate;
|
|
296
|
+
return usedDelegate.generateEntityId(path, collection);
|
|
277
297
|
}, [delegate.generateEntityId]),
|
|
278
298
|
|
|
279
299
|
countEntities: delegate.countEntities ? async ({
|
|
@@ -289,21 +309,24 @@ export function useBuildDataSource({
|
|
|
289
309
|
orderBy?: string,
|
|
290
310
|
order?: "desc" | "asc",
|
|
291
311
|
}): Promise<number> => {
|
|
292
|
-
|
|
312
|
+
const usedDelegate = collection?.overrides?.dataSourceDelegate ?? delegate;
|
|
313
|
+
return usedDelegate.countEntities!({
|
|
293
314
|
path,
|
|
294
315
|
filter,
|
|
295
316
|
orderBy,
|
|
296
317
|
order,
|
|
297
|
-
|
|
318
|
+
collection
|
|
298
319
|
});
|
|
299
320
|
} : undefined,
|
|
300
321
|
|
|
301
322
|
isFilterCombinationValid: useCallback(({
|
|
302
323
|
path,
|
|
324
|
+
databaseId,
|
|
303
325
|
filterValues,
|
|
304
326
|
sortBy
|
|
305
327
|
}: {
|
|
306
328
|
path: string,
|
|
329
|
+
databaseId?: string,
|
|
307
330
|
filterValues: FilterValues<any>,
|
|
308
331
|
sortBy?: [string, "asc" | "desc"]
|
|
309
332
|
}): boolean => {
|
|
@@ -312,52 +335,25 @@ export function useBuildDataSource({
|
|
|
312
335
|
return delegate.isFilterCombinationValid(
|
|
313
336
|
{
|
|
314
337
|
path,
|
|
338
|
+
databaseId,
|
|
315
339
|
filterValues,
|
|
316
340
|
sortBy
|
|
317
341
|
}
|
|
318
342
|
)
|
|
319
|
-
}, [delegate.isFilterCombinationValid])
|
|
343
|
+
}, [delegate.isFilterCombinationValid]),
|
|
320
344
|
|
|
321
|
-
|
|
345
|
+
initTextSearch: useCallback(async (props: {
|
|
346
|
+
context: FireCMSContext,
|
|
347
|
+
path: string,
|
|
348
|
+
collection: EntityCollection,
|
|
349
|
+
parentCollectionIds?: string[]
|
|
350
|
+
}): Promise<boolean> => {
|
|
351
|
+
const usedDelegate = props.collection?.overrides?.dataSourceDelegate ?? delegate;
|
|
352
|
+
if (!usedDelegate.initTextSearch)
|
|
353
|
+
return false;
|
|
354
|
+
return usedDelegate.initTextSearch(props)
|
|
355
|
+
}, [delegate.initTextSearch]),
|
|
322
356
|
|
|
323
|
-
}
|
|
357
|
+
};
|
|
324
358
|
|
|
325
|
-
/**
|
|
326
|
-
* Recursive function that converts Firestore data types into CMS or plain
|
|
327
|
-
* JS types.
|
|
328
|
-
* FireCMS uses Javascript dates internally instead of Firestore timestamps.
|
|
329
|
-
* This makes it easier to interact with the rest of the libraries and
|
|
330
|
-
* bindings.
|
|
331
|
-
* Also, Firestore references are replaced with {@link EntityReference}
|
|
332
|
-
* @param data
|
|
333
|
-
* @param buildReference
|
|
334
|
-
* @param buildGeoPoint
|
|
335
|
-
* @param buildDate
|
|
336
|
-
* @param buildDelete
|
|
337
|
-
* @group Firestore
|
|
338
|
-
*/
|
|
339
|
-
export function cmsToDelegateModel(data: any,
|
|
340
|
-
buildReference: (reference: EntityReference) => any,
|
|
341
|
-
buildGeoPoint: (geoPoint: GeoPoint) => any,
|
|
342
|
-
buildDate: (date: Date) => any,
|
|
343
|
-
buildDelete: () => any
|
|
344
|
-
): any {
|
|
345
|
-
if (data === undefined) {
|
|
346
|
-
return buildDelete();
|
|
347
|
-
} else if (data === null) {
|
|
348
|
-
return null;
|
|
349
|
-
} else if (Array.isArray(data)) {
|
|
350
|
-
return data.map(v => cmsToDelegateModel(v, buildReference, buildGeoPoint, buildDate, buildDelete));
|
|
351
|
-
} else if (data.isEntityReference && data.isEntityReference()) {
|
|
352
|
-
return buildReference(data);
|
|
353
|
-
} else if (data instanceof GeoPoint) {
|
|
354
|
-
return buildGeoPoint(data);
|
|
355
|
-
} else if (data instanceof Date) {
|
|
356
|
-
return buildDate(data);
|
|
357
|
-
} else if (data && typeof data === "object") {
|
|
358
|
-
return Object.entries(data)
|
|
359
|
-
.map(([key, v]) => ({ [key]: cmsToDelegateModel(v, buildReference, buildGeoPoint, buildDate, buildDelete) }))
|
|
360
|
-
.reduce((a, b) => ({ ...a, ...b }), {});
|
|
361
|
-
}
|
|
362
|
-
return data;
|
|
363
359
|
}
|
|
@@ -3,13 +3,14 @@ import {
|
|
|
3
3
|
EntityCollection,
|
|
4
4
|
EntitySidePanelProps,
|
|
5
5
|
NavigationController,
|
|
6
|
+
ResolvedProperty,
|
|
6
7
|
SideDialogPanelProps,
|
|
7
8
|
SideDialogsController,
|
|
8
9
|
SideEntityController
|
|
9
10
|
} from "../types";
|
|
10
11
|
import { getNavigationEntriesFromPathInternal, NavigationViewInternal } from "../util/navigation_from_path";
|
|
11
12
|
import { useLocation } from "react-router-dom";
|
|
12
|
-
import { removeInitialAndTrailingSlashes, resolveDefaultSelectedView } from "../util";
|
|
13
|
+
import { removeInitialAndTrailingSlashes, resolveCollection, resolveDefaultSelectedView } from "../util";
|
|
13
14
|
import { ADDITIONAL_TAB_WIDTH, CONTAINER_FULL_WIDTH, FORM_CONTAINER_WIDTH } from "./common";
|
|
14
15
|
import { useLargeLayout } from "../hooks";
|
|
15
16
|
import { EntitySidePanel } from "../core/EntitySidePanel";
|
|
@@ -19,8 +20,67 @@ const NEW_URL_HASH = "new";
|
|
|
19
20
|
export function getEntityViewWidth(props: EntitySidePanelProps<any>, small: boolean): string {
|
|
20
21
|
if (small) return CONTAINER_FULL_WIDTH;
|
|
21
22
|
const mainViewSelected = !props.selectedSubPath;
|
|
22
|
-
|
|
23
|
-
|
|
23
|
+
let resolvedWidth: string | undefined;
|
|
24
|
+
if (props.width) {
|
|
25
|
+
resolvedWidth = typeof props.width === "number" ? `${props.width}px` : props.width;
|
|
26
|
+
} else if (props.collection?.sideDialogWidth) {
|
|
27
|
+
resolvedWidth = typeof props.collection.sideDialogWidth === "number" ? `${props.collection.sideDialogWidth}px` : props.collection.sideDialogWidth;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (!mainViewSelected) {
|
|
31
|
+
return `calc(${ADDITIONAL_TAB_WIDTH} + ${resolvedWidth ?? FORM_CONTAINER_WIDTH})`
|
|
32
|
+
} else {
|
|
33
|
+
if (resolvedWidth) {
|
|
34
|
+
return resolvedWidth
|
|
35
|
+
} else if (!props.collection) {
|
|
36
|
+
return FORM_CONTAINER_WIDTH;
|
|
37
|
+
} else {
|
|
38
|
+
return calculateCollectionDesiredWidth(props.collection);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const collectionViewWidthCache: { [key: string]: string } = {};
|
|
44
|
+
|
|
45
|
+
function calculateCollectionDesiredWidth(collection: EntityCollection<any>): string {
|
|
46
|
+
if (collectionViewWidthCache[collection.id]) {
|
|
47
|
+
return collectionViewWidthCache[collection.id];
|
|
48
|
+
}
|
|
49
|
+
const resolvedCollection = resolveCollection({
|
|
50
|
+
collection,
|
|
51
|
+
path: "__ignored",
|
|
52
|
+
ignoreMissingFields: true
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
let result = FORM_CONTAINER_WIDTH
|
|
56
|
+
if (resolvedCollection?.properties) {
|
|
57
|
+
const values = Object.values(resolvedCollection.properties).map((p: ResolvedProperty) => getNestedPropertiesDepth(p));
|
|
58
|
+
const maxDepth = Math.max(...values);
|
|
59
|
+
if (maxDepth < 3) {
|
|
60
|
+
result = FORM_CONTAINER_WIDTH;
|
|
61
|
+
} else {
|
|
62
|
+
result = 768 + 32 * (maxDepth - 2) + "px";
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
collectionViewWidthCache[collection.id] = result;
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function getNestedPropertiesDepth(property: ResolvedProperty, accumulator: number = 0): number {
|
|
70
|
+
if (property.dataType === "map" && property.properties) {
|
|
71
|
+
const values = Object.values(property.properties).flatMap((property) => getNestedPropertiesDepth(property, accumulator + 1));
|
|
72
|
+
return Math.max(...values);
|
|
73
|
+
} else if (property.dataType === "array" && property.oneOf) {
|
|
74
|
+
return accumulator + 3;
|
|
75
|
+
} else if (property.dataType === "array" && property.of) {
|
|
76
|
+
if (Array.isArray(property.of)) {
|
|
77
|
+
return Math.max(...property.of.map((p) => getNestedPropertiesDepth(p, accumulator + 1)));
|
|
78
|
+
} else {
|
|
79
|
+
return getNestedPropertiesDepth(property.of, accumulator + 1);
|
|
80
|
+
}
|
|
81
|
+
} else {
|
|
82
|
+
return accumulator + 1;
|
|
83
|
+
}
|
|
24
84
|
}
|
|
25
85
|
|
|
26
86
|
export const useBuildSideEntityController = (navigation: NavigationController,
|
|
@@ -34,23 +94,36 @@ export const useBuildSideEntityController = (navigation: NavigationController,
|
|
|
34
94
|
// only on initialisation, create panels from URL
|
|
35
95
|
useEffect(() => {
|
|
36
96
|
if (!navigation.loading && !initialised.current) {
|
|
97
|
+
console.debug("Initialising side entity controller");
|
|
37
98
|
if (navigation.isUrlCollectionPath(location.pathname)) {
|
|
38
99
|
const newFlag = location.hash === `#${NEW_URL_HASH}`;
|
|
39
100
|
const entityOrCollectionPath = navigation.urlPathToDataPath(location.pathname);
|
|
40
101
|
const panelsFromUrl = buildSidePanelsFromUrl(entityOrCollectionPath, navigation.collections ?? [], newFlag);
|
|
41
102
|
for (let i = 0; i < panelsFromUrl.length; i++) {
|
|
42
|
-
const
|
|
103
|
+
const props = panelsFromUrl[i];
|
|
43
104
|
setTimeout(() => {
|
|
44
105
|
if (i === 0)
|
|
45
|
-
sideDialogsController.replace(propsToSidePanel(
|
|
106
|
+
sideDialogsController.replace(propsToSidePanel(props, navigation.buildUrlCollectionPath, navigation.resolveAliasesFrom, smallLayout));
|
|
46
107
|
else
|
|
47
|
-
sideDialogsController.open(propsToSidePanel(
|
|
108
|
+
sideDialogsController.open(propsToSidePanel(props, navigation.buildUrlCollectionPath, navigation.resolveAliasesFrom, smallLayout))
|
|
48
109
|
}, 1);
|
|
49
110
|
}
|
|
111
|
+
} else {
|
|
112
|
+
// console.warn("Location path is not a collection path");
|
|
50
113
|
}
|
|
51
114
|
initialised.current = true;
|
|
52
115
|
}
|
|
53
|
-
}, [location, navigation, sideDialogsController, smallLayout]);
|
|
116
|
+
}, [location, navigation.loading, navigation.isUrlCollectionPath, navigation.buildUrlCollectionPath, navigation.resolveAliasesFrom, sideDialogsController, smallLayout, navigation]);
|
|
117
|
+
|
|
118
|
+
useEffect(() => {
|
|
119
|
+
const updatedSidePanels = sideDialogsController.sidePanels.map(sidePanelProps => {
|
|
120
|
+
if (sidePanelProps.additional) {
|
|
121
|
+
return propsToSidePanel(sidePanelProps.additional, navigation.buildUrlCollectionPath, navigation.resolveAliasesFrom, smallLayout);
|
|
122
|
+
}
|
|
123
|
+
return sidePanelProps;
|
|
124
|
+
});
|
|
125
|
+
sideDialogsController.setSidePanels(updatedSidePanels);
|
|
126
|
+
}, [smallLayout]);
|
|
54
127
|
|
|
55
128
|
const close = useCallback(() => {
|
|
56
129
|
sideDialogsController.close();
|
|
@@ -73,9 +146,9 @@ export const useBuildSideEntityController = (navigation: NavigationController,
|
|
|
73
146
|
sideDialogsController.open(propsToSidePanel({
|
|
74
147
|
selectedSubPath: defaultSelectedView,
|
|
75
148
|
...props,
|
|
76
|
-
}, navigation, smallLayout));
|
|
149
|
+
}, navigation.buildUrlCollectionPath, navigation.resolveAliasesFrom, smallLayout));
|
|
77
150
|
|
|
78
|
-
}, [sideDialogsController, navigation, smallLayout]);
|
|
151
|
+
}, [sideDialogsController, navigation.buildUrlCollectionPath, navigation.resolveAliasesFrom, smallLayout]);
|
|
79
152
|
|
|
80
153
|
const replace = useCallback((props: EntitySidePanelProps<any>) => {
|
|
81
154
|
|
|
@@ -83,9 +156,9 @@ export const useBuildSideEntityController = (navigation: NavigationController,
|
|
|
83
156
|
throw Error("If you want to copy an entity you need to provide an entityId");
|
|
84
157
|
}
|
|
85
158
|
|
|
86
|
-
sideDialogsController.replace(propsToSidePanel(props, navigation, smallLayout));
|
|
159
|
+
sideDialogsController.replace(propsToSidePanel(props, navigation.buildUrlCollectionPath, navigation.resolveAliasesFrom, smallLayout));
|
|
87
160
|
|
|
88
|
-
}, [navigation, sideDialogsController, smallLayout]);
|
|
161
|
+
}, [navigation.buildUrlCollectionPath, navigation.resolveAliasesFrom, sideDialogsController, smallLayout]);
|
|
89
162
|
|
|
90
163
|
return {
|
|
91
164
|
close,
|
|
@@ -116,7 +189,8 @@ export function buildSidePanelsFromUrl(path: string, collections: EntityCollecti
|
|
|
116
189
|
sidePanels.push({
|
|
117
190
|
path: navigationEntry.path,
|
|
118
191
|
entityId: navigationEntry.entityId,
|
|
119
|
-
copy: false
|
|
192
|
+
copy: false,
|
|
193
|
+
width: navigationEntry.parentCollection?.sideDialogWidth
|
|
120
194
|
}
|
|
121
195
|
);
|
|
122
196
|
} else if (navigationEntry.type === "custom_view") {
|
|
@@ -146,27 +220,33 @@ export function buildSidePanelsFromUrl(path: string, collections: EntityCollecti
|
|
|
146
220
|
return sidePanels;
|
|
147
221
|
}
|
|
148
222
|
|
|
149
|
-
const propsToSidePanel = (props: EntitySidePanelProps
|
|
223
|
+
const propsToSidePanel = (props: EntitySidePanelProps,
|
|
224
|
+
buildUrlCollectionPath: (path: string) => string,
|
|
225
|
+
resolveAliasesFrom: (pathWithAliases: string) => string,
|
|
226
|
+
smallLayout: boolean): SideDialogPanelProps => {
|
|
150
227
|
|
|
151
228
|
const collectionPath = removeInitialAndTrailingSlashes(props.path);
|
|
152
229
|
|
|
153
230
|
const newPath = props.entityId
|
|
154
|
-
?
|
|
155
|
-
:
|
|
156
|
-
const resolvedPath =
|
|
231
|
+
? buildUrlCollectionPath(`${collectionPath}/${props.entityId}/${props.selectedSubPath || ""}`)
|
|
232
|
+
: buildUrlCollectionPath(`${collectionPath}#${NEW_URL_HASH}`);
|
|
233
|
+
const resolvedPath = resolveAliasesFrom(props.path);
|
|
157
234
|
|
|
158
235
|
const resolvedPanelProps: EntitySidePanelProps<any> = {
|
|
159
236
|
...props,
|
|
160
|
-
path: resolvedPath
|
|
237
|
+
path: resolvedPath,
|
|
161
238
|
};
|
|
162
239
|
|
|
163
|
-
|
|
240
|
+
const entityViewWidth = getEntityViewWidth(props, smallLayout);
|
|
241
|
+
|
|
242
|
+
return {
|
|
164
243
|
key: `${props.path}/${props.entityId}`,
|
|
165
244
|
component: <EntitySidePanel {...resolvedPanelProps}/>,
|
|
166
245
|
urlPath: newPath,
|
|
167
|
-
parentUrlPath:
|
|
168
|
-
width:
|
|
169
|
-
onClose: props.onClose
|
|
170
|
-
|
|
246
|
+
parentUrlPath: buildUrlCollectionPath(collectionPath),
|
|
247
|
+
width: entityViewWidth,
|
|
248
|
+
onClose: props.onClose,
|
|
249
|
+
additional: props
|
|
250
|
+
};
|
|
171
251
|
}
|
|
172
252
|
;
|
|
@@ -84,8 +84,10 @@ export function UnsavedChangesDialog({
|
|
|
84
84
|
|
|
85
85
|
return (
|
|
86
86
|
<Dialog
|
|
87
|
+
onEscapeKeyDown={() => {
|
|
88
|
+
handleCancel();
|
|
89
|
+
}}
|
|
87
90
|
open={open}
|
|
88
|
-
onOpenChange={(open) => open ? handleCancel() : handleOk()}
|
|
89
91
|
>
|
|
90
92
|
<DialogContent>
|
|
91
93
|
<Typography variant={"h6"}>{title}</Typography>
|