@firecms/core 3.0.1 → 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/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/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 +30146 -15178
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +30032 -15085
- 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/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 +268 -12
- package/dist/types/storage.d.ts +1 -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 +10 -1
- package/package.json +51 -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/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 +1 -0
- package/src/components/VirtualTable/VirtualTable.tsx +275 -119
- 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 +149 -67
- 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 +13 -13
- package/src/form/components/StorageItemPreview.tsx +5 -3
- package/src/form/components/StorageUploadProgress.tsx +18 -3
- 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 +2 -1
- 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/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 +359 -37
- package/src/types/storage.ts +2 -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 +23 -29
- /package/dist/util/{references.d.ts → previews.d.ts} +0 -0
|
@@ -10,12 +10,12 @@ import { ErrorBoundary } from "../../components";
|
|
|
10
10
|
* @group Preview components
|
|
11
11
|
*/
|
|
12
12
|
export function ArrayOfStringsPreview({
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
13
|
+
propertyKey,
|
|
14
|
+
value,
|
|
15
|
+
property: inputProperty,
|
|
16
|
+
// entity,
|
|
17
|
+
size
|
|
18
|
+
}: PropertyPreviewProps<string[]>) {
|
|
19
19
|
const authController = useAuthController();
|
|
20
20
|
const customizationController = useCustomizationController();
|
|
21
21
|
const property = resolveArrayProperty({
|
|
@@ -25,6 +25,8 @@ export function ArrayOfStringsPreview({
|
|
|
25
25
|
authController
|
|
26
26
|
});
|
|
27
27
|
|
|
28
|
+
if (!property) return null;
|
|
29
|
+
|
|
28
30
|
if (Array.isArray(property.of)) {
|
|
29
31
|
throw Error("Using array properties instead of single one in `of` in ArrayProperty");
|
|
30
32
|
}
|
|
@@ -43,10 +45,10 @@ export function ArrayOfStringsPreview({
|
|
|
43
45
|
<div key={`preview_array_strings_${propertyKey}_${index}`}>
|
|
44
46
|
<ErrorBoundary>
|
|
45
47
|
<StringPropertyPreview propertyKey={propertyKey}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
+
property={stringProperty}
|
|
49
|
+
value={v}
|
|
48
50
|
// entity={entity}
|
|
49
|
-
|
|
51
|
+
size={size} />
|
|
50
52
|
</ErrorBoundary>
|
|
51
53
|
</div>
|
|
52
54
|
)}
|
|
@@ -12,12 +12,12 @@ import { ErrorBoundary } from "../../components";
|
|
|
12
12
|
* @group Preview components
|
|
13
13
|
*/
|
|
14
14
|
export function ArrayPropertyPreview({
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
15
|
+
propertyKey,
|
|
16
|
+
value,
|
|
17
|
+
property: inputProperty,
|
|
18
|
+
// entity,
|
|
19
|
+
size
|
|
20
|
+
}: PropertyPreviewProps<any[]>) {
|
|
21
21
|
|
|
22
22
|
const authController = useAuthController();
|
|
23
23
|
const customizationController = useCustomizationController();
|
|
@@ -28,6 +28,8 @@ export function ArrayPropertyPreview({
|
|
|
28
28
|
authController
|
|
29
29
|
});
|
|
30
30
|
|
|
31
|
+
if (!property) return null;
|
|
32
|
+
|
|
31
33
|
if (!property.of) {
|
|
32
34
|
throw Error(`You need to specify an 'of' prop (or specify a custom field) in your array property ${propertyKey}`);
|
|
33
35
|
}
|
|
@@ -45,24 +47,24 @@ export function ArrayPropertyPreview({
|
|
|
45
47
|
<div className="w-full flex flex-col gap-2">
|
|
46
48
|
{values &&
|
|
47
49
|
values.map((value, index) => {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
50
|
+
const of: ResolvedProperty = property.resolvedProperties[index] ??
|
|
51
|
+
(property.resolvedProperties[index] ?? (Array.isArray(property.of) ? property.of[index] : property.of));
|
|
52
|
+
return of
|
|
53
|
+
? <React.Fragment
|
|
54
|
+
key={"preview_array_" + index}>
|
|
55
|
+
<div className={cls(defaultBorderMixin, "m-1 border-b last:border-b-0")}>
|
|
56
|
+
<ErrorBoundary>
|
|
57
|
+
<PropertyPreview
|
|
58
|
+
propertyKey={propertyKey}
|
|
59
|
+
// entity={entity}
|
|
60
|
+
value={value}
|
|
61
|
+
property={of}
|
|
62
|
+
size={childSize} />
|
|
63
|
+
</ErrorBoundary>
|
|
64
|
+
</div>
|
|
65
|
+
</React.Fragment>
|
|
66
|
+
: null;
|
|
67
|
+
}
|
|
66
68
|
)}
|
|
67
69
|
</div>
|
|
68
70
|
);
|
|
@@ -6,6 +6,7 @@ import { PropertyPreview } from "../PropertyPreview";
|
|
|
6
6
|
import { cls, defaultBorderMixin, Typography } from "@firecms/ui";
|
|
7
7
|
import { ErrorBoundary } from "../../components";
|
|
8
8
|
import { EmptyValue } from "../components/EmptyValue";
|
|
9
|
+
import { DatePreview } from "../components/DatePreview";
|
|
9
10
|
|
|
10
11
|
/**
|
|
11
12
|
* @group Preview components
|
|
@@ -111,37 +112,58 @@ export function KeyValuePreview({ value }: { value: any }) {
|
|
|
111
112
|
return <div
|
|
112
113
|
className="flex flex-col gap-1 w-full">
|
|
113
114
|
{
|
|
114
|
-
Object.entries(value).map(([key, childValue]: [string, any]) =>
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
115
|
+
Object.entries(value).map(([key, childValue]: [string, any]) => {
|
|
116
|
+
const isTimestampObj = childValue && typeof childValue === "object" && (
|
|
117
|
+
childValue instanceof Date ||
|
|
118
|
+
("_seconds" in childValue && "_nanoseconds" in childValue && typeof childValue._seconds === "number" && typeof childValue._nanoseconds === "number") ||
|
|
119
|
+
("seconds" in childValue && "nanoseconds" in childValue && typeof childValue.seconds === "number" && typeof childValue.nanoseconds === "number")
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
const isScalar = childValue && (typeof childValue !== "object" || isTimestampObj);
|
|
123
|
+
|
|
124
|
+
return (
|
|
118
125
|
<div
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
key={`table-cell-title-${key}-${key}`}
|
|
122
|
-
className="min-w-[140px] w-[25%] py-1">
|
|
123
|
-
<Typography variant={"caption"}
|
|
124
|
-
className={"font-semibold break-words"}
|
|
125
|
-
color={"secondary"}>
|
|
126
|
-
{key}
|
|
127
|
-
</Typography>
|
|
128
|
-
</div>
|
|
126
|
+
key={`map_preview_table_${key}}`}
|
|
127
|
+
className={cls(defaultBorderMixin, "last:border-b-0 border-b")}>
|
|
129
128
|
<div
|
|
130
|
-
className="flex-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
129
|
+
className={"flex flex-row pt-0.5 pb-0.5 gap-2"}>
|
|
130
|
+
<div
|
|
131
|
+
key={`table-cell-title-${key}-${key}`}
|
|
132
|
+
className="min-w-[140px] w-[25%] py-1">
|
|
133
|
+
<Typography variant={"caption"}
|
|
134
|
+
className={"font-semibold break-words"}
|
|
135
|
+
color={"secondary"}>
|
|
136
|
+
{key}
|
|
137
|
+
</Typography>
|
|
138
|
+
</div>
|
|
139
|
+
<div
|
|
140
|
+
className="flex-grow max-w-[75%]">
|
|
141
|
+
{isScalar && (isTimestampObj ? (
|
|
142
|
+
<ErrorBoundary>
|
|
143
|
+
<DatePreview date={
|
|
144
|
+
childValue instanceof Date ? childValue :
|
|
145
|
+
typeof childValue.toDate === "function" ? childValue.toDate() :
|
|
146
|
+
"_seconds" in childValue ? new Date(childValue._seconds * 1000 + childValue._nanoseconds / 1000000) :
|
|
147
|
+
new Date(childValue.seconds * 1000 + childValue.nanoseconds / 1000000)
|
|
148
|
+
} />
|
|
149
|
+
</ErrorBoundary>
|
|
150
|
+
) : (
|
|
151
|
+
<Typography>
|
|
152
|
+
<ErrorBoundary>
|
|
153
|
+
{childValue.toString()}
|
|
154
|
+
</ErrorBoundary>
|
|
155
|
+
</Typography>
|
|
156
|
+
))}
|
|
157
|
+
</div>
|
|
136
158
|
</div>
|
|
159
|
+
{typeof childValue === "object" && !isTimestampObj &&
|
|
160
|
+
<div className={cls(defaultBorderMixin, "border-l pl-4")}>
|
|
161
|
+
<KeyValuePreview value={childValue}/>
|
|
162
|
+
</div>
|
|
163
|
+
}
|
|
137
164
|
</div>
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
<KeyValuePreview value={childValue}/>
|
|
141
|
-
</div>
|
|
142
|
-
}
|
|
143
|
-
</div>
|
|
144
|
-
))
|
|
165
|
+
);
|
|
166
|
+
})
|
|
145
167
|
}
|
|
146
168
|
</div>;
|
|
147
169
|
}
|
|
@@ -19,9 +19,9 @@ export interface SkeletonPropertyComponentProps {
|
|
|
19
19
|
* @group Preview components
|
|
20
20
|
*/
|
|
21
21
|
export function SkeletonPropertyComponent({
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
property,
|
|
23
|
+
size
|
|
24
|
+
}: SkeletonPropertyComponentProps
|
|
25
25
|
) {
|
|
26
26
|
|
|
27
27
|
if (!property) {
|
|
@@ -101,7 +101,7 @@ function renderMap<T extends Record<string, any>>(property: ResolvedMapProperty<
|
|
|
101
101
|
{property.properties && property.properties[key] &&
|
|
102
102
|
<SkeletonPropertyComponent
|
|
103
103
|
property={property.properties[key]}
|
|
104
|
-
size={"medium"}/>}
|
|
104
|
+
size={"medium"} />}
|
|
105
105
|
</div>
|
|
106
106
|
))}
|
|
107
107
|
</div>
|
|
@@ -110,29 +110,29 @@ function renderMap<T extends Record<string, any>>(property: ResolvedMapProperty<
|
|
|
110
110
|
return (
|
|
111
111
|
<table className="table-auto">
|
|
112
112
|
<tbody>
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
113
|
+
{mapPropertyKeys &&
|
|
114
|
+
mapPropertyKeys.map((key, index) => {
|
|
115
|
+
return (
|
|
116
|
+
<tr
|
|
117
|
+
key={`map_preview_table__${index}`}
|
|
118
|
+
className="border-b last:border-b-0">
|
|
119
|
+
<th key={`table-cell-title--${key}`}
|
|
120
|
+
className="align-top"
|
|
121
|
+
style={{ width: "30%" }}>
|
|
122
|
+
<p className="text-xs text-secondary">
|
|
123
|
+
{property.properties![key].name}
|
|
124
|
+
</p>
|
|
125
|
+
</th>
|
|
126
|
+
<th key={`table-cell-${key}`}
|
|
127
|
+
style={{ width: "70%" }}>
|
|
128
|
+
{property.properties && property.properties[key] &&
|
|
129
|
+
<SkeletonPropertyComponent
|
|
130
|
+
property={property.properties[key]}
|
|
131
|
+
size={"medium"} />}
|
|
132
|
+
</th>
|
|
133
|
+
</tr>
|
|
134
|
+
);
|
|
135
|
+
})}
|
|
136
136
|
</tbody>
|
|
137
137
|
</table>
|
|
138
138
|
);
|
|
@@ -149,24 +149,24 @@ function renderArrayOfMaps<M extends Record<string, any>>(properties: ResolvedPr
|
|
|
149
149
|
return (
|
|
150
150
|
<table className="table-auto">
|
|
151
151
|
<tbody>
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
152
|
+
{
|
|
153
|
+
[0, 1, 2].map((value, index) => {
|
|
154
|
+
return (
|
|
155
|
+
<tr key={`table_${value}_${index}`}>
|
|
156
|
+
{tableProperties && tableProperties.map(
|
|
157
|
+
(key) => (
|
|
158
|
+
<th
|
|
159
|
+
key={`table-cell-${key}`}
|
|
160
|
+
>
|
|
161
|
+
<SkeletonPropertyComponent
|
|
162
|
+
property={(properties)[key]}
|
|
163
|
+
size={"medium"} />
|
|
164
|
+
</th>
|
|
165
|
+
)
|
|
166
|
+
)}
|
|
167
|
+
</tr>
|
|
168
|
+
);
|
|
169
|
+
})}
|
|
170
170
|
</tbody>
|
|
171
171
|
</table>
|
|
172
172
|
);
|
|
@@ -203,14 +203,14 @@ function renderGenericArrayCell(
|
|
|
203
203
|
return (
|
|
204
204
|
|
|
205
205
|
<div key={"array_index_" + index}
|
|
206
|
-
|
|
206
|
+
className={"flex flex-col gap-2"}>
|
|
207
207
|
|
|
208
208
|
{
|
|
209
209
|
[0, 1].map((value, index) =>
|
|
210
210
|
<>
|
|
211
211
|
<SkeletonPropertyComponent key={`i_${index}`}
|
|
212
|
-
|
|
213
|
-
|
|
212
|
+
property={property}
|
|
213
|
+
size={"medium"} />
|
|
214
214
|
</>
|
|
215
215
|
)}
|
|
216
216
|
</div>
|
|
@@ -220,16 +220,21 @@ function renderGenericArrayCell(
|
|
|
220
220
|
function renderUrlAudioComponent() {
|
|
221
221
|
return (
|
|
222
222
|
<Skeleton width={300}
|
|
223
|
-
|
|
223
|
+
height={100} />
|
|
224
224
|
);
|
|
225
225
|
}
|
|
226
226
|
|
|
227
|
-
export function renderSkeletonImageThumbnail(size: PreviewSize) {
|
|
227
|
+
export function renderSkeletonImageThumbnail(size: PreviewSize, fill?: boolean) {
|
|
228
|
+
if (fill) {
|
|
229
|
+
return (
|
|
230
|
+
<Skeleton className="w-full h-full" />
|
|
231
|
+
);
|
|
232
|
+
}
|
|
228
233
|
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
229
234
|
const imageSize = size === "small" ? 40 : size === "medium" ? 100 : 200;
|
|
230
235
|
return (
|
|
231
236
|
<Skeleton width={imageSize}
|
|
232
|
-
|
|
237
|
+
height={imageSize} />
|
|
233
238
|
);
|
|
234
239
|
}
|
|
235
240
|
|
|
@@ -237,12 +242,12 @@ function renderUrlVideo(size: PreviewSize) {
|
|
|
237
242
|
|
|
238
243
|
return (
|
|
239
244
|
<Skeleton width={size !== "large" ? 300 : 500}
|
|
240
|
-
|
|
245
|
+
height={size !== "large" ? 200 : 250} />
|
|
241
246
|
);
|
|
242
247
|
}
|
|
243
248
|
|
|
244
249
|
function renderReference() {
|
|
245
|
-
return <Skeleton width={200} height={100}/>;
|
|
250
|
+
return <Skeleton width={200} height={100} />;
|
|
246
251
|
}
|
|
247
252
|
|
|
248
253
|
function renderUrlComponent(property: ResolvedStringProperty, size: PreviewSize = "large") {
|
|
@@ -270,14 +275,14 @@ function renderUrlFile(size: PreviewSize) {
|
|
|
270
275
|
}
|
|
271
276
|
|
|
272
277
|
export function renderSkeletonText(index?: number, width = 120) {
|
|
273
|
-
return <Skeleton width={width} key={`skeleton_${index}`}/>;
|
|
278
|
+
return <Skeleton width={width} key={`skeleton_${index}`} />;
|
|
274
279
|
}
|
|
275
280
|
|
|
276
281
|
export function renderSkeletonCaptionText(index?: number) {
|
|
277
282
|
return <Skeleton
|
|
278
|
-
height={20}/>;
|
|
283
|
+
height={20} />;
|
|
279
284
|
}
|
|
280
285
|
|
|
281
286
|
export function renderSkeletonIcon() {
|
|
282
|
-
return <Skeleton width={24} height={24}/>;
|
|
287
|
+
return <Skeleton width={24} height={24} />;
|
|
283
288
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { Blocker, useBlocker, useLocation } from "react-router";
|
|
2
|
-
import {
|
|
2
|
+
import React, { useEffect, useRef, useState } from "react";
|
|
3
3
|
import { useNavigationController } from "../hooks";
|
|
4
|
-
import { useEffect, useRef, useState } from "react";
|
|
5
4
|
import { useNavigate } from "react-router-dom";
|
|
6
5
|
import {
|
|
7
6
|
getNavigationEntriesFromPath,
|
|
@@ -11,7 +10,11 @@ import {
|
|
|
11
10
|
} from "../util/navigation_from_path";
|
|
12
11
|
import { useBreadcrumbsController } from "../hooks/useBreadcrumbsController";
|
|
13
12
|
import { toArray } from "../util/arrays";
|
|
14
|
-
import {
|
|
13
|
+
import { NotFoundPage } from "../components";
|
|
14
|
+
import { lazyEager } from "../util/lazy_eager";
|
|
15
|
+
|
|
16
|
+
const EntityEditView = lazyEager<typeof import("../core/EntityEditView")["EntityEditView"]>(() => import("../core/EntityEditView"), "EntityEditView");
|
|
17
|
+
const EntityCollectionView = lazyEager<typeof import("../components/EntityCollectionView/EntityCollectionView")["EntityCollectionView"]>(() => import("../components/EntityCollectionView/EntityCollectionView"), "EntityCollectionView");
|
|
15
18
|
import { UnsavedChangesDialog } from "../components/UnsavedChangesDialog";
|
|
16
19
|
import { EntityCollection } from "../types";
|
|
17
20
|
|
|
@@ -35,22 +38,34 @@ export function FireCMSRoute() {
|
|
|
35
38
|
});
|
|
36
39
|
|
|
37
40
|
useEffect(() => {
|
|
41
|
+
const lastEntry = navigationEntries[navigationEntries.length - 1];
|
|
42
|
+
const isViewingCollection = lastEntry?.type === "collection";
|
|
43
|
+
|
|
38
44
|
breadcrumbs.set({
|
|
39
|
-
breadcrumbs: navigationEntries.map(entry => {
|
|
45
|
+
breadcrumbs: navigationEntries.map((entry, index) => {
|
|
46
|
+
const isLastEntry = index === navigationEntries.length - 1;
|
|
47
|
+
|
|
40
48
|
if (entry.type === "entity") {
|
|
41
49
|
return ({
|
|
42
50
|
title: entry.entityId,
|
|
43
51
|
url: navigation.buildUrlCollectionPath(entry.fullPath)
|
|
52
|
+
// count: undefined (not applicable for entities)
|
|
44
53
|
});
|
|
45
54
|
} else if (entry.type === "custom_view") {
|
|
46
55
|
return ({
|
|
47
56
|
title: entry.view.name,
|
|
48
57
|
url: navigation.buildUrlCollectionPath(entry.fullPath)
|
|
58
|
+
// count: undefined (not applicable for custom views)
|
|
49
59
|
});
|
|
50
60
|
} else if (entry.type === "collection") {
|
|
61
|
+
// Only show count badge (loading state) when viewing this collection directly
|
|
62
|
+
// Don't show count for parent collections when viewing an entity
|
|
63
|
+
const showCount = isLastEntry && isViewingCollection;
|
|
51
64
|
return ({
|
|
52
65
|
title: entry.collection.name,
|
|
53
|
-
url: navigation.buildUrlCollectionPath(entry.fullPath)
|
|
66
|
+
url: navigation.buildUrlCollectionPath(entry.fullPath),
|
|
67
|
+
id: entry.fullPath,
|
|
68
|
+
...(showCount ? { count: null } : {}) // null = loading, undefined = no badge
|
|
54
69
|
});
|
|
55
70
|
} else {
|
|
56
71
|
throw new Error("Unexpected navigation entry type");
|
|
@@ -59,6 +74,7 @@ export function FireCMSRoute() {
|
|
|
59
74
|
});
|
|
60
75
|
}, [navigationEntries.map(entry => entry.path).join(",")]);
|
|
61
76
|
|
|
77
|
+
|
|
62
78
|
if (isNew) {
|
|
63
79
|
return <EntityFullScreenRoute
|
|
64
80
|
pathname={pathname}
|
|
@@ -75,15 +91,17 @@ export function FireCMSRoute() {
|
|
|
75
91
|
collection = navigation.getCollection(navigationEntries[0].path);
|
|
76
92
|
if (!collection)
|
|
77
93
|
return null;
|
|
78
|
-
return <
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
94
|
+
return <React.Suspense fallback={null}>
|
|
95
|
+
<EntityCollectionView
|
|
96
|
+
key={`collection_view_${collection.id ?? collection.path}`}
|
|
97
|
+
isSubCollection={false}
|
|
98
|
+
parentCollectionIds={[]}
|
|
99
|
+
fullPath={collection.path}
|
|
100
|
+
fullIdPath={collection.id}
|
|
101
|
+
updateUrl={true}
|
|
102
|
+
{...collection}
|
|
103
|
+
Actions={toArray(collection.Actions)} />
|
|
104
|
+
</React.Suspense>;
|
|
87
105
|
}
|
|
88
106
|
|
|
89
107
|
if (isSidePanel) {
|
|
@@ -96,15 +114,17 @@ export function FireCMSRoute() {
|
|
|
96
114
|
collection = navigation.getCollection(firstEntry.path);
|
|
97
115
|
if (!collection)
|
|
98
116
|
return null;
|
|
99
|
-
return <
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
117
|
+
return <React.Suspense fallback={null}>
|
|
118
|
+
<EntityCollectionView
|
|
119
|
+
key={`collection_view_${collection.id ?? collection.path}`}
|
|
120
|
+
fullIdPath={collection.id}
|
|
121
|
+
isSubCollection={false}
|
|
122
|
+
parentCollectionIds={[]}
|
|
123
|
+
fullPath={collection.path}
|
|
124
|
+
updateUrl={true}
|
|
125
|
+
{...collection}
|
|
126
|
+
Actions={toArray(collection.Actions)} />
|
|
127
|
+
</React.Suspense>;
|
|
108
128
|
}
|
|
109
129
|
}
|
|
110
130
|
|
|
@@ -131,11 +151,11 @@ function getSelectedTabFromUrl(isNew: boolean, lastCustomView: NavigationViewCol
|
|
|
131
151
|
}
|
|
132
152
|
|
|
133
153
|
function EntityFullScreenRoute({
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
154
|
+
pathname,
|
|
155
|
+
navigationEntries,
|
|
156
|
+
isNew,
|
|
157
|
+
isCopy
|
|
158
|
+
}: {
|
|
139
159
|
pathname: string;
|
|
140
160
|
navigationEntries: NavigationViewInternal[],
|
|
141
161
|
isNew: boolean,
|
|
@@ -178,8 +198,8 @@ function EntityFullScreenRoute({
|
|
|
178
198
|
let blocker: Blocker | undefined = undefined;
|
|
179
199
|
try {
|
|
180
200
|
blocker = useBlocker(({
|
|
181
|
-
|
|
182
|
-
|
|
201
|
+
nextLocation
|
|
202
|
+
}) => {
|
|
183
203
|
if (nextLocation.pathname.startsWith(entityPath))
|
|
184
204
|
return false;
|
|
185
205
|
return blocked.current;
|
|
@@ -195,52 +215,54 @@ function EntityFullScreenRoute({
|
|
|
195
215
|
}
|
|
196
216
|
|
|
197
217
|
if (!isNew && !lastEntityEntry) {
|
|
198
|
-
return <NotFoundPage/>;
|
|
218
|
+
return <NotFoundPage />;
|
|
199
219
|
}
|
|
200
220
|
|
|
201
221
|
const collection = isNew ? lastCollectionEntry!.collection : lastEntityEntry!.parentCollection;
|
|
202
222
|
const fullIdPath = isNew ? lastCollectionEntry!.path : lastEntityEntry!.path;
|
|
203
223
|
const collectionPath = navigation.resolveIdsFrom(fullIdPath);
|
|
204
224
|
return <>
|
|
205
|
-
<
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
225
|
+
<React.Suspense fallback={null}>
|
|
226
|
+
<EntityEditView
|
|
227
|
+
key={collection.id + "_" + (isNew ? "new" : (isCopy ? entityId + "_copy" : entityId))}
|
|
228
|
+
entityId={isNew ? undefined : entityId}
|
|
229
|
+
fullIdPath={fullIdPath}
|
|
230
|
+
collection={collection}
|
|
231
|
+
layout={"full_screen"}
|
|
232
|
+
path={collectionPath}
|
|
233
|
+
copy={isCopy}
|
|
234
|
+
selectedTab={selectedTab ?? undefined}
|
|
235
|
+
onValuesModified={(modified) => blocked.current = modified}
|
|
236
|
+
onSaved={(params) => {
|
|
237
|
+
const newSelectedTab = params.selectedTab;
|
|
238
|
+
const newEntityId = params.entityId;
|
|
239
|
+
if (newSelectedTab) {
|
|
240
|
+
navigate(`${basePath}/${newEntityId}/${newSelectedTab}`, { replace: true });
|
|
241
|
+
} else {
|
|
242
|
+
navigate(`${basePath}/${newEntityId}`, { replace: true });
|
|
243
|
+
}
|
|
244
|
+
}}
|
|
245
|
+
onTabChange={(params) => {
|
|
246
|
+
setSelectedTab(params.selectedTab);
|
|
247
|
+
if (isNew) {
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
const newSelectedTab = params.selectedTab;
|
|
251
|
+
if (newSelectedTab) {
|
|
252
|
+
navigate(`${basePath}/${entityId}/${newSelectedTab}`, { replace: true });
|
|
253
|
+
} else {
|
|
254
|
+
navigate(`${basePath}/${entityId}`, { replace: true });
|
|
255
|
+
}
|
|
256
|
+
}}
|
|
257
|
+
parentCollectionIds={parentCollectionIds}
|
|
258
|
+
/>
|
|
259
|
+
</React.Suspense>
|
|
238
260
|
|
|
239
261
|
<UnsavedChangesDialog
|
|
240
262
|
open={blocker?.state === "blocked"}
|
|
241
263
|
handleOk={() => blocker?.proceed?.()}
|
|
242
264
|
handleCancel={() => blocker?.reset?.()}
|
|
243
|
-
body={"You have unsaved changes in this entity."}/>
|
|
265
|
+
body={"You have unsaved changes in this entity."} />
|
|
244
266
|
|
|
245
267
|
</>;
|
|
246
268
|
}
|