JobProductStylesGrid.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. using Comal.Classes;
  2. using InABox.Clients;
  3. using InABox.Core;
  4. using InABox.DynamicGrid;
  5. using InABox.Wpf;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. namespace PRSDesktop;
  12. public class JobProductStylesGrid : DynamicDataGrid<JobStyle>, IMasterDetailControl<Job,JobStyle>, IDataModelSource
  13. {
  14. public Job? Master { get; set; }
  15. public Filter<JobStyle> MasterDetailFilter => (Master?.ID ?? Guid.Empty) != Guid.Empty
  16. ? new Filter<JobStyle>(x => x.Job.ID).IsEqualTo(Master.ID)
  17. : new Filter<JobStyle>().None();
  18. protected override void Init()
  19. {
  20. base.Init();
  21. HiddenColumns.Add(x => x.JobDocumentSet.ID);
  22. HiddenColumns.Add(x => x.Style.Code);
  23. HiddenColumns.Add(x => x.Style.Description);
  24. HiddenColumns.Add(x => x.Style.Image.ID);
  25. HiddenColumns.Add(x => x.Style.Image.FileName);
  26. ActionColumns.Add(new DynamicMenuColumn(BuildMenu));
  27. ActionColumns.Add(new DynamicImageManagerColumn<JobStyle>(this, x => x.Style.Image, false) { Position = DynamicActionColumnPosition.Start });
  28. }
  29. protected override void DoReconfigure(FluentList<DynamicGridOption> options)
  30. {
  31. base.DoReconfigure(options);
  32. options.Add(DynamicGridOption.SelectColumns);
  33. }
  34. public override DynamicGridColumns GenerateColumns()
  35. {
  36. var columns = new DynamicGridColumns();
  37. columns.Add<JobStyle, string>(x => x.Style.Code, 150, "", "", Alignment.MiddleCenter);
  38. columns.Add<JobStyle, string>(x => x.Style.Description, 0, "", "", Alignment.MiddleLeft);
  39. columns.Add<JobStyle, string>(x => x.JobDocumentSet.Description, 0, "Approval Document", "", Alignment.MiddleLeft);
  40. columns.Add<JobStyle, string>(x => x.JobDocumentSet.CurrentMileStone.Type.Code, 100, "Stage", "", Alignment.MiddleCenter);
  41. columns.Add<JobStyle, string>(x => x.JobDocumentSet.CurrentMileStone.Revision, 50, "Rev", "", Alignment.MiddleCenter);
  42. columns.Add<JobStyle, JobDocumentSetMileStoneStatus>(x => x.JobDocumentSet.CurrentMileStone.Status, 100, "Status", "", Alignment.MiddleCenter);
  43. return columns;
  44. }
  45. private void BuildMenu(DynamicMenuColumn column, CoreRow? row)
  46. {
  47. if (row is not null)
  48. {
  49. var docSet = row.Get<JobStyle, Guid>(x => x.JobDocumentSet.ID);
  50. if (docSet != Guid.Empty)
  51. {
  52. var caption = Security.CanEdit<JobDocumentSet>() ? "Edit Document Set" : "View Document Set";
  53. column.AddItem(caption, PRSDesktop.Resources.design, (_) =>
  54. {
  55. ViewDocumentSet(docSet);
  56. });
  57. }
  58. else
  59. {
  60. if (Security.CanEdit<JobDocumentSet>())
  61. {
  62. column.AddItem("Create Document Set", PRSDesktop.Resources.design, (_) =>
  63. {
  64. CreateDocumentSet(row);
  65. });
  66. }
  67. }
  68. }
  69. }
  70. private static DynamicDataGrid<JobDocumentSet> GetDocumentSetGrid()
  71. {
  72. var gridType = DynamicGridUtils.FindDynamicGrid(typeof(DynamicDataGrid<>), typeof(JobDocumentSet))
  73. ?? typeof(DynamicDataGrid<JobDocumentSet>);
  74. return (Activator.CreateInstance(gridType) as DynamicDataGrid<JobDocumentSet>)!;
  75. }
  76. private void ViewDocumentSet(Guid docSetID)
  77. {
  78. var docSet = Client.Query(
  79. new Filter<JobDocumentSet>(x => x.ID).IsEqualTo(docSetID),
  80. DynamicGridUtils.LoadEditorColumns<JobDocumentSet>(new Columns<JobDocumentSet>(x => x.ID)))
  81. .ToObjects<JobDocumentSet>()
  82. .FirstOrDefault();
  83. if (docSet is null)
  84. {
  85. MessageWindow.ShowMessage("Document set does not exist.", "Error");
  86. Logger.Send(LogType.Information, "", "Document set does not exist.");
  87. return;
  88. }
  89. GetDocumentSetGrid().EditItems(new JobDocumentSet[] { docSet });
  90. }
  91. private void CreateDocumentSet(CoreRow row)
  92. {
  93. var dialog = new JobDocumentSetFolderSelectionDialog(Master);
  94. if (dialog.ShowDialog() != true)
  95. {
  96. MessageWindow.ShowMessage("You need to select a folder to add this document set to.", "Folder required");
  97. return;
  98. }
  99. var code = row.Get<JobStyle, string>(x => x.Style.Code);
  100. var docSet = new JobDocumentSet
  101. {
  102. Code = code,
  103. Description = $"{code} Approval".Trim()
  104. };
  105. docSet.Job.ID = Master.ID;
  106. docSet.Folder.ID = dialog.SelectedFolder;
  107. if (GetDocumentSetGrid().EditItems(new JobDocumentSet[] { docSet }))
  108. {
  109. var jobStyle = row.ToObject<JobStyle>();
  110. jobStyle.JobDocumentSet.ID = docSet.ID;
  111. Client.Save(jobStyle, "Attached to new JobDocumentSet");
  112. Refresh(false, true);
  113. }
  114. }
  115. public string SectionName => "Job Product Styles";
  116. public event DataModelUpdateEvent? OnUpdateDataModel;
  117. protected override bool CanCreateItems()
  118. {
  119. return base.CanCreateItems() && (Master?.ID ?? Guid.Empty) != Guid.Empty;
  120. }
  121. public override JobStyle CreateItem()
  122. {
  123. var result = base.CreateItem();
  124. result.Job.ID = Master?.ID ?? Guid.Empty;
  125. result.Job.Synchronise(Master ?? new Job());
  126. return result;
  127. }
  128. public DataModel DataModel(Selection selection)
  129. {
  130. var ids = ExtractValues(x => x.ID, selection).ToArray();
  131. return new BaseDataModel<JobStyle>(new Filter<JobStyle>(x => x.ID).InList(ids));
  132. }
  133. protected override void Reload(Filters<JobStyle> criteria, Columns<JobStyle> columns, ref SortOrder<JobStyle>? sort, Action<CoreTable?, Exception?> action)
  134. {
  135. criteria.Add(MasterDetailFilter);
  136. base.Reload(criteria, columns, ref sort, action);
  137. }
  138. }