浏览代码

Add filter task type

Signed-off-by: alperozturk <alper_ozturk@proton.me>
alperozturk 1 年之前
父节点
当前提交
d39d5257ac

+ 28 - 8
app/src/main/java/com/nextcloud/client/assistant/AssistantViewModel.kt

@@ -45,8 +45,10 @@ class AssistantViewModel(client: NextcloudClient) : ViewModel() {
     private val _taskTypes = MutableStateFlow<RemoteOperationResult<TaskTypes>?>(null)
     val taskTypes: StateFlow<RemoteOperationResult<TaskTypes>?> = _taskTypes
 
-    private val _taskList = MutableStateFlow<RemoteOperationResult<TaskList>?>(null)
-    val taskList: StateFlow<RemoteOperationResult<TaskList>?> = _taskList
+    private var _taskList: RemoteOperationResult<TaskList>? = null
+
+    private val _filteredTaskList = MutableStateFlow<RemoteOperationResult<TaskList>?>(null)
+    val filteredTaskList: StateFlow<RemoteOperationResult<TaskList>?> = _filteredTaskList
 
     private val _loading = MutableStateFlow(true)
     val loading: StateFlow<Boolean> = _loading
@@ -75,8 +77,9 @@ class AssistantViewModel(client: NextcloudClient) : ViewModel() {
         }
     }
 
-    fun selectTask(task: TaskType) {
+    fun selectTaskType(task: TaskType) {
         _selectedTaskType.update {
+            filterTaskList(it?.id)
             task
         }
     }
@@ -84,6 +87,11 @@ class AssistantViewModel(client: NextcloudClient) : ViewModel() {
     private fun getTaskTypes() {
         viewModelScope.launch(Dispatchers.IO) {
             val result = repository.getTaskTypes()
+            val new = ArrayList(result.resultData.types ?: listOf()).apply {
+                add(TaskType(null, "All", null))
+            }
+
+            result.resultData.types = new
 
             _taskTypes.update {
                 result
@@ -97,11 +105,9 @@ class AssistantViewModel(client: NextcloudClient) : ViewModel() {
 
     fun getTaskList(appId: String = "assistant", onCompleted: () -> Unit = {}) {
         viewModelScope.launch(Dispatchers.IO) {
-            val result = repository.getTaskList(appId)
+            _taskList = repository.getTaskList(appId)
 
-            _taskList.update {
-                result
-            }
+            filterTaskList(_selectedTaskType.value?.id)
 
             _loading.update {
                 false
@@ -125,8 +131,22 @@ class AssistantViewModel(client: NextcloudClient) : ViewModel() {
         }
     }
 
+    fun filterTaskList(taskTypeId: String?) {
+        if (taskTypeId == null) {
+            _filteredTaskList.update {
+                _taskList
+            }
+        } else {
+            val result = _taskList?.resultData?.tasks?.filter { it.type == taskTypeId }
+            _filteredTaskList.update {
+                it?.resultData?.tasks = result
+                it
+            }
+        }
+    }
+
     private fun removeTaskFromList(id: Long) {
-        _taskList.update { currentList ->
+        _filteredTaskList.update { currentList ->
             currentList?.resultData?.tasks?.let { tasks ->
                 currentList.resultData.tasks = tasks.filter { it.id != id }
             }

+ 3 - 3
app/src/main/java/com/nextcloud/client/assistant/AsssistantScreen.kt

@@ -68,7 +68,7 @@ fun AssistantScreen(viewModel: AssistantViewModel, floatingActionButton: Floatin
     val activity = LocalContext.current as Activity
     val loading by viewModel.loading.collectAsState()
     val selectedTaskType by viewModel.selectedTaskType.collectAsState()
-    val taskList by viewModel.taskList.collectAsState()
+    val filteredTaskList by viewModel.filteredTaskList.collectAsState()
     val isTaskCreated by viewModel.isTaskCreated.collectAsState()
     val isTaskDeleted by viewModel.isTaskDeleted.collectAsState()
     val taskTypes by viewModel.taskTypes.collectAsState()
@@ -96,7 +96,7 @@ fun AssistantScreen(viewModel: AssistantViewModel, floatingActionButton: Floatin
         if (loading || pullRefreshState.isRefreshing) {
             CenterText(text = stringResource(id = R.string.assistant_screen_loading))
         } else {
-            val tasks = taskList?.resultData?.tasks ?: return
+            val tasks = filteredTaskList?.resultData?.tasks ?: return
             val types = taskTypes?.resultData?.types ?: return
 
             AssistantContent(tasks, types, selectedTaskType, viewModel, showDeleteTaskAlertDialog = { taskId ->
@@ -170,7 +170,7 @@ private fun AssistantContent(
     ) {
         stickyHeader {
             TaskTypesRow(selectedTask, data = taskTypes) { task ->
-                viewModel.selectTask(task)
+                viewModel.selectTaskType(task)
             }
 
             Spacer(modifier = Modifier.height(8.dp))