Ver Fonte

User-local filters. Added a security token for editing global filters.

Kenric Nugteren há 1 ano atrás
pai
commit
6e75a4dc76

+ 14 - 1
InABox.Core/CoreFilterDefinition.cs

@@ -47,6 +47,11 @@ namespace InABox.Core
         [Caption("Visible On")]
         public CoreFilterDefinitionVisibility Visibility { get; set; } = CoreFilterDefinitionVisibility.DesktopOnly;
 
+        [EditorSequence(4)]
+        [CheckBoxEditor(ToolTip = "Is this filter private to you?")]
+        [Security(typeof(CanEditGlobalFilters))]
+        public bool Private { get; set; } = true;
+
         [NullEditor]
         public long Sequence { get; set; }
 
@@ -56,8 +61,16 @@ namespace InABox.Core
         }
     }
 
-    public class CoreFilterDefinitions : List<CoreFilterDefinition>, IGlobalConfigurationSettings
+    public class CoreFilterDefinitions : List<CoreFilterDefinition>, IGlobalConfigurationSettings, IUserConfigurationSettings
     {
+        public CoreFilterDefinitions(): base()
+        {
+
+        }
+        public CoreFilterDefinitions(int capacity) : base(capacity)
+        {
+
+        }
     }
     
 }

+ 12 - 0
InABox.Core/Editors/Utils/SecurityAttribute.cs

@@ -8,6 +8,18 @@ namespace InABox.Core
     {
         public Type SecurityDescriptor { get; set; }
 
+        /// <summary>
+        /// If the user does not have the security token, this property will be <see cref="Visible.Visible"/> if <see langword="true"/>
+        /// or <see cref="Visible.Hidden"/> if <see langword="false"/>. The default is <see langword="false"/>.
+        /// </summary>
+        public bool Visible { get; set; } = false;
+
+        /// <summary>
+        /// If the user does not have the security token, this property will be <see cref="Editable.Editable"/> if <see langword="true"/>
+        /// or <see cref="Editable.Hidden"/> if <see langword="false"/>. The default is <see langword="false"/>.
+        /// </summary>
+        public bool Editable { get; set; } = false;
+
         private SecurityAttribute() { }
 
         public SecurityAttribute(Type securityDescriptor)

+ 5 - 0
InABox.Core/Security/Core_Descriptors.cs

@@ -13,4 +13,9 @@ namespace InABox.Core
     public class CanEditCompletedForms : DisabledSecurityDescriptor<DigitalFormsLicense, DigitalForm>
     {
     }
+
+    [Caption("Edit Global Filters")]
+    public class CanEditGlobalFilters : EnabledSecurityDescriptor<CoreLicense>
+    {
+    }
 }

+ 3 - 1
inabox.wpf/DynamicGrid/DynamicDataGrid.cs

@@ -74,7 +74,9 @@ namespace InABox.DynamicGrid
 
         protected override void Init()
         {
-            FilterComponent = new(this, new GlobalConfiguration<CoreFilterDefinitions>(GetTag()));
+            FilterComponent = new(this,
+                new GlobalConfiguration<CoreFilterDefinitions>(GetTag()),
+                new UserConfiguration<CoreFilterDefinitions>(GetTag()));
             FilterComponent.OnFilterRefresh += () => Refresh(false, true);
 
             MergeBtn = AddButton("Merge", Wpf.Resources.merge.AsBitmapImage(Color.White), DoMerge);

+ 8 - 2
inabox.wpf/DynamicGrid/DynamicEditorGrid.xaml.cs

@@ -597,8 +597,14 @@ namespace InABox.DynamicGrid
                     {
                         if (!Security.IsAllowed(security.SecurityDescriptor))
                         {
-                            editor.Visible = Visible.Hidden;
-                            editor.Editable = Editable.Hidden;
+                            if (!security.Visible)
+                            {
+                                editor.Visible = Visible.Hidden;
+                            }
+                            if (!security.Editable)
+                            {
+                                editor.Editable = Editable.Hidden;
+                            }
                             break;
                         }
                     }

+ 22 - 6
inabox.wpf/DynamicGrid/DynamicGridFilterButtonComponent.cs

@@ -100,7 +100,8 @@ public class DynamicGridFilterButtonComponent<T>
 
     private IDynamicGrid Grid;
 
-    private IConfiguration<CoreFilterDefinitions> Configuration;
+    private IConfiguration<CoreFilterDefinitions> GlobalConfiguration;
+    private IConfiguration<CoreFilterDefinitions> UserConfiguration;
 
     public delegate void FilterSelectedHandler(DynamicGridSelectedFilterSettings filters);
 
@@ -110,10 +111,13 @@ public class DynamicGridFilterButtonComponent<T>
 
     public event FilterRefreshHandler? OnFilterRefresh;
 
-    public DynamicGridFilterButtonComponent(IDynamicGrid grid, IConfiguration<CoreFilterDefinitions> configuration)
+    public DynamicGridFilterButtonComponent(IDynamicGrid grid,
+        IConfiguration<CoreFilterDefinitions> globalConfiguration,
+        IConfiguration<CoreFilterDefinitions> userConfiguration)
     {
         Grid = grid;
-        Configuration = configuration;
+        GlobalConfiguration = globalConfiguration;
+        UserConfiguration = userConfiguration;
 
         FilterBtn = Grid.AddButton("", Wpf.Resources.filter.AsBitmapImage(), DoFilter);
         FilterBtn.Margin = new Thickness(0, 2, 7, 0);
@@ -139,8 +143,10 @@ public class DynamicGridFilterButtonComponent<T>
 
         menu.AddSeparatorIfNeeded();
 
-        var filters = Configuration.Load();
-        foreach (var filter in filters)
+        var globalFilters = Security.IsAllowed<CanEditGlobalFilters>() ? GlobalConfiguration.Load() : new CoreFilterDefinitions();
+        var userFilters = UserConfiguration.Load();
+        var filters = new CoreFilterDefinitions(globalFilters.Count + userFilters.Count);
+        foreach (var filter in globalFilters.Concat(userFilters))
         {
             var item = menu.AddCheckItem(filter.Name, filter, Filter_Toggle);
             item.StaysOpenOnClick = true;
@@ -148,6 +154,7 @@ public class DynamicGridFilterButtonComponent<T>
             {
                 item.IsChecked = true;
             }
+            filters.Add(filter);
         }
 
         if (Security.IsAllowed<CanCustomiseFilters>())
@@ -158,7 +165,16 @@ public class DynamicGridFilterButtonComponent<T>
                 var window = new DynamicGridFilterEditor(filters, typeof(T));
                 if (window.ShowDialog() == true)
                 {
-                    Configuration.Save(filters);
+                    globalFilters.Clear();
+                    globalFilters.AddRange(filters.Where(x => !x.Private));
+                    userFilters.Clear();
+                    userFilters.AddRange(filters.Where(x => x.Private));
+
+                    if (Security.IsAllowed<CanEditGlobalFilters>())
+                    {
+                        GlobalConfiguration.Save(globalFilters);
+                    }
+                    UserConfiguration.Save(userFilters);
                 }
             });
         }

+ 1 - 0
inabox.wpf/DynamicGrid/DynamicGridFilterGrid.cs

@@ -1,4 +1,5 @@
 using InABox.Core;
+using InABox.Wpf;
 using System;
 using System.Collections.Generic;
 using System.Linq;