Browse Source

add initial models

add-deco-break-content
Jason Dove 1 year ago
parent
commit
a703dd58af
No known key found for this signature in database
  1. 4
      ErsatzTV.Core/Domain/Scheduling/Deco.cs
  2. 18
      ErsatzTV.Core/Domain/Scheduling/DecoBreakContent.cs
  3. 10
      ErsatzTV.Core/Domain/Scheduling/DecoBreakPlacement.cs
  4. 37
      ErsatzTV.Infrastructure/Data/Configurations/Scheduling/DecoBreakContentConfiguration.cs
  5. 5
      ErsatzTV.Infrastructure/Data/Configurations/Scheduling/DecoConfiguration.cs
  6. 141
      ErsatzTV/Pages/DecoEditor.razor
  7. 70
      ErsatzTV/ViewModels/DecoBreakContentEditViewModel.cs
  8. 3
      ErsatzTV/ViewModels/DecoEditViewModel.cs

4
ErsatzTV.Core/Domain/Scheduling/Deco.cs

@ -38,6 +38,10 @@ public class Deco @@ -38,6 +38,10 @@ public class Deco
public int? DeadAirFallbackSmartCollectionId { get; set; }
public SmartCollection DeadAirFallbackSmartCollection { get; set; }
// break content
public DecoMode BreakContentMode { get; set; }
public ICollection<DecoBreakContent> BreakContent { get; set; }
// can be added directly to (block) playouts
public ICollection<Playout> Playouts { get; set; }
}

18
ErsatzTV.Core/Domain/Scheduling/DecoBreakContent.cs

@ -0,0 +1,18 @@ @@ -0,0 +1,18 @@
namespace ErsatzTV.Core.Domain.Scheduling;
public class DecoBreakContent
{
public int Id { get; set; }
public int DecoId { get; set; }
public Deco Deco { get; set; }
public ProgramScheduleItemCollectionType CollectionType { get; set; }
public int? CollectionId { get; set; }
public Collection Collection { get; set; }
public int? MediaItemId { get; set; }
public MediaItem MediaItem { get; set; }
public int? MultiCollectionId { get; set; }
public MultiCollection MultiCollection { get; set; }
public int? SmartCollectionId { get; set; }
public SmartCollection SmartCollection { get; set; }
public DecoBreakPlacement Placement { get; set; }
}

10
ErsatzTV.Core/Domain/Scheduling/DecoBreakPlacement.cs

@ -0,0 +1,10 @@ @@ -0,0 +1,10 @@
namespace ErsatzTV.Core.Domain.Scheduling;
[Flags]
public enum DecoBreakPlacement
{
BlockStart,
BlockFinish,
BetweenBlockItems,
ChapterMarkers
}

37
ErsatzTV.Infrastructure/Data/Configurations/Scheduling/DecoBreakContentConfiguration.cs

@ -0,0 +1,37 @@ @@ -0,0 +1,37 @@
using ErsatzTV.Core.Domain.Scheduling;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace ErsatzTV.Infrastructure.Data.Configurations.Scheduling;
public class DecoBreakContentConfiguration : IEntityTypeConfiguration<DecoBreakContent>
{
public void Configure(EntityTypeBuilder<DecoBreakContent> builder)
{
builder.ToTable("DecoBreakContent");
builder.HasOne(d => d.Collection)
.WithMany()
.HasForeignKey(d => d.CollectionId)
.OnDelete(DeleteBehavior.Cascade)
.IsRequired(false);
builder.HasOne(d => d.MediaItem)
.WithMany()
.HasForeignKey(d => d.MediaItemId)
.OnDelete(DeleteBehavior.Cascade)
.IsRequired(false);
builder.HasOne(d => d.MultiCollection)
.WithMany()
.HasForeignKey(d => d.MultiCollectionId)
.OnDelete(DeleteBehavior.Cascade)
.IsRequired(false);
builder.HasOne(d => d.SmartCollection)
.WithMany()
.HasForeignKey(d => d.SmartCollectionId)
.OnDelete(DeleteBehavior.Cascade)
.IsRequired(false);
}
}

5
ErsatzTV.Infrastructure/Data/Configurations/Scheduling/DecoConfiguration.cs

@ -48,5 +48,10 @@ public class DecoConfiguration : IEntityTypeConfiguration<Deco> @@ -48,5 +48,10 @@ public class DecoConfiguration : IEntityTypeConfiguration<Deco>
.HasForeignKey(d => d.DeadAirFallbackSmartCollectionId)
.OnDelete(DeleteBehavior.Cascade)
.IsRequired(false);
builder.HasMany(d => d.BreakContent)
.WithOne(bc => bc.Deco)
.HasForeignKey(bc => bc.DecoId)
.OnDelete(DeleteBehavior.Cascade);
}
}

141
ErsatzTV/Pages/DecoEditor.razor

@ -199,84 +199,105 @@ @@ -199,84 +199,105 @@
</MudSelect>
@if (_deco.DeadAirFallbackCollectionType == ProgramScheduleItemCollectionType.Collection)
{
<MudSelect Class="mt-3"
T="MediaCollectionViewModel"
Disabled="@(_deco.DeadAirFallbackMode != DecoMode.Override)"
Label="Collection"
@bind-value="_deco.DeadAirFallbackCollection">
@foreach (MediaCollectionViewModel collection in _mediaCollections)
{
<MudSelectItem Value="@collection">@collection.Name</MudSelectItem>
}
</MudSelect>
<MudSelect Class="mt-3"
T="MediaCollectionViewModel"
Disabled="@(_deco.DeadAirFallbackMode != DecoMode.Override)"
Label="Collection"
@bind-value="_deco.DeadAirFallbackCollection">
@foreach (MediaCollectionViewModel collection in _mediaCollections)
{
<MudSelectItem Value="@collection">@collection.Name</MudSelectItem>
}
</MudSelect>
}
@if (_deco.DeadAirFallbackCollectionType == ProgramScheduleItemCollectionType.MultiCollection)
{
<MudSelect Class="mt-3"
T="MultiCollectionViewModel"
Disabled="@(_deco.DeadAirFallbackMode != DecoMode.Override)"
Label="Multi Collection"
@bind-value="_deco.DeadAirFallbackMultiCollection">
@foreach (MultiCollectionViewModel collection in _multiCollections)
{
<MudSelectItem Value="@collection">@collection.Name</MudSelectItem>
}
</MudSelect>
<MudSelect Class="mt-3"
T="MultiCollectionViewModel"
Disabled="@(_deco.DeadAirFallbackMode != DecoMode.Override)"
Label="Multi Collection"
@bind-value="_deco.DeadAirFallbackMultiCollection">
@foreach (MultiCollectionViewModel collection in _multiCollections)
{
<MudSelectItem Value="@collection">@collection.Name</MudSelectItem>
}
</MudSelect>
}
@if (_deco.DeadAirFallbackCollectionType == ProgramScheduleItemCollectionType.SmartCollection)
{
<MudSelect Class="mt-3"
T="SmartCollectionViewModel"
Disabled="@(_deco.DeadAirFallbackMode != DecoMode.Override)"
Label="Smart Collection"
@bind-value="_deco.DeadAirFallbackSmartCollection">
@foreach (SmartCollectionViewModel collection in _smartCollections)
{
<MudSelectItem Value="@collection">@collection.Name</MudSelectItem>
}
</MudSelect>
<MudSelect Class="mt-3"
T="SmartCollectionViewModel"
Disabled="@(_deco.DeadAirFallbackMode != DecoMode.Override)"
Label="Smart Collection"
@bind-value="_deco.DeadAirFallbackSmartCollection">
@foreach (SmartCollectionViewModel collection in _smartCollections)
{
<MudSelectItem Value="@collection">@collection.Name</MudSelectItem>
}
</MudSelect>
}
@if (_deco.DeadAirFallbackCollectionType == ProgramScheduleItemCollectionType.TelevisionShow)
{
<MudSelect Class="mt-3"
T="NamedMediaItemViewModel"
Disabled="@(_deco.DeadAirFallbackMode != DecoMode.Override)"
Label="Television Show"
@bind-value="_deco.DeadAirFallbackMediaItem">
@foreach (NamedMediaItemViewModel show in _televisionShows)
{
<MudSelectItem Value="@show">@show.Name</MudSelectItem>
}
</MudSelect>
<MudSelect Class="mt-3"
T="NamedMediaItemViewModel"
Disabled="@(_deco.DeadAirFallbackMode != DecoMode.Override)"
Label="Television Show"
@bind-value="_deco.DeadAirFallbackMediaItem">
@foreach (NamedMediaItemViewModel show in _televisionShows)
{
<MudSelectItem Value="@show">@show.Name</MudSelectItem>
}
</MudSelect>
}
@if (_deco.DeadAirFallbackCollectionType == ProgramScheduleItemCollectionType.TelevisionSeason)
{
<MudSelect Class="mt-3"
T="NamedMediaItemViewModel"
Disabled="@(_deco.DeadAirFallbackMode != DecoMode.Override)"
Label="Television Season"
@bind-value="_deco.DeadAirFallbackMediaItem">
@foreach (NamedMediaItemViewModel season in _televisionSeasons)
{
<MudSelectItem Value="@season">@season.Name</MudSelectItem>
}
</MudSelect>
<MudSelect Class="mt-3"
T="NamedMediaItemViewModel"
Disabled="@(_deco.DeadAirFallbackMode != DecoMode.Override)"
Label="Television Season"
@bind-value="_deco.DeadAirFallbackMediaItem">
@foreach (NamedMediaItemViewModel season in _televisionSeasons)
{
<MudSelectItem Value="@season">@season.Name</MudSelectItem>
}
</MudSelect>
}
@if (_deco.DeadAirFallbackCollectionType == ProgramScheduleItemCollectionType.Artist)
{
<MudSelect Class="mt-3"
T="NamedMediaItemViewModel"
Disabled="@(_deco.DeadAirFallbackMode != DecoMode.Override)"
Label="Artist"
@bind-value="_deco.DeadAirFallbackMediaItem">
@foreach (NamedMediaItemViewModel artist in _artists)
{
<MudSelectItem Value="@artist">@artist.Name</MudSelectItem>
}
</MudSelect>
<MudSelect Class="mt-3"
T="NamedMediaItemViewModel"
Disabled="@(_deco.DeadAirFallbackMode != DecoMode.Override)"
Label="Artist"
@bind-value="_deco.DeadAirFallbackMediaItem">
@foreach (NamedMediaItemViewModel artist in _artists)
{
<MudSelectItem Value="@artist">@artist.Name</MudSelectItem>
}
</MudSelect>
}
</MudCardContent>
</MudCard>
<MudCard class="mb-6" Style="width: 350px">
<MudCardHeader>
<CardHeaderContent>
<MudTooltip Style="max-width: 350px">
<ChildContent>
<MudText Typo="Typo.h6">Break Content</MudText>
</ChildContent>
<TooltipContent>
<MudText Typo="Typo.body2">This content will be used to pad blocks to their full duration.</MudText>
</TooltipContent>
</MudTooltip>
</CardHeaderContent>
</MudCardHeader>
<MudCardContent>
<MudSelect Label="Break Content Mode" @bind-Value="_deco.BreakContentMode" For="@(() => _deco.BreakContentMode)">
<MudSelectItem Value="DecoMode.Inherit">Inherit</MudSelectItem>
<MudSelectItem Value="DecoMode.Disable">Disable</MudSelectItem>
<MudSelectItem Value="DecoMode.Override">Override</MudSelectItem>
</MudSelect>
</MudCardContent>
</MudCard>
</MudStack>
</MudContainer>

70
ErsatzTV/ViewModels/DecoBreakContentEditViewModel.cs

@ -0,0 +1,70 @@ @@ -0,0 +1,70 @@
using System.ComponentModel;
using System.Runtime.CompilerServices;
using ErsatzTV.Application.MediaCollections;
using ErsatzTV.Application.MediaItems;
using ErsatzTV.Core.Domain;
namespace ErsatzTV.ViewModels;
public class DecoBreakContentEditViewModel : INotifyPropertyChanged
{
private ProgramScheduleItemCollectionType _collectionType;
public int Id { get; set; }
public int Index { get; set; }
public ProgramScheduleItemCollectionType CollectionType
{
get => _collectionType;
set
{
if (_collectionType != value)
{
_collectionType = value;
Collection = null;
MultiCollection = null;
MediaItem = null;
SmartCollection = null;
OnPropertyChanged(nameof(Collection));
OnPropertyChanged(nameof(MultiCollection));
OnPropertyChanged(nameof(MediaItem));
OnPropertyChanged(nameof(SmartCollection));
}
}
}
public MediaCollectionViewModel Collection { get; set; }
public MultiCollectionViewModel MultiCollection { get; set; }
public SmartCollectionViewModel SmartCollection { get; set; }
public NamedMediaItemViewModel MediaItem { get; set; }
public string CollectionName => CollectionType switch
{
ProgramScheduleItemCollectionType.Collection => Collection?.Name,
ProgramScheduleItemCollectionType.TelevisionShow => MediaItem?.Name,
ProgramScheduleItemCollectionType.TelevisionSeason => MediaItem?.Name,
ProgramScheduleItemCollectionType.Artist => MediaItem?.Name,
ProgramScheduleItemCollectionType.MultiCollection => MultiCollection?.Name,
ProgramScheduleItemCollectionType.SmartCollection => SmartCollection?.Name,
_ => string.Empty
};
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
protected bool SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
{
if (EqualityComparer<T>.Default.Equals(field, value))
{
return false;
}
field = value;
OnPropertyChanged(propertyName);
return true;
}
}

3
ErsatzTV/ViewModels/DecoEditViewModel.cs

@ -26,4 +26,7 @@ public class DecoEditViewModel @@ -26,4 +26,7 @@ public class DecoEditViewModel
public MultiCollectionViewModel DeadAirFallbackMultiCollection { get; set; }
public SmartCollectionViewModel DeadAirFallbackSmartCollection { get; set; }
public NamedMediaItemViewModel DeadAirFallbackMediaItem { get; set; }
public DecoMode BreakContentMode { get; set; }
public List<DecoBreakContentEditViewModel> BreakContent { get; set; }
}

Loading…
Cancel
Save