Kaynağa Gözat

Fixed some less-than-ideal things with digital form editing

Kenric Nugteren 4 gün önce
ebeveyn
işleme
722d60943b

+ 9 - 0
InABox.Core/DigitalForms/Layouts/Fields/DFLayoutFieldProperties.cs

@@ -124,6 +124,15 @@ namespace InABox.Core
                 }
             }
         }
+
+        protected override void DoPropertyChanged(string name, object? before, object? after)
+        {
+            base.DoPropertyChanged(name, before, after);
+            if(name == nameof(Property) && ReadOnlyProperty && Property.IsNullOrWhiteSpace())
+            {
+                ReadOnlyProperty = false;
+            }
+        }
     }
     public abstract class DFLayoutFieldProperties<TValue, TSerialized> : DFLayoutFieldProperties
     {

+ 41 - 1
inabox.wpf/DigitalForms/DynamicVariableGrid.cs

@@ -8,6 +8,7 @@ using System.Windows.Controls;
 using InABox.Core;
 using InABox.Wpf;
 using InABox.WPF;
+using MathNet.Numerics;
 using NPOI.OpenXmlFormats;
 using NPOI.SS.Formula.Functions;
 using NPOI.Util.Collections;
@@ -301,6 +302,7 @@ namespace InABox.DynamicGrid
                             multi.Configure();
                         }
                     }
+                    OnEditorValueChanged(sender, name, value);
                     return new();
                 };
             }
@@ -309,9 +311,12 @@ namespace InABox.DynamicGrid
                 editor.OnFormCustomiseEditor += (sender, items, column, editor) => Editor_OnFormCustomiseEditor(sender, variables, column, editor);
                 editor.OnEditorValueChanged += (sender, name, value) =>
                 {
-                    return DynamicGridUtils.UpdateEditorValue(new[] { item }, name, value);
+                    var result = DynamicGridUtils.UpdateEditorValue(new[] { item }, name, value);
+                    OnEditorValueChanged(sender, name, value);
+                    return result;
                 };
             }
+            editor.OnCreateEditorControl += Editor_OnCreateEditorControl;
 
             editor.OnDefineLookups += o =>
             {
@@ -341,6 +346,7 @@ namespace InABox.DynamicGrid
                 var errors = new List<string>();
                 foreach(var item in items.Cast<DFLayoutFieldProperties>())
                 {
+                    // Check Codes
                     if (string.IsNullOrWhiteSpace(item.Code))
                     {
                         errors.Add("[Code] may not be blank!");
@@ -360,6 +366,12 @@ namespace InABox.DynamicGrid
                             }
                         }
                     }
+
+                    // Check Read-Only property
+                    if(item.ReadOnlyProperty && item.Property.IsNullOrWhiteSpace() && item.Expression.IsNullOrWhiteSpace())
+                    {
+                        errors.Add("A field cannot be read-only if [Property] or [Expression] have not been set.");
+                    }
                 }
                 return errors;
             };
@@ -367,8 +379,21 @@ namespace InABox.DynamicGrid
             return editor.ShowDialog() == true;
         }
 
+        private static void Editor_OnCreateEditorControl(string column, BaseEditor editor, IDynamicEditorControl control)
+        {
+            var properties = (control.Host.GetItems()[0] as DFLayoutFieldProperties)!;
+            if(column == nameof(DFLayoutFieldProperties.ReadOnlyProperty))
+            {
+                if (properties.Property.IsNullOrWhiteSpace())
+                {
+                    control.IsEnabled = false;
+                }
+            }
+        }
+
         private static void Editor_OnFormCustomiseEditor(IDynamicEditorForm sender, IList<DigitalFormVariable> vars, DynamicGridColumn column, BaseEditor editor)
         {
+            var properties = (sender.Items[0] as DFLayoutFieldProperties)!;
             if ((column.ColumnName == "Expression" || column.ColumnName == "ColourExpression") && editor is ExpressionEditor exp)
             {
                 var variables = new List<string>();
@@ -380,6 +405,7 @@ namespace InABox.DynamicGrid
                         variables.Add(col.ColumnName);
                     }
                 }
+                variables.Remove(properties.Code);
                 variables.Sort();
                 exp.VariableNames = variables;
             }
@@ -397,5 +423,19 @@ namespace InABox.DynamicGrid
             Editor_OnFormCustomiseEditor(sender, vars, column, editor);
         }
 
+        private static void OnEditorValueChanged(IDynamicEditorForm sender, string name, object value)
+        {
+            if(name == nameof(DFLayoutFieldProperties.Property))
+            {
+                var properties = (sender.Items[0] as DFLayoutFieldProperties)!;
+                var grid = (sender as EmbeddedDynamicEditorForm)?.Editor!;
+                var edit = grid.FindEditor(nameof(DFLayoutFieldProperties.ReadOnlyProperty));
+                if (edit is not null)
+                {
+                    edit.IsEnabled = !properties.Property.IsNullOrWhiteSpace() && !grid.ReadOnly && edit.EditorDefinition.Editable.IsEditable();
+                }
+            }
+        }
+
     }
 }