TeamSelector.xaml.cs 6.8 KB

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