Bläddra i källkod

Fix to issues column

Kenric Nugteren 7 månader sedan
förälder
incheckning
5d7a40f3f2

+ 12 - 0
InABox.Core/Objects/DefaultColumns.cs

@@ -63,6 +63,18 @@ namespace InABox.Core
             }
         }
 
+        public static CoreGridColumn GetColumn(Type type, string column)
+        {
+            var prop = DatabaseSchema.PropertyStrict(type, column);
+            var defaults = GetDefaultColumns(type);
+            var defaultCol = defaults.FirstOrDefault(x => x.Property == prop);
+            if(defaultCol != null)
+            {
+                return defaultCol;
+            }
+            return CreateColumn(prop);
+        }
+
         public static CoreGridColumn CreateColumn(IProperty prop)
         {
             var col = new CoreGridColumn(

+ 44 - 21
inabox.wpf/DynamicGrid/Columns/DynamicProblemsColumn.cs

@@ -6,6 +6,7 @@ using System.Windows.Controls;
 using System.Windows.Media.Imaging;
 using InABox.Clients;
 using InABox.Core;
+using InABox.Wpf.Editors;
 using InABox.WPF;
 
 namespace InABox.DynamicGrid;
@@ -16,13 +17,13 @@ public class DynamicProblemsColumn<TEntity> : DynamicImageColumn
     private static readonly BitmapImage _warning = Wpf.Resources.warning.AsBitmapImage();
     private static readonly BitmapImage _graywarning = Wpf.Resources.warning.AsGrayScale().AsBitmapImage();
 
-    private readonly IDynamicGrid _parent;
+    private readonly IDynamicGrid<TEntity> _parent;
 
     public Func<IIssues[], FrameworkElement?>? CustomiseEditor { get; set; }
     
     public Action<IIssues[], FrameworkElement?>? IssuesUpdated { get; set; }
 
-    public DynamicProblemsColumn(IDynamicGrid parent)
+    public DynamicProblemsColumn(IDynamicGrid<TEntity> parent)
     {
         Image = IssuesImage;
         Filters = new[] { "Active Issues", "No Issues" };
@@ -31,6 +32,15 @@ public class DynamicProblemsColumn<TEntity> : DynamicImageColumn
         ToolTip = CreateIssuesToolTip;
         _parent = parent;
         Position = DynamicActionColumnPosition.Start;
+
+        if (typeof(TEntity).GetInterfaceDefinition(typeof(IProblems<>)) is Type problemInterface)
+        {
+            var tProblem = problemInterface.GenericTypeArguments[0];
+            foreach(var column in DynamicGridUtils.LoadEditorColumns(tProblem))
+            {
+                _parent.AddHiddenColumn(nameof(IProblems.Problem) + "." + column.Name);
+            }
+        }
     }
     
     private BitmapImage? IssuesImage(CoreRow? row)
@@ -45,7 +55,7 @@ public class DynamicProblemsColumn<TEntity> : DynamicImageColumn
     private FrameworkElement? CreateIssuesToolTip(DynamicActionColumn column, CoreRow? row)
     {
         var text = row?.Get<TEntity, string[]>(x => x.Problem.Notes) ?? new string[] { };
-        return TextToolTip(string.Join("\n==================================", text));
+        return TextToolTip(string.Join("\n==================================\n", text));
     }
 
     private bool DoFilterIssues(CoreRow row, string[] filter)
@@ -68,16 +78,22 @@ public class DynamicProblemsColumn<TEntity> : DynamicImageColumn
 
     private ContextMenu? CreateIssuesMenu(CoreRow[]? rows)
     {
+        if (rows is null || rows.Length == 0) return null;
+
         if (!Security.CanManageProblems<TEntity>())
             return null;
 
-        var issues = rows?.FirstOrDefault()?.Get<TEntity, string[]>(x => x.Problem.Notes)?.Any() == true;
+        var issues = rows.Any(r => r.Get<TEntity, string[]>(x => x.Problem.Notes).Length > 0);
         var result = new ContextMenu();
 
-        if (issues != true)
+        if (!issues)
         {
             result.Items.Add(CreateMenu("Create Issue", (o, e) => EditIssues(rows)));
         }
+        else if(rows.Length > 1)
+        {
+            result.Items.Add(CreateMenu("Add Issue", (o, e) => AddIssue(rows)));
+        }
         else
         {
             result.Items.Add(CreateMenu("Update Issues", (o, e) => EditIssues(rows)));
@@ -91,11 +107,9 @@ public class DynamicProblemsColumn<TEntity> : DynamicImageColumn
         return result;
     }
 
-    private void ResolveIssues(CoreRow[]? rows)
+    private void ResolveIssues(CoreRow[] rows)
     {
-        var row = rows?.FirstOrDefault();
-        if (row == null)
-            return;
+        var row = rows[0];
         
         var entity = row.ToObject<TEntity>();
         entity.Problem.Resolved = DateTime.Now;
@@ -124,22 +138,31 @@ public class DynamicProblemsColumn<TEntity> : DynamicImageColumn
         // }
     }
 
-    private void EditIssues(CoreRow[]? rows)
+    private void AddIssue(CoreRow[] rows)
     {
+        var entities = rows.ToArray<TEntity>();
+        var issue = "";
+        if(TextEdit.Execute("Enter new issue: ", ref issue) && !issue.IsNullOrWhiteSpace())
+        {
+            foreach(var entity in entities)
+            {
+                entity.Problem.Notes = entity.Problem.Notes.Concatenate([issue]);
+            }
+            Client.Save(entities, "Saving Issues", (o, e) => { });
+            _parent.UpdateRows(rows, entities);
+        }
+    }
+
+    private void EditIssues(CoreRow[] rows)
+    {
+        var entities = rows.ToArray<TEntity>();
         
-        var row = rows?.FirstOrDefault();
-        if (row == null)
-            return;
-        
-        var entity = row.ToObject<TEntity>();
-        
-        var _grid = DynamicGridUtils.CreateDynamicGrid(typeof(DynamicItemsListGrid<>), entity.Problem.GetType());
-        if (_grid.EditItems(new object[] { entity.Problem }))
+        var _grid = DynamicGridUtils.CreateDynamicGrid(typeof(DynamicItemsListGrid<>), entities.First().Problem.GetType());
+        if (_grid.EditItems(entities.ToArray(x => x.Problem)))
         {
             using (new WaitCursor())
-                Client.Save(entity, "Resolving Issues", (o, e) => { });
-            row.Table.FillRow(row, entity);
-            _parent.InvalidateRow(row);
+                Client.Save(entities, "Saving Issues", (o, e) => { });
+            _parent.UpdateRows(rows, entities);
         }
     }
 }

+ 0 - 3
inabox.wpf/DynamicGrid/DynamicGrid.cs

@@ -1276,9 +1276,6 @@ public abstract class DynamicGrid<T> : DynamicGrid, IDynamicGridUIComponentParen
         }
     }
 
-    /// <summary>
-    /// Update/sync the data in <paramref name="rows"/> with that of <paramref name="objs"/>.
-    /// </summary>
     public void UpdateRows(CoreRow[] rows, T[] objs, bool invalidateRows = true)
     {
         for(var i = 0; i < objs.Length; ++i)

+ 11 - 23
inabox.wpf/DynamicGrid/DynamicGridColumn/DynamicColumnGrid.cs

@@ -85,17 +85,7 @@ public class DynamicColumnGrid : DynamicGrid<DynamicGridColumn>
     {
         if(DynamicGridColumnNameSelectorGrid.SelectColumnName(Type, ProcessColumns().Select(x => x.ColumnName).ToArray(), out var column))
         {
-            var item = CreateItem();
-            var prop = DatabaseSchema.Property(Type, column);
-            item.ColumnName = column;
-            if(prop is not null)
-            {
-                item.Width = prop.Editor.Width;
-                item.Alignment = prop.Editor.Alignment;
-                item.Format = prop.Editor.Format;
-                item.Editor = prop.Editor.CloneEditor();
-                item.Caption = prop.Caption;
-            }
+            var item = DynamicGridColumn.FromCoreGridColumn(DefaultColumns.GetColumn(Type, column));
             SaveItem(item);
             DoChanged();
             Refresh(false, true);
@@ -115,20 +105,18 @@ public class DynamicColumnGrid : DynamicGrid<DynamicGridColumn>
         var changes = base.EditorValueChanged(editor, items, name, value);
         if(name == nameof(DynamicGridColumn.ColumnName) && value is string columnName)
         {
-            var prop = DatabaseSchema.Property(Type, columnName);
-            if(prop is not null)
+            var newCol = DynamicGridColumn.FromCoreGridColumn(DefaultColumns.GetColumn(Type, columnName));
+
+            foreach(var item in items)
             {
-                foreach(var item in items)
+                CoreUtils.MonitorChanges(item, () =>
                 {
-                    CoreUtils.MonitorChanges(item, () =>
-                    {
-                        item.Width = prop.Editor.Width;
-                        item.Alignment = prop.Editor.Alignment;
-                        item.Format = prop.Editor.Format;
-                        item.Editor = prop.Editor.CloneEditor();
-                        item.Caption = prop.Caption;
-                    }, changes);
-                }
+                    item.Width = newCol.Width;
+                    item.Alignment = newCol.Alignment;
+                    item.Format = newCol.Format;
+                    item.Editor = newCol.Editor.CloneEditor();
+                    item.Caption = newCol.Caption;
+                }, changes);
             }
         }
         return changes;

+ 6 - 5
inabox.wpf/DynamicGrid/DynamicGridUtils.cs

@@ -313,9 +313,9 @@ public static class DynamicGridUtils
 
     #region Columns
 
-    public static Columns<T> LoadEditorColumns<T>(Columns<T>? additional = null)
+    public static IColumns LoadEditorColumns(Type T, IColumns? additional = null)
     {
-        var result = new Columns<T>(ColumnTypeFlags.EditorColumns);
+        var result = Columns.Create(T, ColumnTypeFlags.EditorColumns);
 
         if(additional is not null)
         {
@@ -323,12 +323,12 @@ public static class DynamicGridUtils
                 result.Add(col.Property);
         }
 
-        foreach (var col in result.ToArray())
+        foreach (var col in result.ColumnNames().ToArray())
         {
-            var prop = DatabaseSchema.Property(typeof(T), col.Property);
+            var prop = DatabaseSchema.Property(T, col);
             if (prop?.Editor is DataLookupEditor dataLookup)
             {
-                foreach (var lookupColumn in LookupFactory.DefineLookupFilterColumns(typeof(T), prop.Name))
+                foreach (var lookupColumn in LookupFactory.DefineLookupFilterColumns(T, prop.Name))
                 {
                     result.Add(lookupColumn);
                 }
@@ -337,6 +337,7 @@ public static class DynamicGridUtils
 
         return result;
     }
+    public static Columns<T> LoadEditorColumns<T>(Columns<T>? additional = null) => (LoadEditorColumns(typeof(T), additional) as Columns<T>)!;
 
     #endregion
 

+ 5 - 0
inabox.wpf/DynamicGrid/IDynamicGrid.cs

@@ -121,4 +121,9 @@ public interface IDynamicGrid<T> : IDynamicGrid
     void DeleteItems(CoreRow[] rows);
 
     bool EditItems(T[] items, Func<Type, CoreTable?>? PageDataHandler = null, bool PreloadPages = false);
+
+    /// <summary>
+    /// Update/sync the data in <paramref name="rows"/> with that of <paramref name="objs"/>.
+    /// </summary>
+    void UpdateRows(CoreRow[] rows, T[] objs, bool invalidateRows = true);
 }