Stundenverlaufsplan: Viewer und Alternativpfad-Katalog (Kapitel 4.2 Nachtrag)
Schreibgeschützter LessonViewerDialog (größere Schrift, ohne Bearbeitungs-/Verlängern-/ Verschieben-Funktion) für den Einsatz während des Unterrichtens, erreichbar über "Anzeigen" im Stunden-Toolbar. Alternative Unterrichtsabläufe (z.B. Kurzversion bei Zeitmangel) laufen jetzt über einen echten Katalog (neues Modell AlternativeLessonPath: Name + Beschreibung) statt Freitext direkt an der Phase: im Verlaufsplan-Editor eine kompakte, farbig unterstützte Checkbox statt einer durchgehend sichtbaren Eingabespalte, Zuordnung/Neuanlage über einen eigenen Dialog. Der Viewer gruppiert Phasen entsprechend und zeigt die hinterlegte Beschreibung. Schema-Migration v3→v4 führt bestehende Freitextwerte verlustfrei in Katalogeinträge über. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -7,7 +7,8 @@ namespace LehrerApp.Desktop.Tests;
|
||||
public sealed class LessonDialogViewModelTests
|
||||
{
|
||||
private static LessonDialogViewModel BuildVm(Guid unitId, Guid groupId, Lesson? editing = null) =>
|
||||
new(new FakeLessons(), new FakeShorthandCodes([]), unitId, groupId, [], [], editing);
|
||||
new(new FakeLessons(), new FakeShorthandCodes([]), new FakeAlternativeLessonPaths([]),
|
||||
unitId, groupId, [], [], editing);
|
||||
|
||||
[Fact]
|
||||
public void AddPhase_FuegtZeileMitStandardwertenHinzu()
|
||||
@@ -18,6 +19,7 @@ public sealed class LessonDialogViewModelTests
|
||||
|
||||
Assert.Single(vm.Phases);
|
||||
Assert.Equal(5, vm.Phases[0].DurationMinutes);
|
||||
Assert.False(vm.Phases[0].HasAlternativePath);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@@ -68,8 +70,8 @@ public sealed class LessonDialogViewModelTests
|
||||
public void ShorthandSuggestions_KombiniertKatalogUndBisherigeStundenwerte()
|
||||
{
|
||||
var codes = new FakeShorthandCodes([new ShorthandCode { Code = "Tb" }, new ShorthandCode { Code = "SH" }]);
|
||||
var vm = new LessonDialogViewModel(new FakeLessons(), codes, Guid.NewGuid(), Guid.NewGuid(),
|
||||
[], ["Plenum", "LDE", "Tb"], null); // "Tb" doppelt (Katalog + Historie), soll nur einmal erscheinen
|
||||
var vm = new LessonDialogViewModel(new FakeLessons(), codes, new FakeAlternativeLessonPaths([]),
|
||||
Guid.NewGuid(), Guid.NewGuid(), [], ["Plenum", "LDE", "Tb"], null); // "Tb" doppelt (Katalog + Historie), soll nur einmal erscheinen
|
||||
|
||||
Assert.Equal(["LDE", "Plenum", "SH", "Tb"], vm.ShorthandSuggestions);
|
||||
}
|
||||
@@ -130,7 +132,8 @@ public sealed class LessonDialogViewModelTests
|
||||
var unitId = Guid.NewGuid();
|
||||
var groupId = Guid.NewGuid();
|
||||
var lessons = new FakeLessons();
|
||||
var vm = new LessonDialogViewModel(lessons, new FakeShorthandCodes([]), unitId, groupId, [], [], null)
|
||||
var vm = new LessonDialogViewModel(lessons, new FakeShorthandCodes([]), new FakeAlternativeLessonPaths([]),
|
||||
unitId, groupId, [], [], null)
|
||||
{
|
||||
Topic = "Brechung", DateText = "01.09.2025", StartTimeText = "11:45",
|
||||
};
|
||||
@@ -153,4 +156,83 @@ public sealed class LessonDialogViewModelTests
|
||||
Assert.Equal("L->AB01", vm.Result.Phases[0].Shorthand);
|
||||
Assert.Single(lessons.GetByUnit(unitId));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void HasAlternativePath_AngehaktOeffnetZuweisungUndUebernimmtErgebnis()
|
||||
{
|
||||
var vm = BuildVm(Guid.NewGuid(), Guid.NewGuid());
|
||||
var path = new AlternativeLessonPath { Name = "Kurzversion" };
|
||||
vm.OnPickAlternativePath = _ => Task.FromResult<AlternativeLessonPath?>(path);
|
||||
vm.AddPhaseCommand.Execute(null);
|
||||
|
||||
vm.Phases[0].HasAlternativePath = true;
|
||||
|
||||
Assert.True(vm.Phases[0].HasAlternativePath);
|
||||
Assert.Equal("Kurzversion", vm.Phases[0].AlternativePathName);
|
||||
Assert.Equal(path.Id, vm.Phases[0].AlternativePathId);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void HasAlternativePath_AbbruchDerZuweisungLaesstEsUnangehakt()
|
||||
{
|
||||
var vm = BuildVm(Guid.NewGuid(), Guid.NewGuid());
|
||||
vm.OnPickAlternativePath = _ => Task.FromResult<AlternativeLessonPath?>(null); // abgebrochen
|
||||
vm.AddPhaseCommand.Execute(null);
|
||||
|
||||
vm.Phases[0].HasAlternativePath = true;
|
||||
|
||||
Assert.False(vm.Phases[0].HasAlternativePath);
|
||||
Assert.Null(vm.Phases[0].AlternativePathId);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void HasAlternativePath_AbwaehlenEntferntZuordnungOhneDialogZuOeffnen()
|
||||
{
|
||||
var vm = BuildVm(Guid.NewGuid(), Guid.NewGuid());
|
||||
var path = new AlternativeLessonPath { Name = "Kurzversion" };
|
||||
var dialogCalls = 0;
|
||||
vm.OnPickAlternativePath = _ => { dialogCalls++; return Task.FromResult<AlternativeLessonPath?>(path); };
|
||||
vm.AddPhaseCommand.Execute(null);
|
||||
vm.Phases[0].HasAlternativePath = true; // zuweisen -> 1 Dialogaufruf
|
||||
|
||||
vm.Phases[0].HasAlternativePath = false; // abwählen -> kein weiterer Dialogaufruf
|
||||
|
||||
Assert.Equal(1, dialogCalls);
|
||||
Assert.False(vm.Phases[0].HasAlternativePath);
|
||||
Assert.Equal("", vm.Phases[0].AlternativePathName);
|
||||
Assert.Null(vm.Phases[0].AlternativePathId);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Save_UebernimmtZugewiesenenAlternativePfad()
|
||||
{
|
||||
var vm = BuildVm(Guid.NewGuid(), Guid.NewGuid());
|
||||
var path = new AlternativeLessonPath { Name = "Kurzversion" };
|
||||
vm.OnPickAlternativePath = _ => Task.FromResult<AlternativeLessonPath?>(path);
|
||||
vm.Topic = "Thema"; vm.DateText = "01.09.2025";
|
||||
vm.AddPhaseCommand.Execute(null);
|
||||
vm.Phases[0].HasAlternativePath = true;
|
||||
|
||||
vm.SaveCommand.Execute(null);
|
||||
|
||||
Assert.Equal(path.Id, vm.Result!.Phases[0].AlternativePathId);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AddPhaseInternal_LoestBestehendeZuordnungBeimBearbeitenAuf()
|
||||
{
|
||||
var path = new AlternativeLessonPath { Name = "Kurzversion" };
|
||||
var alternativePaths = new FakeAlternativeLessonPaths([path]);
|
||||
var editing = new Lesson
|
||||
{
|
||||
Topic = "Thema", Date = new DateOnly(2025, 9, 1),
|
||||
Phases = [new LessonPhaseStep { Name = "Einstieg", AlternativePathId = path.Id }],
|
||||
};
|
||||
|
||||
var vm = new LessonDialogViewModel(new FakeLessons(), new FakeShorthandCodes([]), alternativePaths,
|
||||
Guid.NewGuid(), Guid.NewGuid(), [], [], editing);
|
||||
|
||||
Assert.True(vm.Phases[0].HasAlternativePath);
|
||||
Assert.Equal("Kurzversion", vm.Phases[0].AlternativePathName);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user