@page "/admin/audit" @attribute [Microsoft.AspNetCore.Authorization.Authorize] @inject IAuditService AuditService @inject IUserContextAccessor UserContext @inject NavigationManager Nav @inject TranslationSource T @rendermode InteractiveServer @using SharepointToolbox.Web.Core.Models @using SharepointToolbox.Web.Services.Audit @using SharepointToolbox.Web.Services.Session

@T["adminaudit.title"]

@T["adminaudit.subtitle"]

@if (!UserContext.IsAuthenticated || UserContext.Role != UserRole.Admin) {
@T["adminaudit.accessdenied"]
return; }
@T["audit.btn.exportCsv"]
@if (_loading) {
@T["adminaudit.loading"]
} else if (_filtered.Count == 0) {
@T["adminaudit.noentries"]
} else {
@foreach (var e in _filtered) { }
@T["report.col.timestamp"] @T["report.col.user"] @T["adminaudit.col.role"] @T["adminaudit.col.action"] @T["adminaudit.col.client"] @T["report.col.sites"] @T["adminaudit.col.details"]
@e.Timestamp.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss") @e.UserDisplay
@e.UserEmail
@e.UserRole @e.Action @e.ClientName @string.Join(", ", e.Sites) @e.Details

@string.Format(T["adminaudit.showing"], _filtered.Count, _entries.Count)

} @code { private List _entries = new(); private List _filtered = new(); private bool _loading = true; private string _filterUser = string.Empty; private string _filterClient = string.Empty; private string _filterAction = string.Empty; protected override async Task OnInitializedAsync() { _entries = (await AuditService.GetAllAsync()) .OrderByDescending(e => e.Timestamp) .ToList(); _loading = false; ApplyFilters(); } private void ApplyFilters() { _filtered = _entries.Where(e => (string.IsNullOrEmpty(_filterUser) || e.UserEmail.Contains(_filterUser, StringComparison.OrdinalIgnoreCase) || e.UserDisplay.Contains(_filterUser, StringComparison.OrdinalIgnoreCase)) && (string.IsNullOrEmpty(_filterClient) || e.ClientName.Contains(_filterClient, StringComparison.OrdinalIgnoreCase)) && (string.IsNullOrEmpty(_filterAction) || e.Action.Contains(_filterAction, StringComparison.OrdinalIgnoreCase)) ).ToList(); } private static string RoleChipClass(UserRole role) => role switch { UserRole.Admin => "chip-red", UserRole.TechN1 => "chip-green", _ => "chip-blue" }; }