feat: add startup config validation and document ConfigManager pipeline editor

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.
This commit is contained in:
Joseph Doherty
2026-01-21 17:47:15 -05:00
parent ceb63bfefb
commit e5fe2f06e9
88 changed files with 4995 additions and 201 deletions
@@ -2,7 +2,9 @@
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"
@@ -15,6 +17,7 @@
</Design.DataContext>
<Window.DataTemplates>
<!-- Settings Form ViewModels -->
<DataTemplate DataType="{x:Type forms:DataSyncFormViewModel}">
<views:DataSyncFormView/>
</DataTemplate>
@@ -33,9 +36,36 @@
<DataTemplate DataType="{x:Type forms:ExcelExportFormViewModel}">
<views:ExcelExportFormView/>
</DataTemplate>
<DataTemplate DataType="{x:Type forms:PipelineFormViewModel}">
<views:PipelineFormView/>
<!-- 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>
@@ -66,6 +96,18 @@
<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>
@@ -113,6 +155,8 @@
<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>
@@ -166,6 +210,9 @@
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/>