EmployeeQualificationGrid.cs 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Windows;
  7. using System.Windows.Controls;
  8. using Comal.Classes;
  9. using InABox.Core;
  10. using InABox.Clients;
  11. using InABox.DynamicGrid;
  12. using Microsoft.Win32;
  13. using SaveFileDialog = Microsoft.Win32.SaveFileDialog;
  14. namespace PRSDesktop;
  15. public class QualificationManyToManyGrid<T> : DynamicManyToManyGrid<EmployeeQualification, T> where T : Entity, new()
  16. {
  17. public QualificationManyToManyGrid()
  18. {
  19. HiddenColumns.Add(x => x.Qualification.Renewal);
  20. HiddenColumns.Add(x => x.Expiry);
  21. }
  22. protected override void DoReconfigure(DynamicGridOptions options)
  23. {
  24. base.DoReconfigure(options);
  25. options.RecordCount = true;
  26. options.SelectColumns = true;
  27. options.MultiSelect = true;
  28. }
  29. protected override void DoReconfigureEditors(DynamicEditorGrid grid, EmployeeQualification[] items)
  30. {
  31. base.DoReconfigureEditors(grid, items);
  32. var renewal = grid.GetPropertyValue("Qualification.Renewal");
  33. var expiry = grid.FindEditor("Expiry");
  34. expiry.SetEnabled(true);// renewal.Equals(QualificationRenewal.Manual));
  35. }
  36. protected override Dictionary<string, object?> EditorValueChanged(IDynamicEditorForm editor, EmployeeQualification[] items, string name,
  37. object value)
  38. {
  39. var result = base.EditorValueChanged(editor, items, name, value);
  40. if (name.Equals("Qualification.Renewal"))
  41. foreach (var item in items)
  42. {
  43. var expiry = item.CalculateExpiry(item.Qualified, (QualificationRenewal)value, item.Qualification.Period, item.Expiry);
  44. if (expiry != item.Expiry)
  45. {
  46. item.Expiry = expiry;
  47. result["Expiry"] = expiry;
  48. }
  49. }
  50. return result;
  51. }
  52. }
  53. public class QualificationEmployeeGrid : QualificationManyToManyGrid<Qualification>
  54. {
  55. }
  56. public class EmployeeQualificationGrid : QualificationManyToManyGrid<Employee>
  57. {
  58. private readonly Button LoadQualificationTemplate;
  59. private readonly Button SaveQualificationTemplate;
  60. public EmployeeQualificationGrid()
  61. {
  62. LoadQualificationTemplate = AddButton("Load Template", null, "Load Template", LoadQualificationTemplate_Click);
  63. LoadQualificationTemplate.Visibility = Visibility.Collapsed;
  64. SaveQualificationTemplate = AddButton("Save Template", null, "Save Template", SaveQualificationTemplate_Click);
  65. SaveQualificationTemplate.Visibility = Visibility.Collapsed;
  66. HiddenColumns.Add(x => x.Qualification.ID);
  67. }
  68. private bool LoadQualificationTemplate_Click(Button sender, CoreRow[] selectedRows)
  69. {
  70. var dialog = new MultiSelectDialog<EmployeeQualificationTemplate>(null, null, false);
  71. if (dialog.ShowDialog())
  72. {
  73. var templateID = dialog.IDs().First();
  74. var qualificationIds = InABox.Clients.Client.Query(
  75. new Filter<EmployeeQualificationTemplateItem>(x => x.Template.ID).IsEqualTo(templateID),
  76. Columns.None<EmployeeQualificationTemplateItem>().Add(x => x.Qualification.ID))
  77. .ExtractValues<EmployeeQualificationTemplateItem, Guid>(x => x.Qualification.ID);
  78. var qualifications = new Client<Qualification>().Load(new Filter<Qualification>(x => x.ID).InList(qualificationIds));
  79. var guids = CurrentGuids();
  80. var newItems = new List<EmployeeQualification>();
  81. foreach (var qualification in qualifications)
  82. {
  83. if (!guids.Contains(qualification.ID))
  84. {
  85. var newQualification = CreateItem();
  86. newQualification.Qualification.ID = qualification.ID;
  87. newQualification.Qualification.Synchronise(qualification);
  88. newItems.Add(newQualification);
  89. }
  90. }
  91. SaveItems(newItems.ToArray());
  92. return true;
  93. }
  94. return false;
  95. /*var dlg = new OpenFileDialog();
  96. dlg.Filter = "JSON files (*.json)|*.json|All files (*.*)|*.*";
  97. if(dlg.ShowDialog() == true)
  98. {
  99. Guid[] list;
  100. using (var stream = dlg.OpenFile())
  101. {
  102. list = Serialization.Deserialize<Guid[]>(stream);
  103. }
  104. var qualifications = new Client<Qualification>().Load(
  105. new Filter<Qualification>(x => x.ID).InList(list));
  106. var guids = CurrentGuids();
  107. var newItems = new List<EmployeeQualification>();
  108. foreach (var qualification in qualifications)
  109. {
  110. if (!guids.Contains(qualification.ID))
  111. {
  112. var newQualification = CreateItem();
  113. newQualification.Qualification.ID = qualification.ID;
  114. newQualification.Qualification.Synchronise(qualification);
  115. newItems.Add(newQualification);
  116. }
  117. }
  118. SaveItems(newItems.ToArray());
  119. return true;
  120. }
  121. return false;*/
  122. }
  123. private bool SaveQualificationTemplate_Click(Button sender, CoreRow[] selectedRows)
  124. {
  125. var dialog = new MultiSelectDialog<EmployeeQualificationTemplate>(null, null, false);
  126. if (dialog.ShowDialog())
  127. {
  128. var templateID = dialog.IDs().First();
  129. var templateItems = Client.Query(
  130. new Filter<EmployeeQualificationTemplateItem>(x => x.Template.ID).IsEqualTo(templateID),
  131. Columns.None<EmployeeQualificationTemplateItem>().Add(x => x.ID)).Rows.Select(x => x.ToObject<EmployeeQualificationTemplateItem>()).ToArray();
  132. InABox.Clients.Client.Delete(templateItems, "Deleted because re-save of template");
  133. List<EmployeeQualificationTemplateItem> newItems = new();
  134. foreach(var item in Data.Rows)
  135. {
  136. var newItem = new EmployeeQualificationTemplateItem();
  137. newItem.Template.ID = templateID;
  138. newItem.Qualification.ID = item.Get<EmployeeQualification, Guid>(x => x.Qualification.ID);
  139. newItems.Add(newItem);
  140. }
  141. InABox.Clients.Client.Save(newItems, "Save to template");
  142. }
  143. return false;
  144. /*
  145. var list = new List<Guid>();
  146. foreach(var item in Data.Rows)
  147. {
  148. var qualification = item.ToObject<EmployeeQualification>();
  149. list.Add(qualification.Qualification.ID);
  150. }
  151. var dlg = new SaveFileDialog();
  152. dlg.Filter = "JSON files (*.json)|*.json|All files (*.*)|*.*";
  153. dlg.AddExtension = true;
  154. if(dlg.ShowDialog() == true)
  155. {
  156. using(var stream = dlg.OpenFile())
  157. {
  158. Serialization.Serialize(list, stream);
  159. }
  160. }
  161. return false;
  162. */
  163. }
  164. protected override void DoAdd(bool openEditorOnDirectEdit = false)
  165. {
  166. var filter = GetFilter() as Filter<Qualification>;
  167. var dlg = new MultiSelectDialog<Qualification>(filter, null, true);
  168. if (dlg.ShowDialog())
  169. {
  170. var guids = CurrentGuids();
  171. var items = dlg.Items(null);
  172. var single = items.Length == 1;
  173. if (single)
  174. {
  175. var item = items.First();
  176. var newItem = CreateItem();
  177. newItem.Qualification.ID = item.ID;
  178. newItem.Qualification.Synchronise(item);
  179. if (EditItems(new EmployeeQualification[] { newItem }))
  180. {
  181. Refresh(false, true);
  182. }
  183. }
  184. else
  185. {
  186. foreach (var item in items)
  187. {
  188. if (!guids.Contains(item.ID))
  189. {
  190. var newItem = CreateItem();
  191. newItem.Qualification.ID = item.ID;
  192. newItem.Qualification.Synchronise(item);
  193. SaveItem(newItem);
  194. }
  195. }
  196. Refresh(false, true);
  197. }
  198. }
  199. }
  200. }