@using TaskTrackingSystem.WebApp.Components.Shared.Charts
@if (!Items.Any() || Items.Sum(item => item.Value) <= 0) {
@EmptyText
} else {
@foreach (var slice in Slices) { }
@if (ShowLegend) {
@foreach (var item in Items) {
@item.Label
@item.Value.ToString(ValueFormat)
}
} }
@code { [Parameter] public IReadOnlyList Items { get; set; } = Array.Empty(); [Parameter] public bool ShowLegend { get; set; } = true; [Parameter] public string EmptyText { get; set; } = "No data available"; [Parameter] public string ValueFormat { get; set; } = "0"; [Parameter] public string WrapperClass { get; set; } = string.Empty; private IReadOnlyList Slices => BuildSlices(); private IReadOnlyList BuildSlices() { const double radius = 70; var circumference = 2 * Math.PI * radius; var total = Items.Sum(item => Math.Max(0, item.Value)); var offset = 0.0; var slices = new List(); foreach (var item in Items) { var value = Math.Max(0, item.Value); var arc = total > 0 ? circumference * value / total : 0; slices.Add(new Slice(item.Color, $"{arc:0.##} {(circumference - arc):0.##}", -offset)); offset += arc; } return slices; } private sealed record Slice(string Color, string DashArray, double DashOffset); }