JobDocumentSetFolderTree.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. using System;
  2. using System.Linq;
  3. using System.Linq.Expressions;
  4. using System.Windows;
  5. using System.Windows.Controls;
  6. using Comal.Classes;
  7. using InABox.Clients;
  8. using InABox.Core;
  9. using InABox.DynamicGrid;
  10. using InABox.WPF;
  11. using InABox.Wpf;
  12. using System.Collections.Generic;
  13. using System.Windows.Forms;
  14. using System.Threading;
  15. namespace PRSDesktop;
  16. public class JobDocumentSetFolderTree : DynamicDataGrid<JobDocumentSetFolder>, IMasterDetailControl<Job,JobDocumentSetFolder>
  17. {
  18. public Job? Master { get; set; }
  19. public Filter<JobDocumentSetFolder> MasterDetailFilter => (Master?.ID ?? Guid.Empty) != Guid.Empty
  20. ? new Filter<JobDocumentSetFolder>(x => x.Job.ID).IsEqualTo(Master.ID)
  21. : new Filter<JobDocumentSetFolder>().None();
  22. public bool HasAllItems { get; set; } = true;
  23. public JobDocumentSetFolderTree() : base()
  24. {
  25. HiddenColumns.Add(x => x.Documents);
  26. }
  27. private DynamicGridTreeUIComponent<JobDocumentSetFolder>? _uiComponent;
  28. private DynamicGridTreeUIComponent<JobDocumentSetFolder> UIComponent
  29. {
  30. get
  31. {
  32. if(_uiComponent is null)
  33. {
  34. _uiComponent = new DynamicGridTreeUIComponent<JobDocumentSetFolder>(
  35. x => x.ID,
  36. x => x.Parent.ID)
  37. {
  38. Parent = this,
  39. MaxRowHeight = 30,
  40. ShowHeader = false
  41. };
  42. _uiComponent.OnContextMenuOpening += JobDocumentSetFolderTree_OnContextMenuOpening;
  43. }
  44. return _uiComponent;
  45. }
  46. }
  47. protected override IDynamicGridUIComponent<JobDocumentSetFolder> CreateUIComponent()
  48. {
  49. return UIComponent;
  50. }
  51. protected override DynamicGridColumns LoadColumns()
  52. {
  53. var columns = new DynamicGridColumns();
  54. columns.Add<JobDocumentSetFolder, string>(x => x.Name, 0, "Name", "", Alignment.MiddleLeft);
  55. return columns;
  56. }
  57. public IEnumerable<CoreRow> GetChildFolders(Guid folderID)
  58. {
  59. return UIComponent.GetChildren(folderID);
  60. }
  61. private void JobDocumentSetFolderTree_OnContextMenuOpening(CoreTreeNode? node, ContextMenu menu)
  62. {
  63. if(node is not null && node.ID != CoreUtils.FullGuid && Options.AddRows)
  64. {
  65. menu.AddItem("Add Child Folder", null, node, (n) =>
  66. {
  67. var item = CreateItem();
  68. item.Parent.ID = n.ID;
  69. if (EditItems([item]))
  70. {
  71. DoChanged();
  72. Refresh(false, true);
  73. }
  74. });
  75. }
  76. }
  77. protected override void Reload(
  78. Filters<JobDocumentSetFolder> criteria, Columns<JobDocumentSetFolder> columns, ref SortOrder<JobDocumentSetFolder>? sort,
  79. CancellationToken token, Action<CoreTable?, Exception?> action)
  80. {
  81. criteria.Add(MasterDetailFilter);
  82. base.Reload(criteria, columns, ref sort, token, (table, exception) =>
  83. {
  84. if(table != null)
  85. {
  86. if (HasAllItems)
  87. {
  88. var newRow = table.NewRow();
  89. newRow.Set<JobDocumentSetFolder, Guid>(x => x.ID, CoreUtils.FullGuid);
  90. newRow.Set<JobDocumentSetFolder, Guid>(x => x.Parent.ID, Guid.Empty);
  91. newRow.Set<JobDocumentSetFolder, string>(x => x.Name, "All Items");
  92. newRow.Set<JobDocumentSetFolder, int>(x => x.Documents, int.MaxValue);
  93. table.Rows.Insert(0, newRow);
  94. }
  95. }
  96. action(table, exception);
  97. });
  98. }
  99. protected override bool CanCreateItems()
  100. {
  101. if ((Master?.ID ?? Guid.Empty) == Guid.Empty)
  102. {
  103. MessageWindow.ShowMessage("Please Select a Job First!", "No job selected");
  104. return false;
  105. }
  106. return base.CanCreateItems();
  107. }
  108. public override JobDocumentSetFolder CreateItem()
  109. {
  110. var folder = base.CreateItem();
  111. folder.Job.ID = Master.ID;
  112. folder.Job.Synchronise(Master);
  113. folder.Name = "New Folder";
  114. return folder;
  115. }
  116. public override JobDocumentSetFolder LoadItem(CoreRow row)
  117. {
  118. if(row.Get<JobDocumentSetFolder, Guid>(x => x.ID) == CoreUtils.FullGuid)
  119. {
  120. return row.ToObject<JobDocumentSetFolder>();
  121. }
  122. return base.LoadItem(row);
  123. }
  124. public override JobDocumentSetFolder[] LoadItems(IList<CoreRow> rows)
  125. {
  126. var all = rows.FirstOrDefault(x => x.Get<JobDocumentSetFolder, Guid>(x => x.ID) == CoreUtils.FullGuid);
  127. if(all is not null)
  128. {
  129. return new JobDocumentSetFolder[] { all.ToObject<JobDocumentSetFolder>() };
  130. }
  131. return base.LoadItems(rows);
  132. }
  133. public override bool EditItems(JobDocumentSetFolder[] items, Func<Type, CoreTable?>? PageDataHandler = null, bool PreloadPages = false)
  134. {
  135. if (items.Any(x => x.ID == CoreUtils.FullGuid))
  136. {
  137. MessageWindow.ShowMessage("This item cannot be edited.", "Cannot edit");
  138. return false;
  139. }
  140. return base.EditItems(items, PageDataHandler, PreloadPages);
  141. }
  142. public override void SaveItem(JobDocumentSetFolder folder)
  143. {
  144. if (folder.ID != CoreUtils.FullGuid)
  145. {
  146. Client.Save(folder, "Edited by User");
  147. }
  148. }
  149. protected override bool CanDeleteItems(params CoreRow[] rows)
  150. {
  151. if(rows.Any(x => x.Get<JobDocumentSetFolder, Guid>(x => x.ID) == CoreUtils.FullGuid))
  152. {
  153. MessageWindow.ShowMessage("This folder cannot be deleted.", "Cannot delete");
  154. return false;
  155. }
  156. else if(rows.Any(x => x.Get<JobDocumentSetFolder, int>(x => x.Documents) > 0))
  157. {
  158. MessageWindow.ShowMessage("This folder is not empty, and cannot be deleted!", "Folder not empty");
  159. return false;
  160. }
  161. else
  162. {
  163. return base.CanDeleteItems();
  164. }
  165. }
  166. }