@firecms/core 3.0.0-canary.26 → 3.0.0-canary.260
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 +31 -12
- 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 +14 -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 +20 -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 +8 -5
- package/dist/components/ErrorView.d.ts +1 -1
- package/dist/components/HomePage/DefaultHomePage.d.ts +2 -15
- package/dist/components/HomePage/HomePageDnD.d.ts +76 -0
- package/dist/components/HomePage/NavigationCard.d.ts +3 -1
- package/dist/components/HomePage/NavigationCardBinding.d.ts +4 -3
- package/dist/components/HomePage/NavigationGroup.d.ts +7 -1
- package/dist/components/HomePage/RenameGroupDialog.d.ts +9 -0
- package/dist/components/PropertyConfigBadge.d.ts +2 -1
- package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
- package/dist/components/ReferenceWidget.d.ts +3 -1
- package/dist/components/SelectableTable/SelectableTable.d.ts +14 -4
- 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 +24 -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 +5 -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 +43 -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/field_configs.d.ts +1 -1
- package/dist/core/index.d.ts +4 -4
- package/dist/form/EntityForm.d.ts +37 -64
- package/dist/form/EntityFormActions.d.ts +21 -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/ReferenceAsStringFieldBinding.d.ts +9 -0
- package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -2
- package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +5 -13
- package/dist/form/field_bindings/SwitchFieldBinding.d.ts +1 -2
- package/dist/form/field_bindings/TextFieldBinding.d.ts +1 -1
- package/dist/form/index.d.ts +17 -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 +57 -13
- 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 +23088 -13940
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +25823 -588
- package/dist/index.umd.js.map +1 -1
- package/dist/internal/useBuildDataSource.d.ts +3 -17
- package/dist/internal/useBuildSideEntityController.d.ts +3 -3
- 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/analytics.d.ts +1 -1
- package/dist/types/auth.d.ts +8 -10
- package/dist/types/collections.d.ts +110 -25
- package/dist/types/customization_controller.d.ts +8 -0
- 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 +72 -8
- package/dist/types/entity_callbacks.d.ts +16 -16
- package/dist/types/entity_overrides.d.ts +2 -2
- package/dist/types/export_import.d.ts +4 -4
- package/dist/types/fields.d.ts +74 -42
- package/dist/types/firecms.d.ts +16 -3
- package/dist/types/firecms_context.d.ts +1 -1
- package/dist/types/index.d.ts +0 -1
- package/dist/types/navigation.d.ts +62 -19
- package/dist/types/permissions.d.ts +4 -4
- package/dist/types/plugins.d.ts +56 -13
- package/dist/types/properties.d.ts +80 -24
- package/dist/types/property_config.d.ts +1 -3
- package/dist/types/roles.d.ts +3 -0
- package/dist/types/side_dialogs_controller.d.ts +10 -0
- package/dist/types/side_entity_controller.d.ts +14 -1
- package/dist/types/storage.d.ts +75 -0
- package/dist/types/user.d.ts +1 -0
- package/dist/util/builders.d.ts +3 -3
- package/dist/util/callbacks.d.ts +2 -0
- package/dist/util/createFormexStub.d.ts +2 -0
- package/dist/util/entities.d.ts +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 +7 -4
- package/dist/util/index.d.ts +3 -0
- package/dist/util/navigation_from_path.d.ts +10 -1
- package/dist/util/navigation_utils.d.ts +15 -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 +4 -4
- package/dist/util/references.d.ts +2 -2
- package/dist/util/resolutions.d.ts +42 -17
- package/dist/util/storage.d.ts +23 -2
- package/dist/util/useStorageUploadController.d.ts +3 -3
- package/package.json +64 -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 +447 -229
- package/src/components/CircularProgressCenter.tsx +2 -2
- package/src/components/ClearFilterSortButton.tsx +41 -0
- package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +12 -11
- package/src/components/DeleteEntityDialog.tsx +13 -20
- package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +65 -40
- package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +38 -31
- package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +30 -9
- package/src/components/EntityCollectionTable/PropertyTableCell.tsx +72 -42
- 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 +34 -39
- package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +49 -36
- package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +20 -8
- package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +135 -105
- package/src/components/EntityCollectionTable/internal/popup_field/useDraggable.tsx +9 -9
- package/src/components/EntityCollectionView/EntityCollectionView.tsx +235 -118
- package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +7 -4
- 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 +80 -59
- package/src/components/EntityView.tsx +13 -10
- package/src/components/ErrorView.tsx +4 -4
- package/src/components/FireCMSLogo.tsx +7 -51
- package/src/components/HomePage/DefaultHomePage.tsx +499 -157
- package/src/components/HomePage/FavouritesView.tsx +9 -14
- package/src/components/HomePage/HomePageDnD.tsx +599 -0
- package/src/components/HomePage/NavigationCard.tsx +48 -39
- package/src/components/HomePage/NavigationCardBinding.tsx +17 -16
- package/src/components/HomePage/NavigationGroup.tsx +63 -29
- package/src/components/HomePage/RenameGroupDialog.tsx +117 -0
- 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 +21 -13
- package/src/components/ReferenceWidget.tsx +21 -11
- package/src/components/SearchIconsView.tsx +10 -7
- package/src/components/SelectableTable/SelectableTable.tsx +157 -145
- 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 +46 -0
- package/src/components/VirtualTable/VirtualTable.tsx +105 -51
- 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 +28 -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 +2 -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 +64 -44
- 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 +6 -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 +435 -470
- package/src/core/EntityEditViewFormActions.tsx +329 -0
- package/src/core/EntitySidePanel.tsx +88 -21
- package/src/core/FireCMS.tsx +74 -58
- 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 +26 -13
- package/src/core/index.tsx +6 -5
- package/src/form/EntityForm.tsx +620 -534
- package/src/form/EntityFormActions.tsx +211 -0
- package/src/form/PropertyFieldBinding.tsx +88 -45
- package/src/form/components/CustomIdField.tsx +9 -3
- 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 +23 -13
- package/src/form/components/StorageUploadProgress.tsx +5 -6
- package/src/form/components/index.tsx +3 -1
- package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +34 -19
- package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +50 -36
- 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 +61 -52
- package/src/form/field_bindings/MapFieldBinding.tsx +73 -55
- package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +159 -0
- package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +26 -21
- package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +11 -16
- package/src/form/field_bindings/ReferenceAsStringFieldBinding.tsx +135 -0
- package/src/form/field_bindings/ReferenceFieldBinding.tsx +42 -31
- package/src/form/field_bindings/RepeatFieldBinding.tsx +62 -35
- package/src/form/field_bindings/SelectFieldBinding.tsx +24 -15
- package/src/form/field_bindings/StorageUploadFieldBinding.tsx +257 -199
- package/src/form/field_bindings/SwitchFieldBinding.tsx +29 -24
- package/src/form/field_bindings/TextFieldBinding.tsx +28 -24
- package/src/form/index.tsx +17 -37
- package/src/form/useClearRestoreValue.tsx +2 -2
- package/src/form/validation.ts +13 -23
- package/src/hooks/data/delete.ts +6 -5
- package/src/hooks/data/save.ts +26 -33
- 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 +440 -119
- package/src/hooks/useFireCMSContext.tsx +3 -33
- package/src/hooks/useLargeLayout.tsx +0 -35
- package/src/hooks/useModeController.tsx +1 -2
- package/src/hooks/useProjectLog.tsx +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 +79 -85
- package/src/internal/useBuildSideDialogsController.tsx +4 -2
- package/src/internal/useBuildSideEntityController.tsx +204 -77
- package/src/internal/useUnsavedChangesDialog.tsx +127 -91
- package/src/preview/PropertyPreview.tsx +34 -25
- 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 +26 -37
- package/src/preview/components/ReferencePreview.tsx +23 -34
- package/src/preview/components/StorageThumbnail.tsx +5 -1
- package/src/preview/components/UrlComponentPreview.tsx +60 -28
- package/src/preview/property_previews/ArrayOfMapsPreview.tsx +6 -6
- package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +7 -5
- package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +5 -4
- package/src/preview/property_previews/ArrayOfStringsPreview.tsx +4 -4
- package/src/preview/property_previews/ArrayOneOfPreview.tsx +7 -6
- package/src/preview/property_previews/ArrayPropertyPreview.tsx +7 -6
- package/src/preview/property_previews/MapPropertyPreview.tsx +12 -11
- package/src/preview/property_previews/SkeletonPropertyComponent.tsx +13 -13
- 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 +246 -0
- package/src/routes/HomePageRoute.tsx +17 -0
- package/src/types/analytics.ts +3 -0
- package/src/types/auth.tsx +9 -13
- package/src/types/collections.ts +132 -30
- package/src/types/customization_controller.tsx +9 -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 +86 -10
- 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 +85 -46
- package/src/types/firecms.tsx +18 -4
- package/src/types/firecms_context.tsx +1 -1
- package/src/types/index.ts +0 -1
- package/src/types/navigation.ts +77 -24
- package/src/types/permissions.ts +5 -5
- package/src/types/plugins.tsx +66 -15
- package/src/types/properties.ts +95 -26
- package/src/types/property_config.tsx +1 -2
- package/src/types/roles.ts +3 -0
- package/src/types/side_dialogs_controller.tsx +15 -0
- package/src/types/side_entity_controller.tsx +16 -1
- package/src/types/storage.ts +83 -1
- package/src/types/user.ts +2 -0
- package/src/util/builders.ts +10 -8
- package/src/util/callbacks.ts +119 -0
- package/src/util/createFormexStub.tsx +62 -0
- package/src/util/entities.ts +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 +36 -11
- package/src/util/index.ts +3 -0
- package/src/util/join_collections.ts +9 -2
- package/src/util/make_properties_editable.ts +13 -5
- package/src/util/navigation_from_path.ts +33 -12
- package/src/util/navigation_utils.ts +141 -25
- package/src/util/objects.ts +90 -33
- 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 +17 -6
- package/src/util/references.ts +19 -8
- package/src/util/resolutions.ts +122 -48
- package/src/util/storage.ts +79 -21
- package/src/util/strings.ts +2 -2
- package/src/util/useStorageUploadController.tsx +91 -28
- package/dist/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.d.ts +0 -5
- 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/EntityCollectionTable/internal/popup_field/ElementResizeListener.tsx +0 -59
- 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
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { ArrowForwardIcon, Card,
|
|
1
|
+
import { ArrowForwardIcon, Card, cls, Markdown, Typography, } from "@firecms/ui";
|
|
2
|
+
import React from "react"; // Import React
|
|
2
3
|
|
|
3
4
|
export type NavigationCardProps = {
|
|
4
5
|
name: string,
|
|
@@ -6,64 +7,72 @@ export type NavigationCardProps = {
|
|
|
6
7
|
actions: React.ReactNode;
|
|
7
8
|
icon: React.ReactNode;
|
|
8
9
|
onClick?: () => void,
|
|
10
|
+
shrink?: boolean
|
|
9
11
|
};
|
|
10
12
|
|
|
11
|
-
|
|
13
|
+
// Wrap the component with React.memo
|
|
14
|
+
export const NavigationCard = React.memo(function NavigationCard({
|
|
12
15
|
name,
|
|
13
16
|
description,
|
|
14
17
|
icon,
|
|
15
18
|
actions,
|
|
16
19
|
onClick,
|
|
20
|
+
shrink
|
|
17
21
|
}: NavigationCardProps) {
|
|
18
22
|
|
|
19
|
-
return (
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
23
|
+
return (
|
|
24
|
+
<Card
|
|
25
|
+
className={cls(
|
|
26
|
+
"h-full p-4 cursor-pointer min-h-[230px] transition-all duration-200 ease-in-out",
|
|
27
|
+
shrink && "w-full max-w-full min-h-0 scale-75"
|
|
28
|
+
)}
|
|
29
|
+
onClick={() => {
|
|
30
|
+
onClick?.();
|
|
31
|
+
}}
|
|
32
|
+
>
|
|
33
|
+
|
|
34
|
+
<div className="flex flex-col items-start h-full">
|
|
35
|
+
<div
|
|
36
|
+
className="flex-grow w-full">
|
|
24
37
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
className="flex-grow w-full">
|
|
38
|
+
<div
|
|
39
|
+
className="h-10 flex items-center w-full justify-between text-surface-300 dark:text-surface-600">
|
|
28
40
|
|
|
29
|
-
|
|
30
|
-
className="h-10 flex items-center w-full justify-between text-gray-300 dark:text-gray-600">
|
|
41
|
+
{icon}
|
|
31
42
|
|
|
32
|
-
|
|
43
|
+
<div
|
|
44
|
+
className="flex items-center gap-1"
|
|
45
|
+
onClick={(event: React.MouseEvent) => {
|
|
46
|
+
event.preventDefault();
|
|
47
|
+
event.stopPropagation();
|
|
48
|
+
}}>
|
|
33
49
|
|
|
34
|
-
|
|
35
|
-
className="flex items-center gap-1"
|
|
36
|
-
onClick={(event: React.MouseEvent) => {
|
|
37
|
-
event.preventDefault();
|
|
38
|
-
event.stopPropagation();
|
|
39
|
-
}}>
|
|
50
|
+
{actions}
|
|
40
51
|
|
|
41
|
-
|
|
52
|
+
</div>
|
|
42
53
|
|
|
43
54
|
</div>
|
|
44
55
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
{name}
|
|
50
|
-
</Typography>
|
|
56
|
+
<Typography gutterBottom variant="h5"
|
|
57
|
+
component="h2">
|
|
58
|
+
{name}
|
|
59
|
+
</Typography>
|
|
51
60
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
61
|
+
{description && <Typography variant="body2"
|
|
62
|
+
color="secondary"
|
|
63
|
+
component="div">
|
|
64
|
+
<Markdown source={description} size={"small"}/>
|
|
65
|
+
</Typography>}
|
|
66
|
+
</div>
|
|
58
67
|
|
|
59
|
-
|
|
68
|
+
<div style={{ alignSelf: "flex-end" }}>
|
|
60
69
|
|
|
61
|
-
|
|
62
|
-
|
|
70
|
+
<div className={"p-4"}>
|
|
71
|
+
<ArrowForwardIcon className="text-primary"/>
|
|
72
|
+
</div>
|
|
63
73
|
</div>
|
|
64
|
-
</div>
|
|
65
74
|
|
|
66
|
-
|
|
75
|
+
</div>
|
|
67
76
|
|
|
68
|
-
|
|
69
|
-
}
|
|
77
|
+
</Card>)
|
|
78
|
+
});
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { useNavigate } from "react-router-dom";
|
|
2
2
|
|
|
3
3
|
import { useCustomizationController, useFireCMSContext } from "../../hooks";
|
|
4
|
-
import {
|
|
4
|
+
import { NavigationEntry, PluginHomePageActionsProps } from "../../types";
|
|
5
5
|
import { IconForView } from "../../util";
|
|
6
6
|
import { useUserConfigurationPersistence } from "../../hooks/useUserConfigurationPersistence";
|
|
7
|
-
import { IconButton,
|
|
7
|
+
import { IconButton, StarIcon } from "@firecms/ui";
|
|
8
8
|
import { NavigationCard } from "./NavigationCard";
|
|
9
9
|
import { SmallNavigationCard } from "./SmallNavigationCard";
|
|
10
|
+
import React from "react";
|
|
10
11
|
|
|
11
12
|
/**
|
|
12
13
|
* This is the component used in the home page to render a card for each
|
|
@@ -19,7 +20,7 @@ import { SmallNavigationCard } from "./SmallNavigationCard";
|
|
|
19
20
|
* @param name
|
|
20
21
|
* @param description
|
|
21
22
|
* @param onClick
|
|
22
|
-
|
|
23
|
+
|
|
23
24
|
*/
|
|
24
25
|
export function NavigationCardBinding({
|
|
25
26
|
path,
|
|
@@ -29,9 +30,11 @@ export function NavigationCardBinding({
|
|
|
29
30
|
name,
|
|
30
31
|
description,
|
|
31
32
|
onClick,
|
|
32
|
-
type
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
type,
|
|
34
|
+
shrink
|
|
35
|
+
}: NavigationEntry & {
|
|
36
|
+
onClick?: () => void,
|
|
37
|
+
shrink?: boolean // <-- add shrink prop type
|
|
35
38
|
}) {
|
|
36
39
|
|
|
37
40
|
const userConfigurationPersistence = useUserConfigurationPersistence();
|
|
@@ -47,6 +50,7 @@ export function NavigationCardBinding({
|
|
|
47
50
|
? [
|
|
48
51
|
<IconButton
|
|
49
52
|
key={"favourite"}
|
|
53
|
+
size={"small"}
|
|
50
54
|
onClick={(e) => {
|
|
51
55
|
e.preventDefault();
|
|
52
56
|
e.stopPropagation();
|
|
@@ -60,14 +64,9 @@ export function NavigationCardBinding({
|
|
|
60
64
|
);
|
|
61
65
|
}
|
|
62
66
|
}}>
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
size={18}
|
|
67
|
-
className={"text-secondary"}/>
|
|
68
|
-
: <StarBorderIcon
|
|
69
|
-
size={18}
|
|
70
|
-
className={"text-gray-400 dark:text-gray-500"}/>}
|
|
67
|
+
<StarIcon
|
|
68
|
+
size={"small"}
|
|
69
|
+
className={favourite ? "text-secondary" : "text-surface-400 dark:text-surface-500"}/>
|
|
71
70
|
</IconButton>
|
|
72
71
|
]
|
|
73
72
|
: [];
|
|
@@ -96,7 +95,7 @@ export function NavigationCardBinding({
|
|
|
96
95
|
if (type === "admin") {
|
|
97
96
|
return <SmallNavigationCard icon={collectionIcon}
|
|
98
97
|
name={name}
|
|
99
|
-
url={url}
|
|
98
|
+
url={url}/>;
|
|
100
99
|
}
|
|
101
100
|
|
|
102
101
|
return <NavigationCard
|
|
@@ -112,5 +111,7 @@ export function NavigationCardBinding({
|
|
|
112
111
|
[path, ...(userConfigurationPersistence.recentlyVisitedPaths ?? []).filter(p => p !== path)]
|
|
113
112
|
);
|
|
114
113
|
}
|
|
115
|
-
}}
|
|
114
|
+
}}
|
|
115
|
+
shrink={shrink}
|
|
116
|
+
/>;
|
|
116
117
|
}
|
|
@@ -1,39 +1,73 @@
|
|
|
1
|
-
import { PropsWithChildren } from "react";
|
|
2
|
-
import {
|
|
3
|
-
import { ExpandablePanel, Typography } from "@firecms/ui";
|
|
1
|
+
import React, { PropsWithChildren, useState } from "react";
|
|
2
|
+
import { cls, EditIcon, IconButton, Typography } from "@firecms/ui";
|
|
4
3
|
|
|
5
4
|
export function NavigationGroup({
|
|
6
5
|
children,
|
|
7
|
-
group
|
|
6
|
+
group,
|
|
7
|
+
minimised,
|
|
8
|
+
isPreview,
|
|
9
|
+
isPotentialCardDropTarget,
|
|
10
|
+
onEditGroup, // New prop to handle editing
|
|
11
|
+
dndDisabled // New prop to disable editing when D&D is off
|
|
8
12
|
}: PropsWithChildren<{
|
|
9
|
-
group: string | undefined
|
|
13
|
+
group: string | undefined,
|
|
14
|
+
minimised?: boolean,
|
|
15
|
+
isPreview?: boolean,
|
|
16
|
+
isPotentialCardDropTarget?: boolean,
|
|
17
|
+
onEditGroup?: (groupName: string) => void; // Callback to open dialog
|
|
18
|
+
dndDisabled?: boolean; // Added dndDisabled prop
|
|
10
19
|
}>) {
|
|
11
|
-
const userConfigurationPersistence = useUserConfigurationPersistence();
|
|
12
|
-
return (
|
|
13
|
-
<ExpandablePanel
|
|
14
|
-
invisible={true}
|
|
15
|
-
titleClassName={"font-medium text-sm text-gray-600 dark:text-gray-400"}
|
|
16
|
-
className={"py-4"}
|
|
17
|
-
initiallyExpanded={!(userConfigurationPersistence?.collapsedGroups ?? []).includes(group ?? "ungrouped")}
|
|
18
|
-
onExpandedChange={expanded => {
|
|
19
|
-
if (userConfigurationPersistence) {
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
{group?.toUpperCase() ?? "Views".toUpperCase()}
|
|
32
|
-
</Typography>}>
|
|
21
|
+
const [isHovered, setIsHovered] = useState(false);
|
|
22
|
+
const currentGroupName = group ?? "Views";
|
|
23
|
+
|
|
24
|
+
return (
|
|
25
|
+
<div className={cls(
|
|
26
|
+
!isPotentialCardDropTarget ? "my-10" : "my-6",
|
|
27
|
+
"transition-all duration-200 ease-in-out"
|
|
28
|
+
)}
|
|
29
|
+
>
|
|
30
|
+
<div className={`flex items-center ${isPreview ? "px-1 py-0.5 m-0" : "ml-3.5 mt-6"} `}
|
|
33
31
|
|
|
34
|
-
|
|
35
|
-
|
|
32
|
+
onMouseEnter={() => setIsHovered(true)}
|
|
33
|
+
onMouseLeave={() => setIsHovered(false)}>
|
|
34
|
+
<Typography
|
|
35
|
+
variant={isPreview ? "body2" : "caption"}
|
|
36
|
+
component={"h2"}
|
|
37
|
+
color="secondary"
|
|
38
|
+
// Minimal padding and no margin for preview title
|
|
39
|
+
className={`${isPreview ? "px-1 py-0.5" : "ml-3.5"} font-medium uppercase text-sm text-surface-600 dark:text-surface-400`}
|
|
40
|
+
>
|
|
41
|
+
{currentGroupName}
|
|
42
|
+
</Typography>
|
|
43
|
+
{!isPreview && onEditGroup && !dndDisabled && (
|
|
44
|
+
<IconButton
|
|
45
|
+
size="smallest"
|
|
46
|
+
onClick={(e) => {
|
|
47
|
+
e.stopPropagation(); // Prevent other click events
|
|
48
|
+
onEditGroup(currentGroupName);
|
|
49
|
+
}}
|
|
50
|
+
className={cls("ml-2 ", isHovered ? "opacity-100" : "opacity-0", "transition-opacity duration-100")}
|
|
51
|
+
>
|
|
52
|
+
<EditIcon size="smallest"/>
|
|
53
|
+
</IconButton>
|
|
54
|
+
)}
|
|
36
55
|
</div>
|
|
37
|
-
|
|
56
|
+
|
|
57
|
+
{isPreview ? (
|
|
58
|
+
children
|
|
59
|
+
) : minimised ? (
|
|
60
|
+
// For minimised view in the main list
|
|
61
|
+
<div className={cls("mt-4 p-8 bg-surface-accent-200 dark:bg-surface-accent-800 rounded-lg")}
|
|
62
|
+
style={{ minHeight: "50px" }}>
|
|
63
|
+
</div>
|
|
64
|
+
) : (
|
|
65
|
+
// If highlighted, the parent div already has padding, so children (NavigationGroupDroppable) don't need extra margin top as much.
|
|
66
|
+
// The inner content of NavigationGroupDroppable will define its own padding if needed when active.
|
|
67
|
+
<div className={cls("mt-4", !minimised ? "pt-0" : "")}>
|
|
68
|
+
{children}
|
|
69
|
+
</div>
|
|
70
|
+
)}
|
|
71
|
+
</div>
|
|
38
72
|
);
|
|
39
73
|
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import React, { useState, useEffect, useRef } from "react";
|
|
2
|
+
import { Button, Dialog, DialogActions, DialogContent, DialogTitle, TextField } from "@firecms/ui";
|
|
3
|
+
|
|
4
|
+
interface RenameGroupDialogProps {
|
|
5
|
+
open: boolean;
|
|
6
|
+
initialName: string;
|
|
7
|
+
existingGroupNames: string[]; // Names of other existing groups to check for duplicates
|
|
8
|
+
onClose: () => void;
|
|
9
|
+
onRename: (newName: string) => void;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function RenameGroupDialog({ open, initialName, existingGroupNames, onClose, onRename }: RenameGroupDialogProps) {
|
|
13
|
+
const [name, setName] = useState(initialName);
|
|
14
|
+
const [error, setError] = useState<string | null>(null);
|
|
15
|
+
const inputRef = useRef<HTMLInputElement | HTMLTextAreaElement | null>(null); // Create a ref for the input
|
|
16
|
+
|
|
17
|
+
useEffect(() => {
|
|
18
|
+
if (open) {
|
|
19
|
+
setName(initialName);
|
|
20
|
+
setError(null);
|
|
21
|
+
// Focus and select text when dialog opens
|
|
22
|
+
setTimeout(() => { // setTimeout to ensure the input is rendered and focusable
|
|
23
|
+
if (inputRef.current) {
|
|
24
|
+
inputRef.current.focus();
|
|
25
|
+
inputRef.current.select();
|
|
26
|
+
}
|
|
27
|
+
}, 100);
|
|
28
|
+
}
|
|
29
|
+
}, [initialName, open]);
|
|
30
|
+
|
|
31
|
+
const handleNameChange = (event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
|
|
32
|
+
const newName = event.target.value;
|
|
33
|
+
setName(newName);
|
|
34
|
+
if (!newName.trim()) {
|
|
35
|
+
setError("Group name cannot be empty.");
|
|
36
|
+
} else if (existingGroupNames.includes(newName.trim())) {
|
|
37
|
+
setError("This group name already exists.");
|
|
38
|
+
} else {
|
|
39
|
+
setError(null);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const handleSave = () => {
|
|
44
|
+
const trimmedName = name.trim();
|
|
45
|
+
if (!trimmedName) {
|
|
46
|
+
setError("Group name cannot be empty.");
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (existingGroupNames.includes(trimmedName)) {
|
|
50
|
+
setError("This group name already exists.");
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (!error) {
|
|
54
|
+
onRename(trimmedName);
|
|
55
|
+
onClose();
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>) => {
|
|
60
|
+
if (event.key === "Enter") {
|
|
61
|
+
event.preventDefault(); // Prevent default form submission behavior
|
|
62
|
+
const trimmedName = name.trim();
|
|
63
|
+
// We need to check the error state directly as well,
|
|
64
|
+
// because the error state might not have updated if the user types and immediately hits enter.
|
|
65
|
+
let currentError = null;
|
|
66
|
+
if (!trimmedName) {
|
|
67
|
+
currentError = "Group name cannot be empty.";
|
|
68
|
+
} else if (existingGroupNames.includes(trimmedName)) {
|
|
69
|
+
currentError = "This group name already exists.";
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (!currentError && trimmedName) {
|
|
73
|
+
handleSave();
|
|
74
|
+
} else if (currentError) {
|
|
75
|
+
setError(currentError); // Ensure error is displayed if trying to submit with Enter
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
const handleClose = () => {
|
|
81
|
+
setName(initialName);
|
|
82
|
+
setError(null);
|
|
83
|
+
onClose();
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
if (!open) return null;
|
|
87
|
+
|
|
88
|
+
return (
|
|
89
|
+
<Dialog open={open} onOpenChange={onClose}>
|
|
90
|
+
<DialogTitle>Rename Group</DialogTitle>
|
|
91
|
+
<DialogContent>
|
|
92
|
+
<TextField
|
|
93
|
+
inputRef={inputRef} // Pass the ref to the TextField
|
|
94
|
+
label="Group Name"
|
|
95
|
+
value={name}
|
|
96
|
+
onChange={handleNameChange}
|
|
97
|
+
onKeyDown={handleKeyDown} // Added onKeyDown handler
|
|
98
|
+
error={!!error}
|
|
99
|
+
aria-describedby={error ? "group-name-error" : undefined}
|
|
100
|
+
/>
|
|
101
|
+
{error && <p id="group-name-error" style={{ display: "none" }}>{error}</p>}
|
|
102
|
+
</DialogContent>
|
|
103
|
+
<DialogActions>
|
|
104
|
+
<Button onClick={onClose}
|
|
105
|
+
color={"primary"}
|
|
106
|
+
variant="text">
|
|
107
|
+
Cancel
|
|
108
|
+
</Button>
|
|
109
|
+
<Button onClick={handleSave}
|
|
110
|
+
color={"primary"}
|
|
111
|
+
disabled={!!error || !name.trim()}>
|
|
112
|
+
Save
|
|
113
|
+
</Button>
|
|
114
|
+
</DialogActions>
|
|
115
|
+
</Dialog>
|
|
116
|
+
);
|
|
117
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { ArrowForwardIcon, cardClickableMixin, cardMixin,
|
|
1
|
+
import { ArrowForwardIcon, cardClickableMixin, cardMixin, cls, Typography, } from "@firecms/ui";
|
|
2
2
|
|
|
3
|
-
import { Link
|
|
3
|
+
import { Link } from "react-router-dom";
|
|
4
4
|
|
|
5
5
|
export type SmallNavigationCardProps = {
|
|
6
6
|
name: string,
|
|
@@ -17,11 +17,10 @@ export function SmallNavigationCard({
|
|
|
17
17
|
return (
|
|
18
18
|
<>
|
|
19
19
|
|
|
20
|
-
<
|
|
20
|
+
<Link
|
|
21
21
|
tabIndex={0}
|
|
22
|
-
className={
|
|
22
|
+
className={cls(cardMixin,
|
|
23
23
|
cardClickableMixin,
|
|
24
|
-
focusedMixin,
|
|
25
24
|
"cursor-pointer flex flex-row items-center px-4 py-2 text-inherit dark:text-inherit visited:text-inherit visited:dark:text-inherit hover:text-inherit hover:dark:text-inherit ")}
|
|
26
25
|
to={url}
|
|
27
26
|
>
|
|
@@ -39,7 +38,7 @@ export function SmallNavigationCard({
|
|
|
39
38
|
<div className={"p-4"}>
|
|
40
39
|
<ArrowForwardIcon color="primary"/>
|
|
41
40
|
</div>
|
|
42
|
-
</
|
|
41
|
+
</Link>
|
|
43
42
|
|
|
44
43
|
</>);
|
|
45
44
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import { Link
|
|
2
|
+
import { Link } from "react-router-dom";
|
|
3
3
|
import { Button, Typography } from "@firecms/ui";
|
|
4
4
|
|
|
5
5
|
export function NotFoundPage() {
|
|
@@ -17,7 +17,7 @@ export function NotFoundPage() {
|
|
|
17
17
|
</Typography>
|
|
18
18
|
<Button
|
|
19
19
|
variant={"text"}
|
|
20
|
-
component={
|
|
20
|
+
component={Link}
|
|
21
21
|
to={"/"}>Back to home</Button>
|
|
22
22
|
</div>
|
|
23
23
|
</div>
|
|
@@ -2,15 +2,21 @@ import { getIconForWidget } from "../util";
|
|
|
2
2
|
import { PropertyConfig } from "../types";
|
|
3
3
|
import { getDefaultFieldConfig } from "../core";
|
|
4
4
|
|
|
5
|
-
export function PropertyConfigBadge({
|
|
6
|
-
|
|
5
|
+
export function PropertyConfigBadge({
|
|
6
|
+
propertyConfig,
|
|
7
|
+
disabled
|
|
8
|
+
}: {
|
|
9
|
+
propertyConfig: PropertyConfig | undefined,
|
|
10
|
+
disabled?: boolean
|
|
11
|
+
}): React.ReactNode {
|
|
12
|
+
const classes = "h-8 w-8 p-1 rounded-full shadow text-white " + (disabled ? "bg-surface-400 dark:bg-surface-600" : "");
|
|
7
13
|
|
|
8
14
|
const defaultPropertyConfig = typeof propertyConfig?.property === "object" ? getDefaultFieldConfig(propertyConfig.property) : undefined;
|
|
9
15
|
|
|
10
16
|
return <div
|
|
11
17
|
className={classes}
|
|
12
18
|
style={{
|
|
13
|
-
background: propertyConfig?.color ?? defaultPropertyConfig?.color ?? "#888"
|
|
19
|
+
background: !disabled ? (propertyConfig?.color ?? defaultPropertyConfig?.color ?? "#888") : undefined
|
|
14
20
|
}}>
|
|
15
21
|
{propertyConfig?.Icon ? getIconForWidget(propertyConfig, "medium") : getIconForWidget(defaultPropertyConfig, "medium")}
|
|
16
22
|
</div>
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { ContentCopyIcon, IconButton, Tooltip, Typography } from "@firecms/ui";
|
|
2
|
+
import { useCallback, useState } from "react";
|
|
3
|
+
|
|
4
|
+
export function PropertyIdCopyTooltip({
|
|
5
|
+
propertyKey,
|
|
6
|
+
className,
|
|
7
|
+
children,
|
|
8
|
+
}: {
|
|
9
|
+
propertyKey: string,
|
|
10
|
+
className?: string,
|
|
11
|
+
children: React.ReactNode
|
|
12
|
+
}) {
|
|
13
|
+
return <Tooltip title={<PropertyIdCopyTooltipContent propertyKey={propertyKey}/>}
|
|
14
|
+
delayDuration={800}
|
|
15
|
+
side={"top"}
|
|
16
|
+
align={"start"}
|
|
17
|
+
sideOffset={8}
|
|
18
|
+
className={className}>
|
|
19
|
+
{children}
|
|
20
|
+
</Tooltip>
|
|
21
|
+
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function PropertyIdCopyTooltipContent({ propertyKey }: { propertyKey: string }) {
|
|
25
|
+
|
|
26
|
+
const [copied, setCopied] = useState(false);
|
|
27
|
+
|
|
28
|
+
return (
|
|
29
|
+
<div className={"flex flex-row gap-2 items-center justify-center text-white"}>
|
|
30
|
+
<div>
|
|
31
|
+
<Typography variant={"caption"} className={"min-w-20 text-surface-accent-400"}
|
|
32
|
+
color={"disabled"}>{copied ? "Copied" : "Property ID"}</Typography>
|
|
33
|
+
<Typography variant={"caption"} className={"text-white"}><code>{propertyKey}</code></Typography>
|
|
34
|
+
</div>
|
|
35
|
+
<IconButton size={"small"}>
|
|
36
|
+
<ContentCopyIcon size={"smallest"}
|
|
37
|
+
className={"text-white"}
|
|
38
|
+
onClick={useCallback(() => {
|
|
39
|
+
navigator.clipboard.writeText(propertyKey);
|
|
40
|
+
setCopied(true);
|
|
41
|
+
setTimeout(() => setCopied(false), 2000);
|
|
42
|
+
}, [propertyKey])}
|
|
43
|
+
/>
|
|
44
|
+
</IconButton>
|
|
45
|
+
</div>
|
|
46
|
+
);
|
|
47
|
+
}
|
|
@@ -4,7 +4,7 @@ import { CollectionSize, Entity, EntityCollection, FilterValues } from "../../ty
|
|
|
4
4
|
import {
|
|
5
5
|
EntityCollectionRowActions,
|
|
6
6
|
EntityCollectionTable,
|
|
7
|
-
|
|
7
|
+
useDataSourceTableController
|
|
8
8
|
} from "../EntityCollectionTable";
|
|
9
9
|
import {
|
|
10
10
|
useAuthController,
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
} from "../../hooks";
|
|
17
17
|
import { ErrorView } from "../ErrorView";
|
|
18
18
|
import { AddIcon, Button, DialogActions, Typography } from "@firecms/ui";
|
|
19
|
-
import { canCreateEntity,
|
|
19
|
+
import { canCreateEntity, IconForView, resolveCollection } from "../../util";
|
|
20
20
|
import { useSelectionController } from "../EntityCollectionView/useSelectionController";
|
|
21
21
|
import { useColumnIds, useTableSearchHelper } from "../common";
|
|
22
22
|
import { useSideDialogContext } from "../../core";
|
|
@@ -101,13 +101,14 @@ export function ReferenceSelectionTable<M extends Record<string, any>>(
|
|
|
101
101
|
maxSelection,
|
|
102
102
|
}: ReferenceSelectionInnerProps<M>) {
|
|
103
103
|
|
|
104
|
+
const authController = useAuthController();
|
|
104
105
|
const sideDialogContext = useSideDialogContext();
|
|
105
106
|
const sideEntityController = useSideEntityController();
|
|
106
107
|
const navigation = useNavigationController();
|
|
107
108
|
const analyticsController = useAnalyticsController();
|
|
108
109
|
const customizationController = useCustomizationController();
|
|
109
110
|
|
|
110
|
-
const fullPath = navigation.
|
|
111
|
+
const fullPath = navigation.resolveIdsFrom(pathInput);
|
|
111
112
|
|
|
112
113
|
const dataSource = useDataSource(collection);
|
|
113
114
|
|
|
@@ -233,7 +234,9 @@ export function ReferenceSelectionTable<M extends Record<string, any>>(
|
|
|
233
234
|
selectionEnabled={multiselect}
|
|
234
235
|
hideId={collection?.hideIdFromCollection}
|
|
235
236
|
fullPath={fullPath}
|
|
236
|
-
selectionController={selectionController}
|
|
237
|
+
selectionController={selectionController}
|
|
238
|
+
openEntityMode={"side_panel"}
|
|
239
|
+
/>;
|
|
237
240
|
|
|
238
241
|
};
|
|
239
242
|
|
|
@@ -247,23 +250,22 @@ export function ReferenceSelectionTable<M extends Record<string, any>>(
|
|
|
247
250
|
error={"Could not find collection with id " + collection}/>
|
|
248
251
|
}
|
|
249
252
|
|
|
250
|
-
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
251
253
|
const resolvedCollection = useMemo(() => resolveCollection({
|
|
252
254
|
collection: collection,
|
|
253
255
|
path: fullPath,
|
|
254
256
|
values: {},
|
|
255
|
-
|
|
257
|
+
propertyConfigs: customizationController.propertyConfigs,
|
|
258
|
+
authController
|
|
256
259
|
}), [collection, customizationController.propertyConfigs, fullPath]);
|
|
257
260
|
|
|
258
|
-
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
259
261
|
const displayedColumnIds = useColumnIds(resolvedCollection, false);
|
|
260
262
|
|
|
261
|
-
|
|
262
|
-
const tableController = useDataSourceEntityCollectionTableController<M>({
|
|
263
|
+
const tableController = useDataSourceTableController<M>({
|
|
263
264
|
fullPath,
|
|
264
265
|
collection,
|
|
265
266
|
entitiesDisplayedFirst,
|
|
266
|
-
forceFilter
|
|
267
|
+
forceFilter,
|
|
268
|
+
updateUrl: false,
|
|
267
269
|
});
|
|
268
270
|
|
|
269
271
|
const {
|
|
@@ -272,7 +274,6 @@ export function ReferenceSelectionTable<M extends Record<string, any>>(
|
|
|
272
274
|
onTextSearchClick,
|
|
273
275
|
textSearchEnabled
|
|
274
276
|
} =
|
|
275
|
-
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
276
277
|
useTableSearchHelper({
|
|
277
278
|
collection,
|
|
278
279
|
fullPath,
|
|
@@ -291,9 +292,16 @@ export function ReferenceSelectionTable<M extends Record<string, any>>(
|
|
|
291
292
|
displayedColumnIds={displayedColumnIds}
|
|
292
293
|
onEntityClick={onEntityClick}
|
|
293
294
|
tableController={tableController}
|
|
295
|
+
enablePopupIcon={false}
|
|
294
296
|
tableRowActionsBuilder={tableRowActionsBuilder}
|
|
295
|
-
|
|
296
|
-
|
|
297
|
+
openEntityMode={"side_panel"}
|
|
298
|
+
title={<Typography variant={"subtitle2"} className={"flex flex-row gap-2"}>
|
|
299
|
+
<IconForView
|
|
300
|
+
size={"small"}
|
|
301
|
+
collectionOrView={collection}
|
|
302
|
+
className={"text-surface-300 dark:text-surface-600"}/>
|
|
303
|
+
{collection.singularName ? `Select ${collection.singularName}` : `Select
|
|
304
|
+
from ${collection.name}`}
|
|
297
305
|
</Typography>}
|
|
298
306
|
defaultSize={collection.defaultSize}
|
|
299
307
|
properties={resolvedCollection.properties}
|