TeamSelector.xaml.cs 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Linq;
  5. using System.Windows;
  6. using System.Windows.Controls;
  7. using Comal.Classes;
  8. using InABox.Clients;
  9. using InABox.Configuration;
  10. using InABox.Core;
  11. using InABox.DynamicGrid;
  12. using NPOI.HSSF.Util;
  13. using Syncfusion.Windows.Tools.Controls;
  14. namespace PRSDesktop
  15. {
  16. public class TeamSelectorData
  17. {
  18. // FullGuid => All Staff
  19. public Guid[] Teams { get; set; }
  20. public TeamSelectorData(Guid[] teams)
  21. {
  22. Teams = teams;
  23. }
  24. public TeamSelectorData() : this(new[] { CoreUtils.FullGuid })
  25. {
  26. }
  27. }
  28. public class TeamSelectorSettings
  29. {
  30. public TeamSelectorSettings()
  31. {
  32. }
  33. }
  34. public class TeamSelectorSettingsChangedArgs : EventArgs
  35. {
  36. public TeamSelectorSettings Settings { get; private set; }
  37. public TeamSelectorSettingsChangedArgs(TeamSelectorSettings settings)
  38. {
  39. Settings = settings;
  40. }
  41. }
  42. public delegate void TeamSelectorSettingsChanged(object sender, TeamSelectorSettingsChangedArgs args);
  43. public class TeamSelectorSelectionChangedArgs : EventArgs
  44. {
  45. public TeamSelectorData Selection { get; private set; }
  46. public TeamSelectorSelectionChangedArgs(TeamSelectorData selection)
  47. {
  48. Selection = selection;
  49. }
  50. }
  51. public delegate void TeamSelectorSelectionChanged(object sender, TeamSelectorSelectionChangedArgs args);
  52. public partial class TeamSelector : UserControl
  53. {
  54. private enum Suppress
  55. {
  56. This
  57. }
  58. private class ListEntry
  59. {
  60. public Guid Key { get; set; }
  61. public String Value { get; set; }
  62. }
  63. public TeamSelectorSettings Settings { get; set; }
  64. public event TeamSelectorSettingsChanged SettingsChanged;
  65. public event TeamSelectorSelectionChanged SelectionChanged;
  66. private void UpdateSettings()
  67. {
  68. bool changed = false;
  69. if (changed && (!EventSuppressor.IsSet(Suppress.This)))
  70. SettingsChanged?.Invoke(this, new TeamSelectorSettingsChangedArgs(Settings));
  71. }
  72. private ListEntry[] _teams;
  73. private Tuple<Guid,Guid,String>[] _employeeteams;
  74. private Dictionary<Guid, EmployeeRosterItem[]> _rosters;
  75. private CoreTable _employees;
  76. public TeamSelector()
  77. {
  78. Settings = new TeamSelectorSettings();
  79. using (new EventSuppressor(Suppress.This))
  80. InitializeComponent();
  81. }
  82. public void Setup()
  83. {
  84. using (new EventSuppressor(Suppress.This))
  85. {
  86. var results = Client.QueryMultiple(
  87. new KeyedQueryDef<Employee>(
  88. LookupFactory.DefineFilter<Employee>(),
  89. null,
  90. new SortOrder<Employee>(x => x.Name)),
  91. new KeyedQueryDef<EmployeeRosterItem>(
  92. new Filter<EmployeeRosterItem>(x => x.Employee.ID)
  93. .InQuery(LookupFactory.DefineFilter<Employee>(), x => x.ID)),
  94. new KeyedQueryDef<Team>(
  95. LookupFactory.DefineFilter<Team>(),
  96. Columns.None<Team>().Add(x => x.ID)
  97. .Add(x => x.Name),
  98. new SortOrder<Team>(x => x.Name)),
  99. new KeyedQueryDef<EmployeeTeam>(
  100. LookupFactory.DefineFilter<EmployeeTeam>(),
  101. Columns.None<EmployeeTeam>().Add(x => x.TeamLink.ID)
  102. .Add(x => x.EmployeeLink.ID)
  103. .Add(x => x.EmployeeLink.Name)));
  104. _employees = results.Get<Employee>();
  105. _rosters = results.Get<EmployeeRosterItem>().ToObjects<EmployeeRosterItem>()
  106. .GroupBy(x => x.Employee.ID, x => x).ToDictionary(x => x.Key, x => x.ToArray());
  107. _employeeteams = results.Get<EmployeeTeam>().Rows.Select(
  108. row => new Tuple<Guid, Guid, String>(
  109. row.Get<EmployeeTeam, Guid>(c => c.TeamLink.ID),
  110. row.Get<EmployeeTeam, Guid>(c => c.EmployeeLink.ID),
  111. row.Get<EmployeeTeam, String>(c => c.EmployeeLink.Name)
  112. )
  113. ).Union(
  114. _employees.Rows.Select(
  115. r => new Tuple<Guid,Guid,String>(
  116. CoreUtils.FullGuid,
  117. r.Get<Employee,Guid>(c=>c.ID),
  118. r.Get<Employee,String>(c=>c.Name)
  119. )
  120. )
  121. ).ToArray();
  122. _teams = results.Get<Team>().Rows.Select(
  123. r => new ListEntry()
  124. {
  125. Key = r.Get<Team, Guid>(c => c.ID),
  126. Value = r.Get<Team, String>(c => c.Name)
  127. }
  128. ).ToArray();
  129. SelectedTeams.ItemsSource = _teams;
  130. }
  131. }
  132. public T[] GetEmployeeData<T>(Func<CoreRow, EmployeeRosterItem[], T> transform)
  133. {
  134. List<T> result = new List<T>();
  135. var selteams = GetSelectedTeams();
  136. var empids = _employeeteams
  137. .Where(x => selteams.Contains(CoreUtils.FullGuid) || selteams.Contains(x.Item1))
  138. .Select(x => x.Item2)
  139. .Distinct()
  140. .ToArray();
  141. var rows = _employees.Rows.Where(r => empids.Contains(r.Get<Employee, Guid>(c => c.ID)));
  142. foreach (var row in rows)
  143. {
  144. if (!_rosters.TryGetValue(row.Get<Employee, Guid>(x => x.ID), out var rosters))
  145. {
  146. rosters = Array.Empty<EmployeeRosterItem>();
  147. }
  148. result.Add(transform.Invoke(row, rosters));
  149. }
  150. return result.ToArray();
  151. }
  152. private Guid[] GetSelectedTeams()
  153. {
  154. var jobs = (SelectedTeams.SelectedItems.Count == SelectedTeams.Items.Count)
  155. ? new Guid[] { CoreUtils.FullGuid }
  156. : SelectedTeams.SelectedItems
  157. .OfType<ListEntry>()
  158. .Select(x => x.Key)
  159. .ToArray();
  160. return jobs;
  161. }
  162. public TeamSelectorData Selection
  163. {
  164. get => GetSelectionData();
  165. set => SelectTeams(value);
  166. }
  167. private TeamSelectorData GetSelectionData()
  168. {
  169. return new TeamSelectorData(
  170. GetSelectedTeams()
  171. );
  172. }
  173. private void SelectTeams(TeamSelectorData selection)
  174. {
  175. using (new EventSuppressor(Suppress.This))
  176. {
  177. var sels = _teams.Where(x => selection.Teams.Contains(CoreUtils.FullGuid) || selection.Teams.Contains(x.Key));
  178. SelectedTeams.SelectedItems.Clear();
  179. foreach (var sel in sels)
  180. SelectedTeams.SelectedItems.Add(sel);
  181. }
  182. }
  183. private void SelectedTeams_OnItemChecked(object? sender, ItemCheckedEventArgs e)
  184. {
  185. if (EventSuppressor.IsSet(Suppress.This))
  186. return;
  187. UpdateSettings();
  188. SelectionChanged?.Invoke(this, new TeamSelectorSelectionChangedArgs(GetSelectionData()));
  189. }
  190. }
  191. }