1
0
Fork 0
mirror of https://github.com/anyproto/anytype-kotlin.git synced 2025-06-08 13:57:10 +09:00

DROID-2121 Relations | Fix | Tag value rendering fixes (#947)

This commit is contained in:
Konstantin Ivanov 2024-02-29 13:05:54 +01:00 committed by konstantiniiv
parent cebdc3605d
commit dde6cd905f
4 changed files with 95 additions and 51 deletions

View file

@ -30,7 +30,8 @@ import com.anytypeio.anytype.presentation.relations.value.tagstatus.TagStatusAct
fun StatusItem(
state: RelationsListItem.Item.Status,
action: (TagStatusAction) -> Unit,
isEditable: Boolean
isEditable: Boolean,
showDivider: Boolean = true
) {
val haptics = LocalHapticFeedback.current
val isMenuExpanded = remember { mutableStateOf(false) }
@ -60,20 +61,23 @@ fun StatusItem(
.size(24.dp)
.align(Alignment.CenterEnd)
)
Divider(modifier = Modifier.align(Alignment.BottomCenter))
ItemMenu(
action = {
when (it) {
ItemMenuAction.Delete -> action(TagStatusAction.Delete(state.optionId))
ItemMenuAction.Duplicate -> action(TagStatusAction.Duplicate(state))
ItemMenuAction.Edit -> action(TagStatusAction.Edit(state))
ItemMenuAction.Open -> {}
}
},
isMenuExpanded = isMenuExpanded,
showEdit = true,
showDuplicate = true
)
if (showDivider) Divider(modifier = Modifier.align(Alignment.BottomCenter))
if (isEditable) {
ItemMenu(
action = {
when (it) {
ItemMenuAction.Delete -> action(TagStatusAction.Delete(state.optionId))
ItemMenuAction.Duplicate -> action(TagStatusAction.Duplicate(state))
ItemMenuAction.Edit -> action(TagStatusAction.Edit(state))
ItemMenuAction.Open -> {}
}
},
isMenuExpanded = isMenuExpanded,
showEdit = true,
showDuplicate = true,
showDelete = true
)
}
}
}

View file

@ -33,7 +33,8 @@ import com.anytypeio.anytype.presentation.relations.value.tagstatus.TagStatusAct
fun TagItem(
state: RelationsListItem.Item.Tag,
action: (TagStatusAction) -> Unit,
isEditable: Boolean
isEditable: Boolean,
showDivider: Boolean = true
) {
val haptics = LocalHapticFeedback.current
val isMenuExpanded = remember { mutableStateOf(false) }
@ -57,27 +58,32 @@ fun TagItem(
) {
TagItemText(state = state)
}
CircleIcon(
number = if (state.isSelected) state.number.toString() else null,
isSelected = state.isSelected,
modifier = Modifier
.size(24.dp)
.align(Alignment.CenterEnd)
)
Divider(modifier = Modifier.align(Alignment.BottomCenter))
ItemMenu(
action = {
when (it) {
ItemMenuAction.Delete -> action(TagStatusAction.Delete(state.optionId))
ItemMenuAction.Duplicate -> action(TagStatusAction.Duplicate(state))
ItemMenuAction.Edit -> action(TagStatusAction.Edit(state))
ItemMenuAction.Open -> {}
}
},
isMenuExpanded = isMenuExpanded,
showEdit = true,
showDuplicate = true
)
if (isEditable) {
CircleIcon(
number = if (state.isSelected) state.number.toString() else null,
isSelected = state.isSelected,
modifier = Modifier
.size(24.dp)
.align(Alignment.CenterEnd)
)
}
if (showDivider) Divider(modifier = Modifier.align(Alignment.BottomCenter))
if (isEditable) {
ItemMenu(
action = {
when (it) {
ItemMenuAction.Delete -> action(TagStatusAction.Delete(state.optionId))
ItemMenuAction.Duplicate -> action(TagStatusAction.Duplicate(state))
ItemMenuAction.Edit -> action(TagStatusAction.Edit(state))
ItemMenuAction.Open -> {}
}
},
isMenuExpanded = isMenuExpanded,
showEdit = true,
showDuplicate = true,
showDelete = true
)
}
}
}

View file

@ -16,7 +16,9 @@ import androidx.compose.foundation.layout.wrapContentWidth
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
@ -123,6 +125,7 @@ private fun Header(state: TagStatusViewState, action: (TagStatusAction) -> Unit)
modifier = Modifier
.fillMaxWidth()
.height(48.dp)
.verticalScroll(rememberScrollState())
) {
if (isClearButtonVisible(state = state)) {
// Left-aligned CLEAR button
@ -199,15 +202,26 @@ fun RelationsViewContent(
LazyColumn(
state = lazyListState,
modifier = Modifier
.fillMaxWidth()
.wrapContentHeight()
.fillMaxSize()
) {
itemsIndexed(
items = state.items,
itemContent = { _, item ->
itemContent = { index, item ->
val isLastItem = index == state.items.size - 1
when (item) {
is RelationsListItem.Item.Tag -> TagItem(item, action, state.isRelationEditable)
is RelationsListItem.Item.Status -> StatusItem(item, action, state.isRelationEditable)
is RelationsListItem.Item.Tag -> TagItem(
state = item,
action = action,
isEditable = state.isRelationEditable,
showDivider = !isLastItem
)
is RelationsListItem.Item.Status -> StatusItem(
state = item,
action = action,
isEditable = state.isRelationEditable,
showDivider = !isLastItem
)
is RelationsListItem.CreateItem.Status -> ItemTagOrStatusCreate(item, action)
is RelationsListItem.CreateItem.Tag -> ItemTagOrStatusCreate(item, action)
}
@ -225,7 +239,11 @@ fun RelationsViewEmpty(
icon = R.drawable.ic_alert_error
)
if (state.isRelationEditable) {
Column {
Column(
modifier = Modifier
.fillMaxSize()
.verticalScroll(rememberScrollState())
) {
Spacer(modifier = Modifier.height(154.dp))
AlertIcon(icon)
Spacer(modifier = Modifier.height(12.dp))
@ -246,7 +264,11 @@ fun RelationsViewEmpty(
)
}
} else {
Column {
Column(
modifier = Modifier
.fillMaxSize()
.verticalScroll(rememberScrollState())
) {
Spacer(modifier = Modifier.height(87.dp))
AlertIcon(icon)
Spacer(modifier = Modifier.height(12.dp))

View file

@ -22,7 +22,6 @@ import com.anytypeio.anytype.presentation.relations.providers.ObjectValueProvide
import com.anytypeio.anytype.presentation.search.ObjectSearchConstants
import com.anytypeio.anytype.presentation.sets.filterIdsById
import com.anytypeio.anytype.presentation.util.Dispatcher
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow
@ -48,7 +47,6 @@ class TagOrStatusValueViewModel(
private val query = MutableSharedFlow<String>(replay = 0)
private var isEditableRelation = false
val commands = MutableSharedFlow<Command>(replay = 0)
private val jobs = mutableListOf<Job>()
private val initialIds = mutableListOf<Id>()
private var isInitialSortDone = false
@ -56,6 +54,7 @@ class TagOrStatusValueViewModel(
init {
viewModelScope.launch {
val relation = relations.get(relation = viewModelParams.relationKey)
setupIsRelationNotEditable(relation)
val spaces = listOf(spaceManager.get())
val searchParams = StoreSearchParams(
subscription = SUB_MY_OPTIONS,
@ -73,21 +72,20 @@ class TagOrStatusValueViewModel(
query.onStart { emit("") },
subscription.subscribe(searchParams)
) { record, query, options ->
setupIsRelationNotEditable(relation)
val ids = getRecordValues(record)
if (!isInitialSortDone) {
initialIds.clear()
if (ids.isNotEmpty()) {
initialIds.addAll(ids)
} else {
emitCommand(Command.Expand)
if (isEditableRelation) {
emitCommand(Command.Expand)
}
}
}
initViewState(
relation = relation,
options = options
.map { ObjectWrapper.Option(map = it.map) }
.filter { it.name?.contains(query, true) == true },
options = filterOptions(query, options, ids),
query = query,
ids = ids
)
@ -95,6 +93,20 @@ class TagOrStatusValueViewModel(
}
}
private fun filterOptions(
query: String,
options: List<ObjectWrapper.Basic>,
ids: List<Id>
): List<ObjectWrapper.Option> {
return if (isEditableRelation) {
options.map { ObjectWrapper.Option(map = it.map) }
.filter { it.name?.contains(query, true) == true }
} else {
options.map { ObjectWrapper.Option(map = it.map) }
.filter { ids.contains(it.id) }
}
}
fun onQueryChanged(input: String) {
viewModelScope.launch {
query.emit(input)