Procházet zdrojové kódy

Added Simplified Expression construction
Implemented EntityForm.ExpressionDescription into DigitalFormDataModel
Fixed Report Loading in DigitalFormGrid.CopyForm

frogsoftware před 1 rokem
rodič
revize
0a991a8e23

+ 26 - 1
InABox.Core/CoreExpression.cs

@@ -7,6 +7,7 @@ using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
+using System.Text.RegularExpressions;
 
 namespace InABox.Core
 {
@@ -19,7 +20,7 @@ namespace InABox.Core
         public string Name { get; set; }
 
         public string? Description { get; set; }
-
+        
         public List<Parameter> Parameters { get; set; }
 
         public FncType Function { get; set; }
@@ -53,6 +54,20 @@ namespace InABox.Core
     public class CoreExpression
     {
         private Expression Expression;
+        
+        public bool IsValid {
+            get
+            {
+                try
+                {
+                    return Expression.ReferencedVariables != null;
+                }
+                catch (Exception e)
+                {
+                    return false;
+                }   
+            }
+        }
 
         public IReadOnlyCollection<string> ReferencedVariables => Expression.ReferencedVariables;
 
@@ -61,6 +76,16 @@ namespace InABox.Core
         public CoreExpression(string expressionString)
         {
             Expression = new Expression(expressionString);
+            if (!IsValid)
+            {
+                var expr = "\"" + expressionString + "\"";
+                var tags = new Regex(@"\[(.*?)\]").Matches(expressionString);
+                foreach (var tag in tags)
+                    expr = expr.Replace($"{tag}", $"\"+{tag}+\"");
+                expr = expr.Replace("+\"\"", "");
+                Expression = new Expression(expr);
+            }
+            
             foreach (var function in Functions)
             {
                 Expression.RegisterFunction(function.Name, function.Function);

+ 15 - 0
InABox.Core/DigitalForms/DFUtils.cs

@@ -154,6 +154,21 @@ namespace InABox.Core
             return null;
         }
 
+        
+        public static IEnumerable<Type> GetFormEntityTypes()
+        {
+            return FormInstanceTypes.Select(x => x.Value.Item2);
+        }
+
+        public static Type? GetFormEntityType(string appliesTo)
+        {
+            if (FormInstanceTypes.TryGetValue(appliesTo, out var result))
+            {
+                return result.Item2;
+            }
+            return null;
+        }
+        
 
         private static Dictionary<Type, IEntityFormUtils> _formUtils = new Dictionary<Type, IEntityFormUtils>();
 

+ 24 - 0
InABox.Core/DigitalForms/DataModel/DigitalFormDataModel.cs

@@ -144,6 +144,7 @@ namespace InABox.Core
                             x => x.FormData, 
                             x => x.Form.ID,
                             x => x.Form.Description,
+                            x => x.Form.DescriptionExpression,
                             x => x.FormCompleted,
                             x => x.FormCompletedBy.ID,
                             x => x.Created,
@@ -200,6 +201,29 @@ namespace InABox.Core
 
         private void DoUpdate()
         {
+            if (!String.IsNullOrWhiteSpace(this.Instance.Form.DescriptionExpression))
+            {
+                Dictionary<string, object?> variables = new Dictionary<string, object?>();
+                
+                var formData = DigitalForm.DeserializeFormData(Instance);
+                foreach (var item in formData.Items())
+                    variables[$"Data.{item.Key}"] = item.Value;
+                
+                var instancedata = Entity.GetValues(true);
+                foreach (var item in instancedata)
+                    variables[$"Form.{item.Key}"] = item.Value;
+                
+                var entitydata = Entity.GetValues(true);
+                foreach (var item in entitydata)
+                    variables[$"{typeof(TEntity).EntityName().Split('.').Last()}.{item.Key}"] = item.Value;
+                
+                var expression = new CoreExpression(Instance.Form.DescriptionExpression);
+                var result = expression.Evaluate(variables)?.ToString();
+                Instance.Description = !String.IsNullOrWhiteSpace(result) 
+                    ? result 
+                    : Instance.Form.Description;
+            }
+            
             BeforeModelSaved?.Invoke(this);
 
             var entityaudittrail = "";

+ 3 - 0
InABox.Core/DigitalForms/Forms/DigitalFormLink.cs

@@ -34,6 +34,9 @@ namespace InABox.Core
         
         [NullEditor]
         public DigitalFormGroupLink Group { get; set; }
+        
+        [NullEditor]
+        public string DescriptionExpression { get; set; }
 
         // [NullEditor]
         // public int ActiveFormsCount { get; set; }

+ 2 - 0
InABox.Core/DigitalForms/Forms/IDigitalFormInstance.cs

@@ -22,6 +22,8 @@ namespace InABox.Core
         string QAData { get; set; }
         
         String Number { get; set; }
+        
+        String Description { get; set; }
 
         string FormData { get; set; }
 

+ 1 - 0
InABox.Core/DigitalForms/Layouts/Fields/DFStorage.cs

@@ -196,6 +196,7 @@ namespace InABox.Core
         {
             return FormData;
         }
+        
     }
 
     public class DFLoadStorageEntry

+ 2 - 0
inabox.wpf/DigitalForms/Designer/DynamicEditFormWindow.xaml.cs

@@ -267,11 +267,13 @@ public partial class DynamicFormEditWindow : Window, IDynamicFormWindow
         return Columns.Create<IDigitalFormInstance>(TForm)
             .Add<IDigitalFormInstance>(x => x.ID)
             .Add<IDigitalFormInstance>(x=>x.Number)
+            .Add<IDigitalFormInstance>(x=>x.Description)
             .Add<IDigitalFormInstance>(x => x.FormCompleted)
             .Add<IDigitalFormInstance>(x => x.FormData)
             .Add<IDigitalFormInstance>(x => x.BlobData)
             .Add<IDigitalFormInstance>(x => x.Form.ID)
             .Add<IDigitalFormInstance>(x => x.Form.Description)
+            .Add<IDigitalFormInstance>(x => x.Form.DescriptionExpression)
             .Add("Parent.ID");
     }
 

+ 22 - 11
inabox.wpf/DigitalForms/DigitalFormGrid.cs

@@ -170,7 +170,7 @@ namespace InABox.DynamicGrid
 
             AddButton("Groups", null, EditGroupsClick);
 
-            CopyForm = AddButton("Copy Form", InABox.Wpf.Resources.copy.AsBitmapImage(), CopyForm_Click);
+            CopyForm = AddButton("Duplicate", InABox.Wpf.Resources.copy.AsBitmapImage(), CopyForm_Click);
             CopyForm.IsEnabled = false;
             if (!Security.CanEdit<DigitalForm>())
             {
@@ -184,7 +184,7 @@ namespace InABox.DynamicGrid
         {
             base.DoReconfigure(options);
 
-            options.AddRange(DynamicGridOption.ImportData, DynamicGridOption.ExportData, DynamicGridOption.FilterRows);
+            options.AddRange(DynamicGridOption.ImportData, DynamicGridOption.ExportData, DynamicGridOption.FilterRows, DynamicGridOption.SelectColumns);
         }
 
         protected override void SelectItems(CoreRow[]? rows)
@@ -240,7 +240,16 @@ namespace InABox.DynamicGrid
                         .Add(x => x.Sequence)),
                 new KeyedQueryDef<ReportTemplate>(
                     new Filter<ReportTemplate>(x => x.Section).IsEqualTo(form.ID.ToString()),
-                    null),
+                    new Columns<ReportTemplate>(x=>x.Section)
+                        .Add(x=>x.Name)
+                        .Add(x=>x.Script)
+                        .Add(x=>x.Visible)
+                        .Add(x=>x.AllRecords)
+                        .Add(x=>x.DataModel)
+                        .Add(x=>x.PrinterName)
+                        .Add(x=>x.SelectedRecords)
+                        .Add(x=>x.RDL)
+                        .Add(x=>x.Section)),
                 new KeyedQueryDef<DigitalFormDocument>(
                     new Filter<DigitalFormDocument>(x => x.EntityLink.ID).IsEqualTo(form.ID),
                     new Columns<DigitalFormDocument>(x => x.Type)
@@ -377,18 +386,20 @@ namespace InABox.DynamicGrid
                     foreach (var variable in GetVariables(sender))
                     {
                         foreach (var col in variable.GetVariableColumns())
-                        {
-                            variables.Add($"Form_Data.{col.ColumnName}");
-                        }
+                            variables.Add($"Data.{col.ColumnName}");
                     }
 
                     var appliesTo = items?.Select(x => x.AppliesTo).Distinct().SingleOrDefault();
-                    if (!appliesTo.IsNullOrWhiteSpace() && DFUtils.GetFormInstanceType(appliesTo) is Type formType)
+                    if (!appliesTo.IsNullOrWhiteSpace() && DFUtils.GetFormInstanceType(appliesTo) is Type instanceType)
                     {
-                        foreach(var property in DatabaseSchema.Properties(formType))
-                        {
-                            variables.Add(property.Name);
-                        }
+                        foreach(var property in DatabaseSchema.Properties(instanceType).Where(x => !x.Name.StartsWith("Parent")))
+                            variables.Add($"Form.{property.Name}");
+                    }
+                    
+                    if (!appliesTo.IsNullOrWhiteSpace() && DFUtils.GetFormEntityType(appliesTo) is Type entityType)
+                    {
+                        foreach(var property in DatabaseSchema.Properties(entityType))
+                            variables.Add($"{entityType.EntityName().Split('.').Last()}.{property.Name}");
                     }
 
                     variables.Sort();

+ 3 - 1
inabox.wpf/DigitalForms/DigitalFormReportGrid.cs

@@ -77,7 +77,9 @@ namespace InABox.DynamicGrid
             Form = (DigitalForm)item;
 
             CoreTable data;
-            if (Form.ID == Guid.Empty)
+            if (PageDataHandler != null)
+                data = PageDataHandler?.Invoke(typeof(ReportTemplate));
+            else if (Form.ID == Guid.Empty)
             {
                 data = new CoreTable();
                 data.LoadColumns(typeof(ReportTemplate));