Bläddra i källkod

Added hidden option to DigitalFormVariable; fixed synchronisation issue in DynamicManyToManyGrid and DynamicOneToMany grid when filtering rows;

Kenric Nugteren 2 år sedan
förälder
incheckning
440021eab0

+ 9 - 0
InABox.Core/DigitalForms/Forms/DigitalFormVariable.cs

@@ -87,6 +87,10 @@ namespace InABox.Core
         [EditorSequence(10)]
         public bool Retain { get; set; }
 
+        [CheckBoxEditor(Visible = Visible.Optional)]
+        [EditorSequence(11)]
+        public bool Hidden { get; set; }
+
         [NullEditor]
         public long Sequence { get; set; }
 
@@ -149,6 +153,8 @@ namespace InABox.Core
             base.Init();
             QAForm = new QAFormLink();
             Form = new DigitalFormLink();
+
+            Hidden = false;
         }
 
         public static Type? GetPropertiesType(Type fieldType)
@@ -168,6 +174,7 @@ namespace InABox.Core
             var properties = (Activator.CreateInstance(propertiesType) as DFLayoutFieldProperties)!;
             properties.LoadFromString(Parameters);
             properties.Code = Code;
+            properties.Hidden = Hidden;
             return properties;
         }
 
@@ -181,6 +188,7 @@ namespace InABox.Core
             if(properties != null)
             {
                 properties.LoadFromString(Parameters);
+                properties.Hidden = Hidden;
             }
             return properties;
         }
@@ -198,6 +206,7 @@ namespace InABox.Core
             Required = properties.Required;
             Secure = properties.Secure;
             Retain = properties.Retain;
+            Hidden = properties.Hidden;
             Parameters = properties.SaveToString();
         }
     }

+ 29 - 1
InABox.Core/DigitalForms/Layouts/DFLayout.cs

@@ -4,6 +4,7 @@ using System.Drawing;
 using System.Globalization;
 using System.Linq;
 using System.Text;
+using System.Xml.Linq;
 using Expressive;
 using InABox.Clients;
 
@@ -37,6 +38,7 @@ namespace InABox.Core
             ColumnWidths = new List<string>();
             RowHeights = new List<string>();
             Elements = new List<DFLayoutControl>();
+            HiddenElements = new List<DFLayoutControl>();
 
             Expressions = new Dictionary<string, CoreExpression>();
             ColourExpressions = new Dictionary<string, CoreExpression>();
@@ -48,6 +50,7 @@ namespace InABox.Core
         public List<string> RowHeights { get; }
 
         public List<DFLayoutControl> Elements { get; }
+        public List<DFLayoutControl> HiddenElements { get; }
 
         private enum ReferenceType
         {
@@ -60,6 +63,21 @@ namespace InABox.Core
         private Dictionary<string, List<Tuple<ReferenceType, string>>> VariableReferences;
         public IDFRenderer? Renderer;
 
+        public IEnumerable<DFLayoutControl> GetElements(bool includeHidden = false)
+        {
+            foreach (var element in Elements)
+            {
+                yield return element;
+            }
+            if (includeHidden)
+            {
+                foreach (var element in HiddenElements)
+                {
+                    yield return element;
+                }
+            }
+        }
+
         public string SaveLayout()
         {
             var sb = new StringBuilder();
@@ -89,6 +107,9 @@ namespace InABox.Core
             return _controls.GetValueOrDefault(typeName);
         }
 
+        private static bool IsHidden(DFLayoutControl element)
+            => element is DFLayoutField field && field.GetPropertyValue<bool>("Hidden");
+
         public void LoadLayout(string layout)
         {
             ColumnWidths.Clear();
@@ -119,7 +140,14 @@ namespace InABox.Core
                             element.LoadFromString(json);
                             //Serialization.DeserializeInto(json, element);
 
-                            Elements.Add(element);
+                            if(IsHidden(element))
+                            {
+                                HiddenElements.Add(element);
+                            }
+                            else
+                            {
+                                Elements.Add(element);
+                            }
                         }
                         else
                         {

+ 6 - 2
InABox.Core/DigitalForms/Layouts/Fields/DFLayoutFieldProperties.cs

@@ -31,8 +31,12 @@ namespace InABox.Core
         [EditorSequence(6)]
         public bool Retain { get; set; }
 
-        [ExpressionEditor(null)]
+        [CheckBoxEditor]
         [EditorSequence(7)]
+        public bool Hidden { get; set; }
+
+        [ExpressionEditor(null)]
+        [EditorSequence(8)]
         public string Expression { get; set; }
 
         /// <summary>
@@ -41,7 +45,7 @@ namespace InABox.Core
         /// like 'Yellow'.
         /// </summary>
         [ExpressionEditor(null, ToolTip = "Evalutes to either a hex code (#RRGGBB or #AARRGGBB) or a colour name (like 'Red' or 'Yellow'), which sets the background colour for this variable.")]
-        [EditorSequence(7)]
+        [EditorSequence(9)]
         public string ColourExpression { get; set; }
 
         public abstract object? ParseValue(object? value);

+ 1 - 1
InABox.DynamicGrid/DynamicGrid.cs

@@ -1978,7 +1978,7 @@ namespace InABox.DynamicGrid
             LoadData();
         }
 
-        private readonly Dictionary<CoreRow, CoreRow> _recordmap = new();
+        protected readonly Dictionary<CoreRow, CoreRow> _recordmap = new();
 
         public override void UpdateRow<TRow, TType>(CoreRow row, Expression<Func<TRow, TType>> column, TType value, bool refresh = true)
         {

+ 1 - 1
InABox.DynamicGrid/DynamicManyToManyGrid.cs

@@ -258,7 +258,7 @@ namespace InABox.DynamicGrid
 
         protected override TManyToMany LoadItem(CoreRow row)
         {
-            return WorkingList[row.Index];
+            return WorkingList[_recordmap[row].Index];
         }
 
         protected override void SaveItem(TManyToMany item)

+ 4 - 5
InABox.DynamicGrid/DynamicOneToManyGrid.cs

@@ -191,14 +191,14 @@ namespace InABox.DynamicGrid
 
         protected override TMany LoadItem(CoreRow row)
         {
-            return Items[row.Index];
+            return Items[_recordmap[row].Index];
         }
 
         protected override TMany[] LoadItems(CoreRow[] rows)
         {
             var result = new List<TMany>();
             foreach (var row in rows)
-                result.Add(Items[row.Index]);
+                result.Add(LoadItem(row));
             return result.ToArray();
         }
 
@@ -215,10 +215,9 @@ namespace InABox.DynamicGrid
 
         protected override void DeleteItems(params CoreRow[] rows)
         {
-            var removes = rows.Select(x => Items[x.Index]);
-            foreach(var remove in removes)
+            foreach(var row in rows)
             {
-                Items.Remove(remove);
+                Items.Remove(LoadItem(row));
             }
         }
 

+ 1 - 1
InABox.DynamicGrid/FormDesigner/Controls/DFFieldPlaceholderControl.cs

@@ -25,7 +25,7 @@ namespace InABox.DynamicGrid
                 FontWeight = FontWeights.DemiBold
             };
             var code = Control.Name; // GetPropertyValue<String>("Code");
-            var variable = FormDesignGrid.Variables.FirstOrDefault(x => string.Equals(x.Code, code));
+            var variable = FormDesignGrid.Variables.FirstOrDefault(x => string.Equals(x.Code, code) && !x.Hidden);
             result.Background = variable != null ? new SolidColorBrush(Colors.White) : new SolidColorBrush(Colors.Red);
             result.BorderBrush = BorderBrush;
             result.BorderThickness = new Thickness(0.75);

+ 2 - 2
InABox.DynamicGrid/FormDesigner/DynamicFormDesignGrid.cs

@@ -696,7 +696,7 @@ namespace InABox.DynamicGrid
                 result.Items.Add(CreateMenuItem("Add Image", new Point(column, row), CreateImageClick));
 
                 var fields = CreateMenuItem("Add Field", new Point(column, row), null);
-                var filtered = _variables.Where(x => !form.Elements.Any(v => string.Equals((v as DFLayoutField)?.Name, x.Code)));
+                var filtered = _variables.Where(x => !x.Hidden && !form.Elements.Any(v => string.Equals((v as DFLayoutField)?.Name, x.Code)));
                 foreach (var variable in filtered)
                     fields.Items.Add(CreateMenuItem(variable.Code, new Tuple<DigitalFormVariable, int, int>(variable, column, row),
                         AddVariableClick));
@@ -1086,7 +1086,7 @@ namespace InABox.DynamicGrid
             }
 
             var filledcells = new List<Point>();
-            foreach (var item in form.Elements)
+            foreach (var item in form.GetElements(IsDesigning))
             {
                 try
                 {

+ 81 - 0
InABox.DynamicGrid/FormDesigner/DynamicVariableGrid.cs

@@ -1,6 +1,7 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Windows;
 using System.Windows.Controls;
 using InABox.Core;
 using NPOI.Util.Collections;
@@ -9,9 +10,68 @@ namespace InABox.DynamicGrid
 {
     internal class DynamicVariableGrid : DynamicOneToManyGrid<DigitalForm, DigitalFormVariable>
     {
+        private bool ShowHidden = false;
+        private Button ShowHiddenButton;
+        private Button HideButton;
+
         public DynamicVariableGrid()
         {
             Options.Add(DynamicGridOption.MultiSelect);
+
+            ShowHiddenButton = AddButton("Show Hidden", null, ToggleHidden_Click);
+            HideButton = AddButton("Hide Variable", null, Hide_Click);
+            HideButton.IsEnabled = false;
+
+            HiddenColumns.Add(x => x.Hidden);
+        }
+
+        private bool ShouldHide(CoreRow[] rows)
+        {
+            return rows.Any(x => !x.Get<DigitalFormVariable, bool>(x => x.Hidden));
+        }
+
+        private bool Hide_Click(Button btn, CoreRow[] rows)
+        {
+            if(rows.Length == 0)
+            {
+                MessageBox.Show("No rows selected");
+                return false;
+            }
+
+            var hide = ShouldHide(rows);
+            var items = LoadItems(rows);
+            foreach (var item in items)
+            {
+                item.Hidden = hide;
+            }
+            if(items.Length > 0)
+            {
+                SaveItems(items);
+                return true;
+            }
+            return false;
+        }
+
+        protected override void SelectItems(CoreRow[]? rows)
+        {
+            base.SelectItems(rows);
+
+            if(rows is null)
+            {
+                HideButton.IsEnabled = false;
+            }
+            else
+            {
+                HideButton.IsEnabled = true;
+                HideButton.Content = (ShouldHide(rows) ? "Hide Variable" : "Un-hide Variable") + (rows.Length > 1 ? "s" : "");
+            }
+        }
+
+        private bool ToggleHidden_Click(Button btn, CoreRow[] rows)
+        {
+            ShowHidden = !ShowHidden;
+            ShowHiddenButton.Content = ShowHidden ? "Hide Hidden" : "Show Hidden";
+            return true;
         }
 
         public bool EditProperties(Type type, DFLayoutFieldProperties item)
@@ -163,5 +223,26 @@ namespace InABox.DynamicGrid
                 Refresh(false, true);
             }
         }
+
+        protected override void DoDelete()
+        {
+            var rows = SelectedRows.ToArray();
+
+            if (rows.Any())
+                if (CanDeleteItems(rows))
+                    if (MessageBox.Show("Are you sure you want to delete this variable? This will all cause data associated with this variable to be lost.\n(If you want to just hide the variable, set it to 'Hidden' instead.)", "Confirm Deletion", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
+                    {
+                        DeleteItems(rows);
+                        SelectedRows = Array.Empty<CoreRow>();
+                        OnChanged?.Invoke(this);
+                        Refresh(false, true);
+                        SelectItems(null);
+                    }
+        }
+
+        protected override bool FilterRecord(CoreRow row)
+        {
+            return ShowHidden || !row.Get<DigitalFormVariable, bool>(x => x.Hidden);
+        }
     }
 }