EmployeeGrid.cs 9.1 KB

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