diff --git a/src/EventLogExpert.UI/Store/EventLog/EventLogEffects.cs b/src/EventLogExpert.UI/Store/EventLog/EventLogEffects.cs index 1b0fbec7..5d0aa3c9 100644 --- a/src/EventLogExpert.UI/Store/EventLog/EventLogEffects.cs +++ b/src/EventLogExpert.UI/Store/EventLog/EventLogEffects.cs @@ -194,7 +194,10 @@ await Parallel.ForEachAsync( return; } - dispatcher.Dispatch(new EventLogAction.LoadEvents(logData, events.ToList().AsReadOnly())); + dispatcher.Dispatch( + new EventLogAction.LoadEvents( + logData, + events.OrderByDescending(e => e.RecordId).ToList().AsReadOnly())); dispatcher.Dispatch(new StatusBarAction.SetEventsLoading(activityId, 0, 0)); diff --git a/src/EventLogExpert/Components/EventTable.razor.css b/src/EventLogExpert/Components/EventTable.razor.css index 907565f1..ec6536f1 100644 --- a/src/EventLogExpert/Components/EventTable.razor.css +++ b/src/EventLogExpert/Components/EventTable.razor.css @@ -158,7 +158,7 @@ tr { .level { width: 100px; } -.dateandtime { width: 150px; } +.dateandtime { width: 160px; } .activityid { width: 270px; } diff --git a/src/EventLogExpert/Components/FilterPane.razor.cs b/src/EventLogExpert/Components/FilterPane.razor.cs index 855b56dd..46b62aab 100644 --- a/src/EventLogExpert/Components/FilterPane.razor.cs +++ b/src/EventLogExpert/Components/FilterPane.razor.cs @@ -74,26 +74,29 @@ private void AddDateFilter() { _model.TimeZoneInfo = SettingsState.Value.Config.TimeZoneInfo; - // Round up/down to the nearest hour - var hourTicks = TimeSpan.FromHours(1).Ticks; - - _model.Before = new DateTime(hourTicks * ((EventLogState.Value.ActiveLogs.Values - .Where(log => log.Events.Count > 0) - .Select(log => log.Events.First().TimeCreated) - .OrderBy(t => t) - .DefaultIfEmpty(DateTime.UtcNow) - .Last() - .Ticks + hourTicks) / hourTicks)) - .ConvertTimeZone(_model.TimeZoneInfo); - - _model.After = new DateTime(hourTicks * (EventLogState.Value.ActiveLogs.Values - .Where(log => log.Events.Count > 0) - .Select(log => log.Events.Last().TimeCreated) - .OrderBy(t => t) - .DefaultIfEmpty(DateTime.UtcNow) - .First() - .Ticks / hourTicks)) - .ConvertTimeZone(_model.TimeZoneInfo); + long ticksPerHour = TimeSpan.FromHours(1).Ticks; + + long oldestEventTicks = + (EventLogState.Value.ActiveLogs.Values.Select(log => log.Events.LastOrDefault()?.TimeCreated) + .Order() + .LastOrDefault() ?? + DateTime.UtcNow) + .Ticks; + + long mostRecentEventTicks = + (EventLogState.Value.ActiveLogs.Values.Select(log => log.Events.FirstOrDefault()?.TimeCreated) + .Order() + .FirstOrDefault() ?? + DateTime.UtcNow) + .Ticks; + + // Round down to the nearest hour for the earliest event + _model.After = new DateTime(oldestEventTicks / ticksPerHour * ticksPerHour, DateTimeKind.Utc) + .ConvertTimeZone(SettingsState.Value.Config.TimeZoneInfo); + + // Round up to the nearest hour for the latest event + _model.Before = new DateTime(((mostRecentEventTicks + ticksPerHour - 1) / ticksPerHour) * ticksPerHour, DateTimeKind.Utc) + .ConvertTimeZone(SettingsState.Value.Config.TimeZoneInfo); _isFilterListVisible = true; _canEditDate = true; @@ -115,8 +118,8 @@ private void ApplyDateFilter() { FilterDateModel model = new() { - After = _model.After.ToUniversalTime(), - Before = _model.Before.ToUniversalTime() + After = _model.After.ConvertTimeZoneToUtc(SettingsState.Value.Config.TimeZoneInfo), + Before = _model.Before.ConvertTimeZoneToUtc(SettingsState.Value.Config.TimeZoneInfo) }; Dispatcher.Dispatch(new FilterPaneAction.SetFilterDateRange(model)); diff --git a/src/EventLogExpert/ExtensionMethods.cs b/src/EventLogExpert/ExtensionMethods.cs index b2dac72d..cc1f8600 100644 --- a/src/EventLogExpert/ExtensionMethods.cs +++ b/src/EventLogExpert/ExtensionMethods.cs @@ -30,6 +30,9 @@ static async Task ForgetAwaited(Task task, ITraceLogger? logger = null) internal static DateTime ConvertTimeZone(this DateTime time, TimeZoneInfo? destinationTime) => destinationTime is null ? time : TimeZoneInfo.ConvertTimeFromUtc(time, destinationTime); + internal static DateTime ConvertTimeZoneToUtc(this DateTime time, TimeZoneInfo? destinationTime) => + destinationTime is null ? time : TimeZoneInfo.ConvertTimeToUtc(time, destinationTime); + internal static string GetEventKeywords(this IEnumerable keywords) { StringBuilder sb = new("Keywords:"); diff --git a/src/EventLogExpert/MauiProgram.cs b/src/EventLogExpert/MauiProgram.cs index f9914ab4..46c107b3 100644 --- a/src/EventLogExpert/MauiProgram.cs +++ b/src/EventLogExpert/MauiProgram.cs @@ -40,6 +40,7 @@ public static MauiApp CreateMauiApp() // Core Services builder.Services.AddSingleton(); + builder.Services.AddSingleton(); builder.Services.AddSingleton(); var fileLocationOptions = new FileLocationOptions(FileSystem.AppDataDirectory);