@page "/system/logs" @using System.Globalization @using ErsatzTV.Application.Configuration @using ErsatzTV.Application.Logs @implements IDisposable @inject IMediator Mediator
Logs
Search
Timestamp Level Message @context.Timestamp.ToString("G", _dtf) @context.Level @context.Message No matching records found Loading...
@code { private CancellationTokenSource _cts; private readonly DateTimeFormatInfo _dtf = CultureInfo.CurrentCulture.DateTimeFormat; private MudTable _table; private int _rowsPerPage = 10; private string _searchString; public void Dispose() { _cts?.Cancel(); _cts?.Dispose(); } protected override async Task OnParametersSetAsync() { _cts?.Cancel(); _cts?.Dispose(); _cts = new CancellationTokenSource(); var token = _cts.Token; try { _rowsPerPage = await Mediator.Send(new GetConfigElementByKey(ConfigElementKey.LogsPageSize), token) .Map(maybeRows => maybeRows.Match(ce => int.TryParse(ce.Value, out int rows) ? rows : 10, () => 10)); } catch (OperationCanceledException) { // do nothing } } private async Task> ServerReload(TableState state, CancellationToken cancellationToken) { await Mediator.Send(new SaveConfigElementByKey(ConfigElementKey.LogsPageSize, state.PageSize.ToString()), cancellationToken); PagedLogEntriesViewModel data; switch (state.SortLabel?.ToLowerInvariant()) { case "timestamp": data = await Mediator.Send( new GetRecentLogEntries(state.Page, state.PageSize, _searchString) { SortExpression = le => le.Timestamp, SortDescending = state.SortDirection == SortDirection.None ? Option.None : state.SortDirection == SortDirection.Descending }, cancellationToken); break; case "level": data = await Mediator.Send( new GetRecentLogEntries(state.Page, state.PageSize, _searchString) { SortExpression = le => le.Level, SortDescending = state.SortDirection == SortDirection.None ? Option.None : state.SortDirection == SortDirection.Descending }, cancellationToken); break; default: data = await Mediator.Send( new GetRecentLogEntries(state.Page, state.PageSize, _searchString) { SortDescending = Option.None }, cancellationToken); break; } return new TableData { TotalItems = data.TotalCount, Items = data.Page }; } private void OnSearch(string text) { _searchString = text; _table.ReloadServerData(); } }