diff --git a/Elwig/Helpers/Utils.cs b/Elwig/Helpers/Utils.cs index 6d932f4..904aad3 100644 --- a/Elwig/Helpers/Utils.cs +++ b/Elwig/Helpers/Utils.cs @@ -712,5 +712,10 @@ namespace Elwig.Helpers { var filename = Path.Combine(App.MailsPath, $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{NormalizeFileName(subject)}.txt"); await File.WriteAllTextAsync(filename, $"# {subject}\r\n# Vorgesehene Empfänger: {recipients}\r\n\r\n" + body, Utils.UTF8); } + + public static string GetTitle(string window, IEnumerable filterNames, IEnumerable filter) { + var f = string.Join(" / ", filterNames.Union(filter.Select(f => $"\"{f}\""))); + return window + (f.Length == 0 ? "" : ": " + f) + " - Elwig"; + } } } diff --git a/Elwig/Services/AreaComService.cs b/Elwig/Services/AreaComService.cs index 94ede78..242bed0 100644 --- a/Elwig/Services/AreaComService.cs +++ b/Elwig/Services/AreaComService.cs @@ -43,6 +43,8 @@ namespace Elwig.Services { public static async Task<(List, IQueryable, IQueryable, List)> GetFilters(this AreaComAdminViewModel vm, AppDbContext ctx) { List filterNames = []; IQueryable areaComQuery = ctx.AreaCommitments.Where(a => a.MgNr == vm.FilterMember.MgNr).OrderBy(a => a.FbNr); + filterNames.Add(vm.FilterMember.AdministrativeName); + if (vm.FilterSeason is int season) { areaComQuery = Utils.ActiveAreaCommitments(areaComQuery, season); filterNames.Add($"laufend {season}"); diff --git a/Elwig/ViewModels/DeliveryAncmtAdminViewModel.cs b/Elwig/ViewModels/DeliveryAncmtAdminViewModel.cs index 2888b9d..a1a2729 100644 --- a/Elwig/ViewModels/DeliveryAncmtAdminViewModel.cs +++ b/Elwig/ViewModels/DeliveryAncmtAdminViewModel.cs @@ -8,6 +8,9 @@ using System.Windows.Controls; namespace Elwig.ViewModels { public partial class DeliveryAncmtAdminViewModel : ObservableObject { + [ObservableProperty] + private string _title = "Anmeldungen - Elwig"; + [ObservableProperty] private string? _searchQuery = ""; public List TextFilter => [.. SearchQuery?.ToLower().Split(' ').ToList().FindAll(e => e.Length > 0) ?? []]; diff --git a/Elwig/ViewModels/MemberAdminViewModel.cs b/Elwig/ViewModels/MemberAdminViewModel.cs index e103635..ea882f5 100644 --- a/Elwig/ViewModels/MemberAdminViewModel.cs +++ b/Elwig/ViewModels/MemberAdminViewModel.cs @@ -6,11 +6,13 @@ using System.Collections.ObjectModel; using System.Linq; using System.Windows; using System.Windows.Controls; -using System.Windows.Documents; namespace Elwig.ViewModels { public partial class MemberAdminViewModel : ObservableObject { + [ObservableProperty] + private string _title = "Mitglieder - Elwig"; + public int? TransferPredecessorAreaComs = null; public int? CancelAreaComs = null; diff --git a/Elwig/Windows/AreaComAdminWindow.xaml.cs b/Elwig/Windows/AreaComAdminWindow.xaml.cs index d0ab549..5d7271e 100644 --- a/Elwig/Windows/AreaComAdminWindow.xaml.cs +++ b/Elwig/Windows/AreaComAdminWindow.xaml.cs @@ -23,7 +23,6 @@ namespace Elwig.Windows { CommandBindings.Add(new CommandBinding(CtrlF, FocusSearchInput)); using var ctx = new AppDbContext(); ViewModel.FilterMember = ctx.Members.Find(mgnr) ?? throw new ArgumentException("MgNr argument has invalid value"); - ViewModel.Title = $"Flächenbindungen - {ViewModel.FilterMember.AdministrativeName} - Elwig"; ExemptInputs = [ AreaCommitmentList, RevisionList, NewAreaCommitmentButton, EditAreaCommitmentButton, DeleteAreaCommitmentButton, SaveButton, @@ -51,9 +50,9 @@ namespace Elwig.Windows { var cursor = Mouse.OverrideCursor != null; if (!cursor) Mouse.OverrideCursor = Cursors.Wait; var query = (vm.SearchQuery, vm.FilterSeason); - var (filter, contracts, areaComs, areaComCount, stat) = await Task.Run(async () => { + var (filterNames, filter, contracts, areaComs, areaComCount, stat) = await Task.Run(async () => { using var ctx = new AppDbContext(); - var (_, contractQuery, areaComQuery, filter) = await vm.GetFilters(ctx); + var (filterNames, contractQuery, areaComQuery, filter) = await vm.GetFilters(ctx); var contracts = await contractQuery .Include(c => c.Revisions).ThenInclude(a => a.Member) .ToListAsync(); @@ -73,11 +72,12 @@ namespace Elwig.Windows { var season = await ctx.FetchSeasons().FirstOrDefaultAsync(); var stat = await AreaComService.GenerateToolTipData(areaComQuery, season?.MaxKgPerHa ?? 10_000); - return (filter, contracts, areaComs, areaComCount, stat); + return (filterNames, filter, contracts, areaComs, areaComCount, stat); }); if (!cursor) Mouse.OverrideCursor = null; if (query != (ViewModel.SearchQuery, ViewModel.FilterSeason)) return; + ViewModel.Title = Utils.GetTitle("Flächenbindungen", filterNames, filter); ControlUtils.RenewItemsSource(AreaCommitmentList, contracts, AreaCommitmentList_SelectionChanged, ViewModel.TextFilter.Count > 0 ? ControlUtils.RenewSourceDefault.IfOnly : ControlUtils.RenewSourceDefault.None, !updateSort); RefreshInputs(); @@ -164,7 +164,6 @@ namespace Elwig.Windows { return; } ViewModel.FilterMember = m; - ViewModel.Title = $"Flächenbindungen - {ViewModel.FilterMember.AdministrativeName} - Elwig"; ControlUtils.RenewItemsSource(KgInput, await ctx.WbKgs .Include(k => k.AtKg.WbKg!.Rds) diff --git a/Elwig/Windows/DeliveryAdminWindow.xaml.cs b/Elwig/Windows/DeliveryAdminWindow.xaml.cs index 7a064a4..4d44a4d 100644 --- a/Elwig/Windows/DeliveryAdminWindow.xaml.cs +++ b/Elwig/Windows/DeliveryAdminWindow.xaml.cs @@ -126,7 +126,6 @@ namespace Elwig.Windows { this() { using var ctx = new AppDbContext(); ViewModel.FilterMember = ctx.Members.Find(mgnr) ?? throw new ArgumentException("MgNr argument has invalid value"); - ViewModel.Title = $"Lieferungen - {ViewModel.FilterMember.AdministrativeName} - Elwig"; ViewModel.EnableAllSeasons = true; } @@ -419,9 +418,9 @@ namespace Elwig.Windows { var cursor = Mouse.OverrideCursor != null; if (!cursor) Mouse.OverrideCursor = Cursors.Wait; var query = (vm.SearchQuery, vm.FilterSeason, vm.FilterAllSeasons, vm.FilterTodayOnly); - var (filter, deliveries, deliveryPartsNum, varieties, members, stat) = await Task.Run(async () => { + var (filterNames, filter, deliveries, deliveryPartsNum, varieties, members, stat) = await Task.Run(async () => { using var ctx = new AppDbContext(); - var (_, deliveryQuery, deliveryPartsQuery, predicate, filter) = await vm.GetFilters(ctx); + var (filterNames, deliveryQuery, deliveryPartsQuery, predicate, filter) = await vm.GetFilters(ctx); var deliveries = await deliveryQuery .Include(d => d.Parts).ThenInclude(p => p.PartModifiers).ThenInclude(m => m.Modifier) .Include(d => d.Parts).ThenInclude(p => p.Variety) @@ -450,11 +449,13 @@ namespace Elwig.Windows { var members = await deliveryQuery.Select(d => d.Member).Distinct().IgnoreAutoIncludes().ToListAsync(); var stat = await DeliveryService.GenerateToolTipData(deliveryPartsQuery); - return (filter, deliveries, deliveryPartsNum, varieties, members, stat); + return (filterNames, filter, deliveries, deliveryPartsNum, varieties, members, stat); }); if (!cursor) Mouse.OverrideCursor = null; if (query != (ViewModel.SearchQuery, ViewModel.FilterSeason, ViewModel.FilterAllSeasons, ViewModel.FilterTodayOnly)) return; + if (!ViewModel.IsReceipt) + ViewModel.Title = Utils.GetTitle("Lieferungen", filterNames, filter); ControlUtils.RenewItemsSource(DeliveryList, deliveries, DeliveryList_SelectionChanged, ViewModel.TextFilter.Count > 0 ? ControlUtils.RenewSourceDefault.IfOnly : ControlUtils.RenewSourceDefault.None, !updateSort); await RefreshDeliveryParts(); @@ -488,7 +489,6 @@ namespace Elwig.Windows { return; } ViewModel.FilterMember = m; - ViewModel.Title = $"Lieferungen - {ViewModel.FilterMember.AdministrativeName} - Elwig"; } int year = 0; diff --git a/Elwig/Windows/DeliveryAncmtAdminWindow.xaml b/Elwig/Windows/DeliveryAncmtAdminWindow.xaml index ac5574b..69d2ca6 100644 --- a/Elwig/Windows/DeliveryAncmtAdminWindow.xaml +++ b/Elwig/Windows/DeliveryAncmtAdminWindow.xaml @@ -8,7 +8,7 @@ xmlns:local="clr-namespace:Elwig.Windows" xmlns:vm="clr-namespace:Elwig.ViewModels" xmlns:ctrl="clr-namespace:Elwig.Controls" - Title="Anmeldungen - Elwig" Height="700" Width="980" MinWidth="600" MinHeight="400"> + Title="{Binding Title}" Height="700" Width="980" MinWidth="600" MinHeight="400"> diff --git a/Elwig/Windows/DeliveryAncmtAdminWindow.xaml.cs b/Elwig/Windows/DeliveryAncmtAdminWindow.xaml.cs index 136d815..98ea008 100644 --- a/Elwig/Windows/DeliveryAncmtAdminWindow.xaml.cs +++ b/Elwig/Windows/DeliveryAncmtAdminWindow.xaml.cs @@ -103,9 +103,9 @@ namespace Elwig.Windows { var cursor = Mouse.OverrideCursor != null; if (!cursor) Mouse.OverrideCursor = Cursors.Wait; var query = (vm.SearchQuery, vm.FilterSeason, vm.FilterOnlyUpcoming, vm.FilterOnlyUpcoming); - var (filter, deliveryAncmts, stat) = await Task.Run(async () => { + var (filterNames, filter, deliveryAncmts, stat) = await Task.Run(async () => { using var ctx = new AppDbContext(); - var (_, deliveryAncmtQuery, filter) = await vm.GetFilters(ctx); + var (filterNames, deliveryAncmtQuery, filter) = await vm.GetFilters(ctx); var deliveryAncmts = await deliveryAncmtQuery.ToListAsync(); if (filter.Count > 0 && deliveryAncmts.Count > 0) { @@ -130,11 +130,12 @@ namespace Elwig.Windows { var stat = await DeliveryAncmtService.GenerateToolTipData(deliveryAncmtQuery); - return (filter, deliveryAncmts, stat); + return (filterNames, filter, deliveryAncmts, stat); }); if (!cursor) Mouse.OverrideCursor = null; if (query != (ViewModel.SearchQuery, ViewModel.FilterSeason, ViewModel.FilterOnlyUpcoming, ViewModel.FilterOnlyUpcoming)) return; + ViewModel.Title = Utils.GetTitle("Anmeldungen", filterNames, filter); ControlUtils.RenewItemsSource(DeliveryAncmtList, deliveryAncmts, DeliveryAncmtList_SelectionChanged, ViewModel.TextFilter.Count > 0 ? ControlUtils.RenewSourceDefault.IfOnly : ControlUtils.RenewSourceDefault.None, !updateSort); if (updateSort && DeliveryAncmtList.SelectedItem != null) diff --git a/Elwig/Windows/MemberAdminWindow.xaml b/Elwig/Windows/MemberAdminWindow.xaml index 1a1b6e7..012ef95 100644 --- a/Elwig/Windows/MemberAdminWindow.xaml +++ b/Elwig/Windows/MemberAdminWindow.xaml @@ -5,7 +5,7 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:Elwig.Windows" xmlns:vm="clr-namespace:Elwig.ViewModels" - Title="Mitglieder - Elwig" Height="700" Width="1250" MinHeight="650" MinWidth="1150"> + Title="{Binding Title}" Height="700" Width="1250" MinHeight="650" MinWidth="1150"> diff --git a/Elwig/Windows/MemberAdminWindow.xaml.cs b/Elwig/Windows/MemberAdminWindow.xaml.cs index 1a7cb57..32dcabd 100644 --- a/Elwig/Windows/MemberAdminWindow.xaml.cs +++ b/Elwig/Windows/MemberAdminWindow.xaml.cs @@ -7,7 +7,6 @@ using Elwig.ViewModels; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; -using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using System.Windows; @@ -147,9 +146,9 @@ namespace Elwig.Windows { var cursor = Mouse.OverrideCursor != null; if (!cursor) Mouse.OverrideCursor = Cursors.Wait; var query = (vm.SearchQuery, vm.ShowOnlyActiveMembers); - var (members, stat) = await Task.Run(async () => { + var (filterNames, members, stat, filter) = await Task.Run(async () => { using var ctx = new AppDbContext(); - var (_, memberQuery, filter) = await vm.GetFilters(ctx); + var (filterNames, memberQuery, filter) = await vm.GetFilters(ctx); var members = await memberQuery .Include(m => m.EmailAddresses) .Include(m => m.TelephoneNumbers) @@ -184,11 +183,12 @@ namespace Elwig.Windows { SharesActive = g.Sum(m => m.Shares + m.SharesRed + m.SharesWhite), }).ToListAsync()).Select(g => (g.Count, g.Shares, g.SharesRed, g.SharesWhite, g.SharesDormant, g.SharesTotal, g.SharesActive)).ToList(); - return (members, stat[0]); + return (filterNames, members, stat[0], filter); }); if (!cursor) Mouse.OverrideCursor = null; if (query != (ViewModel.SearchQuery, ViewModel.ShowOnlyActiveMembers)) return; + ViewModel.Title = Utils.GetTitle("Mitglieder", filterNames, filter); ControlUtils.RenewItemsSource(MemberList, members, MemberList_SelectionChanged, ViewModel.TextFilter.Count > 0 ? ControlUtils.RenewSourceDefault.IfOnly : ControlUtils.RenewSourceDefault.None, !updateSort); if (updateSort && MemberList.SelectedItem != null)