- recurrence on tasks, set in the detail dialog; 🔁 on rows and Kanban cards - Completing a repeating task (detail, list, Kanban drag to done, note checkbox) creates the next one: title, tags, priority, notes, list, assignees and rule copied, subtasks reset, first open column, due date one interval later (month end clamped); pushed live as TASK_CREATED - Each task spawns at most once (re-open + complete makes no duplicate) - Export/import keep the rule (Obsidian Tasks "🔁 every week", JSON field) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7.0 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, 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
- Wer sehen und zuweisen kann, hängt außerdem von der Sichtbarkeit ab: Verliert jemand sie (z. B. Wechsel der Organisation), fallen Freigabe und Zuweisungen weg (sharing-and-permissions.md).
- Bekannte Lücke: FLAW-03 (Umsortieren per ID).
Wiederkehrende Aufgaben
- Im Detail-Fenster unter der Fälligkeit: Keine Wiederholung, täglich, wöchentlich, monatlich oder jährlich (
thoughts.recurrence,PATCH /thoughts/{id}mitrecurrence). Zeilen und Kanban-Karten zeigen dann ein 🔁-Symbol. - Abhaken erzeugt die nächste Aufgabe (recurrence.go): egal ob im Detail, in der Liste, per Ziehen in „Erledigt“ im Kanban oder über die Checkbox in einer Notiz. Die erledigte Aufgabe bleibt erledigt (Historie); die neue übernimmt Titel, Tags, Priorität, Notizen, Liste, Zuweisungen und die Regel, Unteraufgaben kommen unerledigt mit, sie steht in der ersten offenen Spalte.
- Fälligkeit: das bisherige Datum plus ein Intervall (ohne Datum ab heute). Monate und Jahre behalten den Tag oder rutschen auf das Monatsende (31.1. → 28./29.2.).
- Jede Aufgabe erzeugt höchstens eine Nachfolgerin (
recurrence_spawned): Wieder öffnen und erneut abhaken legt keine zweite an. - Die neue Aufgabe geht per
TASK_CREATEDan alle Beteiligten, sie erscheint ohne Neuladen. - Export/Import: im Markdown-Archiv als
🔁 every week(Format des Obsidian-Tasks-Plugins), im JSON-Backup als Feld; beides wird beim Import wiederhergestellt.
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, siehe unten | |
| 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.
E-Mail-Versand (mail.go) führt den SMTP-Dialog Schritt für Schritt:
- Verbindung (Port 465: TLS von Anfang an),
EHLOmit der Domain der Absenderadresse (nielocalhost, das lehnen strenge Server ab), beiSMTP_TLSPflicht-STARTTLS, Anmeldung,MAIL FROM,RCPT TO, Daten. - Anmeldung:
AUTH PLAIN; bietet der Server nurLOGINan, direktAUTH LOGIN. Lehnt er PLAIN ab und bietet auch LOGIN an, baut MindSift die Verbindung neu auf und versuchtAUTH LOGIN(Go schließt die Verbindung nach einem gescheiterten AUTH). Scheitern beide mit451, nennt die Meldung beide Versuche und verweist auf das SASL-Backend des Mailservers (z. B. Dovecot-Auth), denn dann liegt der Fehler dort. Nie unverschlüsselt an fremde Hosts. SMTP_FROMdarf einen Namen enthalten (MindSift <alarm@domain>): im Umschlag steht nur die Adresse, im Header Name und Adresse.- Die Nachricht hat
DateundMessage-ID, einen nach RFC 2047 kodierten Betreff (Umlaute, Emoji) und einen Quoted-Printable-Text. SMTP_SKIP_VERIFY/ Schalter „Zertifikatsprüfung deaktivieren“ akzeptiert selbstsignierte Zertifikate (Verbindung bleibt verschlüsselt).- Fehler nennen den Schritt, an dem der Server abgelehnt hat (z. B.
SMTP-Schritt RCPT TO fehlgeschlagen: 451 …), im Log alssmtp_step. Test:internal/api/mail_test.gomit einem Fake-Server (STARTTLS, 451).
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).