fix: Dashboard-Kachelraster - Luecken und falsche Margins bei ausgeblendeten Kacheln
ApplyCardLayout() zaehlte bisher IsVisible statt EffectiveIsVisible, wodurch eine eingeschaltete aber leere HideWhenEmpty-Kachel weiterhin einen Rasterplatz belegte. Da im Alltag meist mehrere der sieben HideWhenEmpty-Kacheln leer sind, war das der Normalfall, nicht die Ausnahme. UpdateDashboardSummary() setzte zudem alle IsEmpty- Werte, ohne das Layout danach neu zu berechnen. Zusaetzlich hatte jede Kachel ihren Grid-Margin fest im XAML verdrahtet (links/rechts), obwohl Spalte und Zeile erst zur Laufzeit aus Sichtbarkeit und Reihenfolge berechnet werden - beim Ausblenden einer Kachel wanderten die Nachbarn in die andere Spalte, der Rinnstein sass dann auf der falschen Seite. DashboardCardOption.Margin leitet den Wert jetzt aus Column ab; das XAML bindet darauf statt fixer Werte. Drei Regressionstests decken beide Faelle ab.
This commit is contained in:
@@ -28,6 +28,57 @@ public sealed class DashboardViewModelTests
|
||||
Assert.True(vm.CalendarCard.EffectiveIsVisible);
|
||||
}
|
||||
|
||||
/// Regression: ApplyCardLayout zaehlte frueher IsVisible statt EffectiveIsVisible. Eine
|
||||
/// eingeschaltete, aber leere HideWhenEmpty-Kachel belegte damit einen Rasterplatz, den das
|
||||
/// Grid nie fuellt — im Alltag der Normalfall, weil meist mehrere Hinweiskacheln leer sind.
|
||||
[Fact]
|
||||
public void Kachelraster_LeereAusgeblendeteKacheln_HinterlassenKeineLuecke()
|
||||
{
|
||||
var group = new LearningGroup { Name = "9c" };
|
||||
var today = DateOnly.FromDateTime(DateTime.Today);
|
||||
|
||||
var vm = BuildVm(group, new Lesson { GroupId = group.Id, Date = today });
|
||||
|
||||
// Ohne mindestens eine leer ausgeblendete Kachel wuerde der Test nichts pruefen.
|
||||
Assert.False(vm.ExcusesCard.EffectiveIsVisible);
|
||||
|
||||
var belegtePlaetze = vm.DashboardCards.Where(c => c.EffectiveIsVisible)
|
||||
.Select(c => c.Row * 2 + c.Column).OrderBy(slot => slot).ToList();
|
||||
Assert.Equal(Enumerable.Range(0, belegtePlaetze.Count), belegtePlaetze);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void KachelMargin_FolgtDerBerechnetenSpalte()
|
||||
{
|
||||
var group = new LearningGroup { Name = "9c" };
|
||||
var today = DateOnly.FromDateTime(DateTime.Today);
|
||||
|
||||
var vm = BuildVm(group, new Lesson { GroupId = group.Id, Date = today });
|
||||
|
||||
foreach (var card in vm.DashboardCards.Where(c => c.EffectiveIsVisible))
|
||||
Assert.Equal(card.Column == 0
|
||||
? new Avalonia.Thickness(0, 0, 8, 8)
|
||||
: new Avalonia.Thickness(8, 0, 0, 8), card.Margin);
|
||||
}
|
||||
|
||||
/// Regression: der Margin hing fest im XAML an der Kachel. Wandert sie durch Aus-/Einblenden
|
||||
/// einer vorherigen Kachel in die andere Spalte, sass der Rinnstein auf der falschen Seite.
|
||||
[Fact]
|
||||
public void KachelAusblenden_DrehtDenMarginDerNachfolgendenKachel()
|
||||
{
|
||||
var group = new LearningGroup { Name = "9c" };
|
||||
var today = DateOnly.FromDateTime(DateTime.Today);
|
||||
|
||||
var vm = BuildVm(group, new Lesson { GroupId = group.Id, Date = today });
|
||||
Assert.Equal(1, vm.TasksCard.Column);
|
||||
Assert.Equal(new Avalonia.Thickness(8, 0, 0, 8), vm.TasksCard.Margin);
|
||||
|
||||
vm.TodayCard.IsVisible = false;
|
||||
|
||||
Assert.Equal(0, vm.TasksCard.Column);
|
||||
Assert.Equal(new Avalonia.Thickness(0, 0, 8, 8), vm.TasksCard.Margin);
|
||||
}
|
||||
|
||||
private static PeriodScheduleService NewPeriodSchedule()
|
||||
{
|
||||
var tempPath = System.IO.Path.Combine(
|
||||
|
||||
Reference in New Issue
Block a user