Update DeliveryAdminWindow searching
This commit is contained in:
@ -97,11 +97,10 @@ namespace Elwig.Models {
|
|||||||
|
|
||||||
public int SearchScore(IEnumerable<string> keywords) {
|
public int SearchScore(IEnumerable<string> keywords) {
|
||||||
var list = new string?[] {
|
var list = new string?[] {
|
||||||
LsNr, Year.ToString(), Date.ToString("dd.MM.yyyy"), Time?.ToString("HH:mm"),
|
LsNr, Date.ToString("dd.MM.yyyy"), Time?.ToString("HH:mm"),
|
||||||
MgNr.ToString(), Member.FamilyName, Member.MiddleName, Member.GivenName, Member.BillingAddress?.Name,
|
Member.FamilyName, Member.MiddleName, Member.GivenName, Member.BillingAddress?.Name,
|
||||||
Comment
|
Comment
|
||||||
}.ToList();
|
}.ToList();
|
||||||
list.AddRange(Parts.Select(p => p.SortId).Distinct());
|
|
||||||
list.AddRange(Parts.Select(p => p.Comment).Distinct());
|
list.AddRange(Parts.Select(p => p.Comment).Distinct());
|
||||||
return Utils.GetSearchScore(list, keywords);
|
return Utils.GetSearchScore(list, keywords);
|
||||||
}
|
}
|
||||||
|
@ -80,14 +80,17 @@
|
|||||||
<ColumnDefinition Width="*"/>
|
<ColumnDefinition Width="*"/>
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
<TextBox x:Name="SearchInput" Grid.ColumnSpan="3" Margin="5,10,95,0" IsReadOnly="False"
|
<TextBox x:Name="SearchInput" Grid.ColumnSpan="3" Margin="5,10,161,0" IsReadOnly="False"
|
||||||
TextChanged="SearchInput_TextChanged"/>
|
TextChanged="SearchInput_TextChanged"/>
|
||||||
|
<xctk:IntegerUpDown Name="SeasonInput" Grid.ColumnSpan="3" Height="25" Width="56" FontSize="14" Minimum="1000" Maximum="9999"
|
||||||
|
Margin="0,10,100,0" VerticalAlignment="Top" HorizontalAlignment="Right"
|
||||||
|
ValueChanged="SeasonInput_ValueChanged"/>
|
||||||
<CheckBox x:Name="TodayOnlyInput" Content="Nur heute"
|
<CheckBox x:Name="TodayOnlyInput" Content="Nur heute"
|
||||||
HorizontalAlignment="Right" Margin="0,7,14.125,0" VerticalAlignment="Top" Grid.Column="1" Grid.ColumnSpan="2"
|
HorizontalAlignment="Right" Margin="0,7,18,0" VerticalAlignment="Top" Grid.Column="1" Grid.ColumnSpan="2"
|
||||||
Checked="TodayOnlyInput_Changed" Unchecked="TodayOnlyInput_Changed"/>
|
Checked="TodayOnlyInput_Changed" Unchecked="TodayOnlyInput_Changed"/>
|
||||||
<CheckBox x:Name="SeasonOnlyInput" Content="Nur Saison" IsChecked="True"
|
<CheckBox x:Name="AllSeasonsInput" Content="Jede Saison" IsEnabled="False"
|
||||||
HorizontalAlignment="Right" Margin="0,24,10,0" VerticalAlignment="Top" Grid.Column="1" Grid.ColumnSpan="2"
|
HorizontalAlignment="Right" Margin="0,24,10,0" VerticalAlignment="Top" Grid.Column="1" Grid.ColumnSpan="2"
|
||||||
Checked="SeasonOnlyInput_Changed" Unchecked="SeasonOnlyInput_Changed"/>
|
Checked="AllSeasonsInput_Changed" Unchecked="AllSeasonsInput_Changed"/>
|
||||||
<DataGrid x:Name="DeliveryList" AutoGenerateColumns="False" HeadersVisibility="Column" IsReadOnly="True" GridLinesVisibility="None" SelectionMode="Single"
|
<DataGrid x:Name="DeliveryList" AutoGenerateColumns="False" HeadersVisibility="Column" IsReadOnly="True" GridLinesVisibility="None" SelectionMode="Single"
|
||||||
SelectionChanged="DeliveryList_SelectionChanged"
|
SelectionChanged="DeliveryList_SelectionChanged"
|
||||||
CanUserDeleteRows="False" CanUserResizeRows="False" CanUserAddRows="False"
|
CanUserDeleteRows="False" CanUserResizeRows="False" CanUserAddRows="False"
|
||||||
|
@ -41,7 +41,7 @@ namespace Elwig.Windows {
|
|||||||
WeightInput
|
WeightInput
|
||||||
};
|
};
|
||||||
ExemptInputs = new Control[] {
|
ExemptInputs = new Control[] {
|
||||||
SearchInput, TodayOnlyInput, SeasonOnlyInput,
|
SearchInput, SeasonInput, TodayOnlyInput, AllSeasonsInput,
|
||||||
DeliveryList, DeliveryPartList,
|
DeliveryList, DeliveryPartList,
|
||||||
MemberAddressField,
|
MemberAddressField,
|
||||||
};
|
};
|
||||||
@ -56,6 +56,7 @@ namespace Elwig.Windows {
|
|||||||
|
|
||||||
InitializeDelayTimer(SearchInput, SearchInput_TextChanged);
|
InitializeDelayTimer(SearchInput, SearchInput_TextChanged);
|
||||||
SearchInput.TextChanged -= SearchInput_TextChanged;
|
SearchInput.TextChanged -= SearchInput_TextChanged;
|
||||||
|
SeasonInput.Value = Utils.CurrentLastSeason;
|
||||||
|
|
||||||
if (IsReceipt) {
|
if (IsReceipt) {
|
||||||
Title = "Übernahme - Elwig";
|
Title = "Übernahme - Elwig";
|
||||||
@ -78,6 +79,8 @@ namespace Elwig.Windows {
|
|||||||
public DeliveryAdminWindow(int mgnr) : this() {
|
public DeliveryAdminWindow(int mgnr) : this() {
|
||||||
Member = Context.Members.Find(mgnr) ?? throw new ArgumentException("MgNr argument has invalid value");
|
Member = Context.Members.Find(mgnr) ?? throw new ArgumentException("MgNr argument has invalid value");
|
||||||
Title = $"Lieferungen - {Member.AdministrativeName} - Elwig";
|
Title = $"Lieferungen - {Member.AdministrativeName} - Elwig";
|
||||||
|
AllSeasonsInput.IsEnabled = true;
|
||||||
|
AllSeasonsInput.IsChecked = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void Window_Loaded(object sender, RoutedEventArgs evt) {
|
private async void Window_Loaded(object sender, RoutedEventArgs evt) {
|
||||||
@ -158,12 +161,61 @@ namespace Elwig.Windows {
|
|||||||
deliveryQuery = deliveryQuery
|
deliveryQuery = deliveryQuery
|
||||||
.Where(d => (d.DateString == Utils.Today.ToString("yyyy-MM-dd") && d.TimeString.CompareTo("03:00:00") > 0) ||
|
.Where(d => (d.DateString == Utils.Today.ToString("yyyy-MM-dd") && d.TimeString.CompareTo("03:00:00") > 0) ||
|
||||||
(d.DateString == Utils.Today.AddDays(1).ToString("yyyy-MM-dd") && d.TimeString.CompareTo("03:00:00") <= 0));
|
(d.DateString == Utils.Today.AddDays(1).ToString("yyyy-MM-dd") && d.TimeString.CompareTo("03:00:00") <= 0));
|
||||||
} else if (SeasonOnlyInput.IsChecked == true) {
|
} else if (AllSeasonsInput.IsChecked == false) {
|
||||||
deliveryQuery = deliveryQuery.Where(d => d.Year == Utils.CurrentLastSeason);
|
deliveryQuery = deliveryQuery.Where(d => d.Year == SeasonInput.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
var filter = TextFilter.ToList();
|
||||||
|
if (filter.Count > 0) {
|
||||||
|
var var = await Context.WineVarieties.Select(v => v.SortId).ToListAsync();
|
||||||
|
var qual = await Context.WineQualityLevels.Select(q => q.QualId).ToListAsync();
|
||||||
|
var mgnr = await Context.Members.Select(m => m.MgNr.ToString()).ToListAsync();
|
||||||
|
var filterVar = new List<string>();
|
||||||
|
var filterQual = new List<string>();
|
||||||
|
var filterMgNr = new List<int>();
|
||||||
|
double filterKmwGt = 0;
|
||||||
|
double filterKmwLt = 0;
|
||||||
|
double filterOeGt = 0;
|
||||||
|
double filterOeLt = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < filter.Count; i++) {
|
||||||
|
var e = filter[i];
|
||||||
|
if (e.Length == 2 && var.Contains(e.ToUpper())) {
|
||||||
|
filterVar.Add(e.ToUpper());
|
||||||
|
filter.RemoveAt(i--);
|
||||||
|
} else if (e.Length == 3 && qual.Contains(e.ToUpper())) {
|
||||||
|
filterQual.Add(e.ToUpper());
|
||||||
|
filter.RemoveAt(i--);
|
||||||
|
} else if (e.All(char.IsAsciiDigit) && mgnr.Contains(e)) {
|
||||||
|
filterMgNr.Add(int.Parse(e));
|
||||||
|
filter.RemoveAt(i--);
|
||||||
|
} else if (e.StartsWith(">") || e.StartsWith("<")) {
|
||||||
|
if (double.TryParse(e[1..], out var res)) {
|
||||||
|
switch ((e[0], res)) {
|
||||||
|
case ('>', <= 30): filterKmwGt = res; break;
|
||||||
|
case ('<', <= 30): filterKmwLt = res; break;
|
||||||
|
case ('>', _): filterOeGt = res; break;
|
||||||
|
case ('<', _): filterOeLt = res; break;
|
||||||
|
}
|
||||||
|
filter.RemoveAt(i--);
|
||||||
|
}
|
||||||
|
if (e.Length == 1) filter.RemoveAt(i--);
|
||||||
|
} else if (e.Length > 2 && e.StartsWith("\"") && e.EndsWith("\"")) {
|
||||||
|
filter[i] = e[1..^1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filterMgNr.Count > 0) deliveryQuery = deliveryQuery.Where(d => filterMgNr.Contains(d.MgNr));
|
||||||
|
if (filterVar.Count > 0) deliveryQuery = deliveryQuery.Where(d => d.Parts.Any(p => filterVar.Contains(p.SortId)));
|
||||||
|
if (filterQual.Count > 0) deliveryQuery = deliveryQuery.Where(d => d.Parts.Any(p => filterQual.Contains(p.QualId)));
|
||||||
|
if (filterKmwGt > 0) deliveryQuery = deliveryQuery.Where(d => d.Parts.Any(p => p.Kmw >= filterKmwGt));
|
||||||
|
if (filterKmwLt > 0) deliveryQuery = deliveryQuery.Where(d => d.Parts.Any(p => p.Kmw < filterKmwLt));
|
||||||
|
if (filterOeGt > 0) deliveryQuery = deliveryQuery.Where(d => d.Parts.Any(p => p.Kmw * (4.54 + 0.022 * p.Kmw) >= filterOeGt));
|
||||||
|
if (filterOeLt > 0) deliveryQuery = deliveryQuery.Where(d => d.Parts.Any(p => p.Kmw * (4.54 + 0.022 * p.Kmw) < filterOeLt));
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Delivery> deliveries = await deliveryQuery.OrderByDescending(d => d.DateString).ThenByDescending(d => d.TimeString).ToListAsync();
|
List<Delivery> deliveries = await deliveryQuery.OrderByDescending(d => d.DateString).ThenByDescending(d => d.TimeString).ToListAsync();
|
||||||
if (TextFilter.Count > 0) {
|
if (filter.Count > 0 && deliveries.Count > 0) {
|
||||||
var dict = deliveries
|
var dict = deliveries
|
||||||
.ToDictionary(d => d, d => d.SearchScore(TextFilter))
|
.ToDictionary(d => d, d => d.SearchScore(TextFilter))
|
||||||
.OrderByDescending(a => a.Value)
|
.OrderByDescending(a => a.Value)
|
||||||
@ -451,14 +503,31 @@ namespace Elwig.Windows {
|
|||||||
await RefreshDeliveryListQuery(true);
|
await RefreshDeliveryListQuery(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void TodayOnlyInput_Changed(object sender, RoutedEventArgs evt) {
|
private async void SeasonInput_ValueChanged(object sender, RoutedEventArgs evt) {
|
||||||
if (TodayOnlyInput.IsChecked == true && SeasonOnlyInput.IsChecked == true) SeasonOnlyInput.IsChecked = false;
|
if (SeasonInput.Value == null) return;
|
||||||
|
TodayOnlyInput.IsChecked = false;
|
||||||
|
AllSeasonsInput.IsChecked = false;
|
||||||
await RefreshDeliveryListQuery();
|
await RefreshDeliveryListQuery();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void SeasonOnlyInput_Changed(object sender, RoutedEventArgs evt) {
|
private async void TodayOnlyInput_Changed(object sender, RoutedEventArgs evt) {
|
||||||
if (!IsInitialized) return;
|
if (TodayOnlyInput.IsChecked == true && AllSeasonsInput.IsChecked == false) {
|
||||||
if (SeasonOnlyInput.IsChecked == true && TodayOnlyInput.IsChecked == true) TodayOnlyInput.IsChecked = false;
|
SeasonInput.Value = Utils.Today.Year;
|
||||||
|
TodayOnlyInput.IsChecked = true;
|
||||||
|
}
|
||||||
|
await RefreshDeliveryListQuery();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void AllSeasonsInput_Changed(object sender, RoutedEventArgs evt) {
|
||||||
|
if (AllSeasonsInput.IsChecked == true) {
|
||||||
|
SeasonInput.IsEnabled = false;
|
||||||
|
SeasonInput.Text = "";
|
||||||
|
} else {
|
||||||
|
SeasonInput.IsEnabled = true;
|
||||||
|
var today = TodayOnlyInput.IsChecked;
|
||||||
|
SeasonInput.Value = Utils.CurrentLastSeason;
|
||||||
|
TodayOnlyInput.IsChecked = today;
|
||||||
|
}
|
||||||
await RefreshDeliveryListQuery();
|
await RefreshDeliveryListQuery();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -518,7 +587,7 @@ namespace Elwig.Windows {
|
|||||||
var p = await UpdateDeliveryPart(DeliveryList.SelectedItem as Delivery, DeliveryPartList.SelectedItem as DeliveryPart);
|
var p = await UpdateDeliveryPart(DeliveryList.SelectedItem as Delivery, DeliveryPartList.SelectedItem as DeliveryPart);
|
||||||
await RefreshDeliveryList();
|
await RefreshDeliveryList();
|
||||||
RefreshDeliveryParts();
|
RefreshDeliveryParts();
|
||||||
DeliveryList.SelectedItem = p.Delivery;
|
DeliveryList.SelectedItem = p?.Delivery;
|
||||||
DeliveryPartList.SelectedItem = null;
|
DeliveryPartList.SelectedItem = null;
|
||||||
InitialInputs();
|
InitialInputs();
|
||||||
}
|
}
|
||||||
@ -528,7 +597,7 @@ namespace Elwig.Windows {
|
|||||||
var p = await UpdateDeliveryPart(DeliveryList.SelectedItem as Delivery, DeliveryPartList.SelectedItem as DeliveryPart);
|
var p = await UpdateDeliveryPart(DeliveryList.SelectedItem as Delivery, DeliveryPartList.SelectedItem as DeliveryPart);
|
||||||
await RefreshDeliveryList();
|
await RefreshDeliveryList();
|
||||||
RefreshDeliveryParts();
|
RefreshDeliveryParts();
|
||||||
if (p != null) {
|
if (p?.Delivery != null) {
|
||||||
using var doc = new DeliveryNote(p.Delivery);
|
using var doc = new DeliveryNote(p.Delivery);
|
||||||
await doc.Generate();
|
await doc.Generate();
|
||||||
doc.Show();
|
doc.Show();
|
||||||
@ -747,14 +816,16 @@ namespace Elwig.Windows {
|
|||||||
|
|
||||||
private void LockSearchInputs() {
|
private void LockSearchInputs() {
|
||||||
SearchInput.IsEnabled = false;
|
SearchInput.IsEnabled = false;
|
||||||
|
SeasonInput.IsEnabled = false;
|
||||||
TodayOnlyInput.IsEnabled = false;
|
TodayOnlyInput.IsEnabled = false;
|
||||||
SeasonOnlyInput.IsEnabled = false;
|
AllSeasonsInput.IsEnabled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UnlockSearchInputs() {
|
private void UnlockSearchInputs() {
|
||||||
SearchInput.IsEnabled = true;
|
SearchInput.IsEnabled = true;
|
||||||
|
SeasonInput.IsEnabled = true;
|
||||||
TodayOnlyInput.IsEnabled = true;
|
TodayOnlyInput.IsEnabled = true;
|
||||||
SeasonOnlyInput.IsEnabled = true;
|
AllSeasonsInput.IsEnabled = (Member != null);
|
||||||
}
|
}
|
||||||
|
|
||||||
new protected void UnlockInputs() {
|
new protected void UnlockInputs() {
|
||||||
|
Reference in New Issue
Block a user