فهرست منبع

Tree View Stuff

Kenric Nugteren 1 سال پیش
والد
کامیت
ad7e741289

+ 3 - 0
prs.classes/Entities/Product/ProductGroup/ProductGroup.cs

@@ -13,6 +13,9 @@ namespace Comal.Classes
         [TextBoxEditor]
         public string Description { get; set; }
 
+        [EditorSequence(3)]
+        public ProductGroupLink Parent { get; set; }
+
         public override string ToString()
         {
             return string.Format("{0}: {1}", Code, Description);

+ 3 - 3
prs.desktop/MainWindow.xaml.cs

@@ -581,9 +581,9 @@ public partial class MainWindow : IPanelHostControl
         }
 
         ThemeManager.BaseColor = baseColor;
-        BaseDynamicGrid.SelectionBackground = ThemeManager.SelectionBackgroundBrush;
-        BaseDynamicGrid.SelectionForeground = ThemeManager.SelectionForegroundBrush;
-        BaseDynamicGrid.FilterBackground = ThemeManager.FilterBackgroundBrush;
+        DynamicGridUtils.SelectionBackground = ThemeManager.SelectionBackgroundBrush;
+        DynamicGridUtils.SelectionForeground = ThemeManager.SelectionForegroundBrush;
+        DynamicGridUtils.FilterBackground = ThemeManager.FilterBackgroundBrush;
 
         //_ribbon.Background =  new SolidColorBrush(Colors.White);
         //_ribbon.BackStageColor = ThemeConverter.GetBrush(ElementType.Ribbon, BrushType.Background);

+ 1 - 1
prs.desktop/Panels/Jobs/Summary/JobSummaryGrid.cs

@@ -216,7 +216,7 @@ namespace PRSDesktop
                 return filter;
             };
             grid.OnFilterRecord += row => rowfilter?.Invoke(row) ?? true;
-            var window = DynamicGridUtils.CreateGridWindow($"Viewing {CoreUtils.Neatify(columnname)} Calculation", (grid as BaseDynamicGrid)!);
+            var window = DynamicGridUtils.CreateGridWindow($"Viewing {CoreUtils.Neatify(columnname)} Calculation", grid);
             window.ShowDialog();
         }
 

+ 5 - 35
prs.desktop/Panels/Meeting/MeetingTreeView.cs

@@ -49,20 +49,11 @@ namespace PRSDesktop
                 }
                 else
                 {
-
-                    {
-                        data = new CoreTable();
-                        data.Columns.Add(new CoreColumn(CoreUtils.GetFullPropertyName<MeetingItem, Guid>(x => x.ID, ".")));
-                        data.Columns.Add(new CoreColumn(CoreUtils.GetFullPropertyName<MeetingItem, Guid>(x => x.Parent.ID, ".")));
-                        data.Columns.Add(new CoreColumn(CoreUtils.GetFullPropertyName<MeetingItem, String>(x => x.Title, ".")));
-                    }
+                    data = new CoreTable();
+                    data.Columns.Add(new CoreColumn(CoreUtils.GetFullPropertyName<MeetingItem, Guid>(x => x.ID, ".")));
+                    data.Columns.Add(new CoreColumn(CoreUtils.GetFullPropertyName<MeetingItem, Guid>(x => x.Parent.ID, ".")));
+                    data.Columns.Add(new CoreColumn(CoreUtils.GetFullPropertyName<MeetingItem, String>(x => x.Title, ".")));
                 }
-
-                // var newRow = data.NewRow();
-                // newRow.Set<MeetingItem, Guid>(x => x.ID, CoreUtils.FullGuid);
-                // newRow.Set<MeetingItem, Guid>(x => x.Parent.ID, Guid.Empty);
-                // newRow.Set<MeetingItem, string>(x => x.Title, "All Items");
-                // data.Rows.Insert(0, newRow);
                 
                 action(data, null);
             }
@@ -85,12 +76,6 @@ namespace PRSDesktop
 
         protected override MeetingItem? DoLoadItem(Guid id)
         {
-            // if (id == CoreUtils.FullGuid)
-            // {
-            //     MessageBox.Show("This item cannot be edited.");
-            //     return null;
-            // }
-
             var result = new Client<MeetingItem>().Query(
                 new Filter<MeetingItem>(x => x.ID).IsEqualTo(id)
             ).Rows.FirstOrDefault()?.ToObject<MeetingItem>();
@@ -103,20 +88,11 @@ namespace PRSDesktop
 
         protected override void DoSaveItem(MeetingItem item)
         {
-            //if (item.ID != CoreUtils.FullGuid)
-            //{
-                new Client<MeetingItem>().Save(item, "Edited by User");
-            //}
+            new Client<MeetingItem>().Save(item, "Edited by User");
         }
 
         protected override bool DoDeleteItem(Guid id)
         {
-            // if(id == CoreUtils.FullGuid)
-            // {
-            //     MessageBox.Show("This folder cannot be deleted.");
-            //     return false;
-            // }
-
             CoreRow? row = Data.Rows.FirstOrDefault(r=>r.Get<MeetingItem, Guid>(x => x.ID) == id);
             if(row == null)
             {
@@ -124,12 +100,6 @@ namespace PRSDesktop
                 Logger.Send(LogType.Error, ClientFactory.UserID, $"Error: Meeting Item {id} does not exist or is not loaded");
                 return false;
             }
-
-            // if (row.Get<JobDocumentSetFolder, int>(x => x.Documents) > 0)
-            // {
-            //     MessageBox.Show("This folder is not empty, and cannot be deleted!");
-            //     return false;
-            // }
             
             new Client<MeetingItem>().Delete(new MeetingItem() { ID = id }, "Deleted by User");
             return true;

+ 9 - 9
prs.desktop/Panels/Security/Global/GlobalTokenGrid.cs

@@ -415,10 +415,10 @@ namespace PRSDesktop
         private bool CreateGlobalMenu()
         {
             var menu = new ContextMenu();
-            menu.Items.Add(new MenuItem() { Header = "Enable All Tokens", Command = new Command((o) => GlobalAction(FilteredRows(), TokenAction.Enable)) });
-            menu.Items.Add(new MenuItem() { Header = "Disable All Tokens", Command = new Command((o) => GlobalAction(FilteredRows(), TokenAction.Disable)) });
+            menu.Items.Add(new MenuItem() { Header = "Enable All Tokens", Command = new Command((o) => GlobalAction(GetVisibleRows(), TokenAction.Enable)) });
+            menu.Items.Add(new MenuItem() { Header = "Disable All Tokens", Command = new Command((o) => GlobalAction(GetVisibleRows(), TokenAction.Disable)) });
             menu.Items.Add(new Separator());
-            menu.Items.Add(new MenuItem() { Header = "Reset All Tokens", Command = new Command((o) => GlobalAction(FilteredRows(), TokenAction.Reset)) });
+            menu.Items.Add(new MenuItem() { Header = "Reset All Tokens", Command = new Command((o) => GlobalAction(GetVisibleRows(), TokenAction.Reset)) });
             menu.IsOpen = true;
             return false;
         }
@@ -426,10 +426,10 @@ namespace PRSDesktop
         private bool CreateGroupMenu(Guid groupid)
         {
             var menu = new ContextMenu();
-            menu.Items.Add(new MenuItem() { Header = "Enable All Tokens", Command = new Command((o) => GroupAction(FilteredRows(), groupid, TokenAction.Enable)) });
-            menu.Items.Add(new MenuItem() { Header = "Disable All Tokens", Command = new Command((o) => GroupAction(FilteredRows(), groupid, TokenAction.Disable)) });
+            menu.Items.Add(new MenuItem() { Header = "Enable All Tokens", Command = new Command((o) => GroupAction(GetVisibleRows(), groupid, TokenAction.Enable)) });
+            menu.Items.Add(new MenuItem() { Header = "Disable All Tokens", Command = new Command((o) => GroupAction(GetVisibleRows(), groupid, TokenAction.Disable)) });
             menu.Items.Add(new Separator());
-            menu.Items.Add(new MenuItem() { Header = "Reset All Tokens", Command = new Command((o) => GroupAction(FilteredRows(), groupid, TokenAction.Reset)) });
+            menu.Items.Add(new MenuItem() { Header = "Reset All Tokens", Command = new Command((o) => GroupAction(GetVisibleRows(), groupid, TokenAction.Reset)) });
             menu.IsOpen = true;
             return false;
         }
@@ -437,10 +437,10 @@ namespace PRSDesktop
         private bool CreateUserMenu(Guid groupid, Guid userid)
         {
             var menu = new ContextMenu();
-            menu.Items.Add(new MenuItem() { Header = "Enable All Tokens", Command = new Command((o) => UserAction(FilteredRows(), groupid, userid, TokenAction.Enable)) });
-            menu.Items.Add(new MenuItem() { Header = "Disable All Tokens", Command = new Command((o) => UserAction(FilteredRows(), groupid, userid, TokenAction.Disable)) });
+            menu.Items.Add(new MenuItem() { Header = "Enable All Tokens", Command = new Command((o) => UserAction(GetVisibleRows(), groupid, userid, TokenAction.Enable)) });
+            menu.Items.Add(new MenuItem() { Header = "Disable All Tokens", Command = new Command((o) => UserAction(GetVisibleRows(), groupid, userid, TokenAction.Disable)) });
             menu.Items.Add(new Separator());
-            menu.Items.Add(new MenuItem() { Header = "Reset All Tokens", Command = new Command((o) => UserAction(FilteredRows(), groupid, userid, TokenAction.Reset)) });
+            menu.Items.Add(new MenuItem() { Header = "Reset All Tokens", Command = new Command((o) => UserAction(GetVisibleRows(), groupid, userid, TokenAction.Reset)) });
             menu.IsOpen = true;
             return false;
         }

+ 53 - 0
prs.desktop/Panels/StockSummary/ProductGroupTreeView.cs

@@ -0,0 +1,53 @@
+using Comal.Classes;
+using InABox.Clients;
+using InABox.Core;
+using InABox.DynamicGrid;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace PRSDesktop;
+public class ProductGroupTreeView : DynamicTreeView<ProductGroup>
+{
+    protected override Expression<Func<ProductGroup, Guid>> ID => x => x.ID;
+
+    protected override Expression<Func<ProductGroup, Guid>> ParentID => x => x.Parent.ID;
+
+    protected override Expression<Func<ProductGroup, string>> Description => x => x.Description;
+
+    public Columns<ProductGroup> AdditionalColumns { get; } = new Columns<ProductGroup>();
+
+    protected override void DoRefresh(Action<CoreTable?, Exception?> action)
+    {
+        Client.Query(
+            null,
+            new Columns<ProductGroup>(x => x.ID)
+                .Add(x => x.Description)
+                .Add(x => x.Parent.ID)
+                .Add(AdditionalColumns),
+            null,
+            action);
+    }
+
+    protected override ProductGroup? DoLoadItem(Guid id)
+    {
+        return Client.Query(
+            new Filter<ProductGroup>(x => x.ID).IsEqualTo(id),
+            DynamicGridUtils.LoadEditorColumns(new Columns<ProductGroup>(x => x.ID)))
+            .ToObjects<ProductGroup>().FirstOrDefault();
+    }
+
+    protected override void DoSaveItem(ProductGroup item)
+    {
+        Client.Save(item, "Edited by user.");
+    }
+
+    protected override bool DoDeleteItem(Guid id)
+    {
+        Client.Delete(new ProductGroup() { ID = id }, "Deleted by User");
+        return true;
+    }
+}

+ 34 - 16
prs.desktop/Panels/StockSummary/StockSummaryControl.xaml

@@ -7,31 +7,49 @@
              xmlns:dynamicGrid="clr-namespace:InABox.DynamicGrid;assembly=InABox.Wpf"
              mc:Ignorable="d"
              d:DesignHeight="900" d:DesignWidth="1000">
-    <dynamicGrid:DynamicSplitPanel x:Name="SplitPanel" MasterCaption="Stock Summary" DetailCaption="Product Groups" View="Combined" Anchor="Detail" AnchorWidth="350" AllowableViews="Master,Combined" OnChanged="SplitPanel_OnOnChanged" DetailHeight="500">
-
+    <dynamicGrid:DynamicSplitPanel x:Name="SplitPanel"
+                                   MasterCaption="Product Groups" DetailCaption="Stock Summary"
+                                   View="Combined" AllowableViews="Master,Combined"
+                                   Anchor="Master" AnchorWidth="350"
+                                   OnChanged="SplitPanel_OnOnChanged">
+        
         <dynamicGrid:DynamicSplitPanel.Header>
             <Border BorderBrush="DimGray" BorderThickness="0.75">
-                <Label Content="Stock Summary" HorizontalContentAlignment="Center"/>
+                <Label Content="Product Groups" HorizontalContentAlignment="Center"/>
             </Border>
         </dynamicGrid:DynamicSplitPanel.Header>
-        
+
         <dynamicGrid:DynamicSplitPanel.Master>
-            <local:StockSummaryGrid x:Name="SummaryGrid" BeforeRefresh="SummaryGrid_OnBeforeRefresh" AfterRefresh="SummaryGrid_OnAfterRefresh" />
+            <local:ProductGroupTreeView x:Name="ProductGroups"/>
         </dynamicGrid:DynamicSplitPanel.Master>
-        
-        <!-- <dynamicGrid:DynamicSplitPanel.DetailHeader> -->
-        <!--     <Border BorderBrush="DimGray" BorderThickness="0.75"> -->
-        <!--         <Label Content="Product Groups" HorizontalContentAlignment="Center"/> -->
-        <!--     </Border>            -->
-        <!-- </dynamicGrid:DynamicSplitPanel.DetailHeader> -->
     
         <dynamicGrid:DynamicSplitPanel.Detail>
-            <local:ProductGroupSelector x:Name="GroupSelector" SettingsChanged="GroupSelector_OnSettingsChanged" SelectionChanged="GroupSelector_OnSelectionChanged"/>
-        </dynamicGrid:DynamicSplitPanel.Detail>  
+            <dynamicGrid:DynamicSplitPanel x:Name="DetailSplitPanel"
+                                           DetailCaption="Suppliers"
+                                           View="Combined" AllowableViews="Master,Combined"
+                                           Anchor="Detail" AnchorWidth="350" DetailHeight="500"
+                                           OnChanged="DetailSplitPanel_OnChanged">
+
+                <dynamicGrid:DynamicSplitPanel.Header>
+                    <Border BorderBrush="DimGray" BorderThickness="0.75">
+                        <Label Content="Stock Summary" HorizontalContentAlignment="Center"/>
+                    </Border>
+                </dynamicGrid:DynamicSplitPanel.Header>
         
-        <dynamicGrid:DynamicSplitPanel.SecondaryDetail>
-            <local:JobSelector x:Name="JobSelector" SettingsChanged="JobSelector_OnSettingsChanged" SelectionChanged="JobSelector_OnSelectionChanged" />
-        </dynamicGrid:DynamicSplitPanel.SecondaryDetail>
+                <dynamicGrid:DynamicSplitPanel.Master>
+                    <local:StockSummaryGrid x:Name="SummaryGrid" BeforeRefresh="SummaryGrid_OnBeforeRefresh" AfterRefresh="SummaryGrid_OnAfterRefresh" />
+                </dynamicGrid:DynamicSplitPanel.Master>
+                
+                <dynamicGrid:DynamicSplitPanel.Detail>
+                    <local:ProductGroupSelector x:Name="GroupSelector" SettingsChanged="GroupSelector_OnSettingsChanged" SelectionChanged="GroupSelector_OnSelectionChanged"/>
+                </dynamicGrid:DynamicSplitPanel.Detail>
+        
+                <dynamicGrid:DynamicSplitPanel.SecondaryDetail>
+                    <local:JobSelector x:Name="JobSelector" SettingsChanged="JobSelector_OnSettingsChanged" SelectionChanged="JobSelector_OnSelectionChanged" />
+                </dynamicGrid:DynamicSplitPanel.SecondaryDetail>
+                
+            </dynamicGrid:DynamicSplitPanel>
+        </dynamicGrid:DynamicSplitPanel.Detail>  
         
     </dynamicGrid:DynamicSplitPanel>
 </UserControl>

+ 7 - 0
prs.desktop/Panels/StockSummary/StockSummaryControl.xaml.cs

@@ -43,6 +43,8 @@ public partial class StockSummaryControl : UserControl
             SummaryGrid.JobIDs = Properties.JobSelection.Jobs;
 
             SummaryGrid.Refresh(true, false);
+
+            ProductGroups.Refresh();
         }
     }
 
@@ -137,4 +139,9 @@ public partial class StockSummaryControl : UserControl
         GroupSelector.IsEnabled = true;
         JobSelector.IsEnabled = true;
     }
+
+    private void DetailSplitPanel_OnChanged(object sender, DynamicSplitPanelSettings e)
+    {
+
+    }
 }

+ 1 - 1
prs.desktop/Panels/StockSummary/StockSummaryGrid.cs

@@ -136,7 +136,7 @@ public class StockSummaryGrid : DynamicDataGrid<StockSummary>, IDataModelSource
             return filter;
         };
         grid.OnFilterRecord += row => rowfilter?.Invoke(row) ?? true;
-        var window = DynamicGridUtils.CreateGridWindow($"Viewing {CoreUtils.Neatify(columnname)} Calculation", (grid as BaseDynamicGrid)!);
+        var window = DynamicGridUtils.CreateGridWindow($"Viewing {CoreUtils.Neatify(columnname)} Calculation", grid);
         window.ShowDialog();
     }