Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions Dashboard/Controls/QueryPerformanceContent.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,17 @@ public void Initialize(DatabaseService databaseService, Action<string>? statusCa
_statusCallback = statusCallback;
}

public void RefreshGridBindings()
{
QueryStatsDataGrid.Items.Refresh();
ProcStatsDataGrid.Items.Refresh();
QueryStoreDataGrid.Items.Refresh();
QueryStoreRegressionsDataGrid.Items.Refresh();
ActiveQueriesDataGrid.Items.Refresh();
CurrentActiveQueriesDataGrid.Items.Refresh();
LongRunningQueryPatternsDataGrid.Items.Refresh();
}

/// <summary>
/// Sets the time range for all sub-tabs.
/// </summary>
Expand Down
7 changes: 7 additions & 0 deletions Dashboard/ServerTab.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,13 @@
<Button x:Name="RefreshButton" Content="Refresh Tab" Click="RefreshButton_Click" Margin="2,0" Padding="12,5" Style="{DynamicResource SuccessButton}"/>
<ToggleButton x:Name="AutoRefreshToggle" Content="Auto-Refresh: Off" Click="AutoRefreshToggle_Click" Margin="8,0,2,0" Padding="12,5" MinWidth="130" ToolTip="Toggle auto-refresh on/off. Configure interval in Settings."/>
<Button Content="Edit Schedules" Click="EditSchedules_Click" Margin="8,0,2,0" Padding="12,5" Style="{DynamicResource AccentButton}" ToolTip="Edit collector schedules (frequency, retention, enabled/disabled)"/>
<TextBlock Text="|" VerticalAlignment="Center" Margin="8,0,4,0" Foreground="{DynamicResource ForegroundBrush}"/>
<TextBlock Text="Times:" VerticalAlignment="Center" Margin="0,0,4,0" Foreground="{DynamicResource ForegroundBrush}"/>
<ComboBox x:Name="TimeDisplayModeBox" Width="120" SelectionChanged="TimeDisplayMode_SelectionChanged" ToolTip="How timestamps are displayed across all tabs">
<ComboBoxItem Content="Server Time" Tag="ServerTime"/>
<ComboBoxItem Content="Local Time" Tag="LocalTime"/>
<ComboBoxItem Content="UTC" Tag="UTC"/>
</ComboBox>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="2,4,0,0">
<TextBlock x:Name="GlobalDateRangeIndicator"
Expand Down
40 changes: 40 additions & 0 deletions Dashboard/ServerTab.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,17 @@ public ServerTab(ServerConnection serverConnection, int utcOffsetMinutes = 0)
// Set default time range on UserControls based on user preferences
var prefs = _preferencesService.GetPreferences();
CriticalIssuesTab.SetTimeRange(prefs.DefaultHoursBack);

// Sync time display mode picker with current setting
var modeTag = ServerTimeHelper.CurrentDisplayMode.ToString();
for (int i = 0; i < TimeDisplayModeBox.Items.Count; i++)
{
if (TimeDisplayModeBox.Items[i] is ComboBoxItem item && item.Tag?.ToString() == modeTag)
{
TimeDisplayModeBox.SelectedIndex = i;
break;
}
}
}

private void ShowPlanLoading(string label)
Expand Down Expand Up @@ -1398,6 +1409,35 @@ private void EditSchedules_Click(object sender, RoutedEventArgs e)
scheduleWindow.ShowDialog();
}

private void TimeDisplayMode_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (TimeDisplayModeBox.SelectedItem is not ComboBoxItem item) return;
var tag = item.Tag?.ToString();
var mode = tag switch
{
"LocalTime" => TimeDisplayMode.LocalTime,
"UTC" => TimeDisplayMode.UTC,
_ => TimeDisplayMode.ServerTime
};
if (mode == ServerTimeHelper.CurrentDisplayMode) return;

ServerTimeHelper.CurrentDisplayMode = mode;

// Persist preference
var prefs = _preferencesService.GetPreferences();
prefs.TimeDisplayMode = mode.ToString();
_preferencesService.SavePreferences(prefs);

// Refresh all DataGrid bindings so ServerTimeConverter re-evaluates
RefreshTimestampBindings();
}

private void RefreshTimestampBindings()
{
// Force WPF to re-evaluate converter bindings on all query performance grids
PerformanceTab.RefreshGridBindings();
}

private void DownloadQueryPlan_Click(object sender, RoutedEventArgs e)
{
if (sender is Button button && button.DataContext is ExpensiveQueryItem item)
Expand Down
8 changes: 8 additions & 0 deletions Lite/Controls/ServerTab.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,14 @@
<ComboBoxItem Content="1m"/>
<ComboBoxItem Content="5m"/>
</ComboBox>
<Separator Style="{StaticResource {x:Static ToolBar.SeparatorStyleKey}}" Margin="8,2"/>
<TextBlock Text="Times:" VerticalAlignment="Center" Margin="0,0,4,0" Foreground="{DynamicResource ForegroundBrush}"/>
<ComboBox x:Name="TimeDisplayModeBox" Width="120" SelectionChanged="TimeDisplayMode_SelectionChanged"
ToolTip="How timestamps are displayed">
<ComboBoxItem Content="Server Time" Tag="ServerTime"/>
<ComboBoxItem Content="Local Time" Tag="LocalTime"/>
<ComboBoxItem Content="UTC" Tag="UTC"/>
</ComboBox>
</StackPanel>
</Grid>
</Border>
Expand Down
39 changes: 39 additions & 0 deletions Lite/Controls/ServerTab.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
using Microsoft.Win32;
using PerformanceMonitorLite.Database;
using PerformanceMonitorLite.Models;
using PerformanceMonitorLite.Helpers;
using PerformanceMonitorLite.Services;
using ScottPlot;

Expand Down Expand Up @@ -160,6 +161,17 @@
/* Initialize time picker ComboBoxes */
InitializeTimeComboBoxes();

/* Sync time display mode picker */
var modeTag = ServerTimeHelper.CurrentDisplayMode.ToString();
for (int i = 0; i < TimeDisplayModeBox.Items.Count; i++)
{
if (TimeDisplayModeBox.Items[i] is ComboBoxItem item && item.Tag?.ToString() == modeTag)
{
TimeDisplayModeBox.SelectedIndex = i;
break;
}
}

/* Initialize column filter managers */
InitializeFilterManagers();

Expand Down Expand Up @@ -402,6 +414,33 @@
}
}

private void TimeDisplayMode_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (!IsLoaded) return;
if (TimeDisplayModeBox.SelectedItem is not ComboBoxItem item) return;
var tag = item.Tag?.ToString();
var mode = tag switch
{
"LocalTime" => TimeDisplayMode.LocalTime,
"UTC" => TimeDisplayMode.UTC,
_ => TimeDisplayMode.ServerTime
};
if (mode == ServerTimeHelper.CurrentDisplayMode) return;

ServerTimeHelper.CurrentDisplayMode = mode;

// Refresh all DataGrid bindings so ServerTimeConverter re-evaluates
QuerySnapshotsGrid.Items.Refresh();
QueryStatsGrid.Items.Refresh();
ProcedureStatsGrid.Items.Refresh();
QueryStoreGrid.Items.Refresh();
BlockedProcessReportGrid.Items.Refresh();
DeadlockGrid.Items.Refresh();
RunningJobsGrid.Items.Refresh();
CollectionHealthGrid.Items.Refresh();
CollectionLogGrid.Items.Refresh();
}

private async void TimeRangeCombo_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (!IsLoaded) return;
Expand Down Expand Up @@ -595,7 +634,7 @@
}

var tz = ServerTimeHelper.GetTimezoneLabel(ServerTimeHelper.CurrentDisplayMode);
ConnectionStatusText.Text = $"{_server.ServerNameDisplay} - Last refresh: {DateTime.Now:HH:mm:ss} ({tz})";

Check warning on line 637 in Lite/Controls/ServerTab.xaml.cs

View workflow job for this annotation

GitHub Actions / build

Dereference of a possibly null reference.
}
catch (Exception ex)
{
Expand Down
Loading