@firecms/core 3.0.0-canary.2 → 3.0.0-canary.200
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 +4 -4
- package/dist/app/AppBar.d.ts +12 -0
- package/dist/app/Drawer.d.ts +16 -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 +23 -6
- package/dist/components/CircularProgressCenter.d.ts +1 -1
- package/dist/components/ClearFilterSortButton.d.ts +5 -0
- package/dist/components/{DeleteConfirmationDialog.d.ts → ConfirmationDialog.d.ts} +1 -1
- package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +13 -13
- package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +3 -3
- package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +22 -6
- package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +3 -2
- package/dist/components/EntityCollectionTable/column_utils.d.ts +1 -2
- package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +3 -1
- package/dist/components/EntityCollectionTable/index.d.ts +1 -1
- package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +1 -4
- package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +2 -2
- package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +7 -4
- package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +17 -4
- package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
- package/dist/components/EntityCollectionView/useSelectionController.d.ts +2 -0
- package/dist/components/EntityCollectionView/utils.d.ts +3 -0
- package/dist/components/EntityPreview.d.ts +26 -7
- package/dist/components/EntityView.d.ts +11 -0
- package/dist/components/ErrorView.d.ts +1 -1
- package/dist/components/FieldCaption.d.ts +5 -0
- package/dist/components/HomePage/DefaultHomePage.d.ts +1 -1
- package/dist/components/HomePage/NavigationCard.d.ts +8 -0
- package/dist/components/HomePage/{NavigationCollectionCard.d.ts → NavigationCardBinding.d.ts} +3 -3
- package/dist/components/HomePage/SmallNavigationCard.d.ts +6 -0
- package/dist/components/HomePage/index.d.ts +3 -1
- package/dist/components/PropertyConfigBadge.d.ts +2 -1
- package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
- package/dist/components/ReferenceWidget.d.ts +6 -4
- package/dist/components/SelectableTable/SelectableTable.d.ts +13 -3
- package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
- package/dist/components/UnsavedChangesDialog.d.ts +8 -0
- package/dist/components/VirtualTable/VirtualTableProps.d.ts +29 -13
- package/dist/components/VirtualTable/types.d.ts +3 -3
- package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -3
- package/dist/components/common/index.d.ts +2 -1
- package/dist/components/common/table_height.d.ts +5 -0
- package/dist/components/common/types.d.ts +4 -6
- package/dist/components/common/useColumnsIds.d.ts +3 -1
- package/dist/components/common/{useDataSourceEntityCollectionTableController.d.ts → useDataSourceTableController.d.ts} +13 -2
- package/dist/components/common/useDebouncedCallback.d.ts +1 -0
- package/dist/components/common/useScrollRestoration.d.ts +14 -0
- package/dist/components/index.d.ts +8 -5
- package/dist/contexts/AuthControllerContext.d.ts +1 -1
- package/dist/contexts/BreacrumbsContext.d.ts +8 -0
- 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 +44 -0
- 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 +2 -3
- package/dist/core/SideDialogs.d.ts +4 -2
- package/dist/core/index.d.ts +4 -6
- package/dist/form/EntityForm.d.ts +45 -69
- package/dist/form/EntityFormActions.d.ts +17 -0
- package/dist/form/PropertyFieldBinding.d.ts +1 -1
- package/dist/form/components/ErrorFocus.d.ts +1 -1
- package/dist/form/components/FieldHelperText.d.ts +3 -3
- package/dist/form/components/FormEntry.d.ts +6 -0
- package/dist/form/components/FormLayout.d.ts +5 -0
- package/dist/{components → form/components}/LabelWithIcon.d.ts +1 -1
- package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
- package/dist/form/components/StorageItemPreview.d.ts +4 -3
- package/dist/form/components/StorageUploadProgress.d.ts +1 -1
- package/dist/form/components/index.d.ts +4 -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/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 +3 -4
- package/dist/form/field_bindings/SwitchFieldBinding.d.ts +1 -2
- package/dist/form/field_bindings/TextFieldBinding.d.ts +2 -2
- package/dist/form/index.d.ts +17 -18
- package/dist/form/useClearRestoreValue.d.ts +2 -2
- package/dist/form/validation.d.ts +1 -1
- package/dist/hooks/data/delete.d.ts +4 -4
- package/dist/hooks/data/save.d.ts +4 -5
- package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
- package/dist/hooks/data/useDataSource.d.ts +2 -2
- package/dist/hooks/data/useEntityFetch.d.ts +4 -3
- package/dist/hooks/index.d.ts +4 -1
- package/dist/hooks/useAuthController.d.ts +1 -1
- package/dist/hooks/useBreadcrumbsController.d.ts +26 -0
- package/dist/{core → hooks}/useBuildModeController.d.ts +1 -1
- package/dist/hooks/useBuildNavigationController.d.ts +11 -6
- package/dist/hooks/useFireCMSContext.d.ts +1 -1
- package/dist/hooks/useModeController.d.ts +1 -2
- package/dist/hooks/useProjectLog.d.ts +12 -2
- package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
- package/dist/hooks/useStorageSource.d.ts +2 -2
- package/dist/hooks/useValidateAuthenticator.d.ts +21 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.es.js +22131 -14039
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +24420 -588
- package/dist/index.umd.js.map +1 -1
- package/dist/internal/useBuildDataSource.d.ts +1 -12
- package/dist/internal/useUnsavedChangesDialog.d.ts +7 -9
- package/dist/preview/PropertyPreview.d.ts +1 -1
- package/dist/preview/PropertyPreviewProps.d.ts +7 -5
- package/dist/preview/components/BooleanPreview.d.ts +5 -1
- package/dist/preview/components/EnumValuesChip.d.ts +1 -1
- package/dist/preview/components/ReferencePreview.d.ts +4 -9
- package/dist/preview/components/StorageThumbnail.d.ts +2 -1
- package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
- package/dist/preview/util.d.ts +3 -3
- package/dist/routes/CustomCMSRoute.d.ts +4 -0
- package/dist/routes/FireCMSRoute.d.ts +1 -0
- package/dist/routes/HomePageRoute.d.ts +3 -0
- package/dist/types/analytics.d.ts +1 -1
- package/dist/types/auth.d.ts +37 -3
- package/dist/types/collections.d.ts +86 -24
- package/dist/types/datasource.d.ts +53 -37
- package/dist/types/dialogs_controller.d.ts +7 -3
- package/dist/types/entities.d.ts +8 -2
- package/dist/types/entity_actions.d.ts +28 -4
- package/dist/types/entity_callbacks.d.ts +16 -16
- package/dist/types/entity_overrides.d.ts +6 -0
- package/dist/types/export_import.d.ts +4 -4
- package/dist/types/fields.d.ts +71 -42
- package/dist/types/firecms.d.ts +6 -2
- package/dist/types/firecms_context.d.ts +1 -1
- package/dist/types/index.d.ts +2 -1
- package/dist/types/navigation.d.ts +45 -26
- package/dist/types/permissions.d.ts +8 -4
- package/dist/types/plugins.d.ts +40 -31
- package/dist/types/properties.d.ts +54 -26
- package/dist/types/property_config.d.ts +2 -4
- package/dist/types/roles.d.ts +31 -0
- package/dist/types/side_dialogs_controller.d.ts +10 -0
- package/dist/types/side_entity_controller.d.ts +6 -1
- package/dist/types/storage.d.ts +86 -3
- package/dist/types/user.d.ts +6 -0
- package/dist/util/builders.d.ts +3 -3
- package/dist/util/collections.d.ts +9 -1
- package/dist/util/entities.d.ts +3 -3
- package/dist/util/entity_actions.d.ts +2 -0
- package/dist/util/entity_cache.d.ts +23 -0
- package/dist/util/icon_list.d.ts +5 -1
- package/dist/util/icon_synonyms.d.ts +1 -98
- package/dist/util/icons.d.ts +13 -4
- package/dist/util/index.d.ts +2 -0
- package/dist/util/navigation_from_path.d.ts +6 -1
- package/dist/util/navigation_utils.d.ts +14 -3
- package/dist/util/objects.d.ts +2 -1
- package/dist/util/permissions.d.ts +4 -4
- package/dist/util/plurals.d.ts +0 -2
- package/dist/util/property_utils.d.ts +3 -3
- package/dist/util/references.d.ts +4 -2
- package/dist/util/resolutions.d.ts +31 -17
- package/dist/util/storage.d.ts +23 -2
- package/dist/util/useStorageUploadController.d.ts +3 -3
- package/dist/util/useTraceUpdate.d.ts +1 -0
- package/package.json +64 -51
- package/src/app/AppBar.tsx +18 -0
- package/src/app/Drawer.tsx +24 -0
- package/src/app/Scaffold.tsx +243 -0
- package/src/app/index.ts +4 -0
- package/src/app/useApp.tsx +32 -0
- package/src/components/ArrayContainer.tsx +126 -40
- package/src/components/CircularProgressCenter.tsx +2 -2
- package/src/components/ClearFilterSortButton.tsx +41 -0
- package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +3 -3
- package/src/components/DeleteEntityDialog.tsx +14 -23
- package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +56 -39
- package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +283 -280
- package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +29 -8
- package/src/components/EntityCollectionTable/PropertyTableCell.tsx +58 -50
- package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
- package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +40 -33
- package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +22 -20
- package/src/components/EntityCollectionTable/index.tsx +1 -1
- package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +31 -36
- package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +36 -34
- package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +20 -8
- package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +81 -80
- package/src/components/EntityCollectionView/EntityCollectionView.tsx +228 -155
- package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +9 -8
- package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
- package/src/components/EntityCollectionView/useSelectionController.tsx +43 -0
- package/src/components/EntityCollectionView/utils.ts +19 -0
- package/src/components/EntityPreview.tsx +218 -71
- package/src/components/EntityView.tsx +84 -0
- package/src/components/ErrorView.tsx +4 -4
- package/src/components/FieldCaption.tsx +14 -0
- package/src/components/HomePage/DefaultHomePage.tsx +39 -28
- package/src/components/HomePage/FavouritesView.tsx +6 -11
- package/src/components/HomePage/NavigationCard.tsx +69 -0
- package/src/components/HomePage/NavigationCardBinding.tsx +111 -0
- package/src/components/HomePage/NavigationGroup.tsx +2 -2
- package/src/components/HomePage/SmallNavigationCard.tsx +44 -0
- package/src/components/HomePage/index.tsx +3 -1
- 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 -17
- package/src/components/ReferenceWidget.tsx +26 -16
- package/src/components/SearchIconsView.tsx +10 -7
- package/src/components/SelectableTable/SelectableTable.tsx +27 -12
- package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
- package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +25 -8
- package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +46 -30
- package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +92 -23
- package/src/components/UnsavedChangesDialog.tsx +42 -0
- package/src/components/VirtualTable/VirtualTable.tsx +96 -48
- package/src/components/VirtualTable/VirtualTableCell.tsx +1 -9
- package/src/components/VirtualTable/VirtualTableHeader.tsx +10 -10
- package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
- package/src/components/VirtualTable/VirtualTableProps.tsx +34 -15
- package/src/components/VirtualTable/VirtualTableRow.tsx +5 -6
- package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +5 -5
- package/src/components/VirtualTable/fields/VirtualTableInput.tsx +3 -2
- package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
- package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +16 -28
- package/src/components/VirtualTable/types.tsx +2 -3
- package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +40 -43
- package/src/components/common/index.ts +2 -1
- package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
- package/src/components/common/types.tsx +4 -6
- package/src/components/common/useColumnsIds.tsx +24 -3
- package/src/components/common/useDataSourceTableController.tsx +420 -0
- package/src/components/common/useDebouncedCallback.tsx +20 -0
- package/src/components/common/useScrollRestoration.tsx +68 -0
- package/src/components/common/useTableSearchHelper.ts +53 -12
- package/src/components/index.tsx +8 -5
- package/src/contexts/AuthControllerContext.tsx +1 -1
- package/src/contexts/BreacrumbsContext.tsx +38 -0
- package/src/contexts/DialogsProvider.tsx +5 -4
- package/src/contexts/ModeController.tsx +1 -3
- package/src/contexts/SnackbarProvider.tsx +2 -0
- package/src/core/DefaultAppBar.tsx +207 -0
- package/src/core/DefaultDrawer.tsx +185 -0
- package/src/core/DrawerNavigationItem.tsx +66 -0
- package/src/core/EntityEditView.tsx +455 -0
- package/src/core/EntityEditViewFormActions.tsx +199 -0
- package/src/core/EntitySidePanel.tsx +87 -18
- package/src/core/FireCMS.tsx +67 -44
- package/src/core/FireCMSRouter.tsx +17 -0
- package/src/core/NavigationRoutes.tsx +36 -38
- package/src/core/SideDialogs.tsx +22 -12
- package/src/core/field_configs.tsx +11 -12
- package/src/core/index.tsx +6 -7
- package/src/form/EntityForm.tsx +565 -519
- package/src/form/EntityFormActions.tsx +169 -0
- package/src/form/PropertyFieldBinding.tsx +85 -44
- package/src/form/components/CustomIdField.tsx +6 -2
- package/src/form/components/FieldHelperText.tsx +4 -4
- package/src/form/components/FormEntry.tsx +22 -0
- package/src/form/components/FormLayout.tsx +16 -0
- package/src/form/components/LabelWithIcon.tsx +44 -0
- package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
- package/src/form/components/StorageItemPreview.tsx +23 -11
- package/src/form/components/StorageUploadProgress.tsx +9 -9
- package/src/form/components/index.tsx +4 -1
- package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +32 -21
- package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +54 -45
- package/src/form/field_bindings/BlockFieldBinding.tsx +57 -36
- package/src/form/field_bindings/DateTimeFieldBinding.tsx +21 -17
- package/src/form/field_bindings/KeyValueFieldBinding.tsx +76 -67
- package/src/form/field_bindings/MapFieldBinding.tsx +82 -65
- package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +153 -0
- package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +26 -22
- package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +12 -17
- package/src/form/field_bindings/ReferenceFieldBinding.tsx +47 -34
- package/src/form/field_bindings/RepeatFieldBinding.tsx +57 -36
- package/src/form/field_bindings/SelectFieldBinding.tsx +24 -17
- package/src/form/field_bindings/StorageUploadFieldBinding.tsx +47 -46
- package/src/form/field_bindings/SwitchFieldBinding.tsx +31 -27
- package/src/form/field_bindings/TextFieldBinding.tsx +35 -30
- package/src/form/index.tsx +17 -37
- package/src/form/useClearRestoreValue.tsx +2 -2
- package/src/form/validation.ts +15 -26
- package/src/hooks/data/delete.ts +7 -6
- package/src/hooks/data/save.ts +13 -9
- package/src/hooks/data/useCollectionFetch.tsx +4 -4
- package/src/hooks/data/useDataSource.tsx +15 -2
- package/src/hooks/data/useEntityFetch.tsx +11 -7
- package/src/hooks/index.tsx +6 -1
- package/src/hooks/useAuthController.tsx +1 -1
- package/src/hooks/useBreadcrumbsController.tsx +31 -0
- package/src/{core → hooks}/useBuildLocalConfigurationPersistence.tsx +8 -10
- package/src/{core → hooks}/useBuildModeController.tsx +23 -30
- package/src/hooks/useBuildNavigationController.tsx +278 -117
- package/src/hooks/useFireCMSContext.tsx +5 -5
- package/src/hooks/useLargeLayout.tsx +0 -35
- package/src/hooks/useModeController.tsx +1 -2
- package/src/hooks/useProjectLog.tsx +41 -9
- package/src/hooks/useReferenceDialog.tsx +2 -2
- package/src/hooks/useResolvedNavigationFrom.tsx +10 -12
- package/src/hooks/useStorageSource.tsx +7 -2
- package/src/hooks/useValidateAuthenticator.tsx +115 -0
- package/src/index.ts +1 -0
- package/src/internal/useBuildDataSource.ts +72 -77
- package/src/internal/useBuildSideDialogsController.tsx +4 -2
- package/src/internal/useBuildSideEntityController.tsx +177 -70
- package/src/internal/useUnsavedChangesDialog.tsx +127 -91
- package/src/preview/PropertyPreview.tsx +19 -26
- package/src/preview/PropertyPreviewProps.tsx +5 -9
- package/src/preview/components/BooleanPreview.tsx +19 -4
- package/src/preview/components/EmptyValue.tsx +1 -1
- package/src/preview/components/EnumValuesChip.tsx +2 -2
- package/src/preview/components/ImagePreview.tsx +25 -36
- package/src/preview/components/ReferencePreview.tsx +73 -176
- package/src/preview/components/StorageThumbnail.tsx +5 -1
- package/src/preview/components/UrlComponentPreview.tsx +60 -28
- package/src/preview/property_previews/ArrayOfMapsPreview.tsx +2 -3
- package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +4 -3
- package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +2 -3
- package/src/preview/property_previews/ArrayOfStringsPreview.tsx +1 -2
- package/src/preview/property_previews/ArrayOneOfPreview.tsx +4 -5
- package/src/preview/property_previews/ArrayPropertyPreview.tsx +4 -5
- package/src/preview/property_previews/MapPropertyPreview.tsx +12 -11
- package/src/preview/property_previews/SkeletonPropertyComponent.tsx +12 -12
- package/src/preview/property_previews/StringPropertyPreview.tsx +8 -7
- package/src/preview/util.ts +10 -10
- package/src/routes/CustomCMSRoute.tsx +21 -0
- package/src/routes/FireCMSRoute.tsx +236 -0
- package/src/routes/HomePageRoute.tsx +17 -0
- package/src/types/analytics.ts +1 -0
- package/src/types/auth.tsx +48 -3
- package/src/types/collections.ts +102 -27
- package/src/types/customization_controller.tsx +0 -1
- package/src/types/datasource.ts +62 -44
- package/src/types/dialogs_controller.tsx +7 -3
- package/src/types/entities.ts +16 -2
- package/src/types/entity_actions.tsx +33 -4
- package/src/types/entity_callbacks.ts +18 -18
- package/src/types/entity_overrides.tsx +7 -0
- package/src/types/export_import.ts +4 -4
- package/src/types/fields.tsx +81 -46
- package/src/types/firecms.tsx +6 -2
- package/src/types/firecms_context.tsx +1 -1
- package/src/types/index.ts +2 -1
- package/src/types/navigation.ts +52 -31
- package/src/types/permissions.ts +10 -5
- package/src/types/plugins.tsx +47 -39
- package/src/types/properties.ts +63 -27
- package/src/types/property_config.tsx +2 -4
- package/src/types/roles.ts +41 -0
- package/src/types/side_dialogs_controller.tsx +15 -0
- package/src/types/side_entity_controller.tsx +7 -1
- package/src/types/storage.ts +94 -3
- package/src/types/user.ts +9 -0
- package/src/util/builders.ts +10 -8
- package/src/util/collections.ts +22 -0
- package/src/util/entities.ts +9 -6
- package/src/util/entity_actions.ts +28 -0
- package/src/util/entity_cache.ts +204 -0
- package/src/util/enums.ts +1 -1
- package/src/util/icon_list.ts +16 -10
- package/src/util/icon_synonyms.ts +3 -100
- package/src/util/icons.tsx +26 -8
- package/src/util/index.ts +2 -0
- package/src/util/join_collections.ts +3 -0
- package/src/util/make_properties_editable.ts +13 -5
- package/src/util/navigation_from_path.ts +13 -6
- package/src/util/navigation_utils.ts +59 -7
- package/src/util/objects.ts +45 -28
- package/src/util/parent_references_from_path.ts +3 -3
- package/src/util/permissions.ts +20 -16
- package/src/util/plurals.ts +0 -2
- package/src/util/property_utils.tsx +11 -4
- package/src/util/references.ts +45 -5
- package/src/util/resolutions.ts +79 -46
- package/src/util/storage.ts +79 -21
- package/src/util/strings.ts +2 -2
- package/src/util/useStorageUploadController.tsx +71 -27
- package/src/util/useTraceUpdate.tsx +2 -1
- 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/form/components/FormikArrayContainer.d.ts +0 -18
- package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
- package/dist/internal/EntityView.d.ts +0 -22
- 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/FireCMSAppBar.tsx +0 -157
- package/src/components/HomePage/NavigationCollectionCard.tsx +0 -146
- package/src/components/LabelWithIcon.tsx +0 -33
- package/src/components/PropertyIdCopyTooltipContent.tsx +0 -28
- package/src/components/common/useDataSourceEntityCollectionTableController.tsx +0 -225
- package/src/core/Drawer.tsx +0 -164
- package/src/core/Scaffold.tsx +0 -281
- package/src/form/components/FormikArrayContainer.tsx +0 -44
- package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -696
- package/src/internal/EntityView.tsx +0 -578
- package/src/internal/useBuildCustomizationController.tsx +0 -5
- package/src/internal/useLocaleConfig.tsx +0 -18
- package/src/types/appcheck.ts +0 -29
- /package/dist/{core → hooks}/useBuildLocalConfigurationPersistence.d.ts +0 -0
- /package/src/util/{common.tsx → common.ts} +0 -0
package/src/util/objects.ts
CHANGED
|
@@ -12,38 +12,25 @@ 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
|
|
15
|
+
export function mergeDeep<T extends Record<any, any>, U extends Record<any, any>>(target: T, source: U): T & U {
|
|
16
16
|
const targetIsObject = isObject(target);
|
|
17
|
-
const output
|
|
17
|
+
const output = targetIsObject ? { ...target } : target;
|
|
18
18
|
if (targetIsObject && isObject(source)) {
|
|
19
19
|
Object.keys(source).forEach(key => {
|
|
20
|
-
|
|
20
|
+
const sourceElement = source[key];
|
|
21
|
+
if (isObject(sourceElement)) {
|
|
21
22
|
if (!(key in target))
|
|
22
|
-
Object.assign(output, { [key]:
|
|
23
|
+
Object.assign(output, { [key]: sourceElement });
|
|
23
24
|
else
|
|
24
|
-
(output as any)[key] = mergeDeep((target as any)[key],
|
|
25
|
+
(output as any)[key] = mergeDeep((target as any)[key], sourceElement);
|
|
25
26
|
} else {
|
|
26
|
-
Object.assign(output, { [key]:
|
|
27
|
+
Object.assign(output, { [key]: sourceElement });
|
|
27
28
|
}
|
|
28
29
|
});
|
|
29
30
|
}
|
|
30
|
-
return output;
|
|
31
|
+
return output as T;
|
|
31
32
|
}
|
|
32
33
|
|
|
33
|
-
// export function getValueInPath(o: object | undefined, path: string): any {
|
|
34
|
-
// if (!o) return undefined;
|
|
35
|
-
// if (typeof o === "object") {
|
|
36
|
-
// if (path in o) {
|
|
37
|
-
// return (o as any)[path];
|
|
38
|
-
// }
|
|
39
|
-
// if (path.includes(".")) {
|
|
40
|
-
// const pathSegments = path.split(".");
|
|
41
|
-
// return getValueInPath((o as any)[pathSegments[0]], pathSegments.slice(1).join("."))
|
|
42
|
-
// }
|
|
43
|
-
// }
|
|
44
|
-
// return undefined;
|
|
45
|
-
// }
|
|
46
|
-
|
|
47
34
|
export function getValueInPath(o: object | undefined, path: string): any {
|
|
48
35
|
if (!o) return undefined;
|
|
49
36
|
if (typeof o === "object") {
|
|
@@ -138,6 +125,26 @@ export function removeUndefined(value: any, removeEmptyStrings?: boolean): any {
|
|
|
138
125
|
return value;
|
|
139
126
|
}
|
|
140
127
|
|
|
128
|
+
export function removeNulls(value: any): any {
|
|
129
|
+
if (typeof value === "function") {
|
|
130
|
+
return value;
|
|
131
|
+
}
|
|
132
|
+
if (Array.isArray(value)) {
|
|
133
|
+
return value.map((v: any) => removeNulls(v));
|
|
134
|
+
}
|
|
135
|
+
if (typeof value === "object") {
|
|
136
|
+
const res: object = {};
|
|
137
|
+
if (value === null)
|
|
138
|
+
return value;
|
|
139
|
+
Object.keys(value).forEach((key) => {
|
|
140
|
+
if (value[key] !== null)
|
|
141
|
+
(res as any)[key] = removeNulls(value[key]);
|
|
142
|
+
});
|
|
143
|
+
return res;
|
|
144
|
+
}
|
|
145
|
+
return value;
|
|
146
|
+
}
|
|
147
|
+
|
|
141
148
|
export function isEmptyObject(obj: object) {
|
|
142
149
|
return obj &&
|
|
143
150
|
Object.getPrototypeOf(obj) === Object.prototype &&
|
|
@@ -154,15 +161,25 @@ export function removePropsIfExisting(source: any, comparison: any) {
|
|
|
154
161
|
|
|
155
162
|
const res = isArray(source) ? [...source] : { ...source };
|
|
156
163
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
if (
|
|
160
|
-
res
|
|
161
|
-
} else if (res[
|
|
162
|
-
|
|
164
|
+
if (isArray(res)) {
|
|
165
|
+
for (let i = res.length - 1; i >= 0; i--) {
|
|
166
|
+
if (res[i] === comparison[i]) {
|
|
167
|
+
res.splice(i, 1);
|
|
168
|
+
} else if (isObject(res[i]) && isObject(comparison[i])) {
|
|
169
|
+
res[i] = removePropsIfExisting(res[i], comparison[i]);
|
|
163
170
|
}
|
|
164
171
|
}
|
|
165
|
-
}
|
|
172
|
+
} else {
|
|
173
|
+
Object.keys(comparison).forEach(key => {
|
|
174
|
+
if (key in res) {
|
|
175
|
+
if (isObject(res[key]) && isObject(comparison[key])) {
|
|
176
|
+
res[key] = removePropsIfExisting(res[key], comparison[key]);
|
|
177
|
+
} else if (res[key] === comparison[key]) {
|
|
178
|
+
delete res[key];
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
}
|
|
166
183
|
|
|
167
184
|
return res;
|
|
168
185
|
}
|
|
@@ -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
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AuthController, Entity, EntityCollection, Permissions, User } from "../types";
|
|
2
|
+
import { fullPathToCollectionSegments } from "./paths";
|
|
2
3
|
|
|
3
4
|
const DEFAULT_PERMISSIONS = {
|
|
4
5
|
read: true,
|
|
@@ -7,11 +8,11 @@ const DEFAULT_PERMISSIONS = {
|
|
|
7
8
|
delete: true
|
|
8
9
|
};
|
|
9
10
|
|
|
10
|
-
export function resolvePermissions<M extends Record<string, any>,
|
|
11
|
+
export function resolvePermissions<M extends Record<string, any>, USER extends User>
|
|
11
12
|
(collection: EntityCollection<M>,
|
|
12
|
-
authController: AuthController<
|
|
13
|
-
|
|
14
|
-
entity: Entity<M> | null): Permissions {
|
|
13
|
+
authController: AuthController<USER>,
|
|
14
|
+
path: string,
|
|
15
|
+
entity: Entity<M> | null): Permissions | undefined {
|
|
15
16
|
|
|
16
17
|
const permission = collection.permissions;
|
|
17
18
|
if (permission === undefined) {
|
|
@@ -19,8 +20,10 @@ export function resolvePermissions<M extends Record<string, any>, UserType exten
|
|
|
19
20
|
} else if (typeof permission === "object") {
|
|
20
21
|
return permission as Permissions;
|
|
21
22
|
} else if (typeof permission === "function") {
|
|
23
|
+
const pathSegments = fullPathToCollectionSegments(path);
|
|
22
24
|
return permission({
|
|
23
25
|
entity,
|
|
26
|
+
path,
|
|
24
27
|
user: authController.user,
|
|
25
28
|
authController,
|
|
26
29
|
collection,
|
|
@@ -31,31 +34,32 @@ export function resolvePermissions<M extends Record<string, any>, UserType exten
|
|
|
31
34
|
throw Error("New type of permission added and not mapped");
|
|
32
35
|
}
|
|
33
36
|
|
|
34
|
-
export function canEditEntity<M extends Record<string, any>,
|
|
37
|
+
export function canEditEntity<M extends Record<string, any>, USER extends User>
|
|
35
38
|
(
|
|
36
39
|
collection: EntityCollection<M>,
|
|
37
|
-
authController: AuthController<
|
|
38
|
-
|
|
40
|
+
authController: AuthController<USER>,
|
|
41
|
+
path: string,
|
|
39
42
|
entity: Entity<M> | null): boolean {
|
|
40
|
-
return resolvePermissions(collection, authController,
|
|
43
|
+
return resolvePermissions(collection, authController, path, entity)?.edit ?? DEFAULT_PERMISSIONS.edit;
|
|
41
44
|
}
|
|
42
45
|
|
|
43
|
-
export function canCreateEntity<M extends Record<string, any>,
|
|
46
|
+
export function canCreateEntity<M extends Record<string, any>, USER extends User>
|
|
44
47
|
(
|
|
45
48
|
collection: EntityCollection<M>,
|
|
46
|
-
authController: AuthController<
|
|
47
|
-
|
|
49
|
+
authController: AuthController<USER>,
|
|
50
|
+
path: string,
|
|
48
51
|
entity: Entity<M> | null): boolean {
|
|
49
|
-
|
|
52
|
+
if (collection.collectionGroup) return false;
|
|
53
|
+
return resolvePermissions(collection, authController, path, entity)?.create ?? DEFAULT_PERMISSIONS.create;
|
|
50
54
|
}
|
|
51
55
|
|
|
52
|
-
export function canDeleteEntity<M extends Record<string, any>,
|
|
56
|
+
export function canDeleteEntity<M extends Record<string, any>, USER extends User>
|
|
53
57
|
(
|
|
54
58
|
collection: EntityCollection<M>,
|
|
55
|
-
authController: AuthController<
|
|
56
|
-
|
|
59
|
+
authController: AuthController<USER>,
|
|
60
|
+
path: string,
|
|
57
61
|
entity: Entity<M> | null): boolean {
|
|
58
|
-
return resolvePermissions(collection, authController,
|
|
62
|
+
return resolvePermissions(collection, authController, path, entity)?.delete ?? DEFAULT_PERMISSIONS.delete;
|
|
59
63
|
}
|
|
60
64
|
|
|
61
65
|
// export function resolveCollectionsPermissions(roles: Role[]): Record<string, Permissions> {
|
package/src/util/plurals.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Returns the plural of an English word.
|
|
3
3
|
*
|
|
4
|
-
* @export
|
|
5
4
|
* @param {string} word
|
|
6
5
|
* @param {number} [amount]
|
|
7
6
|
* @returns {string}
|
|
@@ -92,7 +91,6 @@ export function plural(word: string, amount?: number): string {
|
|
|
92
91
|
/**
|
|
93
92
|
* Returns the singular of an English word.
|
|
94
93
|
*
|
|
95
|
-
* @export
|
|
96
94
|
* @param {string} word
|
|
97
95
|
* @param {number} [amount]
|
|
98
96
|
* @returns {string}
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
EntityCollection,
|
|
5
|
+
PropertiesOrBuilders,
|
|
6
|
+
PropertyConfig,
|
|
7
|
+
PropertyOrBuilder,
|
|
8
|
+
ResolvedProperties,
|
|
9
|
+
ResolvedProperty
|
|
10
|
+
} from "../types";
|
|
4
11
|
import { isPropertyBuilder } from "./entities";
|
|
5
12
|
import { resolveProperty } from "./resolutions";
|
|
6
13
|
import { CircleIcon, FunctionsIcon } from "@firecms/ui";
|
|
@@ -11,7 +18,7 @@ export function isReferenceProperty(propertyOrBuilder: PropertyOrBuilder,
|
|
|
11
18
|
const resolvedProperty = resolveProperty({
|
|
12
19
|
propertyKey: "ignore", // TODO
|
|
13
20
|
propertyOrBuilder,
|
|
14
|
-
fields
|
|
21
|
+
propertyConfigs: fields
|
|
15
22
|
});
|
|
16
23
|
if (!resolvedProperty) return null;
|
|
17
24
|
if (resolvedProperty.dataType === "reference") {
|
|
@@ -35,7 +42,7 @@ export function getIconForWidget(widget: PropertyConfig | undefined,
|
|
|
35
42
|
}
|
|
36
43
|
|
|
37
44
|
export function getIconForProperty(
|
|
38
|
-
property: PropertyOrBuilder | ResolvedProperty
|
|
45
|
+
property: PropertyOrBuilder<any> | ResolvedProperty<any>,
|
|
39
46
|
size: "small" | "medium" | "large" = "small",
|
|
40
47
|
fields: Record<string, PropertyConfig> = {}
|
|
41
48
|
): React.ReactNode {
|
|
@@ -63,7 +70,7 @@ export function getColorForProperty(property: PropertyOrBuilder, fields: Record<
|
|
|
63
70
|
* @param properties
|
|
64
71
|
* @param path
|
|
65
72
|
*/
|
|
66
|
-
export function getPropertyInPath<M extends Record<string, any>>(properties: PropertiesOrBuilders<M
|
|
73
|
+
export function getPropertyInPath<M extends Record<string, any>>(properties: PropertiesOrBuilders<M> | ResolvedProperties, path: string): PropertyOrBuilder<any, M> | undefined {
|
|
67
74
|
if (typeof properties === "object") {
|
|
68
75
|
if (path in properties) {
|
|
69
76
|
return properties[path];
|
package/src/util/references.ts
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
|
-
import { EntityCollection, PropertyConfig } from "../types";
|
|
1
|
+
import { EntityCollection, PropertyConfig, ResolvedEntityCollection } from "../types";
|
|
2
2
|
import { isReferenceProperty } from "./property_utils";
|
|
3
3
|
import { isPropertyBuilder } from "./entities";
|
|
4
|
+
import { getFieldConfig } from "../core";
|
|
4
5
|
|
|
5
|
-
export function
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
export function getEntityPreviewKeys(targetCollection: EntityCollection<any>,
|
|
7
|
+
fields: Record<string, PropertyConfig>,
|
|
8
|
+
previewProperties?: string[],
|
|
9
|
+
limit = 3) {
|
|
9
10
|
const allProperties = Object.keys(targetCollection.properties);
|
|
10
11
|
let listProperties = previewProperties?.filter(p => allProperties.includes(p as string));
|
|
12
|
+
if (!listProperties && targetCollection.previewProperties) {
|
|
13
|
+
listProperties = targetCollection.previewProperties?.filter(p => allProperties.includes(p as string));
|
|
14
|
+
}
|
|
11
15
|
if (listProperties && listProperties.length > 0) {
|
|
12
16
|
return listProperties;
|
|
13
17
|
} else {
|
|
@@ -18,3 +22,39 @@ export function getReferencePreviewKeys(targetCollection: EntityCollection<any>,
|
|
|
18
22
|
}).slice(0, limit);
|
|
19
23
|
}
|
|
20
24
|
}
|
|
25
|
+
|
|
26
|
+
export function getEntityTitlePropertyKey<M extends Record<string, any>>(collection: EntityCollection<M>, propertyConfigs: Record<string, PropertyConfig<any>>): string | undefined {
|
|
27
|
+
if (collection.titleProperty) {
|
|
28
|
+
return collection.titleProperty as string;
|
|
29
|
+
}
|
|
30
|
+
// find first text field property
|
|
31
|
+
for (const key in collection.properties) {
|
|
32
|
+
const property = collection.properties[key];
|
|
33
|
+
if (!isPropertyBuilder(property)) {
|
|
34
|
+
const field = getFieldConfig(property, propertyConfigs);
|
|
35
|
+
if (field?.key === "text_field") {
|
|
36
|
+
return key;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function getEntityImagePreviewPropertyKey<M extends object>(collection: ResolvedEntityCollection<M>): string | undefined {
|
|
44
|
+
|
|
45
|
+
// find first storage property of type image
|
|
46
|
+
for (const key in collection.properties) {
|
|
47
|
+
const property = collection.properties[key];
|
|
48
|
+
if (property.dataType === "string" && property.storage?.acceptedFiles?.includes("image/*")) {
|
|
49
|
+
return key;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// alternatively, look for the first array of images
|
|
53
|
+
for (const key in collection.properties) {
|
|
54
|
+
const property = collection.properties[key];
|
|
55
|
+
if (property.dataType === "array" && property.of?.dataType === "string" && property.of.storage?.acceptedFiles?.includes("image/*")) {
|
|
56
|
+
return key;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
package/src/util/resolutions.ts
CHANGED
|
@@ -26,7 +26,7 @@ import { getDefaultValuesFor, isPropertyBuilder } from "./entities";
|
|
|
26
26
|
import { DEFAULT_ONE_OF_TYPE } from "./common";
|
|
27
27
|
import { getIn } from "@firecms/formex";
|
|
28
28
|
import { enumToObjectEntries } from "./enums";
|
|
29
|
-
import { isDefaultFieldConfigId } from "../core";
|
|
29
|
+
import { isDefaultFieldConfigId } from "../core/field_configs";
|
|
30
30
|
|
|
31
31
|
// import util from "util";
|
|
32
32
|
|
|
@@ -38,7 +38,8 @@ export const resolveCollection = <M extends Record<string, any>, >
|
|
|
38
38
|
values,
|
|
39
39
|
previousValues,
|
|
40
40
|
userConfigPersistence,
|
|
41
|
-
|
|
41
|
+
propertyConfigs,
|
|
42
|
+
ignoreMissingFields = false
|
|
42
43
|
}: {
|
|
43
44
|
collection: EntityCollection<M> | ResolvedEntityCollection<M>;
|
|
44
45
|
path: string,
|
|
@@ -46,7 +47,8 @@ export const resolveCollection = <M extends Record<string, any>, >
|
|
|
46
47
|
values?: Partial<EntityValues<M>>,
|
|
47
48
|
previousValues?: Partial<EntityValues<M>>,
|
|
48
49
|
userConfigPersistence?: UserConfigurationPersistence;
|
|
49
|
-
|
|
50
|
+
propertyConfigs?: Record<string, PropertyConfig>;
|
|
51
|
+
ignoreMissingFields?: boolean;
|
|
50
52
|
}): ResolvedEntityCollection<M> => {
|
|
51
53
|
|
|
52
54
|
const collectionOverride = userConfigPersistence?.getCollectionConfig<M>(path);
|
|
@@ -58,16 +60,15 @@ export const resolveCollection = <M extends Record<string, any>, >
|
|
|
58
60
|
|
|
59
61
|
const resolvedProperties = Object.entries(collection.properties)
|
|
60
62
|
.map(([key, propertyOrBuilder]) => {
|
|
61
|
-
const propertyValue = usedValues ? getIn(usedValues, key) : undefined;
|
|
62
63
|
const childResolvedProperty = resolveProperty({
|
|
63
64
|
propertyKey: key,
|
|
64
65
|
propertyOrBuilder: propertyOrBuilder as PropertyOrBuilder | ResolvedProperty,
|
|
65
66
|
values: usedValues,
|
|
66
67
|
previousValues: usedPreviousValues,
|
|
67
68
|
path,
|
|
68
|
-
propertyValue,
|
|
69
69
|
entityId,
|
|
70
|
-
|
|
70
|
+
propertyConfigs: propertyConfigs,
|
|
71
|
+
ignoreMissingFields
|
|
71
72
|
});
|
|
72
73
|
if (!childResolvedProperty) return {};
|
|
73
74
|
return ({
|
|
@@ -95,24 +96,23 @@ export const resolveCollection = <M extends Record<string, any>, >
|
|
|
95
96
|
* Resolve property builders, enums and arrays.
|
|
96
97
|
* @param propertyOrBuilder
|
|
97
98
|
* @param propertyValue
|
|
98
|
-
* @param values
|
|
99
99
|
*/
|
|
100
100
|
export function resolveProperty<T extends CMSType = CMSType, M extends Record<string, any> = any>({
|
|
101
101
|
propertyOrBuilder,
|
|
102
|
-
propertyValue,
|
|
103
102
|
fromBuilder = false,
|
|
103
|
+
ignoreMissingFields = false,
|
|
104
104
|
...props
|
|
105
105
|
}: {
|
|
106
106
|
propertyKey?: string,
|
|
107
107
|
propertyOrBuilder: PropertyOrBuilder<T, M> | ResolvedProperty<T>,
|
|
108
|
-
propertyValue?: unknown,
|
|
109
108
|
values?: Partial<M>,
|
|
110
109
|
previousValues?: Partial<M>,
|
|
111
110
|
path?: string,
|
|
112
111
|
entityId?: string,
|
|
113
112
|
index?: number,
|
|
114
113
|
fromBuilder?: boolean;
|
|
115
|
-
|
|
114
|
+
propertyConfigs?: Record<string, PropertyConfig<any>>;
|
|
115
|
+
ignoreMissingFields?: boolean;
|
|
116
116
|
}): ResolvedProperty<T> | null {
|
|
117
117
|
|
|
118
118
|
if (typeof propertyOrBuilder === "object" && "resolved" in propertyOrBuilder) {
|
|
@@ -128,10 +128,11 @@ export function resolveProperty<T extends CMSType = CMSType, M extends Record<st
|
|
|
128
128
|
if (!path)
|
|
129
129
|
throw Error("Trying to resolve a property builder without specifying the entity path");
|
|
130
130
|
|
|
131
|
+
const usedPropertyValue = props.propertyKey ? getIn(props.values, props.propertyKey) : undefined;
|
|
131
132
|
const result: Property<T> | null = propertyOrBuilder({
|
|
132
133
|
...props,
|
|
133
134
|
path,
|
|
134
|
-
propertyValue,
|
|
135
|
+
propertyValue: usedPropertyValue,
|
|
135
136
|
values: props.values ?? {},
|
|
136
137
|
previousValues: props.previousValues ?? props.values ?? {}
|
|
137
138
|
});
|
|
@@ -142,17 +143,17 @@ export function resolveProperty<T extends CMSType = CMSType, M extends Record<st
|
|
|
142
143
|
|
|
143
144
|
resolvedProperty = resolveProperty({
|
|
144
145
|
...props,
|
|
145
|
-
propertyValue,
|
|
146
146
|
propertyOrBuilder: result,
|
|
147
|
-
fromBuilder: true
|
|
147
|
+
fromBuilder: true,
|
|
148
|
+
ignoreMissingFields
|
|
148
149
|
});
|
|
149
150
|
} else {
|
|
150
151
|
const property = propertyOrBuilder as Property<T>;
|
|
151
152
|
if (property.dataType === "map" && property.properties) {
|
|
152
153
|
const properties = resolveProperties({
|
|
154
|
+
ignoreMissingFields,
|
|
153
155
|
...props,
|
|
154
156
|
properties: property.properties,
|
|
155
|
-
propertyValue
|
|
156
157
|
});
|
|
157
158
|
resolvedProperty = {
|
|
158
159
|
...property,
|
|
@@ -163,8 +164,8 @@ export function resolveProperty<T extends CMSType = CMSType, M extends Record<st
|
|
|
163
164
|
} else if (property.dataType === "array") {
|
|
164
165
|
resolvedProperty = resolveArrayProperty({
|
|
165
166
|
property,
|
|
166
|
-
propertyValue,
|
|
167
167
|
fromBuilder,
|
|
168
|
+
ignoreMissingFields,
|
|
168
169
|
...props
|
|
169
170
|
}) as ResolvedProperty<any>;
|
|
170
171
|
} else if ((property.dataType === "string" || property.dataType === "number") && property.enumValues) {
|
|
@@ -181,13 +182,13 @@ export function resolveProperty<T extends CMSType = CMSType, M extends Record<st
|
|
|
181
182
|
}
|
|
182
183
|
|
|
183
184
|
if (resolvedProperty.propertyConfig && !isDefaultFieldConfigId(resolvedProperty.propertyConfig)) {
|
|
184
|
-
const cmsFields = props.
|
|
185
|
-
if (!cmsFields) {
|
|
186
|
-
throw Error(`Trying to resolve a property with key ${resolvedProperty.propertyConfig} that inherits from a custom property config but no custom property configs were provided. Use the property
|
|
185
|
+
const cmsFields = props.propertyConfigs;
|
|
186
|
+
if (!cmsFields && !ignoreMissingFields) {
|
|
187
|
+
throw Error(`Trying to resolve a property with key '${resolvedProperty.propertyConfig}' that inherits from a custom property config but no custom property configs were provided. Use the property 'propertyConfigs' in your app config to provide them`);
|
|
187
188
|
}
|
|
188
|
-
const customField: PropertyConfig
|
|
189
|
+
const customField: PropertyConfig | undefined = cmsFields?.[resolvedProperty.propertyConfig];
|
|
189
190
|
if (!customField) {
|
|
190
|
-
console.warn(`Trying to resolve a property with key ${resolvedProperty.propertyConfig} that inherits from a custom property config but no custom property config with that key was found. Check the
|
|
191
|
+
console.warn(`Trying to resolve a property with key '${resolvedProperty.propertyConfig}' that inherits from a custom property config but no custom property config with that key was found. Check the 'propertyConfigs' in your app config`)
|
|
191
192
|
console.warn("Available property configs", cmsFields);
|
|
192
193
|
return null;
|
|
193
194
|
}
|
|
@@ -198,7 +199,7 @@ export function resolveProperty<T extends CMSType = CMSType, M extends Record<st
|
|
|
198
199
|
}
|
|
199
200
|
const customFieldProperty = resolveProperty<any>({
|
|
200
201
|
propertyOrBuilder: configPropertyOrBuilder,
|
|
201
|
-
|
|
202
|
+
ignoreMissingFields,
|
|
202
203
|
...props
|
|
203
204
|
});
|
|
204
205
|
if (customFieldProperty) {
|
|
@@ -216,23 +217,56 @@ export function resolveProperty<T extends CMSType = CMSType, M extends Record<st
|
|
|
216
217
|
: null;
|
|
217
218
|
}
|
|
218
219
|
|
|
220
|
+
export function getArrayResolvedProperties<M>({
|
|
221
|
+
propertyKey,
|
|
222
|
+
propertyValue,
|
|
223
|
+
property,
|
|
224
|
+
...props
|
|
225
|
+
}: {
|
|
226
|
+
propertyValue: any,
|
|
227
|
+
propertyKey?: string,
|
|
228
|
+
property: ArrayProperty<any> | ResolvedArrayProperty<any>,
|
|
229
|
+
ignoreMissingFields: boolean,
|
|
230
|
+
values?: Partial<M>;
|
|
231
|
+
previousValues?: Partial<M>;
|
|
232
|
+
path?: string;
|
|
233
|
+
entityId?: string;
|
|
234
|
+
index?: number;
|
|
235
|
+
fromBuilder?: boolean;
|
|
236
|
+
propertyConfigs?: Record<string, PropertyConfig>
|
|
237
|
+
}) {
|
|
238
|
+
|
|
239
|
+
const of = property.of;
|
|
240
|
+
return Array.isArray(propertyValue)
|
|
241
|
+
? propertyValue.map((v: any, index: number) => {
|
|
242
|
+
return resolveProperty({
|
|
243
|
+
propertyKey: `${propertyKey}.${index}`,
|
|
244
|
+
propertyOrBuilder: of,
|
|
245
|
+
...props,
|
|
246
|
+
index
|
|
247
|
+
});
|
|
248
|
+
}).filter(e => Boolean(e)) as ResolvedProperty[]
|
|
249
|
+
: [];
|
|
250
|
+
}
|
|
251
|
+
|
|
219
252
|
export function resolveArrayProperty<T extends any[], M>({
|
|
220
253
|
propertyKey,
|
|
221
254
|
property,
|
|
222
|
-
|
|
255
|
+
ignoreMissingFields = false,
|
|
223
256
|
...props
|
|
224
257
|
}: {
|
|
225
258
|
propertyKey?: string,
|
|
226
259
|
property: ArrayProperty<T> | ResolvedArrayProperty<T>,
|
|
227
|
-
propertyValue: any,
|
|
228
260
|
values?: Partial<M>,
|
|
229
261
|
previousValues?: Partial<M>,
|
|
230
262
|
path?: string,
|
|
231
263
|
entityId?: string,
|
|
232
264
|
index?: number,
|
|
233
265
|
fromBuilder?: boolean;
|
|
234
|
-
|
|
266
|
+
propertyConfigs?: Record<string, PropertyConfig>;
|
|
267
|
+
ignoreMissingFields?: boolean;
|
|
235
268
|
}): ResolvedArrayProperty {
|
|
269
|
+
const propertyValue = propertyKey ? getIn(props.values, propertyKey) : undefined;
|
|
236
270
|
|
|
237
271
|
if (property.of) {
|
|
238
272
|
if (Array.isArray(property.of)) {
|
|
@@ -244,7 +278,7 @@ export function resolveArrayProperty<T extends any[], M>({
|
|
|
244
278
|
return resolveProperty({
|
|
245
279
|
propertyKey: `${propertyKey}.${index}`,
|
|
246
280
|
propertyOrBuilder: p as Property<any>,
|
|
247
|
-
|
|
281
|
+
ignoreMissingFields,
|
|
248
282
|
...props,
|
|
249
283
|
index
|
|
250
284
|
});
|
|
@@ -252,22 +286,19 @@ export function resolveArrayProperty<T extends any[], M>({
|
|
|
252
286
|
} as ResolvedArrayProperty;
|
|
253
287
|
} else {
|
|
254
288
|
const of = property.of;
|
|
255
|
-
const resolvedProperties
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
})).filter(e => Boolean(e)) as ResolvedProperty[]
|
|
263
|
-
: [];
|
|
289
|
+
const resolvedProperties = getArrayResolvedProperties({
|
|
290
|
+
propertyValue,
|
|
291
|
+
propertyKey,
|
|
292
|
+
property,
|
|
293
|
+
ignoreMissingFields,
|
|
294
|
+
...props
|
|
295
|
+
});
|
|
264
296
|
const ofProperty = resolveProperty({
|
|
265
|
-
propertyKey: `${propertyKey}`,
|
|
266
297
|
propertyOrBuilder: of,
|
|
267
|
-
|
|
298
|
+
ignoreMissingFields,
|
|
268
299
|
...props
|
|
269
300
|
});
|
|
270
|
-
if (!ofProperty)
|
|
301
|
+
if (!ofProperty && !ignoreMissingFields)
|
|
271
302
|
throw Error("When using a property builder as the 'of' prop of an ArrayProperty, you must return a valid child property")
|
|
272
303
|
return {
|
|
273
304
|
...property,
|
|
@@ -287,14 +318,15 @@ export function resolveArrayProperty<T extends any[], M>({
|
|
|
287
318
|
return resolveProperty({
|
|
288
319
|
propertyKey: `${propertyKey}.${index}`,
|
|
289
320
|
propertyOrBuilder: childProperty,
|
|
290
|
-
|
|
321
|
+
ignoreMissingFields,
|
|
291
322
|
...props
|
|
292
323
|
});
|
|
293
324
|
}).filter(e => Boolean(e)) as ResolvedProperty[]
|
|
294
325
|
: [];
|
|
295
326
|
const properties = resolveProperties<any>({
|
|
327
|
+
propertyKey,
|
|
296
328
|
properties: property.oneOf.properties,
|
|
297
|
-
|
|
329
|
+
ignoreMissingFields,
|
|
298
330
|
...props
|
|
299
331
|
});
|
|
300
332
|
return {
|
|
@@ -325,27 +357,28 @@ export function resolveArrayProperty<T extends any[], M>({
|
|
|
325
357
|
* @param value
|
|
326
358
|
*/
|
|
327
359
|
export function resolveProperties<M extends Record<string, any>>({
|
|
360
|
+
propertyKey,
|
|
328
361
|
properties,
|
|
329
|
-
|
|
362
|
+
ignoreMissingFields,
|
|
330
363
|
...props
|
|
331
364
|
}: {
|
|
365
|
+
propertyKey?: string,
|
|
332
366
|
properties: PropertiesOrBuilders<M>,
|
|
333
|
-
propertyValue: unknown,
|
|
334
367
|
values?: Partial<M>,
|
|
335
368
|
previousValues?: Partial<M>,
|
|
336
369
|
path?: string,
|
|
337
370
|
entityId?: string,
|
|
338
371
|
index?: number,
|
|
339
372
|
fromBuilder?: boolean;
|
|
340
|
-
|
|
373
|
+
propertyConfigs?: Record<string, PropertyConfig>;
|
|
374
|
+
ignoreMissingFields?: boolean;
|
|
341
375
|
}): ResolvedProperties<M> {
|
|
342
376
|
return Object.entries<PropertyOrBuilder>(properties as Record<string, PropertyOrBuilder>)
|
|
343
377
|
.map(([key, property]) => {
|
|
344
|
-
const thisPropertyValue = propertyValue && typeof propertyValue === "object" ? getValueInPath(propertyValue, key) : undefined;
|
|
345
378
|
const childResolvedProperty = resolveProperty({
|
|
346
|
-
propertyKey: key,
|
|
379
|
+
propertyKey: propertyKey ? `${propertyKey}.${key}` : undefined,
|
|
347
380
|
propertyOrBuilder: property,
|
|
348
|
-
|
|
381
|
+
ignoreMissingFields,
|
|
349
382
|
...props
|
|
350
383
|
});
|
|
351
384
|
if (!childResolvedProperty) return {};
|
|
@@ -367,7 +400,7 @@ export function resolvePropertyEnum(property: StringProperty | NumberProperty, f
|
|
|
367
400
|
return {
|
|
368
401
|
...property,
|
|
369
402
|
resolved: true,
|
|
370
|
-
enumValues: enumToObjectEntries(property.enumValues)?.filter((value) => value && value.id && value.label) ?? [],
|
|
403
|
+
enumValues: enumToObjectEntries(property.enumValues)?.filter((value) => value && (value.id || value.id === 0) && value.label) ?? [],
|
|
371
404
|
fromBuilder: fromBuilder ?? false
|
|
372
405
|
}
|
|
373
406
|
}
|