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>
227 lines
13 KiB
XML
227 lines
13 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"
|
||
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>
|