Ver código fonte

Lookup DefineFilterColumns for LoadEditorColumns; fix to setobserving in DFLayout; added colourexpressions; fixed deletions window provider not set error;
fixed a problem with report column selection;

Kenric Nugteren 2 anos atrás
pai
commit
2ef2850eff

+ 2 - 1
InABox.Core/DigitalForms/Layouts/Controls/DFLayoutControl.cs

@@ -4,8 +4,9 @@ namespace InABox.Core
 {
     public abstract class DFLayoutControl : DFLayoutObject, ISequenceable
     {
-        public DFLayoutControl()
+        protected override void Init()
         {
+            base.Init();
             Row = 1;
             RowSpan = 1;
             Column = 1;

+ 2 - 0
InABox.Core/DigitalForms/Layouts/DFLayoutObject.cs

@@ -42,11 +42,13 @@ namespace InABox.Core
 
         public void LoadFromString(string properties)
         {
+            SetObserving(false);
             if (!string.IsNullOrEmpty(properties))
                 _properties = Serialization.Deserialize<Dictionary<string, object>>(properties);
             else
                 _properties = new Dictionary<string, object>();
             LoadProperties();
+            SetObserving(true);
         }
 
         public string SaveToString()

+ 62 - 5
InABox.Core/ILookupDefinition.cs

@@ -9,7 +9,7 @@ namespace InABox.Core
 {
     public interface ILookupDefinition<TLookup> where TLookup : BaseObject, new()
     {
-        Filter<TLookup> DefineFilter();
+        Filter<TLookup>? DefineFilter();
 
         Columns<TLookup> DefineColumns();
 
@@ -23,6 +23,12 @@ namespace InABox.Core
     public interface ILookupDefinition<TLookup, TEntity> where TLookup : Entity
     {
         Filter<TLookup> DefineFilter(TEntity[] items);
+
+        /// <summary>
+        /// Define the columns required for the <c>items</c> parameter of <see cref="DefineFilter(TEntity[])"/>.
+        /// </summary>
+        /// <returns></returns>
+        Columns<TEntity> DefineFilterColumns();
     }
 
     public interface IStaticLookupDefinition<TEntity>
@@ -197,9 +203,9 @@ namespace InABox.Core
             var factory = _cache.GetFactory(TLookup, TEntity);
             if (factory != null)
             {
-                var filtertype = typeof(Filter<>).MakeGenericType(TLookup);
+                var filtertype = TResult.MakeGenericType(TLookup);
                 var method = factory.GetType().GetMethods().FirstOrDefault(m => 
-                    m.Name.Equals("DefineFilter") 
+                    m.Name.Equals(Method) 
                     && m.GetParameters().Any() 
                     && m.ReturnType == filtertype 
                     && m.GetParameters().First().ParameterType == items.GetType()
@@ -219,6 +225,30 @@ namespace InABox.Core
 
             return DoInvoke(TLookup, TResult, Method);
         }
+        private static object? DoInvoke(Type TLookup, Type TEntity, Type TResult, string Method)
+        {
+            var factory = _cache.GetFactory(TLookup, TEntity);
+            if (factory != null)
+            {
+                var method = factory.GetType().GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).FirstOrDefault(m => 
+                    m.Name.Split('.').Last().Equals(Method) // For explicit implementations, whose name is ILookupDefinition<TLookup,TEntity>.Method
+                    && !m.GetParameters().Any() 
+                    && m.ReturnType == TResult
+                );
+
+                if (method != null)
+                    try
+                    {
+                        return method.Invoke(factory, Array.Empty<object>());
+                    }
+                    catch (Exception e)
+                    {
+                        Logger.Send(LogType.Error, "", string.Format("*** Unknown Error: {0}\n{1}", e.Message, e.StackTrace));
+                    }
+            }
+
+            return null;
+        }
 
         private static Dictionary<object, object> DoInvoke(Type TLookup, PropertyInfo property, string Method)
         {
@@ -366,9 +396,36 @@ namespace InABox.Core
         {
             return DefineColumns(typeof(TLookup)) as Columns<TLookup>;
         }
-        
+
+        public static IColumns DefineFilterColumns(Type TLookup, Type TEntity, IEnumerable items)
+        {
+            var result = DoInvoke(TLookup, TEntity, typeof(Columns<>).MakeGenericType(TEntity), "DefineFilterColumns") as IColumns;
+            if (result == null)
+            {
+                var type = typeof(Columns<>).MakeGenericType(TLookup);
+                result = Activator.CreateInstance(type) as IColumns;
+                result = result.DefaultColumns();
+            }
+            return result;
+        }
+
+        public static IColumns DefineFilterColumns<TEntity>(Type TLookup)
+        {
+            var result = DoInvoke(TLookup, typeof(TEntity), typeof(Columns<>).MakeGenericType(typeof(TEntity)), "DefineFilterColumns") as IColumns;
+            if (result == null)
+            {
+                result = Columns.Create(TLookup);
+            }
+            return result;
+        }
+
+        public static Columns<TLookup> DefineFilterColumns<TEntity, TLookup>() where TEntity : Entity where TLookup : Entity
+        {
+            return DefineFilterColumns<TEntity>(typeof(TLookup)) as Columns<TLookup>;
+        }
+
         #endregion
-        
+
         #region RequiredColumns
 
         public static IColumns DefaultRequiredColumns(Type TLookup)

+ 1 - 0
InABox.Database/DbFactory.cs

@@ -22,6 +22,7 @@ namespace InABox.Database
             get => _provider ?? throw new Exception("Provider is not set");
             set => _provider = value;
         }
+        public static bool IsProviderSet => _provider is not null;
         
         public static string? ColorScheme { get; set; }
         public static byte[]? Logo { get; set; }

+ 16 - 0
InABox.DynamicGrid/DynamicDataGrid.cs

@@ -202,6 +202,22 @@ namespace InABox.DynamicGrid
             foreach (var col in cols.Items)
                 if (!result.Items.Any(x => string.Equals(x.Property, col.Property)))
                     result.Add(col.Property);
+
+            var props = DatabaseSchema.Properties(typeof(TEntity))
+                .Where(x => x.Setter() != null)
+                .OrderBy(x => CoreUtils.GetPropertySequence(typeof(TEntity), x.Name));
+            foreach(var col in result.Items)
+            {
+                var prop = DatabaseSchema.Property(typeof(TEntity), col.Property);
+                if(prop?.Editor is DataLookupEditor dataLookup)
+                {
+                    foreach(var lookupColumn in LookupFactory.DefineFilterColumns<TEntity>(dataLookup.Type).ColumnNames())
+                    {
+                        result.Add(lookupColumn);
+                    }
+                }
+            }
+
             return result;
         }
 

+ 3 - 3
InABox.Reports/ReportUtils.cs

@@ -120,10 +120,10 @@ namespace InABox.Reports
 
             foreach(var tableName in data.TableNames)
             {
+                var modelTable = data.GetDataModelTable(tableName);
                 var dataSource = report.GetDataSource(tableName);
                 if (dataSource != null)
                 {
-                    var modelTable = data.GetDataModelTable(tableName);
                     var columnNames = CoreUtils.GetColumnNames(modelTable.Type, x => true);
                     foreach (var column in dataSource.Columns)
                     {
@@ -170,7 +170,7 @@ namespace InABox.Reports
 
             foreach (var tableName in data.TableNames)
             {
-                var columns = data.GetColumns(tableName)?.AsDictionary() ?? new Dictionary<string, Type>();
+                var columns = data.GetColumns(tableName)?.AsDictionary();
                 var dataSource = report.GetDataSource(tableName);
                 if(dataSource != null)
                 {
@@ -183,7 +183,7 @@ namespace InABox.Reports
                                 col.BindableControl = ColumnBindableControl.Custom;
                                 col.CustomBindableControl = "MultiImageObject";
                             }
-                            col.Enabled = columns.ContainsKey(col.Name.Replace('_', '.'));
+                            col.Enabled = columns is null ? true : columns.ContainsKey(col.Name.Replace('_', '.'));
                         }
                     }
                 }

+ 2 - 2
inabox.server.websocket/WebSocketServer.cs

@@ -57,12 +57,12 @@ namespace InABox.Server.WebSocket
 
         protected override void OnOpen()
         {
-            Logger.Send(LogType.Error, "", $"WebSocket client connected");
+            Logger.Send(LogType.Information, "", $"WebSocket client connected");
         }
 
         protected override void OnClose(CloseEventArgs e)
         {
-            Logger.Send(LogType.Error, "", $"WebSocket client disconnected");
+            Logger.Send(LogType.Information, "", $"WebSocket client disconnected");
 
             var sessionID = NotifyState.SessionMap.Where(x => x.Value.ID == ID).FirstOrDefault().Key;
             NotifyState.SessionMap.TryRemove(sessionID, out var session);