diff --git a/Elwig/Windows/DeliveryAdminWindow.xaml b/Elwig/Windows/DeliveryAdminWindow.xaml index 7ac4d0e..7a9983e 100644 --- a/Elwig/Windows/DeliveryAdminWindow.xaml +++ b/Elwig/Windows/DeliveryAdminWindow.xaml @@ -94,7 +94,7 @@ - - + - + - + - + + + + + + + + + + + + + - + + + + + + + + + + + + + diff --git a/Elwig/Windows/DeliveryAdminWindow.xaml.cs b/Elwig/Windows/DeliveryAdminWindow.xaml.cs index 9fed398..2786790 100644 --- a/Elwig/Windows/DeliveryAdminWindow.xaml.cs +++ b/Elwig/Windows/DeliveryAdminWindow.xaml.cs @@ -519,6 +519,38 @@ namespace Elwig.Windows { return (filterNames, dpq.Select(p => p.Delivery).Distinct().OrderBy(d => d.DateString).ThenBy(d => d.TimeString), dpq, filter); } + private static void AddToolTipCell(Grid grid, string text, int row, int col, int colSpan = 1, bool bold = false, bool alignRight = false, bool alignCenter = false) { + var tb = new TextBlock() { + Text = text, + TextAlignment = alignRight ? TextAlignment.Right : alignCenter ? TextAlignment.Center : TextAlignment.Left, + Margin = new(0, 12 * row, 0, 0), + FontWeight = bold ? FontWeights.Bold : FontWeights.Normal, + }; + tb.SetValue(Grid.ColumnProperty, col); + tb.SetValue(Grid.ColumnSpanProperty, colSpan); + grid.Children.Add(tb); + } + + private void AddWeightToolTipRow(int row, string? h1, string? h2, int weight, int? total1, int total2) { + var bold = h2 == null; + if (h1 != null) AddToolTipCell(StatusWeightToolTip, h1 + ":", row, 0, (h2 == null) ? 2 : 1, bold); + if (h2 != null) AddToolTipCell(StatusWeightToolTip, h2 + ":", row, 1, 1, bold); + AddToolTipCell(StatusWeightToolTip, $"{weight:N0} kg", row, 2, 1, bold, true); + if (total1 != null && total1 != 0) + AddToolTipCell(StatusWeightToolTip, $"{weight * 100.0 / total1:N1} %", row, 3, 1, bold, true); + if (total2 != 0) + AddToolTipCell(StatusWeightToolTip, $"{weight * 100.0 / total2:N1} %", row, 4, 1, bold, true); + } + + private void AddGradationToolTipRow(int row, string? h1, string? h2, double min, double avg, double max) { + var bold = h2 == null; + if (h1 != null) AddToolTipCell(StatusGradationToolTip, h1 + ":", row, 0, (h2 == null) ? 2 : 1, bold); + if (h2 != null) AddToolTipCell(StatusGradationToolTip, h2 + ":", row, 1, 1, bold); + AddToolTipCell(StatusGradationToolTip, $"{min:N1}°", row, 2, 1, bold, true); + AddToolTipCell(StatusGradationToolTip, $"{avg:N1}°", row, 3, 1, bold, true); + AddToolTipCell(StatusGradationToolTip, $"{max:N1}°", row, 4, 1, bold, true); + } + private async Task RefreshDeliveryListQuery(bool updateSort = false) { var (_, deliveryQuery, deliveryPartsQuery, filter) = await GetFilters(); var deliveries = await deliveryQuery.ToListAsync(); @@ -551,29 +583,56 @@ namespace Elwig.Windows { var varieties = await deliveryParts.Select(d => d.SortId).Distinct().ToListAsync(); StatusVarieties.Text = $"Sorten: {varieties.Count}" + (varieties.Count > 0 && varieties.Count <= 10 ? $" ({string.Join(", ", varieties)})" : ""); + StatusWeightToolTip.Children.Clear(); + StatusGradationToolTip.Children.Clear(); + var weight = await deliveryParts.SumAsync(p => p.Weight); StatusWeight.Text = $"Gewicht: {weight:N0} kg"; + AddWeightToolTipRow(0, "Gewicht", null, weight, null, weight); if (n > 0) { var kmwMin = await deliveryParts.MinAsync(p => p.Kmw); var kmwAvg = Utils.AggregateDeliveryPartsKmw(deliveryParts); var kmwMax = await deliveryParts.MaxAsync(p => p.Kmw); StatusGradation.Text = $"Gradation: {kmwMin:N1}° / {kmwAvg:N1}° / {kmwMax:N1}°"; + AddToolTipCell(StatusGradationToolTip, "min.", 0, 2, 1, false, false, true); + AddToolTipCell(StatusGradationToolTip, "⌀", 0, 3, 1, false, false, true); + AddToolTipCell(StatusGradationToolTip, "max.", 0, 4, 1, false, false, true); + AddGradationToolTipRow(1, "Gradation", null, kmwMin, kmwAvg, kmwMax); } else { StatusGradation.Text = "Gradation: -"; } if (n > 0 && (n <= 200 || TodayOnlyInput.IsChecked == true)) { var parts = await deliveryParts.ToListAsync(); - var groups = parts + var attrGroups = parts .GroupBy(p => p.Attribute?.Name) .Select(g => (g.Key, g.Sum(p => p.Weight), g.Min(p => p.Kmw), Utils.AggregateDeliveryPartsKmw(g), g.Max(p => p.Kmw))) .OrderByDescending(g => g.Item2) + .ThenBy(g => g.Key) + .ToList(); + var groups = parts + .GroupBy(p => (p.Attribute?.Name, p.SortId)) + .Select(g => (g.Key.Name, g.Key.SortId, g.Sum(p => p.Weight), g.Min(p => p.Kmw), Utils.AggregateDeliveryPartsKmw(g), g.Max(p => p.Kmw))) + .OrderByDescending(g => g.SortId) + .ThenBy(g => g.Name) + .ThenBy(g => g.SortId) .ToList(); - if (groups.Count == 1) { - var g = groups.First().Key; - if (g != "") { + int rowNum = 1; + foreach (var attrG in attrGroups) { + rowNum++; + AddWeightToolTipRow(rowNum++, attrG.Key, null, attrG.Item2, attrG.Item2, weight); + AddGradationToolTipRow(rowNum, attrG.Key, null, attrG.Item3, attrG.Item4, attrG.Item5); + foreach (var g in groups.Where(g => g.Name == attrG.Key).OrderByDescending(g => g.Item3).ThenBy(g => g.SortId)) { + AddWeightToolTipRow(rowNum++, null, g.SortId, g.Item3, attrG.Item2, weight); + AddGradationToolTipRow(rowNum, null, g.SortId, g.Item4, g.Item5, g.Item6); + } + } + + if (attrGroups.Count == 1) { + var g = attrGroups.First().Key; + if (g != null) { StatusWeight.Text += $" [{g}]"; StatusGradation.Text += $" [{g}]"; } @@ -585,12 +644,13 @@ namespace Elwig.Windows { .ToList(); if (sortGroups.Count > 1 && sortGroups.Count <= 4) { - StatusWeight.Text += $" = {string.Join(" + ", sortGroups.Select(g => $"{g.Item2:N0} kg ({(double)g.Item2 / weight:0%})" + (g.Key == "" ? "" : $" [{g.Key}]")))}"; - StatusGradation.Text += $" = {string.Join(" + ", sortGroups.Select(g => $"{g.Item3:N1}/{g.Item4:N1}/{g.Item5:N1}" + (g.Key == "" ? "" : $" [{g.Key}]")))}"; + StatusWeight.Text += $" = {string.Join(" + ", sortGroups.Select(g => $"{g.Item2:N0} kg ({(double)g.Item2 / weight:0%})" + (g.Key == null ? "" : $" [{g.Key}]")))}"; + StatusGradation.Text += $" = {string.Join(" + ", sortGroups.Select(g => $"{g.Item3:N1}/{g.Item4:N1}/{g.Item5:N1}" + (g.Key == null ? "" : $" [{g.Key}]")))}"; + } - } else if (groups.Count <= 4) { - StatusWeight.Text += $" = {string.Join(" + ", groups.Select(g => $"{g.Item2:N0} kg ({(double)g.Item2 / weight:0%})" + (g.Key == "" ? "" : $" [{g.Key}]")))}"; - StatusGradation.Text += $" = {string.Join(" + ", groups.Select(g => $"{g.Item3:N1}/{g.Item4:N1}/{g.Item5:N1}" + (g.Key == "" ? "" : $" [{g.Key}]")))}"; + } else if (attrGroups.Count <= 4) { + StatusWeight.Text += $" = {string.Join(" + ", attrGroups.Select(g => $"{g.Item2:N0} kg ({(double)g.Item2 / weight:0%})" + (g.Key == null ? "" : $" [{g.Key}]")))}"; + StatusGradation.Text += $" = {string.Join(" + ", attrGroups.Select(g => $"{g.Item3:N1}/{g.Item4:N1}/{g.Item5:N1}" + (g.Key == null ? "" : $" [{g.Key}]")))}"; } } } else { @@ -600,9 +660,6 @@ namespace Elwig.Windows { } StatusVarieties.ToolTip = StatusVarieties.Text; - // TODO display Weight/Gradation with newlines in ToolTip and grouped by sortid AND attributes - StatusWeight.ToolTip = StatusWeight.Text; - StatusGradation.ToolTip = StatusGradation.Text; } protected override async Task OnRenewContext() {