using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media.Imaging; using System.Windows.Threading; using Comal.Classes; using InABox.Clients; using InABox.Configuration; using InABox.Core; using InABox.DynamicGrid; using InABox.WPF; using Syncfusion.UI.Xaml.Kanban; namespace PRSDesktop { public partial class ManufacturingPanel : UserControl, IPanel { private readonly List _columns = new(); #region Settings Fields private bool bIncludeCompleted; private bool bIncludeHeld; private bool bIncludeOrders; private ManufacturingViewType ViewType; private Guid CurrentFactory = Guid.Empty; private bool SortByDueDate = true; private ManufacturingSettings settings = new(); #endregion private readonly DispatcherTimer columnsizer = new(); private Document[] FactoryImages = Array.Empty(); private int iCombo; private bool JobChanging; private readonly ManufacturingPanelData Data = new(); private CoreTable packets; private Guid SelectedJob; public ManufacturingPanel() { InitializeComponent(); //columnsizer.Interval = new TimeSpan(0, 0, 0, 0, 500); //columnsizer.Tick += Columnsizer_Tick; //columnsizer.IsEnabled = true; IncludeCompleted.IsChecked = false; } //public List CheckedKanbans = new List(); public bool IsReady { get; set; } public Dictionary Selected() { return new Dictionary { { typeof(ManufacturingPacket).EntityName(), new CoreRow[] { } } }; } public void Setup() { settings = new UserConfiguration().Load(); var FactorySource = new ObservableCollection>(); FactorySource.Add(new Tuple("All Sections", PRSDesktop.Resources.factory.AsBitmapImage(), Guid.Empty)); var tables = ClientFactory.MultiQuery( new QueryDef(null, null, null), new QueryDef(null, null, null), new QueryDef(null, null, null), new QueryDef( LookupFactory.DefineFilter(), new Columns( x => x.ID, x => x.JobNumber, x => x.Name ), LookupFactory.DefineSort() ), new QueryDef(null, null, null), new QueryDef( new Filter(x => x.Packet).LinkValid() .And(x => x.Packet.Completed).IsEqualTo(DateTime.MinValue), new Columns( x => x.ID, x => x.ReceivedDate, x => x.Consignment.EstimatedWarehouseArrival, x => x.DueDate, x => x.PurchaseOrderLink.SupplierLink.Code, x => x.PurchaseOrderLink.PONumber, x => x.ReceivedReference ), null ) ); Data.Factories = tables[0].Rows.Select(x => x.ToObject()) .ToArray(); //new Client().Load(null, new SortOrder(x=>x.Sequence)); Data.Sections = tables[1].Rows.Select(x => x.ToObject()) .ToArray(); //new Client().Load(null, new SortOrder(x=>x.Sequence)); Data.Templates = tables[2].Rows.Select(x => x.ToObject()) .ToArray(); //new Client().Load(null, new SortOrder(x=>x.Code)); Data.Jobs = tables[3]; //.Rows.Select(x => x.ToObject()).ToArray(); Data.ITPs = tables[4]; //.Rows.Select(x => x.ToObject()).ToArray(); foreach (var orderrow in tables[5].Rows) { var id = orderrow.Get(x => x.ID); var receiveddate = orderrow.Get(c => c.ReceivedDate); var estimatedwarehousearrival = orderrow.Get(c => c.Consignment.EstimatedWarehouseArrival); if (estimatedwarehousearrival.IsEmpty()) estimatedwarehousearrival = orderrow.Get(c => c.DueDate); var suppliercode = orderrow.Get(c => c.PurchaseOrderLink.SupplierLink.Code); var ponumber = orderrow.Get(c => c.PurchaseOrderLink.PONumber); var poreference = orderrow.Get(c => c.ReceivedReference); var tag = receiveddate.IsEmpty() ? "ETA" : "RCVD"; Data.OrderItems.Add(new Tuple( id, receiveddate, string.Format("{0} ({1}) {2} {3:dd MMM yy} {4}", suppliercode, ponumber, tag, receiveddate.IsEmpty() ? estimatedwarehousearrival : receiveddate, string.IsNullOrWhiteSpace(poreference) ? "" : ": " + poreference ) )); } //OrderItems = tables[5]; //.Rows.Select(x => x.ToObject()).ToArray(); Filter? imageFilter = null; foreach (var Factory in Data.Factories) if (Factory.Thumbnail.IsValid()) imageFilter = imageFilter == null ? new Filter(x => x.ID).IsEqualTo(Factory.Thumbnail.ID) : imageFilter.Or(x => x.ID).IsEqualTo(Factory.Thumbnail.ID); FactoryImages = new Client().Load(imageFilter); var iFact = 1; foreach (var Factory in Data.Factories) { var groups = new List(); if (!FactorySource.Any(x => x.Item1.Equals(Factory.Name))) { var image = FactoryImages.FirstOrDefault(x => x.ID.Equals(Factory.Thumbnail.ID)); BitmapImage img; if (image != null && image.Data != null && image.Data.Length > 0) { img = new BitmapImage(); img.LoadImage(image.Data); } else { img = PRSDesktop.Resources.factory.AsBitmapImage(); } FactorySource.Add(new Tuple(Factory.Name, img, Factory.ID)); if (settings.FactoryID == Factory.ID) iFact = FactorySource.Count - 1; } } FactoryListBox.ItemsSource = FactorySource; FactoryListBox.SelectedIndex = iFact < FactorySource.Count ? iFact : 0; SortBy.SelectedIndex = settings.SortByDueDate ? 1 : 0; View.SelectedIndex = (int)ViewType; bIncludeHeld = settings.IncludeHeld; IncludeHeld.IsChecked = bIncludeHeld; bIncludeOrders = settings.IncludeOrders; IncludeOrders.IsChecked = bIncludeOrders; bIncludeCompleted = settings.IncludeCompleted; IncludeCompleted.IsChecked = bIncludeCompleted; //new Client().Query( // LookupFactory.DefineFilter(), // LookupFactory.DefineColumns(), // LookupFactory.DefineSort(), // (table, error) => // { // Dictionary jobs = new Dictionary() { { CoreUtils.FullGuid, "All Jobs" } }; // foreach (var row in table.Rows) // jobs[row.Get(x => x.ID)] = String.Format("{0}: {1}", row.Get(x => x.JobNumber), row.Get(x => x.Name)); // Dispatcher.Invoke(() => // { // JobChanging = true; // Job.ItemsSource = jobs; // Job.SelectedValue = CoreUtils.FullGuid; // //Level.IsEnabled = false; // //Zone.IsEnabled = false; // ITP.IsEnabled = false; // JobChanging = false; // }); // }); var jobs = new Dictionary { { CoreUtils.FullGuid, "All Jobs" } }; foreach (var row in Data.Jobs.Rows) jobs[row.Get(c => c.ID)] = string.Format("{0}: {1}", row.Get(c => c.JobNumber), row.Get(c => c.Name)); JobChanging = true; Job.ItemsSource = jobs; Job.SelectedValue = CoreUtils.FullGuid; SelectedJob = CoreUtils.FullGuid; ITP.IsEnabled = false; JobChanging = false; } public void Shutdown() { } public void CreateToolbarButtons(IPanelHost host) { } public string SectionName => "Manufacturing Packets"; public DataModel DataModel(Selection selection) { var ids = new List(); foreach (var column in _columns) { var rows = selection == Selection.None ? Enumerable.Empty() : selection == Selection.Selected ? column.GetSelectedPackets() : column.GetPackets(); ids.AddRange(rows.Select(r => r.ID)); } return new ManufacturingPacketDataModel(new Filter(x => x.ID).InList(ids.ToArray())); } public void Refresh() { Application.Current.Dispatcher.Invoke(() => { Mouse.OverrideCursor = Cursors.Wait; }); var now = DateTime.Now; ReloadFactories(); var elapsed = DateTime.Now - now; Logger.Send(LogType.Information, ClientFactory.UserID, string.Format("Refreshed Factories in {0}ms", elapsed.TotalMilliseconds)); now = DateTime.Now; ReloadPackets(); elapsed = DateTime.Now - now; Logger.Send(LogType.Information, ClientFactory.UserID, string.Format("Refreshed Packets in {0}ms", elapsed.TotalMilliseconds)); Application.Current.Dispatcher.Invoke(() => { Mouse.OverrideCursor = null; }); } public event DataModelUpdateEvent? OnUpdateDataModel; //private void ChangeDate_Click(object sender, RoutedEventArgs e) //{ // MenuItem item = (MenuItem)sender; // KanbanModel model = (KanbanModel)item.Tag; // var pkts = GetSelectedPackets(model.ID); // DateTime? date = null; // foreach (var pkt in pkts) // { // if (!date.HasValue) // date = pkt.DueDate; // else if (!date.Value.Equals(pkt.DueDate)) // date = date > pkt.DueDate ? date : pkt.DueDate; // } // DateTime date2 = !date.HasValue ? DateTime.Today.AddDays(14) : date.Value; // if (InABox.WPF.DateEdit.Execute("Required Completion Date", ref date2)) // { // Progress.SetMessage("Updating Packets"); // foreach (var pkt in pkts) // pkt.DueDate = date2; // new Client().Save(pkts, String.Format("Changed Due Date To {0:dd MMM yy}", date2)); // CheckedKanbans.Clear(); // Progress.Close(); // Refresh(); // } //} //private void UpdatePriority(object sender, bool priority) //{ // MenuItem item = (MenuItem)sender; // KanbanModel model = (KanbanModel)item.Tag; // Progress.Show(""); // var pkts = GetSelectedPackets(model.ID); // for (int i = 0; i < pkts.Length; i++) // { // var packet = pkts[i]; // packet.Priority = priority; // } // Progress.SetMessage("Updating Packets"); // new Client().Save(pkts, "Priority Flag "+ (priority ? "Set" : "Cleared")); // CheckedKanbans.Clear(); // Progress.Close(); // Refresh(); //} //private void SetPriority_Click(object sender, RoutedEventArgs e) //{ // UpdatePriority(sender, true); //} //private void ClearPriority_Click(object sender, RoutedEventArgs e) //{ // UpdatePriority(sender, false); //} //private void UpdateHold(object sender, bool hold) //{ // MenuItem item = (MenuItem)sender; // KanbanModel model = (KanbanModel)item.Tag; // Progress.Show(""); // var pkts = GetSelectedPackets(model.ID); // for (int i = 0; i < pkts.Length; i++) // { // var packet = pkts[i]; // packet.OnHold = hold; // } // Progress.SetMessage("Updating Packets"); // new Client().Save(pkts, "Hold Flag " + (hold ? "Set" : "Cleared")); // CheckedKanbans.Clear(); // Progress.Close(); // Refresh(); //} //private void SetHold_Click(object sender, RoutedEventArgs e) //{ // UpdateHold(sender, true); //} //private void ClearHold_Click(object sender, RoutedEventArgs e) //{ // UpdateHold(sender, false); //} //private void CompeteItem_Click(object sender, RoutedEventArgs e) //{ // MenuItem item = (MenuItem)sender; // KanbanModel model = (KanbanModel)item.Tag; // Progress.Show(""); // var pkts = GetSelectedPackets(model.ID); // Progress.SetMessage("Loading Stages"); // Filter stgflt = null; // foreach (var pkt in pkts) // stgflt = stgflt == null ? new Filter(x => x.ManufacturingPacketLink.ID).IsEqualTo(pkt.ID) : stgflt.Or(x => x.ManufacturingPacketLink.ID).IsEqualTo(pkt.ID); // ManufacturingPacketStage[] stgs = new Client().Load(stgflt, new SortOrder(x => x.Sequence)); // while (pkts.Any(x => x.Completed.IsEmpty())) // { // ManufacturingPacket.Progress(pkts, stgs); // } // Progress.SetMessage("Progressing Items"); // new Client().Save(stgs.Where(x => x.IsChanged()), "ManufacturingPacket Marked as Complete"); // new Client().Save(pkts.Where(x => x.IsChanged()), "ManufacturingPacket Marked as Complete"); // Progress.Close(); // CheckedKanbans.Clear(); // Refresh(); //} public void Heartbeat(TimeSpan time) { } private void Job_SelectionChanged(object sender, SelectionChangedEventArgs e) { var oldID = SelectedJob; var newID = Job.SelectedValue != null ? (Guid)Job.SelectedValue : Guid.Empty; SelectedJob = newID; //Dictionary Levels = new Dictionary() { { CoreUtils.FullGuid, "All Levels" } }; //Dictionary Zones = new Dictionary() { { CoreUtils.FullGuid, "All Zones" } }; var itps = new Dictionary { { CoreUtils.FullGuid, "All ITPs" } }; if (SelectedJob == Guid.Empty || SelectedJob == CoreUtils.FullGuid) { iCombo = 1; //Level.ItemsSource = Levels; //Level.SelectedValue = CoreUtils.FullGuid; //Level.IsEnabled = false; //Zone.ItemsSource = Zones; //Zone.SelectedValue = CoreUtils.FullGuid; //Zone.IsEnabled = false; ITP.ItemsSource = itps; ITP.SelectedValue = CoreUtils.FullGuid; ITP.IsEnabled = false; iCombo = 0; } else { iCombo = 1; foreach (var row in Data.ITPs.Rows.Where(r => r.Get(c => c.Job.ID).Equals(SelectedJob))) itps[row.Get(c => c.Job.ID)] = string.Format("{0}: {1}", row.Get(c => c.Code), row.Get(c => c.Description)); ITP.ItemsSource = itps; ITP.SelectedValue = CoreUtils.FullGuid; ITP.IsEnabled = true; iCombo--; } if (newID != CoreUtils.FullGuid && ViewType == ManufacturingViewType.Job) { View.SelectedIndex = (int)ManufacturingViewType.Full; } else { if (!JobChanging && iCombo == 0) { ReloadPackets(); } } } private void Unit_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (JobChanging || iCombo > 0) return; ReloadPackets(); } private void AddColumn(string title, Guid category, TColumn column) where TColumn : FrameworkElement, IManufacturingPanelColumn { column.Margin = new Thickness(_columns.Any() ? 2 : 0, 0, 0, 0); column.Title = title; column.Data = Data; column.Category = category; column.SetValue(Grid.ColumnProperty, _columns.Count); column.OnCollapsed += Column_OnCollapsed; Columns.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); Columns.Children.Add(column); _columns.Add(column); } private void CreateColumn(string title, Guid category) { var job = SelectedJob; if (ViewType == ManufacturingViewType.Job) { var column = new ManufacturingPanelJobColumn(); column.OnSelectJob += Column_OnSelectJob; AddColumn(title, category, column); } else { var column = new ManufacturingPanelColumn(); column.CompactView = ViewType == ManufacturingViewType.Compact; column.OnChanged += Column_OnChanged; AddColumn(title, category, column); } } private void Column_OnSelectJob(Guid jobID) { Job.SelectedValue = jobID; } private void Column_OnCollapsed(object sender, bool collapsed) { var index = _columns.IndexOf((IManufacturingPanelColumn)sender); Columns.ColumnDefinitions[index].Width = new GridLength(1, collapsed ? GridUnitType.Auto : GridUnitType.Star); } private void Column_OnChanged(object? sender, EventArgs e) { Refresh(); } private void ReloadFactories() { columnsizer.IsEnabled = false; Columns.Children.Clear(); _columns.Clear(); Columns.ColumnDefinitions.Clear(); CreateColumn("To Be Issued", Guid.Empty); //Kanban.Columns.Clear(); //Kanban.Columns.Add(new KanbanColumn() { Title = "To be Issued", Categories = Guid.Empty.ToString() }); foreach (var factory in Data.Factories) if (CurrentFactory.Equals(Guid.Empty) || CurrentFactory.Equals(factory.ID)) foreach (var section in Data.Sections) if (section.Factory.ID.Equals(factory.ID) && !section.Hidden) CreateColumn(section.Factory.Name + ":" + section.Name, section.ID); //Kanban.Columns.Add(new KanbanColumn() { Title = Section.Factory.Name + ":" + Section.Name, Categories = Section.ID.ToString() }); if (bIncludeCompleted) CreateColumn("Completed", CoreUtils.FullGuid); //Kanban.Columns.Add(new KanbanColumn() { Title = "Completed", Categories = CoreUtils.FullGuid.ToString() }); //foreach (KanbanColumn column in Kanban.Columns) //{ // ContextMenu menu = new ContextMenu(); // menu.Tag = column; // MenuItem item = new MenuItem() { Header = "Select All " + column.Title + " Tasks", Tag = column }; // item.Click += SelectAll_Click; // menu.Items.Add(item); // item = new MenuItem() { Header = "Unselect All " + column.Title + " Tasks", Tag = column }; // item.Click += UnSelectAll_Click; // menu.Items.Add(item); // column.ContextMenu = menu; // column.AllowDrag = false; // column.AllowDrop = false; //} //ResizeColumns(); //columnsizer.IsEnabled = true; } //private void SetSelectedItems(KanbanColumn column, bool selected) //{ // foreach (ManufacturingKanban model in Kanbans) // { // if ((string)model.Category == column.Categories) // { // if (!CheckedKanbans.Contains(model.ID)) // CheckedKanbans.Add(model.ID); // model.Checked = selected; // } // } // Kanban.ItemsSource = null; // Kanban.ItemsSource = Kanbans; //} //private void UnSelectAll_Click(object sender, RoutedEventArgs e) //{ // KanbanColumn column = ((MenuItem)sender).Tag as KanbanColumn; // SetSelectedItems(column, false); //} //private void SelectAll_Click(object sender, RoutedEventArgs e) //{ // KanbanColumn column = ((MenuItem)sender).Tag as KanbanColumn; // SetSelectedItems(column, true); //} private void CheckBox_Checked(object sender, RoutedEventArgs e) { //ManufacturingKanban task = ((CheckBox)sender).Tag as ManufacturingKanban; //if (CheckedKanbans.Contains(task.ID)) // CheckedKanbans.Remove(task.ID); //else // CheckedKanbans.Add(task.ID); } private string GetQualityStatus(QualityStatus status) { if (status == QualityStatus.Passed) return "PASSED"; if (status == QualityStatus.Skipped) return "SKIPPED"; if (status == QualityStatus.PassedWithIssues) return "ISSUES"; if (status == QualityStatus.Failed) return "FAILED"; return " "; } private void ReloadPackets() { var filter = GenerateFilter(); var columns = GenerateColumns(); using var profiler = new Profiler(false); packets = new Client().Query( filter, columns, SortBy.SelectedIndex == 0 ? new SortOrder(x => x.SetoutLink.Number) : new SortOrder(x => x.DueDate).ThenBy(x => x.Priority, SortDirection.Descending) .ThenBy(x => x.SetoutLink.Number)); Logger.Send(LogType.Information, ClientFactory.UserID, string.Format("Retrieved {0} packets in {1}ms", packets.Rows.Count, profiler.Restart())); var objects = packets.ToObjects(); var groups = objects.GroupBy(x => !x.Completed.IsEmpty() ? CoreUtils.FullGuid : x.StageLink.SectionID); var results = groups.ToDictionary(x => x.Key, x => x); Logger.Send(LogType.Information, ClientFactory.UserID, string.Format("Processed Kanbans in {0}ms", profiler.Restart())); foreach (var column in _columns) { column.SetPackets(results.GetValueOrDefault(column.Category) ?? Enumerable.Empty()); } Logger.Send(LogType.Information, ClientFactory.UserID, string.Format("Loaded Columns in {0}ms", profiler.Restart())); } private Filter GenerateFilter() { var filter = new Filter(x => x.Archived).IsEqualTo(DateTime.MinValue); if (!bIncludeCompleted) filter = filter.And(x => x.Completed).IsEqualTo(DateTime.MinValue); if (!bIncludeHeld) // filter = filter.And(x => x.OnHold).IsEqualTo(false); filter = filter.And(x => x.OnHold).IsEqualTo(false); if (!bIncludeOrders) { var orderfilter = new Filter(x => x.OrderItem).NotLinkValid().Or(x => x.OrderItem.ReceivedDate) .IsNotEqualTo(DateTime.MinValue); filter = filter.And(orderfilter); } var bSkipJobCheck = false; if (ITP.SelectedValue != null && !ITP.SelectedValue.Equals(CoreUtils.FullGuid)) { filter = filter.And(x => x.ITP.ID).IsEqualTo((Guid)ITP.SelectedValue); bSkipJobCheck = true; } if (!bSkipJobCheck && Job.SelectedValue != null && !Job.SelectedValue.Equals(CoreUtils.FullGuid)) filter = filter.And(x => x.SetoutLink.JobLink.ID).IsEqualTo((Guid)Job.SelectedValue); var sections = Data.Sections.Where(x => CurrentFactory.Equals(Guid.Empty) || x.Factory.ID.Equals(CurrentFactory)).Select(x => x.ID) .ToList(); var sctflt = new Filter(x => x.StageLink.SectionID).IsEqualTo(Guid.Empty) .Or(x => x.StageLink.SectionID).InList(sections.ToArray()); /* var sctflt = new Filter(x => x.StageLink).NotLinkValid(); foreach (var section in Data.Sections.Where(x => CurrentFactory.Equals(Guid.Empty) || x.Factory.ID.Equals(CurrentFactory))) sctflt = sctflt.Or(x => x.StageLink.SectionID).IsEqualTo(section.ID); */ filter.Ands.Add(sctflt); if (CurrentFactory != Guid.Empty) { var templatefilter = new Filter(x => x.ManufacturingTemplateLink.Factory.ID).IsEqualTo(CurrentFactory) .Or(x => x.StageLink).LinkValid(); filter.Ands.Add(templatefilter); } if (!string.IsNullOrWhiteSpace(SearchBox.Text)) filter = filter.TextSearch( SearchBox.Text, x => x.SetoutLink.JobLink.JobNumber, x => x.SetoutLink.JobLink.Name, x => x.SetoutLink.Number, x => x.SetoutLink.Description, //x => x.SetoutLink.Reference, x => x.SetoutLink.Location, //x => x.Unit.Code, //x => x.Unit.Description, x => x.ITP.Code, x => x.ITP.Description, x => x.Title, x => x.Serial, x => x.Location, x => x.WaterMark, x => x.ManufacturingTemplateLink.Code ); return filter; } private static Columns GenerateColumns() { var columns = new Columns(); columns.Add(x => x.ID); //columns.Add(x => x.OnHold); columns.Add(x => x.OnHold); columns.Add(x => x.Issues); columns.Add(x => x.Priority); columns.Add(x => x.Distributed); columns.Add(x => x.BarcodeQty); columns.Add(x => x.Quantity); columns.Add(x => x.Title); columns.Add(x => x.Serial); columns.Add(x => x.WaterMark); columns.Add(x => x.EstimatedDate); columns.Add(x => x.Created); columns.Add(x => x.DueDate); columns.Add(x => x.Location); columns.Add(x => x.BarcodePrinted); columns.Add(x => x.BarcodeType); columns.Add(x => x.Completed); //columns.Add(x => x.TimeRemaining); columns.Add(x => x.Group); columns.Add(x => x.SetoutLink.ID); columns.Add(x => x.SetoutLink.Number); columns.Add(x => x.SetoutLink.Description); columns.Add(x => x.SetoutLink.Location); columns.Add(x => x.SetoutLink.JobLink.ID); columns.Add(x => x.OrderItem.ID); //columns.Add(x => x.OrderItem.ReceivedDate); //columns.Add(x => x.OrderItem.Consignment.EstimatedWarehouseArrival); //columns.Add(x => x.OrderItem.PurchaseOrderLink.SupplierLink.Code); //columns.Add(x => x.OrderItem.PurchaseOrderLink.PONumber); columns.Add(x => x.ManufacturingTemplateLink.ID); columns.Add(x => x.ITP.ID); columns.Add(x => x.StageLink.ID); columns.Add(x => x.StageLink.SectionID); columns.Add(x => x.StageLink.Station); columns.Add(x => x.StageLink.Time); columns.Add(x => x.StageLink.PercentageComplete); columns.Add(x => x.StageLink.Deleted); return columns; } private void Factories_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (e.AddedItems.Count == 0 || e.AddedItems[0] is not Tuple selected) return; CurrentFactory = selected.Item3; if (IsReady) SaveSettings(); if (IsReady) Refresh(); } private void SortBy_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (e.AddedItems.Count == 0 || e.AddedItems[0] is not ComboBoxItem selected) return; SortByDueDate = selected.Content.Equals("Due Date"); if (IsReady) SaveSettings(); if (IsReady) Refresh(); } private void View_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (e.AddedItems.Count == 0 || e.AddedItems[0] is not ComboBoxItem selected) return; ViewType = (ManufacturingViewType)View.SelectedIndex; if (IsReady) SaveSettings(); if (ViewType == ManufacturingViewType.Job && SelectedJob != CoreUtils.FullGuid) { SelectedJob = CoreUtils.FullGuid; JobChanging = true; Job.SelectedValue = SelectedJob; JobChanging = false; } if (IsReady) Refresh(); } private void SearchBox_KeyUp(object sender, KeyEventArgs e) { if (string.IsNullOrWhiteSpace(SearchBox.Text) || e.Key == Key.Return) Refresh(); } private void IncludeCompleted_Click(object sender, RoutedEventArgs e) { bIncludeCompleted = IncludeCompleted.IsChecked == true; if (IsReady) { SaveSettings(); Refresh(); } } private void IncludeHeld_Click(object sender, RoutedEventArgs e) { bIncludeHeld = IncludeHeld.IsChecked == true; if (IsReady) { SaveSettings(); Refresh(); } } private void IncludeOrders_Click(object sender, RoutedEventArgs e) { bIncludeOrders = IncludeOrders.IsChecked == true; if (IsReady) { SaveSettings(); Refresh(); } } private void SaveSettings() { var user = new ManufacturingSettings { FactoryID = CurrentFactory, SortByDueDate = SortByDueDate, ViewType = ViewType, IncludeHeld = bIncludeHeld, IncludeOrders = bIncludeOrders, IncludeCompleted = bIncludeCompleted }; new UserConfiguration().Save(user); } private void Export_Click(object sender, RoutedEventArgs e) { IEnumerable columns = string.IsNullOrWhiteSpace(settings.ExportColumns) ? Array.Empty() : settings.ExportColumns.Split(','); if (!columns.Any()) columns = packets.Columns.Select(x => x.ColumnName); var form = new DynamicExportForm(typeof(ManufacturingPacket), columns); if (form.ShowDialog() != true) return; settings.ExportColumns = string.Join(",", form.Fields); new UserConfiguration().Save(settings); var export = new Client().Query( GenerateFilter(), new Columns(form.Fields), LookupFactory.DefineSort() ); ExcelExporter.DoExport(export, string.Format("Manufacturing {0:dd-MMM-yy}", DateTime.Today)); } } }