Browse Source

rework alternate schedule and playout template editors (#2142)

* rework alternate schedules editor

* rework playout templates editor
pull/2143/head
Jason Dove 1 month ago committed by GitHub
parent
commit
f2c49bd0fd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 2
      ErsatzTV/Pages/BlockPlayoutEditor.razor
  2. 2
      ErsatzTV/Pages/ChannelEditor.razor
  3. 2
      ErsatzTV/Pages/Channels.razor
  4. 2
      ErsatzTV/Pages/CollectionEditor.razor
  5. 2
      ErsatzTV/Pages/DecoEditor.razor
  6. 2
      ErsatzTV/Pages/DecoTemplateEditor.razor
  7. 2
      ErsatzTV/Pages/FFmpeg.razor
  8. 2
      ErsatzTV/Pages/FFmpegEditor.razor
  9. 2
      ErsatzTV/Pages/FillerPresetEditor.razor
  10. 2
      ErsatzTV/Pages/FillerPresets.razor
  11. 2
      ErsatzTV/Pages/LocalLibraries.razor
  12. 2
      ErsatzTV/Pages/LocalLibraryEditor.razor
  13. 2
      ErsatzTV/Pages/MultiCollectionEditor.razor
  14. 455
      ErsatzTV/Pages/PlayoutAlternateSchedulesEditor.razor
  15. 2
      ErsatzTV/Pages/PlayoutEditor.razor
  16. 624
      ErsatzTV/Pages/PlayoutTemplatesEditor.razor
  17. 2
      ErsatzTV/Pages/ScheduleEditor.razor
  18. 6
      ErsatzTV/Pages/ScheduleItemsEditor.razor
  19. 2
      ErsatzTV/Pages/Schedules.razor
  20. 2
      ErsatzTV/Pages/Settings/FFmpegSettings.razor
  21. 2
      ErsatzTV/Pages/Settings/HDHRSettings.razor
  22. 2
      ErsatzTV/Pages/Settings/LoggingSettings.razor
  23. 2
      ErsatzTV/Pages/Settings/PlayoutSettings.razor
  24. 2
      ErsatzTV/Pages/Settings/ScannerSettings.razor
  25. 2
      ErsatzTV/Pages/Settings/XMLTVSettings.razor
  26. 2
      ErsatzTV/Pages/TemplateEditor.razor
  27. 2
      ErsatzTV/Pages/WatermarkEditor.razor
  28. 2
      ErsatzTV/Pages/Watermarks.razor
  29. 2
      ErsatzTV/Pages/YamlPlayoutEditor.razor
  30. 2
      ErsatzTV/Shared/RemoteMediaSourceLibrariesEditor.razor
  31. 4
      ErsatzTV/wwwroot/css/site.css

2
ErsatzTV/Pages/BlockPlayoutEditor.razor

@ -10,7 +10,7 @@
<MudForm Style="max-height: 100%"> <MudForm Style="max-height: 100%">
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center"> <MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-8" OnClick="@(_ => SaveDefaultDeco())" StartIcon="@Icons.Material.Filled.Save"> <MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-6" OnClick="@(_ => SaveDefaultDeco())" StartIcon="@Icons.Material.Filled.Save">
Save Default Deco Save Default Deco
</MudButton> </MudButton>
</MudPaper> </MudPaper>

2
ErsatzTV/Pages/ChannelEditor.razor

@ -20,7 +20,7 @@
<MudForm Model="@_model" @ref="@_form" Validation="@(_validator.ValidateValue)" ValidationDelay="0" Style="max-height: 100%"> <MudForm Model="@_model" @ref="@_form" Validation="@(_validator.ValidateValue)" ValidationDelay="0" Style="max-height: 100%">
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center"> <MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-8" OnClick="HandleSubmitAsync" StartIcon="@(IsEdit ? Icons.Material.Filled.Save : Icons.Material.Filled.Add)">@(IsEdit ? "Save Channel" : "Add Channel")</MudButton> <MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-6" OnClick="HandleSubmitAsync" StartIcon="@(IsEdit ? Icons.Material.Filled.Save : Icons.Material.Filled.Add)">@(IsEdit ? "Save Channel" : "Add Channel")</MudButton>
</MudPaper> </MudPaper>
<div class="d-flex flex-column" style="height: 100vh; overflow-x: auto"> <div class="d-flex flex-column" style="height: 100vh; overflow-x: auto">
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8"> <MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">

2
ErsatzTV/Pages/Channels.razor

@ -12,7 +12,7 @@
<MudForm Style="max-height: 100%"> <MudForm Style="max-height: 100%">
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center"> <MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-8" StartIcon="@Icons.Material.Filled.Add" Href="channels/add"> <MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-6" StartIcon="@Icons.Material.Filled.Add" Href="channels/add">
Add Channel Add Channel
</MudButton> </MudButton>
</MudPaper> </MudPaper>

2
ErsatzTV/Pages/CollectionEditor.razor

@ -9,7 +9,7 @@
<MudForm @ref="_form" @bind-IsValid="@_success" Style="max-height: 100%"> <MudForm @ref="_form" @bind-IsValid="@_success" Style="max-height: 100%">
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center"> <MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-8" OnClick="HandleSubmitAsync" StartIcon="@(IsEdit ? Icons.Material.Filled.Save : Icons.Material.Filled.Add)">@(IsEdit ? "Save Collection" : "Add Collection")</MudButton> <MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-6" OnClick="HandleSubmitAsync" StartIcon="@(IsEdit ? Icons.Material.Filled.Save : Icons.Material.Filled.Add)">@(IsEdit ? "Save Collection" : "Add Collection")</MudButton>
</MudPaper> </MudPaper>
<div class="d-flex flex-column" style="height: 100vh; overflow-x: auto"> <div class="d-flex flex-column" style="height: 100vh; overflow-x: auto">
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8"> <MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">

2
ErsatzTV/Pages/DecoEditor.razor

@ -14,7 +14,7 @@
<MudForm Style="max-height: 100%"> <MudForm Style="max-height: 100%">
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center"> <MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="@(_ => SaveChanges())" Class="ml-8" StartIcon="@Icons.Material.Filled.Save"> <MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="@(_ => SaveChanges())" Class="ml-6" StartIcon="@Icons.Material.Filled.Save">
Save Changes Save Changes
</MudButton> </MudButton>
</MudPaper> </MudPaper>

2
ErsatzTV/Pages/DecoTemplateEditor.razor

@ -9,7 +9,7 @@
<MudForm Style="max-height: 100%"> <MudForm Style="max-height: 100%">
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center"> <MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-8" OnClick="@(_ => SaveChanges())" StartIcon="@Icons.Material.Filled.Save"> <MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-6" OnClick="@(_ => SaveChanges())" StartIcon="@Icons.Material.Filled.Save">
Save Deco Template Save Deco Template
</MudButton> </MudButton>
</MudPaper> </MudPaper>

2
ErsatzTV/Pages/FFmpeg.razor

@ -7,7 +7,7 @@
<MudForm Style="max-height: 100%"> <MudForm Style="max-height: 100%">
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center"> <MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-8" StartIcon="@Icons.Material.Filled.Add" Href="ffmpeg/add"> <MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-6" StartIcon="@Icons.Material.Filled.Add" Href="ffmpeg/add">
Add Profile Add Profile
</MudButton> </MudButton>
</MudPaper> </MudPaper>

2
ErsatzTV/Pages/FFmpegEditor.razor

@ -20,7 +20,7 @@
<MudForm Model="@_model" @ref="@_form" Validation="@(_validator.ValidateValue)" ValidationDelay="0" Style="max-height: 100%"> <MudForm Model="@_model" @ref="@_form" Validation="@(_validator.ValidateValue)" ValidationDelay="0" Style="max-height: 100%">
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center"> <MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-8" OnClick="HandleSubmitAsync" StartIcon="@(IsEdit ? Icons.Material.Filled.Save : Icons.Material.Filled.Add)">@(IsEdit ? "Save Profile" : "Add Profile")</MudButton> <MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-6" OnClick="HandleSubmitAsync" StartIcon="@(IsEdit ? Icons.Material.Filled.Save : Icons.Material.Filled.Add)">@(IsEdit ? "Save Profile" : "Add Profile")</MudButton>
</MudPaper> </MudPaper>
<div class="d-flex flex-column" style="height: 100vh; overflow-x: auto"> <div class="d-flex flex-column" style="height: 100vh; overflow-x: auto">
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8"> <MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">

2
ErsatzTV/Pages/FillerPresetEditor.razor

@ -16,7 +16,7 @@
<MudForm Model="@_model" @ref="@_form" Validation="@(_validator.ValidateValue)" ValidationDelay="0" Style="max-height: 100%"> <MudForm Model="@_model" @ref="@_form" Validation="@(_validator.ValidateValue)" ValidationDelay="0" Style="max-height: 100%">
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center"> <MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-8" OnClick="HandleSubmitAsync" StartIcon="@(IsEdit ? Icons.Material.Filled.Save : Icons.Material.Filled.Add)">@(IsEdit ? "Save Filler Preset" : "Add Filler Preset")</MudButton> <MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-6" OnClick="HandleSubmitAsync" StartIcon="@(IsEdit ? Icons.Material.Filled.Save : Icons.Material.Filled.Add)">@(IsEdit ? "Save Filler Preset" : "Add Filler Preset")</MudButton>
</MudPaper> </MudPaper>
<div class="d-flex flex-column" style="height: 100vh; overflow-x: auto"> <div class="d-flex flex-column" style="height: 100vh; overflow-x: auto">
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8"> <MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">

2
ErsatzTV/Pages/FillerPresets.razor

@ -8,7 +8,7 @@
<MudForm Style="max-height: 100%"> <MudForm Style="max-height: 100%">
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center"> <MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-8" StartIcon="@Icons.Material.Filled.Add" Href="media/filler/presets/add"> <MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-6" StartIcon="@Icons.Material.Filled.Add" Href="media/filler/presets/add">
Add Filler Preset Add Filler Preset
</MudButton> </MudButton>
</MudPaper> </MudPaper>

2
ErsatzTV/Pages/LocalLibraries.razor

@ -7,7 +7,7 @@
<MudForm Style="max-height: 100%"> <MudForm Style="max-height: 100%">
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center"> <MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-8" StartIcon="@Icons.Material.Filled.Add" Href="media/sources/local/add"> <MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-6" StartIcon="@Icons.Material.Filled.Add" Href="media/sources/local/add">
Add Local Library Add Local Library
</MudButton> </MudButton>
</MudPaper> </MudPaper>

2
ErsatzTV/Pages/LocalLibraryEditor.razor

@ -11,7 +11,7 @@
<MudForm Model="@_model" @bind-IsValid="@_success" Style="max-height: 100%"> <MudForm Model="@_model" @bind-IsValid="@_success" Style="max-height: 100%">
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center"> <MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-8" OnClick="SaveChangesAsync" StartIcon="@(IsEdit ? Icons.Material.Filled.Save : Icons.Material.Filled.Add)">@(IsEdit ? "Save Local Library" : "Add Local Library")</MudButton> <MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-6" OnClick="SaveChangesAsync" StartIcon="@(IsEdit ? Icons.Material.Filled.Save : Icons.Material.Filled.Add)">@(IsEdit ? "Save Local Library" : "Add Local Library")</MudButton>
</MudPaper> </MudPaper>
<div class="d-flex flex-column" style="height: 100vh; overflow-x: auto"> <div class="d-flex flex-column" style="height: 100vh; overflow-x: auto">
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8"> <MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">

2
ErsatzTV/Pages/MultiCollectionEditor.razor

@ -9,7 +9,7 @@
<MudForm @ref="_form" @bind-IsValid="@_success" Style="max-height: 100%"> <MudForm @ref="_form" @bind-IsValid="@_success" Style="max-height: 100%">
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center"> <MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="@(_ => HandleSubmitAsync())" Class="ml-8" StartIcon="@Icons.Material.Filled.Save"> <MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="@(_ => HandleSubmitAsync())" Class="ml-6" StartIcon="@Icons.Material.Filled.Save">
@(IsEdit ? "Save Multi Collection" : "Add Multi Collection") @(IsEdit ? "Save Multi Collection" : "Add Multi Collection")
</MudButton> </MudButton>
</MudPaper> </MudPaper>

455
ErsatzTV/Pages/PlayoutAlternateSchedulesEditor.razor

@ -10,204 +10,151 @@
@inject ISnackbar Snackbar @inject ISnackbar Snackbar
@inject IMediator Mediator @inject IMediator Mediator
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8"> <MudForm Style="max-height: 100%">
<MudTable Hover="true" Items="_items.OrderBy(i => i.Index)" Dense="true" @bind-SelectedItem="_selectedItem"> <MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<ToolBarContent> <div style="display: flex; flex-direction: row; margin-bottom: auto; margin-top: auto; width: 100%; align-items: center" class="ml-6 mr-6">
<MudText Typo="Typo.h6">@_channelName Alternate Schedules</MudText> <div class="d-none d-md-flex">
<MudSpacer/> <MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="@(_ => SaveChanges())" StartIcon="@Icons.Material.Filled.Save">
<MudText Typo="Typo.subtitle1" Class="mr-3">In priority order from top to bottom</MudText> Save Alternate Schedules
</ToolBarContent> </MudButton>
<ColGroup> <MudButton Class="ml-3" Variant="Variant.Filled" Color="Color.Default" OnClick="@(_ => AddAlternateSchedule())" StartIcon="@Icons.Material.Filled.PlaylistAdd">
<col/> Add Alternate Schedule
<col/> </MudButton>
<col/>
<col/>
<col style="width: 60px;"/>
<col style="width: 60px;"/>
<col style="width: 60px;"/>
</ColGroup>
<HeaderContent>
<MudTh>Schedule</MudTh>
<MudTh>Days of the Week</MudTh>
<MudTh>Days of the Month</MudTh>
<MudTh>Months</MudTh>
<MudTh/>
<MudTh/>
<MudTh/>
</HeaderContent>
<RowTemplate>
<MudTd DataLabel="Schedule">
<MudText Typo="@(context == _selectedItem ? Typo.subtitle2 : Typo.body2)">
@context.ProgramSchedule.Name
</MudText>
</MudTd>
<MudTd DataLabel="Days of the Week">
<MudText Typo="@(context == _selectedItem ? Typo.subtitle2 : Typo.body2)">
@ToDaysOfWeekString(context.DaysOfWeek)
</MudText>
</MudTd>
<MudTd DataLabel="Days of the Month">
<MudText Typo="@(context == _selectedItem ? Typo.subtitle2 : Typo.body2)">
@ToDaysOfMonthString(context.DaysOfMonth)
</MudText>
</MudTd>
<MudTd DataLabel="Months">
<MudText Typo="@(context == _selectedItem ? Typo.subtitle2 : Typo.body2)">
@ToMonthsOfYearString(context.MonthsOfYear)
</MudText>
</MudTd>
<MudTd>
<MudIconButton Icon="@Icons.Material.Filled.ArrowUpward"
OnClick="@(_ => MoveItemUp(context))"
Disabled="@(_items.All(x => x.Index >= context.Index))">
</MudIconButton>
</MudTd>
<MudTd>
<MudIconButton Icon="@Icons.Material.Filled.ArrowDownward"
OnClick="@(_ => MoveItemDown(context))"
Disabled="@(_items.All(x => x.Index <= context.Index))">
</MudIconButton>
</MudTd>
<MudTd>
<MudIconButton Icon="@Icons.Material.Filled.Delete"
OnClick="@(_ => RemoveAlternateSchedule(context))"
Disabled="@(_items.Count == 1)">
</MudIconButton>
</MudTd>
</RowTemplate>
</MudTable>
<MudButton Variant="Variant.Filled" Color="Color.Default" OnClick="@(_ => AddAlternateSchedule())" Class="mt-4">
Add Alternate Schedule
</MudButton>
<MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="@(_ => SaveChanges())" Class="mt-4 ml-4">
Save Changes
</MudButton>
@if (_selectedItem is not null)
{
<EditForm Model="_selectedItem">
<FluentValidationValidator/>
<div style="display: flex; flex-direction: row;" class="mt-6">
<div style="flex-grow: 1; max-width: 400px;" class="mr-6">
<MudCard>
<MudCardContent>
<MudSelect Label="Schedule" @bind-Value="_selectedItem.ProgramSchedule" For="@(() => _selectedItem.ProgramSchedule)">
@foreach (ProgramScheduleViewModel schedule in _schedules)
{
<MudSelectItem Value="@schedule">@schedule.Name</MudSelectItem>
}
</MudSelect>
</MudCardContent>
</MudCard>
<MudCard Class="mt-4">
<MudCardContent>
<MudElement HtmlTag="div" Class="mt-3">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Monday)"
Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Monday))"
ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Monday, c))"/>
</MudElement>
<MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Tuesday)"
Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Tuesday))"
ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Tuesday, c))"/>
</MudElement>
<MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Wednesday)"
Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Wednesday))"
ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Wednesday, c))"/>
</MudElement>
<MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Thursday)"
Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Thursday))"
ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Thursday, c))"/>
</MudElement>
<MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Friday)"
Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Friday))"
ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Friday, c))"/>
</MudElement>
<MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Saturday)"
Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Saturday))"
ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Saturday, c))"/>
</MudElement>
<MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Sunday)"
Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Sunday))"
ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Sunday, c))"/>
</MudElement>
</MudCardContent>
<MudCardActions>
<MudButton Variant="Variant.Text" Color="Color.Primary" OnClick="@(_ => SelectWeekdays())">
Weekdays
</MudButton>
<MudButton Variant="Variant.Text" Color="Color.Primary" OnClick="@(_ => SelectWeekends())">
Weekends
</MudButton>
<MudButton Variant="Variant.Text" Color="Color.Primary" OnClick="@(_ => SelectAllDaysOfWeek())">
All
</MudButton>
<MudButton Variant="Variant.Text" Color="Color.Primary" OnClick="@(_ => SelectNoDaysOfWeek())">
None
</MudButton>
</MudCardActions>
</MudCard>
</div>
<div style="flex-grow: 1; max-width: 400px;" class="mr-6">
<MudCard>
<MudCardContent>
<MudGrid Justify="Justify.FlexStart" Class="mt-3">
@foreach (int day in Enumerable.Range(1, 31))
{
<MudItem xs="3">
<MudCheckBox T="bool" Label="@day.ToString()"
Value="@(_selectedItem.DaysOfMonth.Contains(day))"
ValueChanged="@((bool c) => DayOfMonthChanged(day, c))"/>
</MudItem>
}
</MudGrid>
</MudCardContent>
<MudCardActions>
<MudButton Variant="Variant.Text" Color="Color.Primary" OnClick="@(_ => SelectAllDaysOfMonth())">
All
</MudButton>
<MudButton Variant="Variant.Text" Color="Color.Primary" OnClick="@(_ => SelectNoDaysOfMonth())">
None
</MudButton>
</MudCardActions>
</MudCard>
</div>
<div style="flex-grow: 1; max-width: 400px;">
<MudCard>
<MudCardContent>
<MudElement HtmlTag="div" Class="mt-3">
<MudCheckBox T="bool" Label="@_dtf.GetMonthName(1)"
Value="@(_selectedItem.MonthsOfYear.Contains(1))"
ValueChanged="@((bool c) => MonthOfYearChanged(1, c))"/>
</MudElement>
@foreach (int month in Enumerable.Range(2, 11))
{
<MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetMonthName(month)"
Value="@(_selectedItem.MonthsOfYear.Contains(month))"
ValueChanged="@((bool c) => MonthOfYearChanged(month, c))"/>
</MudElement>
}
</MudCardContent>
<MudCardActions>
<MudButton Variant="Variant.Text" Color="Color.Primary" OnClick="@(_ => SelectAllMonthsOfYear())">
All
</MudButton>
<MudButton Variant="Variant.Text" Color="Color.Primary" OnClick="@(_ => SelectNoMonthsOfYear())">
None
</MudButton>
</MudCardActions>
</MudCard>
</div>
</div> </div>
</EditForm> <div style="align-items: center; display: flex; margin-left: auto;" class="d-md-none">
} <div class="flex-grow-1"></div>
</MudContainer> <MudMenu Icon="@Icons.Material.Filled.MoreVert">
<MudMenuItem Icon="@Icons.Material.Filled.Save" Label="Save Alternate Schedules" OnClick="@SaveChanges"/>
<MudMenuItem Icon="@Icons.Material.Filled.PlaylistAdd" Label="Add Alternate Schedule" OnClick="AddAlternateSchedule"/>
</MudMenu>
</div>
</div>
</MudPaper>
<div class="d-flex flex-column" style="height: 100vh; overflow-x: auto">
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">
<MudText Typo="Typo.h5" Class="mb-2">@_channelName - Content</MudText>
<MudDivider Class="mb-6"/>
<MudText Typo="Typo.body2" Class="mb-6">In priority order from top to bottom. The bottom entry will *always* match all days and all months, as a catch-all.</MudText>
<MudTable Hover="true" Items="_items.OrderBy(i => i.Index)" Dense="true" @bind-SelectedItem="_selectedItem" RowClassFunc="@SelectedRowClassFunc">
<ColGroup>
<MudHidden Breakpoint="Breakpoint.Xs">
<col/>
<col/>
<col/>
<col/>
<col style="width: 180px;"/>
</MudHidden>
</ColGroup>
<HeaderContent>
<MudTh>Schedule</MudTh>
<MudTh>Days of the Week</MudTh>
<MudTh>Days of the Month</MudTh>
<MudTh>Months</MudTh>
<MudTh/>
</HeaderContent>
<RowTemplate>
<MudTd>
<MudText Typo="@(context == _selectedItem ? Typo.subtitle2 : Typo.body2)">
@context.ProgramSchedule.Name
</MudText>
</MudTd>
<MudTd>
<MudText Typo="@(context == _selectedItem ? Typo.subtitle2 : Typo.body2)">
@ToDaysOfWeekString(context.DaysOfWeek)
</MudText>
</MudTd>
<MudTd>
<MudText Typo="@(context == _selectedItem ? Typo.subtitle2 : Typo.body2)">
@ToDaysOfMonthString(context.DaysOfMonth)
</MudText>
</MudTd>
<MudTd>
<MudText Typo="@(context == _selectedItem ? Typo.subtitle2 : Typo.body2)">
@ToMonthsOfYearString(context.MonthsOfYear)
</MudText>
</MudTd>
<MudTd>
<div class="d-flex">
<MudIconButton Icon="@Icons.Material.Filled.ArrowUpward"
OnClick="@(_ => MoveItemUp(context))"
Disabled="@(_items.All(x => x.Index >= context.Index))">
</MudIconButton>
<MudIconButton Icon="@Icons.Material.Filled.ArrowDownward"
OnClick="@(_ => MoveItemDown(context))"
Disabled="@(_items.All(x => x.Index <= context.Index))">
</MudIconButton>
<MudIconButton Icon="@Icons.Material.Filled.Delete"
OnClick="@(_ => RemoveAlternateSchedule(context))"
Disabled="@(_items.Count == 1)">
</MudIconButton>
</div>
</MudTd>
</RowTemplate>
</MudTable>
@if (_selectedItem is not null)
{
<MudText Typo="Typo.h5" Class="mt-10 mb-2">Edit Content</MudText>
<MudDivider Class="mb-6"/>
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
<div class="d-flex">
<MudText>Schedule</MudText>
</div>
<MudSelect @bind-Value="_selectedItem.ProgramSchedule" For="@(() => _selectedItem.ProgramSchedule)">
@foreach (ProgramScheduleViewModel schedule in _schedules)
{
<MudSelectItem Value="@schedule">@schedule.Name</MudSelectItem>
}
</MudSelect>
</MudStack>
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
<div class="d-flex">
<MudText>Days of the Week</MudText>
</div>
<MudSelect T="DayOfWeek" SelectedValues="@_selectedItem.DaysOfWeek" SelectedValuesChanged="OnSelectedDaysChanged" MultiSelection="true" Clearable="true" SelectAll="true" SelectAllText="Select All Days">
<MudSelectItem Value="@DayOfWeek.Monday">@_dtf.GetDayName(DayOfWeek.Monday)</MudSelectItem>
<MudSelectItem Value="@DayOfWeek.Tuesday">@_dtf.GetDayName(DayOfWeek.Tuesday)</MudSelectItem>
<MudSelectItem Value="@DayOfWeek.Wednesday">@_dtf.GetDayName(DayOfWeek.Wednesday)</MudSelectItem>
<MudSelectItem Value="@DayOfWeek.Thursday">@_dtf.GetDayName(DayOfWeek.Thursday)</MudSelectItem>
<MudSelectItem Value="@DayOfWeek.Friday">@_dtf.GetDayName(DayOfWeek.Friday)</MudSelectItem>
<MudSelectItem Value="@DayOfWeek.Saturday">@_dtf.GetDayName(DayOfWeek.Saturday)</MudSelectItem>
<MudSelectItem Value="@DayOfWeek.Sunday">@_dtf.GetDayName(DayOfWeek.Sunday)</MudSelectItem>
</MudSelect>
</MudStack>
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
<div class="d-flex"></div>
<MudButton Variant="Variant.Filled" Color="Color.Secondary" OnClick="@(_ => SelectWeekdays())">
Weekdays
</MudButton>
<MudButton Variant="Variant.Filled" Color="Color.Secondary" OnClick="@(_ => SelectWeekends())">
Weekends
</MudButton>
</MudStack>
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
<div class="d-flex">
<MudText>Days of the Month</MudText>
</div>
<MudSelect T="int" SelectedValues="@_selectedItem.DaysOfMonth" SelectedValuesChanged="OnSelectedDaysChanged" MultiSelection="true" Clearable="true" SelectAll="true" SelectAllText="Select All Days">
@foreach (int day in Enumerable.Range(1, 31))
{
<MudSelectItem Value="@day">@day</MudSelectItem>
}
</MudSelect>
</MudStack>
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
<div class="d-flex">
<MudText>Months</MudText>
</div>
<MudSelect T="int" SelectedValues="@_selectedItem.MonthsOfYear" SelectedValuesChanged="OnSelectedMonthsChanged" MultiSelection="true" Clearable="true" SelectAll="true" SelectAllText="Select All Months">
@foreach (int month in Enumerable.Range(1, 12))
{
<MudSelectItem Value="@month">@_dtf.GetMonthName(month)</MudSelectItem>
}
</MudSelect>
</MudStack>
}
</MudContainer>
</div>
</MudForm>
@code { @code {
private readonly CancellationTokenSource _cts = new(); private readonly CancellationTokenSource _cts = new();
@ -218,8 +165,8 @@
public int Id { get; set; } public int Id { get; set; }
private string _channelName; private string _channelName;
private List<PlayoutAlternateScheduleEditViewModel> _items = new(); private List<PlayoutAlternateScheduleEditViewModel> _items = [];
private List<ProgramScheduleViewModel> _schedules = new(); private List<ProgramScheduleViewModel> _schedules = [];
private PlayoutAlternateScheduleEditViewModel _selectedItem; private PlayoutAlternateScheduleEditViewModel _selectedItem;
@ -257,97 +204,29 @@
MonthsOfYear = item.MonthsOfYear.ToList() MonthsOfYear = item.MonthsOfYear.ToList()
}; };
private void DayOfWeekChanged(DayOfWeek dayOfWeek, bool isChecked)
{
if (isChecked && !_selectedItem.DaysOfWeek.Contains(dayOfWeek))
{
_selectedItem.DaysOfWeek.Add(dayOfWeek);
_selectedItem.DaysOfWeek = _selectedItem.DaysOfWeek.OrderBy(x => ((int)x + 6) % 7).ToList();
}
if (!isChecked)
{
_selectedItem.DaysOfWeek.Remove(dayOfWeek);
}
}
private void SelectWeekdays() private void SelectWeekdays()
{ {
_selectedItem.DaysOfWeek.Clear(); _selectedItem.DaysOfWeek.Clear();
_selectedItem.DaysOfWeek.AddRange( _selectedItem.DaysOfWeek.AddRange(
new[] [
{ DayOfWeek.Monday,
DayOfWeek.Monday, DayOfWeek.Tuesday,
DayOfWeek.Tuesday, DayOfWeek.Wednesday,
DayOfWeek.Wednesday, DayOfWeek.Thursday,
DayOfWeek.Thursday, DayOfWeek.Friday
DayOfWeek.Friday ]);
});
} }
private void SelectWeekends() private void SelectWeekends()
{ {
_selectedItem.DaysOfWeek.Clear(); _selectedItem.DaysOfWeek.Clear();
_selectedItem.DaysOfWeek.AddRange( _selectedItem.DaysOfWeek.AddRange(
new[] [
{ DayOfWeek.Saturday,
DayOfWeek.Saturday, DayOfWeek.Sunday
DayOfWeek.Sunday ]);
});
} }
private void SelectAllDaysOfWeek()
{
_selectedItem.DaysOfWeek.Clear();
_selectedItem.DaysOfWeek.AddRange(ProgramScheduleAlternate.AllDaysOfWeek());
}
private void SelectNoDaysOfWeek() => _selectedItem.DaysOfWeek.Clear();
private void DayOfMonthChanged(int dayOfMonth, bool isChecked)
{
if (isChecked && !_selectedItem.DaysOfMonth.Contains(dayOfMonth))
{
_selectedItem.DaysOfMonth.Add(dayOfMonth);
_selectedItem.DaysOfMonth.Sort();
}
if (!isChecked)
{
_selectedItem.DaysOfMonth.Remove(dayOfMonth);
}
}
private void SelectAllDaysOfMonth()
{
_selectedItem.DaysOfMonth.Clear();
_selectedItem.DaysOfMonth.AddRange(ProgramScheduleAlternate.AllDaysOfMonth());
}
private void SelectNoDaysOfMonth() => _selectedItem.DaysOfMonth.Clear();
private void MonthOfYearChanged(int monthOfYear, bool isChecked)
{
if (isChecked && !_selectedItem.MonthsOfYear.Contains(monthOfYear))
{
_selectedItem.MonthsOfYear.Add(monthOfYear);
_selectedItem.MonthsOfYear.Sort();
}
if (!isChecked)
{
_selectedItem.MonthsOfYear.Remove(monthOfYear);
}
}
private void SelectAllMonthsOfYear()
{
_selectedItem.MonthsOfYear.Clear();
_selectedItem.MonthsOfYear.AddRange(ProgramScheduleAlternate.AllMonthsOfYear());
}
private void SelectNoMonthsOfYear() => _selectedItem.MonthsOfYear.Clear();
private void AddAlternateSchedule() private void AddAlternateSchedule()
{ {
var item = new PlayoutAlternateScheduleEditViewModel var item = new PlayoutAlternateScheduleEditViewModel
@ -474,4 +353,24 @@
return result.ToString(); return result.ToString();
} }
private string SelectedRowClassFunc(PlayoutAlternateScheduleEditViewModel element, int rowNumber) => _selectedItem != null && _selectedItem == element ? "selected" : string.Empty;
private void OnSelectedDaysChanged(IEnumerable<DayOfWeek> selectedDays)
{
_selectedItem.DaysOfWeek.Clear();
_selectedItem.DaysOfWeek.AddRange(selectedDays);
}
private void OnSelectedDaysChanged(IEnumerable<int> selectedDays)
{
_selectedItem.DaysOfMonth.Clear();
_selectedItem.DaysOfMonth.AddRange(selectedDays);
}
private void OnSelectedMonthsChanged(IEnumerable<int> selectedMonths)
{
_selectedItem.MonthsOfYear.Clear();
_selectedItem.MonthsOfYear.AddRange(selectedMonths);
}
} }

2
ErsatzTV/Pages/PlayoutEditor.razor

@ -13,7 +13,7 @@
<MudForm @ref="_form" Validation="@(_validator.ValidateValue)" ValidationDelay="0" Style="max-height: 100%"> <MudForm @ref="_form" Validation="@(_validator.ValidateValue)" ValidationDelay="0" Style="max-height: 100%">
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center"> <MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<MudButton Class="ml-8" OnClick="HandleSubmitAsync" Variant="Variant.Filled" Color="Color.Primary" StartIcon="@Icons.Material.Filled.Add"> <MudButton Class="ml-6" OnClick="HandleSubmitAsync" Variant="Variant.Filled" Color="Color.Primary" StartIcon="@Icons.Material.Filled.Add">
@switch (Kind) @switch (Kind)
{ {
case PlayoutKind.ExternalJson: case PlayoutKind.ExternalJson:

624
ErsatzTV/Pages/PlayoutTemplatesEditor.razor

@ -10,287 +10,247 @@
@inject ISnackbar Snackbar @inject ISnackbar Snackbar
@inject IMediator Mediator @inject IMediator Mediator
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8"> <MudForm Style="max-height: 100%">
<MudTable T="PlayoutTemplateEditViewModel" Class="mt-4" Hover="true" Items="_items.OrderBy(i => i.Index)" Dense="true" SelectedItem="@_selectedItem" SelectedItemChanged="@(vm => SelectedItemChanged(vm))"> <MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<ToolBarContent> <div style="display: flex; flex-direction: row; margin-bottom: auto; margin-top: auto; width: 100%; align-items: center" class="ml-6 mr-6">
<MudText Typo="Typo.h6">@_channelName Templates</MudText> <div class="d-none d-md-flex">
<MudSpacer/> <MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="@(_ => SaveChanges())" StartIcon="@Icons.Material.Filled.Save">
<MudText Typo="Typo.subtitle1" Class="mr-3">In priority order from top to bottom</MudText> Save Templates
</ToolBarContent> </MudButton>
<ColGroup> <MudButton Class="ml-3" Variant="Variant.Filled" Color="Color.Default" OnClick="@(_ => AddTemplate())" StartIcon="@Icons.Material.Filled.PlaylistAdd">
<col/> Add Template
<col/> </MudButton>
<col/> <MudButton Class="ml-3" Variant="Variant.Filled" Color="Color.Secondary" OnClick="@(_ => PreviewCalendar())" StartIcon="@Icons.Material.Filled.Preview">
<col/> Preview Calendar
<col style="width: 60px;"/> </MudButton>
<col style="width: 60px;"/>
<col style="width: 60px;"/>
</ColGroup>
<HeaderContent>
<MudTh>Template</MudTh>
<MudTh>Days of the Week</MudTh>
<MudTh>Days of the Month</MudTh>
<MudTh>Months</MudTh>
<MudTh/>
<MudTh/>
<MudTh/>
</HeaderContent>
<RowTemplate>
<MudTd DataLabel="Template">
<MudText Typo="@(context == _selectedItem ? Typo.subtitle2 : Typo.body2)">
@context.Template?.Name
</MudText>
</MudTd>
<MudTd DataLabel="Days of the Week">
<MudText Typo="@(context == _selectedItem ? Typo.subtitle2 : Typo.body2)">
@ToDaysOfWeekString(context.DaysOfWeek)
</MudText>
</MudTd>
<MudTd DataLabel="Days of the Month">
<MudText Typo="@(context == _selectedItem ? Typo.subtitle2 : Typo.body2)">
@ToDaysOfMonthString(context.DaysOfMonth)
</MudText>
</MudTd>
<MudTd DataLabel="Months">
<MudText Typo="@(context == _selectedItem ? Typo.subtitle2 : Typo.body2)">
@ToMonthsOfYearString(context.MonthsOfYear)
</MudText>
</MudTd>
<MudTd>
<MudIconButton Icon="@Icons.Material.Filled.ArrowUpward"
OnClick="@(_ => MoveItemUp(context))"
Disabled="@(_items.All(x => x.Index >= context.Index))">
</MudIconButton>
</MudTd>
<MudTd>
<MudIconButton Icon="@Icons.Material.Filled.ArrowDownward"
OnClick="@(_ => MoveItemDown(context))"
Disabled="@(_items.All(x => x.Index <= context.Index))">
</MudIconButton>
</MudTd>
<MudTd>
<MudIconButton Icon="@Icons.Material.Filled.Delete"
OnClick="@(_ => DeleteTemplate(context))">
</MudIconButton>
</MudTd>
</RowTemplate>
</MudTable>
<MudButton Variant="Variant.Filled" Color="Color.Default" OnClick="@(_ => AddTemplate())" Class="mt-4">
Add Template
</MudButton>
<MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="@(_ => SaveChanges())" Class="mt-4 ml-4">
Save Changes
</MudButton>
<MudButton Variant="Variant.Filled" Color="Color.Secondary" OnClick="@(_ => PreviewCalendar())" Class="mt-4 ml-4">
Preview Calendar
</MudButton>
@if (_selectedItem is not null)
{
<EditForm Model="_selectedItem">
<FluentValidationValidator/>
<div style="display: flex; flex-direction: row;" class="mt-6">
<div style="flex-grow: 1; max-width: 400px;" class="mr-6">
<MudCard>
<MudCardContent>
<MudSelect T="TemplateGroupViewModel" Label="Template Group" Value="@_selectedGroup" ValueChanged="@(vm => UpdateTemplateGroupItems(vm))">
@foreach (TemplateGroupViewModel templateGroup in _templateGroups)
{
<MudSelectItem Value="@templateGroup">
@templateGroup.Name
</MudSelectItem>
}
</MudSelect>
<MudSelect Label="Template" @bind-Value="_selectedItem.Template" For="@(() => _selectedItem.Template)">
@foreach (TemplateViewModel template in _templates)
{
<MudSelectItem Value="@template">@template.Name</MudSelectItem>
}
</MudSelect>
</MudCardContent>
</MudCard>
<MudCard Class="mt-4">
<MudCardContent>
<MudSelect T="DecoTemplateGroupViewModel" Label="Deco Template Group" Value="@_selectedDecoTemplateGroup" ValueChanged="@(vm => UpdateDecoTemplateGroupItems(vm))">
@foreach (DecoTemplateGroupViewModel decoTemplateGroup in _decoTemplateGroups)
{
<MudSelectItem Value="@decoTemplateGroup">
@decoTemplateGroup.Name
</MudSelectItem>
}
</MudSelect>
<MudSelect Label="Deco Template" @bind-Value="_selectedItem.DecoTemplate" For="@(() => _selectedItem.DecoTemplate)" Clearable="true">
@foreach (DecoTemplateViewModel decoTemplate in _decoTemplates)
{
<MudSelectItem Value="@decoTemplate">@decoTemplate.Name</MudSelectItem>
}
</MudSelect>
</MudCardContent>
</MudCard>
<MudCard Class="mt-4">
<MudCardContent>
<MudCheckBox T="bool" Class="mt-3" Label="Limit To Date Range"
@bind-Value="_selectedItem.LimitToDateRange"/>
@if (_selectedItem.LimitToDateRange)
{
<MudGrid Class="mt-2" Style="align-items: start" Justify="Justify.Center">
<MudItem xs="6">
<MudSelect T="int" @bind-Value="_selectedItem.StartMonth" Label="Start Month">
@foreach (int month in Enumerable.Range(1, 12))
{
<MudSelectItem Value="@month">@_dtf.GetMonthName(month)</MudSelectItem>
}
</MudSelect>
</MudItem>
<MudItem xs="6">
<MudSelect T="int" @bind-Value="_selectedItem.StartDay" Label="Start Day">
@foreach (int day in Enumerable.Range(1, 31))
{
<MudSelectItem Value="@day">@day.ToString()</MudSelectItem>
}
</MudSelect>
</MudItem>
</MudGrid>
<MudGrid Class="mt-2" Style="align-items: start" Justify="Justify.Center">
<MudItem xs="6">
<MudSelect T="int" @bind-Value="_selectedItem.EndMonth" Label="End Month">
@foreach (int month in Enumerable.Range(1, 12))
{
<MudSelectItem Value="@month">@_dtf.GetMonthName(month)</MudSelectItem>
}
</MudSelect>
</MudItem>
<MudItem xs="6">
<MudSelect T="int" @bind-Value="_selectedItem.EndDay" Label="End Day">
@foreach (int day in Enumerable.Range(1, 31))
{
<MudSelectItem Value="@day">@day.ToString()</MudSelectItem>
}
</MudSelect>
</MudItem>
</MudGrid>
}
</MudCardContent>
</MudCard>
<MudCard Class="mt-4">
<MudCardContent>
<MudElement HtmlTag="div" Class="mt-3">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Monday)"
Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Monday))"
ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Monday, c))"/>
</MudElement>
<MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Tuesday)"
Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Tuesday))"
ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Tuesday, c))"/>
</MudElement>
<MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Wednesday)"
Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Wednesday))"
ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Wednesday, c))"/>
</MudElement>
<MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Thursday)"
Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Thursday))"
ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Thursday, c))"/>
</MudElement>
<MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Friday)"
Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Friday))"
ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Friday, c))"/>
</MudElement>
<MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Saturday)"
Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Saturday))"
ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Saturday, c))"/>
</MudElement>
<MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Sunday)"
Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Sunday))"
ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Sunday, c))"/>
</MudElement>
</MudCardContent>
<MudCardActions>
<MudButton Variant="Variant.Text" Color="Color.Primary" OnClick="@(_ => SelectWeekdays())">
Weekdays
</MudButton>
<MudButton Variant="Variant.Text" Color="Color.Primary" OnClick="@(_ => SelectWeekends())">
Weekends
</MudButton>
<MudButton Variant="Variant.Text" Color="Color.Primary" OnClick="@(_ => SelectAllDaysOfWeek())">
All
</MudButton>
<MudButton Variant="Variant.Text" Color="Color.Primary" OnClick="@(_ => SelectNoDaysOfWeek())">
None
</MudButton>
</MudCardActions>
</MudCard>
</div> </div>
<div style="flex-grow: 1; max-width: 400px;" class="mr-6"> <div style="align-items: center; display: flex; margin-left: auto;" class="d-md-none">
<MudCard> <div class="flex-grow-1"></div>
<MudCardContent> <MudMenu Icon="@Icons.Material.Filled.MoreVert">
<MudGrid Justify="Justify.FlexStart" Class="mt-3"> <MudMenuItem Icon="@Icons.Material.Filled.Save" Label="Save Templates" OnClick="@SaveChanges"/>
@foreach (int day in Enumerable.Range(1, 31)) <MudMenuItem Icon="@Icons.Material.Filled.PlaylistAdd" Label="Add Template" OnClick="AddTemplate"/>
{ <MudMenuItem Icon="@Icons.Material.Filled.Preview" Label="Preview Calendar" OnClick="PreviewCalendar"/>
<MudItem xs="3"> </MudMenu>
<MudCheckBox T="bool" Label="@day.ToString()"
Value="@(_selectedItem.DaysOfMonth.Contains(day))"
ValueChanged="@((bool c) => DayOfMonthChanged(day, c))"/>
</MudItem>
}
</MudGrid>
</MudCardContent>
<MudCardActions>
<MudButton Variant="Variant.Text" Color="Color.Primary" OnClick="@(_ => SelectAllDaysOfMonth())">
All
</MudButton>
<MudButton Variant="Variant.Text" Color="Color.Primary" OnClick="@(_ => SelectNoDaysOfMonth())">
None
</MudButton>
</MudCardActions>
</MudCard>
</div> </div>
<div style="flex-grow: 1; max-width: 400px;"> </div>
<MudCard> </MudPaper>
<MudCardContent> <div class="d-flex flex-column" style="height: 100vh; overflow-x: auto">
<MudElement HtmlTag="div" Class="mt-3"> <MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">
<MudCheckBox T="bool" Label="@_dtf.GetMonthName(1)" <MudText Typo="Typo.h5" Class="mb-2">@_channelName - Templates</MudText>
Value="@(_selectedItem.MonthsOfYear.Contains(1))" <MudDivider Class="mb-6"/>
ValueChanged="@((bool c) => MonthOfYearChanged(1, c))"/> <MudText Typo="Typo.body2" Class="mb-6">In priority order from top to bottom. The bottom entry will *always* match all days and all months, as a catch-all.</MudText>
</MudElement> <MudTable T="PlayoutTemplateEditViewModel" Class="mt-4" Hover="true" Items="_items.OrderBy(i => i.Index)" Dense="true" SelectedItem="@_selectedItem" SelectedItemChanged="@(vm => SelectedItemChanged(vm))" RowClassFunc="@SelectedRowClassFunc">
@foreach (int month in Enumerable.Range(2, 11)) <ColGroup>
<MudHidden Breakpoint="Breakpoint.Xs">
<col/>
<col/>
<col/>
<col/>
<col style="width: 180px;"/>
</MudHidden>
</ColGroup>
<HeaderContent>
<MudTh>Template</MudTh>
<MudTh>Days of the Week</MudTh>
<MudTh>Days of the Month</MudTh>
<MudTh>Months</MudTh>
<MudTh/>
</HeaderContent>
<RowTemplate>
<MudTd>
<MudText Typo="@(context == _selectedItem ? Typo.subtitle2 : Typo.body2)">
@context.Template?.Name
</MudText>
</MudTd>
<MudTd>
<MudText Typo="@(context == _selectedItem ? Typo.subtitle2 : Typo.body2)">
@ToDaysOfWeekString(context.DaysOfWeek)
</MudText>
</MudTd>
<MudTd>
<MudText Typo="@(context == _selectedItem ? Typo.subtitle2 : Typo.body2)">
@ToDaysOfMonthString(context.DaysOfMonth)
</MudText>
</MudTd>
<MudTd>
<MudText Typo="@(context == _selectedItem ? Typo.subtitle2 : Typo.body2)">
@ToMonthsOfYearString(context.MonthsOfYear)
</MudText>
</MudTd>
<MudTd>
<div class="d-flex">
<MudIconButton Icon="@Icons.Material.Filled.ArrowUpward"
OnClick="@(_ => MoveItemUp(context))"
Disabled="@(_items.All(x => x.Index >= context.Index))">
</MudIconButton>
<MudIconButton Icon="@Icons.Material.Filled.ArrowDownward"
OnClick="@(_ => MoveItemDown(context))"
Disabled="@(_items.All(x => x.Index <= context.Index))">
</MudIconButton>
<MudIconButton Icon="@Icons.Material.Filled.Delete"
OnClick="@(_ => DeleteTemplate(context))">
</MudIconButton>
</div>
</MudTd>
</RowTemplate>
</MudTable>
@if (_selectedItem is not null)
{
<MudText Typo="Typo.h5" Class="mt-10 mb-2">Edit Template</MudText>
<MudDivider Class="mb-6"/>
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
<div class="d-flex">
<MudText>Template Group</MudText>
</div>
<MudSelect T="TemplateGroupViewModel" Value="@_selectedGroup" ValueChanged="@(vm => UpdateTemplateGroupItems(vm))">
@foreach (TemplateGroupViewModel templateGroup in _templateGroups)
{ {
<MudElement HtmlTag="div" Class="mt-2"> <MudSelectItem Value="@templateGroup">
<MudCheckBox T="bool" Label="@_dtf.GetMonthName(month)" @templateGroup.Name
Value="@(_selectedItem.MonthsOfYear.Contains(month))" </MudSelectItem>
ValueChanged="@((bool c) => MonthOfYearChanged(month, c))"/>
</MudElement>
} }
</MudCardContent> </MudSelect>
<MudCardActions> </MudStack>
<MudButton Variant="Variant.Text" Color="Color.Primary" OnClick="@(_ => SelectAllMonthsOfYear())"> <MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
All <div class="d-flex">
</MudButton> <MudText>Template</MudText>
<MudButton Variant="Variant.Text" Color="Color.Primary" OnClick="@(_ => SelectNoMonthsOfYear())"> </div>
None <MudSelect @bind-Value="_selectedItem.Template" For="@(() => _selectedItem.Template)">
</MudButton> @foreach (TemplateViewModel template in _templates)
</MudCardActions> {
</MudCard> <MudSelectItem Value="@template">@template.Name</MudSelectItem>
</div> }
</div> </MudSelect>
</EditForm> </MudStack>
} <MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
else <div class="d-flex">
{ <MudText>Deco Template Group</MudText>
<MudCard Class="mt-4"> </div>
<MudCalendar ShowWeek="false" <MudSelect T="DecoTemplateGroupViewModel" Value="@_selectedDecoTemplateGroup" ValueChanged="@(vm => UpdateDecoTemplateGroupItems(vm))">
ShowDay="false" @foreach (DecoTemplateGroupViewModel decoTemplateGroup in _decoTemplateGroups)
DateRangeChanged="@(range => DateRangeChanged(range))" {
MonthCellMinHeight="115" <MudSelectItem Value="@decoTemplateGroup">
Items="_previewItems"/> @decoTemplateGroup.Name
</MudCard> </MudSelectItem>
} }
</MudContainer> </MudSelect>
</MudStack>
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
<div class="d-flex">
<MudText>Deco Template</MudText>
</div>
<MudSelect @bind-Value="_selectedItem.DecoTemplate" For="@(() => _selectedItem.DecoTemplate)" Clearable="true">
@foreach (DecoTemplateViewModel decoTemplate in _decoTemplates)
{
<MudSelectItem Value="@decoTemplate">@decoTemplate.Name</MudSelectItem>
}
</MudSelect>
</MudStack>
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
<div class="d-flex">
<MudText>Limit to Date Range</MudText>
</div>
<MudCheckBox T="bool" @bind-Value="_selectedItem.LimitToDateRange" Dense="true"/>
</MudStack>
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
<div class="d-flex">
<MudText>Start Day</MudText>
</div>
<MudSelect T="int" @bind-Value="_selectedItem.StartMonth" Disabled="@(!_selectedItem.LimitToDateRange)">
@foreach (int month in Enumerable.Range(1, 12))
{
<MudSelectItem Value="@month">@_dtf.GetMonthName(month)</MudSelectItem>
}
</MudSelect>
</MudStack>
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
<div class="d-flex"></div>
<MudSelect T="int" @bind-Value="_selectedItem.StartDay" Disabled="@(!_selectedItem.LimitToDateRange)">
@foreach (int day in Enumerable.Range(1, 31))
{
<MudSelectItem Value="@day">@day.ToString()</MudSelectItem>
}
</MudSelect>
</MudStack>
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
<div class="d-flex">
<MudText>End Day</MudText>
</div>
<MudSelect T="int" @bind-Value="_selectedItem.EndMonth" Disabled="@(!_selectedItem.LimitToDateRange)">
@foreach (int month in Enumerable.Range(1, 12))
{
<MudSelectItem Value="@month">@_dtf.GetMonthName(month)</MudSelectItem>
}
</MudSelect>
</MudStack>
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
<div class="d-flex"></div>
<MudSelect T="int" @bind-Value="_selectedItem.EndDay" Disabled="@(!_selectedItem.LimitToDateRange)">
@foreach (int day in Enumerable.Range(1, 31))
{
<MudSelectItem Value="@day">@day.ToString()</MudSelectItem>
}
</MudSelect>
</MudStack>
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
<div class="d-flex">
<MudText>Days of the Week</MudText>
</div>
<MudSelect T="DayOfWeek" SelectedValues="@_selectedItem.DaysOfWeek" SelectedValuesChanged="OnSelectedDaysChanged" MultiSelection="true" Clearable="true" SelectAll="true" SelectAllText="Select All Days">
<MudSelectItem Value="@DayOfWeek.Monday">@_dtf.GetDayName(DayOfWeek.Monday)</MudSelectItem>
<MudSelectItem Value="@DayOfWeek.Tuesday">@_dtf.GetDayName(DayOfWeek.Tuesday)</MudSelectItem>
<MudSelectItem Value="@DayOfWeek.Wednesday">@_dtf.GetDayName(DayOfWeek.Wednesday)</MudSelectItem>
<MudSelectItem Value="@DayOfWeek.Thursday">@_dtf.GetDayName(DayOfWeek.Thursday)</MudSelectItem>
<MudSelectItem Value="@DayOfWeek.Friday">@_dtf.GetDayName(DayOfWeek.Friday)</MudSelectItem>
<MudSelectItem Value="@DayOfWeek.Saturday">@_dtf.GetDayName(DayOfWeek.Saturday)</MudSelectItem>
<MudSelectItem Value="@DayOfWeek.Sunday">@_dtf.GetDayName(DayOfWeek.Sunday)</MudSelectItem>
</MudSelect>
</MudStack>
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
<div class="d-flex"></div>
<MudButton Variant="Variant.Filled" Color="Color.Secondary" OnClick="@(_ => SelectWeekdays())">
Weekdays
</MudButton>
<MudButton Variant="Variant.Filled" Color="Color.Secondary" OnClick="@(_ => SelectWeekends())">
Weekends
</MudButton>
</MudStack>
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
<div class="d-flex">
<MudText>Days of the Month</MudText>
</div>
<MudSelect T="int" SelectedValues="@_selectedItem.DaysOfMonth" SelectedValuesChanged="OnSelectedDaysChanged" MultiSelection="true" Clearable="true" SelectAll="true" SelectAllText="Select All Days">
@foreach (int day in Enumerable.Range(1, 31))
{
<MudSelectItem Value="@day">@day</MudSelectItem>
}
</MudSelect>
</MudStack>
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
<div class="d-flex">
<MudText>Months</MudText>
</div>
<MudSelect T="int" SelectedValues="@_selectedItem.MonthsOfYear" SelectedValuesChanged="OnSelectedMonthsChanged" MultiSelection="true" Clearable="true" SelectAll="true" SelectAllText="Select All Months">
@foreach (int month in Enumerable.Range(1, 12))
{
<MudSelectItem Value="@month">@_dtf.GetMonthName(month)</MudSelectItem>
}
</MudSelect>
</MudStack>
}
else
{
<MudText Typo="Typo.h5" Class="mt-10 mb-2">Preview</MudText>
<MudDivider Class="mb-6"/>
<MudCalendar ShowWeek="false"
ShowDay="false"
DateRangeChanged="@(range => DateRangeChanged(range))"
MonthCellMinHeight="115"
Items="_previewItems"/>
}
</MudContainer>
</div>
</MudForm>
@code { @code {
private readonly CancellationTokenSource _cts = new(); private readonly CancellationTokenSource _cts = new();
@ -387,97 +347,29 @@ else
} }
} }
private void DayOfWeekChanged(DayOfWeek dayOfWeek, bool isChecked)
{
if (isChecked && _selectedItem != null && !_selectedItem.DaysOfWeek.Contains(dayOfWeek))
{
_selectedItem.DaysOfWeek.Add(dayOfWeek);
_selectedItem.DaysOfWeek = _selectedItem.DaysOfWeek.OrderBy(x => ((int)x + 6) % 7).ToList();
}
if (!isChecked)
{
_selectedItem?.DaysOfWeek.Remove(dayOfWeek);
}
}
private void SelectWeekdays() private void SelectWeekdays()
{ {
_selectedItem?.DaysOfWeek.Clear(); _selectedItem?.DaysOfWeek.Clear();
_selectedItem?.DaysOfWeek.AddRange( _selectedItem?.DaysOfWeek.AddRange(
new[] [
{ DayOfWeek.Monday,
DayOfWeek.Monday, DayOfWeek.Tuesday,
DayOfWeek.Tuesday, DayOfWeek.Wednesday,
DayOfWeek.Wednesday, DayOfWeek.Thursday,
DayOfWeek.Thursday, DayOfWeek.Friday
DayOfWeek.Friday ]);
});
} }
private void SelectWeekends() private void SelectWeekends()
{ {
_selectedItem?.DaysOfWeek.Clear(); _selectedItem?.DaysOfWeek.Clear();
_selectedItem?.DaysOfWeek.AddRange( _selectedItem?.DaysOfWeek.AddRange(
new[] [
{ DayOfWeek.Saturday,
DayOfWeek.Saturday, DayOfWeek.Sunday
DayOfWeek.Sunday ]);
});
}
private void SelectAllDaysOfWeek()
{
_selectedItem?.DaysOfWeek.Clear();
_selectedItem?.DaysOfWeek.AddRange(PlayoutTemplate.AllDaysOfWeek());
} }
private void SelectNoDaysOfWeek() => _selectedItem?.DaysOfWeek.Clear();
private void DayOfMonthChanged(int dayOfMonth, bool isChecked)
{
if (isChecked && !_selectedItem.DaysOfMonth.Contains(dayOfMonth))
{
_selectedItem?.DaysOfMonth.Add(dayOfMonth);
_selectedItem?.DaysOfMonth.Sort();
}
if (!isChecked)
{
_selectedItem?.DaysOfMonth.Remove(dayOfMonth);
}
}
private void SelectAllDaysOfMonth()
{
_selectedItem?.DaysOfMonth.Clear();
_selectedItem?.DaysOfMonth.AddRange(PlayoutTemplate.AllDaysOfMonth());
}
private void SelectNoDaysOfMonth() => _selectedItem?.DaysOfMonth.Clear();
private void MonthOfYearChanged(int monthOfYear, bool isChecked)
{
if (isChecked && _selectedItem != null && !_selectedItem.MonthsOfYear.Contains(monthOfYear))
{
_selectedItem.MonthsOfYear.Add(monthOfYear);
_selectedItem.MonthsOfYear.Sort();
}
if (!isChecked)
{
_selectedItem?.MonthsOfYear.Remove(monthOfYear);
}
}
private void SelectAllMonthsOfYear()
{
_selectedItem?.MonthsOfYear.Clear();
_selectedItem?.MonthsOfYear.AddRange(PlayoutTemplate.AllMonthsOfYear());
}
private void SelectNoMonthsOfYear() => _selectedItem?.MonthsOfYear.Clear();
private void AddTemplate() private void AddTemplate()
{ {
var item = new PlayoutTemplateEditViewModel var item = new PlayoutTemplateEditViewModel
@ -654,4 +546,24 @@ else
return result.ToString(); return result.ToString();
} }
private string SelectedRowClassFunc(PlayoutTemplateEditViewModel element, int rowNumber) => _selectedItem != null && _selectedItem == element ? "selected" : string.Empty;
private void OnSelectedDaysChanged(IEnumerable<DayOfWeek> selectedDays)
{
_selectedItem.DaysOfWeek.Clear();
_selectedItem.DaysOfWeek.AddRange(selectedDays);
}
private void OnSelectedDaysChanged(IEnumerable<int> selectedDays)
{
_selectedItem.DaysOfMonth.Clear();
_selectedItem.DaysOfMonth.AddRange(selectedDays);
}
private void OnSelectedMonthsChanged(IEnumerable<int> selectedMonths)
{
_selectedItem.MonthsOfYear.Clear();
_selectedItem.MonthsOfYear.AddRange(selectedMonths);
}
} }

2
ErsatzTV/Pages/ScheduleEditor.razor

@ -10,7 +10,7 @@
<MudForm @ref="_form" @bind-IsValid="@_success" Style="max-height: 100%"> <MudForm @ref="_form" @bind-IsValid="@_success" Style="max-height: 100%">
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center"> <MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-8" OnClick="HandleSubmitAsync" StartIcon="@(IsEdit ? Icons.Material.Filled.Save : Icons.Material.Filled.Add)">@(IsEdit ? "Save Schedule" : "Add Schedule")</MudButton> <MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-6" OnClick="HandleSubmitAsync" StartIcon="@(IsEdit ? Icons.Material.Filled.Save : Icons.Material.Filled.Add)">@(IsEdit ? "Save Schedule" : "Add Schedule")</MudButton>
</MudPaper> </MudPaper>
<div class="d-flex flex-column" style="height: 100vh; overflow-x: auto"> <div class="d-flex flex-column" style="height: 100vh; overflow-x: auto">
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8"> <MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">

6
ErsatzTV/Pages/ScheduleItemsEditor.razor

@ -13,12 +13,6 @@
@inject ISnackbar Snackbar @inject ISnackbar Snackbar
@inject IMediator Mediator @inject IMediator Mediator
<style>
.selected {
background-color: #009000 !important;
}
</style>
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8"> <MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">
<MudTable T="ProgramScheduleItemEditViewModel" <MudTable T="ProgramScheduleItemEditViewModel"
Hover="true" Hover="true"

2
ErsatzTV/Pages/Schedules.razor

@ -9,7 +9,7 @@
<MudForm Style="max-height: 100%"> <MudForm Style="max-height: 100%">
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center"> <MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-8" StartIcon="@Icons.Material.Filled.Add" Href="schedules/add"> <MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-6" StartIcon="@Icons.Material.Filled.Add" Href="schedules/add">
Add Schedule Add Schedule
</MudButton> </MudButton>
</MudPaper> </MudPaper>

2
ErsatzTV/Pages/Settings/FFmpegSettings.razor

@ -14,7 +14,7 @@
<MudForm @ref="_form" @bind-IsValid="@_success" Style="max-height: 100%"> <MudForm @ref="_form" @bind-IsValid="@_success" Style="max-height: 100%">
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center"> <MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="@(_ => SaveFFmpegSettings())" Class="ml-8" StartIcon="@Icons.Material.Filled.Save">Save Settings</MudButton> <MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="@(_ => SaveFFmpegSettings())" Class="ml-6" StartIcon="@Icons.Material.Filled.Save">Save Settings</MudButton>
</MudPaper> </MudPaper>
<div class="d-flex flex-column" style="height: 100vh; overflow-x: auto"> <div class="d-flex flex-column" style="height: 100vh; overflow-x: auto">
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8"> <MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">

2
ErsatzTV/Pages/Settings/HDHRSettings.razor

@ -8,7 +8,7 @@
<MudForm @ref="_form" @bind-IsValid="@_hdhrSuccess" Style="max-height: 100%"> <MudForm @ref="_form" @bind-IsValid="@_hdhrSuccess" Style="max-height: 100%">
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center"> <MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="@(_ => SaveHDHRSettings())" Class="ml-8" StartIcon="@Icons.Material.Filled.Save">Save Settings</MudButton> <MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="@(_ => SaveHDHRSettings())" Class="ml-6" StartIcon="@Icons.Material.Filled.Save">Save Settings</MudButton>
</MudPaper> </MudPaper>
<div class="d-flex flex-column" style="height: 100vh; overflow-x: auto"> <div class="d-flex flex-column" style="height: 100vh; overflow-x: auto">
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8"> <MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">

2
ErsatzTV/Pages/Settings/LoggingSettings.razor

@ -8,7 +8,7 @@
<MudForm Style="max-height: 100%"> <MudForm Style="max-height: 100%">
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center"> <MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="@(_ => SaveLoggingSettings())" Class="ml-8" StartIcon="@Icons.Material.Filled.Save">Save Settings</MudButton> <MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="@(_ => SaveLoggingSettings())" Class="ml-6" StartIcon="@Icons.Material.Filled.Save">Save Settings</MudButton>
</MudPaper> </MudPaper>
<div class="d-flex flex-column" style="height: 100vh; overflow-x: auto"> <div class="d-flex flex-column" style="height: 100vh; overflow-x: auto">
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8"> <MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">

2
ErsatzTV/Pages/Settings/PlayoutSettings.razor

@ -7,7 +7,7 @@
<MudForm @ref="_form" @bind-IsValid="@_playoutSuccess" Style="max-height: 100%"> <MudForm @ref="_form" @bind-IsValid="@_playoutSuccess" Style="max-height: 100%">
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center"> <MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="@(_ => SavePlayoutSettings())" Class="ml-8" StartIcon="@Icons.Material.Filled.Save">Save Settings</MudButton> <MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="@(_ => SavePlayoutSettings())" Class="ml-6" StartIcon="@Icons.Material.Filled.Save">Save Settings</MudButton>
</MudPaper> </MudPaper>
<div class="d-flex flex-column" style="height: 100vh; overflow-x: auto"> <div class="d-flex flex-column" style="height: 100vh; overflow-x: auto">
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8"> <MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">

2
ErsatzTV/Pages/Settings/ScannerSettings.razor

@ -7,7 +7,7 @@
<MudForm @ref="_form" @bind-IsValid="@_scannerSuccess" Style="max-height: 100%"> <MudForm @ref="_form" @bind-IsValid="@_scannerSuccess" Style="max-height: 100%">
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center"> <MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="@(_ => SaveScannerSettings())" Class="ml-8" StartIcon="@Icons.Material.Filled.Save">Save Settings</MudButton> <MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="@(_ => SaveScannerSettings())" Class="ml-6" StartIcon="@Icons.Material.Filled.Save">Save Settings</MudButton>
</MudPaper> </MudPaper>
<div class="d-flex flex-column" style="height: 100vh; overflow-x: auto"> <div class="d-flex flex-column" style="height: 100vh; overflow-x: auto">
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8"> <MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">

2
ErsatzTV/Pages/Settings/XMLTVSettings.razor

@ -7,7 +7,7 @@
<MudForm Style="max-height: 100%"> <MudForm Style="max-height: 100%">
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center"> <MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="@(_ => SaveXmltvSettings())" Class="ml-8" StartIcon="@Icons.Material.Filled.Save">Save Settings</MudButton> <MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="@(_ => SaveXmltvSettings())" Class="ml-6" StartIcon="@Icons.Material.Filled.Save">Save Settings</MudButton>
</MudPaper> </MudPaper>
<div class="d-flex flex-column" style="height: 100vh; overflow-x: auto"> <div class="d-flex flex-column" style="height: 100vh; overflow-x: auto">
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8"> <MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">

2
ErsatzTV/Pages/TemplateEditor.razor

@ -9,7 +9,7 @@
<MudForm Style="max-height: 100%"> <MudForm Style="max-height: 100%">
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center"> <MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-8" OnClick="@(_ => SaveChanges())" StartIcon="@Icons.Material.Filled.Save"> <MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-6" OnClick="@(_ => SaveChanges())" StartIcon="@Icons.Material.Filled.Save">
Save Template Save Template
</MudButton> </MudButton>
</MudPaper> </MudPaper>

2
ErsatzTV/Pages/WatermarkEditor.razor

@ -14,7 +14,7 @@
<MudForm Model="@_model" @ref="@_form" Validation="@(_validator.ValidateValue)" ValidationDelay="0" Style="max-height: 100%"> <MudForm Model="@_model" @ref="@_form" Validation="@(_validator.ValidateValue)" ValidationDelay="0" Style="max-height: 100%">
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center"> <MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-8" OnClick="HandleSubmitAsync" StartIcon="@(IsEdit ? Icons.Material.Filled.Save : Icons.Material.Filled.Add)">@(IsEdit ? "Save Watermark" : "Add Watermark")</MudButton> <MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-6" OnClick="HandleSubmitAsync" StartIcon="@(IsEdit ? Icons.Material.Filled.Save : Icons.Material.Filled.Add)">@(IsEdit ? "Save Watermark" : "Add Watermark")</MudButton>
</MudPaper> </MudPaper>
<div class="d-flex flex-column" style="height: 100vh; overflow-x: auto"> <div class="d-flex flex-column" style="height: 100vh; overflow-x: auto">
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8"> <MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">

2
ErsatzTV/Pages/Watermarks.razor

@ -7,7 +7,7 @@
<MudForm Style="max-height: 100%"> <MudForm Style="max-height: 100%">
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center"> <MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-8" StartIcon="@Icons.Material.Filled.Add" Href="watermarks/add"> <MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-6" StartIcon="@Icons.Material.Filled.Add" Href="watermarks/add">
Add Watermark Add Watermark
</MudButton> </MudButton>
</MudPaper> </MudPaper>

2
ErsatzTV/Pages/YamlPlayoutEditor.razor

@ -11,7 +11,7 @@
<MudForm Style="max-height: 100%"> <MudForm Style="max-height: 100%">
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center"> <MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-8" OnClick="@(_ => SaveChanges())" StartIcon="@Icons.Material.Filled.Save"> <MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-6" OnClick="@(_ => SaveChanges())" StartIcon="@Icons.Material.Filled.Save">
Save YAML File Save YAML File
</MudButton> </MudButton>
</MudPaper> </MudPaper>

2
ErsatzTV/Shared/RemoteMediaSourceLibrariesEditor.razor

@ -8,7 +8,7 @@
<MudForm Style="max-height: 100%"> <MudForm Style="max-height: 100%">
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center"> <MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-8" StartIcon="@Icons.Material.Filled.Save" OnClick="@(_ => SaveChanges())"> <MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-6" StartIcon="@Icons.Material.Filled.Save" OnClick="@(_ => SaveChanges())">
Save Changes Save Changes
</MudButton> </MudButton>
</MudPaper> </MudPaper>

4
ErsatzTV/wwwroot/css/site.css

@ -167,3 +167,7 @@
.mud-table-smalldevices-sortselect { .mud-table-smalldevices-sortselect {
display: none !important; display: none !important;
} }
.selected {
background-color: #009000 !important;
}

Loading…
Cancel
Save