Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6d80cca241 | |||
| 9dc225d3e4 | |||
| 0d513f7bff | |||
| b10c744bf9 | |||
| e6367da286 | |||
| 01f4480a08 |
17
CHANGELOG.md
17
CHANGELOG.md
@@ -2,6 +2,23 @@
|
|||||||
Changelog
|
Changelog
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
[v1.0.2.0][v1.0.2.0] (2025-11-10) {#v1.0.2.0}
|
||||||
|
---------------------------------------------
|
||||||
|
|
||||||
|
### Neue Funktionen {#v1.0.2.0-features}
|
||||||
|
|
||||||
|
* Im Mitglieder-Fenster (`MemberAdminWindow`) können Kontaktdaten der Mitglieder als .vcf-Datei exportiert werden. (01f4480a08, 9dc225d3e4)
|
||||||
|
|
||||||
|
### Sonstiges {#v1.0.2.0-misc}
|
||||||
|
|
||||||
|
* Wenn ein Serial-/COM-Port-USB-Adapter an- oder abgesteckt wird, wird das nun automatisch erkannt. (e6367da286)
|
||||||
|
* Abhängigkeiten aktualisiert. (b10c744bf9, 0d513f7bff)
|
||||||
|
|
||||||
|
[v1.0.2.0]: https://git.necronda.net/winzer/elwig/releases/tag/v1.0.2.0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[v1.0.1.5][v1.0.1.5] (2025-10-29) {#v1.0.1.5}
|
[v1.0.1.5][v1.0.1.5] (2025-10-29) {#v1.0.1.5}
|
||||||
---------------------------------------------
|
---------------------------------------------
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ namespace Elwig {
|
|||||||
public static bool ForceShutdown { get; private set; } = false;
|
public static bool ForceShutdown { get; private set; } = false;
|
||||||
|
|
||||||
private readonly DispatcherTimer _autoUpdateTimer = new() { Interval = TimeSpan.FromHours(1) };
|
private readonly DispatcherTimer _autoUpdateTimer = new() { Interval = TimeSpan.FromHours(1) };
|
||||||
|
public readonly SerialPortWatcher SerialPortWatcher = new();
|
||||||
|
|
||||||
public static readonly string DataPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "Elwig");
|
public static readonly string DataPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "Elwig");
|
||||||
public static readonly string MailsPath = Path.Combine(DataPath, "mails");
|
public static readonly string MailsPath = Path.Combine(DataPath, "mails");
|
||||||
@@ -48,9 +49,10 @@ namespace Elwig {
|
|||||||
public static string? BranchPhoneNr { get; private set; }
|
public static string? BranchPhoneNr { get; private set; }
|
||||||
public static string? BranchFaxNr { get; private set; }
|
public static string? BranchFaxNr { get; private set; }
|
||||||
public static string? BranchMobileNr { get; private set; }
|
public static string? BranchMobileNr { get; private set; }
|
||||||
public static IList<IScale> Scales { get; private set; }
|
|
||||||
public static IList<ICommandScale> CommandScales => Scales.Where(s => s is ICommandScale).Cast<ICommandScale>().ToList();
|
public static IList<IScale> Scales { get; private set; } = [];
|
||||||
public static IList<IEventScale> EventScales => Scales.Where(s => s is IEventScale).Cast<IEventScale>().ToList();
|
public static IList<ICommandScale> CommandScales => [.. Scales.Where(s => s is ICommandScale).Cast<ICommandScale>()];
|
||||||
|
public static IList<IEventScale> EventScales => [.. Scales.Where(s => s is IEventScale).Cast<IEventScale>()];
|
||||||
public static ClientParameters Client { get; set; }
|
public static ClientParameters Client { get; set; }
|
||||||
|
|
||||||
public static Dispatcher MainDispatcher { get; private set; }
|
public static Dispatcher MainDispatcher { get; private set; }
|
||||||
@@ -137,6 +139,9 @@ namespace Elwig {
|
|||||||
_autoUpdateTimer.Start();
|
_autoUpdateTimer.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SerialPortWatcher.SerialPortConnected += OnSerialPortConnected;
|
||||||
|
SerialPortWatcher.SerialPortDisconnected += OnSerialPortDisconnected;
|
||||||
|
|
||||||
var list = new List<IScale>();
|
var list = new List<IScale>();
|
||||||
foreach (var s in Config.Scales) {
|
foreach (var s in Config.Scales) {
|
||||||
try {
|
try {
|
||||||
@@ -144,7 +149,7 @@ namespace Elwig {
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
list.Add(new InvalidScale(s.Id));
|
list.Add(new InvalidScale(s.Id));
|
||||||
if (s.Required)
|
if (s.Required)
|
||||||
MessageBox.Show($"Unable to create scale {s.Id}:\n\n{e.Message}", "Scale Error",
|
MessageBox.Show($"Verbindung zu Waage {s.Id} konnte nicht hergestellt werden:\n\n{e.Message}", "Waagen-Fehler",
|
||||||
MessageBoxButton.OK, MessageBoxImage.Error);
|
MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -152,7 +157,7 @@ namespace Elwig {
|
|||||||
|
|
||||||
if (Config.Branch != null) {
|
if (Config.Branch != null) {
|
||||||
if (!branches.ContainsKey(Config.Branch.ToLower())) {
|
if (!branches.ContainsKey(Config.Branch.ToLower())) {
|
||||||
MessageBox.Show("Invalid branch name in config!", "Invalid Branch Config", MessageBoxButton.OK, MessageBoxImage.Error);
|
MessageBox.Show("Ungültige Zweigstelle in Konfigurationsdatei!", "Ungültige Zweigstelle", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
Shutdown();
|
Shutdown();
|
||||||
} else {
|
} else {
|
||||||
SetBranch(branches[Config.Branch.ToLower()]);
|
SetBranch(branches[Config.Branch.ToLower()]);
|
||||||
@@ -160,7 +165,7 @@ namespace Elwig {
|
|||||||
} else if (branches.Count == 1) {
|
} else if (branches.Count == 1) {
|
||||||
SetBranch(branches.First().Value);
|
SetBranch(branches.First().Value);
|
||||||
} else {
|
} else {
|
||||||
MessageBox.Show("Unable to determine local branch!", "Invalid Branch Config", MessageBoxButton.OK, MessageBoxImage.Error);
|
MessageBox.Show("Erkennen der lokalen Zweigstelle nicht möglich!", "Ungültige Zweigstelle", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
Shutdown();
|
Shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -181,6 +186,7 @@ namespace Elwig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private async void Application_Exit(object sender, ExitEventArgs evt) {
|
private async void Application_Exit(object sender, ExitEventArgs evt) {
|
||||||
|
SerialPortWatcher.Dispose();
|
||||||
foreach (var s in EventScales) {
|
foreach (var s in EventScales) {
|
||||||
s.Dispose();
|
s.Dispose();
|
||||||
}
|
}
|
||||||
@@ -240,6 +246,47 @@ namespace Elwig {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnSerialPortConnected(object? sender, string name) {
|
||||||
|
for (var i = 0; i < Config.Scales.Count; i++) {
|
||||||
|
var s = Config.Scales[i];
|
||||||
|
if ((s.Connection?.StartsWith($"serial://{name}:") ?? false) && Scales[i] is InvalidScale) {
|
||||||
|
try {
|
||||||
|
Scales[i] = Scale.FromConfig(s);
|
||||||
|
MessageBox.Show($"Verbindung zu Waage {s.Id} wieder hergestellt!", $"Waage {s.Id}", MessageBoxButton.OK, MessageBoxImage.Information);
|
||||||
|
} catch (Exception e) {
|
||||||
|
Scales[i] = new InvalidScale(s.Id);
|
||||||
|
MessageBox.Show($"Verbindung zu Waage {s.Id} konnte nicht hergestellt werden:\n\n{e.Message}", "Waagen-Fehler",
|
||||||
|
MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
UpdateScales();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnSerialPortDisconnected(object? sender, string name) {
|
||||||
|
for (var i = 0; i < Config.Scales.Count; i++) {
|
||||||
|
var s = Config.Scales[i];
|
||||||
|
if ((s.Connection?.StartsWith($"serial://{name}:") ?? false) && Scales[i] is not InvalidScale) {
|
||||||
|
MessageBox.Show($"Verbindung zu Waage {s.Id} unterbrochen!", $"Waagen {s.Id}", MessageBoxButton.OK, MessageBoxImage.Warning);
|
||||||
|
try {
|
||||||
|
Scales[i].Dispose();
|
||||||
|
} catch {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
Scales[i] = new InvalidScale(s.Id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
UpdateScales();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void UpdateScales() {
|
||||||
|
foreach (Window w in CurrentApp.Windows) {
|
||||||
|
if (w is DeliveryAdminWindow t && t.ViewModel.IsReceipt) {
|
||||||
|
t.UpdateScales();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static async Task CheckForUpdates(bool showAlert = false) {
|
public static async Task CheckForUpdates(bool showAlert = false) {
|
||||||
if (Config.UpdateUrl == null) return;
|
if (Config.UpdateUrl == null) return;
|
||||||
var latest = await Utils.GetLatestInstallerUrl(Config.UpdateUrl);
|
var latest = await Utils.GetLatestInstallerUrl(Config.UpdateUrl);
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<UseWPF>true</UseWPF>
|
<UseWPF>true</UseWPF>
|
||||||
<PreserveCompilationContext>true</PreserveCompilationContext>
|
<PreserveCompilationContext>true</PreserveCompilationContext>
|
||||||
<ApplicationIcon>Resources\Images\Elwig.ico</ApplicationIcon>
|
<ApplicationIcon>Resources\Images\Elwig.ico</ApplicationIcon>
|
||||||
<Version>1.0.1.5</Version>
|
<Version>1.0.2.0</Version>
|
||||||
<SatelliteResourceLanguages>de-AT</SatelliteResourceLanguages>
|
<SatelliteResourceLanguages>de-AT</SatelliteResourceLanguages>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
<ApplicationManifest>app.manifest</ApplicationManifest>
|
<ApplicationManifest>app.manifest</ApplicationManifest>
|
||||||
@@ -23,21 +23,22 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.0" />
|
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.0" />
|
||||||
<PackageReference Include="LinqKit" Version="1.3.8" />
|
<PackageReference Include="LinqKit" Version="1.3.8" />
|
||||||
<PackageReference Include="MailKit" Version="4.13.0" />
|
<PackageReference Include="MailKit" Version="4.14.1" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Razor.Language" Version="6.0.36" />
|
<PackageReference Include="Microsoft.AspNetCore.Razor.Language" Version="6.0.36" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="9.0.9" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="9.0.10" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="9.0.9" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="9.0.10" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Configuration.Ini" Version="9.0.9" />
|
<PackageReference Include="Microsoft.Extensions.Configuration.Ini" Version="9.0.10" />
|
||||||
<PackageReference Include="Microsoft.Web.WebView2" Version="1.0.3485.44" />
|
<PackageReference Include="Microsoft.Web.WebView2" Version="1.0.3595.46" />
|
||||||
<PackageReference Include="NJsonSchema" Version="11.4.0" />
|
<PackageReference Include="NJsonSchema" Version="11.5.2" />
|
||||||
<PackageReference Include="PdfiumViewer" Version="2.13.0" />
|
<PackageReference Include="PdfiumViewer" Version="2.13.0" />
|
||||||
<PackageReference Include="PdfiumViewer.Native.x86_64.no_v8-no_xfa" Version="2018.4.8.256" />
|
<PackageReference Include="PdfiumViewer.Native.x86_64.no_v8-no_xfa" Version="2018.4.8.256" />
|
||||||
<PackageReference Include="RazorLight" Version="2.3.1" />
|
<PackageReference Include="RazorLight" Version="2.3.1" />
|
||||||
<PackageReference Include="ScottPlot.WPF" Version="5.0.56" />
|
<PackageReference Include="ScottPlot.WPF" Version="5.1.57" />
|
||||||
<PackageReference Include="SQLitePCLRaw.bundle_e_sqlite3" Version="3.0.2" />
|
<PackageReference Include="SQLitePCLRaw.bundle_e_sqlite3" Version="3.0.2" />
|
||||||
<PackageReference Include="System.IO.Hashing" Version="9.0.9" />
|
<PackageReference Include="System.IO.Hashing" Version="9.0.10" />
|
||||||
<PackageReference Include="System.IO.Ports" Version="9.0.9" />
|
<PackageReference Include="System.IO.Ports" Version="9.0.10" />
|
||||||
<PackageReference Include="System.Text.Encoding.CodePages" Version="9.0.9" />
|
<PackageReference Include="System.Management" Version="9.0.10" />
|
||||||
|
<PackageReference Include="System.Text.Encoding.CodePages" Version="9.0.10" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
69
Elwig/Helpers/Export/VCard.cs
Normal file
69
Elwig/Helpers/Export/VCard.cs
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
using Elwig.Models.Entities;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Elwig.Helpers.Export {
|
||||||
|
public class VCard : IExporter<Member> {
|
||||||
|
|
||||||
|
public static string FileExtension => "vcf";
|
||||||
|
|
||||||
|
private readonly StreamWriter _writer;
|
||||||
|
|
||||||
|
public VCard(string filename) : this(filename, Utils.UTF8) { }
|
||||||
|
|
||||||
|
public VCard(string filename, Encoding encoding) {
|
||||||
|
_writer = new StreamWriter(filename, false, encoding);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose() {
|
||||||
|
GC.SuppressFinalize(this);
|
||||||
|
_writer.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ValueTask DisposeAsync() {
|
||||||
|
GC.SuppressFinalize(this);
|
||||||
|
return _writer.DisposeAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task ExportAsync(IEnumerable<Member> data, IProgress<double>? progress = null) {
|
||||||
|
progress?.Report(0.0);
|
||||||
|
int count = data.Count() + 1, i = 0;
|
||||||
|
|
||||||
|
foreach (var row in data) {
|
||||||
|
var billingAddr = row.BillingAddress != null ? $"ADR;TYPE=work;LANGUAGE=de;LABEL=\"{Escape(row.BillingAddress.FullName)}\\n{Escape(row.BillingAddress.Address)}\\n{row.BillingAddress.PostalDest.AtPlz?.Plz} {Escape(row.BillingAddress.PostalDest.AtPlz?.Ort.Name)}\\nÖsterreich\":;;{Escape(row.BillingAddress.Address)};{Escape(row.BillingAddress.PostalDest.AtPlz?.Ort.Name)};;{row.BillingAddress.PostalDest.AtPlz?.Plz};Österreich\r\n" : null;
|
||||||
|
var tel = string.Join("", row.TelephoneNumbers
|
||||||
|
.Where(n => n.Type != "fax")
|
||||||
|
.Select(n => $"TEL;TYPE={(n.Type == "mobile" ? "cell" : "voice")}:{Escape(n.Number)}\r\n"));
|
||||||
|
var email = string.Join("", row.EmailAddresses.Select(a => $"EMAIL:{Escape(a.Address)}\r\n"));
|
||||||
|
await _writer.WriteLineAsync($"""
|
||||||
|
BEGIN:VCARD
|
||||||
|
VERSION:4.0
|
||||||
|
UID:mg{row.MgNr}@{App.Client.NameToken.ToLower()}.elwig.at
|
||||||
|
NOTE:MgNr. {row.MgNr}
|
||||||
|
FN:{Escape(row.AdministrativeName)}
|
||||||
|
N:{Escape(row.Name)};{Escape(row.GivenName)};{Escape(row.MiddleName)};{Escape(row.Prefix)};{Escape(row.Suffix)}
|
||||||
|
KIND:{(row.IsJuridicalPerson ? "org" : "individual")}
|
||||||
|
ADR{(billingAddr == null ? "" : ";TYPE=home")};LANGUAGE=de;LABEL="{Escape(row.Address)}\n{row.PostalDest.AtPlz?.Plz} {Escape(row.PostalDest.AtPlz?.Ort.Name)}\nÖsterreich":;;{Escape(row.Address)};{Escape(row.PostalDest.AtPlz?.Ort.Name)};;{row.PostalDest.AtPlz?.Plz};Österreich
|
||||||
|
{billingAddr}{tel}{email}REV:{row.ModifiedAt.ToUniversalTime():yyyyMMdd\THHmmss\Z}
|
||||||
|
END:VCARD
|
||||||
|
""");
|
||||||
|
progress?.Report(100.0 * ++i / count);
|
||||||
|
}
|
||||||
|
|
||||||
|
await _writer.FlushAsync();
|
||||||
|
progress?.Report(100.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Export(IEnumerable<Member> data, IProgress<double>? progress = null) {
|
||||||
|
ExportAsync(data, progress).GetAwaiter().GetResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string? Escape(string? text) {
|
||||||
|
return text?.Replace("\\", "\\\\").Replace(",", "\\,").Replace(";", "\\;").Replace("\n", "\\n").Replace("\r", "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
namespace Elwig.Helpers {
|
namespace Elwig.Helpers {
|
||||||
public enum ExportMode {
|
public enum ExportMode {
|
||||||
Show, SaveList, SavePdf, Print, Email, Export, Upload
|
Show, SaveList, SavePdf, Print, Email, Vcf, Export, Upload
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
54
Elwig/Helpers/SerialPortWatcher.cs
Normal file
54
Elwig/Helpers/SerialPortWatcher.cs
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
using System;
|
||||||
|
using System.IO.Ports;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Management;
|
||||||
|
|
||||||
|
namespace Elwig.Helpers {
|
||||||
|
public sealed class SerialPortWatcher : IDisposable {
|
||||||
|
|
||||||
|
private readonly ManagementEventWatcher _deviceArrivalWatcher;
|
||||||
|
private readonly ManagementEventWatcher _deviceRemovalWatcher;
|
||||||
|
|
||||||
|
private string[] _knownPorts;
|
||||||
|
|
||||||
|
public event EventHandler<string>? SerialPortConnected;
|
||||||
|
public event EventHandler<string>? SerialPortDisconnected;
|
||||||
|
|
||||||
|
public SerialPortWatcher() {
|
||||||
|
_knownPorts = SerialPort.GetPortNames();
|
||||||
|
_deviceArrivalWatcher = new ManagementEventWatcher("SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 2");
|
||||||
|
_deviceArrivalWatcher.EventArrived += (s, e) => OnDeviceArrived();
|
||||||
|
_deviceRemovalWatcher = new ManagementEventWatcher("SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 3");
|
||||||
|
_deviceRemovalWatcher.EventArrived += (s, e) => OnDeviceRemoved();
|
||||||
|
_deviceArrivalWatcher.Start();
|
||||||
|
_deviceRemovalWatcher.Start();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDeviceArrived() {
|
||||||
|
string[] currentPorts = SerialPort.GetPortNames();
|
||||||
|
var newPorts = currentPorts.Except(_knownPorts).ToArray();
|
||||||
|
foreach (var port in newPorts)
|
||||||
|
SerialPortConnected?.Invoke(this, port);
|
||||||
|
_knownPorts = currentPorts;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDeviceRemoved() {
|
||||||
|
string[] currentPorts = SerialPort.GetPortNames();
|
||||||
|
var removedPorts = _knownPorts.Except(currentPorts).ToArray();
|
||||||
|
foreach (var port in removedPorts)
|
||||||
|
SerialPortDisconnected?.Invoke(this, port);
|
||||||
|
_knownPorts = currentPorts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose() {
|
||||||
|
try {
|
||||||
|
_deviceArrivalWatcher?.Stop();
|
||||||
|
_deviceRemovalWatcher?.Stop();
|
||||||
|
} finally {
|
||||||
|
_deviceArrivalWatcher?.Dispose();
|
||||||
|
_deviceRemovalWatcher?.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -493,6 +493,32 @@ namespace Elwig.Services {
|
|||||||
});
|
});
|
||||||
Mouse.OverrideCursor = null;
|
Mouse.OverrideCursor = null;
|
||||||
}
|
}
|
||||||
|
} else if (mode == ExportMode.Vcf) {
|
||||||
|
var d = new SaveFileDialog() {
|
||||||
|
FileName = "Mitglieder.vcf",
|
||||||
|
DefaultExt = "vcf",
|
||||||
|
Filter = "vCard-Datei (*.vcf)|*.vcf",
|
||||||
|
Title = "Kontakte speichern unter - Elwig"
|
||||||
|
};
|
||||||
|
if (d.ShowDialog() == true) {
|
||||||
|
Mouse.OverrideCursor = Cursors.Wait;
|
||||||
|
await Task.Run(async () => {
|
||||||
|
try {
|
||||||
|
var members = await query
|
||||||
|
.OrderBy(m => m.MgNr)
|
||||||
|
.Include(m => m.BillingAddress)
|
||||||
|
.Include(m => m.TelephoneNumbers)
|
||||||
|
.Include(m => m.EmailAddresses)
|
||||||
|
.AsSplitQuery()
|
||||||
|
.ToListAsync();
|
||||||
|
using var exporter = new VCard(d.FileName);
|
||||||
|
await exporter.ExportAsync(members);
|
||||||
|
} catch (Exception exc) {
|
||||||
|
MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Mouse.OverrideCursor = null;
|
||||||
|
}
|
||||||
} else if (mode == ExportMode.Export) {
|
} else if (mode == ExportMode.Export) {
|
||||||
var d = new SaveFileDialog() {
|
var d = new SaveFileDialog() {
|
||||||
FileName = subject == ExportSubject.Selected ? $"Mitglied_{vm.SelectedMember?.MgNr}.elwig.zip" : $"Mitglieder_{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{App.ZwstId}.elwig.zip",
|
FileName = subject == ExportSubject.Selected ? $"Mitglied_{vm.SelectedMember?.MgNr}.elwig.zip" : $"Mitglieder_{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{App.ZwstId}.elwig.zip",
|
||||||
|
|||||||
@@ -1168,6 +1168,19 @@ namespace Elwig.Windows {
|
|||||||
WeighingDButton.IsEnabled = n > 3 && App.CommandScales[3].IsReady;
|
WeighingDButton.IsEnabled = n > 3 && App.CommandScales[3].IsReady;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void UpdateScales() {
|
||||||
|
if (!ViewModel.IsReceipt) return;
|
||||||
|
foreach (var s in App.EventScales) {
|
||||||
|
s.WeighingEvent -= Scale_Weighing;
|
||||||
|
s.WeighingEvent += Scale_Weighing;
|
||||||
|
}
|
||||||
|
if (WeighingManualButton.IsEnabled) {
|
||||||
|
EnableWeighingButtons();
|
||||||
|
} else {
|
||||||
|
DisableWeighingButtons();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private async Task UpdateLsNr() {
|
private async Task UpdateLsNr() {
|
||||||
if (string.IsNullOrEmpty(ViewModel.Date) || ViewModel.Branch == null) {
|
if (string.IsNullOrEmpty(ViewModel.Date) || ViewModel.Branch == null) {
|
||||||
ViewModel.LsNr = "";
|
ViewModel.LsNr = "";
|
||||||
|
|||||||
@@ -164,6 +164,14 @@
|
|||||||
<MenuItem x:Name="Menu_Export_UploadAll" Header="...von allen Mitgliedern hochladen"
|
<MenuItem x:Name="Menu_Export_UploadAll" Header="...von allen Mitgliedern hochladen"
|
||||||
Click="Menu_Export_UploadAll_Click"/>
|
Click="Menu_Export_UploadAll_Click"/>
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
|
<MenuItem Header="Kontakte">
|
||||||
|
<MenuItem x:Name="Menu_Contacts_Selected" Header="...von ausgewähltem Mitglied speichern..." IsEnabled="False"
|
||||||
|
Click="Menu_Contacts_Selected_Click"/>
|
||||||
|
<MenuItem x:Name="Menu_Contacts_Filters" Header="...aus Filtern speichern..."
|
||||||
|
Click="Menu_Contacts_Filters_Click"/>
|
||||||
|
<MenuItem x:Name="Menu_Contacts_All" Header="...von allen Mitgliedern speichern..."
|
||||||
|
Click="Menu_Contacts_All_Click"/>
|
||||||
|
</MenuItem>
|
||||||
</Menu>
|
</Menu>
|
||||||
|
|
||||||
<Grid Grid.Row="1" Margin="5,0,0,0">
|
<Grid Grid.Row="1" Margin="5,0,0,0">
|
||||||
|
|||||||
@@ -319,9 +319,11 @@ namespace Elwig.Windows {
|
|||||||
if (MemberList.SelectedItem is Member m) {
|
if (MemberList.SelectedItem is Member m) {
|
||||||
Menu_Export_ExportSelected.IsEnabled = !IsEditing && !IsCreating;
|
Menu_Export_ExportSelected.IsEnabled = !IsEditing && !IsCreating;
|
||||||
Menu_Export_UploadSelected.IsEnabled = !IsEditing && !IsCreating && App.Config.SyncUrl != null;
|
Menu_Export_UploadSelected.IsEnabled = !IsEditing && !IsCreating && App.Config.SyncUrl != null;
|
||||||
|
Menu_Contacts_Selected.IsEnabled = !IsEditing && !IsCreating;
|
||||||
} else {
|
} else {
|
||||||
Menu_Export_ExportSelected.IsEnabled = false;
|
Menu_Export_ExportSelected.IsEnabled = false;
|
||||||
Menu_Export_UploadSelected.IsEnabled = false;
|
Menu_Export_UploadSelected.IsEnabled = false;
|
||||||
|
Menu_Contacts_Selected.IsEnabled = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -649,6 +651,13 @@ namespace Elwig.Windows {
|
|||||||
await ViewModel.GenerateMemberList(MemberService.ExportSubject.Selected, ExportMode.Upload);
|
await ViewModel.GenerateMemberList(MemberService.ExportSubject.Selected, ExportMode.Upload);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async void Menu_Contacts_All_Click(object sender, RoutedEventArgs evt) =>
|
||||||
|
await ViewModel.GenerateMemberList(MemberService.ExportSubject.All, ExportMode.Vcf);
|
||||||
|
private async void Menu_Contacts_Filters_Click(object sender, RoutedEventArgs evt) =>
|
||||||
|
await ViewModel.GenerateMemberList(MemberService.ExportSubject.FromFilters, ExportMode.Vcf);
|
||||||
|
private async void Menu_Contacts_Selected_Click(object sender, RoutedEventArgs evt) =>
|
||||||
|
await ViewModel.GenerateMemberList(MemberService.ExportSubject.Selected, ExportMode.Vcf);
|
||||||
|
|
||||||
private async void Menu_List_Order_Click(object sender, RoutedEventArgs evt) {
|
private async void Menu_List_Order_Click(object sender, RoutedEventArgs evt) {
|
||||||
Menu_List.IsSubmenuOpen = true;
|
Menu_List.IsSubmenuOpen = true;
|
||||||
if (sender == Menu_List_OrderMgNr) {
|
if (sender == Menu_List_OrderMgNr) {
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ About
|
|||||||
**Product:** Elwig
|
**Product:** Elwig
|
||||||
**Description:** Electronic Management for Vintners' Cooperatives
|
**Description:** Electronic Management for Vintners' Cooperatives
|
||||||
**Type:** ERP system
|
**Type:** ERP system
|
||||||
**Version:** 1.0.1.5 ([Changelog](./CHANGELOG.md))
|
**Version:** 1.0.2.0 ([Changelog](./CHANGELOG.md))
|
||||||
**License:** [GNU General Public License 3.0 (GPLv3)](./LICENSE)
|
**License:** [GNU General Public License 3.0 (GPLv3)](./LICENSE)
|
||||||
**Website:** https://elwig.at/
|
**Website:** https://elwig.at/
|
||||||
**Source code:** https://git.necronda.net/winzer/elwig
|
**Source code:** https://git.necronda.net/winzer/elwig
|
||||||
@@ -33,7 +33,7 @@ Packaging: [WiX Toolset](https://www.firegiant.com/wixtoolset/)
|
|||||||
**Produkt:** Elwig
|
**Produkt:** Elwig
|
||||||
**Beschreibung:** Elektronische Winzergenossenschaftsverwaltung
|
**Beschreibung:** Elektronische Winzergenossenschaftsverwaltung
|
||||||
**Typ:** Warenwirtschaftssystem (ERP-System)
|
**Typ:** Warenwirtschaftssystem (ERP-System)
|
||||||
**Version:** 1.0.1.5 ([Änderungsprotokoll](./CHANGELOG.md))
|
**Version:** 1.0.2.0 ([Änderungsprotokoll](./CHANGELOG.md))
|
||||||
**Lizenz:** [GNU General Public License 3.0 (GPLv3)](./LICENSE)
|
**Lizenz:** [GNU General Public License 3.0 (GPLv3)](./LICENSE)
|
||||||
**Website:** https://elwig.at/
|
**Website:** https://elwig.at/
|
||||||
**Quellcode:** https://git.necronda.net/winzer/elwig
|
**Quellcode:** https://git.necronda.net/winzer/elwig
|
||||||
|
|||||||
@@ -19,12 +19,12 @@
|
|||||||
</Target>
|
</Target>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.0" />
|
||||||
<PackageReference Include="Appium.WebDriver" Version="4.4.5" />
|
<PackageReference Include="Appium.WebDriver" Version="4.4.5" />
|
||||||
<PackageReference Include="NReco.PdfRenderer" Version="1.6.0" />
|
<PackageReference Include="NReco.PdfRenderer" Version="1.6.0" />
|
||||||
<PackageReference Include="NUnit" Version="4.4.0" />
|
<PackageReference Include="NUnit" Version="4.4.0" />
|
||||||
<PackageReference Include="NUnit3TestAdapter" Version="5.1.0" />
|
<PackageReference Include="NUnit3TestAdapter" Version="5.2.0" />
|
||||||
<PackageReference Include="NUnit.Analyzers" Version="4.10.0">
|
<PackageReference Include="NUnit.Analyzers" Version="4.11.2">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
|
|||||||
Reference in New Issue
Block a user