using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using Comal.Classes; using InABox.Clients; using InABox.Core; using InABox.DynamicGrid; using InABox.WPF; using NPOI.SS.Formula.Functions; namespace PRSDesktop { public class KanbanGrid : DynamicDataGrid, ITaskControl, IDefaultGrid { public KanbanGrid() { ActionColumns.Add(new DynamicActionColumn(PRSDesktop.Resources.contract.AsBitmapImage(), FormMenuClick)); HiddenColumns.Add(x => x.EmployeeLink.Deleted); HiddenColumns.Add(x => x.ManagerLink.Deleted); OnCustomiseEditor += CustomiseEditor; OnBeforeSave += BeforeSave; } public Guid MyID { get; set; } = CoreUtils.FullGuid; private bool FormMenuClick(CoreRow arg) { var kanbanID = (Guid)arg["ID"]; var menu = new ContextMenu(); DynamicGridUtils.PopulateFormMenu(menu, kanbanID); menu.IsOpen = true; return false; } private void CustomiseEditor(IDynamicEditorForm sender, Kanban[]? items, DynamicGridColumn column, BaseEditor editor) { var kanban = items?.FirstOrDefault(); if (kanban is null) return; var bFullControl = IsFullControl(new[] { kanban }); bool? enabled = null; switch (column.ColumnName) { case "Private": enabled = kanban.EmployeeLink.ID == MyID && kanban.ManagerLink.ID == MyID; break; case "Description": enabled = kanban.ID == Guid.Empty || (bFullControl && !kanban.Private); break; case "EmployeeLink.ID": enabled = !kanban.Private; break; case "ManagerLink.ID": enabled = bFullControl && !kanban.Private; break; case "Category": enabled = bFullControl && !kanban.Private; break; case "Closed": enabled = bFullControl || Security.IsAllowed(); break; } if(enabled != null) { editor.Editable = enabled.Value ? Editable.Enabled : Editable.Disabled; } } private bool IsFullControl(Kanban[] kanbans) { foreach (var kanban in kanbans) { if (!MyID.Equals(kanban.ManagerLink.ID) && !MyID.Equals(kanban.EmployeeLink.ID)) { // If you can change others tasks, IsFullControl is true - but we don't check at the beginning of the function // to save checking security tokens every time. return Security.IsAllowed(); } } return true; } protected override void LookupsDefined(ILookupEditorControl sender, Kanban[] items) { base.LookupsDefined(sender, items); } private void BeforeSave(DynamicEditorForm editor, Kanban[] items) { EnsureAssignee(editor, items.FirstOrDefault()); EnsureAllocator(editor, items.FirstOrDefault()); } protected override void SelectPage(object sender, BaseObject[] items) { base.SelectPage(sender, items); var tab = sender as TabItem; if(tab?.Content is KanbanSubscriberGrid grid) { grid.EnsureAssignee(); grid.EnsureAllocator(); } } protected override void AfterLoad(DynamicEditorForm editor, Kanban[] kanbans) { base.AfterLoad(editor, kanbans); //EnsureAssignee(editor, kanbans.FirstOrDefault()); //EnsureAllocator(editor, kanbans.FirstOrDefault()); if (MyID == CoreUtils.FullGuid) { var row = new Client() .Query(new Filter(x => x.UserLink.ID).IsEqualTo(ClientFactory.UserGuid), new Columns(x => x.ID)).Rows .FirstOrDefault(); if (row != null) MyID = row.Get(x => x.ID); } //if (kanbans.FirstOrDefault().ID == Guid.Empty) // ReloadForms(editor, kanbans.FirstOrDefault(), x => x.Type.ID, kanbans.FirstOrDefault().Type.ID); } protected override Dictionary EditorValueChanged(DynamicEditorForm editor, Kanban[] items, string name, object value) { var result = base.EditorValueChanged(editor, items, name, value); if (name == "Type.ID") { //ReloadForms(editor, items.FirstOrDefault(), x => x.Type.ID, // value != null ? (Guid)value : Guid.Empty); } else if (name == "EmployeeLink.ID") { EnsureAssignee(editor, items.FirstOrDefault()); var enabled = (Guid)value == items.FirstOrDefault()?.ManagerLink.ID && items.FirstOrDefault()?.ManagerLink.UserLink.ID == ClientFactory.UserGuid; editor.FindEditor("Private").IsEnabled = enabled; } else if (name == "ManagerLink.ID") { EnsureAllocator(editor, items.FirstOrDefault()); var enabled = items.FirstOrDefault()?.EmployeeLink.UserLink.ID == ClientFactory.UserGuid && (Guid)value == items.FirstOrDefault()?.EmployeeLink.ID; editor.FindEditor("Private").IsEnabled = enabled; } else if (name == "Private") { var enabled = !Equals(value, true); editor.FindEditor("EmployeeLink.ID").IsEnabled = enabled; editor.FindEditor("ManagerLink.ID").IsEnabled = enabled; } return result; } private static KanbanSubscriberGrid? EnsurePage(DynamicEditorForm editor, Kanban item) { var type = typeof(IDynamicOneToManyGrid<,>).MakeGenericType(typeof(Kanban), typeof(KanbanSubscriber)); var page = editor.Pages.FirstOrDefault(x => x.GetType().GetInterfaces().Contains(type)) as KanbanSubscriberGrid; if (page != null && !page.Ready) page.Load(item, null); return page; } private static void EnsureAssignee(DynamicEditorForm editor, Kanban? kanban) { if (kanban is null) return; var page = EnsurePage(editor, kanban); if (page is null) return; page.EnsureAssignee(); } private static void EnsureAllocator(DynamicEditorForm editor, Kanban? kanban) { if (kanban is null) return; var page = EnsurePage(editor, kanban); if (page is null) return; page.EnsureAllocator(); } protected override void Reload(Filters criteria, Columns columns, ref SortOrder sort, Action action) { if (Host.JobID != Guid.Empty) criteria.Add(new Filter(x => x.JobLink.ID).IsEqualTo(Host.JobID)); base.Reload(criteria, columns, ref sort, action); } #region ITaskControl Support public KanbanView KanbanView => KanbanView.List; public ITaskHost Host { get; set; } public bool IsReady { get; set; } public string SectionName => "Task List"; public DataModel DataModel(Selection selection) { return new AutoDataModel(new Filter(x => x.ID).IsEqualTo(Guid.Empty)); } public void Refresh() { Refresh(false, true); } public void Refresh(bool resetselection) { Refresh(false, true); // reset selected rows here } public void Setup() { Refresh(true, false); } public IEnumerable SelectedModels(TaskModel? sender = null) { MessageBox.Show("TaskListControl.SelectedModels() is not Implemented!"); return Array.Empty(); } #endregion } }