فهرست منبع

Rearranged Job and Quote editors; improvements to scan panel

Kenric Nugteren 2 سال پیش
والد
کامیت
8cc65b702c

+ 34 - 17
prs.classes/Entities/Job/Job.cs

@@ -9,6 +9,9 @@ namespace Comal.Classes
     public class Job : Entity, IPersistent, IRemotable, IScheduleAction, IOneToMany<Schedule>, IStringAutoIncrement<Job>,
         ILicense<ProjectManagementLicense>, IExportable, IImportable, IMergeable, IScannable
     {
+
+        #region General
+
         [UniqueCodeEditor(Visible = Visible.Default, Editable = Editable.Enabled)]
         [EditorSequence(0)]
         public string JobNumber { get; set; }
@@ -35,18 +38,30 @@ namespace Comal.Classes
         [EditorSequence(5)]
         public AccountLink Account { get; set; }
 
+        #endregion
+
         [NotesEditor]
-        [EditorSequence(6)]
+        [EditorSequence("Notes", 1)]
         public string[] Notes { get; set; }
 
-        [TextBoxEditor]
-        [EditorSequence("Project Management", 1)]
-        public string SetoutsFolder { get; set; }
+        #region Other
 
         [TextBoxEditor]
-        [EditorSequence(7)]
+        [EditorSequence("Other", 1)]
         public string URL { get; set; }
 
+        [ColorEditor]
+        [EditorSequence("Other", 2)]
+        public string Color { get; set; }
+
+        #endregion
+
+        #region Project Management
+
+        [TextBoxEditor]
+        [EditorSequence("Project Management", 1)]
+        public string SetoutsFolder { get; set; }
+
         [Caption("Supervisor")]
         [EditorSequence("Project Management", 2)]
         public EmployeeLink EmployeeLink { get; set; }
@@ -63,6 +78,7 @@ namespace Comal.Classes
         [EditorSequence("Project Management", 5)]
         public TimeSpan UsualFinish { get; set; }
 
+
         // This is the Activity to which the Usual Start/Finish Applies
         // Other activitiy timesheets are not affected by this
         [EditorSequence("Project Management", 6)]
@@ -71,16 +87,23 @@ namespace Comal.Classes
         [EditorSequence("Project Management", 7)]
         public DateTime ExpectedCompletionDate { get; set; }
 
-        [ColorEditor]
-        [EditorSequence(8)]
-        public string Color { get; set; }
+        [EditorSequence("Project Management", 8)]
+        public DateTime Completed { get; set; }
 
-        [TimeOfDayEditor(Editable = Editable.Hidden)]
-        public TimeSpan LabourHours { get; set; }
+        //[SecondaryIndex]
+        //[EditorSequence(9)]
+        //public Boolean Active { get; set; }
 
-        [EditorSequence(11)]
+        [EditorSequence("Project Management", 9)]
         public JobStatusLink JobStatus { get; set; }
 
+        #endregion
+
+        [TimeOfDayEditor(Editable = Editable.Hidden)]
+        public TimeSpan LabourHours { get; set; }
+
+        [NullEditor]
+        [Obsolete("Why does this even exist?")]
         public ProductStyleLink Style { get; set; }
 
         [NullEditor]
@@ -94,12 +117,6 @@ namespace Comal.Classes
         [NullEditor]
         public ScheduleLink ScheduleLink { get; set; }
 
-        //[SecondaryIndex]
-        //[EditorSequence(9)]
-        //public Boolean Active { get; set; }
-
-        [EditorSequence(10)]
-        public DateTime Completed { get; set; }
 
         public Expression<Func<Job, string>> AutoIncrementField()
         {

+ 31 - 23
prs.classes/Entities/Quote/Quote.cs

@@ -73,47 +73,55 @@ namespace Comal.Classes
 
         [EditorSequence(5)]
         public AccountLink Account { get; set; }
-
-        [NotesEditor]
+        
+        [DoubleEditor(Editable = Editable.Hidden)]
         [EditorSequence(6)]
-        public string[] Notes { get; set; }
+        [Aggregate(typeof(QuoteExTax))]
+        public double ExTax { get; set; }
 
-        [DateEditor]
+        [DoubleEditor(Editable = Editable.Hidden)]
         [EditorSequence(7)]
+        [Aggregate(typeof(QuoteTax))]
+        public double Tax { get; set; }
+
+        [DoubleEditor(Editable = Editable.Hidden)]
+        [EditorSequence(8)]
+        [Aggregate(typeof(QuoteIncTax))]
+        public double IncTax { get; set; }
+
+        [EditorSequence(9)]
+        public QuoteStatusLink Status { get; set; }
+
+        #region Management
+
+        [DateEditor]
+        [EditorSequence("Management", 1)]
         public DateTime ReceivedDate { get; set; }
 
         [DateEditor]
-        [EditorSequence(8)]
+        [EditorSequence("Management", 2)]
         public DateTime DueDate { get; set; }
 
         [DateEditor]
-        [EditorSequence(9)]
+        [EditorSequence("Management", 3)]
         public DateTime QuoteDate { get; set; }
 
         [DateEditor]
-        [EditorSequence(10)]
+        [EditorSequence("Management", 4)]
         public DateTime ArchivedDate { get; set; }
 
-        [EditorSequence(11)]
+        [EditorSequence("Management", 5)]
         public EmployeeLink Salesperson { get; set; }
-        
-        [DoubleEditor(Editable = Editable.Hidden)]
-        [EditorSequence(12)]
-        [Aggregate(typeof(QuoteExTax))]
-        public double ExTax { get; set; }
 
-        [DoubleEditor(Editable = Editable.Hidden)]
-        [EditorSequence(13)]
-        [Aggregate(typeof(QuoteTax))]
-        public double Tax { get; set; }
+        #endregion
 
-        [DoubleEditor(Editable = Editable.Hidden)]
-        [EditorSequence(14)]
-        [Aggregate(typeof(QuoteIncTax))]
-        public double IncTax { get; set; }
+        #region Notes
 
-        [EditorSequence(15)]
-        public QuoteStatusLink Status { get; set; }
+        [NotesEditor]
+        [EditorSequence("Notes", 1)]
+        public string[] Notes { get; set; }
+
+        #endregion
 
         public Expression<Func<Quote, string>> AutoIncrementField()
         {

+ 7 - 8
prs.desktop/MainWindow.xaml

@@ -1019,7 +1019,6 @@
                 <LayoutRoot.LeftSide>
                     <LayoutAnchorSide>
                         <LayoutAnchorGroup x:Name="DockGroup">
-
                             <LayoutAnchorable
                                 x:Name="ContactDock"
                                 Title="Address Book"
@@ -1032,7 +1031,7 @@
                                 CanMove="False"
                                 AutoHideWidth="500"
                                 FloatingWidth="500"
-                                AutoHideMinWidth="500"
+                                AutoHideMinWidth="400"
                                 IsActiveChanged="DockPanel_OnIsActiveChanged">
                                 <Border BorderThickness="0.75" BorderBrush="Gray">
                                     <local:ContactDock x:Name="Contacts" />
@@ -1051,7 +1050,7 @@
                                 CanMove="False"
                                 AutoHideWidth="500"
                                 FloatingWidth="500"
-                                AutoHideMinWidth="500"
+                                AutoHideMinWidth="400"
                                 IsActiveChanged="DockPanel_OnIsActiveChanged">
                                 <Border BorderThickness="0.75" BorderBrush="Gray">
                                     <local:JobDock x:Name="Jobs" />
@@ -1069,7 +1068,7 @@
                                 CanDockAsTabbedDocument="False"
                                 AutoHideWidth="500"
                                 FloatingWidth="500"
-                                AutoHideMinWidth="500"
+                                AutoHideMinWidth="400"
                                 IsActiveChanged="DockPanel_OnIsActiveChanged">
                                 <Border BorderThickness="0.75" BorderBrush="Gray">
                                     <local:ConsignmentDock x:Name="Consignments" />
@@ -1087,7 +1086,7 @@
                                 CanDockAsTabbedDocument="False"
                                 AutoHideWidth="500"
                                 FloatingWidth="500"
-                                AutoHideMinWidth="500"
+                                AutoHideMinWidth="400"
                                 IsActiveChanged="DockPanel_OnIsActiveChanged">
                                 <Border BorderThickness="0.75" BorderBrush="Gray">
                                     <local:DeliveryDock x:Name="Deliveries" />
@@ -1105,7 +1104,7 @@
                                 CanDockAsTabbedDocument="False"
                                 AutoHideWidth="500"
                                 FloatingWidth="500"
-                                AutoHideMinWidth="500"
+                                AutoHideMinWidth="400"
                                 IsActiveChanged="DockPanel_OnIsActiveChanged">
                                 <Border BorderThickness="0.75" BorderBrush="Gray">
                                     <local:ProductLookupDock x:Name="ProductLookup" />
@@ -1124,7 +1123,7 @@
                                 CanDockAsTabbedDocument="False"
                                 AutoHideWidth="500"
                                 FloatingWidth="500"
-                                AutoHideMinWidth="500"
+                                AutoHideMinWidth="400"
                                 IsActiveChanged="DockPanel_OnIsActiveChanged">
                                 <Border BorderThickness="0.75" BorderBrush="Gray">
                                     <local:DigitalFormsDock x:Name="DigitalForms" />
@@ -1142,7 +1141,7 @@
                                 CanDockAsTabbedDocument="False"
                                 AutoHideWidth="500"
                                 FloatingWidth="500"
-                                AutoHideMinWidth="500"
+                                AutoHideMinWidth="400"
                                 IsActiveChanged="DockPanel_OnIsActiveChanged">
                                 <Border BorderThickness="0.75" BorderBrush="Gray">
                                     <local:ScanPanel x:Name="Scans" />

+ 1 - 1
prs.desktop/Panels/DataEntry/DataEntryPanel.xaml

@@ -16,7 +16,7 @@
                 </Border>
             </dynamic:DynamicSplitPanel.Header>
             <dynamic:DynamicSplitPanel.Master>
-                <local:ScanPanel x:Name="ScanPanel"/>
+                <local:ScanPanel x:Name="ScanPanel" OnSelectAppliesTo="ScanPanel_OnSelectAppliesTo"/>
             </dynamic:DynamicSplitPanel.Master>
             <dynamic:DynamicSplitPanel.Detail>
                 <Grid x:Name="DetailGrid">

+ 3 - 25
prs.desktop/Panels/DataEntry/DataEntryPanel.xaml.cs

@@ -59,7 +59,6 @@ namespace PRSDesktop
             TypeBox.SelectedValuePath = "Item2";
 
             ScanPanel.Setup();
-            ScanPanel.OnSelectScans += ScanPanel_OnSelectScans;
         }
         public void Refresh()
         {
@@ -125,6 +124,7 @@ namespace PRSDesktop
             DetailGrid.Children.Remove(Editor);
 
             Editor = new EmbeddedDynamicEditorForm();
+            Editor.SetLayoutType<VerticalDynamicEditorGridLayout>();
             Editor.SetValue(Grid.RowProperty, 1);
             Editor.SetValue(Grid.ColumnProperty, 0);
             Editor.SetValue(Grid.ColumnSpanProperty, 4);
@@ -234,31 +234,9 @@ namespace PRSDesktop
             }
         }
 
-        private void ScanPanel_OnSelectScans(Scan[]? scans)
+        private void ScanPanel_OnSelectAppliesTo(string appliesTo)
         {
-            if (scans is null) return;
-            if (EditorChanged) return;
-
-            var tagIDs = scans.Select(x => x.Tag.ID).Distinct().ToArray();
-            var appliesToList = new Client<ScanTag>()
-                .Query(new Filter<ScanTag>(x => x.ID).InList(tagIDs), new Columns<ScanTag>(x => x.AppliesTo))
-                .Rows.Select(x => x.Get<ScanTag, string>(x => x.AppliesTo));
-
-            string? appliesTo = null;
-            foreach(var appliesToName in appliesToList)
-            {
-                if (!string.IsNullOrWhiteSpace(appliesToName))
-                {
-                    if (appliesTo is null)
-                        appliesTo = appliesToName;
-                    else if(appliesTo != appliesToName)
-                    {
-                        appliesTo = null;
-                        break;
-                    }
-                }
-            }
-            if(appliesTo is not null && CoreUtils.GetEntityOrNull(appliesTo) is Type entity)
+            if(CoreUtils.TryGetEntity(appliesTo, out var entity))
             {
                 TypeBox.SelectedValue = entity;
             }

+ 15 - 0
prs.desktop/Panels/DataEntry/ScanGrid.cs

@@ -20,6 +20,9 @@ namespace PRSDesktop
         private List<ScanTag>? _tags;
         private Button? ExplodeBtn;
 
+        public delegate void SelectAppliesTo(string appliesTo);
+        public event SelectAppliesTo? OnSelectAppliesTo;
+
         public ScanGrid()
         {
             Options.BeginUpdate()
@@ -42,6 +45,7 @@ namespace PRSDesktop
             }
 
             HiddenColumns.Add(x => x.Tag.ID);
+            HiddenColumns.Add(x => x.Tag.AppliesTo);
             HiddenColumns.Add(x => x.Document.ID);
         }
 
@@ -160,6 +164,17 @@ namespace PRSDesktop
                 var processed = row.Get<Scan, bool>(x => x.Processed);
                 column.AddItem(processed ? "Mark as not processed" : "Mark as processed", null, Process_Click);
             }
+            if(OnSelectAppliesTo is not null)
+            {
+                column.AddItem("Go to Document", null, Document_Click);
+            }
+        }
+
+        private void Document_Click(CoreRow? row)
+        {
+            if (row is null) return;
+
+            OnSelectAppliesTo?.Invoke(row.Get<Scan, string>(x => x.Tag.AppliesTo));
         }
 
         private void SetTag_Click(Tuple<CoreRow, ScanTag?> obj)

+ 1 - 1
prs.desktop/Panels/DataEntry/ScanPanel.xaml

@@ -17,7 +17,7 @@
 
         <local:ScanGrid Grid.Row="0"
                         Margin="5"
-                        x:Name="ScanGrid" OnSelectItem="ScanGrid_OnSelectItem"
+                        x:Name="ScanGrid" OnSelectItem="ScanGrid_OnSelectItem" OnSelectAppliesTo="ScanGrid_OnSelectAppliesTo"
                         AllowDrop="True" PreviewDragOver="DynamicTabItem_DragOver" Drop="DynamicTabItem_Drop"/>
 
         <sf:SfGridSplitter Grid.Row="1"

+ 6 - 5
prs.desktop/Panels/DataEntry/ScanPanel.xaml.cs

@@ -87,9 +87,7 @@ namespace PRSDesktop
     {
         private List<Scan> SelectedScans = new();
 
-        public delegate void SelectScans(Scan[]? scans);
-
-        public event SelectScans? OnSelectScans;
+        public event ScanGrid.SelectAppliesTo? OnSelectAppliesTo;
 
         public ScanPanel()
         {
@@ -272,9 +270,12 @@ namespace PRSDesktop
 
         private void ScanGrid_OnSelectItem(object sender, DynamicGridSelectionEventArgs e)
         {
-            OnSelectScans?.Invoke(e.Rows?.Select(x => x.ToObject<Scan>()).ToArray());
-
             UpdateViewList();
         }
+
+        private void ScanGrid_OnSelectAppliesTo(string appliesTo)
+        {
+            OnSelectAppliesTo?.Invoke(appliesTo);
+        }
     }
 }

+ 1 - 0
prs.desktop/Panels/Products/ProductPricing.xaml.cs

@@ -32,6 +32,7 @@ namespace PRSDesktop
         }
 
         public DynamicEditorGrid EditorGrid { get; set; }
+        public PageType PageType => PageType.Other;
 
         public bool Ready { get; set; }
 

+ 2 - 0
prs.desktop/Panels/Security/Groups/GroupTokenPage.xaml.cs

@@ -21,6 +21,8 @@ namespace PRSDesktop
 
         public bool Ready { get; set; }
 
+        public PageType PageType => PageType.Other;
+
         public DynamicEditorGrid EditorGrid { get; set; }
 
         public void AfterSave(object item)

+ 1 - 0
prs.desktop/Panels/Security/User/UserSecurityTokenPage.xaml.cs

@@ -25,6 +25,7 @@ namespace PRSDesktop
         public bool Ready { get; set; }
 
         public DynamicEditorGrid EditorGrid { get; set; }
+        public PageType PageType => PageType.Other;
 
         public void AfterSave(object item)
         {

+ 2 - 0
prs.desktop/Panels/Tasks/KanbanNotes.xaml.cs

@@ -25,6 +25,8 @@ namespace PRSDesktop
 
         public DynamicEditorGrid EditorGrid { get; set; }
 
+        public PageType PageType => PageType.Other;
+
         public bool Ready { get; set; }
 
         public void Load(object item, Func<Type, CoreTable> PageDataHandler)