Fasst die sieben Kacheln, die tatsaechlich "wo muss ich reagieren" beantworten (Entschuldigungen, Fehlzeiten-Warnung, Foerderplan-Wiedervorlage, Korrekturen, ungeplante Stunden, Auffaelligkeiten, Unterrichtszeit-Nacherfassung), zu einer Karte "Handlungsbedarf" mit Filter-Chips zusammen statt sieben eigener Sichtbarkeits-Schalter. Neues gemeinsames Modell AttentionItem/AttentionGroup/AttentionAction traegt nur Anzeigedaten - die Datenbeschaffung bleibt unveraendert in den jeweiligen DashboardViewModel.LoadXxx-Methoden, die am Ende ein AttentionItem statt ihrer eigenen Item-Klasse erzeugen. RebuildAttention() gruppiert nach Art (feste Reihenfolge) und wendet Filter an, ohne die Repos erneut abzufragen. SupportPlanDueItem, CorrectionProgressItem, UnplannedLessonItem und DashboardAlertItem entfallen (nur dashboard-intern verwendet); OpenExcuseItem und AttendanceWarningItem bleiben bestehen, da GroupOverviewViewModel sie weiterhin nutzt. Fuenf Navigations-Commands wurden durch ein einziges OpenAttentionItemCommand ersetzt. Bewusste Verhaltensaenderung: LoadAlerts dupliziert Fehlzeiten-Ueberschreitungen nicht mehr in die Auffaelligkeiten-Gruppe, da dieselbe Zahl sonst zweimal in derselben Karte erschiene (vorher durch zwei getrennte Kacheln nicht sichtbar). Details und Testanpassungen siehe TODO.md, Abschnitt 9 (Dashboard).
66 lines
2.7 KiB
C#
66 lines
2.7 KiB
C#
using System.Text.Json;
|
|
|
|
namespace LehrerApp.Core.Services;
|
|
|
|
public sealed class DashboardCardSetting
|
|
{
|
|
public string Key { get; set; } = "";
|
|
public bool IsVisible { get; set; } = true;
|
|
public int Order { get; set; }
|
|
}
|
|
|
|
/// <summary>Speichert Sichtbarkeit und Reihenfolge der Dashboard-Kacheln lokal.</summary>
|
|
public sealed class DashboardSettingsService
|
|
{
|
|
// "attention" fasst die frueheren sieben Kacheln missingteachingtime/excuses/corrections/
|
|
// unplanned/alerts/attendance/support zusammen (siehe AttentionItem.cs im Desktop-Projekt).
|
|
// Alte gespeicherte dashboardsettings.json-Dateien mit den frueheren Keys sind unproblematisch:
|
|
// Load() unten verwirft unbekannte Keys ohnehin stillschweigend und ergaenzt neue als sichtbar.
|
|
public static readonly string[] DefaultCardOrder =
|
|
[
|
|
"today", "tasks", "attention", "calendar", "upcoming", "groups", "examload",
|
|
];
|
|
|
|
private readonly string _configPath;
|
|
|
|
public DashboardSettingsService(string appDataPath) =>
|
|
_configPath = Path.Combine(appDataPath, "dashboardsettings.json");
|
|
|
|
public List<DashboardCardSetting> Load()
|
|
{
|
|
try
|
|
{
|
|
if (File.Exists(_configPath))
|
|
{
|
|
var saved = JsonSerializer.Deserialize<List<DashboardCardSetting>>(
|
|
File.ReadAllText(_configPath)) ?? [];
|
|
var byKey = saved
|
|
.Where(s => DefaultCardOrder.Contains(s.Key))
|
|
.GroupBy(s => s.Key).ToDictionary(g => g.Key, g => g.First());
|
|
return DefaultCardOrder.Select((key, defaultOrder) => byKey.TryGetValue(key, out var item)
|
|
? new DashboardCardSetting { Key = key, IsVisible = item.IsVisible, Order = item.Order }
|
|
: new DashboardCardSetting { Key = key, IsVisible = true, Order = defaultOrder })
|
|
.OrderBy(s => s.Order).ThenBy(s => Array.IndexOf(DefaultCardOrder, s.Key))
|
|
.Select((s, index) => new DashboardCardSetting
|
|
{ Key = s.Key, IsVisible = s.IsVisible, Order = index })
|
|
.ToList();
|
|
}
|
|
}
|
|
catch { /* beschädigte Konfiguration -> Standardreihenfolge */ }
|
|
|
|
return DefaultCardOrder.Select((key, index) => new DashboardCardSetting
|
|
{ Key = key, IsVisible = true, Order = index }).ToList();
|
|
}
|
|
|
|
public void Save(IEnumerable<DashboardCardSetting> settings)
|
|
{
|
|
var normalized = settings.Select((s, index) => new DashboardCardSetting
|
|
{
|
|
Key = s.Key,
|
|
IsVisible = s.IsVisible,
|
|
Order = index,
|
|
}).ToList();
|
|
File.WriteAllText(_configPath, JsonSerializer.Serialize(normalized));
|
|
}
|
|
}
|