Kaynağa Gözat

Added asynchronous QueryMultiple; enforced ColumnName for DynamicColumnsGrid; added empty item to DirectEdit Lookup

Kenric Nugteren 1 yıl önce
ebeveyn
işleme
f2baae2120

+ 21 - 0
InABox.Core/Client/BaseClient.cs

@@ -286,6 +286,27 @@ namespace InABox.Clients
 
         protected abstract Dictionary<string, CoreTable> DoQueryMultiple(Dictionary<string, IQueryDef> queries);
 
+        public void QueryMultiple(Action<Dictionary<string, CoreTable>?, Exception?> callback, Dictionary<string, IQueryDef> queries)
+        {
+            Task.Run(() =>
+            {
+                Exception? err = null;
+                Dictionary<string, CoreTable>? result = null;
+                try
+                {
+                    result = DoQueryMultiple(queries);
+                }
+                catch (Exception e)
+                {
+                    err = e;
+                }
+                finally
+                {
+                    callback.Invoke(result, err);
+                }
+            });
+        }
+
         #endregion
 
         #region 2FA

+ 38 - 17
InABox.Core/Client/Client.cs

@@ -57,14 +57,18 @@ namespace InABox.Clients
             }
         }
 
-        public static QueryMultipleResults QueryMultiple(params IKeyedQueryDef[] queries)
+        public static void QueryMultiple(
+            Action<Dictionary<string, CoreTable>?, Exception?> callback,
+            Dictionary<string, IQueryDef> queries)
         {
             try
             {
                 using var timer = new Profiler(false);
-                var result = CheckClient().QueryMultiple(queries.ToDictionary(x => x.Key, x => x as IQueryDef));
-                timer.Log(result.Sum(x => x.Value.Rows.Count));
-                return new QueryMultipleResults(result);
+                CheckClient().QueryMultiple((result, e) =>
+                {
+                    timer.Dispose(result != null ? result.Sum(x => x.Value.Rows.Count) : -1);
+                    callback?.Invoke(result, e);
+                }, queries);
             }
             catch (RequestException e)
             {
@@ -72,21 +76,38 @@ namespace InABox.Clients
                 throw;
             }
         }
-        public static QueryMultipleResults QueryMultiple(IEnumerable<IKeyedQueryDef> queries)
-        {
-            try
+
+        public static QueryMultipleResults QueryMultiple(params IKeyedQueryDef[] queries) =>
+            new QueryMultipleResults(QueryMultiple(queries.ToDictionary(x => x.Key, x => x as IQueryDef)));
+
+        public static void QueryMultiple(Action<QueryMultipleResults?, Exception?> callback, params IKeyedQueryDef[] queries) =>
+            QueryMultiple((results, e) =>
             {
-                using var timer = new Profiler(false);
-                var result = CheckClient().QueryMultiple(queries.ToDictionary(x => x.Key, x => x as IQueryDef));
-                timer.Log(result.Sum(x => x.Value.Rows.Count));
-                return new QueryMultipleResults(result);
-            }
-            catch (RequestException e)
+                if (results != null)
+                {
+                    callback?.Invoke(new QueryMultipleResults(results), e);
+                }
+                else
+                {
+                    callback?.Invoke(null, e);
+                }
+            }, queries.ToDictionary(x => x.Key, x => x as IQueryDef));
+
+        public static QueryMultipleResults QueryMultiple(IEnumerable<IKeyedQueryDef> queries) =>
+            new QueryMultipleResults(QueryMultiple(queries.ToDictionary(x => x.Key, x => x as IQueryDef)));
+
+        public static void QueryMultiple(Action<QueryMultipleResults?, Exception?> callback, IEnumerable<IKeyedQueryDef> queries) =>
+            QueryMultiple((results, e) =>
             {
-                ClientFactory.RaiseRequestError(e);
-                throw;
-            }
-        }
+                if(results != null)
+                {
+                    callback?.Invoke(new QueryMultipleResults(results), e);
+                }
+                else
+                {
+                    callback?.Invoke(null, e);
+                }
+            }, queries.ToDictionary(x => x.Key, x => x as IQueryDef));
 
         public static IValidationData Validate(Guid session)
         {

+ 1 - 0
InABox.Core/Client/IClient.cs

@@ -20,6 +20,7 @@ namespace InABox.Clients
         void Delete(object entity, string auditnote);
         void Delete(IList<object> entities, string auditnote);
         Dictionary<string, CoreTable> QueryMultiple(Dictionary<string, IQueryDef> queries);
+        void QueryMultiple(Action<Dictionary<string, CoreTable>?, Exception?> callback, Dictionary<string, IQueryDef> queries);
 
         bool Check2FA(string code, Guid? session = null);
 

+ 5 - 0
InABox.Core/Editors/Utils/ILookupEditor.cs

@@ -12,4 +12,9 @@ namespace InABox.Core
 
         void Clear();
     }
+
+    public static class LookupEditorExtensions
+    {
+        public static bool IsEnumEditor(this ILookupEditor editor) => editor is EnumLookupEditor;
+    }
 }

+ 3 - 5
InABox.Core/Entity.cs

@@ -224,11 +224,9 @@ namespace InABox.Core
 
         private void CheckSequence()
         {
-            if (this is ISequenceable)
+            if (this is ISequenceable seq && seq.Sequence <= 0)
             {
-                var seq = (ISequenceable)this;
-                if (seq.Sequence <= 0)
-                    seq.Sequence = CoreUtils.GenerateSequence();
+                seq.Sequence = CoreUtils.GenerateSequence();
             }
         }
 
@@ -289,7 +287,7 @@ namespace InABox.Core
         }
 
 
-        protected override void DoPropertyChanged(string name, object before, object after)
+        protected override void DoPropertyChanged(string name, object? before, object? after)
         {
             if (!IsObserving())
                 return;

+ 3 - 3
InABox.Core/Filter.cs

@@ -293,7 +293,7 @@ namespace InABox.Core
         IFilter EndsWith(string value);
 
         IFilter InQuery<U>(SubQuery<U> value);
-        IFilter InQuery<U>(Filter<U> filter, Expression<Func<U, object?>> column);
+        IFilter InQuery<U>(Filter<U>? filter, Expression<Func<U, object?>> column);
 
         IFilter All();
         IFilter None();
@@ -891,8 +891,8 @@ namespace InABox.Core
         public Filter<T> InQuery<U>(SubQuery<U> value) => ApplyObjectOperator(Operator.InQuery, value);
         IFilter IFilter.InQuery<U>(SubQuery<U> value) => InQuery(value);
 
-        public Filter<T> InQuery<U>(Filter<U> filter, Expression<Func<U, object?>> column) => InQuery(new SubQuery<U>(filter, new Column<U>(column)));
-        IFilter IFilter.InQuery<U>(Filter<U> value, Expression<Func<U, object?>> column) => InQuery(value, column);
+        public Filter<T> InQuery<U>(Filter<U>? filter, Expression<Func<U, object?>> column) => InQuery(new SubQuery<U>(filter, new Column<U>(column)));
+        IFilter IFilter.InQuery<U>(Filter<U>? filter, Expression<Func<U, object?>> column) => InQuery(filter, column);
 
         #endregion
 

+ 8 - 0
inabox.wpf/DynamicGrid/DynamicColumnGrid.cs

@@ -46,6 +46,14 @@ namespace InABox.DynamicGrid
         //	return LoadColumns();
         //}
 
+        protected override void DoValidate(DynamicGridColumn[] items, List<string> errors)
+        {
+            base.DoValidate(items, errors);
+
+            if (items.Any(x => string.IsNullOrWhiteSpace(x.ColumnName)))
+                errors.Add("[ColumnName] must not be blank!");
+        }
+
         protected override DynamicGridColumns LoadColumns()
         {
             var columns = new DynamicGridColumns

+ 1 - 1
inabox.wpf/DynamicGrid/DynamicDataGrid.cs

@@ -284,7 +284,7 @@ namespace InABox.DynamicGrid
         {
             Filter<TEntity>? filter = null;
             var results = new List<TEntity>();
-            for (var i = 0; i < rows.Length; i = i + ChunkSize)
+            for (var i = 0; i < rows.Length; i += ChunkSize)
             {
                 var chunk = rows.Skip(i).Take(ChunkSize);
                 foreach (var row in chunk)

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

@@ -1327,7 +1327,7 @@ namespace InABox.DynamicGrid
                 return;
             var column = ColumnList[columnindex] as DynamicActionColumn;
             var rowindex = rowcolumnindex.RowIndex - (HasOption(DynamicGridOption.FilterRows) ? 2 : 1);
-            if (rowindex < 0)
+            if (rowindex < 0 || rowindex >= Data.Rows.Count)
                 return;
             var row = Data.Rows[rowindex];
             var menu = column?.ContextMenu?.Invoke(SelectedRows);
@@ -1992,10 +1992,21 @@ namespace InABox.DynamicGrid
                         //lookupcol.DisplayMemberPath = "Value";
                         //lookupcol.ItemsSource = lookups;
 
-                        var table = lookupEditor.Values(column.ColumnName).ToDataTable();
-                        lookupcol.SelectedValuePath = table.Columns[0].ColumnName;
-                        lookupcol.DisplayMemberPath = "Display";
-                        lookupcol.ItemsSource = table.DefaultView;
+                        var data = lookupEditor.Values(column.ColumnName);
+
+                        var items = new List<Tuple<object?, string>>();
+                        if (!lookupEditor.IsEnumEditor())
+                        {
+                            items.Add(new(null, ""));
+                        }
+                        foreach(var row in data.Rows)
+                        {
+                            items.Add(new(row[data.Columns[0].ColumnName], (row["Display"] ?? "").ToString() ?? ""));
+                        }
+
+                        lookupcol.SelectedValuePath = "Item1";
+                        lookupcol.DisplayMemberPath = "Item2";
+                        lookupcol.ItemsSource = items;
                         newcol = lookupcol;
                     }
                     else

+ 1 - 0
inabox.wpf/DynamicGrid/DynamicGridColumnsEditor.xaml.cs

@@ -1,5 +1,6 @@
 using InABox.Wpf;
 using System;
+using System.Collections.Generic;
 using System.Windows;
 using System.Windows.Controls;
 

+ 5 - 10
inabox.wpf/DynamicGrid/Editors/LookupEditor/LookupEditorControl.cs

@@ -77,7 +77,7 @@ namespace InABox.DynamicGrid
             Editor.Items.Clear();
             Lookups.Clear();
 
-            if (!IsEnumEditor())
+            if (!EditorDefinition.IsEnumEditor())
                 Editor.Items.Add("");
             foreach (var row in values.Rows)
             {
@@ -92,7 +92,7 @@ namespace InABox.DynamicGrid
             }
 
             var sel = value != null ? values.Rows.FirstOrDefault(r => r[keycol].Equals(value)) : null;
-            if (IsEnumEditor())
+            if (EditorDefinition.IsEnumEditor())
                 Editor.SelectedIndex = sel != null ? sel.Index : 0;
             else
                 Editor.SelectedIndex = sel != null ? sel.Index + 1 : 0;
@@ -116,11 +116,6 @@ namespace InABox.DynamicGrid
             Editor.Focus();
         }
 
-        private bool IsEnumEditor()
-        {
-            return EditorDefinition is EnumLookupEditor;
-        }
-
         public List<Button> Buttons { get; private set; }
 
         protected override FrameworkElement CreateEditor()
@@ -186,7 +181,7 @@ namespace InABox.DynamicGrid
 
         protected override object RetrieveValue()
         {
-            if (IsEnumEditor())
+            if (EditorDefinition.IsEnumEditor())
             {
                 if (Editor.SelectedIndex >= 0 && Editor.SelectedIndex < Lookups.Keys.Count)
                     return Lookups.Keys.ElementAt(Editor.SelectedIndex);
@@ -218,13 +213,13 @@ namespace InABox.DynamicGrid
                 Editor.Items.Clear();
                 Editor.Items.Add("");
                 Editor.Items.Add("Loading...");
-                Editor.SelectedIndex = IsEnumEditor() ? 0 : 1;
+                Editor.SelectedIndex = EditorDefinition.IsEnumEditor() ? 0 : 1;
                 return;
             }
 
             if (Lookups.ContainsKey(value))
             {
-                if (IsEnumEditor())
+                if (EditorDefinition.IsEnumEditor())
                     Editor.SelectedIndex = Lookups.Keys.ToList().IndexOf(value);
                 else
                     Editor.SelectedIndex = Lookups.Keys.ToList().IndexOf(value) + 1;

+ 6 - 1
inabox.wpf/DynamicGrid/IDynamicGrid.cs

@@ -51,8 +51,13 @@ namespace InABox.DynamicGrid
         public abstract void Reconfigure();
 
         /// <summary>
-        /// Add <paramref name="onReconfigure"/> to <see cref="OnReconfigure"/>, and then call <see cref="Reconfigure"/>
+        /// Add <paramref name="onReconfigure"/> to <see cref="OnReconfigure"/>, and then call <see cref="Reconfigure"/>.
         /// </summary>
+        /// <remarks>
+        /// Probably should only be called once per grid, otherwise there will be multiple event handlers bound.<br/>
+        /// If you want to reconfigure without specifiying
+        /// a new reconfigure event, use <see cref="Reconfigure"/>.
+        /// </remarks>
         /// <param name="onReconfigure"></param>
         public void Reconfigure(ReconfigureEvent onReconfigure);