From 4ffba35eff6045406e7d94475847f9d996b7cc83 Mon Sep 17 00:00:00 2001 From: Sebastian Hedtrich Date: Thu, 17 Sep 2026 23:16:55 +0200 Subject: [PATCH] feat: Wochenendtage ohne Eintrag im Anwesenheitskalender dezent ausgrauen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Samstage/Sonntage sind normalerweise keine Schultage - "keine Fehlzeit" dort ist keine Leistung und soll nicht optisch gleichwertig neben echten Schultag-Einträgen stehen. Tageskacheln für Sa/So ohne Signal bekommen jetzt einen helleren Rahmen/Hintergrund und blasseren Text; ein tatsächlicher Eintrag an einem Wochenendtag bleibt unverändert farbig, da er echte Information trägt. Co-Authored-By: Claude Sonnet 5 --- .../ClassTeacherViewModelsTests.cs | 50 +++++++++++++++++++ ...StudentAttendanceCalendarDrawingBuilder.cs | 12 +++-- 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/LehrerApp.Desktop.Tests/ClassTeacherViewModelsTests.cs b/LehrerApp.Desktop.Tests/ClassTeacherViewModelsTests.cs index 5fb1472..e293479 100644 --- a/LehrerApp.Desktop.Tests/ClassTeacherViewModelsTests.cs +++ b/LehrerApp.Desktop.Tests/ClassTeacherViewModelsTests.cs @@ -173,6 +173,56 @@ public sealed class ClassTeacherViewModelsTests Assert.True(engeBox.ContentHeight <= 60 + 0.01f); } + // Samstage/Sonntage ohne Eintrag sind normalerweise keine Schultage - "keine Fehlzeit" dort ist + // keine Leistung und soll dezent ausgegraut statt gleichwertig mit echten Schultagen erscheinen. + // Ein tatsächlicher Eintrag an einem Wochenendtag bleibt dagegen unverändert farbig. + [Fact] + public void ElternbriefKalender_GrautWochenendtageOhneEintragAus() + { + var month = new DateOnly(2026, 9, 1); + var drawing = StudentAttendanceCalendarDrawingBuilder.Build("Ada Müller", month, [], []); + + var dayCells = drawing.Commands + .Zip(drawing.Commands.Skip(1), (first, second) => (first, second)) + .Where(pair => pair.first is DrawRoundedRectangle && pair.second is DrawStringEx text + && int.TryParse(text.Text, out _)) + .Select(pair => ((DrawRoundedRectangle)pair.first, int.Parse(((DrawStringEx)pair.second).Text))) + .ToList(); + + Assert.NotEmpty(dayCells); + foreach (var (rectangle, day) in dayCells) + { + var isWeekend = new DateOnly(2026, 9, day).DayOfWeek is DayOfWeek.Saturday or DayOfWeek.Sunday; + Assert.Equal(isWeekend ? "#F3F4F6" : "#FFFFFF", rectangle.FillColor); + } + } + + // Ein Eintrag (z.B. ein dokumentiertes Ereignis) an einem Wochenendtag trägt echte Information + // und darf deshalb nicht vom "ausgrauen" betroffen sein. + [Fact] + public void ElternbriefKalender_GrautWochenendtagMitEintragNichtAus() + { + var month = new DateOnly(2026, 9, 1); + var samstag = Enumerable.Range(1, 30) + .Select(day => new DateOnly(2026, 9, day)) + .First(d => d.DayOfWeek == DayOfWeek.Saturday); + var absences = new[] + { + new ClassAbsenceDaySummaryRow(samstag, "Ada Müller", 1, 6, 270, + ["Deu"], [1, 2, 3, 4, 5, 6], ["nicht entsch."], ["Absent"], null, null, true), + }; + + var drawing = StudentAttendanceCalendarDrawingBuilder.Build("Ada Müller", month, absences, []); + + var samstagsZelle = drawing.Commands + .Zip(drawing.Commands.Skip(1), (first, second) => (first, second)) + .Where(pair => pair.first is DrawRoundedRectangle && pair.second is DrawStringEx text + && text.Text == "U") + .Select(pair => (DrawRoundedRectangle)pair.first) + .Single(); + Assert.NotEqual("#F3F4F6", samstagsZelle.FillColor); + } + [Fact] public void ElternbriefFehltage_ListetDatumUmfangUndEntschuldigungsstatus() { diff --git a/LehrerApp.Desktop/Services/StudentAttendanceCalendarDrawingBuilder.cs b/LehrerApp.Desktop/Services/StudentAttendanceCalendarDrawingBuilder.cs index 69d88c3..9c8915b 100644 --- a/LehrerApp.Desktop/Services/StudentAttendanceCalendarDrawingBuilder.cs +++ b/LehrerApp.Desktop/Services/StudentAttendanceCalendarDrawingBuilder.cs @@ -134,12 +134,18 @@ public static class StudentAttendanceCalendarDrawingBuilder var row = index / 7; var x = xOffset + column * cellWidth; var cellY = monthY + row * cellHeight; + // Sa/So (Spalten 5/6, siehe weekdays-Array oben) ohne Eintrag dezent ausgrauen - das + // sind normalerweise keine Schultage, "keine Fehlzeit" dort ist keine Leistung und + // soll nicht optisch gleichwertig neben echten schulfreien-Tage-Einträgen stehen. Ein + // tatsächlicher Eintrag an einem Wochenendtag (day.HasSignal) bleibt unverändert + // farbig, da er echte Information trägt. + var isMutedWeekend = column is 5 or 6 && !day.HasSignal; commands.Add(new DrawRoundedRectangle(x + cellInset, cellY, cellWidth - 2 * cellInset, - cellHeight - cellInset, cellCornerRadius, "#D1D5DB", .35f, - day.HasSignal ? day.SignalColorHex : "#FFFFFF")); + cellHeight - cellInset, cellCornerRadius, isMutedWeekend ? "#E5E7EB" : "#D1D5DB", .35f, + day.HasSignal ? day.SignalColorHex : isMutedWeekend ? "#F3F4F6" : "#FFFFFF")); commands.Add(new DrawStringEx(x, cellY + k, cellHeight - 2 * k, cellWidth, day.HasSignal ? day.SignalCode : day.DayNumber, DrawingTextAlignment.AlignCenter, 7 * finalScale, - Color: day.HasSignal ? "#FFFFFF" : "#374151", Bold: day.HasSignal)); + Color: day.HasSignal ? "#FFFFFF" : isMutedWeekend ? "#B0B7C0" : "#374151", Bold: day.HasSignal)); } } y = gridStartY + 11 * k + 9 * k + maxWeeks * cellHeight + designTrailingGapY * k;