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; }
+ }
+}