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