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.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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user