From b2f52072f838d2d3c6d3bfaa4529ad515195c07e Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Thu, 28 Mar 2024 16:54:51 +0100 Subject: [PATCH] Windows: Add feature to save pdf in menu --- Elwig/Documents/Document.cs | 2 + Elwig/Helpers/Utils.cs | 29 ++++++++++++ Elwig/Windows/DeliveryAdminWindow.xaml | 20 ++++++-- Elwig/Windows/DeliveryAdminWindow.xaml.cs | 50 ++++++++++---------- Elwig/Windows/MemberAdminWindow.xaml | 14 +++++- Elwig/Windows/MemberAdminWindow.xaml.cs | 56 +++++++++++------------ 6 files changed, 111 insertions(+), 60 deletions(-) diff --git a/Elwig/Documents/Document.cs b/Elwig/Documents/Document.cs index 340df28..a16e970 100644 --- a/Elwig/Documents/Document.cs +++ b/Elwig/Documents/Document.cs @@ -99,6 +99,8 @@ namespace Elwig.Documents { } public async Task Generate(IProgress? progress = null) { + if (_pdfFile != null) + return; progress?.Report(0.0); if (this is PdfDocument) { // nothing to do diff --git a/Elwig/Helpers/Utils.cs b/Elwig/Helpers/Utils.cs index f9a8fe0..ebf2194 100644 --- a/Elwig/Helpers/Utils.cs +++ b/Elwig/Helpers/Utils.cs @@ -27,6 +27,7 @@ using System.Windows.Input; using LinqKit; using System.Linq.Expressions; using Elwig.Models; +using Microsoft.Win32; namespace Elwig.Helpers { public static partial class Utils { @@ -478,6 +479,34 @@ namespace Elwig.Helpers { return true; } + public static async Task ExportDocument(Document doc, ExportMode mode, string? filename = null, (Member, string, string)? emailData = null) { + if (mode == ExportMode.Print && !App.Config.Debug) { + await doc.Generate(); + await doc.Print(); + } else if (mode == ExportMode.Email && emailData is (Member, string, string) e) { + await doc.Generate(); + var success = await SendEmail(e.Item1, e.Item2, e.Item3, [doc]); + if (success) + MessageBox.Show("Die E-Mail wurde erfolgreich verschickt!", "E-Mail verschickt", + MessageBoxButton.OK, MessageBoxImage.Information); + } else if (mode == ExportMode.SavePdf) { + var d = new SaveFileDialog() { + FileName = $"{NormalizeFileName(filename ?? doc.Title)}.pdf", + DefaultExt = "pdf", + Filter = "PDF-Datei (*.pdf)|*.pdf", + Title = $"{doc.Title} speichern unter - Elwig" + }; + if (d.ShowDialog() == true) { + await doc.Generate(); + doc.SaveTo(d.FileName); + Process.Start("explorer.exe", d.FileName); + } + } else { + await doc.Generate(); + doc.Show(); + } + } + public static int? GetEntityIdentifier(object? obj) { if (obj == null) { return null; diff --git a/Elwig/Windows/DeliveryAdminWindow.xaml b/Elwig/Windows/DeliveryAdminWindow.xaml index 54573bc..5db0098 100644 --- a/Elwig/Windows/DeliveryAdminWindow.xaml +++ b/Elwig/Windows/DeliveryAdminWindow.xaml @@ -53,36 +53,46 @@ - + - + - + - + - + diff --git a/Elwig/Windows/DeliveryAdminWindow.xaml.cs b/Elwig/Windows/DeliveryAdminWindow.xaml.cs index 5ee198f..1b1f4cf 100644 --- a/Elwig/Windows/DeliveryAdminWindow.xaml.cs +++ b/Elwig/Windows/DeliveryAdminWindow.xaml.cs @@ -149,6 +149,12 @@ namespace Elwig.Windows { await GenerateDeliveryNote(d.Year, d.DId, ExportMode.Show); } + private async void Menu_DeliveryNote_SavePdf_Click(object sender, RoutedEventArgs evt) { + if (DeliveryList.SelectedItem is not Delivery d) + return; + await GenerateDeliveryNote(d.Year, d.DId, ExportMode.SavePdf); + } + private async void Menu_DeliveryNote_Print_Click(object sender, RoutedEventArgs evt) { if (DeliveryList.SelectedItem is not Delivery d) return; @@ -167,17 +173,7 @@ namespace Elwig.Windows { using var ctx = new AppDbContext(); var d = (await ctx.Deliveries.FindAsync(year, did))!; using var doc = new DeliveryNote(d, ctx); - await doc.Generate(); - if (mode == ExportMode.Print && !App.Config.Debug) { - await doc.Print(); - } else if (mode == ExportMode.Email) { - var success = await Utils.SendEmail(d.Member, $"{DeliveryNote.Name} Nr. {d.LsNr}", $"Im Anhang finden Sie den {DeliveryNote.Name} Nr. {d.LsNr}", [doc]); - if (success) - MessageBox.Show("Die E-Mail wurde erfolgreich verschickt!", "E-Mail verschickt", - MessageBoxButton.OK, MessageBoxImage.Information); - } else { - doc.Show(); - } + await Utils.ExportDocument(doc, mode, d.LsNr, (d.Member, $"{DeliveryNote.Name} Nr. {d.LsNr}", $"Im Anhang finden Sie den {DeliveryNote.Name} Nr. {d.LsNr}")); } catch (Exception exc) { MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); } @@ -205,6 +201,10 @@ namespace Elwig.Windows { await GenerateDeliveryJournal(1, ExportMode.SaveList); } + private async void Menu_DeliveryJournal_SavePdfToday_Click(object sender, RoutedEventArgs evt) { + await GenerateDeliveryJournal(1, ExportMode.SavePdf); + } + private async void Menu_DeliveryJournal_ShowToday_Click(object sender, RoutedEventArgs evt) { await GenerateDeliveryJournal(1, ExportMode.Show); } @@ -217,6 +217,10 @@ namespace Elwig.Windows { await GenerateDeliveryJournal(0, ExportMode.SaveList); } + private async void Menu_DeliveryJournal_SavePdfFilters_Click(object sender, RoutedEventArgs evt) { + await GenerateDeliveryJournal(0, ExportMode.SavePdf); + } + private async void Menu_DeliveryJournal_ShowFilters_Click(object sender, RoutedEventArgs evt) { await GenerateDeliveryJournal(0, ExportMode.Show); } @@ -269,12 +273,7 @@ namespace Elwig.Windows { try { var data = await DeliveryJournalData.FromQuery(query, filterNames); using var doc = new DeliveryJournal(string.Join(" / ", filterNames), data); - await doc.Generate(); - if (exportMode == ExportMode.Print && !App.Config.Debug) { - await doc.Print(); - } else { - doc.Show(); - } + await Utils.ExportDocument(doc, exportMode); } catch (Exception exc) { MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); } @@ -286,6 +285,10 @@ namespace Elwig.Windows { await GenerateWineQualityStatistics(1, ExportMode.Show); } + private async void Menu_WineQualityStatistics_SavePdfToday_Click(object sender, RoutedEventArgs evt) { + await GenerateWineQualityStatistics(1, ExportMode.SavePdf); + } + private async void Menu_WineQualityStatistics_PrintToday_Click(object sender, RoutedEventArgs evt) { await GenerateWineQualityStatistics(1, ExportMode.Print); } @@ -294,6 +297,10 @@ namespace Elwig.Windows { await GenerateWineQualityStatistics(0, ExportMode.Show); } + private async void Menu_WineQualityStatistics_SavePdfFilters_Click(object sender, RoutedEventArgs evt) { + await GenerateWineQualityStatistics(0, ExportMode.SavePdf); + } + private async void Menu_WineQualityStatistics_PrintFilters_Click(object sender, RoutedEventArgs evt) { await GenerateWineQualityStatistics(0, ExportMode.Print); } @@ -317,12 +324,7 @@ namespace Elwig.Windows { try { var data = await WineQualityStatisticsData.FromQuery(query); using var doc = new WineQualityStatistics(string.Join(" / ", filterNames), data); - await doc.Generate(); - if (exportMode == ExportMode.Print && !App.Config.Debug) { - await doc.Print(); - } else { - doc.Show(); - } + await Utils.ExportDocument(doc, exportMode); } catch (Exception exc) { MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); } @@ -1278,11 +1280,13 @@ namespace Elwig.Windows { if (DeliveryList.SelectedItem is Delivery d) { DeleteDeliveryButton.IsEnabled = true; Menu_DeliveryNote_Show.IsEnabled = !IsEditing && !IsCreating; + Menu_DeliveryNote_SavePdf.IsEnabled = !IsEditing && !IsCreating; Menu_DeliveryNote_Print.IsEnabled = !IsEditing && !IsCreating; Menu_DeliveryNote_Email.IsEnabled = !IsEditing && !IsCreating && App.Config.Smtp != null && d.Member.EmailAddresses.Count > 0; } else { DeleteDeliveryButton.IsEnabled = false; Menu_DeliveryNote_Show.IsEnabled = false; + Menu_DeliveryNote_SavePdf.IsEnabled = false; Menu_DeliveryNote_Print.IsEnabled = false; Menu_DeliveryNote_Email.IsEnabled = false; } diff --git a/Elwig/Windows/MemberAdminWindow.xaml b/Elwig/Windows/MemberAdminWindow.xaml index 14ef114..1911024 100644 --- a/Elwig/Windows/MemberAdminWindow.xaml +++ b/Elwig/Windows/MemberAdminWindow.xaml @@ -52,16 +52,20 @@ Click="Menu_Contact_Letterhead_Click"/> - + - + + @@ -79,6 +85,8 @@ Click="Menu_List_SaveFilters_Click"/> + @@ -86,6 +94,8 @@ Click="Menu_List_SaveAll_Click"/> + diff --git a/Elwig/Windows/MemberAdminWindow.xaml.cs b/Elwig/Windows/MemberAdminWindow.xaml.cs index 14a0eaa..a88ee7a 100644 --- a/Elwig/Windows/MemberAdminWindow.xaml.cs +++ b/Elwig/Windows/MemberAdminWindow.xaml.cs @@ -320,9 +320,12 @@ namespace Elwig.Windows { Menu_DeliveryConfirmation.Items.Clear(); foreach (var s in await ctx.Seasons.OrderByDescending(s => s.Year).ToListAsync()) { var i = new MenuItem { Header = $"Saison {s.Year}...", IsEnabled = MemberList.SelectedItem != null }; - var show = new MenuItem { Header = "...anzeigen" }; + var show = new MenuItem { Header = "...anzeigen (PDF)" }; show.Click += Menu_DeliveryConfirmation_Show_Click; i.Items.Add(show); + var pdf = new MenuItem { Header = "...speichern... (PDF)" }; + pdf.Click += Menu_DeliveryConfirmation_Email_Click; + i.Items.Add(pdf); var print = new MenuItem { Header = "...drucken" }; print.Click += Menu_DeliveryConfirmation_Print_Click; i.Items.Add(print); @@ -573,6 +576,12 @@ namespace Elwig.Windows { await GenerateMemberDataSheet(m, ExportMode.Show); } + private async void Menu_MemberDataSheet_SavePdf_Click(object sender, RoutedEventArgs evt) { + if (MemberList.SelectedItem is not Member m) + return; + await GenerateMemberDataSheet(m, ExportMode.SavePdf); + } + private async void Menu_MemberDataSheet_Print_Click(object sender, RoutedEventArgs evt) { if (MemberList.SelectedItem is not Member m) return; @@ -590,17 +599,7 @@ namespace Elwig.Windows { try { using var ctx = new AppDbContext(); using var doc = new MemberDataSheet(m, ctx); - await doc.Generate(); - if (mode == ExportMode.Print && !App.Config.Debug) { - await doc.Print(); - } else if (mode == ExportMode.Email) { - var success = await Utils.SendEmail(m, MemberDataSheet.Name, "Im Anhang finden Sie das aktuelle Stammdatenblatt", [doc]); - if (success) - MessageBox.Show("Die E-Mail wurde erfolgreich verschickt!", "E-Mail verschickt", - MessageBoxButton.OK, MessageBoxImage.Information); - } else { - doc.Show(); - } + await Utils.ExportDocument(doc, mode, emailData: (m, MemberDataSheet.Name, "Im Anhang finden Sie das aktuelle Stammdatenblatt")); } catch (Exception exc) { MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); } @@ -614,6 +613,13 @@ namespace Elwig.Windows { await GenerateDeliveryConfirmation(m, s, ExportMode.Show); } + private async void Menu_DeliveryConfirmation_SavePdf_Click(object sender, RoutedEventArgs evt) { + var season = ((sender as MenuItem)?.Parent as MenuItem)?.Header?.ToString()?.Split(' ')[^1].Split('.')[0]; + if (MemberList.SelectedItem is not Member m || season == null || !int.TryParse(season, out var s)) + return; + await GenerateDeliveryConfirmation(m, s, ExportMode.SavePdf); + } + private async void Menu_DeliveryConfirmation_Print_Click(object sender, RoutedEventArgs evt) { var season = ((sender as MenuItem)?.Parent as MenuItem)?.Header?.ToString()?.Split(' ')[^1].Split('.')[0]; if (MemberList.SelectedItem is not Member m || season == null || !int.TryParse(season, out var s)) @@ -634,17 +640,7 @@ namespace Elwig.Windows { using var ctx = new AppDbContext(); var data = await DeliveryConfirmationDeliveryData.ForMember(ctx.DeliveryParts, year, m); using var doc = new DeliveryConfirmation(ctx, year, m, data); - await doc.Generate(); - if (mode == ExportMode.Print && !App.Config.Debug) { - await doc.Print(); - } else if (mode == ExportMode.Email) { - var success = await Utils.SendEmail(m, $"{DeliveryConfirmation.Name} {year}", $"Im Anhang finden Sie die Anlieferungsbestätigung {year}", [doc]); - if (success) - MessageBox.Show("Die E-Mail wurde erfolgreich verschickt!", "E-Mail verschickt", - MessageBoxButton.OK, MessageBoxImage.Information); - } else { - doc.Show(); - } + await Utils.ExportDocument(doc, mode, emailData: (m, $"{DeliveryConfirmation.Name} {year}", $"Im Anhang finden Sie die Anlieferungsbestätigung {year}")); } catch (Exception exc) { MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); } @@ -653,12 +649,15 @@ namespace Elwig.Windows { private async void Menu_List_SaveActive_Click(object sender, RoutedEventArgs evt) { await GenerateMemberList(0, ExportMode.SaveList); } private async void Menu_List_ShowActive_Click(object sender, RoutedEventArgs evt) { await GenerateMemberList(0, ExportMode.Show); } + private async void Menu_List_SavePdfActive_Click(object sender, RoutedEventArgs evt) { await GenerateMemberList(0, ExportMode.SavePdf); } private async void Menu_List_PrintActive_Click(object sender, RoutedEventArgs evt) { await GenerateMemberList(0, ExportMode.Print); } private async void Menu_List_SaveFilters_Click(object sender, RoutedEventArgs evt) { await GenerateMemberList(1, ExportMode.SaveList); } private async void Menu_List_ShowFilters_Click(object sender, RoutedEventArgs evt) { await GenerateMemberList(1, ExportMode.Show); } + private async void Menu_List_SavePdfFilters_Click(object sender, RoutedEventArgs evt) { await GenerateMemberList(1, ExportMode.SavePdf); } private async void Menu_List_PrintFilters_Click(object sender, RoutedEventArgs evt) { await GenerateMemberList(1, ExportMode.Print); } private async void Menu_List_SaveAll_Click(object sender, RoutedEventArgs evt) { await GenerateMemberList(2, ExportMode.SaveList); } private async void Menu_List_ShowAll_Click(object sender, RoutedEventArgs evt) { await GenerateMemberList(2, ExportMode.Show); } + private async void Menu_List_SavePdfAll_Click(object sender, RoutedEventArgs evt) { await GenerateMemberList(2, ExportMode.SavePdf); } private async void Menu_List_PrintAll_Click(object sender, RoutedEventArgs evt) { await GenerateMemberList(2, ExportMode.Print); } private async void Menu_List_Order_Click(object sender, RoutedEventArgs evt) { @@ -739,12 +738,7 @@ namespace Elwig.Windows { try { var data = await MemberListData.FromQuery(query, filterNames); using var doc = new MemberList(string.Join(" / ", filterNames), data); - await doc.Generate(); - if (exportMode == ExportMode.Print && !App.Config.Debug) { - await doc.Print(); - } else { - doc.Show(); - } + await Utils.ExportDocument(doc, exportMode); } catch (Exception exc) { MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); } @@ -1059,9 +1053,10 @@ namespace Elwig.Windows { Menu_MemberDataSheet_Print.IsEnabled = true; Menu_MemberDataSheet_Email.IsEnabled = App.Config.Smtp != null && m.EmailAddresses.Count > 0; Menu_MemberDataSheet_Show.IsEnabled = true; + Menu_MemberDataSheet_SavePdf.IsEnabled = true; foreach (var i in Menu_DeliveryConfirmation.Items.Cast()) { i.IsEnabled = true; - (i.Items[2] as MenuItem)!.IsEnabled = App.Config.Smtp != null && m.EmailAddresses.Count > 0; + (i.Items[^1] as MenuItem)!.IsEnabled = App.Config.Smtp != null && m.EmailAddresses.Count > 0; } FinishInputFilling(); @@ -1073,6 +1068,7 @@ namespace Elwig.Windows { Menu_MemberDataSheet_Print.IsEnabled = false; Menu_MemberDataSheet_Email.IsEnabled = false; Menu_MemberDataSheet_Show.IsEnabled = false; + Menu_MemberDataSheet_SavePdf.IsEnabled = false; foreach (var i in Menu_DeliveryConfirmation.Items.Cast()) { i.IsEnabled = false; }