TeamSelector.xaml.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  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 CoreTable _employees;
  75. public TeamSelector()
  76. {
  77. Settings = new TeamSelectorSettings();
  78. using (new EventSuppressor(Suppress.This))
  79. InitializeComponent();
  80. }
  81. public void Setup()
  82. {
  83. using (new EventSuppressor(Suppress.This))
  84. {
  85. MultiQuery query = new MultiQuery();
  86. query.Add<Team>(
  87. LookupFactory.DefineFilter<Team>(),
  88. new Columns<Team>(x => x.ID)
  89. .Add(x => x.Name),
  90. new SortOrder<Team>(x => x.Name)
  91. );
  92. query.Add<Employee>(
  93. LookupFactory.DefineFilter<Employee>(),
  94. null,
  95. new SortOrder<Employee>(x=>x.Name)
  96. );
  97. query.Add<EmployeeTeam>(
  98. LookupFactory.DefineFilter<EmployeeTeam>(),
  99. new Columns<EmployeeTeam>(x => x.TeamLink.ID)
  100. .Add(x => x.EmployeeLink.ID)
  101. .Add(x => x.EmployeeLink.Name)
  102. );
  103. query.Query();
  104. _employees = query.Get<Employee>();
  105. _employeeteams = query.Get<EmployeeTeam>().Rows.Select(
  106. row => new Tuple<Guid, Guid, String>(
  107. row.Get<EmployeeTeam, Guid>(c => c.TeamLink.ID),
  108. row.Get<EmployeeTeam, Guid>(c => c.EmployeeLink.ID),
  109. row.Get<EmployeeTeam, String>(c => c.EmployeeLink.Name)
  110. )
  111. ).Union(
  112. _employees.Rows.Select(
  113. r => new Tuple<Guid,Guid,String>(
  114. CoreUtils.FullGuid,
  115. r.Get<Employee,Guid>(c=>c.ID),
  116. r.Get<Employee,String>(c=>c.Name)
  117. )
  118. )
  119. ).ToArray();
  120. _teams = query.Get<Team>().Rows.Select(
  121. r => new ListEntry()
  122. {
  123. Key = r.Get<Team, Guid>(c => c.ID),
  124. Value = r.Get<Team, String>(c => c.Name)
  125. }
  126. ).ToArray();
  127. SelectedTeams.ItemsSource = _teams;
  128. }
  129. }
  130. public T[] GetEmployeeData<T>(Func<CoreRow, T> transform)
  131. {
  132. List<T> result = new List<T>();
  133. var selteams = GetSelectedTeams();
  134. var empids = _employeeteams
  135. .Where(x => selteams.Contains(CoreUtils.FullGuid) || selteams.Contains(x.Item1))
  136. .Select(x => x.Item2)
  137. .Distinct()
  138. .ToArray();
  139. var rows = _employees.Rows.Where(r => empids.Contains(r.Get<Employee, Guid>(c => c.ID)));
  140. foreach (var row in rows)
  141. result.Add(transform.Invoke(row));
  142. return result.ToArray();
  143. }
  144. private Guid[] GetSelectedTeams()
  145. {
  146. var jobs = (SelectedTeams.SelectedItems.Count == SelectedTeams.Items.Count)
  147. ? new Guid[] { CoreUtils.FullGuid }
  148. : SelectedTeams.SelectedItems
  149. .OfType<ListEntry>()
  150. .Select(x => x.Key)
  151. .ToArray();
  152. return jobs;
  153. }
  154. public TeamSelectorData Selection
  155. {
  156. get => GetSelectionData();
  157. set => SelectTeams(value);
  158. }
  159. private TeamSelectorData GetSelectionData()
  160. {
  161. return new TeamSelectorData(
  162. GetSelectedTeams()
  163. );
  164. }
  165. private void SelectTeams(TeamSelectorData selection)
  166. {
  167. using (new EventSuppressor(Suppress.This))
  168. {
  169. var sels = _teams.Where(x => selection.Teams.Contains(CoreUtils.FullGuid) || selection.Teams.Contains(x.Key));
  170. SelectedTeams.SelectedItems.Clear();
  171. foreach (var sel in sels)
  172. SelectedTeams.SelectedItems.Add(sel);
  173. }
  174. }
  175. private void SelectedTeams_OnItemChecked(object? sender, ItemCheckedEventArgs e)
  176. {
  177. if (EventSuppressor.IsSet(Suppress.This))
  178. return;
  179. UpdateSettings();
  180. SelectionChanged?.Invoke(this, new TeamSelectorSelectionChangedArgs(GetSelectionData()));
  181. }
  182. }
  183. }