@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();
}
}