feat: prominenterer Bestätigungsdialog + move_lesson/delete_lesson (Nutzer-Feedback)

Nach dem ersten Live-Test mit echtem Bridge-Prozess: der bisherige
ConfirmDialog fiel zu wenig auf, wenn LehrerApp im Hintergrund lief
(Normalfall, da der Anstoß vom KI-Client in einem anderen Fenster
kommt). Neuer, eigenständiger McpConfirmDialog statt Änderung am
geteilten ConfirmDialog (hätte alle anderen Aufrufer mitbetroffen):
breiter, auffälliger Kopfbereich, Topmost. AvaloniaMcpConfirmationService
holt das Hauptfenster zusätzlich aus einer möglichen Minimierung und
aktiviert es vor dem Anzeigen.

move_lesson kapselt die bereits vorhandene LessonSchedulingService.Move
(shiftFollowingLessons öffnet eine Lücke für eine neue Stunde, indem
spätere Stunden derselben Einheit mitverschoben werden) - keine neue
Terminlogik, nur Wiederverwendung.

delete_lesson ist eine bewusste, gezielte Ausnahme von "v1 ohne
Lösch-Tools" auf expliziten Nutzerwunsch: eigene
AllowedDestructiveWriteTools-Liste, Destructive=true-Annotation,
Bestätigungstext betont ausdrücklich die fehlende Papierkorb-Deckung
für Lessons.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-12 00:43:59 +02:00
co-authored by Claude Sonnet 5
parent e6c30b0bc7
commit a4733c156b
9 changed files with 308 additions and 13 deletions
+34
View File
@@ -2650,6 +2650,40 @@ folgenden Punkte gehören direkt in `LehrerApp.Desktop`:
ohne erneutes `get_lesson_plans` möglich ist. 4 neue Tests in
[McpToolsTests.cs](LehrerApp.Desktop.Tests/McpToolsTests.cs) (jetzt 32).
- [x] **4.5.31** Bestätigungsdialog-Prominenz + `move_lesson`/`delete_lesson` (2026-09-12,
Nutzer-Feedback nach erstem Live-Test mit echtem Bridge-Prozess).
- **Dialog fiel zu wenig auf:** der bisher wiederverwendete `ConfirmDialog` (Views/Shared,
an vielen anderen Stellen der App für Routine-Bestätigungen im Einsatz) ist nur zum
Hauptfenster modal — läuft LehrerApp im Hintergrund, während der Anstoß von einem
KI-Client in einem anderen Fenster kommt (der Normalfall bei MCP), geht der Dialog leicht
unter. Neuer, eigenständiger
[McpConfirmDialog](LehrerApp.Desktop/Views/Mcp/McpConfirmDialog.axaml) statt einer
Style-Änderung am geteilten `ConfirmDialog` (hätte alle dessen bestehenden Aufrufer
mitbetroffen): breiter (520 statt 420), auffälliger Kopfbereich ("Vorschlag deines
KI-Assistenten — bitte prüfen"), `Topmost`. `AvaloniaMcpConfirmationService` holt das
Hauptfenster zusätzlich aus einer möglichen Minimierung und aktiviert es
(`WindowState`/`Activate()`), bevor der Dialog erscheint.
- **`move_lesson`:** deckt sowohl "eine Stunde verschieben" als auch "Lücke für eine neue
Stunde öffnen" ab, indem es die bereits vorhandene, bislang nur UI-seitig genutzte
[LessonSchedulingService.Move](LehrerApp.Core/Services/LessonSchedulingService.cs) kapselt
(`shiftFollowingLessons=true` verschiebt alle späteren, noch nicht durchgeführten Stunden
derselben Einheit um denselben Tages-Versatz mit — "Lücke öffnen" = die Stunde hinter der
Lücke so verschieben, danach `create_lesson` auf das freigewordene Datum). Keine neue
Terminlogik geschrieben, nur wiederverwendet.
- **`delete_lesson` — bewusste, gezielte Ausnahme von "v1 ohne Lösch-Tools":** explizite
Nutzeranforderung. `Lesson` hängt (anders als die meisten anderen Entitäten) nicht am
Papierkorb-System — `ILessonRepository.Delete` löscht endgültig, kein `Restore`. Deshalb:
eigene `McpToolScope.AllowedDestructiveWriteTools`-Liste getrennt von den normalen
Write-Tools (fällt beim Lesen sofort auf), `Destructive = true`-Annotation im
MCP-Protokoll, und eine Bestätigungsnachricht, die explizit "NICHT rückgängig zu machen"
sagt (Wortlaut an den bestehenden Lösch-Dialog in `PlanningTabView.axaml.cs`
angelehnt: "wird endgültig gelöscht").
- 8 neue Tests in [McpToolsTests.cs](LehrerApp.Desktop.Tests/McpToolsTests.cs) (jetzt 40),
u.a.: `shiftFollowingLessons` verschiebt nur Stunden NACH der bewegten, nicht davor;
ein belegtes Ziel liefert nach bereits erfolgter Bestätigung einen Fehler statt
stillschweigend zu überschreiben (die bestehende `EnsureTargetIsFree`-Prüfung in
`LessonSchedulingService` greift unverändert).
**Wichtige Abweichung von der ursprünglichen Planung (5.2):** Vor der Umsetzung zeigte sich,
dass 5.2 wie ursprünglich beschrieben eine zweite, parallele Fehlzeiten-Erfassung neben dem
bereits bestehenden Anwesenheits-Tracking aus Kapitel 3 (`ParticipationEntry.Attendance`,