Przeglądaj źródła

Improved management of custom dashboards

Kenric Nugteren 7 miesięcy temu
rodzic
commit
3308e48967

+ 12 - 0
prs.desktop/Dashboards/CustomDashboardGrid.cs

@@ -0,0 +1,12 @@
+using InABox.DynamicGrid;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace PRSDesktop.Dashboards;
+
+public class CustomDashboardGrid : DynamicItemsListGrid<CustomDashboard>
+{
+}

+ 73 - 40
prs.desktop/Dashboards/UtilityDashboard.xaml.cs

@@ -39,6 +39,8 @@ namespace PRSDesktop
     {
         public string Name { get; set; }
 
+        public string Group { get; set; }
+
         [NullEditor]
         public string Layout { get; set; }
     }
@@ -126,6 +128,16 @@ namespace PRSDesktop
 
         public void CreateToolbarButtons(IPanelHost host)
         {
+            host.CreateSetupAction("Manage Custom Dashboards", null, ManageCustomDashboards_Click);
+        }
+
+        private void ManageCustomDashboards_Click(PanelAction action)
+        {
+            var config = new GlobalConfiguration<GlobalUtilityDashboardSettings>();
+            var settings = config.Load();
+
+            var grid = new CustomDashboardGrid();
+            grid.Items = settings.CustomDashboards;
         }
 
         private void SaveSettings()
@@ -609,21 +621,21 @@ namespace PRSDesktop
 
             foreach(var widget in GetVisibleDashboardElements())
             {
-                grid.AddElement(widget.DashboardElement, widget.WidgetCaption, widget.GroupCaption, true);
+                grid.AddElementType(widget.DashboardElement, widget.WidgetCaption, widget.GroupCaption, true);
             }
 
             var customDashboards = new GlobalConfiguration<GlobalUtilityDashboardSettings>().Load().CustomDashboards;
-            grid.AddElement(typeof(CustomDashboardElement), "Custom", "Custom", visible: false);
             foreach(var customDashboard in customDashboards)
             {
-                grid.AddElementAction(customDashboard.Name, null, "Custom", customDashboard, AddCustom_Click);
+                grid.AddElementType(typeof(CustomDashboardElement), customDashboard.Name, customDashboard.Group.NotWhiteSpaceOr("Custom"), customDashboard, AddCustom_Click, allowduplicate: true);
             }
-            grid.AddElementAction<object?>("Create New", InABox.Wpf.Resources.add, "Custom", null, CreateNewCustom_Click);
+            grid.AddElementAction<object?>("Create New", InABox.Wpf.Resources.add, "", null, CreateNewCustom_Click);
 
             grid.ShowBorders = false;
             grid.OnCreateElement += OnCreateElement;
             grid.OnAfterDesign += OnAfterDesign;
             grid.OnAfterRender += OnAfterRender;
+            grid.CustomiseElementContextMenu += Grid_CustomiseElementContextMenu;
 
             grid.Mode = FormMode.Preview;
 
@@ -644,58 +656,78 @@ namespace PRSDesktop
             return border;
         }
 
-        private DFLayoutElement? AddCustom_Click(CustomDashboard dashboard)
+        private void Grid_CustomiseElementContextMenu(ContextMenu menu, DFLayoutElement element)
         {
-            var element = new CustomDashboardElement();
-            element.Properties = new CustomDashboardProperties
+            if(element is CustomDashboardElement dashboardElement)
             {
-                DashboardName = dashboard.Name
-            };
-            return element;
+                menu.AddItem("Edit Dashboard", null, dashboardElement, EditDashboard_Click);
+            }
         }
 
-        private DFLayoutElement? CreateNewCustom_Click(object? tag)
+        private void EditDashboard_Click(CustomDashboardElement element)
         {
-            var grid = new Grid();
-            grid.AddRow(GridUnitType.Auto);
-            grid.AddRow(GridUnitType.Auto);
-            grid.AddRow(GridUnitType.Star);
-
-            grid.AddColumn(GridUnitType.Auto);
-            grid.AddColumn(GridUnitType.Star);
+            var config = new GlobalConfiguration<GlobalUtilityDashboardSettings>();
+            var settings = config.Load();
 
-            grid.AddChild(new Label
+            var customDashboard = settings.CustomDashboards.FirstOrDefault(x => x.Name == element.Properties.DashboardName);
+            if(customDashboard is null)
             {
-                Content = "Dashboard Name:",
-                VerticalAlignment = VerticalAlignment.Center
-            }, 0, 0);
-            var textBox = new TextBox
+                return;
+            }
+            var dashboard = DynamicDashboardUtils.Deserialize(customDashboard.Layout);
+            if(dashboard is null)
             {
-                Background = Colors.LightYellow.ToBrush(),
-                Padding = new Thickness(5),
-                VerticalContentAlignment = VerticalAlignment.Center
+                return;
+            }
+
+            var editor = new DynamicDashboardEditor(dashboard);
+            editor.DashboardName = customDashboard.Name;
+            editor.DashboardGroup = customDashboard.Group;
+
+            var dlg = new DynamicContentDialog(editor)
+            {
+                Title = "Edit dashboard",
+                SizeToContent = SizeToContent.Height,
+                CanSave = true
             };
-            grid.AddChild(textBox, 0, 1);
 
-            grid.AddChild(new Separator
+            if(dlg.ShowDialog() == true)
             {
-                Margin = new(5)
-            }, 1, 0, colSpan: 2);
+                customDashboard.Layout = DynamicDashboardUtils.Serialize(editor.GetDashboard());
+                customDashboard.Name = editor.DashboardName;
+                customDashboard.Group = editor.DashboardGroup;
+                config.Save(settings);
 
+                element.Properties = new CustomDashboardProperties
+                {
+                    DashboardName = editor.DashboardName
+                };
+            }
+        }
+
+        private DFLayoutElement AddCustom_Click(CustomDashboard dashboard)
+        {
+            var element = new CustomDashboardElement();
+            element.Properties = new CustomDashboardProperties
+            {
+                DashboardName = dashboard.Name
+            };
+            return element;
+        }
+
+        private DFLayoutElement? CreateNewCustom_Click(object? tag)
+        {
             var dashboard = new DynamicDashboard();
 
             var editor = new DynamicDashboardEditor(dashboard);
-            grid.AddChild(editor, 2, 0, colSpan: 2);
+            editor.DashboardName = "New Dashboard";
+            editor.DashboardGroup = "Custom";
 
-            var dlg = new DynamicContentDialog(grid)
+            var dlg = new DynamicContentDialog(editor)
             {
                 Title = "Create new dashboard",
-                SizeToContent = SizeToContent.Height
-            };
-
-            textBox.TextChanged += (o, e) =>
-            {
-                dlg.CanSave = !textBox.Text.IsNullOrWhiteSpace();
+                SizeToContent = SizeToContent.Height,
+                CanSave = true
             };
 
             if(dlg.ShowDialog() == true)
@@ -705,14 +737,15 @@ namespace PRSDesktop
                 settings.CustomDashboards.Add(new CustomDashboard
                 {
                     Layout = DynamicDashboardUtils.Serialize(editor.GetDashboard()),
-                    Name = textBox.Text
+                    Name = editor.DashboardName,
+                    Group = editor.DashboardGroup
                 });
                 config.Save(settings);
 
                 var element = new CustomDashboardElement();
                 element.Properties = new CustomDashboardProperties
                 {
-                    DashboardName = textBox.Text
+                    DashboardName = editor.DashboardName
                 };
                 return element;
             }