JobDocumentSetFolderTree.cs 6.0 KB

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