@page "/schedules"
@using ErsatzTV.Application.Configuration
@using ErsatzTV.Application.ProgramSchedules
@using NaturalSort.Extension
@implements IDisposable
@inject IDialogService Dialog
@inject IMediator Mediator
@inject NavigationManager NavigationManager
Add Schedule
Schedules
Name
@context.Name
@if (_selectedSchedule != null)
{
@_selectedSchedule.Name Items
Start Time
Collection
Playout Mode
@(context.StartType == StartType.Fixed ? context.StartTime == null ? string.Empty : DateTime.Today.Add(context.StartTime.Value).ToShortTimeString() : "Dynamic")
@context.Name
@context.PlayoutMode
}
@code {
private readonly CancellationTokenSource _cts = new();
private MudTable _table;
private MudTable _detailTable;
private int _rowsPerPage = 10;
private int _detailRowsPerPage = 10;
private ProgramScheduleViewModel _selectedSchedule;
public void Dispose()
{
_cts.Cancel();
_cts.Dispose();
}
protected override async Task OnParametersSetAsync()
{
_rowsPerPage = await Mediator.Send(new GetConfigElementByKey(ConfigElementKey.SchedulesPageSize), _cts.Token)
.Map(maybeRows => maybeRows.Match(ce => int.TryParse(ce.Value, out int rows) ? rows : 10, () => 10));
_detailRowsPerPage = await Mediator.Send(new GetConfigElementByKey(ConfigElementKey.SchedulesDetailPageSize), _cts.Token)
.Map(maybeRows => maybeRows.Match(ce => int.TryParse(ce.Value, out int rows) ? rows : 10, () => 10));
}
private async Task ScheduleSelected(ProgramScheduleViewModel schedule)
{
_selectedSchedule = schedule;
if (_selectedSchedule != null && _detailTable != null)
{
await _detailTable.ReloadServerData();
}
}
private async Task DeleteSchedule(ProgramScheduleViewModel programSchedule)
{
var parameters = new DialogParameters { { "EntityType", "schedule" }, { "EntityName", programSchedule.Name } };
var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall };
IDialogReference dialog = await Dialog.ShowAsync("Delete Schedule", parameters, options);
DialogResult result = await dialog.Result;
if (result is { Canceled: false })
{
await Mediator.Send(new DeleteProgramSchedule(programSchedule.Id), _cts.Token);
if (_table != null)
{
await _table.ReloadServerData();
}
if (_selectedSchedule == programSchedule)
{
_selectedSchedule = null;
}
}
}
private async Task CopySchedule(ProgramScheduleViewModel programSchedule)
{
var parameters = new DialogParameters { { "ProgramScheduleId", programSchedule.Id } };
var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall };
IDialogReference dialog = await Dialog.ShowAsync("Copy Schedule", parameters, options);
DialogResult dialogResult = await dialog.Result;
if (dialogResult is { Canceled: false, Data: ProgramScheduleViewModel data })
{
NavigationManager.NavigateTo($"schedules/{data.Id}/items");
}
}
private async Task> ServerReload(TableState state, CancellationToken cancellationToken)
{
await Mediator.Send(new SaveConfigElementByKey(ConfigElementKey.SchedulesPageSize, state.PageSize.ToString()), _cts.Token);
List schedules = await Mediator.Send(new GetAllProgramSchedules(), _cts.Token);
IOrderedEnumerable sorted = schedules.OrderBy(s => s.Name, new NaturalSortComparer(StringComparison.CurrentCultureIgnoreCase));
// TODO: properly page this data
return new TableData
{
TotalItems = schedules.Count,
Items = sorted.Skip(state.Page * state.PageSize).Take(state.PageSize)
};
}
private async Task> DetailServerReload(TableState state, CancellationToken cancellationToken)
{
await Mediator.Send(new SaveConfigElementByKey(ConfigElementKey.SchedulesDetailPageSize, state.PageSize.ToString()), _cts.Token);
List scheduleItems = await Mediator.Send(new GetProgramScheduleItems(_selectedSchedule.Id), _cts.Token);
IOrderedEnumerable sorted = scheduleItems.OrderBy(s => s.Index);
// TODO: properly page this data
return new TableData
{
TotalItems = scheduleItems.Count,
Items = sorted.Skip(state.Page * state.PageSize).Take(state.PageSize)
};
}
}