Преглед на файлове

Merge commit 'c6f3b68b12cdfb9c3d451562b517db0c4104baee' into frank

frogsoftware преди 1 година
родител
ревизия
64d533c303

+ 0 - 10
InABox.Core/Client/Client.cs

@@ -360,16 +360,6 @@ namespace InABox.Clients
                 throw new NotSupportedException(string.Format("{0} is not supported in this context", typeof(TEntity).EntityName()));
         }
 
-        private string FilterToString(Filter<TEntity> filter)
-        {
-            return filter != null ? filter.AsOData() : "";
-        }
-
-        private string OrderToString(SortOrder<TEntity> order)
-        {
-            return order != null ? order.AsOData() : "";
-        }
-
         public CoreTable Query(Filter<TEntity>? filter = null, Columns<TEntity>? columns = null, SortOrder<TEntity>? orderby = null)
         {
             try

+ 2 - 2
InABox.Core/Filter.cs

@@ -46,7 +46,7 @@ namespace InABox.Core
 
         public override string ToString()
         {
-            return $"{typeof(T).Name}.{Column} WHERE {Filter?.AsOData()}";
+            return $"{typeof(T).Name}.{Column} WHERE {Filter?.ToString()}";
         }
     }
 
@@ -1674,7 +1674,7 @@ namespace InABox.Core
             }
             else if (Expression != null)
             {
-                var value = "''";
+                var value = "null";
                 if (Value != null)
                 {
                     value = ValueToString(Value);

+ 1 - 1
InABox.Server/RestService.cs

@@ -233,7 +233,7 @@ namespace InABox.API
 
             Logger.Send(LogType.Information, userid,
                 string.Format("[{0} {1}] Query{2}: Filter=[{3}] Sort=[{4}]", request.Credentials.Platform, request.Credentials.Version,
-                    SimpleName(typeof(TEntity)), request.Filter != null ? request.Filter.AsOData() : "",
+                    SimpleName(typeof(TEntity)), request.Filter != null ? request.Filter.ToString() : "",
                     request.Sort != null ? request.Sort.AsOData() : ""));
 
             try

+ 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;

+ 16 - 8
inabox.wpf/DynamicGrid/DynamicGrid.cs

@@ -385,7 +385,7 @@ public abstract class DynamicGrid<T> : DynamicGrid, IDynamicGridUIComponentParen
 
     bool IDynamicGridUIComponentParent<T>.CanSort()
     {
-        return !ShowSequenceButtons;
+        return !ShowSequenceButtons || !Options.EditRows;
     }
 
     T IDynamicGrid<T>.LoadItem(CoreRow row) => LoadItem(row);
@@ -699,17 +699,24 @@ public abstract class DynamicGrid<T> : DynamicGrid, IDynamicGridUIComponentParen
 
         Delete.Visibility = Options.DeleteRows ? Visibility.Visible : Visibility.Collapsed;
 
-        if (up != null)
-            up.Position = Options.EditRows ? DynamicActionColumnPosition.Start : DynamicActionColumnPosition.Hidden;
-        if (down != null)
-            down.Position = Options.EditRows ? DynamicActionColumnPosition.Start : DynamicActionColumnPosition.Hidden;
+        if (up != null && down != null)
+        {
+            var hasSequence = up.Position == DynamicActionColumnPosition.Start;
+            var shouldHaveSequence = Options.EditRows;
+            if(hasSequence != shouldHaveSequence)
+            {
+                up.Position = Options.EditRows ? DynamicActionColumnPosition.Start : DynamicActionColumnPosition.Hidden;
+                down.Position = Options.EditRows ? DynamicActionColumnPosition.Start : DynamicActionColumnPosition.Hidden;
+                reloadColumns = true;
+            }
+        }
 
         if (DuplicateBtn != null)
             DuplicateBtn.Visibility = Visibility.Collapsed;
 
         reloadColumns = reloadColumns || UIComponent.OptionsChanged();
 
-        if(reloadColumns)
+        if(reloadColumns && IsReady)
         {
             Refresh(true, false);
         }
@@ -979,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);

+ 2 - 2
inabox.wpf/DynamicGrid/Editors/FilterEditor/FilterEditorControl.cs

@@ -131,7 +131,7 @@ namespace InABox.DynamicGrid
             if(window.ShowDialog() == true)
             {
                 Filter = getMethod.Invoke(window, Array.Empty<object>()) as IFilter;
-                TextBox.Text = Filter?.AsOData();
+                TextBox.Text = Filter?.ToString();
                 CheckChanged();
             }
         }
@@ -147,7 +147,7 @@ namespace InABox.DynamicGrid
                 Filter = Serialization.Deserialize(typeof(Filter<>).MakeGenericType(FilterType), value) as IFilter;
             else
                 Filter = null;
-            TextBox.Text = Filter?.AsOData();
+            TextBox.Text = Filter?.ToString();
         }
     }
 }

+ 40 - 15
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;
@@ -884,7 +912,6 @@ public class DynamicGridGridUIComponent<T> : IDynamicGridUIComponent<T>, IDynami
                     newcol.ImageWidth = DataGrid.RowHeight - 8;
                     newcol.ColumnSizer = GridLengthUnitType.None;
                     newcol.HeaderText = column.HeaderText;
-                    newcol.AllowSorting = false;
 
                     ApplyFilterStyle(newcol, true, true);
 
@@ -924,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;
@@ -1118,9 +1145,7 @@ public class DynamicGridGridUIComponent<T> : IDynamicGridUIComponent<T>, IDynami
             column.FilterRowCondition = FilterRowCondition.Contains;
             column.FilterRowOptionsVisibility = Visibility.Collapsed;
             column.AllowBlankFilters = true;
-            column.AllowSorting = isactioncolumn
-                ? false
-                : Parent.CanSort();
+            column.AllowSorting = !isactioncolumn && Parent.CanSort();
         }
         else
         {

+ 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;