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.List
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.Snooze
import androidx.compose.material.icons.outlined.CheckBoxOutlineBlank
import androidx.compose.material.icons.outlined.Keyboard
import androidx.compose.material.icons.outlined.LocalCafe
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.WbTwilight
import androidx.compose.material3.AlertDialog
@ -822,49 +824,58 @@ private fun EditTodoDialog(
androidx.compose.material3.Divider(color = MaterialTheme.colorScheme.surfaceVariant.copy(alpha = 0.5f))
// Priority
val priorityText = when(state.priority) {
"RED" -> "Urgent (Rouge)"
"YELLOW" -> "Élevée (Jaune)"
"BLUE" -> "Normale (Bleu)"
"GREEN" -> "Basse (Vert)"
else -> "Priorité normale"
}
val priorityColor = when(state.priority) {
"RED" -> androidx.compose.ui.graphics.Color.Red
"YELLOW" -> androidx.compose.ui.graphics.Color.Yellow
"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
Row(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 16.dp, vertical = 16.dp),
verticalAlignment = Alignment.CenterVertically
) {
Icon(
Icons.Default.Flag,
contentDescription = null,
tint = MaterialTheme.colorScheme.onSurfaceVariant
)
androidx.compose.material3.DropdownMenu(
expanded = showPriorityMenu,
onDismissRequest = { showPriorityMenu = false }
) {
androidx.compose.material3.DropdownMenuItem(
text = { Text("Urgent (Rouge)", color = androidx.compose.ui.graphics.Color.Red) },
onClick = { onPriorityChanged("RED"); showPriorityMenu = false }
)
androidx.compose.material3.DropdownMenuItem(
text = { Text("Élevée (Jaune)", color = androidx.compose.ui.graphics.Color.Yellow) },
onClick = { onPriorityChanged("YELLOW"); showPriorityMenu = false }
)
androidx.compose.material3.DropdownMenuItem(
text = { Text("Normale (Bleu)", color = androidx.compose.ui.graphics.Color.Blue) },
onClick = { onPriorityChanged("BLUE"); showPriorityMenu = false }
)
androidx.compose.material3.DropdownMenuItem(
text = { Text("Basse (Vert)", color = androidx.compose.ui.graphics.Color.Green) },
onClick = { onPriorityChanged("GREEN"); showPriorityMenu = false }
)
Spacer(modifier = Modifier.width(16.dp))
Text(
"Priorité",
color = MaterialTheme.colorScheme.onSurfaceVariant,
style = MaterialTheme.typography.bodyLarge,
modifier = Modifier.weight(1f)
)
val priorities = listOf(null, "BLUE", "YELLOW", "RED")
val priorityColors = listOf(
MaterialTheme.colorScheme.onSurfaceVariant,
androidx.compose.ui.graphics.Color(0xFF64B5F6), // Blue
androidx.compose.ui.graphics.Color(0xFFFFD54F), // Yellow
androidx.compose.ui.graphics.Color(0xFFE57373) // Red
)
priorities.forEachIndexed { index, p ->
val isSelected = state.priority == p
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) }
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) {
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!!
}
calendar.set(java.util.Calendar.YEAR, newDateCal.get(java.util.Calendar.YEAR))
calendar.set(java.util.Calendar.MONTH, newDateCal.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.YEAR, utcCal.get(java.util.Calendar.YEAR))
calendar.set(java.util.Calendar.MONTH, utcCal.get(java.util.Calendar.MONTH))
calendar.set(java.util.Calendar.DAY_OF_MONTH, utcCal.get(java.util.Calendar.DAY_OF_MONTH))
selectedDateMillis = calendar.timeInMillis
}
}