Persönliche Klausurlast pro Woche, Mitarbeit-Reset und Sitzplan-Strichliste
CI / build-and-test (push) Canceled after 0s
CI / build-and-test (push) Canceled after 0s
- Klausuren: neuer ExamWeekLoadService zählt eigene Klausuren je ISO-Woche über alle Kurse hinweg (Klassen-Kollisionen deckt bereits der externe Klausurplaner ab). Hinweis direkt im ExamDialog beim Datum, zusätzlich neue Dashboard-Karte "Klausurwochen" für die 60-Tage-Vorausschau. - Mitarbeit: Schnelleingabe-Dialog kann eine Bewertung jetzt per Entf auf "nicht bewertet" zurücksetzen (bisher nur im Sitzplatz-Dialog möglich). - Sitzplan: Strichliste "gemeldet"/"gemeldet und drangekommen" direkt auf der Sitzplatz-Kachel (ParticipationEntry.RaisedHandCount/CalledOnCount); schlägt im Sitzplatz-Dialog eine Quantitätsbewertung vor (ein Klick zum Übernehmen, nie automatisch). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -483,6 +483,35 @@ public sealed class SeatingPlanViewModelTests
|
||||
Assert.True(entry.HomeworkMissing);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SitzplatzBewertung_SchlaegtQuantitaetAusStrichlisteVor()
|
||||
{
|
||||
var groupId = Guid.NewGuid();
|
||||
var studentId = Guid.NewGuid();
|
||||
var today = DateOnly.FromDateTime(DateTime.Today);
|
||||
var session = new ParticipationSession { GroupId = groupId, Date = today };
|
||||
var sessions = new FakeSessions([session]);
|
||||
var entries = new FakeEntries();
|
||||
entries.Add(new ParticipationEntry { SessionId = session.Id, StudentId = studentId, RaisedHandCount = 3 });
|
||||
|
||||
var vm = new SeatAssessmentViewModel(sessions, entries, new FakeAspects(),
|
||||
groupId, studentId, "Beispiel, Anna", canEdit: true);
|
||||
|
||||
var quantityRow = vm.AspectRows.Single(r => r.Key == "quantity");
|
||||
Assert.True(quantityRow.HasSuggestion);
|
||||
Assert.Equal(0, quantityRow.SuggestedValue); // 3 gemeldet -> "∼" laut ParticipationCountSuggestion
|
||||
Assert.Contains("3× gemeldet", quantityRow.SuggestionLabel);
|
||||
|
||||
var qualityRow = vm.AspectRows.Single(r => r.Key == "quality");
|
||||
Assert.False(qualityRow.HasSuggestion);
|
||||
|
||||
quantityRow.ApplySuggestionCommand.Execute(null);
|
||||
|
||||
Assert.Equal(0, quantityRow.Value);
|
||||
var updatedEntry = entries.GetBySessionAndStudent(session.Id, studentId)!;
|
||||
Assert.Equal(0, updatedEntry.Ratings.Single(r => r.Key == "quantity").Value);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SitzplatzBewertung_ArchiviertOhneSitzung_LegtKeineNeueSitzungAn()
|
||||
{
|
||||
@@ -517,6 +546,60 @@ public sealed class SeatingPlanViewModelTests
|
||||
Assert.Null(vm.SelectedSession);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TallyRaisedHand_ErhoehtNurGemeldetZaehler()
|
||||
{
|
||||
var groupId = Guid.NewGuid();
|
||||
var student = new Student { FirstName = "Anna", LastName = "A" };
|
||||
var plan = new SeatingPlan
|
||||
{
|
||||
GroupId = groupId, Name = "Standard", Rows = 1, Columns = 1,
|
||||
Assignments = [new SeatAssignment { StudentId = student.Id }],
|
||||
};
|
||||
var sessions = new FakeSessions([]);
|
||||
var entries = new FakeEntries();
|
||||
var vm = new SeatingPlanTabViewModel(new FakeSeatingPlans([plan]), new FakeStudents([student]),
|
||||
new FakeMemberships([new GroupMembership { GroupId = groupId, StudentId = student.Id }]),
|
||||
sessions, entries, new FakeAspects());
|
||||
vm.Initialize(groupId, isReadOnly: false);
|
||||
var seat = vm.Seats.Single();
|
||||
|
||||
seat.TallyRaisedHandCommand.Execute(null);
|
||||
seat.TallyRaisedHandCommand.Execute(null);
|
||||
|
||||
Assert.Equal(2, seat.RaisedHandCount);
|
||||
Assert.Equal(0, seat.CalledOnCount);
|
||||
var session = Assert.Single(sessions.GetByGroup(groupId));
|
||||
var entry = entries.GetBySessionAndStudent(session.Id, student.Id)!;
|
||||
Assert.Equal(2, entry.RaisedHandCount);
|
||||
Assert.Equal(0, entry.CalledOnCount);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TallyCalledOn_ErhoehtBeideZaehler()
|
||||
{
|
||||
var groupId = Guid.NewGuid();
|
||||
var student = new Student { FirstName = "Anna", LastName = "A" };
|
||||
var plan = new SeatingPlan
|
||||
{
|
||||
GroupId = groupId, Name = "Standard", Rows = 1, Columns = 1,
|
||||
Assignments = [new SeatAssignment { StudentId = student.Id }],
|
||||
};
|
||||
var sessions = new FakeSessions([]);
|
||||
var entries = new FakeEntries();
|
||||
var vm = new SeatingPlanTabViewModel(new FakeSeatingPlans([plan]), new FakeStudents([student]),
|
||||
new FakeMemberships([new GroupMembership { GroupId = groupId, StudentId = student.Id }]),
|
||||
sessions, entries, new FakeAspects());
|
||||
vm.Initialize(groupId, isReadOnly: false);
|
||||
var seat = vm.Seats.Single();
|
||||
|
||||
seat.TallyRaisedHandCommand.Execute(null); // erste Meldung, nicht drangekommen
|
||||
seat.TallyCalledOnCommand.Execute(null); // zweite Meldung, drangekommen
|
||||
|
||||
Assert.Equal(2, seat.RaisedHandCount);
|
||||
Assert.Equal(1, seat.CalledOnCount);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task AssessStudent_LegtErstBeiTatsaechlicherBewertungEineSitzungAn()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user