JobPickingListItemGrid.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Reactive.Linq;
  5. using System.Threading.Tasks;
  6. using System.Windows;
  7. using System.Windows.Controls;
  8. using Comal.Classes;
  9. using InABox.Clients;
  10. using InABox.Core;
  11. using InABox.DynamicGrid;
  12. using InABox.Wpf;
  13. using InABox.WPF;
  14. using PRSDesktop.Panels.Requisitions;
  15. namespace PRSDesktop;
  16. internal class JobPickingListItemGrid : DynamicDataGrid<RequisitionItem>, ISpecificGrid, IMasterDetailControl<Requisition, RequisitionItem>
  17. {
  18. public Requisition? Master { get; set; }
  19. private Task<List<Product>>? _products;
  20. public Filter<RequisitionItem> MasterDetailFilter => Master != null
  21. ? new Filter<RequisitionItem>(x => x.RequisitionLink.ID).IsEqualTo(Master.ID)
  22. : new Filter<RequisitionItem>().None();
  23. protected override void Init()
  24. {
  25. base.Init();
  26. HiddenColumns.Add(x => x.EditType);
  27. HiddenColumns.Add(x => x.Done);
  28. }
  29. protected override void Reload(Filters<RequisitionItem> criteria, Columns<RequisitionItem> columns,
  30. ref SortOrder<RequisitionItem>? sort,
  31. Action<CoreTable?, Exception?> action)
  32. {
  33. criteria.Add(MasterDetailFilter);
  34. base.Reload(criteria, columns, ref sort, action);
  35. }
  36. private List<Product> GetProducts()
  37. {
  38. _products ??= Task.Run(() =>
  39. {
  40. return Client.Query(null, new Columns<Product>(x => x.Code).Add(x => x.Name).Add(x => x.ID)).ToList<Product>();
  41. });
  42. return _products.Result;
  43. }
  44. private void DoEdit(CoreRow? row)
  45. {
  46. var item = row?.ToObject<RequisitionItem>();
  47. if(item is null)
  48. {
  49. if (!CanCreateItems())
  50. return;
  51. item = CreateItem();
  52. }
  53. var editor = new RequisitionItemEditor(GetProducts(), item, false);
  54. if(editor.ShowDialog() == true && editor.Result is not null)
  55. {
  56. Refresh(false, true);
  57. DoChanged();
  58. }
  59. }
  60. protected override void DoEdit()
  61. {
  62. var rows = SelectedRows;
  63. if (rows.Length != 1) return;
  64. if (rows[0].Get<RequisitionItem, bool>(x => x.Done))
  65. {
  66. base.DoEdit();
  67. }
  68. else
  69. {
  70. DoEdit(rows[0]);
  71. }
  72. }
  73. protected override void DoAdd(bool OpenEditorOnDirectEdit = false)
  74. {
  75. DoEdit(null);
  76. }
  77. public override void InitialiseEditorForm(IDynamicEditorForm editor, RequisitionItem[] items, Func<Type, CoreTable?>? pageDataHandler = null, bool preloadPages = false)
  78. {
  79. base.InitialiseEditorForm(editor, items, pageDataHandler, preloadPages);
  80. if(items.Any(x => x.Done))
  81. {
  82. editor.ReadOnly = true;
  83. }
  84. }
  85. protected override bool CanCreateItems()
  86. {
  87. return base.CanCreateItems() && (Master?.ID ?? Guid.Empty) != Guid.Empty;
  88. }
  89. public override RequisitionItem CreateItem()
  90. {
  91. var result = base.CreateItem();
  92. result.RequisitionLink.ID = Master?.ID ?? Guid.Empty;
  93. result.RequisitionLink.Synchronise(Master ?? new Requisition());
  94. result.JobLink.ID = Master?.JobLink.ID ?? Guid.Empty;
  95. result.JobLink.Synchronise(Master?.JobLink ?? new JobLink());
  96. return result;
  97. }
  98. }