Fix Saved Search issues
This commit is contained in:
parent
16bbfcd086
commit
5893350f43
@ -20,13 +20,11 @@ import androidx.compose.material3.MaterialTheme
|
|||||||
import androidx.compose.material3.OutlinedTextField
|
import androidx.compose.material3.OutlinedTextField
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.DisposableEffect
|
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.produceState
|
import androidx.compose.runtime.produceState
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.runtime.setValue
|
import androidx.compose.runtime.setValue
|
||||||
import androidx.compose.runtime.toMutableStateList
|
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.platform.LocalFocusManager
|
import androidx.compose.ui.platform.LocalFocusManager
|
||||||
import androidx.compose.ui.text.TextRange
|
import androidx.compose.ui.text.TextRange
|
||||||
@ -50,11 +48,6 @@ fun AutoCompleteItem(
|
|||||||
validPrefixes: List<String>,
|
validPrefixes: List<String>,
|
||||||
onChange: (List<String>) -> Unit,
|
onChange: (List<String>) -> Unit,
|
||||||
) {
|
) {
|
||||||
val newState = remember { state.toMutableStateList() }
|
|
||||||
DisposableEffect(newState) {
|
|
||||||
onChange(newState)
|
|
||||||
onDispose {}
|
|
||||||
}
|
|
||||||
Column(
|
Column(
|
||||||
Modifier.fillMaxWidth()
|
Modifier.fillMaxWidth()
|
||||||
.padding(
|
.padding(
|
||||||
@ -74,12 +67,12 @@ fun AutoCompleteItem(
|
|||||||
tag
|
tag
|
||||||
}
|
}
|
||||||
|
|
||||||
{ it.contains(tagNoPrefix, true) }
|
Pair({ it.contains(tagNoPrefix, true) }, prefix)
|
||||||
},
|
},
|
||||||
onSubmit = { tag ->
|
onSubmit = { tag ->
|
||||||
val tagNoPrefix = validPrefixes.find { tag.startsWith(it) }?.let { tag.removePrefix(it).trim() } ?: tag
|
val tagNoPrefix = validPrefixes.find { tag.startsWith(it) }?.let { tag.removePrefix(it).trim() } ?: tag
|
||||||
if (tagNoPrefix !in skipAutoFillTags) {
|
if (tagNoPrefix !in skipAutoFillTags) {
|
||||||
newState += tag
|
onChange(state + tag)
|
||||||
true
|
true
|
||||||
} else {
|
} else {
|
||||||
false
|
false
|
||||||
@ -90,11 +83,11 @@ fun AutoCompleteItem(
|
|||||||
modifier = Modifier.padding(end = 8.dp),
|
modifier = Modifier.padding(end = 8.dp),
|
||||||
horizontalArrangement = Arrangement.spacedBy(4.dp),
|
horizontalArrangement = Arrangement.spacedBy(4.dp),
|
||||||
) {
|
) {
|
||||||
newState.forEach {
|
state.forEach {
|
||||||
InputChip(
|
InputChip(
|
||||||
selected = false,
|
selected = false,
|
||||||
onClick = {
|
onClick = {
|
||||||
newState -= it
|
onChange(state - it)
|
||||||
},
|
},
|
||||||
label = {
|
label = {
|
||||||
Text(
|
Text(
|
||||||
@ -122,7 +115,7 @@ fun AutoCompleteTextField(
|
|||||||
label: String? = null,
|
label: String? = null,
|
||||||
placeholder: String? = null,
|
placeholder: String? = null,
|
||||||
values: List<String>,
|
values: List<String>,
|
||||||
onValueFilter: ((String) -> ((String) -> Boolean)),
|
onValueFilter: ((String) -> (Pair<(String) -> Boolean, String?>)),
|
||||||
onSubmit: (String) -> Boolean,
|
onSubmit: (String) -> Boolean,
|
||||||
) {
|
) {
|
||||||
var expanded by remember { mutableStateOf(false) }
|
var expanded by remember { mutableStateOf(false) }
|
||||||
@ -173,8 +166,20 @@ fun AutoCompleteTextField(
|
|||||||
|
|
||||||
val filteredValues by produceState(emptyList(), value) {
|
val filteredValues by produceState(emptyList(), value) {
|
||||||
withContext(Dispatchers.Default) {
|
withContext(Dispatchers.Default) {
|
||||||
val filter = onValueFilter(value.text)
|
val (filter, prefix) = onValueFilter(value.text)
|
||||||
this@produceState.value = values.asSequence().filter(filter).take(100).toList()
|
this@produceState.value = values.asSequence()
|
||||||
|
.filter(filter)
|
||||||
|
.take(100)
|
||||||
|
.let {
|
||||||
|
if (prefix != null) {
|
||||||
|
it.map { tag ->
|
||||||
|
prefix + tag
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
it
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.toList()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (value.text.length > 2 && filteredValues.isNotEmpty()) {
|
if (value.text.length > 2 && filteredValues.isNotEmpty()) {
|
||||||
|
@ -537,14 +537,17 @@ open class BrowseSourceScreenModel(
|
|||||||
val allDefault = search.filterList != null && search.filterList == source.getFilterList()
|
val allDefault = search.filterList != null && search.filterList == source.getFilterList()
|
||||||
setDialog(null)
|
setDialog(null)
|
||||||
|
|
||||||
|
val filters = search.filterList
|
||||||
|
?.takeUnless { allDefault }
|
||||||
|
?: source.getFilterList()
|
||||||
|
|
||||||
mutableState.update {
|
mutableState.update {
|
||||||
it.copy(
|
it.copy(
|
||||||
listing = Listing.Search(
|
listing = Listing.Search(
|
||||||
query = search.query,
|
query = search.query,
|
||||||
filters = search.filterList
|
filters = filters,
|
||||||
?.takeUnless { allDefault }
|
|
||||||
?: source.getFilterList(),
|
|
||||||
),
|
),
|
||||||
|
filters = filters,
|
||||||
toolbarQuery = search.query,
|
toolbarQuery = search.query,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user