Quellcode durchsuchen

Improvements to DynamicActionColumn filtering

Kenric Nugteren vor 11 Monaten
Ursprung
Commit
c6f3b68b12

+ 1 - 0
inabox.wpf/DynamicGrid/Columns/DynamicActionColumn.cs

@@ -23,6 +23,7 @@ namespace InABox.DynamicGrid
 
         public Func<GridSummaryColumn?>? GetSummary = null;
         
+        public string[]? ExcludeFilters { get; set; }
         public string[]? SelectedFilters { get; set; }
         public string[]? Filters { get; set; } = null;
         public Func<CoreRow, string[], bool>? FilterRecord { get; set; } = null;

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

@@ -986,8 +986,9 @@ public abstract class DynamicGrid<T> : DynamicGrid, IDynamicGridUIComponentParen
     {
         var bOK = ActionColumns.All(x =>
         {
-            return x.FilterRecord is null || x.SelectedFilters is null || x.SelectedFilters.Length == 0
-                || x.FilterRecord.Invoke(row, x.SelectedFilters);
+            return x.FilterRecord is null
+                || ((x.SelectedFilters is null || x.SelectedFilters.Length == 0 || x.FilterRecord.Invoke(row, x.SelectedFilters))
+                    && (x.ExcludeFilters is null || x.ExcludeFilters.Length == 0 || !x.FilterRecord.Invoke(row, x.ExcludeFilters)));
         });
         if (bOK && OnFilterRecord is not null)
             bOK = OnFilterRecord(row);

+ 39 - 11
inabox.wpf/DynamicGrid/UIComponent/DynamicGridGridUIComponent.cs

@@ -559,16 +559,34 @@ public class DynamicGridGridUIComponent<T> : IDynamicGridUIComponent<T>, IDynami
             if (e.FilterPredicates != null)
             {
                 var filter = e.FilterPredicates.Select(x => x.FilterValue.ToString()!).ToArray();
-                bool include = e.FilterPredicates.Any(x => x.FilterType == FilterType.Equals);
-                column.SelectedFilters = include ? filter : (column.Filters ?? Enumerable.Empty<string>()).Except(filter).ToArray();
+                var include = e.FilterPredicates.Any(x => x.FilterType == FilterType.Equals);
+                if (include)
+                {
+                    column.SelectedFilters = filter;
+                    column.ExcludeFilters = null;
+                }
+                else if(column.Filters is not null)
+                {
+                    column.SelectedFilters = column.Filters.Except(filter).ToArray();
+                    column.ExcludeFilters = null;
+                }
+                else
+                {
+                    column.SelectedFilters = null;
+                    column.ExcludeFilters = filter;
+                }
             }
             else
-                column.SelectedFilters = Array.Empty<string>();
-            DataGrid.ClearFilter(e.Column);
+            {
+                column.SelectedFilters = null;
+                column.ExcludeFilters = null;
+            }
+            //DataGrid.ClearFilter(e.Column);
+
             //e.FilterPredicates?.Clear();
             //e.FilterPredicates?.Add(new FilterPredicate() { PredicateType = PredicateType.Or, FilterBehavior = Syncfusion.Data.FilterBehavior.StringTyped, FilterMode = ColumnFilter.DisplayText, FilterType = Syncfusion.Data.FilterType.NotEquals, FilterValue = "" });
             //e.FilterPredicates?.Add(new FilterPredicate() { PredicateType = PredicateType.Or, FilterBehavior = Syncfusion.Data.FilterBehavior.StringTyped, FilterMode = ColumnFilter.DisplayText, FilterType = Syncfusion.Data.FilterType.Equals, FilterValue = "" });
-            Parent.Refresh(false, false);
+            //Parent.Refresh(false, false);
             e.Handled = true;
         }
 
@@ -610,17 +628,20 @@ public class DynamicGridGridUIComponent<T> : IDynamicGridUIComponent<T>, IDynami
                     };
                     if(column is DynamicActionColumn dac)
                     {
-                        element.IsSelected = dac.SelectedFilters is null || dac.SelectedFilters.Contains(x);
+                        element.IsSelected = (dac.SelectedFilters is null || dac.SelectedFilters.Contains(x))
+                            && (dac.ExcludeFilters is null || !dac.ExcludeFilters.Contains(x));
                     }
                     return element;
                 });
             }
             else if (column is DynamicActionColumn dac && dac.Filters is not null)
             {
-                e.ItemsSource = dac.Filters.Select(x => new FilterElement {
+                e.ItemsSource = dac.Filters.Select(x => new FilterElement
+                {
                     DisplayText = x,
                     ActualValue = x,
-                    IsSelected = dac.SelectedFilters is null || dac.SelectedFilters.Contains(x)
+                    IsSelected = (dac.SelectedFilters is null || dac.SelectedFilters.Contains(x))
+                        && (dac.ExcludeFilters is null || !dac.ExcludeFilters.Contains(x))
                 });
             }
         }
@@ -668,9 +689,16 @@ public class DynamicGridGridUIComponent<T> : IDynamicGridUIComponent<T>, IDynami
                     list.Add(new(gridColumn.ColumnName, rowPredicate));
                 }
             }
-            else if(col is DynamicActionColumn dac && dac.FilterRecord is not null && dac.SelectedFilters is not null && dac.SelectedFilters.Length > 0)
+            else if(col is DynamicActionColumn dac && dac.FilterRecord is not null)
             {
-                list.Add(new(column.MappingName, (row) => dac.FilterRecord(row, dac.SelectedFilters)));
+                if(dac.SelectedFilters is not null && dac.SelectedFilters.Length > 0)
+                {
+                    list.Add(new(column.MappingName, (row) => dac.FilterRecord(row, dac.SelectedFilters)));
+                }
+                if(dac.ExcludeFilters is not null && dac.ExcludeFilters.Length > 0)
+                {
+                    list.Add(new(column.MappingName, (row) => !dac.FilterRecord(row, dac.ExcludeFilters)));
+                }
             }
         }
         return list;
@@ -923,7 +951,7 @@ public class DynamicGridGridUIComponent<T> : IDynamicGridUIComponent<T>, IDynami
                     newcol.Width = column.Width;
                     newcol.ColumnSizer = GridLengthUnitType.None;
                     newcol.HeaderText = column.HeaderText;
-                    newcol.AllowFiltering = column.Filters != null && column.Filters.Length != 0;
+                    newcol.AllowFiltering = (column.Filters != null && column.Filters.Length != 0) || column.FilterRecord is not null;
                     newcol.AllowSorting = false;
                     newcol.FilterRowOptionsVisibility = Visibility.Collapsed;
                     newcol.ShowHeaderToolTip = column.ToolTip != null;

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

@@ -402,7 +402,8 @@ public class DynamicGridTreeUIComponent<T> : IDynamicGridUIComponent<T>, IDynami
                 e.ItemsSource = dac.Filters.Select(x => new FilterElement
                 {
                     DisplayText = x, ActualValue = x,
-                    IsSelected = dac.SelectedFilters is null || dac.SelectedFilters.Contains(x)
+                    IsSelected = (dac.SelectedFilters is null || dac.SelectedFilters.Contains(x))
+                        && (dac.ExcludeFilters is null || dac.ExcludeFilters.Contains(x))
                 });
             }
             else if (column is DynamicGridColumn dgc)
@@ -424,8 +425,22 @@ public class DynamicGridTreeUIComponent<T> : IDynamicGridUIComponent<T>, IDynami
             if (e.FilterPredicates != null)
             {
                 var filter = e.FilterPredicates.Select(x => x.FilterValue.ToString()!).ToArray();
-                bool include = e.FilterPredicates.Any(x => x.FilterType == FilterType.Equals);
-                column.SelectedFilters = include ? filter : (column.Filters ?? Enumerable.Empty<string>()).Except(filter).ToArray();
+                var include = e.FilterPredicates.Any(x => x.FilterType == FilterType.Equals);
+                if (include)
+                {
+                    column.SelectedFilters = filter;
+                    column.ExcludeFilters = null;
+                }
+                else if(column.Filters is not null)
+                {
+                    column.SelectedFilters = column.Filters.Except(filter).ToArray();
+                    column.ExcludeFilters = null;
+                }
+                else
+                {
+                    column.SelectedFilters = null;
+                    column.ExcludeFilters = filter;
+                }
             }
             else
                 column.SelectedFilters = Array.Empty<string>();
@@ -1123,9 +1138,16 @@ public class DynamicGridTreeUIComponent<T> : IDynamicGridUIComponent<T>, IDynami
                     list.Add(new(gridColumn.ColumnName, rowPredicate));
                 }
             }
-            else if(col is DynamicActionColumn dac && dac.FilterRecord is not null && dac.SelectedFilters is not null && dac.SelectedFilters.Length > 0)
+            else if(col is DynamicActionColumn dac && dac.FilterRecord is not null)
             {
-                list.Add(new(column.MappingName, (row) => dac.FilterRecord(row, dac.SelectedFilters)));
+                if(dac.SelectedFilters is not null && dac.SelectedFilters.Length > 0)
+                {
+                    list.Add(new(column.MappingName, (row) => dac.FilterRecord(row, dac.SelectedFilters)));
+                }
+                if(dac.ExcludeFilters is not null && dac.ExcludeFilters.Length > 0)
+                {
+                    list.Add(new(column.MappingName, (row) => !dac.FilterRecord(row, dac.ExcludeFilters)));
+                }
             }
         }
         return list;