40 Commits

Author SHA1 Message Date
fierke 1f73238216 [chore:] adapt button enabeling to existance of PersonErrors 2026-06-09 12:38:20 +02:00
fierke 1d0876fa40 [feat:] descriptive info on address-set-functions 2026-06-09 12:26:54 +02:00
fierke db6624e5bc [chore:] basic international pdf generating that fits DPs template better 2026-06-09 09:04:47 +02:00
fierke f8aab88a04 [chore:] added "PRESSE/ELN" text 2026-06-09 08:56:43 +02:00
fierke 4d71fb21ea {fix:] treeview was not scrollable 2026-06-09 08:49:06 +02:00
fierke fd1cf6c3e3 [chore:] better ui alignment (global settings) 2026-06-09 08:30:48 +02:00
fierke 9bbda4e2b9 [chore:] removed font-path support (since it was never implemented) 2026-06-09 08:26:32 +02:00
fierke 097e0c175b [feat:] refresh wiki nav tree manually (and file/folder-add icons) 2026-06-09 08:23:09 +02:00
fierke 1491f60791 [fix:] added unversioned file... 2026-06-08 15:31:41 +02:00
fierke 1ce0e2de8d [feat:] initial version of DP-compatible running sheets (germany) 2026-06-08 13:33:56 +02:00
fierke e62861a25b [fix:] international postcodes were trimmed as if they are german 2026-06-08 11:35:28 +02:00
fierke e3cdb61932 [feat:] international running sheet creation (unpolished, but therefore we need aditional information) 2026-06-08 11:35:03 +02:00
fierke a2d0b72899 [feat:] include Markdown.Avalonia for better rendering 2026-06-08 09:05:12 +02:00
fierke acaf0856ed [chore:] filter by germany for running-sheet creation 2026-06-08 08:52:46 +02:00
fierke 2da822e0e7 [chore:] added IsGermany()-function 2026-06-08 08:52:06 +02:00
fierke a4c7132756 [chore:] some log changes 2026-06-04 08:42:34 +02:00
fierke c32cd44184 [fix:] missing fields from the merge 2026-06-04 08:30:36 +02:00
fierke af3f8234c0 Merge branch 'running-sheets'
# Conflicts:
#	MainWindow.axaml.cs
#	Tasks/AddressCreation.cs
#	Tasks/PdfBuilder.cs
2026-06-04 08:28:52 +02:00
fierke 516ca58740 [fix:] plz/pplz was not normalized during address creation 2026-06-04 07:52:08 +02:00
fierke c140a20549 [chore:] textbox-changements global save 2026-06-03 16:38:00 +02:00
fierke ac717c5345 [fix:] file handling 2026-06-03 16:36:36 +02:00
fierke 1b200ee41e [chore:] set used_plz 2026-06-03 16:05:11 +02:00
fierke 0750c51448 [chore:] used_plz at KasPerson for the plz used in the final address) 2026-06-03 16:05:02 +02:00
fierke 5a47fedcf0 [feat:] basic running-sheet creation implementation (buggy, because of plzs) 2026-06-03 16:04:39 +02:00
fierke b22d33dc97 [chore:] implemented GetCustomerByID() 2026-06-03 16:03:49 +02:00
fierke 8b740304f6 [fix:] running-sheet configurations are ints 2026-06-03 16:03:29 +02:00
fierke 57b4ac5001 [chore:] initial page setup (running sheets) 2026-05-27 09:06:04 +02:00
fierke 1580d30d72 [chore:] ui element disableing (customer settings) 2026-05-27 08:42:25 +02:00
fierke 0dacaf19b9 [chore:] control name 2026-05-27 08:41:42 +02:00
fierke 75b6b1dc4d [chore:] various tiny improvements 2026-05-20 08:00:20 +02:00
fierke 1161a437c4 [fix:] wiki preview reloading after saving changes 2026-05-19 09:44:14 +02:00
fierke 605ba95848 [fix:] message box center screen startup 2026-05-19 09:32:06 +02:00
fierke eb38bafd23 [feat:] delete address sets (FINALLY, this was so hard to implement, it took almost 2 minutes) 2026-05-19 09:31:35 +02:00
fierke e2d5ae2a70 Merge pull request '[fix?:] windows paths (ai-based since windows is boring)' (#57) from windows-paths into main
Reviewed-on: #57

since this still works on any linux machines and theoretical on windows machines, we're merging it to prevent wrong commits cause i configured something wrong
2026-05-19 07:24:01 +00:00
fierke 6c1d0e7a70 [chore:] initial rs pdf page builder 2026-05-13 14:26:30 +02:00
fierke a72722745b [chore:] running sheet parameters in settings 2026-05-11 17:44:38 +02:00
fierke bd565960ba [chore:] running sheet creation call 2026-05-11 17:42:14 +02:00
fierke 58fed451a1 [chore:] more running sheet frontend 2026-05-11 17:41:57 +02:00
fierke ddea77bf3f [feat:] running sheets frontend 2026-05-11 11:13:14 +02:00
fierke 0e4da1b150 [fix:] calling combinging methods used initial string-id we removed years ago 👀 2026-05-11 10:24:15 +02:00
11 changed files with 1348 additions and 410 deletions
+28
View File
@@ -178,6 +178,34 @@ public class KasPerson
public string abteilung { get; set; } public string abteilung { get; set; }
public string funktionad { get; set; } public string funktionad { get; set; }
public string used_plz { get; set; } = "";
public bool IsGermany()
{
var trimmedLand = (land ?? "").Trim();
var trimmedLowerLand = trimmedLand.ToLower();
var isGermany = trimmedLowerLand == "germany" || trimmedLowerLand == "ger" ||
trimmedLowerLand == "" || trimmedLowerLand == "de" ||
trimmedLowerLand == "deutschland";
return isGermany;
}
public static void SetUsedPLZ(int id, string plz)
{
foreach (var set in Settings._instance.addressSets.addresses)
{
foreach (var add in set.KasPersons)
{
if (add.id == id)
{
add.used_plz = plz;
return;
}
}
}
}
public static int GenerateNewID(int base_id) public static int GenerateNewID(int base_id)
{ {
//var newid = 100000 + base_id; //var newid = 100000 + base_id;
+17 -1
View File
@@ -23,7 +23,7 @@ public class Settings
public static void Save() public static void Save()
{ {
if (!Directory.Exists(Global._instance.config_path)) if (!Directory.Exists(Global._instance.config_path) && !File.Exists((Global._instance.config_path)))
Directory.CreateDirectory(Global._instance.config_path); Directory.CreateDirectory(Global._instance.config_path);
// if (!string.IsNullOrEmpty(Global._instance.config_path)) _instance.settingsPath = Global._instance.config_path; // if (!string.IsNullOrEmpty(Global._instance.config_path)) _instance.settingsPath = Global._instance.config_path;
@@ -67,6 +67,9 @@ public class PdfExportSettings
public double fontSize { get; set; } = 9; public double fontSize { get; set; } = 9;
public double smallFontSize { get; set; } = 6; public double smallFontSize { get; set; } = 6;
public bool exportRunningSheets { get; set; } = true;
public int rsNumGrouped { get; set; } = 25;
public int rsPlzStartpoint { get; set; } = 2;
} }
public class Global public class Global
@@ -169,6 +172,19 @@ public class Customer
public char separator { get; set; } = ','; public char separator { get; set; } = ',';
public int ID { get; } public int ID { get; }
public static Customer GetCustomerByID(int id)
{
foreach (var customer in Settings._instance.customers.customers)
{
if (id == customer.ID)
{
return customer;
}
}
return null;
}
// public static int GetIDByCustomerListItem(string item_content) // public static int GetIDByCustomerListItem(string item_content)
// { // {
+1
View File
@@ -21,6 +21,7 @@
</PackageReference> </PackageReference>
<PackageReference Include="ISO3166" Version="1.0.4" /> <PackageReference Include="ISO3166" Version="1.0.4" />
<PackageReference Include="Lucide.Avalonia" Version="0.1.35" /> <PackageReference Include="Lucide.Avalonia" Version="0.1.35" />
<PackageReference Include="Markdown.Avalonia" Version="11.0.3" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
<PackageReference Include="PdfSharp" Version="6.1.1" /> <PackageReference Include="PdfSharp" Version="6.1.1" />
</ItemGroup> </ItemGroup>
+80 -47
View File
@@ -2,6 +2,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:md="https://github.com/whistyun/Markdown.Avalonia"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
MinWidth="1000" MinHeight="600" IsVisible="False" MinWidth="1000" MinHeight="600" IsVisible="False"
x:Class="Logof_Client.MainWindow" WindowState="Maximized" Icon="assets/icon.ico" x:Class="Logof_Client.MainWindow" WindowState="Maximized" Icon="assets/icon.ico"
@@ -78,7 +79,7 @@
</StackPanel> </StackPanel>
</MenuItem.Header> </MenuItem.Header>
</MenuItem> </MenuItem>
<MenuItem x:Name="MnIAdSetDelete" Click="MnIAdSetRename_OnClick" IsEnabled="False"> <MenuItem x:Name="MnIAdSetDelete" Click="MnIAdSetDelete_OnClick" IsEnabled="True">
<MenuItem.Header> <MenuItem.Header>
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<LucideIcon Kind="Trash" Width="12" Height="12" Size="12" /> <LucideIcon Kind="Trash" Width="12" Height="12" Size="12" />
@@ -103,52 +104,67 @@
<StackPanel Grid.Row="1" Orientation="Horizontal" Spacing="10" HorizontalAlignment="Center" <StackPanel Grid.Row="1" Orientation="Horizontal" Spacing="10" HorizontalAlignment="Center"
Margin="0,0,5,0"> Margin="0,0,5,0">
<Button Width="250" HorizontalContentAlignment="Center" <Button Width="250" HorizontalContentAlignment="Center"
Margin="0,0,0,10" IsEnabled="False" Margin="0,0,0,10" IsEnabled="False" VerticalAlignment="Stretch"
x:Name="BtnCheck" Click="BtnCheck_OnClick"> x:Name="BtnCheck" Click="BtnCheck_OnClick">
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<LucideIcon Kind="SpellCheck" Width="36" Height="36" /> <LucideIcon Kind="SpellCheck" Width="36" Height="36" />
<Label Content="Prüfen" VerticalContentAlignment="Center" FontSize="15" <Label Content="Prüfen" VerticalContentAlignment="Center" FontSize="15"
FontWeight="Bold" /> FontWeight="Bold" />
</StackPanel> </StackPanel>
<TextBlock TextWrapping="Wrap" FontSize="9" Text="Prüft alle Adressen auf Fehler." HorizontalAlignment="Stretch" TextAlignment="Left"></TextBlock>
</StackPanel>
</Button> </Button>
<Button Width="250" IsEnabled="False" <Button Width="250" IsEnabled="False"
HorizontalContentAlignment="Center" HorizontalContentAlignment="Center"
Click="BtnCombine_OnClick" x:Name="BtnCombine" Click="BtnCombine_OnClick" x:Name="BtnCombine" VerticalAlignment="Stretch"
Margin="0,0,0,10"> Margin="0,0,0,10">
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<LucideIcon Kind="Combine" Width="36" Height="36" /> <LucideIcon Kind="Combine" Width="36" Height="36" />
<Label Content="Zusammenführen" VerticalContentAlignment="Center" FontSize="15" <Label Content="Zusammenführen" VerticalContentAlignment="Center" FontSize="15"
FontWeight="Bold" /> FontWeight="Bold" />
</StackPanel> </StackPanel>
<TextBlock TextWrapping="Wrap" FontSize="9" Text="Führt mehrere Adress-Sets auf verschiedene Art und Weise zusammen." HorizontalAlignment="Stretch" TextAlignment="Left"></TextBlock>
</StackPanel>
</Button> </Button>
<Button Width="250" IsEnabled="False" Click="BtnShorten_OnClick" <Button Width="250" IsEnabled="False" Click="BtnShorten_OnClick"
HorizontalContentAlignment="Center" x:Name="BtnShorten" HorizontalContentAlignment="Center" x:Name="BtnShorten" VerticalAlignment="Stretch"
Margin="0,0,0,10"> Margin="0,0,0,10">
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<LucideIcon Kind="ListX" Width="36" Height="36" /> <LucideIcon Kind="ListX" Width="36" Height="36" />
<Label Content="Kürzen" VerticalContentAlignment="Center" FontSize="15" <Label Content="Kürzen" VerticalContentAlignment="Center" FontSize="15"
FontWeight="Bold" /> FontWeight="Bold" />
</StackPanel> </StackPanel>
<TextBlock TextWrapping="Wrap" FontSize="9" Text="Entfernt alle Fehlerhaften Adressen (ggf. bitte vorher Reparieren). Setzt Prüfung voraus." HorizontalAlignment="Stretch" TextAlignment="Left"></TextBlock>
</StackPanel>
</Button> </Button>
<Button Width="250" IsEnabled="False" <Button Width="250" IsEnabled="False"
Click="BtnGenerateLabels_OnClick" Click="BtnGenerateLabels_OnClick"
HorizontalContentAlignment="Center" x:Name="BtnGenerateLabels" HorizontalContentAlignment="Center" x:Name="BtnGenerateLabels" VerticalAlignment="Stretch"
Margin="0,0,0,10"> Margin="0,0,0,10">
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<LucideIcon Kind="Tags" Width="36" Height="36" /> <LucideIcon Kind="Tags" Width="36" Height="36" />
<Label Content="Etiketten generieren" VerticalContentAlignment="Center" <Label Content="Etiketten generieren" VerticalContentAlignment="Center"
FontSize="15" FontSize="15"
FontWeight="Bold" /> FontWeight="Bold" />
</StackPanel> </StackPanel>
<TextBlock TextWrapping="Wrap" FontSize="9" Text="Generiert Versandetiketten und Bundleitzettel" HorizontalAlignment="Stretch" TextAlignment="Left"></TextBlock>
</StackPanel>
</Button> </Button>
<Button Width="250" IsEnabled="False" <Button Width="250" IsEnabled="False"
HorizontalContentAlignment="Center" x:Name="BtnRepair" HorizontalContentAlignment="Center" x:Name="BtnRepair" VerticalAlignment="Stretch"
Margin="0,0,0,10"> Margin="0,0,0,10">
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<LucideIcon Kind="Hammer" Width="36" Height="36" /> <LucideIcon Kind="Hammer" Width="36" Height="36" />
<Label Content="Reparieren" VerticalContentAlignment="Center" FontSize="15" <Label Content="Reparieren" VerticalContentAlignment="Center" FontSize="15"
FontWeight="Bold" /> FontWeight="Bold" />
</StackPanel> </StackPanel>
<TextBlock TextWrapping="Wrap" FontSize="9" Text="Versucht, verschiedene Adressaspekte zu reparieren. Setzt Prüfung voraus." HorizontalAlignment="Stretch" TextAlignment="Left"></TextBlock>
</StackPanel>
</Button> </Button>
</StackPanel> </StackPanel>
<!-- </Grid> --> <!-- </Grid> -->
@@ -254,6 +270,7 @@
<Label Grid.Column="0" Content="Zellenrand rechts (mm)"></Label> <Label Grid.Column="0" Content="Zellenrand rechts (mm)"></Label>
<NumericUpDown Grid.Column="1" x:Name="NudExpMargCellPaddingRight" Minimum="0" Maximum="20" Value="5"></NumericUpDown> <NumericUpDown Grid.Column="1" x:Name="NudExpMargCellPaddingRight" Minimum="0" Maximum="20" Value="5"></NumericUpDown>
</Grid> </Grid>
<CheckBox Content="Laufzettel erstellen" x:Name="CbExpRnsEnable"></CheckBox>
</StackPanel> </StackPanel>
<StackPanel Grid.Column="1" Orientation="Vertical" Spacing="10"> <StackPanel Grid.Column="1" Orientation="Vertical" Spacing="10">
@@ -273,6 +290,10 @@
<Label Content="Zellenabstand links"></Label> <Label Content="Zellenabstand links"></Label>
<NumericUpDown Grid.Column="1" x:Name="TbExpMargMarginLeft" Minimum="0" Maximum="20" Value="0"></NumericUpDown> <NumericUpDown Grid.Column="1" x:Name="TbExpMargMarginLeft" Minimum="0" Maximum="20" Value="0"></NumericUpDown>
</Grid> </Grid>
<Grid ColumnDefinitions="*,*">
<Label Grid.Column="0" Content="Anzahl gruppierter Sendungen"></Label>
<NumericUpDown Grid.Column="1" x:Name="NudExpRnsPlzcount" Minimum="1" Maximum="10000" Value="25"></NumericUpDown>
</Grid>
</StackPanel> </StackPanel>
<StackPanel Grid.Column="2" Orientation="Vertical" Spacing="10"> <StackPanel Grid.Column="2" Orientation="Vertical" Spacing="10">
@@ -292,6 +313,10 @@
<Label Grid.Column="0" Content="Schriftgröße (klein)"></Label> <Label Grid.Column="0" Content="Schriftgröße (klein)"></Label>
<NumericUpDown Grid.Column="1" x:Name="NudExpMargSmallFontSize" Minimum="3" Maximum="30" Value="6"></NumericUpDown> <NumericUpDown Grid.Column="1" x:Name="NudExpMargSmallFontSize" Minimum="3" Maximum="30" Value="6"></NumericUpDown>
</Grid> </Grid>
<Grid ColumnDefinitions="*,*">
<Label Grid.Column="0" Content="Gruppierpunkt"></Label>
<NumericUpDown Grid.Column="1" x:Name="NudExpRnsPlzStartpoint" Minimum="1" Maximum="10" Value="2"></NumericUpDown>
</Grid>
</StackPanel> </StackPanel>
</Grid> </Grid>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center"> <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
@@ -334,17 +359,31 @@
</TabItem.Header> </TabItem.Header>
<Grid ColumnDefinitions="300,*"> <Grid ColumnDefinitions="300,*">
<Border Grid.Column="0" Background="#FFF" BorderBrush="#DDD" BorderThickness="0,0,1,0"> <Border Grid.Column="0" Background="#FFF" BorderBrush="#DDD" BorderThickness="0,0,1,0">
<StackPanel> <Grid RowDefinitions="Auto,*">
<StackPanel Spacing="10" Orientation="Horizontal" Margin="10"> <StackPanel Spacing="10" Orientation="Horizontal" Margin="10">
<Button Content="+ Datei" x:Name="BtnWikiAddFile" <Button x:Name="BtnWikiAddFile"
Click="BtnWikiAddFile_OnClick" /> Click="BtnWikiAddFile_OnClick">
<Button Content="+ Ordner" x:Name="BtnWikiAddFolder" <StackPanel Orientation="Horizontal">
Click="BtnWikiAddFolder_OnClick" /> <LucideIcon Kind="Plus" Width="24" Height="24" />
<LucideIcon Kind="File" Width="24" Height="24" />
</StackPanel> </StackPanel>
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"> </Button>
<TreeView Name="NavTree" Margin="10" /> <Button x:Name="BtnWikiAddFolder"
</ScrollViewer> Click="BtnWikiAddFolder_OnClick" >
<StackPanel Orientation="Horizontal">
<LucideIcon Kind="Plus" Width="24" Height="24" />
<LucideIcon Kind="Folder" Width="24" Height="24" />
</StackPanel> </StackPanel>
</Button>
<Button Click="BtnReloadWiki_OnClick" x:Name="BtnReloadWiki">
<LucideIcon Kind="RefreshCcw" Width="24" Height="24" />
</Button>
</StackPanel>
<TreeView Grid.Row="1" Name="NavTree"
Margin="10"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch" />
</Grid>
</Border> </Border>
<Grid Grid.Column="1"> <Grid Grid.Column="1">
@@ -361,9 +400,7 @@
</StackPanel> </StackPanel>
<Border Grid.Row="1" Margin="8" BorderBrush="#DDD" BorderThickness="1" CornerRadius="4"> <Border Grid.Row="1" Margin="8" BorderBrush="#DDD" BorderThickness="1" CornerRadius="4">
<ScrollViewer> <md:MarkdownScrollViewer x:Name="MsvWikiView"/>
<StackPanel Name="PreviewPanel" Margin="8" />
</ScrollViewer>
</Border> </Border>
</Grid> </Grid>
</Grid> </Grid>
@@ -386,28 +423,25 @@
<StackPanel Orientation="Vertical" Spacing="10"> <StackPanel Orientation="Vertical" Spacing="10">
<Grid ColumnDefinitions="400,*"> <Grid ColumnDefinitions="400,*">
<Label Grid.Column="0">config-Datei</Label> <Label Grid.Column="0">config-Datei</Label>
<StackPanel Grid.Column="1" Orientation="Vertical" Spacing="5"> <Grid Grid.Column="1" ColumnDefinitions="*,150">
<StackPanel Orientation="Horizontal" Spacing="5"> <TextBox x:Name="TbConfigPath" HorizontalAlignment="Stretch" TextChanged="Tb_OnTextChanged"
<TextBox x:Name="TbConfigPath" HorizontalAlignment="Stretch"
Watermark="/home/username/.config/logofclient/" /> Watermark="/home/username/.config/logofclient/" />
<Button x:Name="BtnConfigPath" HorizontalAlignment="Right"> <Button Grid.Column="1" Margin="5,0,0,0" x:Name="BtnConfigPath" HorizontalAlignment="Stretch">
<Button.Content> <Button.Content>
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<LucideIcon Kind="File" Width="16" Height="16" Size="16" /> <LucideIcon Kind="Folder" Width="16" Height="16" Size="16" />
<Label Content="Öffnen..." VerticalContentAlignment="Center" /> <Label Content="Öffnen..." VerticalContentAlignment="Center" />
</StackPanel> </StackPanel>
</Button.Content> </Button.Content>
</Button> </Button>
</StackPanel> </Grid>
</StackPanel>
</Grid> </Grid>
<Grid ColumnDefinitions="400,*"> <Grid ColumnDefinitions="400,*">
<Label Grid.Column="0">Wiki-Pfad</Label> <Label Grid.Column="0">Wiki-Pfad</Label>
<StackPanel Grid.Column="1" Orientation="Vertical" Spacing="5"> <Grid Grid.Column="1" ColumnDefinitions="*,150">
<StackPanel Orientation="Horizontal" Spacing="5"> <TextBox x:Name="TbWikiPath" HorizontalAlignment="Stretch" TextChanged="Tb_OnTextChanged"
<TextBox x:Name="TbWikiPath" HorizontalAlignment="Stretch"
Watermark="/home/username/.config/logofclient/wiki" /> Watermark="/home/username/.config/logofclient/wiki" />
<Button IsEnabled="True" x:Name="BtnWikiPath" HorizontalAlignment="Right"> <Button Grid.Column="1" Margin="5,0,0,0" IsEnabled="True" x:Name="BtnWikiPath" HorizontalAlignment="Stretch">
<Button.Content> <Button.Content>
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<LucideIcon Kind="Folder" Width="16" Height="16" Size="16" /> <LucideIcon Kind="Folder" Width="16" Height="16" Size="16" />
@@ -415,26 +449,25 @@
</StackPanel> </StackPanel>
</Button.Content> </Button.Content>
</Button> </Button>
</StackPanel>
</StackPanel>
</Grid> </Grid>
<Grid ColumnDefinitions="400,*">
<Label Grid.Column="0">Font-Pfad</Label>
<StackPanel Grid.Column="1" Orientation="Vertical" Spacing="5">
<StackPanel Orientation="Horizontal" Spacing="5">
<TextBox x:Name="TbFontPath" HorizontalAlignment="Stretch"
Watermark="[App-Direcotry]/assets/fonts/" />
<Button IsEnabled="True" x:Name="BtnFontPath" HorizontalAlignment="Right">
<Button.Content>
<StackPanel Orientation="Horizontal">
<LucideIcon Kind="Folder" Width="16" Height="16" Size="16" />
<Label Content="Öffnen..." VerticalContentAlignment="Center" />
</StackPanel>
</Button.Content>
</Button>
</StackPanel>
</StackPanel>
</Grid> </Grid>
<!-- <Grid ColumnDefinitions="400,*"> -->
<!-- <Label Grid.Column="0">Font-Pfad</Label> -->
<!-- <StackPanel Grid.Column="1" Orientation="Vertical" Spacing="5"> -->
<!-- <StackPanel Orientation="Horizontal" Spacing="5"> -->
<!-- <TextBox x:Name="TbFontPath" HorizontalAlignment="Stretch" TextChanged="Tb_OnTextChanged" -->
<!-- Watermark="[App-Direcotry]/assets/fonts/" /> -->
<!-- <Button IsEnabled="True" x:Name="BtnFontPath" HorizontalAlignment="Right"> -->
<!-- <Button.Content> -->
<!-- <StackPanel Orientation="Horizontal"> -->
<!-- <LucideIcon Kind="Folder" Width="16" Height="16" Size="16" /> -->
<!-- <Label Content="Öffnen..." VerticalContentAlignment="Center" /> -->
<!-- </StackPanel> -->
<!-- </Button.Content> -->
<!-- </Button> -->
<!-- </StackPanel> -->
<!-- </StackPanel> -->
<!-- </Grid> -->
</StackPanel> </StackPanel>
</TabItem> </TabItem>
<TabItem> <TabItem>
@@ -485,7 +518,7 @@
TextChanged="TbSettingsCustomerSenderAddress_OnTextChanged" TextChanged="TbSettingsCustomerSenderAddress_OnTextChanged"
x:Name="TbSettingsCustomerSenderAddress" /> x:Name="TbSettingsCustomerSenderAddress" />
</Grid> </Grid>
<Grid ColumnDefinitions="150,*,Auto"> <Grid ColumnDefinitions="150,*,Auto" x:Name="GrdCSVDividerButtonsAndTb">
<Label Content="CSV-Trennzeichen" /> <Label Content="CSV-Trennzeichen" />
<TextBox Grid.Column="1" Watermark="," <TextBox Grid.Column="1" Watermark=","
HorizontalAlignment="Stretch" Margin="0,0,5,0" HorizontalAlignment="Stretch" Margin="0,0,5,0"
+106 -23
View File
@@ -28,6 +28,7 @@ public partial class MainWindow : Window
Logger.Log($"Session on {DateTime.Now:G}"); Logger.Log($"Session on {DateTime.Now:G}");
Logger.Log("Initializing..."); Logger.Log("Initializing...");
InitializeComponent(); InitializeComponent();
SetSettingsCustomerEnabledState(false);
//Hide(); //Hide();
var s = new StartupWindow(); var s = new StartupWindow();
@@ -38,6 +39,11 @@ public partial class MainWindow : Window
Logger.Log("Loading settings..."); Logger.Log("Loading settings...");
Global.Load(); Global.Load();
Settings.Load(); Settings.Load();
if (!string.IsNullOrWhiteSpace(Global._instance.config_path))
TbConfigPath.Text = PathUtilities.NormalizeFileSystemPath(Global._instance.config_path);
LoadPdfExportOptions(); LoadPdfExportOptions();
HookPdfExportOptionEvents(); HookPdfExportOptionEvents();
@@ -67,7 +73,7 @@ public partial class MainWindow : Window
try try
{ {
BtnWikiPath.Click += BtnWikiPath_Click; BtnWikiPath.Click += BtnWikiPath_Click;
BtnFontPath.Click += BtnFontPath_Click; //BtnFontPath.Click += BtnFontPath_Click;
BtnConfigPath.Click += BtnConfigPath_Click; BtnConfigPath.Click += BtnConfigPath_Click;
} }
catch (Exception ex) catch (Exception ex)
@@ -132,6 +138,8 @@ public partial class MainWindow : Window
private void MnuExit_OnClick(object? sender, RoutedEventArgs e) private void MnuExit_OnClick(object? sender, RoutedEventArgs e)
{ {
Settings.Save();
Global.Save();
Environment.Exit(0); Environment.Exit(0);
} }
@@ -212,23 +220,29 @@ public partial class MainWindow : Window
private async void NavTree_SelectionChanged(object? sender, SelectionChangedEventArgs e) private async void NavTree_SelectionChanged(object? sender, SelectionChangedEventArgs e)
{
ReloadWikiItem();
}
private async void ReloadWikiItem()
{ {
if (NavTree.SelectedItem is TreeViewItem t && t.Tag is WikiItem item && !item.IsFolder) if (NavTree.SelectedItem is TreeViewItem t && t.Tag is WikiItem item && !item.IsFolder)
{ {
_selectedWikiFilePath = item.Path; _selectedWikiFilePath = item.Path;
var text = await _wikiService.LoadFileContentAsync(item.Path); var text = await _wikiService.LoadFileContentAsync(item.Path);
try MsvWikiView.Markdown = text;
{ // try
PreviewPanel.Children.Clear(); // {
var rendered = MarkdownRenderer.Render(text ?? string.Empty); // PreviewPanel.Children.Clear();
PreviewPanel.Children.Add(rendered); // var rendered = MarkdownRenderer.Render(text ?? string.Empty);
} // PreviewPanel.Children.Add(rendered);
catch (Exception ex) // }
{ // catch (Exception ex)
Logger.Log($"Error while rendering markdown: {ex.Message}", Logger.LogType.Error); // {
PreviewPanel.Children.Clear(); // Logger.Log($"Error while rendering markdown: {ex.Message}", Logger.LogType.Error);
PreviewPanel.Children.Add(new TextBlock { Text = text ?? string.Empty }); // PreviewPanel.Children.Clear();
} // PreviewPanel.Children.Add(new TextBlock { Text = text ?? string.Empty });
// }
EditButton.IsEnabled = true; EditButton.IsEnabled = true;
} }
@@ -255,6 +269,8 @@ public partial class MainWindow : Window
ExpandAndFindNode(nodes, selectPath, out var selectedNode) && ExpandAndFindNode(nodes, selectPath, out var selectedNode) &&
selectedNode != null) selectedNode != null)
NavTree.SelectedItem = selectedNode; NavTree.SelectedItem = selectedNode;
ReloadWikiItem();
}catch (Exception ex) }catch (Exception ex)
{ {
Logger.Log($"Error while populating nav tree: {ex.Message}", Logger.LogType.Error); Logger.Log($"Error while populating nav tree: {ex.Message}", Logger.LogType.Error);
@@ -388,7 +404,7 @@ public partial class MainWindow : Window
if (folder == null || folder.Count == 0) return; if (folder == null || folder.Count == 0) return;
var chosen = PathUtilities.NormalizeFileSystemPath(folder[0].Path); var chosen = PathUtilities.NormalizeFileSystemPath(folder[0].Path);
TbFontPath.Text = chosen; //TbFontPath.Text = chosen;
Global._instance.font_path = chosen; Global._instance.font_path = chosen;
Global.Save(); Global.Save();
} }
@@ -444,6 +460,7 @@ public partial class MainWindow : Window
TbSettingsCustomerDescription.Text = ""; TbSettingsCustomerDescription.Text = "";
TbSettingsCustomerName.Text = ""; TbSettingsCustomerName.Text = "";
TbSettingsCustomerPatchInfo.Text = ""; TbSettingsCustomerPatchInfo.Text = "";
TbSettingsCustomerName.Focus();
Settings.Save(); Settings.Save();
RefreshCustomerItems(); RefreshCustomerItems();
@@ -469,6 +486,7 @@ public partial class MainWindow : Window
private void LstSettingsCustomers_OnSelectionChanged(object? sender, SelectionChangedEventArgs e) private void LstSettingsCustomers_OnSelectionChanged(object? sender, SelectionChangedEventArgs e)
{ {
SetSettingsCustomerEnabledState(false);
if (LstSettingsCustomers.SelectedIndex < 0) return; if (LstSettingsCustomers.SelectedIndex < 0) return;
Settings._instance.customers.current = Settings._instance.customers.current =
((Customer)LstSettingsCustomers.SelectedItems[0]); ((Customer)LstSettingsCustomers.SelectedItems[0]);
@@ -483,9 +501,19 @@ public partial class MainWindow : Window
TbSettingsCustomerPatchInfo.Text = Settings._instance.customers.current.patch.ToString(); TbSettingsCustomerPatchInfo.Text = Settings._instance.customers.current.patch.ToString();
else else
TbSettingsCustomerPatchInfo.Text = ""; TbSettingsCustomerPatchInfo.Text = "";
SetSettingsCustomerEnabledState();
//} //}
} }
private void SetSettingsCustomerEnabledState(bool enable = true)
{
List<Object> nboom = new() { BtnSettingsImportCustomerAddressPatch, GrdCSVDividerButtonsAndTb, TbSettingsCustomerDescription, TbSettingsCustomerName, BtnDeleteCustomer, TbSettingsCustomerSenderAddress};
foreach (var obj in nboom)
{
(obj as Control).IsEnabled = enable;
}
}
private async void EditButton_Click(object? sender, RoutedEventArgs e) private async void EditButton_Click(object? sender, RoutedEventArgs e)
{ {
if (string.IsNullOrWhiteSpace(_selectedWikiFilePath)) if (string.IsNullOrWhiteSpace(_selectedWikiFilePath))
@@ -494,7 +522,13 @@ public partial class MainWindow : Window
return; return;
} }
var editedWikiFilePath = _selectedWikiFilePath;
EditorWindow ew = new(_selectedWikiFilePath); EditorWindow ew = new(_selectedWikiFilePath);
ew.Closed += (_, _) =>
{
if (!string.IsNullOrWhiteSpace(editedWikiFilePath) && File.Exists(editedWikiFilePath))
PopulateNavTree(editedWikiFilePath, editedWikiFilePath);
};
ew.Show(); ew.Show();
//await MessageBox.Show(this, "Edit feature is currently disabled.", "Edit Disabled"); //await MessageBox.Show(this, "Edit feature is currently disabled.", "Edit Disabled");
@@ -664,10 +698,23 @@ public partial class MainWindow : Window
BtnCheck.IsEnabled = true; BtnCheck.IsEnabled = true;
BtnCombine.IsEnabled = true; BtnCombine.IsEnabled = true;
BtnGenerateLabels.IsEnabled = true; BtnGenerateLabels.IsEnabled = true;
BtnShorten.IsEnabled = true;
// check for existing errors, otherwise disable the features
foreach(KasPerson pers in (LstCustomerAdressSets.SelectedItem as KasAddressList).KasPersons)
if (pers.PersonError != null)
{
BtnShorten.IsEnabled = true;
// BtnRepair.IsEnabled = true; // BtnRepair.IsEnabled = true;
// BtnShorten.IsEnabled = true; break;
}
else
{
BtnShorten.IsEnabled = false;
BtnRepair.IsEnabled = false;
}
} }
} }
@@ -739,8 +786,9 @@ public partial class MainWindow : Window
list.Add((KasAddressList)item); list.Add((KasAddressList)item);
try try
{ {
StartCombine(list, Convert.ToInt32(LstCustomers.SelectedItem), "difference", GetCombiningTyp()); StartCombine(list, Convert.ToInt32((LstCustomers.SelectedItem as Customer).ID), "difference", GetCombiningTyp());
}catch (Exception ex) }
catch (Exception ex)
{ {
Logger.Log($"Error while combining (difference): {ex.Message}", Logger.LogType.Error); Logger.Log($"Error while combining (difference): {ex.Message}", Logger.LogType.Error);
} }
@@ -769,7 +817,7 @@ public partial class MainWindow : Window
list.Add((KasAddressList)item); list.Add((KasAddressList)item);
try try
{ {
StartCombine(list, Convert.ToInt32(LstCustomers.SelectedItem.ToString().Split(" - ")[0]), "intersection", GetCombiningTyp()); StartCombine(list, Convert.ToInt32((LstCustomers.SelectedItem as Customer).ID), "intersection", GetCombiningTyp());
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -796,7 +844,7 @@ public partial class MainWindow : Window
foreach (var item in LstCustomerAdressSets.SelectedItems) foreach (var item in LstCustomerAdressSets.SelectedItems)
list.Add((KasAddressList)item); list.Add((KasAddressList)item);
StartCombine(list, Convert.ToInt32(LstCustomers.SelectedItem.ToString().Split(" - ")[0]), "symdiff", GetCombiningTyp()); StartCombine(list, Convert.ToInt32((LstCustomers.SelectedItem as Customer).ID), "symdiff", GetCombiningTyp());
} }
private async void BtnGenerateLabels_OnClick(object? sender, RoutedEventArgs e) private async void BtnGenerateLabels_OnClick(object? sender, RoutedEventArgs e)
@@ -828,13 +876,13 @@ public partial class MainWindow : Window
var filePath = await saveDialog.ShowAsync(this); var filePath = await saveDialog.ShowAsync(this);
Console.WriteLine($"RAW: {filePath}"); Logger.Log($"RAW: {filePath}");
if (!string.IsNullOrWhiteSpace(filePath)) if (!string.IsNullOrWhiteSpace(filePath))
{ {
filePath = PathUtilities.NormalizeFileSystemPath(filePath); filePath = PathUtilities.NormalizeFileSystemPath(filePath);
Console.WriteLine($"PATH: {filePath}"); Logger.Log($"PATH: {filePath}");
var builder = new PdfBuilder(Settings._instance.pdfExport); var builder = new PdfBuilder(Settings._instance.pdfExport);
@@ -844,7 +892,7 @@ public partial class MainWindow : Window
filePath filePath
); );
Console.WriteLine("PDF OK"); Logger.Log("PDF OK");
} }
} }
@@ -1237,4 +1285,39 @@ public partial class MainWindow : Window
} }
} }
private async void MnIAdSetDelete_OnClick(object? sender, RoutedEventArgs e)
{
if(await MessageBox.Show(this,"Wirklich löschen?","",MessageBoxButton.YesNo) == MessageBoxResult.Yes)
{
var cus_id = ((Customer)LstCustomers.SelectedItems[0]).ID;
var id = (LstCustomerAdressSets.SelectedItems[0] as KasAddressList).ID;
try
{
foreach (var set in Settings._instance.addressSets.addresses)
if (set.ID == id)
{
Settings._instance.addressSets.addresses.Remove(set);
Settings.Save();
RefreshAddressSetListItems(cus_id);
break;
}
}
catch (Exception ex)
{
MessageBox.Show(this, ex.StackTrace, "Fehler");
Logger.Log($"Error while deleting address set: {ex.Message}", Logger.LogType.Error);
}}
}
private void Tb_OnTextChanged(object? sender, TextChangedEventArgs e)
{
Global.Save();
}
private void BtnReloadWiki_OnClick(object? sender, RoutedEventArgs e)
{
PopulateNavTree();
}
} }
+1 -1
View File
@@ -2,7 +2,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" SizeToContent="WidthAndHeight" mc:Ignorable="d" SizeToContent="WidthAndHeight" WindowStartupLocation="CenterScreen"
x:Class="Logof_Client.MessageBox" Icon="assets/icon.ico" x:Class="Logof_Client.MessageBox" Icon="assets/icon.ico"
Title="MessageBox"> Title="MessageBox">
<StackPanel> <StackPanel>
+57
View File
@@ -0,0 +1,57 @@
using System;
using System.IO;
namespace Logof_Client;
public static class PathUtilities
{
private static readonly char[] WindowsInvalidFileNameChars =
{
'<', '>', ':', '"', '/', '\\', '|', '?', '*'
};
private static readonly string[] WindowsReservedFileNames =
{
"CON", "PRN", "AUX", "NUL",
"COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9",
"LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9"
};
public static string NormalizeFileSystemPath(string path)
{
if (string.IsNullOrWhiteSpace(path)) return path;
if (Uri.TryCreate(path, UriKind.Absolute, out var uri) && uri.IsFile)
return uri.LocalPath;
return path;
}
public static string NormalizeFileSystemPath(Uri path)
{
return path.IsFile ? path.LocalPath : path.ToString();
}
public static bool HasInvalidFileNameChars(string fileName)
{
if (string.IsNullOrWhiteSpace(fileName)) return true;
if (fileName.EndsWith(' ') || fileName.EndsWith('.')) return true;
if (fileName.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0) return true;
if (fileName.IndexOfAny(WindowsInvalidFileNameChars) >= 0) return true;
var nameWithoutExtension = Path.GetFileNameWithoutExtension(fileName);
foreach (var reservedName in WindowsReservedFileNames)
{
if (string.Equals(fileName, reservedName, StringComparison.OrdinalIgnoreCase) ||
string.Equals(nameWithoutExtension, reservedName, StringComparison.OrdinalIgnoreCase))
return true;
}
foreach (var c in fileName)
{
if (char.IsControl(c)) return true;
}
return false;
}
}
+32 -17
View File
@@ -43,8 +43,7 @@ public static class AddressCreator
public static string? CreateFinalMarkdownString(int id) public static string? CreateFinalMarkdownString(int id)
{ {
// Maximum seven lines of information // Maximum seven lines of information
try
{
// find the address // find the address
KasPerson? address = null; KasPerson? address = null;
var string_address = ""; var string_address = "";
@@ -65,12 +64,8 @@ public static class AddressCreator
// let's get started: we start from the bottom // let's get started: we start from the bottom
// if the country is not Germany, set it; try to map via Global countries alternatives -> translation // if the country is not Germany, set it; try to map via Global countries alternatives -> translation
var trimmedLand = (address.land ?? "").Trim(); var trimmedLand = (address.land ?? "").Trim();
var trimmedLowerLand = trimmedLand.ToLower();
var isGermany = trimmedLowerLand == "germany" || trimmedLowerLand == "ger" ||
trimmedLowerLand == "" || trimmedLowerLand == "de" ||
trimmedLowerLand == "deutschland";
if (!isGermany) if (!address.IsGermany())
{ {
var countryToShow = trimmedLand; // default: use raw land value var countryToShow = trimmedLand; // default: use raw land value
@@ -105,7 +100,11 @@ public static class AddressCreator
// Alternative A: pplz valid and city existing // Alternative A: pplz valid and city existing
if (!string.IsNullOrEmpty(address.ort) && CheckPLZ(address.pplz, address.land)) if (!string.IsNullOrEmpty(address.ort) && CheckPLZ(address.pplz, address.land))
{ {
string_address = address.pplz + " " + address.ort + "\n" + string_address; string pplz = address.pplz;
if (address.IsGermany()) pplz = NormalizeGermanPLZ(address.pplz);
KasPerson.SetUsedPLZ(id, pplz);
string_address = pplz + " " + address.ort + "\n" + string_address;
address_line_count++; address_line_count++;
if (!string.IsNullOrWhiteSpace(address.postfach)) if (!string.IsNullOrWhiteSpace(address.postfach))
{ {
@@ -151,7 +150,12 @@ public static class AddressCreator
} // Alternative B: plz valid and city existing } // Alternative B: plz valid and city existing
else if (!string.IsNullOrEmpty(address.ort) && CheckPLZ(address.plz, address.land)) else if (!string.IsNullOrEmpty(address.ort) && CheckPLZ(address.plz, address.land))
{ {
string_address = address.plz + " " + address.ort + "\n" + string_address; string plz = address.plz;
if (address.IsGermany()) plz = NormalizeGermanPLZ(address.plz);
KasPerson.SetUsedPLZ(id, plz);
string_address = plz + " " + address.ort + "\n" + string_address;
address_line_count++; address_line_count++;
if (!string.IsNullOrWhiteSpace(address.strasse)) if (!string.IsNullOrWhiteSpace(address.strasse))
{ {
@@ -198,13 +202,6 @@ public static class AddressCreator
if (address_line_count > 1) return string_address; if (address_line_count > 1) return string_address;
return null; return null;
} }
catch (Exception ex)
{
Logger.Log($"Error while creating markdown string: {ex.Message}", Logger.LogType.Error);
}
return null;
}
public static string CreateNameLine(string anredezus, string anrede, string titel, string vorname, string adel, public static string CreateNameLine(string anredezus, string anrede, string titel, string vorname, string adel,
string name, string namezus) string name, string namezus)
@@ -231,7 +228,6 @@ public static class AddressCreator
} }
return null; return null;
} }
/// <summary> /// <summary>
@@ -277,4 +273,23 @@ public static class AddressCreator
return false; return false;
} }
public static string NormalizeGermanPLZ(string plz)
{
if(plz.Length == 5) return plz;
if(plz.Length > 5)
{
return plz.Substring(0, 5);
}
if (plz.Length < 5)
{
int toadd = 5 - plz.Length;
for (int i = 0; i < toadd; i++)
{
plz = "0" + plz;
}
}
return plz;
}
} }
+705
View File
@@ -134,6 +134,17 @@ public class PdfBuilder
addresses.Add(addr); addresses.Add(addr);
} }
if (addresses.Count == 0)
{
MessageBox.Show(MainWindow._instance, "Keine validen Adressen konnten generiert werden. Abbruch.", "Fehler");
return;
}
CreateAddressLabelPdfWithPlaceholder(addresses, placeholderText, outputPath);
if (_settings.exportRunningSheets)
{
ExportRunningSheets(addressSetId, outputPath);
}
CreateAddressLabelPdfWithPlaceholder(addresses, placeholderText, outputPath); CreateAddressLabelPdfWithPlaceholder(addresses, placeholderText, outputPath);
} }
catch (Exception ex) catch (Exception ex)
@@ -480,4 +491,698 @@ public class PdfBuilder
if (left < 0 || top < 0 || right < 0 || bottom < 0) if (left < 0 || top < 0 || right < 0 || bottom < 0)
throw new ArgumentException("Margins cannot be negative"); throw new ArgumentException("Margins cannot be negative");
} }
public void ExportRunningSheets(int setID, string path)
{
string international_path = path;
if (path.EndsWith(".pdf"))
{
path = path.Substring(0, path.Length - 4);
international_path = path;
path = path + "-Laufzettel.pdf";
international_path = international_path + "-Laufzettel-International.pdf";
}
else
{
path = path + "-Laufzettel.pdf";
international_path = international_path + "-Laufzettel-International.pdf";
}
CreateGermanyRunningSheets(setID, path);
CreateInternationalRunningSheets(setID, international_path);
}
public void CreateGermanyRunningSheets(int setID, string path)
{
KasAddressList list = Settings._instance.addressSets.GetAddressSetByID(setID);
var document = new PdfDocument();
document.Info.Title = $"Laufzettel für {list.Name}";
document.Info.Subject = "powered by logofclient";
document.Info.Author = "logofclient";
var grouped_nums = GroupAddresses(setID).ToList();
// Zwei Tabellen pro A4-Seite
int sheets = (grouped_nums.Count + 1) / 2;
// Layout
double marginX = 20;
double marginY = 20;
double gapY = 12;
for (int pageIndex = 0; pageIndex < sheets; pageIndex++)
{
var page = document.AddPage();
page.Size = PageSize.A4;
var gfx = XGraphics.FromPdfPage(page);
double pageW = page.Width.Point;
double pageH = page.Height.Point;
double usableW = pageW - 2 * marginX;
double usableH = pageH - 2 * marginY;
double tableH = (usableH - gapY) / 2.0;
double top1 = marginY;
double top2 = marginY + tableH + gapY;
var fontLabel = new XFont("Arial", 6, XFontStyleEx.Bold);
var fontText = new XFont("Arial", 6, XFontStyleEx.Regular);
var fontBig = new XFont("Arial", 30, XFontStyleEx.Bold);
int firstIndex = pageIndex * 2;
DrawGermanyRunningSheet(
gfx,
marginX,
top1,
usableW,
tableH,
list,
grouped_nums[firstIndex],
grouped_nums,
fontLabel,
fontText,
fontBig
);
if (firstIndex + 1 < grouped_nums.Count)
{
DrawGermanyRunningSheet(
gfx,
marginX,
top2,
usableW,
tableH,
list,
grouped_nums[firstIndex + 1],
grouped_nums,
fontLabel,
fontText,
fontBig
);
}
}
document.Save(path);
}
private void DrawGermanyRunningSheet(
XGraphics gfx,
double x,
double y,
double w,
double h,
KasAddressList list,
dynamic result,
List<(int,string,string,string,int)> grouped_nums,
XFont fontLabel,
XFont fontText,
XFont fontBig)
{
double line = 1.0;
string sender = Customer.GetCustomerByID(list.owner_id)?.sender_address ?? "[Absender]";
string customerName = Customer.GetCustomerByID(list.owner_id)?.name ?? "[Kunde]";
string start = result.Item3?.ToString() ?? "[Start]";
string end = result.Item4?.ToString() ?? "[Ende]";
string amount = result.Item5?.ToString() ?? "[Anzahl]";
string groupNo = result.Item2?.ToString() ?? "[PLZ]";
string fraction = result.Item1?.ToString() ?? "[Fraktion]";
int total_frac = 0;
foreach (var item in grouped_nums)
{
if (item.Item2 == result.Item2) total_frac++;
}
// Outer border
gfx.DrawRectangle(XPens.Black, x, y, w, h);
// Row heights
double r1 = h * 0.1;
double r2 = h * 0.1;
double r3 = h * 0.54;
double r4 = h * 0.30;
// Main horizontal lines
gfx.DrawLine(XPens.Black, x, y + r1, x + w, y + r1);
gfx.DrawLine(XPens.Black, x, y + r1 + r2, x + w, y + r1 + r2);
gfx.DrawLine(XPens.Black, x, y + r1 + r2 + r3, x + w, y + r1 + r2 + r3);
// Top row columns
double c1 = w * 0.39;
double c2 = w * 0.20;
double c3 = w * 0.26;
double c4 = w * 0.15;
gfx.DrawLine(XPens.Black, x + c1, y, x + c1, y + r1);
gfx.DrawLine(XPens.Black, x + c1 + c2, y, x + c1 + c2, y + r1);
gfx.DrawLine(XPens.Black, x + c1 + c2 + c3, y, x + c1 + c2 + c3, y + r1);
// Second row columns
gfx.DrawLine(XPens.Black, x + c1, y + r1, x + c1, y + r1 + r2);
gfx.DrawLine(XPens.Black, x + c1 + c2, y + r1, x + c1 + c2, y + r1 + r2);
gfx.DrawLine(XPens.Black, x + c1 + c2 + c3, y + r1, x + c1 + c2 + c3, y + r1 + r2);
// Middle large area split
double midSplit = x + w * 0.55;
gfx.DrawLine(XPens.Black, midSplit, y + r1 + r2, midSplit, y + r1 + r2 + r3);
// Bottom section split
double leftBottomW = w * 0.42;
gfx.DrawLine(XPens.Black, x + leftBottomW, y + r1 + r2 + r3, x + leftBottomW, y + h);
// Bottom left rows
double blY1 = y + r1 + r2 + r3 + (r4 * 0.14);
double blY2 = y + r1 + r2 + r3 + (r4 * 0.28);
double blY3 = y + r1 + r2 + r3 + (r4 * 0.42);
double blY4 = y + r1 + r2 + r3 + (r4 * 0.56);
double blY5 = y + r1 + r2 + r3 + (r4 * 0.70);
gfx.DrawLine(XPens.Black, x, blY1, x + leftBottomW, blY1);
gfx.DrawLine(XPens.Black, x, blY2, x + leftBottomW, blY2);
gfx.DrawLine(XPens.Black, x, blY3, x + leftBottomW, blY3);
gfx.DrawLine(XPens.Black, x, blY4, x + leftBottomW, blY4);
gfx.DrawLine(XPens.Black, x, blY5, x + leftBottomW, blY5);
// Labels top row
gfx.DrawString("Absender:", fontLabel, XBrushes.Black, new XRect(x + 5, y + 4, c1 - 10, 14), XStringFormats.TopLeft);
gfx.DrawString("Kunden-Nr. Absender:", fontLabel, XBrushes.Black, new XRect(x + c1 + 5, y + 4, c2 - 10, 14), XStringFormats.TopLeft);
gfx.DrawString("ZKZ/Titel:", fontLabel, XBrushes.Black, new XRect(x + c1 + c2 + 5, y + 4, c3 - 10, 14), XStringFormats.TopLeft);
gfx.DrawString("Anzahl Sendungen:", fontLabel, XBrushes.Black, new XRect(x + c1 + c2 + c3 + 5, y + 4, c4 - 10, 14), XStringFormats.TopLeft);
// Values top row
gfx.DrawString(sender, fontText, XBrushes.Black, new XRect(x + 5, y + 20, c1 - 10, r1 - 22), XStringFormats.TopLeft);
gfx.DrawString("[Kunden-Nr. Absender]", fontText, XBrushes.Black, new XRect(x + c1 + 5, y + 20, c2 - 10, r1 - 22), XStringFormats.TopLeft);
gfx.DrawString("[ZKZ/Titel]", fontText, XBrushes.Black, new XRect(x + c1 + c2 + 5, y + 20, c3 - 10, r1 - 22), XStringFormats.TopLeft);
gfx.DrawString(amount, fontText, XBrushes.Black, new XRect(x + c1 + c2 + c3 + 5, y + 20, c4 - 10, r1 - 22), XStringFormats.TopLeft);
// Second row labels
gfx.DrawString("Einlieferer:", fontLabel, XBrushes.Black, new XRect(x + 5, y + r1 + 4, c1 - 10, 14), XStringFormats.TopLeft);
gfx.DrawString("Kunden-Nr. Einlieferer:", fontLabel, XBrushes.Black, new XRect(x + c1 + 5, y + r1 + 4, c2 - 10, 14), XStringFormats.TopLeft);
gfx.DrawString("Interne Vermerke:", fontLabel, XBrushes.Black, new XRect(x + c1 + c2 + 5, y + r1 + 4, c3 - 10, 14), XStringFormats.TopLeft);
gfx.DrawString("Laufzeit", fontLabel, XBrushes.Black, new XRect(x + c1 + c2 + c3 + 5, y + r1 + 4, c4 - 10, 14), XStringFormats.TopLeft);
// Second row values
gfx.DrawString(customerName, fontText, XBrushes.Black, new XRect(x + 5, y + r1 + 20, c1 - 10, r2 - 22), XStringFormats.TopLeft);
gfx.DrawString("[Kunden-Nr. Einlieferer]", fontText, XBrushes.Black, new XRect(x + c1 + 5, y + r1 + 20, c2 - 10, r2 - 22), XStringFormats.TopLeft);
gfx.DrawString("[Interne Vermerke]", fontText, XBrushes.Black, new XRect(x + c1 + c2 + 5, y + r1 + 20, c3 - 10, r2 - 22), XStringFormats.TopLeft);
gfx.DrawString("[Laufzeit]", fontText, XBrushes.Black, new XRect(x + c1 + c2 + c3 + 5, y + r1 + 20, c4 - 10, r2 - 22), XStringFormats.TopLeft);
// Middle area
gfx.DrawString(groupNo, fontBig, XBrushes.Black,
new XRect(x + 5, y + r1 + r2 + 5, w * 0.50 - 10, r3 - 10),
XStringFormats.Center);
gfx.DrawString("PRESSE/ELN", fontBig, XBrushes.Black,
new XRect(x + 5, y + r1 + r2 + 5, w * 0.50 - 10, r3 - 90),
XStringFormats.Center);
gfx.DrawString($"Fraktion {fraction}/{total_frac}", fontText, XBrushes.Black,
new XRect(x + 5, y + r1 + r2 + r3 - 18, w * 0.50 - 10, 14),
XStringFormats.CenterLeft);
gfx.DrawString("Bereich für postalische Zwecke:", fontLabel, XBrushes.Black,
new XRect(midSplit + 5, y + r1 + r2 + 4, w - (midSplit - x) - 10, 14),
XStringFormats.TopLeft);
// Bottom left labels
// Bottom left labels
gfx.DrawString("Einlieferungsdatum:", fontLabel, XBrushes.Black,
new XRect(x + 5, y + r1 + r2 + r3 + 4, leftBottomW - 10, 14),
XStringFormats.TopLeft);
gfx.DrawString("AM-Auftragsnummer:", fontLabel, XBrushes.Black,
new XRect(x + 5, blY1 + 4, leftBottomW - 10, 14),
XStringFormats.TopLeft);
gfx.DrawString("Bundgewicht:", fontLabel, XBrushes.Black,
new XRect(x + 5, blY2 + 4, leftBottomW - 10, 14),
XStringFormats.TopLeft);
gfx.DrawString("Paletten-Nr.:", fontLabel, XBrushes.Black,
new XRect(x + 5, blY3 + 4, leftBottomW - 10, 14),
XStringFormats.TopLeft);
gfx.DrawString("Bund-Nr./Bunde auf Palette:", fontLabel, XBrushes.Black,
new XRect(x + 5, blY4 + 4, leftBottomW - 10, 14),
XStringFormats.TopLeft);
gfx.DrawString("Bund-Nr. von Gesamtanzahl:", fontLabel, XBrushes.Black,
new XRect(x + 5, blY5 + 4, leftBottomW - 10, 14),
XStringFormats.TopLeft);
// Bottom placeholders rechts daneben, gleiche Zeile
double valueX = x + leftBottomW * 0.55;
double valueW = leftBottomW - (valueX - x) - 5;
gfx.DrawString("[Einlieferungsdatum]", fontText, XBrushes.Black,
new XRect(valueX, y + r1 + r2 + r3 + 4, valueW, 14),
XStringFormats.TopRight);
gfx.DrawString("[AM-Auftragsnummer]", fontText, XBrushes.Black,
new XRect(valueX, blY1 + 4, valueW, 14),
XStringFormats.TopRight);
gfx.DrawString("[Bundgewicht]", fontText, XBrushes.Black,
new XRect(valueX, blY2 + 4, valueW, 14),
XStringFormats.TopRight);
gfx.DrawString("[Paletten-Nr.]", fontText, XBrushes.Black,
new XRect(valueX, blY3 + 4, valueW, 14),
XStringFormats.TopRight);
gfx.DrawString("[Bund-Nr./Bunde auf Palette]", fontText, XBrushes.Black,
new XRect(valueX, blY4 + 4, valueW, 14),
XStringFormats.TopRight);
gfx.DrawString("[Bund-Nr. von Gesamtanzahl]", fontText, XBrushes.Black,
new XRect(valueX, blY5 + 4, valueW, 14),
XStringFormats.TopRight);
// Right bottom postal area label
gfx.DrawString("Feld für Palettenlabel/NVE:", fontLabel, XBrushes.Black,
new XRect(x + leftBottomW + 5, y + r1 + r2 + r3 + 4, w - leftBottomW - 10, 14),
XStringFormats.TopLeft);
}
// public void CreateInternationalRunningSheets(int setID, string path)
// {
// KasAddressList list = Settings._instance.addressSets.GetAddressSetByID(setID);
// var document = new PdfDocument();
// document.Info.Title = $"Laufzettel für {list.Name}";
// document.Info.Subject = "powered by logofclient";
// document.Info.Author = "logofclient";
//
// int margin = 50;
//
// var grouped_nums = GroupAddressesInternational(setID);
//
// foreach (var result in grouped_nums)
// {
// var page = document.AddPage();
// page.Size = PageSize.A4;
//
// var gfx = XGraphics.FromPdfPage(page);
//
// var width = page.Width.Point-margin;
// var height = page.Height.Point-margin;
// gfx.DrawLine(XPens.Black, margin, margin, margin, height);
// gfx.DrawLine(XPens.Black, margin, margin, width, margin);
// gfx.DrawLine(XPens.Black, width, margin, width, height);
// gfx.DrawLine(XPens.Black, margin, height, width, height);
//
// var boldfont = new XFont("Cantarell", 11, XFontStyleEx.Bold);
// var font = new XFont("Cantarell", 11, XFontStyleEx.Regular);
// var bigboldfont = new XFont("Cantarell", 35, XFontStyleEx.Bold);
//
// // Versandinfo
// gfx.DrawString($"Versand {list.Name}", boldfont, XBrushes.Black,
// new XRect(margin+5, margin, width-margin, 25), XStringFormats.CenterLeft);
// gfx.DrawString($"Start: ", font, XBrushes.Black,
// new XRect(margin+5, margin+25, width-margin, 25), XStringFormats.CenterLeft);
// gfx.DrawString($"{result.Item3}", font, XBrushes.Black,
// new XRect(margin+75, margin+25, width-margin, 25), XStringFormats.CenterLeft);
// gfx.DrawString($"Ende: ", font, XBrushes.Black,
// new XRect(margin+5, margin+40, width-margin, 25), XStringFormats.CenterLeft);
// gfx.DrawString($"{result.Item4}", font, XBrushes.Black,
// new XRect(margin+75, margin+40, width-margin, 25), XStringFormats.CenterLeft);
// gfx.DrawString($"Kunde: ", font, XBrushes.Black,
// new XRect(margin+5, margin+55, width-margin, 25), XStringFormats.CenterLeft);
// gfx.DrawString($"{Customer.GetCustomerByID(list.owner_id).name}", font, XBrushes.Black,
// new XRect(margin+75, margin+55, width-margin, 25), XStringFormats.CenterLeft);
// gfx.DrawString($"Absender: ", font, XBrushes.Black,
// new XRect(margin+5, margin+70, width-margin, 25), XStringFormats.CenterLeft);
// gfx.DrawString($"{Customer.GetCustomerByID(list.owner_id).sender_address}", font, XBrushes.Black,
// new XRect(margin+75, margin+70, width-margin, 25), XStringFormats.CenterLeft);
// gfx.DrawString($"Anzahl: ", font, XBrushes.Black,
// new XRect(margin+5, margin+85, width-margin, 25), XStringFormats.CenterLeft);
// gfx.DrawString($"{result.Item5}", font, XBrushes.Black,
// new XRect(margin+75, margin+85, width-margin, 25), XStringFormats.CenterLeft);
//
// // logofclient ad
// gfx.DrawString($"powered by logofclient", font, XBrushes.Black,
// new XRect(margin+5, height-55, width-margin, 25), XStringFormats.CenterLeft);
// gfx.DrawString($"(c) 2026 MyPapertown", font, XBrushes.Black,
// new XRect(margin+5, height-40, width-margin, 25), XStringFormats.CenterLeft);
// gfx.DrawString($"mypapercloud.de/logof", font, XBrushes.Black,
// new XRect(margin+5, height-25, width-margin, 25), XStringFormats.CenterLeft);
//
//
// int total_frac = 0;
// foreach (var item in grouped_nums)
// {
// if (item.Item2 == result.Item2) total_frac++;
// }
//
// // group number
// gfx.DrawString($"{result.Item2}", bigboldfont, XBrushes.Black,
// new XRect(margin, margin, width-margin, (height-margin)/2), XStringFormats.Center);
// gfx.DrawString($"Fraktion {result.Item1}/{total_frac}", font, XBrushes.Black,
// new XRect(margin, margin, width-margin, (height-margin)/2 + 50), XStringFormats.Center);
// }
//
// if (document.PageCount > 0)
// {
// document.Save(path);
// }
//
// }
public void CreateInternationalRunningSheets(int setID, string path)
{
KasAddressList list = Settings._instance.addressSets.GetAddressSetByID(setID);
var document = new PdfDocument();
document.Info.Title = $"Laufzettel für {list.Name}";
document.Info.Subject = "powered by logofclient";
document.Info.Author = "logofclient";
var grouped_nums = GroupAddressesInternational(setID).ToList();
int sheets = (grouped_nums.Count + 1) / 2;
double marginX = 20;
double marginY = 20;
double gapY = 12;
for (int pageIndex = 0; pageIndex < sheets; pageIndex++)
{
var page = document.AddPage();
page.Size = PageSize.A4;
var gfx = XGraphics.FromPdfPage(page);
double pageW = page.Width.Point;
double pageH = page.Height.Point;
double usableW = pageW - 2 * marginX;
double usableH = pageH - 2 * marginY;
double tableH = (usableH - gapY) / 2.0;
double top1 = marginY;
double top2 = marginY + tableH + gapY;
var fontLabel = new XFont("Arial", 6, XFontStyleEx.Bold);
var fontText = new XFont("Arial", 6, XFontStyleEx.Regular);
var fontBig = new XFont("Arial", 30, XFontStyleEx.Bold);
int firstIndex = pageIndex * 2;
DrawInternationalRunningSheet(
gfx,
marginX,
top1,
usableW,
tableH,
list,
grouped_nums[firstIndex],
grouped_nums,
fontLabel,
fontText,
fontBig
);
if (firstIndex + 1 < grouped_nums.Count)
{
DrawInternationalRunningSheet(
gfx,
marginX,
top2,
usableW,
tableH,
list,
grouped_nums[firstIndex + 1],
grouped_nums,
fontLabel,
fontText,
fontBig
);
}
}
document.Save(path);
}
private void DrawInternationalRunningSheet(
XGraphics gfx,
double x,
double y,
double w,
double h,
KasAddressList list,
dynamic result,
List<(int,string,string,string,int)> grouped_nums,
XFont fontLabel,
XFont fontText,
XFont fontBig)
{
double line = 1.0;
string sender = Customer.GetCustomerByID(list.owner_id)?.sender_address ?? "[Absender]";
string customerName = Customer.GetCustomerByID(list.owner_id)?.name ?? "[Kunde]";
string start = result.Item3?.ToString() ?? "[Start]";
string end = result.Item4?.ToString() ?? "[Ende]";
string amount = result.Item5?.ToString() ?? "[Anzahl]";
string groupNo = result.Item2?.ToString() ?? "[PLZ]";
string fraction = result.Item1?.ToString() ?? "[Fraktion]";
int total_frac = 0;
foreach (var item in grouped_nums)
{
if (item.Item2 == result.Item2) total_frac++;
}
// Outer border
gfx.DrawRectangle(XPens.Black, x, y, w, h);
// Row heights
double r1 = h * 0.1;
double r2 = h * 0.1;
double r3 = h * 0.54;
double r4 = h * 0.30;
// Main horizontal lines
gfx.DrawLine(XPens.Black, x, y + r1, x + w, y + r1);
gfx.DrawLine(XPens.Black, x, y + r1 + r2, x + w, y + r1 + r2);
gfx.DrawLine(XPens.Black, x, y + r1 + r2 + r3, x + w, y + r1 + r2 + r3);
// Top row columns
double c1 = w * 0.39;
double c2 = w * 0.20;
double c3 = w * 0.26;
double c4 = w * 0.15;
gfx.DrawLine(XPens.Black, x + c1, y, x + c1, y + r1);
gfx.DrawLine(XPens.Black, x + c1 + c2, y, x + c1 + c2, y + r1);
gfx.DrawLine(XPens.Black, x + c1 + c2 + c3, y, x + c1 + c2 + c3, y + r1);
// Second row columns
gfx.DrawLine(XPens.Black, x + c1, y + r1, x + c1, y + r1 + r2);
gfx.DrawLine(XPens.Black, x + c1 + c2, y + r1, x + c1 + c2, y + r1 + r2);
gfx.DrawLine(XPens.Black, x + c1 + c2 + c3, y + r1, x + c1 + c2 + c3, y + r1 + r2);
// Middle large area split
double midSplit = x + w * 0.55;
gfx.DrawLine(XPens.Black, midSplit, y + r1 + r2, midSplit, y + r1 + r2 + r3);
// Bottom section split
double leftBottomW = w * 0.42;
gfx.DrawLine(XPens.Black, x + leftBottomW, y + r1 + r2 + r3, x + leftBottomW, y + h);
// Bottom left rows
double blY1 = y + r1 + r2 + r3 + (r4 * 0.14);
double blY2 = y + r1 + r2 + r3 + (r4 * 0.28);
double blY3 = y + r1 + r2 + r3 + (r4 * 0.42);
double blY4 = y + r1 + r2 + r3 + (r4 * 0.56);
double blY5 = y + r1 + r2 + r3 + (r4 * 0.70);
gfx.DrawLine(XPens.Black, x, blY1, x + leftBottomW, blY1);
gfx.DrawLine(XPens.Black, x, blY2, x + leftBottomW, blY2);
gfx.DrawLine(XPens.Black, x, blY3, x + leftBottomW, blY3);
gfx.DrawLine(XPens.Black, x, blY4, x + leftBottomW, blY4);
gfx.DrawLine(XPens.Black, x, blY5, x + leftBottomW, blY5);
// Labels top row
gfx.DrawString("Absender:", fontLabel, XBrushes.Black, new XRect(x + 5, y + 4, c1 - 10, 14), XStringFormats.TopLeft);
gfx.DrawString("Kunden-Nr. Absender:", fontLabel, XBrushes.Black, new XRect(x + c1 + 5, y + 4, c2 - 10, 14), XStringFormats.TopLeft);
gfx.DrawString("ZKZ/Titel:", fontLabel, XBrushes.Black, new XRect(x + c1 + c2 + 5, y + 4, c3 - 10, 14), XStringFormats.TopLeft);
gfx.DrawString("Anzahl Sendungen:", fontLabel, XBrushes.Black, new XRect(x + c1 + c2 + c3 + 5, y + 4, c4 - 10, 14), XStringFormats.TopLeft);
// Values top row
gfx.DrawString(sender, fontText, XBrushes.Black, new XRect(x + 5, y + 20, c1 - 10, r1 - 22), XStringFormats.TopLeft);
gfx.DrawString("[Kunden-Nr. Absender]", fontText, XBrushes.Black, new XRect(x + c1 + 5, y + 20, c2 - 10, r1 - 22), XStringFormats.TopLeft);
gfx.DrawString("[ZKZ/Titel]", fontText, XBrushes.Black, new XRect(x + c1 + c2 + 5, y + 20, c3 - 10, r1 - 22), XStringFormats.TopLeft);
gfx.DrawString(amount, fontText, XBrushes.Black, new XRect(x + c1 + c2 + c3 + 5, y + 20, c4 - 10, r1 - 22), XStringFormats.TopLeft);
// Second row labels
gfx.DrawString("Einlieferer:", fontLabel, XBrushes.Black, new XRect(x + 5, y + r1 + 4, c1 - 10, 14), XStringFormats.TopLeft);
gfx.DrawString("Kunden-Nr. Einlieferer:", fontLabel, XBrushes.Black, new XRect(x + c1 + 5, y + r1 + 4, c2 - 10, 14), XStringFormats.TopLeft);
gfx.DrawString("Interne Vermerke:", fontLabel, XBrushes.Black, new XRect(x + c1 + c2 + 5, y + r1 + 4, c3 - 10, 14), XStringFormats.TopLeft);
gfx.DrawString("Laufzeit", fontLabel, XBrushes.Black, new XRect(x + c1 + c2 + c3 + 5, y + r1 + 4, c4 - 10, 14), XStringFormats.TopLeft);
// Second row values
gfx.DrawString(customerName, fontText, XBrushes.Black, new XRect(x + 5, y + r1 + 20, c1 - 10, r2 - 22), XStringFormats.TopLeft);
gfx.DrawString("[Kunden-Nr. Einlieferer]", fontText, XBrushes.Black, new XRect(x + c1 + 5, y + r1 + 20, c2 - 10, r2 - 22), XStringFormats.TopLeft);
gfx.DrawString("[Interne Vermerke]", fontText, XBrushes.Black, new XRect(x + c1 + c2 + 5, y + r1 + 20, c3 - 10, r2 - 22), XStringFormats.TopLeft);
gfx.DrawString("[Laufzeit]", fontText, XBrushes.Black, new XRect(x + c1 + c2 + c3 + 5, y + r1 + 20, c4 - 10, r2 - 22), XStringFormats.TopLeft);
// Middle area
gfx.DrawString(groupNo, fontBig, XBrushes.Black,
new XRect(x + 5, y + r1 + r2 + 5, w * 0.50 - 10, r3 - 10),
XStringFormats.Center);
gfx.DrawString("PRESSE/ELN", fontBig, XBrushes.Black,
new XRect(x + 5, y + r1 + r2 + 5, w * 0.50 - 10, r3 - 90),
XStringFormats.Center);
gfx.DrawString($"Fraktion {fraction}/{total_frac}", fontText, XBrushes.Black,
new XRect(x + 5, y + r1 + r2 + r3 - 18, w * 0.50 - 10, 14),
XStringFormats.CenterLeft);
gfx.DrawString("Bereich für postalische Zwecke:", fontLabel, XBrushes.Black,
new XRect(midSplit + 5, y + r1 + r2 + 4, w - (midSplit - x) - 10, 14),
XStringFormats.TopLeft);
// Bottom left labels
// Bottom left labels
gfx.DrawString("Einlieferungsdatum:", fontLabel, XBrushes.Black,
new XRect(x + 5, y + r1 + r2 + r3 + 4, leftBottomW - 10, 14),
XStringFormats.TopLeft);
gfx.DrawString("AM-Auftragsnummer:", fontLabel, XBrushes.Black,
new XRect(x + 5, blY1 + 4, leftBottomW - 10, 14),
XStringFormats.TopLeft);
gfx.DrawString("Bundgewicht:", fontLabel, XBrushes.Black,
new XRect(x + 5, blY2 + 4, leftBottomW - 10, 14),
XStringFormats.TopLeft);
gfx.DrawString("Paletten-Nr.:", fontLabel, XBrushes.Black,
new XRect(x + 5, blY3 + 4, leftBottomW - 10, 14),
XStringFormats.TopLeft);
gfx.DrawString("Bund-Nr./Bunde auf Palette:", fontLabel, XBrushes.Black,
new XRect(x + 5, blY4 + 4, leftBottomW - 10, 14),
XStringFormats.TopLeft);
gfx.DrawString("Bund-Nr. von Gesamtanzahl:", fontLabel, XBrushes.Black,
new XRect(x + 5, blY5 + 4, leftBottomW - 10, 14),
XStringFormats.TopLeft);
// Bottom placeholders rechts daneben, gleiche Zeile
double valueX = x + leftBottomW * 0.55;
double valueW = leftBottomW - (valueX - x) - 5;
gfx.DrawString("[Einlieferungsdatum]", fontText, XBrushes.Black,
new XRect(valueX, y + r1 + r2 + r3 + 4, valueW, 14),
XStringFormats.TopRight);
gfx.DrawString("[AM-Auftragsnummer]", fontText, XBrushes.Black,
new XRect(valueX, blY1 + 4, valueW, 14),
XStringFormats.TopRight);
gfx.DrawString("[Bundgewicht]", fontText, XBrushes.Black,
new XRect(valueX, blY2 + 4, valueW, 14),
XStringFormats.TopRight);
gfx.DrawString("[Paletten-Nr.]", fontText, XBrushes.Black,
new XRect(valueX, blY3 + 4, valueW, 14),
XStringFormats.TopRight);
gfx.DrawString("[Bund-Nr./Bunde auf Palette]", fontText, XBrushes.Black,
new XRect(valueX, blY4 + 4, valueW, 14),
XStringFormats.TopRight);
gfx.DrawString("[Bund-Nr. von Gesamtanzahl]", fontText, XBrushes.Black,
new XRect(valueX, blY5 + 4, valueW, 14),
XStringFormats.TopRight);
// Right bottom postal area label
gfx.DrawString("Feld für Palettenlabel/NVE:", fontLabel, XBrushes.Black,
new XRect(x + leftBottomW + 5, y + r1 + r2 + r3 + 4, w - leftBottomW - 10, 14),
XStringFormats.TopLeft);
}
/// <summary>
/// Calculates address groups to summarize for the single pages of the running sheets.
/// </summary>
/// <param name="setID"></param>
/// <returns>List of quadruples consisting of a number and the starting of the plz, as well as first, last plz and total amount of addresses</returns>
public List<(int, string, string, string, int)> GroupAddresses(int setID)
{
int grpcount = Settings._instance.pdfExport.rsNumGrouped; // Amount of addresses per group
int stpoint = Settings._instance.pdfExport.rsPlzStartpoint; // group starting point (first n characters of the plz)
KasAddressList list = Settings._instance.addressSets.GetAddressSetByID(setID);
if (list == null)
throw new Exception("AddressSet nicht gefunden");
List<(int, string, string, string, int)> output = new();
List<IGrouping<string, KasPerson>> sorted_list = list.KasPersons
.Where(x => !string.IsNullOrEmpty(x?.used_plz) &&
x.used_plz.Length >= stpoint && x.IsGermany())
.OrderBy(x => x.used_plz)
.GroupBy(x => x.used_plz.Substring(0, stpoint))
.ToList();
foreach (var group in sorted_list)
{
string start = group.Key;
int fraktion = 0;
for (int count = 0; count < group.Count(); count += grpcount)
{
fraktion++;
int currentGroupSize = Math.Min(grpcount, group.Count() - count);
string first = group.ElementAt(count).used_plz;
string last = group.ElementAt(count + currentGroupSize - 1).used_plz;
output.Add((fraktion, start, first, last, currentGroupSize));
}
}
return output;
}
public List<(int, string, string, string, int)> GroupAddressesInternational(int setID)
{
int grpcount = Settings._instance.pdfExport.rsNumGrouped; // Amount of addresses per group
KasAddressList list = Settings._instance.addressSets.GetAddressSetByID(setID);
if (list == null)
throw new Exception("AddressSet nicht gefunden");
List<(int, string, string, string, int)> output = new();
List<IGrouping<string, KasPerson>> sorted_list = list.KasPersons
.Where(x => !string.IsNullOrEmpty(x?.used_plz) && !x.IsGermany())
.OrderBy(x => x.used_plz)
.GroupBy(x => x.land)
.ToList();
foreach (var group in sorted_list)
{
string start = group.Key;
int fraktion = 0;
for (int count = 0; count < group.Count(); count += grpcount)
{
fraktion++;
int currentGroupSize = Math.Min(grpcount, group.Count() - count);
string first = group.ElementAt(count).used_plz;
string last = group.ElementAt(count + currentGroupSize - 1).used_plz;
output.Add((fraktion, start, first, last, currentGroupSize));
}
}
return output;
}
} }
+1 -1
View File
@@ -35,7 +35,7 @@ public partial class EditorWindow : Window
try try
{ {
File.WriteAllText(filename, TbContent.Text); File.WriteAllText(filename, TbContent.Text);
MainWindow._instance.PopulateNavTree(); MainWindow._instance.PopulateNavTree(filename, filename);
} }
catch (Exception ex) catch (Exception ex)
{ {
+126 -126
View File
@@ -11,130 +11,130 @@ namespace Logof_Client.Wiki;
public static class MarkdownRenderer public static class MarkdownRenderer
{ {
public static Control Render(string markdown) // public static Control Render(string markdown)
{ // {
try // try
{ // {
var panel = new StackPanel { Spacing = 6 }; // var panel = new StackPanel { Spacing = 6 };
if (string.IsNullOrWhiteSpace(markdown)) return panel; // if (string.IsNullOrWhiteSpace(markdown)) return panel;
//
var doc = Markdown.Parse(markdown); // var doc = Markdown.Parse(markdown);
//
foreach (var block in doc) // foreach (var block in doc)
{ // {
switch (block) // switch (block)
{ // {
case HeadingBlock hb: // case HeadingBlock hb:
{ // {
var text = GetInlineText(hb.Inline); // var text = GetInlineText(hb.Inline);
var tb = new TextBlock // var tb = new TextBlock
{ // {
Text = text, // Text = text,
FontWeight = FontWeight.Bold, // FontWeight = FontWeight.Bold,
Margin = new Avalonia.Thickness(0, hb.Level == 1 ? 6 : 2, 0, 2) // Margin = new Avalonia.Thickness(0, hb.Level == 1 ? 6 : 2, 0, 2)
}; // };
tb.FontSize = hb.Level switch { 1 => 22, 2 => 18, 3 => 16, _ => 14 }; // tb.FontSize = hb.Level switch { 1 => 22, 2 => 18, 3 => 16, _ => 14 };
panel.Children.Add(tb); // panel.Children.Add(tb);
break; // break;
} // }
//
case ParagraphBlock pb: // case ParagraphBlock pb:
{ // {
var text = GetInlineText(pb.Inline); // var text = GetInlineText(pb.Inline);
var tb = new TextBlock { Text = text, TextWrapping = Avalonia.Media.TextWrapping.Wrap }; // var tb = new TextBlock { Text = text, TextWrapping = Avalonia.Media.TextWrapping.Wrap };
panel.Children.Add(tb); // panel.Children.Add(tb);
break; // break;
} // }
//
case FencedCodeBlock cb: // case FencedCodeBlock cb:
{ // {
var sb = new StringBuilder(); // var sb = new StringBuilder();
foreach (var line in cb.Lines.Lines) // foreach (var line in cb.Lines.Lines)
{ // {
sb.Append(line.ToString()); // sb.Append(line.ToString());
} // }
var codeBox = new TextBox // var codeBox = new TextBox
{ // {
Text = sb.ToString(), // Text = sb.ToString(),
FontFamily = "Consolas, monospace", // FontFamily = "Consolas, monospace",
IsReadOnly = true, // IsReadOnly = true,
AcceptsReturn = true // AcceptsReturn = true
}; // };
panel.Children.Add(codeBox); // panel.Children.Add(codeBox);
break; // break;
} // }
//
case ListBlock lb: // case ListBlock lb:
{ // {
var sp = new StackPanel { Spacing = 2 }; // var sp = new StackPanel { Spacing = 2 };
var number = 1; // var number = 1;
foreach (var item in lb) // foreach (var item in lb)
{ // {
if (item is ListItemBlock lib) // if (item is ListItemBlock lib)
{ // {
var itemText = new StringBuilder(); // var itemText = new StringBuilder();
foreach (var sub in lib) // foreach (var sub in lib)
{ // {
if (sub is ParagraphBlock pp) // if (sub is ParagraphBlock pp)
itemText.Append(GetInlineText(pp.Inline)); // itemText.Append(GetInlineText(pp.Inline));
} // }
var tb = new TextBlock { Text = (lb.IsOrdered ? (number++ + ". ") : "• ") + itemText.ToString() }; // var tb = new TextBlock { Text = (lb.IsOrdered ? (number++ + ". ") : "• ") + itemText.ToString() };
sp.Children.Add(tb); // sp.Children.Add(tb);
} // }
} // }
panel.Children.Add(sp); // panel.Children.Add(sp);
break; // break;
} // }
//
default: // default:
{ // {
// fallback: raw text // // fallback: raw text
panel.Children.Add(new TextBlock { Text = block.ToString() }); // panel.Children.Add(new TextBlock { Text = block.ToString() });
break; // break;
} // }
} // }
} // }
//
return panel; // return panel;
} catch (Exception ex) { Logger.Log($"Error while : {ex.Message}",Logger.LogType.Error);} // } catch (Exception ex) { Logger.Log($"Error while : {ex.Message}",Logger.LogType.Error);}
//
return new Panel(); // return new Panel();
} // }
//
private static string GetInlineText(ContainerInline? container) // private static string GetInlineText(ContainerInline? container)
{ // {
try // try
{ // {
if (container == null) return string.Empty; // if (container == null) return string.Empty;
var sb = new StringBuilder(); // var sb = new StringBuilder();
foreach (var inline in container) // foreach (var inline in container)
{ // {
switch (inline) // switch (inline)
{ // {
case LiteralInline li: // case LiteralInline li:
sb.Append(li.Content.ToString()); // sb.Append(li.Content.ToString());
break; // break;
case EmphasisInline ei: // case EmphasisInline ei:
sb.Append(GetInlineText(ei)); // sb.Append(GetInlineText(ei));
break; // break;
case CodeInline ci: // case CodeInline ci:
sb.Append(ci.Content); // sb.Append(ci.Content);
break; // break;
case LinkInline li: // case LinkInline li:
sb.Append(GetInlineText(li)); // sb.Append(GetInlineText(li));
break; // break;
case LineBreakInline: // case LineBreakInline:
sb.Append("\n"); // sb.Append("\n");
break; // break;
default: // default:
sb.Append(inline.ToString()); // sb.Append(inline.ToString());
break; // break;
} // }
} // }
//
return sb.ToString(); // return sb.ToString();
} catch (Exception ex) { Logger.Log($"Error while : {ex.Message}",Logger.LogType.Error);} // } catch (Exception ex) { Logger.Log($"Error while : {ex.Message}",Logger.LogType.Error);}
//
return null; // return null;
} // }
} }