Windows: Add feature to save pdf in menu

This commit is contained in:
2024-03-28 16:54:51 +01:00
parent 9aa6cba1ff
commit b2f52072f8
6 changed files with 111 additions and 60 deletions

View File

@ -99,6 +99,8 @@ namespace Elwig.Documents {
}
public async Task Generate(IProgress<double>? progress = null) {
if (_pdfFile != null)
return;
progress?.Report(0.0);
if (this is PdfDocument) {
// nothing to do

View File

@ -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;

View File

@ -53,36 +53,46 @@
<Menu Grid.ColumnSpan="3" BorderThickness="0,0,0,1" BorderBrush="LightGray" Background="White">
<MenuItem Header="Lieferschein">
<MenuItem x:Name="Menu_DeliveryNote_Show" Header="...anzeigen" IsEnabled="False"
<MenuItem x:Name="Menu_DeliveryNote_Show" Header="...anzeigen (PDF)" IsEnabled="False"
Click="Menu_DeliveryNote_Show_Click" InputGestureText="Strg+P"/>
<MenuItem x:Name="Menu_DeliveryNote_SavePdf" Header="...speichern... (PDF)" IsEnabled="False"
Click="Menu_DeliveryNote_SavePdf_Click"/>
<MenuItem x:Name="Menu_DeliveryNote_Print" Header="...drucken" IsEnabled="False"
Click="Menu_DeliveryNote_Print_Click" InputGestureText="Strg+Shift+P"/>
<MenuItem x:Name="Menu_DeliveryNote_Email" Header="...per E-Mail schicken" IsEnabled="False"
Click="Menu_DeliveryNote_Email_Click"/>
</MenuItem>
<MenuItem Header="Lieferjournal">
<MenuItem x:Name="Menu_DeliveryJournal_SaveFilters" Header="...aus Filtern speichern (Excel)"
<MenuItem x:Name="Menu_DeliveryJournal_SaveFilters" Header="...aus Filtern speichern... (Excel)"
Click="Menu_DeliveryJournal_SaveFilters_Click" InputGestureText="Strg+L"/>
<MenuItem x:Name="Menu_DeliveryJournal_ShowFilters" Header="...aus Filtern anzeigen (PDF)"
Click="Menu_DeliveryJournal_ShowFilters_Click" InputGestureText="Strg+O"/>
<MenuItem x:Name="Menu_DeliveryJournal_SavePdfFilters" Header="...aus Filtern speichern... (PDF)"
Click="Menu_DeliveryJournal_SavePdfFilters_Click"/>
<MenuItem x:Name="Menu_DeliveryJournal_PrintFilters" Header="...aus Filtern drucken"
Click="Menu_DeliveryJournal_PrintFilters_Click" InputGestureText="Strg+Shift+O"/>
<Separator/>
<MenuItem x:Name="Menu_DeliveryJournal_SaveToday" Header="...von heute speichern (Excel)"
<MenuItem x:Name="Menu_DeliveryJournal_SaveToday" Header="...von heute speichern... (Excel)"
Click="Menu_DeliveryJournal_SaveToday_Click"/>
<MenuItem x:Name="Menu_DeliveryJournal_ShowToday" Header="...von heute anzeigen (PDF)"
Click="Menu_DeliveryJournal_ShowToday_Click"/>
<MenuItem x:Name="Menu_DeliveryJournal_SavePdfToday" Header="...von heute speichern... (PDF)"
Click="Menu_DeliveryJournal_SavePdfToday_Click"/>
<MenuItem x:Name="Menu_DeliveryJournal_PrintToday" Header="...von heute drucken"
Click="Menu_DeliveryJournal_PrintToday_Click" InputGestureText="Strg+J"/>
</MenuItem>
<MenuItem Header="Qualitätsstatistik">
<MenuItem x:Name="Menu_WineQualityStatistics_ShowFilters" Header="...aus Filtern anzeigen"
<MenuItem x:Name="Menu_WineQualityStatistics_ShowFilters" Header="...aus Filtern anzeigen (PDF)"
Click="Menu_WineQualityStatistics_ShowFilters_Click"/>
<MenuItem x:Name="Menu_WineQualityStatistics_SavePdfFilters" Header="...aus Filtern speichern... (PDF)"
Click="Menu_WineQualityStatistics_SavePdfFilters_Click"/>
<MenuItem x:Name="Menu_WineQualityStatistics_PrintFilters" Header="...aus Filtern drucken"
Click="Menu_WineQualityStatistics_PrintFilters_Click"/>
<Separator/>
<MenuItem x:Name="Menu_WineQualityStatistics_ShowToday" Header="...von heute anzeigen"
<MenuItem x:Name="Menu_WineQualityStatistics_ShowToday" Header="...von heute anzeigen (PDF)"
Click="Menu_WineQualityStatistics_ShowToday_Click"/>
<MenuItem x:Name="Menu_WineQualityStatistics_SavePdfToday" Header="...von heute speichern... (PDF)"
Click="Menu_WineQualityStatistics_SavePdfToday_Click"/>
<MenuItem x:Name="Menu_WineQualityStatistics_PrintToday" Header="...von heute drucken"
Click="Menu_WineQualityStatistics_PrintToday_Click" InputGestureText="Strg+Q"/>
</MenuItem>

View File

@ -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;
}

View File

@ -52,16 +52,20 @@
Click="Menu_Contact_Letterhead_Click"/>
</MenuItem>
<MenuItem Header="Stammdatenblatt">
<MenuItem x:Name="Menu_MemberDataSheet_Show" Header="...anzeigen" IsEnabled="False"
<MenuItem x:Name="Menu_MemberDataSheet_Show" Header="...anzeigen (PDF)" IsEnabled="False"
Click="Menu_MemberDataSheet_Show_Click" InputGestureText="Strg+P"/>
<MenuItem x:Name="Menu_MemberDataSheet_SavePdf" Header="...speichern... (PDF)" IsEnabled="False"
Click="Menu_MemberDataSheet_SavePdf_Click"/>
<MenuItem x:Name="Menu_MemberDataSheet_Print" Header="...drucken" IsEnabled="False"
Click="Menu_MemberDataSheet_Print_Click" InputGestureText="Strg+Shift+P"/>
<MenuItem x:Name="Menu_MemberDataSheet_Email" Header="...per E-Mail schicken" IsEnabled="False"
Click="Menu_MemberDataSheet_Email_Click"/>
</MenuItem>
<MenuItem Header="Anlieferungsbestätigung" x:Name="Menu_DeliveryConfirmation">
<MenuItem x:Name="Menu_DeliveryConfirmation_Show" Header="...anzeigen" IsEnabled="False"
<MenuItem x:Name="Menu_DeliveryConfirmation_Show" Header="...anzeigen (PDF)" IsEnabled="False"
Click="Menu_DeliveryConfirmation_Show_Click"/>
<MenuItem x:Name="Menu_DeliveryConfirmation_SavePdf" Header="...speichern... (PDF)" IsEnabled="False"
Click="Menu_DeliveryConfirmation_SavePdf_Click"/>
<MenuItem x:Name="Menu_DeliveryConfirmation_Print" Header="...drucken" IsEnabled="False"
Click="Menu_DeliveryConfirmation_Print_Click"/>
<MenuItem x:Name="Menu_DeliveryConfirmation_Email" Header="...per E-Mail schicken" IsEnabled="False"
@ -72,6 +76,8 @@
Click="Menu_List_SaveActive_Click" InputGestureText="Strg+L"/>
<MenuItem x:Name="Menu_List_ShowActive" Header="...mit Aktiven anzeigen (PDF)"
Click="Menu_List_ShowActive_Click" InputGestureText="Strg+O"/>
<MenuItem x:Name="Menu_List_SavePdfActive" Header="...mit Aktiven speichern... (PDF)"
Click="Menu_List_SavePdfActive_Click"/>
<MenuItem x:Name="Menu_List_PrintActive" Header="...mit Aktiven drucken"
Click="Menu_List_PrintActive_Click" InputGestureText="Strg+Shift+O"/>
<Separator/>
@ -79,6 +85,8 @@
Click="Menu_List_SaveFilters_Click"/>
<MenuItem x:Name="Menu_List_ShowFilters" Header="...aus Filtern anzeigen (PDF)"
Click="Menu_List_ShowFilters_Click"/>
<MenuItem x:Name="Menu_List_SavePdfFilters" Header="...aus Filtern speichern... (PDF)"
Click="Menu_List_SavePdfFilters_Click"/>
<MenuItem x:Name="Menu_List_PrintFilters" Header="...aus Filtern drucken"
Click="Menu_List_PrintFilters_Click"/>
<Separator/>
@ -86,6 +94,8 @@
Click="Menu_List_SaveAll_Click"/>
<MenuItem x:Name="Menu_List_ShowAll" Header="...mit allen anzeigen (PDF)"
Click="Menu_List_ShowAll_Click"/>
<MenuItem x:Name="Menu_List_SavePdfAll" Header="...mit allen speichern... (PDF)"
Click="Menu_List_SavePdfAll_Click"/>
<MenuItem x:Name="Menu_List_PrintAll" Header="...mit allen drucken"
Click="Menu_List_PrintAll_Click"/>
<Separator/>

View File

@ -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<MenuItem>()) {
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<MenuItem>()) {
i.IsEnabled = false;
}