@using RackPeek.Domain.Persistence @using RackPeek.Domain.Resources @typeparam TResource where TResource : Resource @inject IResourceCollection Repo @Title

@Title

@if (ResourcesToRender is null) {
loading @ResourceKind.ToLower()…
} else if (!ResourcesToRender.Any()) {
no @ResourceKind.ToLower() found
} else {
@foreach (var group in GroupResources(ResourcesToRender)) { var groupKey = FormatGroupKey(group.Key);
@if (ShouldGroup) {
@DisplayGroupKey(group.Key)
}
@foreach (var item in group) { @ItemTemplate(item) }
}
}
@code { [Parameter] public string Title { get; set; } = default!; [Parameter] public string TestId { get; set; } = default!; [Parameter] public IReadOnlyList? Resources { get; set; } [Parameter] public RenderFragment AddSection { get; set; } = default!; [Parameter] public RenderFragment ItemTemplate { get; set; } = default!; [Parameter] public bool ShouldGroup { get; set; } [Parameter] public Func GroupBy { get; set; } = _ => null; [Parameter] public EventCallback OnCreated { get; set; } private IReadOnlyList? _loadedResources; private IReadOnlyList? ResourcesToRender => Resources ?? _loadedResources; public string ResourceKind { get; set; } = Resource.GetKind(); protected override async Task OnParametersSetAsync() { if (Resources is not null) return; if (_loadedResources is null) _loadedResources = await Repo.GetAllOfTypeAsync(); } private IEnumerable> GroupResources(IEnumerable resources) { return resources.GroupBy(GroupBy).OrderByDescending(g => g.Count()); } private static string FormatGroupKey(string? key) { return string.IsNullOrWhiteSpace(key) ? "unassigned" : key.Replace(" ", "-"); } private static string DisplayGroupKey(string? key) { return string.IsNullOrWhiteSpace(key) ? "Unassigned" : key; } }