fix(project-management) : reflect saved task immediately in board, list and reopened modal

TaskModal now emits the fresh task returned by the API (same task:read
shape as the collection). The board, my-tasks and archives pages reinject
it into their local state and selectedTask before the background re-fetch,
so the list and a reopened modal no longer show the previous snapshot while
loadData() is still running.
This commit is contained in:
Matthieu
2026-06-23 12:14:22 +02:00
parent f6d37e4667
commit bf55a55fa6
4 changed files with 26 additions and 5 deletions
@@ -569,7 +569,7 @@ const props = defineProps<{
const emit = defineEmits<{
(e: 'update:modelValue', value: boolean): void
(e: 'saved'): void
(e: 'saved', task?: Task): void
}>()
const isOpen = computed({
@@ -1042,7 +1042,7 @@ async function handleSubmit() {
await removeRecurrence(props.task.recurrence.id)
}
emit('saved')
emit('saved', savedTask)
isOpen.value = false
} finally {
isSubmitting.value = false
@@ -269,7 +269,13 @@ watch(taskModalOpen, (open) => {
}
})
async function onSaved() {
async function onSaved(savedTask?: Task) {
// Mise à jour optimiste avant le re-fetch (cf. index.vue) pour éviter le snapshot stale.
if (savedTask) {
const idx = tasks.value.findIndex(t => t.id === savedTask.id)
if (idx !== -1) tasks.value[idx] = savedTask
if (selectedTask.value?.id === savedTask.id) selectedTask.value = savedTask
}
await loadTasks()
}
@@ -150,7 +150,13 @@ function openTaskEdit(task: Task) {
taskDrawerOpen.value = true
}
async function onSaved() {
async function onSaved(savedTask?: Task) {
// Mise à jour optimiste avant le re-fetch (cf. index.vue) pour éviter le snapshot stale.
if (savedTask) {
const idx = archivedTasks.value.findIndex(t => t.id === savedTask.id)
if (idx !== -1) archivedTasks.value[idx] = savedTask
if (selectedTask.value?.id === savedTask.id) selectedTask.value = savedTask
}
await loadData()
}
@@ -473,7 +473,16 @@ async function onBulkDelete() {
await loadData()
}
async function onSaved() {
async function onSaved(savedTask?: Task) {
// Mise à jour optimiste : la modale se ferme avant la fin du re-fetch, on
// réinjecte immédiatement la tâche fraîche renvoyée par l'API pour éviter
// que la liste (et un éventuel ré-ouverture de la modale) reste sur l'ancien snapshot.
if (savedTask) {
const idx = tasks.value.findIndex(t => t.id === savedTask.id)
if (idx !== -1) tasks.value[idx] = savedTask
else tasks.value.push(savedTask)
if (selectedTask.value?.id === savedTask.id) selectedTask.value = savedTask
}
await loadData()
}