TimesheetPanel.xaml.cs 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Linq;
  5. using System.Threading.Tasks;
  6. using System.Windows;
  7. using System.Windows.Controls;
  8. using System.Windows.Input;
  9. using Comal.Classes;
  10. using InABox.Configuration;
  11. using InABox.Core;
  12. using InABox.DynamicGrid;
  13. using InABox.Wpf;
  14. using PRS.Shared;
  15. namespace PRSDesktop;
  16. public class TimesheetGlobalSettings : BaseObject, IGlobalConfigurationSettings
  17. {
  18. public int PageSize { get; set; } = 5000;
  19. }
  20. /// <summary>
  21. /// Interaction logic for TimesheetPanel.xaml
  22. /// </summary>
  23. public partial class TimesheetPanel : UserControl, IPanel<TimeSheet>
  24. {
  25. private TimeSheetSettings _settings = new();
  26. private TimesheetGlobalSettings _globalSettings = new();
  27. public TimesheetPanel()
  28. {
  29. Task[] setup = new Task[]
  30. {
  31. Task.Run(() => _settings = new UserConfiguration<TimeSheetSettings>().Load()),
  32. Task.Run(() => _globalSettings = new GlobalConfiguration<TimesheetGlobalSettings>().Load())
  33. };
  34. InitializeComponent();
  35. Task.WaitAll(setup);
  36. }
  37. public event DataModelUpdateEvent? OnUpdateDataModel;
  38. public bool IsReady { get; set; }
  39. public void Setup()
  40. {
  41. LoadSettings();
  42. TimeSheets.Reconfigure();
  43. TimeSheets.Refresh(true, false);
  44. Notes.Refresh(true, true);
  45. Assignments.Refresh(true, true);
  46. }
  47. private void TimeSheets_OnReconfigure(DynamicGridOptions options)
  48. {
  49. options.PageSize = _globalSettings.PageSize;
  50. }
  51. public Dictionary<string, object[]> Selected()
  52. {
  53. return new Dictionary<string, object[]> { { typeof(TimeSheet).EntityName(), TimeSheets.SelectedRows } };
  54. }
  55. public void Shutdown(CancelEventArgs? cancel)
  56. {
  57. }
  58. public void CreateToolbarButtons(IPanelHost host)
  59. {
  60. HumanResourcesSetupActions.EmployeeActivities(host);
  61. HumanResourcesSetupActions.EmployeeRosters(host);
  62. host.CreateSetupSeparator();
  63. HumanResourcesSetupActions.EmployeeOvertimeRules(host);
  64. HumanResourcesSetupActions.EmployeeOvertime(host);
  65. HumanResourcesSetupActions.EmployeeStandardLeave(host);
  66. host.CreateSetupSeparator();
  67. host.CreateSetupAction(new PanelAction() { Caption = "Timesheets Settings", Image = PRSDesktop.Resources.product, OnExecute =
  68. (obj) =>
  69. {
  70. var grid = new DynamicItemsListGrid<TimesheetGlobalSettings>();
  71. if (grid.EditItems(new TimesheetGlobalSettings[] { _globalSettings }))
  72. {
  73. new GlobalConfiguration<TimesheetGlobalSettings>().Save(_globalSettings);
  74. TimeSheets.Reconfigure();
  75. Refresh();
  76. }
  77. }
  78. });
  79. host.CreatePanelAction(new PanelAction() { Caption = "Process Leave", Image = PRSDesktop.Resources.leave, OnExecute = ProcessLeave });
  80. PostUtils.CreateToolbarButtons(host,
  81. () => (DataModel(Selection.Selected) as IDataModel<TimeSheet>)!,
  82. () => TimeSheets.Refresh(false, true),
  83. true);
  84. }
  85. private void ProcessLeave(PanelAction obj)
  86. {
  87. var processor = new TimeSheetLeaveProcessor(StartPicker.SelectedDate.Value, EndPicker.SelectedDate.Value);
  88. if (processor.ShowDialog() == true)
  89. TimeSheets.Refresh(false, true);
  90. }
  91. public string SectionName => "Timesheets";
  92. public DataModel DataModel(Selection selection)
  93. {
  94. var ids = TimeSheets.ExtractValues(x => x.ID, selection).ToArray();
  95. return new BaseDataModel<TimeSheet>(new Filter<TimeSheet>(x => x.ID).InList(ids.ToArray()));
  96. }
  97. private void TimeSheets_OnSelectItem(object sender, DynamicGridSelectionEventArgs e)
  98. {
  99. if(e.Rows is null || e.Rows.Length != 1)
  100. {
  101. Notes.EmployeeID = Guid.Empty;
  102. Assignments.EmployeeID = Guid.Empty;
  103. Notes.Refresh(false, true);
  104. Assignments.Refresh(false, true);
  105. }
  106. else
  107. {
  108. var item = e.Rows[0].ToObject<TimeSheet>();
  109. Notes.EmployeeID = item.EmployeeLink.ID;
  110. Notes.Date = item.Date.Date;
  111. Assignments.EmployeeID = item.EmployeeLink.ID;
  112. Assignments.Date = item.Date.Date;
  113. Notes.Refresh(false, true);
  114. Assignments.Refresh(false, true);
  115. }
  116. }
  117. public void Refresh()
  118. {
  119. TimeSheets.StartDate = StartPicker.SelectedDate.Value;
  120. if (FutureTimes.IsChecked == true)
  121. TimeSheets.EndDate = EndPicker.SelectedDate.Value;
  122. else
  123. TimeSheets.EndDate = EndPicker.SelectedDate.Value > DateTime.Today ? DateTime.Today : EndPicker.SelectedDate.Value;
  124. TimeSheets.Search = Search.Text;
  125. TimeSheets.ApprovedOnly = ApprovedTimes.IsChecked == true;
  126. TimeSheets.Refresh(false, true);
  127. Notes.Refresh(false, true);
  128. Assignments.Refresh(false, true);
  129. }
  130. public void Heartbeat(TimeSpan time)
  131. {
  132. }
  133. private void LoadSettings()
  134. {
  135. _settings = new UserConfiguration<TimeSheetSettings>().Load();
  136. StartPicker.SelectedDate = _settings.StartDate;
  137. EndPicker.SelectedDate = _settings.EndDate;
  138. View.SelectedIndex = _settings.View;
  139. UpdateStartFinishDates();
  140. FutureTimes.IsChecked = _settings.FutureTimes;
  141. ApprovedTimes.IsChecked = _settings.ApprovedOnly;
  142. SplitPanel.AnchorWidth = _settings.AnchorWidth;
  143. SplitPanel.View = _settings.ViewType.ToSplitPanelView();
  144. }
  145. private void SaveSettings()
  146. {
  147. if (IsReady)
  148. {
  149. _settings.View = View.SelectedIndex;
  150. _settings.StartDate = StartPicker.SelectedDate.HasValue ? StartPicker.SelectedDate.Value : DateTime.Today;
  151. _settings.EndDate = EndPicker.SelectedDate.HasValue ? EndPicker.SelectedDate.Value : DateTime.Today;
  152. _settings.FutureTimes = FutureTimes.IsChecked == true;
  153. _settings.ApprovedOnly = ApprovedTimes.IsChecked == true;
  154. _settings.AnchorWidth = SplitPanel.AnchorWidth;
  155. _settings.ViewType = SplitPanel.View.ToScreenViewType();
  156. new UserConfiguration<TimeSheetSettings>().Save(_settings);
  157. }
  158. }
  159. private void UpdateStartEndPicker(DateTime start, DateTime end)
  160. {
  161. if (StartPicker == null || EndPicker == null)
  162. return;
  163. StartPicker.IsEnabled = false;
  164. EndPicker.IsEnabled = false;
  165. StartPicker.SelectedDate = start;
  166. EndPicker.SelectedDate = end;
  167. }
  168. private void View_SelectionChanged(object sender, SelectionChangedEventArgs e)
  169. {
  170. UpdateStartFinishDates();
  171. }
  172. private void UpdateStartFinishDates()
  173. {
  174. if (View.SelectedIndex == 0)
  175. {
  176. UpdateStartEndPicker(DateTime.Today, DateTime.Today);
  177. }
  178. else if (View.SelectedIndex == 1)
  179. {
  180. UpdateStartEndPicker(DateTime.Today.AddDays(0 - 1), DateTime.Today.AddDays(0 - 1));
  181. }
  182. else if (View.SelectedIndex == 2)
  183. {
  184. UpdateStartEndPicker(DateTime.Today.AddDays(0 - (double)DateTime.Today.DayOfWeek).AddDays(1),
  185. DateTime.Today.AddDays(0 - (double)DateTime.Today.DayOfWeek).AddDays(7));
  186. }
  187. else if (View.SelectedIndex == 3)
  188. {
  189. UpdateStartEndPicker(DateTime.Today.AddDays(0 - (double)DateTime.Today.DayOfWeek).AddDays(0 - 6),
  190. DateTime.Today.AddDays(0 - (double)DateTime.Today.DayOfWeek));
  191. }
  192. else if (View.SelectedIndex == 4)
  193. {
  194. UpdateStartEndPicker(new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1),
  195. new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1).AddMonths(1).AddDays(0 - 1));
  196. }
  197. else if (View.SelectedIndex == 5)
  198. {
  199. UpdateStartEndPicker(new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1).AddMonths(0 - 1),
  200. new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1).AddDays(0 - 1));
  201. }
  202. else if (View.SelectedIndex == 6)
  203. {
  204. UpdateStartEndPicker(new DateTime(DateTime.Today.Year, 1, 1), new DateTime(DateTime.Today.Year, 1, 1).AddYears(1).AddDays(0 - 1));
  205. }
  206. else if (View.SelectedIndex == 7)
  207. {
  208. UpdateStartEndPicker(new DateTime(DateTime.Today.Year, 1, 1).AddYears(0 - 1), new DateTime(DateTime.Today.Year, 1, 1).AddDays(0 - 1));
  209. }
  210. else
  211. {
  212. StartPicker.IsEnabled = true;
  213. EndPicker.IsEnabled = true;
  214. }
  215. if (!IsReady)
  216. return;
  217. SaveSettings();
  218. Refresh();
  219. }
  220. private void SelectedDateChanged(object sender, SelectionChangedEventArgs e)
  221. {
  222. if (!StartPicker.IsEnabled || !EndPicker.IsEnabled || !IsReady)
  223. return;
  224. SaveSettings();
  225. Refresh();
  226. }
  227. private void Search_KeyUp(object sender, KeyEventArgs e)
  228. {
  229. if (e.Key == Key.Enter || e.Key == Key.Return)
  230. Refresh();
  231. }
  232. private void FutureTimes_Checked(object sender, RoutedEventArgs e)
  233. {
  234. if (!IsReady)
  235. return;
  236. SaveSettings();
  237. Refresh();
  238. }
  239. private void ApprovedTimes_Checked(object sender, RoutedEventArgs e)
  240. {
  241. if (!IsReady)
  242. return;
  243. SaveSettings();
  244. Refresh();
  245. }
  246. private void SplitPanel_OnChanged(object sender, DynamicSplitPanelSettings e)
  247. {
  248. SaveSettings();
  249. }
  250. }