Просмотр исходного кода

Fixed "Create Task" button on Projects/Requisitions

Kenric Nugteren 5 месяцев назад
Родитель
Сommit
d22bf57617

+ 178 - 0
prs.desktop/Grids/KanbanGrid.cs

@@ -0,0 +1,178 @@
+using Comal.Classes;
+using InABox.Clients;
+using InABox.Configuration;
+using InABox.Core;
+using InABox.DynamicGrid;
+using InABox.WPF;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Security.Cryptography;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Controls;
+
+namespace PRSDesktop;
+
+public abstract class BaseKanbanGrid : DynamicDataGrid<Kanban>
+{
+    protected abstract TaskPanelProperties Properties { get; }
+
+    public BaseKanbanGrid()
+    {
+        ActionColumns.Add(new DynamicImageColumn(PRSDesktop.Resources.menu.AsBitmapImage(), FormMenuClick));
+
+        HiddenColumns.Add(x => x.EmployeeLink.ID);
+
+        OnCustomiseEditor += CustomiseEditor;
+    }
+
+    protected override void DoValidate(Kanban[] items, List<string> errors)
+    {
+        base.DoValidate(items, errors);
+
+        if (Properties.RequireTaskTypes && items.Any(x => x.Type.ID == Guid.Empty))
+        {
+            errors.Add("[Task Type] may not be blank!");
+        }
+    }
+
+    protected override void DoReconfigure(DynamicGridOptions options)
+    {
+        base.DoReconfigure(options);
+
+        options.SelectColumns = true;
+        options.FilterRows = true;
+        options.RecordCount = true;
+        options.PageSize = 1000;
+    }
+
+    private bool FormMenuClick(CoreRow? row)
+    {
+        if (row is null)
+            return false;
+
+        var kanbanID = row.Get<Kanban, Guid>(x => x.ID);
+
+        var menu = new ContextMenu();
+
+        var digitalForms = menu.AddItem("Digital Forms", null, null);
+
+        DynamicGridUtils.PopulateFormMenu<KanbanForm, Kanban, KanbanLink>(digitalForms, kanbanID, () => row.ToObject<Kanban>());
+
+        menu.AddItem("Manage Subscribers", null, row, Subscribers_Click);
+
+        menu.IsOpen = true;
+
+        return false;
+    }
+
+    private void Subscribers_Click(CoreRow row)
+    {
+        var kanban = row.ToObject<Kanban>();
+        TaskPanel.ManageSubscribers(kanban);
+    }
+
+    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 == App.EmployeeID && kanban.ManagerLink.ID == App.EmployeeID;
+                break;
+            case "Description":
+                enabled = kanban.ID == Guid.Empty || (bFullControl && !kanban.Private);
+                break;
+            case "EmployeeLink.ID":
+                enabled = bFullControl && !kanban.Private;
+                break;
+            case "ManagerLink.ID":
+                enabled = bFullControl && !kanban.Private;
+                break;
+            case "Category":
+                enabled = bFullControl && !kanban.Private;
+                break;
+            case "Closed":
+                enabled = bFullControl || Security.IsAllowed<CanCloseOthersTasks>();
+                break;
+        }
+        if(enabled != null)
+        {
+            editor.Editable = enabled.Value ? Editable.Enabled : Editable.Disabled;
+        }
+    }
+
+    private bool IsFullControl(Kanban[] kanbans)
+    {
+        foreach (var kanban in kanbans)
+        {
+            if (!App.EmployeeID.Equals(kanban.ManagerLink.ID) && !App.EmployeeID.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<CanChangeOthersTasks>();
+            }
+        }
+        return true;
+    }
+
+    protected override Dictionary<string, object?> EditorValueChanged(IDynamicEditorForm editor, Kanban[] items, string name, object value)
+    {
+        var result = base.EditorValueChanged(editor, items, name, value);
+
+        if (name == "Type.ID")
+        {
+            //ReloadForms<Kanban, KanbanForm, KanbanTypeForm>(editor, items.FirstOrDefault(), x => x.Type.ID,
+            //    value != null ? (Guid)value : Guid.Empty);
+        }
+        else if (name == "EmployeeLink.ID")
+        {
+            var enabled = items.FirstOrDefault()?.ManagerLink.UserLink.ID == ClientFactory.UserGuid &&
+                          (Guid)(value ?? Guid.Empty) == items.FirstOrDefault()?.ManagerLink.ID;
+            editor.FindEditor("Private").IsEnabled = enabled;
+        }
+        else if (name == "ManagerLink.ID")
+        {
+            var enabled = items.FirstOrDefault()?.EmployeeLink.UserLink.ID == ClientFactory.UserGuid &&
+                          (Guid)(value ?? Guid.Empty) == items.FirstOrDefault()?.EmployeeLink.ID;
+            editor.FindEditor("Private").IsEnabled = enabled;
+        }
+        else if (name == "Private")
+        {
+            var enabled = !Equals(value, true);
+            var employeeEditor = editor.FindEditor("EmployeeLink.ID");
+            var managerEditor = editor.FindEditor("ManagerLink.ID");
+            employeeEditor.IsEnabled = enabled;
+            managerEditor.IsEnabled = enabled;
+            if (!enabled)
+            {
+                employeeEditor.SetValue(employeeEditor.ColumnName, App.EmployeeID);
+                managerEditor.SetValue(managerEditor.ColumnName, App.EmployeeID);
+
+                foreach(var item in items)
+                {
+                    item.EmployeeLink.ID = App.EmployeeID;
+                    item.ManagerLink.ID = App.EmployeeID;
+                }
+            }
+        }
+
+        return result;
+    }
+}
+
+public class KanbanGrid : BaseKanbanGrid, IDefaultGrid
+{
+    private TaskPanelProperties _properties;
+    protected override TaskPanelProperties Properties => _properties;
+
+    public KanbanGrid()
+    {
+        _properties = new GlobalConfiguration<TaskPanelProperties>().Load();
+    }
+}

+ 2 - 3
prs.desktop/Panels/DailyReports/DailyReport.xaml.cs

@@ -184,7 +184,7 @@ namespace PRSDesktop
         
         private AssignmentModel copiedAssignment;
 
-        private TaskGrid kg = new();
+        private KanbanGrid kg = new();
         private MenuItem MoveToComplete;
         private MenuItem MoveToCurrent;
 
@@ -1192,8 +1192,7 @@ namespace PRSDesktop
             if (kanban == null)
                 return;
 
-            if (kg == null)
-                kg = new TaskGrid();
+            kg ??= new KanbanGrid();
 
             var bEdited = kg.EditItems(new[] { kanban });
             if (bEdited)

+ 1 - 1
prs.desktop/Panels/Jobs/Requisitions/JobRequisitionGrid.cs

@@ -115,7 +115,7 @@ namespace PRSDesktop
                 kanban.Description = kanban.Description + "Requisition contains " + table.Rows.Count + " items.";
             }
             Progress.Close();
-            var page = new TaskGrid();
+            var page = new KanbanGrid();
             page.OnAfterSave += (form, items) =>
             {
                 KanbanAfterSave(form, items.Cast<Kanban>().ToArray());

+ 1 - 2
prs.desktop/Panels/Notifications/NotificationUtils.cs

@@ -190,8 +190,7 @@ namespace PRSDesktop
                 task.JobLink.ID = notification.Job.ID;
                 task.EmployeeLink.ID = employeeid;
                 task.ManagerLink.ID = notification.Sender.ID;
-                var kg = new TaskGrid();
-                if (kg.EditItems(new[] { task }))
+                if(DynamicGridUtils.EditEntity(task))
                 {
                     using (new WaitCursor())
                     {

+ 2 - 4
prs.desktop/Panels/Staging/StagingPanel.xaml.cs

@@ -588,9 +588,7 @@ public partial class StagingPanel : UserControl, IPanel<StagingSetout>
         };
         task.ManagerLink.ID = App.EmployeeID;
 
-        var page = new TaskGrid();
-
-        if (page.EditItems(new[] { task }))
+        if (DynamicGridUtils.EditEntity(task))
         {
             var doc = new KanbanDocument();
             doc.EntityLink.ID = task.ID;
@@ -609,7 +607,7 @@ public partial class StagingPanel : UserControl, IPanel<StagingSetout>
         }
         else
         {
-            MessageBox.Show("Task creation cancelled - setout not rejected");
+            MessageWindow.ShowMessage("Task creation cancelled - setout not rejected", "Action cancelled");
         }
     }
 

+ 2 - 147
prs.desktop/Panels/Tasks/TaskGrid.cs

@@ -14,154 +14,9 @@ using InABox.WPF;
 
 namespace PRSDesktop;
 
-public class TaskGrid : DynamicDataGrid<Kanban>, ITaskControl, IDefaultGrid
+public class TaskGrid : BaseKanbanGrid, ITaskControl
 {
-    public TaskGrid()
-    {
-        ActionColumns.Add(new DynamicImageColumn(PRSDesktop.Resources.menu.AsBitmapImage(), FormMenuClick));
-
-        HiddenColumns.Add(x => x.EmployeeLink.ID);
-
-        OnCustomiseEditor += CustomiseEditor;
-    }
-
-    protected override void DoReconfigure(DynamicGridOptions options)
-    {
-        base.DoReconfigure(options);
-
-        options.SelectColumns = true;
-        options.FilterRows = true;
-        options.RecordCount = true;
-        options.PageSize = 1000;
-    }
-
-    protected override void DoValidate(Kanban[] items, List<string> errors)
-    {
-        base.DoValidate(items, errors);
-
-        if (Host.Properties.RequireTaskTypes && items.Any(x => x.Type.ID == Guid.Empty))
-        {
-            errors.Add("[Task Type] may not be blank!");
-        }
-    }
-
-    private bool FormMenuClick(CoreRow? row)
-    {
-        if (row is null)
-            return false;
-
-        var kanbanID = row.Get<Kanban, Guid>(x => x.ID);
-
-        var menu = new ContextMenu();
-
-        var digitalForms = menu.AddItem("Digital Forms", null, null);
-
-        DynamicGridUtils.PopulateFormMenu<KanbanForm, Kanban, KanbanLink>(digitalForms, kanbanID, () => row.ToObject<Kanban>());
-
-        menu.AddItem("Manage Subscribers", null, row, Subscribers_Click);
-
-        menu.IsOpen = true;
-
-        return false;
-    }
-
-    private void Subscribers_Click(CoreRow row)
-    {
-        var kanban = row.ToObject<Kanban>();
-        TaskPanel.ManageSubscribers(kanban);
-    }
-
-    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 == App.EmployeeID && kanban.ManagerLink.ID == App.EmployeeID;
-                break;
-            case "Description":
-                enabled = kanban.ID == Guid.Empty || (bFullControl && !kanban.Private);
-                break;
-            case "EmployeeLink.ID":
-                enabled = bFullControl && !kanban.Private;
-                break;
-            case "ManagerLink.ID":
-                enabled = bFullControl && !kanban.Private;
-                break;
-            case "Category":
-                enabled = bFullControl && !kanban.Private;
-                break;
-            case "Closed":
-                enabled = bFullControl || Security.IsAllowed<CanCloseOthersTasks>();
-                break;
-        }
-        if(enabled != null)
-        {
-            editor.Editable = enabled.Value ? Editable.Enabled : Editable.Disabled;
-        }
-    }
-
-    private bool IsFullControl(Kanban[] kanbans)
-    {
-        foreach (var kanban in kanbans)
-        {
-            if (!App.EmployeeID.Equals(kanban.ManagerLink.ID) && !App.EmployeeID.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<CanChangeOthersTasks>();
-            }
-        }
-        return true;
-    }
-
-    protected override Dictionary<string, object?> EditorValueChanged(IDynamicEditorForm editor, Kanban[] items, string name, object value)
-    {
-        var result = base.EditorValueChanged(editor, items, name, value);
-
-        if (name == "Type.ID")
-        {
-            //ReloadForms<Kanban, KanbanForm, KanbanTypeForm>(editor, items.FirstOrDefault(), x => x.Type.ID,
-            //    value != null ? (Guid)value : Guid.Empty);
-        }
-        else if (name == "EmployeeLink.ID")
-        {
-            var enabled = items.FirstOrDefault()?.ManagerLink.UserLink.ID == ClientFactory.UserGuid &&
-                          (Guid)(value ?? Guid.Empty) == items.FirstOrDefault()?.ManagerLink.ID;
-            editor.FindEditor("Private").IsEnabled = enabled;
-        }
-        else if (name == "ManagerLink.ID")
-        {
-            var enabled = items.FirstOrDefault()?.EmployeeLink.UserLink.ID == ClientFactory.UserGuid &&
-                          (Guid)(value ?? Guid.Empty) == items.FirstOrDefault()?.EmployeeLink.ID;
-            editor.FindEditor("Private").IsEnabled = enabled;
-        }
-        else if (name == "Private")
-        {
-            var enabled = !Equals(value, true);
-            var employeeEditor = editor.FindEditor("EmployeeLink.ID");
-            var managerEditor = editor.FindEditor("ManagerLink.ID");
-            employeeEditor.IsEnabled = enabled;
-            managerEditor.IsEnabled = enabled;
-            if (!enabled)
-            {
-                employeeEditor.SetValue(employeeEditor.ColumnName, App.EmployeeID);
-                managerEditor.SetValue(managerEditor.ColumnName, App.EmployeeID);
-
-                foreach(var item in items)
-                {
-                    item.EmployeeLink.ID = App.EmployeeID;
-                    item.ManagerLink.ID = App.EmployeeID;
-                }
-            }
-        }
-
-        return result;
-    }
+    protected override TaskPanelProperties Properties => Host.Properties;
 
     protected override void Reload(
     	Filters<Kanban> criteria, Columns<Kanban> columns, ref SortOrder<Kanban>? sort,

+ 9 - 12
prs.desktop/Panels/Tasks/TaskPlannerControl.xaml.cs

@@ -477,19 +477,17 @@ namespace PRSDesktop
 
         private void DoEditTask()
         {
-            var task = Gantt.SelectedItems.FirstOrDefault() as GanttTask;
-            if (task == null)
+            if (Gantt.SelectedItems.FirstOrDefault() is not GanttTask task)
                 return;
+
             var row = _kanbans.Rows.FirstOrDefault(r => r.Get<Kanban, Guid>(x => x.ID) == task.ID);
-            var kanban = row?.ToObject<Kanban>();
-            if (kanban != null)
+            if (row is null) return;
+
+            var kanban = row.ToObject<Kanban>();
+            if (DynamicGridUtils.EditEntity(kanban))
             {
-                var bOK = new TaskGrid().EditItems(new[] { kanban });
-                if (bOK)
-                {
-                    _kanbans.FillRow(row, kanban);
-                    LoadTask(row, task);
-                }
+                _kanbans.FillRow(row, kanban);
+                LoadTask(row, task);
             }
         }
 
@@ -498,8 +496,7 @@ namespace PRSDesktop
             var kanban = new Kanban();
             kanban.JobLink.ID = Host.Master?.ID ?? Guid.Empty;
             kanban.JobLink.Synchronise(Host.Master ?? new Job());
-            var bOK = new TaskGrid().EditItems(new[] { kanban });
-            if (bOK)
+            if (DynamicGridUtils.EditEntity(kanban))
             {
                 var row = _kanbans.NewRow();
                 _kanbans.FillRow(row, kanban);