CI / build-and-test (push) Canceled after 0s
Lesson bekommt ein neues Freitextfeld PlanningIdeas fuer grobe Ideen vor der Feinplanung, sichtbar im LessonDialog und als Kontext an die KI-Planung (Backend + MCP) durchgereicht. LessonPhaseStep.MaterialPrompt speichert den beim Uebernehmen einer KI-Stunde erzeugten Materialerstellungs-Prompt dauerhaft, statt ihn nur einmalig im AiAssistDialog anzuzeigen - im Verlaufsplan-Editor ueber einen neuen Kopieren-Button je Phase erneut nutzbar, auch ueber MCP lesbar/schreibbar. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
206 lines
14 KiB
XML
206 lines
14 KiB
XML
<Window xmlns="https://github.com/avaloniaui"
|
||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||
xmlns:vm="clr-namespace:LehrerApp.Desktop.ViewModels.Groups"
|
||
xmlns:vms="clr-namespace:LehrerApp.Desktop.ViewModels.Students"
|
||
x:Class="LehrerApp.Desktop.Views.Groups.LessonDialog"
|
||
x:DataType="vm:LessonDialogViewModel"
|
||
Title="{Binding DialogTitle}"
|
||
Width="1000" Height="760" MinWidth="780" MinHeight="480"
|
||
CanResize="True" WindowStartupLocation="CenterOwner">
|
||
|
||
<Grid RowDefinitions="*,Auto" Margin="24">
|
||
<ScrollViewer Grid.Row="0">
|
||
<StackPanel Spacing="14" Margin="0,0,12,0">
|
||
<StackPanel Spacing="2">
|
||
<TextBlock Text="{Binding DialogTitle}" Classes="dialogtitle"/>
|
||
<TextBlock Text="{Binding GroupSubjectDisplay}" FontSize="12" Opacity="0.6"/>
|
||
</StackPanel>
|
||
|
||
<Grid ColumnDefinitions="*,12,*,12,*,12,*">
|
||
<StackPanel Grid.Column="0" Spacing="4">
|
||
<TextBlock Text="Datum *" FontSize="12" Opacity="0.7"/>
|
||
<TextBox Text="{Binding DateText}" PlaceholderText="TT.MM.JJJJ"/>
|
||
<TextBlock Text="{Binding DateTextError}" Foreground="Red" FontSize="11"
|
||
IsVisible="{Binding DateTextError, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"/>
|
||
</StackPanel>
|
||
<StackPanel Grid.Column="2" Spacing="4">
|
||
<TextBlock Text="Stunde Nr." FontSize="12" Opacity="0.7"/>
|
||
<NumericUpDown Value="{Binding LessonNumber}" Minimum="1" Maximum="20" FormatString="0"
|
||
ShowButtonSpinner="False"/>
|
||
</StackPanel>
|
||
<StackPanel Grid.Column="4" Spacing="4">
|
||
<TextBlock Text="Beginn" FontSize="12" Opacity="0.7"
|
||
ToolTip.Tip="Optional. Solange es noch keinen Stundenplan gibt: von Hand eintragen, damit die Uhrzeiten je Phase unten abgeleitet werden können."/>
|
||
<TextBox Text="{Binding StartTimeText}" PlaceholderText="HH:MM"/>
|
||
<TextBlock Text="{Binding StartTimeTextError}" Foreground="Red" FontSize="11"
|
||
IsVisible="{Binding StartTimeTextError, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"/>
|
||
</StackPanel>
|
||
<StackPanel Grid.Column="6" Spacing="4">
|
||
<TextBlock Text="Status" FontSize="12" Opacity="0.7"/>
|
||
<ComboBox ItemsSource="{Binding StatusOptions}" SelectedItem="{Binding StatusName}"
|
||
HorizontalAlignment="Stretch"/>
|
||
</StackPanel>
|
||
</Grid>
|
||
|
||
<StackPanel Spacing="4">
|
||
<TextBlock Text="Thema *" FontSize="12" Opacity="0.7"/>
|
||
<TextBox Text="{Binding Topic}" PlaceholderText="z.B. Brechung an planparallelen Platten"/>
|
||
<TextBlock Text="{Binding TopicError}" Foreground="Red" FontSize="11"
|
||
IsVisible="{Binding TopicError, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"/>
|
||
</StackPanel>
|
||
|
||
<StackPanel Spacing="4">
|
||
<TextBlock Text="Planungsideen (Rohentwurf)" FontSize="12" Opacity="0.7"
|
||
ToolTip.Tip="Erste, noch grobe Ideen — lange bevor der Verlaufsplan unten feingeplant wird. Fließt auch als Kontext in die KI-Unterstützung (Backend und MCP) ein."/>
|
||
<TextBox Text="{Binding PlanningIdeas}" AcceptsReturn="True" Height="64" TextWrapping="Wrap"
|
||
PlaceholderText="Grobe Ideen, mögliche Aufhänger, erste Materialgedanken ..."/>
|
||
</StackPanel>
|
||
|
||
<Separator Margin="0,4"/>
|
||
|
||
<Grid ColumnDefinitions="*,Auto">
|
||
<StackPanel Grid.Column="0" Orientation="Horizontal" Spacing="10" VerticalAlignment="Center">
|
||
<TextBlock Text="Verlaufsplan" FontSize="14" FontWeight="SemiBold"/>
|
||
<TextBlock Text="{Binding TotalDurationDisplay}" FontSize="12" Opacity="0.6"
|
||
IsVisible="{Binding !HasTimeBudgetInfo}"/>
|
||
<Border Background="{Binding TimeBudgetColorHex}" CornerRadius="10" Padding="9,3"
|
||
IsVisible="{Binding HasTimeBudgetInfo}"
|
||
ToolTip.Tip="Geplante Zeit im Vergleich zur laut Stundenraster (Einstellungen) verfügbaren Zeit — bei Doppelstunden werden beide Perioden zusammengezählt.">
|
||
<TextBlock Text="{Binding TimeBudgetLabel}" FontSize="12" FontWeight="SemiBold" Foreground="White"/>
|
||
</Border>
|
||
</StackPanel>
|
||
<Button Grid.Column="1" Content="+ Phase" Command="{Binding AddPhaseCommand}"/>
|
||
</Grid>
|
||
|
||
<!-- Tabellenkopf -->
|
||
<Grid ColumnDefinitions="130,95,120,*,100,95,26,26,26,26" Margin="4,0,0,0">
|
||
<TextBlock Grid.Column="0" Text="Phase" FontSize="11" FontWeight="SemiBold" Opacity="0.6"/>
|
||
<TextBlock Grid.Column="1" Text="Pfad" FontSize="11" FontWeight="SemiBold" Opacity="0.6"
|
||
ToolTip.Tip="Ankreuzen, wenn diese Phase zu einem alternativen Ablauf gehört (z.B. Kurzversion bei Zeitnot) — öffnet die Zuweisung. Phasen mit demselben Ablauf werden im Verlaufsplan-Viewer gruppiert."/>
|
||
<TextBlock Grid.Column="2" Text="Dauer / Zeit" FontSize="11" FontWeight="SemiBold" Opacity="0.6"/>
|
||
<TextBlock Grid.Column="3" Text="Tätigkeit" FontSize="11" FontWeight="SemiBold" Opacity="0.6"/>
|
||
<TextBlock Grid.Column="4" Text="Material" FontSize="11" FontWeight="SemiBold" Opacity="0.6"/>
|
||
<TextBlock Grid.Column="5" Text="Kurzsymbol" FontSize="11" FontWeight="SemiBold" Opacity="0.6"/>
|
||
</Grid>
|
||
<Separator/>
|
||
|
||
<!-- Eine Zeile je Phase, echte Tabellenspalten nebeneinander statt gestapelter Karten. -->
|
||
<ItemsControl ItemsSource="{Binding Phases}">
|
||
<ItemsControl.ItemTemplate>
|
||
<DataTemplate x:DataType="vm:PhaseStepEditItem">
|
||
<Border BorderBrush="{DynamicResource SystemControlForegroundBaseLowBrush}"
|
||
BorderThickness="0,0,0,1" Padding="0,8">
|
||
<Grid ColumnDefinitions="130,95,120,*,100,95,26,26,26,26">
|
||
<TextBox Grid.Column="0" Text="{Binding Name}" PlaceholderText="z.B. Erarbeitung"
|
||
VerticalAlignment="Top" Margin="0,0,6,0"/>
|
||
<CheckBox Grid.Column="1" IsChecked="{Binding HasAlternativePath}"
|
||
Content="{Binding AlternativePathName}" Foreground="{Binding AlternativePathColorHex}"
|
||
FontSize="12" VerticalAlignment="Top" Margin="0,4,6,0"
|
||
ToolTip.Tip="Teil eines alternativen Ablaufs (z.B. Kurzversion bei Zeitnot). Ankreuzen zum Zuweisen/Anlegen, abwählen zum Entfernen."/>
|
||
<StackPanel Grid.Column="2" Orientation="Horizontal" Spacing="6"
|
||
VerticalAlignment="Top" Margin="0,0,6,0">
|
||
<NumericUpDown Value="{Binding DurationMinutes}" Minimum="0" Maximum="180" Width="62"
|
||
FormatString="0" ShowButtonSpinner="False" ToolTip.Tip="Dauer in Minuten"/>
|
||
<TextBlock Text="{Binding ComputedTimeDisplay}" FontSize="12" Opacity="0.6"
|
||
VerticalAlignment="Center"/>
|
||
</StackPanel>
|
||
<TextBox Grid.Column="3" Text="{Binding Activity}" AcceptsReturn="True" TextWrapping="Wrap"
|
||
Height="56" VerticalAlignment="Top" Margin="0,0,6,0"
|
||
PlaceholderText="Lehrer-/Schüler-Tätigkeit"
|
||
ToolTip.Tip="Bei mehr Text scrollt das Feld intern."/>
|
||
<AutoCompleteBox Grid.Column="4" Text="{Binding Material}"
|
||
ItemsSource="{Binding $parent[ItemsControl].((vm:LessonDialogViewModel)DataContext).MaterialSuggestions}"
|
||
FilterMode="Contains" MinimumPrefixLength="0" VerticalAlignment="Top"
|
||
Margin="0,0,6,0" PlaceholderText="z.B. AB01"/>
|
||
<AutoCompleteBox Grid.Column="5" Text="{Binding Shorthand}"
|
||
ItemsSource="{Binding $parent[ItemsControl].((vm:LessonDialogViewModel)DataContext).ShorthandSuggestions}"
|
||
FilterMode="Contains" MinimumPrefixLength="0" VerticalAlignment="Top"
|
||
Margin="0,0,6,0" PlaceholderText="z.B. AB001->S, Plenum, LDE"
|
||
ToolTip.Tip="Freitext für den schnellen Überblick — mal ein Materialfluss-Pfeil (AB001->S), mal nur eine Sozialform (Plenum, LDE)."/>
|
||
<Button Grid.Column="6" Content="📋" Padding="4,2" VerticalAlignment="Top" Margin="0,0,2,0"
|
||
IsVisible="{Binding HasMaterialPrompt}" Click="OnCopyMaterialPrompt"
|
||
ToolTip.Tip="Gespeicherten Prompt zur Materialerstellung erneut in die Zwischenablage kopieren."/>
|
||
<Button Grid.Column="7" Content="↑" Command="{Binding MoveUpCommand}" Padding="4,2"
|
||
VerticalAlignment="Top" ToolTip.Tip="Nach oben"/>
|
||
<Button Grid.Column="8" Content="↓" Command="{Binding MoveDownCommand}" Padding="4,2"
|
||
VerticalAlignment="Top" Margin="2,0,0,0" ToolTip.Tip="Nach unten"/>
|
||
<Button Grid.Column="9" Content="✕" Command="{Binding RemoveCommand}" Padding="4,2"
|
||
VerticalAlignment="Top" Margin="2,0,0,0" ToolTip.Tip="Entfernen"/>
|
||
</Grid>
|
||
</Border>
|
||
</DataTemplate>
|
||
</ItemsControl.ItemTemplate>
|
||
</ItemsControl>
|
||
|
||
<Separator Margin="0,4"/>
|
||
|
||
<StackPanel Spacing="4">
|
||
<TextBlock Text="Hausaufgabe" FontSize="12" Opacity="0.7"/>
|
||
<TextBox Text="{Binding Homework}" AcceptsReturn="True" Height="48" TextWrapping="Wrap"/>
|
||
<StackPanel Orientation="Horizontal" Spacing="16" IsVisible="{Binding HasHomeworkText}">
|
||
<CheckBox Content="Kontrolliert" IsChecked="{Binding HomeworkChecked}"
|
||
ToolTip.Tip="Hausaufgabe wurde in einer Folgestunde besprochen — blendet das Stundenplan-Badge aus."/>
|
||
<CheckBox Content="Nicht kontrollieren" IsChecked="{Binding HomeworkCheckDismissed}"
|
||
ToolTip.Tip="Erinnerung bewusst abschalten, ohne eine Kontrolle vorzutäuschen."/>
|
||
</StackPanel>
|
||
</StackPanel>
|
||
|
||
<StackPanel Spacing="4">
|
||
<TextBlock Text="Reflexion" FontSize="12" Opacity="0.7"/>
|
||
<TextBox Text="{Binding Reflection}" AcceptsReturn="True" Height="56" TextWrapping="Wrap"
|
||
PlaceholderText="Nach der Stunde: was lief gut, was nicht?"/>
|
||
</StackPanel>
|
||
|
||
<Separator Margin="0,4"/>
|
||
|
||
<StackPanel Spacing="6">
|
||
<Grid ColumnDefinitions="*,Auto">
|
||
<TextBlock Grid.Column="0" Text="Anhänge (Material, Arbeitsblätter, Experiment-/Gefährdungsbeurteilung)"
|
||
FontSize="12" Opacity="0.7" VerticalAlignment="Center"/>
|
||
<StackPanel Grid.Column="1" Orientation="Horizontal" Spacing="6">
|
||
<Button Content="🧪 Gefährdungsbeurteilung" FontSize="12" Padding="8,4" Click="OnCreateHazardAssessment"/>
|
||
<Button Content="+ Datei" FontSize="12" Padding="8,4" Click="OnAddAttachment"/>
|
||
</StackPanel>
|
||
</Grid>
|
||
<ItemsControl ItemsSource="{Binding Attachments}">
|
||
<ItemsControl.ItemTemplate>
|
||
<DataTemplate x:DataType="vms:AttachmentItem">
|
||
<Grid ColumnDefinitions="*,Auto,Auto,Auto,Auto" Margin="0,2">
|
||
<TextBlock Grid.Column="0" Text="{Binding FileName}" VerticalAlignment="Center" FontSize="13"
|
||
TextTrimming="CharacterEllipsis"/>
|
||
<TextBlock Grid.Column="1" Text="{Binding SizeDisplay}" VerticalAlignment="Center"
|
||
FontSize="11" Opacity="0.5" Margin="6,0"/>
|
||
<Button Grid.Column="2" Content="Öffnen" FontSize="11" Padding="7,2" Margin="0,0,4,0"
|
||
Click="OnOpenHazardAssessment" Tag="{Binding}" IsVisible="{Binding IsHazardAssessment}"/>
|
||
<Button Grid.Column="2" Content="Speichern" FontSize="11" Padding="7,2" Margin="0,0,4,0"
|
||
Click="OnOpenAttachment" Tag="{Binding}" IsVisible="{Binding !IsHazardAssessment}"/>
|
||
<Button Grid.Column="3" Content="PDF" FontSize="11" Padding="7,2" Margin="0,0,4,0"
|
||
Click="OnPrintHazardAssessment" Tag="{Binding}"
|
||
IsVisible="{Binding IsHazardAssessment}"/>
|
||
<Button Grid.Column="4" Content="×" FontSize="13" Padding="7,2"
|
||
Command="{Binding $parent[ItemsControl].((vm:LessonDialogViewModel)DataContext).RemoveAttachmentCommand}"
|
||
CommandParameter="{Binding}"/>
|
||
</Grid>
|
||
</DataTemplate>
|
||
</ItemsControl.ItemTemplate>
|
||
</ItemsControl>
|
||
<TextBlock Text="{Binding AttachmentError}" Foreground="Red" FontSize="11"
|
||
IsVisible="{Binding AttachmentError, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"/>
|
||
</StackPanel>
|
||
</StackPanel>
|
||
</ScrollViewer>
|
||
|
||
<Grid Grid.Row="1" ColumnDefinitions="*,8,*,8,*" Margin="0,20,0,0">
|
||
<Button Grid.Column="0" Content="Abbrechen" HorizontalAlignment="Stretch" Click="OnCancel"/>
|
||
<Button Grid.Column="2" Content="🤖 KI-Unterstützung für diese Stunde" HorizontalAlignment="Stretch"
|
||
Click="OnAiAssist" IsVisible="{Binding CanAiAssist}"
|
||
ToolTip.Tip="Fragt die KI gezielt zu genau dieser Stunde — Speicherstand geht dabei direkt in die Datenbank, nicht über die Felder hier."/>
|
||
<Button Grid.Column="2" Content="🔧 Vorhandene Stunde verknüpfen" HorizontalAlignment="Stretch"
|
||
Click="OnFixIt" IsVisible="{Binding IsNewLesson}"
|
||
ToolTip.Tip="Sucht nach einer bereits vorhandenen Stunde (z.B. durch Import oder KI ohne Stundenplan-Bezug angelegt) und verknüpft sie mit diesem Termin, statt eine neue Stunde anzulegen."/>
|
||
<Button Grid.Column="4" Content="{Binding SaveButtonText}"
|
||
HorizontalAlignment="Stretch" Click="OnSave"/>
|
||
</Grid>
|
||
</Grid>
|
||
</Window>
|