|  | @@ -10,99 +10,98 @@ using InABox.DynamicGrid;
 | 
	
		
			
				|  |  |  using InABox.WPF;
 | 
	
		
			
				|  |  |  using NPOI.SS.Formula.Functions;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -namespace PRSDesktop
 | 
	
		
			
				|  |  | +namespace PRSDesktop;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +public class StockLocationGrid : DynamicDataGrid<StockLocation>
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | -    public class StockLocationGrid : DynamicDataGrid<StockLocation>
 | 
	
		
			
				|  |  | +    private bool bShowAll;
 | 
	
		
			
				|  |  | +    public Button ShowAllBtn;
 | 
	
		
			
				|  |  | +    public Button StockTakeBtn;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    protected override void Init()
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | -        private bool bShowAll;
 | 
	
		
			
				|  |  | -        public Button ShowAllBtn;
 | 
	
		
			
				|  |  | -        public Button StockTakeBtn;
 | 
	
		
			
				|  |  | +        base.Init();
 | 
	
		
			
				|  |  | +        ShowAllBtn = AddButton("Show All", PRSDesktop.Resources.parcel.AsBitmapImage(Color.White), ToggleHiddenJobs);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        protected override void Init()
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            base.Init();
 | 
	
		
			
				|  |  | -            ShowAllBtn = AddButton("Show All", PRSDesktop.Resources.parcel.AsBitmapImage(Color.White), ToggleHiddenJobs);
 | 
	
		
			
				|  |  | +        if (Security.CanEdit<StockMovement>())
 | 
	
		
			
				|  |  | +            StockTakeBtn = AddButton("Stock Take", PRSDesktop.Resources.rack.AsBitmapImage(Color.White), DoStockTake);
 | 
	
		
			
				|  |  | +        HiddenColumns.Add(x => x.Job.ID);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            if (Security.CanEdit<StockMovement>())
 | 
	
		
			
				|  |  | -                StockTakeBtn = AddButton("Stock Take", PRSDesktop.Resources.rack.AsBitmapImage(Color.White), DoStockTake);
 | 
	
		
			
				|  |  | -            HiddenColumns.Add(x => x.Job.ID);
 | 
	
		
			
				|  |  | +        //HiddenColumns.Add(x => x.Movements);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            //HiddenColumns.Add(x => x.Movements);
 | 
	
		
			
				|  |  | +        OnCustomiseEditor += CustomiseEditor;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    protected override void DoReconfigure(FluentList<DynamicGridOption> options)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        base.DoReconfigure(options);
 | 
	
		
			
				|  |  | +        options.AddRange(
 | 
	
		
			
				|  |  | +            DynamicGridOption.MultiSelect,
 | 
	
		
			
				|  |  | +            DynamicGridOption.FilterRows,
 | 
	
		
			
				|  |  | +            DynamicGridOption.SelectColumns
 | 
	
		
			
				|  |  | +        );
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            OnCustomiseEditor += CustomiseEditor;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        protected override void DoReconfigure(FluentList<DynamicGridOption> options)
 | 
	
		
			
				|  |  | +    private bool DoStockTake(Button sender, CoreRow[] rows)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        if (!rows.Any())
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            base.DoReconfigure(options);
 | 
	
		
			
				|  |  | -            options.AddRange(
 | 
	
		
			
				|  |  | -                DynamicGridOption.MultiSelect,
 | 
	
		
			
				|  |  | -                DynamicGridOption.FilterRows,
 | 
	
		
			
				|  |  | -                DynamicGridOption.SelectColumns
 | 
	
		
			
				|  |  | -            );
 | 
	
		
			
				|  |  | +            MessageBox.Show("Please select at least one row for Stocktake!");
 | 
	
		
			
				|  |  | +            return false;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        private bool DoStockTake(Button sender, CoreRow[] rows)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            if (!rows.Any())
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                MessageBox.Show("Please select at least one row for Stocktake!");
 | 
	
		
			
				|  |  | -                return false;
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | +        var page = new StockTakeWindow(rows);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            var page = new StockTakeWindow(rows);
 | 
	
		
			
				|  |  | +        page.Show();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            page.Show();
 | 
	
		
			
				|  |  | +        return true;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            return true;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    private bool ToggleHiddenJobs(Button sender, CoreRow[] rows)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        bShowAll = !bShowAll;
 | 
	
		
			
				|  |  | +        UpdateButton(sender, PRSDesktop.Resources.parcel.AsBitmapImage(Color.White), bShowAll ? "Active Only" : "Show All");
 | 
	
		
			
				|  |  | +        return true;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        private bool ToggleHiddenJobs(Button sender, CoreRow[] rows)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            bShowAll = !bShowAll;
 | 
	
		
			
				|  |  | -            UpdateButton(sender, PRSDesktop.Resources.parcel.AsBitmapImage(Color.White), bShowAll ? "Active Only" : "Show All");
 | 
	
		
			
				|  |  | -            return true;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +    protected override void Reload(Filters<StockLocation> criteria, Columns<StockLocation> columns, ref SortOrder<StockLocation>? sort, Action<CoreTable?, Exception?> action)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        if (!bShowAll)
 | 
	
		
			
				|  |  | +            criteria.Add(new Filter<StockLocation>(x => x.Active).IsEqualTo(true));
 | 
	
		
			
				|  |  | +        base.Reload(criteria, columns, ref sort, action);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        protected override void Reload(Filters<StockLocation> criteria, Columns<StockLocation> columns, ref SortOrder<StockLocation>? sort, Action<CoreTable?, Exception?> action)
 | 
	
		
			
				|  |  | +    protected override void DoValidate(StockLocation[] items, List<string> errors)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        base.DoValidate(items, errors);
 | 
	
		
			
				|  |  | +        var bHoldings = false;
 | 
	
		
			
				|  |  | +        var bDefault = false;
 | 
	
		
			
				|  |  | +        var bTransient = false;
 | 
	
		
			
				|  |  | +        foreach (var item in items)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            if (!bShowAll)
 | 
	
		
			
				|  |  | -                criteria.Add(new Filter<StockLocation>(x => x.Active).IsEqualTo(true));
 | 
	
		
			
				|  |  | -            base.Reload(criteria, columns, ref sort, action);
 | 
	
		
			
				|  |  | +            bHoldings = bHoldings;
 | 
	
		
			
				|  |  | +            bDefault = bDefault || (item.Default && !item.Active);
 | 
	
		
			
				|  |  | +            bTransient = bTransient || (item.Default && item.Type.Equals(StockLocationType.Transient));
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        protected override void DoValidate(StockLocation[] items, List<string> errors)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            base.DoValidate(items, errors);
 | 
	
		
			
				|  |  | -            var bHoldings = false;
 | 
	
		
			
				|  |  | -            var bDefault = false;
 | 
	
		
			
				|  |  | -            var bTransient = false;
 | 
	
		
			
				|  |  | -            foreach (var item in items)
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                bHoldings = bHoldings;
 | 
	
		
			
				|  |  | -                bDefault = bDefault || (item.Default && !item.Active);
 | 
	
		
			
				|  |  | -                bTransient = bTransient || (item.Default && item.Type.Equals(StockLocationType.Transient));
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            if (bHoldings)
 | 
	
		
			
				|  |  | -                errors.Add("Non-Empty locations must always be [Active]!");
 | 
	
		
			
				|  |  | -            if (bDefault)
 | 
	
		
			
				|  |  | -                errors.Add("Default locations must always be [Active]!");
 | 
	
		
			
				|  |  | -            if (bTransient)
 | 
	
		
			
				|  |  | -                errors.Add("Default locations must always be [Permanent]!");
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +        if (bHoldings)
 | 
	
		
			
				|  |  | +            errors.Add("Non-Empty locations must always be [Active]!");
 | 
	
		
			
				|  |  | +        if (bDefault)
 | 
	
		
			
				|  |  | +            errors.Add("Default locations must always be [Active]!");
 | 
	
		
			
				|  |  | +        if (bTransient)
 | 
	
		
			
				|  |  | +            errors.Add("Default locations must always be [Permanent]!");
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        private void CustomiseEditor(IDynamicEditorForm sender, StockLocation[]? items, DynamicGridColumn column, BaseEditor editor)
 | 
	
		
			
				|  |  | +    private void CustomiseEditor(IDynamicEditorForm sender, StockLocation[]? items, DynamicGridColumn column, BaseEditor editor)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        if (string.Equals(column.ColumnName, "Active"))
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            if (string.Equals(column.ColumnName, "Active"))
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                //var bHasHoldings = items.FirstOrDefault().Holdings != 0;
 | 
	
		
			
				|  |  | -                //editor.Editable = bHasHoldings ? Editable.Disabled : Editable.Enabled;
 | 
	
		
			
				|  |  | -                //if (bHasHoldings)
 | 
	
		
			
				|  |  | -                var item = items?.FirstOrDefault();
 | 
	
		
			
				|  |  | -                if (item is not null)
 | 
	
		
			
				|  |  | -                    item.Active = true;
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | +            //var bHasHoldings = items.FirstOrDefault().Holdings != 0;
 | 
	
		
			
				|  |  | +            //editor.Editable = bHasHoldings ? Editable.Disabled : Editable.Enabled;
 | 
	
		
			
				|  |  | +            //if (bHasHoldings)
 | 
	
		
			
				|  |  | +            var item = items?.FirstOrDefault();
 | 
	
		
			
				|  |  | +            if (item is not null)
 | 
	
		
			
				|  |  | +                item.Active = true;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  }
 |