ContextWindow: Add HasContextLoaded property

This commit is contained in:
2026-04-05 22:44:52 +02:00
parent d051a2bfcf
commit e5e5e10cd7
9 changed files with 24 additions and 28 deletions

View File

@@ -104,6 +104,7 @@ namespace Elwig.Windows {
cb.SelectionChanged += ComboBox_SelectionChanged; cb.SelectionChanged += ComboBox_SelectionChanged;
foreach (var lb in ListBoxInputs) foreach (var lb in ListBoxInputs)
lb.SelectionChanged += ComboBox_SelectionChanged; lb.SelectionChanged += ComboBox_SelectionChanged;
LockInputs();
} }
private void OnClosing(object? sender, CancelEventArgs evt) { private void OnClosing(object? sender, CancelEventArgs evt) {

View File

@@ -39,10 +39,6 @@ namespace Elwig.Windows {
ViewModel.FilterSeason = Utils.CurrentYear; ViewModel.FilterSeason = Utils.CurrentYear;
} }
protected override async Task OnInit(AppDbContext ctx) {
LockInputs();
}
private void FocusSearchInput(object sender, RoutedEventArgs evt) { private void FocusSearchInput(object sender, RoutedEventArgs evt) {
if (!IsEditing && !IsCreating) { if (!IsEditing && !IsCreating) {
SearchInput.Focus(); SearchInput.Focus();
@@ -451,17 +447,19 @@ namespace Elwig.Windows {
} }
private async void ActiveAreaCommitmentInput_Changed(object sender, RoutedEventArgs evt) { private async void ActiveAreaCommitmentInput_Changed(object sender, RoutedEventArgs evt) {
if (!HasContextLoaded) return;
await RefreshList(); await RefreshList();
} }
private async void SearchInput_TextChanged(object sender, RoutedEventArgs evt) { private async void SearchInput_TextChanged(object sender, RoutedEventArgs evt) {
if (!HasContextLoaded) return;
var binding = ((TextBox)sender).GetBindingExpression(TextBox.TextProperty); var binding = ((TextBox)sender).GetBindingExpression(TextBox.TextProperty);
binding?.UpdateSource(); binding?.UpdateSource();
await RefreshList(true); await RefreshList(true);
} }
private async void SeasonInput_TextChanged(object sender, TextChangedEventArgs evt) { private async void SeasonInput_TextChanged(object sender, TextChangedEventArgs evt) {
if (ViewModel.FilterSeason == null) return; if (!HasContextLoaded || ViewModel.FilterSeason == null) return;
await RefreshList(); await RefreshList();
} }

View File

@@ -153,10 +153,6 @@ namespace Elwig.Windows {
ParameterExportEbicsAddress.IsEnabled = true; ParameterExportEbicsAddress.IsEnabled = true;
} }
protected override async Task OnInit(AppDbContext ctx) {
LockInputs();
}
protected override async Task OnRenewContext(AppDbContext ctx) { protected override async Task OnRenewContext(AppDbContext ctx) {
await base.OnRenewContext(ctx); await base.OnRenewContext(ctx);
FillInputs(App.Client, await ctx.FetchSeasons(Utils.CurrentLastSeason).SingleOrDefaultAsync()); FillInputs(App.Client, await ctx.FetchSeasons(Utils.CurrentLastSeason).SingleOrDefaultAsync());

View File

@@ -18,6 +18,8 @@ namespace Elwig.Windows {
} }
} }
protected bool HasContextLoaded { get; private set; }
private bool _renewPending = false; private bool _renewPending = false;
private readonly RoutedCommand CtrlR = new("CtrlR", typeof(ContextWindow), [new KeyGesture(Key.R, ModifierKeys.Control)]); private readonly RoutedCommand CtrlR = new("CtrlR", typeof(ContextWindow), [new KeyGesture(Key.R, ModifierKeys.Control)]);
@@ -51,6 +53,7 @@ namespace Elwig.Windows {
Mouse.OverrideCursor = Cursors.AppStarting; Mouse.OverrideCursor = Cursors.AppStarting;
using var ctx = new AppDbContext(); using var ctx = new AppDbContext();
await OnRenewContext(ctx); await OnRenewContext(ctx);
HasContextLoaded = true;
await OnInit(ctx); await OnInit(ctx);
Mouse.OverrideCursor = null; Mouse.OverrideCursor = null;
} }

View File

@@ -122,7 +122,8 @@ namespace Elwig.Windows {
Menu_Export_UploadSeason.IsEnabled = App.Config.SyncUrl != null; Menu_Export_UploadSeason.IsEnabled = App.Config.SyncUrl != null;
} }
public DeliveryAdminWindow(int mgnr) : this() { public DeliveryAdminWindow(int mgnr) :
this() {
ViewModel.FilterMember = DeliveryService.GetMember(mgnr) ?? throw new ArgumentException("MgNr argument has invalid value"); ViewModel.FilterMember = DeliveryService.GetMember(mgnr) ?? throw new ArgumentException("MgNr argument has invalid value");
ViewModel.Title = $"Lieferungen - {ViewModel.FilterMember.AdministrativeName} - Elwig"; ViewModel.Title = $"Lieferungen - {ViewModel.FilterMember.AdministrativeName} - Elwig";
ViewModel.EnableAllSeasons = true; ViewModel.EnableAllSeasons = true;
@@ -132,7 +133,6 @@ namespace Elwig.Windows {
await base.OnInit(ctx); await base.OnInit(ctx);
OnSecondPassed(null, null); OnSecondPassed(null, null);
SecondsTimer.Start(); SecondsTimer.Start();
LockInputs();
if (ViewModel.IsReceipt) { if (ViewModel.IsReceipt) {
NewDeliveryButton_Click(null, null); NewDeliveryButton_Click(null, null);
if (await ctx.FetchSeasons(Utils.CurrentYear).SingleOrDefaultAsync() == null) { if (await ctx.FetchSeasons(Utils.CurrentYear).SingleOrDefaultAsync() == null) {
@@ -541,8 +541,6 @@ namespace Elwig.Windows {
await RefreshList(); await RefreshList();
var d = DeliveryList.SelectedItem as Delivery;
var y = d?.Year ?? ViewModel.FilterSeason ?? Utils.CurrentYear;
ControlUtils.RenewItemsSource(MemberInput, await ctx.FetchMembers(includeNotActive: !IsCreating, includeContactInfo: true).ToListAsync()); ControlUtils.RenewItemsSource(MemberInput, await ctx.FetchMembers(includeNotActive: !IsCreating, includeContactInfo: true).ToListAsync());
ControlUtils.RenewItemsSource(BranchInput, await ctx.FetchBranches().ToListAsync()); ControlUtils.RenewItemsSource(BranchInput, await ctx.FetchBranches().ToListAsync());
ControlUtils.RenewItemsSource(WineVarietyInput, await ctx.FetchWineVarieties().ToListAsync()); ControlUtils.RenewItemsSource(WineVarietyInput, await ctx.FetchWineVarieties().ToListAsync());
@@ -678,17 +676,19 @@ namespace Elwig.Windows {
} }
private async void SearchInput_TextChanged(object sender, RoutedEventArgs evt) { private async void SearchInput_TextChanged(object sender, RoutedEventArgs evt) {
if (!HasContextLoaded) return;
await RefreshList(true); await RefreshList(true);
} }
private async void SeasonInput_TextChanged(object sender, TextChangedEventArgs evt) { private async void SeasonInput_TextChanged(object sender, TextChangedEventArgs evt) {
if (ViewModel.FilterSeason == null || TodayOnlyInput == null || AllSeasonsInput == null) return; if (!HasContextLoaded || ViewModel.FilterSeason == null || TodayOnlyInput == null || AllSeasonsInput == null) return;
TodayOnlyInput.IsChecked = false; TodayOnlyInput.IsChecked = false;
AllSeasonsInput.IsChecked = false; AllSeasonsInput.IsChecked = false;
await RefreshList(); await RefreshList();
} }
private async void TodayOnlyInput_Changed(object sender, RoutedEventArgs evt) { private async void TodayOnlyInput_Changed(object sender, RoutedEventArgs evt) {
if (!HasContextLoaded) return;
if (TodayOnlyInput.IsChecked == true && AllSeasonsInput.IsChecked == false) { if (TodayOnlyInput.IsChecked == true && AllSeasonsInput.IsChecked == false) {
ViewModel.FilterSeason = Utils.Today.Year; ViewModel.FilterSeason = Utils.Today.Year;
ViewModel.FilterTodayOnly = true; ViewModel.FilterTodayOnly = true;
@@ -697,6 +697,7 @@ namespace Elwig.Windows {
} }
private async void AllSeasonsInput_Changed(object sender, RoutedEventArgs evt) { private async void AllSeasonsInput_Changed(object sender, RoutedEventArgs evt) {
if (!HasContextLoaded) return;
if (AllSeasonsInput.IsChecked == true) { if (AllSeasonsInput.IsChecked == true) {
SeasonInput.IsEnabled = false; SeasonInput.IsEnabled = false;
ViewModel.FilterSeason = null; ViewModel.FilterSeason = null;

View File

@@ -39,10 +39,6 @@ namespace Elwig.Windows {
ViewModel.FilterOnlyUpcoming = true; ViewModel.FilterOnlyUpcoming = true;
} }
protected override async Task OnInit(AppDbContext ctx) {
LockInputs();
}
private void Input_KeyUp(object sender, KeyEventArgs evt) { private void Input_KeyUp(object sender, KeyEventArgs evt) {
if (sender is not Control ctrl) return; if (sender is not Control ctrl) return;
if (evt.Key != Key.Enter) return; if (evt.Key != Key.Enter) return;
@@ -193,6 +189,7 @@ namespace Elwig.Windows {
} }
private async void DeliveryScheduleList_SelectionChanged(object sender, RoutedEventArgs evt) { private async void DeliveryScheduleList_SelectionChanged(object sender, RoutedEventArgs evt) {
if (!HasContextLoaded) return;
await RefreshList(); await RefreshList();
if (DeliveryScheduleList.SelectedItem is DeliverySchedule s) { if (DeliveryScheduleList.SelectedItem is DeliverySchedule s) {
Menu_DeliveryAncmtList_SaveSelected.IsEnabled = !IsEditing && !IsCreating; Menu_DeliveryAncmtList_SaveSelected.IsEnabled = !IsEditing && !IsCreating;
@@ -214,11 +211,13 @@ namespace Elwig.Windows {
} }
private async void OnlyUpcomingInput_Changed(object sender, RoutedEventArgs evt) { private async void OnlyUpcomingInput_Changed(object sender, RoutedEventArgs evt) {
if (!HasContextLoaded) return;
await RefreshDeliveryScheduleList(); await RefreshDeliveryScheduleList();
await RefreshList(true); await RefreshList(true);
} }
private async void FromAllSchedulesInput_Changed(object sender, RoutedEventArgs evt) { private async void FromAllSchedulesInput_Changed(object sender, RoutedEventArgs evt) {
if (!HasContextLoaded) return;
if (ViewModel.FilterFromAllSchedules) { if (ViewModel.FilterFromAllSchedules) {
DeliveryScheduleList.SelectedItem = null; DeliveryScheduleList.SelectedItem = null;
} else if (DeliveryScheduleList.SelectedItem == null) { } else if (DeliveryScheduleList.SelectedItem == null) {
@@ -228,11 +227,12 @@ namespace Elwig.Windows {
} }
private async void SearchInput_TextChanged(object sender, TextChangedEventArgs evt) { private async void SearchInput_TextChanged(object sender, TextChangedEventArgs evt) {
if (!HasContextLoaded) return;
await RefreshList(true); await RefreshList(true);
} }
private async void SeasonInput_TextChanged(object sender, TextChangedEventArgs evt) { private async void SeasonInput_TextChanged(object sender, TextChangedEventArgs evt) {
if (ViewModel.FilterSeason == null) return; if (!HasContextLoaded || ViewModel.FilterSeason == null) return;
ViewModel.FilterOnlyUpcoming = false; ViewModel.FilterOnlyUpcoming = false;
await RefreshDeliveryScheduleList(); await RefreshDeliveryScheduleList();
await RefreshList(); await RefreshList();

View File

@@ -33,10 +33,6 @@ namespace Elwig.Windows {
ViewModel.FilterOnlyUpcoming = true; ViewModel.FilterOnlyUpcoming = true;
} }
protected override async Task OnInit(AppDbContext ctx) {
LockInputs();
}
private async Task RefreshList(bool updateSort = false) { private async Task RefreshList(bool updateSort = false) {
var vm = ViewModel; var vm = ViewModel;
var cursor = Mouse.OverrideCursor != null; var cursor = Mouse.OverrideCursor != null;
@@ -124,15 +120,17 @@ namespace Elwig.Windows {
} }
private async void OnlyUpcomingInput_Changed(object sender, RoutedEventArgs evt) { private async void OnlyUpcomingInput_Changed(object sender, RoutedEventArgs evt) {
if (!HasContextLoaded) return;
await RefreshList(); await RefreshList();
} }
private async void SearchInput_TextChanged(object sender, TextChangedEventArgs evt) { private async void SearchInput_TextChanged(object sender, TextChangedEventArgs evt) {
if (!HasContextLoaded) return;
await RefreshList(true); await RefreshList(true);
} }
private async void SeasonInput_TextChanged(object sender, TextChangedEventArgs evt) { private async void SeasonInput_TextChanged(object sender, TextChangedEventArgs evt) {
if (ViewModel.FilterSeason == null) return; if (!HasContextLoaded || ViewModel.FilterSeason == null) return;
ViewModel.FilterOnlyUpcoming = false; ViewModel.FilterOnlyUpcoming = false;
await RefreshList(); await RefreshList();
} }

View File

@@ -41,6 +41,7 @@ namespace Elwig.Windows {
} }
protected override async Task OnInit(AppDbContext ctx) { protected override async Task OnInit(AppDbContext ctx) {
await base.OnInit(ctx);
if (Utils.HasInternetConnectivity()) { if (Utils.HasInternetConnectivity()) {
CheckSync(200); CheckSync(200);
} }

View File

@@ -83,11 +83,8 @@ namespace Elwig.Windows {
Menu_Export_UploadFilters.IsEnabled = App.Config.SyncUrl != null; Menu_Export_UploadFilters.IsEnabled = App.Config.SyncUrl != null;
Menu_Export_UploadAll.IsEnabled = App.Config.SyncUrl != null; Menu_Export_UploadAll.IsEnabled = App.Config.SyncUrl != null;
ViewModel.ShowOnlyActiveMembers = true; ViewModel.ShowOnlyActiveMembers = true;
}
protected override async Task OnInit(AppDbContext ctx) {
UpdateContactInfoVisibility(); UpdateContactInfoVisibility();
LockInputs();
} }
public void FocusMember(int mgnr) { public void FocusMember(int mgnr) {
@@ -334,7 +331,7 @@ namespace Elwig.Windows {
} }
private async void ActiveMemberInput_Changed(object sender, RoutedEventArgs evt) { private async void ActiveMemberInput_Changed(object sender, RoutedEventArgs evt) {
if (!IsInitialized) return; if (!HasContextLoaded) return;
await RefreshList(); await RefreshList();
} }
@@ -491,6 +488,7 @@ namespace Elwig.Windows {
} }
private async void SearchInput_TextChanged(object sender, RoutedEventArgs evt) { private async void SearchInput_TextChanged(object sender, RoutedEventArgs evt) {
if (!HasContextLoaded) return;
await RefreshList(true); await RefreshList(true);
} }