@page "/labels/{LabelName}"
@using RackPeek.Domain.Persistence
@using RackPeek.Domain.Resources
@using RackPeek.Domain.Resources.SystemResources
@inject IResourceCollection ResourceRepository
Label: @LabelName
Label: @LabelName
@if (_resources is not null && _resources.Count > 0)
{
}
@if (_resources is null)
{
loading resources…
}
else if (_resources.Count == 0)
{
no resources found for this label
}
else if (!GetProcessed().Any())
{
no results match your filter
}
else
{
@foreach (var item in GetProcessed())
{
var resource = item.Resource;
var value = item.Value;
@resource.Name
@resource.Kind
Value: @FormatValue(value)
[@DetectType(value)]
}
}
@code {
[Parameter] public string LabelName { get; set; } = string.Empty;
private IReadOnlyList<(Resource Resource, string Value)>? _resources;
private string _sortBy = "Value";
private bool _ascending = true;
private string _filter = string.Empty;
protected override async Task OnParametersSetAsync()
{
var decoded = Uri.UnescapeDataString(LabelName);
_resources = await ResourceRepository.GetByLabelAsync(decoded);
}
private IEnumerable<(Resource Resource, string Value)> GetProcessed()
{
if (_resources is null)
return [];
var query = _resources.AsEnumerable();
// Filtering
if (!string.IsNullOrWhiteSpace(_filter))
{
query = query.Where(r =>
r.Resource.Name.Contains(_filter, StringComparison.OrdinalIgnoreCase) ||
r.Value.Contains(_filter, StringComparison.OrdinalIgnoreCase));
}
// Sorting
query = _sortBy switch
{
"Value" => query
.OrderBy(r => GetSortKey(r.Value))
.ThenBy(r => r.Resource.Name),
"Kind" => query.OrderBy(r => r.Resource.Kind),
_ => query.OrderBy(r => r.Resource.Name)
};
if (!_ascending)
query = query.Reverse();
return query.ToList();
}
private void ToggleSortDirection()
{
_ascending = !_ascending;
}
private static string DetectType(string value)
{
if (DateTime.TryParse(value, out _)) return "DATE";
if (bool.TryParse(value, out _)) return "BOOL";
if (decimal.TryParse(value, out _)) return "NUMBER";
return "TEXT";
}
private static string FormatValue(string value)
{
if (DateTime.TryParse(value, out var dt))
return dt.ToString("yyyy-MM-dd");
return value;
}
private string GetResourceUrl(Resource resource)
{
if (resource.Kind == SystemResource.KindLabel)
return $"resources/systems/{Uri.EscapeDataString(resource.Name)}";
if (resource.Kind == Service.KindLabel)
return $"resources/services/{Uri.EscapeDataString(resource.Name)}";
return $"resources/hardware/{Uri.EscapeDataString(resource.Name)}";
}
private readonly record struct SortKey(int TypeRank, object Value, string Fallback)
: IComparable