@firecms/core 3.0.0-canary.21 → 3.0.0-canary.211
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/app/AppBar.d.ts +12 -0
- package/dist/app/Drawer.d.ts +16 -0
- package/dist/app/Scaffold.d.ts +34 -0
- package/dist/app/index.d.ts +4 -0
- package/dist/app/useApp.d.ts +16 -0
- package/dist/components/ArrayContainer.d.ts +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 +2 -2
- package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +22 -6
- package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +1 -0
- package/dist/components/EntityCollectionTable/column_utils.d.ts +1 -2
- package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +3 -1
- package/dist/components/EntityCollectionTable/index.d.ts +1 -1
- package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +1 -4
- package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +2 -2
- package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +7 -4
- package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +16 -2
- package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
- package/dist/components/EntityCollectionView/utils.d.ts +3 -0
- package/dist/components/EntityJsonPreview.d.ts +3 -0
- package/dist/components/EntityPreview.d.ts +5 -4
- package/dist/components/ErrorView.d.ts +1 -1
- package/dist/components/HomePage/DefaultHomePage.d.ts +1 -1
- package/dist/components/HomePage/NavigationCardBinding.d.ts +1 -1
- package/dist/components/PropertyConfigBadge.d.ts +2 -1
- package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
- package/dist/components/ReferenceWidget.d.ts +3 -1
- package/dist/components/SelectableTable/SelectableTable.d.ts +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 +28 -12
- 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 +4 -2
- package/dist/contexts/BreacrumbsContext.d.ts +8 -0
- package/dist/core/DefaultAppBar.d.ts +29 -0
- package/dist/core/DefaultDrawer.d.ts +19 -0
- package/dist/core/DrawerNavigationItem.d.ts +10 -0
- package/dist/core/EntityEditView.d.ts +35 -11
- package/dist/core/EntityEditViewFormActions.d.ts +2 -0
- package/dist/core/FireCMS.d.ts +3 -3
- package/dist/core/FireCMSRouter.d.ts +4 -0
- package/dist/core/NavigationRoutes.d.ts +2 -3
- package/dist/core/SideDialogs.d.ts +4 -2
- package/dist/core/index.d.ts +4 -4
- package/dist/form/EntityForm.d.ts +37 -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/form/components/LabelWithIcon.d.ts +1 -1
- package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
- package/dist/form/components/StorageItemPreview.d.ts +4 -4
- package/dist/form/components/index.d.ts +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/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 -5
- 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 +16 -18
- package/dist/form/useClearRestoreValue.d.ts +2 -2
- package/dist/hooks/data/delete.d.ts +4 -4
- package/dist/hooks/data/save.d.ts +4 -5
- package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
- package/dist/hooks/data/useEntityFetch.d.ts +4 -3
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/useAuthController.d.ts +1 -1
- package/dist/hooks/useBreadcrumbsController.d.ts +26 -0
- package/dist/hooks/useBuildNavigationController.d.ts +7 -5
- package/dist/hooks/useFireCMSContext.d.ts +1 -1
- package/dist/hooks/useModeController.d.ts +1 -2
- package/dist/hooks/useProjectLog.d.ts +8 -2
- package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
- package/dist/hooks/useValidateAuthenticator.d.ts +4 -8
- package/dist/index.d.ts +1 -0
- package/dist/index.es.js +21921 -14330
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +24271 -588
- package/dist/index.umd.js.map +1 -1
- package/dist/internal/useBuildDataSource.d.ts +1 -16
- package/dist/internal/useBuildSideEntityController.d.ts +2 -2
- package/dist/internal/useUnsavedChangesDialog.d.ts +7 -9
- package/dist/preview/PropertyPreviewProps.d.ts +6 -1
- package/dist/preview/components/EnumValuesChip.d.ts +1 -1
- package/dist/preview/components/ReferencePreview.d.ts +3 -2
- 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/auth.d.ts +8 -10
- package/dist/types/collections.d.ts +77 -22
- package/dist/types/datasource.d.ts +52 -36
- package/dist/types/dialogs_controller.d.ts +7 -3
- package/dist/types/entities.d.ts +7 -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 +2 -2
- 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 +0 -1
- package/dist/types/navigation.d.ts +32 -14
- package/dist/types/permissions.d.ts +4 -4
- package/dist/types/plugins.d.ts +23 -12
- package/dist/types/properties.d.ts +52 -24
- package/dist/types/property_config.d.ts +0 -2
- 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 +1 -0
- package/dist/util/builders.d.ts +3 -3
- 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 +6 -3
- 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/resolutions.d.ts +36 -17
- package/dist/util/storage.d.ts +23 -2
- package/dist/util/useStorageUploadController.d.ts +3 -3
- package/package.json +62 -48
- package/src/app/AppBar.tsx +18 -0
- package/src/app/Drawer.tsx +24 -0
- package/src/app/Scaffold.tsx +253 -0
- package/src/app/index.ts +4 -0
- package/src/app/useApp.tsx +32 -0
- package/src/components/ArrayContainer.tsx +127 -41
- 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 +10 -19
- package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +54 -37
- package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +38 -31
- package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +30 -9
- package/src/components/EntityCollectionTable/PropertyTableCell.tsx +47 -39
- package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
- package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +30 -16
- package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +19 -17
- package/src/components/EntityCollectionTable/index.tsx +1 -1
- package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +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 +207 -113
- package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +4 -2
- package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
- package/src/components/EntityCollectionView/useSelectionController.tsx +20 -7
- package/src/components/EntityCollectionView/utils.ts +19 -0
- package/src/components/EntityJsonPreview.tsx +66 -0
- package/src/components/EntityPreview.tsx +62 -52
- package/src/components/EntityView.tsx +10 -10
- package/src/components/ErrorView.tsx +4 -4
- package/src/components/HomePage/DefaultHomePage.tsx +26 -19
- package/src/components/HomePage/FavouritesView.tsx +6 -11
- package/src/components/HomePage/NavigationCard.tsx +3 -3
- package/src/components/HomePage/NavigationCardBinding.tsx +5 -10
- package/src/components/HomePage/NavigationGroup.tsx +2 -2
- package/src/components/HomePage/SmallNavigationCard.tsx +5 -6
- 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 +19 -13
- package/src/components/ReferenceWidget.tsx +21 -11
- 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 +36 -12
- 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 +33 -14
- package/src/components/VirtualTable/VirtualTableRow.tsx +5 -6
- package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +5 -5
- package/src/components/VirtualTable/fields/VirtualTableInput.tsx +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 +33 -40
- 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 +4 -2
- 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 +219 -0
- package/src/core/DefaultDrawer.tsx +185 -0
- package/src/core/DrawerNavigationItem.tsx +66 -0
- package/src/core/EntityEditView.tsx +345 -480
- package/src/core/EntityEditViewFormActions.tsx +199 -0
- package/src/core/EntitySidePanel.tsx +86 -17
- package/src/core/FireCMS.tsx +56 -49
- package/src/core/FireCMSRouter.tsx +17 -0
- package/src/core/NavigationRoutes.tsx +28 -38
- package/src/core/SideDialogs.tsx +22 -12
- package/src/core/field_configs.tsx +11 -12
- package/src/core/index.tsx +6 -5
- package/src/form/EntityForm.tsx +585 -539
- 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 +30 -19
- package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
- package/src/form/components/StorageItemPreview.tsx +22 -12
- package/src/form/components/StorageUploadProgress.tsx +4 -5
- package/src/form/components/index.tsx +3 -1
- package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +31 -19
- package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +47 -35
- package/src/form/field_bindings/BlockFieldBinding.tsx +56 -34
- package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -14
- package/src/form/field_bindings/KeyValueFieldBinding.tsx +60 -51
- package/src/form/field_bindings/MapFieldBinding.tsx +71 -54
- package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +153 -0
- package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +25 -20
- package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +11 -16
- package/src/form/field_bindings/ReferenceFieldBinding.tsx +42 -31
- package/src/form/field_bindings/RepeatFieldBinding.tsx +56 -35
- package/src/form/field_bindings/SelectFieldBinding.tsx +22 -14
- package/src/form/field_bindings/StorageUploadFieldBinding.tsx +42 -50
- package/src/form/field_bindings/SwitchFieldBinding.tsx +29 -24
- package/src/form/field_bindings/TextFieldBinding.tsx +28 -24
- package/src/form/index.tsx +16 -37
- package/src/form/useClearRestoreValue.tsx +2 -2
- package/src/form/validation.ts +13 -23
- package/src/hooks/data/delete.ts +6 -5
- package/src/hooks/data/save.ts +13 -9
- package/src/hooks/data/useCollectionFetch.tsx +3 -3
- package/src/hooks/data/useDataSource.tsx +11 -3
- package/src/hooks/data/useEntityFetch.tsx +10 -6
- package/src/hooks/index.tsx +1 -0
- package/src/hooks/useAuthController.tsx +1 -1
- package/src/hooks/useBreadcrumbsController.tsx +31 -0
- package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
- package/src/hooks/useBuildModeController.tsx +22 -29
- package/src/hooks/useBuildNavigationController.tsx +159 -54
- 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 +32 -10
- package/src/hooks/useResolvedNavigationFrom.tsx +10 -12
- package/src/hooks/useValidateAuthenticator.tsx +17 -37
- package/src/index.ts +1 -0
- package/src/internal/useBuildDataSource.ts +72 -82
- package/src/internal/useBuildSideDialogsController.tsx +4 -2
- package/src/internal/useBuildSideEntityController.tsx +194 -73
- package/src/internal/useUnsavedChangesDialog.tsx +127 -91
- package/src/preview/PropertyPreview.tsx +17 -24
- package/src/preview/PropertyPreviewProps.tsx +7 -1
- package/src/preview/components/BooleanPreview.tsx +2 -2
- package/src/preview/components/EmptyValue.tsx +1 -1
- package/src/preview/components/EnumValuesChip.tsx +2 -2
- package/src/preview/components/ImagePreview.tsx +25 -36
- package/src/preview/components/ReferencePreview.tsx +22 -33
- 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 +3 -3
- package/src/preview/util.ts +10 -10
- package/src/routes/CustomCMSRoute.tsx +21 -0
- package/src/routes/FireCMSRoute.tsx +235 -0
- package/src/routes/HomePageRoute.tsx +17 -0
- package/src/types/auth.tsx +9 -13
- package/src/types/collections.ts +94 -27
- package/src/types/customization_controller.tsx +0 -1
- package/src/types/datasource.ts +61 -43
- package/src/types/dialogs_controller.tsx +7 -3
- package/src/types/entities.ts +12 -2
- package/src/types/entity_actions.tsx +32 -7
- 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 +81 -46
- package/src/types/firecms.tsx +7 -2
- package/src/types/firecms_context.tsx +1 -1
- package/src/types/index.ts +0 -1
- package/src/types/navigation.ts +38 -18
- package/src/types/permissions.ts +5 -5
- package/src/types/plugins.tsx +25 -14
- package/src/types/properties.ts +60 -25
- package/src/types/property_config.tsx +0 -2
- package/src/types/side_dialogs_controller.tsx +15 -0
- package/src/types/side_entity_controller.tsx +6 -1
- package/src/types/storage.ts +94 -3
- package/src/types/user.ts +2 -0
- package/src/util/builders.ts +10 -8
- 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 +17 -7
- 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 +48 -28
- package/src/util/parent_references_from_path.ts +3 -3
- package/src/util/permissions.ts +9 -8
- package/src/util/plurals.ts +0 -2
- package/src/util/property_utils.tsx +11 -4
- package/src/util/references.ts +11 -2
- package/src/util/resolutions.ts +100 -46
- package/src/util/storage.ts +79 -21
- package/src/util/strings.ts +2 -2
- package/src/util/useStorageUploadController.tsx +71 -27
- package/dist/components/FireCMSAppBar.d.ts +0 -26
- package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
- package/dist/components/VirtualTable/common.d.ts +0 -2
- package/dist/core/Drawer.d.ts +0 -23
- package/dist/core/Scaffold.d.ts +0 -55
- package/dist/core/SideEntityView.d.ts +0 -7
- package/dist/form/components/FormikArrayContainer.d.ts +0 -18
- package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
- package/dist/internal/useBuildCustomizationController.d.ts +0 -2
- package/dist/internal/useLocaleConfig.d.ts +0 -1
- package/dist/types/appcheck.d.ts +0 -26
- package/src/components/FireCMSAppBar.tsx +0 -165
- package/src/components/PropertyIdCopyTooltipContent.tsx +0 -28
- package/src/components/common/useDataSourceEntityCollectionTableController.tsx +0 -225
- package/src/core/Drawer.tsx +0 -191
- package/src/core/Scaffold.tsx +0 -281
- package/src/core/SideEntityView.tsx +0 -38
- package/src/form/components/FormikArrayContainer.tsx +0 -44
- package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -695
- package/src/internal/useBuildCustomizationController.tsx +0 -5
- package/src/internal/useLocaleConfig.tsx +0 -18
- package/src/types/appcheck.ts +0 -29
- /package/src/util/{common.tsx → common.ts} +0 -0
package/src/util/resolutions.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ArrayProperty,
|
|
3
3
|
CMSType,
|
|
4
|
+
CustomizationController,
|
|
4
5
|
EntityCollection,
|
|
5
6
|
EntityCustomView,
|
|
6
7
|
EntityValues,
|
|
@@ -26,7 +27,7 @@ import { getDefaultValuesFor, isPropertyBuilder } from "./entities";
|
|
|
26
27
|
import { DEFAULT_ONE_OF_TYPE } from "./common";
|
|
27
28
|
import { getIn } from "@firecms/formex";
|
|
28
29
|
import { enumToObjectEntries } from "./enums";
|
|
29
|
-
import { isDefaultFieldConfigId } from "../core";
|
|
30
|
+
import { isDefaultFieldConfigId } from "../core/field_configs";
|
|
30
31
|
|
|
31
32
|
// import util from "util";
|
|
32
33
|
|
|
@@ -38,7 +39,8 @@ export const resolveCollection = <M extends Record<string, any>, >
|
|
|
38
39
|
values,
|
|
39
40
|
previousValues,
|
|
40
41
|
userConfigPersistence,
|
|
41
|
-
|
|
42
|
+
propertyConfigs,
|
|
43
|
+
ignoreMissingFields = false
|
|
42
44
|
}: {
|
|
43
45
|
collection: EntityCollection<M> | ResolvedEntityCollection<M>;
|
|
44
46
|
path: string,
|
|
@@ -46,7 +48,8 @@ export const resolveCollection = <M extends Record<string, any>, >
|
|
|
46
48
|
values?: Partial<EntityValues<M>>,
|
|
47
49
|
previousValues?: Partial<EntityValues<M>>,
|
|
48
50
|
userConfigPersistence?: UserConfigurationPersistence;
|
|
49
|
-
|
|
51
|
+
propertyConfigs?: Record<string, PropertyConfig>;
|
|
52
|
+
ignoreMissingFields?: boolean;
|
|
50
53
|
}): ResolvedEntityCollection<M> => {
|
|
51
54
|
|
|
52
55
|
const collectionOverride = userConfigPersistence?.getCollectionConfig<M>(path);
|
|
@@ -58,16 +61,15 @@ export const resolveCollection = <M extends Record<string, any>, >
|
|
|
58
61
|
|
|
59
62
|
const resolvedProperties = Object.entries(collection.properties)
|
|
60
63
|
.map(([key, propertyOrBuilder]) => {
|
|
61
|
-
const propertyValue = usedValues ? getIn(usedValues, key) : undefined;
|
|
62
64
|
const childResolvedProperty = resolveProperty({
|
|
63
65
|
propertyKey: key,
|
|
64
66
|
propertyOrBuilder: propertyOrBuilder as PropertyOrBuilder | ResolvedProperty,
|
|
65
67
|
values: usedValues,
|
|
66
68
|
previousValues: usedPreviousValues,
|
|
67
69
|
path,
|
|
68
|
-
propertyValue,
|
|
69
70
|
entityId,
|
|
70
|
-
|
|
71
|
+
propertyConfigs: propertyConfigs,
|
|
72
|
+
ignoreMissingFields
|
|
71
73
|
});
|
|
72
74
|
if (!childResolvedProperty) return {};
|
|
73
75
|
return ({
|
|
@@ -95,24 +97,23 @@ export const resolveCollection = <M extends Record<string, any>, >
|
|
|
95
97
|
* Resolve property builders, enums and arrays.
|
|
96
98
|
* @param propertyOrBuilder
|
|
97
99
|
* @param propertyValue
|
|
98
|
-
* @param values
|
|
99
100
|
*/
|
|
100
101
|
export function resolveProperty<T extends CMSType = CMSType, M extends Record<string, any> = any>({
|
|
101
102
|
propertyOrBuilder,
|
|
102
|
-
propertyValue,
|
|
103
103
|
fromBuilder = false,
|
|
104
|
+
ignoreMissingFields = false,
|
|
104
105
|
...props
|
|
105
106
|
}: {
|
|
106
107
|
propertyKey?: string,
|
|
107
108
|
propertyOrBuilder: PropertyOrBuilder<T, M> | ResolvedProperty<T>,
|
|
108
|
-
propertyValue?: unknown,
|
|
109
109
|
values?: Partial<M>,
|
|
110
110
|
previousValues?: Partial<M>,
|
|
111
111
|
path?: string,
|
|
112
112
|
entityId?: string,
|
|
113
113
|
index?: number,
|
|
114
114
|
fromBuilder?: boolean;
|
|
115
|
-
|
|
115
|
+
propertyConfigs?: Record<string, PropertyConfig<any>>;
|
|
116
|
+
ignoreMissingFields?: boolean;
|
|
116
117
|
}): ResolvedProperty<T> | null {
|
|
117
118
|
|
|
118
119
|
if (typeof propertyOrBuilder === "object" && "resolved" in propertyOrBuilder) {
|
|
@@ -128,10 +129,11 @@ export function resolveProperty<T extends CMSType = CMSType, M extends Record<st
|
|
|
128
129
|
if (!path)
|
|
129
130
|
throw Error("Trying to resolve a property builder without specifying the entity path");
|
|
130
131
|
|
|
132
|
+
const usedPropertyValue = props.propertyKey ? getIn(props.values, props.propertyKey) : undefined;
|
|
131
133
|
const result: Property<T> | null = propertyOrBuilder({
|
|
132
134
|
...props,
|
|
133
135
|
path,
|
|
134
|
-
propertyValue,
|
|
136
|
+
propertyValue: usedPropertyValue,
|
|
135
137
|
values: props.values ?? {},
|
|
136
138
|
previousValues: props.previousValues ?? props.values ?? {}
|
|
137
139
|
});
|
|
@@ -142,17 +144,17 @@ export function resolveProperty<T extends CMSType = CMSType, M extends Record<st
|
|
|
142
144
|
|
|
143
145
|
resolvedProperty = resolveProperty({
|
|
144
146
|
...props,
|
|
145
|
-
propertyValue,
|
|
146
147
|
propertyOrBuilder: result,
|
|
147
|
-
fromBuilder: true
|
|
148
|
+
fromBuilder: true,
|
|
149
|
+
ignoreMissingFields
|
|
148
150
|
});
|
|
149
151
|
} else {
|
|
150
152
|
const property = propertyOrBuilder as Property<T>;
|
|
151
153
|
if (property.dataType === "map" && property.properties) {
|
|
152
154
|
const properties = resolveProperties({
|
|
155
|
+
ignoreMissingFields,
|
|
153
156
|
...props,
|
|
154
157
|
properties: property.properties,
|
|
155
|
-
propertyValue
|
|
156
158
|
});
|
|
157
159
|
resolvedProperty = {
|
|
158
160
|
...property,
|
|
@@ -163,8 +165,8 @@ export function resolveProperty<T extends CMSType = CMSType, M extends Record<st
|
|
|
163
165
|
} else if (property.dataType === "array") {
|
|
164
166
|
resolvedProperty = resolveArrayProperty({
|
|
165
167
|
property,
|
|
166
|
-
propertyValue,
|
|
167
168
|
fromBuilder,
|
|
169
|
+
ignoreMissingFields,
|
|
168
170
|
...props
|
|
169
171
|
}) as ResolvedProperty<any>;
|
|
170
172
|
} else if ((property.dataType === "string" || property.dataType === "number") && property.enumValues) {
|
|
@@ -181,13 +183,13 @@ export function resolveProperty<T extends CMSType = CMSType, M extends Record<st
|
|
|
181
183
|
}
|
|
182
184
|
|
|
183
185
|
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
|
|
186
|
+
const cmsFields = props.propertyConfigs;
|
|
187
|
+
if (!cmsFields && !ignoreMissingFields) {
|
|
188
|
+
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
189
|
}
|
|
188
|
-
const customField: PropertyConfig
|
|
190
|
+
const customField: PropertyConfig | undefined = cmsFields?.[resolvedProperty.propertyConfig];
|
|
189
191
|
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
|
|
192
|
+
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
193
|
console.warn("Available property configs", cmsFields);
|
|
192
194
|
return null;
|
|
193
195
|
}
|
|
@@ -198,7 +200,7 @@ export function resolveProperty<T extends CMSType = CMSType, M extends Record<st
|
|
|
198
200
|
}
|
|
199
201
|
const customFieldProperty = resolveProperty<any>({
|
|
200
202
|
propertyOrBuilder: configPropertyOrBuilder,
|
|
201
|
-
|
|
203
|
+
ignoreMissingFields,
|
|
202
204
|
...props
|
|
203
205
|
});
|
|
204
206
|
if (customFieldProperty) {
|
|
@@ -216,23 +218,56 @@ export function resolveProperty<T extends CMSType = CMSType, M extends Record<st
|
|
|
216
218
|
: null;
|
|
217
219
|
}
|
|
218
220
|
|
|
221
|
+
export function getArrayResolvedProperties<M>({
|
|
222
|
+
propertyKey,
|
|
223
|
+
propertyValue,
|
|
224
|
+
property,
|
|
225
|
+
...props
|
|
226
|
+
}: {
|
|
227
|
+
propertyValue: any,
|
|
228
|
+
propertyKey?: string,
|
|
229
|
+
property: ArrayProperty<any> | ResolvedArrayProperty<any>,
|
|
230
|
+
ignoreMissingFields: boolean,
|
|
231
|
+
values?: Partial<M>;
|
|
232
|
+
previousValues?: Partial<M>;
|
|
233
|
+
path?: string;
|
|
234
|
+
entityId?: string;
|
|
235
|
+
index?: number;
|
|
236
|
+
fromBuilder?: boolean;
|
|
237
|
+
propertyConfigs?: Record<string, PropertyConfig>
|
|
238
|
+
}) {
|
|
239
|
+
|
|
240
|
+
const of = property.of;
|
|
241
|
+
return Array.isArray(propertyValue)
|
|
242
|
+
? propertyValue.map((v: any, index: number) => {
|
|
243
|
+
return resolveProperty({
|
|
244
|
+
propertyKey: `${propertyKey}.${index}`,
|
|
245
|
+
propertyOrBuilder: of,
|
|
246
|
+
...props,
|
|
247
|
+
index
|
|
248
|
+
});
|
|
249
|
+
}).filter(e => Boolean(e)) as ResolvedProperty[]
|
|
250
|
+
: [];
|
|
251
|
+
}
|
|
252
|
+
|
|
219
253
|
export function resolveArrayProperty<T extends any[], M>({
|
|
220
254
|
propertyKey,
|
|
221
255
|
property,
|
|
222
|
-
|
|
256
|
+
ignoreMissingFields = false,
|
|
223
257
|
...props
|
|
224
258
|
}: {
|
|
225
259
|
propertyKey?: string,
|
|
226
260
|
property: ArrayProperty<T> | ResolvedArrayProperty<T>,
|
|
227
|
-
propertyValue: any,
|
|
228
261
|
values?: Partial<M>,
|
|
229
262
|
previousValues?: Partial<M>,
|
|
230
263
|
path?: string,
|
|
231
264
|
entityId?: string,
|
|
232
265
|
index?: number,
|
|
233
266
|
fromBuilder?: boolean;
|
|
234
|
-
|
|
267
|
+
propertyConfigs?: Record<string, PropertyConfig>;
|
|
268
|
+
ignoreMissingFields?: boolean;
|
|
235
269
|
}): ResolvedArrayProperty {
|
|
270
|
+
const propertyValue = propertyKey ? getIn(props.values, propertyKey) : undefined;
|
|
236
271
|
|
|
237
272
|
if (property.of) {
|
|
238
273
|
if (Array.isArray(property.of)) {
|
|
@@ -244,7 +279,7 @@ export function resolveArrayProperty<T extends any[], M>({
|
|
|
244
279
|
return resolveProperty({
|
|
245
280
|
propertyKey: `${propertyKey}.${index}`,
|
|
246
281
|
propertyOrBuilder: p as Property<any>,
|
|
247
|
-
|
|
282
|
+
ignoreMissingFields,
|
|
248
283
|
...props,
|
|
249
284
|
index
|
|
250
285
|
});
|
|
@@ -252,22 +287,19 @@ export function resolveArrayProperty<T extends any[], M>({
|
|
|
252
287
|
} as ResolvedArrayProperty;
|
|
253
288
|
} else {
|
|
254
289
|
const of = property.of;
|
|
255
|
-
const resolvedProperties
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
})).filter(e => Boolean(e)) as ResolvedProperty[]
|
|
263
|
-
: [];
|
|
290
|
+
const resolvedProperties = getArrayResolvedProperties({
|
|
291
|
+
propertyValue,
|
|
292
|
+
propertyKey,
|
|
293
|
+
property,
|
|
294
|
+
ignoreMissingFields,
|
|
295
|
+
...props
|
|
296
|
+
});
|
|
264
297
|
const ofProperty = resolveProperty({
|
|
265
|
-
propertyKey: `${propertyKey}`,
|
|
266
298
|
propertyOrBuilder: of,
|
|
267
|
-
|
|
299
|
+
ignoreMissingFields,
|
|
268
300
|
...props
|
|
269
301
|
});
|
|
270
|
-
if (!ofProperty)
|
|
302
|
+
if (!ofProperty && !ignoreMissingFields)
|
|
271
303
|
throw Error("When using a property builder as the 'of' prop of an ArrayProperty, you must return a valid child property")
|
|
272
304
|
return {
|
|
273
305
|
...property,
|
|
@@ -287,14 +319,15 @@ export function resolveArrayProperty<T extends any[], M>({
|
|
|
287
319
|
return resolveProperty({
|
|
288
320
|
propertyKey: `${propertyKey}.${index}`,
|
|
289
321
|
propertyOrBuilder: childProperty,
|
|
290
|
-
|
|
322
|
+
ignoreMissingFields,
|
|
291
323
|
...props
|
|
292
324
|
});
|
|
293
325
|
}).filter(e => Boolean(e)) as ResolvedProperty[]
|
|
294
326
|
: [];
|
|
295
327
|
const properties = resolveProperties<any>({
|
|
328
|
+
propertyKey,
|
|
296
329
|
properties: property.oneOf.properties,
|
|
297
|
-
|
|
330
|
+
ignoreMissingFields,
|
|
298
331
|
...props
|
|
299
332
|
});
|
|
300
333
|
return {
|
|
@@ -325,27 +358,28 @@ export function resolveArrayProperty<T extends any[], M>({
|
|
|
325
358
|
* @param value
|
|
326
359
|
*/
|
|
327
360
|
export function resolveProperties<M extends Record<string, any>>({
|
|
361
|
+
propertyKey,
|
|
328
362
|
properties,
|
|
329
|
-
|
|
363
|
+
ignoreMissingFields,
|
|
330
364
|
...props
|
|
331
365
|
}: {
|
|
366
|
+
propertyKey?: string,
|
|
332
367
|
properties: PropertiesOrBuilders<M>,
|
|
333
|
-
propertyValue: unknown,
|
|
334
368
|
values?: Partial<M>,
|
|
335
369
|
previousValues?: Partial<M>,
|
|
336
370
|
path?: string,
|
|
337
371
|
entityId?: string,
|
|
338
372
|
index?: number,
|
|
339
373
|
fromBuilder?: boolean;
|
|
340
|
-
|
|
374
|
+
propertyConfigs?: Record<string, PropertyConfig>;
|
|
375
|
+
ignoreMissingFields?: boolean;
|
|
341
376
|
}): ResolvedProperties<M> {
|
|
342
377
|
return Object.entries<PropertyOrBuilder>(properties as Record<string, PropertyOrBuilder>)
|
|
343
378
|
.map(([key, property]) => {
|
|
344
|
-
const thisPropertyValue = propertyValue && typeof propertyValue === "object" ? getValueInPath(propertyValue, key) : undefined;
|
|
345
379
|
const childResolvedProperty = resolveProperty({
|
|
346
|
-
propertyKey: key,
|
|
380
|
+
propertyKey: propertyKey ? `${propertyKey}.${key}` : undefined,
|
|
347
381
|
propertyOrBuilder: property,
|
|
348
|
-
|
|
382
|
+
ignoreMissingFields,
|
|
349
383
|
...props
|
|
350
384
|
});
|
|
351
385
|
if (!childResolvedProperty) return {};
|
|
@@ -367,7 +401,7 @@ export function resolvePropertyEnum(property: StringProperty | NumberProperty, f
|
|
|
367
401
|
return {
|
|
368
402
|
...property,
|
|
369
403
|
resolved: true,
|
|
370
|
-
enumValues: enumToObjectEntries(property.enumValues)?.filter((value) => value && value.id && value.label) ?? [],
|
|
404
|
+
enumValues: enumToObjectEntries(property.enumValues)?.filter((value) => value && (value.id || value.id === 0) && value.label) ?? [],
|
|
371
405
|
fromBuilder: fromBuilder ?? false
|
|
372
406
|
}
|
|
373
407
|
}
|
|
@@ -397,3 +431,23 @@ export function resolveEntityView(entityView: string | EntityCustomView<any>, co
|
|
|
397
431
|
return entityView;
|
|
398
432
|
}
|
|
399
433
|
}
|
|
434
|
+
|
|
435
|
+
export function resolvedSelectedEntityView<M extends Record<string, any>>(
|
|
436
|
+
customViews: (string | EntityCustomView<M>)[] | undefined,
|
|
437
|
+
customizationController: CustomizationController,
|
|
438
|
+
selectedTab?: string
|
|
439
|
+
) {
|
|
440
|
+
const resolvedEntityViews = customViews ? customViews
|
|
441
|
+
.map(e => resolveEntityView(e, customizationController.entityViews))
|
|
442
|
+
.filter(Boolean) as EntityCustomView[]
|
|
443
|
+
: [];
|
|
444
|
+
|
|
445
|
+
const selectedEntityView = resolvedEntityViews.find(e => e.key === selectedTab);
|
|
446
|
+
const selectedSecondaryForm = customViews
|
|
447
|
+
&& resolvedEntityViews.filter(e => e.includeActions).find(e => e.key === selectedTab);
|
|
448
|
+
return {
|
|
449
|
+
resolvedEntityViews,
|
|
450
|
+
selectedEntityView,
|
|
451
|
+
selectedSecondaryForm
|
|
452
|
+
};
|
|
453
|
+
}
|
package/src/util/storage.ts
CHANGED
|
@@ -1,22 +1,39 @@
|
|
|
1
1
|
import {
|
|
2
|
+
ArrayProperty,
|
|
2
3
|
EntityValues,
|
|
4
|
+
PropertyOrBuilder,
|
|
3
5
|
ResolvedArrayProperty,
|
|
4
6
|
ResolvedStringProperty,
|
|
5
7
|
StorageConfig,
|
|
8
|
+
StringProperty,
|
|
6
9
|
UploadedFileContext
|
|
7
10
|
} from "../types";
|
|
8
11
|
import { randomString } from "./strings";
|
|
9
12
|
|
|
10
|
-
|
|
11
|
-
input: string | ((context: UploadedFileContext) => Promise<string> | string)
|
|
12
|
-
storage: StorageConfig
|
|
13
|
-
values: EntityValues<M
|
|
14
|
-
entityId: string
|
|
15
|
-
path
|
|
13
|
+
interface ResolveFilenameStringParams<M extends object> {
|
|
14
|
+
input: string | ((context: UploadedFileContext) => (Promise<string> | string));
|
|
15
|
+
storage: StorageConfig;
|
|
16
|
+
values: EntityValues<M>;
|
|
17
|
+
entityId: string;
|
|
18
|
+
path?: string;
|
|
16
19
|
property: ResolvedStringProperty | ResolvedArrayProperty<string[]>,
|
|
17
|
-
file: File
|
|
18
|
-
propertyKey: string
|
|
20
|
+
file: File;
|
|
21
|
+
propertyKey: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export async function resolveStorageFilenameString<M extends object>(
|
|
25
|
+
{
|
|
26
|
+
input,
|
|
27
|
+
storage,
|
|
28
|
+
values,
|
|
29
|
+
entityId,
|
|
30
|
+
path,
|
|
31
|
+
property,
|
|
32
|
+
file,
|
|
33
|
+
propertyKey
|
|
34
|
+
}: ResolveFilenameStringParams<M>): Promise<string> {
|
|
19
35
|
let result;
|
|
36
|
+
|
|
20
37
|
if (typeof input === "function") {
|
|
21
38
|
result = await input({
|
|
22
39
|
path,
|
|
@@ -30,7 +47,13 @@ export async function resolveFilenameString<M extends object>(
|
|
|
30
47
|
if (!result)
|
|
31
48
|
console.warn("Storage callback returned empty result. Using default name value")
|
|
32
49
|
} else {
|
|
33
|
-
result = replacePlaceholders(
|
|
50
|
+
result = replacePlaceholders({
|
|
51
|
+
file,
|
|
52
|
+
input,
|
|
53
|
+
entityId,
|
|
54
|
+
propertyKey,
|
|
55
|
+
path
|
|
56
|
+
});
|
|
34
57
|
}
|
|
35
58
|
|
|
36
59
|
if (!result)
|
|
@@ -39,15 +62,28 @@ export async function resolveFilenameString<M extends object>(
|
|
|
39
62
|
return result;
|
|
40
63
|
}
|
|
41
64
|
|
|
65
|
+
interface ResolveStoragePathStringParams<M extends object> {
|
|
66
|
+
input: string | ((context: UploadedFileContext) => string);
|
|
67
|
+
storage: StorageConfig;
|
|
68
|
+
values: EntityValues<M>;
|
|
69
|
+
entityId: string;
|
|
70
|
+
path?: string;
|
|
71
|
+
property: ResolvedStringProperty | ResolvedArrayProperty<string[]>;
|
|
72
|
+
file: File;
|
|
73
|
+
propertyKey: string;
|
|
74
|
+
}
|
|
75
|
+
|
|
42
76
|
export function resolveStoragePathString<M extends object>(
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
77
|
+
{
|
|
78
|
+
input,
|
|
79
|
+
storage,
|
|
80
|
+
values,
|
|
81
|
+
entityId,
|
|
82
|
+
path,
|
|
83
|
+
property,
|
|
84
|
+
file,
|
|
85
|
+
propertyKey
|
|
86
|
+
}: ResolveStoragePathStringParams<M>): string {
|
|
51
87
|
let result;
|
|
52
88
|
if (typeof input === "function") {
|
|
53
89
|
result = input({
|
|
@@ -62,7 +98,13 @@ export function resolveStoragePathString<M extends object>(
|
|
|
62
98
|
if (!result)
|
|
63
99
|
console.warn("Storage callback returned empty result. Using default name value")
|
|
64
100
|
} else {
|
|
65
|
-
result = replacePlaceholders(
|
|
101
|
+
result = replacePlaceholders({
|
|
102
|
+
file,
|
|
103
|
+
input,
|
|
104
|
+
entityId,
|
|
105
|
+
propertyKey,
|
|
106
|
+
path
|
|
107
|
+
});
|
|
66
108
|
}
|
|
67
109
|
|
|
68
110
|
if (!result)
|
|
@@ -71,14 +113,30 @@ export function resolveStoragePathString<M extends object>(
|
|
|
71
113
|
return result;
|
|
72
114
|
}
|
|
73
115
|
|
|
74
|
-
|
|
116
|
+
interface Placeholders {
|
|
117
|
+
file: File;
|
|
118
|
+
input: string;
|
|
119
|
+
entityId: string;
|
|
120
|
+
propertyKey: string;
|
|
121
|
+
path?: string;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function replacePlaceholders({
|
|
125
|
+
file,
|
|
126
|
+
input,
|
|
127
|
+
entityId,
|
|
128
|
+
propertyKey,
|
|
129
|
+
path
|
|
130
|
+
}: Placeholders) {
|
|
75
131
|
const ext = file.name.split(".").pop();
|
|
76
132
|
let result = input.replace("{entityId}", entityId)
|
|
77
133
|
.replace("{propertyKey}", propertyKey)
|
|
78
134
|
.replace("{rand}", randomString())
|
|
79
135
|
.replace("{file}", file.name)
|
|
80
|
-
.replace("{file.type}", file.type)
|
|
81
|
-
|
|
136
|
+
.replace("{file.type}", file.type);
|
|
137
|
+
if (path) {
|
|
138
|
+
result = result.replace("{path}", path);
|
|
139
|
+
}
|
|
82
140
|
if (ext) {
|
|
83
141
|
result = result.replace("{file.ext}", ext);
|
|
84
142
|
const name = file.name.replace(`.${ext}`, "");
|
package/src/util/strings.ts
CHANGED
|
@@ -56,8 +56,8 @@ export function unslugify(slug?: string): string {
|
|
|
56
56
|
const result = slug.replace(/[-_]/g, " ");
|
|
57
57
|
return result.replace(/\w\S*/g, function (txt) {
|
|
58
58
|
return txt.charAt(0).toUpperCase() + txt.substr(1);
|
|
59
|
-
});
|
|
59
|
+
}).trim();
|
|
60
60
|
} else {
|
|
61
|
-
return slug;
|
|
61
|
+
return slug.trim();
|
|
62
62
|
}
|
|
63
63
|
}
|
|
@@ -2,9 +2,11 @@ import Resizer from "react-image-file-resizer";
|
|
|
2
2
|
import equal from "react-fast-compare";
|
|
3
3
|
|
|
4
4
|
import {
|
|
5
|
+
ArrayProperty,
|
|
5
6
|
EntityValues,
|
|
6
7
|
ImageCompression,
|
|
7
8
|
Property,
|
|
9
|
+
PropertyOrBuilder,
|
|
8
10
|
ResolvedArrayProperty,
|
|
9
11
|
ResolvedStringProperty,
|
|
10
12
|
StorageConfig,
|
|
@@ -14,7 +16,8 @@ import {
|
|
|
14
16
|
import { useCallback, useEffect, useState } from "react";
|
|
15
17
|
import { PreviewSize } from "../preview";
|
|
16
18
|
import { randomString } from "./strings";
|
|
17
|
-
import {
|
|
19
|
+
import { resolveStorageFilenameString, resolveStoragePathString } from "./storage";
|
|
20
|
+
import { resolveProperty } from "./resolutions";
|
|
18
21
|
|
|
19
22
|
/**
|
|
20
23
|
* Internal representation of an item in the storage
|
|
@@ -31,6 +34,7 @@ export interface StorageFieldItem {
|
|
|
31
34
|
size: PreviewSize
|
|
32
35
|
}
|
|
33
36
|
|
|
37
|
+
|
|
34
38
|
export function useStorageUploadController<M extends object>({
|
|
35
39
|
entityId,
|
|
36
40
|
entityValues,
|
|
@@ -42,17 +46,17 @@ export function useStorageUploadController<M extends object>({
|
|
|
42
46
|
disabled,
|
|
43
47
|
onChange
|
|
44
48
|
}:
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
49
|
+
{
|
|
50
|
+
entityId: string,
|
|
51
|
+
entityValues: EntityValues<M>,
|
|
52
|
+
value: string | string[] | null;
|
|
53
|
+
path?: string,
|
|
54
|
+
propertyKey: string,
|
|
55
|
+
property: StringProperty | ArrayProperty<string[]> | ResolvedStringProperty | ResolvedArrayProperty<string[]>,
|
|
56
|
+
storageSource: StorageSource,
|
|
57
|
+
disabled: boolean,
|
|
58
|
+
onChange: (value: string | string[] | null) => void
|
|
59
|
+
}) {
|
|
56
60
|
|
|
57
61
|
const storage: StorageConfig | undefined = property.dataType === "string"
|
|
58
62
|
? property.storage
|
|
@@ -67,21 +71,12 @@ export function useStorageUploadController<M extends object>({
|
|
|
67
71
|
throw Error("Storage meta must be specified");
|
|
68
72
|
|
|
69
73
|
const metadata: Record<string, any> | undefined = storage?.metadata;
|
|
70
|
-
const size = multipleFilesSupported ? "
|
|
74
|
+
const size = multipleFilesSupported ? "medium" : "large";
|
|
71
75
|
|
|
72
76
|
const compression: ImageCompression | undefined = storage?.imageCompression;
|
|
73
77
|
|
|
74
78
|
const internalInitialValue: StorageFieldItem[] =
|
|
75
|
-
(multipleFilesSupported
|
|
76
|
-
? (value ?? []) as string[]
|
|
77
|
-
: value ? [value as string] : []).map(entry => (
|
|
78
|
-
{
|
|
79
|
-
id: getRandomId(),
|
|
80
|
-
storagePathOrDownloadUrl: entry,
|
|
81
|
-
metadata,
|
|
82
|
-
size
|
|
83
|
-
}
|
|
84
|
-
));
|
|
79
|
+
getInternalInitialValue(multipleFilesSupported, value, metadata, size);
|
|
85
80
|
|
|
86
81
|
const [initialValue, setInitialValue] = useState<string | string[] | null>(value);
|
|
87
82
|
const [internalValue, setInternalValue] = useState<StorageFieldItem[]>(internalInitialValue);
|
|
@@ -93,20 +88,43 @@ export function useStorageUploadController<M extends object>({
|
|
|
93
88
|
}
|
|
94
89
|
}, [internalInitialValue, value, initialValue]);
|
|
95
90
|
|
|
91
|
+
const resolvedProperty = resolveProperty({
|
|
92
|
+
propertyOrBuilder: property as PropertyOrBuilder,
|
|
93
|
+
values: entityValues
|
|
94
|
+
}) as ResolvedStringProperty | ResolvedArrayProperty<string[]>;
|
|
95
|
+
|
|
96
96
|
const fileNameBuilder = useCallback(async (file: File) => {
|
|
97
97
|
if (storage.fileName) {
|
|
98
|
-
const fileName = await
|
|
98
|
+
const fileName = await resolveStorageFilenameString({
|
|
99
|
+
input: storage.fileName,
|
|
100
|
+
storage,
|
|
101
|
+
values: entityValues,
|
|
102
|
+
entityId,
|
|
103
|
+
path,
|
|
104
|
+
property: resolvedProperty,
|
|
105
|
+
file,
|
|
106
|
+
propertyKey
|
|
107
|
+
});
|
|
99
108
|
if (!fileName || fileName.length === 0) {
|
|
100
109
|
throw Error("You need to return a valid filename");
|
|
101
110
|
}
|
|
102
111
|
return fileName;
|
|
103
112
|
}
|
|
104
113
|
return randomString() + "_" + file.name;
|
|
105
|
-
}, [entityId, entityValues, path,
|
|
114
|
+
}, [entityId, entityValues, path, resolvedProperty, propertyKey, storage]);
|
|
106
115
|
|
|
107
116
|
const storagePathBuilder = useCallback((file: File) => {
|
|
108
|
-
return resolveStoragePathString(
|
|
109
|
-
|
|
117
|
+
return resolveStoragePathString({
|
|
118
|
+
input: storage.storagePath,
|
|
119
|
+
storage,
|
|
120
|
+
values: entityValues,
|
|
121
|
+
entityId,
|
|
122
|
+
path,
|
|
123
|
+
property: resolvedProperty,
|
|
124
|
+
file,
|
|
125
|
+
propertyKey
|
|
126
|
+
}) ?? "/";
|
|
127
|
+
}, [entityId, entityValues, path, resolvedProperty, propertyKey, storage]);
|
|
110
128
|
|
|
111
129
|
const onFileUploadComplete = useCallback(async (uploadedPath: string,
|
|
112
130
|
entry: StorageFieldItem,
|
|
@@ -200,6 +218,32 @@ export function useStorageUploadController<M extends object>({
|
|
|
200
218
|
}
|
|
201
219
|
}
|
|
202
220
|
|
|
221
|
+
function getInternalInitialValue(multipleFilesSupported: boolean,
|
|
222
|
+
value: string | string[] | null,
|
|
223
|
+
metadata: Record<string, any> | undefined,
|
|
224
|
+
size: PreviewSize): StorageFieldItem[] {
|
|
225
|
+
let strings: string[] = [];
|
|
226
|
+
if (multipleFilesSupported) {
|
|
227
|
+
if (Array.isArray(value) && value.every((v) => typeof v === "string")) {
|
|
228
|
+
strings = (value ?? []) as string[];
|
|
229
|
+
}
|
|
230
|
+
} else {
|
|
231
|
+
if (typeof value === "string") {
|
|
232
|
+
strings = value ? [value as string] : [];
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
return strings
|
|
237
|
+
.map(entry => (
|
|
238
|
+
{
|
|
239
|
+
id: getRandomId(),
|
|
240
|
+
storagePathOrDownloadUrl: entry,
|
|
241
|
+
metadata,
|
|
242
|
+
size
|
|
243
|
+
}
|
|
244
|
+
));
|
|
245
|
+
}
|
|
246
|
+
|
|
203
247
|
function removeDuplicates(items: StorageFieldItem[]) {
|
|
204
248
|
return items.filter(
|
|
205
249
|
(item, i) => {
|