118 lines
5.0 KiB
C#
118 lines
5.0 KiB
C#
using Microsoft.AspNetCore.Components;
|
|
using Microsoft.JSInterop;
|
|
using RobotNet.WebApp.Charts.Core;
|
|
using RobotNet.WebApp.Charts.Enums;
|
|
using RobotNet.WebApp.Charts.Models.Common;
|
|
using RobotNet.WebApp.Charts.Models.Common.Dataset;
|
|
using RobotNet.WebApp.Charts.Models.PieChart;
|
|
|
|
namespace RobotNet.WebApp.Charts.Components;
|
|
|
|
public partial class PieChart : RobotNetChart
|
|
{
|
|
[Parameter]
|
|
public bool IsDoughnutChart { get; set; } = false;
|
|
public PieChart()
|
|
{
|
|
chartType = IsDoughnutChart ? ChartType.Doughnut : ChartType.Pie;
|
|
}
|
|
|
|
public async Task InitializeAsync(ChartData chartData, IChartOptions chartOptions)
|
|
{
|
|
if (chartData is not null && chartData.Datasets is not null)
|
|
{
|
|
var datasets = chartData.Datasets.OfType<PieChartDataset>();
|
|
var data = new { chartData.Labels, Datasets = datasets };
|
|
await JSRuntime.InvokeVoidAsync($"window.blazorChart.initialize", Id, chartType, data, (PieChartOptions)chartOptions);
|
|
}
|
|
}
|
|
|
|
public async Task UpdateAsync(ChartData chartData, IChartOptions chartOptions)
|
|
{
|
|
if (chartData is not null && chartData.Datasets is not null)
|
|
{
|
|
var datasets = chartData.Datasets.OfType<PieChartDataset>();
|
|
var data = new { chartData.Labels, Datasets = datasets };
|
|
await JSRuntime.InvokeVoidAsync($"window.blazorChart.update", Id, data, (PieChartOptions)chartOptions);
|
|
}
|
|
}
|
|
|
|
public async Task UpdateValuesAsync(ChartData chartData)
|
|
{
|
|
if (chartData is not null && chartData.Datasets is not null && chartData.Datasets.Count != 0)
|
|
{
|
|
var datasets = chartData.Datasets.OfType<PieChartDataset>();
|
|
var data = new { chartData.Labels, Datasets = datasets };
|
|
await JSRuntime.InvokeVoidAsync("window.blazorChart.updateData", Id, data);
|
|
}
|
|
}
|
|
|
|
public async Task<ChartData> AddDataAsync(ChartData chartData, string dataLabel, IChartDatasetData data)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(chartData);
|
|
ArgumentNullException.ThrowIfNull(chartData.Datasets);
|
|
ArgumentNullException.ThrowIfNull(data);
|
|
|
|
foreach (var dataset in chartData.Datasets)
|
|
if (dataset is PieChartDataset pieChartDataset && pieChartDataset.Label == dataLabel)
|
|
if (data is PieChartDatasetData pieChartDatasetData)
|
|
{
|
|
if (pieChartDatasetData.Data is double dataValue) pieChartDataset.Data?.Add(dataValue);
|
|
pieChartDataset.BackgroundColor?.Add(pieChartDatasetData.BackgroundColor!);
|
|
}
|
|
await JSRuntime.InvokeVoidAsync($"window.blazorChart.addDatasetData", Id, dataLabel, data);
|
|
return chartData;
|
|
}
|
|
|
|
public async Task<ChartData> AddDataAsync(ChartData chartData, string dataLabel, IReadOnlyCollection<IChartDatasetData> data)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(chartData);
|
|
ArgumentNullException.ThrowIfNull(chartData.Datasets);
|
|
ArgumentNullException.ThrowIfNull(chartData.Labels);
|
|
ArgumentNullException.ThrowIfNull(dataLabel);
|
|
ArgumentNullException.ThrowIfNull(data);
|
|
|
|
if (string.IsNullOrWhiteSpace(dataLabel))
|
|
throw new Exception($"{nameof(dataLabel)} cannot be empty.");
|
|
|
|
if (data.Count == 0)
|
|
throw new Exception($"{nameof(data)} cannot be empty.");
|
|
|
|
if (chartData.Datasets.Count != data.Count)
|
|
throw new InvalidDataException("The chart dataset count and the new data points count do not match.");
|
|
|
|
if (chartData.Labels.Contains(dataLabel))
|
|
throw new Exception($"{dataLabel} already exists.");
|
|
|
|
chartData.Labels.Add(dataLabel);
|
|
|
|
foreach (var dataset in chartData.Datasets)
|
|
if (dataset is PieChartDataset pieChartDataset)
|
|
{
|
|
var chartDatasetData = data.FirstOrDefault(x => x is PieChartDatasetData pieChartDatasetData && pieChartDatasetData.DatasetLabel == pieChartDataset.Label);
|
|
|
|
if (chartDatasetData is PieChartDatasetData pieChartDatasetData)
|
|
{
|
|
if (pieChartDatasetData.Data is double dataValue) pieChartDataset.Data?.Add(dataValue);
|
|
pieChartDataset.BackgroundColor?.Add(pieChartDatasetData.BackgroundColor!);
|
|
}
|
|
}
|
|
await JSRuntime.InvokeVoidAsync($"window.blazorChart.addDatasetsData", Id, dataLabel, data?.Select(x => (PieChartDatasetData)x));
|
|
return chartData;
|
|
}
|
|
|
|
public async Task<ChartData> AddDatasetAsync(ChartData chartData, IChartDataset chartDataset)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(chartData);
|
|
ArgumentNullException.ThrowIfNull(chartData.Datasets);
|
|
ArgumentNullException.ThrowIfNull(chartDataset);
|
|
|
|
if (chartDataset is PieChartDataset pieChartDataset)
|
|
{
|
|
chartData.Datasets.Add(pieChartDataset);
|
|
await JSRuntime.InvokeVoidAsync($"window.blazorChart.addDataset", Id, pieChartDataset);
|
|
}
|
|
|
|
return chartData;
|
|
}
|
|
} |