Skip to content

Commit 0b3a0e8

Browse files
[Feature] filter by priority #1642
1 parent 6aaec00 commit 0b3a0e8

File tree

8 files changed

+79
-2
lines changed

8 files changed

+79
-2
lines changed

app/src/main/java/at/techbee/jtx/database/locals/StoredListSetting.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ data class StoredListSettingData(
6464
var searchResourcesAnyAllNone: AnyAllNone = AnyAllNone.ANY,
6565
var searchStatus: List<Status> = emptyList(),
6666
var searchClassification: List<Classification> = emptyList(),
67+
var searchPriority: List<Int?> = emptyList(),
6768
var searchCollection: List<String> = emptyList(),
6869
var searchAccount: List<String> = emptyList(),
6970
var orderBy: OrderBy = OrderBy.CREATED,
@@ -115,6 +116,7 @@ data class StoredListSettingData(
115116
searchResourcesAnyAllNone = listSettings.searchResourcesAnyAllNone.value,
116117
searchStatus = listSettings.searchStatus,
117118
searchClassification = listSettings.searchClassification,
119+
searchPriority = listSettings.searchPriority,
118120
searchCollection = listSettings.searchCollection,
119121
searchAccount = listSettings.searchAccount,
120122
orderBy = listSettings.orderBy.value,
@@ -161,6 +163,7 @@ data class StoredListSettingData(
161163
listSettings.searchResourcesAnyAllNone.value = searchResourcesAnyAllNone
162164
listSettings.searchStatus.addAll(searchStatus)
163165
listSettings.searchClassification.addAll(searchClassification)
166+
listSettings.searchPriority.addAll(searchPriority)
164167
listSettings.searchCollection.addAll(searchCollection)
165168
listSettings.searchAccount.addAll(searchAccount)
166169
listSettings.orderBy.value = orderBy

app/src/main/java/at/techbee/jtx/database/views/ICal4List.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,7 @@ data class ICal4List(
319319
searchStatus: List<Status> = emptyList(),
320320
searchXStatus: List<String> = emptyList(),
321321
searchClassification: List<Classification> = emptyList(),
322+
searchPriority: List<Int?> = emptyList(),
322323
searchCollection: List<String> = emptyList(),
323324
searchAccount: List<String> = emptyList(),
324325
orderBy: OrderBy = OrderBy.CREATED,
@@ -516,6 +517,17 @@ data class ICal4List(
516517
queryString += ") "
517518
}
518519

520+
//PRIORITY
521+
if (searchPriority.isNotEmpty()) {
522+
queryString += "AND ("
523+
queryString += searchPriority.joinToString(separator = "OR ", transform = { "$COLUMN_PRIORITY = ? " })
524+
args.addAll(searchPriority.map { it?.toString() ?: "0"})
525+
526+
if(searchPriority.contains(null) || searchPriority.contains(0))
527+
queryString += "OR $COLUMN_PRIORITY IS NULL"
528+
queryString += ") "
529+
}
530+
519531
//Hide biometric protected
520532
hideBiometricProtected.forEach {
521533
if(it == Classification.NO_CLASSIFICATION) {

app/src/main/java/at/techbee/jtx/ui/list/ListActiveFiltersRow.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import androidx.compose.foundation.layout.size
2121
import androidx.compose.material.icons.Icons
2222
import androidx.compose.material.icons.automirrored.outlined.Label
2323
import androidx.compose.material.icons.outlined.AccountBalance
24+
import androidx.compose.material.icons.outlined.AssignmentLate
2425
import androidx.compose.material.icons.outlined.FolderOpen
2526
import androidx.compose.material.icons.outlined.PrivacyTip
2627
import androidx.compose.material.icons.outlined.PublishedWithChanges
@@ -29,6 +30,7 @@ import androidx.compose.material3.MaterialTheme
2930
import androidx.compose.material3.Text
3031
import androidx.compose.runtime.Composable
3132
import androidx.compose.ui.Modifier
33+
import androidx.compose.ui.res.stringArrayResource
3234
import androidx.compose.ui.res.stringResource
3335
import androidx.compose.ui.tooling.preview.Preview
3436
import androidx.compose.ui.unit.dp
@@ -157,6 +159,17 @@ fun ListActiveFiltersRow(
157159
isAccessibilityMode = isAccessibilityMode
158160
)
159161
}
162+
listSettings.searchPriority.forEach { priorityInt ->
163+
if(priorityInt in 0..9) {
164+
ListBadge(
165+
icon = Icons.Outlined.AssignmentLate,
166+
iconDesc = stringResource(R.string.priority),
167+
text = stringArrayResource(id = R.array.priority)[priorityInt?:0],
168+
modifier = Modifier.padding(vertical = 2.dp),
169+
isAccessibilityMode = isAccessibilityMode
170+
)
171+
}
172+
}
160173
AnimatedVisibility(listSettings.isExcludeDone.value) {
161174
ListBadge(
162175
text = stringResource(R.string.list_hide_completed_tasks),

app/src/main/java/at/techbee/jtx/ui/list/ListOptionsFilter.kt

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import androidx.compose.foundation.layout.Row
1616
import androidx.compose.material.icons.Icons
1717
import androidx.compose.material.icons.automirrored.outlined.Label
1818
import androidx.compose.material.icons.outlined.AccountBalance
19+
import androidx.compose.material.icons.outlined.AssignmentLate
1920
import androidx.compose.material.icons.outlined.CalendarMonth
2021
import androidx.compose.material.icons.outlined.Close
2122
import androidx.compose.material.icons.outlined.DashboardCustomize
@@ -44,6 +45,7 @@ import androidx.compose.runtime.setValue
4445
import androidx.compose.ui.Alignment
4546
import androidx.compose.ui.Modifier
4647
import androidx.compose.ui.platform.LocalContext
48+
import androidx.compose.ui.res.stringArrayResource
4749
import androidx.compose.ui.res.stringResource
4850
import androidx.compose.ui.tooling.preview.Preview
4951
import at.techbee.jtx.R
@@ -877,6 +879,43 @@ fun ListOptionsFilter(
877879
}
878880

879881

882+
////// Priority
883+
val priorities = stringArrayResource(id = R.array.priority)
884+
if(module == Module.TODO) {
885+
FilterSection(
886+
icon = Icons.Outlined.AssignmentLate,
887+
headline = stringResource(id = R.string.priority),
888+
onResetSelection = {
889+
listSettings.searchPriority.clear()
890+
onListSettingsChanged()
891+
},
892+
onInvertSelection = {
893+
priorities.forEachIndexed { index, _ ->
894+
if (listSettings.searchPriority.contains(index))
895+
listSettings.searchPriority.remove(index)
896+
else
897+
listSettings.searchPriority.add(index)
898+
}
899+
onListSettingsChanged()
900+
})
901+
{
902+
priorities.forEachIndexed { index, prio ->
903+
FilterChip(
904+
selected = listSettings.searchPriority.contains(index),
905+
onClick = {
906+
if (listSettings.searchPriority.contains(index))
907+
listSettings.searchPriority.remove(index)
908+
else
909+
listSettings.searchPriority.add(index)
910+
onListSettingsChanged()
911+
},
912+
label = { Text(prio) }
913+
)
914+
}
915+
}
916+
}
917+
918+
880919
////// RESOURCES
881920
if (module == Module.TODO) {
882921
FilterSection(

app/src/main/java/at/techbee/jtx/ui/list/ListSettings.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class ListSettings {
3636
var searchStatus = mutableStateListOf<Status>()
3737
var searchXStatus = mutableStateListOf<String>()
3838
var searchClassification = mutableStateListOf<Classification>()
39+
var searchPriority = mutableStateListOf<Int?>()
3940
var searchCollection = mutableStateListOf<String>()
4041
var searchAccount = mutableStateListOf<String>()
4142
var orderBy: MutableState<OrderBy> = mutableStateOf(OrderBy.DRAG_AND_DROP)
@@ -107,6 +108,7 @@ class ListSettings {
107108
private const val PREFS_RESOURCES = "prefsResources"
108109
private const val PREFS_RESOURCES_ANYALLNONE = "prefsResourcesAnyAllNone"
109110
private const val PREFS_CLASSIFICATION = "prefsClassification"
111+
private const val PREFS_PRIORITY = "prefsPriority"
110112
private const val PREFS_STATUS = "prefsStatus"
111113
private const val PREFS_EXTENDED_STATUS = "prefsXStatus"
112114
private const val PREFS_EXCLUDE_DONE = "prefsExcludeDone"
@@ -208,6 +210,7 @@ class ListSettings {
208210
searchStatus.addAll(Status.getListFromStringList(prefs.getStringSet(PREFS_STATUS, null)))
209211
searchXStatus.addAll(prefs.getStringSet(PREFS_EXTENDED_STATUS, emptySet())?.toList() ?: emptyList())
210212
searchClassification.addAll(Classification.getListFromStringList(prefs.getStringSet(PREFS_CLASSIFICATION, null)))
213+
searchPriority.addAll(prefs.getStringSet(PREFS_PRIORITY, null)?.map { it.toIntOrNull() } ?: emptyList())
211214
searchCollection.addAll(prefs.getStringSet(PREFS_COLLECTION, emptySet())?.toList() ?: emptyList())
212215
searchAccount.addAll(prefs.getStringSet(PREFS_ACCOUNT, emptySet())?.toList() ?: emptyList())
213216

@@ -277,6 +280,7 @@ class ListSettings {
277280
searchStatus.addAll(listWidgetConfig.searchStatus)
278281
searchXStatus.addAll(listWidgetConfig.searchXStatus)
279282
searchClassification.addAll(listWidgetConfig.searchClassification)
283+
searchPriority.addAll(listWidgetConfig.searchPriority)
280284
searchCollection.addAll(listWidgetConfig.searchCollection)
281285
searchAccount.addAll(listWidgetConfig.searchAccount)
282286

@@ -367,6 +371,7 @@ class ListSettings {
367371
putStringSet(PREFS_STATUS, Status.getStringSetFromList(searchStatus))
368372
putStringSet(PREFS_EXTENDED_STATUS, searchXStatus.toSet())
369373
putStringSet(PREFS_CLASSIFICATION, Classification.getStringSetFromList(searchClassification))
374+
putStringSet(PREFS_PRIORITY, searchPriority.map { it.toString() }.toSet())
370375
putStringSet(PREFS_COLLECTION, searchCollection.toSet())
371376
putStringSet(PREFS_ACCOUNT, searchAccount.toSet())
372377

@@ -397,6 +402,7 @@ class ListSettings {
397402
searchStatus.clear()
398403
searchXStatus.clear()
399404
searchClassification.clear()
405+
searchPriority.clear()
400406
searchCollection.clear()
401407
searchAccount.clear()
402408
isExcludeDone.value = false
@@ -435,6 +441,7 @@ class ListSettings {
435441
|| searchStatus.isNotEmpty()
436442
|| searchXStatus.isNotEmpty()
437443
|| searchClassification.isNotEmpty()
444+
|| searchPriority.isNotEmpty()
438445
|| searchCollection.isNotEmpty()
439446
|| searchAccount.isNotEmpty()
440447
|| isExcludeDone.value

app/src/main/java/at/techbee/jtx/ui/list/ListViewModel.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ open class ListViewModel(application: Application, val module: Module) : Android
149149
searchStatus = listSettings.searchStatus,
150150
searchXStatus = listSettings.searchXStatus,
151151
searchClassification = listSettings.searchClassification,
152+
searchPriority = listSettings.searchPriority,
152153
searchCollection = listSettings.searchCollection,
153154
searchAccount = listSettings.searchAccount,
154155
orderBy = listSettings.orderBy.value,

app/src/main/java/at/techbee/jtx/widgets/ListWidget.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ class ListWidget : GlanceAppWidget() {
7878
searchResources = listWidgetConfig.searchResources,
7979
searchStatus = listWidgetConfig.searchStatus,
8080
searchClassification = listWidgetConfig.searchClassification,
81+
searchPriority = listWidgetConfig.searchPriority,
8182
searchCollection = listWidgetConfig.searchCollection,
8283
searchAccount = listWidgetConfig.searchAccount,
8384
orderBy = listWidgetConfig.orderBy,

app/src/main/java/at/techbee/jtx/widgets/ListWidgetConfigContent.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
package at.techbee.jtx.widgets
1010

1111
import android.widget.Toast
12-
import androidx.compose.foundation.ExperimentalFoundationApi
1312
import androidx.compose.foundation.layout.Arrangement
1413
import androidx.compose.foundation.layout.Column
1514
import androidx.compose.foundation.layout.fillMaxWidth
@@ -64,7 +63,7 @@ import at.techbee.jtx.ui.list.ViewMode
6463
import kotlinx.coroutines.launch
6564

6665

67-
@OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class)
66+
@OptIn(ExperimentalMaterial3Api::class)
6867
@Composable
6968
fun ListWidgetConfigContent(
7069
initialConfig: ListWidgetConfig,
@@ -233,6 +232,7 @@ fun ListWidgetConfigContent(
233232
searchStatus = listSettings.searchStatus
234233
searchXStatus = listSettings.searchXStatus
235234
searchClassification = listSettings.searchClassification
235+
searchPriority = listSettings.searchPriority
236236
searchCollection = listSettings.searchCollection
237237
searchAccount = listSettings.searchAccount
238238
orderBy = listSettings.orderBy.value
@@ -332,6 +332,7 @@ data class ListWidgetConfig(
332332
var searchStatus: List<Status> = emptyList(),
333333
var searchXStatus: List<String> = emptyList(),
334334
var searchClassification: List<Classification> = emptyList(),
335+
var searchPriority: List<Int?> = emptyList(),
335336
var searchCollection: List<String> = emptyList(),
336337
var searchAccount: List<String> = emptyList(),
337338
var orderBy: OrderBy = OrderBy.CREATED,

0 commit comments

Comments
 (0)