using Aaru.Server.Database.Models; using Blazorise; using Blazorise.Charts; using Microsoft.EntityFrameworkCore; using DbContext = Aaru.Server.Database.DbContext; namespace Aaru.Server.New.Components.Pages.Statistics; public partial class Devices { PieChart? _devicesByBusChart; List _devicesByBusCounts = []; string[] _devicesByBusLabels = []; PieChart? _devicesByManufacturerChart; List _devicesByManufacturerCounts = []; string[] _devicesByManufacturerLabels = []; Carousel? _devicesCarousel; List DevicesList { get; set; } = []; /// protected override async Task OnInitializedAsync() { await base.OnInitializedAsync(); await using DbContext ctx = await DbContextFactory.CreateDbContextAsync(); DevicesList = DevicesList.OrderBy(static device => device.Manufacturer) .ThenBy(static device => device.Model) .ThenBy(static device => device.Revision) .ThenBy(static device => device.Bus) .ToList(); var data = await ctx.DeviceStats.Select(static d => d.Bus) .Distinct() .Select(deviceBus => new { deviceBus, deviceBusCount = ctx.DeviceStats.LongCount(d => d.Bus == deviceBus) }) .Select(static t => new { Name = t.deviceBus, Count = t.deviceBusCount }) .ToListAsync(); _devicesByBusLabels = data.OrderByDescending(static o => o.Count).Take(10).Select(static v => v.Name).ToArray(); _devicesByBusCounts = data.OrderByDescending(static o => o.Count).Take(10).Select(static x => x.Count).ToList(); if(_devicesByBusLabels.Length >= 10) { _devicesByBusLabels[9] = "Other"; _devicesByBusCounts[9] = data.Sum(static o => o.Count) - _devicesByBusCounts.Take(9).Sum(); } List devices = await ctx.DeviceStats .Where(static d => d.Manufacturer != null && d.Manufacturer != "") .ToListAsync(); data = devices.Select(static d => d.Manufacturer!.ToLowerInvariant()) .Distinct() .Select(manufacturer => new { manufacturer, manufacturerCount = devices.LongCount(d => d.Manufacturer?.ToLowerInvariant() == manufacturer) }) .Select(static t => new { Name = t.manufacturer, Count = t.manufacturerCount }) .ToList(); _devicesByManufacturerLabels = data.OrderByDescending(static o => o.Count).Take(10).Select(static v => v.Name).ToArray(); _devicesByManufacturerCounts = data.OrderByDescending(static o => o.Count).Take(10).Select(static x => x.Count).ToList(); if(_devicesByManufacturerLabels.Length < 10) return; _devicesByManufacturerLabels[9] = "Other"; _devicesByManufacturerCounts[9] = data.Sum(static o => o.Count) - _devicesByManufacturerCounts.Take(9).Sum(); #pragma warning disable CS8604 // Possible null reference argument. await Common.HandleRedraw(_devicesByBusChart, _devicesByBusLabels, GetDevicesByBusChartDataset); await Common.HandleRedraw(_devicesByManufacturerChart, _devicesByManufacturerLabels, GetDevicesByManufacturerChartDataset); #pragma warning restore CS8604 // Possible null reference argument. // Upstream: https://github.com/Megabit/Blazorise/issues/5491 _devicesCarousel.Interval = 5000; } PieChartDataset GetDevicesByBusChartDataset() => new() { Label = $"Top {_devicesByBusLabels.Length} devices by bus", Data = _devicesByBusCounts, BackgroundColor = Common._backgroundColors, BorderColor = Common._borderColors, BorderWidth = 1 }; PieChartDataset GetDevicesByManufacturerChartDataset() => new() { Label = $"Top {_devicesByManufacturerLabels.Length} devices by manufacturers", Data = _devicesByManufacturerCounts, BackgroundColor = Common._backgroundColors, BorderColor = Common._borderColors, BorderWidth = 1 }; }