RobotNet/RobotNet.WebApp/Dashboard/Components/PerformancePieChart.razor
2025-10-15 15:15:53 +07:00

91 lines
3.3 KiB
Plaintext

@using RobotNet.Script.Shares.Dashboard
@using RobotNet.WebApp.Charts.Components
@using RobotNet.WebApp.Charts.Core
@using RobotNet.WebApp.Charts.Models.Common.Dataset
@using RobotNet.WebApp.Charts.Models.PieChart
@using RobotNet.WebApp.Charts.Enums
<div class="paper">
<PieChart @ref="ChartRef" IsDoughnutChart="true" Width="100" WidthUnit="Unit.Percentage" Height="100" HeightUnit="Unit.Percentage" />
<div class="text-percent">@($"{CompletedPercent}%")</div>
</div>
@code {
[Parameter]
public string ChartName { get; set; } = "";
private PieChart ChartRef = default!;
private PieChartOptions ChartOptions = default!;
private ChartData ChartData = default!;
private PieChartDataset ChartDataSet = default!;
private int CompletedPercent = 0;
protected override void OnInitialized()
{
base.OnInitialized();
ChartDataSet = new PieChartDataset() { BackgroundColor = [ChartColors.GreenStr, ChartColors.OrangeStr, ChartColors.GrayStr], Data = [90, 10, 10] };
ChartData = new ChartData { Labels = ["Completed", "Error", "Other"], Datasets = [ChartDataSet] };
ChartOptions = new()
{
Responsive = true,
Cutout = "50%",
Plugins = new()
{
Datalabels = new()
{
Color = "#d6d6db",
BorderColor = "transparent",
},
Title = new()
{
Color = "#d6d6db",
Text = ChartName,
Font = new()
{
Family = "Roboto",
Size = 20,
Weight = "normal",
},
},
Legend = new()
{
Display = false,
Position = LegendPosition.Top,
Labels = new()
{
Color = "#d6d6db",
Font = new()
{
Family = "Roboto",
Weight = "normal",
Size = 15,
}
},
}
},
};
}
protected override async Task OnAfterRenderAsync(bool firstRender)
{
await base.OnAfterRenderAsync(firstRender);
if (!firstRender) return;
await ChartRef.InitializeAsync(chartData: ChartData, chartOptions: ChartOptions);
}
public async Task UpdateData(DailyPerformanceDto data)
{
ChartDataSet = new PieChartDataset() { BackgroundColor = [ChartColors.GreenStr, ChartColors.OrangeStr, ChartColors.GrayStr], Data = [data.Completed, data.Error, data.Other] };
ChartData = new ChartData { Labels = ["Completed", "Error", "Other"], Datasets = [ChartDataSet] };
await ChartRef.UpdateValuesAsync(ChartData);
if (data.Completed + data.Error + data.Other != 0) CompletedPercent = (int)(data.Completed * 100.0 / (data.Completed + data.Error + data.Other) + 0.5);
else CompletedPercent = 0;
StateHasChanged();
}
}