diff --git a/ErsatzTV/Pages/MovieList.razor b/ErsatzTV/Pages/MovieList.razor index fdc988447..2b21c9cf1 100644 --- a/ErsatzTV/Pages/MovieList.razor +++ b/ErsatzTV/Pages/MovieList.razor @@ -56,30 +56,14 @@ - @{ var letters = new System.Collections.Generic.HashSet(); } - @foreach (MovieCardViewModel card in _data.Cards.Where(m => !string.IsNullOrWhiteSpace(m.Title)).OrderBy(m => m.SortTitle)) - { - @if (!letters.Contains(card.SortTitle.Head())) - { - Option maybeLetter = card.SortTitle.ToLowerInvariant().HeadOrNone(); - if (maybeLetter.IsSome) - { - char letter = maybeLetter.ValueUnsafe(); - if (letter >= '0' && letter <= '9') - { - letter = '#'; - } - letters.Add(letter); -
- } - } - + - } +
@if (_data.PageMap.IsSome) diff --git a/ErsatzTV/Pages/MusicVideoList.razor b/ErsatzTV/Pages/MusicVideoList.razor index 2b85730d0..c90b0ef48 100644 --- a/ErsatzTV/Pages/MusicVideoList.razor +++ b/ErsatzTV/Pages/MusicVideoList.razor @@ -56,31 +56,15 @@ - @{ var letters = new System.Collections.Generic.HashSet(); } - @foreach (MusicVideoCardViewModel card in _data.Cards.Where(m => !string.IsNullOrWhiteSpace(m.Title)).OrderBy(m => m.SortTitle)) - { - @if (!letters.Contains(card.SortTitle.Head())) - { - Option maybeLetter = card.SortTitle.ToLowerInvariant().HeadOrNone(); - if (maybeLetter.IsSome) - { - char letter = maybeLetter.ValueUnsafe(); - if (letter >= '0' && letter <= '9') - { - letter = '#'; - } - letters.Add(letter); -
- } - } - + - } +
@if (_data.PageMap.IsSome) @@ -147,10 +131,7 @@ private void SelectClicked(MediaCardViewModel card, MouseEventArgs e) { - List GetSortedItems() - { - return _data.Cards.OrderBy(m => m.SortTitle).ToList(); - } + List GetSortedItems() => _data.Cards.OrderBy(m => m.SortTitle).ToList(); SelectClicked(GetSortedItems, card, e); } diff --git a/ErsatzTV/Pages/TelevisionShowList.razor b/ErsatzTV/Pages/TelevisionShowList.razor index b27e5c82f..6a6f124ea 100644 --- a/ErsatzTV/Pages/TelevisionShowList.razor +++ b/ErsatzTV/Pages/TelevisionShowList.razor @@ -56,30 +56,14 @@ - @{ var letters = new System.Collections.Generic.HashSet(); } - @foreach (TelevisionShowCardViewModel card in _data.Cards.OrderBy(s => s.SortTitle)) - { - @if (!letters.Contains(card.SortTitle.Head())) - { - Option maybeLetter = card.SortTitle.ToLowerInvariant().HeadOrNone(); - if (maybeLetter.IsSome) - { - char letter = maybeLetter.ValueUnsafe(); - if (letter >= '0' && letter <= '9') - { - letter = '#'; - } - letters.Add(letter); -
- } - } - + - } +
@if (_data.PageMap.IsSome) @@ -146,10 +130,7 @@ private void SelectClicked(MediaCardViewModel card, MouseEventArgs e) { - List GetSortedItems() - { - return _data.Cards.OrderBy(m => m.SortTitle).ToList(); - } + List GetSortedItems() => _data.Cards.OrderBy(m => m.SortTitle).ToList(); SelectClicked(GetSortedItems, card, e); } diff --git a/ErsatzTV/Shared/FragmentLetterAnchor.razor b/ErsatzTV/Shared/FragmentLetterAnchor.razor new file mode 100644 index 000000000..7af7fcc0b --- /dev/null +++ b/ErsatzTV/Shared/FragmentLetterAnchor.razor @@ -0,0 +1,28 @@ +@using ErsatzTV.Application.MediaCards +@using LanguageExt.UnsafeValueAccess +@typeparam TCard + +@{ var letters = new System.Collections.Generic.HashSet(); } +@foreach (TCard card in Cards.Filter(c => !string.IsNullOrWhiteSpace(c.Title)).OrderBy(c => c.SortTitle)) +{ + @if (!letters.Contains(card.SortTitle.Head())) + { + Option maybeLetter = card.SortTitle.ToLowerInvariant().HeadOrNone(); + if (maybeLetter.IsSome) + { + char letter = maybeLetter.ValueUnsafe(); + if (letter >= '0' && letter <= '9') + { + letter = '#'; + } + letters.Add(letter); +
+ @ChildContent(card) +
+ } + } + else + { + @ChildContent + } +} diff --git a/ErsatzTV/Shared/FragmentLetterAnchor.razor.cs b/ErsatzTV/Shared/FragmentLetterAnchor.razor.cs new file mode 100644 index 000000000..9698193ac --- /dev/null +++ b/ErsatzTV/Shared/FragmentLetterAnchor.razor.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; +using ErsatzTV.Application.MediaCards; +using Microsoft.AspNetCore.Components; + +namespace ErsatzTV.Shared +{ + public partial class FragmentLetterAnchor where TCard : MediaCardViewModel + { + [Parameter] + public RenderFragment ChildContent { get; set; } + + [Parameter] + public List Cards { get; set; } + } +}