156 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			156 lines
		
	
	
		
			7.1 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?>? _attrs = null;
 | 
						|
        private Dictionary<WineAttr, string>? _attrIds = null;
 | 
						|
        private ObservableCollection<WineAttr>? _attrList = null;
 | 
						|
        private bool _attrChanged = false;
 | 
						|
        private bool _attrUpdate = false;
 | 
						|
 | 
						|
        private async Task WineAttributesInitEditing(AppDbContext ctx) {
 | 
						|
            _attrList = new(await ctx.WineAttributes
 | 
						|
                .OrderBy(a => a.Name)
 | 
						|
                .ToListAsync());
 | 
						|
            _attrs = _attrList.ToDictionary(a => a.AttrId, a => (string?)a.AttrId);
 | 
						|
            _attrIds = _attrList.ToDictionary(a => a, a => a.AttrId);
 | 
						|
            ControlUtils.RenewItemsSource(WineAttributeList, _attrList);
 | 
						|
            WineAttributeList_SelectionChanged(null, null);
 | 
						|
        }
 | 
						|
 | 
						|
        private async Task WineAttributesFinishEditing(AppDbContext ctx) {
 | 
						|
            ControlUtils.RenewItemsSource(WineAttributeList, await ctx.WineAttributes
 | 
						|
                .OrderBy(a => a.Name)
 | 
						|
                .ToListAsync());
 | 
						|
            _attrList = null;
 | 
						|
            _attrs = null;
 | 
						|
            _attrIds = null;
 | 
						|
            _attrChanged = false;
 | 
						|
 | 
						|
            WineAttributeAddButton.IsEnabled = false;
 | 
						|
            WineAttributeDeleteButton.IsEnabled = false;
 | 
						|
        }
 | 
						|
 | 
						|
        private async Task WineAttributesSave(AppDbContext ctx) {
 | 
						|
            if (!_attrChanged || _attrList == null || _attrs == null || _attrIds == null)
 | 
						|
                return;
 | 
						|
 | 
						|
            foreach (var (attrid, _) in _attrs.Where(a => a.Value == null)) {
 | 
						|
                ctx.Remove(ctx.WineAttributes.Find(attrid)!);
 | 
						|
            }
 | 
						|
            foreach (var (attr, old) in _attrIds) {
 | 
						|
                attr.AttrId = old;
 | 
						|
            }
 | 
						|
            foreach (var (old, attrid) in _attrs.Where(a => a.Value != null)) {
 | 
						|
                ctx.Update(ctx.WineAttributes.Find(old)!);
 | 
						|
            }
 | 
						|
            await ctx.SaveChangesAsync();
 | 
						|
 | 
						|
            foreach (var (old, attrid) in _attrs.Where(a => a.Value != null)) {
 | 
						|
                await ctx.Database.ExecuteSqlAsync($"UPDATE wine_attribute SET attrid = {attrid} WHERE attrid = {old}");
 | 
						|
                await ctx.Database.ExecuteSqlAsync($"UPDATE area_commitment_type SET vtrgid = (sortid || COALESCE(attrid, '') || COALESCE(disc, '')) WHERE attrid = {attrid}");
 | 
						|
                await ctx.Database.ExecuteSqlRawAsync($"UPDATE payment_variant SET data = REPLACE(REPLACE(data, '/{old}\"', '/{attrid}\"'), '/{old}-', '/{attrid}-')");
 | 
						|
            }
 | 
						|
            await ctx.SaveChangesAsync();
 | 
						|
 | 
						|
            foreach (var attr in _attrList.Where(a => !_attrIds.ContainsKey(a))) {
 | 
						|
                if (attr.AttrId == null) continue;
 | 
						|
                ctx.Add(attr);
 | 
						|
            }
 | 
						|
            await ctx.SaveChangesAsync();
 | 
						|
        }
 | 
						|
 | 
						|
        private void WineAttributeList_SelectionChanged(object? sender, SelectionChangedEventArgs? evt) {
 | 
						|
            UpdateButtons();
 | 
						|
            _attrUpdate = true;
 | 
						|
            if (WineAttributeList.SelectedItem is not WineAttr attr) {
 | 
						|
                WineAttributeIdInput.Text = "";
 | 
						|
                WineAttributeNameInput.Text = "";
 | 
						|
                WineAttributeActiveInput.IsChecked = false;
 | 
						|
                WineAttributeMaxKgPerHaInput.Text = "";
 | 
						|
                WineAttributeStrictInput.IsChecked = false;
 | 
						|
                WineAttributeFillLowerInput.SelectedItem = null;
 | 
						|
            } else {
 | 
						|
                WineAttributeIdInput.Text = attr.AttrId;
 | 
						|
                WineAttributeNameInput.Text = attr.Name;
 | 
						|
                WineAttributeActiveInput.IsChecked = attr.IsActive;
 | 
						|
                WineAttributeMaxKgPerHaInput.Text = attr.MaxKgPerHa?.ToString() ?? "";
 | 
						|
                WineAttributeStrictInput.IsChecked = attr.IsStrict;
 | 
						|
                WineAttributeFillLowerInput.SelectedIndex = attr.FillLower;
 | 
						|
            }
 | 
						|
            _attrUpdate = false;
 | 
						|
        }
 | 
						|
 | 
						|
        private void WineAttributeAddButton_Click(object sender, RoutedEventArgs evt) {
 | 
						|
            if (_attrList == null) return;
 | 
						|
            _attrChanged = true;
 | 
						|
            var item = new WineAttr { AttrId = "", Name = "" };
 | 
						|
            _attrList.Add(item);
 | 
						|
            WineAttributeList.SelectedItem = item;
 | 
						|
            UpdateButtons();
 | 
						|
        }
 | 
						|
 | 
						|
        private void WineAttributeDeleteButton_Click(object sender, RoutedEventArgs evt) {
 | 
						|
            if (_attrList == null || _attrs == null) return;
 | 
						|
            _attrChanged = true;
 | 
						|
            var idx = WineAttributeList.SelectedIndex;
 | 
						|
            var item = _attrList[idx];
 | 
						|
            _attrs[item.AttrId] = null;
 | 
						|
            _attrList.RemoveAt(idx);
 | 
						|
            WineAttributeList.SelectedIndex = idx < _attrList.Count ? idx : idx - 1;
 | 
						|
            UpdateButtons();
 | 
						|
        }
 | 
						|
 | 
						|
        private void WineAttribute_Changed(object? sender, RoutedEventArgs? evt) {
 | 
						|
            if (_attrUpdate || (!IsEditing && !IsCreating) || WineAttributeList.SelectedItem is not WineAttr attr || _attrs == null || _attrIds == null) return;
 | 
						|
            _attrChanged = _attrChanged ||
 | 
						|
                WineAttributeIdInput.Text != attr.AttrId ||
 | 
						|
                WineAttributeNameInput.Text != attr.Name ||
 | 
						|
                WineAttributeActiveInput.IsChecked != attr.IsActive ||
 | 
						|
                WineAttributeMaxKgPerHaInput.Text != attr.MaxKgPerHa?.ToString() ||
 | 
						|
                WineAttributeStrictInput.IsChecked != attr.IsStrict ||
 | 
						|
                WineAttributeFillLowerInput.SelectedIndex != attr.FillLower;
 | 
						|
 | 
						|
            var old = _attrIds.GetValueOrDefault(attr);
 | 
						|
            var id = WineAttributeIdInput.Text;
 | 
						|
            if (old != null) _attrs[old] = id;
 | 
						|
            attr.AttrId = id;
 | 
						|
            attr.Name = WineAttributeNameInput.Text ?? "";
 | 
						|
            attr.IsActive = WineAttributeActiveInput.IsChecked ?? false;
 | 
						|
            attr.MaxKgPerHa = WineAttributeMaxKgPerHaInput.Text.Length > 0 ? int.Parse(WineAttributeMaxKgPerHaInput.Text) : null;
 | 
						|
            attr.IsStrict = WineAttributeStrictInput.IsChecked ?? false;
 | 
						|
            attr.FillLower = WineAttributeFillLowerInput.SelectedIndex;
 | 
						|
 | 
						|
            CollectionViewSource.GetDefaultView(_attrList).Refresh();
 | 
						|
            CollectionViewSource.GetDefaultView(_attrList).Refresh();
 | 
						|
            UpdateButtons();
 | 
						|
        }
 | 
						|
 | 
						|
        private void WineAttributeIdInput_TextChanged(object sender, TextChangedEventArgs evt) {
 | 
						|
            UpperCaseInput_TextChanged(sender, evt);
 | 
						|
            WineAttribute_Changed(sender, evt);
 | 
						|
        }
 | 
						|
 | 
						|
        private void WineAttributeMaxKgPerHaInput_TextChanged(object sender, TextChangedEventArgs evt) {
 | 
						|
            InputTextChanged((TextBox)sender, Validator.CheckInteger((TextBox)sender, false, 5));
 | 
						|
            WineAttribute_Changed(sender, evt);
 | 
						|
        }
 | 
						|
 | 
						|
        private void WineAttributeStrictInput_Changed(object sender, RoutedEventArgs evt) {
 | 
						|
            WineAttributeFillLowerInput.Visibility = WineAttributeStrictInput.IsChecked == true ? Visibility.Visible : Visibility.Hidden;
 | 
						|
            WineAttributeFillLowerLabel.Visibility = WineAttributeFillLowerInput.Visibility;
 | 
						|
            WineAttribute_Changed(sender, evt);
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |