Files
EngineeringSync/EngineeringSync.TrayApp/Views/PendingChangesWindow.xaml
EngineeringSync 04ae8a0aae Initial commit: EngineeringSync v1.0.0
Vollständige Implementierung des EngineeringSync-Middleware-Tools:
- Windows Service (Kestrel :5050) mit FileSystemWatcher + SignalR
- WPF Tray-App mit PendingChanges- und Projektverwaltungs-Fenster
- Setup-Wizard (8-Schritte-Installer)
- SQLite/EF Core Datenschicht (WAL-Modus)
- SHA-256-basiertes Debouncing (2s Fenster)
- Backup-System mit konfigurierbarer Aufbewahrung

Bugfixes & Verbesserungen:
- BUG-1: AppDbContext OnConfiguring invertierte Bedingung behoben
- BUG-2: Event-Handler-Leak in TrayApp (Fenster-Singleton-Pattern)
- BUG-3: ProjectConfigChanged SignalR-Signal in allen CRUD-Endpoints
- BUG-5: Rename-Sync löscht alte Datei im Simulations-Ordner
- BUG-6: Doppeltes Dispose von SignalR verhindert
- BUG-7: Registry-Deinstallation nur EngineeringSync-Eintrag entfernt
- S1: Path-Traversal-Schutz via SafeCombine() im SyncManager
- E1: FSW Buffer 64KB + automatischer Re-Scan bei Overflow
- E2: Retry-Logik (3x) für gesperrte Dateien mit exponentiellem Backoff
- E4: Channel.Writer.TryComplete() beim Shutdown
- C2: HubMethodNames-Konstanten statt Magic Strings
- E3: Pagination in Changes-API (page/pageSize Query-Parameter)
- A1: Fire-and-Forget mit try/catch + Logging

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 21:52:26 +01:00

68 lines
3.4 KiB
XML
Raw Permalink 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 x:Class="EngineeringSync.TrayApp.Views.PendingChangesWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Ausstehende Änderungen EngineeringSync"
Height="520" Width="860"
WindowStartupLocation="CenterScreen"
Background="#F5F5F5">
<Grid Margin="12">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<!-- Projekt-Auswahl -->
<StackPanel Grid.Row="0" Orientation="Horizontal" Margin="0,0,0,8">
<TextBlock Text="Projekt:" VerticalAlignment="Center" Margin="0,0,8,0" FontWeight="SemiBold"/>
<ComboBox ItemsSource="{Binding Projects}"
SelectedItem="{Binding SelectedProject}"
DisplayMemberPath="Name"
Width="300" />
<Button Content="Aktualisieren" Margin="8,0,0,0" Padding="10,4"
Command="{Binding LoadChangesCommand}" />
</StackPanel>
<!-- Änderungsliste -->
<DataGrid Grid.Row="1"
ItemsSource="{Binding Changes}"
AutoGenerateColumns="False"
CanUserAddRows="False"
CanUserDeleteRows="False"
SelectionMode="Single"
GridLinesVisibility="Horizontal"
Background="White"
BorderBrush="#DDDDDD"
BorderThickness="1">
<DataGrid.Columns>
<DataGridCheckBoxColumn Binding="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged}"
Header="" Width="40" />
<DataGridTextColumn Binding="{Binding FileName}" Header="Datei" Width="200" IsReadOnly="True"/>
<DataGridTextColumn Binding="{Binding RelativePath}" Header="Pfad" Width="*" IsReadOnly="True"/>
<DataGridTextColumn Binding="{Binding ChangeTypeDisplay}" Header="Änderungstyp" Width="120" IsReadOnly="True"/>
<DataGridTextColumn Binding="{Binding CreatedAtDisplay}" Header="Zeitpunkt" Width="160" IsReadOnly="True"/>
</DataGrid.Columns>
</DataGrid>
<!-- Auswahl-Buttons -->
<StackPanel Grid.Row="2" Orientation="Horizontal" Margin="0,8,0,4">
<Button Content="Alle auswählen" Padding="8,4" Margin="0,0,4,0"
Command="{Binding SelectAllCommand}" />
<Button Content="Keine auswählen" Padding="8,4"
Command="{Binding SelectNoneCommand}" />
<TextBlock Text="{Binding StatusMessage}" VerticalAlignment="Center"
Margin="16,0,0,0" Foreground="Gray" />
</StackPanel>
<!-- Aktions-Buttons -->
<StackPanel Grid.Row="3" Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,4,0,0">
<Button Content="Ausgewählte ignorieren" Padding="10,6" Margin="0,0,8,0"
Command="{Binding IgnoreSelectedCommand}" />
<Button Content="Ausgewählte synchronisieren" Padding="10,6"
Background="#0078D4" Foreground="White" BorderThickness="0"
Command="{Binding SyncSelectedCommand}" />
</StackPanel>
</Grid>
</Window>