feat: implement ETL pipeline redesign and ConfigManager improvements

- Add pipeline registry with JSON-based configuration and hot-reload support
- Implement manual sync request feature with API, client UI, and database
- Improve ConfigManager: connection string dropdown in pipeline editor,
  step delete/reorder functionality, and fix JSON parsing for ConnectionStrings
This commit is contained in:
Joseph Doherty
2026-01-22 17:48:33 -05:00
parent 5a332232d0
commit 29ac56006d
82 changed files with 6257 additions and 296 deletions
@@ -39,12 +39,13 @@
Foreground="#9BA8B8" FontSize="12" FontWeight="Medium"/>
<TextBlock Text="*" Foreground="#FF6B6B" FontSize="12"/>
</StackPanel>
<TextBox Text="{Binding Connection}"
Background="#232A35" Foreground="#E6EDF5"
BorderBrush="#3D4550" Height="36"
FontFamily="JetBrains Mono"
Watermark="jde"/>
<TextBlock Text="Connection string name (e.g., jde, cms, giw)"
<ComboBox ItemsSource="{Binding AvailableConnections}"
SelectedItem="{Binding Connection}"
Background="#232A35" Foreground="#E6EDF5"
BorderBrush="#3D4550" Height="36"
HorizontalAlignment="Stretch"
PlaceholderText="Select connection..."/>
<TextBlock Text="Connection string name from Settings > ConnectionStrings"
Foreground="#5C6A7A" FontSize="11"/>
</StackPanel>
@@ -279,40 +279,71 @@
</Border>
</StackPanel>
<!-- DataGrid -->
<DataGrid ItemsSource="{Binding Connections}"
SelectedItem="{Binding SelectedConnection}"
SelectionMode="Single"
Height="200"
Background="#0D0F12"
RowBackground="#0D0F12"
BorderBrush="#2D3540"
BorderThickness="1"
GridLinesVisibility="Horizontal"
HorizontalGridLinesBrush="#2D3540"
HeadersVisibility="Column"
AutoGenerateColumns="False"
CanUserReorderColumns="False"
CanUserResizeColumns="True"
CanUserSortColumns="True">
<DataGrid.Columns>
<DataGridTextColumn Header="Name"
Binding="{Binding Name}"
Width="*"
IsReadOnly="True"
Foreground="#E6EDF5"/>
<DataGridTextColumn Header="Provider"
Binding="{Binding ProviderDisplay}"
Width="100"
IsReadOnly="True"
Foreground="#9BA8B8"/>
<DataGridTextColumn Header="Server"
Binding="{Binding ServerDisplay}"
Width="150"
IsReadOnly="True"
Foreground="#9BA8B8"/>
</DataGrid.Columns>
</DataGrid>
<!-- Connection List -->
<Border BorderBrush="#2D3540" BorderThickness="1" CornerRadius="4">
<StackPanel>
<!-- Header Row -->
<Grid Background="#151920" Height="32">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="150"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="Name" Foreground="#9BA8B8"
FontSize="12" FontWeight="Medium"
VerticalAlignment="Center" Margin="12,0"/>
<TextBlock Grid.Column="1" Text="Provider" Foreground="#9BA8B8"
FontSize="12" FontWeight="Medium"
VerticalAlignment="Center" Margin="8,0"/>
<TextBlock Grid.Column="2" Text="Server" Foreground="#9BA8B8"
FontSize="12" FontWeight="Medium"
VerticalAlignment="Center" Margin="8,0"/>
</Grid>
<!-- List Items -->
<ListBox ItemsSource="{Binding Connections}"
SelectedItem="{Binding SelectedConnection}"
SelectionMode="Single"
Background="#0D0F12"
MaxHeight="180"
MinHeight="100">
<ListBox.Styles>
<Style Selector="ListBoxItem">
<Setter Property="Padding" Value="0"/>
<Setter Property="Margin" Value="0"/>
<Setter Property="Background" Value="Transparent"/>
</Style>
<Style Selector="ListBoxItem:selected /template/ ContentPresenter">
<Setter Property="Background" Value="#2563EB"/>
</Style>
<Style Selector="ListBoxItem:pointerover /template/ ContentPresenter">
<Setter Property="Background" Value="#1E3A5F"/>
</Style>
</ListBox.Styles>
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Height="36" Background="Transparent">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="150"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding Name}"
Foreground="#E6EDF5" FontSize="13"
VerticalAlignment="Center" Margin="12,0"/>
<TextBlock Grid.Column="1" Text="{Binding ProviderDisplay}"
Foreground="#9BA8B8" FontSize="13"
VerticalAlignment="Center" Margin="8,0"/>
<TextBlock Grid.Column="2" Text="{Binding ServerDisplay}"
Foreground="#9BA8B8" FontSize="13"
VerticalAlignment="Center" Margin="8,0"/>
<Border Grid.ColumnSpan="3" BorderBrush="#2D3540"
BorderThickness="0,0,0,1" VerticalAlignment="Bottom"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
</Border>
<!-- Toolbar -->
<StackPanel Orientation="Horizontal" Spacing="8">
@@ -188,12 +188,49 @@
<Border Grid.Column="4" Background="#0D0F12" Padding="16">
<ScrollViewer VerticalScrollBarVisibility="Auto">
<StackPanel Spacing="16">
<!-- Properties Header -->
<StackPanel>
<TextBlock Text="PROPERTIES"
Foreground="#5C6A7A" FontSize="11" FontWeight="Medium"/>
<Border Height="1" Background="#2D3540" Margin="0,8,0,0"/>
</StackPanel>
<!-- Properties Header with Action Buttons -->
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="PROPERTIES"
Foreground="#5C6A7A" FontSize="11" FontWeight="Medium"
VerticalAlignment="Center"/>
<StackPanel Grid.Column="1" Orientation="Horizontal" Spacing="4">
<!-- Move Up Button -->
<Button Command="{Binding MoveSelectedStepUpCommand}"
Background="#1F2937" Foreground="#9BA8B8"
BorderBrush="#3D4550" BorderThickness="1"
Height="28" Width="28" Padding="0"
ToolTip.Tip="Move step up"
IsVisible="{Binding CanDeleteSelectedStep}">
<TextBlock Text="▲" FontSize="10" HorizontalAlignment="Center"/>
</Button>
<!-- Move Down Button -->
<Button Command="{Binding MoveSelectedStepDownCommand}"
Background="#1F2937" Foreground="#9BA8B8"
BorderBrush="#3D4550" BorderThickness="1"
Height="28" Width="28" Padding="0"
ToolTip.Tip="Move step down"
IsVisible="{Binding CanDeleteSelectedStep}">
<TextBlock Text="▼" FontSize="10" HorizontalAlignment="Center"/>
</Button>
<!-- Delete Button -->
<Button Command="{Binding DeleteSelectedStepCommand}"
Background="#3D1F1F" Foreground="#FF6B6B"
BorderBrush="#5C2D2D" BorderThickness="1"
Height="28" Padding="12,0"
ToolTip.Tip="Delete selected step"
IsVisible="{Binding CanDeleteSelectedStep}">
<StackPanel Orientation="Horizontal" Spacing="6">
<TextBlock Text="🗑" FontSize="12"/>
<TextBlock Text="Delete" FontSize="11"/>
</StackPanel>
</Button>
</StackPanel>
</Grid>
<Border Height="1" Background="#2D3540" Margin="0,8,0,0"/>
<!-- Step Editor Content (changes based on selection) -->
<!-- Shows placeholder text when nothing selected, otherwise uses DataTemplates from MainWindow -->
@@ -36,6 +36,9 @@
<DataTemplate DataType="{x:Type forms:ExcelExportFormViewModel}">
<views:ExcelExportFormView/>
</DataTemplate>
<DataTemplate DataType="{x:Type forms:ConnectionStringsFormViewModel}">
<views:ConnectionStringsFormView/>
</DataTemplate>
<!-- Pipeline Editor (replaces PipelineFormViewModel) -->
<DataTemplate DataType="{x:Type forms:PipelineEditorViewModel}">