using System; using System.Collections.Generic; using System.Linq; using System.Text; 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; using NPOI.SS.Formula.Functions; using Syncfusion.UI.Xaml.Charts; namespace PRSDesktop { public delegate JobPanelSettings OnGetJobPanelSettings(); public class JobDocumentSetMilestoneTasks : DynamicDataGrid { public Guid MileStoneID { get; set; } public Guid JobID { get; set; } public event OnGetJobPanelSettings GetJobPanelSettings; public JobDocumentSetMilestoneTasks() { Options.BeginUpdate() .Clear() .Add(DynamicGridOption.RecordCount) .EndUpdate(); HiddenColumns.Add(x => x.Kanban.ID); HiddenColumns.Add(x => x.Kanban.Summary); HiddenColumns.Add(x => x.Entity.DocumentSet.Code); HiddenColumns.Add(x => x.Entity.Type.Code); HiddenColumns.Add(x => x.Entity.Revision); // HiddenColumns.Add(x => x.Kanban.Completed); // ActionColumns.Add(new DynamicImageColumn(StatusImage)); ActionColumns.Add(new DynamicMenuColumn(TaskMenuOpening)); AddButton("", PRSDesktop.Resources.add.AsBitmapImage(), AddTask); AddButton("", PRSDesktop.Resources.pencil.AsBitmapImage(), EditTask); AddButton("", PRSDesktop.Resources.delete.AsBitmapImage(), DeleteTask, DynamicGridButtonPosition.Right); } private void TaskMenuOpening(DynamicMenuColumn column, CoreRow? row) { var status = column.AddItem("Set Status", PRSDesktop.Resources.kanban, null); column.AddItem(Kanban.CategoryToString(KanbanCategory.Open), null, (r) => SetTaskStatus(r,KanbanCategory.Open,false), status); column.AddItem(Kanban.CategoryToString(KanbanCategory.InProgress), null, (r) => SetTaskStatus(r,KanbanCategory.InProgress,false), status); column.AddItem(Kanban.CategoryToString(KanbanCategory.Waiting), null, (r) => SetTaskStatus(r,KanbanCategory.Waiting,false), status); column.AddItem(Kanban.CategoryToString(KanbanCategory.Complete), null, (r) => SetTaskStatus(r,KanbanCategory.Complete,true), status); column.AddSeparator(); column.AddItem("Email Task", PRSDesktop.Resources.email, EmailTask); } private void SetTaskStatus(CoreRow row, KanbanCategory category, bool complete) { using (new WaitCursor()) { var kanban = new Client().Load( new Filter(x => x.ID).IsEqualTo(row.Get(c => c.Kanban.ID))).FirstOrDefault(); if (kanban == null) { MessageBox.Show("Cannot Load Kanban"); return; } if (Kanban.CategoryToString(category) != kanban.Category) { kanban.Category = Kanban.CategoryToString(category); new Client().Save(kanban, "Updated from Job Document Milestone List"); DoChanged(); Refresh(false,true); } } } private void EmailTask(CoreRow? row) { var files = new Client().Query( new Filter(x => x.ID).InQuery(new Filter(x => x.EntityLink.ID).IsEqualTo(MileStoneID), x => x.DocumentLink.ID), new Columns(x=>x.FileName,x=>x.Data) ).ToDictionary(c => c.FileName, c => c.Data); StringBuilder subject = new StringBuilder(); subject.AppendFormat("{0}: ", row.Get(x => x.Kanban.Number)); subject.AppendFormat("{0}", row.Get(x => x.Kanban.Title)); StringBuilder body = new StringBuilder(); body.AppendLine("Dear ,"); body.AppendLine(); body.AppendLine("Some information is required regarding the attached documents:"); body.AppendLine(); body.AppendLine(row.Get(x => x.Kanban.Summary)); body.AppendLine(); body.AppendLine("Regards,"); body.AppendLine(App.EmployeeName); EmailUtils.CreateEMLFile( files, "", subject.ToString(), body.ToString() ); } protected override DynamicGridColumns LoadColumns() { return new DynamicGridColumns() { new DynamicGridColumn() { ColumnName = CoreUtils.GetFullPropertyName(x => x.Kanban.Number, "."), Caption = "#", Width = 50, Alignment = Alignment.MiddleCenter }, new DynamicGridColumn() { ColumnName = CoreUtils.GetFullPropertyName(x => x.Kanban.Title, "."), Caption = "Title", Width = 0 }, new DynamicGridColumn() { ColumnName = CoreUtils.GetFullPropertyName(x => x.Kanban.Category, "."), Caption = "Status", Width = 70, Alignment = Alignment.MiddleCenter } }; } // private readonly BitmapImage _status = PRSDesktop.Resources.tick.AsBitmapImage(); // // private BitmapImage? StatusImage(CoreRow? arg) // { // return arg == null // ? _status // : arg.Get(c => c.Kanban.Completed).IsEmpty() // ? null // : _status; // } private bool AddTask(Button arg1, CoreRow[] arg2) { if (MileStoneID == Guid.Empty) return false; var kg = DynamicGridUtils.CreateDynamicGrid(typeof(DynamicDataGrid<>), typeof(Kanban)); kg.OnAfterSave += (editor, items) => { List msks = new List(); foreach (Kanban item in items.Cast()) { JobDocumentSetMileStoneKanban msk = new JobDocumentSetMileStoneKanban(); msk.Kanban.ID = item.ID; msk.Entity.ID = MileStoneID; msks.Add(msk); } new Client().Save(msks, ""); }; var kanban = new Kanban(); kanban.EmployeeLink.ID = App.EmployeeID; kanban.ManagerLink.ID = App.EmployeeID; kanban.JobLink.ID = JobID; kanban.Category = Kanban.CategoryToString(KanbanCategory.Open); var settings = GetJobPanelSettings?.Invoke(); kanban.Type.ID = settings?.DocumentMilestoneKanbanType.ID ?? Guid.Empty; var milestone = new Client().Query(new Filter(x => x.ID).IsEqualTo(MileStoneID), new Columns(x => x.DocumentSet.Code).Add(x => x.Type.Code).Add(x => x.Revision) ).ToTuples(x => x.DocumentSet.Code, x => x.Type.Code, x => x.Revision).FirstOrDefault(); if (milestone != null) { kanban.Title = String.Format( "{0}: {1} ({2}{3})", settings?.DocumentMilestoneKanbanType.Code, milestone.Item1, milestone.Item2, !String.IsNullOrWhiteSpace(milestone.Item3) ? $" Rev {milestone.Item3}" : "" ); } if (kg.EditItems(new Kanban[] { kanban }) == true) { DoChanged(); return true; } return false; } private bool EditTask(Button arg1, CoreRow[] arg2) { if (MileStoneID == Guid.Empty) return false; if (!SelectedRows.Any()) return false; var ids = SelectedRows.ToArray().Select(r=>r.Get(x=>x.Kanban.ID)).ToArray(); var kanbans = new Client().Load(new Filter(x => x.ID).InList(ids)); var kg = DynamicGridUtils.CreateDynamicGrid(typeof(DynamicDataGrid<>), typeof(Kanban)); if (kg.EditItems(kanbans) == true) { DoChanged(); return true; } return false; } private bool DeleteTask(Button arg1, CoreRow[] arg2) { if (MileStoneID == Guid.Empty) return false; if (!SelectedRows.Any()) return false; if (MessageBox.Show("This will unlink the selected task from this milestone, but leave the task active.\n\nDo You wish to continue?", "Unlink Task", MessageBoxButton.YesNo) != MessageBoxResult.Yes) return false; var ids = SelectedRows.ToArray().Select(r=>r.Get(x=>x.ID)).ToArray(); var msks = ids.Select(x => new JobDocumentSetMileStoneKanban() { ID = x }).ToArray(); new Client().Delete(msks, "Removed from Meeting"); DoChanged(); return true; } protected override void Reload(Filters criteria, Columns columns, ref SortOrder sort, Action action) { criteria.Add(MileStoneID == Guid.Empty ? new Filter(x=>x.Entity.ID).None() : new Filter(x => x.Entity.ID).IsEqualTo(MileStoneID)); base.Reload(criteria, columns, ref sort, action); } } }