diff --git a/CHANGELOG.md b/CHANGELOG.md index e758a57f7..f20eba1f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Added - Add watermark opacity setting to allow blending with content - Add global watermark setting; channel-specific watermarks have precedence over global watermarks +- Save Schedules, Playouts table page sizes ### Changed - Remove unused API and SDK project; may reintroduce in the future but for now they have fallen out of date diff --git a/ErsatzTV.Core/Domain/ConfigElementKey.cs b/ErsatzTV.Core/Domain/ConfigElementKey.cs index 71190a3da..32ee21dcc 100644 --- a/ErsatzTV.Core/Domain/ConfigElementKey.cs +++ b/ErsatzTV.Core/Domain/ConfigElementKey.cs @@ -17,6 +17,8 @@ public static ConfigElementKey HDHRTunerCount => new("hdhr.tuner_count"); public static ConfigElementKey ChannelsPageSize => new("pages.channels.page_size"); public static ConfigElementKey CollectionsPageSize => new("pages.collections.page_size"); + public static ConfigElementKey SchedulesPageSize => new("pages.schedules.page_size"); + public static ConfigElementKey PlayoutsPageSize => new("pages.playouts.page_size"); public static ConfigElementKey LibraryRefreshInterval => new("scanner.library_refresh_interval"); } } diff --git a/ErsatzTV/Pages/Playouts.razor b/ErsatzTV/Pages/Playouts.razor index 33731adf4..8879bf156 100644 --- a/ErsatzTV/Pages/Playouts.razor +++ b/ErsatzTV/Pages/Playouts.razor @@ -2,11 +2,18 @@ @using ErsatzTV.Application.Playouts @using ErsatzTV.Application.Playouts.Commands @using ErsatzTV.Application.Playouts.Queries +@using ErsatzTV.Application.Configuration.Commands +@using ErsatzTV.Application.Configuration.Queries @inject IDialogService _dialog @inject IMediator _mediator - + Playouts @@ -80,12 +87,16 @@ @code { - private List _playouts; + private MudTable _table; + private int _rowsPerPage; private List _selectedPlayoutItems; private int? _selectedPlayoutId; - protected override Task OnParametersSetAsync() => - LoadAllPlayouts(); + protected override async Task OnParametersSetAsync() + { + _rowsPerPage = await _mediator.Send(new GetConfigElementByKey(ConfigElementKey.PlayoutsPageSize)) + .Map(maybeRows => maybeRows.Match(ce => int.TryParse(ce.Value, out int rows) ? rows : 10, () => 10)); + } private async Task PlayoutSelected(PlayoutNameViewModel playout) { @@ -103,23 +114,33 @@ if (!result.Cancelled) { await _mediator.Send(new DeletePlayout(playout.PlayoutId)); - await LoadAllPlayouts(); + await _table.ReloadServerData(); } } private async Task RebuildPlayout(PlayoutNameViewModel playout) { await _mediator.Send(new BuildPlayout(playout.PlayoutId, true)); - await LoadAllPlayouts(); + await _table.ReloadServerData(); if (_selectedPlayoutId == playout.PlayoutId) { await PlayoutSelected(playout); } } - private async Task LoadAllPlayouts() => - _playouts = await _mediator.Send(new GetAllPlayouts()) - .Map(list => list.OrderBy(x => decimal.Parse(x.ChannelNumber)).ToList()); + private async Task> ServerReload(TableState state) + { + await _mediator.Send(new SaveConfigElementByKey(ConfigElementKey.PlayoutsPageSize, state.PageSize.ToString())); + + List playouts = await _mediator.Send(new GetAllPlayouts()); + IOrderedEnumerable sorted = playouts.OrderBy(p => decimal.Parse(p.ChannelNumber)); + // TODO: properly page this data + return new TableData + { + TotalItems = playouts.Count, + Items = sorted.Skip(state.Page * state.PageSize).Take(state.PageSize) + }; + } } \ No newline at end of file diff --git a/ErsatzTV/Pages/Schedules.razor b/ErsatzTV/Pages/Schedules.razor index eebf04978..c3132bf1f 100644 --- a/ErsatzTV/Pages/Schedules.razor +++ b/ErsatzTV/Pages/Schedules.razor @@ -2,11 +2,18 @@ @using ErsatzTV.Application.ProgramSchedules @using ErsatzTV.Application.ProgramSchedules.Commands @using ErsatzTV.Application.ProgramSchedules.Queries +@using ErsatzTV.Application.Configuration.Queries +@using ErsatzTV.Application.Configuration.Commands @inject IDialogService _dialog @inject IMediator _mediator - + Schedules @@ -80,13 +87,17 @@ } - @code { - private List _schedules; + private MudTable _table; + private int _rowsPerPage; private List _selectedScheduleItems; private ProgramScheduleViewModel _selectedSchedule; - protected override Task OnParametersSetAsync() => LoadSchedules(); + protected override async Task OnParametersSetAsync() + { + _rowsPerPage = await _mediator.Send(new GetConfigElementByKey(ConfigElementKey.SchedulesPageSize)) + .Map(maybeRows => maybeRows.Match(ce => int.TryParse(ce.Value, out int rows) ? rows : 10, () => 10)); + } private async Task ScheduleSelected(ProgramScheduleViewModel schedule) { @@ -105,11 +116,23 @@ if (!result.Cancelled) { await _mediator.Send(new DeleteProgramSchedule(programSchedule.Id)); - await LoadSchedules(); + await _table.ReloadServerData(); } } + + private async Task> ServerReload(TableState state) + { + await _mediator.Send(new SaveConfigElementByKey(ConfigElementKey.SchedulesPageSize, state.PageSize.ToString())); - private async Task LoadSchedules() => - _schedules = await _mediator.Send(new GetAllProgramSchedules()).Map(list => list.OrderBy(vm => vm.Name).ToList()); + List schedules = await _mediator.Send(new GetAllProgramSchedules()); + IOrderedEnumerable sorted = schedules.OrderBy(s => s.Name); + + // TODO: properly page this data + return new TableData + { + TotalItems = schedules.Count, + Items = sorted.Skip(state.Page * state.PageSize).Take(state.PageSize) + }; + } } \ No newline at end of file