Browse Source

- Fixed "Add" button not working on CustomDashboardGrid due to deserialisation error.
- Added code to only select visible columns in column selector

Kenric Nugteren 5 months ago
parent
commit
36638f2c50

+ 2 - 1
inabox.wpf/Dashboard/DynamicDashboard.cs

@@ -95,8 +95,9 @@ public static class DynamicDashboardUtils
         return JsonConvert.SerializeObject(data, typeof(DynamicDashboard), SerializationSettings());
     }
 
-    public static DynamicDashboard Deserialize(string json)
+    public static DynamicDashboard? Deserialize(string? json)
     {
+        if (json.IsNullOrWhiteSpace()) return null;
         return JsonConvert.DeserializeObject<DynamicDashboard>(json, SerializationSettings())!;
     }
 }

+ 56 - 15
inabox.wpf/DynamicGrid/DynamicGridColumn/DynamicGridColumnNameSelectorWindow.cs

@@ -33,16 +33,31 @@ public class DynamicGridColumnNameSelectorGrid : DynamicItemsListGrid<DynamicGri
         }
     }
 
+    private bool _onlyVisible;
+    public bool OnlyVisible
+    {
+        get => _onlyVisible;
+        set
+        {
+            _onlyVisible = value;
+            Refresh(false, true);
+            DoPropertyChanged();
+        }
+    }
+
     private List<DynamicGridColumnNameSelectorItem> _items;
 
     public string SearchText { get; set; }
 
     public DynamicGridColumnNameSelectorGrid(Type type, IEnumerable<string> columnNames)
     {
+        var itemMap = new Dictionary<string, DynamicGridColumnNameSelectorItem>();
         var items = new List<DynamicGridColumnNameSelectorItem>();
-        var parentCols = new HashSet<string>();
+        var parentCols = new Dictionary<string, List<DynamicGridColumnNameSelectorItem>>();
         foreach (var column in columnNames)
         {
+            var item = new DynamicGridColumnNameSelectorItem();
+
             var props = column.Split('.');
             string? parent = null;
             for (int i = 0; i < props.Length - 1; ++i)
@@ -55,28 +70,30 @@ public class DynamicGridColumnNameSelectorGrid : DynamicItemsListGrid<DynamicGri
                 {
                     parent = $"{parent}.{props[i]}";
                 }
-                parentCols.Add(parent);
+                parentCols.GetValueOrAdd(parent).Add(item);
             }
 
-            var item = new DynamicGridColumnNameSelectorItem
-            {
-                ColumnName = column,
-                ParentColumn = parent,
-                Display = props[^1],
-                IsParent = false,
-                Comment = DatabaseSchema.Property(type, column)?.Comment ?? ""
-            };
+            var prop = DatabaseSchema.Property(type, column);
+            item.ColumnName = column;
+            item.ParentColumn = parent;
+            item.Display = props[^1];
+            item.IsParent = false;
+            item.Comment = prop?.Comment ?? "";
+            item.IsVisible = (prop?.Editor.Visible ?? Visible.Optional) != Visible.Hidden;
             items.Add(item);
         }
 
-        foreach (var col in parentCols)
+        foreach (var (col, children) in parentCols)
         {
+            var prop = DatabaseSchema.Property(type, col);
+
             var lastColIdx = col.LastIndexOf('.');
             var item = new DynamicGridColumnNameSelectorItem
             {
                 ColumnName = col,
                 IsParent = true,
-                Comment = DatabaseSchema.Property(type, col)?.Comment ?? ""
+                Comment = prop?.Comment ?? "",
+                IsVisible = children.Any(x => x.IsVisible)
             };
             if (lastColIdx == -1)
             {
@@ -198,7 +215,7 @@ public class DynamicGridColumnNameSelectorGrid : DynamicItemsListGrid<DynamicGri
     {
         if (SearchText.IsNullOrWhiteSpace())
         {
-            Items = _items;
+            Items = _items.ToList();
         }
         else
         {
@@ -219,14 +236,19 @@ public class DynamicGridColumnNameSelectorGrid : DynamicItemsListGrid<DynamicGri
                 }
             }
         }
+        if (OnlyVisible)
+        {
+            Items.RemoveAll(x => !x.IsVisible);
+        }
 
         base.Reload(criteria, columns, ref sort, token, action);
     }
 
-    public static bool SelectColumnName(Type type, IEnumerable<string> columnNames, out string value)
+    public static bool SelectColumnName(Type type, IEnumerable<string> columnNames, out string value, bool showVisibilityButton = false)
     {
         var grid = new DynamicGridColumnNameSelectorGrid(type, columnNames)
         {
+            OnlyVisible = showVisibilityButton
         };
         grid.Refresh(true, true);
 
@@ -249,16 +271,33 @@ public class DynamicGridColumnNameSelectorGrid : DynamicItemsListGrid<DynamicGri
             grid.Refresh(false, true);
         };
 
+        var onlyVisible = new CheckBox()
+        {
+            Content = "Only Visible?",
+            VerticalAlignment = VerticalAlignment.Center,
+            Margin = new(5, 0, 0, 5)
+        };
+        onlyVisible.Bind(CheckBox.IsCheckedProperty, grid, x => x.OnlyVisible);
+
         var control = new Grid();
         control.AddColumn(GridUnitType.Auto);
         control.AddColumn(GridUnitType.Star);
+        if (showVisibilityButton)
+        {
+            control.AddColumn(GridUnitType.Auto);
+        }
+        else
+        {
+            control.AddColumn(0);
+        }
 
         control.AddRow(GridUnitType.Auto);
         control.AddRow(GridUnitType.Star);
 
         control.AddChild(lbl, 0, 0);
         control.AddChild(search, 0, 1);
-        control.AddChild(grid, 1, 0, colSpan: 2);
+        control.AddChild(onlyVisible, 0, 2);
+        control.AddChild(grid, 1, 0, colSpan: 3);
 
         var window = new DynamicContentDialog(control)
         {
@@ -304,5 +343,7 @@ public class DynamicGridColumnNameSelectorItem : BaseObject
 
     public string Comment { get; set; } = "";
 
+    public bool IsVisible { get; set; }
+
     public bool IsParent { get; set; }
 }

+ 1 - 1
inabox.wpf/DynamicGrid/Editors/ColumnsEditor/ColumnsEditorGrid.cs

@@ -100,7 +100,7 @@ internal class ColumnsEditorGrid : DynamicItemsListGrid<ColumnsEditorItem>
 
     protected override void DoAdd(bool openEditorOnDirectEdit = false)
     {
-        if(DynamicGridColumnNameSelectorGrid.SelectColumnName(Type, ColumnNames, out var column))
+        if(DynamicGridColumnNameSelectorGrid.SelectColumnName(Type, ColumnNames, out var column, showVisibilityButton: true))
         {
             CreateItems(() => [
                 new ColumnsEditorItem { ColumnName = column }

+ 86 - 87
inabox.wpf/DynamicGrid/Editors/DynamicEditorControl.cs

@@ -5,118 +5,117 @@ using System.ComponentModel;
 using System.Windows;
 using System.Windows.Media;
 
-namespace InABox.DynamicGrid
-{
+namespace InABox.DynamicGrid;
 
-    public abstract class DynamicEditorControl<T, TEditor> : BaseDynamicEditorControl<TEditor>, IDynamicEditorControl<T>
-        where TEditor : IBaseEditor
-    {
-        //{
-        //    get { return (EditorControlValueChangedHandler)GetValue(OnEditorValueChangedProperty); }
-        //    set { SetValue(OnEditorValueChangedProperty, value) }
-        //}
 
-        protected bool Updating;
+public abstract class DynamicEditorControl<T, TEditor> : BaseDynamicEditorControl<TEditor>, IDynamicEditorControl<T>
+    where TEditor : IBaseEditor
+{
+    //{
+    //    get { return (EditorControlValueChangedHandler)GetValue(OnEditorValueChangedProperty); }
+    //    set { SetValue(OnEditorValueChangedProperty, value) }
+    //}
+
+    protected bool Updating;
 
-        public DynamicEditorControl()
-        {
-            Loaded = false;
-            OtherValues = new();
-            MinHeight = 25;
-            Focusable = false;
-        }
+    public DynamicEditorControl()
+    {
+        Loaded = false;
+        OtherValues = new();
+        MinHeight = 25;
+        Focusable = false;
+    }
 
-        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
-        public override bool Changed { get; set; }
+    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+    public override bool Changed { get; set; }
 
-        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
-        public T Value
-        {
-            get => RetrieveValue();
-            set => UpdateValue(value);
-        }
+    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+    public T Value
+    {
+        get => RetrieveValue();
+        set => UpdateValue(value);
+    }
 
-        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
-        protected virtual Dictionary<string, object?> OtherValues { get; }
+    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+    protected virtual Dictionary<string, object?> OtherValues { get; }
 
-        //public static readonly DependencyProperty OnEditorValueChangedProperty =
-        //    DependencyProperty.Register(nameof(OnEditorValueChanged), typeof(EditorControlValueChangedHandler), typeof(DynamicEditorControl<T>));
+    //public static readonly DependencyProperty OnEditorValueChangedProperty =
+    //    DependencyProperty.Register(nameof(OnEditorValueChanged), typeof(EditorControlValueChangedHandler), typeof(DynamicEditorControl<T>));
 
-        public override event EditorControlValueChangedHandler? OnEditorValueChanged;
+    public override event EditorControlValueChangedHandler? OnEditorValueChanged;
 
-        protected void EditorValueChanged(IDynamicEditorControl sender, Dictionary<string, object?> values) => OnEditorValueChanged?.Invoke(sender, values);
+    protected void EditorValueChanged(IDynamicEditorControl sender, Dictionary<string, object?> values) => OnEditorValueChanged?.Invoke(sender, values);
 
-        protected virtual bool CheckChanged()
+    protected virtual bool CheckChanged()
+    {
+        //Logger.Send(LogType.Information, "", string.Format("{0}({1}).CheckChanged()", GetType().EntityName().Split('.').Last(), ColumnName));
+        if (Loaded && !Updating)
         {
-            //Logger.Send(LogType.Information, "", string.Format("{0}({1}).CheckChanged()", GetType().EntityName().Split('.').Last(), ColumnName));
-            if (Loaded && !Updating)
+            Updating = true;
+            try
             {
-                Updating = true;
-                try
-                {
-                    var values = new Dictionary<string, object?>();
-
-                    var sColumn = string.IsNullOrEmpty(ColumnName) ? "" : ColumnName;
+                var values = new Dictionary<string, object?>();
 
-                    var dotIdx = sColumn.LastIndexOf('.');
-                    var prefix = "";
-                    if (dotIdx != -1)
-                    {
-                        prefix = sColumn[..dotIdx];
-                    }
+                var sColumn = string.IsNullOrEmpty(ColumnName) ? "" : ColumnName;
 
-                    values[sColumn] = RetrieveValue();
-                    foreach (var key in OtherValues.Keys)
-                        values[$"{prefix}.{key}"] = OtherValues[key];
-                    OnEditorValueChanged?.Invoke(this, values);
-                }
-                finally
+                var dotIdx = sColumn.LastIndexOf('.');
+                var prefix = "";
+                if (dotIdx != -1)
                 {
-                    Changed = true;
-                    Updating = false;
+                    prefix = sColumn[..dotIdx];
                 }
-                UpdateInformation();
-            }
 
-            return Changed;
+                values[sColumn] = RetrieveValue();
+                foreach (var key in OtherValues.Keys)
+                    values[$"{prefix}.{key}"] = OtherValues[key];
+                OnEditorValueChanged?.Invoke(this, values);
+            }
+            finally
+            {
+                Changed = true;
+                Updating = false;
+            }
+            UpdateInformation();
         }
 
-        public override void SetValue(string property, object? value)
-        {
-            UpdateValue(value != null ? (T)value : default);
-            base.SetValue(property,value);
-        }
+        return Changed;
+    }
 
-        public override object? GetValue(string property)
-        {
-            return RetrieveValue();
-        }
+    public override void SetValue(string property, object? value)
+    {
+        UpdateValue(value != null ? (T)value : default);
+        base.SetValue(property,value);
+    }
 
-        public override Dictionary<string, object?> GetValues()
+    public override object? GetValue(string property)
+    {
+        return RetrieveValue();
+    }
+
+    public override Dictionary<string, object?> GetValues()
+    {
+        return new Dictionary<string, object?>
         {
-            return new Dictionary<string, object?>
-            {
-                { ColumnName, RetrieveValue() }
-            };
-        }
+            { ColumnName, RetrieveValue() }
+        };
+    }
 
-        protected abstract T RetrieveValue();
-        protected abstract void UpdateValue(T value);
+    protected abstract T RetrieveValue();
+    protected abstract void UpdateValue(T value);
 
-        public override bool ShouldSerializeContent()
-        {
-            return false;
-        }
+    public override bool ShouldSerializeContent()
+    {
+        return false;
+    }
 
-        public override void SetEnabled(bool enabled)
-        {
-            if (Content is FrameworkElement element) element.IsEnabled = enabled;
-            SetColor(enabled ? Color : Colors.WhiteSmoke);
-        }
+    public override void SetEnabled(bool enabled)
+    {
+        if (Content is FrameworkElement element) element.IsEnabled = enabled;
+        SetColor(enabled ? Color : Colors.WhiteSmoke);
+    }
 
-        public override void SetVisible(bool visible)
-        {
-            Visibility = visible ? Visibility.Visible : Visibility.Collapsed;
-        }
+    public override void SetVisible(bool visible)
+    {
+        Visibility = visible ? Visibility.Visible : Visibility.Collapsed;
     }
 }