using System; using System.Collections.Generic; 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; using NPOI.OpenXmlFormats.Dml; namespace PRSDesktop { public class MeetingItemTaskGrid : DynamicDataGrid { public Guid MeetingID { get; set; } public Guid MeetingItemID { get; set; } public MeetingItemTaskGrid() { Options.BeginUpdate() .Clear() .Add(DynamicGridOption.RecordCount) .EndUpdate(); HiddenColumns.Add(x => x.Kanban.Completed); ActionColumns.Add(new DynamicImageColumn(StatusImage)); AddButton("", PRSDesktop.Resources.add.AsBitmapImage(), AddTask); AddButton("", PRSDesktop.Resources.link.AsBitmapImage(), LinkTask); AddButton("", PRSDesktop.Resources.pencil.AsBitmapImage(), EditTask); AddButton("Copy From", null, CopyTasks); AddButton("", PRSDesktop.Resources.delete.AsBitmapImage(), DeleteTask, DynamicGridButtonPosition.Right); } private bool CopyTasks(Button arg1, CoreRow[] arg2) { var dlg = new MultiSelectDialog( new Filter(x=>x.ID).IsNotEqualTo(MeetingID), new Columns(x=>x.ID, x=>x.Number, x=>x.Date, x=>x.Time.Finish), false ); if (dlg.ShowDialog() == true) { var meeting = dlg.Items().FirstOrDefault(); if (meeting != null) { using (new WaitCursor()) { var compfilter = new Filter(x => x.Entity.Meeting.ID).IsEqualTo(meeting.ID); compfilter = compfilter.And(new Filter(x => x.Kanban.Completed).IsEqualTo(DateTime.MinValue) .Or(x => x.Kanban.Completed).IsGreaterThanOrEqualTo(meeting.Date.Add(meeting.Time.Finish)) ); var tasks = new Client().Query( compfilter, new Columns(x => x.Kanban.ID) .Add(x => x.Entity.ID) ).Rows.Select(r => r.ToObject()); List miks = new List(); foreach (MeetingItemKanban task in tasks) { MeetingItemKanban mik = new MeetingItemKanban(); mik.Kanban.ID = task.Kanban.ID; mik.Entity.ID = MeetingItemID; miks.Add(mik); } if (miks.Any()) { new Client().Save(miks, $"Copied from Meeting #{meeting.Number}"); DoChanged(); return true; } } } } return false; } protected override DynamicGridColumns LoadColumns() { return new DynamicGridColumns() { new DynamicGridColumn() { ColumnName = CoreUtils.GetFullPropertyName(x => x.Kanban.Number, "."), Width = 50 }, new DynamicGridColumn() { ColumnName = CoreUtils.GetFullPropertyName(x => x.Kanban.Title, "."), Width = 0 }, new DynamicGridColumn() { ColumnName = CoreUtils.GetFullPropertyName(x => x.Kanban.EmployeeLink.Code, "."), Width = 100 } }; } 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 (MeetingItemID == Guid.Empty) return false; var kg = DynamicGridUtils.CreateDynamicGrid(typeof(DynamicDataGrid<>), typeof(Kanban)); kg.OnAfterSave += (editor, items) => { List miks = new List(); foreach (Kanban item in items.Cast()) { MeetingItemKanban mik = new MeetingItemKanban(); mik.Kanban.ID = item.ID; mik.Entity.ID = MeetingItemID; miks.Add(mik); } new Client().Save(miks, ""); }; var kanban = new Kanban(); if (kg.EditItems(new Kanban[] { kanban }) == true) { DoChanged(); return true; } return false; } private bool LinkTask(Button arg1, CoreRow[] arg2) { if (MeetingItemID == Guid.Empty) return false; var dlg = new MultiSelectDialog( new Filter(x => x.Completed).IsEqualTo(DateTime.MinValue), new Columns(x=>x.ID), true ); if (dlg.ShowDialog() != true) return false; if (!dlg.IDs().Any()) return false; var miks = new List(); foreach (var id in dlg.IDs()) { var mik = new MeetingItemKanban(); mik.Entity.ID = MeetingItemID; mik.Kanban.ID = id; miks.Add(mik); } new Client().Save(miks, "Added To Meeting"); DoChanged(); return true; } private bool EditTask(Button arg1, CoreRow[] arg2) { if (MeetingItemID == 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 (MeetingItemID == Guid.Empty) return false; if (!SelectedRows.Any()) return false; if (MessageBox.Show("This will unlink the selected task from this meeting, 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 miks = ids.Select(x => new MeetingItemKanban() { ID = x }).ToArray(); new Client().Delete(miks, "Removed from Meeting"); DoChanged(); return true; } protected override void Reload(Filters criteria, Columns columns, ref SortOrder sort, Action action) { criteria.Add(MeetingItemID == Guid.Empty ? new Filter(x=>x.Entity.ID).None() : new Filter(x => x.Entity.ID).IsEqualTo(MeetingItemID)); base.Reload(criteria, columns, ref sort, action); } } }