rework schedule items editor (#2146)
This commit is contained in:
+1
-1
@@ -83,7 +83,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||
- Remove some limits on multithreading that are no longer needed with latest ffmpeg
|
||||
- Mixed transcoding (software decode, hardware filters/encode) can now use multiple decode threads
|
||||
- Split main `Settings` page into multiple pages
|
||||
- Update UI layout on most pages to be less cramped and to work better on mobile
|
||||
- Update UI layout on all pages to be less cramped and to work better on mobile
|
||||
|
||||
### Fixed
|
||||
- Fix QSV acceleration in docker with older Intel devices
|
||||
|
||||
@@ -13,405 +13,548 @@
|
||||
@inject ISnackbar Snackbar
|
||||
@inject IMediator Mediator
|
||||
|
||||
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">
|
||||
<MudTable T="ProgramScheduleItemEditViewModel"
|
||||
Hover="true"
|
||||
Items="_schedule?.Items?.OrderBy(i => i.Index)"
|
||||
Dense="true"
|
||||
SelectedItemChanged="@(vm => SelectedItemChanged(vm))"
|
||||
RowClassFunc="@SelectedRowClassFunc">
|
||||
<ToolBarContent>
|
||||
<MudText Typo="Typo.h6">@_schedule.Name Items</MudText>
|
||||
</ToolBarContent>
|
||||
<ColGroup>
|
||||
<col/>
|
||||
<col/>
|
||||
<col/>
|
||||
<col style="width: 60px;"/>
|
||||
<col style="width: 60px;"/>
|
||||
<col style="width: 60px;"/>
|
||||
<col style="width: 60px;"/>
|
||||
</ColGroup>
|
||||
<HeaderContent>
|
||||
<MudTh>Start Time</MudTh>
|
||||
<MudTh>Collection</MudTh>
|
||||
<MudTh>Playout Mode</MudTh>
|
||||
<MudTh/>
|
||||
<MudTh/>
|
||||
<MudTh/>
|
||||
<MudTh/>
|
||||
</HeaderContent>
|
||||
<RowTemplate>
|
||||
<MudTd DataLabel="Start Time">
|
||||
<MudText Typo="@Typo.body2">
|
||||
@(context.StartType == StartType.Fixed ? context.StartTime == null ? string.Empty : DateTime.Today.Add(context.StartTime.Value).ToShortTimeString() : "Dynamic")
|
||||
</MudText>
|
||||
</MudTd>
|
||||
<MudTd DataLabel="Collection">
|
||||
<MudText Typo="@Typo.body2">
|
||||
@context.CollectionName
|
||||
</MudText>
|
||||
</MudTd>
|
||||
<MudTd DataLabel="Playout Mode">
|
||||
<MudText Typo="@Typo.body2">
|
||||
@context.PlayoutMode
|
||||
@if (context.PlayoutMode == PlayoutMode.Multiple && context.MultipleCount.HasValue)
|
||||
<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">
|
||||
<div style="display: flex; flex-direction: row; margin-bottom: auto; margin-top: auto; width: 100%; align-items: center" class="ml-6 mr-6">
|
||||
<div class="flex-grow-1">
|
||||
@if (_selectedItem is not null)
|
||||
{
|
||||
@($" ({context.MultipleCount})")
|
||||
}
|
||||
</MudText>
|
||||
</MudTd>
|
||||
<MudTd>
|
||||
<MudIconButton Icon="@Icons.Material.Filled.ContentCopy"
|
||||
OnClick="@(_ => CopyItem(context))">
|
||||
</MudIconButton>
|
||||
</MudTd>
|
||||
<MudTd>
|
||||
@if (!_schedule.ShuffleScheduleItems)
|
||||
{
|
||||
<MudIconButton Icon="@Icons.Material.Filled.ArrowUpward"
|
||||
OnClick="@(_ => MoveItemUp(context))"
|
||||
Disabled="@(_schedule.ShuffleScheduleItems || _schedule.Items.All(x => x.Index >= context.Index))">
|
||||
</MudIconButton>
|
||||
}
|
||||
</MudTd>
|
||||
<MudTd>
|
||||
@if (!_schedule.ShuffleScheduleItems)
|
||||
{
|
||||
<MudIconButton Icon="@Icons.Material.Filled.ArrowDownward"
|
||||
OnClick="@(_ => MoveItemDown(context))"
|
||||
Disabled="@(_schedule.ShuffleScheduleItems || _schedule.Items.All(x => x.Index <= context.Index))">
|
||||
</MudIconButton>
|
||||
}
|
||||
</MudTd>
|
||||
<MudTd>
|
||||
<MudIconButton Icon="@Icons.Material.Filled.Delete"
|
||||
OnClick="@(_ => RemoveScheduleItem(context))">
|
||||
</MudIconButton>
|
||||
</MudTd>
|
||||
</RowTemplate>
|
||||
</MudTable>
|
||||
<MudButton Variant="Variant.Filled" Color="Color.Default" OnClick="@(_ => AddScheduleItem())" Class="mt-4">
|
||||
Add Schedule Item
|
||||
</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="Start Type" @bind-Value="_selectedItem.StartType" For="@(() => _selectedItem.StartType)">
|
||||
<MudSelectItem Value="StartType.Dynamic">Dynamic</MudSelectItem>
|
||||
@if (!_schedule.ShuffleScheduleItems)
|
||||
string start = _selectedItem.StartType == StartType.Fixed ? _selectedItem.StartTime == null ? string.Empty : DateTime.Today.Add(_selectedItem.StartTime.Value).ToShortTimeString() : "Dynamic";
|
||||
var mode = _selectedItem.PlayoutMode.ToString();
|
||||
@if (_selectedItem.PlayoutMode == PlayoutMode.Multiple && _selectedItem.MultipleCount.HasValue)
|
||||
{
|
||||
<MudSelectItem Value="StartType.Fixed">Fixed</MudSelectItem>
|
||||
mode += $" ({_selectedItem.MultipleCount})";
|
||||
}
|
||||
</MudSelect>
|
||||
<MudTimePicker Class="mt-3" Label="Start Time" @bind-Time="@_selectedItem.StartTime" For="@(() => _selectedItem.StartTime)" Disabled="@(_selectedItem.StartType == StartType.Dynamic)" Editable="true"/>
|
||||
@if (_selectedItem.StartType == StartType.Fixed)
|
||||
|
||||
var result = $"{_schedule.Name} ({start} - {_selectedItem.CollectionName} - {mode})";
|
||||
<MudText>@result</MudText>
|
||||
}
|
||||
else
|
||||
{
|
||||
<MudSelect Class="mt-3" Label="Fixed Start Time Behavior" @bind-Value="_selectedItem.FixedStartTimeBehavior" For="@(() => _selectedItem.FixedStartTimeBehavior)">
|
||||
<MudText>@_schedule.Name</MudText>
|
||||
}
|
||||
</div>
|
||||
<div style="margin-left: auto" class="d-none d-md-flex">
|
||||
<MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="SaveChanges" StartIcon="@Icons.Material.Filled.Save">
|
||||
Save Schedule Items
|
||||
</MudButton>
|
||||
<MudButton Class="ml-3" Variant="Variant.Filled" Color="Color.Default" OnClick="AddScheduleItem" StartIcon="@Icons.Material.Filled.PlaylistAdd">
|
||||
Add Schedule Item
|
||||
</MudButton>
|
||||
</div>
|
||||
<div style="align-items: center; display: flex; margin-left: auto;" class="d-md-none">
|
||||
<div class="flex-grow-1"></div>
|
||||
<MudMenu Icon="@Icons.Material.Filled.MoreVert">
|
||||
<MudMenuItem Icon="@Icons.Material.Filled.Save" Label="Save Schedule Items" OnClick="SaveChanges"/>
|
||||
<MudMenuItem Icon="@Icons.Material.Filled.PlaylistAdd" Label="Add Schedule Item" OnClick="AddScheduleItem"/>
|
||||
</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">Schedule Items</MudText>
|
||||
<MudDivider Class="mb-6"/>
|
||||
<MudTable T="ProgramScheduleItemEditViewModel"
|
||||
Hover="true"
|
||||
Items="_schedule?.Items?.OrderBy(i => i.Index)"
|
||||
Dense="true"
|
||||
SelectedItemChanged="@(vm => SelectedItemChanged(vm))"
|
||||
RowClassFunc="@SelectedRowClassFunc">
|
||||
<ColGroup>
|
||||
<MudHidden Breakpoint="Breakpoint.Xs">
|
||||
<col/>
|
||||
<col/>
|
||||
<col/>
|
||||
<col style="width: 240px;"/>
|
||||
</MudHidden>
|
||||
</ColGroup>
|
||||
<HeaderContent>
|
||||
<MudTh>Start Time</MudTh>
|
||||
<MudTh>Collection</MudTh>
|
||||
<MudTh>Playout Mode</MudTh>
|
||||
<MudTh/>
|
||||
</HeaderContent>
|
||||
<RowTemplate>
|
||||
<MudTd DataLabel="Start Time">
|
||||
<MudText Typo="@Typo.body2">
|
||||
@(context.StartType == StartType.Fixed ? context.StartTime == null ? string.Empty : DateTime.Today.Add(context.StartTime.Value).ToShortTimeString() : "Dynamic")
|
||||
</MudText>
|
||||
</MudTd>
|
||||
<MudTd DataLabel="Collection">
|
||||
<MudText Typo="@Typo.body2">
|
||||
@context.CollectionName
|
||||
</MudText>
|
||||
</MudTd>
|
||||
<MudTd DataLabel="Playout Mode">
|
||||
<MudText Typo="@Typo.body2">
|
||||
@context.PlayoutMode
|
||||
@if (context.PlayoutMode == PlayoutMode.Multiple && context.MultipleCount.HasValue)
|
||||
{
|
||||
@($" ({context.MultipleCount})")
|
||||
}
|
||||
</MudText>
|
||||
</MudTd>
|
||||
<MudTd>
|
||||
<div class="d-flex">
|
||||
<MudIconButton Icon="@Icons.Material.Filled.ContentCopy"
|
||||
OnClick="@(_ => CopyItem(context))">
|
||||
</MudIconButton>
|
||||
<MudIconButton Icon="@Icons.Material.Filled.ArrowUpward"
|
||||
OnClick="@(_ => MoveItemUp(context))"
|
||||
Disabled="@(_schedule.ShuffleScheduleItems || _schedule.Items.All(x => x.Index >= context.Index))">
|
||||
</MudIconButton>
|
||||
<MudIconButton Icon="@Icons.Material.Filled.ArrowDownward"
|
||||
OnClick="@(_ => MoveItemDown(context))"
|
||||
Disabled="@(_schedule.ShuffleScheduleItems || _schedule.Items.All(x => x.Index <= context.Index))">
|
||||
</MudIconButton>
|
||||
<MudIconButton Icon="@Icons.Material.Filled.Delete"
|
||||
OnClick="@(_ => RemoveScheduleItem(context))">
|
||||
</MudIconButton>
|
||||
</div>
|
||||
</MudTd>
|
||||
</RowTemplate>
|
||||
</MudTable>
|
||||
@if (_selectedItem is not null)
|
||||
{
|
||||
<MudText Typo="Typo.h5" Class="mt-10 mb-2">Schedule Item</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>Start Type</MudText>
|
||||
</div>
|
||||
<MudSelect @bind-Value="_selectedItem.StartType" For="@(() => _selectedItem.StartType)">
|
||||
<MudSelectItem Value="StartType.Dynamic">Dynamic</MudSelectItem>
|
||||
@if (!_schedule.ShuffleScheduleItems)
|
||||
{
|
||||
<MudSelectItem Value="StartType.Fixed">Fixed</MudSelectItem>
|
||||
}
|
||||
</MudSelect>
|
||||
</MudStack>
|
||||
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
||||
<div class="d-flex">
|
||||
<MudText>Start Time</MudText>
|
||||
</div>
|
||||
<MudTimePicker @bind-Time="@_selectedItem.StartTime"
|
||||
For="@(() => _selectedItem.StartTime)"
|
||||
Disabled="@(_selectedItem.StartType == StartType.Dynamic)"
|
||||
Editable="true"/>
|
||||
</MudStack>
|
||||
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
||||
<div class="d-flex">
|
||||
<MudText>Fixed Start Time Behavior</MudText>
|
||||
</div>
|
||||
<MudSelect @bind-Value="_selectedItem.FixedStartTimeBehavior" For="@(() => _selectedItem.FixedStartTimeBehavior)" Disabled="@(_selectedItem.StartType is not StartType.Fixed)">
|
||||
<MudSelectItem Value="@((FixedStartTimeBehavior?)null)">Inherit</MudSelectItem>
|
||||
<MudSelectItem T="FixedStartTimeBehavior?" Value="FixedStartTimeBehavior.Strict">Strict - Always Wait For Exact Start Time</MudSelectItem>
|
||||
<MudSelectItem T="FixedStartTimeBehavior?" Value="FixedStartTimeBehavior.Flexible">Flexible - Start As Soon As Possible After Start Time</MudSelectItem>
|
||||
</MudSelect>
|
||||
}
|
||||
<MudSelect Class="mt-3" Label="Collection Type" @bind-Value="_selectedItem.CollectionType" For="@(() => _selectedItem.CollectionType)">
|
||||
<MudSelectItem Value="ProgramScheduleItemCollectionType.Collection">Collection</MudSelectItem>
|
||||
<MudSelectItem Value="ProgramScheduleItemCollectionType.TelevisionShow">Television Show</MudSelectItem>
|
||||
<MudSelectItem Value="ProgramScheduleItemCollectionType.TelevisionSeason">Television Season</MudSelectItem>
|
||||
<MudSelectItem Value="ProgramScheduleItemCollectionType.Artist">Artist</MudSelectItem>
|
||||
<MudSelectItem Value="ProgramScheduleItemCollectionType.MultiCollection">Multi Collection</MudSelectItem>
|
||||
<MudSelectItem Value="ProgramScheduleItemCollectionType.SmartCollection">Smart Collection</MudSelectItem>
|
||||
<MudSelectItem Value="ProgramScheduleItemCollectionType.Playlist">Playlist</MudSelectItem>
|
||||
</MudSelect>
|
||||
</MudStack>
|
||||
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
||||
<div class="d-flex">
|
||||
<MudText>Collection Type</MudText>
|
||||
</div>
|
||||
<MudSelect @bind-Value="_selectedItem.CollectionType" For="@(() => _selectedItem.CollectionType)">
|
||||
<MudSelectItem Value="ProgramScheduleItemCollectionType.Collection">Collection</MudSelectItem>
|
||||
<MudSelectItem Value="ProgramScheduleItemCollectionType.TelevisionShow">Television Show</MudSelectItem>
|
||||
<MudSelectItem Value="ProgramScheduleItemCollectionType.TelevisionSeason">Television Season</MudSelectItem>
|
||||
<MudSelectItem Value="ProgramScheduleItemCollectionType.Artist">Artist</MudSelectItem>
|
||||
<MudSelectItem Value="ProgramScheduleItemCollectionType.MultiCollection">Multi Collection</MudSelectItem>
|
||||
<MudSelectItem Value="ProgramScheduleItemCollectionType.SmartCollection">Smart Collection</MudSelectItem>
|
||||
<MudSelectItem Value="ProgramScheduleItemCollectionType.Playlist">Playlist</MudSelectItem>
|
||||
</MudSelect>
|
||||
</MudStack>
|
||||
@if (_selectedItem.CollectionType == ProgramScheduleItemCollectionType.Collection)
|
||||
{
|
||||
<MudAutocomplete Class="mt-3" T="MediaCollectionViewModel" Label="Collection"
|
||||
@bind-Value="_selectedItem.Collection" SearchFunc="@SearchCollections"
|
||||
ToStringFunc="@(c => c?.Name)" Placeholder="Type to search...">
|
||||
<MoreItemsTemplate>
|
||||
<MudText Align="Align.Center" Class="px-4 py-1">
|
||||
Only the first 10 items are shown
|
||||
</MudText>
|
||||
</MoreItemsTemplate>
|
||||
</MudAutocomplete>
|
||||
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
||||
<div class="d-flex">
|
||||
<MudText>Collection</MudText>
|
||||
</div>
|
||||
<MudAutocomplete T="MediaCollectionViewModel"
|
||||
@bind-Value="_selectedItem.Collection" SearchFunc="@SearchCollections"
|
||||
ToStringFunc="@(c => c?.Name)" Placeholder="Type to search...">
|
||||
<MoreItemsTemplate>
|
||||
<MudText Align="Align.Center" Class="px-4 py-1">
|
||||
Only the first 10 items are shown
|
||||
</MudText>
|
||||
</MoreItemsTemplate>
|
||||
</MudAutocomplete>
|
||||
</MudStack>
|
||||
}
|
||||
@if (_selectedItem.CollectionType == ProgramScheduleItemCollectionType.MultiCollection)
|
||||
{
|
||||
<MudAutocomplete Class="mt-3" T="MultiCollectionViewModel" Label="Multi Collection"
|
||||
@bind-Value="_selectedItem.MultiCollection" SearchFunc="@SearchMultiCollections"
|
||||
ToStringFunc="@(c => c?.Name)" Placeholder="Type to search...">
|
||||
<MoreItemsTemplate>
|
||||
<MudText Align="Align.Center" Class="px-4 py-1">
|
||||
Only the first 10 items are shown
|
||||
</MudText>
|
||||
</MoreItemsTemplate>
|
||||
</MudAutocomplete>
|
||||
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
||||
<div class="d-flex">
|
||||
<MudText>Multi Collection</MudText>
|
||||
</div>
|
||||
<MudAutocomplete T="MultiCollectionViewModel"
|
||||
@bind-Value="_selectedItem.MultiCollection" SearchFunc="@SearchMultiCollections"
|
||||
ToStringFunc="@(c => c?.Name)" Placeholder="Type to search...">
|
||||
<MoreItemsTemplate>
|
||||
<MudText Align="Align.Center" Class="px-4 py-1">
|
||||
Only the first 10 items are shown
|
||||
</MudText>
|
||||
</MoreItemsTemplate>
|
||||
</MudAutocomplete>
|
||||
</MudStack>
|
||||
}
|
||||
@if (_selectedItem.CollectionType == ProgramScheduleItemCollectionType.SmartCollection)
|
||||
{
|
||||
<MudAutocomplete Class="mt-3" T="SmartCollectionViewModel" Label="Smart Collection"
|
||||
@bind-Value="_selectedItem.SmartCollection" SearchFunc="@SearchSmartCollections"
|
||||
ToStringFunc="@(c => c?.Name)" Placeholder="Type to search...">
|
||||
<MoreItemsTemplate>
|
||||
<MudText Align="Align.Center" Class="px-4 py-1">
|
||||
Only the first 10 items are shown
|
||||
</MudText>
|
||||
</MoreItemsTemplate>
|
||||
</MudAutocomplete>
|
||||
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
||||
<div class="d-flex">
|
||||
<MudText>Smart Collection</MudText>
|
||||
</div>
|
||||
<MudAutocomplete T="SmartCollectionViewModel"
|
||||
@bind-Value="_selectedItem.SmartCollection" SearchFunc="@SearchSmartCollections"
|
||||
ToStringFunc="@(c => c?.Name)" Placeholder="Type to search...">
|
||||
<MoreItemsTemplate>
|
||||
<MudText Align="Align.Center" Class="px-4 py-1">
|
||||
Only the first 10 items are shown
|
||||
</MudText>
|
||||
</MoreItemsTemplate>
|
||||
</MudAutocomplete>
|
||||
</MudStack>
|
||||
}
|
||||
@if (_selectedItem.CollectionType == ProgramScheduleItemCollectionType.TelevisionShow)
|
||||
{
|
||||
<MudAutocomplete Class="mt-3" T="NamedMediaItemViewModel" Label="Television Show"
|
||||
@bind-Value="_selectedItem.MediaItem" SearchFunc="@SearchTelevisionShows"
|
||||
ToStringFunc="@(c => c?.Name)" Placeholder="Type to search...">
|
||||
<MoreItemsTemplate>
|
||||
<MudText Align="Align.Center" Class="px-4 py-1">
|
||||
Only the first 10 items are shown
|
||||
</MudText>
|
||||
</MoreItemsTemplate>
|
||||
</MudAutocomplete>
|
||||
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
||||
<div class="d-flex">
|
||||
<MudText>Television Show</MudText>
|
||||
</div>
|
||||
<MudAutocomplete T="NamedMediaItemViewModel"
|
||||
@bind-Value="_selectedItem.MediaItem" SearchFunc="@SearchTelevisionShows"
|
||||
ToStringFunc="@(c => c?.Name)" Placeholder="Type to search...">
|
||||
<MoreItemsTemplate>
|
||||
<MudText Align="Align.Center" Class="px-4 py-1">
|
||||
Only the first 10 items are shown
|
||||
</MudText>
|
||||
</MoreItemsTemplate>
|
||||
</MudAutocomplete>
|
||||
</MudStack>
|
||||
}
|
||||
@if (_selectedItem.CollectionType == ProgramScheduleItemCollectionType.TelevisionSeason)
|
||||
{
|
||||
<MudAutocomplete Class="mt-3" T="NamedMediaItemViewModel" Label="Television Season"
|
||||
@bind-Value="_selectedItem.MediaItem" SearchFunc="@SearchTelevisionSeasons"
|
||||
ToStringFunc="@(c => c?.Name)" Placeholder="Type to search..."
|
||||
MaxItems="20">
|
||||
<MoreItemsTemplate>
|
||||
<MudText Align="Align.Center" Class="px-4 py-1">
|
||||
Only the first 20 items are shown
|
||||
</MudText>
|
||||
</MoreItemsTemplate>
|
||||
</MudAutocomplete>
|
||||
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
||||
<div class="d-flex">
|
||||
<MudText>Television Season</MudText>
|
||||
</div>
|
||||
<MudAutocomplete T="NamedMediaItemViewModel"
|
||||
@bind-Value="_selectedItem.MediaItem" SearchFunc="@SearchTelevisionSeasons"
|
||||
ToStringFunc="@(c => c?.Name)" Placeholder="Type to search..."
|
||||
MaxItems="20">
|
||||
<MoreItemsTemplate>
|
||||
<MudText Align="Align.Center" Class="px-4 py-1">
|
||||
Only the first 20 items are shown
|
||||
</MudText>
|
||||
</MoreItemsTemplate>
|
||||
</MudAutocomplete>
|
||||
</MudStack>
|
||||
}
|
||||
@if (_selectedItem.CollectionType == ProgramScheduleItemCollectionType.Artist)
|
||||
{
|
||||
<MudAutocomplete Class="mt-3" T="NamedMediaItemViewModel" Label="Artist"
|
||||
@bind-Value="_selectedItem.MediaItem" SearchFunc="@SearchArtists"
|
||||
ToStringFunc="@(c => c?.Name)" Placeholder="Type to search..."
|
||||
MaxItems="10">
|
||||
<MoreItemsTemplate>
|
||||
<MudText Align="Align.Center" Class="px-4 py-1">
|
||||
Only the first 10 items are shown
|
||||
</MudText>
|
||||
</MoreItemsTemplate>
|
||||
</MudAutocomplete>
|
||||
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
||||
<div class="d-flex">
|
||||
<MudText>Artist</MudText>
|
||||
</div>
|
||||
<MudAutocomplete T="NamedMediaItemViewModel"
|
||||
@bind-Value="_selectedItem.MediaItem" SearchFunc="@SearchArtists"
|
||||
ToStringFunc="@(c => c?.Name)" Placeholder="Type to search..."
|
||||
MaxItems="10">
|
||||
<MoreItemsTemplate>
|
||||
<MudText Align="Align.Center" Class="px-4 py-1">
|
||||
Only the first 10 items are shown
|
||||
</MudText>
|
||||
</MoreItemsTemplate>
|
||||
</MudAutocomplete>
|
||||
</MudStack>
|
||||
}
|
||||
@if (_selectedItem.CollectionType == ProgramScheduleItemCollectionType.Playlist)
|
||||
{
|
||||
<MudSelect Class="mt-3"
|
||||
T="PlaylistGroupViewModel"
|
||||
Value="@_selectedPlaylistGroup"
|
||||
Label="Playlist Group"
|
||||
ValueChanged="@(vm => UpdatePlaylistGroupItems(vm))">
|
||||
@foreach (PlaylistGroupViewModel playlistGroup in _playlistGroups)
|
||||
{
|
||||
<MudSelectItem Value="@playlistGroup">@playlistGroup.Name</MudSelectItem>
|
||||
}
|
||||
</MudSelect>
|
||||
<MudSelect Class="mt-3"
|
||||
T="PlaylistViewModel"
|
||||
Label="Playlist"
|
||||
@bind-value="_selectedItem.Playlist">
|
||||
@foreach (PlaylistViewModel playlist in _playlists)
|
||||
{
|
||||
<MudSelectItem Value="@playlist">@playlist.Name</MudSelectItem>
|
||||
}
|
||||
</MudSelect>
|
||||
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
||||
<div class="d-flex">
|
||||
<MudText>Playlist Group</MudText>
|
||||
</div>
|
||||
<MudSelect T="PlaylistGroupViewModel"
|
||||
Value="@_selectedPlaylistGroup"
|
||||
ValueChanged="@(vm => UpdatePlaylistGroupItems(vm))">
|
||||
@foreach (PlaylistGroupViewModel playlistGroup in _playlistGroups)
|
||||
{
|
||||
<MudSelectItem Value="@playlistGroup">@playlistGroup.Name</MudSelectItem>
|
||||
}
|
||||
</MudSelect>
|
||||
</MudStack>
|
||||
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
||||
<div class="d-flex">
|
||||
<MudText>Playlist</MudText>
|
||||
</div>
|
||||
<MudSelect T="PlaylistViewModel" @bind-value="_selectedItem.Playlist">
|
||||
@foreach (PlaylistViewModel playlist in _playlists)
|
||||
{
|
||||
<MudSelectItem Value="@playlist">@playlist.Name</MudSelectItem>
|
||||
}
|
||||
</MudSelect>
|
||||
</MudStack>
|
||||
}
|
||||
<MudSelect Class="mt-3"
|
||||
Label="Playback Order"
|
||||
@bind-Value="@_selectedItem.PlaybackOrder"
|
||||
For="@(() => _selectedItem.PlaybackOrder)"
|
||||
Disabled="@(_selectedItem.CollectionType is ProgramScheduleItemCollectionType.Playlist)">
|
||||
@switch (_selectedItem.CollectionType)
|
||||
{
|
||||
case ProgramScheduleItemCollectionType.MultiCollection:
|
||||
<MudSelectItem Value="PlaybackOrder.Shuffle">Shuffle</MudSelectItem>
|
||||
<MudSelectItem Value="PlaybackOrder.ShuffleInOrder">Shuffle In Order</MudSelectItem>
|
||||
break;
|
||||
case ProgramScheduleItemCollectionType.Collection:
|
||||
case ProgramScheduleItemCollectionType.SmartCollection:
|
||||
<MudSelectItem Value="PlaybackOrder.Chronological">Chronological</MudSelectItem>
|
||||
<MudSelectItem Value="PlaybackOrder.Random">Random</MudSelectItem>
|
||||
<MudSelectItem Value="PlaybackOrder.Shuffle">Shuffle</MudSelectItem>
|
||||
<MudSelectItem Value="PlaybackOrder.ShuffleInOrder">Shuffle In Order</MudSelectItem>
|
||||
break;
|
||||
case ProgramScheduleItemCollectionType.TelevisionShow:
|
||||
<MudSelectItem Value="PlaybackOrder.Chronological">Chronological</MudSelectItem>
|
||||
<MudSelectItem Value="PlaybackOrder.SeasonEpisode">Season, Episode</MudSelectItem>
|
||||
<MudSelectItem Value="PlaybackOrder.Random">Random</MudSelectItem>
|
||||
<MudSelectItem Value="PlaybackOrder.Shuffle">Shuffle</MudSelectItem>
|
||||
<MudSelectItem Value="PlaybackOrder.MultiEpisodeShuffle">Multi-Episode Shuffle</MudSelectItem>
|
||||
break;
|
||||
case ProgramScheduleItemCollectionType.Playlist:
|
||||
break;
|
||||
default:
|
||||
<MudSelectItem Value="PlaybackOrder.Chronological">Chronological</MudSelectItem>
|
||||
<MudSelectItem Value="PlaybackOrder.Random">Random</MudSelectItem>
|
||||
<MudSelectItem Value="PlaybackOrder.Shuffle">Shuffle</MudSelectItem>
|
||||
break;
|
||||
}
|
||||
</MudSelect>
|
||||
<MudSelect Class="mt-3" Label="Playout Mode" @bind-Value="@_selectedItem.PlayoutMode" For="@(() => _selectedItem.PlayoutMode)">
|
||||
@if (!_schedule.ShuffleScheduleItems)
|
||||
{
|
||||
<MudSelectItem Value="PlayoutMode.Flood">Flood</MudSelectItem>
|
||||
}
|
||||
<MudSelectItem Value="PlayoutMode.One">One</MudSelectItem>
|
||||
<MudSelectItem Value="PlayoutMode.Multiple">Multiple</MudSelectItem>
|
||||
<MudSelectItem Value="PlayoutMode.Duration">Duration</MudSelectItem>
|
||||
</MudSelect>
|
||||
<MudTextField Class="mt-3" Label="Multiple Count" @bind-Value="@_selectedItem.MultipleCount" For="@(() => _selectedItem.MultipleCount)" Disabled="@(_selectedItem.PlayoutMode != PlayoutMode.Multiple)"/>
|
||||
<MudGrid Class="mt-3" Style="align-items: center" Justify="Justify.Center">
|
||||
<MudItem xs="6">
|
||||
<MudTextField T="int"
|
||||
Label="Playout Duration"
|
||||
@bind-Value="_selectedItem.PlayoutDurationHours"
|
||||
Adornment="Adornment.End"
|
||||
AdornmentText="hours"
|
||||
Disabled="@(_selectedItem.PlayoutMode != PlayoutMode.Duration)"/>
|
||||
</MudItem>
|
||||
<MudItem xs="6">
|
||||
<MudTextField T="int"
|
||||
@bind-Value="_selectedItem.PlayoutDurationMinutes"
|
||||
Adornment="Adornment.End"
|
||||
AdornmentText="minutes"
|
||||
Disabled="@(_selectedItem.PlayoutMode != PlayoutMode.Duration)"/>
|
||||
</MudItem>
|
||||
</MudGrid>
|
||||
<MudSelect Class="mt-3" Label="Fill With Group Mode (Show or Artist)" @bind-Value="@_selectedItem.FillWithGroupMode" For="@(() => _selectedItem.FillWithGroupMode)" Disabled="@(_selectedItem.CanFillWithGroups == false)">
|
||||
<MudSelectItem Value="FillWithGroupMode.None">(none)</MudSelectItem>
|
||||
@if (_selectedItem.CanFillWithGroups)
|
||||
{
|
||||
<MudSelectItem Value="FillWithGroupMode.FillWithOrderedGroups">Ordered Groups</MudSelectItem>
|
||||
<MudSelectItem Value="FillWithGroupMode.FillWithShuffledGroups">Shuffled Groups</MudSelectItem>
|
||||
}
|
||||
else
|
||||
{
|
||||
_selectedItem.FillWithGroupMode = FillWithGroupMode.None;
|
||||
}
|
||||
</MudSelect>
|
||||
<MudSelect Class="mt-3" Label="Tail Mode" @bind-Value="@_selectedItem.TailMode" For="@(() => _selectedItem.TailMode)" Disabled="@(_selectedItem.PlayoutMode != PlayoutMode.Duration)">
|
||||
<MudSelectItem Value="@TailMode.None">(none)</MudSelectItem>
|
||||
<MudSelectItem Value="@TailMode.Offline">Offline</MudSelectItem>
|
||||
<MudSelectItem Value="@TailMode.Filler">Filler</MudSelectItem>
|
||||
</MudSelect>
|
||||
<MudTextField Class="mt-3" Label="Discard To Fill Attempts" @bind-Value="@_selectedItem.DiscardToFillAttempts" For="@(() => _selectedItem.DiscardToFillAttempts)" Disabled="@(_selectedItem.PlayoutMode != PlayoutMode.Duration)"/>
|
||||
<MudTextField Class="mt-3" Label="Custom Title" @bind-Value="@_selectedItem.CustomTitle" For="@(() => _selectedItem.CustomTitle)"/>
|
||||
<MudSelect Class="mt-3" Label="Guide Mode" @bind-Value="@_selectedItem.GuideMode" For="@(() => _selectedItem.GuideMode)">
|
||||
<MudSelectItem Value="@GuideMode.Normal">Normal</MudSelectItem>
|
||||
<MudSelectItem Value="@GuideMode.Filler">Filler</MudSelectItem>
|
||||
</MudSelect>
|
||||
</MudCardContent>
|
||||
</MudCard>
|
||||
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
||||
<div class="d-flex">
|
||||
<MudText>Playback Order</MudText>
|
||||
</div>
|
||||
<MudSelect @bind-Value="@_selectedItem.PlaybackOrder"
|
||||
For="@(() => _selectedItem.PlaybackOrder)"
|
||||
Disabled="@(_selectedItem.CollectionType is ProgramScheduleItemCollectionType.Playlist)">
|
||||
@switch (_selectedItem.CollectionType)
|
||||
{
|
||||
case ProgramScheduleItemCollectionType.MultiCollection:
|
||||
<MudSelectItem Value="PlaybackOrder.Shuffle">Shuffle</MudSelectItem>
|
||||
<MudSelectItem Value="PlaybackOrder.ShuffleInOrder">Shuffle In Order</MudSelectItem>
|
||||
break;
|
||||
case ProgramScheduleItemCollectionType.Collection:
|
||||
case ProgramScheduleItemCollectionType.SmartCollection:
|
||||
<MudSelectItem Value="PlaybackOrder.Chronological">Chronological</MudSelectItem>
|
||||
<MudSelectItem Value="PlaybackOrder.Random">Random</MudSelectItem>
|
||||
<MudSelectItem Value="PlaybackOrder.Shuffle">Shuffle</MudSelectItem>
|
||||
<MudSelectItem Value="PlaybackOrder.ShuffleInOrder">Shuffle In Order</MudSelectItem>
|
||||
break;
|
||||
case ProgramScheduleItemCollectionType.TelevisionShow:
|
||||
<MudSelectItem Value="PlaybackOrder.Chronological">Chronological</MudSelectItem>
|
||||
<MudSelectItem Value="PlaybackOrder.SeasonEpisode">Season, Episode</MudSelectItem>
|
||||
<MudSelectItem Value="PlaybackOrder.Random">Random</MudSelectItem>
|
||||
<MudSelectItem Value="PlaybackOrder.Shuffle">Shuffle</MudSelectItem>
|
||||
<MudSelectItem Value="PlaybackOrder.MultiEpisodeShuffle">Multi-Episode Shuffle</MudSelectItem>
|
||||
break;
|
||||
case ProgramScheduleItemCollectionType.Playlist:
|
||||
break;
|
||||
default:
|
||||
<MudSelectItem Value="PlaybackOrder.Chronological">Chronological</MudSelectItem>
|
||||
<MudSelectItem Value="PlaybackOrder.Random">Random</MudSelectItem>
|
||||
<MudSelectItem Value="PlaybackOrder.Shuffle">Shuffle</MudSelectItem>
|
||||
break;
|
||||
}
|
||||
</MudSelect>
|
||||
</MudStack>
|
||||
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
||||
<div class="d-flex">
|
||||
<MudText>Playout Mode</MudText>
|
||||
</div>
|
||||
<MudSelect @bind-Value="@_selectedItem.PlayoutMode" For="@(() => _selectedItem.PlayoutMode)">
|
||||
@if (!_schedule.ShuffleScheduleItems)
|
||||
{
|
||||
<MudSelectItem Value="PlayoutMode.Flood">Flood</MudSelectItem>
|
||||
}
|
||||
<MudSelectItem Value="PlayoutMode.One">One</MudSelectItem>
|
||||
<MudSelectItem Value="PlayoutMode.Multiple">Multiple</MudSelectItem>
|
||||
<MudSelectItem Value="PlayoutMode.Duration">Duration</MudSelectItem>
|
||||
</MudSelect>
|
||||
</MudStack>
|
||||
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
||||
<div class="d-flex">
|
||||
<MudText>Multiple Count</MudText>
|
||||
</div>
|
||||
<MudTextField @bind-Value="@_selectedItem.MultipleCount"
|
||||
For="@(() => _selectedItem.MultipleCount)"
|
||||
Disabled="@(_selectedItem.PlayoutMode != PlayoutMode.Multiple)"/>
|
||||
</MudStack>
|
||||
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
||||
<div class="d-flex">
|
||||
<MudText>Playout Duration</MudText>
|
||||
</div>
|
||||
<MudTextField T="int"
|
||||
@bind-Value="_selectedItem.PlayoutDurationHours"
|
||||
Adornment="Adornment.End"
|
||||
AdornmentText="hours"
|
||||
Disabled="@(_selectedItem.PlayoutMode != PlayoutMode.Duration)"/>
|
||||
</MudStack>
|
||||
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
||||
<div class="d-flex"></div>
|
||||
<MudTextField T="int"
|
||||
@bind-Value="_selectedItem.PlayoutDurationMinutes"
|
||||
Adornment="Adornment.End"
|
||||
AdornmentText="minutes"
|
||||
Disabled="@(_selectedItem.PlayoutMode != PlayoutMode.Duration)"/>
|
||||
</MudStack>
|
||||
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
||||
<div class="d-flex">
|
||||
<MudText>Fill With Group Mode (Show or Artist)</MudText>
|
||||
</div>
|
||||
<MudSelect @bind-Value="@_selectedItem.FillWithGroupMode"
|
||||
For="@(() => _selectedItem.FillWithGroupMode)"
|
||||
Disabled="@(_selectedItem.CanFillWithGroups == false)">
|
||||
<MudSelectItem Value="FillWithGroupMode.None">(none)</MudSelectItem>
|
||||
@if (_selectedItem.CanFillWithGroups)
|
||||
{
|
||||
<MudSelectItem Value="FillWithGroupMode.FillWithOrderedGroups">Ordered Groups</MudSelectItem>
|
||||
<MudSelectItem Value="FillWithGroupMode.FillWithShuffledGroups">Shuffled Groups</MudSelectItem>
|
||||
}
|
||||
else
|
||||
{
|
||||
_selectedItem.FillWithGroupMode = FillWithGroupMode.None;
|
||||
}
|
||||
</MudSelect>
|
||||
</MudStack>
|
||||
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
||||
<div class="d-flex">
|
||||
<MudText>Tail Mode</MudText>
|
||||
</div>
|
||||
<MudSelect @bind-Value="@_selectedItem.TailMode"
|
||||
For="@(() => _selectedItem.TailMode)"
|
||||
Disabled="@(_selectedItem.PlayoutMode != PlayoutMode.Duration)">
|
||||
<MudSelectItem Value="@TailMode.None">(none)</MudSelectItem>
|
||||
<MudSelectItem Value="@TailMode.Offline">Offline</MudSelectItem>
|
||||
<MudSelectItem Value="@TailMode.Filler">Filler</MudSelectItem>
|
||||
</MudSelect>
|
||||
</MudStack>
|
||||
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
||||
<div class="d-flex">
|
||||
<MudText>Discard To Fill Attempts</MudText>
|
||||
</div>
|
||||
<MudTextField @bind-Value="@_selectedItem.DiscardToFillAttempts"
|
||||
For="@(() => _selectedItem.DiscardToFillAttempts)"
|
||||
Disabled="@(_selectedItem.PlayoutMode != PlayoutMode.Duration)"/>
|
||||
</MudStack>
|
||||
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
||||
<div class="d-flex">
|
||||
<MudText>Custom Title</MudText>
|
||||
</div>
|
||||
<MudTextField @bind-Value="@_selectedItem.CustomTitle" For="@(() => _selectedItem.CustomTitle)"/>
|
||||
</MudStack>
|
||||
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
||||
<div class="d-flex">
|
||||
<MudText>Guide Mode</MudText>
|
||||
</div>
|
||||
<MudSelect @bind-Value="@_selectedItem.GuideMode" For="@(() => _selectedItem.GuideMode)">
|
||||
<MudSelectItem Value="@GuideMode.Normal">Normal</MudSelectItem>
|
||||
<MudSelectItem Value="@GuideMode.Filler">Filler</MudSelectItem>
|
||||
</MudSelect>
|
||||
</MudStack>
|
||||
<MudText Typo="Typo.h5" Class="mt-10 mb-2">Schedule Item Filler</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>Pre-Roll Filler</MudText>
|
||||
</div>
|
||||
<MudSelect T="FillerPresetViewModel"
|
||||
@bind-value="_selectedItem.PreRollFiller"
|
||||
Clearable="true">
|
||||
@foreach (FillerPresetViewModel filler in _fillerPresets.Where(f => f.FillerKind == FillerKind.PreRoll))
|
||||
{
|
||||
<MudSelectItem Value="@filler">@filler.Name</MudSelectItem>
|
||||
}
|
||||
</MudSelect>
|
||||
</MudStack>
|
||||
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
||||
<div class="d-flex">
|
||||
<MudText>Mid-Roll Filler</MudText>
|
||||
</div>
|
||||
<MudSelect T="FillerPresetViewModel"
|
||||
@bind-value="_selectedItem.MidRollFiller"
|
||||
Clearable="true">
|
||||
@foreach (FillerPresetViewModel filler in _fillerPresets.Where(f => f.FillerKind == FillerKind.MidRoll))
|
||||
{
|
||||
<MudSelectItem Value="@filler">@filler.Name</MudSelectItem>
|
||||
}
|
||||
</MudSelect>
|
||||
</MudStack>
|
||||
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
||||
<div class="d-flex">
|
||||
<MudText>Post-Roll Filler</MudText>
|
||||
</div>
|
||||
<MudSelect T="FillerPresetViewModel"
|
||||
@bind-value="_selectedItem.PostRollFiller"
|
||||
Clearable="true">
|
||||
@foreach (FillerPresetViewModel filler in _fillerPresets.Where(f => f.FillerKind == FillerKind.PostRoll))
|
||||
{
|
||||
<MudSelectItem Value="@filler">@filler.Name</MudSelectItem>
|
||||
}
|
||||
</MudSelect>
|
||||
</MudStack>
|
||||
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
||||
<div class="d-flex">
|
||||
<MudText>Tail Filler</MudText>
|
||||
</div>
|
||||
<MudSelect T="FillerPresetViewModel"
|
||||
@bind-value="_selectedItem.TailFiller"
|
||||
Clearable="true">
|
||||
@foreach (FillerPresetViewModel filler in _fillerPresets.Where(f => f.FillerKind == FillerKind.Tail))
|
||||
{
|
||||
<MudSelectItem Value="@filler">@filler.Name</MudSelectItem>
|
||||
}
|
||||
</MudSelect>
|
||||
</MudStack>
|
||||
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
||||
<div class="d-flex">
|
||||
<MudText>Fallback Filler</MudText>
|
||||
</div>
|
||||
<MudSelect T="FillerPresetViewModel"
|
||||
@bind-value="_selectedItem.FallbackFiller"
|
||||
Clearable="true">
|
||||
@foreach (FillerPresetViewModel filler in _fillerPresets.Where(f => f.FillerKind == FillerKind.Fallback))
|
||||
{
|
||||
<MudSelectItem Value="@filler">@filler.Name</MudSelectItem>
|
||||
}
|
||||
</MudSelect>
|
||||
</MudStack>
|
||||
<MudText Typo="Typo.h5" Class="mt-10 mb-2">Schedule Item Overrides</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>Watermark</MudText>
|
||||
</div>
|
||||
<MudSelect @bind-Value="@_selectedItem.Watermark" For="@(() => _selectedItem.Watermark)" Clearable="true">
|
||||
@foreach (WatermarkViewModel watermark in _watermarks)
|
||||
{
|
||||
<MudSelectItem Value="@watermark">@watermark.Name</MudSelectItem>
|
||||
}
|
||||
</MudSelect>
|
||||
</MudStack>
|
||||
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
||||
<div class="d-flex">
|
||||
<MudText>Preferred Audio Language</MudText>
|
||||
</div>
|
||||
<MudSelect @bind-Value="_selectedItem.PreferredAudioLanguageCode"
|
||||
For="@(() => _selectedItem.PreferredAudioLanguageCode)"
|
||||
Clearable="true">
|
||||
<MudSelectItem Value="@((string)null)">(none)</MudSelectItem>
|
||||
@foreach (LanguageCodeViewModel culture in _availableCultures)
|
||||
{
|
||||
<MudSelectItem Value="@culture.ThreeLetterISOLanguageName">@culture.EnglishName</MudSelectItem>
|
||||
}
|
||||
</MudSelect>
|
||||
</MudStack>
|
||||
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
||||
<div class="d-flex">
|
||||
<MudText>Preferred Audio Title</MudText>
|
||||
</div>
|
||||
<MudTextField @bind-Value="@_selectedItem.PreferredAudioTitle" For="@(() => _selectedItem.PreferredAudioTitle)"/>
|
||||
</MudStack>
|
||||
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
||||
<div class="d-flex">
|
||||
<MudText>Preferred Subtitle Language</MudText>
|
||||
</div>
|
||||
<MudSelect @bind-Value="_selectedItem.PreferredSubtitleLanguageCode"
|
||||
For="@(() => _selectedItem.PreferredSubtitleLanguageCode)"
|
||||
Clearable="true">
|
||||
<MudSelectItem Value="@((string)null)">(none)</MudSelectItem>
|
||||
@foreach (LanguageCodeViewModel culture in _availableCultures)
|
||||
{
|
||||
<MudSelectItem Value="@culture.ThreeLetterISOLanguageName">@culture.EnglishName</MudSelectItem>
|
||||
}
|
||||
</MudSelect>
|
||||
</MudStack>
|
||||
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
||||
<div class="d-flex">
|
||||
<MudText>Subtitle Mode</MudText>
|
||||
</div>
|
||||
<MudSelect T="ChannelSubtitleMode?" @bind-Value="_selectedItem.SubtitleMode" For="@(() => _selectedItem.SubtitleMode)" Clearable="true">
|
||||
<MudSelectItem T="ChannelSubtitleMode?" Value="@(ChannelSubtitleMode.None)">None</MudSelectItem>
|
||||
<MudSelectItem T="ChannelSubtitleMode?" Value="@(ChannelSubtitleMode.Forced)">Forced</MudSelectItem>
|
||||
<MudSelectItem T="ChannelSubtitleMode?" Value="@(ChannelSubtitleMode.Default)">Default</MudSelectItem>
|
||||
<MudSelectItem T="ChannelSubtitleMode?" Value="@(ChannelSubtitleMode.Any)">Any</MudSelectItem>
|
||||
</MudSelect>
|
||||
</MudStack>
|
||||
}
|
||||
</MudContainer>
|
||||
</div>
|
||||
<div style="flex-grow: 1; max-width: 400px;">
|
||||
<MudCard>
|
||||
<MudCardContent>
|
||||
<MudSelect T="FillerPresetViewModel"
|
||||
Label="Pre-Roll Filler"
|
||||
@bind-value="_selectedItem.PreRollFiller"
|
||||
Clearable="true">
|
||||
@foreach (FillerPresetViewModel filler in _fillerPresets.Where(f => f.FillerKind == FillerKind.PreRoll))
|
||||
{
|
||||
<MudSelectItem Value="@filler">@filler.Name</MudSelectItem>
|
||||
}
|
||||
</MudSelect>
|
||||
<MudSelect Class="mt-3"
|
||||
T="FillerPresetViewModel"
|
||||
Label="Mid-Roll Filler"
|
||||
@bind-value="_selectedItem.MidRollFiller"
|
||||
Clearable="true">
|
||||
@foreach (FillerPresetViewModel filler in _fillerPresets.Where(f => f.FillerKind == FillerKind.MidRoll))
|
||||
{
|
||||
<MudSelectItem Value="@filler">@filler.Name</MudSelectItem>
|
||||
}
|
||||
</MudSelect>
|
||||
<MudSelect Class="mt-3"
|
||||
T="FillerPresetViewModel"
|
||||
Label="Post-Roll Filler"
|
||||
@bind-value="_selectedItem.PostRollFiller"
|
||||
Clearable="true">
|
||||
@foreach (FillerPresetViewModel filler in _fillerPresets.Where(f => f.FillerKind == FillerKind.PostRoll))
|
||||
{
|
||||
<MudSelectItem Value="@filler">@filler.Name</MudSelectItem>
|
||||
}
|
||||
</MudSelect>
|
||||
<MudSelect Class="mt-3"
|
||||
T="FillerPresetViewModel"
|
||||
Label="Tail Filler"
|
||||
@bind-value="_selectedItem.TailFiller"
|
||||
Clearable="true">
|
||||
@foreach (FillerPresetViewModel filler in _fillerPresets.Where(f => f.FillerKind == FillerKind.Tail))
|
||||
{
|
||||
<MudSelectItem Value="@filler">@filler.Name</MudSelectItem>
|
||||
}
|
||||
</MudSelect>
|
||||
<MudSelect Class="mt-3"
|
||||
T="FillerPresetViewModel"
|
||||
Label="Fallback Filler"
|
||||
@bind-value="_selectedItem.FallbackFiller"
|
||||
Clearable="true">
|
||||
@foreach (FillerPresetViewModel filler in _fillerPresets.Where(f => f.FillerKind == FillerKind.Fallback))
|
||||
{
|
||||
<MudSelectItem Value="@filler">@filler.Name</MudSelectItem>
|
||||
}
|
||||
</MudSelect>
|
||||
</MudCardContent>
|
||||
</MudCard>
|
||||
<MudCard Class="mt-4">
|
||||
<MudCardContent>
|
||||
<MudSelect Label="Watermark" @bind-Value="@_selectedItem.Watermark" For="@(() => _selectedItem.Watermark)" Clearable="true">
|
||||
@foreach (WatermarkViewModel watermark in _watermarks)
|
||||
{
|
||||
<MudSelectItem Value="@watermark">@watermark.Name</MudSelectItem>
|
||||
}
|
||||
</MudSelect>
|
||||
<MudSelect Class="mt-3"
|
||||
Label="Preferred Audio Language"
|
||||
@bind-Value="_selectedItem.PreferredAudioLanguageCode"
|
||||
For="@(() => _selectedItem.PreferredAudioLanguageCode)"
|
||||
Clearable="true">
|
||||
<MudSelectItem Value="@((string)null)">(none)</MudSelectItem>
|
||||
@foreach (LanguageCodeViewModel culture in _availableCultures)
|
||||
{
|
||||
<MudSelectItem Value="@culture.ThreeLetterISOLanguageName">@culture.EnglishName</MudSelectItem>
|
||||
}
|
||||
</MudSelect>
|
||||
<MudTextField Class="mt-3" Label="Preferred Audio Title" @bind-Value="@_selectedItem.PreferredAudioTitle" For="@(() => _selectedItem.PreferredAudioTitle)"/>
|
||||
<MudSelect Class="mt-3"
|
||||
Label="Preferred Subtitle Language"
|
||||
@bind-Value="_selectedItem.PreferredSubtitleLanguageCode"
|
||||
For="@(() => _selectedItem.PreferredSubtitleLanguageCode)"
|
||||
Clearable="true">
|
||||
<MudSelectItem Value="@((string)null)">(none)</MudSelectItem>
|
||||
@foreach (LanguageCodeViewModel culture in _availableCultures)
|
||||
{
|
||||
<MudSelectItem Value="@culture.ThreeLetterISOLanguageName">@culture.EnglishName</MudSelectItem>
|
||||
}
|
||||
</MudSelect>
|
||||
<MudSelect T="ChannelSubtitleMode?" Class="mt-3" Label="Subtitle Mode" @bind-Value="_selectedItem.SubtitleMode" For="@(() => _selectedItem.SubtitleMode)" Clearable="true">
|
||||
<MudSelectItem T="ChannelSubtitleMode?" Value="@(ChannelSubtitleMode.None)">None</MudSelectItem>
|
||||
<MudSelectItem T="ChannelSubtitleMode?" Value="@(ChannelSubtitleMode.Forced)">Forced</MudSelectItem>
|
||||
<MudSelectItem T="ChannelSubtitleMode?" Value="@(ChannelSubtitleMode.Default)">Default</MudSelectItem>
|
||||
<MudSelectItem T="ChannelSubtitleMode?" Value="@(ChannelSubtitleMode.Any)">Any</MudSelectItem>
|
||||
</MudSelect>
|
||||
</MudCardContent>
|
||||
</MudCard>
|
||||
</div>
|
||||
</div>
|
||||
</EditForm>
|
||||
}
|
||||
</MudContainer>
|
||||
</MudForm>
|
||||
|
||||
@code {
|
||||
private readonly CancellationTokenSource _cts = new();
|
||||
@@ -429,6 +572,9 @@
|
||||
private PlaylistGroupViewModel _selectedPlaylistGroup;
|
||||
private ProgramScheduleItemEditViewModel _selectedItem;
|
||||
|
||||
private MudForm _form;
|
||||
private bool _success;
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_cts.Cancel();
|
||||
@@ -675,6 +821,12 @@
|
||||
|
||||
private async Task SaveChanges()
|
||||
{
|
||||
await _form.Validate();
|
||||
if (!_success)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var items = _schedule.Items.Map(item => new ReplaceProgramScheduleItem(
|
||||
item.Index,
|
||||
item.StartType,
|
||||
|
||||
Reference in New Issue
Block a user