ソースを参照

Updated Requsition Item Edit Screen

frogsoftware 1 年間 前
コミット
bdfd533934

+ 2 - 2
prs.classes/Entities/Stock/StockHolding/StockHolding.cs

@@ -200,7 +200,7 @@ namespace Comal.Classes
             holding.Weight = holding.Qty * holding.Dimensions.Weight;
         }
         
-        public static IEnumerable<JobRequisitionItem> LoadRequisitionItems(this StockHolding holding)
+        public static IEnumerable<JobRequisitionItem> LoadRequisitionItems(this StockHolding holding, bool alwaysshowunallocated = false)
         {
             var items = new Client<JobRequisitionItem>().Query(
                     new Filter<JobRequisitionItem>(x => x.ID).InQuery(StockHolding.GetFilter(holding), x => x.JobRequisitionItem.ID),
@@ -210,7 +210,7 @@ namespace Comal.Classes
                         .Add(x => x.Requisition.Description)
                         .Add(x => x.Qty))
                 .ToObjects<JobRequisitionItem>();
-            if (holding.Available > 0)
+            if (holding.Available > 0 || alwaysshowunallocated)
             {
                 var requi = new JobRequisitionItem() { Qty = holding.Available };
                 requi.Requisition.Description = "Unallocated Items";

+ 1 - 1
prs.desktop/Panels/Jobs/Picking Lists/JobPickingListItemGrid.cs

@@ -60,7 +60,7 @@ internal class JobPickingListItemGrid : DynamicDataGrid<RequisitionItem>, ISpeci
             item = CreateItem();
         }
 
-        var editor = new RequisitionItemEditor(GetProducts(), item, RequisitionItemEditor.EditorMode.ProductInstances);
+        var editor = new RequisitionItemEditor(GetProducts(), item, false);
         if(editor.ShowDialog() == true && editor.Result is not null)
         {
             Refresh(false, true);

+ 256 - 258
prs.desktop/Panels/Requisitions/RequisitionItemEditor/RequisitionItemEditor.xaml

@@ -7,305 +7,303 @@
         xmlns:dg="clr-namespace:InABox.DynamicGrid;assembly=InABox.Wpf"
         xmlns:syncfusion="http://schemas.syncfusion.com/wpf"
         mc:Ignorable="d"
-        Title="RequisitionItemEditor" Height="600" Width="800"
-        x:Name="Window">
+        Title="Select Stock Holding" Height="800" Width="1200"
+        x:Name="Window" WindowStartupLocation="CenterScreen">
     <Grid DataContext="{Binding ElementName=Window}">
         <Grid.RowDefinitions>
-            <RowDefinition Height="0" x:Name="StockHoldingsRow"/>
-            <RowDefinition Height="*" x:Name="ProductInstancesRow"/>
-            <RowDefinition Height="0" x:Name="CustomRow"/>
-            <RowDefinition Height="Auto" x:Name="ButtonRow"/>
+            <RowDefinition Height="*"/>
+            <RowDefinition Height="Auto"/>
         </Grid.RowDefinitions>
-        <dg:DynamicSplitPanel View="Combined" AllowableViews="Combined" Anchor="Master" AnchorWidth="300"
-                              Grid.Row="0" Margin="5,5,5,0">
-            <dg:DynamicSplitPanel.Header>
-                <Border BorderBrush="Gray"
-                        BorderThickness="0.75"
-                        Background="WhiteSmoke">
-                    <Label Content="Products"
-                           VerticalContentAlignment="Center" HorizontalContentAlignment="Center"/>
-                </Border>
-            </dg:DynamicSplitPanel.Header>
-            <dg:DynamicSplitPanel.Master>
-                <local:RequisitionItemProductSelectionGrid x:Name="StockHoldingProducts" OnSelectItem="StockHoldingProducts_OnSelectItem"/>
-            </dg:DynamicSplitPanel.Master>
-            <dg:DynamicSplitPanel.Detail>
-                <Grid>
-                    <Grid.RowDefinitions>
-                        <RowDefinition Height="Auto"/>
-                        <RowDefinition Height="*"/>
-                        <RowDefinition Height="Auto"/>
-                    </Grid.RowDefinitions>
-                    <Border BorderBrush="Gray"
-                            BorderThickness="0.75"
-                            Background="WhiteSmoke"
-                            Grid.Row="0">
-                        <Label Content="Stock Holdings"
-                               VerticalContentAlignment="Center" HorizontalContentAlignment="Center"/>
-                    </Border>
-                    <local:RequisitionItemStockHoldingSelectionGrid x:Name="StockHoldings" OnSelectItem="StockHoldings_OnSelectItem"
-                                                                    Grid.Row="1"
-                                                                    Margin="0,4,0,0"/>
-                    <Grid Grid.Row="2" x:Name="JRIList" Margin="0,4,0,0">
-                        <Grid.RowDefinitions>
-                            <RowDefinition Height="40"/>
-                            <RowDefinition Height="0" x:Name="JRIRow"/>
-                            <RowDefinition Height="0" x:Name="TotalRow"/>
-                        </Grid.RowDefinitions>
-                        <Border Grid.Row="0" BorderBrush="Silver" BorderThickness="0,0.75,0,0" Background="WhiteSmoke" Padding="5,0,0,0">
+        
+        <dg:DynamicTabControl 
+            x:Name="TabControl"
+            Grid.Row="0" 
+            SelectionChanged="TabChanged"
+            Margin="5,5,5,0">
+        
+            <dg:DynamicTabControl.Items>
+                
+                <dg:DynamicTabItem x:Name="HoldingsPage" Header="Stock Holdings">
+                    <dg:DynamicSplitPanel View="Combined" AllowableViews="Combined" Anchor="Master" AnchorWidth="600">
+                        <dg:DynamicSplitPanel.Header>
+                            <Border BorderBrush="Gray"
+                                    BorderThickness="0.75"
+                                    Background="WhiteSmoke">
+                                <Label Content="Products"
+                                       VerticalContentAlignment="Center" HorizontalContentAlignment="Center"/>
+                            </Border>
+                        </dg:DynamicSplitPanel.Header>
+                        <dg:DynamicSplitPanel.Master>
+                            <local:RequisitionItemProductSelectionGrid x:Name="StockHoldingProducts" OnSelectItem="StockHoldingProducts_OnSelectItem"/>
+                        </dg:DynamicSplitPanel.Master>
+                        <dg:DynamicSplitPanel.Detail>
                             <Grid>
-                                <Grid.ColumnDefinitions>
-                                    <ColumnDefinition Width="*"/>
-                                    <ColumnDefinition Width="60"/>
-                                    <ColumnDefinition Width="50"/>
-                                    <ColumnDefinition Width="30"/>
-                                    <ColumnDefinition Width="60"/>
-                                    <ColumnDefinition Width="30"/>
-                                    <ColumnDefinition Width="50"/>
-                                </Grid.ColumnDefinitions>
-                                
-                                <TextBlock 
-                                    Grid.Column="0" 
-                                    Grid.ColumnSpan="4" 
-                                    Text="Required Quantity:" 
-                                    FontWeight="Bold" 
-                                    VerticalAlignment="Center" 
-                                    Margin="5,0,0,0"/>
-                                
-                                <syncfusion:DoubleTextBox 
-                                    Grid.Column="4"
-                                    Value="{Binding RequiredQuantity}" 
-                                    HorizontalContentAlignment="Center"
-                                    VerticalAlignment="Stretch"
-                                    VerticalContentAlignment="Center"
-                                    Margin="0,5,5,5"
-                                    Background="LightYellow"/>
-                            </Grid>
-                        </Border>
-                        <ItemsControl x:Name="JobRequisitionItems" Grid.Row="1"
-                                      ItemsSource="{Binding JRIItems}">
-                            <ItemsControl.ItemTemplate>
-                                <DataTemplate DataType="local:RequisitionItemStockHoldingItem">
-                                    <Border BorderBrush="LightGray"
-                                            BorderThickness="0,0,0,0.75"
-                                            Padding="5">
+                                <Grid.RowDefinitions>
+                                    <RowDefinition Height="Auto"/>
+                                    <RowDefinition Height="*"/>
+                                    <RowDefinition Height="Auto"/>
+                                </Grid.RowDefinitions>
+                                <Border BorderBrush="Gray"
+                                        BorderThickness="0.75"
+                                        Background="WhiteSmoke"
+                                        Grid.Row="0">
+                                    <Label Content="Stock Holdings"
+                                           VerticalContentAlignment="Center" HorizontalContentAlignment="Center"/>
+                                </Border>
+                                <local:RequisitionItemStockHoldingSelectionGrid 
+                                    x:Name="StockHoldings" 
+                                    OnSelectItem="StockHoldings_OnSelectItem"
+                                    AfterRefresh="StockHoldings_OnAfterRefresh"
+                                    Grid.Row="1"
+                                    Margin="0,4,0,0"/>
+                                <Grid Grid.Row="2" x:Name="JRIList" Margin="0,4,0,0">
+                                    <Grid.RowDefinitions>
+                                        <RowDefinition Height="40"/>
+                                        <RowDefinition Height="0" x:Name="JRIRow"/>
+                                        <RowDefinition Height="0" x:Name="TotalRow"/>
+                                    </Grid.RowDefinitions>
+                                    <Border Grid.Row="0" BorderBrush="Gray" BorderThickness="0.75" Background="WhiteSmoke" Padding="5,0,0,0">
                                         <Grid>
                                             <Grid.ColumnDefinitions>
                                                 <ColumnDefinition Width="*"/>
                                                 <ColumnDefinition Width="60"/>
-                                                <ColumnDefinition Width="50"/>
+                                                <ColumnDefinition Width="60"/>
                                                 <ColumnDefinition Width="30"/>
                                                 <ColumnDefinition Width="60"/>
                                                 <ColumnDefinition Width="30"/>
-                                                <ColumnDefinition Width="50"/>
+                                                <ColumnDefinition Width="60"/>
                                             </Grid.ColumnDefinitions>
                                             
-                                            <Grid.RowDefinitions>
-                                                <RowDefinition Height="30" />
-                                            </Grid.RowDefinitions>
-                                            
-                                            <TextBlock
+                                            <TextBlock 
                                                 Grid.Column="0" 
-                                                VerticalAlignment="Center"
-                                                Text="{Binding Text}"
-                                                TextWrapping="NoWrap"
-                                                TextTrimming="CharacterEllipsis"
+                                                Grid.ColumnSpan="4" 
+                                                Text="Required Quantity:" 
+                                                FontWeight="Bold" 
+                                                VerticalAlignment="Center" 
                                                 Margin="5,0,0,0"/>
                                             
                                             <syncfusion:DoubleTextBox 
-                                                Grid.Column="1" 
-                                                Value="{Binding Quantity}" 
-                                                IsReadOnly="True"
+                                                Grid.Column="6"
+                                                x:Name="RequiredEditor"
+                                                Value="{Binding RequiredQuantity}" 
                                                 HorizontalContentAlignment="Center"
                                                 VerticalAlignment="Stretch"
                                                 VerticalContentAlignment="Center"
-                                                Margin="5,0,0,0"
-                                                Background="WhiteSmoke"/>
-                                            
-                                            <Button 
-                                                Grid.Column="2" 
-                                                Content="None" 
-                                                Tag="{Binding}" 
-                                                Click="None_Click"
-                                                Margin="5,0,0,0"/>
+                                                Margin="0,5,5,5"
+                                                Background="LightYellow"/>
+                                        </Grid>
+                                    </Border>
+                                    <ItemsControl x:Name="JobRequisitionItems" Grid.Row="1"
+                                                  ItemsSource="{Binding JRIItems}" BorderBrush="Gray" BorderThickness="0.75,0,0.75,0">
+                                        <ItemsControl.ItemTemplate>
+                                            <DataTemplate DataType="local:RequisitionItemStockHoldingItem">
+                                                <Border BorderBrush="Gray"
+                                                        BorderThickness="0,0,0,0.75"
+                                                        Background="White"
+                                                        Padding="5">
+                                                    <Grid>
+                                                        <Grid.ColumnDefinitions>
+                                                            <ColumnDefinition Width="*"/>
+                                                            <ColumnDefinition Width="60"/>
+                                                            <ColumnDefinition Width="60"/>
+                                                            <ColumnDefinition Width="30"/>
+                                                            <ColumnDefinition Width="60"/>
+                                                            <ColumnDefinition Width="30"/>
+                                                            <ColumnDefinition Width="60"/>
+                                                        </Grid.ColumnDefinitions>
+                                                        
+                                                        <Grid.RowDefinitions>
+                                                            <RowDefinition Height="30" />
+                                                        </Grid.RowDefinitions>
+                                                        
+                                                        <TextBlock
+                                                            Grid.Column="0" 
+                                                            VerticalAlignment="Center"
+                                                            Text="{Binding Text}"
+                                                            TextWrapping="NoWrap"
+                                                            TextTrimming="CharacterEllipsis"
+                                                            Margin="5,0,0,0"/>
+                                                        
+                                                        <syncfusion:DoubleTextBox 
+                                                            Grid.Column="1" 
+                                                            Value="{Binding Quantity}" 
+                                                            IsReadOnly="True"
+                                                            HorizontalContentAlignment="Center"
+                                                            VerticalAlignment="Stretch"
+                                                            VerticalContentAlignment="Center"
+                                                            Margin="5,0,0,0"
+                                                            Background="WhiteSmoke"/>
+                                                        
+                                                        <Button 
+                                                            Grid.Column="2" 
+                                                            Content="None" 
+                                                            Tag="{Binding}" 
+                                                            Click="None_Click"
+                                                            Margin="5,0,0,0"/>
+                                                        
+                                                        <Button 
+                                                            Grid.Column="3" 
+                                                            Content="-" 
+                                                            Tag="{Binding}" 
+                                                            Click="Minus_Click"
+                                                            Margin="5,0,0,0"/>
+                                                        
+                                                        <syncfusion:DoubleTextBox 
+                                                            Grid.Column="4" 
+                                                            Value="{Binding Taken}" 
+                                                            MinValue="0" 
+                                                            MaxValue="{Binding Quantity}"
+                                                            HorizontalContentAlignment="Center"
+                                                            VerticalAlignment="Stretch"
+                                                            VerticalContentAlignment="Center"
+                                                            Margin="5,0,0,0"
+                                                            Background="LightYellow"/>
+                                                        
+                                                        <Button 
+                                                            Grid.Column="5" 
+                                                            Content="+" 
+                                                            Tag="{Binding}" 
+                                                            Click="Plus_Click"
+                                                            Margin="5,0,0,0"/>
+                                                        
+                                                        <Button 
+                                                            Grid.Column="6" 
+                                                            Content="All" 
+                                                            Tag="{Binding}" 
+                                                            Click="All_Click"
+                                                            Margin="5,0,0,0"/>
+                                                        
+                                                    </Grid>
+                                                </Border>
+                                            </DataTemplate>
+                                        </ItemsControl.ItemTemplate>
+                                        <ItemsControl.ItemsPanel>
+                                            <ItemsPanelTemplate>
+                                                <StackPanel/>
+                                            </ItemsPanelTemplate>
+                                        </ItemsControl.ItemsPanel>
+                                    </ItemsControl>
+                                    <Border Grid.Row="2" BorderBrush="Gray" BorderThickness="0.75,0,0.75,0.75" Background="WhiteSmoke" Padding="5,0,0,0">
+                                        <Grid>
+                                            <Grid.ColumnDefinitions>
+                                                <ColumnDefinition Width="*"/>
+                                                <ColumnDefinition Width="60"/>
+                                                <ColumnDefinition Width="60"/>
+                                                <ColumnDefinition Width="30"/>
+                                                <ColumnDefinition Width="60"/>
+                                                <ColumnDefinition Width="30"/>
+                                                <ColumnDefinition Width="60"/>
+                                            </Grid.ColumnDefinitions>
                                             
-                                            <Button 
-                                                Grid.Column="3" 
-                                                Content="-" 
-                                                Tag="{Binding}" 
-                                                Click="Minus_Click"
+                                            <TextBlock 
+                                                Grid.Column="0" 
+                                                Grid.ColumnSpan="4" 
+                                                Text="Total:" 
+                                                FontWeight="Bold" 
+                                                VerticalAlignment="Center" 
                                                 Margin="5,0,0,0"/>
-                                            
+
                                             <syncfusion:DoubleTextBox 
-                                                Grid.Column="4" 
-                                                Value="{Binding Taken}" 
-                                                MinValue="0" 
-                                                MaxValue="{Binding Quantity}"
+                                                Grid.Column="4"
+                                                Value="{Binding TotalTaken}" 
+                                                IsReadOnly="True"
                                                 HorizontalContentAlignment="Center"
                                                 VerticalAlignment="Stretch"
                                                 VerticalContentAlignment="Center"
-                                                Margin="5,0,0,0"
-                                                Background="LightYellow"/>
-                                            
-                                            <Button 
-                                                Grid.Column="5" 
-                                                Content="+" 
-                                                Tag="{Binding}" 
-                                                Click="Plus_Click"
-                                                Margin="5,0,0,0"/>
-                                            
-                                            <Button 
-                                                Grid.Column="6" 
-                                                Content="All" 
-                                                Tag="{Binding}" 
-                                                Click="All_Click"
-                                                Margin="5,0,0,0"/>
-                                            
+                                                Margin="0,5,5,5">
+                                                <syncfusion:DoubleTextBox.Style>
+                                                    <Style TargetType="syncfusion:DoubleTextBox">
+                                                        <Setter Property="Background" Value="LightGreen"/>
+                                                        <Style.Triggers>
+                                                            <DataTrigger Binding="{Binding TotalTaken}" Value="0">
+                                                                <Setter Property="Background" Value="Orange"/>
+                                                            </DataTrigger>
+                                                        </Style.Triggers>
+                                                    </Style>
+                                                </syncfusion:DoubleTextBox.Style>
+                                            </syncfusion:DoubleTextBox>
                                         </Grid>
                                     </Border>
-                                </DataTemplate>
-                            </ItemsControl.ItemTemplate>
-                            <ItemsControl.ItemsPanel>
-                                <ItemsPanelTemplate>
-                                    <StackPanel/>
-                                </ItemsPanelTemplate>
-                            </ItemsControl.ItemsPanel>
-                        </ItemsControl>
-                        <Border Grid.Row="2" BorderBrush="Silver" BorderThickness="0,0.75,0,0" Background="WhiteSmoke" Padding="5,0,0,0">
+                                </Grid>
+                            </Grid>
+                        </dg:DynamicSplitPanel.Detail>
+                    </dg:DynamicSplitPanel>
+                </dg:DynamicTabItem>
+                
+                <dg:DynamicTabItem x:Name="InstancesPage" Header="Catalogue">
+                    <dg:DynamicSplitPanel View="Combined" AllowableViews="Combined" Anchor="Master" AnchorWidth="600">
+                        <dg:DynamicSplitPanel.Header>
+                            <Border BorderBrush="Gray"
+                                    BorderThickness="0.75"
+                                    Background="WhiteSmoke">
+                                <Label Content="Products"
+                                       VerticalContentAlignment="Center" HorizontalContentAlignment="Center"/>
+                            </Border>
+                        </dg:DynamicSplitPanel.Header>
+                        <dg:DynamicSplitPanel.Master>
+                            <local:RequisitionItemProductSelectionGrid x:Name="ProductInstancesProducts" OnSelectItem="ProductInstancesProducts_OnSelectItem"/>
+                        </dg:DynamicSplitPanel.Master>
+                        <dg:DynamicSplitPanel.DetailHeader>
+                            <Border BorderBrush="Gray"
+                                    BorderThickness="0.75"
+                                    Background="WhiteSmoke">
+                                <Label Content="Product Instances"
+                                       VerticalContentAlignment="Center" HorizontalContentAlignment="Center"/>
+                            </Border>
+                        </dg:DynamicSplitPanel.DetailHeader>
+                        <dg:DynamicSplitPanel.Detail>
                             <Grid>
+                                <Grid.RowDefinitions>
+                                    <RowDefinition Height="*"/>
+                                    <RowDefinition Height="Auto"/>
+                                </Grid.RowDefinitions>
                                 <Grid.ColumnDefinitions>
                                     <ColumnDefinition Width="*"/>
-                                    <ColumnDefinition Width="60"/>
-                                    <ColumnDefinition Width="50"/>
-                                    <ColumnDefinition Width="30"/>
-                                    <ColumnDefinition Width="60"/>
-                                    <ColumnDefinition Width="30"/>
-                                    <ColumnDefinition Width="50"/>
                                 </Grid.ColumnDefinitions>
-                                
+                                <local:RequisitionItemProductInstanceGrid 
+                                    x:Name="ProductInstances" 
+                                    OnSelectItem="ProductInstances_OnSelectItem"
+                                    Grid.Row="0" />
+                                <Border Grid.Row="1" BorderBrush="Gray" BorderThickness="0.75" Background="WhiteSmoke" Padding="5,0,0,0" Margin="0,4,0,0" Height="40">
+                                <Grid>
+                                    <Grid.ColumnDefinitions>
+                                        <ColumnDefinition Width="*"/>
+                                        <ColumnDefinition Width="60"/>
+                                    </Grid.ColumnDefinitions>
                                 <TextBlock 
-                                    Grid.Column="0" 
-                                    Grid.ColumnSpan="4" 
-                                    Text="Total:" 
+                                    Grid.Column="0"
+                                    Text="Required Quantity:" 
                                     FontWeight="Bold" 
                                     VerticalAlignment="Center" 
                                     Margin="5,0,0,0"/>
-
                                 <syncfusion:DoubleTextBox 
-                                    Grid.Column="4"
-                                    Value="{Binding TotalTaken}" 
-                                    IsReadOnly="True"
+                                    Grid.Column="1"
+                                    Value="{Binding RequiredQuantity}" 
                                     HorizontalContentAlignment="Center"
                                     VerticalAlignment="Stretch"
                                     VerticalContentAlignment="Center"
-                                    Margin="0,5,5,5">
-                                    <syncfusion:DoubleTextBox.Style>
-                                        <Style TargetType="syncfusion:DoubleTextBox">
-                                            <Setter Property="Background" Value="LightGreen"/>
-                                            <Style.Triggers>
-                                                <DataTrigger Binding="{Binding TotalTaken}" Value="0">
-                                                    <Setter Property="Background" Value="Orange"/>
-                                                </DataTrigger>
-                                            </Style.Triggers>
-                                        </Style>
-                                    </syncfusion:DoubleTextBox.Style>
-                                </syncfusion:DoubleTextBox>
+                                    Margin="0,5,5,5"
+                                    Background="LightYellow"/>
+                                </Grid>
+                                </Border>
                             </Grid>
-                        </Border>
-                    </Grid>
-                </Grid>
-            </dg:DynamicSplitPanel.Detail>
-        </dg:DynamicSplitPanel>
-        <dg:DynamicSplitPanel View="Combined" AllowableViews="Combined" Anchor="Master" AnchorWidth="300"
-                              Grid.Row="1">
-            <dg:DynamicSplitPanel.Header>
-                <Border BorderBrush="Gray"
-                        BorderThickness="0.75"
-                        Background="WhiteSmoke">
-                    <Label Content="Products"
-                           VerticalContentAlignment="Center" HorizontalContentAlignment="Center"/>
-                </Border>
-            </dg:DynamicSplitPanel.Header>
-            <dg:DynamicSplitPanel.Master>
-                <local:RequisitionItemProductSelectionGrid x:Name="ProductInstancesProducts" OnSelectItem="ProductInstancesProducts_OnSelectItem"/>
-            </dg:DynamicSplitPanel.Master>
-            <dg:DynamicSplitPanel.DetailHeader>
-                <Border BorderBrush="Gray"
-                        BorderThickness="0.75"
-                        Background="WhiteSmoke">
-                    <Label Content="Product Instances"
-                           VerticalContentAlignment="Center" HorizontalContentAlignment="Center"/>
-                </Border>
-            </dg:DynamicSplitPanel.DetailHeader>
-            <dg:DynamicSplitPanel.Detail>
-                <Grid>
-                    <Grid.RowDefinitions>
-                        <RowDefinition Height="*"/>
-                        <RowDefinition Height="40"/>
-                    </Grid.RowDefinitions>
-                    <Grid.ColumnDefinitions>
-                        <ColumnDefinition Width="*"/>
-                        <ColumnDefinition Width="60"/>
-                    </Grid.ColumnDefinitions>
-                    <local:RequisitionItemProductInstanceGrid x:Name="ProductInstances" OnSelectItem="ProductInstances_OnSelectItem"
-                                                              Grid.Row="0" Grid.ColumnSpan="2"/>
-                    <TextBlock 
-                        Grid.Row="1" Grid.Column="0"
-                        Text="Required Quantity:" 
-                        FontWeight="Bold" 
-                        VerticalAlignment="Center" 
-                        Margin="5,0,0,0"/>
-                    <syncfusion:DoubleTextBox 
-                        Grid.Row="1" Grid.Column="1"
-                        Value="{Binding RequiredQuantity}" 
-                        HorizontalContentAlignment="Center"
-                        VerticalAlignment="Stretch"
-                        VerticalContentAlignment="Center"
-                        Margin="0,5,5,5"
-                        Background="LightYellow"/>
-                </Grid>
-            </dg:DynamicSplitPanel.Detail>
-        </dg:DynamicSplitPanel>
-        <dg:EmbeddedDynamicEditorForm Grid.Row="2" x:Name="CustomEditorGrid" HideButtons="True" TabsVisible="False" ButtonsVisible="False"
-                                      OnFormCustomiseEditor="CustomEditorGrid_OnFormCustomiseEditor" Margin="5,5,5,0"/>
-        <!--Grid x:Name="CustomEditorGrid"
-              Grid.Row="2">
-            <Grid.RowDefinitions>
-                <RowDefinition Height="Auto"/>
-                <RowDefinition Height="Auto"/>
-                <RowDefinition Height="Auto"/>
-                <RowDefinition Height="Auto"/>
-                <RowDefinition Height="Auto"/>
-                <RowDefinition Height="Auto"/>
-            </Grid.RowDefinitions>
-            <Grid.ColumnDefinitions>
-                <ColumnDefinition Width="Auto"/>
-                <ColumnDefinition Width="*"/>
-            </Grid.ColumnDefinitions>
-            <Label Content="Product" Grid.Row="0" Grid.Column="0"
-                   HorizontalContentAlignment="Left" VerticalContentAlignment="Center"
-                   HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
-            <Label Content="Style" Grid.Row="1" Grid.Column="0"
-                   HorizontalContentAlignment="Left" VerticalContentAlignment="Center"
-                   HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
-            <Label Content="Dimensions" Grid.Row="2" Grid.Column="0"
-                   HorizontalContentAlignment="Left" VerticalContentAlignment="Center"
-                   HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
-            <Label Content="Description" Grid.Row="3" Grid.Column="0"
-                   HorizontalContentAlignment="Left" VerticalContentAlignment="Center"
-                   HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
-            <Label Content="Location" Grid.Row="4" Grid.Column="0"
-                   HorizontalContentAlignment="Left" VerticalContentAlignment="Center"
-                   HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
-            <Label Content="Quantity" Grid.Row="5" Grid.Column="0"
-                   HorizontalContentAlignment="Left" VerticalContentAlignment="Center"
-                   HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
-        </Grid-->
-        <DockPanel Grid.Row="3" LastChildFill="False" x:Name="Buttons">
-            <Button x:Name="CustomButton" Click="CustomButton_Click"
-                    Content="Custom"
-                    Margin="5" Padding="5" MinWidth="60"
-                    DockPanel.Dock="Left"/>
+                        </dg:DynamicSplitPanel.Detail>
+                    </dg:DynamicSplitPanel>
+                </dg:DynamicTabItem>
+                
+                <dg:DynamicTabItem x:Name="CustomPage" Header="Custom">
+                    <dg:EmbeddedDynamicEditorForm 
+                        x:Name="CustomEditorGrid" 
+                        HideButtons="True" 
+                        TabsVisible="False" 
+                        ButtonsVisible="False"
+                        OnFormCustomiseEditor="CustomEditorGrid_OnFormCustomiseEditor"/>
+                </dg:DynamicTabItem>
+                
+            </dg:DynamicTabControl.Items>
+        </dg:DynamicTabControl>
+        
+        <DockPanel Grid.Row="1" LastChildFill="False" x:Name="Buttons">
             <Button x:Name="CancelButton" Click="CancelButton_Click"
                     Content="Cancel"
                     Margin="5" Padding="5" MinWidth="60"

+ 87 - 120
prs.desktop/Panels/Requisitions/RequisitionItemEditor/RequisitionItemEditor.xaml.cs

@@ -6,57 +6,26 @@ using System;
 using System.Collections.Generic;
 using System.ComponentModel;
 using System.Linq;
-using System.Linq.Expressions;
 using System.Runtime.CompilerServices;
-using System.Text;
-using System.Threading.Tasks;
 using System.Windows;
 using System.Windows.Controls;
-using System.Windows.Data;
-using System.Windows.Documents;
-using System.Windows.Input;
-using System.Windows.Media;
-using System.Windows.Media.Imaging;
-using System.Windows.Shapes;
 
 namespace PRSDesktop.Panels.Requisitions;
 
 /// <summary>
 /// Interaction logic for RequisitionItemEditor.xaml
 /// </summary>
-public partial class RequisitionItemEditor : Window, INotifyPropertyChanged
+public partial class RequisitionItemEditor : INotifyPropertyChanged
 {
     private readonly RequisitionItem Item;
     public RequisitionItem[]? Result { get; private set; }
 
-    private bool _loadedStockHoldings = false;
-    private bool _loadedProductInstances = false;
-    private bool _loadedCustom = false;
-
-    public enum EditorMode
-    {
-        StockHoldings,
-        ProductInstances
-    }
-    public enum EditorState
-    {
-        Normal,
-        Custom
-    }
-
-    public EditorMode Mode { get; init; }
-
-    private EditorState _state;
-    public EditorState State
-    {
-        get => _state;
-        set
-        {
-            _state = value;
-            UpdateState();
-        }
-    }
+    private bool _loadedStockHoldings;
+    private bool _loadedProductInstances;
+    private bool _loadedCustom;
 
+    private bool _allowActual;
+    
     private bool _canSave;
     public bool CanSave
     {
@@ -68,102 +37,74 @@ public partial class RequisitionItemEditor : Window, INotifyPropertyChanged
         }
     }
 
-    public RequisitionItemEditor(List<Product> products, RequisitionItem requisitionItem, EditorMode mode)
+    public RequisitionItemEditor(List<Product> products, RequisitionItem requisitionItem, bool allowActual)
     {
+        _allowActual = allowActual;
+        
         InitializeComponent();
 
         StockHoldingProducts.Items = products;
         ProductInstancesProducts.Items = products;
 
         Item = requisitionItem;
-        Mode = mode;
-        State = requisitionItem.EditType == RequisitionItemEditType.Normal ? EditorState.Normal : EditorState.Custom;
+        TabControl.SelectedItem  = requisitionItem.EditType == RequisitionItemEditType.Normal 
+            ? HoldingsPage 
+            : CustomPage;
 
-        CanSave = false;
-    }
+        InstancesPage.Visibility = _allowActual ? Visibility.Collapsed : Visibility.Visible;
 
-    private void CheckCanSave()
-    {
-        if(State == EditorState.Custom)
-        {
-            CanSave = true;
-        }
-        else if(Mode == EditorMode.StockHoldings)
-        {
-            CanSave = CanSaveStockHoldings();
-        }
-        else if(Mode == EditorMode.ProductInstances)
-        {
-            CanSave = CanSaveProductInstances();
-        }
+        CanSave = false;
+        UpdateState();
     }
-
+    
     private void UpdateState()
     {
-        if(State == EditorState.Custom)
-        {
-            CustomRow.Height = new GridLength(1, GridUnitType.Star);
-            StockHoldingsRow.Height = new GridLength(0);
-            ProductInstancesRow.Height = new GridLength(0);
-
-            CustomButton.Content = Mode switch
-            {
-                EditorMode.ProductInstances => "Product Instances",
-                EditorMode.StockHoldings or _ => "Stock Holdings"
-            };
 
-            if (!_loadedCustom)
-            {
-                LoadCustom();
-                _loadedCustom = true;
-            }
-        }
-        else if(Mode == EditorMode.StockHoldings)
+        if(TabControl.SelectedTab == HoldingsPage)
         {
-            StockHoldingsRow.Height = new GridLength(1, GridUnitType.Star);
-            CustomRow.Height = new GridLength(0);
-            ProductInstancesRow.Height = new GridLength(0);
-
-            CustomButton.Content = "Custom";
-
             if (!_loadedStockHoldings)
             {
                 LoadStockHoldings();
                 _loadedStockHoldings = true;
             }
         }
-        else if(Mode == EditorMode.ProductInstances)
+        else if(TabControl.SelectedTab == InstancesPage)
         {
-            ProductInstancesRow.Height = new GridLength(1, GridUnitType.Star);
-            CustomRow.Height = new GridLength(0);
-            StockHoldingsRow.Height = new GridLength(0);
-
-            CustomButton.Content = "Custom";
-
             if (!_loadedProductInstances)
             {
                 LoadProductInstances();
                 _loadedProductInstances = true;
             }
         }
+        else if (TabControl.SelectedTab == CustomPage)
+        {
+            if (!_loadedCustom)
+            {
+                LoadCustom();
+                _loadedCustom = true;
+            }
+        }
         CheckCanSave();
     }
-
-
+    
+    private void CheckCanSave()
+    {
+        if (TabControl.SelectedTab == HoldingsPage)
+            CanSave = CanSaveStockHoldings();
+        else if (TabControl.SelectedTab == InstancesPage)
+            CanSave = CanSaveProductInstances();
+        else if (TabControl.SelectedTab == CustomPage)
+            CanSave = true;
+    }
+    
     private void DoSave()
     {
-        if(State == EditorState.Custom)
-        {
-            SaveCustom();
-        }
-        else if(Mode == EditorMode.StockHoldings)
-        {
+        if (TabControl.SelectedTab == HoldingsPage)
             SaveStockHoldings();
-        }
-        else if(Mode == EditorMode.ProductInstances)
-        {
+        else if (TabControl.SelectedTab == InstancesPage)
             SaveProductInstances();
-        }
+        else if (TabControl.SelectedTab == CustomPage)
+            SaveCustom();
     }
     private void OKButton_Click(object sender, RoutedEventArgs e)
     {
@@ -178,14 +119,11 @@ public partial class RequisitionItemEditor : Window, INotifyPropertyChanged
         DialogResult = false;
         Close();
     }
-
-    private void CustomButton_Click(object sender, RoutedEventArgs e)
+    
+    private void TabChanged(object sender, SelectionChangedEventArgs e)
     {
-        State = State switch
-        {
-            EditorState.Normal => EditorState.Custom,
-            EditorState.Custom or _ => EditorState.Normal,
-        };
+        if (e.OriginalSource == sender)
+            UpdateState();
     }
 
     #region StockHoldings
@@ -230,14 +168,29 @@ public partial class RequisitionItemEditor : Window, INotifyPropertyChanged
         CheckCanSave();
     }
 
+    private void StockHoldings_OnAfterRefresh(object sender, AfterRefreshEventArgs args)
+    {
+        var row = StockHoldings.Data.Rows.FirstOrDefault();
+        if (row != null)
+        {
+            StockHoldings.SelectedRows = new CoreRow[] { row };
+            SelectHolding(new CoreRow[] { row });
+        }
+    }
+
     private void StockHoldings_OnSelectItem(object sender, InABox.DynamicGrid.DynamicGridSelectionEventArgs e)
     {
-        StockHolding = e.Rows is not null && e.Rows.Length > 0 ? e.Rows[0].ToObject<StockHolding>() : null;
-        RefreshJobRequisitionItems();
+        SelectHolding(e.Rows);
+    }
 
-        JRIRow.Height = StockHolding is not null ? new GridLength(1, GridUnitType.Star) : new GridLength(0);
-        TotalRow.Height = StockHolding is not null ? new GridLength(40) : new GridLength(0);
+    private void SelectHolding(CoreRow[]? rows)
+    {
+        StockHolding = rows?.FirstOrDefault()?.ToObject<StockHolding>(); //rows is not null && rows.Length > 0 ? e.Rows[0].ToObject<StockHolding>() : null));
+        RefreshJobRequisitionItems();
 
+        JRIRow.Height = _allowActual && StockHolding is not null ? new GridLength(1, GridUnitType.Star) : new GridLength(0);
+        TotalRow.Height = _allowActual && StockHolding is not null ? new GridLength(40) : new GridLength(0);
+        RequiredEditor.SetValue(Grid.ColumnProperty, _allowActual && StockHolding is not null ? 4 : 6);
         CheckCanSave();
     }
 
@@ -363,7 +316,7 @@ public partial class RequisitionItemEditor : Window, INotifyPropertyChanged
         }
         else
         {
-            var jris = StockHolding.LoadRequisitionItems();
+            var jris = StockHolding.LoadRequisitionItems(true);
             JRIItems = jris.Select(x =>
             {
                 var newItem = new RequisitionItemStockHoldingItem
@@ -438,7 +391,7 @@ public partial class RequisitionItemEditor : Window, INotifyPropertyChanged
     {
         if (sender is not FrameworkElement element || element.Tag is not RequisitionItemStockHoldingItem item) return;
 
-        item.Taken = item.Quantity;
+        item.Taken = Math.Min(Math.Max(RequiredQuantity+item.Taken-TotalTaken,0),item.Quantity);
     }
 
     #endregion
@@ -515,7 +468,7 @@ public partial class RequisitionItemEditor : Window, INotifyPropertyChanged
         CustomEditorGrid.Items = new RequisitionItem[] { Item };
     }
 
-    private static readonly Columns<RequisitionItem> StockHoldingCustomColumns = new Columns<RequisitionItem>()
+    private static readonly Columns<RequisitionItem> ActualCustomColumns = new Columns<RequisitionItem>()
         .Add(x => x.Product.ID)
         .Add(x => x.Style.ID)
         .Add(x => x.Dimensions)
@@ -523,19 +476,30 @@ public partial class RequisitionItemEditor : Window, INotifyPropertyChanged
         .Add(x => x.Location.ID)
         .Add(x => x.Quantity)
         .Add(x => x.ActualQuantity);
-
-    private static readonly Columns<RequisitionItem> ProductInstanceCustomColumns = new Columns<RequisitionItem>()
+    
+    
+    private static readonly Columns<RequisitionItem> RequstedCustomColumns = new Columns<RequisitionItem>()
         .Add(x => x.Product.ID)
         .Add(x => x.Style.ID)
         .Add(x => x.Dimensions)
         .Add(x => x.Description)
-        .Add(x => x.Quantity);
+        .Add(x => x.Location.ID)
+        .Add(x => x.Quantity)
+        .Add(x => x.ActualQuantity);
+
+    // private static readonly Columns<RequisitionItem> ProductInstanceCustomColumns = new Columns<RequisitionItem>()
+    //     .Add(x => x.Product.ID)
+    //     .Add(x => x.Style.ID)
+    //     .Add(x => x.Dimensions)
+    //     .Add(x => x.Description)
+    //     .Add(x => x.Quantity);
 
     private void CustomEditorGrid_OnFormCustomiseEditor(IDynamicEditorForm sender, object items, DynamicGridColumn column, BaseEditor editor)
     {
-        editor.Editable = (Mode == EditorMode.StockHoldings
-            ? StockHoldingCustomColumns.Contains(column.ColumnName)
-            : ProductInstanceCustomColumns.Contains(column.ColumnName)) ? Editable.Enabled : Editable.Hidden;
+        var columns = _allowActual ? ActualCustomColumns : RequstedCustomColumns;
+        editor.Editable = columns.Contains(column.ColumnName)
+            ? Editable.Enabled 
+            : Editable.Hidden;
     }
 
     /*
@@ -677,4 +641,7 @@ public partial class RequisitionItemEditor : Window, INotifyPropertyChanged
     }
 
     #endregion
+
+
+
 }

+ 1 - 1
prs.desktop/Panels/Requisitions/RequisitionItemEditor/RequisitionItemStockHoldingSelectionGrid.cs

@@ -24,7 +24,7 @@ public class RequisitionItemStockHoldingSelectionGrid : DynamicDataGrid<StockHol
     {
         base.DoReconfigure(options);
 
-        options.Clear().AddRange(DynamicGridOption.SelectColumns, DynamicGridOption.FilterRows);
+        options.Clear().AddRange(DynamicGridOption.SelectColumns);
     }
 
     public override DynamicGridColumns GenerateColumns()

+ 1 - 1
prs.desktop/Panels/Requisitions/RequisitionItemGrid.cs

@@ -226,7 +226,7 @@ public class RequisitionItemGrid : DynamicDataGrid<RequisitionItem>
             item = CreateItem();
         }
 
-        var editor = new RequisitionItemEditor(_products.Result, item, RequisitionItemEditor.EditorMode.StockHoldings);
+        var editor = new RequisitionItemEditor(_products.Result, item, true);
         if(editor.ShowDialog() == true && editor.Result is not null)
         {
             Refresh(false, true);

+ 1 - 1
prs.desktop/prsdesktop.iss

@@ -8,7 +8,7 @@
 #define public Dependency_Path_NetCoreCheck "dependencies\"
 
 #define MyAppName "PRS Desktop"
-#define MyAppVersion "8.01"
+#define MyAppVersion "8.02a"
 #define MyAppPublisher "PRS Digital"
 #define MyAppURL "https://www.prs-software.com.au"
 #define MyAppExeName "PRSDesktop.exe"

+ 1 - 1
prs.licensing/PRSLicensing.iss

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

+ 1 - 1
prs.server/PRSServer.iss

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