@firecms/core 3.0.0-canary.29 → 3.0.0-canary.290
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 +10 -7
- package/dist/components/ErrorView.d.ts +1 -1
- package/dist/components/HomePage/DefaultHomePage.d.ts +2 -15
- package/dist/components/HomePage/HomePageDnD.d.ts +77 -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 +8 -1
- package/dist/components/HomePage/RenameGroupDialog.d.ts +9 -0
- package/dist/components/PropertyCollectionView.d.ts +23 -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/UserDisplay.d.ts +7 -0
- package/dist/components/VirtualTable/VirtualTableProps.d.ts +24 -12
- package/dist/components/VirtualTable/fields/VirtualTableUserSelect.d.ts +12 -0
- 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/contexts/InternalUserManagementContext.d.ts +3 -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 +49 -11
- package/dist/core/EntityEditViewFormActions.d.ts +2 -0
- package/dist/core/FireCMS.d.ts +2 -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 +40 -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/LocalChangesMenu.d.ts +11 -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/field_bindings/UserSelectFieldBinding.d.ts +12 -0
- package/dist/form/index.d.ts +18 -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 +3 -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/useCollapsedGroups.d.ts +9 -0
- package/dist/hooks/useFireCMSContext.d.ts +1 -1
- package/dist/hooks/useInternalUserManagementController.d.ts +12 -0
- 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 +24546 -13965
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +27256 -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 +4 -3
- package/dist/preview/components/StorageThumbnail.d.ts +2 -1
- package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
- package/dist/preview/components/UserPreview.d.ts +8 -0
- package/dist/preview/index.d.ts +1 -0
- 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 +123 -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 +12 -3
- 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 +79 -39
- package/dist/types/firecms.d.ts +31 -3
- package/dist/types/firecms_context.d.ts +17 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/internal_user_management.d.ts +20 -0
- package/dist/types/navigation.d.ts +62 -19
- package/dist/types/permissions.d.ts +4 -4
- package/dist/types/plugins.d.ts +58 -13
- package/dist/types/properties.d.ts +122 -31
- 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 +2 -1
- package/dist/util/builders.d.ts +3 -3
- package/dist/util/callbacks.d.ts +2 -0
- package/dist/util/collections.d.ts +1 -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 +28 -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/make_properties_editable.d.ts +1 -2
- 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 +3 -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 +4 -3
- package/package.json +70 -53
- 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 +87 -62
- package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +38 -31
- package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +30 -9
- package/src/components/EntityCollectionTable/PropertyTableCell.tsx +84 -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 +241 -119
- 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 +83 -62
- package/src/components/EntityView.tsx +34 -42
- package/src/components/ErrorView.tsx +4 -4
- package/src/components/FireCMSLogo.tsx +7 -51
- package/src/components/HomePage/DefaultHomePage.tsx +516 -158
- package/src/components/HomePage/FavouritesView.tsx +9 -14
- package/src/components/HomePage/HomePageDnD.tsx +702 -0
- package/src/components/HomePage/NavigationCard.tsx +48 -39
- package/src/components/HomePage/NavigationCardBinding.tsx +17 -16
- package/src/components/HomePage/NavigationGroup.tsx +144 -30
- package/src/components/HomePage/RenameGroupDialog.tsx +123 -0
- package/src/components/HomePage/SmallNavigationCard.tsx +5 -6
- package/src/components/NotFoundPage.tsx +2 -2
- package/src/components/PropertyCollectionView.tsx +329 -0
- package/src/components/PropertyConfigBadge.tsx +10 -4
- package/src/components/PropertyIdCopyTooltip.tsx +47 -0
- package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +23 -13
- package/src/components/ReferenceWidget.tsx +21 -11
- package/src/components/SearchIconsView.tsx +10 -7
- package/src/components/SelectableTable/SelectableTable.tsx +157 -157
- package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
- package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +27 -9
- package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +36 -12
- package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +92 -24
- package/src/components/UnsavedChangesDialog.tsx +46 -0
- package/src/components/UserDisplay.tsx +55 -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/fields/VirtualTableUserSelect.tsx +99 -0
- 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 +16 -2
- 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/InternalUserManagementContext.tsx +4 -0
- 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 +447 -469
- package/src/core/EntityEditViewFormActions.tsx +344 -0
- package/src/core/EntitySidePanel.tsx +96 -23
- package/src/core/FireCMS.tsx +85 -60
- 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 +41 -14
- package/src/core/index.tsx +6 -5
- package/src/form/EntityForm.tsx +740 -523
- package/src/form/EntityFormActions.tsx +226 -0
- package/src/form/PropertyFieldBinding.tsx +88 -41
- package/src/form/components/CustomIdField.tsx +9 -3
- package/src/form/components/ErrorFocus.tsx +22 -29
- 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/LocalChangesMenu.tsx +144 -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 -33
- 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/field_bindings/UserSelectFieldBinding.tsx +94 -0
- package/src/form/index.tsx +21 -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 +4 -0
- package/src/hooks/useAuthController.tsx +1 -1
- package/src/hooks/useBreadcrumbsController.tsx +31 -0
- package/src/hooks/useBrowserTitleAndIcon.tsx +1 -1
- package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
- package/src/hooks/useBuildModeController.tsx +22 -29
- package/src/hooks/useBuildNavigationController.tsx +515 -121
- package/src/hooks/useCollapsedGroups.ts +64 -0
- package/src/hooks/useFireCMSContext.tsx +9 -35
- package/src/hooks/useInternalUserManagementController.tsx +16 -0
- 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 +42 -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 +30 -38
- package/src/preview/components/StorageThumbnail.tsx +5 -1
- package/src/preview/components/UrlComponentPreview.tsx +60 -28
- package/src/preview/components/UserPreview.tsx +27 -0
- package/src/preview/index.ts +1 -0
- 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 +8 -7
- package/src/preview/property_previews/MapPropertyPreview.tsx +14 -13
- package/src/preview/property_previews/NumberPropertyPreview.tsx +2 -2
- 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 +146 -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 +19 -3
- 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 +91 -42
- package/src/types/firecms.tsx +34 -4
- package/src/types/firecms_context.tsx +18 -1
- package/src/types/index.ts +1 -1
- package/src/types/internal_user_management.ts +24 -0
- package/src/types/navigation.ts +77 -24
- package/src/types/permissions.ts +5 -5
- package/src/types/plugins.tsx +69 -15
- package/src/types/properties.ts +141 -33
- package/src/types/property_config.tsx +2 -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 +3 -1
- package/src/util/builders.ts +10 -8
- package/src/util/callbacks.ts +119 -0
- package/src/util/collections.ts +8 -0
- package/src/util/createFormexStub.tsx +66 -0
- package/src/util/entities.ts +11 -8
- package/src/util/entity_actions.ts +28 -0
- package/src/util/entity_cache.ts +223 -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 +11 -4
- package/src/util/make_properties_editable.ts +5 -19
- package/src/util/navigation_from_path.ts +33 -12
- package/src/util/navigation_utils.ts +141 -25
- package/src/util/objects.ts +128 -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 +162 -62
- 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
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { defaultBorderMixin, Typography } from "@firecms/ui";
|
|
3
|
+
import { PreviewSize, PropertyPreview } from "../preview";
|
|
4
|
+
import { ResolvedProperties, ResolvedProperty } from "../types";
|
|
5
|
+
import { getValueInPath } from "../util";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Build a readable label for a path and resolve the property
|
|
9
|
+
* Supports map and array (including arrays of maps)
|
|
10
|
+
*/
|
|
11
|
+
export function buildPropertyLabelAndGetProperty(
|
|
12
|
+
properties: ResolvedProperties,
|
|
13
|
+
key: string
|
|
14
|
+
): { label: string; property: ResolvedProperty | undefined } {
|
|
15
|
+
if (!key) return {
|
|
16
|
+
label: "",
|
|
17
|
+
property: undefined
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// Parse "a[0].b.c[2]" -> ["a", 0, "b", "c", 2]
|
|
21
|
+
const segments: (string | number)[] = [];
|
|
22
|
+
const re = /([^[.\]]+)|\[(\d+)\]/g;
|
|
23
|
+
let m: RegExpExecArray | null;
|
|
24
|
+
while ((m = re.exec(key)) !== null) {
|
|
25
|
+
if (m[1] !== undefined) segments.push(m[1]);
|
|
26
|
+
else if (m[2] !== undefined) segments.push(Number(m[2]));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
let currentProps: ResolvedProperties | undefined = properties;
|
|
30
|
+
let currentProp: ResolvedProperty | undefined;
|
|
31
|
+
let lastLabel = "";
|
|
32
|
+
|
|
33
|
+
const getArrayOfProp = (p?: ResolvedProperty): ResolvedProperty | undefined => {
|
|
34
|
+
if (!p || p.dataType !== "array") return undefined;
|
|
35
|
+
return Array.isArray(p.of) ? (p.of[0] as ResolvedProperty) : (p.of as ResolvedProperty | undefined);
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
for (const seg of segments) {
|
|
39
|
+
if (typeof seg === "number") {
|
|
40
|
+
// Last segment label should be the index itself
|
|
41
|
+
lastLabel = `[${seg}]`;
|
|
42
|
+
|
|
43
|
+
// Move schema context into the array element
|
|
44
|
+
if (currentProp?.dataType === "array") {
|
|
45
|
+
currentProp = getArrayOfProp(currentProp);
|
|
46
|
+
if (currentProp?.dataType === "map" && currentProp.properties) {
|
|
47
|
+
currentProps = currentProp.properties as ResolvedProperties;
|
|
48
|
+
} else {
|
|
49
|
+
currentProps = undefined;
|
|
50
|
+
}
|
|
51
|
+
} else {
|
|
52
|
+
// Index without array schema context
|
|
53
|
+
currentProp = undefined;
|
|
54
|
+
currentProps = undefined;
|
|
55
|
+
}
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// seg is a string key
|
|
60
|
+
if (currentProps && (currentProps as any)[seg]) {
|
|
61
|
+
const nextProp = (currentProps as any)[seg] as ResolvedProperty;
|
|
62
|
+
currentProp = nextProp;
|
|
63
|
+
// Last segment label should be the property name (or the raw key)
|
|
64
|
+
lastLabel = nextProp.name || String(seg);
|
|
65
|
+
|
|
66
|
+
if (nextProp.dataType === "map" && nextProp.properties) {
|
|
67
|
+
currentProps = nextProp.properties as ResolvedProperties;
|
|
68
|
+
} else if (nextProp.dataType === "array") {
|
|
69
|
+
// Keep array prop; the next segment (index) will step into its element schema
|
|
70
|
+
currentProps = undefined;
|
|
71
|
+
} else {
|
|
72
|
+
currentProps = undefined;
|
|
73
|
+
}
|
|
74
|
+
} else {
|
|
75
|
+
// Unknown key or no schema context
|
|
76
|
+
currentProp = undefined;
|
|
77
|
+
currentProps = undefined;
|
|
78
|
+
lastLabel = String(seg);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return {
|
|
83
|
+
label: lastLabel,
|
|
84
|
+
property: currentProp
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const pathEndsWithIndex = (p: string) => /\[\d+\]$/.test(p);
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Improved simple layout for nested changes:
|
|
92
|
+
* - Map or Array-of-Map -> section header + indented rows
|
|
93
|
+
* - Leaf or Array-of-Primitives -> single row with label and value
|
|
94
|
+
*/
|
|
95
|
+
export const PropertyCollectionView = ({
|
|
96
|
+
data,
|
|
97
|
+
properties,
|
|
98
|
+
baseKey = "",
|
|
99
|
+
suppressHeader = false,
|
|
100
|
+
size = "small"
|
|
101
|
+
}: {
|
|
102
|
+
data: any;
|
|
103
|
+
properties: ResolvedProperties;
|
|
104
|
+
baseKey?: string;
|
|
105
|
+
suppressHeader?: boolean;
|
|
106
|
+
size?: PreviewSize;
|
|
107
|
+
}) => {
|
|
108
|
+
|
|
109
|
+
const isTopLevel = !!baseKey && !baseKey.includes(".") && !baseKey.includes("[");
|
|
110
|
+
|
|
111
|
+
// Arrays
|
|
112
|
+
if (Array.isArray(data)) {
|
|
113
|
+
const {
|
|
114
|
+
label: arrayLabel,
|
|
115
|
+
property
|
|
116
|
+
} = baseKey
|
|
117
|
+
? buildPropertyLabelAndGetProperty(properties, baseKey)
|
|
118
|
+
: {
|
|
119
|
+
label: "",
|
|
120
|
+
property: undefined as ResolvedProperty | undefined
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
const ofProp = property?.dataType === "array"
|
|
124
|
+
? (Array.isArray(property.of) ? property.of[0] : property.of) as ResolvedProperty | undefined
|
|
125
|
+
: undefined;
|
|
126
|
+
|
|
127
|
+
const isArrayOfMaps = ofProp?.dataType === "map";
|
|
128
|
+
const isArrayOfPrimitives = property?.dataType === "array" && ofProp && ofProp.dataType !== "map";
|
|
129
|
+
|
|
130
|
+
// Array of primitives -> single row
|
|
131
|
+
if (baseKey && property && isArrayOfPrimitives) {
|
|
132
|
+
return (
|
|
133
|
+
<div
|
|
134
|
+
className={`grid grid-cols-12 gap-x-4 ${isTopLevel ? "py-4" : "py-2"} items-start ${isTopLevel ? `border-b ${defaultBorderMixin} last:border-b-0` : ""}`}>
|
|
135
|
+
<div className="col-span-4 pr-2">
|
|
136
|
+
<Typography variant="caption"
|
|
137
|
+
color={"secondary"}
|
|
138
|
+
component={"span"}
|
|
139
|
+
className="break-words">
|
|
140
|
+
{arrayLabel}
|
|
141
|
+
</Typography>
|
|
142
|
+
</div>
|
|
143
|
+
<div className="col-span-8">
|
|
144
|
+
<PropertyPreview propertyKey={baseKey}
|
|
145
|
+
value={data}
|
|
146
|
+
property={property}
|
|
147
|
+
size={size}/>
|
|
148
|
+
</div>
|
|
149
|
+
</div>
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Array of maps or unknown -> array header + combined item header (MapName [index]) then content
|
|
154
|
+
return (
|
|
155
|
+
<div className={`${isTopLevel ? "py-4" : "py-1"} ${isTopLevel ? `border-b ${defaultBorderMixin} last:border-b-0` : ""}`}>
|
|
156
|
+
{baseKey && arrayLabel && !suppressHeader && (
|
|
157
|
+
<Typography variant="caption"
|
|
158
|
+
color={"secondary"}
|
|
159
|
+
component={"span"}>
|
|
160
|
+
{arrayLabel}
|
|
161
|
+
</Typography>
|
|
162
|
+
)}
|
|
163
|
+
<div className={baseKey ? `pl-4 mt-1 border-l ${defaultBorderMixin}` : ""}>
|
|
164
|
+
{data.map((item, index) => {
|
|
165
|
+
if (item === null || item === undefined) return null;
|
|
166
|
+
const currentKey = baseKey ? `${baseKey}[${index}]` : `[${index}]`;
|
|
167
|
+
|
|
168
|
+
// Combined header text
|
|
169
|
+
const itemHeader = isArrayOfMaps && ofProp?.name
|
|
170
|
+
? `${ofProp.name} [${index}]`
|
|
171
|
+
: `[${index}]`;
|
|
172
|
+
|
|
173
|
+
return (
|
|
174
|
+
<div key={currentKey} className="py-1">
|
|
175
|
+
<Typography variant="caption"
|
|
176
|
+
color={"secondary"}
|
|
177
|
+
component={"span"}>
|
|
178
|
+
{itemHeader}
|
|
179
|
+
</Typography>
|
|
180
|
+
<div className={`pl-4 mt-1 border-l ${defaultBorderMixin}`}>
|
|
181
|
+
<PropertyCollectionView
|
|
182
|
+
data={item}
|
|
183
|
+
properties={properties}
|
|
184
|
+
baseKey={currentKey}
|
|
185
|
+
suppressHeader={true} // don’t repeat the inner map header
|
|
186
|
+
size={size}
|
|
187
|
+
/>
|
|
188
|
+
</div>
|
|
189
|
+
</div>
|
|
190
|
+
);
|
|
191
|
+
})}
|
|
192
|
+
</div>
|
|
193
|
+
</div>
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Objects (maps or plain objects)
|
|
198
|
+
if (typeof data === "object" && data !== null) {
|
|
199
|
+
const {
|
|
200
|
+
label,
|
|
201
|
+
property
|
|
202
|
+
} = baseKey
|
|
203
|
+
? buildPropertyLabelAndGetProperty(properties, baseKey)
|
|
204
|
+
: {
|
|
205
|
+
label: "",
|
|
206
|
+
property: undefined as ResolvedProperty | undefined
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
// Non-map leaf-like object -> single row
|
|
210
|
+
if (baseKey && (!property || property.dataType !== "map" || !property.properties)) {
|
|
211
|
+
if (!property) return null;
|
|
212
|
+
return (
|
|
213
|
+
<div
|
|
214
|
+
className={`grid grid-cols-12 gap-x-4 ${isTopLevel ? "py-4" : "py-2"} items-start ${isTopLevel ? `border-b ${defaultBorderMixin} last:border-b-0` : ""}`}>
|
|
215
|
+
<div className="col-span-4 pr-2">
|
|
216
|
+
<Typography variant="caption"
|
|
217
|
+
color={"secondary"}
|
|
218
|
+
component={"span"}
|
|
219
|
+
className="break-words">
|
|
220
|
+
{label}
|
|
221
|
+
</Typography>
|
|
222
|
+
</div>
|
|
223
|
+
<div className="col-span-8">
|
|
224
|
+
<PropertyPreview propertyKey={baseKey}
|
|
225
|
+
value={data}
|
|
226
|
+
property={property}
|
|
227
|
+
size={size}/>
|
|
228
|
+
</div>
|
|
229
|
+
</div>
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Map with defined properties -> show map header only if not suppressed
|
|
234
|
+
const showMapHeader =
|
|
235
|
+
baseKey &&
|
|
236
|
+
!suppressHeader &&
|
|
237
|
+
property?.dataType === "map" &&
|
|
238
|
+
(property.name || !pathEndsWithIndex(baseKey));
|
|
239
|
+
|
|
240
|
+
const headerText = property?.name || label;
|
|
241
|
+
|
|
242
|
+
return (
|
|
243
|
+
<div className={`${isTopLevel ? "py-4" : "py-1"} ${isTopLevel ? `border-b ${defaultBorderMixin} last:border-b-0` : ""}`}>
|
|
244
|
+
{showMapHeader && (
|
|
245
|
+
<Typography variant="caption"
|
|
246
|
+
color={"secondary"}
|
|
247
|
+
component={"span"}
|
|
248
|
+
>
|
|
249
|
+
{headerText}
|
|
250
|
+
</Typography>
|
|
251
|
+
)}
|
|
252
|
+
<div className={baseKey ? `pl-4 mt-1 border-l ${defaultBorderMixin}` : ""}>
|
|
253
|
+
{Object.entries(data).map(([key, value]) => {
|
|
254
|
+
if (value === null || value === undefined) return null;
|
|
255
|
+
const currentKey = baseKey ? `${baseKey}.${key}` : key;
|
|
256
|
+
return (
|
|
257
|
+
<PropertyCollectionView
|
|
258
|
+
key={currentKey}
|
|
259
|
+
data={value}
|
|
260
|
+
properties={properties}
|
|
261
|
+
baseKey={currentKey}
|
|
262
|
+
size={size}
|
|
263
|
+
/>
|
|
264
|
+
);
|
|
265
|
+
})}
|
|
266
|
+
</div>
|
|
267
|
+
</div>
|
|
268
|
+
);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// Primitives
|
|
272
|
+
if (baseKey) {
|
|
273
|
+
const {
|
|
274
|
+
label,
|
|
275
|
+
property
|
|
276
|
+
} = buildPropertyLabelAndGetProperty(properties, baseKey);
|
|
277
|
+
if (!property) return null;
|
|
278
|
+
return (
|
|
279
|
+
<div
|
|
280
|
+
className={`grid grid-cols-12 gap-x-4 ${isTopLevel ? "py-4" : "py-2"} items-start ${isTopLevel ? `border-b ${defaultBorderMixin} last:border-b-0` : ""}`}>
|
|
281
|
+
<div className="col-span-4 pr-2">
|
|
282
|
+
<Typography variant="caption"
|
|
283
|
+
color={"secondary"}
|
|
284
|
+
component={"span"}
|
|
285
|
+
className="break-words">
|
|
286
|
+
{label}
|
|
287
|
+
</Typography>
|
|
288
|
+
</div>
|
|
289
|
+
<div className="col-span-8">
|
|
290
|
+
<PropertyPreview propertyKey={baseKey}
|
|
291
|
+
value={data}
|
|
292
|
+
property={property}
|
|
293
|
+
size={size}/>
|
|
294
|
+
</div>
|
|
295
|
+
</div>
|
|
296
|
+
);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
return null;
|
|
300
|
+
};
|
|
301
|
+
|
|
302
|
+
export function buildDataFromPaths(values: object, paths: string[]): object {
|
|
303
|
+
const result = {};
|
|
304
|
+
paths.forEach(path => {
|
|
305
|
+
const value = getValueInPath(values, path);
|
|
306
|
+
if (value === undefined) return;
|
|
307
|
+
|
|
308
|
+
// lodash.set would be perfect here
|
|
309
|
+
const segments = path.replace(/\[(\d+)\]/g, ".$1").split(".");
|
|
310
|
+
let current: any = result;
|
|
311
|
+
segments.forEach((segment, index) => {
|
|
312
|
+
if (index === segments.length - 1) {
|
|
313
|
+
current[segment] = value;
|
|
314
|
+
} else {
|
|
315
|
+
const nextSegment = segments[index + 1];
|
|
316
|
+
const isNextAnIndex = /^\d+$/.test(nextSegment);
|
|
317
|
+
if (!current[segment]) {
|
|
318
|
+
if (isNextAnIndex) {
|
|
319
|
+
current[segment] = [];
|
|
320
|
+
} else {
|
|
321
|
+
current[segment] = {};
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
current = current[segment];
|
|
325
|
+
}
|
|
326
|
+
});
|
|
327
|
+
});
|
|
328
|
+
return result;
|
|
329
|
+
}
|
|
@@ -2,16 +2,22 @@ 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 flex items-center justify-center 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
|
-
{propertyConfig?.Icon ? getIconForWidget(propertyConfig, "
|
|
21
|
+
{propertyConfig?.Icon ? getIconForWidget(propertyConfig, "small") : getIconForWidget(defaultPropertyConfig, "small")}
|
|
16
22
|
</div>
|
|
17
23
|
}
|
|
@@ -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,
|
|
@@ -288,12 +289,21 @@ export function ReferenceSelectionTable<M extends Record<string, any>>(
|
|
|
288
289
|
textSearchLoading={textSearchLoading}
|
|
289
290
|
onTextSearchClick={textSearchInitialised ? undefined : onTextSearchClick}
|
|
290
291
|
textSearchEnabled={textSearchEnabled}
|
|
292
|
+
additionalFields={collection.additionalFields}
|
|
291
293
|
displayedColumnIds={displayedColumnIds}
|
|
292
294
|
onEntityClick={onEntityClick}
|
|
293
295
|
tableController={tableController}
|
|
296
|
+
enablePopupIcon={false}
|
|
294
297
|
tableRowActionsBuilder={tableRowActionsBuilder}
|
|
295
|
-
|
|
296
|
-
|
|
298
|
+
openEntityMode={"side_panel"}
|
|
299
|
+
title={<Typography variant={"subtitle2"} className={"flex flex-row gap-2"}>
|
|
300
|
+
<IconForView
|
|
301
|
+
size={"small"}
|
|
302
|
+
collectionOrView={collection}
|
|
303
|
+
className={"text-surface-300 dark:text-surface-600"}/>
|
|
304
|
+
{collection.singularName
|
|
305
|
+
? `Select ${collection.singularName}`
|
|
306
|
+
: `Select from ${collection.name}`}
|
|
297
307
|
</Typography>}
|
|
298
308
|
defaultSize={collection.defaultSize}
|
|
299
309
|
properties={resolvedCollection.properties}
|
|
@@ -4,7 +4,7 @@ import { Entity, EntityCollection, EntityReference, FilterValues } from "../type
|
|
|
4
4
|
import { getReferenceFrom } from "../util";
|
|
5
5
|
import { PreviewSize, ReferencePreview } from "../preview";
|
|
6
6
|
import { useNavigationController, useReferenceDialog } from "../hooks";
|
|
7
|
-
import { Button,
|
|
7
|
+
import { Button, cls } from "@firecms/ui";
|
|
8
8
|
|
|
9
9
|
export type ReferenceWidgetProps<M extends Record<string, any>> = {
|
|
10
10
|
name?: string,
|
|
@@ -27,6 +27,8 @@ export type ReferenceWidgetProps<M extends Record<string, any>> = {
|
|
|
27
27
|
forceFilter?: FilterValues<string>;
|
|
28
28
|
size: PreviewSize;
|
|
29
29
|
className?: string;
|
|
30
|
+
includeId?: boolean;
|
|
31
|
+
includeEntityLink?: boolean;
|
|
30
32
|
};
|
|
31
33
|
|
|
32
34
|
/**
|
|
@@ -43,7 +45,9 @@ export function ReferenceWidget<M extends Record<string, any>>({
|
|
|
43
45
|
previewProperties,
|
|
44
46
|
forceFilter,
|
|
45
47
|
size,
|
|
46
|
-
className
|
|
48
|
+
className,
|
|
49
|
+
includeId,
|
|
50
|
+
includeEntityLink
|
|
47
51
|
}: ReferenceWidgetProps<M>) {
|
|
48
52
|
|
|
49
53
|
const navigationController = useNavigationController();
|
|
@@ -52,16 +56,15 @@ export function ReferenceWidget<M extends Record<string, any>>({
|
|
|
52
56
|
return navigationController.getCollection(path);
|
|
53
57
|
}, [path, navigationController.getCollection]);
|
|
54
58
|
|
|
55
|
-
// if (!collection) {
|
|
56
|
-
// throw Error(`Couldn't find the corresponding collection for the path: ${path}`);
|
|
57
|
-
// }
|
|
58
|
-
|
|
59
59
|
const onSingleEntitySelected = useCallback((entity: Entity<M> | null) => {
|
|
60
60
|
if (disabled)
|
|
61
61
|
return;
|
|
62
62
|
if (onReferenceSelected) {
|
|
63
63
|
const reference = entity ? getReferenceFrom(entity) : null;
|
|
64
|
-
onReferenceSelected?.({
|
|
64
|
+
onReferenceSelected?.({
|
|
65
|
+
reference,
|
|
66
|
+
entity
|
|
67
|
+
});
|
|
65
68
|
}
|
|
66
69
|
}, [disabled, onReferenceSelected]);
|
|
67
70
|
|
|
@@ -70,7 +73,10 @@ export function ReferenceWidget<M extends Record<string, any>>({
|
|
|
70
73
|
return;
|
|
71
74
|
if (onMultipleReferenceSelected) {
|
|
72
75
|
const references = entities ? entities.map(e => getReferenceFrom(e)) : null;
|
|
73
|
-
onMultipleReferenceSelected({
|
|
76
|
+
onMultipleReferenceSelected({
|
|
77
|
+
references,
|
|
78
|
+
entities
|
|
79
|
+
});
|
|
74
80
|
}
|
|
75
81
|
}, [disabled, onReferenceSelected]);
|
|
76
82
|
|
|
@@ -110,7 +116,9 @@ export function ReferenceWidget<M extends Record<string, any>>({
|
|
|
110
116
|
reference={ref}
|
|
111
117
|
disabled={disabled}
|
|
112
118
|
previewProperties={previewProperties}
|
|
113
|
-
size={size}
|
|
119
|
+
size={size}
|
|
120
|
+
includeId={includeId}
|
|
121
|
+
includeEntityLink={includeEntityLink}/>
|
|
114
122
|
})}
|
|
115
123
|
</div>
|
|
116
124
|
} else if (value?.isEntityReference && value?.isEntityReference()) {
|
|
@@ -119,10 +127,12 @@ export function ReferenceWidget<M extends Record<string, any>>({
|
|
|
119
127
|
onClick={onEntryClick}
|
|
120
128
|
disabled={disabled}
|
|
121
129
|
previewProperties={previewProperties}
|
|
122
|
-
size={size}
|
|
130
|
+
size={size}
|
|
131
|
+
includeId={includeId}
|
|
132
|
+
includeEntityLink={includeEntityLink}/>
|
|
123
133
|
|
|
124
134
|
}
|
|
125
|
-
return <div className={
|
|
135
|
+
return <div className={cls("text-sm font-medium",
|
|
126
136
|
"min-w-80 flex flex-col gap-4",
|
|
127
137
|
"relative transition-colors duration-200 ease-in rounded font-medium",
|
|
128
138
|
disabled ? "bg-opacity-50" : "hover:bg-opacity-75",
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
|
|
3
3
|
import { coolIconKeys, debounce, Icon, IconButton, iconKeys, SearchBar, Tooltip } from "@firecms/ui";
|
|
4
|
-
import {
|
|
4
|
+
import { iconSynonyms, iconsSearch } from "../util";
|
|
5
5
|
|
|
6
6
|
const UPDATE_SEARCH_INDEX_WAIT_MS = 220;
|
|
7
7
|
|
|
8
|
-
if (process.env.NODE_ENV !== "production") {
|
|
9
|
-
Object.keys(
|
|
8
|
+
if (iconSynonyms && process.env.NODE_ENV !== "production") {
|
|
9
|
+
Object.keys(iconSynonyms).forEach((icon: string) => {
|
|
10
10
|
if (!iconKeys.includes(icon)) {
|
|
11
|
-
console.warn(`The icon ${icon} no longer exists. Remove it from \`
|
|
11
|
+
console.warn(`The icon ${icon} no longer exists. Remove it from \`iconSynonyms\``);
|
|
12
12
|
}
|
|
13
13
|
});
|
|
14
14
|
}
|
|
@@ -31,7 +31,9 @@ export function SearchIconsView({
|
|
|
31
31
|
setKeys(null);
|
|
32
32
|
} else {
|
|
33
33
|
const searchResult = iconsSearch.search(value);
|
|
34
|
-
|
|
34
|
+
const limit = 50;
|
|
35
|
+
const limited = searchResult.slice(0, limit);
|
|
36
|
+
setKeys(limited.map((e) => e.item.key));
|
|
35
37
|
}
|
|
36
38
|
}, UPDATE_SEARCH_INDEX_WAIT_MS), []
|
|
37
39
|
);
|
|
@@ -48,7 +50,7 @@ export function SearchIconsView({
|
|
|
48
50
|
return (
|
|
49
51
|
<>
|
|
50
52
|
<SearchBar
|
|
51
|
-
autoFocus
|
|
53
|
+
autoFocus={false}
|
|
52
54
|
innerClassName={"w-full sticky top-0 z-10"}
|
|
53
55
|
onTextSearch={(value?: string) => setQuery(value ?? "")}
|
|
54
56
|
placeholder="Search for more icons…"
|
|
@@ -57,7 +59,8 @@ export function SearchIconsView({
|
|
|
57
59
|
<div className={"flex max-w-full flex-wrap mt-4"}>
|
|
58
60
|
{icons.map((icon: string) => {
|
|
59
61
|
return (
|
|
60
|
-
<Tooltip title={icon} key={icon}
|
|
62
|
+
<Tooltip title={icon} key={icon}
|
|
63
|
+
asChild={true}>
|
|
61
64
|
<IconButton
|
|
62
65
|
shape={"square"}
|
|
63
66
|
toggled={selectedIcon === icon}
|