* fix validation in new form layout * pin mediatr to last oss version * update dependencies * cleanup code in core * cleanup code in ffmpeg * cleanup code in infra * cleanup code in scanner * cleanup code in application * cleanup main code * cleanup test code * solution-wide code cleanup
243 lines
14 KiB
Plaintext
243 lines
14 KiB
Plaintext
@page "/media/filler/presets/{Id:int}/edit"
|
|
@page "/media/filler/presets/add"
|
|
@using ErsatzTV.Application.Artists
|
|
@using ErsatzTV.Application.Filler
|
|
@using ErsatzTV.Application.MediaCollections
|
|
@using ErsatzTV.Application.MediaItems
|
|
@using ErsatzTV.Application.Television
|
|
@using ErsatzTV.Core.Domain.Filler
|
|
@implements IDisposable
|
|
@inject NavigationManager NavigationManager
|
|
@inject ILogger<FillerPresetEditor> Logger
|
|
@inject ISnackbar Snackbar
|
|
@inject IMediator Mediator
|
|
|
|
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">
|
|
<div style="max-width: 400px;">
|
|
<MudText Typo="Typo.h4" Class="mb-4">@(IsEdit ? "Edit Filler Preset" : "Add Filler Preset")</MudText>
|
|
|
|
@if (_editContext is not null)
|
|
{
|
|
<EditForm EditContext="_editContext" OnSubmit="@HandleSubmitAsync">
|
|
<FluentValidationValidator/>
|
|
<MudCard>
|
|
<MudCardContent>
|
|
<MudTextField Class="mt-3" Label="Name" @bind-Value="_model.Name" For="@(() => _model.Name)"/>
|
|
<MudSelect Class="mt-3" Label="Filler Kind" @bind-Value="_model.FillerKind" For="@(() => _model.FillerKind)" Disabled="@IsEdit">
|
|
<MudSelectItem Value="@(FillerKind.PreRoll)">Pre-Roll</MudSelectItem>
|
|
<MudSelectItem Value="@(FillerKind.MidRoll)">Mid-Roll</MudSelectItem>
|
|
<MudSelectItem Value="@(FillerKind.PostRoll)">Post-Roll</MudSelectItem>
|
|
<MudSelectItem Value="@(FillerKind.Tail)">Tail</MudSelectItem>
|
|
<MudSelectItem Value="@(FillerKind.Fallback)">Fallback</MudSelectItem>
|
|
</MudSelect>
|
|
<MudSelect Class="mt-3" Label="Filler Mode" @bind-Value="_model.FillerMode" For="@(() => _model.FillerMode)"
|
|
Disabled="@(_model.FillerKind is FillerKind.Fallback or FillerKind.Tail)">
|
|
<MudSelectItem Value="@(FillerMode.Duration)">Duration</MudSelectItem>
|
|
<MudSelectItem Value="@(FillerMode.Count)">Count</MudSelectItem>
|
|
<MudSelectItem Value="@(FillerMode.Pad)">Pad</MudSelectItem>
|
|
<MudSelectItem Value="@(FillerMode.RandomCount)">Random Count</MudSelectItem>
|
|
</MudSelect>
|
|
<MudTimePicker Class="mt-3" Label="Filler Duration" @bind-Time="@_model.Duration" For="@(() => _model.Duration)" Disabled="@(_model.FillerMode != FillerMode.Duration)"/>
|
|
<MudTextField Class="mt-3" Label="Filler Count" @bind-Value="@_model.Count" For="@(() => _model.Count)" Disabled="@(_model.FillerMode != FillerMode.Count && _model.FillerMode != FillerMode.RandomCount)"/>
|
|
<MudSelect Class="mt-3" Label="Filler Pad To Nearest Minute" @bind-Value="_model.PadToNearestMinute" For="@(() => _model.PadToNearestMinute)" Disabled="@(_model.FillerMode != FillerMode.Pad)">
|
|
<MudSelectItem T="int?" Value="5">5 (:00, :05, :10, :15, :20, etc)</MudSelectItem>
|
|
<MudSelectItem T="int?" Value="10">10 (:00, :10, :20, :30, :40, :50)</MudSelectItem>
|
|
<MudSelectItem T="int?" Value="15">15 (:00, :15, :30, :45)</MudSelectItem>
|
|
<MudSelectItem T="int?" Value="30">30 (:00, :30)</MudSelectItem>
|
|
</MudSelect>
|
|
<MudCheckBox Class="mt-3" Label="Allow Watermarks" @bind-Value="@_model.AllowWatermarks" For="@(() => _model.AllowWatermarks)"/>
|
|
<MudSelect Class="mt-3" Label="Filler Collection Type" @bind-Value="_model.CollectionType" For="@(() => _model.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>
|
|
</MudSelect>
|
|
@if (_model.CollectionType == ProgramScheduleItemCollectionType.Collection)
|
|
{
|
|
<MudSelect Class="mt-3"
|
|
T="MediaCollectionViewModel"
|
|
Label="Collection"
|
|
@bind-value="_model.Collection">
|
|
@foreach (MediaCollectionViewModel collection in _mediaCollections)
|
|
{
|
|
<MudSelectItem Value="@collection">@collection.Name</MudSelectItem>
|
|
}
|
|
</MudSelect>
|
|
}
|
|
@if (_model.CollectionType == ProgramScheduleItemCollectionType.MultiCollection)
|
|
{
|
|
<MudSelect Class="mt-3"
|
|
T="MultiCollectionViewModel"
|
|
Label="Multi Collection"
|
|
@bind-value="_model.MultiCollection">
|
|
@foreach (MultiCollectionViewModel collection in _multiCollections)
|
|
{
|
|
<MudSelectItem Value="@collection">@collection.Name</MudSelectItem>
|
|
}
|
|
</MudSelect>
|
|
}
|
|
@if (_model.CollectionType == ProgramScheduleItemCollectionType.SmartCollection)
|
|
{
|
|
<MudSelect Class="mt-3"
|
|
T="SmartCollectionViewModel"
|
|
Label="Smart Collection"
|
|
@bind-value="_model.SmartCollection">
|
|
@foreach (SmartCollectionViewModel collection in _smartCollections)
|
|
{
|
|
<MudSelectItem Value="@collection">@collection.Name</MudSelectItem>
|
|
}
|
|
</MudSelect>
|
|
}
|
|
@if (_model.CollectionType == ProgramScheduleItemCollectionType.TelevisionShow)
|
|
{
|
|
<MudSelect Class="mt-3"
|
|
T="NamedMediaItemViewModel"
|
|
Label="Television Show"
|
|
@bind-value="_model.MediaItem">
|
|
@foreach (NamedMediaItemViewModel show in _televisionShows)
|
|
{
|
|
<MudSelectItem Value="@show">@show.Name</MudSelectItem>
|
|
}
|
|
</MudSelect>
|
|
}
|
|
@if (_model.CollectionType == ProgramScheduleItemCollectionType.TelevisionSeason)
|
|
{
|
|
<MudSelect Class="mt-3"
|
|
T="NamedMediaItemViewModel"
|
|
Label="Television Season"
|
|
@bind-value="_model.MediaItem">
|
|
@foreach (NamedMediaItemViewModel season in _televisionSeasons)
|
|
{
|
|
<MudSelectItem Value="@season">@season.Name</MudSelectItem>
|
|
}
|
|
</MudSelect>
|
|
}
|
|
@if (_model.CollectionType == ProgramScheduleItemCollectionType.Artist)
|
|
{
|
|
<MudSelect Class="mt-3"
|
|
T="NamedMediaItemViewModel"
|
|
Label="Artist"
|
|
@bind-value="_model.MediaItem">
|
|
@foreach (NamedMediaItemViewModel artist in _artists)
|
|
{
|
|
<MudSelectItem Value="@artist">@artist.Name</MudSelectItem>
|
|
}
|
|
</MudSelect>
|
|
}
|
|
</MudCardContent>
|
|
<MudCardActions>
|
|
<MudButton ButtonType="ButtonType.Submit" Variant="Variant.Filled" Color="Color.Primary" Class="ml-auto">
|
|
@(IsEdit ? "Save Changes" : "Add Filler Preset")
|
|
</MudButton>
|
|
</MudCardActions>
|
|
</MudCard>
|
|
</EditForm>
|
|
}
|
|
</div>
|
|
</MudContainer>
|
|
|
|
@code {
|
|
private readonly CancellationTokenSource _cts = new();
|
|
|
|
[Parameter]
|
|
public int Id { get; set; }
|
|
|
|
private readonly FillerPresetEditViewModel _model = new();
|
|
private EditContext _editContext;
|
|
private ValidationMessageStore _messageStore;
|
|
|
|
private List<MediaCollectionViewModel> _mediaCollections = new();
|
|
private List<MultiCollectionViewModel> _multiCollections = new();
|
|
private List<SmartCollectionViewModel> _smartCollections = new();
|
|
private List<NamedMediaItemViewModel> _televisionShows = new();
|
|
private List<NamedMediaItemViewModel> _televisionSeasons = new();
|
|
private List<NamedMediaItemViewModel> _artists = new();
|
|
|
|
public void Dispose()
|
|
{
|
|
_cts.Cancel();
|
|
_cts.Dispose();
|
|
}
|
|
|
|
protected override async Task OnParametersSetAsync()
|
|
{
|
|
_mediaCollections = await Mediator.Send(new GetAllCollections(), _cts.Token)
|
|
.Map(list => list.OrderBy(vm => vm.Name, StringComparer.CurrentCultureIgnoreCase).ToList());
|
|
_multiCollections = await Mediator.Send(new GetAllMultiCollections(), _cts.Token)
|
|
.Map(list => list.OrderBy(vm => vm.Name, StringComparer.CurrentCultureIgnoreCase).ToList());
|
|
_smartCollections = await Mediator.Send(new GetAllSmartCollections(), _cts.Token)
|
|
.Map(list => list.OrderBy(vm => vm.Name, StringComparer.CurrentCultureIgnoreCase).ToList());
|
|
_televisionShows = await Mediator.Send(new GetAllTelevisionShows(), _cts.Token)
|
|
.Map(list => list.OrderBy(vm => vm.Name, StringComparer.CurrentCultureIgnoreCase).ToList());
|
|
_televisionSeasons = await Mediator.Send(new GetAllTelevisionSeasons(), _cts.Token)
|
|
.Map(list => list.OrderBy(vm => vm.Name, StringComparer.CurrentCultureIgnoreCase).ToList());
|
|
_artists = await Mediator.Send(new GetAllArtists(), _cts.Token)
|
|
.Map(list => list.OrderBy(vm => vm.Name, StringComparer.CurrentCultureIgnoreCase).ToList());
|
|
|
|
if (IsEdit)
|
|
{
|
|
Option<FillerPresetViewModel> maybeFillerPreset = await Mediator.Send(new GetFillerPresetById(Id), _cts.Token);
|
|
maybeFillerPreset.IfSome(fillerPreset =>
|
|
{
|
|
_model.Id = fillerPreset.Id;
|
|
_model.Name = fillerPreset.Name;
|
|
_model.FillerKind = fillerPreset.FillerKind;
|
|
_model.FillerMode = fillerPreset.FillerMode;
|
|
_model.Duration = fillerPreset.Duration;
|
|
_model.Count = fillerPreset.Count;
|
|
_model.PadToNearestMinute = fillerPreset.PadToNearestMinute;
|
|
_model.AllowWatermarks = fillerPreset.AllowWatermarks;
|
|
_model.CollectionType = fillerPreset.CollectionType;
|
|
_model.Collection = fillerPreset.CollectionId.HasValue
|
|
? _mediaCollections.Find(c => c.Id == fillerPreset.CollectionId.Value)
|
|
: null;
|
|
_model.MultiCollection = fillerPreset.MultiCollectionId.HasValue
|
|
? _multiCollections.Find(c => c.Id == fillerPreset.MultiCollectionId.Value)
|
|
: null;
|
|
_model.SmartCollection = fillerPreset.SmartCollectionId.HasValue
|
|
? _smartCollections.Find(c => c.Id == fillerPreset.SmartCollectionId.Value)
|
|
: null;
|
|
_model.MediaItem = fillerPreset.MediaItemId.HasValue
|
|
? _televisionShows.Append(_televisionSeasons).Append(_artists).ToList().Find(vm => vm.MediaItemId == fillerPreset.MediaItemId.Value)
|
|
: null;
|
|
});
|
|
}
|
|
else
|
|
{
|
|
_model.Name = "New Filler Preset";
|
|
_model.FillerKind = FillerKind.PreRoll;
|
|
_model.FillerMode = FillerMode.Duration;
|
|
}
|
|
}
|
|
|
|
protected override void OnInitialized()
|
|
{
|
|
_editContext = new EditContext(_model);
|
|
_messageStore = new ValidationMessageStore(_editContext);
|
|
}
|
|
|
|
private bool IsEdit => Id != 0;
|
|
|
|
private async Task HandleSubmitAsync()
|
|
{
|
|
_messageStore.Clear();
|
|
if (_editContext.Validate())
|
|
{
|
|
IRequest<Either<BaseError, Unit>> request = IsEdit ? _model.ToEdit() : _model.ToUpdate();
|
|
|
|
Seq<BaseError> errorMessage = await Mediator.Send(request, _cts.Token)
|
|
.Map(result => result.LeftToSeq());
|
|
|
|
errorMessage.HeadOrNone().Match(
|
|
error =>
|
|
{
|
|
Snackbar.Add(error.Value, Severity.Error);
|
|
Logger.LogError("Error saving filler preset: {Error}", error.Value);
|
|
},
|
|
() => NavigationManager.NavigateTo("media/filler/presets"));
|
|
}
|
|
}
|
|
|
|
} |