diff --git a/Elwig/Services/DeliveryAncmtService.cs b/Elwig/Services/DeliveryAncmtService.cs index ab010e8..e9ada63 100644 --- a/Elwig/Services/DeliveryAncmtService.cs +++ b/Elwig/Services/DeliveryAncmtService.cs @@ -318,18 +318,13 @@ namespace Elwig.Services { AddToolTipCell(grid, $"{weight * 100.0 / total2:N1} %", row, 4, 1, bold, true); } - public static async Task<(string, Grid)> GenerateToolTip(IQueryable deliveryAncmts) { - var grid = new Grid(); - grid.ColumnDefinitions.Add(new() { Width = new(10) }); - grid.ColumnDefinitions.Add(new() { Width = new(60) }); - grid.ColumnDefinitions.Add(new() { Width = new(80) }); - grid.ColumnDefinitions.Add(new() { Width = new(50) }); - grid.ColumnDefinitions.Add(new() { Width = new(50) }); + public static async Task<(string Text, (string?, string?, int, int?, int)[] Grid)> GenerateToolTipData(IQueryable deliveryAncmts) { + var grid = new List<(string?, string?, int, int?, int)>(); var text = "-"; var weight = await deliveryAncmts.SumAsync(p => p.Weight); text = $"{weight:N0} kg"; - AddToolTipRow(grid, 0, "Menge", null, weight, null, weight); + grid.Add(("Menge", null, weight, null, weight)); if (await deliveryAncmts.AnyAsync()) { var attrGroups = await deliveryAncmts @@ -370,13 +365,11 @@ namespace Elwig.Services { .ThenBy(g => g.SortId) .ToListAsync(); - int rowNum = 1; foreach (var attrG in attrGroups) { - rowNum++; var name = attrG.Attr == null && attrG.Cult == null ? null : attrG.Attr + (attrG.Attr != null && attrG.Cult != null ? " / " : "") + attrG.Cult; - AddToolTipRow(grid, rowNum++, name, null, attrG.Weight, attrG.Weight, weight); + grid.Add((name, null, attrG.Weight, attrG.Weight, weight)); foreach (var g in groups.Where(g => g.Attr == attrG.Attr && g.Cult == attrG.Cult).OrderByDescending(g => g.Weight).ThenBy(g => g.SortId)) { - AddToolTipRow(grid, rowNum++, null, g.SortId, g.Weight, attrG.Weight, weight); + grid.Add((null, g.SortId, g.Weight, attrG.Weight, weight)); } } @@ -395,7 +388,22 @@ namespace Elwig.Services { } } - return (text, grid); + return (text, grid.ToArray()); + } + + public static Grid GenerateToolTip((string?, string?, int, int?, int)[] data) { + var grid = new Grid(); + grid.ColumnDefinitions.Add(new() { Width = new(10) }); + grid.ColumnDefinitions.Add(new() { Width = new(60) }); + grid.ColumnDefinitions.Add(new() { Width = new(80) }); + grid.ColumnDefinitions.Add(new() { Width = new(50) }); + grid.ColumnDefinitions.Add(new() { Width = new(50) }); + int rowNum = 0; + foreach (var row in data) { + if (rowNum != 0 && row.Item2 == null) rowNum++; + AddToolTipRow(grid, rowNum++, row.Item1, row.Item2, row.Item3, row.Item4, row.Item5); + } + return grid; } } } diff --git a/Elwig/Windows/AreaComAdminWindow.xaml b/Elwig/Windows/AreaComAdminWindow.xaml index 9970170..de9caa1 100644 --- a/Elwig/Windows/AreaComAdminWindow.xaml +++ b/Elwig/Windows/AreaComAdminWindow.xaml @@ -7,8 +7,7 @@ xmlns:local="clr-namespace:Elwig.Windows" xmlns:ctrl="clr-namespace:Elwig.Controls" xmlns:vm="clr-namespace:Elwig.ViewModels" - Title="{Binding Title}" Height="600" MinHeight="450" Width="1000" MinWidth="860" - Loaded="Window_Loaded"> + Title="{Binding Title}" Height="600" MinHeight="450" Width="1000" MinWidth="860"> diff --git a/Elwig/Windows/AreaComAdminWindow.xaml.cs b/Elwig/Windows/AreaComAdminWindow.xaml.cs index 8c2d16d..3ff0ddf 100644 --- a/Elwig/Windows/AreaComAdminWindow.xaml.cs +++ b/Elwig/Windows/AreaComAdminWindow.xaml.cs @@ -37,10 +37,10 @@ namespace Elwig.Windows { ControlUtils.InitializeDelayTimer(SearchInput, SearchInput_TextChanged); SearchInput.TextChanged -= SearchInput_TextChanged; ActiveAreaCommitmentInput.Content = ((string)ActiveAreaCommitmentInput.Content).Replace("2020", $"{Utils.CurrentLastSeason}"); + ActiveAreaCommitmentInput.IsChecked = true; } - private void Window_Loaded(object sender, RoutedEventArgs e) { - ActiveAreaCommitmentInput.IsChecked = true; + protected override async Task OnInit(AppDbContext ctx) { LockInputs(); } @@ -52,35 +52,47 @@ namespace Elwig.Windows { } private async Task RefreshList(bool updateSort = false) { - using var ctx = new AppDbContext(); - var (_, areaComQuery, filter) = await ViewModel.GetFilters(ctx); - var areaComs = await areaComQuery - .Include(a => a.Kg.AtKg) - .Include(a => a.Rd!.Kg.AtKg) - .Include(a => a.WineCult) - .Include(a => a.AreaComType.WineAttr) - .Include(a => a.AreaComType.WineVar) - .ToListAsync(); + var vm = ViewModel; + var cursor = Mouse.OverrideCursor != null; + if (!cursor) Mouse.OverrideCursor = Cursors.Wait; + var query = (vm.SearchQuery, vm.ShowOnlyActiveAreaComs); + var (filter, areaComs, areaComCount, stat) = await Task.Run(async () => { + using var ctx = new AppDbContext(); + var (_, areaComQuery, filter) = await vm.GetFilters(ctx); + var areaComs = await areaComQuery + .Include(a => a.Kg.AtKg) + .Include(a => a.Rd!.Kg.AtKg) + .Include(a => a.WineCult) + .Include(a => a.AreaComType.WineAttr) + .Include(a => a.AreaComType.WineVar) + .ToListAsync(); - if (filter.Count > 0 && areaComs.Count > 0) { - var dict = areaComs.AsParallel() - .ToDictionary(d => d, d => d.SearchScore(ViewModel.TextFilter)) - .OrderByDescending(c => c.Value); - var threshold = dict.Select(a => a.Value).Max() * 3 / 4; - areaComs = dict - .Where(a => a.Value > threshold) - .Select(a => a.Key) - .ToList(); - } + if (filter.Count > 0 && areaComs.Count > 0) { + var dict = areaComs.AsParallel() + .ToDictionary(d => d, d => d.SearchScore(vm.TextFilter)) + .OrderByDescending(c => c.Value); + var threshold = dict.Max(a => a.Value) * 3 / 4; + areaComs = [.. dict + .Where(a => a.Value > threshold) + .Select(a => a.Key)]; + } + + var areaComCount = await areaComQuery.CountAsync(); + var season = await ctx.Seasons.FindAsync(await ctx.Seasons.MaxAsync(s => s.Year)); + var stat = await AreaComService.GenerateToolTipData(areaComQuery, season?.MaxKgPerHa ?? 10_000); + + return (filter, areaComs, areaComCount, stat); + }); + if (!cursor) Mouse.OverrideCursor = null; + if (query != (ViewModel.SearchQuery, ViewModel.ShowOnlyActiveAreaComs)) return; ControlUtils.RenewItemsSource(AreaCommitmentList, areaComs, - AreaCommitmentList_SelectionChanged, filter.Count > 0 ? ControlUtils.RenewSourceDefault.IfOnly : ControlUtils.RenewSourceDefault.None, !updateSort); + AreaCommitmentList_SelectionChanged, ViewModel.TextFilter.Count > 0 ? ControlUtils.RenewSourceDefault.IfOnly : ControlUtils.RenewSourceDefault.None, !updateSort); RefreshInputs(); if (filter.Count == 0) { - ViewModel.StatusAreaCommitments = $"{await areaComQuery.CountAsync():N0}"; - var s = await ctx.Seasons.FindAsync(await ctx.Seasons.MaxAsync(s => s.Year)); - var (text, gridData) = await AreaComService.GenerateToolTipData(areaComQuery, s?.MaxKgPerHa ?? 10_000); + ViewModel.StatusAreaCommitments = $"{areaComCount:N0}"; + var (text, gridData) = stat; ViewModel.StatusArea = text; ViewModel.StatusAreaToolTip = AreaComService.GenerateToolTip(gridData); } else { diff --git a/Elwig/Windows/BaseDataWindow.xaml b/Elwig/Windows/BaseDataWindow.xaml index 069beab..0da1831 100644 --- a/Elwig/Windows/BaseDataWindow.xaml +++ b/Elwig/Windows/BaseDataWindow.xaml @@ -8,8 +8,7 @@ xmlns:local="clr-namespace:Elwig.Windows" xmlns:ctrl="clr-namespace:Elwig.Controls" mc:Ignorable="d" - Title="Stammdaten - Elwig" Height="520" MinHeight="400" Width="860" MinWidth="810" - Loaded="Window_Loaded"> + Title="Stammdaten - Elwig" Height="520" MinHeight="400" Width="860" MinWidth="810">