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 InABox.WPF; namespace PRSDesktop; public class JobDocumentSetMilestoneTasks : DynamicDataGrid { public Guid MileStoneID { get; set; } public Guid JobID { get; set; } public JobDocumentSetSettings Settings { get; set; } protected override void DoReconfigure(FluentList options) { base.DoReconfigure(options); options.BeginUpdate() .Clear() .Add(DynamicGridOption.RecordCount) .EndUpdate(); } protected override void Init() { base.Init(); 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("To Do", null, (r) => SetTaskStatus(r, KanbanStatus.Open,false), status); column.AddItem("In Progress", null, (r) => SetTaskStatus(r, KanbanStatus.InProgress,false), status); column.AddItem("Waiting", null, (r) => SetTaskStatus(r, KanbanStatus.Waiting,false), status); column.AddItem("Complete", null, (r) => SetTaskStatus(r, KanbanStatus.Complete,true), status); column.AddSeparator(); column.AddItem("Email Task", PRSDesktop.Resources.email, EmailTask); } private void SetTaskStatus(CoreRow row, KanbanStatus category, bool complete) { using (new WaitCursor()) { var kanbanID = row.Get(c => c.Kanban.ID); var kanban = new Client().Load( new Filter(x => x.ID).IsEqualTo(kanbanID)).FirstOrDefault(); if (kanban == null) { MessageWindow.ShowError("Cannot Load Kanban", $"No Kanban with ID {kanbanID}"); return; } if (category != kanban.Status) { kanban.Status = category; 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.Status, "."), 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.Status = KanbanStatus.Open; 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); } }