mirror of
https://github.com/anyproto/anytype-kotlin.git
synced 2025-06-10 10:00:44 +09:00
DROID-939 Sets | Fix | Cover and icon are not displayed in sets (#2914)
* DROID-939 legacy * DROID-939 legacy * DROID-939 update cards design * DROID-939 update mapping * DROID-939 update view * DROID-939 update cards design * DROID-939 update gallery view widget * DROID-939 fix model and mapping * DROID-939 hasCover param fix * DROID-939 refactoring * DROID-939 image preview menu item fix * DROID-939 seting background fix
This commit is contained in:
parent
fe83579efb
commit
066bf654e1
24 changed files with 479 additions and 679 deletions
|
@ -100,12 +100,12 @@ suspend fun DVViewer.render(
|
|||
viewer = Viewer.GalleryView(
|
||||
id = id,
|
||||
items = buildGalleryViews(
|
||||
objects = objects,
|
||||
objectIds = objects,
|
||||
details = details,
|
||||
relations = dataViewRelations,
|
||||
coverImageHashProvider = coverImageHashProvider,
|
||||
urlBuilder = builder,
|
||||
store = store
|
||||
objectStore = store
|
||||
),
|
||||
title = name,
|
||||
largeCards = cardSize != DVViewerCardSize.SMALL
|
||||
|
|
|
@ -60,26 +60,20 @@ class ObjectSetSettingsViewModel(
|
|||
}
|
||||
}
|
||||
|
||||
when (viewer.coverRelationKey) {
|
||||
null -> {
|
||||
result.add(ViewerRelationListView.Setting.ImagePreview.None)
|
||||
}
|
||||
Relations.PAGE_COVER -> {
|
||||
result.add(ViewerRelationListView.Setting.ImagePreview.Cover)
|
||||
}
|
||||
val coverRelationKey = viewer.coverRelationKey
|
||||
result.add(when {
|
||||
coverRelationKey.isNullOrBlank() -> ViewerRelationListView.Setting.ImagePreview.None
|
||||
coverRelationKey == Relations.PAGE_COVER -> ViewerRelationListView.Setting.ImagePreview.Cover
|
||||
else -> {
|
||||
val dv = objectSet.dataview.content<DV>()
|
||||
val preview =
|
||||
dv.relations.find { it.key == viewer.coverRelationKey }
|
||||
val preview = dv.relations.find { it.key == coverRelationKey }
|
||||
if (preview != null) {
|
||||
result.add(
|
||||
ViewerRelationListView.Setting.ImagePreview.Custom(
|
||||
preview.name
|
||||
)
|
||||
)
|
||||
ViewerRelationListView.Setting.ImagePreview.Custom(preview.name)
|
||||
} else {
|
||||
ViewerRelationListView.Setting.ImagePreview.None
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
result.add(ViewerRelationListView.Setting.Toggle.HideIcon(toggled = viewer.hideIcon))
|
||||
result.add(ViewerRelationListView.Setting.Toggle.FitImage(toggled = viewer.coverFit))
|
||||
|
|
|
@ -3,7 +3,7 @@ package com.anytypeio.anytype.presentation.sets
|
|||
import com.anytypeio.anytype.core_models.Block
|
||||
import com.anytypeio.anytype.core_models.CoverType
|
||||
import com.anytypeio.anytype.core_models.DVViewer
|
||||
import com.anytypeio.anytype.core_models.DVViewerCardSize
|
||||
import com.anytypeio.anytype.core_models.DVViewerRelation
|
||||
import com.anytypeio.anytype.core_models.Id
|
||||
import com.anytypeio.anytype.core_models.ObjectTypeIds.IMAGE
|
||||
import com.anytypeio.anytype.core_models.ObjectWrapper
|
||||
|
@ -25,13 +25,14 @@ import com.anytypeio.anytype.presentation.sets.model.Viewer
|
|||
|
||||
|
||||
suspend fun DVViewer.buildGalleryViews(
|
||||
objects: List<Id>,
|
||||
objectIds: List<Id>,
|
||||
relations: List<ObjectWrapper.Relation>,
|
||||
details: Map<Id, Block.Fields>,
|
||||
coverImageHashProvider: CoverImageHashProvider,
|
||||
urlBuilder: UrlBuilder,
|
||||
store: ObjectStore
|
||||
objectStore: ObjectStore
|
||||
): List<Viewer.GalleryView.Item> {
|
||||
|
||||
val filteredRelations = viewerRelations.mapNotNull { setting ->
|
||||
if (setting.isVisible && setting.key != Relations.NAME) {
|
||||
relations.find { it.key == setting.key }
|
||||
|
@ -39,112 +40,133 @@ suspend fun DVViewer.buildGalleryViews(
|
|||
null
|
||||
}
|
||||
}
|
||||
return objects.mapNotNull { id -> store.get(id) }.map { obj ->
|
||||
if (obj.coverType == CoverType.NONE && coverRelationKey == null) {
|
||||
Viewer.GalleryView.Item.Default(
|
||||
objectId = obj.id,
|
||||
relations = obj.values(
|
||||
relations = filteredRelations,
|
||||
|
||||
val hasCover = !coverRelationKey.isNullOrEmpty()
|
||||
|
||||
return objectIds
|
||||
.mapNotNull { objectStore.get(it) }
|
||||
.map { obj ->
|
||||
if (hasCover) {
|
||||
obj.mapToCoverItem(
|
||||
dvViewer = this,
|
||||
coverImageHashProvider = coverImageHashProvider,
|
||||
urlBuilder = urlBuilder,
|
||||
details = details,
|
||||
settings = viewerRelations,
|
||||
storeOfObjects = store
|
||||
),
|
||||
bigIcon = cardSize != DVViewerCardSize.SMALL,
|
||||
hideIcon = hideIcon,
|
||||
name = obj.getProperName(),
|
||||
icon = ObjectIcon.from(
|
||||
obj = obj,
|
||||
layout = obj.layout,
|
||||
builder = urlBuilder
|
||||
)
|
||||
)
|
||||
} else {
|
||||
|
||||
var cover: CoverView? = null
|
||||
|
||||
var coverColor: CoverColor? = null
|
||||
var coverImage: Url? = null
|
||||
var coverGradient: String? = null
|
||||
|
||||
if (obj.coverType != CoverType.NONE) {
|
||||
val coverContainer = BasicObjectCoverWrapper(obj)
|
||||
.getCover(urlBuilder, coverImageHashProvider)
|
||||
|
||||
coverColor = coverContainer.coverColor
|
||||
coverImage = coverContainer.coverImage
|
||||
coverGradient = coverContainer.coverGradient
|
||||
} else {
|
||||
val previewRelation = relations.find { it.key == coverRelationKey }
|
||||
if (previewRelation != null && previewRelation.format == Relation.Format.FILE) {
|
||||
val ids: List<Id> = when (val value = obj.map[previewRelation.key]) {
|
||||
is Id -> listOf(value)
|
||||
is List<*> -> value.typeOf()
|
||||
else -> emptyList()
|
||||
}
|
||||
val previewId = ids.find { id ->
|
||||
val preview = details[id]
|
||||
preview != null && preview.type.contains(IMAGE)
|
||||
}
|
||||
if (previewId != null) {
|
||||
coverImage = urlBuilder.image(previewId)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
when {
|
||||
coverImage != null -> {
|
||||
cover = CoverView.Image(coverImage)
|
||||
}
|
||||
coverColor != null -> {
|
||||
cover = CoverView.Color(coverColor)
|
||||
}
|
||||
coverGradient != null -> {
|
||||
cover = CoverView.Gradient(coverGradient)
|
||||
}
|
||||
}
|
||||
|
||||
if (cover != null) {
|
||||
Viewer.GalleryView.Item.Cover(
|
||||
objectId = obj.id,
|
||||
relations = obj.values(
|
||||
relations = filteredRelations,
|
||||
urlBuilder = urlBuilder,
|
||||
details = details,
|
||||
settings = viewerRelations,
|
||||
storeOfObjects = store
|
||||
),
|
||||
hideIcon = hideIcon,
|
||||
name = obj.getProperName(),
|
||||
icon = ObjectIcon.from(
|
||||
obj = obj,
|
||||
layout = obj.layout,
|
||||
builder = urlBuilder
|
||||
),
|
||||
cover = cover,
|
||||
fitImage = coverFit,
|
||||
isCoverLarge = cardSize == DVViewerCardSize.LARGE
|
||||
store = objectStore,
|
||||
relations = relations,
|
||||
filteredRelations = filteredRelations
|
||||
)
|
||||
} else {
|
||||
Viewer.GalleryView.Item.Default(
|
||||
objectId = obj.id,
|
||||
relations = obj.values(
|
||||
relations = filteredRelations,
|
||||
urlBuilder = urlBuilder,
|
||||
details = details,
|
||||
settings = viewerRelations,
|
||||
storeOfObjects = store
|
||||
),
|
||||
bigIcon = cardSize != DVViewerCardSize.SMALL,
|
||||
obj.mapToDefaultItem(
|
||||
hideIcon = hideIcon,
|
||||
name = obj.getProperName(),
|
||||
icon = ObjectIcon.from(
|
||||
obj = obj,
|
||||
layout = obj.layout,
|
||||
builder = urlBuilder
|
||||
)
|
||||
urlBuilder = urlBuilder,
|
||||
details = details,
|
||||
viewerRelations = viewerRelations,
|
||||
store = objectStore,
|
||||
filteredRelations = filteredRelations
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private suspend fun ObjectWrapper.Basic.mapToDefaultItem(
|
||||
hideIcon: Boolean,
|
||||
urlBuilder: UrlBuilder,
|
||||
details: Map<Id, Block.Fields>,
|
||||
viewerRelations: List<DVViewerRelation>,
|
||||
store: ObjectStore,
|
||||
filteredRelations: List<ObjectWrapper.Relation>
|
||||
): Viewer.GalleryView.Item.Default {
|
||||
val obj = this
|
||||
return Viewer.GalleryView.Item.Default(
|
||||
objectId = obj.id,
|
||||
relations = obj.values(
|
||||
relations = filteredRelations,
|
||||
urlBuilder = urlBuilder,
|
||||
details = details,
|
||||
settings = viewerRelations,
|
||||
storeOfObjects = store
|
||||
),
|
||||
hideIcon = hideIcon,
|
||||
name = obj.getProperName(),
|
||||
icon = ObjectIcon.getEditorLinkToObjectIcon(
|
||||
obj = obj,
|
||||
layout = obj.layout,
|
||||
builder = urlBuilder
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
private suspend fun ObjectWrapper.Basic.mapToCoverItem(
|
||||
dvViewer: DVViewer,
|
||||
relations: List<ObjectWrapper.Relation>,
|
||||
details: Map<Id, Block.Fields>,
|
||||
coverImageHashProvider: CoverImageHashProvider,
|
||||
urlBuilder: UrlBuilder,
|
||||
store: ObjectStore,
|
||||
filteredRelations: List<ObjectWrapper.Relation>
|
||||
): Viewer.GalleryView.Item.Cover {
|
||||
val obj = this
|
||||
var cover: CoverView? = null
|
||||
|
||||
var coverColor: CoverColor? = null
|
||||
var coverImage: Url? = null
|
||||
var coverGradient: String? = null
|
||||
|
||||
if (obj.coverType != CoverType.NONE) {
|
||||
val coverContainer = BasicObjectCoverWrapper(obj)
|
||||
.getCover(urlBuilder, coverImageHashProvider)
|
||||
|
||||
coverColor = coverContainer.coverColor
|
||||
coverImage = coverContainer.coverImage
|
||||
coverGradient = coverContainer.coverGradient
|
||||
} else {
|
||||
val previewRelation = relations.find { it.key == dvViewer.coverRelationKey }
|
||||
if (previewRelation != null && previewRelation.format == Relation.Format.FILE) {
|
||||
val ids: List<Id> = when (val value = obj.map[previewRelation.key]) {
|
||||
is Id -> listOf(value)
|
||||
is List<*> -> value.typeOf()
|
||||
else -> emptyList()
|
||||
}
|
||||
val previewId = ids.find { id ->
|
||||
val preview = details[id]
|
||||
preview != null && preview.type.contains(IMAGE)
|
||||
}
|
||||
if (previewId != null) {
|
||||
coverImage = urlBuilder.image(previewId)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
when {
|
||||
coverImage != null -> {
|
||||
cover = CoverView.Image(coverImage)
|
||||
}
|
||||
coverColor != null -> {
|
||||
cover = CoverView.Color(coverColor)
|
||||
}
|
||||
coverGradient != null -> {
|
||||
cover = CoverView.Gradient(coverGradient)
|
||||
}
|
||||
}
|
||||
|
||||
return Viewer.GalleryView.Item.Cover(
|
||||
objectId = obj.id,
|
||||
relations = obj.values(
|
||||
relations = filteredRelations,
|
||||
urlBuilder = urlBuilder,
|
||||
details = details,
|
||||
settings = dvViewer.viewerRelations,
|
||||
storeOfObjects = store
|
||||
),
|
||||
hideIcon = dvViewer.hideIcon,
|
||||
name = obj.getProperName(),
|
||||
icon = ObjectIcon.getEditorLinkToObjectIcon(
|
||||
obj = obj,
|
||||
layout = obj.layout,
|
||||
builder = urlBuilder
|
||||
),
|
||||
cover = cover,
|
||||
fitImage = dvViewer.coverFit
|
||||
)
|
||||
}
|
|
@ -31,7 +31,6 @@ import com.anytypeio.anytype.domain.block.interactor.UpdateText
|
|||
import com.anytypeio.anytype.domain.cover.SetDocCoverImage
|
||||
import com.anytypeio.anytype.domain.dataview.SetDataViewQuery
|
||||
import com.anytypeio.anytype.domain.dataview.interactor.CreateDataViewObject
|
||||
import com.anytypeio.anytype.domain.dataview.interactor.UpdateDataViewViewer
|
||||
import com.anytypeio.anytype.domain.error.Error
|
||||
import com.anytypeio.anytype.domain.event.interactor.InterceptEvents
|
||||
import com.anytypeio.anytype.domain.misc.UrlBuilder
|
||||
|
@ -87,7 +86,6 @@ class ObjectSetViewModel(
|
|||
private val reducer: ObjectSetReducer,
|
||||
private val openObjectSet: OpenObjectSet,
|
||||
private val closeBlock: CloseBlock,
|
||||
private val updateDataViewViewer: UpdateDataViewViewer,
|
||||
private val setObjectDetails: UpdateDetail,
|
||||
private val downloadUnsplashImage: DownloadUnsplashImage,
|
||||
private val setDocCoverImage: SetDocCoverImage,
|
||||
|
|
|
@ -9,7 +9,6 @@ import com.anytypeio.anytype.domain.block.interactor.UpdateText
|
|||
import com.anytypeio.anytype.domain.cover.SetDocCoverImage
|
||||
import com.anytypeio.anytype.domain.dataview.SetDataViewQuery
|
||||
import com.anytypeio.anytype.domain.dataview.interactor.CreateDataViewObject
|
||||
import com.anytypeio.anytype.domain.dataview.interactor.UpdateDataViewViewer
|
||||
import com.anytypeio.anytype.domain.event.interactor.InterceptEvents
|
||||
import com.anytypeio.anytype.domain.misc.UrlBuilder
|
||||
import com.anytypeio.anytype.domain.objects.StoreOfRelations
|
||||
|
@ -29,7 +28,6 @@ class ObjectSetViewModelFactory(
|
|||
private val reducer: ObjectSetReducer,
|
||||
private val openObjectSet: OpenObjectSet,
|
||||
private val closeBlock: CloseBlock,
|
||||
private val updateDataViewViewer: UpdateDataViewViewer,
|
||||
private val setObjectDetails: UpdateDetail,
|
||||
private val createDataViewObject: CreateDataViewObject,
|
||||
private val downloadUnsplashImage: DownloadUnsplashImage,
|
||||
|
@ -57,7 +55,6 @@ class ObjectSetViewModelFactory(
|
|||
reducer = reducer,
|
||||
openObjectSet = openObjectSet,
|
||||
closeBlock = closeBlock,
|
||||
updateDataViewViewer = updateDataViewViewer,
|
||||
setObjectDetails = setObjectDetails,
|
||||
createDataViewObject = createDataViewObject,
|
||||
setDocCoverImage = setDocCoverImage,
|
||||
|
|
|
@ -70,8 +70,7 @@ sealed class Viewer {
|
|||
override val name: String,
|
||||
override val icon: ObjectIcon,
|
||||
override val relations: List<DefaultObjectRelationValueView>,
|
||||
override val hideIcon: Boolean,
|
||||
val bigIcon: Boolean
|
||||
override val hideIcon: Boolean
|
||||
) : Item()
|
||||
data class Cover(
|
||||
override val objectId: Id,
|
||||
|
@ -80,8 +79,7 @@ sealed class Viewer {
|
|||
override val relations: List<DefaultObjectRelationValueView>,
|
||||
override val hideIcon: Boolean,
|
||||
val fitImage: Boolean,
|
||||
val cover: CoverView,
|
||||
val isCoverLarge: Boolean = false
|
||||
val cover: CoverView? = null
|
||||
) : Item()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -71,7 +71,6 @@ class ObjectSetAddOrUpdateViewerTest : ObjectSetViewModelTestSetup() {
|
|||
stubInterceptEvents()
|
||||
stubInterceptThreadStatus()
|
||||
stubSubscriptionEventChannel()
|
||||
stubUpdateDataViewViewer()
|
||||
stubOpenObjectSet(
|
||||
doc = listOf(
|
||||
header,
|
||||
|
@ -171,7 +170,6 @@ class ObjectSetAddOrUpdateViewerTest : ObjectSetViewModelTestSetup() {
|
|||
|
||||
stubInterceptEvents()
|
||||
stubInterceptThreadStatus()
|
||||
stubUpdateDataViewViewer()
|
||||
stubSubscriptionEventChannel()
|
||||
stubOpenObjectSet(
|
||||
doc = listOf(
|
||||
|
|
|
@ -54,7 +54,6 @@ class ObjectSetRestrictionsTest : ObjectSetViewModelTestSetup() {
|
|||
),
|
||||
dataViewRestrictions = dvRestrictions
|
||||
)
|
||||
stubUpdateDataViewViewer()
|
||||
|
||||
val vm = givenViewModel()
|
||||
|
||||
|
@ -94,8 +93,6 @@ class ObjectSetRestrictionsTest : ObjectSetViewModelTestSetup() {
|
|||
stubSubscriptionEventChannel()
|
||||
stubSearchWithSubscription()
|
||||
|
||||
stubUpdateDataViewViewer()
|
||||
|
||||
val vm = givenViewModel()
|
||||
|
||||
// TESTING
|
||||
|
@ -133,7 +130,6 @@ class ObjectSetRestrictionsTest : ObjectSetViewModelTestSetup() {
|
|||
stubInterceptThreadStatus()
|
||||
stubSubscriptionEventChannel()
|
||||
stubSearchWithSubscription()
|
||||
stubUpdateDataViewViewer()
|
||||
|
||||
val vm = givenViewModel()
|
||||
|
||||
|
@ -172,7 +168,6 @@ class ObjectSetRestrictionsTest : ObjectSetViewModelTestSetup() {
|
|||
stubInterceptThreadStatus()
|
||||
stubSubscriptionEventChannel()
|
||||
stubSearchWithSubscription()
|
||||
stubUpdateDataViewViewer()
|
||||
|
||||
val vm = givenViewModel()
|
||||
|
||||
|
@ -211,7 +206,6 @@ class ObjectSetRestrictionsTest : ObjectSetViewModelTestSetup() {
|
|||
stubInterceptThreadStatus()
|
||||
stubSubscriptionEventChannel()
|
||||
stubSearchWithSubscription()
|
||||
stubUpdateDataViewViewer()
|
||||
|
||||
val vm = givenViewModel()
|
||||
|
||||
|
|
|
@ -28,7 +28,6 @@ import com.anytypeio.anytype.domain.config.Gateway
|
|||
import com.anytypeio.anytype.domain.cover.SetDocCoverImage
|
||||
import com.anytypeio.anytype.domain.dataview.SetDataViewQuery
|
||||
import com.anytypeio.anytype.domain.dataview.interactor.CreateDataViewObject
|
||||
import com.anytypeio.anytype.domain.dataview.interactor.UpdateDataViewViewer
|
||||
import com.anytypeio.anytype.domain.event.interactor.InterceptEvents
|
||||
import com.anytypeio.anytype.domain.misc.UrlBuilder
|
||||
import com.anytypeio.anytype.domain.objects.DefaultObjectStore
|
||||
|
@ -80,9 +79,6 @@ open class ObjectSetViewModelTestSetup {
|
|||
@Mock
|
||||
lateinit var closeBlock: CloseBlock
|
||||
|
||||
@Mock
|
||||
lateinit var updateDataViewViewer: UpdateDataViewViewer
|
||||
|
||||
@Mock
|
||||
lateinit var updateText: UpdateText
|
||||
|
||||
|
@ -161,7 +157,6 @@ open class ObjectSetViewModelTestSetup {
|
|||
fun givenViewModel(): ObjectSetViewModel = ObjectSetViewModel(
|
||||
openObjectSet = openObjectSet,
|
||||
closeBlock = closeBlock,
|
||||
updateDataViewViewer = updateDataViewViewer,
|
||||
updateText = updateText,
|
||||
interceptEvents = interceptEvents,
|
||||
interceptThreadStatus = interceptThreadStatus,
|
||||
|
@ -235,19 +230,6 @@ open class ObjectSetViewModelTestSetup {
|
|||
}
|
||||
}
|
||||
|
||||
fun stubUpdateDataViewViewer(
|
||||
events: List<Event> = emptyList()
|
||||
) {
|
||||
updateDataViewViewer.stub {
|
||||
onBlocking { invoke(any()) } doReturn Either.Right(
|
||||
Payload(
|
||||
context = root,
|
||||
events = events
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fun stubCloseBlock() {
|
||||
closeBlock.stub {
|
||||
onBlocking { execute(any()) } doReturn Resultat.success(Unit)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue