@firecms/core 3.0.0-beta.1 → 3.0.0-beta.10
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 +6 -7
- package/dist/app/AppBar.d.ts +12 -0
- package/dist/app/Drawer.d.ts +16 -0
- package/dist/app/Scaffold.d.ts +30 -0
- package/dist/app/index.d.ts +4 -0
- package/dist/app/useApp.d.ts +16 -0
- package/dist/components/ArrayContainer.d.ts +3 -4
- package/dist/components/CircularProgressCenter.d.ts +1 -1
- package/dist/components/ClearFilterSortButton.d.ts +5 -0
- package/dist/components/{DeleteConfirmationDialog.d.ts → ConfirmationDialog.d.ts} +1 -1
- package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +13 -18
- package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +2 -5
- package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +7 -13
- package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +3 -2
- 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 +2 -4
- 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 +3 -3
- package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +13 -4
- package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
- package/dist/components/EntityCollectionView/useSelectionController.d.ts +2 -0
- package/dist/components/EntityCollectionView/utils.d.ts +3 -0
- package/dist/components/EntityPreview.d.ts +26 -7
- package/dist/components/EntityView.d.ts +11 -0
- package/dist/components/ErrorView.d.ts +1 -1
- package/dist/components/FieldCaption.d.ts +5 -0
- package/dist/components/HomePage/DefaultHomePage.d.ts +1 -1
- package/dist/components/HomePage/NavigationCard.d.ts +8 -0
- package/dist/components/HomePage/{NavigationCollectionCard.d.ts → NavigationCardBinding.d.ts} +3 -3
- package/dist/components/HomePage/SmallNavigationCard.d.ts +6 -0
- package/dist/components/HomePage/index.d.ts +3 -1
- package/dist/components/{FieldConfigBadge.d.ts → PropertyConfigBadge.d.ts} +2 -1
- package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
- package/dist/components/{ReferenceSelectionInner.d.ts → ReferenceTable/ReferenceSelectionTable.d.ts} +2 -2
- package/dist/components/ReferenceWidget.d.ts +6 -4
- package/dist/components/{EntityCollectionTable/SimpleEntityCollectionTable.d.ts → SelectableTable/SelectableTable.d.ts} +8 -28
- package/dist/components/SelectableTable/SelectableTableContext.d.ts +4 -0
- package/dist/components/{EntityCollectionTable → SelectableTable}/filters/ReferenceFilterField.d.ts +2 -1
- package/dist/components/VirtualTable/VirtualTableProps.d.ts +16 -13
- package/dist/components/VirtualTable/types.d.ts +3 -3
- package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -1
- package/dist/components/common/index.d.ts +6 -0
- package/dist/components/common/table_height.d.ts +5 -0
- package/dist/components/{EntityCollectionTable → common}/types.d.ts +11 -6
- package/dist/components/{EntityCollectionView → common}/useColumnsIds.d.ts +2 -1
- package/dist/components/{EntityCollectionTable → common}/useDataSourceEntityCollectionTableController.d.ts +4 -1
- package/dist/components/common/useTableSearchHelper.d.ts +12 -0
- package/dist/components/index.d.ts +14 -8
- package/dist/contexts/AuthControllerContext.d.ts +1 -1
- package/dist/{components/FireCMSAppBar.d.ts → core/DefaultAppBar.d.ts} +6 -9
- package/dist/core/DefaultDrawer.d.ts +19 -0
- package/dist/core/DrawerNavigationItem.d.ts +10 -0
- package/dist/core/EntityEditView.d.ts +36 -0
- package/dist/core/FireCMS.d.ts +1 -1
- package/dist/core/NavigationRoutes.d.ts +3 -3
- package/dist/core/index.d.ts +3 -6
- package/dist/form/PropertyFieldBinding.d.ts +1 -1
- package/dist/form/components/CustomIdField.d.ts +2 -1
- package/dist/form/components/ErrorFocus.d.ts +1 -1
- package/dist/form/components/FieldHelperText.d.ts +3 -3
- package/dist/form/components/FormikArrayContainer.d.ts +2 -1
- package/dist/{components → form/components}/LabelWithIcon.d.ts +1 -1
- package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
- package/dist/form/components/StorageItemPreview.d.ts +4 -3
- package/dist/form/components/StorageUploadProgress.d.ts +1 -1
- package/dist/form/components/index.d.ts +2 -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/RepeatFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +3 -4
- package/dist/form/field_bindings/TextFieldBinding.d.ts +2 -2
- package/dist/form/index.d.ts +4 -5
- package/dist/form/useClearRestoreValue.d.ts +2 -2
- package/dist/form/validation.d.ts +1 -1
- package/dist/hooks/data/delete.d.ts +2 -2
- package/dist/hooks/data/save.d.ts +2 -3
- package/dist/hooks/data/useDataSource.d.ts +2 -2
- package/dist/hooks/data/useEntityFetch.d.ts +3 -3
- package/dist/hooks/index.d.ts +5 -1
- package/dist/{core → hooks}/useBuildModeController.d.ts +1 -1
- package/dist/hooks/useBuildNavigationController.d.ts +23 -0
- package/dist/hooks/useProjectLog.d.ts +14 -0
- package/dist/hooks/useSnackbarController.d.ts +1 -0
- package/dist/hooks/useStorageSource.d.ts +2 -2
- package/dist/hooks/useValidateAuthenticator.d.ts +21 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.es.js +16297 -12643
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +20043 -587
- package/dist/index.umd.js.map +1 -1
- package/dist/internal/useBuildDataSource.d.ts +1 -12
- package/dist/preview/PropertyPreview.d.ts +1 -1
- package/dist/preview/PropertyPreviewProps.d.ts +7 -5
- package/dist/preview/components/BooleanPreview.d.ts +5 -1
- package/dist/preview/components/EnumValuesChip.d.ts +1 -1
- package/dist/preview/components/ReferencePreview.d.ts +4 -9
- package/dist/preview/components/StorageThumbnail.d.ts +2 -1
- package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
- package/dist/types/analytics.d.ts +1 -1
- package/dist/types/auth.d.ts +38 -2
- package/dist/types/collections.d.ts +56 -9
- package/dist/types/datasource.d.ts +59 -39
- package/dist/types/entities.d.ts +7 -1
- package/dist/types/entity_actions.d.ts +14 -0
- package/dist/types/entity_callbacks.d.ts +3 -3
- package/dist/types/entity_overrides.d.ts +6 -0
- package/dist/types/fields.d.ts +47 -42
- package/dist/types/firecms.d.ts +8 -23
- package/dist/types/index.d.ts +2 -1
- package/dist/types/navigation.d.ts +18 -16
- package/dist/types/permissions.d.ts +5 -1
- package/dist/types/plugins.d.ts +31 -31
- package/dist/types/properties.d.ts +36 -23
- package/dist/types/property_config.d.ts +2 -2
- package/dist/types/roles.d.ts +31 -0
- package/dist/types/side_dialogs_controller.d.ts +10 -0
- package/dist/types/storage.d.ts +86 -3
- package/dist/types/user.d.ts +5 -0
- package/dist/util/collections.d.ts +9 -1
- package/dist/util/entities.d.ts +2 -2
- package/dist/util/icon_list.d.ts +5 -1
- package/dist/util/icon_synonyms.d.ts +1 -97
- package/dist/util/icons.d.ts +10 -3
- package/dist/util/index.d.ts +3 -1
- package/dist/util/navigation_utils.d.ts +2 -2
- package/dist/util/objects.d.ts +1 -1
- package/dist/util/permissions.d.ts +4 -4
- package/dist/util/plurals.d.ts +0 -2
- package/dist/util/property_utils.d.ts +1 -1
- package/dist/util/references.d.ts +4 -2
- package/dist/util/resolutions.d.ts +28 -14
- package/dist/util/storage.d.ts +23 -2
- package/dist/util/strings.d.ts +1 -1
- package/dist/util/useDebouncedCallback.d.ts +1 -0
- package/dist/util/useStorageUploadController.d.ts +3 -3
- package/dist/util/useTraceUpdate.d.ts +1 -0
- package/package.json +129 -112
- package/src/app/AppBar.tsx +18 -0
- package/src/app/Drawer.tsx +24 -0
- package/src/app/Scaffold.tsx +243 -0
- package/src/app/index.ts +4 -0
- package/src/app/useApp.tsx +32 -0
- package/src/components/ArrayContainer.tsx +45 -75
- package/src/components/CircularProgressCenter.tsx +1 -1
- package/src/components/ClearFilterSortButton.tsx +41 -0
- package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +1 -1
- package/src/components/DeleteEntityDialog.tsx +4 -4
- package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +47 -58
- package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +253 -448
- package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +11 -12
- package/src/components/EntityCollectionTable/PropertyTableCell.tsx +54 -48
- package/src/components/EntityCollectionTable/column_utils.tsx +4 -4
- package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +40 -32
- package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +17 -9
- package/src/components/EntityCollectionTable/index.tsx +1 -9
- package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +44 -46
- package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +32 -30
- package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +19 -7
- package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +145 -142
- package/src/components/EntityCollectionView/EntityCollectionView.tsx +184 -171
- package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +5 -6
- package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
- package/src/components/EntityCollectionView/useSelectionController.tsx +42 -0
- package/src/components/EntityCollectionView/utils.ts +19 -0
- package/src/components/EntityPreview.tsx +208 -71
- package/src/components/EntityView.tsx +84 -0
- package/src/components/ErrorView.tsx +1 -1
- package/src/components/FieldCaption.tsx +14 -0
- package/src/components/HomePage/DefaultHomePage.tsx +38 -28
- package/src/components/HomePage/NavigationCard.tsx +69 -0
- package/src/components/HomePage/NavigationCardBinding.tsx +116 -0
- package/src/components/HomePage/NavigationGroup.tsx +1 -1
- package/src/components/HomePage/SmallNavigationCard.tsx +44 -0
- package/src/components/HomePage/index.tsx +3 -1
- package/src/components/PropertyConfigBadge.tsx +23 -0
- package/src/components/PropertyIdCopyTooltip.tsx +48 -0
- package/src/components/{ReferenceSelectionInner.tsx → ReferenceTable/ReferenceSelectionTable.tsx} +37 -23
- package/src/components/ReferenceWidget.tsx +26 -16
- package/src/components/SearchIconsView.tsx +10 -7
- package/src/components/{EntityCollectionTable/SimpleEntityCollectionTable.tsx → SelectableTable/SelectableTable.tsx} +46 -84
- package/src/components/SelectableTable/SelectableTableContext.tsx +6 -0
- package/src/components/{EntityCollectionTable → SelectableTable}/filters/BooleanFilterField.tsx +2 -3
- package/src/components/{EntityCollectionTable → SelectableTable}/filters/DateTimeFilterField.tsx +22 -7
- package/src/components/{EntityCollectionTable → SelectableTable}/filters/ReferenceFilterField.tsx +38 -24
- package/src/components/{EntityCollectionTable → SelectableTable}/filters/StringNumberFilterField.tsx +88 -22
- package/src/components/VirtualTable/VirtualTable.tsx +77 -46
- package/src/components/VirtualTable/VirtualTableCell.tsx +1 -9
- package/src/components/VirtualTable/VirtualTableHeader.tsx +14 -8
- package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
- package/src/components/VirtualTable/VirtualTableProps.tsx +19 -15
- package/src/components/VirtualTable/VirtualTableRow.tsx +4 -5
- package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +4 -4
- package/src/components/VirtualTable/fields/VirtualTableInput.tsx +4 -3
- package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +4 -3
- package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +14 -28
- package/src/components/VirtualTable/types.tsx +2 -3
- package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +17 -9
- package/src/components/common/index.ts +6 -0
- package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
- package/src/components/{EntityCollectionTable → common}/types.tsx +9 -6
- package/src/components/{EntityCollectionView → common}/useColumnsIds.tsx +23 -2
- package/src/components/{EntityCollectionTable → common}/useDataSourceEntityCollectionTableController.tsx +25 -14
- package/src/components/common/useTableSearchHelper.ts +88 -0
- package/src/components/index.tsx +15 -8
- package/src/contexts/AuthControllerContext.tsx +1 -1
- package/src/contexts/DialogsProvider.tsx +2 -2
- package/src/core/DefaultAppBar.tsx +176 -0
- package/src/core/DefaultDrawer.tsx +183 -0
- package/src/core/DrawerNavigationItem.tsx +66 -0
- package/src/core/EntityEditView.tsx +1127 -0
- package/src/core/EntitySidePanel.tsx +9 -8
- package/src/core/FireCMS.tsx +67 -59
- package/src/core/NavigationRoutes.tsx +25 -17
- package/src/core/SideDialogs.tsx +1 -0
- package/src/core/field_configs.tsx +18 -19
- package/src/core/index.tsx +3 -6
- package/src/form/PropertyFieldBinding.tsx +60 -33
- package/src/form/components/CustomIdField.tsx +51 -36
- package/src/form/components/ErrorFocus.tsx +3 -3
- package/src/form/components/FieldHelperText.tsx +4 -4
- package/src/form/components/FormikArrayContainer.tsx +4 -1
- package/src/form/components/LabelWithIcon.tsx +41 -0
- package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
- package/src/form/components/StorageItemPreview.tsx +22 -10
- package/src/form/components/StorageUploadProgress.tsx +8 -8
- package/src/form/components/index.tsx +2 -1
- package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +28 -18
- package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +37 -37
- package/src/form/field_bindings/BlockFieldBinding.tsx +29 -27
- package/src/form/field_bindings/DateTimeFieldBinding.tsx +20 -17
- package/src/form/field_bindings/KeyValueFieldBinding.tsx +66 -60
- package/src/form/field_bindings/MapFieldBinding.tsx +35 -33
- package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +150 -0
- package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +26 -22
- package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +12 -18
- package/src/form/field_bindings/ReferenceFieldBinding.tsx +45 -33
- package/src/form/field_bindings/RepeatFieldBinding.tsx +36 -21
- package/src/form/field_bindings/SelectFieldBinding.tsx +22 -16
- package/src/form/field_bindings/StorageUploadFieldBinding.tsx +41 -42
- package/src/form/field_bindings/SwitchFieldBinding.tsx +11 -8
- package/src/form/field_bindings/TextFieldBinding.tsx +34 -30
- package/src/form/index.tsx +5 -9
- package/src/form/useClearRestoreValue.tsx +2 -2
- package/src/form/validation.ts +4 -21
- package/src/hooks/data/delete.ts +5 -4
- package/src/hooks/data/save.ts +7 -2
- package/src/hooks/data/useCollectionFetch.tsx +1 -1
- package/src/hooks/data/useDataSource.tsx +15 -2
- package/src/hooks/data/useEntityFetch.tsx +4 -4
- package/src/hooks/index.tsx +7 -1
- package/src/{core → hooks}/useBuildLocalConfigurationPersistence.tsx +8 -10
- package/src/{core → hooks}/useBuildModeController.tsx +12 -6
- package/src/{internal → hooks}/useBuildNavigationController.tsx +244 -99
- package/src/hooks/useFireCMSContext.tsx +51 -3
- package/src/hooks/useLargeLayout.tsx +10 -7
- package/src/hooks/useProjectLog.tsx +63 -0
- package/src/hooks/useReferenceDialog.tsx +3 -3
- package/src/hooks/useResolvedNavigationFrom.tsx +1 -1
- package/src/hooks/useSnackbarController.tsx +1 -2
- package/src/hooks/useStorageSource.tsx +7 -2
- package/src/hooks/useValidateAuthenticator.tsx +115 -0
- package/src/index.ts +1 -0
- package/src/internal/useBuildDataSource.ts +79 -84
- package/src/internal/useBuildSideDialogsController.tsx +1 -0
- package/src/internal/useBuildSideEntityController.tsx +103 -23
- package/src/internal/useUnsavedChangesDialog.tsx +3 -1
- package/src/preview/PropertyPreview.tsx +12 -19
- package/src/preview/PropertyPreviewProps.tsx +6 -10
- package/src/preview/components/BooleanPreview.tsx +19 -4
- package/src/preview/components/EnumValuesChip.tsx +2 -2
- package/src/preview/components/ImagePreview.tsx +24 -34
- package/src/preview/components/ReferencePreview.tsx +73 -176
- package/src/preview/components/StorageThumbnail.tsx +5 -1
- package/src/preview/components/UrlComponentPreview.tsx +44 -11
- package/src/preview/property_previews/ArrayOfMapsPreview.tsx +1 -2
- package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +3 -2
- package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +1 -2
- package/src/preview/property_previews/ArrayOfStringsPreview.tsx +0 -1
- package/src/preview/property_previews/ArrayOneOfPreview.tsx +3 -4
- package/src/preview/property_previews/ArrayPropertyPreview.tsx +3 -4
- package/src/preview/property_previews/MapPropertyPreview.tsx +6 -6
- package/src/preview/property_previews/SkeletonPropertyComponent.tsx +2 -2
- package/src/preview/property_previews/StringPropertyPreview.tsx +8 -7
- package/src/preview/util.ts +2 -2
- package/src/types/analytics.ts +1 -0
- package/src/types/auth.tsx +51 -2
- package/src/types/collections.ts +65 -9
- package/src/types/customization_controller.tsx +0 -1
- package/src/types/datasource.ts +69 -47
- package/src/types/entities.ts +15 -1
- package/src/types/entity_actions.tsx +17 -0
- package/src/types/entity_callbacks.ts +4 -3
- package/src/types/entity_overrides.tsx +7 -0
- package/src/types/fields.tsx +51 -45
- package/src/types/firecms.tsx +9 -26
- package/src/types/index.ts +2 -1
- package/src/types/navigation.ts +20 -19
- package/src/types/permissions.ts +6 -1
- package/src/types/plugins.tsx +38 -40
- package/src/types/properties.ts +42 -24
- package/src/types/property_config.tsx +2 -2
- package/src/types/roles.ts +41 -0
- package/src/types/side_dialogs_controller.tsx +13 -0
- package/src/types/side_entity_controller.tsx +1 -0
- package/src/types/storage.ts +94 -3
- package/src/types/user.ts +7 -0
- package/src/util/collections.ts +22 -0
- package/src/util/entities.ts +6 -5
- package/src/util/enums.ts +1 -1
- package/src/util/icon_list.ts +15 -10
- package/src/util/icon_synonyms.ts +3 -99
- package/src/util/icons.tsx +18 -4
- package/src/util/index.ts +3 -1
- package/src/util/make_properties_editable.ts +13 -5
- package/src/util/navigation_utils.ts +6 -6
- package/src/util/objects.ts +25 -28
- package/src/util/permissions.ts +12 -8
- package/src/util/plurals.ts +0 -2
- package/src/util/property_utils.tsx +1 -1
- package/src/util/references.ts +39 -5
- package/src/util/resolutions.ts +75 -42
- package/src/util/storage.ts +79 -21
- package/src/util/strings.ts +4 -3
- package/src/util/{useDebounce.ts → useDebouncedCallback.ts} +1 -1
- package/src/util/useStorageUploadController.tsx +33 -7
- package/src/util/useTraceUpdate.tsx +2 -1
- package/dist/components/VirtualTable/common.d.ts +0 -2
- package/dist/core/Drawer.d.ts +0 -23
- package/dist/core/Scaffold.d.ts +0 -52
- package/dist/form/EntityForm.d.ts +0 -75
- package/dist/form/components/SubmitListener.d.ts +0 -1
- package/dist/form/components/SwitchControl.d.ts +0 -8
- package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
- package/dist/hooks/useVerifyLicense.d.ts +0 -0
- package/dist/internal/EntityView.d.ts +0 -22
- package/dist/internal/useBuildCustomizationController.d.ts +0 -2
- package/dist/internal/useBuildNavigationController.d.ts +0 -14
- package/dist/internal/useLocaleConfig.d.ts +0 -1
- package/dist/types/appcheck.d.ts +0 -26
- package/dist/util/useDebounce.d.ts +0 -1
- package/src/components/FieldConfigBadge.tsx +0 -17
- package/src/components/FireCMSAppBar.tsx +0 -157
- package/src/components/HomePage/NavigationCollectionCard.tsx +0 -146
- package/src/components/LabelWithIcon.tsx +0 -33
- package/src/core/Drawer.tsx +0 -162
- package/src/core/Scaffold.tsx +0 -278
- package/src/form/EntityForm.tsx +0 -657
- package/src/form/components/SubmitListener.tsx +0 -32
- package/src/form/components/SwitchControl.tsx +0 -39
- package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -696
- package/src/hooks/useVerifyLicense.tsx +0 -1
- package/src/internal/EntityView.tsx +0 -578
- package/src/internal/useBuildCustomizationController.tsx +0 -5
- package/src/internal/useLocaleConfig.tsx +0 -18
- package/src/types/appcheck.ts +0 -29
- /package/dist/components/{EntityCollectionTable → SelectableTable}/filters/BooleanFilterField.d.ts +0 -0
- /package/dist/components/{EntityCollectionTable → SelectableTable}/filters/DateTimeFilterField.d.ts +0 -0
- /package/dist/components/{EntityCollectionTable → SelectableTable}/filters/StringNumberFilterField.d.ts +0 -0
- /package/dist/components/{EntityCollectionTable → common}/useDebouncedData.d.ts +0 -0
- /package/dist/{core → hooks}/useBuildLocalConfigurationPersistence.d.ts +0 -0
- /package/src/components/{EntityCollectionTable → common}/useDebouncedData.ts +0 -0
|
@@ -8,27 +8,24 @@ import {
|
|
|
8
8
|
Entity,
|
|
9
9
|
EntityAction,
|
|
10
10
|
EntityCollection,
|
|
11
|
+
EntityReference,
|
|
12
|
+
EntityTableController,
|
|
11
13
|
FilterValues,
|
|
12
14
|
PartialEntityCollection,
|
|
13
15
|
PropertyOrBuilder,
|
|
14
16
|
ResolvedProperty,
|
|
15
|
-
SaveEntityProps
|
|
16
|
-
SelectionController
|
|
17
|
+
SaveEntityProps
|
|
17
18
|
} from "../../types";
|
|
18
19
|
import {
|
|
20
|
+
EntityCollectionRowActions,
|
|
19
21
|
EntityCollectionTable,
|
|
20
|
-
|
|
21
|
-
OnColumnResizeParams,
|
|
22
|
-
UniqueFieldValidator
|
|
22
|
+
useDataSourceEntityCollectionTableController
|
|
23
23
|
} from "../EntityCollectionTable";
|
|
24
24
|
|
|
25
|
-
import { EntityCollectionRowActions } from "../EntityCollectionTable/EntityCollectionRowActions";
|
|
26
|
-
|
|
27
25
|
import {
|
|
28
26
|
canCreateEntity,
|
|
29
27
|
canDeleteEntity,
|
|
30
28
|
canEditEntity,
|
|
31
|
-
fullPathToCollectionSegments,
|
|
32
29
|
getPropertyInPath,
|
|
33
30
|
mergeDeep,
|
|
34
31
|
resolveCollection,
|
|
@@ -47,35 +44,37 @@ import {
|
|
|
47
44
|
} from "../../hooks";
|
|
48
45
|
import { useUserConfigurationPersistence } from "../../hooks/useUserConfigurationPersistence";
|
|
49
46
|
import { EntityCollectionViewActions } from "./EntityCollectionViewActions";
|
|
50
|
-
import {
|
|
51
|
-
useDataSourceEntityCollectionTableController
|
|
52
|
-
} from "../EntityCollectionTable/useDataSourceEntityCollectionTableController";
|
|
53
47
|
import {
|
|
54
48
|
AddIcon,
|
|
55
49
|
Button,
|
|
56
|
-
|
|
50
|
+
cls,
|
|
51
|
+
focusedDisabled,
|
|
57
52
|
IconButton,
|
|
58
53
|
KeyboardTabIcon,
|
|
59
54
|
Markdown,
|
|
60
55
|
Popover,
|
|
61
56
|
SearchIcon,
|
|
62
57
|
Skeleton,
|
|
63
|
-
TextField,
|
|
64
58
|
Tooltip,
|
|
65
59
|
Typography
|
|
66
60
|
} from "@firecms/ui";
|
|
67
|
-
import { setIn } from "
|
|
61
|
+
import { setIn } from "@firecms/formex";
|
|
68
62
|
import { getSubcollectionColumnId } from "../EntityCollectionTable/internal/common";
|
|
69
|
-
import {
|
|
63
|
+
import {
|
|
64
|
+
OnCellValueChange,
|
|
65
|
+
OnColumnResizeParams,
|
|
66
|
+
UniqueFieldValidator,
|
|
67
|
+
useColumnIds,
|
|
68
|
+
useTableSearchHelper
|
|
69
|
+
} from "../common";
|
|
70
70
|
import { PopupFormField } from "../EntityCollectionTable/internal/popup_field/PopupFormField";
|
|
71
71
|
import { GetPropertyForProps } from "../EntityCollectionTable/EntityCollectionTableProps";
|
|
72
|
-
import {
|
|
73
|
-
copyEntityAction,
|
|
74
|
-
deleteEntityAction,
|
|
75
|
-
editEntityAction
|
|
76
|
-
} from "../EntityCollectionTable/internal/default_entity_actions";
|
|
72
|
+
import { copyEntityAction, deleteEntityAction, editEntityAction } from "../common/default_entity_actions";
|
|
77
73
|
import { DeleteEntityDialog } from "../DeleteEntityDialog";
|
|
78
74
|
import { useAnalyticsController } from "../../hooks/useAnalyticsController";
|
|
75
|
+
import { useSelectionController } from "./useSelectionController";
|
|
76
|
+
import { EntityCollectionViewStartActions } from "./EntityCollectionViewStartActions";
|
|
77
|
+
import { addRecentId, getRecentIds } from "./utils";
|
|
79
78
|
|
|
80
79
|
const COLLECTION_GROUP_PARENT_ID = "collectionGroupParent";
|
|
81
80
|
|
|
@@ -83,10 +82,22 @@ const COLLECTION_GROUP_PARENT_ID = "collectionGroupParent";
|
|
|
83
82
|
* @group Components
|
|
84
83
|
*/
|
|
85
84
|
export type EntityCollectionViewProps<M extends Record<string, any>> = {
|
|
86
|
-
|
|
85
|
+
/**
|
|
86
|
+
* Complete path where this collection is located.
|
|
87
|
+
* It defaults to the collection path if not provided.
|
|
88
|
+
*/
|
|
89
|
+
fullPath?: string;
|
|
90
|
+
/**
|
|
91
|
+
* If this is a subcollection, specify the parent collection ids.
|
|
92
|
+
*/
|
|
87
93
|
parentCollectionIds?: string[];
|
|
94
|
+
/**
|
|
95
|
+
* Whether this is a subcollection or not.
|
|
96
|
+
*/
|
|
88
97
|
isSubCollection?: boolean;
|
|
98
|
+
|
|
89
99
|
className?: string;
|
|
100
|
+
|
|
90
101
|
} & EntityCollection<M>;
|
|
91
102
|
|
|
92
103
|
/**
|
|
@@ -110,12 +121,12 @@ export type EntityCollectionViewProps<M extends Record<string, any>> = {
|
|
|
110
121
|
*
|
|
111
122
|
* @param fullPath
|
|
112
123
|
* @param collection
|
|
113
|
-
|
|
124
|
+
|
|
114
125
|
* @group Components
|
|
115
126
|
*/
|
|
116
127
|
export const EntityCollectionView = React.memo(
|
|
117
128
|
function EntityCollectionView<M extends Record<string, any>>({
|
|
118
|
-
fullPath,
|
|
129
|
+
fullPath: fullPathProp,
|
|
119
130
|
parentCollectionIds,
|
|
120
131
|
isSubCollection,
|
|
121
132
|
className,
|
|
@@ -123,14 +134,15 @@ export const EntityCollectionView = React.memo(
|
|
|
123
134
|
}: EntityCollectionViewProps<M>
|
|
124
135
|
) {
|
|
125
136
|
|
|
126
|
-
const
|
|
137
|
+
const context = useFireCMSContext();
|
|
138
|
+
const fullPath = fullPathProp ?? collectionProp.path;
|
|
139
|
+
const dataSource = useDataSource(collectionProp);
|
|
127
140
|
const navigation = useNavigationController();
|
|
128
141
|
const sideEntityController = useSideEntityController();
|
|
129
142
|
const authController = useAuthController();
|
|
130
143
|
const userConfigPersistence = useUserConfigurationPersistence();
|
|
131
144
|
const analyticsController = useAnalyticsController();
|
|
132
145
|
const customizationController = useCustomizationController();
|
|
133
|
-
const context = useFireCMSContext();
|
|
134
146
|
|
|
135
147
|
const containerRef = React.useRef<HTMLDivElement>(null);
|
|
136
148
|
|
|
@@ -144,27 +156,26 @@ export const EntityCollectionView = React.memo(
|
|
|
144
156
|
collectionRef.current = collection;
|
|
145
157
|
}, [collection]);
|
|
146
158
|
|
|
147
|
-
const canCreateEntities = canCreateEntity(collection, authController,
|
|
148
|
-
const [
|
|
159
|
+
const canCreateEntities = canCreateEntity(collection, authController, fullPath, null);
|
|
160
|
+
const [highlightedEntity, setHighlightedEntity] = useState<Entity<M> | undefined>(undefined);
|
|
149
161
|
const [deleteEntityClicked, setDeleteEntityClicked] = React.useState<Entity<M> | Entity<M>[] | undefined>(undefined);
|
|
150
162
|
|
|
151
|
-
const [textSearchLoading, setTextSearchLoading] = useState<boolean>(false);
|
|
152
163
|
const [lastDeleteTimestamp, setLastDeleteTimestamp] = React.useState<number>(0);
|
|
153
164
|
|
|
154
165
|
// number of entities in the collection
|
|
155
166
|
const [docsCount, setDocsCount] = useState<number>(0);
|
|
156
167
|
|
|
157
168
|
const unselectNavigatedEntity = useCallback(() => {
|
|
158
|
-
const currentSelection =
|
|
169
|
+
const currentSelection = highlightedEntity;
|
|
159
170
|
setTimeout(() => {
|
|
160
|
-
if (currentSelection ===
|
|
161
|
-
|
|
171
|
+
if (currentSelection === highlightedEntity)
|
|
172
|
+
setHighlightedEntity(undefined);
|
|
162
173
|
}, 2400);
|
|
163
|
-
}, [
|
|
174
|
+
}, [highlightedEntity]);
|
|
164
175
|
|
|
165
176
|
const checkInlineEditing = useCallback((entity?: Entity<any>): boolean => {
|
|
166
177
|
const collection = collectionRef.current;
|
|
167
|
-
if (!canEditEntity(collection, authController,
|
|
178
|
+
if (!canEditEntity(collection, authController, fullPath, entity ?? null)) {
|
|
168
179
|
return false;
|
|
169
180
|
}
|
|
170
181
|
return collection.inlineEditing === undefined || collection.inlineEditing;
|
|
@@ -179,19 +190,16 @@ export const EntityCollectionView = React.memo(
|
|
|
179
190
|
const usedSelectionController = collection.selectionController ?? selectionController;
|
|
180
191
|
const {
|
|
181
192
|
selectedEntities,
|
|
182
|
-
toggleEntitySelection,
|
|
183
|
-
isEntitySelected,
|
|
184
193
|
setSelectedEntities
|
|
185
194
|
} = usedSelectionController;
|
|
186
195
|
|
|
187
|
-
useEffect(() => {
|
|
188
|
-
|
|
189
|
-
}, [selectedEntities]);
|
|
196
|
+
// useEffect(() => {
|
|
197
|
+
// setDeleteEntityClicked(undefined);
|
|
198
|
+
// }, [selectedEntities]);
|
|
190
199
|
|
|
191
200
|
const tableController = useDataSourceEntityCollectionTableController<M>({
|
|
192
201
|
fullPath,
|
|
193
|
-
collection
|
|
194
|
-
entitiesDisplayedFirst: [],
|
|
202
|
+
collection,
|
|
195
203
|
lastDeleteTimestamp
|
|
196
204
|
});
|
|
197
205
|
|
|
@@ -204,7 +212,7 @@ export const EntityCollectionView = React.memo(
|
|
|
204
212
|
|
|
205
213
|
const onEntityClick = useCallback((clickedEntity: Entity<M>) => {
|
|
206
214
|
const collection = collectionRef.current;
|
|
207
|
-
|
|
215
|
+
setHighlightedEntity(clickedEntity);
|
|
208
216
|
analyticsController.onAnalyticsEvent?.("edit_entity_clicked", {
|
|
209
217
|
path: clickedEntity.path,
|
|
210
218
|
entityId: clickedEntity.id
|
|
@@ -214,9 +222,9 @@ export const EntityCollectionView = React.memo(
|
|
|
214
222
|
path: clickedEntity.path,
|
|
215
223
|
collection,
|
|
216
224
|
updateUrl: true,
|
|
217
|
-
onClose: unselectNavigatedEntity
|
|
225
|
+
onClose: unselectNavigatedEntity,
|
|
218
226
|
});
|
|
219
|
-
}, [unselectNavigatedEntity]);
|
|
227
|
+
}, [unselectNavigatedEntity, sideEntityController]);
|
|
220
228
|
|
|
221
229
|
const onNewClick = useCallback(() => {
|
|
222
230
|
|
|
@@ -228,9 +236,9 @@ export const EntityCollectionView = React.memo(
|
|
|
228
236
|
path: fullPath,
|
|
229
237
|
collection,
|
|
230
238
|
updateUrl: true,
|
|
231
|
-
onClose: unselectNavigatedEntity
|
|
239
|
+
onClose: unselectNavigatedEntity,
|
|
232
240
|
});
|
|
233
|
-
}, [fullPath]);
|
|
241
|
+
}, [fullPath, sideEntityController]);
|
|
234
242
|
|
|
235
243
|
const onMultipleDeleteClick = () => {
|
|
236
244
|
analyticsController.onAnalyticsEvent?.("multiple_delete_dialog_open", {
|
|
@@ -260,6 +268,7 @@ export const EntityCollectionView = React.memo(
|
|
|
260
268
|
fullPath: string,
|
|
261
269
|
parentCollectionIds: string[],
|
|
262
270
|
collection: EntityCollection;
|
|
271
|
+
tableController: EntityTableController;
|
|
263
272
|
}> | undefined
|
|
264
273
|
|
|
265
274
|
// we are only using the first plugin that implements this
|
|
@@ -292,7 +301,7 @@ export const EntityCollectionView = React.memo(
|
|
|
292
301
|
onCollectionModifiedForUser(fullPath, { defaultSize: size })
|
|
293
302
|
}, [onCollectionModifiedForUser, fullPath, userConfigPersistence]);
|
|
294
303
|
|
|
295
|
-
const createEnabled = canCreateEntity(collection, authController,
|
|
304
|
+
const createEnabled = canCreateEntity(collection, authController, fullPath, null);
|
|
296
305
|
|
|
297
306
|
const uniqueFieldValidator: UniqueFieldValidator = useCallback(
|
|
298
307
|
({
|
|
@@ -300,17 +309,15 @@ export const EntityCollectionView = React.memo(
|
|
|
300
309
|
value,
|
|
301
310
|
property,
|
|
302
311
|
entityId
|
|
303
|
-
}) => dataSource.checkUniqueField(fullPath, name, value, entityId),
|
|
312
|
+
}) => dataSource.checkUniqueField(fullPath, name, value, entityId, collection),
|
|
304
313
|
[fullPath]);
|
|
305
314
|
|
|
306
315
|
const onValueChange: OnCellValueChange<any, any> = ({
|
|
307
|
-
fullPath,
|
|
308
|
-
context,
|
|
309
316
|
value,
|
|
310
317
|
propertyKey,
|
|
311
318
|
onValueUpdated,
|
|
312
319
|
setError,
|
|
313
|
-
entity,
|
|
320
|
+
data: entity,
|
|
314
321
|
}) => {
|
|
315
322
|
|
|
316
323
|
const updatedValues = setIn({ ...entity.values }, propertyKey, value);
|
|
@@ -327,10 +334,12 @@ export const EntityCollectionView = React.memo(
|
|
|
327
334
|
return saveEntityWithCallbacks({
|
|
328
335
|
...saveProps,
|
|
329
336
|
collection,
|
|
330
|
-
callbacks: collection.callbacks,
|
|
331
337
|
dataSource,
|
|
332
338
|
context,
|
|
333
|
-
onSaveSuccess: () =>
|
|
339
|
+
onSaveSuccess: () => {
|
|
340
|
+
setError(undefined);
|
|
341
|
+
onValueUpdated();
|
|
342
|
+
},
|
|
334
343
|
onSaveFailure: (e: Error) => {
|
|
335
344
|
console.error("Save failure");
|
|
336
345
|
console.error(e);
|
|
@@ -349,7 +358,6 @@ export const EntityCollectionView = React.memo(
|
|
|
349
358
|
|
|
350
359
|
const getPropertyFor = useCallback(({
|
|
351
360
|
propertyKey,
|
|
352
|
-
propertyValue,
|
|
353
361
|
entity
|
|
354
362
|
}: GetPropertyForProps<M>) => {
|
|
355
363
|
let propertyOrBuilder: PropertyOrBuilder<any, M> | undefined = getPropertyInPath<M>(collection.properties, propertyKey);
|
|
@@ -363,13 +371,12 @@ export const EntityCollectionView = React.memo(
|
|
|
363
371
|
return resolveProperty({
|
|
364
372
|
propertyKey,
|
|
365
373
|
propertyOrBuilder,
|
|
366
|
-
path:
|
|
367
|
-
propertyValue,
|
|
374
|
+
path: entity.path,
|
|
368
375
|
values: entity.values,
|
|
369
376
|
entityId: entity.id,
|
|
370
377
|
fields: customizationController.propertyConfigs
|
|
371
378
|
});
|
|
372
|
-
}, [collection.properties, customizationController.propertyConfigs,
|
|
379
|
+
}, [collection.properties, customizationController.propertyConfigs, resolvedCollection.properties]);
|
|
373
380
|
|
|
374
381
|
const displayedColumnIds = useColumnIds(resolvedCollection, true);
|
|
375
382
|
|
|
@@ -391,7 +398,7 @@ export const EntityCollectionView = React.memo(
|
|
|
391
398
|
entityId: entity.id,
|
|
392
399
|
selectedSubPath: subcollection.id ?? subcollection.path,
|
|
393
400
|
collection,
|
|
394
|
-
updateUrl: true
|
|
401
|
+
updateUrl: true,
|
|
395
402
|
});
|
|
396
403
|
}}>
|
|
397
404
|
{subcollection.name}
|
|
@@ -409,16 +416,16 @@ export const EntityCollectionView = React.memo(
|
|
|
409
416
|
Builder: ({ entity }) => {
|
|
410
417
|
const collectionsWithPath = navigation.getParentReferencesFromPath(entity.path);
|
|
411
418
|
return (
|
|
412
|
-
|
|
419
|
+
<div className={"flex flex-col gap-2 w-full"}>
|
|
413
420
|
{collectionsWithPath.map((reference) => {
|
|
414
421
|
return (
|
|
415
422
|
<ReferencePreview
|
|
416
423
|
key={reference.path + "/" + reference.id}
|
|
417
424
|
reference={reference}
|
|
418
|
-
size={"
|
|
425
|
+
size={"smallest"}/>
|
|
419
426
|
);
|
|
420
427
|
})}
|
|
421
|
-
|
|
428
|
+
</div>
|
|
422
429
|
);
|
|
423
430
|
}
|
|
424
431
|
}]
|
|
@@ -429,7 +436,7 @@ export const EntityCollectionView = React.memo(
|
|
|
429
436
|
...subcollectionColumns,
|
|
430
437
|
...collectionGroupParentCollections
|
|
431
438
|
];
|
|
432
|
-
}, [collection, fullPath]);
|
|
439
|
+
}, [collection, fullPath, sideEntityController]);
|
|
433
440
|
|
|
434
441
|
const updateLastDeleteTimestamp = useCallback(() => {
|
|
435
442
|
setLastDeleteTimestamp(Date.now());
|
|
@@ -437,11 +444,14 @@ export const EntityCollectionView = React.memo(
|
|
|
437
444
|
|
|
438
445
|
const largeLayout = useLargeLayout();
|
|
439
446
|
|
|
440
|
-
const getActionsForEntity =
|
|
447
|
+
const getActionsForEntity = ({
|
|
448
|
+
entity,
|
|
449
|
+
customEntityActions
|
|
450
|
+
}: {
|
|
441
451
|
entity?: Entity<M>,
|
|
442
452
|
customEntityActions?: EntityAction[]
|
|
443
453
|
}): EntityAction[] => {
|
|
444
|
-
const deleteEnabled = entity ? canDeleteEntity(collection, authController,
|
|
454
|
+
const deleteEnabled = entity ? canDeleteEntity(collection, authController, fullPath, entity) : true;
|
|
445
455
|
const actions: EntityAction[] = [editEntityAction];
|
|
446
456
|
if (createEnabled)
|
|
447
457
|
actions.push(copyEntityAction);
|
|
@@ -450,15 +460,15 @@ export const EntityCollectionView = React.memo(
|
|
|
450
460
|
if (customEntityActions)
|
|
451
461
|
actions.push(...customEntityActions);
|
|
452
462
|
return actions;
|
|
453
|
-
}
|
|
463
|
+
};
|
|
454
464
|
|
|
455
|
-
const getIdColumnWidth =
|
|
465
|
+
const getIdColumnWidth = () => {
|
|
456
466
|
const entityActions = getActionsForEntity({});
|
|
457
467
|
const collapsedActions = entityActions.filter(a => a.collapsed !== false);
|
|
458
468
|
const uncollapsedActions = entityActions.filter(a => a.collapsed === false);
|
|
459
469
|
const actionsWidth = uncollapsedActions.length * (largeLayout ? 40 : 30);
|
|
460
470
|
return (largeLayout ? (80 + actionsWidth) : (70 + actionsWidth)) + (collapsedActions.length > 0 ? (largeLayout ? 40 : 30) : 0);
|
|
461
|
-
}
|
|
471
|
+
};
|
|
462
472
|
|
|
463
473
|
const tableRowActionsBuilder = useCallback(({
|
|
464
474
|
entity,
|
|
@@ -472,9 +482,12 @@ export const EntityCollectionView = React.memo(
|
|
|
472
482
|
frozen?: boolean
|
|
473
483
|
}) => {
|
|
474
484
|
|
|
475
|
-
const isSelected =
|
|
485
|
+
const isSelected = usedSelectionController.selectedEntities.map(e => e.id).includes(entity.id);
|
|
476
486
|
|
|
477
|
-
const actions = getActionsForEntity({
|
|
487
|
+
const actions = getActionsForEntity({
|
|
488
|
+
entity,
|
|
489
|
+
customEntityActions: collection.entityActions
|
|
490
|
+
});
|
|
478
491
|
|
|
479
492
|
return (
|
|
480
493
|
<EntityCollectionRowActions
|
|
@@ -484,7 +497,7 @@ export const EntityCollectionView = React.memo(
|
|
|
484
497
|
isSelected={isSelected}
|
|
485
498
|
selectionEnabled={selectionEnabled}
|
|
486
499
|
size={size}
|
|
487
|
-
highlightEntity={
|
|
500
|
+
highlightEntity={setHighlightedEntity}
|
|
488
501
|
unhighlightEntity={unselectNavigatedEntity}
|
|
489
502
|
collection={collection}
|
|
490
503
|
fullPath={fullPath}
|
|
@@ -495,7 +508,7 @@ export const EntityCollectionView = React.memo(
|
|
|
495
508
|
/>
|
|
496
509
|
);
|
|
497
510
|
|
|
498
|
-
}, [
|
|
511
|
+
}, [updateLastDeleteTimestamp, usedSelectionController]);
|
|
499
512
|
|
|
500
513
|
const title = <Popover
|
|
501
514
|
open={popOverOpen}
|
|
@@ -554,6 +567,7 @@ export const EntityCollectionView = React.memo(
|
|
|
554
567
|
property={property}
|
|
555
568
|
fullPath={fullPath}
|
|
556
569
|
collection={collection}
|
|
570
|
+
tableController={tableController}
|
|
557
571
|
parentCollectionIds={parentCollectionIds ?? []}/>;
|
|
558
572
|
})}
|
|
559
573
|
</>;
|
|
@@ -564,47 +578,31 @@ export const EntityCollectionView = React.memo(
|
|
|
564
578
|
if (typeof AddColumnComponent === "function")
|
|
565
579
|
return <AddColumnComponent fullPath={fullPath}
|
|
566
580
|
parentCollectionIds={parentCollectionIds ?? []}
|
|
567
|
-
collection={collection}
|
|
581
|
+
collection={collection}
|
|
582
|
+
tableController={tableController}/>;
|
|
568
583
|
return null;
|
|
569
584
|
}
|
|
570
585
|
: undefined;
|
|
571
586
|
|
|
572
|
-
const
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
if (p.collectionView?.onTextSearchClick)
|
|
583
|
-
return p.collectionView.onTextSearchClick({ context, path: resolvedFullPath, collection, parentCollectionIds });
|
|
584
|
-
return Promise.resolve(true);
|
|
585
|
-
}) as Promise<boolean>[])
|
|
586
|
-
.then((res) => {
|
|
587
|
-
if (res.every(Boolean)) setTextSearchInitialised(true);
|
|
588
|
-
})
|
|
589
|
-
.finally(() => setTextSearchLoading(false));
|
|
590
|
-
}
|
|
591
|
-
: undefined;
|
|
592
|
-
|
|
593
|
-
customizationController.plugins?.forEach(p => {
|
|
594
|
-
if (!textSearchEnabled)
|
|
595
|
-
if (p.collectionView?.showTextSearchBar) {
|
|
596
|
-
textSearchEnabled = p.collectionView.showTextSearchBar({ context, path: resolvedFullPath, collection, parentCollectionIds });
|
|
597
|
-
}
|
|
598
|
-
})
|
|
599
|
-
}
|
|
587
|
+
const {
|
|
588
|
+
textSearchLoading,
|
|
589
|
+
textSearchInitialised,
|
|
590
|
+
onTextSearchClick,
|
|
591
|
+
textSearchEnabled
|
|
592
|
+
} = useTableSearchHelper({
|
|
593
|
+
collection,
|
|
594
|
+
fullPath: resolvedFullPath,
|
|
595
|
+
parentCollectionIds
|
|
596
|
+
});
|
|
600
597
|
|
|
601
598
|
return (
|
|
602
|
-
<div className={
|
|
599
|
+
<div className={cls("overflow-hidden h-full w-full rounded-md", className)}
|
|
603
600
|
ref={containerRef}>
|
|
604
601
|
<EntityCollectionTable
|
|
605
602
|
key={`collection_table_${fullPath}`}
|
|
606
603
|
additionalFields={additionalFields}
|
|
607
604
|
tableController={tableController}
|
|
605
|
+
enablePopupIcon={true}
|
|
608
606
|
displayedColumnIds={displayedColumnIds}
|
|
609
607
|
onSizeChanged={onSizeChanged}
|
|
610
608
|
onEntityClick={onEntityClick}
|
|
@@ -614,13 +612,21 @@ export const EntityCollectionView = React.memo(
|
|
|
614
612
|
uniqueFieldValidator={uniqueFieldValidator}
|
|
615
613
|
title={title}
|
|
616
614
|
selectionController={usedSelectionController}
|
|
617
|
-
highlightedEntities={
|
|
615
|
+
highlightedEntities={highlightedEntity ? [highlightedEntity] : []}
|
|
618
616
|
defaultSize={collection.defaultSize}
|
|
619
617
|
properties={resolvedCollection.properties}
|
|
620
618
|
getPropertyFor={getPropertyFor}
|
|
621
619
|
onTextSearchClick={textSearchInitialised ? undefined : onTextSearchClick}
|
|
622
620
|
textSearchLoading={textSearchLoading}
|
|
623
621
|
textSearchEnabled={textSearchEnabled}
|
|
622
|
+
actionsStart={<EntityCollectionViewStartActions
|
|
623
|
+
parentCollectionIds={parentCollectionIds ?? []}
|
|
624
|
+
collection={collection}
|
|
625
|
+
tableController={tableController}
|
|
626
|
+
path={fullPath}
|
|
627
|
+
relativePath={collection.path}
|
|
628
|
+
selectionController={usedSelectionController}
|
|
629
|
+
collectionEntitiesCount={docsCount}/>}
|
|
624
630
|
actions={<EntityCollectionViewActions
|
|
625
631
|
parentCollectionIds={parentCollectionIds ?? []}
|
|
626
632
|
collection={collection}
|
|
@@ -658,19 +664,19 @@ export const EntityCollectionView = React.memo(
|
|
|
658
664
|
collection={collection}/>}
|
|
659
665
|
/>
|
|
660
666
|
|
|
661
|
-
<PopupFormField
|
|
667
|
+
{popupCell && <PopupFormField
|
|
662
668
|
key={`popup_form_${popupCell?.propertyKey}_${popupCell?.entity?.id}`}
|
|
663
669
|
open={Boolean(popupCell)}
|
|
664
670
|
onClose={onPopupClose}
|
|
665
671
|
cellRect={popupCell?.cellRect}
|
|
666
672
|
propertyKey={popupCell?.propertyKey}
|
|
667
673
|
collection={collection}
|
|
668
|
-
entity={popupCell
|
|
674
|
+
entity={popupCell.entity}
|
|
669
675
|
tableKey={tableKey.current}
|
|
670
676
|
customFieldValidator={uniqueFieldValidator}
|
|
671
677
|
path={resolvedFullPath}
|
|
672
678
|
onCellValueChange={onValueChange}
|
|
673
|
-
container={containerRef.current}/>
|
|
679
|
+
container={containerRef.current}/>}
|
|
674
680
|
|
|
675
681
|
{deleteEntityClicked &&
|
|
676
682
|
<DeleteEntityDialog
|
|
@@ -691,45 +697,21 @@ export const EntityCollectionView = React.memo(
|
|
|
691
697
|
equal(a.isSubCollection, b.isSubCollection) &&
|
|
692
698
|
equal(a.className, b.className) &&
|
|
693
699
|
equal(a.properties, b.properties) &&
|
|
700
|
+
equal(a.propertiesOrder, b.propertiesOrder) &&
|
|
694
701
|
equal(a.hideIdFromCollection, b.hideIdFromCollection) &&
|
|
695
702
|
equal(a.inlineEditing, b.inlineEditing) &&
|
|
696
703
|
equal(a.selectionEnabled, b.selectionEnabled) &&
|
|
697
704
|
equal(a.selectionController, b.selectionController) &&
|
|
698
705
|
equal(a.Actions, b.Actions) &&
|
|
699
706
|
equal(a.defaultSize, b.defaultSize) &&
|
|
707
|
+
equal(a.initialFilter, b.initialFilter) &&
|
|
708
|
+
equal(a.initialSort, b.initialSort) &&
|
|
700
709
|
equal(a.textSearchEnabled, b.textSearchEnabled) &&
|
|
701
710
|
equal(a.additionalFields, b.additionalFields) &&
|
|
711
|
+
equal(a.sideDialogWidth, b.sideDialogWidth) &&
|
|
702
712
|
equal(a.forceFilter, b.forceFilter);
|
|
703
713
|
}) as React.FunctionComponent<EntityCollectionViewProps<any>>
|
|
704
714
|
|
|
705
|
-
export function useSelectionController<M extends Record<string, any> = any>(
|
|
706
|
-
onSelectionChange?: (entity: Entity<M>, selected: boolean) => void
|
|
707
|
-
): SelectionController<M> {
|
|
708
|
-
|
|
709
|
-
const [selectedEntities, setSelectedEntities] = useState<Entity<M>[]>([]);
|
|
710
|
-
|
|
711
|
-
const toggleEntitySelection = useCallback((entity: Entity<M>) => {
|
|
712
|
-
let newValue;
|
|
713
|
-
if (selectedEntities.map(e => e.id).includes(entity.id)) {
|
|
714
|
-
onSelectionChange?.(entity, false);
|
|
715
|
-
newValue = selectedEntities.filter((item: Entity<M>) => item.id !== entity.id);
|
|
716
|
-
} else {
|
|
717
|
-
onSelectionChange?.(entity, true);
|
|
718
|
-
newValue = [...selectedEntities, entity];
|
|
719
|
-
}
|
|
720
|
-
setSelectedEntities(newValue);
|
|
721
|
-
}, [selectedEntities]);
|
|
722
|
-
|
|
723
|
-
const isEntitySelected = useCallback((entity: Entity<M>) => selectedEntities.map(e => e.id).includes(entity.id), [selectedEntities]);
|
|
724
|
-
|
|
725
|
-
return {
|
|
726
|
-
selectedEntities,
|
|
727
|
-
setSelectedEntities,
|
|
728
|
-
isEntitySelected,
|
|
729
|
-
toggleEntitySelection
|
|
730
|
-
};
|
|
731
|
-
}
|
|
732
|
-
|
|
733
715
|
function EntitiesCount({
|
|
734
716
|
fullPath,
|
|
735
717
|
collection,
|
|
@@ -744,7 +726,7 @@ function EntitiesCount({
|
|
|
744
726
|
onCountChange?: (count: number) => void,
|
|
745
727
|
}) {
|
|
746
728
|
|
|
747
|
-
const dataSource = useDataSource();
|
|
729
|
+
const dataSource = useDataSource(collection);
|
|
748
730
|
const navigation = useNavigationController();
|
|
749
731
|
const [count, setCount] = useState<number | undefined>(undefined);
|
|
750
732
|
const [error, setError] = useState<Error | undefined>(undefined);
|
|
@@ -754,17 +736,19 @@ function EntitiesCount({
|
|
|
754
736
|
const resolvedPath = useMemo(() => navigation.resolveAliasesFrom(fullPath), [fullPath, navigation.resolveAliasesFrom]);
|
|
755
737
|
|
|
756
738
|
useEffect(() => {
|
|
757
|
-
dataSource.countEntities
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
739
|
+
if (dataSource.countEntities)
|
|
740
|
+
dataSource.countEntities({
|
|
741
|
+
path: resolvedPath,
|
|
742
|
+
collection,
|
|
743
|
+
filter,
|
|
744
|
+
orderBy: sortByProperty,
|
|
745
|
+
order: currentSort
|
|
746
|
+
}).then(setCount).catch(setError);
|
|
747
|
+
}, [fullPath, dataSource.countEntities, resolvedPath, collection, filter, sortByProperty, currentSort]);
|
|
765
748
|
|
|
766
749
|
useEffect(() => {
|
|
767
750
|
if (onCountChange) {
|
|
751
|
+
setError(undefined);
|
|
768
752
|
onCountChange(count ?? 0);
|
|
769
753
|
}
|
|
770
754
|
}, [onCountChange, count]);
|
|
@@ -798,45 +782,74 @@ function EntityIdHeaderWidget({
|
|
|
798
782
|
}) {
|
|
799
783
|
const [openPopup, setOpenPopup] = React.useState(false);
|
|
800
784
|
const [searchString, setSearchString] = React.useState("");
|
|
785
|
+
const [recentIds, setRecentIds] = React.useState<string[]>(getRecentIds(collection.id));
|
|
801
786
|
const sideEntityController = useSideEntityController();
|
|
787
|
+
|
|
788
|
+
|
|
802
789
|
return (
|
|
803
|
-
<Tooltip title={!openPopup ? "Find by ID" : undefined}>
|
|
790
|
+
<Tooltip title={!openPopup ? "Find by ID" : undefined} asChild={false}>
|
|
804
791
|
<Popover
|
|
805
792
|
open={openPopup}
|
|
806
793
|
onOpenChange={setOpenPopup}
|
|
794
|
+
sideOffset={0}
|
|
795
|
+
align={"start"}
|
|
796
|
+
alignOffset={-117}
|
|
807
797
|
trigger={
|
|
808
798
|
<IconButton size={"small"}>
|
|
809
799
|
<SearchIcon size={"small"}/>
|
|
810
800
|
</IconButton>
|
|
811
|
-
}
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
<
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
801
|
+
}>
|
|
802
|
+
<div className={cls("my-2 rounded-lg bg-gray-50 dark:bg-gray-950 text-gray-900 dark:text-white")}>
|
|
803
|
+
<form noValidate={true}
|
|
804
|
+
onSubmit={(e) => {
|
|
805
|
+
e.preventDefault();
|
|
806
|
+
if (!searchString) return;
|
|
807
|
+
setOpenPopup(false);
|
|
808
|
+
setRecentIds(addRecentId(collection.id, searchString.trim()));
|
|
809
|
+
return sideEntityController.open({
|
|
810
|
+
entityId: searchString.trim(),
|
|
811
|
+
path,
|
|
812
|
+
collection,
|
|
813
|
+
updateUrl: true
|
|
814
|
+
});
|
|
815
|
+
}}
|
|
816
|
+
className={"w-96 max-w-full"}>
|
|
817
|
+
|
|
818
|
+
<div className="flex p-2 w-full gap-2">
|
|
819
|
+
<input
|
|
820
|
+
autoFocus={openPopup}
|
|
821
|
+
placeholder={"Find entity by ID"}
|
|
822
|
+
// size={"small"}
|
|
823
|
+
onChange={(e) => {
|
|
824
|
+
setSearchString(e.target.value);
|
|
825
|
+
}}
|
|
826
|
+
value={searchString}
|
|
827
|
+
className={"rounded-lg bg-white dark:bg-gray-800 flex-grow bg-transparent outline-none p-2 " + focusedDisabled}/>
|
|
828
|
+
<Button variant={"text"}
|
|
829
|
+
disabled={!(searchString.trim())}
|
|
830
|
+
type={"submit"}
|
|
831
|
+
><KeyboardTabIcon/></Button>
|
|
832
|
+
</div>
|
|
833
|
+
</form>
|
|
834
|
+
{recentIds && recentIds.length > 0 && <div className="flex flex-col gap-2 p-2">
|
|
835
|
+
{recentIds.map(id => (
|
|
836
|
+
<ReferencePreview reference={new EntityReference(id, path)}
|
|
837
|
+
key={id}
|
|
838
|
+
hover={true}
|
|
839
|
+
onClick={() => {
|
|
840
|
+
setOpenPopup(false);
|
|
841
|
+
sideEntityController.open({
|
|
842
|
+
entityId: id,
|
|
843
|
+
path,
|
|
844
|
+
collection,
|
|
845
|
+
updateUrl: true
|
|
846
|
+
});
|
|
847
|
+
}}
|
|
848
|
+
includeEntityLink={false}
|
|
849
|
+
size={"small"}/>
|
|
850
|
+
))}
|
|
851
|
+
</div>}
|
|
852
|
+
</div>
|
|
840
853
|
</Popover>
|
|
841
854
|
|
|
842
855
|
</Tooltip>
|