JobDocumentSetFolderTree.cs 5.9 KB

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