Notenschlüssel-Editor (1.3) und Einstellungen in Tabs strukturiert

- Notenschlüssel-Editor im ExamDialog: Stufen (Note/Prozentgrenze)
  bearbeitbar, Vorbelegung passend zum GradingSystem der Gruppe,
  Live-Anzeige der absoluten Punktegrenze je Stufe, Validierung
  (lückenlos, keine Dopplungen) über GradingService.ValidateGradingKey.
- Neues Modell GradingKeyTemplate + Repository: Notenschlüssel als
  Vorlage speichern/anwenden, direkt aus dem ExamDialog heraus.
- Einstellungen: Fächer / Kompetenzen / Notenschlüssel-Vorlagen sind
  jetzt eigene Tabs statt einer gemeinsam wachsenden Liste. Vorlagen
  zeigen nur noch eine kompakte Zeile; die Stufen-Bearbeitung läuft
  über ein Popup-Fenster (GradingKeyTemplateDialog).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-12 00:34:43 +02:00
co-authored by Claude Sonnet 5
parent d00cea0bfe
commit 3fc506adc1
15 changed files with 631 additions and 148 deletions
+15
View File
@@ -40,6 +40,21 @@ public class GradingService
new() { Grade = "1", MinPercent = 20.0 },
new() { Grade = "0", MinPercent = 0.0 },
];
public string? ValidateGradingKey(List<GradingKeyEntry> entries)
{
if (entries.Count < 2) return "Der Notenschlüssel braucht mindestens zwei Stufen.";
if (entries.Any(e => string.IsNullOrWhiteSpace(e.Grade)))
return "Jede Stufe braucht eine Bezeichnung.";
if (entries.Any(e => e.MinPercent < 0 || e.MinPercent > 100))
return "Prozentgrenzen müssen zwischen 0 und 100 liegen.";
var sorted = entries.OrderByDescending(e => e.MinPercent).ToList();
if (sorted.Select(e => e.MinPercent).Distinct().Count() != sorted.Count)
return "Prozentgrenzen dürfen sich nicht doppeln.";
if (sorted.Last().MinPercent != 0)
return "Die unterste Stufe muss bei 0 % liegen (lückenlose Abdeckung).";
return null;
}
public double WeightedAverage(List<(string Grade, double Weight)> grades)
{
var numeric = grades