Pārlūkot izejas kodu

Fix to grid export filtering

Kenric Nugteren 1 gadu atpakaļ
vecāks
revīzija
b80b454986

+ 3 - 26
inabox.wpf/DynamicGrid/DynamicGrid.cs

@@ -2104,29 +2104,6 @@ public abstract class DynamicGrid<T> : DynamicGrid, IDynamicGridUIComponentParen
     protected virtual void ApplyExportFilter(CoreTable table, object data)
     {
     }
-    private static bool FilterByPredicate(CoreRow row, string column, FilterPredicate predicate)
-    {
-        var value = row[column];
-        var vStr = value?.ToString() ?? "";
-        var pValue = predicate.FilterValue;
-        var pStr = pValue?.ToString() ?? "";
-        return predicate.FilterType switch
-        {
-            FilterType.Contains => vStr.Contains(pStr),
-            FilterType.EndsWith => vStr.EndsWith(pStr),
-            FilterType.Equals => vStr.Equals(pStr),
-            FilterType.GreaterThan => vStr.CompareTo(pStr) > 0,
-            FilterType.GreaterThanOrEqual => vStr.CompareTo(pStr) >= 0,
-            FilterType.LessThan => vStr.CompareTo(pStr) < 0,
-            FilterType.LessThanOrEqual => vStr.CompareTo(pStr) <= 0,
-            FilterType.NotContains => !vStr.Contains(pStr),
-            FilterType.NotEndsWith => !vStr.EndsWith(pStr),
-            FilterType.NotEquals => !vStr.Equals(pStr),
-            FilterType.NotStartsWith => !vStr.StartsWith(pStr),
-            FilterType.StartsWith => vStr.StartsWith(pStr),
-            _ => true,
-        };
-    }
 
     protected virtual void DoExport()
     {
@@ -2174,11 +2151,11 @@ public abstract class DynamicGrid<T> : DynamicGrid, IDynamicGridUIComponentParen
                 foreach (var column in columns.Items)
                     newData.Columns.Add(new CoreColumn { ColumnName = column.Property, DataType = column.Type });
 
-                FilterRows(data, newData, filter: (row) =>
+                FilterRows(data, newData, filter: row =>
                 {
-                    foreach (var (column, predicate) in predicates)
+                    foreach(var (_, predicate) in predicates)
                     {
-                        if (!FilterByPredicate(row, column, predicate))
+                        if (!predicate(row))
                         {
                             return false;
                         }

+ 7 - 4
inabox.wpf/DynamicGrid/UIComponent/DynamicGridGridUIComponent.cs

@@ -1,6 +1,7 @@
 using InABox.Clients;
 using InABox.Core;
 using InABox.WPF;
+using org.omg.PortableInterceptor;
 using Syncfusion.Data;
 using Syncfusion.UI.Xaml.Grid;
 using Syncfusion.UI.Xaml.Grid.Helpers;
@@ -542,18 +543,20 @@ public class DynamicGridGridUIComponent<T> : IDynamicGridUIComponent<T>, IDynami
             col.FilteredFrom = FilteredFrom.FilterRow;
         }
     }
-    public List<Tuple<string, FilterPredicate>> GetFilterPredicates()
+
+    public List<Tuple<string, Func<CoreRow, bool>>> GetFilterPredicates()
     {
-        var list = new List<Tuple<string, FilterPredicate>>();
+        var list = new List<Tuple<string, Func<CoreRow, bool>>>();
         foreach (var column in DataGrid.Columns)
         {
             var colIndex = DataGrid.Columns.IndexOf(column);
             var col = ColumnList[colIndex];
             if (col is DynamicGridColumn gridColumn)
             {
-                foreach (var predicate in column.FilterPredicates)
+                var rowPredicate = DynamicGridGridUIComponentExtension.ConvertColumnPredicates(gridColumn, column.FilterPredicates);
+                if(rowPredicate is not null)
                 {
-                    list.Add(new(gridColumn.ColumnName, predicate));
+                    list.Add(new(gridColumn.ColumnName, rowPredicate));
                 }
             }
         }

+ 5 - 4
inabox.wpf/DynamicGrid/UIComponent/DynamicGridTreeUIComponent.cs

@@ -979,18 +979,19 @@ public class DynamicGridTreeUIComponent<T> : IDynamicGridUIComponent<T>, IDynami
             col.FilterPredicates.Add(new FilterPredicate { FilterType = filtertype, FilterValue = value });
         }
     }
-    public List<Tuple<string, FilterPredicate>> GetFilterPredicates()
+    public List<Tuple<string, Func<CoreRow, bool>>> GetFilterPredicates()
     {
-        var list = new List<Tuple<string, FilterPredicate>>();
+        var list = new List<Tuple<string, Func<CoreRow, bool>>>();
         foreach (var column in _tree.Columns)
         {
             var colIndex = _tree.Columns.IndexOf(column);
             var col = ColumnList[colIndex];
             if (col is DynamicGridColumn gridColumn)
             {
-                foreach (var predicate in column.FilterPredicates)
+                var rowPredicate = DynamicGridGridUIComponentExtension.ConvertColumnPredicates(gridColumn, column.FilterPredicates);
+                if(rowPredicate is not null)
                 {
-                    list.Add(new(gridColumn.ColumnName, predicate));
+                    list.Add(new(gridColumn.ColumnName, rowPredicate));
                 }
             }
         }

+ 52 - 0
inabox.wpf/DynamicGrid/UIComponent/IDynamicGridGridUIComponent.cs

@@ -1,6 +1,8 @@
 using InABox.Clients;
 using InABox.Core;
 using sun.tools.tree;
+using Syncfusion.Data;
+using Syncfusion.UI.Xaml.Grid;
 using System;
 using System.Collections.Generic;
 using System.Diagnostics.CodeAnalysis;
@@ -166,4 +168,54 @@ internal static class DynamicGridGridUIComponentExtension
             return false;
         }
     }
+
+    private static bool FilterByPredicate(CoreRow row, string column, FilterPredicate predicate)
+    {
+        var value = row[column];
+        var vStr = value?.ToString() ?? "";
+        var pValue = predicate.FilterValue;
+        var pStr = pValue?.ToString() ?? "";
+        return predicate.FilterType switch
+        {
+            FilterType.Contains => vStr.Contains(pStr),
+            FilterType.EndsWith => vStr.EndsWith(pStr),
+            FilterType.Equals => vStr.Equals(pStr),
+            FilterType.GreaterThan => vStr.CompareTo(pStr) > 0,
+            FilterType.GreaterThanOrEqual => vStr.CompareTo(pStr) >= 0,
+            FilterType.LessThan => vStr.CompareTo(pStr) < 0,
+            FilterType.LessThanOrEqual => vStr.CompareTo(pStr) <= 0,
+            FilterType.NotContains => !vStr.Contains(pStr),
+            FilterType.NotEndsWith => !vStr.EndsWith(pStr),
+            FilterType.NotEquals => !vStr.Equals(pStr),
+            FilterType.NotStartsWith => !vStr.StartsWith(pStr),
+            FilterType.StartsWith => vStr.StartsWith(pStr),
+            _ => true,
+        };
+    }
+
+    public static Func<CoreRow, bool>? ConvertColumnPredicates(DynamicGridColumn gridColumn, IEnumerable<FilterPredicate> predicates)
+    {
+        Func<CoreRow, bool>? rowPredicate = null;
+        foreach (var predicate in predicates)
+        {
+            var p = (CoreRow row) => FilterByPredicate(row, gridColumn.ColumnName, predicate);
+            if(rowPredicate is null)
+            {
+                rowPredicate = p;
+            }
+            else
+            {
+                var prevP = rowPredicate;
+                if(predicate.PredicateType == PredicateType.And)
+                {
+                    rowPredicate = r => prevP(r) && p(r);
+                }
+                else
+                {
+                    rowPredicate = r => prevP(r) || p(r);
+                }
+            }
+        }
+        return rowPredicate;
+    }
 }

+ 1 - 1
inabox.wpf/DynamicGrid/UIComponent/IDynamicGridUIComponent.cs

@@ -67,7 +67,7 @@ public interface IDynamicGridUIComponent<T>
     void UpdateCell(CoreRow row, string column, object? value);
 
     void AddVisualFilter(string column, string value, FilterType filtertype = FilterType.Contains);
-    List<Tuple<string, FilterPredicate>> GetFilterPredicates();
+    List<Tuple<string, Func<CoreRow, bool>>> GetFilterPredicates();
 
     void BeforeRefresh();
     void RefreshColumns(DynamicGridColumns columns, DynamicActionColumns actionColumns);