Kurs-Übersicht gefüllt: nächste Termine, Mitarbeitshinweis, offene Kontrollen/Dokumentationen, auffällige Fehlzeiten

Der bislang leere "Übersicht"-Tab je Kurs zeigt jetzt einen kompakten
"Was steht an"-Überblick aus bereits vorhandenen Daten mit Klick-Durchsprung
in den jeweiligen Tab: nächste Stunde/Klausur, Hinweis auf die letzte
Mitarbeitssitzung, offene Hausaufgaben-Kontrolle, offene Entschuldigungen,
offene Dokumentations-Entwürfe und auffällige Fehlzeiten.

Die Fehlzeiten-Karte ist bewusst kein 1:1-Abbild der Dashboard-Warnung: erst
ab einer Mindeststichprobe von 8 erfassten Terminen im Schuljahr gemeldet,
damit ein einzelner Fehltag zu Schuljahresbeginn nicht sofort als auffällig
gilt. Das Hauptdashboard hat dasselbe Problem noch, wird dort separat
nachgezogen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-19 22:39:31 +02:00
co-authored by Claude Sonnet 5
parent f73bd6c9ec
commit 4d2a89b14b
9 changed files with 683 additions and 8 deletions
@@ -0,0 +1,149 @@
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:LehrerApp.Desktop.ViewModels.Groups"
xmlns:vmRoot="clr-namespace:LehrerApp.Desktop.ViewModels"
x:Class="LehrerApp.Desktop.Views.Groups.GroupOverviewTabView"
x:DataType="vm:GroupOverviewViewModel">
<UserControl.Styles>
<Style Selector="Border.card">
<Setter Property="Background" Value="{DynamicResource SystemControlBackgroundAltHighBrush}"/>
<Setter Property="CornerRadius" Value="8"/>
<Setter Property="Padding" Value="16"/>
<Setter Property="Margin" Value="0,0,12,12"/>
<Setter Property="MinWidth" Value="260"/>
<Setter Property="MaxWidth" Value="340"/>
</Style>
<Style Selector="TextBlock.cardTitle">
<Setter Property="FontSize" Value="11"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Opacity" Value="0.5"/>
<Setter Property="Margin" Value="0,0,0,10"/>
</Style>
<Style Selector="TextBlock.cardBody.stale">
<Setter Property="Foreground" Value="#D97706"/>
<Setter Property="FontWeight" Value="SemiBold"/>
</Style>
<Style Selector="Button.cardLink">
<Setter Property="FontSize" Value="11"/>
<Setter Property="Padding" Value="0"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Margin" Value="0,10,0,0"/>
<Setter Property="HorizontalAlignment" Value="Left"/>
</Style>
</UserControl.Styles>
<ScrollViewer Padding="20">
<StackPanel Spacing="0">
<WrapPanel>
<!-- Nächste Stunde -->
<Border Classes="card">
<StackPanel>
<TextBlock Text="NÄCHSTE STUNDE" Classes="cardTitle"/>
<TextBlock Text="{Binding NextLessonLabel}" TextWrapping="Wrap" Classes="cardBody"
IsVisible="{Binding HasNextLesson}"/>
<TextBlock Text="Keine geplante Stunde in Sicht." Classes="emptyhint"
IsVisible="{Binding !HasNextLesson}"/>
<Button Content="Zur Planung " Classes="cardLink" Command="{Binding NavigateToPlanningCommand}"/>
</StackPanel>
</Border>
<!-- Nächste Klausur -->
<Border Classes="card">
<StackPanel>
<TextBlock Text="NÄCHSTE KLAUSUR" Classes="cardTitle"/>
<TextBlock Text="{Binding NextExamLabel}" TextWrapping="Wrap" Classes="cardBody"
IsVisible="{Binding HasNextExam}"/>
<TextBlock Text="Keine Klausur geplant." Classes="emptyhint"
IsVisible="{Binding !HasNextExam}"/>
<Button Content="Zu den Klausuren " Classes="cardLink" Command="{Binding NavigateToExamsCommand}"/>
</StackPanel>
</Border>
<!-- Mitarbeit -->
<Border Classes="card">
<StackPanel>
<TextBlock Text="MITARBEIT" Classes="cardTitle"/>
<TextBlock Text="{Binding ParticipationHintLabel}" TextWrapping="Wrap"
Classes="cardBody" Classes.stale="{Binding ParticipationHintIsStale}"/>
<Button Content="Zur Mitarbeit " Classes="cardLink" Command="{Binding NavigateToParticipationCommand}"/>
</StackPanel>
</Border>
<!-- Offene Hausaufgaben-Kontrolle -->
<Border Classes="card" IsVisible="{Binding HasOpenHomeworkCheck}">
<StackPanel>
<TextBlock Text="OFFENE HAUSAUFGABEN-KONTROLLE" Classes="cardTitle"/>
<TextBlock Text="{Binding OpenHomeworkCheckLabel}" TextWrapping="Wrap" Classes="cardBody stale"/>
<Button Content="Zur Planung " Classes="cardLink" Command="{Binding NavigateToPlanningCommand}"/>
</StackPanel>
</Border>
<!-- Offene Dokumentationen -->
<Border Classes="card" IsVisible="{Binding !!DraftDocumentationCount}">
<StackPanel>
<TextBlock Text="OFFENE DOKUMENTATIONEN" Classes="cardTitle"/>
<TextBlock TextWrapping="Wrap" Classes="cardBody">
<Run Text="{Binding DraftDocumentationCount}"/>
<Run Text=" Entwurf/Entwürfe noch nicht ausformuliert."/>
</TextBlock>
<Button Content="Zur Dokumentation " Classes="cardLink" Command="{Binding NavigateToDocumentationCommand}"/>
</StackPanel>
</Border>
</WrapPanel>
<WrapPanel>
<!-- Offene Entschuldigungen -->
<Border Classes="card" MinWidth="340" MaxWidth="420"
IsVisible="{Binding HasOpenExcuses}">
<StackPanel>
<TextBlock Text="OFFENE ENTSCHULDIGUNGEN" Classes="cardTitle"/>
<ItemsControl ItemsSource="{Binding OpenExcuses}">
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="vmRoot:OpenExcuseItem">
<Grid ColumnDefinitions="*,Auto,Auto" Margin="0,4">
<StackPanel Grid.Column="0">
<TextBlock Text="{Binding StudentName}" FontSize="13" FontWeight="SemiBold"
TextTrimming="CharacterEllipsis"/>
<TextBlock Text="{Binding DateDisplay}" FontSize="11" Opacity="0.6"/>
</StackPanel>
<Button Grid.Column="1" Content="Entschuldigt" FontSize="11" Padding="7,3"
Command="{Binding MarkExcusedCommand}" Margin="0,0,4,0"/>
<Button Grid.Column="2" Content="Unentschuldigt" FontSize="11" Padding="7,3"
Command="{Binding MarkUnexcusedCommand}"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</Border>
<!-- Auffällige Fehlzeiten: bewusst zurückhaltender formuliert/gestylt als die
Fehlzeiten-Warnung im Hauptdashboard, siehe GroupOverviewViewModel.AttendanceMinSampleSize. -->
<Border Classes="card" MinWidth="340" MaxWidth="420"
IsVisible="{Binding HasAttendanceNotices}">
<StackPanel>
<TextBlock Text="AUFFÄLLIGE FEHLZEITEN" Classes="cardTitle"/>
<ItemsControl ItemsSource="{Binding AttendanceNotices}">
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="vmRoot:AttendanceWarningItem">
<Grid ColumnDefinitions="*,Auto" Margin="0,4">
<TextBlock Grid.Column="0" Text="{Binding StudentName}" FontSize="13"
TextTrimming="CharacterEllipsis" VerticalAlignment="Center"/>
<TextBlock Grid.Column="1" FontSize="12" Foreground="#D97706" FontWeight="SemiBold"
VerticalAlignment="Center">
<Run Text="{Binding AbsenceRatePercent, StringFormat={}{0:0.#}}"/>
<Run Text=" %"/>
</TextBlock>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</Border>
</WrapPanel>
</StackPanel>
</ScrollViewer>
</UserControl>