feat: implement TodoScreen compose UI with AI brain dump functionality and filtered list management

This commit is contained in:
Bruno Charest 2026-04-24 08:35:19 -04:00
parent 888841e510
commit 4d8d6f5172

View File

@ -53,12 +53,14 @@ import androidx.compose.material.icons.filled.Flag
import androidx.compose.material.icons.filled.Folder import androidx.compose.material.icons.filled.Folder
import androidx.compose.material.icons.filled.List import androidx.compose.material.icons.filled.List
import androidx.compose.material.icons.filled.Repeat import androidx.compose.material.icons.filled.Repeat
import androidx.compose.material.icons.filled.RadioButtonChecked
import androidx.compose.material.icons.filled.Schedule import androidx.compose.material.icons.filled.Schedule
import androidx.compose.material.icons.filled.Snooze import androidx.compose.material.icons.filled.Snooze
import androidx.compose.material.icons.outlined.CheckBoxOutlineBlank import androidx.compose.material.icons.outlined.CheckBoxOutlineBlank
import androidx.compose.material.icons.outlined.Keyboard import androidx.compose.material.icons.outlined.Keyboard
import androidx.compose.material.icons.outlined.LocalCafe import androidx.compose.material.icons.outlined.LocalCafe
import androidx.compose.material.icons.outlined.NightsStay import androidx.compose.material.icons.outlined.NightsStay
import androidx.compose.material.icons.outlined.RadioButtonUnchecked
import androidx.compose.material.icons.outlined.WbSunny import androidx.compose.material.icons.outlined.WbSunny
import androidx.compose.material.icons.outlined.WbTwilight import androidx.compose.material.icons.outlined.WbTwilight
import androidx.compose.material3.AlertDialog import androidx.compose.material3.AlertDialog
@ -822,49 +824,58 @@ private fun EditTodoDialog(
androidx.compose.material3.Divider(color = MaterialTheme.colorScheme.surfaceVariant.copy(alpha = 0.5f)) androidx.compose.material3.Divider(color = MaterialTheme.colorScheme.surfaceVariant.copy(alpha = 0.5f))
// Priority // Priority
val priorityText = when(state.priority) { Row(
"RED" -> "Urgent (Rouge)" modifier = Modifier
"YELLOW" -> "Élevée (Jaune)" .fillMaxWidth()
"BLUE" -> "Normale (Bleu)" .padding(horizontal = 16.dp, vertical = 16.dp),
"GREEN" -> "Basse (Vert)" verticalAlignment = Alignment.CenterVertically
else -> "Priorité normale" ) {
} Icon(
val priorityColor = when(state.priority) { Icons.Default.Flag,
"RED" -> androidx.compose.ui.graphics.Color.Red contentDescription = null,
"YELLOW" -> androidx.compose.ui.graphics.Color.Yellow tint = MaterialTheme.colorScheme.onSurfaceVariant
"BLUE" -> androidx.compose.ui.graphics.Color.Blue
"GREEN" -> androidx.compose.ui.graphics.Color.Green
else -> MaterialTheme.colorScheme.onSurfaceVariant
}
androidx.compose.foundation.layout.Box {
TaskActionRow(
icon = Icons.Default.Flag,
iconTint = priorityColor,
textTint = priorityColor,
text = priorityText,
onClick = { showPriorityMenu = true },
isSet = state.priority != null
) )
androidx.compose.material3.DropdownMenu( Spacer(modifier = Modifier.width(16.dp))
expanded = showPriorityMenu, Text(
onDismissRequest = { showPriorityMenu = false } "Priorité",
) { color = MaterialTheme.colorScheme.onSurfaceVariant,
androidx.compose.material3.DropdownMenuItem( style = MaterialTheme.typography.bodyLarge,
text = { Text("Urgent (Rouge)", color = androidx.compose.ui.graphics.Color.Red) }, modifier = Modifier.weight(1f)
onClick = { onPriorityChanged("RED"); showPriorityMenu = false } )
)
androidx.compose.material3.DropdownMenuItem( val priorities = listOf(null, "BLUE", "YELLOW", "RED")
text = { Text("Élevée (Jaune)", color = androidx.compose.ui.graphics.Color.Yellow) }, val priorityColors = listOf(
onClick = { onPriorityChanged("YELLOW"); showPriorityMenu = false } MaterialTheme.colorScheme.onSurfaceVariant,
) androidx.compose.ui.graphics.Color(0xFF64B5F6), // Blue
androidx.compose.material3.DropdownMenuItem( androidx.compose.ui.graphics.Color(0xFFFFD54F), // Yellow
text = { Text("Normale (Bleu)", color = androidx.compose.ui.graphics.Color.Blue) }, androidx.compose.ui.graphics.Color(0xFFE57373) // Red
onClick = { onPriorityChanged("BLUE"); showPriorityMenu = false } )
)
androidx.compose.material3.DropdownMenuItem( priorities.forEachIndexed { index, p ->
text = { Text("Basse (Vert)", color = androidx.compose.ui.graphics.Color.Green) }, val isSelected = state.priority == p
onClick = { onPriorityChanged("GREEN"); showPriorityMenu = false } androidx.compose.foundation.layout.Box(
) modifier = Modifier
.size(32.dp)
.clickable { onPriorityChanged(p) },
contentAlignment = Alignment.Center
) {
if (isSelected) {
Icon(
Icons.Default.RadioButtonChecked,
contentDescription = null,
tint = priorityColors[index]
)
} else {
Icon(
Icons.Outlined.RadioButtonUnchecked,
contentDescription = null,
tint = priorityColors[index]
)
}
}
if (index < priorities.lastIndex) {
Spacer(modifier = Modifier.width(8.dp))
}
} }
} }
@ -1204,17 +1215,24 @@ private fun DateTimePickerBottomSheet(
var selectedDateMillis by remember { mutableStateOf(initialDate) } var selectedDateMillis by remember { mutableStateOf(initialDate) }
val datePickerState = androidx.compose.material3.rememberDatePickerState( val datePickerState = androidx.compose.material3.rememberDatePickerState(
initialSelectedDateMillis = initialDate initialSelectedDateMillis = initialDate?.let {
val localCal = java.util.Calendar.getInstance(tz).apply { timeInMillis = it }
val utcCal = java.util.Calendar.getInstance(java.util.TimeZone.getTimeZone("UTC")).apply {
set(localCal.get(java.util.Calendar.YEAR), localCal.get(java.util.Calendar.MONTH), localCal.get(java.util.Calendar.DAY_OF_MONTH), 0, 0, 0)
set(java.util.Calendar.MILLISECOND, 0)
}
utcCal.timeInMillis
}
) )
LaunchedEffect(datePickerState.selectedDateMillis) { LaunchedEffect(datePickerState.selectedDateMillis) {
if (datePickerState.selectedDateMillis != null) { if (datePickerState.selectedDateMillis != null) {
val newDateCal = java.util.Calendar.getInstance(tz).apply { val utcCal = java.util.Calendar.getInstance(java.util.TimeZone.getTimeZone("UTC")).apply {
timeInMillis = datePickerState.selectedDateMillis!! timeInMillis = datePickerState.selectedDateMillis!!
} }
calendar.set(java.util.Calendar.YEAR, newDateCal.get(java.util.Calendar.YEAR)) calendar.set(java.util.Calendar.YEAR, utcCal.get(java.util.Calendar.YEAR))
calendar.set(java.util.Calendar.MONTH, newDateCal.get(java.util.Calendar.MONTH)) calendar.set(java.util.Calendar.MONTH, utcCal.get(java.util.Calendar.MONTH))
calendar.set(java.util.Calendar.DAY_OF_MONTH, newDateCal.get(java.util.Calendar.DAY_OF_MONTH)) calendar.set(java.util.Calendar.DAY_OF_MONTH, utcCal.get(java.util.Calendar.DAY_OF_MONTH))
selectedDateMillis = calendar.timeInMillis selectedDateMillis = calendar.timeInMillis
} }
} }