diff --git a/apps/server/AliasVault.Admin/Main/Pages/Logging/Auth.razor b/apps/server/AliasVault.Admin/Main/Pages/Logging/Auth.razor index 2cc383226..168afd405 100644 --- a/apps/server/AliasVault.Admin/Main/Pages/Logging/Auth.razor +++ b/apps/server/AliasVault.Admin/Main/Pages/Logging/Auth.razor @@ -1,7 +1,10 @@ @page "/logging/auth" @using AliasVault.RazorComponents.Tables @using AliasVault.Shared.Models.Enums +@using Microsoft.AspNetCore.WebUtilities @inherits MainBase +@inject NavigationManager Navigation +@implements IDisposable Auth logs @@ -55,7 +58,18 @@ else @log.Id @log.Timestamp.ToString("yyyy-MM-dd HH:mm") - @log.Username + + @if (UserLookup.TryGetValue(log.Username, out var userId)) + { + + @log.Username + + } + else + { + @log.Username + } + @log.Client @log.EventType @@ -78,6 +92,7 @@ else ]; private List LogList { get; set; } = []; + private Dictionary UserLookup { get; set; } = []; private bool IsInitialized { get; set; } = false; private bool IsLoading { get; set; } = true; private int CurrentPage { get; set; } = 1; @@ -124,12 +139,44 @@ else } /// - protected override async Task OnAfterRenderAsync(bool firstRender) + protected override async Task OnInitializedAsync() { - if (firstRender) + await base.OnInitializedAsync(); + + Navigation.LocationChanged += OnLocationChanged; + ParseQueryAndRefresh(); + await RefreshData(); + } + + private void OnLocationChanged(object? sender, LocationChangedEventArgs e) + { + ParseQueryAndRefresh(); + } + + private void ParseQueryAndRefresh() + { + var uri = Navigation.ToAbsoluteUri(Navigation.Uri); + var queryParameters = QueryHelpers.ParseQuery(uri.Query); + + if (queryParameters.TryGetValue("search", out var searchValue)) { - await RefreshData(); + _searchTerm = searchValue.FirstOrDefault() ?? string.Empty; } + else + { + _searchTerm = string.Empty; + } + + if (_searchTerm != _lastSearchTerm) + { + _lastSearchTerm = _searchTerm; + _ = RefreshData(); // Fire and forget + } + } + + public void Dispose() + { + Navigation.LocationChanged -= OnLocationChanged; } private void HandlePageChanged(int newPage) @@ -186,6 +233,15 @@ else .Take(PageSize) .ToListAsync(); + // Create user lookup dictionary for the current page + var usernames = LogList.Select(x => x.Username).Distinct().Where(x => !string.IsNullOrEmpty(x)).ToList(); + var users = await dbContext.AliasVaultUsers + .Where(u => u.UserName != null && usernames.Contains(u.UserName)) + .Select(u => new { u.UserName, u.Id }) + .ToListAsync(); + + UserLookup = users.Where(u => u.UserName != null).ToDictionary(u => u.UserName!, u => u.Id); + IsLoading = false; IsInitialized = true; StateHasChanged();