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:
parent
cebdc3605d
commit
dde6cd905f
4 changed files with 95 additions and 51 deletions
|
@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue