QuestPDF als PDF-Bibliothek eingeführt (11.3), bewusst nur in LehrerApp.Desktop referenziert - zieht SkiaSharp-Native-Binaries mit, die im Server-Docker-Image nichts verloren haben. Neuer PdfExportService mit gemeinsamem Kopf-/Fußzeilen-Layout (Titel, Stand-Datum, Seitenzahlen) und schlanken Druck-DTOs statt ViewModels, damit die Erzeugung ohne Avalonia-Bezug testbar bleibt. Speicherdialog läuft über den bestehenden ExportService (neues PDF-Format). Fünf Druckvorlagen (11.4) als "Als PDF"-Button direkt in der jeweiligen Ansicht: - Sitzplan: Raster mit Tafel-Banner, Tischabständen als echte Lücken, ausgeblendeten Plätzen als leere Rasterposition. - Notenliste: druckt exakt die aktuell angezeigte Matrix (Zeitraum/Darstellung/Sortierung). - Klausur-Notenspiegel: Kennzahlen, Notenverteilung und Aufgabenanalyse mit Balkendiagrammen, auffällig schwache Aufgaben rot markiert. - Kompetenzbericht: Analyse-Tabelle für den ausgewählten Schüler (erledigt zugleich 8.3.3). - Schülerdokumentation: alle Einträge chronologisch, vertrauliche/Entwurfs-Einträge markiert. Layout an gerenderten Muster-PDFs visuell geprüft, nicht nur per Unit-Test. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
72 lines
3.9 KiB
XML
72 lines
3.9 KiB
XML
<UserControl xmlns="https://github.com/avaloniaui"
|
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
xmlns:vm="clr-namespace:LehrerApp.Desktop.ViewModels.Groups"
|
|
x:Class="LehrerApp.Desktop.Views.Groups.CompetencyOverviewTabView"
|
|
x:DataType="vm:CompetencyOverviewTabViewModel">
|
|
<Grid RowDefinitions="Auto,*" Margin="20">
|
|
<StackPanel Grid.Row="0" Spacing="10" Margin="0,0,0,12">
|
|
<Grid ColumnDefinitions="*,Auto">
|
|
<StackPanel Grid.Column="0" Spacing="3">
|
|
<TextBlock Text="Kompetenzübersicht" FontSize="18" FontWeight="SemiBold"/>
|
|
<TextBlock Text="{Binding Summary}" FontSize="12" Opacity="0.65"/>
|
|
</StackPanel>
|
|
<StackPanel Grid.Column="1" Orientation="Horizontal" Spacing="8" VerticalAlignment="Top">
|
|
<Button Content="Als PDF" Click="OnExportPdfClick" IsEnabled="{Binding HasRows}"/>
|
|
<Button Content="Aktualisieren" Command="{Binding RefreshCommand}"/>
|
|
</StackPanel>
|
|
</Grid>
|
|
|
|
<Grid ColumnDefinitions="*,16,210" IsVisible="{Binding HasRows}">
|
|
<StackPanel Grid.Column="0" Spacing="4">
|
|
<TextBlock Text="Schülerprofil" FontSize="12" Opacity="0.7"/>
|
|
<ComboBox ItemsSource="{Binding StudentOptions}" SelectedItem="{Binding SelectedStudent}"
|
|
PlaceholderText="Keine Schüler vorhanden" IsEnabled="{Binding HasStudents}">
|
|
<ComboBox.ItemTemplate>
|
|
<DataTemplate x:DataType="vm:CompetencyStudentOption">
|
|
<TextBlock Text="{Binding DisplayName}"/>
|
|
</DataTemplate>
|
|
</ComboBox.ItemTemplate>
|
|
</ComboBox>
|
|
</StackPanel>
|
|
<StackPanel Grid.Column="2" Spacing="4">
|
|
<TextBlock Text="{Binding ThresholdLabel}" FontSize="12" Opacity="0.7"/>
|
|
<NumericUpDown Value="{Binding ReviewThreshold}" Minimum="0" Maximum="100"
|
|
Increment="5" FormatString="0"/>
|
|
</StackPanel>
|
|
</Grid>
|
|
|
|
<TextBlock Text="Prozentwerte beruhen auf bewerteten Klausuraufgaben. Eine Aufgabe mit mehreren Kompetenzcodes zählt für jede dieser Kompetenzen."
|
|
TextWrapping="Wrap" FontSize="11" Opacity="0.55" IsVisible="{Binding HasRows}"/>
|
|
</StackPanel>
|
|
|
|
<Grid Grid.Row="1">
|
|
<TextBlock Text="{Binding EmptyMessage}" Classes="emptyhint"
|
|
HorizontalAlignment="Center" VerticalAlignment="Center"
|
|
TextWrapping="Wrap" MaxWidth="520"
|
|
IsVisible="{Binding !HasRows}"/>
|
|
|
|
<DataGrid ItemsSource="{Binding Rows}" AutoGenerateColumns="False" IsReadOnly="True"
|
|
GridLinesVisibility="Horizontal" CanUserReorderColumns="False"
|
|
CanUserResizeColumns="True" IsVisible="{Binding HasRows}">
|
|
<DataGrid.Columns>
|
|
<DataGridTextColumn Header="Bereich" Binding="{Binding Domain}" Width="170"/>
|
|
<DataGridTextColumn Header="Code" Binding="{Binding Code}" Width="75"/>
|
|
<DataGridTextColumn Header="Kompetenz" Binding="{Binding Description}" Width="2*"/>
|
|
<DataGridTextColumn Header="Unterricht" Binding="{Binding InstructionCoverage}" Width="145"/>
|
|
<DataGridTextColumn Header="Klausuren" Binding="{Binding ExamCoverage}" Width="135"/>
|
|
<DataGridTextColumn Header="Gruppenmittel" Binding="{Binding GroupResult}" Width="210"/>
|
|
<DataGridTextColumn Header="Ausgewählter Schüler" Binding="{Binding StudentResult}" Width="160"/>
|
|
<DataGridTemplateColumn Header="Hinweis" Width="155">
|
|
<DataGridTemplateColumn.CellTemplate>
|
|
<DataTemplate x:DataType="vm:CompetencyOverviewRow">
|
|
<TextBlock Text="{Binding Recommendation}" Foreground="{Binding RecommendationColor}"
|
|
FontWeight="SemiBold" VerticalAlignment="Center"/>
|
|
</DataTemplate>
|
|
</DataGridTemplateColumn.CellTemplate>
|
|
</DataGridTemplateColumn>
|
|
</DataGrid.Columns>
|
|
</DataGrid>
|
|
</Grid>
|
|
</Grid>
|
|
</UserControl>
|