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:
@@ -799,10 +799,15 @@ router.post('/:id/duplicate', (req, res) => {
|
||||
const insertLabel = db.prepare('INSERT INTO task_labels (task_id, label_id) VALUES (?, ?)');
|
||||
taskLabels.forEach(tl => insertLabel.run(newTaskId, tl.label_id));
|
||||
|
||||
// Subtasks kopieren
|
||||
// Mehrfachzuweisungen kopieren
|
||||
const assignees = db.prepare('SELECT user_id FROM task_assignees WHERE task_id = ?').all(taskId);
|
||||
const insertAssignee = db.prepare('INSERT INTO task_assignees (task_id, user_id) VALUES (?, ?)');
|
||||
assignees.forEach(a => insertAssignee.run(newTaskId, a.user_id));
|
||||
|
||||
// Subtasks inkl. Abhak-Status kopieren
|
||||
const subtasks = db.prepare('SELECT * FROM subtasks WHERE task_id = ? ORDER BY position').all(taskId);
|
||||
const insertSubtask = db.prepare('INSERT INTO subtasks (task_id, title, position) VALUES (?, ?, ?)');
|
||||
subtasks.forEach((st, idx) => insertSubtask.run(newTaskId, st.title, idx));
|
||||
const insertSubtask = db.prepare('INSERT INTO subtasks (task_id, title, completed, position) VALUES (?, ?, ?, ?)');
|
||||
subtasks.forEach((st, idx) => insertSubtask.run(newTaskId, st.title, st.completed ? 1 : 0, idx));
|
||||
|
||||
addHistory(db, newTaskId, req.user.id, 'created', null, null, `Kopie von #${taskId}`);
|
||||
|
||||
@@ -865,16 +870,18 @@ router.put('/:id/archive', (req, res) => {
|
||||
|
||||
logger.info(`Aufgabe ${archived ? 'archiviert' : 'wiederhergestellt'}: ${task.title}`);
|
||||
|
||||
// WebSocket - vollständige Task-Daten senden
|
||||
// WebSocket - vollständigen Task mitschicken, damit Clients ihn wieder einpflegen können
|
||||
const io = req.app.get('io');
|
||||
const updatedTask = getFullTask(db, taskId);
|
||||
io.to(`project:${task.project_id}`).emit('task:archived', {
|
||||
id: taskId,
|
||||
archived: !!archived,
|
||||
columnId: updatedTask?.columnId
|
||||
columnId: updatedTask?.columnId,
|
||||
task: updatedTask,
|
||||
userId: req.user.id
|
||||
});
|
||||
|
||||
res.json({ message: archived ? 'Aufgabe archiviert' : 'Aufgabe wiederhergestellt' });
|
||||
res.json({ message: archived ? 'Aufgabe archiviert' : 'Aufgabe wiederhergestellt', task: updatedTask });
|
||||
} catch (error) {
|
||||
logger.error('Fehler beim Archivieren:', { error: error.message });
|
||||
res.status(500).json({ error: 'Interner Serverfehler' });
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren