diff --git a/app/src/main/java/cz/cvut/fel/tasktest/data/viewModels/TaskViewModel.kt b/app/src/main/java/cz/cvut/fel/tasktest/data/viewModels/TaskViewModel.kt index 6ec7c1f2e129323922a06fa79be3a23742b0cb29..47a3fccd4929846d9db2a3690d311cf08dc99f15 100644 --- a/app/src/main/java/cz/cvut/fel/tasktest/data/viewModels/TaskViewModel.kt +++ b/app/src/main/java/cz/cvut/fel/tasktest/data/viewModels/TaskViewModel.kt @@ -49,10 +49,15 @@ class TaskViewModel( + private val _tagsForTaskMap = MutableStateFlow<Map<Long, List<Tag>>>(emptyMap()) + val tagsForTaskMap: StateFlow<Map<Long, List<Tag>>> get() = _tagsForTaskMap + fun fetchTagsForTask(taskId: Long) { viewModelScope.launch(Dispatchers.IO) { val tags = taskDAO.getTagsForTask(taskId) - _tagsForTask.value = tags + _tagsForTaskMap.update { currentMap -> + currentMap + (taskId to tags) + } } } diff --git a/app/src/main/java/cz/cvut/fel/tasktest/screens/CurrentBoardScreen.kt b/app/src/main/java/cz/cvut/fel/tasktest/screens/CurrentBoardScreen.kt index eea356f99eb2d6081003136b861945801bc1fdc9..efdc669b3c2a7134ebf366aeb172656884ac4aaf 100644 --- a/app/src/main/java/cz/cvut/fel/tasktest/screens/CurrentBoardScreen.kt +++ b/app/src/main/java/cz/cvut/fel/tasktest/screens/CurrentBoardScreen.kt @@ -134,7 +134,7 @@ fun CurrentBoardScreen(navController: NavHostController, drawerState: DrawerStat .border(3.dp, Color.Black, ShapeDefaults.Large) .shadow(2.dp) .width(270.dp) - .height(120.dp) + .height(150.dp) .align(Alignment.CenterHorizontally) ) { TaskCard(task, navController, taskViewModel, task.id) @@ -203,41 +203,43 @@ fun FloatingButton(navController: NavHostController, boardId: Long) { @Composable fun TaskCard(task: Task, navController: NavHostController, taskViewModel: TaskViewModel, taskId: Long) { + // Fetch tags for the specific task when the TaskCard is composed LaunchedEffect(taskId) { taskViewModel.fetchTagsForTask(taskId) } - // Observe tags for the task - val tagsForTask by taskViewModel.tagsForTask.collectAsState() + // Observe tags for the task from the map in TaskViewModel + val tagsForTask by taskViewModel.tagsForTaskMap.collectAsState() + val tags = tagsForTask[taskId] ?: emptyList() + Column { Row(modifier = Modifier.padding(start = 16.dp, top = 8.dp)) { - tagsForTask.forEach { tag -> + tags.forEach { tag -> Text( tag.name, modifier = Modifier .padding(end = 8.dp) // Add padding between tags .background(Color(android.graphics.Color.parseColor(tag.background))) ) - // You can customize the UI to display tags as you prefer } } - Row(modifier = Modifier.padding(top = 40.dp)) { - Text(text = task.title, modifier = Modifier - .weight(1f) - .padding(start = 8.dp), - fontSize = MaterialTheme.typography.headlineMedium.fontSize) + Row(modifier = Modifier.padding(top = 20.dp)) { + Text( + text = task.title, + modifier = Modifier + .weight(1f) + .padding(start = 8.dp), + fontSize = MaterialTheme.typography.headlineMedium.fontSize + ) IconButton(onClick = { navController.navigate("${MainRoute.CurrentTask.name}/${task.id}") }) { - Icon(imageVector = - Icons.Default.Create, + Icon( + imageVector = Icons.Default.Create, contentDescription = "Task Edit", modifier = Modifier .align(Alignment.CenterVertically) .padding(end = 8.dp) ) } - } - - } -} \ No newline at end of file +} diff --git a/app/src/main/java/cz/cvut/fel/tasktest/screens/TagCreationScreen.kt b/app/src/main/java/cz/cvut/fel/tasktest/screens/TagCreationScreen.kt index 6f73b51777e5d90300043bb765a8654c25896d09..db51025efd80dfe93959e1be95ea751769bc6b44 100644 --- a/app/src/main/java/cz/cvut/fel/tasktest/screens/TagCreationScreen.kt +++ b/app/src/main/java/cz/cvut/fel/tasktest/screens/TagCreationScreen.kt @@ -54,6 +54,7 @@ import com.github.skydoves.colorpicker.compose.HsvColorPicker import com.github.skydoves.colorpicker.compose.rememberColorPickerController import cz.cvut.fel.tasktest.CustomAppBar import cz.cvut.fel.tasktest.MainRoute +import cz.cvut.fel.tasktest.data.Tag import cz.cvut.fel.tasktest.data.events.TagEvent import cz.cvut.fel.tasktest.data.viewModels.TagViewModel @@ -64,6 +65,8 @@ fun TagCreationScreen(navController: NavHostController, drawerState: DrawerState val state by viewModel.state.collectAsState() val backgroundColor = remember { mutableStateOf(Color.White) } var showConfirmDialogAboutDeleteBoard by remember { mutableStateOf(false) } + var tagToBeDeleted by remember { mutableStateOf<Tag?>(null) } + if (state.background.isNotBlank()) { try { backgroundColor.value = Color(android.graphics.Color.parseColor(state.background)) @@ -194,7 +197,7 @@ fun TagCreationScreen(navController: NavHostController, drawerState: DrawerState .width(200.dp) .background(Color(android.graphics.Color.parseColor(tag.background))) ) - IconButton(onClick = { showConfirmDialogAboutDeleteBoard = true }, + IconButton(onClick = { showConfirmDialogAboutDeleteBoard = true; tagToBeDeleted = tag }, modifier = Modifier .padding(start = 8.dp) .size(30.dp)){ @@ -202,21 +205,24 @@ fun TagCreationScreen(navController: NavHostController, drawerState: DrawerState contentDescription = "Delete Tag Icon", ) } - } + } - if (showConfirmDialogAboutDeleteBoard){ + if (showConfirmDialogAboutDeleteBoard && tagToBeDeleted != null) { AlertDialog( onDismissRequest = { - // Dismiss the dialog when the user taps outside or on the back button showConfirmDialogAboutDeleteBoard = false + tagToBeDeleted = null }, title = { Text("Confirmation") }, - text = { Text("Are you sure you want to delete this tag?.") }, + text = { Text("Are you sure you want to delete this tag?") }, confirmButton = { Button( onClick = { - showConfirmDialogAboutDeleteBoard = false - viewModel.onEvent(TagEvent.DeleteTag(tag))// Launch image picker after confirmation + tagToBeDeleted?.let { tag -> + showConfirmDialogAboutDeleteBoard = false + viewModel.onEvent(TagEvent.DeleteTag(tag)) + tagToBeDeleted = null + } } ) { Text("Confirm") @@ -224,19 +230,19 @@ fun TagCreationScreen(navController: NavHostController, drawerState: DrawerState }, dismissButton = { Button( - onClick = { showConfirmDialogAboutDeleteBoard = false } + onClick = { + showConfirmDialogAboutDeleteBoard = false + tagToBeDeleted = null + } ) { Text("Cancel") } } ) } - } } - } - } }