From 1a8985bfb9dd40ec4ca7e023577c075754b2fb31 Mon Sep 17 00:00:00 2001 From: Erik Darling <2136037+erikdarlingdata@users.noreply.github.com> Date: Sun, 22 Feb 2026 09:29:11 -0500 Subject: [PATCH] v1.4.0 feature work: config tab consolidation, DB drop on remove, DuckDB-first plans, lock wait trend, clipboard fix, procedure stats parity Issues addressed: - #185: Consolidate Server/Database/Trace Flag config change tabs into single ConfigChangesContent UserControl with sub-tabs (Dashboard) - #201: Add option to drop PerformanceMonitor database when removing a server, with confirmation dialog (Dashboard) - #219: Try DuckDB cache first for query plan downloads before falling back to live server (Lite) - #141: Add lock waits trend chart to Blocking > Trends tab with multi-series per LCK% wait type (Lite) Additional fixes: - Fix clipboard copy: "Copy All Rows" and "Export to CSV" context menu items now extract TextBlock text from StackPanel column headers instead of showing "System.Windows.Controls.StackPanel" (both apps, 22 call sites) - Add missing columns to Lite procedure stats grid: Total Spills, Min/Max CPU, Min/Max Duration, Plan Handle, and Download Plan button with DuckDB-first lookup - Filter out zero-activity rows from query stats and procedure stats grids (HAVING clause on delta sums) - Make query stats grid plan download DuckDB-first (was live-server only) - Fix plan download button text resetting to "Save" instead of "Download" Co-Authored-By: Claude Opus 4.6 --- .../Controls/AlertsHistoryContent.xaml.cs | 4 +- Dashboard/Controls/ConfigChangesContent.xaml | 282 +++++++++++++ .../Controls/ConfigChangesContent.xaml.cs | 384 ++++++++++++++++++ .../Controls/CriticalIssuesContent.xaml.cs | 4 +- .../Controls/DailySummaryContent.xaml.cs | 4 +- Dashboard/Controls/MemoryContent.xaml.cs | 4 +- .../Controls/QueryPerformanceContent.xaml.cs | 4 +- .../Controls/ResourceMetricsContent.xaml.cs | 4 +- .../Controls/SystemEventsContent.xaml.cs | 4 +- .../Helpers/DataGridClipboardBehavior.cs | 74 ++++ Dashboard/MainWindow.xaml.cs | 32 +- Dashboard/ManageServersWindow.xaml.cs | 29 +- Dashboard/ProcedureHistoryWindow.xaml.cs | 4 +- Dashboard/QueryExecutionHistoryWindow.xaml.cs | 4 +- Dashboard/QueryStatsHistoryWindow.xaml.cs | 4 +- Dashboard/RemoveServerDialog.xaml | 39 ++ Dashboard/RemoveServerDialog.xaml.cs | 33 ++ Dashboard/ServerTab.xaml | 276 +------------ Dashboard/ServerTab.xaml.cs | 338 +-------------- Dashboard/Services/ServerManager.cs | 25 ++ Dashboard/Themes/DarkTheme.xaml | 4 +- Lite/Controls/ServerTab.xaml | 33 +- Lite/Controls/ServerTab.xaml.cs | 165 +++++++- Lite/Helpers/DataGridClipboardBehavior.cs | 74 ++++ Lite/Services/LocalDataService.Blocking.cs | 57 +++ Lite/Services/LocalDataService.QueryStats.cs | 48 +++ Lite/Themes/DarkTheme.xaml | 4 +- Lite/Windows/QueryStatsHistoryWindow.xaml.cs | 30 +- README.md | 2 +- 29 files changed, 1315 insertions(+), 654 deletions(-) create mode 100644 Dashboard/Controls/ConfigChangesContent.xaml create mode 100644 Dashboard/Controls/ConfigChangesContent.xaml.cs create mode 100644 Dashboard/Helpers/DataGridClipboardBehavior.cs create mode 100644 Dashboard/RemoveServerDialog.xaml create mode 100644 Dashboard/RemoveServerDialog.xaml.cs create mode 100644 Lite/Helpers/DataGridClipboardBehavior.cs diff --git a/Dashboard/Controls/AlertsHistoryContent.xaml.cs b/Dashboard/Controls/AlertsHistoryContent.xaml.cs index 132cb1d8..ef85d722 100644 --- a/Dashboard/Controls/AlertsHistoryContent.xaml.cs +++ b/Dashboard/Controls/AlertsHistoryContent.xaml.cs @@ -373,7 +373,7 @@ private void CopyAllRows_Click(object sender, RoutedEventArgs e) var sb = new StringBuilder(); var headers = dataGrid.Columns .OfType() - .Select(c => TabHelpers.GetColumnHeader(c)) + .Select(c => Helpers.DataGridClipboardBehavior.GetHeaderText(c)) .ToList(); sb.AppendLine(string.Join("\t", headers)); @@ -406,7 +406,7 @@ private void ExportToCsv_Click(object sender, RoutedEventArgs e) var sb = new StringBuilder(); var headers = dataGrid.Columns .OfType() - .Select(c => TabHelpers.EscapeCsvField(TabHelpers.GetColumnHeader(c))) + .Select(c => TabHelpers.EscapeCsvField(Helpers.DataGridClipboardBehavior.GetHeaderText(c))) .ToList(); sb.AppendLine(string.Join(",", headers)); diff --git a/Dashboard/Controls/ConfigChangesContent.xaml b/Dashboard/Controls/ConfigChangesContent.xaml new file mode 100644 index 00000000..e5aeb648 --- /dev/null +++ b/Dashboard/Controls/ConfigChangesContent.xaml @@ -0,0 +1,282 @@ + + + + + + + + + + +