ソースを参照

Delivery list remembering filter

Kenric Nugteren 1 年間 前
コミット
dc348182aa
2 ファイル変更270 行追加253 行削除
  1. 269 252
      prs.desktop/Panels/Delivery/DeliveryList.cs
  2. 1 1
      prs.desktop/Panels/Jobs/ServiceGrid.cs

+ 269 - 252
prs.desktop/Panels/Delivery/DeliveryList.cs

@@ -11,300 +11,317 @@ using InABox.DynamicGrid;
 using InABox.WPF;
 using InABox.Wpf;
 using Syncfusion.Linq;
+using InABox.Configuration;
 
-namespace PRSDesktop
+namespace PRSDesktop;
+
+public delegate void DeliveryChangedEvent(object sender);
+
+public class DeliveryListSettings : IUserConfigurationSettings
 {
-    public delegate void DeliveryChangedEvent(object sender);
+    public DynamicGridSelectedFilterSettings Filters { get; set; } = new();
+}
+
+public class DeliveryList : DynamicDataGrid<Delivery>, IMasterDetailControl<Job,Delivery>
+{
+    private readonly BitmapImage docs = PRSDesktop.Resources.doc_png.AsBitmapImage();
+
+    private DeliveryListSettings _settings;
+    
+    public DateTime BookingSlot { get; set; }
+    public Guid EmployeeID { get; set; }
+    
+    public Job? Master { get; set; }
+    
+    public Filter<Delivery> MasterDetailFilter => Master != null
+        ? Master.ID != Guid.Empty 
+            ? new Filter<Delivery>(x => x.Job.ID).IsEqualTo(Master.ID)
+            : new Filter<Delivery>().None()
+        : new Filter<Delivery>().All();
+    
+    public bool AllJobs { get;  }
 
-    public class DeliveryList : DynamicDataGrid<Delivery>, IMasterDetailControl<Job,Delivery>
+    public DeliveryList()
     {
-        private readonly BitmapImage docs = PRSDesktop.Resources.doc_png.AsBitmapImage();
-        
-        public DateTime BookingSlot { get; set; }
-        public Guid EmployeeID { get; set; }
-        
-        public Job? Master { get; set; }
-        
-        public Filter<Delivery> MasterDetailFilter => Master != null
-            ? Master.ID != Guid.Empty 
-                ? new Filter<Delivery>(x => x.Job.ID).IsEqualTo(Master.ID)
-                : new Filter<Delivery>().None()
-            : new Filter<Delivery>().All();
-        
-        public bool AllJobs { get;  }
-
-        public DeliveryList()
-        {
-            ActionColumns.Add(new DynamicImageColumn(DocumentsImage, DocumentsClick) { Position = DynamicActionColumnPosition.Start });
+        _settings = new UserConfiguration<DeliveryListSettings>().Load();
+        FilterComponent.SetSettings(_settings.Filters, false);
+        FilterComponent.OnFiltersSelected += FilterComponent_OnFilterSelected;
 
-            HiddenColumns.Add(x => x.Notes);
-            HiddenColumns.Add(x => x.Job.ID);
-            HiddenColumns.Add(x => x.Completed);
-            HiddenColumns.Add(x => x.Documents);
-            HiddenColumns.Add(x => x.Contact.ID);
-            HiddenColumns.Add(x => x.Contact.Name);
+        ActionColumns.Add(new DynamicImageColumn(DocumentsImage, DocumentsClick) { Position = DynamicActionColumnPosition.Start });
 
-            OnCustomiseEditor += CustomiseEditor;
-        }
+        HiddenColumns.Add(x => x.Notes);
+        HiddenColumns.Add(x => x.Job.ID);
+        HiddenColumns.Add(x => x.Completed);
+        HiddenColumns.Add(x => x.Documents);
+        HiddenColumns.Add(x => x.Contact.ID);
+        HiddenColumns.Add(x => x.Contact.Name);
 
-        protected override void DoReconfigure(FluentList<DynamicGridOption> options)
-        {
-            base.DoReconfigure(options);
-
-            options.BeginUpdate();
-            options.AddRange(DynamicGridOption.RecordCount, DynamicGridOption.AddRows, DynamicGridOption.EditRows, DynamicGridOption.SelectColumns,
-                DynamicGridOption.FilterRows);
-            if (Security.CanDelete<Delivery>())
-                options.Add(DynamicGridOption.DeleteRows);
-            options.EndUpdate();
-        }
+        OnCustomiseEditor += CustomiseEditor;
+    }
 
+    private void FilterComponent_OnFilterSelected(DynamicGridSelectedFilterSettings filters)
+    {
+        _settings.Filters = filters;
+        _settings.SaveUser();
+    }
 
+    protected override void DoReconfigure(FluentList<DynamicGridOption> options)
+    {
+        base.DoReconfigure(options);
+
+        options.BeginUpdate();
+        options.AddRange(DynamicGridOption.RecordCount, DynamicGridOption.AddRows, DynamicGridOption.EditRows, DynamicGridOption.SelectColumns,
+            DynamicGridOption.FilterRows);
+        if (Security.CanDelete<Delivery>())
+            options.Add(DynamicGridOption.DeleteRows);
+        options.EndUpdate();
+    }
 
-        public event DeliveryChangedEvent DeliveryChanged;
 
-        private void CustomiseEditor(IDynamicEditorForm sender, Delivery[]? items, DynamicGridColumn column, BaseEditor editor)
+
+    public event DeliveryChangedEvent DeliveryChanged;
+
+    private void CustomiseEditor(IDynamicEditorForm sender, Delivery[]? items, DynamicGridColumn column, BaseEditor editor)
+    {
+        if (column.ColumnName.Equals("Completed"))
         {
-            if (column.ColumnName.Equals("Completed"))
-            {
-                editor.Editable = Security.IsAllowed<CanSkipDeliveryPhotos>() ? Editable.Enabled : Editable.Disabled;
-            }
-            // else if (column.ColumnName.Equals("Contact.ID"))
-            // {
-            //     editor.Editable = Editable.Hidden;
-            // }
-            // else if (column.ColumnName.Equals("Contact.Name"))
-            // {
-            //     editor.Editable = Editable.Enabled;
-            //     (editor as TextBoxEditor).Buttons = new[]
-            //     {
-            //         new(items?.FirstOrDefault(), "Select", 50, ContactNameLookup, true),
-            //         new EditorButton(items?.FirstOrDefault(), "Clear", 50, ContactNameClear, true)
-            //     };
-            // }
+            editor.Editable = Security.IsAllowed<CanSkipDeliveryPhotos>() ? Editable.Enabled : Editable.Disabled;
         }
-
-        // private void ContactNameClear(object editor, object? item)
-        // {
-        //     if (item is not Delivery delivery)
-        //         return;
-        //
-        //     delivery.Contact.ID = Guid.Empty;
-        //     delivery.Address.Street = "";
-        //     delivery.Address.City = "";
-        //     delivery.Address.State = "";
-        //     delivery.Address.PostCode = "";
-        //
-        //     if(editor is BaseDynamicEditorControl baseEditor)
-        //     {
-        //         baseEditor.SetValue(baseEditor.ColumnName, "");
-        //     }
-        // }
-        //
-        // private void ContactNameLookup(object editor, object? item)
+        // else if (column.ColumnName.Equals("Contact.ID"))
         // {
-        //     var contacts = new MultiSelectDialog<Contact>(
-        //         null,
-        //         null,
-        //         false
-        //     );
-        //
-        //     if (contacts.ShowDialog() != true)
-        //         return;
-        //
-        //     var contact = contacts.Items().FirstOrDefault();
-        //     if (contact == null)
-        //         return;
-        //     if (item is not Delivery delivery)
-        //         return;
-        //
-        //     delivery.Contact.ID = contact.ID;
-        //     delivery.Address.Street = contact.Address.Street;
-        //     delivery.Address.City = contact.Address.City;
-        //     delivery.Address.State = contact.Address.State;
-        //     delivery.Address.PostCode = contact.Address.PostCode;
-        //
-        //     if (editor is BaseDynamicEditorControl baseEditor)
-        //     {
-        //         baseEditor.SetValue(baseEditor.ColumnName, contact.Name);
-        //     }
-        //     //SetEditorValue(item, "Contact.Name", contact.Name);
-        //     //SetEditorValue(item,"Address.Street",contact.Address.Street);
-        //     //SetEditorValue(item, "Address.City",contact.Address.City);
-        //     //SetEditorValue(item, "Address.State",contact.Address.State);
-        //     //SetEditorValue(item, "Address.PostCode",contact.Address.PostCode);
+        //     editor.Editable = Editable.Hidden;
         // }
-
-        // protected override Dictionary<string, object?> EditorValueChanged(IDynamicEditorForm editor, Delivery[] items, string name, object value)
+        // else if (column.ColumnName.Equals("Contact.Name"))
         // {
-        //     var result = base.EditorValueChanged(editor, items, name, value);
-        //     if (name.Equals("Job.ID"))
-        //     {
-        //         items.ForEach(item => { item.Contact.ID = Guid.Empty; });
-        //         editor.SetEditorValue("Contact.Name", "");
-        //     }
-        //     else if (name.Equals("Contact.Name"))
+        //     editor.Editable = Editable.Enabled;
+        //     (editor as TextBoxEditor).Buttons = new[]
         //     {
-        //         var street = "";
-        //         var city = "";
-        //         var state = "";
-        //         var postcode = "";
-        //         if (items.First().Contact.IsValid())
-        //         {
-        //             street = items.First().Address.Street;
-        //             city = items.First().Address.City;
-        //             state = items.First().Address.State;
-        //             postcode = items.First().Address.PostCode;
-        //         }
-        //         else
-        //         {
-        //             CoreRow row = null;
-        //             if (items.First().ID != Guid.Empty)
-        //             {
-        //                 row = new Client<Job>().Query(
-        //                     new Filter<Job>(x => x.ID).IsEqualTo(items.First().Job.ID),
-        //                     new Columns<Job>(x => x.ID, x => x.SiteAddress.Street, x => x.SiteAddress.City, x => x.SiteAddress.State,
-        //                         x => x.SiteAddress.PostCode)
-        //                 ).Rows.FirstOrDefault();
-        //                 street = row != null ? row.Get<Job, string>(x => x.SiteAddress.Street) : "";
-        //                 city = row != null ? row.Get<Job, string>(x => x.SiteAddress.City) : "";
-        //                 state = row != null ? row.Get<Job, string>(x => x.SiteAddress.State) : "";
-        //                 postcode = row != null ? row.Get<Job, string>(x => x.SiteAddress.PostCode) : "";
-        //             }
-        //         }
-        //
-        //         editor.SetEditorValue("Address.Street", street);
-        //         editor.SetEditorValue("Address.City", city);
-        //         editor.SetEditorValue("Address.State", state);
-        //         editor.SetEditorValue("Address.PostCode", postcode);
-        //     }
-        //
-        //     return result;
+        //         new(items?.FirstOrDefault(), "Select", 50, ContactNameLookup, true),
+        //         new EditorButton(items?.FirstOrDefault(), "Clear", 50, ContactNameClear, true)
+        //     };
         // }
+    }
 
-        private bool DocumentsClick(CoreRow? arg)
-        {
-            if (arg == null)
-                return false;
-
-            var docs = new List<IEntityDocument>();
-            using (new WaitCursor())
-            {
-                var deliveryid = arg.Get<Delivery, Guid>(x => x.ID);
-                var table = new Client<DeliveryDocument>().Query(
-                    new Filter<DeliveryDocument>(x => x.EntityLink.ID).IsEqualTo(deliveryid)
-                );
-                foreach (var row in table.Rows)
-                    docs.Add(row.ToObject<DeliveryDocument>());
-            }
+    // private void ContactNameClear(object editor, object? item)
+    // {
+    //     if (item is not Delivery delivery)
+    //         return;
+    //
+    //     delivery.Contact.ID = Guid.Empty;
+    //     delivery.Address.Street = "";
+    //     delivery.Address.City = "";
+    //     delivery.Address.State = "";
+    //     delivery.Address.PostCode = "";
+    //
+    //     if(editor is BaseDynamicEditorControl baseEditor)
+    //     {
+    //         baseEditor.SetValue(baseEditor.ColumnName, "");
+    //     }
+    // }
+    //
+    // private void ContactNameLookup(object editor, object? item)
+    // {
+    //     var contacts = new MultiSelectDialog<Contact>(
+    //         null,
+    //         null,
+    //         false
+    //     );
+    //
+    //     if (contacts.ShowDialog() != true)
+    //         return;
+    //
+    //     var contact = contacts.Items().FirstOrDefault();
+    //     if (contact == null)
+    //         return;
+    //     if (item is not Delivery delivery)
+    //         return;
+    //
+    //     delivery.Contact.ID = contact.ID;
+    //     delivery.Address.Street = contact.Address.Street;
+    //     delivery.Address.City = contact.Address.City;
+    //     delivery.Address.State = contact.Address.State;
+    //     delivery.Address.PostCode = contact.Address.PostCode;
+    //
+    //     if (editor is BaseDynamicEditorControl baseEditor)
+    //     {
+    //         baseEditor.SetValue(baseEditor.ColumnName, contact.Name);
+    //     }
+    //     //SetEditorValue(item, "Contact.Name", contact.Name);
+    //     //SetEditorValue(item,"Address.Street",contact.Address.Street);
+    //     //SetEditorValue(item, "Address.City",contact.Address.City);
+    //     //SetEditorValue(item, "Address.State",contact.Address.State);
+    //     //SetEditorValue(item, "Address.PostCode",contact.Address.PostCode);
+    // }
 
-            if (docs.Any())
-            {
-                var editor = new DocumentEditor(docs.ToArray());
-                //editor.PrintAllowed = Security.IsAllowed<CanPrintFactoryFloorDrawings>();
-                editor.SaveAllowed = Security.IsAllowed<CanSaveFactoryFloorDrawings>();
-                editor.ShowDialog();
-            }
-            else
-            {
-                MessageBox.Show("No Documents Available!");
-            }
+    // protected override Dictionary<string, object?> EditorValueChanged(IDynamicEditorForm editor, Delivery[] items, string name, object value)
+    // {
+    //     var result = base.EditorValueChanged(editor, items, name, value);
+    //     if (name.Equals("Job.ID"))
+    //     {
+    //         items.ForEach(item => { item.Contact.ID = Guid.Empty; });
+    //         editor.SetEditorValue("Contact.Name", "");
+    //     }
+    //     else if (name.Equals("Contact.Name"))
+    //     {
+    //         var street = "";
+    //         var city = "";
+    //         var state = "";
+    //         var postcode = "";
+    //         if (items.First().Contact.IsValid())
+    //         {
+    //             street = items.First().Address.Street;
+    //             city = items.First().Address.City;
+    //             state = items.First().Address.State;
+    //             postcode = items.First().Address.PostCode;
+    //         }
+    //         else
+    //         {
+    //             CoreRow row = null;
+    //             if (items.First().ID != Guid.Empty)
+    //             {
+    //                 row = new Client<Job>().Query(
+    //                     new Filter<Job>(x => x.ID).IsEqualTo(items.First().Job.ID),
+    //                     new Columns<Job>(x => x.ID, x => x.SiteAddress.Street, x => x.SiteAddress.City, x => x.SiteAddress.State,
+    //                         x => x.SiteAddress.PostCode)
+    //                 ).Rows.FirstOrDefault();
+    //                 street = row != null ? row.Get<Job, string>(x => x.SiteAddress.Street) : "";
+    //                 city = row != null ? row.Get<Job, string>(x => x.SiteAddress.City) : "";
+    //                 state = row != null ? row.Get<Job, string>(x => x.SiteAddress.State) : "";
+    //                 postcode = row != null ? row.Get<Job, string>(x => x.SiteAddress.PostCode) : "";
+    //             }
+    //         }
+    //
+    //         editor.SetEditorValue("Address.Street", street);
+    //         editor.SetEditorValue("Address.City", city);
+    //         editor.SetEditorValue("Address.State", state);
+    //         editor.SetEditorValue("Address.PostCode", postcode);
+    //     }
+    //
+    //     return result;
+    // }
 
+    private bool DocumentsClick(CoreRow? arg)
+    {
+        if (arg == null)
             return false;
-        }
 
-        private BitmapImage? DocumentsImage(CoreRow? arg)
+        var docs = new List<IEntityDocument>();
+        using (new WaitCursor())
         {
-            if (arg == null)
-                return docs;
-            return arg.Get<Delivery, int>(x => x.Documents) > 0 ? docs : null;
+            var deliveryid = arg.Get<Delivery, Guid>(x => x.ID);
+            var table = new Client<DeliveryDocument>().Query(
+                new Filter<DeliveryDocument>(x => x.EntityLink.ID).IsEqualTo(deliveryid)
+            );
+            foreach (var row in table.Rows)
+                docs.Add(row.ToObject<DeliveryDocument>());
         }
 
-        protected override Delivery CreateItem()
+        if (docs.Any())
         {
-            var result = base.CreateItem();
-            result.Job.ID = Master?.ID ?? Guid.Empty;
-            result.Job.Synchronise(Master ?? new Job());
-            return result;
-        }
-
-        private AssignmentGrid ag = null;
-        
-        public bool CreateBooking(CoreRow row, Guid employeeid, DateTime time)
-        {
-            Logger.Send(LogType.Information, ClientFactory.UserID, string.Format("{0:dd-MMM-yy hh-mm-ss} -> {1}", BookingSlot, EmployeeID));
-            var assignment = new Assignment
-            {
-                Date = time.Date,
-                Description = string.Format("Delivery #{0}", row.Get<Delivery, int>(x => x.Number))
-            };
-            assignment.Booked.Start = time.TimeOfDay;
-            assignment.Booked.Finish = time.TimeOfDay.Add(new TimeSpan(2, 0, 0));
-            assignment.Delivery.ID = row.Get<Delivery, Guid>(x => x.ID);
-            assignment.EmployeeLink.ID = employeeid;
-            assignment.JobLink.ID = row.Get<Delivery, Guid>(x => x.Job.ID);
-            Logger.Send(LogType.Information, ClientFactory.UserID, "- Creating Assignment Grid");
-            if (ag == null)
-                ag = new AssignmentGrid();
-            Logger.Send(LogType.Information, ClientFactory.UserID, "- Editing Assignment");
-            if (ag.EditItems(new[] { assignment }))
-            {
-                using (new WaitCursor())
-                {
-                    new Client<Assignment>().Save(assignment, "Created for Delivery");
-                    var del = new Client<Delivery>().Load(new Filter<Delivery>(x => x.ID).IsEqualTo(row.Get<Delivery, Guid>(x => x.ID)))
-                        .FirstOrDefault();
-                    del.Assignment.ID = assignment.ID;
-                    new Client<Delivery>().Save(del, "Booked via Scheduler");
-                }
-                DeliveryChanged?.Invoke(this);
-                return true;
-            }
-
-            Logger.Send(LogType.Information, ClientFactory.UserID, "- Cancelled Edit");
-            return false;           
+            var editor = new DocumentEditor(docs.ToArray());
+            //editor.PrintAllowed = Security.IsAllowed<CanPrintFactoryFloorDrawings>();
+            editor.SaveAllowed = Security.IsAllowed<CanSaveFactoryFloorDrawings>();
+            editor.ShowDialog();
         }
-        
-        private bool BookClick(CoreRow arg)
+        else
         {
-            return CreateBooking(arg, EmployeeID, BookingSlot);
+            MessageBox.Show("No Documents Available!");
         }
 
-        private BitmapImage BookImage(CoreRow arg)
-        {
-            if (arg == null)
-            {
-                Logger.Send(LogType.Information, ClientFactory.UserID, "BookImage: Row is null!");
-                return null;
-            }
+        return false;
+    }
 
-            Logger.Send(LogType.Information, ClientFactory.UserID,
-                string.Format("BookImage {0} -> {1:dd-MMM-yy hh-mm-ss}", arg.Get<Delivery, int>(x => x.Number), BookingSlot));
+    private BitmapImage? DocumentsImage(CoreRow? arg)
+    {
+        if (arg == null)
+            return docs;
+        return arg.Get<Delivery, int>(x => x.Documents) > 0 ? docs : null;
+    }
 
-            if (BookingSlot.IsEmpty())
-            {
-                Logger.Send(LogType.Information, ClientFactory.UserID, "BookImage: BookingSlot is Empty!");
-                return null;
-            }
+    protected override Delivery CreateItem()
+    {
+        var result = base.CreateItem();
+        result.Job.ID = Master?.ID ?? Guid.Empty;
+        result.Job.Synchronise(Master ?? new Job());
+        return result;
+    }
 
-            if (arg.Get<Delivery, DateTime>(x => x.Assignment.Date).IsEmpty())
+    private AssignmentGrid ag = null;
+    
+    public bool CreateBooking(CoreRow row, Guid employeeid, DateTime time)
+    {
+        Logger.Send(LogType.Information, ClientFactory.UserID, string.Format("{0:dd-MMM-yy hh-mm-ss} -> {1}", BookingSlot, EmployeeID));
+        var assignment = new Assignment
+        {
+            Date = time.Date,
+            Description = string.Format("Delivery #{0}", row.Get<Delivery, int>(x => x.Number))
+        };
+        assignment.Booked.Start = time.TimeOfDay;
+        assignment.Booked.Finish = time.TimeOfDay.Add(new TimeSpan(2, 0, 0));
+        assignment.Delivery.ID = row.Get<Delivery, Guid>(x => x.ID);
+        assignment.EmployeeLink.ID = employeeid;
+        assignment.JobLink.ID = row.Get<Delivery, Guid>(x => x.Job.ID);
+        Logger.Send(LogType.Information, ClientFactory.UserID, "- Creating Assignment Grid");
+        if (ag == null)
+            ag = new AssignmentGrid();
+        Logger.Send(LogType.Information, ClientFactory.UserID, "- Editing Assignment");
+        if (ag.EditItems(new[] { assignment }))
+        {
+            using (new WaitCursor())
             {
-                Logger.Send(LogType.Information, ClientFactory.UserID, "BookImage: Assignment Date is Empty!");
-                return PRSDesktop.Resources.rightarrow.AsBitmapImage();
+                new Client<Assignment>().Save(assignment, "Created for Delivery");
+                var del = new Client<Delivery>().Load(new Filter<Delivery>(x => x.ID).IsEqualTo(row.Get<Delivery, Guid>(x => x.ID)))
+                    .FirstOrDefault();
+                del.Assignment.ID = assignment.ID;
+                new Client<Delivery>().Save(del, "Booked via Scheduler");
             }
+            DeliveryChanged?.Invoke(this);
+            return true;
+        }
 
-            Logger.Send(LogType.Information, ClientFactory.UserID,
-                string.Format("BookImage Assignment Date is {0:dd-MMM-yy hh-mm-ss}", arg.Get<Delivery, DateTime>(x => x.Assignment.Date)));
+        Logger.Send(LogType.Information, ClientFactory.UserID, "- Cancelled Edit");
+        return false;           
+    }
+    
+    private bool BookClick(CoreRow arg)
+    {
+        return CreateBooking(arg, EmployeeID, BookingSlot);
+    }
 
+    private BitmapImage BookImage(CoreRow arg)
+    {
+        if (arg == null)
+        {
+            Logger.Send(LogType.Information, ClientFactory.UserID, "BookImage: Row is null!");
             return null;
         }
-        
 
-        protected override void Reload(Filters<Delivery> criteria, Columns<Delivery> columns, ref SortOrder<Delivery>? sort, Action<CoreTable?, Exception?> action)
+        Logger.Send(LogType.Information, ClientFactory.UserID,
+            string.Format("BookImage {0} -> {1:dd-MMM-yy hh-mm-ss}", arg.Get<Delivery, int>(x => x.Number), BookingSlot));
+
+        if (BookingSlot.IsEmpty())
         {
-            criteria.Add(MasterDetailFilter);
-            base.Reload(criteria, columns, ref sort, action);
+            Logger.Send(LogType.Information, ClientFactory.UserID, "BookImage: BookingSlot is Empty!");
+            return null;
         }
-        
+
+        if (arg.Get<Delivery, DateTime>(x => x.Assignment.Date).IsEmpty())
+        {
+            Logger.Send(LogType.Information, ClientFactory.UserID, "BookImage: Assignment Date is Empty!");
+            return PRSDesktop.Resources.rightarrow.AsBitmapImage();
+        }
+
+        Logger.Send(LogType.Information, ClientFactory.UserID,
+            string.Format("BookImage Assignment Date is {0:dd-MMM-yy hh-mm-ss}", arg.Get<Delivery, DateTime>(x => x.Assignment.Date)));
+
+        return null;
+    }
+    
+
+    protected override void Reload(Filters<Delivery> criteria, Columns<Delivery> columns, ref SortOrder<Delivery>? sort, Action<CoreTable?, Exception?> action)
+    {
+        criteria.Add(MasterDetailFilter);
+        base.Reload(criteria, columns, ref sort, action);
     }
+    
 }

+ 1 - 1
prs.desktop/Panels/Jobs/ServiceGrid.cs

@@ -82,7 +82,7 @@ public class ServiceGrid : DynamicDataGrid<Job>
     private void FilterComponent_OnFilterSelected(DynamicGridSelectedFilterSettings settings)
     {
         _settings.Filters = settings;
-        new UserConfiguration<ServiceGridSettings>().Save(_settings);
+        _settings.SaveUser();
     }
 
     protected override void Reload(Filters<Job> criteria, Columns<Job> columns, ref SortOrder<Job>? sort, Action<CoreTable?, Exception?> action)