@firecms/core 3.0.0-canary.98 → 3.0.0-rc.1
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/VirtualTable/VirtualTableProps.d.ts +11 -2
- 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/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 -2
- 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/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/useAuthController.d.ts +1 -1
- package/dist/hooks/useBreadcrumbsController.d.ts +26 -0
- package/dist/hooks/useBuildNavigationController.d.ts +57 -12
- package/dist/hooks/useFireCMSContext.d.ts +1 -1
- 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 +20108 -14471
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +20039 -14407
- 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/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 +86 -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 +2 -1
- 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 +16 -3
- package/dist/types/firecms_context.d.ts +1 -1
- package/dist/types/navigation.d.ts +60 -17
- package/dist/types/permissions.d.ts +4 -4
- package/dist/types/plugins.d.ts +42 -9
- package/dist/types/properties.d.ts +65 -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 +1 -0
- package/dist/util/builders.d.ts +3 -3
- package/dist/util/callbacks.d.ts +2 -0
- package/dist/util/createFormexStub.d.ts +2 -0
- package/dist/util/entities.d.ts +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 +35 -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 +522 -160
- package/src/components/HomePage/FavouritesView.tsx +9 -14
- package/src/components/HomePage/HomePageDnD.tsx +642 -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 +117 -0
- package/src/components/HomePage/SmallNavigationCard.tsx +1 -2
- package/src/components/NotFoundPage.tsx +2 -2
- package/src/components/PropertyConfigBadge.tsx +9 -3
- package/src/components/PropertyIdCopyTooltip.tsx +47 -0
- package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +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 +59 -10
- package/src/components/UnsavedChangesDialog.tsx +46 -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/common/default_entity_actions.tsx +62 -42
- package/src/components/common/index.ts +1 -1
- package/src/components/common/useColumnsIds.tsx +1 -1
- 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/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 +46 -25
- 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 +24 -10
- 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 +55 -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/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/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/useFireCMSContext.tsx +3 -33
- 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 +28 -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 +6 -16
- package/src/preview/components/UrlComponentPreview.tsx +20 -21
- 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 +5 -3
- 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 +101 -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 +3 -1
- 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 +18 -4
- package/src/types/firecms_context.tsx +1 -1
- package/src/types/navigation.ts +76 -22
- package/src/types/permissions.ts +5 -5
- package/src/types/plugins.tsx +50 -9
- package/src/types/properties.ts +74 -22
- package/src/types/property_config.tsx +1 -2
- package/src/types/roles.ts +3 -0
- package/src/types/side_dialogs_controller.tsx +15 -0
- package/src/types/side_entity_controller.tsx +16 -1
- package/src/types/storage.ts +82 -0
- package/src/types/user.ts +2 -0
- package/src/util/builders.ts +10 -8
- package/src/util/callbacks.ts +119 -0
- package/src/util/createFormexStub.tsx +62 -0
- package/src/util/entities.ts +5 -3
- 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
package/src/util/index.ts
CHANGED
|
@@ -7,6 +7,7 @@ export * from "./objects";
|
|
|
7
7
|
export * from "./paths";
|
|
8
8
|
export * from "./regexp";
|
|
9
9
|
export * from "./navigation_utils";
|
|
10
|
+
export * from "./entity_actions";
|
|
10
11
|
export * from "./useDebouncedCallback";
|
|
11
12
|
export * from "./property_utils";
|
|
12
13
|
export * from "./resolutions";
|
|
@@ -21,3 +22,5 @@ export * from "./make_properties_editable";
|
|
|
21
22
|
export * from "./join_collections";
|
|
22
23
|
export * from "./builders";
|
|
23
24
|
export * from "./useTraceUpdate";
|
|
25
|
+
export * from "./storage";
|
|
26
|
+
export * from "./callbacks";
|
|
@@ -78,6 +78,7 @@ export function mergeCollection(target: EntityCollection,
|
|
|
78
78
|
modifyCollection?: (props: ModifyCollectionProps) => EntityCollection | void
|
|
79
79
|
): EntityCollection {
|
|
80
80
|
|
|
81
|
+
|
|
81
82
|
const subcollectionsMerged = joinCollectionLists(
|
|
82
83
|
target?.subcollections ?? [],
|
|
83
84
|
source?.subcollections ?? [],
|
|
@@ -94,18 +95,20 @@ export function mergeCollection(target: EntityCollection,
|
|
|
94
95
|
propertiesMerged[key] = source.properties[key] as PropertyOrBuilder;
|
|
95
96
|
});
|
|
96
97
|
|
|
97
|
-
const mergedCollection = mergeDeep(target, source);
|
|
98
|
+
const mergedCollection = mergeDeep(target, source, true);
|
|
98
99
|
const targetPropertiesOrder = getCollectionKeys(target);
|
|
99
100
|
const sourcePropertiesOrder = getCollectionKeys(source);
|
|
100
101
|
const mergedPropertiesOrder = [...new Set([...sourcePropertiesOrder, ...targetPropertiesOrder])];
|
|
101
102
|
const mergedEntityViews = [...new Set([...(target.entityViews ?? []), ...(source.entityViews ?? [])])];
|
|
103
|
+
const mergedEntityActions = [...new Set([...(target.entityActions ?? []), ...(source.entityActions ?? [])])];
|
|
102
104
|
|
|
103
105
|
let resultCollection: EntityCollection = {
|
|
104
106
|
...mergedCollection,
|
|
105
107
|
subcollections: subcollectionsMerged,
|
|
106
108
|
properties: sortProperties(propertiesMerged, mergedPropertiesOrder),
|
|
107
109
|
propertiesOrder: mergedPropertiesOrder,
|
|
108
|
-
entityViews: mergedEntityViews
|
|
110
|
+
entityViews: mergedEntityViews,
|
|
111
|
+
entityActions: mergedEntityActions,
|
|
109
112
|
};
|
|
110
113
|
if (modifyCollection) {
|
|
111
114
|
const modifiedCollection = modifyCollection({
|
|
@@ -115,6 +118,10 @@ export function mergeCollection(target: EntityCollection,
|
|
|
115
118
|
if (modifiedCollection)
|
|
116
119
|
resultCollection = modifiedCollection;
|
|
117
120
|
}
|
|
121
|
+
|
|
122
|
+
// @ts-ignore
|
|
123
|
+
resultCollection["merged"] = true;
|
|
124
|
+
|
|
118
125
|
return resultCollection
|
|
119
126
|
}
|
|
120
127
|
|
|
@@ -4,9 +4,11 @@ import { isPropertyBuilder } from "./entities";
|
|
|
4
4
|
export function makePropertiesEditable(properties: Properties) {
|
|
5
5
|
Object.keys(properties).forEach((key) => {
|
|
6
6
|
const property = properties[key];
|
|
7
|
-
property
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
if (property) {
|
|
8
|
+
property.editable = true;
|
|
9
|
+
if (property.dataType === "map" && property.properties) {
|
|
10
|
+
makePropertiesEditable(property.properties as Properties);
|
|
11
|
+
}
|
|
10
12
|
}
|
|
11
13
|
});
|
|
12
14
|
return properties;
|
|
@@ -15,13 +17,19 @@ export function makePropertiesEditable(properties: Properties) {
|
|
|
15
17
|
export function makePropertiesNonEditable(properties: PropertiesOrBuilders): PropertiesOrBuilders {
|
|
16
18
|
return Object.entries(properties).reduce((acc, [key, property]) => {
|
|
17
19
|
if (!isPropertyBuilder(property) && property.dataType === "map" && property.properties) {
|
|
18
|
-
const updated = {
|
|
20
|
+
const updated = {
|
|
21
|
+
...property,
|
|
22
|
+
properties: makePropertiesNonEditable(property.properties as PropertiesOrBuilders)
|
|
23
|
+
};
|
|
19
24
|
acc[key] = updated;
|
|
20
25
|
}
|
|
21
26
|
if (isPropertyBuilder(property)) {
|
|
22
27
|
acc[key] = property;
|
|
23
28
|
} else {
|
|
24
|
-
acc[key] = {
|
|
29
|
+
acc[key] = {
|
|
30
|
+
...property,
|
|
31
|
+
editable: false
|
|
32
|
+
};
|
|
25
33
|
}
|
|
26
34
|
return acc;
|
|
27
35
|
}, {} as PropertiesOrBuilders);
|
|
@@ -11,32 +11,42 @@ export interface NavigationViewEntityInternal<M extends Record<string, any>> {
|
|
|
11
11
|
type: "entity";
|
|
12
12
|
entityId: string;
|
|
13
13
|
path: string;
|
|
14
|
+
fullIdPath: string;
|
|
15
|
+
fullPath: string;
|
|
14
16
|
parentCollection: EntityCollection<M>;
|
|
15
17
|
}
|
|
16
18
|
|
|
17
19
|
export interface NavigationViewCollectionInternal<M extends Record<string, any>> {
|
|
18
20
|
type: "collection";
|
|
21
|
+
id: string;
|
|
19
22
|
path: string;
|
|
23
|
+
fullIdPath: string;
|
|
24
|
+
fullPath: string;
|
|
20
25
|
collection: EntityCollection<M>;
|
|
21
26
|
}
|
|
22
27
|
|
|
23
28
|
export interface NavigationViewEntityCustomInternal<M extends Record<string, any>> {
|
|
24
29
|
type: "custom_view";
|
|
25
30
|
path: string;
|
|
31
|
+
fullIdPath: string;
|
|
32
|
+
fullPath: string;
|
|
33
|
+
entityId: string;
|
|
26
34
|
view: EntityCustomView<M>;
|
|
27
35
|
}
|
|
28
36
|
|
|
29
|
-
export function
|
|
37
|
+
export function getNavigationEntriesFromPath(props: {
|
|
30
38
|
path: string,
|
|
31
39
|
collections: EntityCollection[] | undefined,
|
|
32
40
|
currentFullPath?: string,
|
|
41
|
+
currentFullIdPath?: string,
|
|
33
42
|
contextEntityViews?: EntityCustomView<any>[]
|
|
34
43
|
}): NavigationViewInternal [] {
|
|
35
44
|
|
|
36
45
|
const {
|
|
37
46
|
path,
|
|
38
47
|
collections = [],
|
|
39
|
-
currentFullPath
|
|
48
|
+
currentFullPath,
|
|
49
|
+
currentFullIdPath
|
|
40
50
|
} = props;
|
|
41
51
|
|
|
42
52
|
const subpaths = removeInitialAndTrailingSlashes(path).split("/");
|
|
@@ -46,17 +56,25 @@ export function getNavigationEntriesFromPathInternal(props: {
|
|
|
46
56
|
for (let i = 0; i < subpathCombinations.length; i++) {
|
|
47
57
|
const subpathCombination = subpathCombinations[i];
|
|
48
58
|
|
|
49
|
-
|
|
59
|
+
let collection: EntityCollection<any> | undefined;
|
|
60
|
+
collection = collections && collections.find((entry) => entry.id === subpathCombination);
|
|
61
|
+
if (!collection) {
|
|
62
|
+
collection = collections && collections.find((entry) => entry.path === subpathCombination);
|
|
63
|
+
}
|
|
50
64
|
|
|
51
65
|
if (collection) {
|
|
52
|
-
const pathOrAlias = collection.id ?? collection.path;
|
|
53
66
|
const collectionPath = currentFullPath && currentFullPath.length > 0
|
|
54
|
-
? (currentFullPath + "/" +
|
|
55
|
-
:
|
|
56
|
-
|
|
67
|
+
? (currentFullPath + "/" + collection.path)
|
|
68
|
+
: collection.path;
|
|
69
|
+
const fullIdPath = currentFullIdPath && currentFullIdPath.length > 0
|
|
70
|
+
? (currentFullIdPath + "/" + collection.id)
|
|
71
|
+
: collection.id;
|
|
57
72
|
result.push({
|
|
58
73
|
type: "collection",
|
|
74
|
+
id: collection.id,
|
|
59
75
|
path: collectionPath,
|
|
76
|
+
fullPath: collectionPath,
|
|
77
|
+
fullIdPath,
|
|
60
78
|
collection
|
|
61
79
|
});
|
|
62
80
|
const restOfThePath = removeInitialAndTrailingSlashes(removeInitialAndTrailingSlashes(path).replace(subpathCombination, ""));
|
|
@@ -68,6 +86,8 @@ export function getNavigationEntriesFromPathInternal(props: {
|
|
|
68
86
|
type: "entity",
|
|
69
87
|
entityId,
|
|
70
88
|
path: collectionPath,
|
|
89
|
+
fullIdPath,
|
|
90
|
+
fullPath: fullPath,
|
|
71
91
|
parentCollection: collection
|
|
72
92
|
});
|
|
73
93
|
if (nextSegments.length > 1) {
|
|
@@ -81,19 +101,20 @@ export function getNavigationEntriesFromPathInternal(props: {
|
|
|
81
101
|
.filter(Boolean)
|
|
82
102
|
.find((entry) => entry!.key === newPath);
|
|
83
103
|
if (customView) {
|
|
84
|
-
const path = currentFullPath && currentFullPath.length > 0
|
|
85
|
-
? (currentFullPath + "/" + customView.key)
|
|
86
|
-
: customView.key;
|
|
87
104
|
result.push({
|
|
88
105
|
type: "custom_view",
|
|
89
|
-
path,
|
|
106
|
+
path: collectionPath,
|
|
107
|
+
entityId: entityId,
|
|
108
|
+
fullIdPath,
|
|
109
|
+
fullPath: fullPath + "/" + customView.key,
|
|
90
110
|
view: customView
|
|
91
111
|
});
|
|
92
112
|
} else if (collection.subcollections) {
|
|
93
|
-
result.push(...
|
|
113
|
+
result.push(...getNavigationEntriesFromPath({
|
|
94
114
|
path: newPath,
|
|
95
115
|
collections: collection.subcollections,
|
|
96
116
|
currentFullPath: fullPath,
|
|
117
|
+
currentFullIdPath: fullIdPath,
|
|
97
118
|
contextEntityViews: props.contextEntityViews
|
|
98
119
|
}));
|
|
99
120
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EntityCollection } from "../types";
|
|
1
|
+
import { EntityCollection, NavigationController, SideEntityController } from "../types";
|
|
2
2
|
|
|
3
3
|
export function removeInitialAndTrailingSlashes(s: string): string {
|
|
4
4
|
return removeInitialSlash(removeTrailingSlash(s));
|
|
@@ -32,29 +32,90 @@ export function getLastSegment(path: string) {
|
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
export function resolveCollectionPathIds(path: string, allCollections: EntityCollection[]): string {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
if (subpaths.length % 2 === 0) {
|
|
39
|
-
throw Error(`resolveCollectionPathAliases: Collection paths must have an odd number of segments: ${path}`);
|
|
35
|
+
let remainingPath = removeInitialAndTrailingSlashes(path);
|
|
36
|
+
if (!remainingPath) {
|
|
37
|
+
return "";
|
|
40
38
|
}
|
|
41
39
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
if (aliasedCollection) {
|
|
45
|
-
resolvedAliased = aliasedCollection.path;
|
|
46
|
-
}
|
|
40
|
+
let currentCollections: EntityCollection[] | undefined = allCollections;
|
|
41
|
+
const resolvedPathParts: string[] = [];
|
|
47
42
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
43
|
+
while (remainingPath.length > 0) {
|
|
44
|
+
if (!currentCollections || currentCollections.length === 0) {
|
|
45
|
+
// We have remaining path segments but no more collections to match against
|
|
46
|
+
console.warn(`resolveCollectionPathIds: Path structure implies subcollections, but none found before segment starting with "${remainingPath}" in original path "${path}". Appending remaining original path.`);
|
|
47
|
+
resolvedPathParts.push(remainingPath);
|
|
48
|
+
remainingPath = ""; // Stop processing
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
let foundMatch = false;
|
|
53
|
+
// Sort potential matches by length descending to prioritize longer matches (e.g., "a/b" over "a")
|
|
54
|
+
const potentialMatches: { col: EntityCollection; match: string; }[] = currentCollections
|
|
55
|
+
.flatMap(col => [{
|
|
56
|
+
col,
|
|
57
|
+
match: col.path
|
|
58
|
+
}, {
|
|
59
|
+
col,
|
|
60
|
+
match: col.id
|
|
61
|
+
}])
|
|
62
|
+
.filter(p => p.match && remainingPath.startsWith(p.match))
|
|
63
|
+
.sort((a, b) => b.match.length - a.match.length);
|
|
64
|
+
|
|
65
|
+
if (potentialMatches.length > 0) {
|
|
66
|
+
const {
|
|
67
|
+
col: foundCollection,
|
|
68
|
+
match: matchString
|
|
69
|
+
} = potentialMatches[0];
|
|
70
|
+
|
|
71
|
+
resolvedPathParts.push(foundCollection.path); // Use the defined path
|
|
72
|
+
remainingPath = removeInitialSlash(remainingPath.substring(matchString.length));
|
|
73
|
+
|
|
74
|
+
// Check if we are at the end of the path
|
|
75
|
+
if (remainingPath.length === 0) {
|
|
76
|
+
foundMatch = true;
|
|
77
|
+
break; // Path ends with a collection segment
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// The next segment must be an entity ID
|
|
81
|
+
const idSeparatorIndex = remainingPath.indexOf("/");
|
|
82
|
+
let entityId: string;
|
|
83
|
+
if (idSeparatorIndex > -1) {
|
|
84
|
+
entityId = remainingPath.substring(0, idSeparatorIndex);
|
|
85
|
+
remainingPath = remainingPath.substring(idSeparatorIndex + 1);
|
|
86
|
+
} else {
|
|
87
|
+
// This should not happen if the original path is valid (odd segments)
|
|
88
|
+
// but handle it defensively: assume the rest is the ID
|
|
89
|
+
entityId = remainingPath;
|
|
90
|
+
remainingPath = "";
|
|
91
|
+
console.warn(`resolveCollectionPathIds: Path seems to end with an entity ID "${entityId}" instead of a collection segment in original path "${path}". This might indicate an invalid input path.`);
|
|
92
|
+
// Even if it ends here, we still need to push the ID
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
resolvedPathParts.push(entityId); // Append entity ID
|
|
96
|
+
currentCollections = foundCollection.subcollections; // Move to subcollections
|
|
97
|
+
foundMatch = true;
|
|
98
|
+
|
|
99
|
+
if (!currentCollections && remainingPath.length > 0) {
|
|
100
|
+
// Warn if the path continues but no subcollections were defined
|
|
101
|
+
console.warn(`resolveCollectionPathIds: Path continues after entity ID "${entityId}", but no subcollections are defined for the preceding collection "${foundCollection.path}" in path "${path}". Appending remaining original path.`);
|
|
102
|
+
resolvedPathParts.push(remainingPath); // Append the rest
|
|
103
|
+
remainingPath = ""; // Stop processing
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (!foundMatch) {
|
|
110
|
+
// Collection definition not found for the start of the remaining path
|
|
111
|
+
console.warn(`resolveCollectionPathIds: Collection definition not found for segment starting with "${remainingPath}" in original path "${path}". Appending remaining original path.`);
|
|
112
|
+
resolvedPathParts.push(remainingPath); // Append the rest
|
|
113
|
+
remainingPath = ""; // Stop processing
|
|
114
|
+
break;
|
|
52
115
|
}
|
|
53
|
-
const restOfThePath = cleanPath.split("/").slice(2).join("/");
|
|
54
|
-
return (resolvedAliased ?? subpaths[0]) + "/" + subpaths[1] + "/" + resolveCollectionPathIds(restOfThePath, segmentCollection.subcollections);
|
|
55
|
-
} else {
|
|
56
|
-
return resolvedAliased ?? cleanPath;
|
|
57
116
|
}
|
|
117
|
+
|
|
118
|
+
return resolvedPathParts.join("/");
|
|
58
119
|
}
|
|
59
120
|
|
|
60
121
|
/**
|
|
@@ -109,3 +170,58 @@ export function getCollectionPathsCombinations(subpaths: string[]): string[] {
|
|
|
109
170
|
return result;
|
|
110
171
|
|
|
111
172
|
}
|
|
173
|
+
|
|
174
|
+
export function navigateToEntity({
|
|
175
|
+
openEntityMode,
|
|
176
|
+
collection,
|
|
177
|
+
entityId,
|
|
178
|
+
copy,
|
|
179
|
+
path,
|
|
180
|
+
fullIdPath,
|
|
181
|
+
selectedTab,
|
|
182
|
+
sideEntityController,
|
|
183
|
+
onClose,
|
|
184
|
+
navigation
|
|
185
|
+
}:
|
|
186
|
+
|
|
187
|
+
{
|
|
188
|
+
openEntityMode: "side_panel" | "full_screen";
|
|
189
|
+
collection?: EntityCollection;
|
|
190
|
+
entityId?: string;
|
|
191
|
+
selectedTab?: string;
|
|
192
|
+
copy?: boolean;
|
|
193
|
+
path: string;
|
|
194
|
+
fullIdPath?: string;
|
|
195
|
+
sideEntityController: SideEntityController;
|
|
196
|
+
onClose?: () => void;
|
|
197
|
+
navigation: NavigationController
|
|
198
|
+
}) {
|
|
199
|
+
|
|
200
|
+
if (openEntityMode === "side_panel") {
|
|
201
|
+
|
|
202
|
+
sideEntityController.open({
|
|
203
|
+
entityId,
|
|
204
|
+
path,
|
|
205
|
+
fullIdPath,
|
|
206
|
+
copy,
|
|
207
|
+
selectedTab,
|
|
208
|
+
collection,
|
|
209
|
+
updateUrl: true,
|
|
210
|
+
onClose
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
} else {
|
|
214
|
+
let to = navigation.buildUrlCollectionPath(entityId ? `${fullIdPath ?? path}/${entityId}` : fullIdPath ?? path);
|
|
215
|
+
if (entityId && selectedTab) {
|
|
216
|
+
to += `/${selectedTab}`;
|
|
217
|
+
}
|
|
218
|
+
if (!entityId) {
|
|
219
|
+
to += "#new";
|
|
220
|
+
}
|
|
221
|
+
if (copy) {
|
|
222
|
+
to += "#copy";
|
|
223
|
+
}
|
|
224
|
+
navigation.navigate(to);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
}
|
package/src/util/objects.ts
CHANGED
|
@@ -12,25 +12,65 @@ export function isObject(item: any) {
|
|
|
12
12
|
return item && typeof item === "object" && !Array.isArray(item);
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
export function mergeDeep<T extends Record<any, any>, U extends Record<any, any>>(
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
15
|
+
export function mergeDeep<T extends Record<any, any>, U extends Record<any, any>>(
|
|
16
|
+
target: T,
|
|
17
|
+
source: U,
|
|
18
|
+
ignoreUndefined: boolean = false
|
|
19
|
+
): T & U {
|
|
20
|
+
// If target is not a true object (e.g., null, array, primitive), return target itself.
|
|
21
|
+
if (!isObject(target)) {
|
|
22
|
+
return target as T & U;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Create a shallow copy of the target to avoid modifying the original object.
|
|
26
|
+
const output = { ...target };
|
|
27
|
+
|
|
28
|
+
// If source is not a true object, there's nothing to merge from it.
|
|
29
|
+
// Return the shallow copy of target.
|
|
30
|
+
if (!isObject(source)) {
|
|
31
|
+
return output as T & U;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Iterate over keys in the source object.
|
|
35
|
+
for (const key in source) {
|
|
36
|
+
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
37
|
+
const sourceValue = source[key];
|
|
38
|
+
const outputValue = (output as any)[key]; // Current value in our merged object (originating from target)
|
|
39
|
+
|
|
40
|
+
// Skip if source value is undefined and ignoreUndefined is true.
|
|
41
|
+
// This handles both not adding new undefined properties and not overwriting existing properties with undefined.
|
|
42
|
+
if (ignoreUndefined && sourceValue === undefined) {
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if ((sourceValue as any) instanceof Date) {
|
|
47
|
+
// If source value is a Date, create a new Date instance.
|
|
48
|
+
(output as any)[key] = new Date(sourceValue.getTime());
|
|
49
|
+
} else if (Array.isArray(sourceValue)) {
|
|
50
|
+
// If source value is an array, create a shallow copy of the array.
|
|
51
|
+
(output as any)[key] = [...sourceValue];
|
|
52
|
+
} else if (isObject(sourceValue)) {
|
|
53
|
+
// If source value is an object:
|
|
54
|
+
if (isObject(outputValue)) {
|
|
55
|
+
// If the corresponding value in output (from target) is also an object, recurse.
|
|
56
|
+
// Ensure the ignoreUndefined flag is passed down.
|
|
57
|
+
(output as any)[key] = mergeDeep(outputValue, sourceValue, ignoreUndefined);
|
|
58
|
+
} else {
|
|
59
|
+
// If output's value (from target) is not an object (e.g., null, primitive, or key didn't exist in original target),
|
|
60
|
+
// overwrite with the source object.
|
|
61
|
+
(output as any)[key] = sourceValue;
|
|
62
|
+
}
|
|
26
63
|
} else {
|
|
27
|
-
|
|
64
|
+
// If source value is a primitive, null, or undefined (and not ignored).
|
|
65
|
+
(output as any)[key] = sourceValue;
|
|
28
66
|
}
|
|
29
|
-
}
|
|
67
|
+
}
|
|
30
68
|
}
|
|
31
|
-
|
|
69
|
+
|
|
70
|
+
return output as T & U;
|
|
32
71
|
}
|
|
33
72
|
|
|
73
|
+
|
|
34
74
|
export function getValueInPath(o: object | undefined, path: string): any {
|
|
35
75
|
if (!o) return undefined;
|
|
36
76
|
if (typeof o === "object") {
|
|
@@ -125,6 +165,26 @@ export function removeUndefined(value: any, removeEmptyStrings?: boolean): any {
|
|
|
125
165
|
return value;
|
|
126
166
|
}
|
|
127
167
|
|
|
168
|
+
export function removeNulls(value: any): any {
|
|
169
|
+
if (typeof value === "function") {
|
|
170
|
+
return value;
|
|
171
|
+
}
|
|
172
|
+
if (Array.isArray(value)) {
|
|
173
|
+
return value.map((v: any) => removeNulls(v));
|
|
174
|
+
}
|
|
175
|
+
if (typeof value === "object") {
|
|
176
|
+
const res: object = {};
|
|
177
|
+
if (value === null)
|
|
178
|
+
return value;
|
|
179
|
+
Object.keys(value).forEach((key) => {
|
|
180
|
+
if (value[key] !== null)
|
|
181
|
+
(res as any)[key] = removeNulls(value[key]);
|
|
182
|
+
});
|
|
183
|
+
return res;
|
|
184
|
+
}
|
|
185
|
+
return value;
|
|
186
|
+
}
|
|
187
|
+
|
|
128
188
|
export function isEmptyObject(obj: object) {
|
|
129
189
|
return obj &&
|
|
130
190
|
Object.getPrototypeOf(obj) === Object.prototype &&
|
|
@@ -22,11 +22,11 @@ export function getParentReferencesFromPath(props: {
|
|
|
22
22
|
|
|
23
23
|
const collection: EntityCollection<any> | undefined = collections && collections.find((entry) => entry.id === subpathCombination || entry.path === subpathCombination);
|
|
24
24
|
|
|
25
|
+
// If we find a collection, we add the reference and continue
|
|
25
26
|
if (collection) {
|
|
26
|
-
const pathOrAlias = collection.id ?? collection.path;
|
|
27
27
|
const collectionPath = currentFullPath && currentFullPath.length > 0
|
|
28
|
-
? (currentFullPath + "/" +
|
|
29
|
-
:
|
|
28
|
+
? (currentFullPath + "/" + collection.path)
|
|
29
|
+
: collection.path;
|
|
30
30
|
|
|
31
31
|
const restOfThePath = removeInitialAndTrailingSlashes(removeInitialAndTrailingSlashes(path).replace(subpathCombination, ""));
|
|
32
32
|
const nextSegments = restOfThePath.length > 0 ? restOfThePath.split("/") : [];
|
package/src/util/permissions.ts
CHANGED
|
@@ -8,9 +8,9 @@ const DEFAULT_PERMISSIONS = {
|
|
|
8
8
|
delete: true
|
|
9
9
|
};
|
|
10
10
|
|
|
11
|
-
export function resolvePermissions<M extends Record<string, any>,
|
|
11
|
+
export function resolvePermissions<M extends Record<string, any>, USER extends User>
|
|
12
12
|
(collection: EntityCollection<M>,
|
|
13
|
-
authController: AuthController<
|
|
13
|
+
authController: AuthController<USER>,
|
|
14
14
|
path: string,
|
|
15
15
|
entity: Entity<M> | null): Permissions | undefined {
|
|
16
16
|
|
|
@@ -34,29 +34,29 @@ export function resolvePermissions<M extends Record<string, any>, UserType exten
|
|
|
34
34
|
throw Error("New type of permission added and not mapped");
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
export function canEditEntity<M extends Record<string, any>,
|
|
37
|
+
export function canEditEntity<M extends Record<string, any>, USER extends User>
|
|
38
38
|
(
|
|
39
39
|
collection: EntityCollection<M>,
|
|
40
|
-
authController: AuthController<
|
|
40
|
+
authController: AuthController<USER>,
|
|
41
41
|
path: string,
|
|
42
42
|
entity: Entity<M> | null): boolean {
|
|
43
43
|
return resolvePermissions(collection, authController, path, entity)?.edit ?? DEFAULT_PERMISSIONS.edit;
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
export function canCreateEntity<M extends Record<string, any>,
|
|
46
|
+
export function canCreateEntity<M extends Record<string, any>, USER extends User>
|
|
47
47
|
(
|
|
48
48
|
collection: EntityCollection<M>,
|
|
49
|
-
authController: AuthController<
|
|
49
|
+
authController: AuthController<USER>,
|
|
50
50
|
path: string,
|
|
51
51
|
entity: Entity<M> | null): boolean {
|
|
52
52
|
if (collection.collectionGroup) return false;
|
|
53
53
|
return resolvePermissions(collection, authController, path, entity)?.create ?? DEFAULT_PERMISSIONS.create;
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
export function canDeleteEntity<M extends Record<string, any>,
|
|
56
|
+
export function canDeleteEntity<M extends Record<string, any>, USER extends User>
|
|
57
57
|
(
|
|
58
58
|
collection: EntityCollection<M>,
|
|
59
|
-
authController: AuthController<
|
|
59
|
+
authController: AuthController<USER>,
|
|
60
60
|
path: string,
|
|
61
61
|
entity: Entity<M> | null): boolean {
|
|
62
62
|
return resolvePermissions(collection, authController, path, entity)?.delete ?? DEFAULT_PERMISSIONS.delete;
|
|
@@ -1,17 +1,28 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
AuthController,
|
|
5
|
+
EntityCollection,
|
|
6
|
+
PropertiesOrBuilders,
|
|
7
|
+
PropertyConfig,
|
|
8
|
+
PropertyOrBuilder,
|
|
9
|
+
ResolvedProperties,
|
|
10
|
+
ResolvedProperty
|
|
11
|
+
} from "../types";
|
|
4
12
|
import { isPropertyBuilder } from "./entities";
|
|
5
13
|
import { resolveProperty } from "./resolutions";
|
|
6
14
|
import { CircleIcon, FunctionsIcon } from "@firecms/ui";
|
|
7
15
|
import { getFieldConfig } from "../core";
|
|
8
16
|
|
|
9
|
-
export function isReferenceProperty(
|
|
10
|
-
|
|
17
|
+
export function isReferenceProperty(
|
|
18
|
+
authController: AuthController,
|
|
19
|
+
propertyOrBuilder: PropertyOrBuilder,
|
|
20
|
+
fields: Record<string, PropertyConfig>) {
|
|
11
21
|
const resolvedProperty = resolveProperty({
|
|
12
22
|
propertyKey: "ignore", // TODO
|
|
13
23
|
propertyOrBuilder,
|
|
14
|
-
fields
|
|
24
|
+
propertyConfigs: fields,
|
|
25
|
+
authController
|
|
15
26
|
});
|
|
16
27
|
if (!resolvedProperty) return null;
|
|
17
28
|
if (resolvedProperty.dataType === "reference") {
|
|
@@ -35,7 +46,7 @@ export function getIconForWidget(widget: PropertyConfig | undefined,
|
|
|
35
46
|
}
|
|
36
47
|
|
|
37
48
|
export function getIconForProperty(
|
|
38
|
-
property: PropertyOrBuilder | ResolvedProperty
|
|
49
|
+
property: PropertyOrBuilder<any> | ResolvedProperty<any>,
|
|
39
50
|
size: "small" | "medium" | "large" = "small",
|
|
40
51
|
fields: Record<string, PropertyConfig> = {}
|
|
41
52
|
): React.ReactNode {
|
|
@@ -63,7 +74,7 @@ export function getColorForProperty(property: PropertyOrBuilder, fields: Record<
|
|
|
63
74
|
* @param properties
|
|
64
75
|
* @param path
|
|
65
76
|
*/
|
|
66
|
-
export function getPropertyInPath<M extends Record<string, any>>(properties: PropertiesOrBuilders<M
|
|
77
|
+
export function getPropertyInPath<M extends Record<string, any>>(properties: PropertiesOrBuilders<M> | ResolvedProperties, path: string): PropertyOrBuilder<any, M> | undefined {
|
|
67
78
|
if (typeof properties === "object") {
|
|
68
79
|
if (path in properties) {
|
|
69
80
|
return properties[path];
|
package/src/util/references.ts
CHANGED
|
@@ -1,21 +1,26 @@
|
|
|
1
|
-
import { EntityCollection, PropertyConfig, ResolvedEntityCollection } from "../types";
|
|
1
|
+
import { AuthController, EntityCollection, PropertyConfig, ResolvedEntityCollection } from "../types";
|
|
2
2
|
import { isReferenceProperty } from "./property_utils";
|
|
3
3
|
import { isPropertyBuilder } from "./entities";
|
|
4
4
|
import { getFieldConfig } from "../core";
|
|
5
5
|
|
|
6
|
-
export function getEntityPreviewKeys(
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
export function getEntityPreviewKeys(
|
|
7
|
+
authController: AuthController,
|
|
8
|
+
targetCollection: EntityCollection<any>,
|
|
9
|
+
fields: Record<string, PropertyConfig>,
|
|
10
|
+
previewProperties?: string[],
|
|
11
|
+
limit = 3) {
|
|
10
12
|
const allProperties = Object.keys(targetCollection.properties);
|
|
11
13
|
let listProperties = previewProperties?.filter(p => allProperties.includes(p as string));
|
|
14
|
+
if (!listProperties && targetCollection.previewProperties) {
|
|
15
|
+
listProperties = targetCollection.previewProperties?.filter(p => allProperties.includes(p as string));
|
|
16
|
+
}
|
|
12
17
|
if (listProperties && listProperties.length > 0) {
|
|
13
18
|
return listProperties;
|
|
14
19
|
} else {
|
|
15
20
|
listProperties = allProperties;
|
|
16
21
|
return listProperties.filter(key => {
|
|
17
22
|
const propertyOrBuilder = targetCollection.properties[key];
|
|
18
|
-
return propertyOrBuilder && !isPropertyBuilder(propertyOrBuilder) && !isReferenceProperty(propertyOrBuilder, fields);
|
|
23
|
+
return propertyOrBuilder && !isPropertyBuilder(propertyOrBuilder) && !isReferenceProperty(authController, propertyOrBuilder, fields);
|
|
19
24
|
}).slice(0, limit);
|
|
20
25
|
}
|
|
21
26
|
}
|
|
@@ -39,13 +44,19 @@ export function getEntityTitlePropertyKey<M extends Record<string, any>>(collect
|
|
|
39
44
|
|
|
40
45
|
export function getEntityImagePreviewPropertyKey<M extends object>(collection: ResolvedEntityCollection<M>): string | undefined {
|
|
41
46
|
|
|
42
|
-
// find first
|
|
47
|
+
// find first storage property of type image
|
|
43
48
|
for (const key in collection.properties) {
|
|
44
49
|
const property = collection.properties[key];
|
|
45
50
|
if (property.dataType === "string" && property.storage?.acceptedFiles?.includes("image/*")) {
|
|
46
51
|
return key;
|
|
47
52
|
}
|
|
48
|
-
|
|
53
|
+
}
|
|
54
|
+
// alternatively, look for the first array of images
|
|
55
|
+
for (const key in collection.properties) {
|
|
56
|
+
const property = collection.properties[key];
|
|
57
|
+
if (property.dataType === "array" && property.of?.dataType === "string" && property.of.storage?.acceptedFiles?.includes("image/*")) {
|
|
58
|
+
return key;
|
|
59
|
+
}
|
|
49
60
|
}
|
|
50
61
|
return undefined;
|
|
51
62
|
}
|