EmployeeGrid.cs 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Drawing;
  5. using System.Linq;
  6. using System.Threading;
  7. using System.Windows;
  8. using System.Windows.Controls;
  9. using Comal.Classes;
  10. using InABox.Clients;
  11. using InABox.Configuration;
  12. using InABox.Core;
  13. using InABox.DynamicGrid;
  14. using InABox.WPF;
  15. namespace PRSDesktop
  16. {
  17. internal class EmployeeGrid : DynamicDataGrid<Employee>
  18. {
  19. private bool ShowAll;
  20. private Button SendFormButton = null!;
  21. public EmployeeGrid()
  22. {
  23. }
  24. protected override void Init()
  25. {
  26. base.Init();
  27. HiddenColumns.Add(x => x.Code);
  28. HiddenColumns.Add(x=>x.RosterTemplate.ID);
  29. HiddenColumns.Add(x=>x.RosterTemplate.Code);
  30. HiddenColumns.Add(x => x.RosterStart);
  31. ActionColumns.Add(new DynamicScheduleEditorColumn<Employee>());
  32. HiddenColumns.Add(x => x.ActiveSchedules);
  33. HiddenColumns.Add(x => x.Thumbnail.ID);
  34. HiddenColumns.Add(x => x.Thumbnail.FileName);
  35. ActionColumns.Add(new DynamicImageManagerColumn<Employee>(this, x => x.Thumbnail, true) { Position = DynamicActionColumnPosition.Start });
  36. ActionColumns.Add(new DynamicMenuColumn(MenuBuild) { Position = DynamicActionColumnPosition.End });
  37. // AddButton("Activities", PRSDesktop.Resources.quality.AsBitmapImage(), ShowActivities);
  38. // AddButton("Available Forms", PRSDesktop.Resources.kanban.AsBitmapImage(), ShowRoleForms);
  39. //ActionColumns.Add(new DynamicEmployeeStatusColumn<Employee>(x => x.InOut));
  40. //HiddenColumns.Add(x => x.InOut);
  41. AddButton("Show All", PRSDesktop.Resources.anonymous.AsBitmapImage(Color.White), ToggleFinishedEmployees);
  42. SendFormButton = AddButton("Send Form", PRSDesktop.Resources.kanban.AsBitmapImage(Color.White), CreateEmployeeForms);
  43. }
  44. protected override void SelectItems(CoreRow[]? rows)
  45. {
  46. base.SelectItems(rows);
  47. SendFormButton.IsEnabled = rows is not null && rows.Length > 0;
  48. }
  49. private bool CreateEmployeeForms(Button button, CoreRow[] rows)
  50. {
  51. if(rows.Length == 0)
  52. {
  53. MessageBox.Show("Please select at least one row.");
  54. return false;
  55. }
  56. var select = new MultiSelectDialog<DigitalForm>(
  57. LookupFactory.DefineLookupFilter<EmployeeForm, DigitalForm, DigitalFormLink>(x => x.Form, Array.Empty<EmployeeForm>()),
  58. LookupFactory.DefineLookupColumns<EmployeeForm, DigitalForm, DigitalFormLink>(x => x.Form)
  59. .Add(x => x.ID)
  60. .Add(x => x.Description),
  61. false);
  62. if (select.ShowDialog() == true)
  63. {
  64. var digitalForm = select.Data().Rows.FirstOrDefault()?.ToObject<DigitalForm>();
  65. if (digitalForm is not null)
  66. {
  67. var employees = Client.Query(
  68. new Filter<EmployeeDigitalForm>(x => x.Form.ID).IsEqualTo(digitalForm.ID),
  69. Columns.None<EmployeeDigitalForm>().Add(x => x.Employee.ID))
  70. .Rows.Select(x => x.Get<EmployeeDigitalForm, Guid>(x => x.Employee.ID))
  71. .ToArray();
  72. var selectedEmployees = rows.Select(x => x.ToObject<Employee>()).ToArray();
  73. var warningEmployees = selectedEmployees.Where(x => !employees.Contains(x.ID)).ToArray();
  74. if (warningEmployees.Any())
  75. {
  76. var message = "The selected form is not usually available for ";
  77. if(warningEmployees.Length == 1)
  78. {
  79. message += warningEmployees[0].Code;
  80. }
  81. else
  82. {
  83. message += string.Join(',', warningEmployees.Take(warningEmployees.Length - 1).Select(x => x.Code))
  84. + " and " + warningEmployees.Last().Code;
  85. }
  86. message += ", since it has not been assigned to their role";
  87. if(warningEmployees.Length > 1)
  88. {
  89. message += "s";
  90. }
  91. message += "; do you still wish to send this form?";
  92. var result = MessageBox.Show(message, "Confirm", MessageBoxButton.YesNo);
  93. if(result != MessageBoxResult.Yes)
  94. {
  95. MessageBox.Show("Sending form cancelled.");
  96. return false;
  97. }
  98. }
  99. var employeeForms = new List<EmployeeForm>(rows.Length);
  100. foreach(var employee in selectedEmployees)
  101. {
  102. var employeeForm = new EmployeeForm();
  103. employeeForm.Form.ID = digitalForm.ID;
  104. employeeForm.Description = digitalForm.Description;
  105. employeeForm.Parent.ID = employee.ID;
  106. employeeForms.Add(employeeForm);
  107. }
  108. Client.Save(employeeForms, "Assigned to employee by user");
  109. MessageBox.Show("Form sent.");
  110. }
  111. }
  112. return false;
  113. }
  114. protected override void DoReconfigure(DynamicGridOptions options)
  115. {
  116. base.DoReconfigure(options);
  117. options.FilterRows = true;
  118. options.SelectColumns = true;
  119. options.MultiSelect = true;
  120. }
  121. private void MenuBuild(DynamicMenuColumn column, CoreRow? row)
  122. {
  123. if (row is null) return;
  124. var newItem = column.AddItem("Digital Forms", null, null);
  125. DynamicGridUtils.PopulateFormMenu<EmployeeForm, Employee, EmployeeLink>(
  126. newItem,
  127. row.Get<Employee, Guid>(x => x.ID),
  128. row.ToObject<Employee>);
  129. column.AddSeparator();
  130. column.AddItem("Activities", PRSDesktop.Resources.quality, ShowActivitiesWindow);
  131. column.AddItem("Available Forms", PRSDesktop.Resources.kanban, ShowRoleFormsWindow);
  132. }
  133. private void ShowActivitiesWindow(CoreRow? row)
  134. {
  135. if (row is null) return;
  136. DynamicGridUtils.CreateGridWindow("Employee Activities",
  137. new EmployeeActivityGrid() { Left = row.ToObject<Employee>() }).ShowDialog();
  138. }
  139. private void ShowRoleFormsWindow(CoreRow? row)
  140. {
  141. if (row is null) return;
  142. DynamicGridUtils.CreateGridWindow("Employee Role Forms",
  143. new EmployeeRoleFormGrid() { Left = row.ToObject<Employee>() }).ShowDialog();
  144. }
  145. private bool ShowActivities(Button button, CoreRow[] rows)
  146. {
  147. if(rows.Length == 0)
  148. {
  149. MessageBox.Show("Please select an employee.");
  150. return false;
  151. }
  152. else if(rows.Length > 1)
  153. {
  154. MessageBox.Show("Please select only one employee");
  155. return false;
  156. }
  157. ShowActivitiesWindow(rows[0]);
  158. return false;
  159. }
  160. private bool ShowRoleForms(Button button, CoreRow[] rows)
  161. {
  162. if(rows.Length == 0)
  163. {
  164. MessageBox.Show("Please select an employee.");
  165. return false;
  166. }
  167. else if(rows.Length > 1)
  168. {
  169. MessageBox.Show("Please select only one employee");
  170. return false;
  171. }
  172. ShowRoleFormsWindow(rows[0]);
  173. return false;
  174. }
  175. private bool ToggleFinishedEmployees(Button btn, CoreRow[] rows)
  176. {
  177. ShowAll = !ShowAll;
  178. UpdateButton(btn, PRSDesktop.Resources.anonymous.AsBitmapImage(Color.White), ShowAll ? "Hide Finished" : "Show All");
  179. return true;
  180. }
  181. protected override void Reload(
  182. Filters<Employee> criteria, Columns<Employee> columns, ref SortOrder<Employee>? sort,
  183. CancellationToken token, Action<CoreTable?, Exception?> action)
  184. {
  185. if (!ShowAll)
  186. criteria.Add(new Filter<Employee>(x => x.FinishDate).IsEqualTo(DateTime.MinValue));
  187. base.Reload(criteria, columns, ref sort, token, action);
  188. }
  189. protected override BaseEditor? GetEditor(object item, DynamicGridColumn column)
  190. {
  191. if (column.ColumnName.StartsWith($"{nameof(Employee.OrgChart)}."))
  192. {
  193. if (!Security.IsAllowed<CanEditOrgChart>())
  194. return new NullEditor();
  195. var orgChartSettings = new GlobalConfiguration<OrgChartSettings>().Load();
  196. if (orgChartSettings.Layout != OrgChartLayout.Employee)
  197. return new NullEditor();
  198. }
  199. return base.GetEditor(item, column);
  200. }
  201. }
  202. }