v403: Bugfix Archivierung + Task-Duplizieren
Zwei verwandte Frontend/Backend-Bugs behoben: 1. Archivierte Aufgaben liessen sich nicht wiederherstellen - Task war nie im Frontend-Store (Board laedt nur archived=0) - store.updateTask() ist no-op fuer unbekannte IDs - task:archived Socket-Event hatte keinen Frontend-Handler Fix: Backend emittiert/retourniert vollen Task, Frontend fuegt ihn via store.addTask ein, schliesst archive-modal, neuer sync.js-Handler haelt andere Clients in sync. 2. Dupliziertes Task verlor abgehakte Subtasks - INSERT INTO subtasks liess completed-Spalte weg -> Default 0 - task_assignees wurden ueberhaupt nicht mitkopiert Fix: subtasks-INSERT um completed erweitert, task_assignees analog zu task_labels mitkopiert. CACHE_VERSION 402 -> 403.
Dieser Commit ist enthalten in:
@@ -924,8 +924,21 @@ class App {
|
||||
async restoreTask(taskId) {
|
||||
try {
|
||||
const projectId = store.get('currentProjectId');
|
||||
await api.restoreTask(projectId, taskId);
|
||||
store.updateTask(taskId, { archived: false });
|
||||
const response = await api.restoreTask(projectId, taskId);
|
||||
|
||||
// Task in den Store einfuegen (vorher nur in Archivliste, nicht im Store)
|
||||
const restoredTask = response?.task;
|
||||
if (restoredTask) {
|
||||
const existing = store.getTaskById ? store.getTaskById(taskId) : null;
|
||||
if (existing) {
|
||||
store.updateTask(taskId, { ...restoredTask, archived: false });
|
||||
} else {
|
||||
store.addTask({ ...restoredTask, archived: false });
|
||||
}
|
||||
} else {
|
||||
store.updateTask(taskId, { archived: false });
|
||||
}
|
||||
|
||||
this.showSuccess('Aufgabe wiederhergestellt');
|
||||
|
||||
// Re-render board
|
||||
|
||||
@@ -163,6 +163,10 @@ class SyncManager {
|
||||
this.handleTaskMoved(data);
|
||||
});
|
||||
|
||||
this.socket.on('task:archived', (data) => {
|
||||
this.handleTaskArchived(data);
|
||||
});
|
||||
|
||||
this.socket.on('label:created', (data) => {
|
||||
this.handleLabelCreated(data);
|
||||
});
|
||||
@@ -369,6 +373,27 @@ class SyncManager {
|
||||
store.moveTask(taskId, columnId, position);
|
||||
}
|
||||
|
||||
handleTaskArchived(data) {
|
||||
const { id, archived, task, userId } = data;
|
||||
|
||||
if (userId && userId === store.get('currentUser')?.id) return;
|
||||
|
||||
if (archived) {
|
||||
// Archivieren: aus Board-Sicht entfernen (Task bleibt in DB)
|
||||
store.removeTask(id);
|
||||
} else {
|
||||
// Wiederherstellen: Task zurück in den Store bringen
|
||||
if (task) {
|
||||
const existing = store.getTaskById ? store.getTaskById(id) : null;
|
||||
if (existing) {
|
||||
store.updateTask(id, { ...task, archived: false });
|
||||
} else {
|
||||
store.addTask({ ...task, archived: false });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
handleLabelCreated(data) {
|
||||
const { label, userId } = data;
|
||||
|
||||
|
||||
@@ -588,9 +588,10 @@ class TaskModalManager {
|
||||
async handleRestore() {
|
||||
try {
|
||||
const projectId = store.get('currentProjectId');
|
||||
await api.restoreTask(projectId, this.taskId);
|
||||
store.updateTask(this.taskId, { archived: false });
|
||||
const response = await api.restoreTask(projectId, this.taskId);
|
||||
this.applyRestoredTask(response?.task);
|
||||
this.close();
|
||||
window.dispatchEvent(new CustomEvent('modal:close', { detail: { modalId: 'archive-modal' } }));
|
||||
this.showSuccess('Aufgabe wiederhergestellt');
|
||||
} catch (error) {
|
||||
// Prüfen ob Spaltenauswahl erforderlich ist
|
||||
@@ -602,6 +603,19 @@ class TaskModalManager {
|
||||
}
|
||||
}
|
||||
|
||||
applyRestoredTask(restoredTask) {
|
||||
if (restoredTask) {
|
||||
const existing = store.getTaskById ? store.getTaskById(this.taskId) : null;
|
||||
if (existing) {
|
||||
store.updateTask(this.taskId, { ...restoredTask, archived: false });
|
||||
} else {
|
||||
store.addTask({ ...restoredTask, archived: false });
|
||||
}
|
||||
} else {
|
||||
store.updateTask(this.taskId, { archived: false });
|
||||
}
|
||||
}
|
||||
|
||||
handleTaskToAssistant() {
|
||||
if (!this.originalTask) return;
|
||||
|
||||
@@ -640,9 +654,10 @@ class TaskModalManager {
|
||||
onSelect: async (columnId) => {
|
||||
try {
|
||||
const projectId = store.get('currentProjectId');
|
||||
await api.restoreTask(projectId, this.taskId, columnId);
|
||||
store.updateTask(this.taskId, { archived: false, columnId: columnId });
|
||||
const response = await api.restoreTask(projectId, this.taskId, columnId);
|
||||
this.applyRestoredTask(response?.task);
|
||||
this.close();
|
||||
window.dispatchEvent(new CustomEvent('modal:close', { detail: { modalId: 'archive-modal' } }));
|
||||
this.showSuccess('Aufgabe wiederhergestellt');
|
||||
} catch (error) {
|
||||
this.showError('Fehler beim Wiederherstellen');
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren