| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- @using RackPeek.Domain.Persistence
- @typeparam TResource where TResource : RackPeek.Domain.Resources.Resource
- @inject IResourceCollection Repo
- @inject NavigationManager Nav
- <PageTitle>@Title</PageTitle>
- <h1 class="text-lg text-zinc-100" data-testid="@($"{TestId}-page-title")">
- @Title
- </h1>
- <div class="min-h-screen bg-zinc-950 text-zinc-200 font-mono p-6 space-y-6"
- data-testid="@($"{TestId}-page-root")">
- <!-- Add Resource Section -->
- <div data-testid="@($"{TestId}-add-section")">
- <AddResourceComponent TResource="TResource"
- Placeholder=@($"{@Title} name")
- OnCreated="OnCreated" />
- </div>
- @if (_resources is null)
- {
- <div class="text-zinc-500"
- data-testid="@($"{TestId}-loading")">
- loading @Title.ToLower()…
- </div>
- }
- else if (!_resources.Any())
- {
- <div class="text-zinc-500"
- data-testid="@($"{TestId}-empty")">
- no @Title.ToLower() found
- </div>
- }
- else
- {
- <div class="space-y-4"
- data-testid="@($"{TestId}-list")">
- @foreach (var group in GroupResources(_resources))
- {
- var groupKey = FormatGroupKey(group.Key);
- <div data-testid="@($"{TestId}-group-{groupKey}")">
- @if (ShouldGroup)
- {
- <div class="text-xs text-zinc-500 uppercase tracking-wider mb-2"
- data-testid="@($"{TestId}-group-title-{groupKey}")">
- @DisplayGroupKey(group.Key)
- </div>
- }
- <div class="space-y-4"
- data-testid="@($"{TestId}-group-list-{groupKey}")">
- @foreach (var item in group)
- {
- @ItemTemplate(item)
- }
- </div>
- </div>
- }
- </div>
- }
- </div>
- @code {
- [Parameter] public string Title { get; set; } = default!;
- [Parameter] public string TestId { get; set; } = default!;
- [Parameter] public RenderFragment AddSection { get; set; } = default!;
- [Parameter] public RenderFragment<TResource> ItemTemplate { get; set; } = default!;
- [Parameter] public bool ShouldGroup { get; set; } = false;
- [Parameter] public Func<TResource, string?> GroupBy { get; set; } = (s => (string?)null);
- [Parameter] public EventCallback<string> OnCreated { get; set; }
- private IReadOnlyList<TResource>? _resources;
- protected override async Task OnInitializedAsync()
- {
- _resources = await Repo.GetAllOfTypeAsync<TResource>();
- }
- private IEnumerable<IGrouping<string?, TResource>> GroupResources(
- IEnumerable<TResource> resources)
- => resources
- .GroupBy(GroupBy)
- .OrderByDescending(g => g.Count());
- private static string FormatGroupKey(string? key)
- => string.IsNullOrWhiteSpace(key)
- ? "unassigned"
- : key.Replace(" ", "-");
- private static string DisplayGroupKey(string? key)
- => string.IsNullOrWhiteSpace(key)
- ? "Unassigned"
- : key;
- }
|