feat(ui): complete Avalonia UI port with 7 main pages, tool settings & top MenuBar

This commit is contained in:
Richard
2026-08-10 10:48:34 +02:00
parent a0e18d2a57
commit b5bf97ae74
187 changed files with 20054 additions and 882 deletions
@@ -0,0 +1,100 @@
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="using:ClawdDotNet.Desktop.ViewModels"
mc:Ignorable="d" d:DesignWidth="900" d:DesignHeight="700"
Padding="16"
x:Class="ClawdDotNet.Desktop.Views.BackupPageView"
x:DataType="vm:BackupPageViewModel">
<DockPanel>
<!-- Statusbar am unteren Rand -->
<Border Classes="statusbar" DockPanel.Dock="Bottom">
<TextBlock Text="{Binding StatusText}" VerticalAlignment="Center" />
</Border>
<ScrollViewer>
<StackPanel Spacing="16">
<TextBlock Text="Sicherung &amp; Wiederherstellung" Classes="heading" FontSize="20" />
<!-- Card: Neue Sicherung erstellen -->
<Border Classes="card">
<StackPanel Spacing="12">
<TextBlock Text="Manuelle Sicherung erstellen" Classes="heading" />
<Grid ColumnDefinitions="*,Auto" RowDefinitions="Auto">
<TextBox Text="{Binding TargetFolder}" Grid.Column="0" PlaceholderText="Zielordner für Sicherungen..." />
<Button Content="Ordner wählen" Click="OnBrowseTargetFolder" Grid.Column="1" Margin="8,0,0,0" />
</Grid>
<!-- Zugangsdaten Optionen -->
<TextBlock Text="Zugangsdaten (API-Schlüssel, Passwörter):" FontWeight="Bold" Margin="0,4,0,0" />
<RadioButton Content="Zugangsdaten NICHT mit sichern (ohne Passphrase)" IsChecked="{Binding SecretsExclude}" />
<RadioButton Content="Mit Passphrase verschlüsseln" IsChecked="{Binding SecretsPassphrase}" />
<StackPanel Spacing="8" IsVisible="{Binding SecretsPassphrase}" Margin="20,0,0,0">
<TextBox Text="{Binding Passphrase}" PasswordChar="*" PlaceholderText="Passphrase eingeben" Width="300" HorizontalAlignment="Left" />
<TextBox Text="{Binding PassphraseRepeat}" PasswordChar="*" PlaceholderText="Passphrase wiederholen" Width="300" HorizontalAlignment="Left" />
</StackPanel>
<!-- Inhalt Optionen -->
<CheckBox Content="Protokolle (Logs) mit einschließen" IsChecked="{Binding IncludeLogs}" />
<CheckBox Content="Chatverläufe mit einschließen" IsChecked="{Binding IncludeChatHistory}" />
<Button Content="▶ Sicherung jetzt erstellen" Command="{Binding CreateBackupCommand}"
IsEnabled="{Binding !IsBusy}" Classes="accent" HorizontalAlignment="Left" Margin="0,8,0,0" />
</StackPanel>
</Border>
<!-- Card: Automatische Sicherung -->
<Border Classes="card">
<StackPanel Spacing="12">
<TextBlock Text="Automatische Sicherung" Classes="heading" />
<CheckBox Content="Automatische tägliche Sicherung aktivieren" IsChecked="{Binding AutoBackupEnabled}" />
<StackPanel Orientation="Horizontal" Spacing="16" IsEnabled="{Binding AutoBackupEnabled}">
<StackPanel Orientation="Horizontal" Spacing="8">
<TextBlock Text="Uhrzeit:" VerticalAlignment="Center" />
<TextBox Text="{Binding AutoBackupTime}" Width="80" PlaceholderText="03:00" />
</StackPanel>
<StackPanel Orientation="Horizontal" Spacing="8">
<TextBlock Text="Max. Anzahl behalten:" VerticalAlignment="Center" />
<NumericUpDown Value="{Binding KeepCount}" Minimum="1" Maximum="999" Width="120" />
</StackPanel>
</StackPanel>
</StackPanel>
</Border>
<!-- Vorhandene Sicherungen List -->
<Border Classes="card">
<DockPanel Height="260">
<StackPanel Classes="toolbar" DockPanel.Dock="Top">
<TextBlock Text="Vorhandene Sicherungen" Classes="heading" VerticalAlignment="Center" />
<Button Content="Aktualisieren" Command="{Binding RefreshBackupListCommand}" Margin="12,0,0,0" />
<Button Content="Ordner öffnen" Command="{Binding ShowSelectedInFolderCommand}" IsEnabled="{Binding SelectedBackup, Converter={x:Static ObjectConverters.IsNotNull}}" />
<Button Content="Löschen" Command="{Binding DeleteSelectedCommand}" IsEnabled="{Binding SelectedBackup, Converter={x:Static ObjectConverters.IsNotNull}}" />
<Button Content="Wiederherstellen..." Command="{Binding RestoreSelectedCommand}" IsEnabled="{Binding SelectedBackup, Converter={x:Static ObjectConverters.IsNotNull}}" Classes="accent" />
</StackPanel>
<DataGrid ItemsSource="{Binding Backups}" SelectedItem="{Binding SelectedBackup}" AutoGenerateColumns="False" IsReadOnly="True">
<DataGrid.Columns>
<DataGridTextColumn Header="Dateiname" Binding="{Binding FileName}" Width="220" />
<DataGridTextColumn Header="Erstellt am" Binding="{Binding LastWriteTime, StringFormat='{}{0:g}'}" Width="150" />
<DataGridTextColumn Header="Instanz" Binding="{Binding InstanceName}" Width="130" />
<DataGridTextColumn Header="Größe" Binding="{Binding SizeFormatted}" Width="100" />
<DataGridTextColumn Header="Zugangsdaten" Binding="{Binding SecretsInfo}" Width="*" />
</DataGrid.Columns>
</DataGrid>
</DockPanel>
</Border>
</StackPanel>
</ScrollViewer>
</DockPanel>
</UserControl>