Browse Source

fix ui crashes (#1382)

* fix ffmpeg editor crash

* fix watermark editor

* fix multi collection editor

* fix filler preset editor crash
pull/1383/head
Jason Dove 2 years ago committed by GitHub
parent
commit
b84bb6b437
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 58
      ErsatzTV/Pages/FFmpegEditor.razor
  2. 229
      ErsatzTV/Pages/FillerPresetEditor.razor
  3. 104
      ErsatzTV/Pages/MultiCollectionEditor.razor
  4. 273
      ErsatzTV/Pages/WatermarkEditor.razor

58
ErsatzTV/Pages/FFmpegEditor.razor

@ -11,9 +11,12 @@
@inject ISnackbar _snackbar @inject ISnackbar _snackbar
@inject IMediator _mediator @inject IMediator _mediator
@inject IMemoryCache _memoryCache @inject IMemoryCache _memoryCache
@inject PersistentComponentState ApplicationState
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8"> <MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">
<EditForm EditContext="_editContext" OnSubmit="@HandleSubmitAsync"> @if (_editContext is not null)
{
<EditForm EditContext="_editContext" OnSubmit="@HandleSubmitAsync">
<FluentValidationValidator/> <FluentValidationValidator/>
<MudCard> <MudCard>
<MudCardHeader> <MudCardHeader>
@ -139,6 +142,7 @@
</MudCardActions> </MudCardActions>
</MudCard> </MudCard>
</EditForm> </EditForm>
}
</MudContainer> </MudContainer>
@code { @code {
@ -151,25 +155,55 @@
private EditContext _editContext; private EditContext _editContext;
private ValidationMessageStore _messageStore; private ValidationMessageStore _messageStore;
private List<ResolutionViewModel> _resolutions; private List<ResolutionViewModel> _resolutions = new();
private List<string> _vaapiDevices; private List<string> _vaapiDevices = new();
private PersistingComponentStateSubscription _persistingSubscription;
public void Dispose() public void Dispose()
{ {
_persistingSubscription.Dispose();
_cts.Cancel(); _cts.Cancel();
_cts.Dispose(); _cts.Dispose();
} }
protected override Task OnInitializedAsync()
{
_persistingSubscription = ApplicationState.RegisterOnPersisting(PersistData);
return base.OnInitializedAsync();
}
protected override async Task OnParametersSetAsync() protected override async Task OnParametersSetAsync()
{ {
_resolutions = await _mediator.Send(new GetAllResolutions(), _cts.Token); if (!ApplicationState.TryTakeFromJson("_resolutions", out List<ResolutionViewModel> restoredResolutions))
{
_resolutions = await _mediator.Send(new GetAllResolutions(), _cts.Token);
}
else
{
_resolutions = restoredResolutions;
}
if (IsEdit) if (IsEdit)
{ {
Option<FFmpegProfileViewModel> profile = await _mediator.Send(new GetFFmpegProfileById(Id), _cts.Token); if (!ApplicationState.TryTakeFromJson("_model", out FFmpegProfileEditViewModel restoredProfile))
profile.Match( {
ffmpegProfileViewModel => _model = new FFmpegProfileEditViewModel(ffmpegProfileViewModel), Option<FFmpegProfileViewModel> maybeProfile = await _mediator.Send(new GetFFmpegProfileById(Id), _cts.Token);
() => _navigationManager.NavigateTo("404")); foreach (FFmpegProfileViewModel profile in maybeProfile)
{
_model = new FFmpegProfileEditViewModel(profile);
}
if (maybeProfile.IsNone)
{
_navigationManager.NavigateTo("404");
}
}
else
{
_model = restoredProfile;
}
} }
else else
{ {
@ -187,6 +221,14 @@
_vaapiDevices = vaapiDevices.OrderBy(s => s).ToList(); _vaapiDevices = vaapiDevices.OrderBy(s => s).ToList();
} }
private Task PersistData()
{
ApplicationState.PersistAsJson("_model", _model);
ApplicationState.PersistAsJson("_resolutions", _resolutions);
return Task.CompletedTask;
}
private bool IsEdit => Id != 0; private bool IsEdit => Id != 0;
private async Task HandleSubmitAsync() private async Task HandleSubmitAsync()

229
ErsatzTV/Pages/FillerPresetEditor.razor

@ -16,119 +16,122 @@
<div style="max-width: 400px;"> <div style="max-width: 400px;">
<MudText Typo="Typo.h4" Class="mb-4">@(IsEdit ? "Edit Filler Preset" : "Add Filler Preset")</MudText> <MudText Typo="Typo.h4" Class="mb-4">@(IsEdit ? "Edit Filler Preset" : "Add Filler Preset")</MudText>
<EditForm EditContext="_editContext" OnSubmit="@HandleSubmitAsync"> @if (_editContext is not null)
<FluentValidationValidator/> {
<MudCard> <EditForm EditContext="_editContext" OnSubmit="@HandleSubmitAsync">
<MudCardContent> <FluentValidationValidator/>
<MudTextField Class="mt-3" Label="Name" @bind-Value="_model.Name" For="@(() => _model.Name)"/> <MudCard>
<MudSelect Class="mt-3" Label="Filler Kind" @bind-Value="_model.FillerKind" For="@(() => _model.FillerKind)" Disabled="@IsEdit"> <MudCardContent>
<MudSelectItem Value="@(FillerKind.PreRoll)">Pre-Roll</MudSelectItem> <MudTextField Class="mt-3" Label="Name" @bind-Value="_model.Name" For="@(() => _model.Name)"/>
<MudSelectItem Value="@(FillerKind.MidRoll)">Mid-Roll</MudSelectItem> <MudSelect Class="mt-3" Label="Filler Kind" @bind-Value="_model.FillerKind" For="@(() => _model.FillerKind)" Disabled="@IsEdit">
<MudSelectItem Value="@(FillerKind.PostRoll)">Post-Roll</MudSelectItem> <MudSelectItem Value="@(FillerKind.PreRoll)">Pre-Roll</MudSelectItem>
<MudSelectItem Value="@(FillerKind.Tail)">Tail</MudSelectItem> <MudSelectItem Value="@(FillerKind.MidRoll)">Mid-Roll</MudSelectItem>
<MudSelectItem Value="@(FillerKind.Fallback)">Fallback</MudSelectItem> <MudSelectItem Value="@(FillerKind.PostRoll)">Post-Roll</MudSelectItem>
</MudSelect> <MudSelectItem Value="@(FillerKind.Tail)">Tail</MudSelectItem>
<MudSelect Class="mt-3" Label="Filler Mode" @bind-Value="_model.FillerMode" For="@(() => _model.FillerMode)" <MudSelectItem Value="@(FillerKind.Fallback)">Fallback</MudSelectItem>
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>
</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)"/>
<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-Checked="@_model.AllowWatermarks" For="@(() => _model.AllowWatermarks)"/>
<MudSelect Class="mt-3" Label="Filler Collection Type" @bind-Value="_model.CollectionType" For="@(() => _model.CollectionType)">
@foreach (ProgramScheduleItemCollectionType collectionType in Enum.GetValues<ProgramScheduleItemCollectionType>())
{
<MudSelectItem Value="@collectionType">@collectionType</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> </MudSelect>
} <MudSelect Class="mt-3" Label="Filler Mode" @bind-Value="_model.FillerMode" For="@(() => _model.FillerMode)"
@if (_model.CollectionType == ProgramScheduleItemCollectionType.SmartCollection) Disabled="@(_model.FillerKind is FillerKind.Fallback or FillerKind.Tail)">
{ <MudSelectItem Value="@(FillerMode.Duration)">Duration</MudSelectItem>
<MudSelect Class="mt-3" <MudSelectItem Value="@(FillerMode.Count)">Count</MudSelectItem>
T="SmartCollectionViewModel" <MudSelectItem Value="@(FillerMode.Pad)">Pad</MudSelectItem>
Label="Smart Collection"
@bind-value="_model.SmartCollection">
@foreach (SmartCollectionViewModel collection in _smartCollections)
{
<MudSelectItem Value="@collection">@collection.Name</MudSelectItem>
}
</MudSelect> </MudSelect>
} <MudTimePicker Class="mt-3" Label="Filler Duration" @bind-Time="@_model.Duration" For="@(() => _model.Duration)" Disabled="@(_model.FillerMode != FillerMode.Duration)"/>
@if (_model.CollectionType == ProgramScheduleItemCollectionType.TelevisionShow) <MudTextField Class="mt-3" Label="Filler Count" @bind-Value="@_model.Count" For="@(() => _model.Count)" Disabled="@(_model.FillerMode != FillerMode.Count)"/>
{ <MudSelect Class="mt-3" Label="Filler Pad To Nearest Minute" @bind-Value="_model.PadToNearestMinute" For="@(() => _model.PadToNearestMinute)" Disabled="@(_model.FillerMode != FillerMode.Pad)">
<MudSelect Class="mt-3" <MudSelectItem T="int?" Value="5">5 (:00, :05, :10, :15, :20, etc)</MudSelectItem>
T="NamedMediaItemViewModel" <MudSelectItem T="int?" Value="10">10 (:00, :10, :20, :30, :40, :50)</MudSelectItem>
Label="Television Show" <MudSelectItem T="int?" Value="15">15 (:00, :15, :30, :45)</MudSelectItem>
@bind-value="_model.MediaItem"> <MudSelectItem T="int?" Value="30">30 (:00, :30)</MudSelectItem>
@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> </MudSelect>
} <MudCheckBox Class="mt-3" Label="Allow Watermarks" @bind-Checked="@_model.AllowWatermarks" For="@(() => _model.AllowWatermarks)"/>
@if (_model.CollectionType == ProgramScheduleItemCollectionType.Artist) <MudSelect Class="mt-3" Label="Filler Collection Type" @bind-Value="_model.CollectionType" For="@(() => _model.CollectionType)">
{ @foreach (ProgramScheduleItemCollectionType collectionType in Enum.GetValues<ProgramScheduleItemCollectionType>())
<MudSelect Class="mt-3"
T="NamedMediaItemViewModel"
Label="Artist"
@bind-value="_model.MediaItem">
@foreach (NamedMediaItemViewModel artist in _artists)
{ {
<MudSelectItem Value="@artist">@artist.Name</MudSelectItem> <MudSelectItem Value="@collectionType">@collectionType</MudSelectItem>
} }
</MudSelect> </MudSelect>
} @if (_model.CollectionType == ProgramScheduleItemCollectionType.Collection)
</MudCardContent> {
<MudCardActions> <MudSelect Class="mt-3"
<MudButton ButtonType="ButtonType.Submit" Variant="Variant.Filled" Color="Color.Primary" Class="ml-auto"> T="MediaCollectionViewModel"
@(IsEdit ? "Save Changes" : "Add Filler Preset") Label="Collection"
</MudButton> @bind-value="_model.Collection">
</MudCardActions> @foreach (MediaCollectionViewModel collection in _mediaCollections)
</MudCard> {
</EditForm> <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> </div>
</MudContainer> </MudContainer>
@ -142,12 +145,12 @@
private EditContext _editContext; private EditContext _editContext;
private ValidationMessageStore _messageStore; private ValidationMessageStore _messageStore;
private List<MediaCollectionViewModel> _mediaCollections; private List<MediaCollectionViewModel> _mediaCollections = new();
private List<MultiCollectionViewModel> _multiCollections; private List<MultiCollectionViewModel> _multiCollections = new();
private List<SmartCollectionViewModel> _smartCollections; private List<SmartCollectionViewModel> _smartCollections = new();
private List<NamedMediaItemViewModel> _televisionShows; private List<NamedMediaItemViewModel> _televisionShows = new();
private List<NamedMediaItemViewModel> _televisionSeasons; private List<NamedMediaItemViewModel> _televisionSeasons = new();
private List<NamedMediaItemViewModel> _artists; private List<NamedMediaItemViewModel> _artists = new();
public void Dispose() public void Dispose()
{ {

104
ErsatzTV/Pages/MultiCollectionEditor.razor

@ -11,53 +11,56 @@
<div style="max-width: 400px;"> <div style="max-width: 400px;">
<MudText Typo="Typo.h4" Class="mb-4">@(IsEdit ? "Edit Multi Collection" : "Add Multi Collection")</MudText> <MudText Typo="Typo.h4" Class="mb-4">@(IsEdit ? "Edit Multi Collection" : "Add Multi Collection")</MudText>
<EditForm EditContext="_editContext" OnSubmit="@HandleSubmitAsync"> @if (_editContext is not null)
<FluentValidationValidator/> {
<MudCard> <EditForm EditContext="_editContext" OnSubmit="@HandleSubmitAsync">
<MudCardContent> <FluentValidationValidator/>
<MudTextField Class="mt-3" Label="Name" @bind-Value="_model.Name" For="@(() => _model.Name)"/> <MudCard>
<MudSelect @ref="_collectionSelect" <MudCardContent>
Class="mt-4" <MudTextField Class="mt-3" Label="Name" @bind-Value="_model.Name" For="@(() => _model.Name)"/>
T="MediaCollectionViewModel" <MudSelect @ref="_collectionSelect"
Label="Collection" Class="mt-4"
@bind-value="_selectedCollection" T="MediaCollectionViewModel"
HelperText="Disabled collections are already present in this multi collection"> Label="Collection"
@foreach (MediaCollectionViewModel collection in _collections) @bind-value="_selectedCollection"
{ HelperText="Disabled collections are already present in this multi collection">
<MudSelectItem Disabled="@(_model.Items.Any(i => i.Collection.Id == collection.Id))" @foreach (MediaCollectionViewModel collection in _collections)
Value="@collection"> {
@collection.Name <MudSelectItem Disabled="@(_model.Items.Any(i => i.Collection.Id == collection.Id))"
</MudSelectItem> Value="@collection">
} @collection.Name
</MudSelect> </MudSelectItem>
<MudButton Variant="Variant.Filled" Color="Color.Secondary" OnClick="@(_ => AddCollection())" Class="mt-4 mr-auto"> }
Add Collection </MudSelect>
</MudButton> <MudButton Variant="Variant.Filled" Color="Color.Secondary" OnClick="@(_ => AddCollection())" Class="mt-4 mr-auto">
<MudSelect @ref="_smartCollectionSelect" Add Collection
Class="mt-4" </MudButton>
T="SmartCollectionViewModel" <MudSelect @ref="_smartCollectionSelect"
Label="Smart Collection" Class="mt-4"
@bind-value="_selectedSmartCollection" T="SmartCollectionViewModel"
HelperText="Disabled collections are already present in this multi collection"> Label="Smart Collection"
@foreach (SmartCollectionViewModel collection in _smartCollections) @bind-value="_selectedSmartCollection"
{ HelperText="Disabled collections are already present in this multi collection">
<MudSelectItem Disabled="@(_model.Items.Any(i => i.Collection.Id == collection.Id))" @foreach (SmartCollectionViewModel collection in _smartCollections)
Value="@collection"> {
@collection.Name <MudSelectItem Disabled="@(_model.Items.Any(i => i.Collection.Id == collection.Id))"
</MudSelectItem> Value="@collection">
} @collection.Name
</MudSelect> </MudSelectItem>
<MudButton Variant="Variant.Filled" Color="Color.Secondary" OnClick="@(_ => AddSmartCollection())" Class="mt-4 mr-auto"> }
Add Smart Collection </MudSelect>
</MudButton> <MudButton Variant="Variant.Filled" Color="Color.Secondary" OnClick="@(_ => AddSmartCollection())" Class="mt-4 mr-auto">
</MudCardContent> Add Smart Collection
<MudCardActions> </MudButton>
<MudButton ButtonType="ButtonType.Submit" Variant="Variant.Filled" Color="Color.Primary" Class="mr-2 ml-auto"> </MudCardContent>
@(IsEdit ? "Save Changes" : "Add Multi Collection") <MudCardActions>
</MudButton> <MudButton ButtonType="ButtonType.Submit" Variant="Variant.Filled" Color="Color.Primary" Class="mr-2 ml-auto">
</MudCardActions> @(IsEdit ? "Save Changes" : "Add Multi Collection")
</MudCard> </MudButton>
</EditForm> </MudCardActions>
</MudCard>
</EditForm>
}
</div> </div>
<MudTable Hover="true" Items="_model.Items.OrderBy(i => i.Collection.Name, StringComparer.CurrentCultureIgnoreCase)" Dense="true" Class="mt-6"> <MudTable Hover="true" Items="_model.Items.OrderBy(i => i.Collection.Name, StringComparer.CurrentCultureIgnoreCase)" Dense="true" Class="mt-6">
@ -108,11 +111,12 @@
[Parameter] [Parameter]
public int Id { get; set; } public int Id { get; set; }
private readonly MultiCollectionEditViewModel _model = new(); private readonly MultiCollectionEditViewModel _model =
new() { Items = new List<MultiCollectionItemEditViewModel>() };
private EditContext _editContext; private EditContext _editContext;
private ValidationMessageStore _messageStore; private ValidationMessageStore _messageStore;
private List<MediaCollectionViewModel> _collections; private List<MediaCollectionViewModel> _collections = new();
private List<SmartCollectionViewModel> _smartCollections; private List<SmartCollectionViewModel> _smartCollections = new();
private MediaCollectionViewModel _selectedCollection; private MediaCollectionViewModel _selectedCollection;
private SmartCollectionViewModel _selectedSmartCollection; private SmartCollectionViewModel _selectedSmartCollection;
private MudSelect<MediaCollectionViewModel> _collectionSelect; private MudSelect<MediaCollectionViewModel> _collectionSelect;

273
ErsatzTV/Pages/WatermarkEditor.razor

@ -11,141 +11,144 @@
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8"> <MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">
<div style="max-width: 400px;"> <div style="max-width: 400px;">
<EditForm EditContext="_editContext" OnSubmit="@HandleSubmitAsync"> @if (_editContext is not null)
<FluentValidationValidator/> {
<MudCard> <EditForm EditContext="_editContext" OnSubmit="@HandleSubmitAsync">
<MudCardHeader> <FluentValidationValidator/>
<CardHeaderContent> <MudCard>
<MudText Typo="Typo.h5">@(IsEdit ? "Edit Watermark" : "Add Watermark")</MudText> <MudCardHeader>
</CardHeaderContent> <CardHeaderContent>
</MudCardHeader> <MudText Typo="Typo.h5">@(IsEdit ? "Edit Watermark" : "Add Watermark")</MudText>
<MudCardContent> </CardHeaderContent>
<MudTextField Label="Name" @bind-Value="_model.Name" For="@(() => _model.Name)"/> </MudCardHeader>
<MudSelect Class="mt-3" Label="Mode" @bind-Value="_model.Mode" <MudCardContent>
For="@(() => _model.Mode)"> <MudTextField Label="Name" @bind-Value="_model.Name" For="@(() => _model.Name)"/>
<MudSelectItem Value="@(ChannelWatermarkMode.None)">None</MudSelectItem> <MudSelect Class="mt-3" Label="Mode" @bind-Value="_model.Mode"
<MudSelectItem Value="@(ChannelWatermarkMode.Permanent)">Permanent</MudSelectItem> For="@(() => _model.Mode)">
<MudSelectItem Value="@(ChannelWatermarkMode.Intermittent)">Intermittent</MudSelectItem> <MudSelectItem Value="@(ChannelWatermarkMode.None)">None</MudSelectItem>
</MudSelect> <MudSelectItem Value="@(ChannelWatermarkMode.Permanent)">Permanent</MudSelectItem>
<MudSelect Class="mt-3" Label="Image Source" @bind-Value="_model.ImageSource" <MudSelectItem Value="@(ChannelWatermarkMode.Intermittent)">Intermittent</MudSelectItem>
For="@(() => _model.ImageSource)" </MudSelect>
Disabled="@(_model.Mode == ChannelWatermarkMode.None)"> <MudSelect Class="mt-3" Label="Image Source" @bind-Value="_model.ImageSource"
<MudSelectItem Value="@(ChannelWatermarkImageSource.Custom)">Custom</MudSelectItem> For="@(() => _model.ImageSource)"
<MudSelectItem Value="@(ChannelWatermarkImageSource.ChannelLogo)">Channel Logo</MudSelectItem> Disabled="@(_model.Mode == ChannelWatermarkMode.None)">
</MudSelect> <MudSelectItem Value="@(ChannelWatermarkImageSource.Custom)">Custom</MudSelectItem>
<MudGrid Class="mt-3" Style="align-items: center" Justify="Justify.Center"> <MudSelectItem Value="@(ChannelWatermarkImageSource.ChannelLogo)">Channel Logo</MudSelectItem>
<MudItem xs="6"> </MudSelect>
<InputFile id="watermarkFileInput" OnChange="UploadWatermark" style="display: none;"/> <MudGrid Class="mt-3" Style="align-items: center" Justify="Justify.Center">
@if (!string.IsNullOrWhiteSpace(_model.Image) && _model.ImageSource == ChannelWatermarkImageSource.Custom) <MudItem xs="6">
{ <InputFile id="watermarkFileInput" OnChange="UploadWatermark" style="display: none;"/>
<MudElement HtmlTag="img" src="@($"artwork/watermarks/{_model.Image}")" Style="max-height: 50px"/> @if (!string.IsNullOrWhiteSpace(_model.Image) && _model.ImageSource == ChannelWatermarkImageSource.Custom)
} {
<ValidationMessage For="@(() => _model.Image)" style="color: #f44336 !important;"/> <MudElement HtmlTag="img" src="@($"artwork/watermarks/{_model.Image}")" Style="max-height: 50px"/>
</MudItem> }
<MudItem xs="6"> <ValidationMessage For="@(() => _model.Image)" style="color: #f44336 !important;"/>
<MudButton Class="ml-auto" HtmlTag="label" </MudItem>
Variant="Variant.Filled" <MudItem xs="6">
Color="Color.Primary" <MudButton Class="ml-auto" HtmlTag="label"
StartIcon="@Icons.Material.Filled.CloudUpload" Variant="Variant.Filled"
Disabled="@(_model.ImageSource != ChannelWatermarkImageSource.Custom)" Color="Color.Primary"
for="watermarkFileInput"> StartIcon="@Icons.Material.Filled.CloudUpload"
Upload Image Disabled="@(_model.ImageSource != ChannelWatermarkImageSource.Custom)"
</MudButton> for="watermarkFileInput">
</MudItem> Upload Image
</MudGrid> </MudButton>
<MudSelect Class="mt-3" Label="Location" @bind-Value="_model.Location" </MudItem>
For="@(() => _model.Location)" </MudGrid>
Disabled="@(_model.Mode == ChannelWatermarkMode.None)"> <MudSelect Class="mt-3" Label="Location" @bind-Value="_model.Location"
<MudSelectItem Value="@(WatermarkLocation.BottomRight)">Bottom Right</MudSelectItem> For="@(() => _model.Location)"
<MudSelectItem Value="@(WatermarkLocation.BottomMiddle)">Bottom Middle</MudSelectItem> Disabled="@(_model.Mode == ChannelWatermarkMode.None)">
<MudSelectItem Value="@(WatermarkLocation.BottomLeft)">Bottom Left</MudSelectItem> <MudSelectItem Value="@(WatermarkLocation.BottomRight)">Bottom Right</MudSelectItem>
<MudSelectItem Value="@(WatermarkLocation.LeftMiddle)">Left Middle</MudSelectItem> <MudSelectItem Value="@(WatermarkLocation.BottomMiddle)">Bottom Middle</MudSelectItem>
<MudSelectItem Value="@(WatermarkLocation.TopLeft)">Top Left</MudSelectItem> <MudSelectItem Value="@(WatermarkLocation.BottomLeft)">Bottom Left</MudSelectItem>
<MudSelectItem Value="@(WatermarkLocation.TopMiddle)">Top Middle</MudSelectItem> <MudSelectItem Value="@(WatermarkLocation.LeftMiddle)">Left Middle</MudSelectItem>
<MudSelectItem Value="@(WatermarkLocation.TopRight)">Top Right</MudSelectItem> <MudSelectItem Value="@(WatermarkLocation.TopLeft)">Top Left</MudSelectItem>
<MudSelectItem Value="@(WatermarkLocation.RightMiddle)">Right Middle</MudSelectItem> <MudSelectItem Value="@(WatermarkLocation.TopMiddle)">Top Middle</MudSelectItem>
</MudSelect> <MudSelectItem Value="@(WatermarkLocation.TopRight)">Top Right</MudSelectItem>
<MudCheckBox Class="mt-3" Label="Place Within Source Content" <MudSelectItem Value="@(WatermarkLocation.RightMiddle)">Right Middle</MudSelectItem>
@bind-Checked="_model.PlaceWithinSourceContent" </MudSelect>
For="@(() => _model.PlaceWithinSourceContent)" <MudCheckBox Class="mt-3" Label="Place Within Source Content"
Disabled="@(_model.Mode == ChannelWatermarkMode.None)"/> @bind-Checked="_model.PlaceWithinSourceContent"
<MudGrid Class="mt-3" Style="align-items: start" Justify="Justify.Center"> For="@(() => _model.PlaceWithinSourceContent)"
<MudItem xs="6"> Disabled="@(_model.Mode == ChannelWatermarkMode.None)"/>
<MudSelect Label="Size" @bind-Value="_model.Size" <MudGrid Class="mt-3" Style="align-items: start" Justify="Justify.Center">
For="@(() => _model.Size)" <MudItem xs="6">
Disabled="@(_model.Mode == ChannelWatermarkMode.None)"> <MudSelect Label="Size" @bind-Value="_model.Size"
<MudSelectItem Value="@(WatermarkSize.Scaled)">Scaled</MudSelectItem> For="@(() => _model.Size)"
<MudSelectItem Value="@(WatermarkSize.ActualSize)">Actual Size</MudSelectItem> Disabled="@(_model.Mode == ChannelWatermarkMode.None)">
</MudSelect> <MudSelectItem Value="@(WatermarkSize.Scaled)">Scaled</MudSelectItem>
</MudItem> <MudSelectItem Value="@(WatermarkSize.ActualSize)">Actual Size</MudSelectItem>
<MudItem xs="6"> </MudSelect>
<MudTextField Label="Width" @bind-Value="_model.Width" </MudItem>
For="@(() => _model.Width)" <MudItem xs="6">
Adornment="Adornment.End" <MudTextField Label="Width" @bind-Value="_model.Width"
AdornmentText="%" For="@(() => _model.Width)"
Disabled="@(_model.Mode == ChannelWatermarkMode.None || _model.Size == WatermarkSize.ActualSize)" Adornment="Adornment.End"
Immediate="true"/> AdornmentText="%"
</MudItem> Disabled="@(_model.Mode == ChannelWatermarkMode.None || _model.Size == WatermarkSize.ActualSize)"
</MudGrid> Immediate="true"/>
<MudGrid Class="mt-3" Style="align-items: start" Justify="Justify.Center"> </MudItem>
<MudItem xs="6"> </MudGrid>
<MudTextField Label="Horizontal Margin" @bind-Value="_model.HorizontalMargin" <MudGrid Class="mt-3" Style="align-items: start" Justify="Justify.Center">
For="@(() => _model.HorizontalMargin)" <MudItem xs="6">
Adornment="Adornment.End" <MudTextField Label="Horizontal Margin" @bind-Value="_model.HorizontalMargin"
AdornmentText="%" For="@(() => _model.HorizontalMargin)"
Disabled="@(_model.Mode == ChannelWatermarkMode.None)" Adornment="Adornment.End"
Immediate="true"/> AdornmentText="%"
</MudItem> Disabled="@(_model.Mode == ChannelWatermarkMode.None)"
<MudItem xs="6"> Immediate="true"/>
<MudTextField Label="Vertical Margin" @bind-Value="_model.VerticalMargin" </MudItem>
For="@(() => _model.VerticalMargin)" <MudItem xs="6">
Adornment="Adornment.End" <MudTextField Label="Vertical Margin" @bind-Value="_model.VerticalMargin"
AdornmentText="%" For="@(() => _model.VerticalMargin)"
Disabled="@(_model.Mode == ChannelWatermarkMode.None)" Adornment="Adornment.End"
Immediate="true"/> AdornmentText="%"
</MudItem> Disabled="@(_model.Mode == ChannelWatermarkMode.None)"
</MudGrid> Immediate="true"/>
<MudGrid Class="mt-3" Style="align-items: start" Justify="Justify.Center"> </MudItem>
<MudItem xs="6"> </MudGrid>
<MudSelect Label="Frequency" @bind-Value="_model.FrequencyMinutes" <MudGrid Class="mt-3" Style="align-items: start" Justify="Justify.Center">
For="@(() => _model.FrequencyMinutes)" <MudItem xs="6">
Disabled="@(_model.Mode != ChannelWatermarkMode.Intermittent)"> <MudSelect Label="Frequency" @bind-Value="_model.FrequencyMinutes"
<MudSelectItem Value="5">5 minutes</MudSelectItem> For="@(() => _model.FrequencyMinutes)"
<MudSelectItem Value="10">10 minutes</MudSelectItem> Disabled="@(_model.Mode != ChannelWatermarkMode.Intermittent)">
<MudSelectItem Value="15">15 minutes</MudSelectItem> <MudSelectItem Value="5">5 minutes</MudSelectItem>
<MudSelectItem Value="20">20 minutes</MudSelectItem> <MudSelectItem Value="10">10 minutes</MudSelectItem>
<MudSelectItem Value="30">30 minutes</MudSelectItem> <MudSelectItem Value="15">15 minutes</MudSelectItem>
<MudSelectItem Value="60">60 minutes</MudSelectItem> <MudSelectItem Value="20">20 minutes</MudSelectItem>
</MudSelect> <MudSelectItem Value="30">30 minutes</MudSelectItem>
</MudItem> <MudSelectItem Value="60">60 minutes</MudSelectItem>
<MudItem xs="6"> </MudSelect>
<MudTextField Label="Duration" @bind-Value="_model.DurationSeconds" </MudItem>
For="@(() => _model.DurationSeconds)" <MudItem xs="6">
Adornment="Adornment.End" <MudTextField Label="Duration" @bind-Value="_model.DurationSeconds"
AdornmentText="seconds" For="@(() => _model.DurationSeconds)"
Disabled="@(_model.Mode != ChannelWatermarkMode.Intermittent)" Adornment="Adornment.End"
Immediate="true"/> AdornmentText="seconds"
</MudItem> Disabled="@(_model.Mode != ChannelWatermarkMode.Intermittent)"
</MudGrid> Immediate="true"/>
<MudGrid Class="mt-3" Style="align-items: start" Justify="Justify.Center"> </MudItem>
<MudItem xs="6"> </MudGrid>
<MudTextField Label="Opacity" @bind-Value="_model.Opacity" <MudGrid Class="mt-3" Style="align-items: start" Justify="Justify.Center">
For="@(() => _model.Opacity)" <MudItem xs="6">
Adornment="Adornment.End" <MudTextField Label="Opacity" @bind-Value="_model.Opacity"
AdornmentText="%" For="@(() => _model.Opacity)"
Disabled="@(_model.Mode == ChannelWatermarkMode.None)" Adornment="Adornment.End"
Immediate="true"/> AdornmentText="%"
</MudItem> Disabled="@(_model.Mode == ChannelWatermarkMode.None)"
<MudItem xs="6"/> Immediate="true"/>
</MudGrid> </MudItem>
</MudCardContent> <MudItem xs="6"/>
<MudCardActions> </MudGrid>
<MudButton ButtonType="ButtonType.Submit" Variant="Variant.Filled" Color="Color.Primary"> </MudCardContent>
@(IsEdit ? "Save Changes" : "Add Watermark") <MudCardActions>
</MudButton> <MudButton ButtonType="ButtonType.Submit" Variant="Variant.Filled" Color="Color.Primary">
</MudCardActions> @(IsEdit ? "Save Changes" : "Add Watermark")
</MudCard> </MudButton>
</EditForm> </MudCardActions>
</MudCard>
</EditForm>
}
</div> </div>
</MudContainer> </MudContainer>

Loading…
Cancel
Save