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