feat: implement TodoScreen compose UI with AI brain dump functionality and filtered list management
This commit is contained in:
parent
888841e510
commit
4d8d6f5172
@ -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
|
||||
)
|
||||
androidx.compose.material3.DropdownMenu(
|
||||
expanded = showPriorityMenu,
|
||||
onDismissRequest = { showPriorityMenu = false }
|
||||
Row(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(horizontal = 16.dp, vertical = 16.dp),
|
||||
verticalAlignment = Alignment.CenterVertically
|
||||
) {
|
||||
androidx.compose.material3.DropdownMenuItem(
|
||||
text = { Text("Urgent (Rouge)", color = androidx.compose.ui.graphics.Color.Red) },
|
||||
onClick = { onPriorityChanged("RED"); showPriorityMenu = false }
|
||||
Icon(
|
||||
Icons.Default.Flag,
|
||||
contentDescription = null,
|
||||
tint = MaterialTheme.colorScheme.onSurfaceVariant
|
||||
)
|
||||
androidx.compose.material3.DropdownMenuItem(
|
||||
text = { Text("Élevée (Jaune)", color = androidx.compose.ui.graphics.Color.Yellow) },
|
||||
onClick = { onPriorityChanged("YELLOW"); showPriorityMenu = false }
|
||||
Spacer(modifier = Modifier.width(16.dp))
|
||||
Text(
|
||||
"Priorité",
|
||||
color = MaterialTheme.colorScheme.onSurfaceVariant,
|
||||
style = MaterialTheme.typography.bodyLarge,
|
||||
modifier = Modifier.weight(1f)
|
||||
)
|
||||
androidx.compose.material3.DropdownMenuItem(
|
||||
text = { Text("Normale (Bleu)", color = androidx.compose.ui.graphics.Color.Blue) },
|
||||
onClick = { onPriorityChanged("BLUE"); showPriorityMenu = false }
|
||||
|
||||
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
|
||||
)
|
||||
androidx.compose.material3.DropdownMenuItem(
|
||||
text = { Text("Basse (Vert)", color = androidx.compose.ui.graphics.Color.Green) },
|
||||
onClick = { onPriorityChanged("GREEN"); showPriorityMenu = false }
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user