@firecms/core 3.0.0 → 3.1.0-canary.02232f4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/components/AIIcon.d.ts +16 -0
- package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +7 -1
- package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +1 -1
- package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +14 -0
- package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +6 -0
- package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +5 -4
- package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +6 -0
- package/dist/components/EntityCollectionTable/internal/popup_field/useDraggable.d.ts +2 -2
- package/dist/components/EntityCollectionView/Board.d.ts +2 -0
- package/dist/components/EntityCollectionView/BoardColumn.d.ts +42 -0
- package/dist/components/EntityCollectionView/BoardColumnTitle.d.ts +9 -0
- package/dist/components/EntityCollectionView/BoardSortableList.d.ts +14 -0
- package/dist/components/EntityCollectionView/CollectionDataErrorBanner.d.ts +4 -0
- package/dist/components/EntityCollectionView/EntityBoardCard.d.ts +26 -0
- package/dist/components/EntityCollectionView/EntityCard.d.ts +19 -0
- package/dist/components/EntityCollectionView/EntityCollectionBoardView.d.ts +20 -0
- package/dist/components/EntityCollectionView/EntityCollectionCardView.d.ts +31 -0
- package/dist/components/EntityCollectionView/EntityCollectionViewActions.d.ts +2 -2
- package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +7 -3
- package/dist/components/EntityCollectionView/FiltersDialog.d.ts +14 -0
- package/dist/components/EntityCollectionView/ViewModeToggle.d.ts +44 -0
- package/dist/components/EntityCollectionView/board_types.d.ts +105 -0
- package/dist/components/EntityCollectionView/useBoardDataController.d.ts +60 -0
- package/dist/components/ErrorBoundary.d.ts +4 -2
- package/dist/components/HomePage/DefaultHomePage.d.ts +0 -1
- package/dist/components/LanguageToggle.d.ts +1 -0
- package/dist/components/SelectableTable/SelectableTable.d.ts +5 -1
- package/dist/components/SelectableTable/filters/DateTimeFilterField.d.ts +2 -1
- package/dist/components/UnsavedChangesDialog.d.ts +1 -0
- package/dist/components/VirtualTable/VirtualTable.performance.test.d.ts +1 -0
- package/dist/components/VirtualTable/VirtualTableCell.d.ts +6 -0
- package/dist/components/VirtualTable/VirtualTableHeader.d.ts +4 -1
- package/dist/components/VirtualTable/VirtualTableHeaderRow.d.ts +1 -1
- package/dist/components/VirtualTable/VirtualTableProps.d.ts +17 -1
- package/dist/components/VirtualTable/fields/VirtualTableDateField.d.ts +1 -0
- package/dist/components/VirtualTable/types.d.ts +3 -0
- package/dist/components/index.d.ts +4 -0
- package/dist/contexts/index.d.ts +10 -0
- package/dist/core/DrawerNavigationGroup.d.ts +45 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/editor/components/SlashCommandMenu.d.ts +6 -0
- package/dist/editor/components/editor-bubble-item.d.ts +8 -0
- package/dist/editor/components/editor-bubble.d.ts +8 -0
- package/dist/editor/components/image-bubble.d.ts +5 -0
- package/dist/editor/components/index.d.ts +16 -0
- package/dist/editor/components/table-bubble.d.ts +5 -0
- package/dist/editor/editor.d.ts +30 -0
- package/dist/editor/extensions/HighlightDecorationExtension.d.ts +24 -0
- package/dist/editor/extensions/Image/index.d.ts +6 -0
- package/dist/editor/extensions/Image.d.ts +6 -0
- package/dist/editor/extensions/TextLoadingDecorationExtension.d.ts +16 -0
- package/dist/editor/extensions/clipboard.d.ts +7 -0
- package/dist/editor/extensions/custom-keymap.d.ts +1 -0
- package/dist/editor/extensions/drag-and-drop.d.ts +9 -0
- package/dist/editor/hooks/useProseMirror.d.ts +13 -0
- package/dist/editor/hooks/useProseMirrorContext.d.ts +9 -0
- package/dist/editor/index.d.ts +2 -0
- package/dist/editor/markdown.d.ts +5 -0
- package/dist/editor/nodeViews/ImageComponent.d.ts +3 -0
- package/dist/editor/nodeViews/ReactNodeView.d.ts +29 -0
- package/dist/editor/nodeViews/TaskItemComponent.d.ts +3 -0
- package/dist/editor/nodeViews/index.d.ts +6 -0
- package/dist/editor/plugins/index.d.ts +2 -0
- package/dist/editor/plugins/inputrules.d.ts +6 -0
- package/dist/editor/plugins/placeholderPlugin.d.ts +3 -0
- package/dist/editor/plugins/slashCommandPlugin.d.ts +12 -0
- package/dist/editor/schema.d.ts +2 -0
- package/dist/editor/selectors/ai-selector.d.ts +0 -0
- package/dist/editor/selectors/color-selector.d.ts +10 -0
- package/dist/editor/selectors/link-selector.d.ts +8 -0
- package/dist/editor/selectors/node-selector.d.ts +15 -0
- package/dist/editor/selectors/text-buttons.d.ts +1 -0
- package/dist/editor/types.d.ts +5 -0
- package/dist/editor/useProseMirror.d.ts +16 -0
- package/dist/editor/utils/prosemirror-utils.d.ts +6 -0
- package/dist/editor/utils/remove_classes.d.ts +1 -0
- package/dist/editor/utils/useDebouncedCallback.d.ts +1 -0
- package/dist/form/components/ErrorFocus.d.ts +1 -1
- package/dist/form/components/LocalChangesMenu.d.ts +2 -2
- package/dist/form/components/StorageUploadProgress.d.ts +1 -1
- package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +1 -1
- package/dist/form/validation.d.ts +3 -2
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/useBreadcrumbsController.d.ts +16 -0
- package/dist/hooks/useBuildNavigationController.d.ts +0 -1
- package/dist/hooks/useCollapsedGroups.d.ts +6 -3
- package/dist/hooks/useTranslation.d.ts +17 -0
- package/dist/i18n/FireCMSi18nProvider.d.ts +33 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.es.js +31028 -16080
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +29955 -15028
- package/dist/index.umd.js.map +1 -1
- package/dist/internal/useRestoreScroll.d.ts +1 -1
- package/dist/locales/de.d.ts +2 -0
- package/dist/locales/en.d.ts +10 -0
- package/dist/locales/es.d.ts +10 -0
- package/dist/locales/fr.d.ts +2 -0
- package/dist/locales/hi.d.ts +2 -0
- package/dist/locales/it.d.ts +2 -0
- package/dist/locales/pt.d.ts +7 -0
- package/dist/preview/PropertyPreviewProps.d.ts +5 -0
- package/dist/preview/components/DatePreview.d.ts +13 -3
- package/dist/preview/components/ImagePreview.d.ts +5 -1
- package/dist/preview/components/StorageThumbnail.d.ts +2 -1
- package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
- package/dist/preview/property_previews/ArrayOfStorageComponentsPreview.d.ts +1 -1
- package/dist/preview/property_previews/ArrayOfStringsPreview.d.ts +1 -1
- package/dist/preview/property_previews/SkeletonPropertyComponent.d.ts +1 -1
- package/dist/types/analytics.d.ts +1 -1
- package/dist/types/collections.d.ts +88 -2
- package/dist/types/customization_controller.d.ts +2 -1
- package/dist/types/datasource.d.ts +0 -1
- package/dist/types/entities.d.ts +1 -0
- package/dist/types/firecms.d.ts +2 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/navigation.d.ts +2 -2
- package/dist/types/plugins.d.ts +69 -1
- package/dist/types/properties.d.ts +277 -12
- package/dist/types/storage.d.ts +9 -0
- package/dist/types/translations.d.ts +669 -0
- package/dist/util/__tests__/conditions.test.d.ts +1 -0
- package/dist/util/__tests__/objects.test.d.ts +1 -0
- package/dist/util/conditions.d.ts +26 -0
- package/dist/util/entities.d.ts +2 -3
- package/dist/util/index.d.ts +3 -1
- package/dist/util/lazy_eager.d.ts +7 -0
- package/dist/util/objects.d.ts +1 -0
- package/dist/util/property_utils.d.ts +2 -1
- package/dist/util/resolutions.d.ts +3 -3
- package/dist/util/useStorageUploadController.d.ts +11 -2
- package/package.json +52 -12
- package/src/app/Scaffold.tsx +20 -19
- package/src/components/AIIcon.tsx +41 -0
- package/src/components/ArrayContainer.tsx +7 -8
- package/src/components/ClearFilterSortButton.tsx +25 -19
- package/src/components/ConfirmationDialog.tsx +4 -4
- package/src/components/DeleteEntityDialog.tsx +12 -11
- package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +82 -43
- package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +130 -79
- package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +121 -104
- package/src/components/EntityCollectionTable/PropertyTableCell.tsx +132 -103
- package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +6 -3
- package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +24 -44
- package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +90 -49
- package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +1 -1
- package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +3 -2
- package/src/components/EntityCollectionTable/internal/popup_field/useDraggable.tsx +11 -11
- package/src/components/EntityCollectionView/Board.tsx +324 -0
- package/src/components/EntityCollectionView/BoardColumn.tsx +158 -0
- package/src/components/EntityCollectionView/BoardColumnTitle.tsx +45 -0
- package/src/components/EntityCollectionView/BoardSortableList.tsx +174 -0
- package/src/components/EntityCollectionView/CollectionDataErrorBanner.tsx +43 -0
- package/src/components/EntityCollectionView/EntityBoardCard.tsx +212 -0
- package/src/components/EntityCollectionView/EntityCard.tsx +235 -0
- package/src/components/EntityCollectionView/EntityCollectionBoardView.tsx +706 -0
- package/src/components/EntityCollectionView/EntityCollectionCardView.tsx +236 -0
- package/src/components/EntityCollectionView/EntityCollectionView.tsx +531 -209
- package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +35 -22
- package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +86 -15
- package/src/components/EntityCollectionView/FiltersDialog.tsx +252 -0
- package/src/components/EntityCollectionView/ViewModeToggle.tsx +202 -0
- package/src/components/EntityCollectionView/board_types.ts +113 -0
- package/src/components/EntityCollectionView/useBoardDataController.tsx +490 -0
- package/src/components/EntityJsonPreview.tsx +2 -1
- package/src/components/EntityPreview.tsx +1 -1
- package/src/components/EntityView.tsx +3 -2
- package/src/components/ErrorBoundary.tsx +27 -15
- package/src/components/ErrorTooltip.tsx +2 -1
- package/src/components/HomePage/DefaultHomePage.tsx +65 -22
- package/src/components/HomePage/HomePageDnD.tsx +59 -42
- package/src/components/HomePage/NavigationCard.tsx +20 -18
- package/src/components/HomePage/NavigationGroup.tsx +20 -17
- package/src/components/HomePage/RenameGroupDialog.tsx +15 -15
- package/src/components/HomePage/SmallNavigationCard.tsx +10 -9
- package/src/components/LanguageToggle.tsx +66 -0
- package/src/components/NotFoundPage.tsx +5 -3
- package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +12 -17
- package/src/components/ReferenceWidget.tsx +5 -6
- package/src/components/SearchIconsView.tsx +3 -1
- package/src/components/SelectableTable/SelectableTable.tsx +75 -67
- package/src/components/SelectableTable/filters/BooleanFilterField.tsx +7 -6
- package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +50 -40
- package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +53 -40
- package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +60 -58
- package/src/components/UnsavedChangesDialog.tsx +6 -6
- package/src/components/UserDisplay.tsx +4 -4
- package/src/components/VirtualTable/VirtualTable.performance.test.tsx +387 -0
- package/src/components/VirtualTable/VirtualTable.tsx +277 -121
- package/src/components/VirtualTable/VirtualTableCell.tsx +18 -2
- package/src/components/VirtualTable/VirtualTableHeader.tsx +76 -64
- package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +163 -42
- package/src/components/VirtualTable/VirtualTableProps.tsx +21 -2
- package/src/components/VirtualTable/VirtualTableRow.tsx +1 -1
- package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +3 -0
- package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +19 -6
- package/src/components/VirtualTable/types.tsx +3 -0
- package/src/components/common/default_entity_actions.tsx +4 -0
- package/src/components/common/useColumnsIds.tsx +95 -3
- package/src/components/common/useDataSourceTableController.tsx +12 -4
- package/src/components/index.tsx +5 -0
- package/src/contexts/BreacrumbsContext.tsx +15 -8
- package/src/contexts/index.ts +10 -0
- package/src/core/DefaultAppBar.tsx +49 -32
- package/src/core/DefaultDrawer.tsx +49 -57
- package/src/core/DrawerNavigationGroup.tsx +120 -0
- package/src/core/DrawerNavigationItem.tsx +4 -3
- package/src/core/EntityEditView.tsx +94 -50
- package/src/core/EntityEditViewFormActions.tsx +24 -17
- package/src/core/EntitySidePanel.tsx +34 -30
- package/src/core/FireCMS.tsx +33 -6
- package/src/core/SideDialogs.tsx +4 -2
- package/src/core/field_configs.tsx +18 -11
- package/src/core/index.tsx +1 -0
- package/src/editor/components/SlashCommandMenu.tsx +516 -0
- package/src/editor/components/editor-bubble-item.tsx +32 -0
- package/src/editor/components/editor-bubble.tsx +118 -0
- package/src/editor/components/image-bubble.tsx +156 -0
- package/src/editor/components/index.ts +14 -0
- package/src/editor/components/table-bubble.tsx +165 -0
- package/src/editor/editor.tsx +455 -0
- package/src/editor/extensions/HighlightDecorationExtension.ts +114 -0
- package/src/editor/extensions/Image/index.ts +133 -0
- package/src/editor/extensions/Image.ts +159 -0
- package/src/editor/extensions/TextLoadingDecorationExtension.tsx +107 -0
- package/src/editor/extensions/clipboard.ts +72 -0
- package/src/editor/extensions/custom-keymap.ts +24 -0
- package/src/editor/extensions/drag-and-drop.tsx +480 -0
- package/src/editor/hooks/useProseMirror.ts +124 -0
- package/src/editor/hooks/useProseMirrorContext.ts +15 -0
- package/src/editor/index.ts +2 -0
- package/src/editor/markdown.ts +172 -0
- package/src/editor/nodeViews/ImageComponent.tsx +20 -0
- package/src/editor/nodeViews/ReactNodeView.tsx +89 -0
- package/src/editor/nodeViews/TaskItemComponent.tsx +29 -0
- package/src/editor/nodeViews/index.ts +35 -0
- package/src/editor/plugins/index.ts +58 -0
- package/src/editor/plugins/inputrules.ts +82 -0
- package/src/editor/plugins/placeholderPlugin.ts +55 -0
- package/src/editor/plugins/slashCommandPlugin.ts +61 -0
- package/src/editor/schema.ts +240 -0
- package/src/editor/selectors/ai-selector.tsx +111 -0
- package/src/editor/selectors/color-selector.tsx +200 -0
- package/src/editor/selectors/link-selector.tsx +118 -0
- package/src/editor/selectors/node-selector.tsx +157 -0
- package/src/editor/selectors/text-buttons.tsx +86 -0
- package/src/editor/types.ts +6 -0
- package/src/editor/useProseMirror.ts +126 -0
- package/src/editor/utils/prosemirror-utils.ts +108 -0
- package/src/editor/utils/remove_classes.ts +17 -0
- package/src/editor/utils/useDebouncedCallback.ts +25 -0
- package/src/form/EntityForm.tsx +150 -75
- package/src/form/EntityFormActions.tsx +19 -12
- package/src/form/PropertyFieldBinding.tsx +68 -51
- package/src/form/components/ErrorFocus.tsx +3 -3
- package/src/form/components/LocalChangesMenu.tsx +19 -19
- package/src/form/components/StorageItemPreview.tsx +5 -3
- package/src/form/components/StorageUploadProgress.tsx +22 -6
- package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +18 -5
- package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +22 -10
- package/src/form/field_bindings/BlockFieldBinding.tsx +26 -9
- package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -17
- package/src/form/field_bindings/KeyValueFieldBinding.tsx +46 -25
- package/src/form/field_bindings/MapFieldBinding.tsx +88 -70
- package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +93 -52
- package/src/form/field_bindings/MultiSelectFieldBinding.tsx +15 -1
- package/src/form/field_bindings/ReferenceAsStringFieldBinding.tsx +25 -11
- package/src/form/field_bindings/ReferenceFieldBinding.tsx +25 -11
- package/src/form/field_bindings/RepeatFieldBinding.tsx +21 -6
- package/src/form/field_bindings/SelectFieldBinding.tsx +7 -5
- package/src/form/field_bindings/StorageUploadFieldBinding.tsx +110 -92
- package/src/form/field_bindings/SwitchFieldBinding.tsx +31 -14
- package/src/form/field_bindings/TextFieldBinding.tsx +77 -38
- package/src/form/field_bindings/UserSelectFieldBinding.tsx +7 -5
- package/src/form/validation.ts +245 -160
- package/src/hooks/index.tsx +1 -0
- package/src/hooks/useBreadcrumbsController.tsx +18 -0
- package/src/hooks/useBuildNavigationController.tsx +91 -41
- package/src/hooks/useCollapsedGroups.ts +18 -9
- package/src/hooks/useTranslation.ts +31 -0
- package/src/hooks/useValidateAuthenticator.tsx +1 -1
- package/src/i18n/FireCMSi18nProvider.tsx +160 -0
- package/src/index.ts +5 -0
- package/src/internal/useBuildDataSource.ts +68 -34
- package/src/internal/useBuildSideDialogsController.tsx +11 -8
- package/src/internal/useBuildSideEntityController.tsx +24 -24
- package/src/internal/useRestoreScroll.tsx +26 -14
- package/src/locales/de.ts +718 -0
- package/src/locales/en.ts +730 -0
- package/src/locales/es.ts +730 -0
- package/src/locales/fr.ts +718 -0
- package/src/locales/hi.ts +718 -0
- package/src/locales/it.ts +718 -0
- package/src/locales/pt.ts +727 -0
- package/src/preview/PropertyPreview.tsx +43 -33
- package/src/preview/PropertyPreviewProps.tsx +6 -0
- package/src/preview/components/DatePreview.tsx +72 -4
- package/src/preview/components/EmptyValue.tsx +1 -1
- package/src/preview/components/ImagePreview.tsx +37 -21
- package/src/preview/components/ReferencePreview.tsx +8 -2
- package/src/preview/components/StorageThumbnail.tsx +16 -12
- package/src/preview/components/UrlComponentPreview.tsx +32 -27
- package/src/preview/components/UserPreview.tsx +3 -1
- package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +9 -7
- package/src/preview/property_previews/ArrayOfStringsPreview.tsx +11 -9
- package/src/preview/property_previews/ArrayPropertyPreview.tsx +26 -24
- package/src/preview/property_previews/MapPropertyPreview.tsx +49 -27
- package/src/preview/property_previews/SkeletonPropertyComponent.tsx +61 -56
- package/src/routes/CustomCMSRoute.tsx +1 -0
- package/src/routes/FireCMSRoute.tsx +87 -65
- package/src/types/analytics.ts +10 -0
- package/src/types/collections.ts +97 -3
- package/src/types/customization_controller.tsx +2 -1
- package/src/types/datasource.ts +54 -56
- package/src/types/entities.ts +10 -0
- package/src/types/firecms.tsx +2 -1
- package/src/types/index.ts +1 -0
- package/src/types/navigation.ts +2 -2
- package/src/types/plugins.tsx +77 -1
- package/src/types/properties.ts +369 -37
- package/src/types/storage.ts +11 -1
- package/src/types/translations.ts +752 -0
- package/src/util/__tests__/conditions.test.ts +506 -0
- package/src/util/__tests__/objects.test.ts +196 -0
- package/src/util/callbacks.ts +6 -3
- package/src/util/collections.ts +51 -6
- package/src/util/conditions.ts +339 -0
- package/src/util/entities.ts +29 -30
- package/src/util/entity_cache.ts +2 -1
- package/src/util/index.ts +3 -1
- package/src/util/join_collections.ts +10 -8
- package/src/util/lazy_eager.tsx +33 -0
- package/src/util/objects.ts +46 -13
- package/src/util/{references.ts → previews.ts} +16 -2
- package/src/util/property_utils.tsx +37 -11
- package/src/util/resolutions.ts +62 -58
- package/src/util/useStorageUploadController.tsx +34 -30
- /package/dist/util/{references.d.ts → previews.d.ts} +0 -0
|
@@ -17,10 +17,10 @@ import {
|
|
|
17
17
|
import { ReadOnlyFieldBinding } from "./field_bindings/ReadOnlyFieldBinding";
|
|
18
18
|
|
|
19
19
|
import { isHidden, isPropertyBuilder, isReadOnly, resolveProperty } from "../util";
|
|
20
|
-
import { useAuthController, useCustomizationController } from "../hooks";
|
|
20
|
+
import { useAuthController, useCustomizationController, useTranslation } from "../hooks";
|
|
21
21
|
import { Typography } from "@firecms/ui";
|
|
22
22
|
import { getFieldConfig, getFieldId } from "../core";
|
|
23
|
-
import { ErrorBoundary } from "../components";
|
|
23
|
+
import { ErrorBoundary, CircularProgressCenter } from "../components";
|
|
24
24
|
|
|
25
25
|
/**
|
|
26
26
|
* This component renders a form field creating the corresponding configuration
|
|
@@ -75,21 +75,21 @@ export const PropertyFieldBinding = React.memo(PropertyFieldBindingInternal, (a:
|
|
|
75
75
|
}) as typeof PropertyFieldBindingInternal;
|
|
76
76
|
|
|
77
77
|
function PropertyFieldBindingInternal<T extends CMSType = CMSType, M extends Record<string, any> = any>
|
|
78
|
-
({
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
78
|
+
({
|
|
79
|
+
propertyKey,
|
|
80
|
+
property,
|
|
81
|
+
context,
|
|
82
|
+
includeDescription,
|
|
83
|
+
underlyingValueHasChanged,
|
|
84
|
+
disabled: disabledProp,
|
|
85
|
+
partOfArray,
|
|
86
|
+
partOfBlock,
|
|
87
|
+
minimalistView,
|
|
88
|
+
autoFocus,
|
|
89
|
+
index,
|
|
90
|
+
size,
|
|
91
|
+
onPropertyChange,
|
|
92
|
+
}: PropertyFieldBindingProps<T, M>): ReactElement<PropertyFieldBindingProps<T, M>> {
|
|
93
93
|
|
|
94
94
|
const authController = useAuthController();
|
|
95
95
|
const customizationController = useCustomizationController();
|
|
@@ -137,7 +137,7 @@ function PropertyFieldBindingInternal<T extends CMSType = CMSType, M extends Rec
|
|
|
137
137
|
}
|
|
138
138
|
const configProperty = resolveProperty({
|
|
139
139
|
propertyKey,
|
|
140
|
-
propertyOrBuilder: propertyConfig.property,
|
|
140
|
+
propertyOrBuilder: propertyConfig.property as any,
|
|
141
141
|
values: fieldProps.form.values,
|
|
142
142
|
path: context.path,
|
|
143
143
|
entityId: context.entityId,
|
|
@@ -145,7 +145,7 @@ function PropertyFieldBindingInternal<T extends CMSType = CMSType, M extends Rec
|
|
|
145
145
|
index,
|
|
146
146
|
authController
|
|
147
147
|
});
|
|
148
|
-
Component = configProperty
|
|
148
|
+
Component = configProperty?.Field as ComponentType<FieldProps<T>> | undefined;
|
|
149
149
|
}
|
|
150
150
|
if (!Component) {
|
|
151
151
|
console.warn(`No field component found for property ${propertyKey}`);
|
|
@@ -175,7 +175,7 @@ function PropertyFieldBindingInternal<T extends CMSType = CMSType, M extends Rec
|
|
|
175
175
|
return <FieldInternal
|
|
176
176
|
Component={Component as ComponentType<FieldProps>}
|
|
177
177
|
componentProps={componentProps}
|
|
178
|
-
formexFieldProps={fieldProps}/>;
|
|
178
|
+
formexFieldProps={fieldProps} />;
|
|
179
179
|
}}
|
|
180
180
|
</Field>
|
|
181
181
|
);
|
|
@@ -185,39 +185,55 @@ function PropertyFieldBindingInternal<T extends CMSType = CMSType, M extends Rec
|
|
|
185
185
|
type ResolvedPropertyFieldBindingProps<T extends CMSType = CMSType, M extends Record<string, any> = any> =
|
|
186
186
|
Omit<PropertyFieldBindingProps<T, M>, "property">
|
|
187
187
|
& {
|
|
188
|
-
|
|
189
|
-
};
|
|
188
|
+
property: ResolvedProperty<T>
|
|
189
|
+
};
|
|
190
190
|
|
|
191
191
|
function FieldInternal<T extends CMSType, CustomProps, M extends Record<string, any>>
|
|
192
|
-
({
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
192
|
+
({
|
|
193
|
+
Component,
|
|
194
|
+
componentProps: {
|
|
195
|
+
propertyKey,
|
|
196
|
+
property,
|
|
197
|
+
includeDescription,
|
|
198
|
+
underlyingValueHasChanged,
|
|
199
|
+
partOfArray,
|
|
200
|
+
partOfBlock,
|
|
201
|
+
minimalistView,
|
|
202
|
+
autoFocus,
|
|
203
|
+
context,
|
|
204
|
+
disabled,
|
|
205
|
+
size,
|
|
206
|
+
onPropertyChange
|
|
207
|
+
},
|
|
208
|
+
formexFieldProps
|
|
209
|
+
}:
|
|
210
|
+
{
|
|
211
|
+
Component: ComponentType<FieldProps<T, any, M>>,
|
|
212
|
+
componentProps: ResolvedPropertyFieldBindingProps<T, M>,
|
|
213
|
+
formexFieldProps: FormexFieldProps<T, any>
|
|
214
|
+
}) {
|
|
215
|
+
|
|
216
|
+
const { t } = useTranslation();
|
|
216
217
|
const { plugins } = useCustomizationController();
|
|
217
218
|
|
|
218
219
|
const customFieldProps: any = property.customProps;
|
|
219
220
|
const value = formexFieldProps.field.value;
|
|
220
|
-
|
|
221
|
+
|
|
222
|
+
// Get error for this field path, but avoid string indexing issues
|
|
223
|
+
// When an array has a string error like "Tags should have unique values",
|
|
224
|
+
// accessing errors["tags"]["0"] returns "T" (string indexing).
|
|
225
|
+
// We traverse the path manually and stop if we hit a string.
|
|
226
|
+
let error: any = formexFieldProps.form.errors;
|
|
227
|
+
for (const part of propertyKey.split(".")) {
|
|
228
|
+
if (error === undefined || error === null) break;
|
|
229
|
+
if (typeof error === "string") {
|
|
230
|
+
// Parent is a string error, children shouldn't inherit individual characters
|
|
231
|
+
error = undefined;
|
|
232
|
+
break;
|
|
233
|
+
}
|
|
234
|
+
error = error[part];
|
|
235
|
+
}
|
|
236
|
+
|
|
221
237
|
const touched = getIn(formexFieldProps.form.touched, propertyKey);
|
|
222
238
|
|
|
223
239
|
const showError: boolean = error &&
|
|
@@ -271,12 +287,13 @@ function FieldInternal<T extends CMSType, CustomProps, M extends Record<string,
|
|
|
271
287
|
|
|
272
288
|
return (
|
|
273
289
|
<ErrorBoundary>
|
|
274
|
-
|
|
275
|
-
|
|
290
|
+
<React.Suspense fallback={<CircularProgressCenter />}>
|
|
291
|
+
<UsedComponent {...cmsFieldProps} />
|
|
292
|
+
</React.Suspense>
|
|
276
293
|
|
|
277
294
|
{underlyingValueHasChanged && !isSubmitting &&
|
|
278
295
|
<Typography variant={"caption"} className={"ml-3.5"}>
|
|
279
|
-
|
|
296
|
+
{t("value_updated_elsewhere")}
|
|
280
297
|
</Typography>}
|
|
281
298
|
|
|
282
299
|
</ErrorBoundary>);
|
|
@@ -287,7 +304,7 @@ const shouldPropertyReRender = (property: PropertyOrBuilder | ResolvedProperty,
|
|
|
287
304
|
if (plugins?.some((plugin) => plugin.form?.fieldBuilder)) {
|
|
288
305
|
return true;
|
|
289
306
|
}
|
|
290
|
-
if (isPropertyBuilder(property)) {
|
|
307
|
+
if (isPropertyBuilder(property as any)) {
|
|
291
308
|
return true;
|
|
292
309
|
}
|
|
293
310
|
const defAProperty = property as Property | ResolvedProperty;
|
|
@@ -2,9 +2,9 @@ import React, { useEffect, useRef } from "react";
|
|
|
2
2
|
import { useFormex } from "@firecms/formex";
|
|
3
3
|
|
|
4
4
|
export const ErrorFocus = ({ containerRef }:
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
{
|
|
6
|
+
containerRef?: React.RefObject<HTMLDivElement | null>
|
|
7
|
+
}) => {
|
|
8
8
|
const {
|
|
9
9
|
isValidating,
|
|
10
10
|
errors,
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
WarningIcon
|
|
17
17
|
} from "@firecms/ui";
|
|
18
18
|
import { FormexController } from "@firecms/formex";
|
|
19
|
-
import { useSnackbarController } from "../../hooks";
|
|
19
|
+
import { useSnackbarController, useTranslation } from "../../hooks";
|
|
20
20
|
import { mergeDeep } from "../../util";
|
|
21
21
|
import { flattenKeys, removeEntityFromCache } from "../../util/entity_cache";
|
|
22
22
|
import { ResolvedProperties } from "../../types";
|
|
@@ -24,14 +24,14 @@ import { PropertyCollectionView } from "../../components/PropertyCollectionView"
|
|
|
24
24
|
|
|
25
25
|
interface LocalChangesMenuProps<M extends object> {
|
|
26
26
|
cacheKey: string;
|
|
27
|
-
|
|
27
|
+
cachedData: Partial<M>;
|
|
28
28
|
formex: FormexController<M>;
|
|
29
29
|
onClearLocalChanges?: () => void;
|
|
30
30
|
properties: ResolvedProperties<M>;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
export function LocalChangesMenu<M extends object>({
|
|
34
|
-
|
|
34
|
+
cachedData,
|
|
35
35
|
formex,
|
|
36
36
|
onClearLocalChanges,
|
|
37
37
|
cacheKey,
|
|
@@ -39,6 +39,7 @@ export function LocalChangesMenu<M extends object>({
|
|
|
39
39
|
}: LocalChangesMenuProps<M>) {
|
|
40
40
|
|
|
41
41
|
const snackbarController = useSnackbarController();
|
|
42
|
+
const { t } = useTranslation();
|
|
42
43
|
const [previewDialogOpen, setPreviewDialogOpen] = useState(false);
|
|
43
44
|
const [open, setOpen] = useState(false);
|
|
44
45
|
|
|
@@ -51,10 +52,10 @@ export function LocalChangesMenu<M extends object>({
|
|
|
51
52
|
};
|
|
52
53
|
|
|
53
54
|
const handleApply = () => {
|
|
54
|
-
const mergedValues = mergeDeep(formex.values,
|
|
55
|
+
const mergedValues = mergeDeep(formex.values, cachedData);
|
|
55
56
|
const touched = { ...formex.touched };
|
|
56
|
-
const
|
|
57
|
-
|
|
57
|
+
const cachedKeys = flattenKeys(cachedData);
|
|
58
|
+
cachedKeys.forEach((key) => {
|
|
58
59
|
touched[key] = true;
|
|
59
60
|
});
|
|
60
61
|
|
|
@@ -62,7 +63,7 @@ export function LocalChangesMenu<M extends object>({
|
|
|
62
63
|
formex.setValues(mergedValues);
|
|
63
64
|
snackbarController.open({
|
|
64
65
|
type: "info",
|
|
65
|
-
message: "
|
|
66
|
+
message: t("local_changes_applied")
|
|
66
67
|
});
|
|
67
68
|
handleCloseMenu();
|
|
68
69
|
onClearLocalChanges?.();
|
|
@@ -72,7 +73,7 @@ export function LocalChangesMenu<M extends object>({
|
|
|
72
73
|
removeEntityFromCache(cacheKey);
|
|
73
74
|
snackbarController.open({
|
|
74
75
|
type: "info",
|
|
75
|
-
message: "
|
|
76
|
+
message: t("local_changes_discarded")
|
|
76
77
|
});
|
|
77
78
|
handleCloseMenu();
|
|
78
79
|
onClearLocalChanges?.();
|
|
@@ -90,7 +91,7 @@ export function LocalChangesMenu<M extends object>({
|
|
|
90
91
|
onClick={handleOpenMenu}
|
|
91
92
|
>
|
|
92
93
|
<WarningIcon size={"smallest"} className={"mr-1 text-yellow-600 dark:text-yellow-400"}/>
|
|
93
|
-
|
|
94
|
+
{t("unsaved_local_changes")}
|
|
94
95
|
<KeyboardArrowDownIcon size={"smallest"}/>
|
|
95
96
|
</Button>
|
|
96
97
|
}
|
|
@@ -98,12 +99,11 @@ export function LocalChangesMenu<M extends object>({
|
|
|
98
99
|
onOpenChange={setOpen}
|
|
99
100
|
>
|
|
100
101
|
<div className={"max-w-xs px-4 py-4 text-sm text-gray-700 dark:text-gray-300"}>
|
|
101
|
-
|
|
102
|
-
don't apply them.
|
|
102
|
+
{t("unsaved_local_changes_description")}
|
|
103
103
|
</div>
|
|
104
|
-
<MenuItem dense onClick={handlePreview}><VisibilityIcon size={"small"}/>
|
|
105
|
-
<MenuItem dense onClick={handleApply}><CheckIcon size={"small"}/>
|
|
106
|
-
<MenuItem dense onClick={handleDiscard}><CancelIcon size={"small"}/>
|
|
104
|
+
<MenuItem dense onClick={handlePreview}><VisibilityIcon size={"small"}/>{t("preview_changes")}</MenuItem>
|
|
105
|
+
<MenuItem dense onClick={handleApply}><CheckIcon size={"small"}/>{t("apply_changes")}</MenuItem>
|
|
106
|
+
<MenuItem dense onClick={handleDiscard}><CancelIcon size={"small"}/>{t("discard_local_changes")}</MenuItem>
|
|
107
107
|
</Menu>
|
|
108
108
|
|
|
109
109
|
<Dialog
|
|
@@ -111,23 +111,23 @@ export function LocalChangesMenu<M extends object>({
|
|
|
111
111
|
onOpenChange={setPreviewDialogOpen}
|
|
112
112
|
maxWidth={"4xl"}
|
|
113
113
|
>
|
|
114
|
-
<DialogTitle variant={"h6"}>
|
|
114
|
+
<DialogTitle variant={"h6"}>{t("preview_local_changes")}</DialogTitle>
|
|
115
115
|
<DialogContent className={"my-4"}>
|
|
116
116
|
<Typography variant={"body2"} className={"mb-4"}>
|
|
117
|
-
|
|
117
|
+
{t("preview_local_changes_description")}
|
|
118
118
|
</Typography>
|
|
119
119
|
<div className={`border rounded-lg ${defaultBorderMixin}`} style={{
|
|
120
120
|
maxHeight: 520,
|
|
121
121
|
overflow: "auto"
|
|
122
122
|
}}>
|
|
123
123
|
<div className="p-4">
|
|
124
|
-
<PropertyCollectionView data={
|
|
124
|
+
<PropertyCollectionView data={cachedData}
|
|
125
125
|
properties={properties as ResolvedProperties}/>
|
|
126
126
|
</div>
|
|
127
127
|
</div>
|
|
128
128
|
</DialogContent>
|
|
129
129
|
<DialogActions>
|
|
130
|
-
<Button onClick={() => setPreviewDialogOpen(false)}>
|
|
130
|
+
<Button onClick={() => setPreviewDialogOpen(false)}>{t("close")}</Button>
|
|
131
131
|
<Button
|
|
132
132
|
variant={"filled"}
|
|
133
133
|
onClick={() => {
|
|
@@ -135,7 +135,7 @@ export function LocalChangesMenu<M extends object>({
|
|
|
135
135
|
setPreviewDialogOpen(false);
|
|
136
136
|
}}
|
|
137
137
|
>
|
|
138
|
-
|
|
138
|
+
{t("apply_changes")}
|
|
139
139
|
</Button>
|
|
140
140
|
</DialogActions>
|
|
141
141
|
</Dialog>
|
|
@@ -5,6 +5,7 @@ import { PreviewSize, PropertyPreview } from "../../preview";
|
|
|
5
5
|
|
|
6
6
|
import { cls, DescriptionIcon, IconButton, paperMixin, RemoveIcon, Tooltip } from "@firecms/ui";
|
|
7
7
|
import { ErrorBoundary } from "../../components";
|
|
8
|
+
import { useTranslation } from "../../hooks/useTranslation";
|
|
8
9
|
|
|
9
10
|
interface StorageItemPreviewProps {
|
|
10
11
|
name: string;
|
|
@@ -27,11 +28,12 @@ export function StorageItemPreview({
|
|
|
27
28
|
placeholder,
|
|
28
29
|
className
|
|
29
30
|
}: StorageItemPreviewProps) {
|
|
30
|
-
|
|
31
|
+
const { t } = useTranslation();
|
|
31
32
|
return (
|
|
32
|
-
<div className={cls(
|
|
33
|
+
<div className={cls(
|
|
33
34
|
"relative border-box flex items-center justify-center",
|
|
34
35
|
size === "large" ? "min-w-[220px] min-h-[220px] max-w-[220px]" : "min-w-[118px] min-h-[118px] max-w-[118px]",
|
|
36
|
+
paperMixin,
|
|
35
37
|
className)}>
|
|
36
38
|
|
|
37
39
|
{!placeholder && !disabled &&
|
|
@@ -40,7 +42,7 @@ export function StorageItemPreview({
|
|
|
40
42
|
|
|
41
43
|
<Tooltip
|
|
42
44
|
asChild={true}
|
|
43
|
-
title="
|
|
45
|
+
title={t("remove")}>
|
|
44
46
|
<IconButton
|
|
45
47
|
size={"small"}
|
|
46
48
|
onClick={(event) => {
|
|
@@ -11,7 +11,8 @@ export interface StorageUploadItemProps {
|
|
|
11
11
|
entry: StorageFieldItem,
|
|
12
12
|
onFileUploadComplete: (value: string,
|
|
13
13
|
entry: StorageFieldItem,
|
|
14
|
-
metadata?: any
|
|
14
|
+
metadata?: any,
|
|
15
|
+
uploadedUrl?: string) => Promise<void>;
|
|
15
16
|
imageSize: number;
|
|
16
17
|
simple: boolean;
|
|
17
18
|
}
|
|
@@ -31,6 +32,7 @@ export function StorageUploadProgress({
|
|
|
31
32
|
|
|
32
33
|
const [error, setError] = React.useState<Error | undefined>();
|
|
33
34
|
const [loading, setLoading] = React.useState<boolean>(false);
|
|
35
|
+
const [progress, setProgress] = React.useState<number>(0);
|
|
34
36
|
const mounted = React.useRef(false);
|
|
35
37
|
const uploading = React.useRef(false);
|
|
36
38
|
|
|
@@ -45,11 +47,14 @@ export function StorageUploadProgress({
|
|
|
45
47
|
file,
|
|
46
48
|
fileName,
|
|
47
49
|
path: storagePath,
|
|
48
|
-
metadata
|
|
50
|
+
metadata,
|
|
51
|
+
onProgress: (p) => {
|
|
52
|
+
if (mounted.current) setProgress(p);
|
|
53
|
+
}
|
|
49
54
|
})
|
|
50
|
-
.then(async ({ path }) => {
|
|
55
|
+
.then(async ({ path, storageUrl }) => {
|
|
51
56
|
console.debug("Upload successful", path);
|
|
52
|
-
await onFileUploadComplete(path, entry, metadata);
|
|
57
|
+
await onFileUploadComplete(path, entry, metadata, storageUrl);
|
|
53
58
|
if (mounted.current)
|
|
54
59
|
setLoading(false);
|
|
55
60
|
})
|
|
@@ -78,22 +83,33 @@ export function StorageUploadProgress({
|
|
|
78
83
|
};
|
|
79
84
|
}, [entry.file, entry.fileName, upload]);
|
|
80
85
|
|
|
86
|
+
const isLargeFile = entry.file && entry.file.size > 500 * 1024;
|
|
87
|
+
const renderProgressBar = loading && isLargeFile && progress > 0;
|
|
88
|
+
const progressBar = renderProgressBar && (
|
|
89
|
+
<div className="absolute bottom-0 left-0 h-1 bg-primary w-full origin-left transition-transform duration-200"
|
|
90
|
+
style={{ transform: `scaleX(${progress / 100})` }} />
|
|
91
|
+
);
|
|
92
|
+
|
|
81
93
|
if (simple) {
|
|
82
|
-
return <div className={`w-${imageSize} h-${imageSize}`}>
|
|
94
|
+
return <div className={`relative overflow-hidden w-${imageSize} h-${imageSize}`}>
|
|
83
95
|
|
|
84
96
|
{loading && <Skeleton className={`w-${imageSize} h-${imageSize}`}/>}
|
|
85
97
|
|
|
98
|
+
{progressBar}
|
|
99
|
+
|
|
86
100
|
</div>
|
|
87
101
|
}
|
|
88
102
|
return (
|
|
89
103
|
|
|
90
104
|
<div className={cls(paperMixin,
|
|
91
|
-
"p-4 relative border-box flex items-center justify-center",
|
|
105
|
+
"p-4 relative overflow-hidden border-box flex items-center justify-center",
|
|
92
106
|
`min-w-[${imageSize}px] min-h-[${imageSize}px]`)}>
|
|
93
107
|
|
|
94
108
|
{loading &&
|
|
95
109
|
<Skeleton className="w-full h-full"/>}
|
|
96
110
|
|
|
111
|
+
{progressBar}
|
|
112
|
+
|
|
97
113
|
{error && <ErrorView title={"Error uploading file"}
|
|
98
114
|
error={error}/>}
|
|
99
115
|
|
|
@@ -2,7 +2,7 @@ import React from "react";
|
|
|
2
2
|
import { FieldProps } from "../../types";
|
|
3
3
|
import { FieldHelperText, LabelWithIconAndTooltip } from "../components";
|
|
4
4
|
import { PropertyFieldBinding } from "../PropertyFieldBinding";
|
|
5
|
-
import { ExpandablePanel,
|
|
5
|
+
import { ExpandablePanel, IconButton, CloseIcon } from "@firecms/ui";
|
|
6
6
|
import { getArrayResolvedProperties, getIconForProperty, isReadOnly } from "../../util";
|
|
7
7
|
import { useClearRestoreValue } from "../useClearRestoreValue";
|
|
8
8
|
import { useAuthController } from "../../hooks";
|
|
@@ -50,15 +50,28 @@ export function ArrayCustomShapedFieldBinding<T extends Array<any>>({
|
|
|
50
50
|
setValue
|
|
51
51
|
});
|
|
52
52
|
|
|
53
|
-
const title = (
|
|
53
|
+
const title = (<div className="flex items-center w-full">
|
|
54
54
|
<LabelWithIconAndTooltip
|
|
55
55
|
propertyKey={propertyKey}
|
|
56
56
|
icon={getIconForProperty(property, "small")}
|
|
57
57
|
required={property.validation?.required}
|
|
58
58
|
title={property.name}
|
|
59
|
-
className={"
|
|
60
|
-
{Array.isArray(value) && <
|
|
61
|
-
|
|
59
|
+
className={"text-text-secondary dark:text-text-secondary-dark"}/>
|
|
60
|
+
{Array.isArray(value) && <span className={"text-sm text-text-secondary dark:text-text-secondary-dark ml-1"}>({value.length})</span>}
|
|
61
|
+
<div className="flex-grow"/>
|
|
62
|
+
{(property.nullable || property.clearable) && !disabled && (
|
|
63
|
+
<IconButton
|
|
64
|
+
size="small"
|
|
65
|
+
onClick={(e) => {
|
|
66
|
+
e.stopPropagation();
|
|
67
|
+
e.preventDefault();
|
|
68
|
+
setValue(null);
|
|
69
|
+
}}
|
|
70
|
+
>
|
|
71
|
+
<CloseIcon size={"small"}/>
|
|
72
|
+
</IconButton>
|
|
73
|
+
)}
|
|
74
|
+
</div>);
|
|
62
75
|
|
|
63
76
|
const body = resolvedProperties.map((childProperty, index) => {
|
|
64
77
|
const thisDisabled = isReadOnly(childProperty) || Boolean(childProperty.disabled);
|
|
@@ -4,9 +4,8 @@ import { ReferencePreview } from "../../preview";
|
|
|
4
4
|
import { FieldHelperText, LabelWithIconAndTooltip } from "../components";
|
|
5
5
|
import { ArrayContainer, ArrayEntryParams, ErrorView } from "../../components";
|
|
6
6
|
import { getIconForProperty, getReferenceFrom } from "../../util";
|
|
7
|
-
|
|
8
|
-
import {
|
|
9
|
-
import { Button, cls, EditIcon, ExpandablePanel, fieldBackgroundMixin, Typography } from "@firecms/ui";
|
|
7
|
+
import { useNavigationController, useReferenceDialog, useTranslation } from "../../hooks";
|
|
8
|
+
import { Button, cls, EditIcon, ExpandablePanel, fieldBackgroundMixin, Typography, IconButton, CloseIcon } from "@firecms/ui";
|
|
10
9
|
import { useClearRestoreValue } from "../useClearRestoreValue";
|
|
11
10
|
|
|
12
11
|
type ArrayOfReferencesFieldProps = FieldProps<EntityReference[]>;
|
|
@@ -48,6 +47,7 @@ export function ArrayOfReferencesFieldBinding({
|
|
|
48
47
|
setValue
|
|
49
48
|
});
|
|
50
49
|
|
|
50
|
+
const { t } = useTranslation();
|
|
51
51
|
const navigationController = useNavigationController();
|
|
52
52
|
const collection: EntityCollection | undefined = useMemo(() => {
|
|
53
53
|
return ofProperty.path ? navigationController.getCollection(ofProperty.path) : undefined;
|
|
@@ -84,7 +84,7 @@ export function ArrayOfReferencesFieldBinding({
|
|
|
84
84
|
}: ArrayEntryParams) => {
|
|
85
85
|
const entryValue = value && value.length > index ? value[index] : undefined;
|
|
86
86
|
if (!entryValue)
|
|
87
|
-
return <div>
|
|
87
|
+
return <div>{t("internal_error")}</div>;
|
|
88
88
|
return (
|
|
89
89
|
<ReferencePreview
|
|
90
90
|
key={internalId}
|
|
@@ -100,15 +100,28 @@ export function ArrayOfReferencesFieldBinding({
|
|
|
100
100
|
);
|
|
101
101
|
}, [ofProperty.path, ofProperty.previewProperties, value]);
|
|
102
102
|
|
|
103
|
-
const title = (
|
|
103
|
+
const title = (<div className="flex items-center w-full">
|
|
104
104
|
<LabelWithIconAndTooltip
|
|
105
105
|
propertyKey={propertyKey}
|
|
106
106
|
icon={getIconForProperty(property, "small")}
|
|
107
107
|
required={property.validation?.required}
|
|
108
108
|
title={property.name}
|
|
109
|
-
className={"
|
|
110
|
-
{Array.isArray(value) && <
|
|
111
|
-
|
|
109
|
+
className={"text-text-secondary dark:text-text-secondary-dark"}/>
|
|
110
|
+
{Array.isArray(value) && <span className={"text-sm text-text-secondary dark:text-text-secondary-dark ml-1"}>({value.length})</span>}
|
|
111
|
+
<div className="flex-grow"/>
|
|
112
|
+
{(property.nullable || property.clearable) && !disabled && (
|
|
113
|
+
<IconButton
|
|
114
|
+
size="small"
|
|
115
|
+
onClick={(e) => {
|
|
116
|
+
e.stopPropagation();
|
|
117
|
+
e.preventDefault();
|
|
118
|
+
setValue(null);
|
|
119
|
+
}}
|
|
120
|
+
>
|
|
121
|
+
<CloseIcon size={"small"}/>
|
|
122
|
+
</IconButton>
|
|
123
|
+
)}
|
|
124
|
+
</div>);
|
|
112
125
|
|
|
113
126
|
const body = <>
|
|
114
127
|
{!collection && <ErrorView
|
|
@@ -129,11 +142,10 @@ export function ArrayOfReferencesFieldBinding({
|
|
|
129
142
|
<Button
|
|
130
143
|
className="ml-3.5 my-4 justify-center text-left"
|
|
131
144
|
variant="text"
|
|
132
|
-
color="primary"
|
|
133
145
|
disabled={isSubmitting}
|
|
134
146
|
onClick={onEntryClick}>
|
|
135
147
|
<EditIcon size={"small"}/>
|
|
136
|
-
|
|
148
|
+
{t("edit_name", { name: property.name ?? "" })}
|
|
137
149
|
</Button>
|
|
138
150
|
</div>}
|
|
139
151
|
</>;
|
|
@@ -8,9 +8,10 @@ import { EnumValuesChip } from "../../preview";
|
|
|
8
8
|
import { FieldProps, FormContext, PropertyFieldBindingProps, PropertyOrBuilder } from "../../types";
|
|
9
9
|
import { getDefaultValueFor, getIconForProperty, mergeDeep, } from "../../util";
|
|
10
10
|
import { DEFAULT_ONE_OF_TYPE, DEFAULT_ONE_OF_VALUE } from "../../util/common";
|
|
11
|
-
import { cls, ExpandablePanel, paperMixin, Select, SelectItem, Typography } from "@firecms/ui";
|
|
11
|
+
import { cls, ExpandablePanel, paperMixin, Select, SelectItem, Typography, IconButton, CloseIcon } from "@firecms/ui";
|
|
12
12
|
import { useClearRestoreValue } from "../useClearRestoreValue";
|
|
13
13
|
import { ArrayContainer, ArrayEntryParams } from "../../components";
|
|
14
|
+
import { useTranslation } from "../../hooks/useTranslation";
|
|
14
15
|
|
|
15
16
|
/**
|
|
16
17
|
* If the `oneOf` property is specified, this fields render each array entry as
|
|
@@ -37,6 +38,7 @@ export function BlockFieldBinding<T extends Array<any>>({
|
|
|
37
38
|
}: FieldProps<T>) {
|
|
38
39
|
|
|
39
40
|
const minimalistView = minimalistViewProp || property.minimalistView;
|
|
41
|
+
const { t } = useTranslation();
|
|
40
42
|
|
|
41
43
|
if (!property.oneOf)
|
|
42
44
|
throw Error("ArrayOneOfField misconfiguration. Property `oneOf` not set");
|
|
@@ -72,19 +74,33 @@ export function BlockFieldBinding<T extends Array<any>>({
|
|
|
72
74
|
};
|
|
73
75
|
|
|
74
76
|
const title = (
|
|
75
|
-
<
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
77
|
+
<div className="flex items-center w-full">
|
|
78
|
+
<LabelWithIconAndTooltip
|
|
79
|
+
propertyKey={propertyKey}
|
|
80
|
+
icon={getIconForProperty(property, "small")}
|
|
81
|
+
required={property.validation?.required}
|
|
82
|
+
title={property.name}
|
|
83
|
+
className={"text-text-secondary dark:text-text-secondary-dark flex-grow"}/>
|
|
84
|
+
{(property.nullable || property.clearable) && !disabled && (
|
|
85
|
+
<IconButton
|
|
86
|
+
size="small"
|
|
87
|
+
onClick={(e) => {
|
|
88
|
+
e.stopPropagation();
|
|
89
|
+
e.preventDefault();
|
|
90
|
+
setValue(null);
|
|
91
|
+
}}
|
|
92
|
+
>
|
|
93
|
+
<CloseIcon size={"small"}/>
|
|
94
|
+
</IconButton>
|
|
95
|
+
)}
|
|
96
|
+
</div>
|
|
81
97
|
);
|
|
82
98
|
|
|
83
99
|
const firstOneOfKey = Object.keys(property.oneOf.properties)[0];
|
|
84
100
|
const body = <ArrayContainer value={value}
|
|
85
101
|
className={"flex flex-col gap-3"}
|
|
86
102
|
droppableId={propertyKey}
|
|
87
|
-
addLabel={property.name ? "
|
|
103
|
+
addLabel={property.name ? t("add_to_field", { fieldName: property.name }) : t("add_entry")}
|
|
88
104
|
buildEntry={buildEntry}
|
|
89
105
|
onInternalIdAdded={setLastAddedId}
|
|
90
106
|
disabled={isSubmitting || Boolean(property.disabled)}
|
|
@@ -167,6 +183,7 @@ function BlockEntry({
|
|
|
167
183
|
const [typeInternal, setTypeInternal] = useState<string | undefined>(type ?? undefined);
|
|
168
184
|
|
|
169
185
|
const formex = useFormex();
|
|
186
|
+
const { t } = useTranslation();
|
|
170
187
|
|
|
171
188
|
useEffect(() => {
|
|
172
189
|
if (!type) {
|
|
@@ -227,7 +244,7 @@ function BlockEntry({
|
|
|
227
244
|
<Select
|
|
228
245
|
className="mb-2"
|
|
229
246
|
placeholder={<Typography variant={"caption"}
|
|
230
|
-
className={"px-4 py-2 font-medium"}>
|
|
247
|
+
className={"px-4 py-2 font-medium"}>{t("type")}</Typography>}
|
|
231
248
|
size={"medium"}
|
|
232
249
|
fullWidth={true}
|
|
233
250
|
position={"item-aligned"}
|