Bläddra i källkod

Extracted custom columns functionality into a component, and also DirectEdit columns are now different.

Kenric Nugteren 1 år sedan
förälder
incheckning
4ace7f6461

+ 20 - 93
inabox.wpf/DynamicGrid/DynamicDataGrid.cs

@@ -36,6 +36,7 @@ namespace InABox.DynamicGrid
         private Button MergeBtn = null!; //Late-initialised
 
         protected DynamicGridFilterButtonComponent<TEntity> FilterComponent;
+        protected DynamicGridCustomColumnsComponent<TEntity> ColumnsComponent;
 
         private Column<TEntity>[] FilterColumns;
 
@@ -79,6 +80,8 @@ namespace InABox.DynamicGrid
                 new UserConfiguration<CoreFilterDefinitions>(GetTag()));
             FilterComponent.OnFilterRefresh += () => Refresh(false, true);
 
+            ColumnsComponent = new DynamicGridCustomColumnsComponent<TEntity>(this, GetTag(), base.LoadColumns);
+
             MergeBtn = AddButton("Merge", Wpf.Resources.merge.AsBitmapImage(Color.White), DoMerge);
         }
         protected override void DoReconfigure(FluentList<DynamicGridOption> options)
@@ -129,7 +132,16 @@ namespace InABox.DynamicGrid
             base.BeforeLoad(form, items);
         }
 
-        public string? ColumnsTag { get; set; }
+        private string? _columnsTag;
+        public string? ColumnsTag
+        {
+            get => _columnsTag;
+            set
+            {
+                _columnsTag = value;
+                ColumnsComponent.Tag = GetTag();
+            }
+        }
 
         protected override void OptionsChanged()
         {
@@ -325,36 +337,20 @@ namespace InABox.DynamicGrid
             window.ShowDialog();
         }
 
-
-        protected override void LoadColumnsMenu(ContextMenu menu)
+        protected override DynamicGridColumns LoadColumns()
         {
-            base.LoadColumnsMenu(menu);
-            //menu.Items.Add(new Separator());
-            var ResetColumns = new MenuItem { Header = "Reset Columns to Default" };
-            ResetColumns.Click += ResetColumnsClick;
-            menu.Items.Add(ResetColumns);
-            if (Security.IsAllowed<CanSetDefaultColumns>())
-            {
-                menu.Items.Add(new Separator());
-                var UpdateDefaultColumns = new MenuItem { Header = "Mark Columns as Default" };
-                UpdateDefaultColumns.Click += UpdateDefaultColumnsClick;
-                menu.Items.Add(UpdateDefaultColumns);
-            }
+            return ColumnsComponent.LoadColumns();
         }
 
-        private void ResetColumnsClick(object sender, RoutedEventArgs e)
+        protected override void SaveColumns(DynamicGridColumns columns)
         {
-            VisibleColumns.Clear();
-            SaveColumns(VisibleColumns);
-            Refresh(true, true);
+            ColumnsComponent.SaveColumns(columns);
         }
 
-        private void UpdateDefaultColumnsClick(object sender, RoutedEventArgs e)
+        protected override void LoadColumnsMenu(ContextMenu menu)
         {
-            var tag = GetTag();
-            new GlobalConfiguration<DynamicGridColumns>(tag).Save(VisibleColumns);
-            new UserConfiguration<DynamicGridColumns>(tag).Delete();
-            Refresh(true, true);
+            base.LoadColumnsMenu(menu);
+            ColumnsComponent.LoadColumnsMenu(menu);
         }
 
         private string GetTag()
@@ -365,24 +361,6 @@ namespace InABox.DynamicGrid
             return tag;
         }
 
-        private BaseEditor GetColumnEditor(DynamicGridColumn column)
-        {
-            try
-            {
-                var prop = DatabaseSchema.Property(typeof(TEntity), column.ColumnName);
-                if (prop != null) return prop.Editor;
-
-                var type = CoreUtils.GetProperty(typeof(TEntity), column.ColumnName);
-                return type.GetEditor() ?? new NullEditor();
-            }
-            catch (Exception e)
-            {
-                Logger.Send(LogType.Error, "", string.Format("*** Unknown Error: {0}\n{1}", e.Message, e.StackTrace));
-            }
-
-            return new NullEditor();
-        }
-
         protected override DynamicGridSettings LoadSettings()
         {
             var tag = GetTag();
@@ -403,51 +381,6 @@ namespace InABox.DynamicGrid
             new UserConfiguration<DynamicGridSettings>(tag).Save(settings);
         }
 
-        protected override DynamicGridColumns LoadColumns()
-        {
-            var tag = GetTag();
-
-            var user = Task.Run(() => new UserConfiguration<DynamicGridColumns>(tag).Load());
-            user.Wait();
-
-            var global = Task.Run(() => new GlobalConfiguration<DynamicGridColumns>(tag).Load());
-            global.Wait();
-            //Task.WaitAll(user, global);
-            var columns = user.Result.Any() ? user.Result : global.Result;
-
-            //if (!columns.Any())
-            //    GenerateColumns(columns); //override this to provide specific columns on startup
-
-            var removes = columns.Where(x => x is null || string.IsNullOrWhiteSpace(x.ColumnName) || DatabaseSchema.Property(typeof(TEntity), x.ColumnName) == null || GetColumnEditor(x) is NullEditor)
-               .ToArray();
-            foreach (var remove in removes)
-                columns.Remove(remove);
-            if (columns.Count == 0)
-                columns.AddRange(base.LoadColumns());
-
-            foreach (var column in columns)
-                try
-                {
-                    var prop = DatabaseSchema.Property(typeof(TEntity), column.ColumnName);
-                    if (prop != null)
-                    {
-                        column.Editor = prop.Editor;
-                    }
-                    else
-                    {
-                        var type = CoreUtils.GetProperty(typeof(TEntity), column.ColumnName);
-                        column.Editor = type.GetEditor() ?? new NullEditor();
-                    }
-                }
-                catch (Exception e)
-                {
-                    Logger.Send(LogType.Error, "", string.Format("*** Unknown Error: {0}\n{1}", e.Message, e.StackTrace));
-                }
-
-            columns.RemoveAll(x => DatabaseSchema.Property(typeof(TEntity), x.ColumnName) == null || GetColumnEditor(x) is NullEditor);
-            return columns;
-        }
-
         /// <summary>
         /// Provide a set of columns which is the default for this grid.
         /// </summary>
@@ -470,12 +403,6 @@ namespace InABox.DynamicGrid
             }
         }
 
-        protected override void SaveColumns(DynamicGridColumns columns)
-        {
-            var tag = GetTag();
-            new UserConfiguration<DynamicGridColumns>(tag).Save(columns);
-        }
-
         protected override BaseEditor? GetEditor(object item, DynamicGridColumn column)
         {
             var prop = DatabaseSchema.Properties(typeof(TEntity)).FirstOrDefault(x => x.Name == column.ColumnName);

+ 13 - 12
inabox.wpf/DynamicGrid/DynamicEnclosedListGrid.cs

@@ -6,6 +6,7 @@ using System.Linq;
 using System.Reflection;
 using System.Threading.Tasks;
 using System.Windows;
+using System.Windows.Controls;
 using FastReport.Utils;
 using InABox.Configuration;
 using InABox.Core;
@@ -30,10 +31,14 @@ namespace InABox.DynamicGrid
 
         public bool ReadOnly { get; set; }
 
+        protected DynamicGridCustomColumnsComponent<TMany> ColumnsComponent;
+
         public DynamicEnclosedListGrid(PropertyInfo prop)
         {
             Items = new List<TMany>();
             property = prop;
+
+            ColumnsComponent = new(this, null, base.LoadColumns);
         }
 
         protected override void Init()
@@ -106,22 +111,18 @@ namespace InABox.DynamicGrid
 
         protected override DynamicGridColumns LoadColumns()
         {
-            var tag = typeof(TMany).Name;
-
-            var global = Task.Run(() => new GlobalConfiguration<DynamicGridColumns>(tag).Load());
-            var user = Task.Run(() => new UserConfiguration<DynamicGridColumns>(tag).Load());
-            Task.WaitAll(global, user);
-            var columns = user.Result.Any() ? user.Result : global.Result;
-
-            if (columns.Count == 0)
-                columns.AddRange(base.LoadColumns().Where(x => !x.ColumnName.StartsWith(property.Name)));
-            return columns;
+            return ColumnsComponent.LoadColumns();
         }
 
         protected override void SaveColumns(DynamicGridColumns columns)
         {
-            var tag = typeof(TMany).Name;
-            new UserConfiguration<DynamicGridColumns>(tag).Save(columns);
+            ColumnsComponent.SaveColumns(columns);
+        }
+
+        protected override void LoadColumnsMenu(ContextMenu menu)
+        {
+            base.LoadColumnsMenu(menu);
+            ColumnsComponent.LoadColumnsMenu(menu);
         }
 
         protected override TMany LoadItem(CoreRow row)

+ 11 - 5
inabox.wpf/DynamicGrid/DynamicGrid.cs

@@ -343,10 +343,7 @@ namespace InABox.DynamicGrid
             Data = new CoreTable();
 
             ColumnsMenu = new ContextMenu();
-            var SelectColumns = new MenuItem { Header = "Select Columns" };
-            SelectColumns.Click += SelectColumnsClick;
-            ColumnsMenu.Items.Add(SelectColumns);
-            LoadColumnsMenu(ColumnsMenu);
+            ColumnsMenu.Opened += ColumnsMenu_ContextMenuOpening;
 
             MasterColumns = new DynamicGridColumns();
             MasterColumns.ExtractColumns(typeof(T));
@@ -3452,7 +3449,16 @@ namespace InABox.DynamicGrid
 
         #region Header Actions
 
-        private void SelectColumnsClick(object sender, RoutedEventArgs e)
+        private void ColumnsMenu_ContextMenuOpening(object sender, RoutedEventArgs e)
+        {
+            if (sender is not ContextMenu menu) return;
+            menu.Items.Clear();
+
+            menu.AddItem("Select Columns", null, SelectColumnsClick);
+            LoadColumnsMenu(menu);
+        }
+
+        private void SelectColumnsClick()
         {
             var editor = new DynamicGridColumnsEditor(typeof(T));
             editor.DirectEdit = IsDirectEditMode();

+ 141 - 0
inabox.wpf/DynamicGrid/DynamicGridCustomColumnsComponent.cs

@@ -0,0 +1,141 @@
+using InABox.Configuration;
+using InABox.Core;
+using InABox.WPF;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+
+namespace InABox.DynamicGrid;
+
+/// <summary>
+/// A component which loads a custom set of columns from the database.
+/// </summary>
+public class DynamicGridCustomColumnsComponent<T>
+    where T : BaseObject, new()
+{
+    private readonly DynamicGrid<T> Grid;
+
+    public Func<DynamicGridColumns> DefaultColumns { get; set; }
+
+    public string? Tag { get; set; }
+
+    public DynamicGridCustomColumnsComponent(DynamicGrid<T> grid, string? tag, Func<DynamicGridColumns> defaultColumns)
+    {
+        Grid = grid;
+        Tag = tag;
+        DefaultColumns = defaultColumns;
+    }
+
+    public DynamicGridColumns LoadColumns()
+    {
+        var tag = GetTag();
+
+        var user = Task.Run(() => new UserConfiguration<DynamicGridColumns>(tag).Load());
+        user.Wait();
+
+        var global = Task.Run(() => new GlobalConfiguration<DynamicGridColumns>(tag).Load());
+        global.Wait();
+        //Task.WaitAll(user, global);
+        var columns = user.Result.Any() ? user.Result : global.Result;
+
+        //if (!columns.Any())
+        //    GenerateColumns(columns); //override this to provide specific columns on startup
+
+        var removes = columns.Where(x => x is null || string.IsNullOrWhiteSpace(x.ColumnName) || DatabaseSchema.Property(typeof(T), x.ColumnName) == null || GetColumnEditor(x) is NullEditor)
+           .ToArray();
+        foreach (var remove in removes)
+            columns.Remove(remove);
+        if (columns.Count == 0)
+            columns.AddRange(DefaultColumns());
+
+        foreach (var column in columns)
+            try
+            {
+                var prop = DatabaseSchema.Property(typeof(T), column.ColumnName);
+                if (prop != null)
+                {
+                    column.Editor = prop.Editor;
+                }
+                else
+                {
+                    var type = CoreUtils.GetProperty(typeof(T), column.ColumnName);
+                    column.Editor = type.GetEditor() ?? new NullEditor();
+                }
+            }
+            catch (Exception e)
+            {
+                Logger.Send(LogType.Error, "", string.Format("*** Unknown Error: {0}\n{1}", e.Message, e.StackTrace));
+            }
+
+        columns.RemoveAll(x => DatabaseSchema.Property(typeof(T), x.ColumnName) == null || GetColumnEditor(x) is NullEditor);
+        return columns;
+    }
+
+    public void SaveColumns(DynamicGridColumns columns)
+    {
+        var tag = GetTag();
+        new UserConfiguration<DynamicGridColumns>(tag).Save(columns);
+    }
+
+    public void LoadColumnsMenu(ContextMenu menu)
+    {
+        menu.AddSeparatorIfNeeded();
+        var ResetColumns = new MenuItem { Header = "Reset Columns to Default" };
+        ResetColumns.Click += ResetColumnsClick;
+        menu.Items.Add(ResetColumns);
+        if (Security.IsAllowed<CanSetDefaultColumns>())
+        {
+            menu.Items.Add(new Separator());
+            var UpdateDefaultColumns = new MenuItem { Header = "Mark Columns as Default" };
+            UpdateDefaultColumns.Click += UpdateDefaultColumnsClick;
+            menu.Items.Add(UpdateDefaultColumns);
+        }
+    }
+
+    private string GetTag()
+    {
+        var tag = Tag ?? typeof(T).Name;
+        if (Grid.IsDirectEditMode())
+        {
+            tag += ":DirectEdit";
+        }
+        return tag;
+    }
+
+    private static BaseEditor GetColumnEditor(DynamicGridColumn column)
+    {
+        try
+        {
+            var prop = DatabaseSchema.Property(typeof(T), column.ColumnName);
+            if (prop != null) return prop.Editor;
+
+            var type = CoreUtils.GetProperty(typeof(T), column.ColumnName);
+            return type.GetEditor() ?? new NullEditor();
+        }
+        catch (Exception e)
+        {
+            Logger.Send(LogType.Error, "", string.Format("*** Unknown Error: {0}\n{1}", e.Message, e.StackTrace));
+        }
+
+        return new NullEditor();
+    }
+
+    private void ResetColumnsClick(object sender, RoutedEventArgs e)
+    {
+        Grid.VisibleColumns.Clear();
+        SaveColumns(Grid.VisibleColumns);
+        Grid.Refresh(true, true);
+    }
+
+    private void UpdateDefaultColumnsClick(object sender, RoutedEventArgs e)
+    {
+        var tag = GetTag();
+        new GlobalConfiguration<DynamicGridColumns>(tag).Save(Grid.VisibleColumns);
+        new UserConfiguration<DynamicGridColumns>(tag).Delete();
+        Grid.Refresh(true, true);
+    }
+}

+ 7 - 36
inabox.wpf/DynamicGrid/DynamicManyToManyGrid.cs

@@ -51,6 +51,8 @@ namespace InABox.DynamicGrid
 
         private static bool IsAutoEntity => typeof(TManyToMany).HasAttribute<AutoEntity>();
 
+        protected DynamicGridCustomColumnsComponent<TManyToMany> ColumnsComponent;
+
         public DynamicManyToManyGrid()
         {
             MultiSelect = true;
@@ -59,6 +61,8 @@ namespace InABox.DynamicGrid
 
             HiddenColumns.Add(x => x.ID);
             HiddenColumns.Add(CoreUtils.CreateLambdaExpression<TManyToMany>(otherproperty.Name + ".ID"));
+
+            ColumnsComponent = new DynamicGridCustomColumnsComponent<TManyToMany>(this, GetTag(), base.LoadColumns);
         }
 
         protected override void Init()
@@ -189,50 +193,17 @@ namespace InABox.DynamicGrid
 
         protected override DynamicGridColumns LoadColumns()
         {
-            var tag = GetTag();
-            var global = Task.Run(() => new GlobalConfiguration<DynamicGridColumns>(tag).Load());
-            var user = Task.Run(() => new UserConfiguration<DynamicGridColumns>(tag).Load());
-            Task.WaitAll(global, user);
-            var columns = user.Result.Any() ? user.Result : global.Result;
-            if (columns.Count == 0)
-                columns.AddRange(base.LoadColumns().Where(x => !x.ColumnName.StartsWith(thisproperty.Name)));
-            return columns;
+            return ColumnsComponent.LoadColumns();
         }
 
         protected override void SaveColumns(DynamicGridColumns columns)
         {
-            var tag = GetTag();
-            new UserConfiguration<DynamicGridColumns>(tag).Save(columns);
+            ColumnsComponent.SaveColumns(columns);
         }
         protected override void LoadColumnsMenu(ContextMenu menu)
         {
             base.LoadColumnsMenu(menu);
-            //menu.Items.Add(new Separator());
-            var ResetColumns = new MenuItem { Header = "Reset Columns to Default" };
-            ResetColumns.Click += ResetColumnsClick;
-            menu.Items.Add(ResetColumns);
-            if (Security.IsAllowed<CanSetDefaultColumns>())
-            {
-                menu.Items.Add(new Separator());
-                var UpdateDefaultColumns = new MenuItem { Header = "Mark Columns as Default" };
-                UpdateDefaultColumns.Click += UpdateDefaultColumnsClick;
-                menu.Items.Add(UpdateDefaultColumns);
-            }
-        }
-
-        private void ResetColumnsClick(object sender, RoutedEventArgs e)
-        {
-            VisibleColumns.Clear();
-            SaveColumns(VisibleColumns);
-            Refresh(true, true);
-        }
-
-        private void UpdateDefaultColumnsClick(object sender, RoutedEventArgs e)
-        {
-            var tag = GetTag();
-            new GlobalConfiguration<DynamicGridColumns>(tag).Save(VisibleColumns);
-            new UserConfiguration<DynamicGridColumns>(tag).Delete();
-            Refresh(true, true);
+            ColumnsComponent.LoadColumnsMenu(menu);
         }
 
         protected override DynamicGridSettings LoadSettings()

+ 6 - 129
inabox.wpf/DynamicGrid/DynamicOneToManyGrid.cs

@@ -30,6 +30,8 @@ namespace InABox.DynamicGrid
 
         public PageType PageType => PageType.Other;
 
+        protected DynamicGridCustomColumnsComponent<TMany> ColumnsComponent;
+
         public DynamicOneToManyGrid()
         {
             Ready = false;
@@ -38,17 +40,7 @@ namespace InABox.DynamicGrid
 
             property = CoreUtils.GetOneToManyProperty(typeof(TMany), typeof(TOne));
 
-            /*var t = typeof(TMany).BaseType;
-            if (t != null && t.IsConstructedGenericType && t.GetGenericTypeDefinition() == typeof(EntityForm<,>))
-            {
-                ActionColumns.Add(new DynamicImageColumn(QAEditImage, QAEditClick));
-                if (DynamicGridUtils.PreviewReport != null)
-                    ActionColumns.Add(new DynamicImageColumn(QAPrintImage, QAPrintClick));
-                HiddenColumns.Add(x => (x as IDigitalFormInstance).FormData);
-                HiddenColumns.Add(x => (x as IDigitalFormInstance).FormCompleted);
-                HiddenColumns.Add(x => (x as IDigitalFormInstance).FormCompletedBy.ID);
-                HiddenColumns.Add(x => (x as IDigitalFormInstance).Form.ID);
-            }*/
+            ColumnsComponent = new DynamicGridCustomColumnsComponent<TMany>(this, GetTag(), base.LoadColumns);
         }
 
         protected override void Init()
@@ -177,8 +169,6 @@ namespace InABox.DynamicGrid
                 var prop = (property.GetValue(map) as IEntityLink)!;
                 prop.ID = Item.ID;
                 prop.Synchronise(Item);
-                //if (map.IsChanged())
-                //    new Client<TMany>().Save(map, "Updated by User");
             }
 
             new Client<TMany>().Save(Items.Where(x => x.IsChanged()), "Updated by User");
@@ -224,50 +214,17 @@ namespace InABox.DynamicGrid
 
         protected override DynamicGridColumns LoadColumns()
         {
-            var tag = GetTag();
-            var global = Task.Run(() => new GlobalConfiguration<DynamicGridColumns>(tag).Load());
-            var user = Task.Run(() => new UserConfiguration<DynamicGridColumns>(tag).Load());
-            Task.WaitAll(global, user);
-            var columns = user.Result.Any() ? user.Result : global.Result;
-            if (columns.Count == 0)
-                columns.AddRange(base.LoadColumns().Where(x => !x.ColumnName.StartsWith(property.Name)));
-            return columns;
+            return ColumnsComponent.LoadColumns();
         }
 
         protected override void SaveColumns(DynamicGridColumns columns)
         {
-            var tag = GetTag();
-            new UserConfiguration<DynamicGridColumns>(tag).Save(columns);
+            ColumnsComponent.SaveColumns(columns);
         }
         protected override void LoadColumnsMenu(ContextMenu menu)
         {
             base.LoadColumnsMenu(menu);
-            //menu.Items.Add(new Separator());
-            var ResetColumns = new MenuItem { Header = "Reset Columns to Default" };
-            ResetColumns.Click += ResetColumnsClick;
-            menu.Items.Add(ResetColumns);
-            if (Security.IsAllowed<CanSetDefaultColumns>())
-            {
-                menu.Items.Add(new Separator());
-                var UpdateDefaultColumns = new MenuItem { Header = "Mark Columns as Default" };
-                UpdateDefaultColumns.Click += UpdateDefaultColumnsClick;
-                menu.Items.Add(UpdateDefaultColumns);
-            }
-        }
-
-        private void ResetColumnsClick(object sender, RoutedEventArgs e)
-        {
-            VisibleColumns.Clear();
-            SaveColumns(VisibleColumns);
-            Refresh(true, true);
-        }
-
-        private void UpdateDefaultColumnsClick(object sender, RoutedEventArgs e)
-        {
-            var tag = GetTag();
-            new GlobalConfiguration<DynamicGridColumns>(tag).Save(VisibleColumns);
-            new UserConfiguration<DynamicGridColumns>(tag).Delete();
-            Refresh(true, true);
+            ColumnsComponent.LoadColumnsMenu(menu);
         }
 
         protected override DynamicGridSettings LoadSettings()
@@ -277,11 +234,6 @@ namespace InABox.DynamicGrid
             var user = Task.Run(() => new UserConfiguration<DynamicGridSettings>(tag).Load());
             user.Wait();
 
-            //var global = Task.Run(() => new GlobalConfiguration<DynamicGridSettings>(tag).Load());
-            //global.Wait();
-            //Task.WaitAll(user, global);
-            //var columns = user.Result.Any() ? user.Result : global.Result;
-
             return user.Result;
         }
         protected override void SaveSettings(DynamicGridSettings settings)
@@ -318,9 +270,6 @@ namespace InABox.DynamicGrid
                 Items.Add(item);
 
             if (item is ISequenceable) Items = Items.AsQueryable().OrderBy(x => (x as ISequenceable)!.Sequence).ToList();
-            //var sort = LookupFactory.DefineSort<TMany>();
-            //if (sort != null)
-            //    Items = Items.AsQueryable().SortBy(sort.Expression).ToList();
         }
 
         protected override void DeleteItems(params CoreRow[] rows)
@@ -335,9 +284,6 @@ namespace InABox.DynamicGrid
         protected override void Reload(Filters<TMany> criteria, Columns<TMany> columns, ref SortOrder<TMany>? sort,
             Action<CoreTable?, Exception?> action)
         {
-            //var exp = BaseObject.DefaultSortOrder<TMany>().Expression;
-            //Items = Items.AsQueryable().SortBy(exp).To
-
             var results = new CoreTable();
             results.LoadColumns(typeof(TMany));
 
@@ -356,10 +302,6 @@ namespace InABox.DynamicGrid
             }
             results.LoadRows(Items);
 
-            //if (sort != null)
-            //    results.LoadRows(Items.AsQueryable().SortBy(sort.Expression));
-            //else
-            //    results.LoadRows(Items.OrderBy(x=>x.Sort));
             action.Invoke(results, null);
         }
 
@@ -371,71 +313,6 @@ namespace InABox.DynamicGrid
             return base.GetEditor(item, column);
         }
 
-        //protected override void EditorValueChanged(object item, string name, object value, List<String> changes)
-        //{
-        //    Entity entity = (Entity)item;
-
-        //    Dictionary<String, String> previous = new Dictionary<string, string>();
-
-        //    if (entity.OriginalValues != null)
-        //    {
-        //        foreach (var key in entity.OriginalValues.Keys)
-        //            previous[key] = entity.OriginalValues.ToString();
-        //    }
-
-        //    base.EditorValueChanged(item, name, value, changes);
-
-        //    if (entity.OriginalValues != null)
-        //    {
-        //        foreach (var key in entity.OriginalValues.Keys)
-        //        {
-        //            if (key != name)
-        //            {
-        //                String oldval = entity.OriginalValues[key] != null ? entity.OriginalValues[key].ToString() : "";
-        //                if ((!previous.ContainsKey(key)) || (!previous[key].Equals(oldval)))
-        //                {
-        //                    if (!changes.Contains(key))
-        //                        changes.Add(key);
-        //                }
-        //            }
-        //        }
-        //    }
-        //}
-
-        /*private BitmapImage QAPrintImage(CoreRow arg)
-        {
-            return Wpf.Resources.print.AsBitmapImage();
-        }
-
-        private bool QAPrintClick(CoreRow arg)
-        {
-            var formid = arg.Get<TMany, Guid>(x => (x as IDigitalFormInstance).Form.ID);
-            var model = new DigitalFormReportDataModel<TMany>(new Filter<TMany>("Parent.ID").IsEqualTo(Item.ID), formid);
-            var section = formid.ToString();
-
-            // TODO: This is a hack
-            DynamicGridUtils.PrintMenu?.Invoke(null, section, model, true);
-
-            return false;
-        }*/
-
-        /*private BitmapImage QAEditImage(CoreRow arg)
-        {
-            if (arg == null)
-                return Wpf.Resources.pencil.AsBitmapImage();
-            var completed = arg.Get<TMany, DateTime>(x => (x as IBaseDigitalFormInstance).FormCompleted);
-            return completed.IsEmpty() ? Wpf.Resources.pencil.AsBitmapImage() : Wpf.Resources.view.AsBitmapImage();
-        }
-
-        private bool QAEditClick(CoreRow arg)
-        {
-            var item = LoadItem(arg);
-            var result = DynamicFormEditWindow.EditDigitalForm(item as IDigitalFormInstance);
-            if (result)
-                SaveItem(item);
-            return result;
-        }*/
-
         public override DynamicEditorPages LoadEditorPages(TMany item)
         {
             return item.ID != Guid.Empty ? base.LoadEditorPages(item) : new DynamicEditorPages();