Files
LehrerApp/LehrerApp.Desktop/Views/Groups/HazardAssessmentWizardDialog.axaml
T
adminandClaude Sonnet 5 7b883555bf feat: Chemikalien-Recherche über lokale RiSU-Stoffliste (kein KI-Aufruf mehr)
Ersetzt den ursprünglichen KI-Websuche-Ansatz (GESTIS scheiterte sowohl über
Websuche als auch über direkten API-Zugriff an fehlenden schulspezifischen
Tätigkeitsbeschränkungen) durch einen reinen lokalen Datenbank-Lookup gegen die
offizielle RiSU-Stoffliste (1764 Stoffe inkl. Tätigkeitsbeschränkungs-Codes,
Legende zur Abfragezeit übersetzt statt in die Datenbank gebacken). Keine
KI-Kosten, keine Drittanbieter-Abhängigkeit mehr für diese Funktion.

HazardSubstance.AgeRestriction zu ActivityRestriction umbenannt, da die
Tätigkeitsbeschränkung mehr abdeckt als reine Altersgrenzen. Details und
verworfene Zwischenstände in TODO.md.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-20 23:43:56 +02:00

227 lines
13 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<Window 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.HazardAssessmentWizardDialog"
x:DataType="vm:HazardAssessmentWizardViewModel"
Title="{Binding DialogTitle}"
Width="720" Height="720" MinWidth="600" MinHeight="480"
CanResize="True" WindowStartupLocation="CenterOwner">
<Grid RowDefinitions="Auto,Auto,*,Auto" Margin="24">
<StackPanel Grid.Row="0" Spacing="2" Margin="0,0,0,10">
<TextBlock Text="{Binding DialogTitle}" Classes="dialogtitle"/>
<TextBlock FontSize="12" Opacity="0.7">
<Run Text="{Binding StepProgressLabel}"/>
<Run Text=" · "/>
<Run Text="{Binding StepTitle}" FontWeight="SemiBold"/>
</TextBlock>
</StackPanel>
<Border Grid.Row="1" IsVisible="{Binding CanUseAi}" Background="#FFF3E0" CornerRadius="6"
Padding="10" Margin="0,0,0,10">
<Grid ColumnDefinitions="*,Auto">
<StackPanel Grid.Column="0" Spacing="2">
<TextBlock FontSize="12" TextWrapping="Wrap">
<Run Text="🤖 KI-Entwurf auf Basis von Thema und Verlaufsplan dieser Stunde." FontWeight="SemiBold"/>
<LineBreak/>
<Run Text="⚠️ Kein rechtssicheres Dokument — bitte jede Angabe (insbesondere H-/P-Sätze und Mengen) eigenverantwortlich gegen das Sicherheitsdatenblatt prüfen, bevor du die Gefährdungsbeurteilung verwendest."/>
</TextBlock>
<TextBlock Text="{Binding AiError}" Foreground="Red" FontSize="11"
IsVisible="{Binding AiError, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"/>
</StackPanel>
<Button Grid.Column="1" Content="{Binding AiButtonLabel}" Command="{Binding RequestAiDraftCommand}"
IsEnabled="{Binding !IsAiBusy}" VerticalAlignment="Top" Margin="10,0,0,0"/>
</Grid>
</Border>
<ScrollViewer Grid.Row="2">
<StackPanel Spacing="14" Margin="0,0,12,0">
<!-- Schritt 1: Basisdaten -->
<StackPanel Spacing="10" IsVisible="{Binding IsBasicsStep}">
<StackPanel Spacing="4">
<TextBlock Text="Titel *" FontSize="12" Opacity="0.7"/>
<TextBox Text="{Binding Title}" PlaceholderText="z.B. Natrium in Wasser"/>
<TextBlock Text="{Binding TitleError}" Foreground="Red" FontSize="11"
IsVisible="{Binding TitleError, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"/>
</StackPanel>
<Grid ColumnDefinitions="*,12,*,12,*">
<StackPanel Grid.Column="0" Spacing="4">
<TextBlock Text="Klassenstufe/Kurs" FontSize="12" Opacity="0.7"/>
<TextBox Text="{Binding GroupLabel}"/>
</StackPanel>
<StackPanel Grid.Column="2" Spacing="4">
<TextBlock Text="Datum" FontSize="12" Opacity="0.7"/>
<TextBox Text="{Binding DateText}" PlaceholderText="TT.MM.JJJJ"/>
</StackPanel>
<StackPanel Grid.Column="4" Spacing="4">
<TextBlock Text="Art des Versuchs" FontSize="12" Opacity="0.7"/>
<ComboBox ItemsSource="{Binding KindOptions}" SelectedItem="{Binding KindName}"
HorizontalAlignment="Stretch"/>
</StackPanel>
</Grid>
<StackPanel Spacing="4">
<TextBlock Text="Durchführung (Kurzbeschreibung)" FontSize="12" Opacity="0.7"/>
<TextBox Text="{Binding Procedure}" AcceptsReturn="True" TextWrapping="Wrap" Height="90"/>
</StackPanel>
</StackPanel>
<!-- Schritt 2: Gefahrstoffe -->
<StackPanel Spacing="10" IsVisible="{Binding IsSubstancesStep}">
<Grid ColumnDefinitions="*,Auto">
<TextBlock Grid.Column="0" Text="Verwendete Gefahrstoffe" FontSize="13" FontWeight="SemiBold"
VerticalAlignment="Center"/>
<Button Grid.Column="1" Content=" Stoff" Command="{Binding AddSubstanceCommand}"/>
</Grid>
<TextBlock Text="Noch keine Gefahrstoffe erfasst." Classes="emptyhint"
IsVisible="{Binding !HasSubstances}"/>
<ItemsControl ItemsSource="{Binding Substances}">
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="vm:HazardSubstanceEditItem">
<Border BorderBrush="{DynamicResource SystemControlForegroundBaseLowBrush}"
BorderThickness="0,0,0,1" Padding="0,10">
<StackPanel Spacing="6">
<Grid ColumnDefinitions="*,Auto,Auto">
<TextBox Grid.Column="0" Text="{Binding Name}" PlaceholderText="Stoffname"
Margin="0,0,8,0"/>
<Button Grid.Column="1" Content="🔍 Recherchieren" Command="{Binding ResearchCommand}"
IsVisible="{Binding CanResearch}" IsEnabled="{Binding !IsResearching}"
Margin="0,0,8,0"
ToolTip.Tip="Sucht Piktogramme, Signalwort, H-/P-Sätze und Tätigkeitsbeschränkung in der RiSU-Stoffliste (Sicheres Experimentieren im Unterricht)."/>
<Button Grid.Column="2" Content="✕" Command="{Binding RemoveCommand}"
ToolTip.Tip="Stoff entfernen"/>
</Grid>
<TextBlock Text="{Binding ResearchError}" Foreground="Red" FontSize="11"
IsVisible="{Binding ResearchError, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"/>
<Grid ColumnDefinitions="*,12,140,12,140">
<StackPanel Grid.Column="0" Spacing="2">
<TextBlock Text="CAS-Nummer" FontSize="11" Opacity="0.6"/>
<TextBox Text="{Binding Cas}" PlaceholderText="z.B. 7440-23-5"/>
</StackPanel>
<StackPanel Grid.Column="2" Spacing="2">
<TextBlock Text="Menge" FontSize="11" Opacity="0.6"/>
<TextBox Text="{Binding Amount}" PlaceholderText="z.B. ca. 2 g"/>
</StackPanel>
<StackPanel Grid.Column="4" Spacing="2">
<TextBlock Text="Signalwort" FontSize="11" Opacity="0.6"/>
<TextBox Text="{Binding SignalWord}" PlaceholderText="Gefahr/Achtung"/>
</StackPanel>
</Grid>
<ItemsControl ItemsSource="{Binding PictogramOptions}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate><WrapPanel ItemSpacing="10" LineSpacing="4"/></ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="vm:GhsPictogramOption">
<CheckBox Content="{Binding Label}" IsChecked="{Binding IsSelected}" FontSize="12"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<Grid ColumnDefinitions="*,12,*">
<StackPanel Grid.Column="0" Spacing="2">
<TextBlock Text="H-Sätze" FontSize="11" Opacity="0.6"/>
<TextBox Text="{Binding HStatements}" PlaceholderText="z.B. H314, H290"/>
</StackPanel>
<StackPanel Grid.Column="2" Spacing="2">
<TextBlock Text="P-Sätze" FontSize="11" Opacity="0.6"/>
<TextBox Text="{Binding PStatements}" PlaceholderText="z.B. P280, P305+P351+P338"/>
</StackPanel>
</Grid>
<StackPanel Spacing="2">
<TextBlock Text="Tätigkeitsbeschränkung" FontSize="11" Opacity="0.6"/>
<TextBox Text="{Binding ActivityRestriction}"
PlaceholderText="z.B. Für Schüler ab der 5. Klasse freigegeben"/>
</StackPanel>
</StackPanel>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
<!-- Schritt 3: Gefährdungen & Schutzmaßnahmen -->
<StackPanel Spacing="14" IsVisible="{Binding IsHazardsStep}">
<StackPanel Spacing="6">
<TextBlock Text="Identifizierte Gefährdungen" FontSize="13" FontWeight="SemiBold"/>
<ItemsControl ItemsSource="{Binding Hazards}">
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="x:String">
<Grid ColumnDefinitions="*,Auto" Margin="0,2">
<TextBlock Grid.Column="0" Text="{Binding}" VerticalAlignment="Center"/>
<Button Grid.Column="1" Content="×" FontSize="13" Padding="7,2"
Command="{Binding $parent[ItemsControl].((vm:HazardAssessmentWizardViewModel)DataContext).RemoveHazardCommand}"
CommandParameter="{Binding}"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<Grid ColumnDefinitions="*,8,Auto">
<TextBox Grid.Column="0" Text="{Binding NewHazard}" PlaceholderText="z.B. Verätzungsgefahr an Haut/Augen"/>
<Button Grid.Column="2" Content="" Command="{Binding AddHazardCommand}"/>
</Grid>
</StackPanel>
<StackPanel Spacing="6">
<TextBlock Text="Schutzmaßnahmen" FontSize="13" FontWeight="SemiBold"/>
<ItemsControl ItemsSource="{Binding ProtectiveMeasures}">
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="x:String">
<Grid ColumnDefinitions="*,Auto" Margin="0,2">
<TextBlock Grid.Column="0" Text="{Binding}" VerticalAlignment="Center"/>
<Button Grid.Column="1" Content="×" FontSize="13" Padding="7,2"
Command="{Binding $parent[ItemsControl].((vm:HazardAssessmentWizardViewModel)DataContext).RemoveProtectiveMeasureCommand}"
CommandParameter="{Binding}"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<Grid ColumnDefinitions="*,8,Auto">
<TextBox Grid.Column="0" Text="{Binding NewProtectiveMeasure}" PlaceholderText="z.B. Schutzbrille, Handschuhe, Abzug"/>
<Button Grid.Column="2" Content="" Command="{Binding AddProtectiveMeasureCommand}"/>
</Grid>
</StackPanel>
</StackPanel>
<!-- Schritt 4: Erste Hilfe & Entsorgung -->
<StackPanel Spacing="10" IsVisible="{Binding IsFirstAidStep}">
<StackPanel Spacing="4">
<TextBlock Text="Erste Hilfe" FontSize="12" Opacity="0.7"/>
<TextBox Text="{Binding FirstAid}" AcceptsReturn="True" TextWrapping="Wrap" Height="90"/>
</StackPanel>
<StackPanel Spacing="4">
<TextBlock Text="Entsorgung" FontSize="12" Opacity="0.7"/>
<TextBox Text="{Binding Disposal}" AcceptsReturn="True" TextWrapping="Wrap" Height="70"/>
</StackPanel>
<StackPanel Spacing="4">
<TextBlock Text="Weitere Hinweise" FontSize="12" Opacity="0.7"/>
<TextBox Text="{Binding Notes}" AcceptsReturn="True" TextWrapping="Wrap" Height="60"/>
</StackPanel>
</StackPanel>
<!-- Schritt 5: Zusammenfassung -->
<StackPanel Spacing="8" IsVisible="{Binding IsSummaryStep}">
<TextBlock Text="{Binding Title}" FontSize="15" FontWeight="SemiBold"/>
<TextBlock FontSize="12" Opacity="0.7">
<Run Text="{Binding GroupLabel}"/>
<Run Text=" · "/>
<Run Text="{Binding KindName}"/>
</TextBlock>
<TextBlock Text="{Binding Procedure}" TextWrapping="Wrap"/>
<TextBlock Text="{Binding Substances.Count, StringFormat='{}{0} Gefahrstoff(e) erfasst'}" FontSize="12"/>
<TextBlock Text="Alle Angaben vor dem Einsatz noch einmal gegenprüfen." FontSize="12" Opacity="0.7"
IsVisible="{Binding IsAiAssisted}"/>
</StackPanel>
</StackPanel>
</ScrollViewer>
<Grid Grid.Row="3" ColumnDefinitions="Auto,*,Auto,8,Auto,8,Auto" Margin="0,16,0,0">
<Button Grid.Column="0" Content="Abbrechen" Click="OnCancel"/>
<Button Grid.Column="2" Content="Zurück" Command="{Binding BackCommand}"
IsVisible="{Binding !IsFirstStep}"/>
<Button Grid.Column="4" Content="Weiter" Command="{Binding NextCommand}"
IsVisible="{Binding !IsLastStep}"/>
<Button Grid.Column="6" Content="Speichern" Click="OnSave" IsVisible="{Binding IsLastStep}"/>
</Grid>
</Grid>
</Window>