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>
44 lines
2.2 KiB
XML
44 lines
2.2 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.GradeOverviewTabView"
|
||
x:DataType="vm:GradeOverviewTabViewModel">
|
||
|
||
<Grid RowDefinitions="Auto,*">
|
||
|
||
<StackPanel Grid.Row="0" Orientation="Horizontal" Spacing="8" Margin="0,0,0,8">
|
||
<TextBlock Text="Zeitraum:" VerticalAlignment="Center"/>
|
||
<ComboBox ItemsSource="{Binding PeriodOptions}" SelectedItem="{Binding SelectedPeriod}" MinWidth="170"/>
|
||
|
||
<ToggleButton Content="Punkte anzeigen" IsChecked="{Binding ShowAsPoints}"
|
||
IsVisible="{Binding CanTogglePointsView}" Margin="12,0,0,0"/>
|
||
|
||
<Button Content="Sortierung: Name" Command="{Binding SortByNameCommand}" Margin="12,0,0,0"/>
|
||
<Button Content="Sortierung: Gesamt" Command="{Binding SortByTotalCommand}"/>
|
||
|
||
<Button Content="Noten verwalten" Command="{Binding ManageStudentGradesCommand}" Margin="12,0,0,0"
|
||
IsVisible="{Binding SelectedRow, Converter={x:Static ObjectConverters.IsNotNull}}"
|
||
IsEnabled="{Binding !IsReadOnly}"/>
|
||
<Button Content="+ Sammelnote" Command="{Binding CollectiveGradeCommand}" IsEnabled="{Binding !IsReadOnly}"/>
|
||
<Button Content="Zeugnisnoten" Command="{Binding ReportGradesCommand}" IsEnabled="{Binding !IsReadOnly}"/>
|
||
<Button Content="Als PDF" Click="OnExportPdfClick" Margin="12,0,0,0"
|
||
IsEnabled="{Binding !!Rows.Count}"/>
|
||
</StackPanel>
|
||
|
||
<DataGrid Grid.Row="1"
|
||
x:Name="GradesGrid"
|
||
ItemsSource="{Binding Rows}"
|
||
SelectedItem="{Binding SelectedRow}"
|
||
AutoGenerateColumns="False"
|
||
IsReadOnly="True"
|
||
GridLinesVisibility="All"
|
||
CanUserReorderColumns="False"
|
||
CanUserResizeColumns="True"/>
|
||
|
||
<TextBlock Grid.Row="1" Text="Keine Schüler in dieser Gruppe."
|
||
HorizontalAlignment="Center" VerticalAlignment="Center"
|
||
Opacity="0.35" FontSize="14"
|
||
IsVisible="{Binding !Rows.Count}"/>
|
||
</Grid>
|
||
</UserControl>
|