Bläddra i källkod

Added Cancel() function to DynamicEditPage to cancel things correctly.

Kenric Nugteren 7 månader sedan
förälder
incheckning
77488a2b0a

+ 25 - 10
inabox.wpf/DigitalForms/DigitalFormReportGrid.cs

@@ -74,20 +74,24 @@ namespace InABox.DynamicGrid
         {
             Form = (DigitalForm)item;
 
-            CoreTable data;
+            CoreTable? data = null;
             if (PageDataHandler != null)
                 data = PageDataHandler?.Invoke(typeof(ReportTemplate));
-            else if (Form.ID == Guid.Empty)
-            {
-                data = new CoreTable();
-                data.LoadColumns(typeof(ReportTemplate));
-            }
-            else
+
+            if(data is null)
             {
-                data = new Client<ReportTemplate>()
-                    .Query(new Filter<ReportTemplate>(x => x.Section).IsEqualTo(Form.ID.ToString()));
+                if (Form.ID == Guid.Empty)
+                {
+                    data = new CoreTable();
+                    data.LoadColumns(typeof(ReportTemplate));
+                }
+                else
+                {
+                    data = new Client<ReportTemplate>()
+                        .Query(new Filter<ReportTemplate>(x => x.Section).IsEqualTo(Form.ID.ToString()));
+                }
             }
-            OriginalItems = data.Rows.Select(x => x.ToObject<ReportTemplate>()).ToList();
+            OriginalItems = data.ToList<ReportTemplate>();
 
             Items = OriginalItems.ToList();
             Refresh(true, true);
@@ -95,6 +99,17 @@ namespace InABox.DynamicGrid
             Ready = true;
         }
 
+        public void Cancel()
+        {
+            foreach(var item in OriginalItems)
+            {
+                item.CancelChanges();
+            }
+            Items = OriginalItems.ToList();
+            Refresh(false, true);
+        }
+
+
         private DynamicVariableGrid? GetVariableGrid()
             => EditorGrid.Pages?.FirstOrDefault(x => x is DynamicVariableGrid)
                 as DynamicVariableGrid;

+ 5 - 0
inabox.wpf/DynamicGrid/DynamicEditorForm/DynamicEditorGrid.xaml.cs

@@ -352,6 +352,11 @@ public partial class DynamicEditorGrid : UserControl, IDynamicEditorHost
         {
         }
 
+        public void Cancel()
+        {
+            // Do nothing, since the cancelling of the items is handled by the editor form.
+        }
+
         public string Caption() => Header;
 
         public bool TryFindEditor(string columnname, [NotNullWhen(true)] out IDynamicEditorControl? editor)

+ 5 - 0
inabox.wpf/DynamicGrid/DynamicEditorForm/EmbeddedDynamicEditorForm.xaml.cs

@@ -363,6 +363,11 @@ namespace InABox.DynamicGrid
             foreach (var item in _items)
                 item.CancelChanges();
 
+            foreach(var page in Editor.Pages)
+            {
+                page.Cancel();
+            }
+
             OnCancel?.Invoke();
             //OKButton.IsEnabled = false;
             //CancelButton.IsEnabled = false;

+ 144 - 133
inabox.wpf/DynamicGrid/Grids/DynamicEnclosedListGrid.cs

@@ -12,179 +12,190 @@ using FastReport.Utils;
 using InABox.Configuration;
 using InABox.Core;
 
-namespace InABox.DynamicGrid
+namespace InABox.DynamicGrid;
+
+public interface IDynamicEnclosedListGrid<TOne, TMany> : IDynamicEditorPage
+{
+    TOne Entity { get; set; }
+    List<TMany> Items { get; }
+    void LoadItems(IEnumerable<TMany> items);
+}
+
+public class DynamicEnclosedListGrid<TOne, TMany> : DynamicGrid<TMany>, IDynamicEditorPage, IDynamicEnclosedListGrid<TOne, TMany>
+    where TMany : BaseObject, new() where TOne : Entity, IRemotable, IPersistent, new()
 {
-    public interface IDynamicEnclosedListGrid<TOne, TMany> : IDynamicEditorPage
+    private readonly List<TMany> MasterList = new();
+
+    private readonly PropertyInfo property;
+
+    public PageType PageType => PageType.Other;
+
+    public bool ReadOnly { get; set; }
+
+    protected DynamicGridCustomColumnsComponent<TMany> ColumnsComponent;
+
+    public DynamicEnclosedListGrid(PropertyInfo prop)
     {
-        TOne Entity { get; set; }
-        List<TMany> Items { get; }
-        void LoadItems(IEnumerable<TMany> items);
+        Items = new List<TMany>();
+        property = prop;
+
+        ColumnsComponent = new(this, null);
     }
 
-    public class DynamicEnclosedListGrid<TOne, TMany> : DynamicGrid<TMany>, IDynamicEditorPage, IDynamicEnclosedListGrid<TOne, TMany>
-        where TMany : BaseObject, new() where TOne : Entity, IRemotable, IPersistent, new()
+    protected override void Init()
     {
-        private readonly List<TMany> MasterList = new();
-
-        private readonly PropertyInfo property;
+    }
 
-        public PageType PageType => PageType.Other;
+    protected override void DoReconfigure(DynamicGridOptions options)
+    {
+        options.RecordCount = true;
+        options.SelectColumns = true;
+    }
 
-        public bool ReadOnly { get; set; }
+    public DynamicEditorGrid EditorGrid { get; set; }
 
-        protected DynamicGridCustomColumnsComponent<TMany> ColumnsComponent;
+    public bool Ready { get; set; }
 
-        public DynamicEnclosedListGrid(PropertyInfo prop)
-        {
-            Items = new List<TMany>();
-            property = prop;
+    public string Caption()
+    {
+        var caption = typeof(TMany).GetCustomAttribute(typeof(Caption));
+        if (caption != null)
+            return ((Caption)caption).Text;
+        var result = new Inflector.Inflector(new CultureInfo("en")).Pluralize(typeof(TMany).Name);
+        return result;
+    }
 
-            ColumnsComponent = new(this, null);
-        }
+    public virtual int Order { get; set; } = int.MinValue;
 
-        protected override void Init()
-        {
-        }
+    public void Load(object item, Func<Type, CoreTable?>? PageDataHandler)
+    {
+        Entity = (TOne)item;
+        MasterList.Clear();
+        if (property.GetValue(item) is IList list)
+            foreach (var entry in list)
+                MasterList.Add((TMany)entry);
+        Items.AddRange(MasterList);
+        Refresh(true, true);
+        Ready = true;
+    }
 
-        protected override void DoReconfigure(DynamicGridOptions options)
+    public void Cancel()
+    {
+        foreach(var item in MasterList)
         {
-            options.RecordCount = true;
-            options.SelectColumns = true;
+            item.CancelChanges();
         }
 
-        public DynamicEditorGrid EditorGrid { get; set; }
+        Items.Clear();
+        Items.AddRange(MasterList);
+        Refresh(false, true);
+    }
 
-        public bool Ready { get; set; }
+    public void BeforeSave(object item)
+    {
+        var list = Activator.CreateInstance(property.PropertyType) as IList;
+        foreach (var entry in Items)
+            list.Add(entry);
+        property.SetValue(item, list);
+    }
 
-        public string Caption()
-        {
-            var caption = typeof(TMany).GetCustomAttribute(typeof(Caption));
-            if (caption != null)
-                return ((Caption)caption).Text;
-            var result = new Inflector.Inflector(new CultureInfo("en")).Pluralize(typeof(TMany).Name);
-            return result;
-        }
+    public void AfterSave(object item)
+    {
+    }
 
-    public virtual int Order { get; set; } = int.MinValue;
+    public Size MinimumSize()
+    {
+        return new Size(400, 400);
+    }
 
-        public void Load(object item, Func<Type, CoreTable?>? PageDataHandler)
-        {
-            Entity = (TOne)item;
-            MasterList.Clear();
-            if (property.GetValue(item) is IList list)
-                foreach (var entry in list)
-                    MasterList.Add((TMany)entry);
-            Items.AddRange(MasterList);
-            Refresh(true, true);
-            Ready = true;
-        }
+    public List<TMany> Items { get; private set; }
 
-        public void BeforeSave(object item)
-        {
-            var list = Activator.CreateInstance(property.PropertyType) as IList;
-            foreach (var entry in Items)
-                list.Add(entry);
-            property.SetValue(item, list);
-        }
+    public TOne Entity { get; set; }
 
-        public void AfterSave(object item)
-        {
-        }
+    public void LoadItems(IEnumerable<TMany> items)
+    {
+        Items.Clear();
+        if (items != null)
+            Items.AddRange(items);
+        Refresh(false, true);
+    }
 
-        public Size MinimumSize()
-        {
-            return new Size(400, 400);
-        }
+    public override DynamicGridColumns GenerateColumns()
+    {
+        var cols = new DynamicGridColumns();
+        cols.AddRange(base.GenerateColumns().Where(x => !x.ColumnName.StartsWith(property.Name + ".")));
+        return cols;
+    }
 
-        public List<TMany> Items { get; private set; }
+    protected override DynamicGridColumns LoadColumns()
+    {
+        return ColumnsComponent.LoadColumns();
+    }
 
-        public TOne Entity { get; set; }
+    protected override void SaveColumns(DynamicGridColumns columns)
+    {
+        ColumnsComponent.SaveColumns(columns);
+    }
 
-        public void LoadItems(IEnumerable<TMany> items)
-        {
-            Items.Clear();
-            if (items != null)
-                Items.AddRange(items);
-            Refresh(false, true);
-        }
+    protected override void LoadColumnsMenu(ContextMenu menu)
+    {
+        base.LoadColumnsMenu(menu);
+        ColumnsComponent.LoadColumnsMenu(menu);
+    }
 
-        public override DynamicGridColumns GenerateColumns()
-        {
-            var cols = new DynamicGridColumns();
-            cols.AddRange(base.GenerateColumns().Where(x => !x.ColumnName.StartsWith(property.Name + ".")));
-            return cols;
-        }
+    public override TMany LoadItem(CoreRow row)
+    {
+        return Items[row.Index];
+    }
 
-        protected override DynamicGridColumns LoadColumns()
-        {
-            return ColumnsComponent.LoadColumns();
-        }
+    public override void SaveItem(TMany item)
+    {
+        if (!Items.Contains(item))
+            Items.Add(item);
 
-        protected override void SaveColumns(DynamicGridColumns columns)
+        if (item is ISequenceable && LookupFactory.DefineSort<TMany>() is SortOrder<TMany> sort)
         {
-            ColumnsComponent.SaveColumns(columns);
+            Items = Items.AsQueryable().SortBy(sort.Expression).ToList();
         }
+    }
 
-        protected override void LoadColumnsMenu(ContextMenu menu)
-        {
-            base.LoadColumnsMenu(menu);
-            ColumnsComponent.LoadColumnsMenu(menu);
-        }
+    public override void DeleteItems(params CoreRow[] rows)
+    {
+        foreach (var row in rows.OrderByDescending(x => x.Index))
+            Items.RemoveAt(row.Index);
+    }
 
-        public override TMany LoadItem(CoreRow row)
-        {
-            return Items[row.Index];
-        }
+    protected override void Reload(
+        Filters<TMany> criteria, Columns<TMany> columns, ref SortOrder<TMany>? sort, 
+        CancellationToken token, Action<CoreTable?, Exception?> action)
+    {
+        var results = new CoreTable();
+        results.LoadColumns(typeof(TMany));
 
-        public override void SaveItem(TMany item)
+        if (sort != null)
         {
-            if (!Items.Contains(item))
-                Items.Add(item);
-
-            if (item is ISequenceable && LookupFactory.DefineSort<TMany>() is SortOrder<TMany> sort)
+            var exp = IQueryableExtensions.ToLambda<TMany>(sort.Expression);
+            var sorted = sort.Direction == SortDirection.Ascending
+                ? Items.AsQueryable().OrderBy(exp)
+                : Items.AsQueryable().OrderByDescending(exp);
+            foreach (var then in sort.Thens)
             {
-                Items = Items.AsQueryable().SortBy(sort.Expression).ToList();
+                var thexp = IQueryableExtensions.ToLambda<TMany>(then.Expression);
+                sorted = sort.Direction == SortDirection.Ascending ? sorted.ThenBy(exp) : sorted.ThenByDescending(exp);
             }
-        }
 
-        public override void DeleteItems(params CoreRow[] rows)
-        {
-            foreach (var row in rows.OrderByDescending(x => x.Index))
-                Items.RemoveAt(row.Index);
+            results.LoadRows(sorted);
         }
-
-        protected override void Reload(
-            Filters<TMany> criteria, Columns<TMany> columns, ref SortOrder<TMany>? sort, 
-            CancellationToken token, Action<CoreTable?, Exception?> action)
+        else
         {
-            var results = new CoreTable();
-            results.LoadColumns(typeof(TMany));
-
-            if (sort != null)
-            {
-                var exp = IQueryableExtensions.ToLambda<TMany>(sort.Expression);
-                var sorted = sort.Direction == SortDirection.Ascending
-                    ? Items.AsQueryable().OrderBy(exp)
-                    : Items.AsQueryable().OrderByDescending(exp);
-                foreach (var then in sort.Thens)
-                {
-                    var thexp = IQueryableExtensions.ToLambda<TMany>(then.Expression);
-                    sorted = sort.Direction == SortDirection.Ascending ? sorted.ThenBy(exp) : sorted.ThenByDescending(exp);
-                }
-
-                results.LoadRows(sorted);
-            }
-            else
-            {
-                results.LoadRows(Items);
-            }
+            results.LoadRows(Items);
+        }
 
-            //if (sort != null)
-            //    results.LoadRows(Items.AsQueryable().SortBy(sort.Expression));
-            //else
-            //    results.LoadRows(Items.OrderBy(x => x.Sort));
+        //if (sort != null)
+        //    results.LoadRows(Items.AsQueryable().SortBy(sort.Expression));
+        //else
+        //    results.LoadRows(Items.OrderBy(x => x.Sort));
 
-            action.Invoke(results, null);
-        }
+        action.Invoke(results, null);
     }
 }

+ 10 - 0
inabox.wpf/DynamicGrid/Grids/DynamicManyToManyGrid.cs

@@ -361,6 +361,16 @@ public class DynamicManyToManyGrid<TManyToMany, TThis> : DynamicGrid<TManyToMany
         }
     }
 
+    public void Cancel()
+    {
+        foreach(var item in MasterList)
+        {
+            item.CancelChanges();
+        }
+        WorkingList = MasterList.ToList();
+        Refresh(false, true);
+    }
+
     private void RefreshData(CoreTable data)
     {
         MasterList = data.ToArray<TManyToMany>();

+ 10 - 1
inabox.wpf/DynamicGrid/Grids/DynamicOneToManyGrid.cs

@@ -152,12 +152,21 @@ public class DynamicOneToManyGrid<TOne, TMany> : DynamicGrid<TMany>,
             }
         }
 
-        MasterList = data.Rows.Select(x => x.ToObject<TMany>()).ToArray();
+        MasterList = data.ToArray<TMany>();
 
         Items = MasterList.ToList();
         Refresh(false, true);
         Ready = true;
     }
+    public void Cancel()
+    {
+        foreach(var item in MasterList)
+        {
+            item.CancelChanges();
+        }
+        Items = MasterList.ToList();
+        Refresh(false, true);
+    }
 
     public virtual void BeforeSave(object item)
     {

+ 2 - 0
inabox.wpf/DynamicGrid/Pages/DynamicEditorPage.cs

@@ -46,6 +46,8 @@ public interface IDynamicEditorPage
     event EventHandler OnChanged;
     void DoChanged();
 
+    void Cancel();
+
     Size MinimumSize();
 
     string Caption();