@page "/monitoring/event-logs" @attribute [Authorize] @using ScadaLink.Commons.Entities.Sites @using ScadaLink.Commons.Interfaces.Repositories @using ScadaLink.Commons.Messages.RemoteQuery @using ScadaLink.Communication @inject ISiteRepository SiteRepository @inject CommunicationService CommunicationService

Site Event Logs

@if (_errorMessage != null) {
@_errorMessage
} @if (_entries != null) { @if (_entries.Count == 0) { } @for (int i = 0; i < _entries.Count; i++) { var idx = i; var entry = _entries[idx]; var rowClass = entry.Severity == "Error" ? "table-danger" : entry.Severity == "Warning" ? "table-warning" : ""; var expanded = _expandedRows.Contains(idx); @if (expanded) { } }
Timestamp Type Severity Instance Source Message
No events found.
@entry.EventType @SeverityGlyph(entry.Severity) @entry.Severity @(entry.InstanceId ?? "—") @entry.Source @entry.Message
@entry.Message
Showing @_entries.Count entries
@if (_hasMore) { } else if (_entries.Count > 0) { End of results }
}
@code { private List _sites = new(); private string _selectedSiteId = string.Empty; private string? _filterEventType; private string _filterSeverity = string.Empty; private DateTime? _filterFrom; private DateTime? _filterTo; private string? _filterKeyword; private string? _filterInstanceName; private List? _entries; private bool _hasMore; private long? _continuationToken; private bool _searching; private string? _errorMessage; private ToastNotification _toast = default!; private readonly HashSet _expandedRows = new(); private int ActiveFilterCount { get { var n = 0; if (!string.IsNullOrEmpty(_selectedSiteId)) n++; if (!string.IsNullOrWhiteSpace(_filterEventType)) n++; if (!string.IsNullOrEmpty(_filterSeverity)) n++; if (_filterFrom.HasValue) n++; if (_filterTo.HasValue) n++; if (!string.IsNullOrWhiteSpace(_filterKeyword)) n++; if (!string.IsNullOrWhiteSpace(_filterInstanceName)) n++; return n; } } protected override async Task OnInitializedAsync() { _sites = (await SiteRepository.GetAllSitesAsync()).ToList(); } private async Task Search() { _entries = new(); _continuationToken = null; _expandedRows.Clear(); await FetchPage(); } private async Task LoadMore() => await FetchPage(); private void ToggleRow(int idx) { if (!_expandedRows.Add(idx)) { _expandedRows.Remove(idx); } } private async Task FetchPage() { _searching = true; _errorMessage = null; try { var request = new EventLogQueryRequest( CorrelationId: Guid.NewGuid().ToString("N"), SiteId: _selectedSiteId, From: _filterFrom.HasValue ? new DateTimeOffset(_filterFrom.Value, TimeSpan.Zero) : null, To: _filterTo.HasValue ? new DateTimeOffset(_filterTo.Value, TimeSpan.Zero) : null, EventType: string.IsNullOrWhiteSpace(_filterEventType) ? null : _filterEventType.Trim(), Severity: string.IsNullOrWhiteSpace(_filterSeverity) ? null : _filterSeverity, InstanceId: string.IsNullOrWhiteSpace(_filterInstanceName) ? null : _filterInstanceName.Trim(), KeywordFilter: string.IsNullOrWhiteSpace(_filterKeyword) ? null : _filterKeyword.Trim(), ContinuationToken: _continuationToken, PageSize: 50, Timestamp: DateTimeOffset.UtcNow); var response = await CommunicationService.QueryEventLogsAsync(_selectedSiteId, request); if (response.Success) { _entries ??= new(); _entries.AddRange(response.Entries); _hasMore = response.HasMore; _continuationToken = response.ContinuationToken; } else { _errorMessage = response.ErrorMessage ?? "Query failed."; } } catch (Exception ex) { _errorMessage = $"Query failed: {ex.Message}"; } _searching = false; } private static string GetSeverityBadge(string severity) => severity switch { "Error" => "bg-danger", "Warning" => "bg-warning text-dark", "Info" => "bg-info text-dark", _ => "bg-secondary" }; private static string SeverityGlyph(string severity) => severity switch { "Error" => "⛔", "Warning" => "⚠", "Info" => "ℹ", _ => "•" }; }