Compare commits

...

21 Commits

Author SHA1 Message Date
7ef3faa39e Bump version to 0.10.6
All checks were successful
Deploy / Build and Deploy (push) Successful in 3m12s
2024-08-30 22:35:10 +02:00
8c8c0a8c2b App: Try to fix auto context renewal
All checks were successful
Test / Run tests (push) Successful in 2m23s
2024-08-30 22:26:49 +02:00
78a72c641f MemberAdminWindow: Fix checking and unchecking of ContactEmailInput
All checks were successful
Test / Run tests (push) Successful in 2m3s
2024-08-30 21:40:01 +02:00
e18bc58b6c DeliveryAncmtAdminWindow: Fix bug when pressing Enter in weight input
All checks were successful
Test / Run tests (push) Successful in 2m55s
2024-08-30 21:33:58 +02:00
21f68caf4c DeliveryAncmtAdminWindow: Increase window width 2024-08-30 21:33:16 +02:00
2ef10b4bb2 DeliveryAdminWindow: Scroll DeliveryPartList down when adding new delivery parts 2024-08-30 21:31:44 +02:00
5321be46c7 [#33] ChartWindow: Add CheckBox to indicate which graph (gebunden, normal) is currently selected
All checks were successful
Test / Run tests (push) Successful in 2m54s
2024-08-28 11:14:51 +02:00
0f24f9da08 [#33] ChartWindow: Fix scaling bug 2024-08-28 10:20:21 +02:00
8ce8492c74 MainWindow: Use 'Waage' instead of 'Waagen'
All checks were successful
Test / Run tests (push) Successful in 4m42s
2024-08-26 23:00:24 +02:00
ee1315929c AreaComAdminWindow: Fix window title
All checks were successful
Test / Run tests (push) Successful in 2m59s
2024-08-26 22:12:37 +02:00
9930e6173c Dtos: Rewrite SQL queries to be more efficient
All checks were successful
Test / Run tests (push) Successful in 2m28s
2024-08-24 16:37:41 +02:00
b5c1bfb08f Bump version to 0.10.5
All checks were successful
Test / Run tests (push) Successful in 2m4s
Deploy / Build and Deploy (push) Successful in 2m47s
2024-08-24 14:00:49 +02:00
cd2b482b5a Weighing: Add SetDateAndTime()
All checks were successful
Test / Run tests (push) Successful in 2m22s
2024-08-24 13:54:59 +02:00
bec1b165bf MemberAdminWindow: Allow user to keep AreaCom YearTo when transfering
All checks were successful
Test / Run tests (push) Successful in 2m49s
2024-08-24 13:35:14 +02:00
2ae2564647 DeliveryAncmtAdminWinodw: Do not show warning windows
All checks were successful
Test / Run tests (push) Successful in 2m31s
2024-08-23 14:49:05 +02:00
adbe418b7c DeliveryAncmtAdminWindow: Change status bar spacing
All checks were successful
Test / Run tests (push) Successful in 2m51s
2024-08-23 08:53:48 +02:00
94db0723c5 Bump version to 0.10.4
All checks were successful
Test / Run tests (push) Successful in 2m2s
Deploy / Build and Deploy (push) Successful in 2m48s
2024-08-22 13:36:38 +02:00
f54677d429 DeliveryAncmtAdminWindow: Display stats in status bar
All checks were successful
Test / Run tests (push) Successful in 2m27s
2024-08-22 13:32:08 +02:00
49e4b65c27 MemberAdminWindow: Display currently shown member count and business shares
All checks were successful
Test / Run tests (push) Successful in 2m25s
2024-08-22 12:29:41 +02:00
ada5085cae Validator: Add some syntax sugar
All checks were successful
Test / Run tests (push) Successful in 2m51s
2024-08-22 11:04:24 +02:00
85931e62e8 DeliveryAncmtAdminWindow: Show weekday also in ComboBox
All checks were successful
Test / Run tests (push) Successful in 11m7s
2024-08-21 16:57:21 +02:00
24 changed files with 288 additions and 121 deletions

View File

@ -3,6 +3,61 @@ Changelog
=========
[v0.10.6][v0.10.6] (2024-08-30) {#v0.10.6}
------------------------------------------
### Behobene Fehler {#v0.10.6-bugfixes}
* Der Titel des Flächenbindungs-Fensters (`AreaComAdminWindow`) ist jetzt _Flächenbindungen_, nicht mehr _Lieferungen_. (ee1315929c)
* Im Auszahlungsvariante-Fenster (`ChartWindow`) einen Skalierungs-Fehler behoben. ([#33][i33])
* Versuch: Fehler bei automatischer Daten-Erneuerung bei längerer Benutzung. (8c8c0a8c2b)
### Sonstiges {#v0.10.6-misc}
* SQL-Queries für Auszahlung-Anpassen-Fenster (`PaymentAdjustmentWindow`) und Über-/Unterlieferungen effizienter umgeschrieben. (9930e6173c)
* Im Haupt-Fenster (`MainWindow`) den Menüpunkt _Waagen_ zu _Waage_ geändert. (8ce8492c74)
* Im Übernahme-Fenster (`DeliveryAdminWindow`) wird in der Teil-Lieferungen-Liste immer die letzte Teil-Lieferung angezeigt. (2ef10b4bb2)
* Breite des Traubenanmeldungen-Fensters (`DeliveryAncmtAdminWindow`) leicht erhöht und Fehler beim Enter-Drücken im _Gewicht_ Eingabefeld. (21f68caf4c, e18bc58b6c)
* Im Mitglieder-Fenster (`MemberAdminWindow`) wird das ändern der Kontaktart E-Mail wieder farblich hervorgehoben. (78a72c641f)
[v0.10.6]: https://git.necronda.net/winzer/elwig/releases/tag/v0.10.6
[i33]: https://git.necronda.net/winzer/elwig/issues/33
[v0.10.5][v0.10.5] (2024-08-24) {#v0.10.5}
------------------------------------------
### Neue Funktionen {#v0.10.5-features}
* Im Mitglieder-Fenster (`MemberAdminWindow`) kann der Benutzer beim Übertragen von Flächenbindungen entscheiden, ob der Beginn der Laufzeit übernommen werden soll, oder nicht. (bec1b165bf)
* Im Haupt-Fenster (`MainWindow`) ist es nun möglich für Waagen vom Typ `SysTec-IT` Datum und Uhrzeit festzulegen. (cd2b482b5a)
### Sonstiges {#v0.10.5-misc}
* Abstände in der Statusleiste im Anmeldungen-Fenster (`DeliveryAncmtAdminWindow`). (adbe418b7c)
* Im Anmeldungen-Fenster (`DeliveryAncmtAdminWindow`) scheinen keine Warnungen mehr auf, wenn ein nicht-optionales Feld nicht ausgefüllt wurde. (2ae2564647)
[v0.10.5]: https://git.necronda.net/winzer/elwig/releases/tag/v0.10.5
[v0.10.4][v0.10.4] (2024-08-22) {#v0.10.4}
------------------------------------------
### Sonstiges {#v0.10.4-misc}
* Im Anmeldungen-Fenster (`DeliveryAncmtAdminWindow`) wird der Wochentag auch beim Bearbeiten angezeigt. (85931e62e8)
* Im Mitglieder-Fenster (`MemberAdminWindow`) werden Anzahl der Mitglieder und Geschäftsanteile nicht mehr von allen aktiven angezeigt, sonder von den momentan gefilterten. (49e4b65c27)
* Statusleiste im Anmeldungen-Fenster (`DeliveryAncmtAdminWindow`). (f54677d429)
[v0.10.4]: https://git.necronda.net/winzer/elwig/releases/tag/v0.10.4
[v0.10.3][v0.10.3] (2024-08-21) {#v0.10.3}
------------------------------------------

View File

@ -53,7 +53,7 @@ namespace Elwig {
public static Dispatcher MainDispatcher { get; private set; }
private DateTime LastChanged;
private static DateTime CurrentLastWrite => File.GetLastWriteTime(Config.DatabaseFile);
private readonly DispatcherTimer ContextTimer = new() { Interval = TimeSpan.FromSeconds(2) };
private readonly DispatcherTimer ContextTimer = new() { Interval = TimeSpan.FromSeconds(5) };
public App() : base() {
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
@ -70,8 +70,9 @@ namespace Elwig {
}
ContextTimer.Tick += (object? sender, EventArgs evt) => {
if (CurrentLastWrite > LastChanged) {
LastChanged = CurrentLastWrite;
var ch = CurrentLastWrite;
if (ch > LastChanged) {
LastChanged = ch;
OnContextChanged();
}
};

View File

@ -8,7 +8,7 @@
ResizeMode="NoResize" ShowInTaskbar="False" Topmost="True"
WindowStartupLocation="CenterOwner"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
Title="Flächenbindungen übertragen" Height="230" Width="450">
Title="Flächenbindungen übertragen" Height="260" Width="450">
<Window.Resources>
<Style TargetType="Label">
<Setter Property="HorizontalAlignment" Value="Left"/>
@ -48,11 +48,15 @@
Minimum="1900" Maximum="9999"
HorizontalAlignment="Center" VerticalAlignment="Top"
TextChanged="SeasonInput_TextChanged"/>
<CheckBox x:Name="CopyYearToInput" Content="Beginn der Laufzeit von Vorgänger übernehmen" Margin="0,80,0,0"
HorizontalAlignment="Center" VerticalAlignment="Top"
Checked="CopyYearToInput_Changed" Unchecked="CopyYearToInput_Changed"
IsChecked="{Binding MaintainYearTo}"/>
<TextBlock x:Name="DescBlock1" Margin="0,85,0,0" TextAlignment="Center"
<TextBlock x:Name="DescBlock1" Margin="0,105,0,0" TextAlignment="Center"
HorizontalAlignment="Center" VerticalAlignment="Top">
Die Flächenbindungen beim <Bold>Vorgänger</Bold> sind bis inkl. Saison <Bold><Run x:Name="CancelSeason1"/></Bold> gültig,<LineBreak/>
und werden beim <Bold>Nachfolger</Bold> ab inkl. Saison <Bold><Run x:Name="TransferSeason"/></Bold> übernommen.
und werden beim <Bold>Nachfolger</Bold> ab <Run x:Name="DescBlock1Season" Text="inkl. Saison "/><Bold><Run x:Name="TransferSeason"/></Bold> übernommen.
</TextBlock>
<TextBlock x:Name="DescBlock2" Margin="0,70,0,0" TextAlignment="Center" Visibility="Hidden"
HorizontalAlignment="Center" VerticalAlignment="Top">

View File

@ -7,6 +7,7 @@ namespace Elwig.Dialogs {
public int CancelSeason { get; set; }
public int SuccessorSeason => CancelSeason + 1;
public bool MaintainYearTo { get; set; }
public string AreaComNum { get; set; }
public string Area { get; set; }
@ -22,6 +23,7 @@ namespace Elwig.Dialogs {
QuestionBlock2.Visibility = Visibility.Visible;
DescBlock1.Visibility = Visibility.Hidden;
DescBlock2.Visibility = Visibility.Visible;
CopyYearToInput.Visibility = Visibility.Hidden;
Height = 240;
SeasonInput.Margin = new(0, 40, 0, 0);
SeasonLabel.Margin = new(0, 40, 100, 0);
@ -41,7 +43,13 @@ namespace Elwig.Dialogs {
CancelSeason = (int)SeasonInput.Value!;
CancelSeason1.Text = $"{CancelSeason}";
CancelSeason2.Text = $"{CancelSeason}";
TransferSeason.Text = $"{SuccessorSeason}";
TransferSeason.Text = MaintainYearTo ? "" : $"{SuccessorSeason}";
DescBlock1Season.Text = MaintainYearTo ? "dem originalen Beginn der FB" : "inkl. Saison ";
}
private void CopyYearToInput_Changed(object sender, RoutedEventArgs evt) {
TransferSeason.Text = MaintainYearTo ? "" : $"{SuccessorSeason}";
DescBlock1Season.Text = MaintainYearTo ? "dem originalen Beginn der FB" : "inkl. Saison ";
}
private void ConfirmButton_Click(object sender, RoutedEventArgs evt) {

View File

@ -7,7 +7,7 @@
<UseWPF>true</UseWPF>
<PreserveCompilationContext>true</PreserveCompilationContext>
<ApplicationIcon>Resources\Images\Elwig.ico</ApplicationIcon>
<Version>0.10.3</Version>
<Version>0.10.6</Version>
<SatelliteResourceLanguages>de-AT</SatelliteResourceLanguages>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<ApplicationManifest>app.manifest</ApplicationManifest>

View File

@ -8,7 +8,7 @@ namespace Elwig.Helpers {
public static class Validator {
private static readonly Dictionary<string, string[][]> PHONE_NRS = new() {
{ "43", new string[][] {
{ "43", [
[],
["57", "59"],
[
@ -17,17 +17,17 @@ namespace Elwig.Helpers {
"650", "651", "652", "653", "655", "657", "659", "660", "661",
"663", "664", "665", "666", "667", "668", "669", "67", "68", "69"
]
} },
{ "49", Array.Empty<string[]>() },
{ "48", Array.Empty<string[]>() },
{ "420", Array.Empty<string[]>() },
{ "421", Array.Empty<string[]>() },
{ "36", Array.Empty<string[]>() },
{ "386", Array.Empty<string[]>() },
{ "39", Array.Empty<string[]>() },
{ "33", Array.Empty<string[]>() },
{ "41", Array.Empty<string[]>() },
{ "423", Array.Empty<string[]>() },
] },
{ "49", [] },
{ "48", [] },
{ "420", [] },
{ "421", [] },
{ "36", [] },
{ "386", [] },
{ "39", [] },
{ "33", [] },
{ "41", [] },
{ "423", [] },
};
public static ValidationResult CheckInteger(TextBox input, bool required) {

View File

@ -118,5 +118,9 @@ namespace Elwig.Helpers.Weighing {
public async Task RevokeFillingClearance() {
await SetFillingClearance(false);
}
public Task SetDateAndTime(DateTime dateTime) {
throw new NotImplementedException("Für Waagen vom Typ 'Gassner' ist diese Funktion noch nicht implementiert");
}
}
}

View File

@ -1,3 +1,4 @@
using System;
using System.Threading.Tasks;
namespace Elwig.Helpers.Weighing {
@ -31,5 +32,10 @@ namespace Elwig.Helpers.Weighing {
/// Revoke clearance to fill the scale container
/// </summary>
Task RevokeFillingClearance();
/// <summary>
/// Try to set date and time on the scale
/// </summary>
Task SetDateAndTime(DateTime dateTime);
}
}

View File

@ -161,5 +161,10 @@ namespace Elwig.Helpers.Weighing {
public async Task RevokeFillingClearance() {
await SetFillingClearance(false);
}
public async Task SetDateAndTime(DateTime dateTime) {
await SendCommand($"ST{dateTime:dd.MM.yyHH:mm:ss}");
await ReceiveResponse();
}
}
}

View File

@ -40,12 +40,12 @@ namespace Elwig.Models.Dtos {
COALESCE(' ' || m.middle_names, '') || COALESCE(' ' || m.suffix, '') AS name_2,
p.plz, o.name AS ort, m.address,
c.bucket, c.area, u.min_kg, u.weight
FROM member m
FROM v_area_commitment_bucket_strict c
LEFT JOIN member m ON m.mgnr = c.mgnr
LEFT JOIN AT_plz_dest p ON p.id = m.postal_dest
LEFT JOIN AT_ort o ON o.okz = p.okz
LEFT JOIN v_area_commitment_bucket_strict c ON c.mgnr = m.mgnr AND c.year = {year}
JOIN v_under_delivery u ON (u.mgnr, u.bucket, u.year) = (m.mgnr, c.bucket, c.year)
WHERE m.active = 1
WHERE c.year = {year} AND m.active = 1
ORDER BY m.mgnr, c.bucket
""").ToListAsync();
}

View File

@ -33,12 +33,12 @@ namespace Elwig.Models.Dtos {
m.business_shares * s.min_kg_per_bs AS min_kg,
m.business_shares * s.max_kg_per_bs AS max_kg,
COALESCE(SUM(d.weight), 0) AS sum
FROM member m
FROM v_delivery d
LEFT JOIN member m ON m.mgnr = d.mgnr
LEFT JOIN AT_plz_dest p ON p.id = m.postal_dest
LEFT JOIN AT_ort o ON o.okz = p.okz
LEFT JOIN season s ON s.year = {year}
LEFT JOIN v_delivery d ON d.mgnr = m.mgnr AND d.year = s.year
WHERE m.active = TRUE OR d.weight > 0
LEFT JOIN season s ON s.year = d.year
WHERE s.year = {year} AND (m.active = TRUE OR d.weight > 0)
GROUP BY d.year, m.mgnr
ORDER BY 100.0 * sum / max_kg, m.mgnr;
""").ToListAsync();

View File

@ -9,7 +9,6 @@ using Elwig.Documents;
using Elwig.Helpers.Export;
using Elwig.Models.Dtos;
using Microsoft.Win32;
using System.Net.Http;
using System.Windows.Input;
using System.Windows;
using System;
@ -27,6 +26,8 @@ namespace Elwig.Services {
}
public static void ClearInputs(this DeliveryAncmtAdminViewModel vm) {
vm.StatusAncmtCreated = "-";
vm.StatusAncmtModified = "-";
}
public static async Task FillInputs(this DeliveryAncmtAdminViewModel vm, DeliveryAncmt a) {
@ -34,6 +35,8 @@ namespace Elwig.Services {
vm.DeliverySchedule = (DeliverySchedule?)ControlUtils.GetItemFromSourceWithPk(vm.DeliveryScheduleSource, a.Year, a.DsNr);
vm.SortId = a.SortId;
vm.Weight = a.Weight;
vm.StatusAncmtCreated = $"{a.CreatedTimestamp:dd.MM.yyyy, HH:mm} ({a.Type})";
vm.StatusAncmtModified = a.ModifiedTimestamp != a.CreatedTimestamp ? $"{a.ModifiedTimestamp:dd.MM.yyyy, HH:mm}" : "-";
}
public static async Task<(List<string>, IQueryable<DeliveryAncmt>, List<string>)> GetFilters(this DeliveryAncmtAdminViewModel vm, AppDbContext ctx) {

View File

@ -597,7 +597,7 @@ namespace Elwig.Services {
KgNr = c.KgNr,
GstNr = c.GstNr,
RdNr = c.RdNr,
YearFrom = year,
YearFrom = vm.MaintainAreaComYearTo ? c.YearFrom : year,
YearTo = c.YearTo,
}));

View File

@ -62,6 +62,15 @@ namespace Elwig.ViewModels {
set => WeightString = $"{value}";
}
[ObservableProperty]
private string _statusAncmts = "-";
[ObservableProperty]
private string _statusWeight = "-";
[ObservableProperty]
private string _statusAncmtCreated = "-";
[ObservableProperty]
private string _statusAncmtModified = "-";
[ObservableProperty]
private Visibility _controlButtonsVisibility = Visibility.Visible;
[ObservableProperty]

View File

@ -11,6 +11,7 @@ namespace Elwig.ViewModels {
public partial class MemberAdminViewModel : ObservableObject {
public int? TransferPredecessorAreaComs = null;
public bool MaintainAreaComYearTo = false;
public int? CancelAreaComs = null;
public ObservableCollection<KeyValuePair<string, string>> PhoneNrTypes { get; set; } = new(Utils.PhoneNrTypes);

View File

@ -133,7 +133,7 @@ namespace Elwig.Windows {
return;
}
ViewModel.FilterMember = m;
ViewModel.Title = $"Lieferungen - {ViewModel.FilterMember.AdministrativeName} - Elwig";
ViewModel.Title = $"Flächenbindungen - {ViewModel.FilterMember.AdministrativeName} - Elwig";
ControlUtils.RenewItemsSource(KgInput, await ctx.WbKgs
.Include(k => k.AtKg.WbKg!.Rds)

View File

@ -132,18 +132,20 @@
<GroupBox Header="Datenpunkt" Grid.Row="0" Margin="0,5,5,5">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="85"/>
<ColumnDefinition Width="65"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Label Content="Oechsle:" Margin="10,10,0,0" Grid.Column="0"/>
<ctrl:UnitTextBox x:Name="OechsleInput" Unit="°Oe" TextChanged="OechsleInput_TextChanged" IsEnabled="False" LostFocus="OechsleInput_LostFocus"
Grid.Column="1" Width="90" Margin="0,10,0,0" HorizontalAlignment="Left" VerticalAlignment="Top"/>
<ctrl:UnitTextBox x:Name="OechsleInput" Unit="°Oe" TextChanged="OechsleInput_TextChanged" IsEnabled="False"
Grid.Column="1" Width="52" Margin="0,10,0,0" HorizontalAlignment="Left" VerticalAlignment="Top"/>
<CheckBox x:Name="GebInput" Content="Geb." IsEnabled="False"
Grid.Column="1" Margin="0,15,10,0" HorizontalAlignment="Right" VerticalAlignment="Top"
Checked="GebInput_Changed" Unchecked="GebInput_Changed"/>
<Label Content="Preis:" Margin="10,40,0,0" Grid.Column="0"/>
<ctrl:UnitTextBox x:Name="PriceInput" Unit="€/kg" TextChanged="PriceInput_TextChanged" IsEnabled="False" LostFocus="PriceInput_LostFocus"
Grid.Column="1" Width="90" Margin="0,40,0,0" HorizontalAlignment="Left" VerticalAlignment="Top"/>
<ctrl:UnitTextBox x:Name="PriceInput" Unit="€/kg" TextChanged="PriceInput_TextChanged" IsEnabled="False"
Grid.Column="1" Margin="0,40,10,0" HorizontalAlignment="Stretch" VerticalAlignment="Top"/>
</Grid>
</GroupBox>

View File

@ -5,7 +5,6 @@ using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using Elwig.Controls;
using Elwig.Helpers;
using Elwig.Helpers.Billing;
using Elwig.Models.Entities;
@ -22,8 +21,10 @@ namespace Elwig.Windows {
public readonly int Year;
public readonly int AvNr;
public Season Season;
public string CurrencySymbol;
private PaymentVar PaymentVar;
private bool HasChanged = false;
private bool Updating = false;
private Scatter DataPlot;
private Scatter? GebundenPlot;
@ -72,6 +73,9 @@ namespace Elwig.Windows {
AvNr = avnr;
using var ctx = new AppDbContext();
Season = ctx.Seasons.Find(year) ?? throw new ArgumentException("Season not found");
CurrencySymbol = Season.Currency.Symbol ?? Season.Currency.Code;
PriceInput.Unit = $"{CurrencySymbol}/kg";
GebundenFlatBonus.Unit = $"{CurrencySymbol}/kg";
PaymentVar = ctx.PaymentVariants.Find(year, avnr) ?? throw new ArgumentException("PaymentVar not found");
Title = $"{PaymentVar?.Name} - Lese {year} - Elwig";
LockContext = true;
@ -99,6 +103,9 @@ namespace Elwig.Windows {
private async Task RefreshGraphList(AppDbContext ctx) {
PaymentVar = await ctx.PaymentVariants.FindAsync(Year, AvNr) ?? throw new ArgumentException("PaymentVar not found");
Season = await ctx.Seasons.FindAsync(Year) ?? throw new ArgumentException("Season not found");
CurrencySymbol = Season.Currency.Symbol ?? Season.Currency.Code;
PriceInput.Unit = $"{CurrencySymbol}/kg";
GebundenFlatBonus.Unit = $"{CurrencySymbol}/kg";
try {
var data = EditBillingData.FromJson(PaymentVar.Data, Utils.GetVaributes(ctx, Year));
@ -146,6 +153,8 @@ namespace Elwig.Windows {
if (SelectedGraphEntry != null) {
CopyButton.IsEnabled = true;
DeleteButton.IsEnabled = true;
EnableTextBox(OechsleInput);
GebInput.IsEnabled = SelectedGraphEntry?.GebundenGraph != null;
GebundenTypeFixed.IsEnabled = true;
GebundenTypeGraph.IsEnabled = true;
GebundenTypeNone.IsEnabled = true;
@ -156,15 +165,15 @@ namespace Elwig.Windows {
} else {
CopyButton.IsEnabled = false;
DeleteButton.IsEnabled = false;
DisableUnitTextBox(OechsleInput);
DisableTextBox(OechsleInput);
GebInput.IsEnabled = false;
DisableOptionButtons();
}
if (!PaymentVar.TestVariant) {
AddButton.IsEnabled = false;
CopyButton.IsEnabled = false;
DeleteButton.IsEnabled = false;
DisableUnitTextBox(OechsleInput);
DisableUnitTextBox(PriceInput);
DisableTextBox(PriceInput);
GebundenTypeFixed.IsEnabled = false;
GebundenTypeGraph.IsEnabled = false;
GebundenTypeNone.IsEnabled = false;
@ -388,26 +397,23 @@ namespace Elwig.Windows {
OechslePricePlot.Plot.Legend.ManualItems.Clear();
}
private void OechsleInput_TextChanged(object sender, TextChangedEventArgs evt) {
if (ActiveGraph == null || SelectedGraphEntry == null) {
private void UpdateSelectedPoint() {
if (ActiveGraph == null || SelectedGraphEntry == null)
return;
}
bool success = int.TryParse(OechsleInput.Text, out int oechsle);
SecondaryMarkedPoint = -1;
ChangeMarker(SecondaryMarkedPointPlot, false);
if (success) {
if (oechsle >= ActiveGraph.MinX && oechsle <= ActiveGraph.MaxX) {
PrimaryMarkedPoint = oechsle - ActiveGraph.MinX;
if (int.TryParse(OechsleInput.Text, out int oe)) {
if (oe >= ActiveGraph.MinX && oe <= ActiveGraph.MaxX) {
PrimaryMarkedPoint = oe - ActiveGraph.MinX;
ChangeMarker(PrimaryMarkedPointPlot, true, ActiveGraph.GetOechsleAt(PrimaryMarkedPoint), ActiveGraph.GetPriceAt(PrimaryMarkedPoint));
PriceInput.Text = Math.Round(ActiveGraph.GetPriceAt(PrimaryMarkedPoint), Season.Precision).ToString();
EnableActionButtons();
OechslePricePlot.Refresh();
EnableUnitTextBox(PriceInput);
EnableTextBox(PriceInput);
return;
}
}
@ -416,9 +422,21 @@ namespace Elwig.Windows {
ChangeMarker(PrimaryMarkedPointPlot, false);
DisableActionButtons();
PriceInput.Text = "";
DisableUnitTextBox(PriceInput);
DisableTextBox(PriceInput);
OechslePricePlot.Refresh();
DisableUnitTextBox(PriceInput);
DisableTextBox(PriceInput);
}
private void OechsleInput_TextChanged(object sender, TextChangedEventArgs evt) {
UpdateSelectedPoint();
}
private void GebInput_Changed(object sender, RoutedEventArgs evt) {
if (Updating)
return;
var sel = GebInput.IsChecked == true ? SelectedGraphEntry?.GebundenGraph : SelectedGraphEntry?.DataGraph;
if (sel != ActiveGraph) ChangeActiveGraph(sel);
UpdateSelectedPoint();
}
private void PriceInput_TextChanged(object sender, TextChangedEventArgs evt) {
@ -479,31 +497,34 @@ namespace Elwig.Windows {
}
private void OechslePricePlot_MouseDown(object sender, MouseEventArgs e) {
if (GraphList.SelectedItem == null) {
if (GraphList.SelectedItem == null)
return;
}
if (HoverActive) {
if (PaymentVar.TestVariant && Keyboard.IsKeyDown(System.Windows.Input.Key.LeftCtrl)) {
if (PrimaryMarkedPoint == -1 || ActiveGraph == null || ActiveGraph != Highlighted.Graph) {
if (SecondaryMarkedPoint == -1 || ActiveGraph == null || ActiveGraph != Highlighted.Graph)
return;
}
SecondaryMarkedPoint = Highlighted.Index;
ChangeMarker(SecondaryMarkedPointPlot, true, ActiveGraph.GetOechsleAt(SecondaryMarkedPoint), ActiveGraph.GetPriceAt(SecondaryMarkedPoint));
InterpolateButton.IsEnabled = true;
return;
}
Updating = true;
PrimaryMarkedPoint = Highlighted.Index;
if (ActiveGraph != Highlighted.Graph) ChangeActiveGraph(Highlighted.Graph);
if (ActiveGraph != Highlighted.Graph)
ChangeActiveGraph(Highlighted.Graph);
Updating = false;
if (PrimaryMarkedPoint == -1 || ActiveGraph == null)
return;
ChangeMarker(PrimaryMarkedPointPlot, true, ActiveGraph!.GetOechsleAt(PrimaryMarkedPoint), ActiveGraph.GetPriceAt(PrimaryMarkedPoint));
ChangeMarker(PrimaryMarkedPointPlot, true, ActiveGraph.GetOechsleAt(PrimaryMarkedPoint), ActiveGraph.GetPriceAt(PrimaryMarkedPoint));
Updating = true;
OechsleInput.Text = Highlighted.Graph!.GetOechsleAt(Highlighted.Index).ToString();
GebInput.IsChecked = Highlighted.Graph == SelectedGraphEntry?.GebundenGraph;
PriceInput.Text = Math.Round(Highlighted.Graph.GetPriceAt(Highlighted.Index), Season.Precision).ToString();
Updating = false;
EnableActionButtons();
} else {
@ -516,8 +537,9 @@ namespace Elwig.Windows {
ChangeMarker(SecondaryMarkedPointPlot, false);
OechsleInput.Text = "";
GebInput.IsChecked = false;
PriceInput.Text = "";
DisableUnitTextBox(PriceInput);
DisableTextBox(PriceInput);
DisableActionButtons();
}
@ -531,28 +553,39 @@ namespace Elwig.Windows {
MouseChange(e);
}
private Coordinates GetMouseCoordinates(Point p) {
Pixel px = new(p.X, p.Y);
var source = PresentationSource.FromVisual(this);
if (source?.CompositionTarget != null) {
var matrix = source.CompositionTarget.TransformToDevice;
px.X *= (float)matrix.M11;
px.Y *= (float)matrix.M22;
}
return OechslePricePlot.Plot.GetCoordinates(px);
}
private void MouseChange(MouseEventArgs e) {
if (GraphList.SelectedItem == null) {
return;
}
(double x, double y, int index)? mouseOnData = MouseOnPlot(DataPlot, e.GetPosition(OechslePricePlot));
(double x, double y, int index)? mouseOnGebunden = MouseOnPlot(GebundenPlot, e.GetPosition(OechslePricePlot));
var mouseOnData = MouseOnPlot(DataPlot, GetMouseCoordinates(e.GetPosition(OechslePricePlot)));
var mouseOnGebunden = MouseOnPlot(GebundenPlot, GetMouseCoordinates(e.GetPosition(OechslePricePlot)));
Highlighted = LastHighlighted;
if (mouseOnData != null) {
ChangeMarker(HighlightedPointPlot, true, mouseOnData.Value.x, mouseOnData.Value.y);
ChangeMarker(HighlightedPointPlot, true, mouseOnData.Value.X, mouseOnData.Value.Y);
HighlightedPointPlot.IsVisible = true;
HoverChanged = true ^ HoverActive;
HoverActive = true;
HandleTooltip(mouseOnData.Value.x, mouseOnData.Value.y, mouseOnData.Value.index, SelectedGraphEntry!.DataGraph, e.GetPosition(OechslePricePlot), e is MouseWheelEventArgs);
HandleTooltip(mouseOnData.Value.X, mouseOnData.Value.Y, mouseOnData.Value.Index, SelectedGraphEntry!.DataGraph, e.GetPosition(OechslePricePlot), e is MouseWheelEventArgs);
} else if (mouseOnGebunden != null) {
ChangeMarker(HighlightedPointPlot, true, mouseOnGebunden.Value.x, mouseOnGebunden.Value.y);
ChangeMarker(HighlightedPointPlot, true, mouseOnGebunden.Value.X, mouseOnGebunden.Value.Y);
HighlightedPointPlot.IsVisible = true;
HoverChanged = true ^ HoverActive;
HoverActive = true;
HandleTooltip(mouseOnGebunden.Value.x, mouseOnGebunden.Value.y, mouseOnGebunden.Value.index, SelectedGraphEntry!.GebundenGraph!, e.GetPosition(OechslePricePlot), e is MouseWheelEventArgs);
HandleTooltip(mouseOnGebunden.Value.X, mouseOnGebunden.Value.Y, mouseOnGebunden.Value.Index, SelectedGraphEntry!.GebundenGraph!, e.GetPosition(OechslePricePlot), e is MouseWheelEventArgs);
} else {
ChangeMarker(HighlightedPointPlot, false);
HoverChanged = false ^ HoverActive;
@ -562,30 +595,20 @@ namespace Elwig.Windows {
}
}
private (double, double, int)? MouseOnPlot(Scatter? plot, Point p) {
if (plot == null) {
private (double X, double Y, int Index)? MouseOnPlot(Scatter? plot, Coordinates c) {
if (plot == null)
return null;
}
OechslePricePlot.Refresh();
Pixel mousePixel = new(p.X, p.Y);
Coordinates mouseLocation = OechslePricePlot.Plot.GetCoordinates(mousePixel);
DataPoint nearestPoint = plot.Data.GetNearest(mouseLocation, OechslePricePlot.Plot.LastRender, 3);
if (nearestPoint.IsReal) {
return (nearestPoint.X, nearestPoint.Y, nearestPoint.Index);
} else {
return null;
}
DataPoint nearestPoint = plot.Data.GetNearest(c, OechslePricePlot.Plot.LastRender, 5);
return nearestPoint.IsReal ? (nearestPoint.X, nearestPoint.Y, nearestPoint.Index) : null;
}
private void HandleTooltip(double pointX, double pointY, int pointIndex, Graph g, Point p, bool force) {
if (force || LastHighlighted != Highlighted || HoverChanged) {
OechslePricePlot.Plot.PlottableList.Remove(TooltipPlot);
if (TooltipInput.IsChecked == true) {
Pixel mousePixel = new(p.X, p.Y - 30);
Coordinates mouseLocation = OechslePricePlot.Plot.GetCoordinates(mousePixel);
TooltipPlot = OechslePricePlot.Plot.Add.Text($"Oechsle: {pointX:N2}, Preis: {Math.Round(pointY, Season.Precision)}€/kg", mouseLocation.X, mouseLocation.Y);
Coordinates mouseLocation = GetMouseCoordinates(new(p.X, p.Y - 30));
TooltipPlot = OechslePricePlot.Plot.Add.Text($"Oechsle: {pointX:N2}, Preis: {Math.Round(pointY, Season.Precision)} {CurrencySymbol}/kg", mouseLocation.X, mouseLocation.Y);
TooltipPlot.LabelFontSize = 12;
TooltipPlot.LabelBold = true;
TooltipPlot.LabelBorderColor = Colors.Black;
@ -658,31 +681,37 @@ namespace Elwig.Windows {
SetHasChanged(false);
}
private void EnableUnitTextBox(UnitTextBox u) {
if (PaymentVar.TestVariant) {
private void EnableTextBox(TextBox u) {
if (PaymentVar.TestVariant || u == OechsleInput) {
u.IsEnabled = true;
u.IsReadOnly = false;
}
}
private void DisableUnitTextBox(UnitTextBox u) {
private void DisableTextBox(TextBox u) {
u.IsEnabled = false;
u.IsReadOnly = true;
}
private void ChangeActiveGraph(Graph? g) {
if (g != null && g == SelectedGraphEntry?.DataGraph) {
EnableUnitTextBox(OechsleInput);
EnableTextBox(OechsleInput);
if (SelectedGraphEntry?.GebundenGraph != null) ChangeLineWidth(DataPlot, 4);
ChangeLineWidth(GebundenPlot, 1);
GebInput.IsEnabled = SelectedGraphEntry?.GebundenGraph != null;
GebInput.IsChecked = false;
} else if (g != null && g == SelectedGraphEntry?.GebundenGraph) {
EnableUnitTextBox(OechsleInput);
EnableTextBox(OechsleInput);
ChangeLineWidth(GebundenPlot, 4);
ChangeLineWidth(DataPlot, 1);
GebInput.IsEnabled = SelectedGraphEntry?.GebundenGraph != null;
GebInput.IsChecked = true;
} else {
DisableUnitTextBox(OechsleInput);
DisableUnitTextBox(PriceInput);
DisableTextBox(OechsleInput);
DisableTextBox(PriceInput);
OechsleInput.Text = "";
GebInput.IsEnabled = false;
GebInput.IsChecked = false;
PriceInput.Text = "";
ChangeLineWidth(DataPlot, 1);
ChangeLineWidth(GebundenPlot, 1);
@ -700,14 +729,6 @@ namespace Elwig.Windows {
RefreshInputs();
}
private void PriceInput_LostFocus(object sender, RoutedEventArgs e) {
}
private void OechsleInput_LostFocus(object sender, RoutedEventArgs e) {
}
private void GebundenFlatBonus_TextChanged(object sender, TextChangedEventArgs e) {
if (FillingInputs) return;
var r = Validator.CheckDecimal(GebundenFlatBonus, true, 2, Season.Precision);
@ -778,19 +799,19 @@ namespace Elwig.Windows {
private void GebundenType_Checked(object sender, RoutedEventArgs e) {
if (FillingInputs) return;
if (SelectedGraphEntry == null) {
DisableUnitTextBox(GebundenFlatBonus);
DisableTextBox(GebundenFlatBonus);
return;
}
if (GebundenTypeNone.IsChecked == true) {
SelectedGraphEntry.RemoveGebundenGraph();
DisableUnitTextBox(GebundenFlatBonus);
DisableTextBox(GebundenFlatBonus);
} else if (GebundenTypeFixed.IsChecked == true) {
SelectedGraphEntry.GebundenFlatBonus = double.TryParse(GebundenFlatBonus.Text, out var val) ? val : 0.1;
SelectedGraphEntry.AddGebundenGraph();
EnableUnitTextBox(GebundenFlatBonus);
EnableTextBox(GebundenFlatBonus);
} else if (GebundenTypeGraph.IsChecked == true) {
SelectedGraphEntry.AddGebundenGraph();
DisableUnitTextBox(GebundenFlatBonus);
DisableTextBox(GebundenFlatBonus);
}
SetHasChanged();
RefreshInputs();
@ -801,11 +822,11 @@ namespace Elwig.Windows {
if (SelectedGraphEntry?.GebundenFlatBonus is double bonus) {
GebundenTypeFixed.IsChecked = true;
GebundenFlatBonus.Text = $"{bonus}";
EnableUnitTextBox(GebundenFlatBonus);
EnableTextBox(GebundenFlatBonus);
} else if (SelectedGraphEntry?.GebundenGraph != null) {
GebundenTypeGraph.IsChecked = true;
GebundenFlatBonus.Text = "";
DisableUnitTextBox(GebundenFlatBonus);
DisableTextBox(GebundenFlatBonus);
}
FillingInputs = false;
}

View File

@ -690,7 +690,7 @@ namespace Elwig.Windows {
private async void NewDeliveryPartButton_Click(object sender, RoutedEventArgs evt) {
FinishButton.IsEnabled = false;
NewDeliveryPartButton.IsEnabled = false;
NewDeliveryPartButton.Cursor = Cursors.Wait;
Mouse.OverrideCursor = Cursors.AppStarting;
DeliveryPartList.IsEnabled = false;
var p = await ViewModel.UpdateDeliveryPart(
(DeliveryList.SelectedItem as Delivery)?.Year,
@ -703,9 +703,10 @@ namespace Elwig.Windows {
EmptyScale();
await RefreshList();
await RefreshDeliveryParts();
NewDeliveryPartButton.Cursor = null;
Mouse.OverrideCursor = null;
ControlUtils.SelectItem(DeliveryList, p?.Delivery);
DeliveryPartList.SelectedItem = null;
DeliveryPartList.ScrollIntoView(DeliveryPartList.ItemsSource.Cast<object>().Last());
RefreshInputs();
InitialInputs();
}
@ -713,7 +714,7 @@ namespace Elwig.Windows {
private async void FinishButton_Click(object sender, RoutedEventArgs evt) {
FinishButton.IsEnabled = false;
NewDeliveryPartButton.IsEnabled = false;
FinishButton.Cursor = Cursors.Wait;
Mouse.OverrideCursor = Cursors.AppStarting;
DeliveryPartList.IsEnabled = false;
var p = await ViewModel.UpdateDeliveryPart(
(DeliveryList.SelectedItem as Delivery)?.Year,
@ -727,7 +728,6 @@ namespace Elwig.Windows {
await RefreshList();
await RefreshDeliveryParts();
if (p?.Delivery != null) {
Mouse.OverrideCursor = Cursors.AppStarting;
try {
using var ctx = new AppDbContext();
using var doc = new DeliveryNote((await ctx.Deliveries.FindAsync(p.Year, p.DId))!, ctx);
@ -740,9 +740,8 @@ namespace Elwig.Windows {
} catch (Exception exc) {
MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
}
Mouse.OverrideCursor = null;
}
FinishButton.Cursor = null;
Mouse.OverrideCursor = null;
DeliveryList.SelectedItem = null;
await RenewContext();
RefreshInputs();
@ -937,7 +936,7 @@ namespace Elwig.Windows {
private async void SaveButton_Click(object? sender, RoutedEventArgs? evt) {
SaveButton.IsEnabled = false;
SaveButton.Cursor = Cursors.Wait;
Mouse.OverrideCursor = Cursors.AppStarting;
IsEditing = false;
IsCreating = false;
@ -953,7 +952,7 @@ namespace Elwig.Windows {
!InputIsNotDefault(TimeInput)
);
SaveButton.Cursor = null;
Mouse.OverrideCursor = null;
HideSaveResetCancelButtons();
ShowNewEditDeleteButtons();

View File

@ -8,7 +8,7 @@
xmlns:local="clr-namespace:Elwig.Windows"
xmlns:vm="clr-namespace:Elwig.ViewModels"
xmlns:ctrl="clr-namespace:Elwig.Controls"
Title="Traubenanmeldungen - Elwig" Height="700" Width="900" MinWidth="600" MinHeight="400"
Title="Traubenanmeldungen - Elwig" Height="700" Width="940" MinWidth="600" MinHeight="400"
Loaded="Window_Loaded">
<Window.DataContext>
<vm:DeliveryAncmtAdminViewModel/>
@ -123,7 +123,7 @@
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Date, StringFormat='ddd.'}" Width="20"/>
<TextBlock Text="{Binding Date, StringFormat='ddd.'}" Width="24"/>
<TextBlock Text="{Binding Date, StringFormat='dd.MM.'}" Width="32"/>
<TextBlock Text="{Binding ZwstId}" Width="25" TextAlignment="Center"/>
<TextBlock Text="{Binding Description}" Width="200"/>
@ -268,6 +268,7 @@
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Date, StringFormat='ddd.'}" Width="28"/>
<TextBlock Text="{Binding Date, StringFormat='dd.MM.'}" Width="35"/>
<TextBlock Text="{Binding ZwstId}" Width="30" TextAlignment="Center"/>
<TextBlock Text="{Binding Description}"/>
@ -306,17 +307,39 @@
<ItemsPanelTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150"/>
<ColumnDefinition Width="1*" MinWidth="120"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="1*" MinWidth="150"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="2.25*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="2*"/>
</Grid.ColumnDefinitions>
</Grid>
</ItemsPanelTemplate>
</StatusBar.ItemsPanel>
<StatusBarItem>
<TextBlock>
Anmeldungen: <Run Text="{Binding StatusAncmts}"/>
</TextBlock>
</StatusBarItem>
<Separator Grid.Column="1"/>
<StatusBarItem Grid.Column="2">
<TextBlock>
Gewicht: <Run Text="{Binding StatusWeight}"/>
</TextBlock>
</StatusBarItem>
<Separator Grid.Column="3"/>
<StatusBarItem Grid.Column="4">
<TextBlock>
Anmldg. erstellt: <Run Text="{Binding StatusAncmtCreated}"/>
</TextBlock>
</StatusBarItem>
<Separator Grid.Column="5"/>
<StatusBarItem Grid.Column="6">
<TextBlock>
Anmldg. geändert: <Run Text="{Binding StatusAncmtModified}"/>
</TextBlock>
</StatusBarItem>
</StatusBar>
</Grid>

View File

@ -31,6 +31,8 @@ namespace Elwig.Windows {
MgNrInput, MemberInput, DeliveryScheduleInput, SortIdInput, WineVarietyInput, WeightInput,
];
DoShowWarningWindows = false;
InitializeDelayTimer(SearchInput, SearchInput_TextChanged);
SearchInput.TextChanged -= SearchInput_TextChanged;
ViewModel.FilterSeason = Utils.CurrentLastSeason;
@ -51,7 +53,7 @@ namespace Elwig.Windows {
WeightInput.Focus();
WeightInput.SelectAll();
} else if (ctrl == WeightInput) {
SaveButton_Click(null, null);
ShortcutSave();
}
}
@ -127,6 +129,9 @@ namespace Elwig.Windows {
DeliveryAncmtList_SelectionChanged, ViewModel.TextFilter.Count > 0 ? ControlUtils.RenewSourceDefault.IfOnly : ControlUtils.RenewSourceDefault.None, !updateSort);
if (updateSort && DeliveryAncmtList.SelectedItem != null)
DeliveryAncmtList.ScrollIntoView(DeliveryAncmtList.SelectedItem);
ViewModel.StatusAncmts = $"{deliveryAncmts.Count:N0}";
ViewModel.StatusWeight = $"{deliveryAncmts.Sum(a => a.Weight):N0} kg";
}
private async Task RefreshInputs(bool validate = false) {

View File

@ -25,6 +25,9 @@
<MenuItem Header="Abfragen stellen" Click="Menu_Database_Query_Click"/>
<MenuItem Header="Speicherort öffnen..." Click="Menu_Database_Open_Click"/>
</MenuItem>
<MenuItem Header="Waage">
<MenuItem Header="Datum und Uhrzeit setzen" Click="Menu_Scale_SetDateTime_Click"/>
</MenuItem>
<MenuItem x:Name="HelpMenu" Header="Hilfe">
<MenuItem Header="Über"/>
<MenuItem x:Name="Menu_Help_Update" Header="Nach Updates suchen" Click="Menu_Help_Update_Click"/>

View File

@ -90,6 +90,21 @@ namespace Elwig.Windows {
} catch { }
}
private async void Menu_Scale_SetDateTime_Click(object sender, RoutedEventArgs evt) {
if (App.CommandScales.Count == 0) {
MessageBox.Show("Es sind keine geeigneten Waagen verfügbar!", "Datum und Uhrzeit setzen", MessageBoxButton.OK, MessageBoxImage.Error);
return;
}
foreach (var s in App.CommandScales) {
try {
await s.SetDateAndTime(DateTime.Now);
} catch (Exception exc) {
MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
MessageBox.Show("Datum und Uhrzeit auf entsprechenden Waagen gesetzt!", "Datum und Uhrzeit setzen", MessageBoxButton.OK, MessageBoxImage.Information);
}
private void Menu_Database_Query_Click(object sender, RoutedEventArgs evt) {
var w = new QueryWindow();
w.Show();

View File

@ -150,6 +150,9 @@ namespace Elwig.Windows {
MemberList_SelectionChanged, ViewModel.TextFilter.Count > 0 ? ControlUtils.RenewSourceDefault.IfOnly : ControlUtils.RenewSourceDefault.None, !updateSort);
if (updateSort && MemberList.SelectedItem != null)
MemberList.ScrollIntoView(MemberList.SelectedItem);
ViewModel.StatusMembers = $"{members.Count:N0} ({await ctx.Members.CountAsync():N0})";
ViewModel.StatusBusinessShares = $"{members.Sum(m => m.BusinessShares):N0} ({await ctx.Members.SumAsync(m => m.BusinessShares):N0})";
}
private async Task RefreshInputs(bool validate = false) {
@ -237,7 +240,6 @@ namespace Elwig.Windows {
var mM = Math.Max(mA.Length, Math.Max(mI.Length, mT.Length));
var mS = mM > 3;
if (mS) mM--;
ViewModel.StatusMembers = $"{mA} ({mT})";
ViewModel.StatusMembersToolTip =
$"{new string(s1, Math.Max(0, mM - mA.Length))}{(mS && mA.Length < 4 ? s2 : "")}{mA} aktive Mitglieder\n" +
$"{new string(s1, Math.Max(0, mM - mI.Length))}{(mS && mI.Length < 4 ? s2 : "")}{mI} nicht aktive Mitglieder\n" +
@ -249,7 +251,6 @@ namespace Elwig.Windows {
var bM = Math.Max(bA.Length, Math.Max(bI.Length, bT.Length));
var bS = bM > 3;
if (bS) bM--;
ViewModel.StatusBusinessShares = $"{bA} ({bT})";
ViewModel.StatusBusinessSharesToolTip =
$"{new string(s1, Math.Max(0, bM - bA.Length))}{(bS && bA.Length < 4 ? s2 : "")}{bA} Geschäftsanteile von aktiven Mitgliedern\n" +
$"{new string(s1, Math.Max(0, bM - bI.Length))}{(bS && bI.Length < 4 ? s2 : "")}{bI} Geschäftsanteile von nicht aktiven Mitgliedern\n" +
@ -746,6 +747,7 @@ namespace Elwig.Windows {
if (d.ShowDialog() != true)
return;
ViewModel.TransferPredecessorAreaComs = d.SuccessorSeason;
ViewModel.MaintainAreaComYearTo = d.MaintainYearTo;
if (IsEditing)
SetOriginalValue(PredecessorMgNrInput, -1); // hack to allow user to save
UpdateButtons();
@ -767,6 +769,7 @@ namespace Elwig.Windows {
}
private void ContactEmailInput_Changed(object sender, RoutedEventArgs evt) {
CheckBox_Changed(sender, evt);
EmailAddressInput_TextChanged(EmailAddress1Input, new TextChangedEventArgs(evt.RoutedEvent, UndoAction.None));
}