浏览代码

Added EmployeeRoleCrossTab

Kenric Nugteren 1 年之前
父节点
当前提交
d198a2e6c1

+ 9 - 3
prs.desktop/Dashboards/UtilityDashboard.xaml.cs

@@ -140,7 +140,7 @@ namespace PRSDesktop
 
         private static List<WidgetDashboardElement>? _dashboardElements;
 
-        private string CurrentDashboardName => ((DashboardsTab.SelectedItem as DynamicTabItem)?.Header?.ToString()) ?? "";
+        private string? CurrentDashboardName => DashboardsTab.SelectedTab?.Header?.ToString();
 
         private DynamicFormDesignGrid? CurrentDashboard => CurrentDashboardName != null ? _dashboards.GetValueOrDefault(CurrentDashboardName) : null;
         
@@ -198,7 +198,10 @@ namespace PRSDesktop
 
         public void Refresh()
         {
-            RefreshDashboard(CurrentDashboardName);
+            if(CurrentDashboardName is string name)
+            {
+                RefreshDashboard(name);
+            }
         }
 
         public void Shutdown(CancelEventArgs? cancel)
@@ -683,7 +686,10 @@ namespace PRSDesktop
         private void OnAfterDesign(object sender)
         {
             SaveCurrentDashboard();
-            RefreshDashboard(CurrentDashboardName);
+            if(CurrentDashboardName is string name) // Null-check
+            {
+                RefreshDashboard(name);
+            }
         }
 
         #endregion

+ 0 - 6
prs.desktop/Panels/Employees/EmployeeGrid.cs

@@ -5,16 +5,12 @@ using System.Drawing;
 using System.Linq;
 using System.Windows;
 using System.Windows.Controls;
-using System.Windows.Media.Imaging;
 using Comal.Classes;
-using FastReport.DataVisualization.Charting;
 using InABox.Clients;
 using InABox.Configuration;
 using InABox.Core;
 using InABox.DynamicGrid;
 using InABox.WPF;
-using PRSDesktop.Panels.Employees;
-using Xceed.Wpf.Toolkit.PropertyGrid;
 
 namespace PRSDesktop
 {
@@ -210,8 +206,6 @@ namespace PRSDesktop
             return false;
         }
 
-        public Employee[] Employees { get; private set; }
-
         private bool ToggleFinishedEmployees(Button btn, CoreRow[] rows)
         {
             ShowAll = !ShowAll;

+ 138 - 131
prs.desktop/Panels/Employees/EmployeePanel.xaml

@@ -10,140 +10,147 @@
              d:DesignHeight="800" d:DesignWidth="1100">
 
     <Grid>
-        <dynamicGrid:DynamicSplitPanel x:Name="SplitPanel" View="Combined" Anchor="Detail" AnchorWidth="400" MasterCaption="Employee List"
-                                       DetailCaption="Employee Details" OnChanged="SplitPanel_OnChanged">
-            
-            <dynamicGrid:DynamicSplitPanel.Header>
-                <Border BorderBrush="Gray" BorderThickness="0.75">
-                    <Label Content="Employee Details" HorizontalContentAlignment="Center"/>
-                </Border>
-            </dynamicGrid:DynamicSplitPanel.Header>
-            
-            <dynamicGrid:DynamicSplitPanel.Master>
-                <local:EmployeeGrid x:Name="Employees" OnSelectItem="Employees_OnOnSelectItem"/>
-            </dynamicGrid:DynamicSplitPanel.Master>
-            
-            <dynamicGrid:DynamicSplitPanel.Detail>
-                
-                <dynamicGrid:DynamicTabControl>
-                    
-                    <dynamicGrid:DynamicTabItem x:Name="InfoTab" Header="General">
-                        
-                        <Grid>
-                            <Grid.RowDefinitions>
-                                <RowDefinition Height="Auto"/>
-                                <RowDefinition Height="300" x:Name="RosterGridRow"/>
-                                <RowDefinition Height="Auto"/>
-                                <RowDefinition Height="*"/>
-                                <!-- <RowDefinition Height="300"/> -->
-                            </Grid.RowDefinitions>
-                            <Grid.ColumnDefinitions>
-                                <ColumnDefinition Width="*"/>
-                            </Grid.ColumnDefinitions>
-                            
-                            <Border Grid.Row="0" BorderThickness="0.75" BorderBrush="DimGray" Background="Gainsboro">
-                                <Label Content="Rosters"  HorizontalContentAlignment="Center"/>
-                            </Border>
-                            
-                            <local:EmployeeRosterItemGrid x:Name="Rosters" Grid.Row="1" OnChanged="Rosters_OnOnChanged" SizeChanged="Rosters_OnSizeChanged" Margin="0,2,0,0"/>
-                            
-                            <syncfusion:SfGridSplitter Grid.Row="2" Grid.Column="0"
-                                                       ResizeBehavior="PreviousAndNext" Height="4" HorizontalAlignment="Stretch"
-                                                       Background="Transparent" Template="{StaticResource HorizontalSplitter}">
+        <dynamicGrid:DynamicTabControl x:Name="Tab" SelectionChanged="Tab_SelectionChanged">
+            <dynamicGrid:DynamicTabItem Header="Employees" x:Name="EmployeeTab">
+                <dynamicGrid:DynamicSplitPanel x:Name="SplitPanel" View="Combined" Anchor="Detail" AnchorWidth="400" MasterCaption="Employee List"
+                                               DetailCaption="Employee Details" OnChanged="SplitPanel_OnChanged">
+
+                    <dynamicGrid:DynamicSplitPanel.Header>
+                        <Border BorderBrush="Gray" BorderThickness="0.75">
+                            <Label Content="Employee Details" HorizontalContentAlignment="Center"/>
+                        </Border>
+                    </dynamicGrid:DynamicSplitPanel.Header>
+
+                    <dynamicGrid:DynamicSplitPanel.Master>
+                        <local:EmployeeGrid x:Name="Employees" OnSelectItem="Employees_OnOnSelectItem"/>
+                    </dynamicGrid:DynamicSplitPanel.Master>
+
+                    <dynamicGrid:DynamicSplitPanel.Detail>
+
+                        <dynamicGrid:DynamicTabControl>
+
+                            <dynamicGrid:DynamicTabItem x:Name="InfoTab" Header="General">
+
+                                <Grid>
+                                    <Grid.RowDefinitions>
+                                        <RowDefinition Height="Auto"/>
+                                        <RowDefinition Height="300" x:Name="RosterGridRow"/>
+                                        <RowDefinition Height="Auto"/>
+                                        <RowDefinition Height="*"/>
+                                        <!-- <RowDefinition Height="300"/> -->
+                                    </Grid.RowDefinitions>
+                                    <Grid.ColumnDefinitions>
+                                        <ColumnDefinition Width="*"/>
+                                    </Grid.ColumnDefinitions>
+
+                                    <Border Grid.Row="0" BorderThickness="0.75" BorderBrush="DimGray" Background="Gainsboro">
+                                        <Label Content="Rosters"  HorizontalContentAlignment="Center"/>
+                                    </Border>
+
+                                    <local:EmployeeRosterItemGrid x:Name="Rosters" Grid.Row="1" OnChanged="Rosters_OnOnChanged" SizeChanged="Rosters_OnSizeChanged"
+                                                                  Margin="0,2,0,0"/>
+
+                                    <syncfusion:SfGridSplitter Grid.Row="2" Grid.Column="0"
+                                                               ResizeBehavior="PreviousAndNext" Height="4" HorizontalAlignment="Stretch"
+                                                               Background="Transparent" Template="{StaticResource HorizontalSplitter}">
+
+                                        <syncfusion:SfGridSplitter.PreviewStyle>
+                                            <Style TargetType="Control">
+                                                <Setter Property="Background" Value="Gray" />
+                                                <Setter Property="Template">
+                                                    <Setter.Value>
+                                                        <ControlTemplate TargetType="Control">
+                                                            <Grid x:Name="Root" Opacity="0.5">
+                                                                <Rectangle Fill="{TemplateBinding Background}" />
+                                                            </Grid>
+                                                        </ControlTemplate>
+                                                    </Setter.Value>
+                                                </Setter>
+                                            </Style>
+                                        </syncfusion:SfGridSplitter.PreviewStyle>
+
+                                    </syncfusion:SfGridSplitter>
+
+                                    <DockPanel Grid.Row="3">
+                                        <Border BorderThickness="0.75" BorderBrush="DimGray" DockPanel.Dock="Top" Background="Gainsboro">
+                                            <Label Content="Teams"  HorizontalContentAlignment="Center"/>
+                                        </Border>
+                                        <local:EmployeeTeamGrid x:Name="Teams" DockPanel.Dock="Top" Margin="0,2,0,0" />
+
+                                    </DockPanel>
 
-                                <syncfusion:SfGridSplitter.PreviewStyle>
-                                    <Style TargetType="Control">
-                                        <Setter Property="Background" Value="Gray" />
-                                        <Setter Property="Template">
-                                            <Setter.Value>
-                                                <ControlTemplate TargetType="Control">
-                                                    <Grid x:Name="Root" Opacity="0.5">
-                                                        <Rectangle Fill="{TemplateBinding Background}" />
-                                                    </Grid>
-                                                </ControlTemplate>
-                                            </Setter.Value>
-                                        </Setter>
-                                    </Style>
-                                </syncfusion:SfGridSplitter.PreviewStyle>
-
-                            </syncfusion:SfGridSplitter>
-                            
-                            <DockPanel Grid.Row="3">
-                                <Border BorderThickness="0.75" BorderBrush="DimGray" DockPanel.Dock="Top" Background="Gainsboro">
-                                    <Label Content="Teams"  HorizontalContentAlignment="Center"/>
-                                </Border>
-                                <local:EmployeeTeamGrid x:Name="Teams" DockPanel.Dock="Top" Margin="0,2,0,0" />
-                                
-                            </DockPanel>
-
-                        </Grid>
-                    </dynamicGrid:DynamicTabItem>
-
-                    <dynamicGrid:DynamicTabItem x:Name="RoleTab" Header="Job Roles">
-                
-                        <Grid>
-                            <Grid.RowDefinitions>
-                                <RowDefinition Height="250" x:Name="RoleGridRow"/>
-                                <RowDefinition Height="Auto"/>
-                                <RowDefinition Height="*"/>
-                            </Grid.RowDefinitions>
-                            <Grid.ColumnDefinitions>
-                                <ColumnDefinition Width="*"/>
-                            </Grid.ColumnDefinitions>
-                            
-                            <local:EmployeeRoleGrid Grid.Row="0" Grid.Column="0" x:Name="Roles" OnChanged="Roles_OnOnChanged" SizeChanged="Roles_OnSizeChanged" />
-                            
-                            <syncfusion:SfGridSplitter Grid.Row="1" Grid.Column="0"
+                                </Grid>
+                            </dynamicGrid:DynamicTabItem>
+
+                            <dynamicGrid:DynamicTabItem x:Name="RoleTab" Header="Job Roles">
+
+                                <Grid>
+                                    <Grid.RowDefinitions>
+                                        <RowDefinition Height="250" x:Name="RoleGridRow"/>
+                                        <RowDefinition Height="Auto"/>
+                                        <RowDefinition Height="*"/>
+                                    </Grid.RowDefinitions>
+                                    <Grid.ColumnDefinitions>
+                                        <ColumnDefinition Width="*"/>
+                                    </Grid.ColumnDefinitions>
+
+                                    <local:EmployeeRoleGrid Grid.Row="0" Grid.Column="0" x:Name="Roles" OnChanged="Roles_OnOnChanged" SizeChanged="Roles_OnSizeChanged" />
+
+                                    <syncfusion:SfGridSplitter Grid.Row="1" Grid.Column="0"
                                                        ResizeBehavior="PreviousAndNext" Height="4" HorizontalAlignment="Stretch"
                                                        Background="Transparent" Template="{StaticResource HorizontalSplitter}">
 
-                                <syncfusion:SfGridSplitter.PreviewStyle>
-                                    <Style TargetType="Control">
-                                        <Setter Property="Background" Value="Gray" />
-                                        <Setter Property="Template">
-                                            <Setter.Value>
-                                                <ControlTemplate TargetType="Control">
-                                                    <Grid x:Name="Root" Opacity="0.5">
-                                                        <Rectangle Fill="{TemplateBinding Background}" />
-                                                    </Grid>
-                                                </ControlTemplate>
-                                            </Setter.Value>
-                                        </Setter>
-                                    </Style>
-                                </syncfusion:SfGridSplitter.PreviewStyle>
-
-                            </syncfusion:SfGridSplitter>
-                            
-                            <dynamicGrid:DynamicTabControl Grid.Row="2" TabStripPlacement="Bottom">
-                        
-                                <dynamicGrid:DynamicTabItem x:Name="ActivitiesTab" Header="Activities">
-                                    <local:EmployeeActivityGrid x:Name="Activities" />
-                                </dynamicGrid:DynamicTabItem>
-
-                                <dynamicGrid:DynamicTabItem x:Name="FormsTab" Header="Forms">
-                                    <local:EmployeeRoleFormGrid x:Name="Forms" />
-                                </dynamicGrid:DynamicTabItem>
-                                
-                            </dynamicGrid:DynamicTabControl> 
-                            </Grid>
-                        
-                    </dynamicGrid:DynamicTabItem>
-                    
-                    <dynamicGrid:DynamicTabItem Header="Jobs">
-                        <local:EmployeeJobGrid x:Name="Jobs" />
-                    </dynamicGrid:DynamicTabItem>
-                    
-                    <dynamicGrid:DynamicTabItem x:Name="QualificationsTab" Header="Qualifications">
-                        <local:EmployeeQualificationGrid x:Name="Qualifications" />
-                    </dynamicGrid:DynamicTabItem>
-                    
-                    <dynamicGrid:DynamicTabItem x:Name="SpreadsheetsTab" Header="Spreadsheets">
-                        <local:EmployeeSpreadsheetGrid x:Name="Spreadsheets" />
-                    </dynamicGrid:DynamicTabItem>
-
-                </dynamicGrid:DynamicTabControl>
-            </dynamicGrid:DynamicSplitPanel.Detail>
-        </dynamicGrid:DynamicSplitPanel>
-        
+                                        <syncfusion:SfGridSplitter.PreviewStyle>
+                                            <Style TargetType="Control">
+                                                <Setter Property="Background" Value="Gray" />
+                                                <Setter Property="Template">
+                                                    <Setter.Value>
+                                                        <ControlTemplate TargetType="Control">
+                                                            <Grid x:Name="Root" Opacity="0.5">
+                                                                <Rectangle Fill="{TemplateBinding Background}" />
+                                                            </Grid>
+                                                        </ControlTemplate>
+                                                    </Setter.Value>
+                                                </Setter>
+                                            </Style>
+                                        </syncfusion:SfGridSplitter.PreviewStyle>
+
+                                    </syncfusion:SfGridSplitter>
+
+                                    <dynamicGrid:DynamicTabControl Grid.Row="2" TabStripPlacement="Bottom">
+
+                                        <dynamicGrid:DynamicTabItem x:Name="ActivitiesTab" Header="Activities">
+                                            <local:EmployeeActivityGrid x:Name="Activities" />
+                                        </dynamicGrid:DynamicTabItem>
+
+                                        <dynamicGrid:DynamicTabItem x:Name="FormsTab" Header="Forms">
+                                            <local:EmployeeRoleFormGrid x:Name="Forms" />
+                                        </dynamicGrid:DynamicTabItem>
+
+                                    </dynamicGrid:DynamicTabControl>
+                                </Grid>
+
+                            </dynamicGrid:DynamicTabItem>
+
+                            <dynamicGrid:DynamicTabItem Header="Jobs">
+                                <local:EmployeeJobGrid x:Name="Jobs" />
+                            </dynamicGrid:DynamicTabItem>
+
+                            <dynamicGrid:DynamicTabItem x:Name="QualificationsTab" Header="Qualifications">
+                                <local:EmployeeQualificationGrid x:Name="Qualifications" />
+                            </dynamicGrid:DynamicTabItem>
+
+                            <dynamicGrid:DynamicTabItem x:Name="SpreadsheetsTab" Header="Spreadsheets">
+                                <local:EmployeeSpreadsheetGrid x:Name="Spreadsheets" />
+                            </dynamicGrid:DynamicTabItem>
+
+                        </dynamicGrid:DynamicTabControl>
+                    </dynamicGrid:DynamicSplitPanel.Detail>
+                </dynamicGrid:DynamicSplitPanel>
+            </dynamicGrid:DynamicTabItem>
+            <dynamicGrid:DynamicTabItem Header="Roles" x:Name="RoleCrossTab">
+                <local:EmployeeRoleCrossTab x:Name="EmployeeRoles"/>
+            </dynamicGrid:DynamicTabItem>
+        </dynamicGrid:DynamicTabControl>
     </Grid>
 </UserControl>

+ 31 - 8
prs.desktop/Panels/Employees/EmployeePanel.xaml.cs

@@ -85,7 +85,6 @@ namespace PRSDesktop
 
         public void Setup()
         {
-            
             using (new EventSuppressor(Suppress.Events))
             {
                 DoLoadSettings();
@@ -112,12 +111,34 @@ namespace PRSDesktop
         public void CreateToolbarButtons(IPanelHost host)
         {
         }
-        
-        public void Refresh()
+
+        private void Tab_SelectionChanged(object sender, SelectionChangedEventArgs e)
+        {
+            RefreshCurrentTab();
+        }
+
+        private void RefreshCurrentTab()
+        {
+            if (Tab.SelectedTab == EmployeeTab)
+            {
+                RefreshEmployeeTab();
+            }
+            else if (Tab.SelectedTab == RoleCrossTab)
+            {
+                RefreshRoleTab();
+            }
+        }
+
+        private void RefreshRoleTab()
+        {
+            EmployeeRoles.Refresh(true, true);
+        }
+
+        private void RefreshEmployeeTab()
         {
             Employees.Refresh(false, true);
             Rosters.Refresh(false, true);
-            Teams.Refresh(false,true);
+            Teams.Refresh(false, true);
             Roles.Refresh(false, true);
             Activities.Refresh(false, true);
             Forms.Refresh(false, true);
@@ -126,6 +147,11 @@ namespace PRSDesktop
             Jobs.Refresh(false, true);
         }
 
+        public void Refresh()
+        {
+            RefreshCurrentTab();
+        }
+
         public string SectionName => "Employees";
 
         public DataModel DataModel(Selection selection)
@@ -147,10 +173,7 @@ namespace PRSDesktop
 
         private void Employees_OnOnSelectItem(object sender, DynamicGridSelectionEventArgs e)
         {
-
-            Employee employee = (e.Rows == null) || (e.Rows.Length != 1) 
-                ? new Employee()
-                : e.Rows[0].ToObject<Employee>();
+            var employee = e.Rows?.FirstOrDefault()?.ToObject<Employee>() ?? new Employee();
 
             Rosters.Load(employee, null);
             //Rosters.Refresh(false, true);

+ 61 - 0
prs.desktop/Panels/Employees/EmployeeRoleCrossTab.cs

@@ -0,0 +1,61 @@
+using Comal.Classes;
+using InABox.Configuration;
+using InABox.Core;
+using InABox.DynamicGrid;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace PRSDesktop
+{
+    public class EmployeeRoleCrossTab : DynamicManyToManyCrossTab<EmployeeRole, Employee, Role>
+    {
+        public DynamicGridFilterButtonComponent<Employee> EmployeeFilter { get; init; }
+
+        public DynamicGridFilterButtonComponent<Role> RoleFilter { get; init; }
+
+        public EmployeeRoleCrossTab()
+        {
+            EmployeeFilter = new(this, new GlobalConfiguration<CoreFilterDefinitions>(nameof(Employee))) { ButtonText = "Employees" };
+            RoleFilter = new(this, new GlobalConfiguration<CoreFilterDefinitions>(nameof(Role))) { ButtonText = "Roles" };
+
+            EmployeeFilter.OnFilterRefresh += () => Refresh(false, true);
+            RoleFilter.OnFilterRefresh += () => Refresh(true, true);
+        }
+
+        protected override Filter<Employee>? RowFilter()
+        {
+            return EmployeeFilter.GetFilter();
+        }
+
+        protected override Filter<Role>? ColumnFilter()
+        {
+            return RoleFilter.GetFilter();
+        }
+
+        protected override Columns<Role>? LoadColumnColumns()
+        {
+            return new Columns<Role>(x => x.Code);
+        }
+
+        protected override string FormatColumnHeader(CoreRow row)
+        {
+            return row.Get<Role, string>(x => x.Code);
+        }
+
+        protected override SortOrder<Role>? LoadColumnSort()
+        {
+            return null;
+        }
+
+        protected override DynamicGridColumns LoadRowColumns()
+        {
+            var columns = new DynamicGridColumns();
+            columns.Add<Employee, string>(x => x.Code, 100, "Code", "", Alignment.MiddleLeft);
+            columns.Add<Employee, string>(x => x.Name, 100, "Name", "", Alignment.MiddleLeft);
+            return columns;
+        }
+    }
+}