Преглед изворни кода

Added Delete functionality by holding purchase order items

frankvandenbos пре 1 месец
родитељ
комит
b106c5fca2

+ 4 - 4
PRS.Avalonia/PRS.Avalonia/Modules/PurchaseOrders/PurchaseOrder/PurchaseOrderItemView.axaml

@@ -4,13 +4,13 @@
              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
              xmlns:viewModels="clr-namespace:PRS.Avalonia.Modules"
              xmlns:components="clr-namespace:InABox.Avalonia.Components;assembly=InABox.Avalonia"
+             xmlns:converters="clr-namespace:InABox.Avalonia.Converters;assembly=InABox.Avalonia"
              mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
              x:Class="PRS.Avalonia.Modules.PurchaseOrderItemView"
              x:DataType="viewModels:PurchaseOrderItemViewModel">
     
     <UserControl.Resources>
-        <viewModels:BoolToColourConverter x:Key="BoolToColourConverter" Selected="LightYellow" DeSelected="LightGray"/>
-        <viewModels:ProductCodeNull x:Key="ProductCodeNullConverter"/>
+        <converters:BooleanToColorConverter x:Key="BoolToColourConverter" True="LightYellow" False="LightGray"/>
     </UserControl.Resources>
     
     <Grid RowDefinitions="Auto, Auto, Auto, *, Auto, Auto" ColumnDefinitions="Auto, *">
@@ -20,7 +20,7 @@
         <Button  Grid.Row="0" Grid.Column="1" HorizontalAlignment="Stretch" 
                  HorizontalContentAlignment="Center" Classes="Standard" 
                  Command="{Binding SelectProductCommand}" 
-                 Content="{Binding Item.ProductCode, Converter={StaticResource ProductCodeNullConverter}}"/>
+                 Content="{Binding Item.ProductCode, TargetNullValue='Select product'}"/>
         <TextBox Text="{Binding Item.SupplierCode}" Grid.Row="1" Grid.ColumnSpan="2"
                  IsVisible="{Binding !DescriptionIsEditable}"
                  IsReadOnly="{Binding !DescriptionIsEditable}"
@@ -32,9 +32,9 @@
         <TextBlock Text="Description" Grid.Row="2" Grid.ColumnSpan="2"/>
         <TextBox Text="{Binding Item.Description}" Grid.Row="3" Grid.ColumnSpan="2"
                  IsReadOnly="{Binding !DescriptionIsEditable}"
+                 Background="{Binding DescriptionIsEditable, Converter={StaticResource BoolToColourConverter}}"
                  Classes="Standard" 
                  TextWrapping="WrapWithOverflow" 
-                 Background="{Binding DescriptionIsEditable, Converter={StaticResource BoolToColourConverter}}"
                  VerticalContentAlignment="Top"/>
     
         <TextBlock Text="Quantity" Grid.Row="4" Grid.ColumnSpan="2"/>

+ 0 - 11
PRS.Avalonia/PRS.Avalonia/Modules/PurchaseOrders/PurchaseOrder/PurchaseOrderItemViewModel.cs

@@ -16,17 +16,6 @@ using PRS.Avalonia.Components;
 
 namespace PRS.Avalonia.Modules;
 
-public class BoolToColourConverter : AbstractConverter<bool?, IBrush>
-{
-    public IBrush DeSelected { get; set; }
-    public IBrush Selected { get; set; }
-
-    protected override IBrush Convert(bool? value, object? parameter = null)
-    {
-        return value == true ? Selected : DeSelected;
-    }
-}
-
 public class ProductCodeNull : AbstractConverter<string?, string>
 {
     protected override string Convert(string? value, object? parameter = null)

+ 15 - 10
PRS.Avalonia/PRS.Avalonia/Modules/PurchaseOrders/PurchaseOrder/PurchaseOrderView.axaml

@@ -64,17 +64,22 @@
                 <listView:PrsListView.ItemTemplate>
                     <DataTemplate x:DataType="avalonia:PurchaseOrderItemShell">
                         <Button Classes="Standard"
-                                    HorizontalContentAlignment="Stretch"
-                                    Command="{Binding  $parent[listView:PrsListView].((viewModels:PurchaseOrderViewModel)DataContext).EditPurchaseOrderItemCommand}"
-                                    CommandParameter="{Binding .}">
-                            <Grid RowDefinitions="Auto,Auto" ColumnDefinitions="Auto,*,Auto">
-                                <Button Grid.Row="0" Grid.Column="0" Grid.RowSpan="2" Background="Transparent" Command="{Binding  $parent[listView:PrsListView].((viewModels:PurchaseOrderViewModel)DataContext).DeletePurchaseOrderItemCommand}" CommandParameter="{Binding .}">
-                                    <Image Classes="Medium" Source="{SvgImage /Images/cross.svg}"/>
-                                </Button>
-                                <TextBlock Text="{Binding JobNumber}" Grid.Row="0" Grid.Column="1" TextAlignment="Center"/>
+                                Tag="{Binding .}"
+                                Gestures.IsHoldingEnabled="True"
+                                Gestures.IsHoldWithMouseEnabled="True"
+                                Holding="Button_Holding"
+                                Click="Button_Click"
+                                HorizontalContentAlignment="Stretch">
+                            <Button.Styles>
+                                <Style Selector="Button /template/ ContentPresenter#PART_ContentPresenter">
+                                    <Setter Property="(Gestures.IsHoldWithMouseEnabled)" Value="True"/>
+                                </Style>
+                            </Button.Styles>
+                            <Grid RowDefinitions="Auto,Auto" ColumnDefinitions="Auto,*,Auto" IsHitTestVisible="False">
+                                <TextBlock Text="{Binding JobNumber}" Grid.Row="1" Grid.Column="1" TextAlignment="Left"/>
                                 <TextBlock Text="{Binding Description}" Grid.Row="1" Grid.Column="1"
-                                           TextAlignment="Center"
-                                           HorizontalAlignment="Center" 
+                                           TextAlignment="Left"
+                                           HorizontalAlignment="Center"
                                            TextWrapping="WrapWithOverflow"
                                            Margin="10"/>
                                 <TextBlock Text="{Binding Qty}" Grid.Row="0" Grid.Column="2" Grid.RowSpan="2" VerticalAlignment="Center"/>

+ 29 - 0
PRS.Avalonia/PRS.Avalonia/Modules/PurchaseOrders/PurchaseOrder/PurchaseOrderView.axaml.cs

@@ -2,6 +2,8 @@ using Avalonia.Controls;
 using InABox.Avalonia;
 using System;
 using System.Threading.Tasks;
+using Avalonia.Input;
+using Avalonia.Interactivity;
 
 namespace PRS.Avalonia.Modules;
 
@@ -36,4 +38,31 @@ public partial class PurchaseOrderView : UserControl
             };
         }
     }
+    
+    
+    private Button? _heldButton;
+
+    private void Button_Holding(object? sender, HoldingRoutedEventArgs e)
+    {
+        if (sender is not Button button || button.Tag is not PurchaseOrderItemShell item) return;
+
+        if(e.HoldingState == HoldingState.Started)
+        {
+            _heldButton = button;
+            (DataContext as PurchaseOrderViewModel)?.HoldCommand.Execute(item);
+        }
+    }
+
+    private void Button_Click(object? sender, RoutedEventArgs e)
+    {
+        if (sender is not Button button || button.Tag is not PurchaseOrderItemShell item) return;
+
+        if(button == _heldButton)
+        {
+            // Disable the click event if we held the button.
+            _heldButton = null;
+            return;
+        }
+        (DataContext as PurchaseOrderViewModel)?.ClickCommand.Execute(item);
+    }
 }

+ 21 - 4
PRS.Avalonia/PRS.Avalonia/Modules/PurchaseOrders/PurchaseOrder/PurchaseOrderViewModel.cs

@@ -9,6 +9,7 @@ using CommunityToolkit.Mvvm.Input;
 using DynamicData.Binding;
 using InABox.Avalonia;
 using InABox.Avalonia.Components;
+using InABox.Avalonia.Dialogs;
 using InABox.Clients;
 using InABox.Core;
 using PRS.Avalonia.Components;
@@ -160,14 +161,31 @@ public partial class PurchaseOrderViewModel : ModuleViewModel
             };
         });
     }
+    
+    [RelayCommand]
+    private void Hold(PurchaseOrderItemShell item)
+    {
+        new MessageDialogViewModel()
+            .Message("Confirm Delete")
+            .AddButton(new("Yes, Delete", (window, button) =>
+            {
+                DeletePurchaseOrderItem(item);
+                window.Close(MessageDialogResult.None);
+            }, MessageDialogButtonPosition.Right))
+            .AddButton(new("Cancel", (window, button) =>
+            {
+                window.Close(MessageDialogResult.None);
+            }, MessageDialogButtonPosition.Right))
+            .Display();
+    }
 
     [RelayCommand]
-    private void EditPurchaseOrderItem(PurchaseOrderItemShell item)
+    private void Click(PurchaseOrderItemShell item)
     {
         Navigation.Navigate<PurchaseOrderItemViewModel>(x =>
         {
             x.Item = item;
-            x.DescriptionIsEditable = item.ProductCode == String.Empty || item.ProductCode == null;
+            x.DescriptionIsEditable = String.IsNullOrEmpty(item.ProductCode);
         });
     }
 
@@ -176,8 +194,7 @@ public partial class PurchaseOrderViewModel : ModuleViewModel
         PurchaseOrderItemsChanged = true;
         Changed();
     }
-
-    [RelayCommand]
+    
     private void DeletePurchaseOrderItem(PurchaseOrderItemShell item)
     {
         PurchaseOrderItems.DeleteItem(item);

+ 1 - 1
PRS.Avalonia/PRS.Avalonia/Modules/SubmitDocs/SubmitDocsViewModel.cs

@@ -177,7 +177,7 @@ public partial class SubmitDocsViewModel : ModuleViewModel
 
         return TimeSpan.Zero;
     }
-
+    
     [RelayCommand]
     private void Click(DataEntryDocumentShell shell)
     {