feat: expand teaching mode with live timeline and seating quick checks
CI / build-and-test (push) Canceled after 0s
CI / build-and-test (push) Canceled after 0s
This commit is contained in:
@@ -16,6 +16,45 @@ public partial class SeatingPlanTabViewModel : ObservableObject
|
||||
private readonly IParticipationRepository _participation;
|
||||
private readonly IParticipationAspectRepository _aspects;
|
||||
private readonly IDocumentationRepository? _documentation;
|
||||
[ObservableProperty] private bool _isTeachingMode;
|
||||
[ObservableProperty] private string _quickMode = "";
|
||||
public bool IsQuickMode => QuickMode.Length > 0;
|
||||
public string QuickModeDisplay => QuickMode switch
|
||||
{
|
||||
"Attendance" => "Anwesenheit kontrollieren · Fehlend = Entschuldigung offen",
|
||||
"Homework" => "Hausaufgaben kontrollieren",
|
||||
_ => "Klicken: bewerten"
|
||||
};
|
||||
[RelayCommand] private void CheckAttendance() => QuickMode = "Attendance";
|
||||
[RelayCommand] private void CheckHomework() => QuickMode = "Homework";
|
||||
[RelayCommand] private void EndQuickCheck() => QuickMode = "";
|
||||
partial void OnQuickModeChanged(string value)
|
||||
{
|
||||
if (value.Length > 0) IsEditMode = false;
|
||||
foreach (var seat in Seats) seat.QuickMode = value;
|
||||
OnPropertyChanged(nameof(IsQuickMode));
|
||||
OnPropertyChanged(nameof(QuickModeDisplay));
|
||||
}
|
||||
|
||||
private void SaveQuickStatus(SeatCellViewModel seat, bool positive)
|
||||
{
|
||||
if (!IsEditable || !IsQuickMode || seat.SelectedOption.StudentId is not Guid studentId) return;
|
||||
var session = EnsureTodaySession();
|
||||
if (session is null) return;
|
||||
// Always merge with the latest entry, so quick checks preserve ratings and counters.
|
||||
var entry = _participation.GetBySessionAndStudent(session.Id, studentId)
|
||||
?? new ParticipationEntry { SessionId = session.Id, StudentId = studentId };
|
||||
if (QuickMode == "Attendance") entry.Attendance = positive ? AttendanceStatus.Present : AttendanceStatus.ExcusePending;
|
||||
else
|
||||
{
|
||||
entry.Homework = positive ? HomeworkStatus.Completed : HomeworkStatus.MissingOpen;
|
||||
entry.HomeworkMissing = HomeworkDisplay.CountsAsMissing(entry.Homework);
|
||||
}
|
||||
_participation.Save(entry);
|
||||
RefreshSeatLessonData();
|
||||
OnAssessmentChanged?.Invoke();
|
||||
}
|
||||
|
||||
private Guid _groupId;
|
||||
private SeatingPlan? _currentPlan;
|
||||
private bool _isReadOnly;
|
||||
@@ -235,7 +274,12 @@ public partial class SeatingPlanTabViewModel : ObservableObject
|
||||
?? StudentSeatOption.Empty;
|
||||
var isHidden = hiddenSeats.Any(h => h.Row == row && h.Column == column);
|
||||
Seats.Add(new SeatCellViewModel(row, column, StudentOptions, option, OnSeatChanged,
|
||||
CanEditLayout, ToggleSituationTag, IsEditable, isHidden, ToggleSeatHidden, TallyParticipation));
|
||||
CanEditLayout, ToggleSituationTag, IsEditable, isHidden, ToggleSeatHidden, TallyParticipation)
|
||||
{
|
||||
QuickMode = QuickMode,
|
||||
OnQuickStatus = SaveQuickStatus,
|
||||
OnQuickSpecial = AssessStudent
|
||||
});
|
||||
}
|
||||
UpdateAssignmentSummary();
|
||||
RefreshSeatLessonData();
|
||||
@@ -488,6 +532,7 @@ public partial class SeatingPlanTabViewModel : ObservableObject
|
||||
|
||||
partial void OnIsEditModeChanged(bool value)
|
||||
{
|
||||
if (value) QuickMode = "";
|
||||
OnPropertyChanged(nameof(CanEditLayout));
|
||||
foreach (var seat in Seats)
|
||||
{
|
||||
@@ -540,6 +585,32 @@ public sealed class ParticipationSessionOption(ParticipationSession session)
|
||||
|
||||
public partial class SeatCellViewModel : ObservableObject
|
||||
{
|
||||
[ObservableProperty] private string _quickMode = "";
|
||||
public bool ShowQuickCheck => QuickMode.Length > 0 && IsOccupied && CanRecordLesson;
|
||||
public bool ShowNormalActions => ShowLessonOverview && QuickMode.Length == 0;
|
||||
public bool ShowSituationActions => ShowNormalActions && CanRecordLesson;
|
||||
public string QuickPositiveLabel => QuickMode == "Attendance" ? "Anwesend" : "Gemacht";
|
||||
public string QuickNegativeLabel => QuickMode == "Attendance" ? "Fehlend" : "Fehlt";
|
||||
public Action<SeatCellViewModel, bool>? OnQuickStatus { get; init; }
|
||||
public Func<SeatCellViewModel, Task>? OnQuickSpecial { get; init; }
|
||||
[RelayCommand] private void QuickPositive() => OnQuickStatus?.Invoke(this, true);
|
||||
[RelayCommand] private void QuickNegative() => OnQuickStatus?.Invoke(this, false);
|
||||
[RelayCommand] private Task QuickSpecial() => OnQuickSpecial?.Invoke(this) ?? Task.CompletedTask;
|
||||
partial void OnQuickModeChanged(string value)
|
||||
{
|
||||
OnPropertyChanged(nameof(ShowQuickCheck));
|
||||
OnPropertyChanged(nameof(ShowNormalActions));
|
||||
OnPropertyChanged(nameof(ShowSituationActions));
|
||||
OnPropertyChanged(nameof(QuickPositiveLabel));
|
||||
OnPropertyChanged(nameof(QuickNegativeLabel));
|
||||
OnPropertyChanged(nameof(DisplayOpacity));
|
||||
}
|
||||
partial void OnCanRecordLessonChanged(bool value)
|
||||
{
|
||||
OnPropertyChanged(nameof(ShowQuickCheck));
|
||||
OnPropertyChanged(nameof(ShowSituationActions));
|
||||
}
|
||||
|
||||
private readonly Action<SeatCellViewModel> _onChanged;
|
||||
private bool _suppressChange;
|
||||
private readonly Action<SeatCellViewModel, string> _toggleSituationTag;
|
||||
@@ -581,7 +652,7 @@ public partial class SeatCellViewModel : ObservableObject
|
||||
/// Opacity ist im DataTemplate bereits lokal an LessonOpacity gebunden gewesen; ein lokal
|
||||
/// gebundener Wert überschreibt aber jeden Style-Setter für dieselbe Eigenschaft, daher muss
|
||||
/// die Abblendung für ausgeblendete Plätze hier statt per CSS-Klasse erfolgen.</summary>
|
||||
public double DisplayOpacity => IsHidden ? 0.4 : LessonOpacity;
|
||||
public double DisplayOpacity => IsHidden ? 0.4 : ShowQuickCheck ? 1 : LessonOpacity;
|
||||
|
||||
private readonly Action<SeatCellViewModel, bool> _tally;
|
||||
|
||||
@@ -615,6 +686,9 @@ public partial class SeatCellViewModel : ObservableObject
|
||||
|
||||
partial void OnSelectedOptionChanged(StudentSeatOption value)
|
||||
{
|
||||
OnPropertyChanged(nameof(ShowQuickCheck));
|
||||
OnPropertyChanged(nameof(ShowNormalActions));
|
||||
OnPropertyChanged(nameof(ShowSituationActions));
|
||||
OnPropertyChanged(nameof(IsOccupied));
|
||||
OnPropertyChanged(nameof(StudentName));
|
||||
OnPropertyChanged(nameof(ShowLessonOverview));
|
||||
@@ -624,6 +698,8 @@ public partial class SeatCellViewModel : ObservableObject
|
||||
|
||||
partial void OnCanEditChanged(bool value)
|
||||
{
|
||||
OnPropertyChanged(nameof(ShowNormalActions));
|
||||
OnPropertyChanged(nameof(ShowSituationActions));
|
||||
OnPropertyChanged(nameof(ShowLessonOverview));
|
||||
OnPropertyChanged(nameof(ShowSeat));
|
||||
OnPropertyChanged(nameof(CanToggleHidden));
|
||||
|
||||
Reference in New Issue
Block a user