using System; using System.Diagnostics; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Media.Imaging; using Comal.Classes; using InABox.Clients; using InABox.Core; using InABox.DynamicGrid; using InABox.WPF; namespace PRSDesktop { internal class SupplierProductGrid : DynamicDataGrid, ISupplierGrid { private static ProductsGrid pg; private readonly Button ActiveButton; private bool? bActive; private bool? bLinked; private readonly Button CreateProductButton; private readonly Button EditProductButton; private Button LinkedButton; private readonly Button LinkProductButton; private readonly BitmapImage url = PRSDesktop.Resources.view.AsBitmapImage(); public SupplierProductGrid() { ColumnsTag = "SupplierProduct"; Options.AddRange( DynamicGridOption.SelectColumns, DynamicGridOption.MultiSelect, DynamicGridOption.FilterRows, DynamicGridOption.RecordCount ); HiddenColumns.Add(x => x.URL); ActionColumns.Add(new DynamicImageColumn(URLImage, URLAction) { Position = DynamicActionColumnPosition.Start }); LinkedButton = AddButton("Linked + Unlinked", null, ToggleLinked); ActiveButton = AddButton("Active + Expired", null, ToggleActive); ActiveButton.Margin = new Thickness(ActiveButton.Margin.Left, ActiveButton.Margin.Top, 10, ActiveButton.Margin.Bottom); CreateProductButton = AddButton("Create Product", PRSDesktop.Resources.small_add.AsBitmapImage(), CreateProduct); CreateProductButton.Visibility = Visibility.Collapsed; LinkProductButton = AddButton("Link Product", PRSDesktop.Resources.link.AsBitmapImage(), LinkProduct); LinkProductButton.Visibility = Visibility.Collapsed; EditProductButton = AddButton("Edit Product", PRSDesktop.Resources.product.AsBitmapImage(), EditProduct); EditProductButton.Visibility = Visibility.Collapsed; HiddenColumns.Add(x => x.Product.ID); HiddenColumns.Add(x => x.SupplierCode); HiddenColumns.Add(x => x.SupplierDescription); HiddenColumns.Add(x => x.TaxCode.ID); HiddenColumns.Add(x => x.CostPrice); } public Guid ParentID { get; set; } private void ToggleBoolean(ref bool? value) { if (value.HasValue) { if (value.Value) value = false; else value = null; } else { value = true; } } private bool ToggleLinked(Button sender, CoreRow[] row) { ToggleBoolean(ref bLinked); UpdateButton(sender, null, bLinked.HasValue ? bLinked.Value ? "Linked Only" : "Unlinked Only" : "Linked + Unlinked"); return true; } private bool ToggleActive(Button sender, CoreRow[] row) { ToggleBoolean(ref bActive); UpdateButton(sender, null, bActive.HasValue ? bActive.Value ? "Active Only" : "Expired Only" : "Active + Expired"); return true; } private bool CreateProduct(Button sender, CoreRow[] arg2) { if (arg2 == null || arg2.Length != 1) return false; var sp = arg2.First().ToObject(); if (pg == null) pg = new ProductsGrid(); var product = new Product(); product.Code = sp.SupplierCode; product.Name = sp.SupplierDescription; product.Supplier.ID = sp.ID; product.UseDefaultSupplierPricing = true; product.PricingStrategy = ProductPricingStrategy.Standard; product.BaseCost = sp.CostPrice; product.NettCost = sp.CostPrice; product.TaxCode.ID = sp.TaxCode.ID; if (pg.EditItems(new[] { product })) { sp.Product.ID = product.ID; new Client().Save(sp, ""); return true; } return false; } private bool LinkProduct(Button arg1, CoreRow[] arg2) { if (arg2 == null || arg2.Length != 1) return false; var list = new PopupList(typeof(Product), Guid.Empty, new string[] { }); if (list.ShowDialog() == true) { var sp = arg2.First().ToObject(); sp.Product.ID = list.ID; new Client().Save(sp, ""); return true; } return false; } private bool EditProduct(Button sender, CoreRow[] arg2) { if (arg2 == null || arg2.Length != 1) return false; var product = new Client() .Load(new Filter(x => x.ID).IsEqualTo(arg2.First().Get(x => x.Product.ID))).FirstOrDefault(); if (product != null) { if (pg == null) pg = new ProductsGrid(); return pg.EditItems(new[] { product }); } return false; } private bool URLAction(CoreRow arg) { var url = arg.Get(x => x.URL); if (!String.IsNullOrWhiteSpace(url)) Process.Start(new ProcessStartInfo(url) { UseShellExecute = true }); return false; } private BitmapImage URLImage(CoreRow arg) { return arg == null ? null : string.IsNullOrWhiteSpace(arg.Get(x => x.URL)) ? null : url; } protected override void Reload(Filters criteria, Columns columns, ref SortOrder sort, Action action) { if (bLinked.HasValue) { if (bLinked.Value) criteria.Add(new Filter(x => x.Product).LinkValid()); else criteria.Add(new Filter(x => x.Product).NotLinkValid()); } if (bActive.HasValue) { if (bActive.Value) criteria.Add(new Filter(x => x.Expired).IsEqualTo(DateTime.MinValue)); else criteria.Add(new Filter(x => x.Expired).IsNotEqualTo(DateTime.MinValue)); } criteria.Add(new Filter(x => x.SupplierLink.ID).IsEqualTo(ParentID)); base.Reload(criteria, columns, ref sort, action); } protected override SupplierProduct CreateItem() { var result = base.CreateItem(); result.SupplierLink.ID = ParentID; return result; } protected override BaseEditor? GetEditor(object item, DynamicGridColumn column) { if (column.ColumnName.Equals("SupplierLink.ID")) return new NullEditor(); return base.GetEditor(item, column); } protected override void DoAdd(bool OpenEditorOnDirectEdit = false) { if (ParentID == Guid.Empty) MessageBox.Show("Please select a Supplier first!"); else base.DoAdd(); } protected override void SelectItems(CoreRow[] rows) { base.SelectItems(rows); var bSingle = rows != null && rows.Length == 1; var bExisting = bSingle && rows.First().IsEntityLinkValid(x => x.Product); CreateProductButton.Visibility = bSingle && !bExisting ? Visibility.Visible : Visibility.Collapsed; LinkProductButton.Visibility = bSingle && !bExisting ? Visibility.Visible : Visibility.Collapsed; EditProductButton.Visibility = bSingle && bExisting ? Visibility.Visible : Visibility.Collapsed; } protected override Guid GetImportID() { return ParentID; } } }