Browse Source

Improved Add/Edit/Delete on Popup and CodePopup editors
Added G70 and Manta Fusion devices to GPS Server
Fixed Popup Filter Value Display

frankvandenbos 4 months ago
parent
commit
2deb72c9e3

+ 1 - 0
InABox.Core/Objects/Editors/CodePopupEditor.cs

@@ -15,6 +15,7 @@ namespace InABox.Core
         protected override BaseEditor DoClone()
         protected override BaseEditor DoClone()
         {
         {
             var result = (CloneDataLookupEditor() as CodePopupEditor)!;
             var result = (CloneDataLookupEditor() as CodePopupEditor)!;
+            result.CanAdd = CanAdd;
             result.CodeColumn = CodeColumn;
             result.CodeColumn = CodeColumn;
             return result;
             return result;
         }
         }

+ 5 - 1
InABox.Core/Objects/Editors/PopupEditor.cs

@@ -8,9 +8,13 @@ namespace InABox.Core
         {
         {
         }
         }
 
 
+        public bool CanAdd { get; set; } = false;
+
         protected override BaseEditor DoClone()
         protected override BaseEditor DoClone()
         {
         {
-            return CloneDataLookupEditor();
+            var result =  (PopupEditor)CloneDataLookupEditor();
+            result.CanAdd = CanAdd;
+            return result;
         }
         }
     }
     }
 }
 }

+ 6 - 0
InABox.Core/Security/Security.cs

@@ -235,6 +235,12 @@ namespace InABox.Core
         {
         {
             return ClientFactory.IsSupported<TEntity>() && IsAllowed<AutoSecurityDescriptor<TEntity, CanDelete<TEntity>>>();
             return ClientFactory.IsSupported<TEntity>() && IsAllowed<AutoSecurityDescriptor<TEntity, CanDelete<TEntity>>>();
         }
         }
+        
+        public static bool CanDelete(Type TEntity)
+        {
+            return ClientFactory.IsSupported(TEntity) &&
+                   IsAllowed(typeof(AutoSecurityDescriptor<,>).MakeGenericType(TEntity, typeof(CanDelete<>).MakeGenericType(TEntity)));
+        }
 
 
         public static bool CanManageIssues(Type TEntity)
         public static bool CanManageIssues(Type TEntity)
         {
         {

+ 3 - 0
inabox.digitalmatter/DMFactory.cs

@@ -54,6 +54,8 @@ namespace InABox.DigitalMatter
             RegisterDevice(0x3E, "Remora2");
             RegisterDevice(0x3E, "Remora2");
             RegisterDevice(0x49, "Yabby GPS");
             RegisterDevice(0x49, "Yabby GPS");
             RegisterDevice(0x48, "Yabby WiFi Cellular");
             RegisterDevice(0x48, "Yabby WiFi Cellular");
+            RegisterDevice(0x72, "Manta Fusion");
+            RegisterDevice(0x73, "G70");
 
 
             //Obsolete DMT Devices
             //Obsolete DMT Devices
             RegisterDevice(0x22, "Dart");
             RegisterDevice(0x22, "Dart");
@@ -65,6 +67,7 @@ namespace InABox.DigitalMatter
             RegisterDevice(0x3A, "Oyster Cellular(v1)");
             RegisterDevice(0x3A, "Oyster Cellular(v1)");
             RegisterDevice(0x34, "Sting");
             RegisterDevice(0x34, "Sting");
 
 
+
             RegisterBluetoothTag<DMGuppyBluetoothTag>(0x00);
             RegisterBluetoothTag<DMGuppyBluetoothTag>(0x00);
             RegisterBluetoothTag<DMIBeaconBluetoothTag>(0x01);
             RegisterBluetoothTag<DMIBeaconBluetoothTag>(0x01);
             RegisterBluetoothTag<DMEddystoneBluetoothTag>(0x02);
             RegisterBluetoothTag<DMEddystoneBluetoothTag>(0x02);

+ 2 - 0
inabox.wpf/DynamicGrid/DynamicGridUtils.cs

@@ -756,6 +756,8 @@ public static class DynamicGridUtils
     public static Brush SelectionForeground { get; set; } = new SolidColorBrush(Colors.Silver);
     public static Brush SelectionForeground { get; set; } = new SolidColorBrush(Colors.Silver);
 
 
     public static Brush FilterBackground { get; set; } = new SolidColorBrush(System.Windows.Media.Color.FromArgb(0xFF, 0xE9, 0xF7, 0xC9));
     public static Brush FilterBackground { get; set; } = new SolidColorBrush(System.Windows.Media.Color.FromArgb(0xFF, 0xE9, 0xF7, 0xC9));
+    
+    public static Brush FilterForeground{ get; set; } = new SolidColorBrush(Colors.Black);
 
 
     #endregion
     #endregion
 
 

+ 4 - 2
inabox.wpf/DynamicGrid/Editors/CodePopupEditor/CodePopupEditorControl.cs

@@ -188,8 +188,10 @@ public class CodePopupEditorControl : DynamicEditorControl<Guid, CodePopupEditor
                 {
                 {
                     grid.OnReconfigure += options =>
                     grid.OnReconfigure += options =>
                     {
                     {
-                        options.AddRows = true;
-                        options.EditRows = true;
+                        options.AddRows = Security.CanEdit(_type);
+                        options.EditRows = Security.CanEdit(_type);
+                        options.EditRows = Security.CanDelete(_type);
+                        options.ReadOnly = false;
                     };
                     };
                     grid.OnCreateItem += (_, item) =>
                     grid.OnCreateItem += (_, item) =>
                     {
                     {

+ 21 - 1
inabox.wpf/DynamicGrid/Editors/PopupEditor/PopupEditorControl.cs

@@ -92,6 +92,25 @@ public class PopupEditorControl : DynamicEditorControl<Guid, PopupEditor>
             var list = new PopupList(_type, _value, columns.ColumnNames().ToArray());
             var list = new PopupList(_type, _value, columns.ColumnNames().ToArray());
 
 
             list.OnDefineFilter += t => { return LookupFactory.DefineLookupFilter(Host.GetEditorType(), t, ColumnName, Host.GetItems()); };
             list.OnDefineFilter += t => { return LookupFactory.DefineLookupFilter(Host.GetEditorType(), t, ColumnName, Host.GetItems()); };
+            
+            list.OnCustomiseGrid += grid =>
+            {
+                if (EditorDefinition.CanAdd)
+                {
+                    grid.OnReconfigure += options =>
+                    {
+                        options.AddRows = Security.CanEdit(_type);
+                        options.EditRows = Security.CanEdit(_type);
+                        options.EditRows = Security.CanDelete(_type);
+                        options.ReadOnly = false;
+                    };
+                    grid.OnCreateItem += (_, item) =>
+                    {
+                        LookupFactory.OnCreateItem(Host.GetEditorType(), ColumnName, Host.GetItems(), item);
+                    };
+                    grid.Reconfigure();
+                }
+            };
 
 
             if (list.ShowDialog() == true)
             if (list.ShowDialog() == true)
             {
             {
@@ -107,7 +126,8 @@ public class PopupEditorControl : DynamicEditorControl<Guid, PopupEditor>
                     if (list.OtherValues.ContainsKey(col.Property))
                     if (list.OtherValues.ContainsKey(col.Property))
                         display.Add(list.OtherValues[col.Property]?.ToString());
                         display.Add(list.OtherValues[col.Property]?.ToString());
 
 
-                Editor.Text = string.Join(" / ", display.Where(x => x != null && !string.IsNullOrWhiteSpace(x.ToString())));
+                Editor.Text = LookupFactory.FormatLookup(_type, OtherValues, []);
+                   // string.Join(" / ", display.Where(x => x != null && !string.IsNullOrWhiteSpace(x.ToString()))));
             }
             }
         }
         }
     }
     }

+ 37 - 6
inabox.wpf/DynamicGrid/UIComponent/DynamicGridGridUIComponent.cs

@@ -32,6 +32,8 @@ using System.Windows.Media;
 using System.Windows.Media.Effects;
 using System.Windows.Media.Effects;
 using System.Windows.Media.Imaging;
 using System.Windows.Media.Imaging;
 using System.Windows.Threading;
 using System.Windows.Threading;
+using Syncfusion.UI.Xaml.Grid.RowFilter;
+using Columns = InABox.Core.Columns;
 using DataColumn = System.Data.DataColumn;
 using DataColumn = System.Data.DataColumn;
 using DataRow = System.Data.DataRow;
 using DataRow = System.Data.DataRow;
 using TimeSpanEdit = Syncfusion.Windows.Shared.TimeSpanEdit;
 using TimeSpanEdit = Syncfusion.Windows.Shared.TimeSpanEdit;
@@ -131,13 +133,36 @@ public class DynamicGridGridUIComponent : IDynamicGridUIComponent, IDynamicGridG
     }
     }
 
 
     #endregion
     #endregion
+    
+    public class GridFilterRowTextBoxRendererExt : GridFilterRowTextBoxRenderer
+    {
 
 
+        public override void OnInitializeDisplayElement(
+            DataColumnBase dataColumn,
+            TextBlock uiElement,
+            object dataContext)
+        {
+            base.OnInitializeDisplayElement(dataColumn, uiElement, dataContext);
+            object filterValue = dataColumn.GridColumn.FilteredFrom != FilteredFrom.FilterRow || dataColumn.GridColumn.FilterPredicates.Count <= 0 
+                ? (object) null 
+                : dataColumn.GridColumn.FilterPredicates.FirstOrDefault<FilterPredicate>().FilterValue;
+            uiElement.Text = filterValue != null ? (string) filterValue : string.Empty;
+            
+        }
+    }
+
+    public static GridFilterRowTextBoxRendererExt? renderer = null;
+    
+    
     public DynamicGridGridUIComponent()
     public DynamicGridGridUIComponent()
     {
     {
+
+        
         ColumnsMenu = new ContextMenu();
         ColumnsMenu = new ContextMenu();
         ColumnsMenu.Opened += ColumnsMenu_ContextMenuOpening;
         ColumnsMenu.Opened += ColumnsMenu_ContextMenuOpening;
 
 
         DataGrid = new SfDataGrid();
         DataGrid = new SfDataGrid();
+        DataGrid.FilterRowCellRenderers.Add(nameof(GridFilterRowTextBoxRendererExt), new GridFilterRowTextBoxRendererExt());
         DataGrid.VerticalAlignment = VerticalAlignment.Stretch;
         DataGrid.VerticalAlignment = VerticalAlignment.Stretch;
         DataGrid.HorizontalAlignment = HorizontalAlignment.Stretch;
         DataGrid.HorizontalAlignment = HorizontalAlignment.Stretch;
         DataGrid.HeaderContextMenu = ColumnsMenu;
         DataGrid.HeaderContextMenu = ColumnsMenu;
@@ -897,10 +922,11 @@ public class DynamicGridGridUIComponent : IDynamicGridUIComponent, IDynamicGridG
 
 
     private void ApplyFilterStyle(GridColumn column, bool filtering, bool allowSorting)
     private void ApplyFilterStyle(GridColumn column, bool filtering, bool allowSorting)
     {
     {
-        var filterstyle = new Style();
+        
+        var filterRowCellStyle = new Style();
         if (filtering)
         if (filtering)
         {
         {
-            filterstyle.Setters.Add(new Setter(Control.BackgroundProperty, DynamicGridUtils.FilterBackground));
+            filterRowCellStyle.Setters.Add(new Setter(Control.BackgroundProperty, DynamicGridUtils.FilterBackground));
             column.ImmediateUpdateColumnFilter = true;
             column.ImmediateUpdateColumnFilter = true;
             column.ColumnFilter = ColumnFilter.Value;
             column.ColumnFilter = ColumnFilter.Value;
             column.FilterRowCondition = FilterRowCondition.Contains;
             column.FilterRowCondition = FilterRowCondition.Contains;
@@ -910,15 +936,16 @@ public class DynamicGridGridUIComponent : IDynamicGridUIComponent, IDynamicGridG
         }
         }
         else
         else
         {
         {
-            filterstyle.Setters.Add(new Setter(Control.BackgroundProperty, new SolidColorBrush(Colors.Gainsboro)));
-            filterstyle.Setters.Add(new Setter(Control.IsEnabledProperty, false));
+            filterRowCellStyle.Setters.Add(new Setter(Control.BackgroundProperty, new SolidColorBrush(Colors.Gainsboro)));
+            filterRowCellStyle.Setters.Add(new Setter(UIElement.IsEnabledProperty, false));
             column.ColumnFilter = ColumnFilter.Value;
             column.ColumnFilter = ColumnFilter.Value;
             column.AllowSorting = false;
             column.AllowSorting = false;
             column.FilterRowEditorType = "TextBox";
             column.FilterRowEditorType = "TextBox";
             column.FilterRowOptionsVisibility = Visibility.Collapsed;
             column.FilterRowOptionsVisibility = Visibility.Collapsed;
         }
         }
 
 
-        column.FilterRowCellStyle = filterstyle;
+        
+        column.FilterRowCellStyle = filterRowCellStyle;
     }
     }
 
 
     private void Filter_FilterChanged(IDynamicGridColumnFilter filter)
     private void Filter_FilterChanged(IDynamicGridColumnFilter filter)
@@ -1235,14 +1262,18 @@ public class DynamicGridGridUIComponent : IDynamicGridUIComponent, IDynamicGridG
 
 
     private void LoadDataColumn(DynamicGridColumn column)
     private void LoadDataColumn(DynamicGridColumn column)
     {
     {
+        
         column.Editor = Parent.CustomiseEditor(column, column.Editor);
         column.Editor = Parent.CustomiseEditor(column, column.Editor);
         if (this.CreateEditorColumn(column, out var newcol))
         if (this.CreateEditorColumn(column, out var newcol))
         {
         {
+            
             if (!newcol.VariableHeight)
             if (!newcol.VariableHeight)
                 gridRowResizingOptions.ExcludeColumns.Add(newcol.MappingName);
                 gridRowResizingOptions.ExcludeColumns.Add(newcol.MappingName);
 
 
             var newColumn = newcol.CreateGridColumn();
             var newColumn = newcol.CreateGridColumn();
-
+            
+            newColumn.FilterRowEditorType = nameof(GridFilterRowTextBoxRendererExt);
+            
             var summary = ConvertSummary(newcol.Summary());
             var summary = ConvertSummary(newcol.Summary());
             if (summary != null)
             if (summary != null)
             {
             {

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

@@ -1063,6 +1063,8 @@ public class DynamicGridTreeUIComponent<T, TKey> : IDynamicGridUIComponent<T>, I
         if (filtering)
         if (filtering)
         {
         {
             filterstyle.Setters.Add(new Setter(Control.BackgroundProperty, DynamicGridUtils.FilterBackground));
             filterstyle.Setters.Add(new Setter(Control.BackgroundProperty, DynamicGridUtils.FilterBackground));
+            filterstyle.Setters.Add(new Setter(Control.ForegroundProperty, DynamicGridUtils.FilterForeground));
+            filterstyle.Setters.Add(new Setter(GridCell.SelectionForegroundBrushProperty, DynamicGridUtils.FilterForeground));
             column.ImmediateUpdateColumnFilter = true;
             column.ImmediateUpdateColumnFilter = true;
             column.ColumnFilter = ColumnFilter.DisplayText;
             column.ColumnFilter = ColumnFilter.DisplayText;
             column.AllowBlankFilters = true;
             column.AllowBlankFilters = true;
@@ -1073,7 +1075,9 @@ public class DynamicGridTreeUIComponent<T, TKey> : IDynamicGridUIComponent<T>, I
         else
         else
         {
         {
             filterstyle.Setters.Add(new Setter(Control.BackgroundProperty, new SolidColorBrush(Colors.Gainsboro)));
             filterstyle.Setters.Add(new Setter(Control.BackgroundProperty, new SolidColorBrush(Colors.Gainsboro)));
-            filterstyle.Setters.Add(new Setter(Control.IsEnabledProperty, false));
+            filterstyle.Setters.Add(new Setter(Control.ForegroundProperty, DynamicGridUtils.FilterForeground));
+            filterstyle.Setters.Add(new Setter(GridCell.SelectionForegroundBrushProperty, DynamicGridUtils.FilterForeground));
+            filterstyle.Setters.Add(new Setter(UIElement.IsEnabledProperty, false));
             column.ColumnFilter = ColumnFilter.Value;
             column.ColumnFilter = ColumnFilter.Value;
             column.AllowSorting = false;
             column.AllowSorting = false;
         }
         }