Bläddra i källkod

Added Auto-launch/shutdown to PRSLogikal interface
Merged Quote and Projects Ribbon Tabs
Finalised Project Planner Orientation settings

frogsoftware 11 månader sedan
förälder
incheckning
b3e7fec7f3

+ 3 - 0
prs.classes/SecurityDescriptors/Desktop_Access.cs

@@ -14,6 +14,7 @@ namespace Comal.Classes.SecurityDescriptors
     /// Entire tab visibility
     /// </summary>
     [Caption("View Desktop Quotes Tab")]
+    [Obsolete("Merged with Projects", true)]
     public class ViewDesktopQuotesTab : EnabledSecurityDescriptor<DesktopAccessLicence>
     {
     }
@@ -32,6 +33,7 @@ namespace Comal.Classes.SecurityDescriptors
     public class ViewDesktopCostSheetsScreen : EnabledSecurityDescriptor<DesktopAccessLicence>
     { 
     }
+    
     #endregion
 
     #region Projects
@@ -59,6 +61,7 @@ namespace Comal.Classes.SecurityDescriptors
     }
 
     [Caption("View Desktop Service Screen")]
+    [Obsolete("Unused, to be replaced with per-job-type configuration", true)]
     public class ViewDesktopServiceScreen : EnabledSecurityDescriptor<DesktopAccessLicence>
     { 
     }

+ 1 - 1
prs.desktop/Components/JobSelector/JobSelector.xaml

@@ -25,7 +25,7 @@
            
             <Syncfusion:CheckListBox Grid.Row="1" Grid.ColumnSpan="3" x:Name="SelectedJobs"
                                      IsSelectAllEnabled="False" IsCheckOnFirstClick="True" DisplayMemberPath="Name"
-                                     Margin="0,2,0,0" 
+                                     Margin="0,4,0,0" Padding="0"
                                      ItemChecked="SelectedJobs_OnItemChecked" />
             
         </Grid>

+ 80 - 116
prs.desktop/MainWindow.xaml

@@ -186,56 +186,7 @@
                     </fluent:BackstageTabControl>
                 </fluent:Backstage>
             </fluent:Ribbon.Menu>
-
-            <fluent:RibbonTabItem x:Name="QuotesTab" Header="Quotes" IsSelected="False" Visibility="Collapsed">
-
-                <fluent:RibbonGroupBox x:Name="QuotesActions" Header="Actions">
-
-                    <fluent:Button Header="Refresh" LargeIcon="pack://application:,,,/Resources/refresh.png"
-                                   Click="RefreshMenu_Click" />
-
-                    <syncfusion:RibbonSeparator />
-
-                    <fluent:Button x:Name="QuotesDashboardButton" Header="Dashboards"
-                                   LargeIcon="pack://application:,,,/Resources/kpi.png" Click="Dashboards_Checked"
-                                   MinWidth="60" />
-                    <fluent:Button x:Name="QuotesMessagesButton" Header="Notification Centre"
-                                   LargeIcon="pack://application:,,,/Resources/email.png"
-                                   Click="Messages_Checked" MinWidth="60" />
-                    <fluent:Button x:Name="QuotesTaskButton" Header="Task List"
-                                   LargeIcon="pack://application:,,,/Resources/kanban.png"
-                                   Click="Tasks_Checked" MinWidth="60" />
-                    <fluent:Button x:Name="QuotesAttendanceButton" Header="In/Out Board"
-                                   LargeIcon="pack://application:,,,/Resources/attendance.png"
-                                   Click="Attendance_Checked" MinWidth="60" />
-                    <fluent:Button x:Name="QuotesMapButton" Header="Live Maps"
-                                   LargeIcon="pack://application:,,,/Resources/map.png" Click="Maps_Checked"
-                                   MinWidth="60" />
-                    <fluent:Button x:Name="QuotesDailyReportButton" Header="Daily Report"
-                                   LargeIcon="pack://application:,,,/Resources/report.png"
-                                   Click="DailyReport_Checked" MinWidth="60" />
-
-                    <syncfusion:RibbonSeparator x:Name="QuotesTaskSeparator" />
-
-                    <fluent:Button x:Name="QuotesButton" Header="Quotes"
-                                   LargeIcon="pack://application:,,,/Resources/quotation.png"
-                                   Click="Quotes_Checked" MinWidth="60" />
-
-                    <syncfusion:RibbonSeparator x:Name="QuotesActionSeparator" />
-
-                    <fluent:Button x:Name="KitsMasterList" Header="Product Kits"
-                                   LargeIcon="pack://application:,,,/Resources/kit.png"
-                                   Click="KitsMasterList_Click" MinWidth="60" />
-                    <fluent:Button x:Name="CostSheetsMasterList" Header="Cost Sheets"
-                                   LargeIcon="pack://application:,,,/Resources/costsheet.png"
-                                   Click="CostSheetsMasterList_Click" MinWidth="60" />
-
-                </fluent:RibbonGroupBox>
-
-                <fluent:RibbonGroupBox x:Name="QuoteReports" Width="Auto" MinWidth="60" Header="Print"/>
-
-            </fluent:RibbonTabItem>
-
+            
             <fluent:RibbonTabItem x:Name="ProjectsTab" Header="Projects" IsSelected="False" Visibility="Collapsed">
 
                 <fluent:RibbonGroupBox x:Name="ProjectsActions" Header="Actions">
@@ -263,15 +214,28 @@
                                    LargeIcon="pack://application:,,,/Resources/report.png"
                                    Click="DailyReport_Checked" MinWidth="60" />
                     <syncfusion:RibbonSeparator x:Name="ProjectTaskSeparator" />
+                    
+                    <fluent:Button x:Name="QuotesButton" Header="Quotes"
+                                   LargeIcon="pack://application:,,,/Resources/quotation.png"
+                                   Click="Quotes_Checked" MinWidth="60" />
+                    
                     <fluent:Button x:Name="ProjectsButton" Header="Projects"
                                    LargeIcon="pack://application:,,,/Resources/project.png"
                                    Click="Jobs_Checked" MinWidth="60" />
-                    <fluent:Button x:Name="ServiceButton" Header="Service"
-                                   LargeIcon="pack://application:,,,/Resources/service.png"
-                                   Click="Service_Checked" MinWidth="60" />
+                    
                     <fluent:Button x:Name="ProjectPlannerButton" Header="Project Planner"
                                    LargeIcon="pack://application:,,,/Resources/calendar.png"
                                    Click="ProjectPlanner_Checked" MinWidth="60" />
+                    
+                </fluent:RibbonGroupBox>
+                
+                <fluent:RibbonGroupBox x:Name="ProjectsSetup" Width="Auto" MinWidth="60" Header="Setup" Visibility="Collapsed">
+                    <fluent:Button x:Name="KitsMasterList" Header="Product Kits"
+                                   LargeIcon="pack://application:,,,/Resources/kit.png"
+                                   Click="KitsMasterList_Click" MinWidth="60" />
+                    <fluent:Button x:Name="CostSheetsMasterList" Header="Cost Sheets"
+                                   LargeIcon="pack://application:,,,/Resources/costsheet.png"
+                                   Click="CostSheetsMasterList_Click" MinWidth="60" />
                 </fluent:RibbonGroupBox>
 
                 <fluent:RibbonGroupBox x:Name="ProjectReports" Width="Auto" MinWidth="60" Header="Print" Visibility="Collapsed"/>
@@ -354,69 +318,7 @@
 
             </fluent:RibbonTabItem>
 
-            <fluent:RibbonTabItem x:Name="LogisticsTab" Header="Logistics" IsSelected="False" Visibility="Collapsed">
-
-                <fluent:RibbonGroupBox x:Name="LogisticsActions" Header="Actions">
-                    <fluent:Button Header="Refresh"
-                                   LargeIcon="pack://application:,,,/Resources/refresh.png"
-                                   Click="RefreshMenu_Click" MinWidth="60" />
-                    <syncfusion:RibbonSeparator />
-                    <fluent:Button x:Name="LogisticsDashboardButton" Header="Dashboards"
-                                   LargeIcon="pack://application:,,,/Resources/kpi.png"
-                                   Click="Dashboards_Checked" MinWidth="60" />
-                    <fluent:Button x:Name="LogisticsMessagesButton" Size="Large"
-                                   Header="Notification Centre"
-                                   LargeIcon="pack://application:,,,/Resources/email.png"
-                                   Click="Messages_Checked" MinWidth="60" />
-                    <fluent:Button x:Name="LogisticsTaskButton" Header="Task List"
-                                   LargeIcon="pack://application:,,,/Resources/kanban.png"
-                                   Click="Tasks_Checked" MinWidth="60" />
-                    <fluent:Button x:Name="LogisticsAttendanceButton" Header="In/Out Board"
-                                   LargeIcon="pack://application:,,,/Resources/attendance.png"
-                                   Click="Attendance_Checked" MinWidth="60" />
-                    <fluent:Button x:Name="LogisticsMapButton" Header="Live Maps"
-                                   LargeIcon="pack://application:,,,/Resources/map.png" Click="Maps_Checked"
-                                   MinWidth="60" />
-                    <fluent:Button x:Name="LogisticsDailyReportButton" Header="Daily Report"
-                                   LargeIcon="pack://application:,,,/Resources/report.png"
-                                   Click="DailyReport_Checked" MinWidth="60" />
-                    <syncfusion:RibbonSeparator x:Name="LogisticsTaskSeparator1" />
-                    <fluent:Button x:Name="ReadyToGoItemsButton" Header="Ready To Go"
-                                   LargeIcon="pack://application:,,,/Resources/truck.png"
-                                   Click="ReadyToGoMenu_Checked" MinWidth="60" />
-                    <fluent:Button x:Name="DispatchButton" Header="Rack List"
-                                   LargeIcon="pack://application:,,,/Resources/barcode.png"
-                                   Click="DispatchMenu_Checked" MinWidth="60" />
-                    <fluent:Button x:Name="RequisitionsButton" Header="Picking Lists"
-                                   LargeIcon="pack://application:,,,/Resources/box.png"
-                                   Click="Requisitions_Checked" MinWidth="60" />
-                    <fluent:Button x:Name="DeliveriesButton" Header="Deliveries"
-                                   LargeIcon="pack://application:,,,/Resources/truck.png"
-                                   Click="DeliveriesButton_Click" MinWidth="60" />
-                    <fluent:Button x:Name="DeliveredItemsButton" Header="Delivered On Site"
-                                   LargeIcon="pack://application:,,,/Resources/lifter.png"
-                                   Click="DeliveredOnSiteMenu_Checked" MinWidth="60" />
-                    <syncfusion:RibbonSeparator x:Name="LogisticsTaskSeparator2" />
-                    <fluent:Button x:Name="ConsignmentButton" Header="Incoming Consignments"
-                                   LargeIcon="pack://application:,,,/Resources/consignment.png"
-                                   Click="ConsignmentButton_Click" MinWidth="60" />
-                </fluent:RibbonGroupBox>
-
-                <fluent:RibbonGroupBox x:Name="LogisticsReports" Width="Auto" MinWidth="60" Header="Print" Visibility="Collapsed"/>
-
-                <!--fluent:RibbonGroupBox x:Name="LogisticsSetup" Width="Auto" Header="Tools"
-                                       IsLauncherVisible="False">
-                    <fluent:Button x:Name="DeliveryTypesButton" Header="Delivery Types"
-                                   LargeIcon="pack://application:,,,/Resources/truck.png"
-                                   Click="DeliveryTypesButton_Click" MinWidth="60" />
-                    <fluent:Button x:Name="ConsignmentTypesButton" Header="Consignment Types"
-                                   LargeIcon="pack://application:,,,/Resources/service.png"
-                                   Click="ConsignmentTypesButton_Click" MinWidth="60" />
-                </fluent:RibbonGroupBox-->
-
-            </fluent:RibbonTabItem>
-
-            <fluent:RibbonTabItem x:Name="ProductTab" Header="Product Management" IsSelected="False"
+            <fluent:RibbonTabItem x:Name="ProductTab" Header="Products" IsSelected="False"
                                   Visibility="Collapsed">
 
                 <fluent:RibbonGroupBox x:Name="ProductActions" Width="Auto" Header="Actions">
@@ -485,6 +387,68 @@
 
             </fluent:RibbonTabItem>
 
+            <fluent:RibbonTabItem x:Name="LogisticsTab" Header="Logistics" IsSelected="False" Visibility="Collapsed">
+
+                <fluent:RibbonGroupBox x:Name="LogisticsActions" Header="Actions">
+                    <fluent:Button Header="Refresh"
+                                   LargeIcon="pack://application:,,,/Resources/refresh.png"
+                                   Click="RefreshMenu_Click" MinWidth="60" />
+                    <syncfusion:RibbonSeparator />
+                    <fluent:Button x:Name="LogisticsDashboardButton" Header="Dashboards"
+                                   LargeIcon="pack://application:,,,/Resources/kpi.png"
+                                   Click="Dashboards_Checked" MinWidth="60" />
+                    <fluent:Button x:Name="LogisticsMessagesButton" Size="Large"
+                                   Header="Notification Centre"
+                                   LargeIcon="pack://application:,,,/Resources/email.png"
+                                   Click="Messages_Checked" MinWidth="60" />
+                    <fluent:Button x:Name="LogisticsTaskButton" Header="Task List"
+                                   LargeIcon="pack://application:,,,/Resources/kanban.png"
+                                   Click="Tasks_Checked" MinWidth="60" />
+                    <fluent:Button x:Name="LogisticsAttendanceButton" Header="In/Out Board"
+                                   LargeIcon="pack://application:,,,/Resources/attendance.png"
+                                   Click="Attendance_Checked" MinWidth="60" />
+                    <fluent:Button x:Name="LogisticsMapButton" Header="Live Maps"
+                                   LargeIcon="pack://application:,,,/Resources/map.png" Click="Maps_Checked"
+                                   MinWidth="60" />
+                    <fluent:Button x:Name="LogisticsDailyReportButton" Header="Daily Report"
+                                   LargeIcon="pack://application:,,,/Resources/report.png"
+                                   Click="DailyReport_Checked" MinWidth="60" />
+                    <syncfusion:RibbonSeparator x:Name="LogisticsTaskSeparator1" />
+                    <fluent:Button x:Name="ReadyToGoItemsButton" Header="Ready To Go"
+                                   LargeIcon="pack://application:,,,/Resources/truck.png"
+                                   Click="ReadyToGoMenu_Checked" MinWidth="60" />
+                    <fluent:Button x:Name="DispatchButton" Header="Rack List"
+                                   LargeIcon="pack://application:,,,/Resources/barcode.png"
+                                   Click="DispatchMenu_Checked" MinWidth="60" />
+                    <fluent:Button x:Name="RequisitionsButton" Header="Picking Lists"
+                                   LargeIcon="pack://application:,,,/Resources/box.png"
+                                   Click="Requisitions_Checked" MinWidth="60" />
+                    <fluent:Button x:Name="DeliveriesButton" Header="Deliveries"
+                                   LargeIcon="pack://application:,,,/Resources/truck.png"
+                                   Click="DeliveriesButton_Click" MinWidth="60" />
+                    <fluent:Button x:Name="DeliveredItemsButton" Header="Delivered On Site"
+                                   LargeIcon="pack://application:,,,/Resources/lifter.png"
+                                   Click="DeliveredOnSiteMenu_Checked" MinWidth="60" />
+                    <syncfusion:RibbonSeparator x:Name="LogisticsTaskSeparator2" />
+                    <fluent:Button x:Name="ConsignmentButton" Header="Incoming Consignments"
+                                   LargeIcon="pack://application:,,,/Resources/consignment.png"
+                                   Click="ConsignmentButton_Click" MinWidth="60" />
+                </fluent:RibbonGroupBox>
+
+                <fluent:RibbonGroupBox x:Name="LogisticsReports" Width="Auto" MinWidth="60" Header="Print" Visibility="Collapsed"/>
+
+                <!--fluent:RibbonGroupBox x:Name="LogisticsSetup" Width="Auto" Header="Tools"
+                                       IsLauncherVisible="False">
+                    <fluent:Button x:Name="DeliveryTypesButton" Header="Delivery Types"
+                                   LargeIcon="pack://application:,,,/Resources/truck.png"
+                                   Click="DeliveryTypesButton_Click" MinWidth="60" />
+                    <fluent:Button x:Name="ConsignmentTypesButton" Header="Consignment Types"
+                                   LargeIcon="pack://application:,,,/Resources/service.png"
+                                   Click="ConsignmentTypesButton_Click" MinWidth="60" />
+                </fluent:RibbonGroupBox-->
+
+            </fluent:RibbonTabItem>
+
             <fluent:RibbonTabItem x:Name="HumanResourcesTab" Header="Human Resources" IsSelected="False"
                                   Visibility="Collapsed">
 

+ 9 - 39
prs.desktop/MainWindow.xaml.cs

@@ -667,7 +667,6 @@ public partial class MainWindow : IPanelHostControl
         var sections = new[]
         {
             new ProgressSection("Configuring Main Screen", SetupMainScreen),
-            new ProgressSection("Configuring Quotes Screen", () => SetupQuotesTab(bMaps)),
             new ProgressSection("Configuring Projects", () => SetupProjectsTab(bMaps)),
             new ProgressSection("Configuring Manufacturing", () => SetupManufacturingTab(bMaps)),
             new ProgressSection("Configuring Logistics", () => SetupLogisticsTab(bMaps)),
@@ -1166,57 +1165,28 @@ public partial class MainWindow : IPanelHostControl
             ClientFactory.IsSupported<TimeSheet, Assignment>() && Security.IsAllowed<CanViewDailyReports>());
 
         SetVisibility(ProjectsButton, Security.CanView<Job>() && Security.IsAllowed<ViewDesktopProjectsScreen>());
-        SetVisibility(ServiceButton, Security.CanView<Job>() && Security.IsAllowed<ViewDesktopServiceScreen>());
+        //SetVisibility(ServiceButton, Security.CanView<Job>() && Security.IsAllowed<ViewDesktopServiceScreen>());
         SetVisibility(ProjectPlannerButton, Security.CanView<Job>() && Security.IsAllowed<ViewDesktopProjectPlannerScreen>());
-
+        
         SetVisibleIfEither(ProjectTaskSeparator,
             new FrameworkElement[]
             {
                             ProjectsDashboardButton, ProjectMessagesButton, ProjectTaskButton, ProjectAttendanceButton, ProjectsMapButton,
                             ProjectDailyReportButton
-            }, new FrameworkElement[] { QuotesButton, ProjectsButton, ServiceButton, ProjectPlannerButton });
-
-
-        //ProjectsActions.IsLauncherButtonVisible = Security.IsAllowed<CanCustomiseModules>();
-        //ProjectReports.IsLauncherButtonVisible = Security.IsAllowed<CanDesignReports>();
-
-        SetTabVisibleIfAny(ProjectsTab, ProjectsButton, ServiceButton, ProjectPlannerButton);
-    }
-
-    private void SetupQuotesTab(bool bMaps)
-    {
-        if (!Security.IsAllowed<ViewDesktopQuotesTab>())
-            return;
-
-        SetVisibility(QuotesDashboardButton, Security.IsAllowed<CanViewUserDefinedDashboards>());
-        SetVisibility(QuotesMessagesButton, Security.CanView<Notification>());
-        SetVisibility(QuotesTaskButton, Security.IsAllowed<CanViewTasks>());
-        SetVisibility(QuotesAttendanceButton, Security.IsAllowed<CanViewInOutBoard>());
-        SetVisibility(QuotesMapButton, bMaps);
-        SetVisibility(QuotesDailyReportButton,
-            ClientFactory.IsSupported<TimeSheet, Assignment>() && Security.IsAllowed<CanViewDailyReports>());
-
+            }, new FrameworkElement[] { QuotesButton, ProjectsButton, ProjectPlannerButton });
+        
         SetVisibility(QuotesButton, Security.CanView<Quote>() && Security.IsAllowed<ViewDesktopQuotesScreen>());
         SetVisibility(KitsMasterList, Security.CanView<Kit>() && Security.IsAllowed<ViewDesktopProductKitsScreen>());
         SetVisibility(CostSheetsMasterList, Security.CanView<CostSheet>() && Security.IsAllowed<ViewDesktopCostSheetsScreen>());
-
-        SetVisibleIfEither(QuotesTaskSeparator,
-            new FrameworkElement[]
-            {
-                            QuotesDashboardButton, QuotesMessagesButton, QuotesTaskButton, QuotesAttendanceButton, QuotesMapButton,
-                            QuotesDailyReportButton
-            }, new FrameworkElement[] { QuotesButton });
+        SetVisibleIfAny(ProjectsSetup, KitsMasterList, CostSheetsMasterList);
 
 
-        SetVisibleIfEither(QuotesActionSeparator, new FrameworkElement[] { QuotesButton },
-            new FrameworkElement[] { KitsMasterList, CostSheetsMasterList });
-
-        SetVisibleIfAny(QuotesActions, QuotesButton, KitsMasterList, CostSheetsMasterList);
+        //ProjectsActions.IsLauncherButtonVisible = Security.IsAllowed<CanCustomiseModules>();
+        //ProjectReports.IsLauncherButtonVisible = Security.IsAllowed<CanDesignReports>();
 
-        SetTabVisibleIfAny(QuotesTab, QuotesActions);
+        SetTabVisibleIfAny(ProjectsTab, QuotesButton, ProjectsButton, ProjectPlannerButton, CostSheetsMasterList, KitsMasterList);
     }
-
-
+    
     private void SetupDock<TSecurityDescriptor>(LayoutAnchorable layout, IDockPanel dock)
         where TSecurityDescriptor : ISecurityDescriptor, new()
     {

+ 216 - 174
prs.desktop/Panels/JobPlanner/JobResourcePlanner.xaml

@@ -1,122 +1,149 @@
-<UserControl x:Class="PRSDesktop.JobResourcePlanner"
-             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
-             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
-             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
-             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
-             xmlns:local="clr-namespace:PRSDesktop"
-             xmlns:Syncfusion="http://schemas.syncfusion.com/wpf"
-             xmlns:dynamicGrid="clr-namespace:InABox.DynamicGrid;assembly=InABox.Wpf"
-             mc:Ignorable="d"
-             d:DesignHeight="800" d:DesignWidth="600">
-      <UserControl.Resources>
+<UserControl 
+    x:Class="PRSDesktop.JobResourcePlanner"
+    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+    xmlns:local="clr-namespace:PRSDesktop"
+    xmlns:Syncfusion="http://schemas.syncfusion.com/wpf"
+    xmlns:dynamicGrid="clr-namespace:InABox.DynamicGrid;assembly=InABox.Wpf"
+    mc:Ignorable="d"
+    d:DesignHeight="800" 
+    d:DesignWidth="600">
+    
+    <UserControl.Resources>
 
-            <Style x:Key="DateHeaderStyle" TargetType="{x:Type Syncfusion:GridHeaderCellControl}">
-                <Setter Property="Background" Value="LightSkyBlue"/>
-                <Setter Property="Foreground" Value="Black"/>
-                <Setter Property="BorderBrush" Value="Black"/>
-                <Setter Property="BorderThickness" Value="0.5,0.5,0.5,0.5"/>
-                <Setter Property="HorizontalContentAlignment" Value="Center"/>
-                <Setter Property="Padding" Value="5,3"/>
-                <Setter Property="FontFamily" Value="Segoe UI"/>
-                <Setter Property="FontSize" Value="14"/>
-                <Setter Property="FontWeight" Value="Normal"/>
-                <Setter Property="IsTabStop" Value="False"/>
-            </Style>
-          <Style x:Key="ContentHeaderStyle" TargetType="{x:Type Syncfusion:GridHeaderCellControl}">
-            <Setter Property="Background" Value="LightSkyBlue"/>
-            <Setter Property="Foreground" Value="Black"/>
-            <Setter Property="BorderBrush" Value="Black"/>
-            <Setter Property="BorderThickness" Value="0.5,0.5,0.5,0.5"/>
-            <Setter Property="HorizontalContentAlignment" Value="Left"/>
-            <Setter Property="Padding" Value="5,3"/>
-            <Setter Property="FontFamily" Value="Segoe UI"/>
-            <Setter Property="FontSize" Value="14"/>
-            <Setter Property="FontWeight" Value="Normal"/>
-            <Setter Property="IsTabStop" Value="False"/>
-            <Setter Property="VerticalContentAlignment" Value="Center"/>
+        <Style x:Key="DateHeaderStyle" TargetType="{x:Type Syncfusion:GridHeaderCellControl}">
+            <Setter Property="Background" Value="LightSkyBlue" />
+            <Setter Property="Foreground" Value="Black" />
+            <Setter Property="BorderBrush" Value="Black" />
+            <Setter Property="BorderThickness" Value="0,0,0.5,0.5" />
+            <Setter Property="HorizontalContentAlignment" Value="Center" />
+            <Setter Property="Padding" Value="5,3" />
+            <Setter Property="IsTabStop" Value="False" />
+        </Style>
+        
+        <Style x:Key="ContentHeaderStyle" TargetType="{x:Type Syncfusion:GridHeaderCellControl}">
+            <Setter Property="Background" Value="LightSkyBlue" />
+            <Setter Property="Foreground" Value="Black" />
+            <Setter Property="BorderBrush" Value="Black" />
+            <Setter Property="BorderThickness" Value="0,0,0.5,0.5" />
+            <Setter Property="HorizontalContentAlignment" Value="Left" />
+            <Setter Property="Padding" Value="5,3" />
+            <Setter Property="IsTabStop" Value="False" />
+            <Setter Property="VerticalContentAlignment" Value="Center" />
+            <Setter Property="Template">
+                <Setter.Value>
+                    <ControlTemplate TargetType="{x:Type Syncfusion:GridHeaderCellControl}">
+                        <Grid>
+                            <Border x:Name="PART_FooterCellBorder" BorderBrush="{TemplateBinding BorderBrush}"
+                                    Background="{TemplateBinding Background}" />
+                            <Border x:Name="PART_HeaderCellBorder" BorderBrush="{TemplateBinding BorderBrush}"
+                                    BorderThickness="{TemplateBinding BorderThickness}"
+                                    Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
+                                <Grid Margin="{TemplateBinding Padding}" SnapsToDevicePixels="True">
+                                    <Grid.ColumnDefinitions>
+                                        <ColumnDefinition Width="*" />
+                                        <ColumnDefinition Width="Auto" />
+                                        <ColumnDefinition Width="Auto" />
+                                    </Grid.ColumnDefinitions>
+                                    <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}"
+                                                      Content="{TemplateBinding Content}"
+                                                      ContentStringFormat="{TemplateBinding ContentStringFormat}"
+                                                      Focusable="False" HorizontalAlignment="Left"
+                                                      VerticalAlignment="Center" />
+                                    <Grid x:Name="PART_SortButtonPresenter" Grid.Column="1" SnapsToDevicePixels="True">
+                                        <Grid.ColumnDefinitions>
+                                            <ColumnDefinition Width="*">
+                                                <ColumnDefinition.MinWidth>
+                                                    <Binding Mode="OneWay" Path="SortDirection"
+                                                             RelativeSource="{RelativeSource TemplatedParent}">
+                                                        <Binding.Converter>
+                                                            <Syncfusion:SortDirectionToWidthConverter />
+                                                        </Binding.Converter>
+                                                    </Binding>
+                                                </ColumnDefinition.MinWidth>
+                                            </ColumnDefinition>
+                                            <ColumnDefinition Width="*" />
+                                        </Grid.ColumnDefinitions>
+                                        <TextBlock Grid.Column="1" Foreground="{TemplateBinding Foreground}"
+                                                   Margin="0,-4,0,0" SnapsToDevicePixels="True"
+                                                   Text="{TemplateBinding SortNumber}"
+                                                   Visibility="{TemplateBinding SortNumberVisibility}"
+                                                   VerticalAlignment="Bottom" />
+                                    </Grid>
+                                    <Syncfusion:FilterToggleButton x:Name="PART_FilterToggleButton" Grid.Column="2"
+                                                                   HorizontalAlignment="Stretch"
+                                                                   SnapsToDevicePixels="True"
+                                                                   Visibility="{TemplateBinding FilterIconVisiblity}"
+                                                                   VerticalAlignment="Stretch" />
+                                    <Border x:Name="PART_FilterPopUpPresenter" />
+                                </Grid>
+                            </Border>
+                        </Grid>
+                    </ControlTemplate>
+                </Setter.Value>
+            </Setter>
+        </Style>
+        
+        <Style x:Key="RotatedHeaderStyle" TargetType="{x:Type Syncfusion:GridHeaderCellControl}">
+            <Setter Property="Background" Value="LightSkyBlue" />
+            <Setter Property="Foreground" Value="Black" />
+            <Setter Property="BorderBrush" Value="Black" />
+            <Setter Property="BorderThickness" Value="0.5,0,0.5,0.5" />
+            <Setter Property="HorizontalContentAlignment" Value="Left" />
+            <Setter Property="Padding" Value="5,3" />
+            <Setter Property="IsTabStop" Value="False" />
+            <Setter Property="VerticalContentAlignment" Value="Center" />
             <Setter Property="Template">
                 <Setter.Value>
                     <ControlTemplate TargetType="{x:Type Syncfusion:GridHeaderCellControl}">
                         <Grid>
                             <Grid.LayoutTransform>
-                                <RotateTransform Angle="270"/>
+                                <RotateTransform Angle="270" />
                             </Grid.LayoutTransform>
-                            <VisualStateManager.VisualStateGroups>
-                                <VisualStateGroup x:Name="HiddenColumnsResizingStates">
-                                    <VisualState x:Name="PreviousColumnHidden">
-                                        <Storyboard>
-                                            <ThicknessAnimationUsingKeyFrames BeginTime="0" Duration="1.0:0:0" Storyboard.TargetProperty="BorderThickness" Storyboard.TargetName="PART_HeaderCellBorder">
-                                                <EasingThicknessKeyFrame KeyTime="0" Value="3,0,1,1"/>
-                                            </ThicknessAnimationUsingKeyFrames>
-                                        </Storyboard>
-                                    </VisualState>
-                                    <VisualState x:Name="HiddenState">
-                                        <Storyboard>
-                                            <ThicknessAnimationUsingKeyFrames BeginTime="0" Duration="1.0:0:0" Storyboard.TargetProperty="BorderThickness" Storyboard.TargetName="PART_HeaderCellBorder">
-                                                <EasingThicknessKeyFrame KeyTime="0" Value="3,0,3,1"/>
-                                            </ThicknessAnimationUsingKeyFrames>
-                                        </Storyboard>
-                                    </VisualState>
-                                    <VisualState x:Name="NormalState"/>
-                                    <VisualState x:Name="LastColumnHidden">
-                                        <Storyboard>
-                                            <ThicknessAnimationUsingKeyFrames BeginTime="0" Duration="1.0:0:0" Storyboard.TargetProperty="BorderThickness" Storyboard.TargetName="PART_HeaderCellBorder">
-                                                <EasingThicknessKeyFrame KeyTime="0" Value="0,0,3,1"/>
-                                            </ThicknessAnimationUsingKeyFrames>
-                                        </Storyboard>
-                                    </VisualState>
-                                </VisualStateGroup>
-                                <VisualStateGroup x:Name="CommonStates">
-                                    <VisualState x:Name="MouseOver"/>
-                                    <VisualState x:Name="Normal"/>
-                                </VisualStateGroup>
-                                <VisualStateGroup x:Name="BorderStates">
-                                    <VisualState x:Name="NormalCell"/>
-                                    <VisualState x:Name="FooterColumnCell">
-                                        <Storyboard BeginTime="0">
-                                            <ThicknessAnimationUsingKeyFrames BeginTime="0" Duration="1.0:0:0" Storyboard.TargetProperty="BorderThickness" Storyboard.TargetName="PART_FooterCellBorder">
-                                                <EasingThicknessKeyFrame KeyTime="0" Value="1,0,1,1"/>
-                                            </ThicknessAnimationUsingKeyFrames>
-                                        </Storyboard>
-                                    </VisualState>
-                                    <VisualState x:Name="BeforeFooterColumnCell">
-                                        <Storyboard BeginTime="0">
-                                            <ThicknessAnimationUsingKeyFrames BeginTime="0" Duration="1.0:0:0" Storyboard.TargetProperty="BorderThickness" Storyboard.TargetName="PART_FooterCellBorder">
-                                                <EasingThicknessKeyFrame KeyTime="0" Value="0,0,0,1"/>
-                                            </ThicknessAnimationUsingKeyFrames>
-                                            <ThicknessAnimationUsingKeyFrames BeginTime="0" Duration="1.0:0:0" Storyboard.TargetProperty="BorderThickness" Storyboard.TargetName="PART_HeaderCellBorder">
-                                                <EasingThicknessKeyFrame KeyTime="0" Value="0,0,0,1"/>
-                                            </ThicknessAnimationUsingKeyFrames>
-                                        </Storyboard>
-                                    </VisualState>
-                                </VisualStateGroup>
-                            </VisualStateManager.VisualStateGroups>
-                            <Border x:Name="PART_FooterCellBorder" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}"/>
-                            <Border x:Name="PART_HeaderCellBorder" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
+                            <Border x:Name="PART_FooterCellBorder" BorderBrush="{TemplateBinding BorderBrush}"
+                                    Background="{TemplateBinding Background}" />
+                            <Border x:Name="PART_HeaderCellBorder" BorderBrush="{TemplateBinding BorderBrush}"
+                                    BorderThickness="{TemplateBinding BorderThickness}"
+                                    Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
                                 <Grid Margin="{TemplateBinding Padding}" SnapsToDevicePixels="True">
                                     <Grid.ColumnDefinitions>
-                                        <ColumnDefinition Width="*"/>
-                                        <ColumnDefinition Width="Auto"/>
-                                        <ColumnDefinition Width="Auto"/>
+                                        <ColumnDefinition Width="*" />
+                                        <ColumnDefinition Width="Auto" />
+                                        <ColumnDefinition Width="Auto" />
                                     </Grid.ColumnDefinitions>
-                                    <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" Focusable="False" HorizontalAlignment="Left" VerticalAlignment="Center"/>
+                                    <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}"
+                                                      Content="{TemplateBinding Content}"
+                                                      ContentStringFormat="{TemplateBinding ContentStringFormat}"
+                                                      Focusable="False" HorizontalAlignment="Left"
+                                                      VerticalAlignment="Center" />
                                     <Grid x:Name="PART_SortButtonPresenter" Grid.Column="1" SnapsToDevicePixels="True">
                                         <Grid.ColumnDefinitions>
                                             <ColumnDefinition Width="*">
                                                 <ColumnDefinition.MinWidth>
-                                                    <Binding Mode="OneWay" Path="SortDirection" RelativeSource="{RelativeSource TemplatedParent}">
+                                                    <Binding Mode="OneWay" Path="SortDirection"
+                                                             RelativeSource="{RelativeSource TemplatedParent}">
                                                         <Binding.Converter>
-                                                            <Syncfusion:SortDirectionToWidthConverter/>
+                                                            <Syncfusion:SortDirectionToWidthConverter />
                                                         </Binding.Converter>
                                                     </Binding>
                                                 </ColumnDefinition.MinWidth>
                                             </ColumnDefinition>
-                                            <ColumnDefinition Width="*"/>
+                                            <ColumnDefinition Width="*" />
                                         </Grid.ColumnDefinitions>
-                                        <TextBlock Grid.Column="1" Foreground="{TemplateBinding Foreground}" FontSize="10" Margin="0,-4,0,0" SnapsToDevicePixels="True" Text="{TemplateBinding SortNumber}" Visibility="{TemplateBinding SortNumberVisibility}" VerticalAlignment="Bottom"/>
+                                        <TextBlock Grid.Column="1" Foreground="{TemplateBinding Foreground}"
+                                                   Margin="0,-4,0,0" SnapsToDevicePixels="True"
+                                                   Text="{TemplateBinding SortNumber}"
+                                                   Visibility="{TemplateBinding SortNumberVisibility}"
+                                                   VerticalAlignment="Bottom" />
                                     </Grid>
-                                    <Syncfusion:FilterToggleButton x:Name="PART_FilterToggleButton" Grid.Column="2" HorizontalAlignment="Stretch" SnapsToDevicePixels="True" Visibility="{TemplateBinding FilterIconVisiblity}" VerticalAlignment="Stretch"/>
-                                    <Border x:Name="PART_FilterPopUpPresenter"/>
+                                    <Syncfusion:FilterToggleButton x:Name="PART_FilterToggleButton" Grid.Column="2"
+                                                                   HorizontalAlignment="Stretch"
+                                                                   SnapsToDevicePixels="True"
+                                                                   Visibility="{TemplateBinding FilterIconVisiblity}"
+                                                                   VerticalAlignment="Stretch" />
+                                    <Border x:Name="PART_FilterPopUpPresenter" />
                                 </Grid>
                             </Border>
                         </Grid>
@@ -124,7 +151,7 @@
                 </Setter.Value>
             </Setter>
         </Style>
-       
+
         <ControlTemplate x:Key="HorizontalSplitter">
             <Grid Background="{TemplateBinding Background}" Height="4">
                 <Grid.ColumnDefinitions>
@@ -155,11 +182,11 @@
         </ControlTemplate>
 
     </UserControl.Resources>
-    
+
     <Grid>
         <Grid.ColumnDefinitions>
             <ColumnDefinition Width="*" />
-            <ColumnDefinition Width="250"/>
+            <ColumnDefinition Width="250" />
         </Grid.ColumnDefinitions>
 
         <Grid.RowDefinitions>
@@ -186,40 +213,39 @@
             CurrentCellActivating="DataGrid_OnCurrentCellActivating"
             PreviewMouseDown="DataGrid_OnPreviewMouseDown"
             PreviewMouseUp="DataGrid_OnPreviewMouseUp"
-            MouseUp="DataGrid_OnMouseUp"
-            >
+            MouseUp="DataGrid_OnMouseUp">
         </Syncfusion:SfDataGrid>
-        
-        <dynamicGrid:DynamicTabControl TabStripPlacement="Bottom" Grid.Column="1"  Margin="5,0,0,0">
+
+        <dynamicGrid:DynamicTabControl TabStripPlacement="Bottom" Grid.Column="1" Margin="5,0,0,0">
 
             <dynamicGrid:DynamicTabItem Header="Assignments">
-                <Grid>
+                <Grid Margin="0,0,0,2">
                     <Grid.ColumnDefinitions>
-                        <ColumnDefinition Width="*"/>
+                        <ColumnDefinition Width="*" />
                     </Grid.ColumnDefinitions>
                     <Grid.RowDefinitions>
-                        <RowDefinition Height="*" x:Name="AvailableEmployeesRow"/>
-                        <RowDefinition Height="Auto"/>
-                        <RowDefinition Height="*"/>
-                        <RowDefinition Height="Auto"/>
+                        <RowDefinition Height="*" x:Name="AvailableEmployeesRow" />
+                        <RowDefinition Height="Auto" />
+                        <RowDefinition Height="*" />
+                        <RowDefinition Height="Auto" />
                     </Grid.RowDefinitions>
-                    
-                    <local:JobPlannerEmployeeGrid 
-                        x:Name="AvailableEmployees" 
-                        Action="Assign" 
-                        Grid.Row="0" 
-                        SizeChanged="AvailableEmployees_OnSizeChanged" 
+
+                    <local:JobPlannerEmployeeGrid
+                        x:Name="AvailableEmployees"
+                        Action="Assign"
+                        Grid.Row="0"
+                        SizeChanged="AvailableEmployees_OnSizeChanged"
                         OnAction="AvailableEmployees_OnOnAction"
-                        AfterRefresh="AvailableEmployees_OnAfterRefresh"/>
-                    
-                    <Syncfusion:SfGridSplitter 
+                        AfterRefresh="AvailableEmployees_OnAfterRefresh" />
+
+                    <Syncfusion:SfGridSplitter
                         Grid.Row="1" Grid.Column="0"
-                        ResizeBehavior="PreviousAndNext" 
-                        Height="4" 
-                        HorizontalAlignment="Stretch" 
-                        VerticalContentAlignment="Center" 
+                        ResizeBehavior="PreviousAndNext"
+                        Height="4"
+                        HorizontalAlignment="Stretch"
+                        VerticalContentAlignment="Center"
                         VerticalAlignment="Center"
-                        Background="Transparent" 
+                        Background="Transparent"
                         Template="{StaticResource HorizontalSplitter}">
 
                         <Syncfusion:SfGridSplitter.PreviewStyle>
@@ -238,17 +264,17 @@
                         </Syncfusion:SfGridSplitter.PreviewStyle>
 
                     </Syncfusion:SfGridSplitter>
-                    
-                    <local:JobPlannerEmployeeGrid 
-                        x:Name="AssignedEmployees" 
-                        Action="Remove" 
-                        Grid.Row="2" 
+
+                    <local:JobPlannerEmployeeGrid
+                        x:Name="AssignedEmployees"
+                        Action="Remove"
+                        Grid.Row="2"
                         OnAction="AssignedEmployees_OnOnAction"
-                        AfterRefresh="AssignedEmployees_OnAfterRefresh"/>
-                    
+                        AfterRefresh="AssignedEmployees_OnAfterRefresh" />
+
                     <DockPanel Grid.Row="3" Margin="0,5,0,0">
                         <Label Content="Activity" DockPanel.Dock="Left" VerticalContentAlignment="Center" />
-                        <ComboBox x:Name="ActivityType" DockPanel.Dock="Left" Margin="5,0,0,0" 
+                        <ComboBox x:Name="ActivityType" DockPanel.Dock="Left" Margin="5,0,0,0"
                                   SelectionChanged="ActivityType_OnSelectionChanged" VerticalContentAlignment="Center"
                                   SelectedValuePath="ID" DisplayMemberPath="Name">
                         </ComboBox>
@@ -256,37 +282,41 @@
 
                 </Grid>
             </dynamicGrid:DynamicTabItem>
-            
+
             <dynamicGrid:DynamicTabItem Header="Settings">
-                <Grid>
+                <Grid Margin="0,0,0,2">
                     <Grid.ColumnDefinitions>
-                        <ColumnDefinition Width="Auto"/>
-                        <ColumnDefinition Width="*"/>
+                        <ColumnDefinition Width="Auto" />
+                        <ColumnDefinition Width="*" />
                     </Grid.ColumnDefinitions>
                     <Grid.RowDefinitions>
-                        <RowDefinition Height="300" x:Name="TeamSelectorRow"/>
-                        <RowDefinition Height="Auto"/> 
-                        <RowDefinition Height="*"/>
-                        <RowDefinition Height="Auto"/>
-                        <RowDefinition Height="Auto"/>
-                        <RowDefinition Height="Auto"/>
+                        <RowDefinition Height="300" x:Name="TeamSelectorRow" />
+                        <RowDefinition Height="Auto" />
+                        <RowDefinition Height="*" />
+                        <RowDefinition Height="Auto" />
+                        <RowDefinition Height="Auto" />
+                        <RowDefinition Height="Auto" />
+                        <RowDefinition Height="Auto" />
                     </Grid.RowDefinitions>
-                    
+
                     <DockPanel Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2">
-                        <Border BorderBrush="Black" BorderThickness="0.75,0.75,0.75,0" DockPanel.Dock="Top" Background="Gainsboro" Padding="0">
-                            <Label Content="Employees" HorizontalAlignment="Center" Margin="-2"/>
+                        <Border BorderBrush="Black" BorderThickness="0.75,0.75,0.75,0" DockPanel.Dock="Top"
+                                Background="Gainsboro" Padding="0">
+                            <Label Content="Employees" HorizontalAlignment="Center" Margin="-2" />
                         </Border>
-                        <local:TeamSelector x:Name="TeamSelector" DockPanel.Dock="Top" SettingsChanged="TeamSelector_OnSettingsChanged" SelectionChanged="TeamSelector_OnSelectionChanged"/>
+                        <local:TeamSelector x:Name="TeamSelector" DockPanel.Dock="Top"
+                                            SettingsChanged="TeamSelector_OnSettingsChanged"
+                                            SelectionChanged="TeamSelector_OnSelectionChanged" />
                     </DockPanel>
-                    
-                    <Syncfusion:SfGridSplitter 
-                        Grid.Row="1" 
-                        Grid.Column="0" 
+
+                    <Syncfusion:SfGridSplitter
+                        Grid.Row="1"
+                        Grid.Column="0"
                         Grid.ColumnSpan="2"
                         ResizeBehavior="PreviousAndNext"
                         Height="4"
-                        HorizontalAlignment="Stretch" 
-                        VerticalContentAlignment="Center" 
+                        HorizontalAlignment="Stretch"
+                        VerticalContentAlignment="Center"
                         VerticalAlignment="Center"
                         Background="Transparent"
                         Template="{StaticResource HorizontalSplitter}">
@@ -308,46 +338,58 @@
 
                     </Syncfusion:SfGridSplitter>
 
-                    <local:JobSelector 
-                        x:Name="JobSelector" 
-                        Grid.Row="2" 
-                        Grid.Column="0" 
-                        Grid.ColumnSpan="2" 
-                        SettingsChanged="JobSelector_OnSettingsChanged" 
+                    <local:JobSelector
+                        x:Name="JobSelector"
+                        Grid.Row="2"
+                        Grid.Column="0"
+                        Grid.ColumnSpan="2"
+                        SettingsChanged="JobSelector_OnSettingsChanged"
                         SelectionChanged="JobSelector_OnSelectionChanged"
-                        SizeChanged="JobSelector_OnSizeChanged"/>
-                    
+                        SizeChanged="JobSelector_OnSizeChanged" />
+
                     <Label Content="Window" Grid.Row="3" VerticalContentAlignment="Center" Margin="0,5,0,0" Height="25" />
-                    <ComboBox x:Name="ViewWindow" Grid.Row="3" Grid.Column="1" Margin="5,5,0,0" 
+                    <ComboBox x:Name="ViewWindow" Grid.Row="3" Grid.Column="1" Margin="5,5,0,0"
                               SelectionChanged="ViewWindow_OnSelectionChanged" VerticalContentAlignment="Center"
                               SelectedValuePath="Key" DisplayMemberPath="Value">
                     </ComboBox>
-                    
-                    <Label Content="Hrs / Day" Grid.Row="4" VerticalContentAlignment="Center" Margin="0,5,0,0" Height="25" />
+
+                    <Label Content="Hrs / Day" Grid.Row="4" VerticalContentAlignment="Center" Margin="0,5,0,0"
+                           Height="25" />
                     <DockPanel Grid.Row="4" Grid.Column="1" Margin="5,5,0,0">
                         <Button DockPanel.Dock="Left" Padding="2" BorderThickness="0.75,0.75,0,0.75" Background="White"
                                 BorderBrush="Gray" Click="HoursSelector_Down_Click">
                             <Image Source="pack://application:,,,/Resources/leftarrow.png" Height="20" Width="20" />
                         </Button>
-                        <Button DockPanel.Dock="Right" Padding="2" BorderThickness="0,0.75,0.75,0.75" Background="White"
+                        <Button DockPanel.Dock="Right" Padding="2" BorderThickness="0,0.75,0.75,0.75"
+                                Background="White"
                                 BorderBrush="Gray" Click="HoursSelector_Up_Click">
                             <Image Source="pack://application:,,,/Resources/rightarrow.png" Height="20" Width="20" />
                         </Button>
-                        <TextBox x:Name="HoursSelector" IsReadOnly="True" DockPanel.Dock="Left" BorderThickness="0,0.75,0,0.75"
-                                 BorderBrush="Gray" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" />
+                        <TextBox x:Name="HoursSelector" IsReadOnly="True" DockPanel.Dock="Left"
+                                 BorderThickness="0,0.75,0,0.75"
+                                 BorderBrush="Gray" HorizontalContentAlignment="Center"
+                                 VerticalContentAlignment="Center" />
                     </DockPanel>
-                    
-                    <Label Content="Leave" Margin="0,5,0,0" VerticalContentAlignment="Center" Grid.Row="5"/>
-                    <ComboBox x:Name="LeaveType" Margin="5,5,0,0" SelectionChanged="LeaveType_OnSelectionChanged" VerticalContentAlignment="Center" Grid.Row="5" Grid.Column="1">
+
+                    <Label Content="Leave" Margin="0,5,0,0" VerticalContentAlignment="Center" Grid.Row="5" />
+                    <ComboBox x:Name="LeaveType" Margin="5,5,0,0" SelectionChanged="LeaveType_OnSelectionChanged"
+                              VerticalContentAlignment="Center" Grid.Row="5" Grid.Column="1">
                         <ComboBoxItem Content="Approved Only" />
                         <ComboBoxItem Content="Show All" />
                     </ComboBox>
-                
+
+                    <Label Content="Orientation" Margin="0,5,0,0" VerticalContentAlignment="Center" Grid.Row="6" />
+                    <ComboBox x:Name="Orientation" Margin="5,5,0,0" SelectionChanged="Orientation_OnSelectionChanged"
+                              VerticalContentAlignment="Center" Grid.Row="6" Grid.Column="1">
+                        <ComboBoxItem Content="Horizontal" />
+                        <ComboBoxItem Content="Vertical" />
+                    </ComboBox>
+
                 </Grid>
             </dynamicGrid:DynamicTabItem>
-            
-        </dynamicGrid:DynamicTabControl>    
+
+        </dynamicGrid:DynamicTabControl>
 
     </Grid>
 
-</UserControl>
+</UserControl>

+ 85 - 62
prs.desktop/Panels/JobPlanner/JobResourcePlanner.xaml.cs

@@ -29,6 +29,11 @@ using NPOI.OpenXmlFormats.Spreadsheet;
 
 namespace PRSDesktop;
 
+public enum JobPlannerDisplayMode
+{
+    JobColumns,
+    DateColumns
+}
 
 public class JobResourcePlannerProperties : IUserConfigurationSettings, IDashboardProperties
 {
@@ -45,7 +50,8 @@ public class JobResourcePlannerProperties : IUserConfigurationSettings, IDashboa
     public double HoursPerDay { get; set; }
     public double EmployeeSplitterPosition { get; set; }
     public bool IncludeUnApprovedLeave { get; set; }
-
+    public JobPlannerDisplayMode DisplayMode { get; set; }
+    
     public JobResourcePlannerProperties()
     {
         JobSettings = new JobSelectorSettings();
@@ -58,28 +64,12 @@ public class JobResourcePlannerProperties : IUserConfigurationSettings, IDashboa
         HoursPerDay = 8.5;
         ActivityType = Guid.Empty;
         IncludeUnApprovedLeave = false;
-    }
-}
-
-public enum JobPlannerDisplayMode
-{
-    JobColumns,
-    DateColumns
-}
-
-public class JobResourcePlannerSettings : BaseObject, IGlobalConfigurationSettings
-{
-    [EnumLookupEditor(typeof(JobPlannerDisplayMode))]
-    [EditorSequence(1)]
-    public JobPlannerDisplayMode DisplayMode { get; set; }
-
-    public JobResourcePlannerSettings()
-    {
         DisplayMode = JobPlannerDisplayMode.DateColumns;
     }
 }
 
-public partial class JobResourcePlanner : UserControl, IPropertiesPanel<JobResourcePlannerSettings>
+
+public partial class JobResourcePlanner : UserControl
 {
     private enum Suppress
     {
@@ -103,18 +93,10 @@ public partial class JobResourcePlanner : UserControl, IPropertiesPanel<JobResou
     public JobResourcePlannerProperties Properties { get; set; }
     public event LoadSettings<JobResourcePlannerProperties>? LoadSettings;
     public event SaveSettings<JobResourcePlannerProperties>? SaveSettings;
-
-    JobResourcePlannerSettings IPropertiesPanel<JobResourcePlannerSettings>.Properties
-    {
-        get => Settings;
-        set => Settings = value;
-    }
-
-    private JobResourcePlannerSettings Settings { get; set; }
-
+    
     private void DoLoadSettings()
     {
-        Properties = LoadSettings?.Invoke(this);
+        Properties = LoadSettings?.Invoke(this) ?? new JobResourcePlannerProperties();
     }      
     
     private void DoSaveSettings()
@@ -162,7 +144,7 @@ public partial class JobResourcePlanner : UserControl, IPropertiesPanel<JobResou
             HoursSelector.Text = $"{Properties.HoursPerDay:F2}";
             
             LeaveType.SelectedIndex = Properties.IncludeUnApprovedLeave ? 1 : 0;
-            
+            Orientation.SelectedIndex = Properties.DisplayMode == JobPlannerDisplayMode.JobColumns ? 1 : 0;
             AvailableEmployees.Refresh(true, false);
             AssignedEmployees.Refresh(true, false);
             
@@ -370,8 +352,9 @@ public partial class JobResourcePlanner : UserControl, IPropertiesPanel<JobResou
             _totals = totals;
             _available = available;
 
-            if(Settings.DisplayMode == JobPlannerDisplayMode.JobColumns)
+            if(Properties.DisplayMode == JobPlannerDisplayMode.JobColumns)
             {
+                dataGrid.HeaderRowHeight = 200;
                 data.Columns.Add("Date", typeof(DateTime));
                 
                 data.Columns.Add("Available", typeof(object));
@@ -393,8 +376,9 @@ public partial class JobResourcePlanner : UserControl, IPropertiesPanel<JobResou
                     data.Rows.Add(values.ToArray());
                 }
             }
-            else if(Settings.DisplayMode == JobPlannerDisplayMode.DateColumns)
+            else if(Properties.DisplayMode == JobPlannerDisplayMode.DateColumns)
             {
+                dataGrid.HeaderRowHeight = 30;
                 data.Columns.Add("Job", typeof(object));
 
                 var availableRow = new List<object?> { "Available" };
@@ -459,9 +443,11 @@ public partial class JobResourcePlanner : UserControl, IPropertiesPanel<JobResou
 
     private int? GetDateIndex(ICellWrapper cell)
     {
-        if(Settings.DisplayMode == JobPlannerDisplayMode.JobColumns)
+        if(Properties.DisplayMode == JobPlannerDisplayMode.JobColumns)
         {
-            return _dates.IndexOf((DateTime)cell.Row.Row.ItemArray.First()!);
+            if (cell?.Row?.Row?.ItemArray?.First() is DateTime dt)
+                return _dates.IndexOf(dt);
+            return null;
         }
         else
         {
@@ -483,17 +469,11 @@ public partial class JobResourcePlanner : UserControl, IPropertiesPanel<JobResou
     }
     private double? GetAvailable(ICellWrapper cell)
     {
-        if(Settings.DisplayMode == JobPlannerDisplayMode.JobColumns)
+        if(Properties.DisplayMode == JobPlannerDisplayMode.JobColumns)
         {
-            var avail = cell.Row["Available"];
-            if(avail is double d)
-            {
+            if (cell?.Row?.Row?.Table?.Columns?.Contains("Available") == true && cell.Row["Available"] is double d)
                 return d;
-            }
-            else
-            {
-                return null;
-            }
+            return null;
         }
         else
         {
@@ -580,7 +560,7 @@ public partial class JobResourcePlanner : UserControl, IPropertiesPanel<JobResou
         }
         else if (value.Path.Path.Equals("Job"))
         {
-            e.Column.Width = 200;
+            e.Column.Width = 250;
             e.Column.HeaderStyle = Resources["DateHeaderStyle"] as Style;
             e.Column.AllowFocus = false;
             e.Column.TextAlignment = TextAlignment.Left;
@@ -589,12 +569,13 @@ public partial class JobResourcePlanner : UserControl, IPropertiesPanel<JobResou
                 Path = new PropertyPath(e.Column.MappingName),
                 Converter = new FuncConverter<object?, object?>(x => x is JobModel job ? job.Name : x)
             };
+            e.Column.HeaderText = "Project Name";
         }
         else if (value.Path.Path.Equals("Available"))
         {
             e.Column = new GridNumericColumn() { NumberDecimalDigits = 2, MappingName = e.Column.MappingName};
             e.Column.Width = 50;
-            e.Column.HeaderStyle = e.Column.HeaderStyle = Resources["ContentHeaderStyle"] as Style;
+            e.Column.HeaderStyle = e.Column.HeaderStyle = Resources["RotatedHeaderStyle"] as Style;
             e.Column.AllowFocus = false;
             e.Column.HeaderText = "Available";
         }
@@ -602,20 +583,23 @@ public partial class JobResourcePlanner : UserControl, IPropertiesPanel<JobResou
         {
 
             e.Column = new GridNumericColumn() { NumberDecimalDigits = 2, MappingName = e.Column.MappingName};
-            e.Column.Width = 40;
-            e.Column.HeaderStyle = Resources["ContentHeaderStyle"] as Style;
-
-            if(Settings.DisplayMode == JobPlannerDisplayMode.JobColumns)
+            
+            
+            if(Properties.DisplayMode == JobPlannerDisplayMode.JobColumns)
             {
+                e.Column.Width = 40;
+                e.Column.HeaderStyle = Resources["RotatedHeaderStyle"] as Style;
                 e.Column.HeaderText = (Guid.TryParse(value.Path.Path, out var id)
                     ? _jobs.FirstOrDefault(x => x.ID == id)?.Name ?? value.Path.Path
                     : value.Path.Path);
             }
             else
             {
+                e.Column.Width = 50;
+                e.Column.HeaderStyle = Resources["ContentHeaderStyle"] as Style;
                 if(int.TryParse(value.Path.Path, out var idx))
                 {
-                    e.Column.HeaderText = _dates[idx].ToString("dd/MM/yyyy");
+                    e.Column.HeaderText = _dates[idx].ToString("dd/MM");
                 }
             }
 
@@ -625,9 +609,10 @@ public partial class JobResourcePlanner : UserControl, IPropertiesPanel<JobResou
             style.Setters.Add(new Setter(BackgroundProperty, CreateBinding<LeaveBackgroundConverter>(value.Path.Path, new(this))));
             style.Setters.Add(new Setter(ForegroundProperty, CreateBinding<LeaveForegroundConverter>(value.Path.Path, new(this))));
             e.Column.CellStyle = style;
+            e.Column.TextAlignment = TextAlignment.Center;
+            e.Column.HorizontalHeaderContentAlignment = HorizontalAlignment.Center;        
         }
-        e.Column.TextAlignment = TextAlignment.Center;
-        e.Column.HorizontalHeaderContentAlignment = HorizontalAlignment.Center;
+
         e.Column.ColumnSizer = GridLengthUnitType.None;
         e.Column.ShowHeaderToolTip = false;
         e.Column.ShowToolTip = false;
@@ -640,7 +625,15 @@ public partial class JobResourcePlanner : UserControl, IPropertiesPanel<JobResou
     
     private void DataGrid_OnSelectionChanging(object? sender, GridSelectionChangingEventArgs e)
     {
-         
+        var selected = dataGrid.SelectionController.SelectedCells;
+        var added = e.AddedItems.OfType<GridCellInfo>();
+        if (selected.Any() && added.Any())
+        {
+            if (Properties.DisplayMode == JobPlannerDisplayMode.JobColumns)
+                e.Cancel = added.Any(a => selected.All(s => s.Column != a.Column));
+            else
+                e.Cancel = selected.Union(added).GroupBy(x => x.Column).Any(g => g.Count() > 1);
+        }
     }
     
     private bool bResettingSelection = false;
@@ -658,12 +651,29 @@ public partial class JobResourcePlanner : UserControl, IPropertiesPanel<JobResou
             bResettingSelection = false;
             return;
         }
-        var thiscol = dataGrid.Columns[e.CurrentRowColumnIndex.ColumnIndex];
-        var selected = dataGrid.SelectionController.SelectedCells;
-        if (selected.Any(x => x.Column != thiscol))
-            e.Cancel = true;
-        else
-            e.Cancel = false;
+
+        // if (Properties.DisplayMode == JobPlannerDisplayMode.JobColumns)
+        // {
+        //     var thiscol = dataGrid.Columns[e.CurrentRowColumnIndex.ColumnIndex];
+        //     var selected = dataGrid.SelectionController.SelectedCells;
+        //     if (selected.Any(x => x.Column != thiscol))
+        //         e.Cancel = true;
+        //     else 
+        //         e.Cancel = false;
+        //     
+        // }
+        // else
+        // {
+        //     var current = e.CurrentRowColumnIndex.RowIndex;
+        //     var original = dataGrid.SelectionController.SelectedCells;
+        //     // This is Dumb, but it seems the only way to find if multiple rows have been selected
+        //     // ie if there are two cells with the same column, we must have multiple rows
+        //     // Stupid SelectedCell -> RowIndex is alwasy showing up as -1!
+        //     if (original.GroupBy(x => x.Column).Any(g=>g.Count() > 1))
+        //          e.Cancel = true;
+        //     else
+        //         e.Cancel = false;
+        // }
     }
     
     private void DataGrid_OnPreviewMouseUp(object sender, MouseButtonEventArgs e)
@@ -675,7 +685,7 @@ public partial class JobResourcePlanner : UserControl, IPropertiesPanel<JobResou
     {
         result = (Guid.Empty, DateTime.MinValue);
 
-        if(Settings.DisplayMode == JobPlannerDisplayMode.JobColumns)
+        if(Properties.DisplayMode == JobPlannerDisplayMode.JobColumns)
         {
             if (Guid.TryParse(cell.ColumnName, out var emp))
             {
@@ -1014,7 +1024,7 @@ public partial class JobResourcePlanner : UserControl, IPropertiesPanel<JobResou
                                     }
                                 }
                             }
-                            if(Settings.DisplayMode == JobPlannerDisplayMode.JobColumns)
+                            if(Properties.DisplayMode == JobPlannerDisplayMode.JobColumns)
                             {
                                 System.Data.DataRow row = table.Rows[dateIdx];
                                 row.BeginEdit();
@@ -1109,7 +1119,7 @@ public partial class JobResourcePlanner : UserControl, IPropertiesPanel<JobResou
                         && employees.Any(e => e.ID == x.EmployeeID)
                     ).ToArray();
                     var emptime = emptimes.Aggregate(TimeSpan.Zero, (time, ass) => time += ass.BookedDuration);
-                    if(Settings.DisplayMode == JobPlannerDisplayMode.JobColumns)
+                    if(Properties.DisplayMode == JobPlannerDisplayMode.JobColumns)
                     {
                         System.Data.DataRow row = table.Rows[dateIdx];
                         row.BeginEdit();
@@ -1200,6 +1210,18 @@ public partial class JobResourcePlanner : UserControl, IPropertiesPanel<JobResou
         DoSaveSettings();
         Refresh();
     }
+    
+    
+    private void Orientation_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
+    {
+        if (EventSuppressor.IsSet(Suppress.This))
+            return;
+        Properties.DisplayMode = Orientation.SelectedIndex <= 0
+            ? JobPlannerDisplayMode.DateColumns
+            : JobPlannerDisplayMode.JobColumns;
+        DoSaveSettings();
+        Refresh();
+    }
 
     private void AvailableEmployees_OnAfterRefresh(object sender, AfterRefreshEventArgs args)
     {
@@ -1210,4 +1232,5 @@ public partial class JobResourcePlanner : UserControl, IPropertiesPanel<JobResou
     {
         AssignedEmployees.Items = AssignedEmployees.Items.OrderBy(x => x.Name).ToList();
     }
+
 }

+ 20 - 6
prs.desktop/Setups/QuoteSetupActions.cs

@@ -6,6 +6,8 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using InABox.Core;
+using InABox.WPF;
 
 namespace PRSDesktop;
 
@@ -13,11 +15,19 @@ public static class QuoteSetupActions
 {
     public static void Standard(IPanelHost host)
     {
-        host.CreateSetupActionIf<CanModifyQuoteStatuses>("Status Codes", PRSDesktop.Resources.quotestatus, (action) =>
-        {
-            var list = new MasterList(typeof(QuoteStatus));
-            list.ShowDialog();
-        });
+        if (Security.CanView<Kit>())
+            host.CreateSetupAction("Product Kits", PRSDesktop.Resources.kit, (action) =>
+                {
+                    
+                });
+        
+
+        
+                                                    host.CreateSetupActionIf<CanModifyQuoteStatuses>("Status Codes", PRSDesktop.Resources.quotestatus, (action) =>
+                                                    {
+                                                        var list = new MasterList(typeof(QuoteStatus));
+                                                        list.ShowDialog();
+                                                    });
         host.CreateSetupActionIfCanView<QuoteDesignSection>("Design Sections", PRSDesktop.Resources.design, (action) =>
         {
             var list = new MasterList(typeof(QuoteDesignSection));
@@ -51,8 +61,12 @@ public static class QuoteSetupActions
             var list = new MasterList(typeof(CostSheetSection));
             list.ShowDialog();
         });
+        
 
-        host.CreateSetupSeparator();
+            
+
+
+                                                    host.CreateSetupSeparator();
 
         host.CreateSetupActionIfCanView<QuoteDiagramSymbol>("Symbols", PRSDesktop.Resources.pencil, (action) =>
         {

+ 9 - 36
prs.desktop/Utils/LogikalUtils/LogikalClient.cs

@@ -7,8 +7,11 @@ using H.Pipes;
 using InABox.Core;
 using InABox.IPC;
 using InABox.Logikal;
+using java.lang;
+using Exception = System.Exception;
+using Process = System.Diagnostics.Process;
 
-namespace PRSDesktop.Utils.LogikalUtils;
+namespace PRSDesktop;
 
 public class LogikalClient : IDisposable, ILogikalApp
 {
@@ -19,10 +22,13 @@ public class LogikalClient : IDisposable, ILogikalApp
     private ConcurrentDictionary<Guid, LogikalMessage> Responses = new();
 
     private const int DefaultRequestTimeout = 5 * 60 * 1000; // 5 minutes
-
     
     public LogikalClient()
     {
+        var _basedirectory = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) ?? "";
+        var _logikalapp = System.IO.Path.Combine(_basedirectory, "PRSLogikal", "PRSLogikal.exe");
+        Process.Start(_logikalapp);
+        
         _client = new PipeClient<LogikalMessage>("$logikal", formatter: new NewtonsoftJsonFormatter());
         
         _client.Connected += Client_Connected;
@@ -150,37 +156,4 @@ public class LogikalClient : IDisposable, ILogikalApp
         var result = Send(request);
         return result.Status;
     }
-}
-
-/*
-public class IPCClientTransport : IDisposable
-    {
-
-
-
-        public delegate void ConnectEvent();
-        public delegate void DisconnectEvent();
-
-        /// <summary>
-        /// A handler for any requests pushed from the server, i.e., not initialised by the client.
-        /// </summary>
-        public delegate void PushEvent(IPCMessage request);
-
-        public bool Disconnected { get; private set; }
-
-        public event ConnectEvent? OnConnect;
-        public event DisconnectEvent? OnDisconnect;
-        public event PushEvent? OnPush;
-
-        public IPCClientTransport(string pipeName)
-        {
-            Client = new PipeClient<IPCMessage>(pipeName, formatter:new BinaryFormatter());
-            
-        }
-
-       
-
-
-        
-    }
-*/
+}

+ 2 - 1
prs.desktop/prsdesktop.iss

@@ -8,7 +8,7 @@
 #define public Dependency_Path_NetCoreCheck "dependencies\"
 
 #define MyAppName "PRS Desktop"
-#define MyAppVersion "8.09"
+#define MyAppVersion "8.10"
 #define MyAppPublisher "PRS Digital"
 #define MyAppURL "https://www.prs-software.com.au"
 #define MyAppExeName "PRSDesktop.exe"
@@ -51,6 +51,7 @@ Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{
 Source: "{#Dependency_Path_NetCoreCheck}netcorecheck.exe"; Flags: dontcopy noencryption
 Source: "{#Dependency_Path_NetCoreCheck}netcorecheck_x64.exe"; Flags: dontcopy noencryption
 Source: "bin\Debug\net8.0-windows\*"; DestDir: "{app}"; Excludes: "version.txt"; Flags: ignoreversion recursesubdirs createallsubdirs; AfterInstall: UpdateVersionNumber
+Source: "..\prs.logikal\bin\Debug\*"; DestDir: "{app}\PRSLogikal"; Flags: ignoreversion recursesubdirs createallsubdirs;
 
 [Dirs]
 Name: "{userappdata}\PRSDesktop"; Flags: 

+ 1 - 1
prs.licensing/PRSLicensing.iss

@@ -8,7 +8,7 @@
 #define public Dependency_Path_NetCoreCheck "dependencies\"
 
 #define MyAppName "PRS Licensing"
-#define MyAppVersion "8.09"
+#define MyAppVersion "8.10"
 #define MyAppPublisher "PRS Digital"
 #define MyAppURL "https://www.prs-software.com.au"
 #define MyAppExeName "PRSLicensing.exe"

+ 14 - 1
prs.logikal/App.xaml.cs

@@ -1,9 +1,22 @@
-namespace PRSLogikal
+using System.Diagnostics;
+using System.Windows;
+
+namespace PRSLogikal
 {
     /// <summary>
     /// Interaction logic for App.xaml
     /// </summary>
     public partial class App
     {
+        protected override void OnStartup(StartupEventArgs e)
+        {
+            
+            string _procName = Process.GetCurrentProcess().ProcessName;
+            Process[] _processes=Process.GetProcessesByName(_procName);
+            if (_processes.Length > 1)
+                Shutdown(0);
+            
+            base.OnStartup(e);
+        }
     }
 }

+ 4 - 0
prs.logikal/LogikalListener.cs

@@ -13,6 +13,8 @@ namespace PRSLogikal
 
         public event LogikalLogEvent Log;
         
+        public event EventHandler Disconnecting; 
+        
         public LogikalListener()
         {
             _server = new PipeServer<LogikalMessage>("$logikal", formatter: new NewtonsoftJsonFormatter());
@@ -70,6 +72,8 @@ namespace PRSLogikal
                 Status = Server.Logout()
             };
             _server.WriteAsync(_response.ToMessage());
+                   
+            Disconnecting?.Invoke(this,EventArgs.Empty);
         }
         
         private void Login(LogikalLoginRequest request)

+ 10 - 1
prs.logikal/LogikalServer.cs

@@ -1,6 +1,8 @@
 using System;
 using System.Collections.Generic;
 using System.Dynamic;
+using System.Windows;
+using System.Windows.Threading;
 using InABox.Logikal;
 using Ofcas.Lk.Api.Client.Core;
 using Ofcas.Lk.Api.Shared;
@@ -27,6 +29,8 @@ namespace PRSLogikal
         //private readonly List<String> _log = new List<String>();
         //public String[] Log => _log.ToArray();
 
+
+        
         public event LogikalLogEvent Log;
         private void DoLog(String message) => Log?.Invoke(this, new LogikalLogArguments(message));
         
@@ -60,10 +64,15 @@ namespace PRSLogikal
             }
 
             _proxy = null;
-            
+
             return LogikalStatus.Ok;
         }
 
+        private void DoOnDisconnecting()
+        {
+            
+        }
+
         public LogikalStatus Login(string username, string password)
         {
             Dictionary<string, object> _parameters = new Dictionary<string, object>()

+ 1 - 1
prs.logikal/MainWindow.xaml

@@ -23,7 +23,7 @@
     
         <Button Grid.Row="0" Grid.Column="0" x:Name="_connect" Content="Connect" Click="_connect_OnClick" IsEnabled="True"/>
         <TextBox Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="2" x:Name="_path" Text="l:\logikalstarter.exe" Margin="5,0,0,0" IsEnabled="True" VerticalContentAlignment="Center"/>
-        <Button Grid.Row="0" Grid.Column="3"  x:Name="_disconnect" Content="Disonnect" Margin="5,0,0,0" Click="_disconnect_OnClick" IsEnabled="False"/>
+        <Button Grid.Row="0" Grid.Column="3"  x:Name="_disconnect" Content="Disconnect" Margin="5,0,0,0" Click="_disconnect_OnClick" IsEnabled="False"/>
         
         <Button Grid.Row="1" Grid.Column="0"  x:Name="_login" Content="Login" Margin="0,5,0,0" Click="_login_OnClick" IsEnabled="False"/>
         <TextBox Grid.Row="1" Grid.Column="1"  x:Name="_userid" Text="F.VanDenBos" Margin="5,5,0,0" IsEnabled="False" VerticalContentAlignment="Center" />

+ 2 - 0
prs.logikal/MainWindow.xaml.cs

@@ -29,12 +29,14 @@ namespace PRSLogikal
             InitializeComponent();
 
             _logikal = new LogikalServer();
+            
             _logikal.Log += (o, e) => Log(e.Message);
 
             _listener = new LogikalListener()
             {
                 Server = _logikal
             };
+            _listener.Disconnecting += (sender, args) => Dispatcher.Invoke(() => Close()); 
             _listener.Log += (o, e) => Log(e.Message);
             _listener.Start();
 

+ 1 - 1
prs.logikal/PRSLogikal.csproj

@@ -20,7 +20,7 @@
         <DebugSymbols>true</DebugSymbols>
         <DebugType>full</DebugType>
         <Optimize>false</Optimize>
-        <OutputPath>bin\Debug\</OutputPath>
+        <OutputPath>..\prs.desktop\bin\Debug\net8.0-windows\PRSLogikal</OutputPath>
         <DefineConstants>DEBUG;TRACE</DefineConstants>
         <ErrorReport>prompt</ErrorReport>
         <WarningLevel>4</WarningLevel>

+ 1 - 1
prs.server/PRSServer.iss

@@ -8,7 +8,7 @@
 #define public Dependency_Path_NetCoreCheck "dependencies\"
 
 #define MyAppName "PRS Server"
-#define MyAppVersion "8.09"
+#define MyAppVersion "8.10"
 #define MyAppPublisher "PRS Digital"
 #define MyAppURL "https://www.prs-software.com.au"
 #define MyAppExeName "PRSServer.exe"