- Tasks in shared task lists can be assigned to one or more people with access (task_assignees); assignments are pruned whenever access is lost - UserAutocomplete: type-to-search everywhere, nothing before typing, max 3 results, first match preselected - Task list and list tabs: avatar stack of members and round monochrome counter - Shared list items remember who added them (list_items.created_by) - Doku/ui-patterns.md documents the shared UI patterns Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
4.4 KiB
Modul: Aufgaben, Kanban & Alarme
Code: TasksView.tsx, TaskDetailModal.tsx, ManageColumnsModal.tsx; Backend: handleUpdateThought, handleReorderTasks, *TaskList*-Handler, startAlarmTicker.
Datenmodell
Eine Aufgabe ist ein thought (database.md) mit kanbanStatus, priority (low/normal/high/urgent), dueDate (nur Datum), notes (Markdown), subtasks ([{id, title, isCompleted}]), tags, taskListId, sortOrder und assignees (Benutzer-IDs). Aufgaben ohne Liste sind persönlich.
Ansichten
- Liste mit Filtern (offen, erledigt, Papierkorb), Gruppierung (z. B. nach Status oder Fälligkeit), Sortierung und Hashtag-Filter.
- Kanban: Spalten pro Liste frei konfigurierbar (Name, Farbe, „Erledigt“-Spalte). Standard: Zu erledigen, In Bearbeitung, Wartet auf andere, Erledigt. Eine Karte in eine „Erledigt“-Spalte zu ziehen setzt
isCompleted. - Drag & Drop sortiert in der Liste und zwischen Spalten; ein Klick öffnet das Detail-Fenster (Titel, Status, Priorität, Fälligkeit mit Schnellwahl, Liste, Hashtags, Unteraufgaben mit Fortschrittsbalken, Notizen).
- Aufgaben lassen sich in eine Notiz umwandeln („Als Notiz vertiefen“). Aufgaben aus Notiz-Checkboxen (
enhanced-task) bleiben verknüpft: Abhaken wirkt in beide Richtungen (SyncDocBlockAndTask), „In Notiz öffnen“ springt zum Block.
Aufgabenlisten und Freigabe
- Jede Liste hat Eigentümer, Titel, Symbol, Farbe und eigene Kanban-Spalten.
- Freigabe an Gruppen oder Benutzer über den Dialog
UnifiedShareModal(Stufe pro Freigabe):- Bearbeiter: darf Aufgaben anlegen, ändern, abhaken, verschieben, löschen sowie Liste umbenennen und Spalten ändern.
- Leser: sieht alles, kann nichts ändern. Der Server antwortet mit
403; die Oberfläche blendet Eingaben aus und zeigt „Nur Lesen“. - Gruppenmitglieder mit mehreren Wegen erhalten die höchste Stufe. Nur der Eigentümer legt Freigaben an oder entfernt sie und kann die Liste löschen.
- Umsetzung:
Store.GetTaskListPermissionliefertowner/editor/viewer/"";ensureTaskListWritableschützt Schreibpfade. - Zuweisen (nur in geteilten Listen, also mit mindestens einer Person außer dem Eigentümer): Im Detail-Fenster unter „Zugewiesen“ lassen sich eine oder mehrere Personen mit Zugriff auf die Liste zuweisen, über die einheitliche Personensuche (ui-patterns.md). Zuweisen dürfen Eigentümer und Bearbeiter. Zeilen und Kanban-Karten zeigen die Zugewiesenen als Profilbild-Stapel.
- Gespeichert in
task_assignees;PATCH /thoughts/{id}mitassigneesersetzt die Liste. Der Server lehnt Personen ohne Zugriff ab (403,storage.ErrAssigneeNoAccess). - Zuweisungen folgen den Rechten:
Store.PruneTaskAssigneesentfernt jede Zuweisung, deren Person die Liste nicht mehr sehen kann. Es läuft nach Entfernen einer Freigabe, Ändern vonteam_id, Austritt aus oder Entfernen aus einer Gruppe, Löschen einer Gruppe, Löschen der Liste und Verschieben der Aufgabe in eine andere oder keine Liste; beim Löschen eines Kontos werden dessen Zuweisungen direkt gelöscht. Wer über einen zweiten Weg (z. B. direkt und über eine Gruppe) weiter Zugriff hat, bleibt zugewiesen.
- Gespeichert in
- Bekannte Lücken: FLAW-03 (Umsortieren per ID), FLAW-06 (Editor kann weiterteilen).
Alarme
Der Ticker läuft jede Minute (architecture.md). Für offene Aufgaben mit due_date <= heute und alarm_sent = 0 sendet er an die Kanäle des Aufgaben-Eigentümers:
| Kanal | Ziel | Konfiguration |
|---|---|---|
alarmEmail (sonst Konto-Adresse) |
SMTP aus Admin-Einstellungen oder Umgebung (Port 465 mit TLS wird direkt unterstützt, sonst STARTTLS über smtp.SendMail) |
|
| Discord | Webhook-URL | Benutzereinstellungen |
| Webhook | beliebige URL (JSON: event, title, notes, dueDate, priority, timestamp) |
Benutzereinstellungen |
Danach wird alarm_sent = 1 gesetzt, sobald mindestens ein Kanal erfolgreich war.
Einschränkungen (FLAW-12): Fälligkeiten haben keine Uhrzeit, notifyBeforeMinutes wird ignoriert, die Serverzeit gilt, und ein verschobener Termin löst nicht erneut aus. URLs werden nicht geprüft (FLAW-05).