Unterrichtsmodus: Schnellbewertung und Hausaufgabe-Kontrolle direkt im Fenster
Zwei neue Buttons ("Mitarbeit", "Anwesenheit/Hausaufgabe") öffnen die
bestehenden Schnellbewertungs-Dialoge direkt aus dem Unterrichtsmodus, ohne
zum Mitarbeit-Tab wechseln zu müssen — TeachingModeViewModel bekommt dafür
eine eigene ParticipationTabViewModel-Instanz, vorselektiert auf die zu
dieser Stunde gehörende Sitzung. Die linke Spalte zeigt jetzt zusätzlich die
Hausaufgabe der letzten Stunde mit Kontrolliert-Checkbox sowie die
Hausaufgabe dieser Stunde als editierbares Feld, statt nur lesbar.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -13,6 +13,17 @@ public sealed class TeachingModeViewModelTests
|
||||
new FakeStudents(students ?? []), new FakeMemberships(memberships ?? []),
|
||||
sessions ?? new FakeSessions([]), new FakeEntries(), new FakeAspects());
|
||||
|
||||
/// Dieselben Fakes wie <see cref="BuildSeatingPlan"/>, aber für ParticipationTabViewModel —
|
||||
/// beide brauchen eigene IParticipationSessionRepository/IParticipationRepository-Instanzen
|
||||
/// im Produktivcode (siehe TeachingModeWindow-Kommentar zu ReloadSeatBadgesFromRepository),
|
||||
/// hier reicht für die Tests aber eine gemeinsame FakeSessions-Instanz, damit beide
|
||||
/// ViewModels dieselbe verknüpfte Sitzung sehen.
|
||||
private static ParticipationTabViewModel BuildParticipation(LearningGroup group,
|
||||
FakeSessions? sessions = null) =>
|
||||
new(sessions ?? new FakeSessions([]), new FakeEntries(), new FakeAspects(),
|
||||
new FakeStudents([]), new FakeMemberships([]), new FakeGroups([group]),
|
||||
new FakeCompetencyDomains());
|
||||
|
||||
[Fact]
|
||||
public void Konstruktor_LaedtVerlaufsplanUndInitialisiertSitzplanFuerDieGruppe()
|
||||
{
|
||||
@@ -24,7 +35,8 @@ public sealed class TeachingModeViewModelTests
|
||||
};
|
||||
var seatingPlan = BuildSeatingPlan(group.Id);
|
||||
|
||||
var vm = new TeachingModeViewModel(lesson, group, new FakeAlternativeLessonPaths([]), seatingPlan);
|
||||
var vm = new TeachingModeViewModel(lesson, group, new FakeAlternativeLessonPaths([]),
|
||||
new FakeLessons(), seatingPlan, BuildParticipation(group));
|
||||
|
||||
Assert.Equal("Q1 Chemie", vm.GroupName);
|
||||
Assert.Equal("Redox", vm.LessonInfo.Topic);
|
||||
@@ -41,13 +53,37 @@ public sealed class TeachingModeViewModelTests
|
||||
var sessions = new FakeSessions([]);
|
||||
var seatingPlan = BuildSeatingPlan(group.Id, sessions);
|
||||
|
||||
var vm = new TeachingModeViewModel(lesson, group, new FakeAlternativeLessonPaths([]), seatingPlan);
|
||||
var vm = new TeachingModeViewModel(lesson, group, new FakeAlternativeLessonPaths([]),
|
||||
new FakeLessons(), seatingPlan, BuildParticipation(group, sessions));
|
||||
|
||||
var created = Assert.Single(sessions.GetByGroup(group.Id));
|
||||
Assert.Equal(lesson.Id, created.LessonId);
|
||||
Assert.Equal(vm.SeatingPlan.SelectedSession?.Id, created.Id);
|
||||
}
|
||||
|
||||
/// Nutzer-Feedback: Schnellbewertungs-Dialoge (Mitarbeit, Anwesenheit/Hausaufgabe) sollen sich
|
||||
/// im Unterrichtsmodus direkt öffnen lassen — das setzt voraus, dass die dafür verwendete
|
||||
/// ParticipationTabViewModel-Instanz von Anfang an auf der zu dieser Stunde gehörenden
|
||||
/// Sitzung steht, nicht auf einer beliebigen anderen Sitzung der Gruppe.
|
||||
[Fact]
|
||||
public void Konstruktor_SelektiertDieselbeSitzungAuchInDerParticipationViewModel()
|
||||
{
|
||||
var group = new LearningGroup { Name = "Q1 Chemie" };
|
||||
var lesson = new Lesson
|
||||
{ GroupId = group.Id, Date = DateOnly.FromDateTime(DateTime.Today), Topic = "Redox" };
|
||||
var otherSession = new ParticipationSession
|
||||
{ GroupId = group.Id, Date = lesson.Date.AddDays(-1), Comment = "Andere Stunde" };
|
||||
var sessions = new FakeSessions([otherSession]);
|
||||
var seatingPlan = BuildSeatingPlan(group.Id, sessions);
|
||||
|
||||
var vm = new TeachingModeViewModel(lesson, group, new FakeAlternativeLessonPaths([]),
|
||||
new FakeLessons(), seatingPlan, BuildParticipation(group, sessions));
|
||||
|
||||
Assert.NotNull(vm.SeatingPlan.SelectedSession);
|
||||
Assert.Equal(vm.SeatingPlan.SelectedSession!.Id, vm.Participation.SelectedSession?.Id);
|
||||
Assert.NotEqual(otherSession.Id, vm.Participation.SelectedSession?.Id);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Konstruktor_BereitsExistierendeVerknuepfteSitzung_WirdWiederverwendet()
|
||||
{
|
||||
@@ -59,7 +95,8 @@ public sealed class TeachingModeViewModelTests
|
||||
var sessions = new FakeSessions([existing]);
|
||||
var seatingPlan = BuildSeatingPlan(group.Id, sessions);
|
||||
|
||||
var vm = new TeachingModeViewModel(lesson, group, new FakeAlternativeLessonPaths([]), seatingPlan);
|
||||
var vm = new TeachingModeViewModel(lesson, group, new FakeAlternativeLessonPaths([]),
|
||||
new FakeLessons(), seatingPlan, BuildParticipation(group, sessions));
|
||||
|
||||
Assert.Single(sessions.GetByGroup(group.Id));
|
||||
Assert.Equal(existing.Id, vm.SeatingPlan.SelectedSession?.Id);
|
||||
@@ -75,8 +112,92 @@ public sealed class TeachingModeViewModelTests
|
||||
{ GroupId = group.Id, Date = DateOnly.FromDateTime(DateTime.Today), Topic = "Redox" };
|
||||
var seatingPlan = BuildSeatingPlan(group.Id);
|
||||
|
||||
var vm = new TeachingModeViewModel(lesson, group, new FakeAlternativeLessonPaths([]), seatingPlan);
|
||||
var vm = new TeachingModeViewModel(lesson, group, new FakeAlternativeLessonPaths([]),
|
||||
new FakeLessons(), seatingPlan, BuildParticipation(group));
|
||||
|
||||
Assert.False(vm.SeatingPlan.IsEditable);
|
||||
}
|
||||
|
||||
// ── Hausaufgabe: letzte Stunde ansehen/abhaken, aktuelle einsehen/ändern ─────
|
||||
|
||||
[Fact]
|
||||
public void Konstruktor_FindetHausaufgabeDerVorherigenStunde()
|
||||
{
|
||||
var group = new LearningGroup { Name = "Q1 Chemie" };
|
||||
var today = DateOnly.FromDateTime(DateTime.Today);
|
||||
var previous = new Lesson
|
||||
{
|
||||
GroupId = group.Id, Date = today.AddDays(-7), Topic = "Säuren",
|
||||
Homework = "S. 42, Aufgabe 3", HomeworkChecked = false,
|
||||
};
|
||||
var lesson = new Lesson { GroupId = group.Id, Date = today, Topic = "Redox" };
|
||||
var lessons = new FakeLessons();
|
||||
lessons.Add(previous);
|
||||
var seatingPlan = BuildSeatingPlan(group.Id);
|
||||
|
||||
var vm = new TeachingModeViewModel(lesson, group, new FakeAlternativeLessonPaths([]),
|
||||
lessons, seatingPlan, BuildParticipation(group));
|
||||
|
||||
Assert.True(vm.Homework.HasPreviousHomework);
|
||||
Assert.Equal("S. 42, Aufgabe 3", vm.Homework.PreviousHomeworkText);
|
||||
Assert.Contains("Säuren", vm.Homework.PreviousLessonLabel);
|
||||
Assert.False(vm.Homework.PreviousHomeworkChecked);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Konstruktor_IgnoriertVorherigeStundeOhneHausaufgabe()
|
||||
{
|
||||
var group = new LearningGroup { Name = "Q1 Chemie" };
|
||||
var today = DateOnly.FromDateTime(DateTime.Today);
|
||||
var previous = new Lesson { GroupId = group.Id, Date = today.AddDays(-7), Topic = "Säuren" };
|
||||
var lesson = new Lesson { GroupId = group.Id, Date = today, Topic = "Redox" };
|
||||
var lessons = new FakeLessons();
|
||||
lessons.Add(previous);
|
||||
var seatingPlan = BuildSeatingPlan(group.Id);
|
||||
|
||||
var vm = new TeachingModeViewModel(lesson, group, new FakeAlternativeLessonPaths([]),
|
||||
lessons, seatingPlan, BuildParticipation(group));
|
||||
|
||||
Assert.False(vm.Homework.HasPreviousHomework);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void PreviousHomeworkChecked_SpeichertSofortAnDerVorherigenStunde()
|
||||
{
|
||||
var group = new LearningGroup { Name = "Q1 Chemie" };
|
||||
var today = DateOnly.FromDateTime(DateTime.Today);
|
||||
var previous = new Lesson
|
||||
{ GroupId = group.Id, Date = today.AddDays(-7), Topic = "Säuren", Homework = "S. 42" };
|
||||
var lesson = new Lesson { GroupId = group.Id, Date = today, Topic = "Redox" };
|
||||
var lessons = new FakeLessons();
|
||||
lessons.Add(previous);
|
||||
var seatingPlan = BuildSeatingPlan(group.Id);
|
||||
var vm = new TeachingModeViewModel(lesson, group, new FakeAlternativeLessonPaths([]),
|
||||
lessons, seatingPlan, BuildParticipation(group));
|
||||
|
||||
vm.Homework.PreviousHomeworkChecked = true;
|
||||
|
||||
var saved = Assert.Single(lessons.GetByGroupAndRange(group.Id, today.AddDays(-120), today.AddDays(-1)));
|
||||
Assert.True(saved.HomeworkChecked);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SaveCurrentHomework_SchreibtAufDieAktuelleStunde()
|
||||
{
|
||||
var group = new LearningGroup { Name = "Q1 Chemie" };
|
||||
var lesson = new Lesson
|
||||
{ GroupId = group.Id, Date = DateOnly.FromDateTime(DateTime.Today), Topic = "Redox" };
|
||||
var lessons = new FakeLessons();
|
||||
lessons.Add(lesson);
|
||||
var seatingPlan = BuildSeatingPlan(group.Id);
|
||||
var vm = new TeachingModeViewModel(lesson, group, new FakeAlternativeLessonPaths([]),
|
||||
lessons, seatingPlan, BuildParticipation(group));
|
||||
|
||||
vm.Homework.CurrentHomework = "AB 7 fertigstellen";
|
||||
vm.Homework.SaveCurrentHomeworkCommand.Execute(null);
|
||||
|
||||
var saved = Assert.Single(lessons.GetByGroupAndRange(group.Id, lesson.Date, lesson.Date));
|
||||
Assert.Equal("AB 7 fertigstellen", saved.Homework);
|
||||
Assert.Equal("Gespeichert.", vm.Homework.SaveStatus);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user