ソースを参照

Added drag drop from Product dock to requisition item grid

Kenric Nugteren 1 年間 前
コミット
775549fc46

+ 1 - 5
prs.classes/Entities/Requisition/RequisitionItem.cs

@@ -23,11 +23,7 @@ namespace Comal.Classes
         
         [EntityRelationship(DeleteAction.Cascade)]
         [NullEditor]
-        public JobLink JobLink
-        {
-            get;
-            set;
-        }
+        public JobLink JobLink { get; set; }
 
         [EditorSequence(1)]
         [RequiredColumn]

+ 1 - 1
prs.desktop/DockPanels/ProductLookupDock.xaml

@@ -25,7 +25,7 @@
                  KeyUp="Items_KeyUp" KeyDown="Items_KeyDown" Background="LightYellow">
             <ListBox.ItemTemplate>
                 <DataTemplate DataType="{x:Type classes:Product}">
-                    <Grid>
+                    <Grid MouseMove="Grid_MouseMove" Tag="{Binding}">
                         <Grid.ColumnDefinitions>
                             <ColumnDefinition Width=".25*" />
                             <ColumnDefinition Width=".75*" />

+ 10 - 1
prs.desktop/DockPanels/ProductLookupDock.xaml.cs

@@ -380,6 +380,15 @@ namespace PRSDesktop
 
             MessageBox.Show(string.Format("Cleared image from [{0}]", string.Join(", ", SelectedProducts())));
         }
-        
+
+        private void Grid_MouseMove(object sender, MouseEventArgs e)
+        {
+            if(sender is not Grid grid || grid.Tag is not Product product || e.LeftButton != MouseButtonState.Pressed)
+            {
+                return;
+            }
+
+            DragDrop.DoDragDrop(grid, product, DragDropEffects.Copy);
+        }
     }
 }

+ 57 - 3
prs.desktop/Panels/Requisitions/RequisitionItemGrid.cs

@@ -71,9 +71,63 @@ namespace PRSDesktop
                 .Add(DynamicGridOption.DeleteRows)
                 .Add(DynamicGridOption.FilterRows)
                 .Add(DynamicGridOption.MultiSelect)
+                .Add(DynamicGridOption.DragTarget)
                 .EndUpdate();
         }
 
+        protected override void DoBeforeSave(IDynamicEditorForm editor, RequisitionItem[] items)
+        {
+            base.DoBeforeSave(editor, items);
+
+            foreach (var item in items)
+                item.Picked = Picked ? DateTime.Now : DateTime.MinValue;
+        }
+
+        private bool CanAddItems() =>
+            Requisition is not null && Requisition.ID != Guid.Empty && Requisition.Filled.IsEmpty();
+
+        protected override void HandleDragOver(object sender, DragEventArgs e)
+        {
+            base.HandleDragOver(sender, e);
+
+            if (e.Data.GetDataPresent(typeof(Product)))
+            {
+                if (e.Data.GetData(typeof(Product)) is Product product)
+                {
+                    if (!CanAddItems())
+                    {
+                        e.Effects = DragDropEffects.None;
+                    }
+                }
+            }
+        }
+
+        protected override void HandleDragDrop(object sender, DragEventArgs e)
+        {
+            base.HandleDragDrop(sender, e);
+
+            if (e.Data.GetDataPresent(typeof(Product)))
+            {
+                if(e.Data.GetData(typeof(Product)) is Product product)
+                {
+                    if(CanAddItems())
+                    {
+                        int quantity = 1;
+                        if (NumberEdit.Execute("Enter Quantity:", 1, int.MaxValue, ref quantity))
+                        {
+                            var item = CreateItem();
+                            item.Product.ID = product.ID;
+                            item.Product.Synchronise(product);
+                            item.Quantity = quantity;
+                            item.Picked = Picked ? DateTime.Now : DateTime.MinValue;
+                            SaveItem(item);
+                            Refresh(false, true);
+                        }
+                    }
+                }
+            }
+        }
+
         private void SelectHolding(DynamicMenuColumn column, CoreRow? row)
         {
             List<Guid> locations = new List<Guid>();
@@ -148,7 +202,7 @@ namespace PRSDesktop
         }
 
 
-        public Requisition Requisition { get; set; }
+        public Requisition? Requisition { get; set; }
 
         protected override void Reload(Filters<RequisitionItem> criteria, Columns<RequisitionItem> columns, ref SortOrder<RequisitionItem>? sort,
             Action<CoreTable?, Exception?> action)
@@ -192,7 +246,7 @@ namespace PRSDesktop
             return base.CanDeleteItems(rows);
         }
 
-        public override bool EditItems(RequisitionItem[] items, Func<Type, CoreTable>? PageDataHandler, bool PreloadPages = false)
+        public override bool EditItems(RequisitionItem[] items, Func<Type, CoreTable?>? PageDataHandler, bool PreloadPages = false)
         {
             if (Requisition == null || Requisition.ID.Equals(Guid.Empty))
             {
@@ -212,7 +266,7 @@ namespace PRSDesktop
         protected override RequisitionItem CreateItem()
         {
             var item = base.CreateItem();
-            item.RequisitionLink.ID = Requisition.ID;
+            item.RequisitionLink.ID = Requisition?.ID ?? Guid.Empty;
             item.RequisitionLink.Synchronise(Requisition);
             item.Quantity = 1;
             return item;

+ 20 - 38
prs.desktop/Panels/Requisitions/RequisitionPanel.xaml.cs

@@ -23,7 +23,7 @@ namespace PRSDesktop
     /// </summary>
     public partial class RequisitionPanel : UserControl, IPanel<Requisition>
     {
-        private Requisition _requisition;
+        private Requisition? _requisition;
 
         public List<IMotorolaBarcodeScanner> Scanners = new();
 
@@ -63,9 +63,6 @@ namespace PRSDesktop
 
             SetupScanner();
 
-            Items.OnBeforeSave += Items_OnBeforeSave;
-            UnPickedItems.OnBeforeSave += UnPickedItems_OnBeforeSave;
-
             Items.Reconfigure(options =>
             {
                 options.BeginUpdate();
@@ -92,18 +89,6 @@ namespace PRSDesktop
             UpdateLayout();
         }
 
-        private void UnPickedItems_OnBeforeSave(IDynamicEditorForm editor, BaseObject[] items)
-        {
-            foreach (var item in items)
-                (item as RequisitionItem).Picked = DateTime.MinValue;
-        }
-
-        private void Items_OnBeforeSave(IDynamicEditorForm editor, BaseObject[] items)
-        {
-            foreach (var item in items)
-                (item as RequisitionItem).Picked = DateTime.Now;
-        }
-
         public void Shutdown(CancelEventArgs? cancel)
         {
             ShutdownScanner();
@@ -166,7 +151,7 @@ namespace PRSDesktop
             BarcodeScannerManager.Instance.DataReceived += Instance_DataReceived;
         }
 
-        private void Instance_DataReceived(object sender, BarcodeScanEventArgs e)
+        private void Instance_DataReceived(object? sender, BarcodeScanEventArgs e)
         {
             Dispatcher.Invoke(() => { ProcessCode(Scanners[(int)e.ScannerId], e.Data); });
         }
@@ -191,15 +176,15 @@ namespace PRSDesktop
 
                 var sCode = code;
                 var iQty = 1;
-                if (sCode.Contains("*"))
+                if (sCode.Contains('*'))
                 {
                     var comps = sCode.Split('*');
                     sCode = comps[0];
                     iQty = int.Parse(comps[1].Trim());
                 }
 
-                RequisitionItem item = null;
-                CoreRow itemrow = null;
+                RequisitionItem? item = null;
+                CoreRow? itemrow = null;
                 try
                 {
                     itemrow = Items.Data.Rows.FirstOrDefault(r => /* r.Get<RequisitionItem, int>(x => x.BoxNumber).Equals(boxes) && */
@@ -218,8 +203,7 @@ namespace PRSDesktop
                 {
                     item.Quantity += iQty;
                     new Client<RequisitionItem>().Save(item, "Quantity Updated by Barcode Scanner");
-                    if (scanner != null)
-                        scanner.Actions.SoundBeeper(BeepPattern.LowHigh);
+                    scanner?.Actions.SoundBeeper(BeepPattern.LowHigh);
                     Refresh();
                 }
                 else
@@ -238,26 +222,23 @@ namespace PRSDesktop
                         };
                         new Client<RequisitionItem>().Save(item, "Scanned by Barcode Reader");
 
-                        if (scanner != null)
-                            scanner.Actions.SoundBeeper(BeepPattern.LowHigh);
+                        scanner?.Actions.SoundBeeper(BeepPattern.LowHigh);
 
                         Refresh();
                     }
                     else
                     {
-                        if (scanner != null)
-                            scanner.Actions.SoundBeeper(BeepPattern.FourLowLong);
+                        scanner?.Actions.SoundBeeper(BeepPattern.FourLowLong);
                     }
                 }
             }
-            catch (Exception e)
+            catch (Exception)
             {
-                if (scanner != null)
-                    scanner.Actions.SoundBeeper(BeepPattern.FourLowShort);
+                scanner?.Actions.SoundBeeper(BeepPattern.FourLowShort);
             }
         }
 
-        private void ArchiveRequisition(PanelAction obj)
+        /*private void ArchiveRequisition(PanelAction obj)
         {
             var bClosed = false;
             var iRow = Requisitions.SelectedRows.First().Index;
@@ -288,14 +269,15 @@ namespace PRSDesktop
 
             if (bClosed)
                 Refresh();
-        }
+        }*/
 
         public Dictionary<Type, CoreTable> DataEnvironment()
         {
-            var env = new Dictionary<Type, CoreTable>();
-            env[typeof(Requisition)] = Requisitions.Data;
-            env[typeof(RequisitionItem)] = Items.Data;
-            return env;
+            return new Dictionary<Type, CoreTable>
+            {
+                [typeof(Requisition)] = Requisitions.Data,
+                [typeof(RequisitionItem)] = Items.Data
+            };
         }
 
         //private void Timer_Tick(object sender, EventArgs e)
@@ -323,7 +305,7 @@ namespace PRSDesktop
 
             DueDate.Content = _requisition != null ? string.Format("{0:dddd, dd MMM yyyy}", _requisition.Due) : "";
 
-            var notes = _requisition != null ? _requisition.Notes : new string[] { };
+            var notes = _requisition != null ? _requisition.Notes : Array.Empty<string>();
             var request = _requisition != null ? CoreUtils.StripHTML(_requisition.Request) : "";
             Request.Text = string.Join("\n===============================\n", Utility.ProcessNotes(notes, request));
 
@@ -428,7 +410,7 @@ namespace PRSDesktop
                 filltime = DateTime.Now;
                 if (confirm == MessageBoxResult.Yes)
                 {
-                    List<RequisitionItem> updates = new List<RequisitionItem>();
+                    var updates = new List<RequisitionItem>();
                     foreach (var row in unpickeditems)
                     {
                         var item = row.ToObject<RequisitionItem>();
@@ -523,7 +505,7 @@ namespace PRSDesktop
 
         private void ProcessItems(DateTime picked, CoreRow[] rows)
         {
-            List<RequisitionItem> list = new List<RequisitionItem>();
+            var list = new List<RequisitionItem>();
             foreach (CoreRow row in rows)
             {
                 var item = row.ToObject<RequisitionItem>();