Files
elwig/Elwig/Windows/BaseDataWindow.xaml.WineCult.cs
Lorenz Stechauner d1f67dc57d
All checks were successful
Test / Run tests (push) Successful in 2m10s
BaseDataWindow: Fix WineAttr/WineCult Id updates in payment variant data
2024-10-13 18:18:31 +02:00

132 lines
5.5 KiB
C#

using Elwig.Helpers;
using Elwig.Models.Entities;
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows;
namespace Elwig.Windows {
public partial class BaseDataWindow {
private Dictionary<string, string?>? _cults = null;
private Dictionary<WineCult, string>? _cultIds = null;
private ObservableCollection<WineCult>? _cultList = null;
private bool _cultChanged = false;
private bool _cultUpdate = false;
private async Task WineCultivationsInitEditing(AppDbContext ctx) {
_cultList = new(await ctx.WineCultivations
.OrderBy(c => c.Name)
.ToListAsync());
_cults = _cultList.ToDictionary(c => c.CultId, c => (string?)c.CultId);
_cultIds = _cultList.ToDictionary(c => c, c => c.CultId);
ControlUtils.RenewItemsSource(WineCultivationList, _cultList);
WineCultivationList_SelectionChanged(null, null);
}
private async Task WineCultivationsFinishEditing(AppDbContext ctx) {
ControlUtils.RenewItemsSource(WineCultivationList, await ctx.WineCultivations
.OrderBy(c => c.Name)
.ToListAsync());
_cultList = null;
_cults = null;
_cultIds = null;
_cultChanged = false;
WineCultivationAddButton.IsEnabled = false;
WineCultivationDeleteButton.IsEnabled = false;
}
private async Task WineCultivationsSave(AppDbContext ctx) {
if (!_cultChanged || _cultList == null || _cults == null || _cultIds == null)
return;
foreach (var (cultid, _) in _cults.Where(c => c.Value == null)) {
ctx.Remove(ctx.WineCultivations.Find(cultid)!);
}
foreach (var (cult, old) in _cultIds) {
cult.CultId = old;
}
foreach (var (old, cultid) in _cults.Where(c => c.Value != null)) {
ctx.Update(ctx.WineCultivations.Find(old)!);
}
await ctx.SaveChangesAsync();
foreach (var (old, cultid) in _cults.Where(c => c.Value != null)) {
await ctx.Database.ExecuteSqlAsync($"UPDATE wine_cultivation SET cultid = {cultid} WHERE cultid = {old}");
await ctx.Database.ExecuteSqlRawAsync($"UPDATE payment_variant SET data = REPLACE(data, '-{old}\"', '-{cultid}\"')");
}
await ctx.SaveChangesAsync();
foreach (var cult in _cultList.Where(c => !_cultIds.ContainsKey(c))) {
if (cult.CultId == null) continue;
ctx.Add(cult);
}
await ctx.SaveChangesAsync();
}
private void WineCultivationList_SelectionChanged(object? sender, SelectionChangedEventArgs? evt) {
UpdateButtons();
_cultUpdate = true;
if (WineCultivationList.SelectedItem is not WineCult cult) {
WineCultivationIdInput.Text = "";
WineCultivationNameInput.Text = "";
WineCultivationDescriptionInput.Text = "";
} else {
WineCultivationIdInput.Text = cult.CultId;
WineCultivationNameInput.Text = cult.Name;
WineCultivationDescriptionInput.Text = cult.Description;
}
_cultUpdate = false;
}
private void WineCultivationAddButton_Click(object sender, RoutedEventArgs evt) {
if (_cultList == null) return;
_cultChanged = true;
var item = new WineCult { CultId = "", Name = "" };
_cultList.Add(item);
WineCultivationList.SelectedItem = item;
UpdateButtons();
}
private void WineCultivationDeleteButton_Click(object sender, RoutedEventArgs evt) {
if (_cultList == null || _cults == null) return;
_cultChanged = true;
var idx = WineCultivationList.SelectedIndex;
var item = _cultList[idx];
_cults[item.CultId] = null;
_cultList.RemoveAt(idx);
WineCultivationList.SelectedIndex = idx < _cultList.Count ? idx : idx - 1;
UpdateButtons();
}
private void WineCultivation_Changed(object? sender, RoutedEventArgs? evt) {
if (_cultUpdate || (!IsEditing && !IsCreating) || WineCultivationList.SelectedItem is not WineCult cult || _cults == null || _cultIds == null) return;
_cultChanged = _cultChanged ||
WineCultivationIdInput.Text != cult.CultId ||
WineCultivationNameInput.Text != cult.Name ||
WineCultivationDescriptionInput.Text != (cult.Description ?? "");
var old = _cultIds.GetValueOrDefault(cult);
var id = WineCultivationIdInput.Text ?? "";
if (old != null) _cults[old] = id;
cult.CultId = id;
cult.Name = WineCultivationNameInput.Text ?? "";
cult.Description = WineCultivationDescriptionInput.Text ?? "";
if (cult.Description.Length == 0) cult.Description = null;
CollectionViewSource.GetDefaultView(_cultList).Refresh();
UpdateButtons();
}
private void WineCultivationIdInput_TextChanged(object sender, TextChangedEventArgs evt) {
UpperCaseInput_TextChanged(sender, evt);
WineCultivation_Changed(sender, evt);
}
}
}