Kurs-Übersicht: fehlende Hausaufgaben; Erinnerungen als eigene Aufgabenart; Kalender-/Sitzplan-Bugfixes
Kurs-Übersicht: neue Karte "Fehlende Hausaufgaben" listet Schüler mit nicht gemachter Hausaufgabe aus der letzten Mitarbeitssitzung. Aufgabenverwaltung: WorkTask.Kind unterscheidet jetzt Arbeitsaufträge von reinen Erinnerungen ohne Zeitbezug (z.B. "morgen Ansage an die Klasse machen") - eigener Button "🔔 Erinnerung", eigenes Icon in Liste/Dashboard, läuft nicht in die Zeitauswertung ein. Drei Bugfixes aus Nutzer-Feedback: - Dashboard-Kalender zeigte eine Stunde doppelt, wenn sie über "Sitzung erzeugen" mit einer Mitarbeitssitzung verknüpft war. - Der Sitzplan-Tab legte beim bloßen Öffnen einer Gruppe (nicht erst bei echter Nutzung) eine leere "Sitzplan"-Sitzung für heute an. - Der "Meine Klasse"-Ring im Kalender erschien erst, sobald für den Tag eine Lesson existierte, statt schon laut Stundenplan. Außerdem: Drawer-Icons pinnen jetzt explizit auf die farbige Emoji-Schrift (Windows kann sonst je nach Font-Fallback auf eine einfarbige Variante ausweichen). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -76,22 +76,39 @@ public partial class SeatingPlanTabViewModel : ObservableObject
|
||||
NotifyCommands();
|
||||
}
|
||||
|
||||
/// Legt bewusst KEINE Sitzung an, nur weil der Tab geöffnet wird — Initialize() läuft für
|
||||
/// jede Gruppe schon beim bloßen Navigieren zur Kursübersicht (GroupDetailViewModel.LoadGroup),
|
||||
/// unabhängig davon, ob der Sitzplan-Tab überhaupt angesehen wird. Eine Sitzung entsteht erst
|
||||
/// bei der ersten tatsächlichen Bewertung/Markierung, siehe EnsureTodaySession().
|
||||
private void LoadTodaySessions()
|
||||
{
|
||||
TodaySessions.Clear();
|
||||
var today = DateOnly.FromDateTime(DateTime.Today);
|
||||
var sessions = _sessions.GetByGroup(_groupId).Where(s => s.Date == today)
|
||||
.OrderBy(s => s.CreatedAt).ToList();
|
||||
if (sessions.Count == 0 && !_isReadOnly)
|
||||
{
|
||||
var created = new ParticipationSession { GroupId = _groupId, Date = today, Comment = "Sitzplan" };
|
||||
_sessions.Save(created);
|
||||
sessions.Add(created);
|
||||
}
|
||||
foreach (var session in sessions) TodaySessions.Add(new ParticipationSessionOption(session));
|
||||
SelectedSession = TodaySessions.LastOrDefault();
|
||||
}
|
||||
|
||||
/// Legt bei Bedarf die "Sitzung für heute" an, mit der Sitzplan-Bewertungen/-Markierungen
|
||||
/// verknüpft werden — aber erst, wenn tatsächlich etwas bewertet/markiert wird (AssessStudent/
|
||||
/// ToggleSituationTag), nicht schon beim Öffnen des Tabs.
|
||||
private ParticipationSessionOption? EnsureTodaySession()
|
||||
{
|
||||
if (SelectedSession is not null) return SelectedSession;
|
||||
if (!IsEditable) return null;
|
||||
|
||||
var created = new ParticipationSession
|
||||
{
|
||||
GroupId = _groupId, Date = DateOnly.FromDateTime(DateTime.Today), Comment = "Sitzplan",
|
||||
};
|
||||
_sessions.Save(created);
|
||||
var option = new ParticipationSessionOption(created);
|
||||
TodaySessions.Add(option);
|
||||
SelectedSession = option;
|
||||
return option;
|
||||
}
|
||||
|
||||
partial void OnSelectedSessionChanged(ParticipationSessionOption? value) => RefreshSeatLessonData();
|
||||
|
||||
private void LoadStudentOptions()
|
||||
@@ -193,19 +210,21 @@ public partial class SeatingPlanTabViewModel : ObservableObject
|
||||
|
||||
private void ToggleSituationTag(SeatCellViewModel seat, string tag)
|
||||
{
|
||||
if (!IsEditable || _documentation is null || SelectedSession is null ||
|
||||
if (!IsEditable || _documentation is null ||
|
||||
seat.SelectedOption.StudentId is not Guid studentId) return;
|
||||
var session = EnsureTodaySession();
|
||||
if (session is null) return;
|
||||
var draft = _documentation.GetByStudent(studentId)
|
||||
.FirstOrDefault(d => d.IsDraft && d.ParticipationSessionId == SelectedSession.Id);
|
||||
.FirstOrDefault(d => d.IsDraft && d.ParticipationSessionId == session.Id);
|
||||
if (draft is null)
|
||||
{
|
||||
draft = new Documentation
|
||||
{
|
||||
StudentId = studentId, GroupId = _groupId,
|
||||
ParticipationSessionId = SelectedSession.Id,
|
||||
LessonId = SelectedSession.LessonId,
|
||||
ParticipationSessionId = session.Id,
|
||||
LessonId = session.LessonId,
|
||||
Type = DocumentationType.Incident,
|
||||
Date = SelectedSession.Date,
|
||||
Date = session.Date,
|
||||
Title = tag,
|
||||
IsDraft = true,
|
||||
Tags = [tag],
|
||||
@@ -297,9 +316,10 @@ public partial class SeatingPlanTabViewModel : ObservableObject
|
||||
public async Task AssessStudent(SeatCellViewModel seat)
|
||||
{
|
||||
if (!seat.SelectedOption.StudentId.HasValue || OnAssessStudent is null) return;
|
||||
var session = EnsureTodaySession();
|
||||
var assessment = new SeatAssessmentViewModel(_sessions, _participation, _aspects,
|
||||
_groupId, seat.SelectedOption.StudentId.Value, seat.SelectedOption.DisplayName, IsEditable,
|
||||
SelectedSession?.Id);
|
||||
session?.Id);
|
||||
await OnAssessStudent(assessment);
|
||||
RefreshSeatLessonData();
|
||||
OnAssessmentChanged?.Invoke();
|
||||
|
||||
Reference in New Issue
Block a user