TimesheetPanel.xaml.cs 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  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. HumanResourcesSetupActions.AssignmentCostingSettings(host);
  80. host.CreatePanelAction(new PanelAction() { Caption = "Process Leave", Image = PRSDesktop.Resources.leave, OnExecute = ProcessLeave });
  81. PostUtils.CreateToolbarButtons(host,
  82. () => (DataModel(Selection.Selected) as IDataModel<TimeSheet>)!,
  83. () => TimeSheets.Refresh(false, true),
  84. true);
  85. }
  86. private void ProcessLeave(PanelAction obj)
  87. {
  88. var processor = new TimeSheetLeaveProcessor(StartPicker.SelectedDate.Value, EndPicker.SelectedDate.Value);
  89. if (processor.ShowDialog() == true)
  90. TimeSheets.Refresh(false, true);
  91. }
  92. public string SectionName => "Timesheets";
  93. public DataModel DataModel(Selection selection)
  94. {
  95. var ids = TimeSheets.ExtractValues(x => x.ID, selection).ToArray();
  96. return new BaseDataModel<TimeSheet>(Filter<TimeSheet>.Where(x => x.ID).InList(ids.ToArray()));
  97. }
  98. private void TimeSheets_OnSelectItem(object sender, DynamicGridSelectionEventArgs e)
  99. {
  100. if(e.Rows is null || e.Rows.Length != 1)
  101. {
  102. Notes.EmployeeID = Guid.Empty;
  103. Assignments.EmployeeID = Guid.Empty;
  104. Notes.Refresh(false, true);
  105. Assignments.Refresh(false, true);
  106. }
  107. else
  108. {
  109. var item = e.Rows[0].ToObject<TimeSheet>();
  110. Notes.EmployeeID = item.EmployeeLink.ID;
  111. Notes.Date = item.Date.Date;
  112. Assignments.EmployeeID = item.EmployeeLink.ID;
  113. Assignments.Date = item.Date.Date;
  114. Notes.Refresh(false, true);
  115. Assignments.Refresh(false, true);
  116. }
  117. }
  118. public void Refresh()
  119. {
  120. TimeSheets.StartDate = StartPicker.SelectedDate.Value;
  121. if (FutureTimes.IsChecked == true)
  122. TimeSheets.EndDate = EndPicker.SelectedDate.Value;
  123. else
  124. TimeSheets.EndDate = EndPicker.SelectedDate.Value > DateTime.Today ? DateTime.Today : EndPicker.SelectedDate.Value;
  125. TimeSheets.Search = Search.Text;
  126. TimeSheets.ApprovedOnly = ApprovedTimes.IsChecked == true;
  127. TimeSheets.Refresh(false, true);
  128. Notes.Refresh(false, true);
  129. Assignments.Refresh(false, true);
  130. }
  131. public void Heartbeat(TimeSpan time)
  132. {
  133. }
  134. private void LoadSettings()
  135. {
  136. _settings = new UserConfiguration<TimeSheetSettings>().Load();
  137. StartPicker.SelectedDate = _settings.StartDate;
  138. EndPicker.SelectedDate = _settings.EndDate;
  139. View.SelectedIndex = _settings.View;
  140. UpdateStartFinishDates();
  141. FutureTimes.IsChecked = _settings.FutureTimes;
  142. ApprovedTimes.IsChecked = _settings.ApprovedOnly;
  143. SplitPanel.AnchorWidth = _settings.AnchorWidth;
  144. SplitPanel.View = _settings.ViewType.ToSplitPanelView();
  145. }
  146. private void SaveSettings()
  147. {
  148. if (IsReady)
  149. {
  150. _settings.View = View.SelectedIndex;
  151. _settings.StartDate = StartPicker.SelectedDate.HasValue ? StartPicker.SelectedDate.Value : DateTime.Today;
  152. _settings.EndDate = EndPicker.SelectedDate.HasValue ? EndPicker.SelectedDate.Value : DateTime.Today;
  153. _settings.FutureTimes = FutureTimes.IsChecked == true;
  154. _settings.ApprovedOnly = ApprovedTimes.IsChecked == true;
  155. _settings.AnchorWidth = SplitPanel.AnchorWidth;
  156. _settings.ViewType = SplitPanel.View.ToScreenViewType();
  157. new UserConfiguration<TimeSheetSettings>().Save(_settings);
  158. }
  159. }
  160. private void UpdateStartEndPicker(DateTime start, DateTime end)
  161. {
  162. if (StartPicker == null || EndPicker == null)
  163. return;
  164. StartPicker.IsEnabled = false;
  165. EndPicker.IsEnabled = false;
  166. StartPicker.SelectedDate = start;
  167. EndPicker.SelectedDate = end;
  168. }
  169. private void View_SelectionChanged(object sender, SelectionChangedEventArgs e)
  170. {
  171. UpdateStartFinishDates();
  172. }
  173. private void UpdateStartFinishDates()
  174. {
  175. if (View.SelectedIndex == 0)
  176. {
  177. UpdateStartEndPicker(DateTime.Today, DateTime.Today);
  178. }
  179. else if (View.SelectedIndex == 1)
  180. {
  181. UpdateStartEndPicker(DateTime.Today.AddDays(0 - 1), DateTime.Today.AddDays(0 - 1));
  182. }
  183. else if (View.SelectedIndex == 2)
  184. {
  185. UpdateStartEndPicker(DateTime.Today.AddDays(0 - (double)DateTime.Today.DayOfWeek).AddDays(1),
  186. DateTime.Today.AddDays(0 - (double)DateTime.Today.DayOfWeek).AddDays(7));
  187. }
  188. else if (View.SelectedIndex == 3)
  189. {
  190. UpdateStartEndPicker(DateTime.Today.AddDays(0 - (double)DateTime.Today.DayOfWeek).AddDays(0 - 6),
  191. DateTime.Today.AddDays(0 - (double)DateTime.Today.DayOfWeek));
  192. }
  193. else if (View.SelectedIndex == 4)
  194. {
  195. UpdateStartEndPicker(new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1),
  196. new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1).AddMonths(1).AddDays(0 - 1));
  197. }
  198. else if (View.SelectedIndex == 5)
  199. {
  200. UpdateStartEndPicker(new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1).AddMonths(0 - 1),
  201. new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1).AddDays(0 - 1));
  202. }
  203. else if (View.SelectedIndex == 6)
  204. {
  205. UpdateStartEndPicker(new DateTime(DateTime.Today.Year, 1, 1), new DateTime(DateTime.Today.Year, 1, 1).AddYears(1).AddDays(0 - 1));
  206. }
  207. else if (View.SelectedIndex == 7)
  208. {
  209. UpdateStartEndPicker(new DateTime(DateTime.Today.Year, 1, 1).AddYears(0 - 1), new DateTime(DateTime.Today.Year, 1, 1).AddDays(0 - 1));
  210. }
  211. else
  212. {
  213. StartPicker.IsEnabled = true;
  214. EndPicker.IsEnabled = true;
  215. }
  216. if (!IsReady)
  217. return;
  218. SaveSettings();
  219. Refresh();
  220. }
  221. private void SelectedDateChanged(object sender, SelectionChangedEventArgs e)
  222. {
  223. if (!StartPicker.IsEnabled || !EndPicker.IsEnabled || !IsReady)
  224. return;
  225. SaveSettings();
  226. Refresh();
  227. }
  228. private void Search_KeyUp(object sender, KeyEventArgs e)
  229. {
  230. if (e.Key == Key.Enter || e.Key == Key.Return)
  231. Refresh();
  232. }
  233. private void FutureTimes_Checked(object sender, RoutedEventArgs e)
  234. {
  235. if (!IsReady)
  236. return;
  237. SaveSettings();
  238. Refresh();
  239. }
  240. private void ApprovedTimes_Checked(object sender, RoutedEventArgs e)
  241. {
  242. if (!IsReady)
  243. return;
  244. SaveSettings();
  245. Refresh();
  246. }
  247. private void SplitPanel_OnChanged(object sender, DynamicSplitPanelSettings e)
  248. {
  249. SaveSettings();
  250. }
  251. }