UX-Update 2.0, Neues Dashboard
This commit is contained in:
@@ -28,11 +28,37 @@
|
||||
<StackPanel Grid.Column="1" Orientation="Horizontal" Spacing="8">
|
||||
<Button Content="Klassenbuch abgleichen…" Click="OnCompareWebUntisDocumentationClick"
|
||||
VerticalAlignment="Center"/>
|
||||
<Button Content="Dashboard anpassen" Command="{Binding ToggleDashboardSettingsCommand}"
|
||||
<Button Content="Bereiche anpassen" Command="{Binding ToggleDashboardSettingsCommand}"
|
||||
VerticalAlignment="Center"/>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
|
||||
<!-- Der Tagesfokus beantwortet zuerst die vier Fragen, die beim Öffnen der App zählen:
|
||||
Was unterrichte ich, was ist zu tun, wo muss ich reagieren und was steht an? -->
|
||||
<Border Background="{DynamicResource AppCardBackgroundBrush}"
|
||||
BorderBrush="{DynamicResource AppCardBorderBrush}" BorderThickness="1"
|
||||
CornerRadius="10" Padding="16,14">
|
||||
<Grid ColumnDefinitions="*,*,*,*">
|
||||
<StackPanel Grid.Column="0" Spacing="3">
|
||||
<TextBlock Text="UNTERRICHT HEUTE" FontSize="10" FontWeight="Bold" Opacity="0.5"/>
|
||||
<TextBlock Text="{Binding TodayLessonSummary}" FontSize="18" FontWeight="SemiBold"/>
|
||||
</StackPanel>
|
||||
<StackPanel Grid.Column="1" Spacing="3" Margin="18,0,0,0">
|
||||
<TextBlock Text="AUFGABEN" FontSize="10" FontWeight="Bold" Opacity="0.5"/>
|
||||
<TextBlock Text="{Binding OpenTaskSummary}" FontSize="18" FontWeight="SemiBold"/>
|
||||
</StackPanel>
|
||||
<StackPanel Grid.Column="2" Spacing="3" Margin="18,0,0,0">
|
||||
<TextBlock Text="HANDLUNGSBEDARF" FontSize="10" FontWeight="Bold" Opacity="0.5"/>
|
||||
<TextBlock Text="{Binding AttentionSummary}" FontSize="18" FontWeight="SemiBold"
|
||||
Foreground="{DynamicResource AppStatusWarningBrush}"/>
|
||||
</StackPanel>
|
||||
<StackPanel Grid.Column="3" Spacing="3" Margin="18,0,0,0">
|
||||
<TextBlock Text="NÄCHSTE 30 TAGE" FontSize="10" FontWeight="Bold" Opacity="0.5"/>
|
||||
<TextBlock Text="{Binding UpcomingSummary}" FontSize="18" FontWeight="SemiBold"/>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</Border>
|
||||
|
||||
<Border Background="{DynamicResource SystemControlBackgroundAltHighBrush}" CornerRadius="8"
|
||||
Padding="12" IsVisible="{Binding IsDashboardSettingsOpen}">
|
||||
<ItemsControl ItemsSource="{Binding DashboardCards}">
|
||||
@@ -59,14 +85,15 @@
|
||||
</Border>
|
||||
|
||||
<!-- Serverseitig gecachte DWD-Daten für den in den Einstellungen hinterlegten Schulstandort. -->
|
||||
<Border Background="{DynamicResource SystemControlBackgroundAltHighBrush}" CornerRadius="8"
|
||||
Padding="16" IsVisible="{Binding IsWeatherPanelVisible}">
|
||||
<StackPanel Spacing="10">
|
||||
<Expander Header="{Binding WeatherSummary}" IsExpanded="{Binding HasWeatherWarnings}"
|
||||
IsVisible="{Binding IsWeatherPanelVisible}"
|
||||
Background="{DynamicResource AppCardBackgroundBrush}"
|
||||
BorderBrush="{DynamicResource AppCardBorderBrush}" BorderThickness="1"
|
||||
CornerRadius="8" Padding="12,6">
|
||||
<StackPanel Spacing="10" Margin="6,8,6,6">
|
||||
<Grid ColumnDefinitions="*,Auto">
|
||||
<StackPanel>
|
||||
<TextBlock Text="WETTER AM SCHULSTANDORT" FontSize="11" FontWeight="Bold" Opacity="0.5"/>
|
||||
<TextBlock Text="{Binding WeatherSummary}" FontSize="20" FontWeight="SemiBold" Margin="0,5,0,0"
|
||||
IsVisible="{Binding WeatherSummary, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"/>
|
||||
<TextBlock Text="{Binding WeatherDetails}" FontSize="11" Opacity="0.65" TextWrapping="Wrap"
|
||||
IsVisible="{Binding WeatherDetails, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"/>
|
||||
</StackPanel>
|
||||
@@ -96,17 +123,20 @@
|
||||
</ItemsControl>
|
||||
<TextBlock Text="Wetterdaten © Deutscher Wetterdienst" FontSize="10" Opacity="0.5"/>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
</Expander>
|
||||
|
||||
<Grid ColumnDefinitions="*,*" RowDefinitions="Auto,Auto,Auto,Auto,Auto,Auto">
|
||||
<TextBlock Text="HEUTE UND HANDLUNGSBEDARF" FontSize="11" FontWeight="Bold" Opacity="0.5"
|
||||
Margin="2,2,0,-8"/>
|
||||
|
||||
<Grid ColumnDefinitions="3*,2*" RowDefinitions="Auto,Auto,Auto,Auto,Auto,Auto">
|
||||
|
||||
<!-- Heutige Stunden -->
|
||||
<Border Grid.Column="{Binding TodayCard.Column}" Grid.Row="{Binding TodayCard.Row}"
|
||||
IsVisible="{Binding TodayCard.IsVisible}" Margin="0,0,8,8"
|
||||
IsVisible="{Binding TodayCard.EffectiveIsVisible}" Margin="0,0,8,8"
|
||||
Background="{DynamicResource SystemControlBackgroundAltHighBrush}"
|
||||
CornerRadius="8" Padding="16">
|
||||
<StackPanel>
|
||||
<TextBlock Text="HEUTE" FontSize="11" FontWeight="Bold"
|
||||
<TextBlock Text="Heute" FontSize="14" FontWeight="SemiBold"
|
||||
Opacity="0.5" Margin="0,0,0,10"/>
|
||||
<ItemsControl ItemsSource="{Binding TodaysLessons}">
|
||||
<ItemsControl.ItemTemplate>
|
||||
@@ -143,12 +173,12 @@
|
||||
|
||||
<!-- Offene Aufgaben -->
|
||||
<Border Grid.Column="{Binding TasksCard.Column}" Grid.Row="{Binding TasksCard.Row}"
|
||||
IsVisible="{Binding TasksCard.IsVisible}" Margin="8,0,0,8"
|
||||
IsVisible="{Binding TasksCard.EffectiveIsVisible}" Margin="8,0,0,8"
|
||||
Background="{DynamicResource SystemControlBackgroundAltHighBrush}"
|
||||
CornerRadius="8" Padding="16">
|
||||
<StackPanel>
|
||||
<Grid ColumnDefinitions="*,Auto,Auto" Margin="0,0,0,10">
|
||||
<TextBlock Grid.Column="0" Text="OFFENE AUFGABEN" FontSize="11" FontWeight="Bold"
|
||||
<TextBlock Grid.Column="0" Text="Offene Aufgaben" FontSize="14" FontWeight="SemiBold"
|
||||
Opacity="0.5" VerticalAlignment="Center"/>
|
||||
<Button Grid.Column="1" Content="🔔+" FontSize="12" Padding="7,2" Margin="0,0,4,0"
|
||||
ToolTip.Tip="Erinnerung anlegen" Command="{Binding AddReminderCommand}"/>
|
||||
@@ -180,7 +210,7 @@
|
||||
<!-- Kalender: feste Position direkt unter Heute/Aufgaben, damit die wachsende
|
||||
Lerngruppen-Liste darunter ihn nicht nach unten verdrängt. -->
|
||||
<Border Grid.Column="{Binding CalendarCard.Column}" Grid.Row="{Binding CalendarCard.Row}"
|
||||
IsVisible="{Binding CalendarCard.IsVisible}" Margin="0,0,8,8"
|
||||
IsVisible="{Binding CalendarCard.EffectiveIsVisible}" Margin="0,0,8,8"
|
||||
Background="{DynamicResource SystemControlBackgroundAltHighBrush}"
|
||||
CornerRadius="8" Padding="16">
|
||||
<StackPanel Spacing="8">
|
||||
@@ -321,7 +351,7 @@
|
||||
|
||||
<!-- Offene Entschuldigungen: neben dem Kalender, ebenfalls feste Position -->
|
||||
<Border Grid.Column="{Binding ExcusesCard.Column}" Grid.Row="{Binding ExcusesCard.Row}"
|
||||
IsVisible="{Binding ExcusesCard.IsVisible}" Margin="8,0,0,8" VerticalAlignment="Top"
|
||||
IsVisible="{Binding ExcusesCard.EffectiveIsVisible}" Margin="8,0,0,8" VerticalAlignment="Top"
|
||||
Background="{DynamicResource SystemControlBackgroundAltHighBrush}"
|
||||
CornerRadius="8" Padding="16">
|
||||
<StackPanel>
|
||||
@@ -355,7 +385,7 @@
|
||||
|
||||
<!-- Fehlzeiten-Warnung (5.2.3) -->
|
||||
<Border Grid.Column="{Binding AttendanceCard.Column}" Grid.Row="{Binding AttendanceCard.Row}"
|
||||
IsVisible="{Binding AttendanceCard.IsVisible}" Margin="0,0,8,8" VerticalAlignment="Top"
|
||||
IsVisible="{Binding AttendanceCard.EffectiveIsVisible}" Margin="0,0,8,8" VerticalAlignment="Top"
|
||||
Background="{DynamicResource SystemControlBackgroundAltHighBrush}"
|
||||
CornerRadius="8" Padding="16">
|
||||
<StackPanel>
|
||||
@@ -385,7 +415,7 @@
|
||||
|
||||
<!-- Förderplan-Wiedervorlage (5.3.2) -->
|
||||
<Border Grid.Column="{Binding SupportCard.Column}" Grid.Row="{Binding SupportCard.Row}"
|
||||
IsVisible="{Binding SupportCard.IsVisible}" Margin="8,0,0,8" VerticalAlignment="Top"
|
||||
IsVisible="{Binding SupportCard.EffectiveIsVisible}" Margin="8,0,0,8" VerticalAlignment="Top"
|
||||
Background="{DynamicResource SystemControlBackgroundAltHighBrush}"
|
||||
CornerRadius="8" Padding="16">
|
||||
<StackPanel>
|
||||
@@ -416,7 +446,7 @@
|
||||
|
||||
<!-- Anstehende Termine (9.3) -->
|
||||
<Border Grid.Column="{Binding UpcomingCard.Column}" Grid.Row="{Binding UpcomingCard.Row}"
|
||||
IsVisible="{Binding UpcomingCard.IsVisible}" Margin="0,0,8,8" VerticalAlignment="Top"
|
||||
IsVisible="{Binding UpcomingCard.EffectiveIsVisible}" Margin="0,0,8,8" VerticalAlignment="Top"
|
||||
Background="{DynamicResource SystemControlBackgroundAltHighBrush}"
|
||||
CornerRadius="8" Padding="16">
|
||||
<StackPanel>
|
||||
@@ -453,7 +483,7 @@
|
||||
|
||||
<!-- Offene Korrekturen (9.4) -->
|
||||
<Border Grid.Column="{Binding CorrectionsCard.Column}" Grid.Row="{Binding CorrectionsCard.Row}"
|
||||
IsVisible="{Binding CorrectionsCard.IsVisible}" Margin="8,0,0,8" VerticalAlignment="Top"
|
||||
IsVisible="{Binding CorrectionsCard.EffectiveIsVisible}" Margin="8,0,0,8" VerticalAlignment="Top"
|
||||
Background="{DynamicResource SystemControlBackgroundAltHighBrush}"
|
||||
CornerRadius="8" Padding="16">
|
||||
<StackPanel>
|
||||
@@ -486,7 +516,7 @@
|
||||
|
||||
<!-- Ungeplante Stunden -->
|
||||
<Border Grid.Column="{Binding UnplannedCard.Column}" Grid.Row="{Binding UnplannedCard.Row}"
|
||||
IsVisible="{Binding UnplannedCard.IsVisible}" Margin="0,0,8,8" VerticalAlignment="Top"
|
||||
IsVisible="{Binding UnplannedCard.EffectiveIsVisible}" Margin="0,0,8,8" VerticalAlignment="Top"
|
||||
Background="{DynamicResource SystemControlBackgroundAltHighBrush}"
|
||||
CornerRadius="8" Padding="16">
|
||||
<StackPanel>
|
||||
@@ -516,7 +546,7 @@
|
||||
|
||||
<!-- Auffälligkeiten (9.5) -->
|
||||
<Border Grid.Column="{Binding AlertsCard.Column}" Grid.Row="{Binding AlertsCard.Row}"
|
||||
IsVisible="{Binding AlertsCard.IsVisible}" Margin="0,0,8,8" VerticalAlignment="Top"
|
||||
IsVisible="{Binding AlertsCard.EffectiveIsVisible}" Margin="0,0,8,8" VerticalAlignment="Top"
|
||||
Background="{DynamicResource SystemControlBackgroundAltHighBrush}"
|
||||
CornerRadius="8" Padding="16">
|
||||
<StackPanel>
|
||||
@@ -550,7 +580,7 @@
|
||||
|
||||
<!-- Meine Lerngruppen -->
|
||||
<Border Grid.Column="{Binding GroupsCard.Column}" Grid.Row="{Binding GroupsCard.Row}"
|
||||
IsVisible="{Binding GroupsCard.IsVisible}"
|
||||
IsVisible="{Binding GroupsCard.EffectiveIsVisible}"
|
||||
Background="{DynamicResource SystemControlBackgroundAltHighBrush}"
|
||||
CornerRadius="8" Padding="16">
|
||||
<StackPanel>
|
||||
|
||||
@@ -5,13 +5,6 @@
|
||||
x:Class="LehrerApp.Desktop.Views.Groups.GroupListView"
|
||||
x:DataType="vm:GroupListViewModel">
|
||||
|
||||
<UserControl.Styles>
|
||||
<Style Selector="TextBlock.overdue">
|
||||
<Setter Property="Foreground" Value="Red"/>
|
||||
<Setter Property="FontWeight" Value="SemiBold"/>
|
||||
</Style>
|
||||
</UserControl.Styles>
|
||||
|
||||
<Grid RowDefinitions="Auto,*">
|
||||
|
||||
<!-- Kopfzeile mit Schuljahr-Wähler und Neu-Button -->
|
||||
@@ -28,180 +21,85 @@
|
||||
</Grid>
|
||||
</Border>
|
||||
|
||||
<!-- Master-Detail: Liste links, Übersicht rechts -->
|
||||
<Grid Grid.Row="1" ColumnDefinitions="260,*">
|
||||
<!-- Eine Navigationsebene: Karten öffnen direkt das Gruppendetail. Die Verwaltung sitzt
|
||||
am jeweiligen Eintrag und benötigt keine vorgeschaltete Bereichsauswahl mehr. -->
|
||||
<Grid Grid.Row="1" RowDefinitions="Auto,*">
|
||||
<Grid Grid.Row="0" ColumnDefinitions="*,Auto" Margin="24,18,24,8">
|
||||
<TextBox Grid.Column="0" Text="{Binding SearchText}"
|
||||
PlaceholderText="Name oder Fach suchen …" MaxWidth="560"
|
||||
HorizontalAlignment="Stretch"/>
|
||||
<ToggleSwitch Grid.Column="1" Content="Archiv anzeigen" IsChecked="{Binding ShowArchived}"
|
||||
Margin="20,0,0,0" VerticalAlignment="Center"/>
|
||||
</Grid>
|
||||
|
||||
<!-- Linke Spalte: Sucheingabe + Listenansicht -->
|
||||
<Border Grid.Column="0"
|
||||
BorderBrush="{DynamicResource SystemControlForegroundBaseLowBrush}"
|
||||
BorderThickness="0,0,1,0">
|
||||
<DockPanel>
|
||||
<StackPanel DockPanel.Dock="Top" Margin="12,8" Spacing="8">
|
||||
<TextBox Text="{Binding SearchText}" PlaceholderText="Suchen…"/>
|
||||
<ToggleSwitch Content="Archiv anzeigen" IsChecked="{Binding ShowArchived}"/>
|
||||
</StackPanel>
|
||||
<TextBlock Text="{Binding EmptyListMessage}" TextWrapping="Wrap"
|
||||
Margin="16,12" FontSize="12" Opacity="0.45"
|
||||
IsVisible="{Binding HasNoGroups}"/>
|
||||
<ListBox ItemsSource="{Binding Groups}"
|
||||
SelectedItem="{Binding SelectedGroup}">
|
||||
<ListBox.ItemTemplate>
|
||||
<DataTemplate DataType="vm:GroupListItem">
|
||||
<Grid ColumnDefinitions="4,*" Margin="2,4">
|
||||
<Border Grid.Column="0" Width="4" CornerRadius="2"
|
||||
Background="{DynamicResource SystemAccentColor}"
|
||||
Margin="0,0,10,0"/>
|
||||
<StackPanel Grid.Column="1">
|
||||
<Grid ColumnDefinitions="*,Auto">
|
||||
<TextBlock Grid.Column="0" Text="{Binding Name}"
|
||||
FontWeight="SemiBold" FontSize="13"/>
|
||||
<TextBlock Grid.Column="1" Text="{Binding TypeLabel}"
|
||||
FontSize="11" Opacity="0.5"/>
|
||||
</Grid>
|
||||
<TextBlock Text="{Binding Subject}" FontSize="12" Opacity="0.65"
|
||||
IsVisible="{Binding Subject, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"/>
|
||||
<TextBlock Text="{Binding GradingLabel}" FontSize="11" Opacity="0.4"/>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
</ListBox.ItemTemplate>
|
||||
</ListBox>
|
||||
</DockPanel>
|
||||
</Border>
|
||||
|
||||
<!-- Rechte Spalte: Platzhalter wenn keine Auswahl -->
|
||||
<StackPanel Grid.Column="1" HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center" Spacing="8"
|
||||
IsVisible="{Binding SelectedGroup, Converter={x:Static ObjectConverters.IsNull}}">
|
||||
<TextBlock Text="Gruppe auswählen" FontSize="16" Opacity="0.4"
|
||||
HorizontalAlignment="Center"/>
|
||||
<TextBlock Text="oder + Neue Gruppe anlegen" FontSize="12" Opacity="0.3"
|
||||
HorizontalAlignment="Center"/>
|
||||
<StackPanel Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center" Spacing="10"
|
||||
IsVisible="{Binding HasNoGroups}">
|
||||
<TextBlock Text="{Binding EmptyListMessage}" FontSize="15" Opacity="0.55"
|
||||
TextWrapping="Wrap" TextAlignment="Center"/>
|
||||
<Button Content="+ Erste Lerngruppe anlegen" Command="{Binding AddGroupCommand}"
|
||||
IsVisible="{Binding !ShowArchived}" HorizontalAlignment="Center"/>
|
||||
</StackPanel>
|
||||
|
||||
<!-- Rechte Spalte: Gruppen-Übersicht wenn ausgewählt -->
|
||||
<ScrollViewer Grid.Column="1"
|
||||
IsVisible="{Binding SelectedGroup, Converter={x:Static ObjectConverters.IsNotNull}}">
|
||||
<StackPanel Margin="28,24" Spacing="20">
|
||||
|
||||
<!-- Gruppenname und Kurzinfos -->
|
||||
<Grid ColumnDefinitions="*,Auto">
|
||||
<StackPanel Grid.Column="0" Spacing="4">
|
||||
<TextBlock Text="{Binding SelectedGroupDisplayName}"
|
||||
FontSize="24" FontWeight="SemiBold" TextWrapping="Wrap"/>
|
||||
<TextBlock Text="{Binding SelectedGroupSubtitle}"
|
||||
FontSize="12" Opacity="0.55"/>
|
||||
</StackPanel>
|
||||
<Button Grid.Column="1" Content="⋯ Verwalten" VerticalAlignment="Top"
|
||||
Margin="16,0,0,0">
|
||||
<Button.Flyout>
|
||||
<MenuFlyout>
|
||||
<MenuItem Header="Details bearbeiten"
|
||||
Command="{Binding EditGroupCommand}"/>
|
||||
<MenuItem Header="Ins nächste Schuljahr übernehmen …"
|
||||
Command="{Binding RollOverGroupCommand}"/>
|
||||
<MenuItem Header="{Binding SelectedGroup.ArchiveActionLabel}"
|
||||
Command="{Binding ToggleArchiveCommand}"/>
|
||||
<Separator/>
|
||||
<MenuItem Header="Teilnehmer importieren (bald)" IsEnabled="False"
|
||||
ToolTip.Tip="Import aus dem Teilnehmerexport der Lernplattform folgt."/>
|
||||
<Separator/>
|
||||
<MenuItem Header="Lerngruppe löschen"
|
||||
Command="{Binding DeleteGroupCommand}"/>
|
||||
</MenuFlyout>
|
||||
</Button.Flyout>
|
||||
</Button>
|
||||
</Grid>
|
||||
|
||||
<Separator/>
|
||||
|
||||
<!-- Schnellüberblick (Nutzer-Feedback) -->
|
||||
<StackPanel Spacing="8" IsVisible="{Binding QuickHasAnything}">
|
||||
<TextBlock Text="SCHNELLÜBERBLICK" FontSize="10" FontWeight="Bold" Opacity="0.4"/>
|
||||
<StackPanel Spacing="1" IsVisible="{Binding QuickHasNextLesson}">
|
||||
<TextBlock Text="Nächste Stunde" FontSize="11" Opacity="0.55"/>
|
||||
<TextBlock Text="{Binding QuickNextLessonLabel}" FontSize="13" TextWrapping="Wrap"/>
|
||||
</StackPanel>
|
||||
<StackPanel Spacing="1" IsVisible="{Binding QuickHasNextExam}">
|
||||
<TextBlock Text="Nächste Klausur" FontSize="11" Opacity="0.55"/>
|
||||
<TextBlock Text="{Binding QuickNextExamLabel}" FontSize="13" TextWrapping="Wrap"/>
|
||||
</StackPanel>
|
||||
<StackPanel Spacing="4" IsVisible="{Binding QuickHasTasks}">
|
||||
<TextBlock Text="Wichtige Aufgaben" FontSize="11" Opacity="0.55"/>
|
||||
<ItemsControl ItemsSource="{Binding QuickTasks}">
|
||||
<ItemsControl.ItemTemplate>
|
||||
<DataTemplate x:DataType="vm:GroupTaskItem">
|
||||
<Grid ColumnDefinitions="4,Auto,*,Auto" Margin="0,2">
|
||||
<Border Grid.Column="0" Background="{Binding PriorityColorHex}" CornerRadius="2"
|
||||
Margin="0,0,6,0" IsVisible="{Binding IsHighPriority}"/>
|
||||
<TextBlock Grid.Column="1" Text="🔔" FontSize="11" Margin="0,0,4,0"
|
||||
IsVisible="{Binding IsReminder}" VerticalAlignment="Center"/>
|
||||
<TextBlock Grid.Column="2" Text="{Binding Title}" FontSize="12"
|
||||
TextTrimming="CharacterEllipsis" VerticalAlignment="Center"/>
|
||||
<TextBlock Grid.Column="3" Text="{Binding DueDateDisplay}" FontSize="11"
|
||||
VerticalAlignment="Center" Classes.overdue="{Binding IsOverdue}"/>
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
</ItemsControl.ItemTemplate>
|
||||
</ItemsControl>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
<Separator IsVisible="{Binding QuickHasAnything}"/>
|
||||
|
||||
<!-- Bereichs-Navigation -->
|
||||
<TextBlock Text="BEREICHE" FontSize="10" FontWeight="Bold"
|
||||
Opacity="0.4" Margin="0,0,0,2"/>
|
||||
<StackPanel Spacing="6">
|
||||
<Button Content="📊 Übersicht"
|
||||
HorizontalAlignment="Stretch" HorizontalContentAlignment="Left"
|
||||
Padding="12,9"
|
||||
Command="{Binding NavigateToSectionCommand}"
|
||||
CommandParameter="0"/>
|
||||
<Button Content="👤 Schülerliste"
|
||||
HorizontalAlignment="Stretch" HorizontalContentAlignment="Left"
|
||||
Padding="12,9"
|
||||
Command="{Binding NavigateToSectionCommand}"
|
||||
CommandParameter="1"/>
|
||||
<Button Content="🪑 Sitzpläne"
|
||||
HorizontalAlignment="Stretch" HorizontalContentAlignment="Left"
|
||||
Padding="12,9"
|
||||
Command="{Binding NavigateToSectionCommand}"
|
||||
CommandParameter="2"/>
|
||||
<Button Content="✋ Mitarbeit"
|
||||
HorizontalAlignment="Stretch" HorizontalContentAlignment="Left"
|
||||
Padding="12,9"
|
||||
Command="{Binding NavigateToSectionCommand}"
|
||||
CommandParameter="3"/>
|
||||
<Button Content="📝 Klausuren"
|
||||
HorizontalAlignment="Stretch" HorizontalContentAlignment="Left"
|
||||
Padding="12,9"
|
||||
Command="{Binding NavigateToSectionCommand}"
|
||||
CommandParameter="4"/>
|
||||
<Button Content="🔢 Notenübersicht"
|
||||
HorizontalAlignment="Stretch" HorizontalContentAlignment="Left"
|
||||
Padding="12,9"
|
||||
Command="{Binding NavigateToSectionCommand}"
|
||||
CommandParameter="5"/>
|
||||
<Button Content="📅 Unterrichtsplanung"
|
||||
HorizontalAlignment="Stretch" HorizontalContentAlignment="Left"
|
||||
Padding="12,9"
|
||||
Command="{Binding NavigateToSectionCommand}"
|
||||
CommandParameter="6"/>
|
||||
<Button Content="🎯 Kompetenzübersicht"
|
||||
HorizontalAlignment="Stretch" HorizontalContentAlignment="Left"
|
||||
Padding="12,9"
|
||||
Command="{Binding NavigateToSectionCommand}"
|
||||
CommandParameter="7"/>
|
||||
<Button Content="📋 Dokumentation"
|
||||
HorizontalAlignment="Stretch" HorizontalContentAlignment="Left"
|
||||
Padding="12,9"
|
||||
Command="{Binding NavigateToSectionCommand}"
|
||||
CommandParameter="8"/>
|
||||
</StackPanel>
|
||||
|
||||
</StackPanel>
|
||||
<ScrollViewer Grid.Row="1" IsVisible="{Binding !HasNoGroups}"
|
||||
HorizontalScrollBarVisibility="Disabled">
|
||||
<ItemsControl ItemsSource="{Binding Groups}" Margin="20,12,20,24">
|
||||
<ItemsControl.ItemsPanel>
|
||||
<ItemsPanelTemplate>
|
||||
<WrapPanel Orientation="Horizontal"/>
|
||||
</ItemsPanelTemplate>
|
||||
</ItemsControl.ItemsPanel>
|
||||
<ItemsControl.ItemTemplate>
|
||||
<DataTemplate x:DataType="vm:GroupListItem">
|
||||
<Border Width="330" MinHeight="116" Margin="6" CornerRadius="9"
|
||||
Background="{DynamicResource AppCardBackgroundBrush}"
|
||||
BorderBrush="{DynamicResource AppCardBorderBrush}" BorderThickness="1">
|
||||
<Grid ColumnDefinitions="4,*,Auto">
|
||||
<Border Grid.Column="0" Background="{DynamicResource SystemAccentColor}"
|
||||
CornerRadius="9,0,0,9"/>
|
||||
<Button Grid.Column="1" Background="Transparent" BorderThickness="0"
|
||||
Padding="16,14" HorizontalAlignment="Stretch"
|
||||
HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"
|
||||
Command="{Binding OpenCommand}"
|
||||
AutomationProperties.Name="{Binding OpenAutomationName}">
|
||||
<StackPanel Spacing="6">
|
||||
<TextBlock Text="{Binding Name}" FontSize="17" FontWeight="SemiBold"
|
||||
TextTrimming="CharacterEllipsis"/>
|
||||
<TextBlock Text="{Binding Subject}" FontSize="13" Opacity="0.7"
|
||||
TextTrimming="CharacterEllipsis"
|
||||
IsVisible="{Binding Subject, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"/>
|
||||
<StackPanel Orientation="Horizontal" Spacing="7">
|
||||
<Border Background="{DynamicResource AppChipBackgroundBrush}" CornerRadius="8" Padding="7,2">
|
||||
<TextBlock Text="{Binding TypeLabel}" FontSize="10" Opacity="0.75"/>
|
||||
</Border>
|
||||
<TextBlock Text="{Binding GradingLabel}" FontSize="11" Opacity="0.5"
|
||||
VerticalAlignment="Center"/>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</Button>
|
||||
<Button Grid.Column="2" Content="⋯" Width="36" Height="32" Margin="0,10,10,0"
|
||||
Padding="0" VerticalAlignment="Top"
|
||||
ToolTip.Tip="Lerngruppe verwalten"
|
||||
AutomationProperties.Name="{Binding ManageAutomationName}">
|
||||
<Button.Flyout>
|
||||
<MenuFlyout>
|
||||
<MenuItem Header="Details bearbeiten" IsEnabled="{Binding IsActive}"
|
||||
Command="{Binding EditCommand}"/>
|
||||
<MenuItem Header="Ins nächste Schuljahr übernehmen …"
|
||||
Command="{Binding RollOverCommand}"/>
|
||||
<MenuItem Header="{Binding ArchiveActionLabel}"
|
||||
Command="{Binding ToggleArchiveCommand}"/>
|
||||
<Separator/>
|
||||
<MenuItem Header="Lerngruppe löschen" IsEnabled="{Binding IsActive}"
|
||||
Command="{Binding DeleteCommand}"/>
|
||||
</MenuFlyout>
|
||||
</Button.Flyout>
|
||||
</Button>
|
||||
</Grid>
|
||||
</Border>
|
||||
</DataTemplate>
|
||||
</ItemsControl.ItemTemplate>
|
||||
</ItemsControl>
|
||||
</ScrollViewer>
|
||||
|
||||
</Grid>
|
||||
</Grid>
|
||||
</UserControl>
|
||||
|
||||
@@ -146,6 +146,20 @@
|
||||
|
||||
<ScrollViewer>
|
||||
<StackPanel Classes="navitems" Margin="8,12,8,0" Spacing="2">
|
||||
<Button Classes="navitem" HorizontalAlignment="Stretch"
|
||||
HorizontalContentAlignment="Left" CornerRadius="6"
|
||||
Click="OnOpenCommandPaletteClick"
|
||||
ToolTip.Tip="Suchen und schnell erfassen (Strg/⌘+K)"
|
||||
AutomationProperties.Name="Suchen und schnell erfassen">
|
||||
<Grid ColumnDefinitions="Auto,*,Auto">
|
||||
<TextBlock Classes="navicon" Text="⌕" TextAlignment="Center"/>
|
||||
<TextBlock Grid.Column="1" Classes="navlabel" Text="Suchen / Erfassen"/>
|
||||
<TextBlock Grid.Column="2" Classes="navlabel" Text="⌘K" FontSize="10" Opacity="0.45"
|
||||
VerticalAlignment="Center"/>
|
||||
</Grid>
|
||||
</Button>
|
||||
<Separator Margin="4,6"/>
|
||||
|
||||
<Button Classes="navitem" Classes.active="{Binding IsDashboardActive}" HorizontalAlignment="Stretch"
|
||||
HorizontalContentAlignment="Left"
|
||||
CornerRadius="6"
|
||||
@@ -241,6 +255,77 @@
|
||||
|
||||
</DrawerPage>
|
||||
|
||||
<!-- Globale Suche und Schnellerfassung (14.2). Bewusst als Overlay auf der aktuellen Seite:
|
||||
Der Nutzer behält den Kontext und kann mit Escape ohne Navigation zurückkehren. -->
|
||||
<Border Background="#A0000000" IsVisible="{Binding IsCommandPaletteOpen}"
|
||||
AutomationProperties.Name="Globale Suche und Schnellerfassung">
|
||||
<Grid>
|
||||
<Button Background="Transparent" BorderThickness="0"
|
||||
Command="{Binding CloseCommandPaletteCommand}"
|
||||
AutomationProperties.Name="Suche schließen"/>
|
||||
<Border Width="680" MaxHeight="570" Margin="24" Padding="0"
|
||||
HorizontalAlignment="Center" VerticalAlignment="Top"
|
||||
Background="{DynamicResource AppCardBackgroundBrush}"
|
||||
BorderBrush="{DynamicResource AppCardBorderBrush}" BorderThickness="1"
|
||||
CornerRadius="12">
|
||||
<Grid RowDefinitions="Auto,Auto,*,Auto">
|
||||
<Grid Grid.Row="0" ColumnDefinitions="Auto,*,Auto" Margin="18,16,18,10">
|
||||
<TextBlock Text="⌕" FontSize="24" VerticalAlignment="Center" Margin="0,0,10,0"/>
|
||||
<TextBox x:Name="CommandPaletteSearchBox" Grid.Column="1"
|
||||
Text="{Binding CommandPalette.Query, UpdateSourceTrigger=PropertyChanged}"
|
||||
PlaceholderText="Schüler, Lerngruppe, Klausur oder Aufgabe suchen …"
|
||||
FontSize="16" BorderThickness="0" Background="Transparent"
|
||||
AutomationProperties.Name="Suchbegriff"/>
|
||||
<Button Grid.Column="2" Content="Esc" FontSize="10" Padding="8,3"
|
||||
Command="{Binding CloseCommandPaletteCommand}"
|
||||
AutomationProperties.Name="Suche schließen"/>
|
||||
</Grid>
|
||||
<Separator Grid.Row="1"/>
|
||||
<ListBox Grid.Row="2" ItemsSource="{Binding CommandPalette.Results}"
|
||||
SelectedItem="{Binding CommandPalette.SelectedResult}"
|
||||
Background="Transparent" BorderThickness="0" Margin="8"
|
||||
MaxHeight="420">
|
||||
<ListBox.ItemTemplate>
|
||||
<DataTemplate x:DataType="vm:GlobalSearchResult">
|
||||
<Button Background="Transparent" BorderThickness="0" Padding="10,8"
|
||||
HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch"
|
||||
Command="{Binding $parent[Window].((vm:MainWindowViewModel)DataContext).CommandPalette.ExecuteCommand}"
|
||||
CommandParameter="{Binding}">
|
||||
<Grid ColumnDefinitions="38,*,Auto">
|
||||
<Border Width="30" Height="30" CornerRadius="7"
|
||||
Background="{DynamicResource AppAccentSoftBackgroundBrush}"
|
||||
VerticalAlignment="Center">
|
||||
<TextBlock Text="{Binding Icon}" FontWeight="SemiBold"
|
||||
Foreground="{DynamicResource AppAccentOnSoftBrush}"
|
||||
HorizontalAlignment="Center" VerticalAlignment="Center"/>
|
||||
</Border>
|
||||
<StackPanel Grid.Column="1" Margin="10,0">
|
||||
<TextBlock Text="{Binding Title}" FontSize="14" FontWeight="SemiBold"/>
|
||||
<TextBlock Text="{Binding Subtitle}" FontSize="11" Opacity="0.6"
|
||||
TextTrimming="CharacterEllipsis"/>
|
||||
</StackPanel>
|
||||
<Border Grid.Column="2" Padding="7,3" CornerRadius="8"
|
||||
Background="{DynamicResource AppChipBackgroundBrush}"
|
||||
VerticalAlignment="Center">
|
||||
<TextBlock Text="{Binding KindLabel}" FontSize="10" Opacity="0.7"/>
|
||||
</Border>
|
||||
</Grid>
|
||||
</Button>
|
||||
</DataTemplate>
|
||||
</ListBox.ItemTemplate>
|
||||
</ListBox>
|
||||
<TextBlock Grid.Row="2" Text="Keine passenden Ergebnisse."
|
||||
Classes="emptyhint" HorizontalAlignment="Center" Margin="20"
|
||||
IsVisible="{Binding CommandPalette.ShowNoResults}"/>
|
||||
<Grid Grid.Row="3" ColumnDefinitions="*,Auto" Margin="18,8,18,14">
|
||||
<TextBlock Text="↑↓ auswählen · Enter öffnen · Esc schließen" FontSize="10" Opacity="0.5"/>
|
||||
<TextBlock Grid.Column="1" Text="Strg/⌘ + K" FontSize="10" Opacity="0.5"/>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Border>
|
||||
</Grid>
|
||||
</Border>
|
||||
|
||||
<!-- Dauerhafte Meldung bei einer echten Protokoll-Inkompatibilität. Als Overlay außerhalb
|
||||
von DrawerPage.Content bleibt der DataContext das MainWindowViewModel; innerhalb des
|
||||
ContentPresenters würde eine fehlgeschlagene Bindung IsVisible auf true stehen lassen. -->
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Input;
|
||||
using Avalonia.Threading;
|
||||
using LehrerApp.Desktop.Services;
|
||||
using LehrerApp.Desktop.ViewModels;
|
||||
using LehrerApp.Sync;
|
||||
@@ -19,6 +20,62 @@ public partial class MainWindow : Window
|
||||
PointerMoved += (_, _) => NotifyActivity();
|
||||
PointerPressed += (_, _) => NotifyActivity();
|
||||
KeyDown += (_, _) => NotifyActivity();
|
||||
KeyDown += OnWindowKeyDown;
|
||||
}
|
||||
|
||||
private void OnWindowKeyDown(object? sender, KeyEventArgs e)
|
||||
{
|
||||
if (DataContext is not MainWindowViewModel vm) return;
|
||||
|
||||
var commandModifier = (e.KeyModifiers & (KeyModifiers.Control | KeyModifiers.Meta)) != 0;
|
||||
if (commandModifier && e.Key == Key.K)
|
||||
{
|
||||
vm.OpenCommandPaletteCommand.Execute(null);
|
||||
FocusCommandPalette();
|
||||
e.Handled = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!vm.IsCommandPaletteOpen) return;
|
||||
if (e.Key == Key.Escape)
|
||||
{
|
||||
vm.CloseCommandPaletteCommand.Execute(null);
|
||||
e.Handled = true;
|
||||
}
|
||||
else if (e.Key == Key.Enter)
|
||||
{
|
||||
vm.CommandPalette.ExecuteCommand.Execute(vm.CommandPalette.SelectedResult);
|
||||
e.Handled = true;
|
||||
}
|
||||
else if (e.Key is Key.Down or Key.Up)
|
||||
{
|
||||
MoveCommandPaletteSelection(vm, e.Key == Key.Down ? 1 : -1);
|
||||
e.Handled = true;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnOpenCommandPaletteClick(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
|
||||
{
|
||||
if (DataContext is MainWindowViewModel vm)
|
||||
vm.OpenCommandPaletteCommand.Execute(null);
|
||||
FocusCommandPalette();
|
||||
}
|
||||
|
||||
private void FocusCommandPalette() => Dispatcher.UIThread.Post(() =>
|
||||
{
|
||||
if (this.FindControl<TextBox>("CommandPaletteSearchBox") is { } search)
|
||||
{
|
||||
search.Focus();
|
||||
search.SelectAll();
|
||||
}
|
||||
});
|
||||
|
||||
private static void MoveCommandPaletteSelection(MainWindowViewModel vm, int delta)
|
||||
{
|
||||
var results = vm.CommandPalette.Results;
|
||||
if (results.Count == 0) return;
|
||||
var current = vm.CommandPalette.SelectedResult is { } selected ? results.IndexOf(selected) : -1;
|
||||
vm.CommandPalette.SelectedResult = results[Math.Clamp(current + delta, 0, results.Count - 1)];
|
||||
}
|
||||
|
||||
public void EnableFinalSync(SyncEngine syncEngine)
|
||||
|
||||
Reference in New Issue
Block a user