[#10] AreaComAdminWindow: Implement MVVM
This commit is contained in:
@ -272,7 +272,7 @@ namespace Elwig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static AreaComAdminWindow FocusMemberAreaComs(int mgnr) {
|
public static AreaComAdminWindow FocusMemberAreaComs(int mgnr) {
|
||||||
return FocusWindow<AreaComAdminWindow>(() => new(mgnr), w => w.MgNr == mgnr);
|
return FocusWindow<AreaComAdminWindow>(() => new(mgnr), w => w.ViewModel.Member.MgNr == mgnr);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static BaseDataWindow FocusBaseData() {
|
public static BaseDataWindow FocusBaseData() {
|
||||||
|
127
Elwig/Services/AreaComService.cs
Normal file
127
Elwig/Services/AreaComService.cs
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
using Elwig.Helpers;
|
||||||
|
using Elwig.Models.Entities;
|
||||||
|
using Elwig.ViewModels;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Elwig.Services {
|
||||||
|
public static class AreaComService {
|
||||||
|
|
||||||
|
public static async Task InitInputs(this AreaComAdminViewModel vm) {
|
||||||
|
using var ctx = new AppDbContext();
|
||||||
|
vm.FbNr = await ctx.NextFbNr();
|
||||||
|
vm.MgNr = vm.Member.MgNr;
|
||||||
|
vm.YearFrom = Utils.CurrentYear;
|
||||||
|
vm.WineCult = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ClearInputs(this AreaComAdminViewModel vm) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void FillInputs(this AreaComAdminViewModel vm, AreaCom a) {
|
||||||
|
vm.FbNr = a.FbNr;
|
||||||
|
vm.MgNr = a.MgNr;
|
||||||
|
vm.YearFrom = a.YearFrom;
|
||||||
|
vm.YearTo = a.YearTo;
|
||||||
|
vm.AreaComType = ControlUtils.GetItemFromSourceWithPk(vm.AreaComTypeSource, a.VtrgId) as AreaComType;
|
||||||
|
vm.WineCult = ControlUtils.GetItemFromSourceWithPk(vm.WineCultSource, a.CultId) as WineCult;
|
||||||
|
vm.Comment = a.Comment;
|
||||||
|
vm.Kg = ControlUtils.GetItemFromSourceWithPk(vm.KgSource, a.KgNr) as AT_Kg;
|
||||||
|
vm.Rd = ControlUtils.GetItemFromSourceWithPk(vm.RdSource, a.KgNr, a.RdNr) as WbRd;
|
||||||
|
vm.GstNr = a.GstNr;
|
||||||
|
vm.Area = a.Area;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async Task<(List<string>, IQueryable<AreaCom>, List<string>)> GetFilters(this AreaComAdminViewModel vm, AppDbContext ctx) {
|
||||||
|
List<string> filterNames = [];
|
||||||
|
IQueryable<AreaCom> areaComQuery = ctx.AreaCommitments.Where(a => a.MgNr == vm.Member.MgNr).OrderBy(a => a.FbNr);
|
||||||
|
if (vm.ShowOnlyActiveAreaComs) {
|
||||||
|
areaComQuery = Utils.ActiveAreaCommitments(areaComQuery);
|
||||||
|
filterNames.Add("laufend");
|
||||||
|
}
|
||||||
|
|
||||||
|
var filterVar = new List<string>();
|
||||||
|
var filterNotVar = new List<string>();
|
||||||
|
var filterAttr = new List<string>();
|
||||||
|
var filterNotAttr = new List<string>();
|
||||||
|
|
||||||
|
var filter = vm.TextFilter;
|
||||||
|
if (filter.Count > 0) {
|
||||||
|
var var = await ctx.WineVarieties.ToDictionaryAsync(v => v.SortId, v => v);
|
||||||
|
var attr = await ctx.WineAttributes.ToDictionaryAsync(a => a.Name.ToLower().Split(" ")[0], a => a);
|
||||||
|
|
||||||
|
for (int i = 0; i < filter.Count; i++) {
|
||||||
|
var e = filter[i];
|
||||||
|
if (e.Length == 2 && var.ContainsKey(e.ToUpper())) {
|
||||||
|
filterVar.Add(e.ToUpper());
|
||||||
|
filter.RemoveAt(i--);
|
||||||
|
filterNames.Add(var[e.ToUpper()].Name);
|
||||||
|
} else if (e.Length == 3 && e[0] == '!' && var.ContainsKey(e[1..].ToUpper())) {
|
||||||
|
filterNotVar.Add(e[1..].ToUpper());
|
||||||
|
filter.RemoveAt(i--);
|
||||||
|
} else if (attr.ContainsKey(e.ToLower())) {
|
||||||
|
var a = attr[e.ToLower()];
|
||||||
|
filterAttr.Add(a.AttrId);
|
||||||
|
filter.RemoveAt(i--);
|
||||||
|
filterNames.Add($"Attribut {a.Name}");
|
||||||
|
} else if (e[0] == '!' && attr.ContainsKey(e[1..].ToLower())) {
|
||||||
|
var a = attr[e[1..].ToLower()];
|
||||||
|
filterNotAttr.Add(a.AttrId);
|
||||||
|
filter.RemoveAt(i--);
|
||||||
|
filterNames.Add($"ohne Attribut {a.Name}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filterVar.Count > 0) areaComQuery = areaComQuery.Where(a => filterVar.Contains(a.AreaComType.WineVar.SortId));
|
||||||
|
if (filterNotVar.Count > 0) areaComQuery = areaComQuery.Where(a => !filterNotVar.Contains(a.AreaComType.WineVar.SortId));
|
||||||
|
if (filterAttr.Count > 0) areaComQuery = areaComQuery.Where(a => a.AreaComType.WineAttr != null && a.AreaComType.WineAttr.AttrId != null && filterAttr.Contains(a.AreaComType.WineAttr.AttrId));
|
||||||
|
if (filterNotAttr.Count > 0) areaComQuery = areaComQuery.Where(a => a.AreaComType.WineAttr == null || a.AreaComType.WineAttr.AttrId == null || !filterAttr.Contains(a.AreaComType.WineAttr.AttrId));
|
||||||
|
}
|
||||||
|
|
||||||
|
return (filterNames, areaComQuery, filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async Task<int> UpdateAreaCommitment(this AreaComAdminViewModel vm, int? oldFbNr) {
|
||||||
|
using var ctx = new AppDbContext();
|
||||||
|
int newFbNr = (int)vm.FbNr!;
|
||||||
|
|
||||||
|
var a = new AreaCom {
|
||||||
|
FbNr = oldFbNr ?? newFbNr,
|
||||||
|
MgNr = (int)vm.MgNr!,
|
||||||
|
YearFrom = (int)vm.YearFrom!,
|
||||||
|
YearTo = vm.YearTo,
|
||||||
|
VtrgId = vm.AreaComType!.VtrgId,
|
||||||
|
CultId = vm.WineCult?.CultId,
|
||||||
|
Comment = string.IsNullOrEmpty(vm.Comment) ? null : vm.Comment,
|
||||||
|
KgNr = vm.Kg!.KgNr,
|
||||||
|
RdNr = vm.Rd?.RdNr,
|
||||||
|
GstNr = vm.GstNr!.Trim(),
|
||||||
|
Area = (int)vm.Area!,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (vm.Rd?.RdNr == 0) {
|
||||||
|
vm.Rd.RdNr = await ctx.NextRdNr(a.KgNr);
|
||||||
|
a.RdNr = vm.Rd.RdNr;
|
||||||
|
ctx.Add(vm.Rd);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (oldFbNr != null) {
|
||||||
|
ctx.Update(a);
|
||||||
|
} else {
|
||||||
|
ctx.Add(a);
|
||||||
|
}
|
||||||
|
|
||||||
|
await ctx.SaveChangesAsync();
|
||||||
|
|
||||||
|
if (newFbNr != a.FbNr) {
|
||||||
|
await ctx.Database.ExecuteSqlAsync($"UPDATE area_commitment SET fbnr = {newFbNr} WHERE fbnr = {oldFbNr}");
|
||||||
|
}
|
||||||
|
|
||||||
|
await App.HintContextChange();
|
||||||
|
|
||||||
|
return newFbNr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
89
Elwig/ViewModels/AreaComAdminViewModel.cs
Normal file
89
Elwig/ViewModels/AreaComAdminViewModel.cs
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
using CommunityToolkit.Mvvm.ComponentModel;
|
||||||
|
using Elwig.Models.Entities;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace Elwig.ViewModels {
|
||||||
|
public partial class AreaComAdminViewModel : ObservableObject {
|
||||||
|
|
||||||
|
[ObservableProperty]
|
||||||
|
private string? _searchQuery = "";
|
||||||
|
public List<string> TextFilter {
|
||||||
|
get => [.. SearchQuery?.ToLower().Split(' ').ToList().FindAll(e => e.Length > 0)];
|
||||||
|
set => SearchQuery = string.Join(' ', value.Where(e => e.Length > 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
public required Member Member { get; set; }
|
||||||
|
|
||||||
|
[ObservableProperty]
|
||||||
|
private bool _showOnlyActiveAreaComs;
|
||||||
|
|
||||||
|
[ObservableProperty]
|
||||||
|
private string? _fbNrString;
|
||||||
|
public int? FbNr {
|
||||||
|
get => int.TryParse(FbNrString, out var mgnr) ? mgnr : null;
|
||||||
|
set => FbNrString = $"{value}";
|
||||||
|
}
|
||||||
|
[ObservableProperty]
|
||||||
|
private string? _mgNrString;
|
||||||
|
public int? MgNr {
|
||||||
|
get => int.TryParse(MgNrString, out var mgnr) ? mgnr : null;
|
||||||
|
set => MgNrString = $"{value}";
|
||||||
|
}
|
||||||
|
[ObservableProperty]
|
||||||
|
private string? _yearFromString;
|
||||||
|
public int? YearFrom {
|
||||||
|
get => int.TryParse(YearFromString, out var year) ? year : null;
|
||||||
|
set => YearFromString = $"{value}";
|
||||||
|
}
|
||||||
|
[ObservableProperty]
|
||||||
|
private string? _yearToString;
|
||||||
|
public int? YearTo {
|
||||||
|
get => int.TryParse(YearToString, out var year) ? year : null;
|
||||||
|
set => YearToString = $"{value}";
|
||||||
|
}
|
||||||
|
|
||||||
|
[ObservableProperty]
|
||||||
|
private AreaComType? _areaComType;
|
||||||
|
[ObservableProperty]
|
||||||
|
private IEnumerable<AreaComType> _areaComTypeSource = [];
|
||||||
|
[ObservableProperty]
|
||||||
|
private object? _wineCultObj;
|
||||||
|
public WineCult? WineCult {
|
||||||
|
get => WineCultObj as WineCult;
|
||||||
|
set => WineCultObj = value ?? WineCultSource.FirstOrDefault();
|
||||||
|
}
|
||||||
|
[ObservableProperty]
|
||||||
|
private IEnumerable<object> _wineCultSource = [];
|
||||||
|
[ObservableProperty]
|
||||||
|
private string? _comment;
|
||||||
|
|
||||||
|
[ObservableProperty]
|
||||||
|
private AT_Kg? _kg;
|
||||||
|
[ObservableProperty]
|
||||||
|
private IEnumerable<AT_Kg> _kgSource = [];
|
||||||
|
[ObservableProperty]
|
||||||
|
private object? _rdObj;
|
||||||
|
public WbRd? Rd {
|
||||||
|
get => RdObj as WbRd;
|
||||||
|
set => RdObj = value ?? RdSource.FirstOrDefault();
|
||||||
|
}
|
||||||
|
[ObservableProperty]
|
||||||
|
private IEnumerable<object> _rdSource = [];
|
||||||
|
[ObservableProperty]
|
||||||
|
private string? _gstNr;
|
||||||
|
[ObservableProperty]
|
||||||
|
private string? _areaString;
|
||||||
|
public int? Area {
|
||||||
|
get => int.TryParse(AreaString, out var area) ? area : null;
|
||||||
|
set => AreaString = $"{value}";
|
||||||
|
}
|
||||||
|
|
||||||
|
[ObservableProperty]
|
||||||
|
private string _statusAreaCommitments = "Flächenbindungen: -";
|
||||||
|
[ObservableProperty]
|
||||||
|
private string _statusArea = "Fläche: -";
|
||||||
|
[ObservableProperty]
|
||||||
|
private string _statusContracts = "Vertragsarten: -";
|
||||||
|
}
|
||||||
|
}
|
@ -5,9 +5,12 @@
|
|||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
xmlns:local="clr-namespace:Elwig.Windows"
|
xmlns:local="clr-namespace:Elwig.Windows"
|
||||||
xmlns:ctrl="clr-namespace:Elwig.Controls"
|
xmlns:ctrl="clr-namespace:Elwig.Controls"
|
||||||
mc:Ignorable="d"
|
xmlns:vm="clr-namespace:Elwig.ViewModels"
|
||||||
Title="Flächenbindungen - Elwig" Height="500" MinHeight="440" Width="920" MinWidth="860"
|
Title="Flächenbindungen - Elwig" Height="500" MinHeight="440" Width="920" MinWidth="860"
|
||||||
Loaded="Window_Loaded">
|
Loaded="Window_Loaded">
|
||||||
|
<Window.DataContext>
|
||||||
|
<vm:AreaComAdminViewModel/>
|
||||||
|
</Window.DataContext>
|
||||||
<Window.Resources>
|
<Window.Resources>
|
||||||
<Style TargetType="Label">
|
<Style TargetType="Label">
|
||||||
<Setter Property="HorizontalAlignment" Value="Left"/>
|
<Setter Property="HorizontalAlignment" Value="Left"/>
|
||||||
@ -57,9 +60,9 @@
|
|||||||
<ColumnDefinition Width="*" MinWidth="280"/>
|
<ColumnDefinition Width="*" MinWidth="280"/>
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
<Grid Grid.Row="0" Grid.Column="0">
|
<Grid Grid.Row="0" Grid.Column="0" Margin="5,0,0,0">
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="37"/>
|
<RowDefinition Height="35"/>
|
||||||
<RowDefinition Height="*"/>
|
<RowDefinition Height="*"/>
|
||||||
<RowDefinition Height="42"/>
|
<RowDefinition Height="42"/>
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
@ -69,11 +72,12 @@
|
|||||||
<ColumnDefinition Width="*"/>
|
<ColumnDefinition Width="*"/>
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
<TextBox x:Name="SearchInput" Grid.ColumnSpan="3" Margin="5,7,145,0" IsReadOnly="False"
|
<TextBox x:Name="SearchInput" Text="{Binding SearchQuery, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
|
Grid.ColumnSpan="3" Margin="5,5,140,0" IsReadOnly="False"
|
||||||
TextChanged="SearchInput_TextChanged"/>
|
TextChanged="SearchInput_TextChanged"/>
|
||||||
<CheckBox x:Name="ActiveAreaCommitmentInput" Content="Nur aktive anzeigen"
|
<CheckBox x:Name="ActiveAreaCommitmentInput" Content="Nur aktive anzeigen" IsChecked="{Binding ShowOnlyActiveAreaComs}"
|
||||||
Checked="ActiveAreaCommitmentInput_Changed" Unchecked="ActiveAreaCommitmentInput_Changed"
|
Checked="ActiveAreaCommitmentInput_Changed" Unchecked="ActiveAreaCommitmentInput_Changed"
|
||||||
HorizontalAlignment="Right" Margin="0,12,10,0" VerticalAlignment="Top" Grid.Column="1" Grid.ColumnSpan="2"/>
|
HorizontalAlignment="Right" Margin="0,10,10,0" VerticalAlignment="Top" Grid.Column="1" Grid.ColumnSpan="2"/>
|
||||||
|
|
||||||
<DataGrid x:Name="AreaCommitmentList" AutoGenerateColumns="False" HeadersVisibility="Column" IsReadOnly="True" GridLinesVisibility="None" SelectionMode="Single"
|
<DataGrid x:Name="AreaCommitmentList" AutoGenerateColumns="False" HeadersVisibility="Column" IsReadOnly="True" GridLinesVisibility="None" SelectionMode="Single"
|
||||||
CanUserDeleteRows="False" CanUserResizeRows="False" CanUserAddRows="False" SelectionChanged="AreaCommitmentList_SelectionChanged" Grid.Column="0" Grid.Row="1"
|
CanUserDeleteRows="False" CanUserResizeRows="False" CanUserAddRows="False" SelectionChanged="AreaCommitmentList_SelectionChanged" Grid.Column="0" Grid.Row="1"
|
||||||
@ -152,34 +156,40 @@
|
|||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
<Label Content="FbNr.:" Margin="10,10,0,0" Grid.Column="0"/>
|
<Label Content="FbNr.:" Margin="10,10,0,0" Grid.Column="0"/>
|
||||||
<TextBox x:Name="FbNrInput" Margin="0,10,10,0" Grid.Column="1" TextAlignment="Right"
|
<TextBox x:Name="FbNrInput" Text="{Binding FbNrString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
|
Margin="0,10,10,0" Grid.Column="1" TextAlignment="Right"
|
||||||
TextChanged="FbNrInput_TextChanged" LostFocus="FbNrInput_LostFocus"/>
|
TextChanged="FbNrInput_TextChanged" LostFocus="FbNrInput_LostFocus"/>
|
||||||
|
|
||||||
<Label Content="MgNr.:" Margin="10,40,0,0" Grid.Column="0"/>
|
<Label Content="MgNr.:" Margin="10,40,0,0" Grid.Column="0"/>
|
||||||
<TextBox x:Name="MgNrInput" IsEnabled="False"
|
<TextBox x:Name="MgNrInput" Text="{Binding MgNrString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsEnabled="False"
|
||||||
Margin="0,40,10,0" Grid.Column="1" TextAlignment="Right"/>
|
Margin="0,40,10,0" Grid.Column="1" TextAlignment="Right"/>
|
||||||
|
|
||||||
<Label Content="Von:" Margin="10,10,0,0" Grid.Column="2"/>
|
<Label Content="Von:" Margin="10,10,0,0" Grid.Column="2"/>
|
||||||
<TextBox x:Name="YearFromInput" Margin="0,10,10,0" Grid.Column="3" TextAlignment="Right"
|
<TextBox x:Name="YearFromInput" Text="{Binding YearFromString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
|
Margin="0,10,10,0" Grid.Column="3" TextAlignment="Right"
|
||||||
TextChanged="IntegerInput_TextChanged"/>
|
TextChanged="IntegerInput_TextChanged"/>
|
||||||
|
|
||||||
<Label Content="Bis:" Margin="10,40,0,0" Grid.Column="2"/>
|
<Label Content="Bis:" Margin="10,40,0,0" Grid.Column="2"/>
|
||||||
<TextBox x:Name="YearToInput" Margin="0,40,10,0" Grid.Column="3" TextAlignment="Right"
|
<TextBox x:Name="YearToInput" Text="{Binding YearToString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
|
Margin="0,40,10,0" Grid.Column="3" TextAlignment="Right"
|
||||||
TextChanged="IntegerInput_TextChanged"/>
|
TextChanged="IntegerInput_TextChanged"/>
|
||||||
|
|
||||||
<Label Content="Vertragsart:" Margin="10,70,0,0" Grid.Column="0" Grid.ColumnSpan="2"/>
|
<Label Content="Vertragsart:" Margin="10,70,0,0" Grid.Column="0" Grid.ColumnSpan="2"/>
|
||||||
<ComboBox x:Name="AreaComTypeInput" DisplayMemberPath="DisplayName" TextSearch.TextPath="DisplayName"
|
<ComboBox x:Name="AreaComTypeInput" SelectedItem="{Binding AreaComType, Mode=TwoWay}" ItemsSource="{Binding AreaComTypeSource, Mode=TwoWay}"
|
||||||
|
DisplayMemberPath="DisplayName" TextSearch.TextPath="DisplayName"
|
||||||
HorizontalAlignment="Stretch" Margin="0,70,40,10" Grid.Column="1" Grid.ColumnSpan="3"/>
|
HorizontalAlignment="Stretch" Margin="0,70,40,10" Grid.Column="1" Grid.ColumnSpan="3"/>
|
||||||
<Button x:Name="AreaComTypeDetailsButton" Content="" FontFamily="Segoe MDL2 Assets" FontSize="14" Padding="0,1,0,0"
|
<Button x:Name="AreaComTypeDetailsButton" Content="" FontFamily="Segoe MDL2 Assets" FontSize="14" Padding="0,1,0,0"
|
||||||
Click="AreaComTypeDetailsButton_Click"
|
Click="AreaComTypeDetailsButton_Click"
|
||||||
Grid.Column="3" VerticalAlignment="Top" HorizontalAlignment="Right" Width="25" Height="25" Margin="10,70,10,10"/>
|
Grid.Column="3" VerticalAlignment="Top" HorizontalAlignment="Right" Width="25" Height="25" Margin="10,70,10,10"/>
|
||||||
|
|
||||||
<Label Content="Bewirt.-Art:" Margin="10,100,0,0" Grid.Column="0" Grid.ColumnSpan="2"/>
|
<Label Content="Bewirt.-Art:" Margin="10,100,0,0" Grid.Column="0" Grid.ColumnSpan="2"/>
|
||||||
<ComboBox x:Name="WineCultivationInput" DisplayMemberPath="Name" TextSearch.TextPath="Name"
|
<ComboBox x:Name="WineCultivationInput" SelectedItem="{Binding WineCultObj, Mode=TwoWay}" ItemsSource="{Binding WineCultSource, Mode=TwoWay}"
|
||||||
|
DisplayMemberPath="Name" TextSearch.TextPath="Name"
|
||||||
HorizontalAlignment="Stretch" Margin="0,100,10,0" Grid.Column="1" Grid.ColumnSpan="3"/>
|
HorizontalAlignment="Stretch" Margin="0,100,10,0" Grid.Column="1" Grid.ColumnSpan="3"/>
|
||||||
|
|
||||||
<Label Content="Anmerkung:" Margin="10,130,0,0" Grid.Column="0" Grid.ColumnSpan="2"/>
|
<Label Content="Anmerkung:" Margin="10,130,0,0" Grid.Column="0" Grid.ColumnSpan="2"/>
|
||||||
<TextBox x:Name="CommentInput" TextChanged="TextBox_TextChanged"
|
<TextBox x:Name="CommentInput" Text="{Binding Comment, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
|
TextChanged="TextBox_TextChanged"
|
||||||
HorizontalAlignment="Stretch" Margin="0,130,10,0" Grid.Column="1" Grid.ColumnSpan="3"/>
|
HorizontalAlignment="Stretch" Margin="0,130,10,0" Grid.Column="1" Grid.ColumnSpan="3"/>
|
||||||
</Grid>
|
</Grid>
|
||||||
</GroupBox>
|
</GroupBox>
|
||||||
@ -192,7 +202,8 @@
|
|||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
<Label Content="KG:" Margin="10,10,0,0" Grid.Column="0"/>
|
<Label Content="KG:" Margin="10,10,0,0" Grid.Column="0"/>
|
||||||
<ComboBox x:Name="KgInput" ItemTemplate="{StaticResource KgNrTemplate}" TextSearch.TextPath="Name"
|
<ComboBox x:Name="KgInput" SelectedItem="{Binding Kg, Mode=TwoWay}" ItemsSource="{Binding KgSource, Mode=TwoWay}"
|
||||||
|
ItemTemplate="{StaticResource KgNrTemplate}" TextSearch.TextPath="Name"
|
||||||
HorizontalAlignment="Stretch" Margin="0,10,40,10" Grid.Column="1"
|
HorizontalAlignment="Stretch" Margin="0,10,40,10" Grid.Column="1"
|
||||||
SelectionChanged="KgInput_SelectionChanged"/>
|
SelectionChanged="KgInput_SelectionChanged"/>
|
||||||
<Button x:Name="KgDetailsButton" Content="" FontFamily="Segoe MDL2 Assets" FontSize="14" Padding="0,1,0,0"
|
<Button x:Name="KgDetailsButton" Content="" FontFamily="Segoe MDL2 Assets" FontSize="14" Padding="0,1,0,0"
|
||||||
@ -200,7 +211,8 @@
|
|||||||
Grid.Column="1" VerticalAlignment="Top" HorizontalAlignment="Right" Width="25" Height="25" Margin="10,10,10,10"/>
|
Grid.Column="1" VerticalAlignment="Top" HorizontalAlignment="Right" Width="25" Height="25" Margin="10,10,10,10"/>
|
||||||
|
|
||||||
<Label Content="Ried:" Margin="10,40,0,0" Grid.Column="0"/>
|
<Label Content="Ried:" Margin="10,40,0,0" Grid.Column="0"/>
|
||||||
<ComboBox x:Name="RdInput" DisplayMemberPath="Name" TextSearch.TextPath="Name" IsEditable="True"
|
<ComboBox x:Name="RdInput" SelectedItem="{Binding RdObj, Mode=TwoWay}" ItemsSource="{Binding RdSource, Mode=TwoWay}"
|
||||||
|
DisplayMemberPath="Name" TextSearch.TextPath="Name" IsEditable="True"
|
||||||
HorizontalAlignment="Stretch" Margin="0,40,40,10" Grid.Column="1"
|
HorizontalAlignment="Stretch" Margin="0,40,40,10" Grid.Column="1"
|
||||||
SelectionChanged="RdInput_SelectionChanged"/>
|
SelectionChanged="RdInput_SelectionChanged"/>
|
||||||
<Button x:Name="RdAddButton" Content="" FontFamily="Segoe MDL2 Assets" FontSize="16" Padding="0,0,0,0" IsEnabled="False"
|
<Button x:Name="RdAddButton" Content="" FontFamily="Segoe MDL2 Assets" FontSize="16" Padding="0,0,0,0" IsEnabled="False"
|
||||||
@ -208,11 +220,13 @@
|
|||||||
Grid.Column="1" VerticalAlignment="Top" HorizontalAlignment="Right" Width="25" Height="25" Margin="10,40,10,10"/>
|
Grid.Column="1" VerticalAlignment="Top" HorizontalAlignment="Right" Width="25" Height="25" Margin="10,40,10,10"/>
|
||||||
|
|
||||||
<Label Content="Parzelle(n):" Margin="10,70,0,0" Grid.Column="0"/>
|
<Label Content="Parzelle(n):" Margin="10,70,0,0" Grid.Column="0"/>
|
||||||
<TextBox x:Name="GstNrInput" Margin="0,70,10,0" Grid.Column="1" HorizontalAlignment="Stretch"
|
<TextBox x:Name="GstNrInput" Text="{Binding GstNr, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
|
Margin="0,70,10,0" Grid.Column="1" HorizontalAlignment="Stretch"
|
||||||
TextChanged="TextBox_TextChanged"/>
|
TextChanged="TextBox_TextChanged"/>
|
||||||
|
|
||||||
<Label Content="Fläche:" Margin="10,100,0,0" Grid.Column="0"/>
|
<Label Content="Fläche:" Margin="10,100,0,0" Grid.Column="0"/>
|
||||||
<ctrl:UnitTextBox x:Name="AreaInput" Unit="m²" TextChanged="IntegerInput_TextChanged"
|
<ctrl:UnitTextBox x:Name="AreaInput" Unit="m²" Text="{Binding AreaString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
|
TextChanged="IntegerInput_TextChanged"
|
||||||
Grid.Column="1" Width="70" Margin="0,100,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"/>
|
Grid.Column="1" Width="70" Margin="0,100,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"/>
|
||||||
</Grid>
|
</Grid>
|
||||||
</GroupBox>
|
</GroupBox>
|
||||||
@ -233,15 +247,15 @@
|
|||||||
</ItemsPanelTemplate>
|
</ItemsPanelTemplate>
|
||||||
</StatusBar.ItemsPanel>
|
</StatusBar.ItemsPanel>
|
||||||
<StatusBarItem>
|
<StatusBarItem>
|
||||||
<TextBlock Name="StatusAreaCommitments" Text="Flächenbindungen: -"/>
|
<TextBlock Name="StatusAreaCommitments" Text="{Binding StatusAreaCommitments}"/>
|
||||||
</StatusBarItem>
|
</StatusBarItem>
|
||||||
<Separator Grid.Column="1"/>
|
<Separator Grid.Column="1"/>
|
||||||
<StatusBarItem Grid.Column="2">
|
<StatusBarItem Grid.Column="2">
|
||||||
<TextBlock Name="StatusArea" Text="Fläche: -"/>
|
<TextBlock Name="StatusArea" Text="{Binding StatusArea}"/>
|
||||||
</StatusBarItem>
|
</StatusBarItem>
|
||||||
<Separator Grid.Column="3"/>
|
<Separator Grid.Column="3"/>
|
||||||
<StatusBarItem Grid.Column="4">
|
<StatusBarItem Grid.Column="4">
|
||||||
<TextBlock Name="StatusContracts" Text="Vertragsarten: -"/>
|
<TextBlock Name="StatusContracts" Text="{Binding StatusContracts}"/>
|
||||||
</StatusBarItem>
|
</StatusBarItem>
|
||||||
</StatusBar>
|
</StatusBar>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
@ -6,21 +6,23 @@ using Elwig.Helpers;
|
|||||||
using Elwig.Models.Entities;
|
using Elwig.Models.Entities;
|
||||||
using System;
|
using System;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Collections.Generic;
|
using Elwig.ViewModels;
|
||||||
|
using Elwig.Services;
|
||||||
|
using System.Windows.Input;
|
||||||
|
|
||||||
namespace Elwig.Windows {
|
namespace Elwig.Windows {
|
||||||
public partial class AreaComAdminWindow : AdministrationWindow {
|
public partial class AreaComAdminWindow : AdministrationWindow {
|
||||||
|
|
||||||
public int MgNr => Member.MgNr;
|
public AreaComAdminViewModel ViewModel => (AreaComAdminViewModel)DataContext;
|
||||||
|
|
||||||
private readonly Member Member;
|
private readonly RoutedCommand CtrlF = new("CtrlF", typeof(AreaComAdminWindow), [new KeyGesture(Key.F, ModifierKeys.Control)]);
|
||||||
private List<string> TextFilter = [];
|
|
||||||
|
|
||||||
public AreaComAdminWindow(int mgnr) {
|
public AreaComAdminWindow(int mgnr) {
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
CommandBindings.Add(new CommandBinding(CtrlF, FocusSearchInput));
|
||||||
using var ctx = new AppDbContext();
|
using var ctx = new AppDbContext();
|
||||||
Member = ctx.Members.Find(mgnr) ?? throw new ArgumentException("MgNr argument has invalid value");
|
ViewModel.Member = ctx.Members.Find(mgnr) ?? throw new ArgumentException("MgNr argument has invalid value");
|
||||||
Title = $"Flächenbindungen - {Member.AdministrativeName} - Elwig";
|
Title = $"Flächenbindungen - {ViewModel.Member.AdministrativeName} - Elwig";
|
||||||
ExemptInputs = [
|
ExemptInputs = [
|
||||||
MgNrInput, AreaCommitmentList, NewAreaCommitmentButton,
|
MgNrInput, AreaCommitmentList, NewAreaCommitmentButton,
|
||||||
EditAreaCommitmentButton, DeleteAreaCommitmentButton, AreaCommitmentSaveButton,
|
EditAreaCommitmentButton, DeleteAreaCommitmentButton, AreaCommitmentSaveButton,
|
||||||
@ -30,6 +32,9 @@ namespace Elwig.Windows {
|
|||||||
FbNrInput, YearFromInput, KgInput, RdInput,
|
FbNrInput, YearFromInput, KgInput, RdInput,
|
||||||
GstNrInput, AreaInput, AreaComTypeInput, WineCultivationInput
|
GstNrInput, AreaInput, AreaComTypeInput, WineCultivationInput
|
||||||
];
|
];
|
||||||
|
|
||||||
|
InitializeDelayTimer(SearchInput, SearchInput_TextChanged);
|
||||||
|
SearchInput.TextChanged -= SearchInput_TextChanged;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Window_Loaded(object sender, RoutedEventArgs e) {
|
private void Window_Loaded(object sender, RoutedEventArgs e) {
|
||||||
@ -37,13 +42,16 @@ namespace Elwig.Windows {
|
|||||||
LockInputs();
|
LockInputs();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task RefreshAreaCommitmentList() {
|
private void FocusSearchInput(object sender, RoutedEventArgs evt) {
|
||||||
await RefreshAreaCommitmentListQuery();
|
if (!IsEditing && !IsCreating) {
|
||||||
|
SearchInput.Focus();
|
||||||
|
SearchInput.SelectAll();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task RefreshAreaCommitmentListQuery(bool updateSort = false) {
|
private async Task RefreshList(bool updateSort = false) {
|
||||||
using var ctx = new AppDbContext();
|
using var ctx = new AppDbContext();
|
||||||
var (_, areaComQuery, filter) = await GetFilters(ctx);
|
var (_, areaComQuery, filter) = await ViewModel.GetFilters(ctx);
|
||||||
var areaComs = await areaComQuery
|
var areaComs = await areaComQuery
|
||||||
.Include(a => a.Kg.AtKg)
|
.Include(a => a.Kg.AtKg)
|
||||||
.Include(a => a.Rd!.Kg.AtKg)
|
.Include(a => a.Rd!.Kg.AtKg)
|
||||||
@ -51,7 +59,7 @@ namespace Elwig.Windows {
|
|||||||
|
|
||||||
if (filter.Count > 0 && areaComs.Count > 0) {
|
if (filter.Count > 0 && areaComs.Count > 0) {
|
||||||
var dict = areaComs.AsParallel()
|
var dict = areaComs.AsParallel()
|
||||||
.ToDictionary(d => d, d => d.SearchScore(TextFilter))
|
.ToDictionary(d => d, d => d.SearchScore(ViewModel.TextFilter))
|
||||||
.OrderByDescending(c => c.Value);
|
.OrderByDescending(c => c.Value);
|
||||||
var threshold = dict.Select(a => a.Value).Max() * 3 / 4;
|
var threshold = dict.Select(a => a.Value).Max() * 3 / 4;
|
||||||
areaComs = dict
|
areaComs = dict
|
||||||
@ -65,67 +73,18 @@ namespace Elwig.Windows {
|
|||||||
RefreshInputs();
|
RefreshInputs();
|
||||||
|
|
||||||
if(filter.Count == 0) {
|
if(filter.Count == 0) {
|
||||||
StatusAreaCommitments.Text = $"Flächenbindungen: {await areaComQuery.CountAsync()}";
|
ViewModel.StatusAreaCommitments = $"Flächenbindungen: {await areaComQuery.CountAsync()}";
|
||||||
StatusArea.Text = $"Fläche: {await areaComQuery.Select(a => a.Area).SumAsync():N0} m²";
|
ViewModel.StatusArea = $"Fläche: {await areaComQuery.Select(a => a.Area).SumAsync():N0} m²";
|
||||||
} else {
|
} else {
|
||||||
StatusAreaCommitments.Text = $"Flächenbindungen: {areaComs.Count}";
|
ViewModel.StatusAreaCommitments = $"Flächenbindungen: {areaComs.Count}";
|
||||||
StatusArea.Text = $"Fläche: {areaComs.Select(a => a.Area).Sum():N0} m²";
|
ViewModel.StatusArea = $"Fläche: {areaComs.Select(a => a.Area).Sum():N0} m²";
|
||||||
}
|
}
|
||||||
var groups = areaComs.GroupBy(a => $"{a.AreaComType.SortId}{a.AreaComType.AttrId}").Select(a => (a.Key, a.Sum(b => b.Area))).OrderByDescending(a => a.Item2).ToList();
|
var groups = areaComs.GroupBy(a => $"{a.AreaComType.SortId}{a.AreaComType.AttrId}").Select(a => (a.Key, a.Sum(b => b.Area))).OrderByDescending(a => a.Item2).ToList();
|
||||||
StatusContracts.Text = $"Vertragsarten: {groups.Count} (" + string.Join(", ", groups.Select(g => $"{g.Key}: {g.Item2:N0} m²")) + ")";
|
ViewModel.StatusContracts = $"Vertragsarten: {groups.Count} (" + string.Join(", ", groups.Select(g => $"{g.Key}: {g.Item2:N0} m²")) + ")";
|
||||||
groups = areaComs.GroupBy(a => a.AreaComType.DisplayName).Select(a => (a.Key, a.Sum(b => b.Area))).OrderByDescending(a => a.Item2).ToList();
|
groups = areaComs.GroupBy(a => a.AreaComType.DisplayName).Select(a => (a.Key, a.Sum(b => b.Area))).OrderByDescending(a => a.Item2).ToList();
|
||||||
StatusContracts.ToolTip = $"Vertragsarten: {groups.Count}\n" + string.Join($"\n", groups.Select(g => $"{g.Key}: {g.Item2:N0} m²"));
|
StatusContracts.ToolTip = $"Vertragsarten: {groups.Count}\n" + string.Join($"\n", groups.Select(g => $"{g.Key}: {g.Item2:N0} m²"));
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<(List<string>, IQueryable<AreaCom>, List<string>)> GetFilters(AppDbContext ctx) {
|
|
||||||
List<string> filterNames = [];
|
|
||||||
IQueryable<AreaCom> areaComQuery = ctx.AreaCommitments.Where(a => a.MgNr == Member.MgNr).OrderBy(a => a.FbNr);
|
|
||||||
if (ActiveAreaCommitmentInput.IsChecked == true) {
|
|
||||||
areaComQuery = Utils.ActiveAreaCommitments(areaComQuery);
|
|
||||||
filterNames.Add("aktiv");
|
|
||||||
}
|
|
||||||
|
|
||||||
var filterVar = new List<string>();
|
|
||||||
var filterNotVar = new List<string>();
|
|
||||||
var filterAttr = new List<string>();
|
|
||||||
var filterNotAttr = new List<string>();
|
|
||||||
|
|
||||||
var filter = TextFilter.ToList();
|
|
||||||
if (filter.Count > 0) {
|
|
||||||
var var = await ctx.WineVarieties.ToDictionaryAsync(v => v.SortId, v => v);
|
|
||||||
var attr = await ctx.WineAttributes.ToDictionaryAsync(a => a.Name.ToLower().Split(" ")[0], a => a);
|
|
||||||
|
|
||||||
for (int i = 0; i < filter.Count; i++) {
|
|
||||||
var e = filter[i];
|
|
||||||
if (e.Length == 2 && var.ContainsKey(e.ToUpper())) {
|
|
||||||
filterVar.Add(e.ToUpper());
|
|
||||||
filter.RemoveAt(i--);
|
|
||||||
filterNames.Add(var[e.ToUpper()].Name);
|
|
||||||
} else if (e.Length == 3 && e[0] == '!' && var.ContainsKey(e[1..].ToUpper())) {
|
|
||||||
filterNotVar.Add(e[1..].ToUpper());
|
|
||||||
filter.RemoveAt(i--);
|
|
||||||
} else if (attr.ContainsKey(e.ToLower())) {
|
|
||||||
var a = attr[e.ToLower()];
|
|
||||||
filterAttr.Add(a.AttrId);
|
|
||||||
filter.RemoveAt(i--);
|
|
||||||
filterNames.Add($"Attribut {a.Name}");
|
|
||||||
} else if (e[0] == '!' && attr.ContainsKey(e[1..].ToLower())) {
|
|
||||||
var a = attr[e[1..].ToLower()];
|
|
||||||
filterNotAttr.Add(a.AttrId);
|
|
||||||
filter.RemoveAt(i--);
|
|
||||||
filterNames.Add($"ohne Attribut {a.Name}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (filterVar.Count > 0) areaComQuery = areaComQuery.Where(a => filterVar.Contains(a.AreaComType.WineVar.SortId));
|
|
||||||
if (filterNotVar.Count > 0) areaComQuery = areaComQuery.Where(a => !filterNotVar.Contains(a.AreaComType.WineVar.SortId));
|
|
||||||
if (filterAttr.Count > 0) areaComQuery = areaComQuery.Where(a => a.AreaComType.WineAttr != null && a.AreaComType.WineAttr.AttrId != null && filterAttr.Contains(a.AreaComType.WineAttr.AttrId));
|
|
||||||
if (filterNotAttr.Count > 0) areaComQuery = areaComQuery.Where(a => a.AreaComType.WineAttr == null || a.AreaComType.WineAttr.AttrId == null || !filterAttr.Contains(a.AreaComType.WineAttr.AttrId));
|
|
||||||
}
|
|
||||||
|
|
||||||
return (filterNames, areaComQuery, filter);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void RefreshInputs(bool validate = false) {
|
private void RefreshInputs(bool validate = false) {
|
||||||
ClearInputStates();
|
ClearInputStates();
|
||||||
if (AreaCommitmentList.SelectedItem is AreaCom a) {
|
if (AreaCommitmentList.SelectedItem is AreaCom a) {
|
||||||
@ -146,44 +105,14 @@ namespace Elwig.Windows {
|
|||||||
private void FillInputs(AreaCom a) {
|
private void FillInputs(AreaCom a) {
|
||||||
ClearOriginalValues();
|
ClearOriginalValues();
|
||||||
ClearDefaultValues();
|
ClearDefaultValues();
|
||||||
|
ViewModel.FillInputs(a);
|
||||||
FbNrInput.Text = a.FbNr.ToString();
|
|
||||||
MgNrInput.Text = a.MgNr.ToString();
|
|
||||||
YearFromInput.Text = a.YearFrom.ToString();
|
|
||||||
YearToInput.Text = a.YearTo.ToString();
|
|
||||||
|
|
||||||
ControlUtils.SelectItemWithPk(KgInput, a.KgNr);
|
|
||||||
if (a.RdNr != null) {
|
|
||||||
ControlUtils.SelectItemWithPk(RdInput, a.KgNr, a.RdNr);
|
|
||||||
} else {
|
|
||||||
RdInput.SelectedIndex = 0;
|
|
||||||
}
|
|
||||||
GstNrInput.Text = a.GstNr;
|
|
||||||
AreaInput.Text = a.Area.ToString();
|
|
||||||
|
|
||||||
ControlUtils.SelectItemWithPk(AreaComTypeInput, a.VtrgId);
|
|
||||||
if (a.CultId != null) {
|
|
||||||
ControlUtils.SelectItemWithPk(WineCultivationInput, a.CultId);
|
|
||||||
} else {
|
|
||||||
WineCultivationInput.SelectedIndex = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
CommentInput.Text = a.Comment;
|
|
||||||
|
|
||||||
FinishInputFilling();
|
FinishInputFilling();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void InitInputs() {
|
private async void InitInputs() {
|
||||||
ClearOriginalValues();
|
ClearOriginalValues();
|
||||||
ClearDefaultValues();
|
ClearDefaultValues();
|
||||||
|
await ViewModel.InitInputs();
|
||||||
using (var ctx = new AppDbContext()) {
|
|
||||||
FbNrInput.Text = (await ctx.NextFbNr()).ToString();
|
|
||||||
MgNrInput.Text = Member.MgNr.ToString();
|
|
||||||
YearFromInput.Text = DateTime.Now.Year.ToString();
|
|
||||||
WineCultivationInput.SelectedIndex = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
SetDefaultValue(FbNrInput);
|
SetDefaultValue(FbNrInput);
|
||||||
ValidateRequiredInputs();
|
ValidateRequiredInputs();
|
||||||
}
|
}
|
||||||
@ -205,7 +134,7 @@ namespace Elwig.Windows {
|
|||||||
.Cast<object>().ToListAsync();
|
.Cast<object>().ToListAsync();
|
||||||
cultList.Insert(0, new NullItem());
|
cultList.Insert(0, new NullItem());
|
||||||
ControlUtils.RenewItemsSource(WineCultivationInput, cultList, null, ControlUtils.RenewSourceDefault.First);
|
ControlUtils.RenewItemsSource(WineCultivationInput, cultList, null, ControlUtils.RenewSourceDefault.First);
|
||||||
await RefreshAreaCommitmentList();
|
await RefreshList();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void ShortcutNew() {
|
protected override void ShortcutNew() {
|
||||||
@ -262,53 +191,10 @@ namespace Elwig.Windows {
|
|||||||
using var ctx = new AppDbContext();
|
using var ctx = new AppDbContext();
|
||||||
ctx.Remove(a);
|
ctx.Remove(a);
|
||||||
await ctx.SaveChangesAsync();
|
await ctx.SaveChangesAsync();
|
||||||
await RefreshAreaCommitmentList();
|
await RefreshList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<int> UpdateAreaCom(int? oldFbNr) {
|
|
||||||
using var ctx = new AppDbContext();
|
|
||||||
int newFbNr = int.Parse(FbNrInput.Text);
|
|
||||||
|
|
||||||
var a = new AreaCom {
|
|
||||||
FbNr = oldFbNr ?? newFbNr,
|
|
||||||
MgNr = int.Parse(MgNrInput.Text),
|
|
||||||
YearFrom = int.Parse(YearFromInput.Text),
|
|
||||||
YearTo = (YearToInput.Text == "") ? null : int.Parse(YearToInput.Text),
|
|
||||||
KgNr = ((AT_Kg)KgInput.SelectedItem).KgNr,
|
|
||||||
RdNr = (RdInput.SelectedItem as WbRd)?.RdNr,
|
|
||||||
GstNr = GstNrInput.Text.Trim(),
|
|
||||||
Area = int.Parse(AreaInput.Text),
|
|
||||||
VtrgId = (AreaComTypeInput.SelectedItem as AreaComType)!.VtrgId,
|
|
||||||
CultId = (WineCultivationInput.SelectedItem as WineCult)?.CultId,
|
|
||||||
Comment = (CommentInput.Text == "") ? null : CommentInput.Text.Trim(),
|
|
||||||
};
|
|
||||||
|
|
||||||
if (RdInput.SelectedItem is WbRd rd) {
|
|
||||||
if (rd.RdNr == 0) {
|
|
||||||
rd.RdNr = await ctx.NextRdNr(a.KgNr);
|
|
||||||
a.RdNr = rd.RdNr;
|
|
||||||
ctx.Add(rd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (oldFbNr != null) {
|
|
||||||
ctx.Update(a);
|
|
||||||
} else {
|
|
||||||
ctx.Add(a);
|
|
||||||
}
|
|
||||||
|
|
||||||
await ctx.SaveChangesAsync();
|
|
||||||
|
|
||||||
if (newFbNr != a.FbNr) {
|
|
||||||
await ctx.Database.ExecuteSqlAsync($"UPDATE area_commitment SET fbnr = {newFbNr} WHERE fbnr = {oldFbNr}");
|
|
||||||
}
|
|
||||||
|
|
||||||
await App.HintContextChange();
|
|
||||||
|
|
||||||
return newFbNr;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void ShortcutSave() {
|
protected override void ShortcutSave() {
|
||||||
if (!AreaCommitmentSaveButton.IsEnabled || AreaCommitmentSaveButton.Visibility != Visibility.Visible)
|
if (!AreaCommitmentSaveButton.IsEnabled || AreaCommitmentSaveButton.Visibility != Visibility.Visible)
|
||||||
return;
|
return;
|
||||||
@ -318,7 +204,7 @@ namespace Elwig.Windows {
|
|||||||
private async void AreaCommitmentSaveButton_Click(object? sender, RoutedEventArgs? evt) {
|
private async void AreaCommitmentSaveButton_Click(object? sender, RoutedEventArgs? evt) {
|
||||||
int? fbnr = null;
|
int? fbnr = null;
|
||||||
try {
|
try {
|
||||||
fbnr = await UpdateAreaCom((AreaCommitmentList.SelectedItem as AreaCom)?.FbNr);
|
fbnr = await ViewModel.UpdateAreaCommitment((AreaCommitmentList.SelectedItem as AreaCom)?.FbNr);
|
||||||
} catch (Exception exc) {
|
} catch (Exception exc) {
|
||||||
var str = "Der Eintrag konnte nicht in der Datenbank aktualisiert werden!\n\n" + exc.Message;
|
var str = "Der Eintrag konnte nicht in der Datenbank aktualisiert werden!\n\n" + exc.Message;
|
||||||
if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message;
|
if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message;
|
||||||
@ -332,9 +218,9 @@ namespace Elwig.Windows {
|
|||||||
LockInputs();
|
LockInputs();
|
||||||
UnlockSearchInputs();
|
UnlockSearchInputs();
|
||||||
FinishInputFilling();
|
FinishInputFilling();
|
||||||
await RefreshAreaCommitmentList();
|
await RefreshList();
|
||||||
RefreshInputs();
|
RefreshInputs();
|
||||||
SearchInput.Text = "";
|
ViewModel.SearchQuery = "";
|
||||||
ControlUtils.SelectItem(AreaCommitmentList, AreaCommitmentList.ItemsSource.Cast<AreaCom>().Where(a => a.FbNr == fbnr).FirstOrDefault());
|
ControlUtils.SelectItem(AreaCommitmentList, AreaCommitmentList.ItemsSource.Cast<AreaCom>().Where(a => a.FbNr == fbnr).FirstOrDefault());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -435,12 +321,13 @@ namespace Elwig.Windows {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private async void ActiveAreaCommitmentInput_Changed(object sender, RoutedEventArgs evt) {
|
private async void ActiveAreaCommitmentInput_Changed(object sender, RoutedEventArgs evt) {
|
||||||
await RefreshAreaCommitmentListQuery();
|
await RefreshList();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void SearchInput_TextChanged(object sender, RoutedEventArgs evt) {
|
private async void SearchInput_TextChanged(object sender, RoutedEventArgs evt) {
|
||||||
TextFilter = SearchInput.Text.ToLower().Split(" ").ToList().FindAll(e => e.Length > 0);
|
var binding = ((TextBox)sender).GetBindingExpression(TextBox.TextProperty);
|
||||||
await RefreshAreaCommitmentListQuery(true);
|
binding?.UpdateSource();
|
||||||
|
await RefreshList(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void KgInput_SelectionChanged(object sender, SelectionChangedEventArgs evt) {
|
private void KgInput_SelectionChanged(object sender, SelectionChangedEventArgs evt) {
|
||||||
|
Reference in New Issue
Block a user