e5fe2f06e9
Add ConfigurationValidationRunner with IConfigurationValidator interface for validating required settings at startup. Includes SecureStore and LDAP validators. Expand ConfigManager with pipeline editing UI, dialogs, and step editors. Update documentation with config validation guidance.
251 lines
13 KiB
XML
251 lines
13 KiB
XML
<Window xmlns="https://github.com/avaloniaui"
|
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
xmlns:vm="using:JdeScoping.ConfigManager.ViewModels"
|
|
xmlns:forms="using:JdeScoping.ConfigManager.ViewModels.Forms"
|
|
xmlns:steps="using:JdeScoping.ConfigManager.ViewModels.PipelineSteps"
|
|
xmlns:views="using:JdeScoping.ConfigManager.Views.Forms"
|
|
xmlns:editors="using:JdeScoping.ConfigManager.Views.Editors"
|
|
x:Class="JdeScoping.ConfigManager.Views.MainWindow"
|
|
x:DataType="vm:MainWindowViewModel"
|
|
Title="JdeScoping ConfigManager"
|
|
Width="1200" Height="800"
|
|
MinWidth="900" MinHeight="600"
|
|
Background="#0D0F12">
|
|
|
|
<Design.DataContext>
|
|
<vm:MainWindowViewModel/>
|
|
</Design.DataContext>
|
|
|
|
<Window.DataTemplates>
|
|
<!-- Settings Form ViewModels -->
|
|
<DataTemplate DataType="{x:Type forms:DataSyncFormViewModel}">
|
|
<views:DataSyncFormView/>
|
|
</DataTemplate>
|
|
<DataTemplate DataType="{x:Type forms:DataAccessFormViewModel}">
|
|
<views:DataAccessFormView/>
|
|
</DataTemplate>
|
|
<DataTemplate DataType="{x:Type forms:AuthFormViewModel}">
|
|
<views:AuthFormView/>
|
|
</DataTemplate>
|
|
<DataTemplate DataType="{x:Type forms:LdapFormViewModel}">
|
|
<views:LdapFormView/>
|
|
</DataTemplate>
|
|
<DataTemplate DataType="{x:Type forms:SearchFormViewModel}">
|
|
<views:SearchFormView/>
|
|
</DataTemplate>
|
|
<DataTemplate DataType="{x:Type forms:ExcelExportFormViewModel}">
|
|
<views:ExcelExportFormView/>
|
|
</DataTemplate>
|
|
|
|
<!-- Pipeline Editor (replaces PipelineFormViewModel) -->
|
|
<DataTemplate DataType="{x:Type forms:PipelineEditorViewModel}">
|
|
<views:PipelineEditorView/>
|
|
</DataTemplate>
|
|
|
|
<!-- Pipeline Step Editors (for the properties panel) -->
|
|
<DataTemplate DataType="{x:Type steps:SourceStepViewModel}">
|
|
<editors:SourceEditorView/>
|
|
</DataTemplate>
|
|
<DataTemplate DataType="{x:Type steps:DestinationStepViewModel}">
|
|
<editors:DestinationEditorView/>
|
|
</DataTemplate>
|
|
<DataTemplate DataType="{x:Type steps:ColumnDropTransformerViewModel}">
|
|
<editors:ColumnDropEditorView/>
|
|
</DataTemplate>
|
|
<DataTemplate DataType="{x:Type steps:ColumnRenameTransformerViewModel}">
|
|
<editors:ColumnRenameEditorView/>
|
|
</DataTemplate>
|
|
<DataTemplate DataType="{x:Type steps:JdeDateTransformerViewModel}">
|
|
<editors:JdeDateEditorView/>
|
|
</DataTemplate>
|
|
<DataTemplate DataType="{x:Type steps:PreScriptStepViewModel}">
|
|
<editors:ScriptEditorView/>
|
|
</DataTemplate>
|
|
<DataTemplate DataType="{x:Type steps:PostScriptStepViewModel}">
|
|
<editors:PostScriptEditorView/>
|
|
</DataTemplate>
|
|
|
|
<!-- SecureStore ViewModels -->
|
|
<DataTemplate DataType="{x:Type forms:SecureStoreLockedFormViewModel}">
|
|
<views:SecureStoreLockedFormView/>
|
|
</DataTemplate>
|
|
<DataTemplate DataType="{x:Type forms:SecureStoreUnlockedFormViewModel}">
|
|
<views:SecureStoreUnlockedFormView/>
|
|
</DataTemplate>
|
|
<DataTemplate DataType="{x:Type forms:SecretFormViewModel}">
|
|
<views:SecretFormView/>
|
|
</DataTemplate>
|
|
</Window.DataTemplates>
|
|
|
|
<DockPanel>
|
|
<!-- Menu Bar -->
|
|
<Menu DockPanel.Dock="Top" Background="#151920" Height="28">
|
|
<MenuItem Header="_File">
|
|
<MenuItem Header="_Open Folder..." Command="{Binding OpenFolderCommand}" InputGesture="Ctrl+O"/>
|
|
<MenuItem Header="_Save" Command="{Binding SaveCommand}" InputGesture="Ctrl+S"/>
|
|
<Separator/>
|
|
<MenuItem Header="E_xit" Command="{Binding ExitCommand}"/>
|
|
</MenuItem>
|
|
<MenuItem Header="_Edit">
|
|
<MenuItem Header="_Undo" Command="{Binding UndoCommand}" InputGesture="Ctrl+Z"/>
|
|
<MenuItem Header="_Redo" Command="{Binding RedoCommand}" InputGesture="Ctrl+Y"/>
|
|
</MenuItem>
|
|
<MenuItem Header="_Tools">
|
|
<MenuItem Header="_Validate All" Command="{Binding ValidateCommand}" InputGesture="F5"/>
|
|
<MenuItem Header="_Test Connection" Command="{Binding TestConnectionCommand}" InputGesture="F6"/>
|
|
<Separator/>
|
|
<MenuItem Header="View _Backups..."/>
|
|
</MenuItem>
|
|
<MenuItem Header="_Pipelines">
|
|
<MenuItem Header="_New Pipeline..." Command="{Binding AddPipelineCommand}" InputGesture="Ctrl+Shift+P">
|
|
<MenuItem.Icon>
|
|
<TextBlock Text="+" FontSize="14" FontWeight="Bold"/>
|
|
</MenuItem.Icon>
|
|
</MenuItem>
|
|
<MenuItem Header="_Delete Pipeline" Command="{Binding DeletePipelineCommand}">
|
|
<MenuItem.Icon>
|
|
<TextBlock Text="X" FontSize="12" FontWeight="Bold"/>
|
|
</MenuItem.Icon>
|
|
</MenuItem>
|
|
</MenuItem>
|
|
<MenuItem Header="_Secure Stores">
|
|
<MenuItem Header="_New Store..." Command="{Binding NewStoreCommand}" InputGesture="Ctrl+Shift+N">
|
|
<MenuItem.Icon>
|
|
<TextBlock Text="+" FontSize="14" FontWeight="Bold"/>
|
|
</MenuItem.Icon>
|
|
</MenuItem>
|
|
<MenuItem Header="_Add Existing Store..." Command="{Binding AddExistingStoreCommand}" InputGesture="Ctrl+Shift+O">
|
|
<MenuItem.Icon>
|
|
<TextBlock Text="..." FontSize="14"/>
|
|
</MenuItem.Icon>
|
|
</MenuItem>
|
|
<Separator/>
|
|
<MenuItem Header="_Save Store" Command="{Binding SaveStoreCommand}" InputGesture="Ctrl+Shift+S">
|
|
<MenuItem.Icon>
|
|
<TextBlock Text="S" FontSize="12" FontWeight="Bold"/>
|
|
</MenuItem.Icon>
|
|
</MenuItem>
|
|
<MenuItem Header="_Lock All Stores" Command="{Binding LockAllStoresCommand}">
|
|
<MenuItem.Icon>
|
|
<TextBlock Text="L" FontSize="12" FontWeight="Bold"/>
|
|
</MenuItem.Icon>
|
|
</MenuItem>
|
|
<Separator/>
|
|
<MenuItem Header="_Generate Key File..." Command="{Binding GenerateKeyFileCommand}">
|
|
<MenuItem.Icon>
|
|
<TextBlock Text="K" FontSize="12" FontWeight="Bold"/>
|
|
</MenuItem.Icon>
|
|
</MenuItem>
|
|
</MenuItem>
|
|
<MenuItem Header="_Help">
|
|
<MenuItem Header="_About ConfigManager"/>
|
|
</MenuItem>
|
|
</Menu>
|
|
|
|
<!-- Toolbar -->
|
|
<Border DockPanel.Dock="Top" Background="#151920" Height="40"
|
|
BorderBrush="#2D3540" BorderThickness="0,0,0,1">
|
|
<StackPanel Orientation="Horizontal" Margin="8,0" VerticalAlignment="Center" Spacing="4">
|
|
<Button Content="Open" Command="{Binding OpenFolderCommand}" Classes="toolbar"/>
|
|
<Button Content="Save" Command="{Binding SaveCommand}" Classes="toolbar"/>
|
|
<Border Width="1" Height="20" Background="#2D3540" Margin="4,0"/>
|
|
<Button Content="Undo" Command="{Binding UndoCommand}" Classes="toolbar"/>
|
|
<Button Content="Redo" Command="{Binding RedoCommand}" Classes="toolbar"/>
|
|
<Border Width="1" Height="20" Background="#2D3540" Margin="4,0"/>
|
|
<Button Content="Test" Command="{Binding TestConnectionCommand}" Classes="toolbar"/>
|
|
<Button Content="Validate" Command="{Binding ValidateCommand}" Classes="toolbar"/>
|
|
<Border Width="1" Height="20" Background="#2D3540" Margin="4,0"/>
|
|
<Button Content="+ Pipeline" Command="{Binding AddPipelineCommand}" ToolTip.Tip="Add Pipeline" Classes="toolbar"/>
|
|
<Border Width="1" Height="20" Background="#2D3540" Margin="4,0"/>
|
|
<Button Content="Unlock" Command="{Binding UnlockStoreCommand}" ToolTip.Tip="Unlock/Lock Store" Classes="toolbar"/>
|
|
<Button Content="+ Secret" Command="{Binding AddSecretCommand}" ToolTip.Tip="Add Secret" Classes="toolbar"/>
|
|
</StackPanel>
|
|
</Border>
|
|
|
|
<!-- Status Bar -->
|
|
<Border DockPanel.Dock="Bottom" Background="#151920" Height="24"
|
|
BorderBrush="#2D3540" BorderThickness="0,1,0,0">
|
|
<Grid Margin="8,0">
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="Auto"/>
|
|
<ColumnDefinition Width="Auto"/>
|
|
<ColumnDefinition Width="*"/>
|
|
<ColumnDefinition Width="Auto"/>
|
|
</Grid.ColumnDefinitions>
|
|
|
|
<TextBlock Grid.Column="0" Text="{Binding ConfigFolderPath}"
|
|
Foreground="#5C6A7A" FontFamily="JetBrains Mono" FontSize="11"
|
|
VerticalAlignment="Center"/>
|
|
<TextBlock Grid.Column="1" Text=" | Modified"
|
|
Foreground="#5C9AFF" FontSize="11"
|
|
IsVisible="{Binding HasUnsavedChanges}"
|
|
VerticalAlignment="Center" Margin="8,0"/>
|
|
<TextBlock Grid.Column="3" Text="{Binding ValidationStatus}"
|
|
Foreground="{Binding ValidationStatusColor}"
|
|
FontFamily="JetBrains Mono" FontSize="11"
|
|
VerticalAlignment="Center"/>
|
|
</Grid>
|
|
</Border>
|
|
|
|
<!-- Main Content -->
|
|
<Grid>
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="280" MinWidth="200" MaxWidth="400"/>
|
|
<ColumnDefinition Width="Auto"/>
|
|
<ColumnDefinition Width="*"/>
|
|
</Grid.ColumnDefinitions>
|
|
|
|
<!-- Tree View Panel -->
|
|
<Border Grid.Column="0" Background="#0D0F12" BorderBrush="#2D3540" BorderThickness="0,0,1,0">
|
|
<DockPanel>
|
|
<Border DockPanel.Dock="Top" Background="#151920" Height="36">
|
|
<TextBlock Text="CONFIGURATION"
|
|
Foreground="#5C6A7A" FontSize="12" FontWeight="SemiBold"
|
|
VerticalAlignment="Center" Margin="16,0"
|
|
LetterSpacing="0.5"/>
|
|
</Border>
|
|
<TreeView ItemsSource="{Binding TreeNodes}"
|
|
SelectedItem="{Binding SelectedNode}"
|
|
Background="Transparent"
|
|
Margin="8">
|
|
<TreeView.ContextMenu>
|
|
<ContextMenu>
|
|
<MenuItem Header="New Pipeline..." Command="{Binding AddPipelineCommand}"/>
|
|
<MenuItem Header="Delete Pipeline" Command="{Binding DeletePipelineCommand}"/>
|
|
<Separator/>
|
|
<MenuItem Header="Unlock Store..." Command="{Binding UnlockStoreCommand}"/>
|
|
<MenuItem Header="Lock Store" Command="{Binding LockStoreCommand}"/>
|
|
<Separator/>
|
|
<MenuItem Header="Add Secret..." Command="{Binding AddSecretCommand}"/>
|
|
<MenuItem Header="Delete Secret" Command="{Binding DeleteSecretCommand}"/>
|
|
<Separator/>
|
|
<MenuItem Header="Save Store" Command="{Binding SaveStoreCommand}"/>
|
|
</ContextMenu>
|
|
</TreeView.ContextMenu>
|
|
<TreeView.ItemTemplate>
|
|
<TreeDataTemplate ItemsSource="{Binding Children}">
|
|
<StackPanel Orientation="Horizontal" Spacing="8">
|
|
<TextBlock Text="{Binding Icon}" FontSize="14"/>
|
|
<TextBlock Text="{Binding Name}" Foreground="#E6EDF5"/>
|
|
<TextBlock Text="{Binding StatusIcon}" FontSize="12"/>
|
|
<TextBlock Text="*" Foreground="#5C9AFF"
|
|
IsVisible="{Binding IsModified}"/>
|
|
</StackPanel>
|
|
</TreeDataTemplate>
|
|
</TreeView.ItemTemplate>
|
|
</TreeView>
|
|
</DockPanel>
|
|
</Border>
|
|
|
|
<!-- Splitter -->
|
|
<GridSplitter Grid.Column="1" Width="4" Background="Transparent"
|
|
ResizeDirection="Columns"/>
|
|
|
|
<!-- Form Panel -->
|
|
<Border Grid.Column="2" Background="#151920" Padding="24">
|
|
<ContentControl Content="{Binding SelectedFormViewModel}"/>
|
|
</Border>
|
|
</Grid>
|
|
</DockPanel>
|
|
</Window>
|