Compare commits
4 Commits
itext
...
b1075d1e69
| Author | SHA1 | Date | |
|---|---|---|---|
| b1075d1e69 | |||
| cc018ded10 | |||
| 0aefab5d63 | |||
| 149f455256 |
25
CHANGELOG.md
25
CHANGELOG.md
@@ -2,6 +2,31 @@
|
|||||||
Changelog
|
Changelog
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
[v1.0.4.0][v1.0.4.0] (2026-03-16) {#v1.0.4.0}
|
||||||
|
---------------------------------------------
|
||||||
|
|
||||||
|
### Neue Funktionen {#v1.0.4.0-features}
|
||||||
|
|
||||||
|
* Im Lieferungen-Fenster (`DeliveryAdminWindow`) gibt es nun über die Menü-Leiste die Möglichkeit _Massenaktionen_ für mehrere Lieferungen durchzuführen (z.B. Attribut oder Zu-/Abschlag setzen). ([#78][i78])
|
||||||
|
|
||||||
|
### Behobene Fehler {#v1.0.4.0-bugfixes}
|
||||||
|
|
||||||
|
* Waagen mit Netzwerkschnittstelle versuchen die Verbindung nun wieder neu aufzubauen, sollte diese unterbrochen werden. ([#74][i74])
|
||||||
|
|
||||||
|
### Sonstiges {#v1.0.4.0-misc}
|
||||||
|
|
||||||
|
* Die bisher verwendeten Programm-Bibliotheken zum Erstellen von PDF-Dokumente wurden vollständig durch [iText](https://itextpdf.com/) ersetzt.
|
||||||
|
Das ermöglicht ein schnelleres, effizienteres, und stabileres Erstellen der PDF-Dokumente.
|
||||||
|
Außerdem konnte so die Größe der Installations-Datei von ~138 MB auf ~98 MB um ca. 30 % reduziert werden. (d8c967b2f2, 8054a024f4)
|
||||||
|
* Abhängigkeiten aktualisiert. (af73226c90, f4fddd111f)
|
||||||
|
|
||||||
|
[v1.0.4.0]: https://git.necronda.net/winzer/elwig/releases/tag/v1.0.4.0
|
||||||
|
[i74]: https://git.necronda.net/winzer/elwig/issues/74
|
||||||
|
[i78]: https://git.necronda.net/winzer/elwig/issues/78
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[v1.0.3.4][v1.0.3.4] (2026-02-19) {#v1.0.3.4}
|
[v1.0.3.4][v1.0.3.4] (2026-02-19) {#v1.0.3.4}
|
||||||
---------------------------------------------
|
---------------------------------------------
|
||||||
|
|
||||||
|
|||||||
@@ -120,8 +120,8 @@ namespace Elwig.Documents {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (i == p.Buckets.Length - 1) {
|
if (i == p.Buckets.Length - 1) {
|
||||||
sub.AddCell(NewTd($"{p.Weight:N0}"));
|
sub.AddCell(NewTd($"{p.Weight:N0}", right: true));
|
||||||
sub.AddCell(NewTd(p.IsNetWeight ? "\u2611" : "\u2610", 7, center: true).SetFont(SF).SetPadding(0));
|
sub.AddCell(NewTd(p.IsNetWeight ? "\u2611" : "\u2610", 7, right: true).SetFont(SF).SetPadding(0));
|
||||||
} else {
|
} else {
|
||||||
sub.AddCell(NewCell(colspan: 2));
|
sub.AddCell(NewCell(colspan: 2));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -297,7 +297,7 @@ namespace Elwig.Documents {
|
|||||||
|
|
||||||
protected Cell NewTh(string? text, float fontSize = 8, int rowspan = 1, int colspan = 1, bool left = false, bool rotated = false) {
|
protected Cell NewTh(string? text, float fontSize = 8, int rowspan = 1, int colspan = 1, bool left = false, bool rotated = false) {
|
||||||
var p = new KernedParagraph(text ?? "", fontSize);
|
var p = new KernedParagraph(text ?? "", fontSize);
|
||||||
if (rotated) p.SetRotationAngle(rotated ? 0.5 * Math.PI : 0);
|
if (rotated) p.SetRotationAngle(0.5 * Math.PI);
|
||||||
var cell = NewCell(p, rowspan: rowspan, colspan: colspan)
|
var cell = NewCell(p, rowspan: rowspan, colspan: colspan)
|
||||||
.SetTextAlignment(left ? TextAlignment.LEFT : TextAlignment.CENTER)
|
.SetTextAlignment(left ? TextAlignment.LEFT : TextAlignment.CENTER)
|
||||||
.SetVerticalAlignment(VerticalAlignment.MIDDLE)
|
.SetVerticalAlignment(VerticalAlignment.MIDDLE)
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
<UseWindowsForms>true</UseWindowsForms>
|
<UseWindowsForms>true</UseWindowsForms>
|
||||||
<PreserveCompilationContext>true</PreserveCompilationContext>
|
<PreserveCompilationContext>true</PreserveCompilationContext>
|
||||||
<ApplicationIcon>Resources\Images\Elwig.ico</ApplicationIcon>
|
<ApplicationIcon>Resources\Images\Elwig.ico</ApplicationIcon>
|
||||||
<Version>1.0.3.4</Version>
|
<Version>1.0.4.0</Version>
|
||||||
<SatelliteResourceLanguages>de-AT</SatelliteResourceLanguages>
|
<SatelliteResourceLanguages>de-AT</SatelliteResourceLanguages>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
<ApplicationManifest>app.manifest</ApplicationManifest>
|
<ApplicationManifest>app.manifest</ApplicationManifest>
|
||||||
|
|||||||
@@ -16,13 +16,13 @@
|
|||||||
<Bold>Entwickler:</Bold> Lorenz Stechauner, Thomas Hilscher<LineBreak/>
|
<Bold>Entwickler:</Bold> Lorenz Stechauner, Thomas Hilscher<LineBreak/>
|
||||||
<Bold>Kontakt:</Bold> <Hyperlink NavigateUri="mailto:lorenz.stechauner@necronda.net" RequestNavigate="Hyperlink_RequestNavigate">lorenz.stechauner@necronda.net</Hyperlink>, <Hyperlink NavigateUri="mailto:thomas.hilscher@gmail.com" RequestNavigate="Hyperlink_RequestNavigate">thomas.hilscher@gmail.com</Hyperlink><LineBreak/>
|
<Bold>Kontakt:</Bold> <Hyperlink NavigateUri="mailto:lorenz.stechauner@necronda.net" RequestNavigate="Hyperlink_RequestNavigate">lorenz.stechauner@necronda.net</Hyperlink>, <Hyperlink NavigateUri="mailto:thomas.hilscher@gmail.com" RequestNavigate="Hyperlink_RequestNavigate">thomas.hilscher@gmail.com</Hyperlink><LineBreak/>
|
||||||
<Bold>Quellcode:</Bold> <Hyperlink NavigateUri="https://git.necronda.net/winzer/elwig" RequestNavigate="Hyperlink_RequestNavigate">https://git.necronda.net/winzer/elwig</Hyperlink><LineBreak/>
|
<Bold>Quellcode:</Bold> <Hyperlink NavigateUri="https://git.necronda.net/winzer/elwig" RequestNavigate="Hyperlink_RequestNavigate">https://git.necronda.net/winzer/elwig</Hyperlink><LineBreak/>
|
||||||
<Bold>Entwicklungszeitraum:</Bold> 2022–2025<LineBreak/>
|
<Bold>Entwicklungszeitraum:</Bold> 2022–2026<LineBreak/>
|
||||||
<LineBreak/>
|
<LineBreak/>
|
||||||
<Bold>Verwendete Technologien:</Bold><LineBreak/>
|
<Bold>Verwendete Technologien:</Bold><LineBreak/>
|
||||||
Programmiersprache: C#<LineBreak/>
|
Programmiersprache: C#<LineBreak/>
|
||||||
Framework: Windows Presentation Framework (WPF)<LineBreak/>
|
Framework: Windows Presentation Framework (WPF)<LineBreak/>
|
||||||
Datenbank: <Hyperlink NavigateUri="https://sqlite.org/" RequestNavigate="Hyperlink_RequestNavigate">SQLite</Hyperlink><LineBreak/>
|
Datenbank: <Hyperlink NavigateUri="https://sqlite.org/" RequestNavigate="Hyperlink_RequestNavigate">SQLite</Hyperlink><LineBreak/>
|
||||||
PDF-Erstellung: <Hyperlink NavigateUri="https://itextpdf.com/" RequestNavigate="Hyperlink_RequestNavigate">iText</Hyperlink>, <Hyperlink NavigateUri="https://github.com/toddams/RazorLight" RequestNavigate="Hyperlink_RequestNavigate">RazorLight</Hyperlink>, <Hyperlink NavigateUri="https://github.com/bblanchon/pdfium-binaries" RequestNavigate="Hyperlink_RequestNavigate">Pdfium</Hyperlink><LineBreak/>
|
PDF-Erstellung: <Hyperlink NavigateUri="https://itextpdf.com/" RequestNavigate="Hyperlink_RequestNavigate">iText</Hyperlink>, <Hyperlink NavigateUri="https://github.com/bblanchon/pdfium-binaries" RequestNavigate="Hyperlink_RequestNavigate">Pdfium</Hyperlink><LineBreak/>
|
||||||
Paketierung: <Hyperlink NavigateUri="https://www.firegiant.com/wixtoolset/" RequestNavigate="Hyperlink_RequestNavigate">WiX Toolset</Hyperlink>
|
Paketierung: <Hyperlink NavigateUri="https://www.firegiant.com/wixtoolset/" RequestNavigate="Hyperlink_RequestNavigate">WiX Toolset</Hyperlink>
|
||||||
</TextBlock>
|
</TextBlock>
|
||||||
|
|
||||||
|
|||||||
@@ -287,8 +287,7 @@ namespace Elwig.Windows {
|
|||||||
LockInputs();
|
LockInputs();
|
||||||
UnlockSearchInputs();
|
UnlockSearchInputs();
|
||||||
FinishInputFilling();
|
FinishInputFilling();
|
||||||
await RefreshList();
|
await EnsureContextRenewed();
|
||||||
RefreshInputs();
|
|
||||||
Mouse.OverrideCursor = null;
|
Mouse.OverrideCursor = null;
|
||||||
ViewModel.SearchQuery = "";
|
ViewModel.SearchQuery = "";
|
||||||
ControlUtils.SelectItem(AreaCommitmentList, AreaCommitmentList.ItemsSource.Cast<AreaCom>().Where(a => a.FbNr == fbnr).FirstOrDefault());
|
ControlUtils.SelectItem(AreaCommitmentList, AreaCommitmentList.ItemsSource.Cast<AreaCom>().Where(a => a.FbNr == fbnr).FirstOrDefault());
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ namespace Elwig.Windows {
|
|||||||
set {
|
set {
|
||||||
_lockContext = value;
|
_lockContext = value;
|
||||||
if (!_lockContext && _renewPending) {
|
if (!_lockContext && _renewPending) {
|
||||||
Dispatcher.BeginInvoke(async () => await RenewContext());
|
Dispatcher.BeginInvoke(async () => await EnsureContextRenewed());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -36,7 +36,7 @@ namespace Elwig.Windows {
|
|||||||
public async Task HintContextChange() {
|
public async Task HintContextChange() {
|
||||||
_renewPending = true;
|
_renewPending = true;
|
||||||
if (LockContext) return;
|
if (LockContext) return;
|
||||||
await RenewContext();
|
await EnsureContextRenewed();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async void OnLoaded(object? sender, RoutedEventArgs? evt) {
|
protected async void OnLoaded(object? sender, RoutedEventArgs? evt) {
|
||||||
@@ -44,7 +44,7 @@ namespace Elwig.Windows {
|
|||||||
await OnRenewContext(ctx);
|
await OnRenewContext(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async Task RenewContext() {
|
protected async Task EnsureContextRenewed() {
|
||||||
if (!_renewPending) return;
|
if (!_renewPending) return;
|
||||||
using var ctx = new AppDbContext();
|
using var ctx = new AppDbContext();
|
||||||
await OnRenewContext(ctx);
|
await OnRenewContext(ctx);
|
||||||
|
|||||||
@@ -285,17 +285,17 @@ namespace Elwig.Windows {
|
|||||||
await ViewModel.GenerateDeliveryDataList(DeliveryService.ExportSubject.FromFilters, ExportMode.SaveList);
|
await ViewModel.GenerateDeliveryDataList(DeliveryService.ExportSubject.FromFilters, ExportMode.SaveList);
|
||||||
|
|
||||||
private async void Menu_BulkAction_SetAttribute_Click(object sender, RoutedEventArgs evt) {
|
private async void Menu_BulkAction_SetAttribute_Click(object sender, RoutedEventArgs evt) {
|
||||||
if (sender is not MenuItem item) return;
|
if (IsEditing || IsCreating || sender is not MenuItem item) return;
|
||||||
await ViewModel.BulkSetAttribute(item.Header as string);
|
await ViewModel.BulkSetAttribute(item.Header as string);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void Menu_BulkAction_AddModifier_Click(object sender, RoutedEventArgs evt) {
|
private async void Menu_BulkAction_AddModifier_Click(object sender, RoutedEventArgs evt) {
|
||||||
if (sender is not MenuItem item || item.Header is not string name) return;
|
if (IsEditing || IsCreating || sender is not MenuItem item || item.Header is not string name) return;
|
||||||
await ViewModel.BulkAddModifier(name);
|
await ViewModel.BulkAddModifier(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void Menu_BulkAction_RemoveModifier_Click(object sender, RoutedEventArgs evt) {
|
private async void Menu_BulkAction_RemoveModifier_Click(object sender, RoutedEventArgs evt) {
|
||||||
if (sender is not MenuItem item || item.Header is not string name) return;
|
if (IsEditing || IsCreating || sender is not MenuItem item || item.Header is not string name) return;
|
||||||
await ViewModel.BulkRemoveModifier(name);
|
await ViewModel.BulkRemoveModifier(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -812,13 +812,11 @@ namespace Elwig.Windows {
|
|||||||
}
|
}
|
||||||
|
|
||||||
EmptyScale();
|
EmptyScale();
|
||||||
await RefreshList();
|
await EnsureContextRenewed();
|
||||||
await RefreshDeliveryParts();
|
|
||||||
Mouse.OverrideCursor = null;
|
Mouse.OverrideCursor = null;
|
||||||
ControlUtils.SelectItem(DeliveryList, p?.Delivery);
|
ControlUtils.SelectItem(DeliveryList, p?.Delivery);
|
||||||
DeliveryPartList.SelectedItem = null;
|
DeliveryPartList.SelectedItem = null;
|
||||||
DeliveryPartList.ScrollIntoView(DeliveryPartList.ItemsSource.Cast<object>().Last());
|
DeliveryPartList.ScrollIntoView(DeliveryPartList.ItemsSource.Cast<object>().Last());
|
||||||
RefreshInputs();
|
|
||||||
InitialInputs();
|
InitialInputs();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -851,8 +849,7 @@ namespace Elwig.Windows {
|
|||||||
}
|
}
|
||||||
|
|
||||||
EmptyScale();
|
EmptyScale();
|
||||||
await RefreshList();
|
await EnsureContextRenewed();
|
||||||
await RefreshDeliveryParts();
|
|
||||||
if (p?.Delivery != null) {
|
if (p?.Delivery != null) {
|
||||||
try {
|
try {
|
||||||
using var ctx = new AppDbContext();
|
using var ctx = new AppDbContext();
|
||||||
@@ -870,8 +867,7 @@ namespace Elwig.Windows {
|
|||||||
|
|
||||||
Mouse.OverrideCursor = null;
|
Mouse.OverrideCursor = null;
|
||||||
DeliveryList.SelectedItem = null;
|
DeliveryList.SelectedItem = null;
|
||||||
await RenewContext();
|
await EnsureContextRenewed();
|
||||||
RefreshInputs();
|
|
||||||
InitInputs();
|
InitInputs();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -902,7 +898,7 @@ namespace Elwig.Windows {
|
|||||||
DisableWeighingButtons();
|
DisableWeighingButtons();
|
||||||
HideFinishNewPartDeliveryCancelButtons();
|
HideFinishNewPartDeliveryCancelButtons();
|
||||||
ShowNewEditDeleteButtons();
|
ShowNewEditDeleteButtons();
|
||||||
await RenewContext();
|
await EnsureContextRenewed();
|
||||||
RefreshInputs();
|
RefreshInputs();
|
||||||
ClearInputStates();
|
ClearInputStates();
|
||||||
LockInputs();
|
LockInputs();
|
||||||
@@ -1082,9 +1078,7 @@ namespace Elwig.Windows {
|
|||||||
LockInputs();
|
LockInputs();
|
||||||
UnlockSearchInputs();
|
UnlockSearchInputs();
|
||||||
FinishInputFilling();
|
FinishInputFilling();
|
||||||
await RefreshList();
|
await EnsureContextRenewed();
|
||||||
await RefreshDeliveryParts();
|
|
||||||
RefreshInputs();
|
|
||||||
|
|
||||||
Mouse.OverrideCursor = null;
|
Mouse.OverrideCursor = null;
|
||||||
DepreciateButton.IsEnabled = true;
|
DepreciateButton.IsEnabled = true;
|
||||||
@@ -1184,6 +1178,9 @@ namespace Elwig.Windows {
|
|||||||
SeasonInput.IsEnabled = false;
|
SeasonInput.IsEnabled = false;
|
||||||
TodayOnlyInput.IsEnabled = false;
|
TodayOnlyInput.IsEnabled = false;
|
||||||
AllSeasonsInput.IsEnabled = false;
|
AllSeasonsInput.IsEnabled = false;
|
||||||
|
Menu_BulkAction_SetAttribute.IsEnabled = false;
|
||||||
|
Menu_BulkAction_AddModifier.IsEnabled = false;
|
||||||
|
Menu_BulkAction_RemoveModifier.IsEnabled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UnlockSearchInputs() {
|
private void UnlockSearchInputs() {
|
||||||
@@ -1191,6 +1188,9 @@ namespace Elwig.Windows {
|
|||||||
SeasonInput.IsEnabled = true;
|
SeasonInput.IsEnabled = true;
|
||||||
TodayOnlyInput.IsEnabled = true;
|
TodayOnlyInput.IsEnabled = true;
|
||||||
AllSeasonsInput.IsEnabled = (ViewModel.FilterMember != null);
|
AllSeasonsInput.IsEnabled = (ViewModel.FilterMember != null);
|
||||||
|
Menu_BulkAction_SetAttribute.IsEnabled = true;
|
||||||
|
Menu_BulkAction_AddModifier.IsEnabled = true;
|
||||||
|
Menu_BulkAction_RemoveModifier.IsEnabled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
new protected void UnlockInputs() {
|
new protected void UnlockInputs() {
|
||||||
|
|||||||
@@ -374,8 +374,7 @@ namespace Elwig.Windows {
|
|||||||
LockInputs();
|
LockInputs();
|
||||||
ViewModel.EnableSearchInputs = true;
|
ViewModel.EnableSearchInputs = true;
|
||||||
FinishInputFilling();
|
FinishInputFilling();
|
||||||
await RefreshList();
|
await EnsureContextRenewed();
|
||||||
RefreshInputs();
|
|
||||||
ViewModel.SearchQuery = "";
|
ViewModel.SearchQuery = "";
|
||||||
ControlUtils.SelectItemWithPk(DeliveryScheduleList, year, dsnr);
|
ControlUtils.SelectItemWithPk(DeliveryScheduleList, year, dsnr);
|
||||||
if (sortid != null)
|
if (sortid != null)
|
||||||
|
|||||||
@@ -225,8 +225,7 @@ namespace Elwig.Windows {
|
|||||||
LockInputs();
|
LockInputs();
|
||||||
ViewModel.EnableSearchInputs = true;
|
ViewModel.EnableSearchInputs = true;
|
||||||
FinishInputFilling();
|
FinishInputFilling();
|
||||||
await RefreshList();
|
await EnsureContextRenewed();
|
||||||
RefreshInputs();
|
|
||||||
ViewModel.SearchQuery = "";
|
ViewModel.SearchQuery = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -436,8 +436,7 @@ namespace Elwig.Windows {
|
|||||||
UpdateContactInfoVisibility();
|
UpdateContactInfoVisibility();
|
||||||
ViewModel.EnableSearchInputs = true;
|
ViewModel.EnableSearchInputs = true;
|
||||||
FinishInputFilling();
|
FinishInputFilling();
|
||||||
await RefreshList();
|
await EnsureContextRenewed();
|
||||||
RefreshInputs();
|
|
||||||
ViewModel.SearchQuery = "";
|
ViewModel.SearchQuery = "";
|
||||||
Mouse.OverrideCursor = null;
|
Mouse.OverrideCursor = null;
|
||||||
if (mgnr is int m)
|
if (mgnr is int m)
|
||||||
|
|||||||
12
README.md
12
README.md
@@ -13,17 +13,17 @@ 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.3.4 ([Changelog](./CHANGELOG.md))
|
**Version:** 1.0.4.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
|
||||||
**Developement period:** 2022–2025
|
**Developement period:** 2022–2026
|
||||||
|
|
||||||
**Technology Stack:**
|
**Technology Stack:**
|
||||||
Language: C#
|
Language: C#
|
||||||
Framework: Windows Presentation Framework (WPF)
|
Framework: Windows Presentation Framework (WPF)
|
||||||
Database: [SQLite](https://sqlite.org/)
|
Database: [SQLite](https://sqlite.org/)
|
||||||
PDF creation: [WeasyPrint](https://weasyprint.org/), [RazorLight](https://github.com/toddams/RazorLight), [PdfiumViewer](https://github.com/pvginkel/PdfiumViewer)
|
PDF creation: [iText](https://itextpdf.com/), [Pdfium](https://github.com/bblanchon/pdfium-binaries)
|
||||||
Packaging: [WiX Toolset](https://www.firegiant.com/wixtoolset/)
|
Packaging: [WiX Toolset](https://www.firegiant.com/wixtoolset/)
|
||||||
|
|
||||||
|
|
||||||
@@ -33,15 +33,15 @@ 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.3.4 ([Änderungsprotokoll](./CHANGELOG.md))
|
**Version:** 1.0.4.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
|
||||||
**Entwicklungszeitraum:** 2022–2025
|
**Entwicklungszeitraum:** 2022–2026
|
||||||
|
|
||||||
**Verwendete Technologien:**
|
**Verwendete Technologien:**
|
||||||
Programmiersprache: C#
|
Programmiersprache: C#
|
||||||
Framework: Windows Presentation Framework (WPF)
|
Framework: Windows Presentation Framework (WPF)
|
||||||
Datenbank: [SQLite](https://sqlite.org/)
|
Datenbank: [SQLite](https://sqlite.org/)
|
||||||
PDF-Erstellung: [iText](https://itextpdf.com/), [RazorLight](https://github.com/toddams/RazorLight), [Pdfium](https://github.com/bblanchon/pdfium-binaries)
|
PDF-Erstellung: [iText](https://itextpdf.com/), [Pdfium](https://github.com/bblanchon/pdfium-binaries)
|
||||||
Paketierung: [WiX Toolset](https://www.firegiant.com/wixtoolset/)
|
Paketierung: [WiX Toolset](https://www.firegiant.com/wixtoolset/)
|
||||||
|
|||||||
Reference in New Issue
Block a user