[#10] MemberAdminWindow: Add tooltip for delivieries
This commit is contained in:
@ -43,7 +43,7 @@ namespace Elwig.Services {
|
|||||||
vm.Age = "-";
|
vm.Age = "-";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void FillInputs(this MemberAdminViewModel vm, Member m) {
|
public static async Task FillInputs(this MemberAdminViewModel vm, Member m) {
|
||||||
vm.IsMemberSelected = true;
|
vm.IsMemberSelected = true;
|
||||||
vm.MgNrString = $"{m.MgNr}";
|
vm.MgNrString = $"{m.MgNr}";
|
||||||
vm.PredecessorMgNrString = $"{m.PredecessorMgNr}";
|
vm.PredecessorMgNrString = $"{m.PredecessorMgNr}";
|
||||||
@ -129,11 +129,20 @@ namespace Elwig.Services {
|
|||||||
|
|
||||||
Dictionary<int, int> deliveries;
|
Dictionary<int, int> deliveries;
|
||||||
using (var ctx = new AppDbContext()) {
|
using (var ctx = new AppDbContext()) {
|
||||||
var d1 = ctx.Deliveries.Where(d => d.Year == Utils.CurrentLastSeason && d.MgNr == m.MgNr);
|
var d1 = ctx.Deliveries.Where(d => d.Year == Utils.CurrentLastSeason - 1 && d.MgNr == m.MgNr);
|
||||||
var d2 = ctx.Deliveries.Where(d => d.Year == Utils.CurrentLastSeason - 1 && d.MgNr == m.MgNr);
|
var (_, d1Grid, _, _) = await DeliveryService.GenerateToolTip(d1.SelectMany(d => d.Parts));
|
||||||
vm.StatusDeliveriesLastSeason = $"Lieferungen ({Utils.CurrentLastSeason - 1}): {d2.Count():N0} ({d2.Sum(d => d.Parts.Count):N0}), {d2.SelectMany(d => d.Parts).Sum(p => p.Weight):N0} kg";
|
vm.StatusDeliveriesLastSeasonInfo = $"{Utils.CurrentLastSeason - 1}";
|
||||||
vm.StatusDeliveriesThisSeason = $"Lieferungen ({Utils.CurrentLastSeason}): {d1.Count():N0} ({d1.Sum(d => d.Parts.Count):N0}), {d1.SelectMany(d => d.Parts).Sum(p => p.Weight):N0} kg";
|
vm.StatusDeliveriesLastSeason = $"{await d1.CountAsync():N0} ({await d1.SumAsync(d => d.Parts.Count):N0}), {await d1.SelectMany(d => d.Parts).SumAsync(p => p.Weight):N0} kg";
|
||||||
vm.StatusAreaCommitment = $"Gebundene Fläche: {m.ActiveAreaCommitments(ctx).Select(c => c.Area).Sum():N0} m²";
|
vm.StatusDeliveriesLastSeasonToolTip = d1Grid;
|
||||||
|
|
||||||
|
var d2 = ctx.Deliveries.Where(d => d.Year == Utils.CurrentLastSeason && d.MgNr == m.MgNr);
|
||||||
|
var (_, d2Grid, _, _) = await DeliveryService.GenerateToolTip(d2.SelectMany(d => d.Parts));
|
||||||
|
vm.StatusDeliveriesThisSeasonInfo = $"{Utils.CurrentLastSeason}";
|
||||||
|
vm.StatusDeliveriesThisSeason = $"{await d2.CountAsync():N0} ({await d2.SumAsync(d => d.Parts.Count):N0}), {await d2.SelectMany(d => d.Parts).SumAsync(p => p.Weight):N0} kg";
|
||||||
|
vm.StatusDeliveriesThisSeasonToolTip = d2Grid;
|
||||||
|
|
||||||
|
vm.StatusAreaCommitment = $"{m.ActiveAreaCommitments(ctx).Select(c => c.Area).Sum():N0} m²";
|
||||||
|
|
||||||
deliveries = ctx.Deliveries
|
deliveries = ctx.Deliveries
|
||||||
.Where(d => d.MgNr == m.MgNr)
|
.Where(d => d.MgNr == m.MgNr)
|
||||||
.SelectMany(d => d.Parts)
|
.SelectMany(d => d.Parts)
|
||||||
|
@ -5,6 +5,7 @@ using System.Collections.Generic;
|
|||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
|
using System.Windows.Controls;
|
||||||
|
|
||||||
namespace Elwig.ViewModels {
|
namespace Elwig.ViewModels {
|
||||||
public partial class MemberAdminViewModel : ObservableObject {
|
public partial class MemberAdminViewModel : ObservableObject {
|
||||||
@ -145,15 +146,27 @@ namespace Elwig.ViewModels {
|
|||||||
public ObservableCollection<PhoneNr> PhoneNrs { get; private set; } = [new(), new(), new(), new(), new(), new(), new(), new(), new()];
|
public ObservableCollection<PhoneNr> PhoneNrs { get; private set; } = [new(), new(), new(), new(), new(), new(), new(), new(), new()];
|
||||||
|
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
private string _statusMembers = "Mitglieder: -";
|
private string _statusMembers = "-";
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
private string _statusBusinessShares = "Geschäftsanteile: -";
|
private string? _statusMembersToolTip;
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
private string _statusDeliveriesLastSeason = "Lieferungen (letzte Saison): -";
|
private string _statusBusinessShares = "-";
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
private string _statusDeliveriesThisSeason = "Lieferungen (aktuelle Saison): -";
|
private string? _statusBusinessSharesToolTip;
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
private string _statusAreaCommitment = "Gebundene Fläche: -";
|
private string _statusDeliveriesLastSeason = "-";
|
||||||
|
[ObservableProperty]
|
||||||
|
private string _statusDeliveriesLastSeasonInfo = "letzte Saison";
|
||||||
|
[ObservableProperty]
|
||||||
|
private Grid? _statusDeliveriesLastSeasonToolTip;
|
||||||
|
[ObservableProperty]
|
||||||
|
private string _statusDeliveriesThisSeason = "-";
|
||||||
|
[ObservableProperty]
|
||||||
|
private string _statusDeliveriesThisSeasonInfo = "aktuelle Saison";
|
||||||
|
[ObservableProperty]
|
||||||
|
private Grid? _statusDeliveriesThisSeasonToolTip;
|
||||||
|
[ObservableProperty]
|
||||||
|
private string _statusAreaCommitment = "-";
|
||||||
|
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
private Visibility _controlButtonsVisibility = Visibility.Visible;
|
private Visibility _controlButtonsVisibility = Visibility.Visible;
|
||||||
|
@ -638,23 +638,33 @@
|
|||||||
</ItemsPanelTemplate>
|
</ItemsPanelTemplate>
|
||||||
</StatusBar.ItemsPanel>
|
</StatusBar.ItemsPanel>
|
||||||
<StatusBarItem>
|
<StatusBarItem>
|
||||||
<TextBlock Name="StatusMembers" Text="{Binding StatusMembers}"/>
|
<TextBlock ToolTip="{Binding StatusMembersToolTip}">
|
||||||
|
Mitglieder: <Run Text="{Binding StatusMembers}"/>
|
||||||
|
</TextBlock>
|
||||||
</StatusBarItem>
|
</StatusBarItem>
|
||||||
<Separator Grid.Column="1"/>
|
<Separator Grid.Column="1"/>
|
||||||
<StatusBarItem Grid.Column="2">
|
<StatusBarItem Grid.Column="2">
|
||||||
<TextBlock Name="StatusBusinessShares" Text="{Binding StatusBusinessShares}"/>
|
<TextBlock ToolTip="{Binding StatusBusinessSharesToolTip}">
|
||||||
|
Geschäftsanteile: <Run Text="{Binding StatusBusinessShares}"/>
|
||||||
|
</TextBlock>
|
||||||
</StatusBarItem>
|
</StatusBarItem>
|
||||||
<Separator Grid.Column="3"/>
|
<Separator Grid.Column="3"/>
|
||||||
<StatusBarItem Grid.Column="4">
|
<StatusBarItem Grid.Column="4">
|
||||||
<TextBlock Name="StatusAreaCommitment" Text="{Binding StatusAreaCommitment}"/>
|
<TextBlock>
|
||||||
|
Gebundene Fläche: <Run Text="{Binding StatusAreaCommitment}"/>
|
||||||
|
</TextBlock>
|
||||||
</StatusBarItem>
|
</StatusBarItem>
|
||||||
<Separator Grid.Column="5"/>
|
<Separator Grid.Column="5"/>
|
||||||
<StatusBarItem Grid.Column="6">
|
<StatusBarItem Grid.Column="6">
|
||||||
<TextBlock Name="StatusDeliveriesLastSeason" Text="{Binding StatusDeliveriesLastSeason}"/>
|
<TextBlock ToolTip="{Binding StatusDeliveriesLastSeasonToolTip}">
|
||||||
|
Lieferungen (<Run Text="{Binding StatusDeliveriesLastSeasonInfo}"/>): <Run Text="{Binding StatusDeliveriesLastSeason}"/>
|
||||||
|
</TextBlock>
|
||||||
</StatusBarItem>
|
</StatusBarItem>
|
||||||
<Separator Grid.Column="7"/>
|
<Separator Grid.Column="7"/>
|
||||||
<StatusBarItem Grid.Column="8">
|
<StatusBarItem Grid.Column="8">
|
||||||
<TextBlock Name="StatusDeliveriesThisSeason" Text="{Binding StatusDeliveriesThisSeason}"/>
|
<TextBlock ToolTip="{Binding StatusDeliveriesThisSeasonToolTip}">
|
||||||
|
Lieferungen (<Run Text="{Binding StatusDeliveriesThisSeasonInfo}"/>): <Run Text="{Binding StatusDeliveriesThisSeason}"/>
|
||||||
|
</TextBlock>
|
||||||
</StatusBarItem>
|
</StatusBarItem>
|
||||||
</StatusBar>
|
</StatusBar>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
@ -147,12 +147,12 @@ namespace Elwig.Windows {
|
|||||||
MemberList.ScrollIntoView(MemberList.SelectedItem);
|
MemberList.ScrollIntoView(MemberList.SelectedItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RefreshInputs(bool validate = false) {
|
private async Task RefreshInputs(bool validate = false) {
|
||||||
ClearInputStates();
|
ClearInputStates();
|
||||||
if (ViewModel.SelectedMember is Member m) {
|
if (ViewModel.SelectedMember is Member m) {
|
||||||
EditMemberButton.IsEnabled = true;
|
EditMemberButton.IsEnabled = true;
|
||||||
DeleteMemberButton.IsEnabled = true;
|
DeleteMemberButton.IsEnabled = true;
|
||||||
FillInputs(m);
|
await FillInputs(m);
|
||||||
} else {
|
} else {
|
||||||
EditMemberButton.IsEnabled = false;
|
EditMemberButton.IsEnabled = false;
|
||||||
DeleteMemberButton.IsEnabled = false;
|
DeleteMemberButton.IsEnabled = false;
|
||||||
@ -224,8 +224,31 @@ namespace Elwig.Windows {
|
|||||||
}
|
}
|
||||||
|
|
||||||
await RefreshList();
|
await RefreshList();
|
||||||
ViewModel.StatusMembers = $"Mitglieder: {await ctx.Members.CountAsync(m => m.IsActive):N0} ({await ctx.Members.CountAsync():N0})";
|
|
||||||
ViewModel.StatusBusinessShares = $"Geschäftsanteile: {await ctx.Members.Where(m => m.IsActive).SumAsync(m => m.BusinessShares):N0} ({await ctx.Members.SumAsync(m => m.BusinessShares):N0})";
|
var (s1, s2) = ('\u2007', '\u202f');
|
||||||
|
var mA = $"{await ctx.Members.CountAsync(m => m.IsActive):N0}";
|
||||||
|
var mI = $"{await ctx.Members.CountAsync(m => !m.IsActive):N0}";
|
||||||
|
var mT = $"{await ctx.Members.CountAsync():N0}";
|
||||||
|
var mM = Math.Max(mA.Length, Math.Max(mI.Length, mT.Length));
|
||||||
|
var mS = mM > 3;
|
||||||
|
if (mS) mM--;
|
||||||
|
ViewModel.StatusMembers = $"{mA} ({mT})";
|
||||||
|
ViewModel.StatusMembersToolTip =
|
||||||
|
$"{new string(s1, Math.Max(0, mM - mA.Length))}{(mS && mA.Length < 4 ? s2 : "")}{mA} aktive Mitglieder\n" +
|
||||||
|
$"{new string(s1, Math.Max(0, mM - mI.Length))}{(mS && mI.Length < 4 ? s2 : "")}{mI} nicht aktive Mitglieder\n" +
|
||||||
|
$"{new string(s1, Math.Max(0, mM - mT.Length))}{(mS && mT.Length < 4 ? s2 : "")}{mT} Mitglieder gesamt";
|
||||||
|
|
||||||
|
var bA = $"{await ctx.Members.Where(m => m.IsActive).SumAsync(m => m.BusinessShares):N0}";
|
||||||
|
var bI = $"{await ctx.Members.Where(m => !m.IsActive).SumAsync(m => m.BusinessShares):N0}";
|
||||||
|
var bT = $"{await ctx.Members.SumAsync(m => m.BusinessShares):N0}";
|
||||||
|
var bM = Math.Max(bA.Length, Math.Max(bI.Length, bT.Length));
|
||||||
|
var bS = bM > 3;
|
||||||
|
if (bS) bM--;
|
||||||
|
ViewModel.StatusBusinessShares = $"{bA} ({bT})";
|
||||||
|
ViewModel.StatusBusinessSharesToolTip =
|
||||||
|
$"{new string(s1, Math.Max(0, bM - bA.Length))}{(bS && bA.Length < 4 ? s2 : "")}{bA} Geschäftsanteile von aktiven Mitgliedern\n" +
|
||||||
|
$"{new string(s1, Math.Max(0, bM - bI.Length))}{(bS && bI.Length < 4 ? s2 : "")}{bI} Geschäftsanteile von nicht aktiven Mitgliedern\n" +
|
||||||
|
$"{new string(s1, Math.Max(0, bM - bT.Length))}{(bS && bT.Length < 4 ? s2 : "")}{bT} Geschäftsanteile gesamt";
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SetPhoneNrInputVisible(int nr, bool visible, int? position = null) {
|
private void SetPhoneNrInputVisible(int nr, bool visible, int? position = null) {
|
||||||
@ -254,8 +277,8 @@ namespace Elwig.Windows {
|
|||||||
inputs.Address.Visibility = vis;
|
inputs.Address.Visibility = vis;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void MemberList_SelectionChanged(object sender, RoutedEventArgs evt) {
|
private async void MemberList_SelectionChanged(object sender, RoutedEventArgs evt) {
|
||||||
RefreshInputs();
|
await RefreshInputs();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void ActiveMemberInput_Changed(object sender, RoutedEventArgs evt) {
|
private async void ActiveMemberInput_Changed(object sender, RoutedEventArgs evt) {
|
||||||
@ -373,7 +396,7 @@ namespace Elwig.Windows {
|
|||||||
ViewModel.EnableSearchInputs = true;
|
ViewModel.EnableSearchInputs = true;
|
||||||
FinishInputFilling();
|
FinishInputFilling();
|
||||||
await RefreshList();
|
await RefreshList();
|
||||||
RefreshInputs();
|
await RefreshInputs();
|
||||||
ViewModel.SearchQuery = "";
|
ViewModel.SearchQuery = "";
|
||||||
if (mgnr is int m)
|
if (mgnr is int m)
|
||||||
FocusMember(m);
|
FocusMember(m);
|
||||||
@ -385,11 +408,11 @@ namespace Elwig.Windows {
|
|||||||
ResetButton_Click(null, null);
|
ResetButton_Click(null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ResetButton_Click(object? sender, RoutedEventArgs? evt) {
|
private async void ResetButton_Click(object? sender, RoutedEventArgs? evt) {
|
||||||
ViewModel.TransferPredecessorAreaComs = null;
|
ViewModel.TransferPredecessorAreaComs = null;
|
||||||
ViewModel.CancelAreaComs = null;
|
ViewModel.CancelAreaComs = null;
|
||||||
if (IsEditing) {
|
if (IsEditing) {
|
||||||
RefreshInputs();
|
await RefreshInputs();
|
||||||
} else if (IsCreating) {
|
} else if (IsCreating) {
|
||||||
ClearInputs();
|
ClearInputs();
|
||||||
InitInputs();
|
InitInputs();
|
||||||
@ -397,7 +420,7 @@ namespace Elwig.Windows {
|
|||||||
UpdateButtons();
|
UpdateButtons();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CancelButton_Click(object sender, RoutedEventArgs evt) {
|
private async void CancelButton_Click(object sender, RoutedEventArgs evt) {
|
||||||
IsEditing = false;
|
IsEditing = false;
|
||||||
IsCreating = false;
|
IsCreating = false;
|
||||||
MemberList.IsEnabled = true;
|
MemberList.IsEnabled = true;
|
||||||
@ -405,7 +428,7 @@ namespace Elwig.Windows {
|
|||||||
ViewModel.CancelAreaComs = null;
|
ViewModel.CancelAreaComs = null;
|
||||||
HideSaveResetCancelButtons();
|
HideSaveResetCancelButtons();
|
||||||
ShowNewEditDeleteButtons();
|
ShowNewEditDeleteButtons();
|
||||||
RefreshInputs();
|
await RefreshInputs();
|
||||||
LockInputs();
|
LockInputs();
|
||||||
UpdateContactInfoVisibility();
|
UpdateContactInfoVisibility();
|
||||||
ViewModel.EnableSearchInputs = true;
|
ViewModel.EnableSearchInputs = true;
|
||||||
@ -616,10 +639,10 @@ namespace Elwig.Windows {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void FillInputs(Member m) {
|
private async Task FillInputs(Member m) {
|
||||||
ClearOriginalValues();
|
ClearOriginalValues();
|
||||||
ClearDefaultValues();
|
ClearDefaultValues();
|
||||||
ViewModel.FillInputs(m);
|
await ViewModel.FillInputs(m);
|
||||||
UpdateContactInfoVisibility(IsEditing || IsCreating);
|
UpdateContactInfoVisibility(IsEditing || IsCreating);
|
||||||
FinishInputFilling();
|
FinishInputFilling();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user