diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/widgets/SelectWidgetSourceDI.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/widgets/SelectWidgetSourceDI.kt index d6d841d339..2d7764728e 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/feature/widgets/SelectWidgetSourceDI.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/feature/widgets/SelectWidgetSourceDI.kt @@ -6,6 +6,7 @@ import com.anytypeio.anytype.di.common.ComponentDependencies import com.anytypeio.anytype.domain.base.AppCoroutineDispatchers import com.anytypeio.anytype.domain.block.interactor.sets.GetObjectTypes import com.anytypeio.anytype.domain.block.repo.BlockRepository +import com.anytypeio.anytype.domain.debugging.Logger import com.anytypeio.anytype.domain.misc.UrlBuilder import com.anytypeio.anytype.domain.objects.StoreOfObjectTypes import com.anytypeio.anytype.domain.primitives.FieldParser @@ -51,6 +52,7 @@ interface SelectWidgetSourceDependencies : ComponentDependencies { fun analyticsHelper(): AnalyticSpaceHelperDelegate fun searchObjects(): SearchObjects fun fieldParser(): FieldParser + fun logger(): Logger } @Module diff --git a/domain/src/main/java/com/anytypeio/anytype/domain/widgets/GetSuggestedWidgetTypes.kt b/domain/src/main/java/com/anytypeio/anytype/domain/widgets/GetSuggestedWidgetTypes.kt index 0994ab1c2c..4d3241cba2 100644 --- a/domain/src/main/java/com/anytypeio/anytype/domain/widgets/GetSuggestedWidgetTypes.kt +++ b/domain/src/main/java/com/anytypeio/anytype/domain/widgets/GetSuggestedWidgetTypes.kt @@ -1,9 +1,16 @@ package com.anytypeio.anytype.domain.widgets +import com.anytypeio.anytype.core_models.Block import com.anytypeio.anytype.core_models.DVFilter +import com.anytypeio.anytype.core_models.DVFilterCondition import com.anytypeio.anytype.core_models.Id +import com.anytypeio.anytype.core_models.ObjectType +import com.anytypeio.anytype.core_models.ObjectTypeUniqueKeys import com.anytypeio.anytype.core_models.ObjectWrapper +import com.anytypeio.anytype.core_models.Relations +import com.anytypeio.anytype.core_models.ext.asMap import com.anytypeio.anytype.core_models.primitives.Space +import com.anytypeio.anytype.core_models.primitives.SpaceId import com.anytypeio.anytype.domain.base.AppCoroutineDispatchers import com.anytypeio.anytype.domain.base.ResultInteractor import com.anytypeio.anytype.domain.block.repo.BlockRepository @@ -16,13 +23,34 @@ class GetSuggestedWidgetTypes @Inject constructor( override suspend fun doWork(params: Params): List { - // TODO DROID-3438 open widget object preview and filter out existing object types + val alreadyUsedObjectTypes = getAlreadyUsedTypes( + space = params.space, + widgets = params.ctx + ) val types = repo.searchObjects( space = params.space, limit = DEFAULT_LIMIT, - filters = params.objectTypeFilters, - keys = params.objectTypeKeys + keys = params.objectTypeKeys, + filters = buildList { + addAll(params.objectTypeFilters) + if (alreadyUsedObjectTypes.isNotEmpty()) { + add( + DVFilter( + relation = Relations.ID, + condition = DVFilterCondition.NOT_IN, + value = alreadyUsedObjectTypes + ) + ) + } + add( + DVFilter( + relation = Relations.UNIQUE_KEY, + condition = DVFilterCondition.NOT_EQUAL, + value = ObjectTypeUniqueKeys.OBJECT_TYPE + ) + ) + } ).map { result -> ObjectWrapper.Type(result) } @@ -30,8 +58,39 @@ class GetSuggestedWidgetTypes @Inject constructor( return types } + private suspend fun getAlreadyUsedTypes(space: SpaceId, widgets: Id) : List { + val result = mutableListOf() + + runCatching { + val preview = repo.getObject(space = space, id = widgets) + + val map = preview.blocks.asMap() + + map.getOrDefault(widgets, emptyList()).forEach { block -> + if (block.content is Block.Content.Widget && block.children.isNotEmpty()) { + val link = preview.blocks.find { it.id == block.children.first() } + val content = link?.content + if (content is Block.Content.Link) { + val source = preview.details.getOrDefault( + content.target, + emptyMap() + ) + val wrapper = ObjectWrapper.Basic(source) + if (wrapper.layout == ObjectType.Layout.OBJECT_TYPE) { + result.add(wrapper.id) + } + } + } + } + } + + return result.distinct() + } + + data class Params( val space: Space, + val ctx: Id, val objectTypeFilters: List, val objectTypeKeys: List ) diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/search/ObjectSearchConstants.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/search/ObjectSearchConstants.kt index e82b9b4305..08c4ac6fa7 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/search/ObjectSearchConstants.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/search/ObjectSearchConstants.kt @@ -771,7 +771,7 @@ object ObjectSearchConstants { recommendedLayouts: List = emptyList(), excludedTypeKeys: List = emptyList(), excludeParticipant: Boolean = true, - excludeTemplates: Boolean = true + excludeTemplates: Boolean = true, ): List { return buildList { addAll( diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/SelectWidgetSourceViewModel.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/SelectWidgetSourceViewModel.kt index 20309047b1..459b90d3ba 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/SelectWidgetSourceViewModel.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/SelectWidgetSourceViewModel.kt @@ -146,7 +146,7 @@ class SelectWidgetSourceViewModel( target = target, isInEditMode = isInEditMode ) - proceedWithSearchQuery() + proceedWithSearchQuery(ctx) } fun onStartWithExistingWidget( @@ -164,10 +164,10 @@ class SelectWidgetSourceViewModel( type = type, isInEditMode = isInEditMode ) - proceedWithSearchQuery() + proceedWithSearchQuery(ctx) } - private fun proceedWithSearchQuery() { + private fun proceedWithSearchQuery(ctx: Id) { viewModelScope.launch { getSuggestedWidgetTypes.async( params = GetSuggestedWidgetTypes.Params( @@ -182,7 +182,8 @@ class SelectWidgetSourceViewModel( ) addAll(ObjectSearchConstants.filterTypes()) }, - objectTypeKeys = ObjectSearchConstants.defaultKeysObjectType + objectTypeKeys = ObjectSearchConstants.defaultKeysObjectType, + ctx = ctx ) ).onSuccess { types -> suggested.value = types.map { type ->