LeaveCalendar.xaml.cs 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Diagnostics;
  5. using System.Globalization;
  6. using System.Linq;
  7. using System.Threading.Tasks;
  8. using System.Windows;
  9. using System.Windows.Controls;
  10. using System.Windows.Data;
  11. using System.Windows.Input;
  12. using System.Windows.Media;
  13. using Comal.Classes;
  14. using InABox.Clients;
  15. using InABox.Configuration;
  16. using InABox.Core;
  17. using InABox.DynamicGrid;
  18. using InABox.WPF;
  19. using Microsoft.Win32;
  20. using Syncfusion.UI.Xaml.Grid;
  21. using Syncfusion.UI.Xaml.Grid.Converter;
  22. using Syncfusion.UI.Xaml.Grid.Helpers;
  23. using Syncfusion.Windows.Tools.Controls;
  24. using Syncfusion.XlsIO;
  25. using Activity = Comal.Classes.Activity;
  26. using SelectionChangedEventArgs = System.Windows.Controls.SelectionChangedEventArgs;
  27. namespace PRSDesktop
  28. {
  29. public class LeaveValue
  30. {
  31. public LeaveValue(Guid id, Guid employee, DateTime date, Guid activity, LeaveRequestStatus status)
  32. {
  33. ID = id;
  34. Employee = employee;
  35. Date = date;
  36. Activity = activity;
  37. Status = status;
  38. }
  39. public Guid ID { get; set; }
  40. public Guid Employee { get; set; }
  41. public DateTime Date { get; set; }
  42. public Guid Activity { get; set; }
  43. public LeaveRequestStatus Status { get; set; }
  44. }
  45. public class LeaveBackgroundConverter : IValueConverter
  46. {
  47. public Dictionary<Guid, Color> Colors { get; set; }
  48. public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  49. {
  50. var val = value as LeaveValue;
  51. if (val != null)
  52. {
  53. if (val.ID == Guid.Empty)
  54. {
  55. if (val.Date.DayOfWeek == DayOfWeek.Saturday || val.Date.DayOfWeek == DayOfWeek.Sunday)
  56. return new SolidColorBrush(System.Windows.Media.Colors.LightGray);
  57. }
  58. else
  59. {
  60. if (val.Status != LeaveRequestStatus.Approved)
  61. return new SolidColorBrush(System.Windows.Media.Colors.DimGray);
  62. if (Colors != null)
  63. if (Colors.ContainsKey(val.Activity))
  64. return new SolidColorBrush(Colors[val.Activity]);
  65. }
  66. }
  67. return DependencyProperty.UnsetValue;
  68. }
  69. public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  70. {
  71. throw new NotImplementedException();
  72. }
  73. }
  74. public class LeaveForegroundConverter : IValueConverter
  75. {
  76. public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  77. {
  78. var val = value as LeaveValue;
  79. if (val != null && val.ID != Guid.Empty && val.Status != LeaveRequestStatus.Approved)
  80. return new SolidColorBrush(Colors.Gray);
  81. return DependencyProperty.UnsetValue;
  82. }
  83. public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  84. {
  85. throw new NotImplementedException();
  86. }
  87. }
  88. public class LeaveFontStyleConverter : IValueConverter
  89. {
  90. public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  91. {
  92. var val = value as LeaveValue;
  93. if (val != null && val.ID != Guid.Empty && val.Status != LeaveRequestStatus.Approved)
  94. return FontStyles.Italic;
  95. return DependencyProperty.UnsetValue;
  96. }
  97. public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  98. {
  99. throw new NotImplementedException();
  100. }
  101. }
  102. public class LeaveFontWeightConverter : IValueConverter
  103. {
  104. public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  105. {
  106. return FontWeights.Bold;
  107. }
  108. public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  109. {
  110. throw new NotImplementedException();
  111. }
  112. }
  113. public class LeaveContentConverter : IValueConverter
  114. {
  115. public Dictionary<Guid, string> Abbreviations { get; set; }
  116. public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  117. {
  118. var val = value as LeaveValue;
  119. return Abbreviations.ContainsKey(val.Activity) ? Abbreviations[val.Activity] : DependencyProperty.UnsetValue;
  120. }
  121. public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  122. {
  123. throw new NotImplementedException();
  124. }
  125. }
  126. /// <summary>
  127. /// Interaction logic for LeaveCalendar.xaml
  128. /// </summary>
  129. public partial class LeaveCalendar : UserControl
  130. {
  131. private readonly CoreTable _activities;
  132. private readonly Dictionary<Guid, string> _activityCodes = new();
  133. private readonly Dictionary<Guid, Color> _activityColors = new();
  134. private readonly Dictionary<Guid, string> _employees = new();
  135. private LeaveSettings _settings;
  136. private readonly Dictionary<Guid, string> _teams = new();
  137. private bool bReady;
  138. private LeaveContentConverter converter = new();
  139. private DataTable data;
  140. private LeaveRequestGrid lg;
  141. public LeaveCalendar()
  142. {
  143. InitializeComponent();
  144. //dataGrid.ScrollMode = ScrollMode.Async;
  145. LoadSettings();
  146. StartDate.DateTime = DateTime.Today;
  147. var setups = ClientFactory.MultiQuery(
  148. new QueryDef<EmployeeTeam>(
  149. null,
  150. null,
  151. new SortOrder<EmployeeTeam>(x => x.TeamLink.Code).ThenBy(x => x.EmployeeLink.Name)
  152. ),
  153. new QueryDef<Activity>(
  154. new Filter<Activity>(x => x.IsLeave).IsEqualTo(true),
  155. null,
  156. null
  157. )
  158. );
  159. _employeeTeams = setups.First();
  160. _activities = setups.Last();
  161. _teams = _employeeTeams.ToDictionary<EmployeeTeam, Guid, string>(c => c.TeamLink.ID, c => c.TeamLink.Name);
  162. if (_teams.ContainsKey(Guid.Empty))
  163. _teams.Remove(Guid.Empty);
  164. var teams = _employeeTeams.ToDictionary<EmployeeTeam, Guid, string>(c => c.TeamLink.ID, c => c.TeamLink.Name);
  165. teams[CoreUtils.FullGuid] = "Multiple Teams";
  166. Teams.ItemsSource = teams;
  167. Teams.SelectedValue = _settings.GroupID;
  168. ChangeSelectedTeams(_settings.GroupID);
  169. SelectedTeams.ItemsSource = _teams;
  170. foreach (KeyValuePair<Guid, string> pair in SelectedTeams.Items)
  171. if (_settings.SelectedGroups.Contains(pair.Key))
  172. SelectedTeams.SelectedItems.Add(pair);
  173. LoadEmployees(false);
  174. //Guid groupid = _teams.ContainsKey(_settings.GroupID) ? _settings.GroupID : CoreUtils.FullGuid;
  175. //{
  176. // Teams.SelectedValue = _settings.GroupID;
  177. // Dictionary<Guid, String> emps = new Dictionary<Guid, string>();
  178. // foreach (var row in _employeeTeams.Rows.Where(r => r.Get<EmployeeTeam,Guid>(c=>c.TeamLink.ID).Equals(_settings.GroupID) || _settings.GroupID.Equals(CoreUtils.FullGuid)))
  179. // emps[row.Get<EmployeeTeam,Guid>(c=>c.EmployeeLink.ID)] = row.Get<EmployeeTeam,String>(c=>c.EmployeeLink.Name);
  180. // SelectedEmployees.ItemsSource = emps;
  181. // foreach (var item in SelectedEmployees.Items)
  182. // {
  183. // KeyValuePair<Guid, String> emp = (KeyValuePair<Guid, String>)item;
  184. // if (_settings.SelectedEmployees.Contains(emp.Key))
  185. // SelectedEmployees.SelectedItems.Add(item);
  186. // }
  187. //}
  188. //activities = new Client<Activity>().Load(new Filter<Activity>(x=>x.IsLeave).IsEqualTo(true));
  189. foreach (var row in _activities.Rows)
  190. {
  191. var id = row.Get<Activity, Guid>(c => c.ID);
  192. var color = row.Get<Activity, string>(c => c.Color);
  193. if (!string.IsNullOrWhiteSpace(color))
  194. _activityColors[id] = (Color)ColorConverter.ConvertFromString(color);
  195. var code = Codify(row.Get<Activity, string>(c => c.Description));
  196. _activityCodes[id] = Codify(code);
  197. }
  198. bReady = true;
  199. }
  200. private CoreTable _employeeTeams { get; }
  201. private string Codify(string name)
  202. {
  203. if (string.IsNullOrWhiteSpace(name))
  204. return "??";
  205. var result = "";
  206. var comps = name.ToUpper().Split(' ');
  207. foreach (var comp in comps)
  208. if (comp.Any())
  209. result += comp.First();
  210. return string.IsNullOrWhiteSpace(result) ? "??" : result;
  211. }
  212. private void LoadSettings()
  213. {
  214. _settings = new UserConfiguration<LeaveSettings>().Load();
  215. if (!_settings.SelectedGroups.Any() && _settings.GroupID != Guid.Empty)
  216. _settings.SelectedGroups.Add(_settings.GroupID);
  217. if (_settings.ListSize == 0.0F)
  218. _settings.ListSize = 200.0F;
  219. }
  220. private void SaveSettings()
  221. {
  222. if (!bReady)
  223. return;
  224. try
  225. {
  226. _settings.GroupID = Teams.SelectedValue != null ? (Guid)Teams.SelectedValue : Guid.Empty;
  227. _settings.SelectedGroups.Clear();
  228. foreach (var sel in SelectedTeams.SelectedItems)
  229. {
  230. var grp = (KeyValuePair<Guid, string>)sel;
  231. _settings.SelectedGroups.Add(grp.Key);
  232. }
  233. _settings.SelectedEmployees.Clear();
  234. foreach (var sel in SelectedEmployees.SelectedItems)
  235. {
  236. var grp = (KeyValuePair<Guid, string>)sel;
  237. _settings.SelectedEmployees.Add(grp.Key);
  238. }
  239. if (EmployeeGrid.RowDefinitions[1].ActualHeight != 0.0F)
  240. _settings.ListSize = EmployeeGrid.RowDefinitions[1].ActualHeight;
  241. }
  242. catch (Exception e)
  243. {
  244. Logger.Send(LogType.Error, "", string.Format("*** Unknown Error: {0}\n{1}", e.Message, e.StackTrace));
  245. }
  246. Task.Run(() => { new UserConfiguration<LeaveSettings>().Save(_settings); });
  247. }
  248. public void Refresh()
  249. {
  250. using (new WaitCursor())
  251. {
  252. _employees.Clear();
  253. var crosstab = new List<LeaveValue>();
  254. var empfilter = new Filter<LeaveRequest>(x => x.EmployeeLink.ID).IsEqualTo(CoreUtils.FullGuid);
  255. foreach (var sel in SelectedEmployees.Items)
  256. {
  257. var emp = (KeyValuePair<Guid, string>)sel;
  258. if (SelectedEmployees.SelectedItems.Contains(emp))
  259. {
  260. empfilter = empfilter.Or(x => x.EmployeeLink.ID).IsEqualTo(emp.Key);
  261. _employees[emp.Key] = emp.Value;
  262. }
  263. }
  264. //Filter<LeaveRequest> filter = new Filter<LeaveRequest>(x => x.From).IsLessThanOrEqualTo(EndDate.DateTime.Value).And(x => x.To).IsGreaterThanOrEqualTo(StartDate.DateTime.Value);
  265. var filter = new Filter<LeaveRequest>(x => x.To).IsGreaterThanOrEqualTo(StartDate.DateTime.Value)
  266. .And(x => x.Status).IsNotEqualTo(LeaveRequestStatus.Rejected);
  267. filter.Ands.Add(empfilter);
  268. var leave = new Client<LeaveRequest>().Query(
  269. filter,
  270. new Columns<LeaveRequest>(x => x.ID)
  271. .Add(x => x.EmployeeLink.ID)
  272. .Add(x => x.From)
  273. .Add(x => x.To)
  274. .Add(x => x.LeaveType.ID)
  275. .Add(x => x.LeaveType.Description)
  276. .Add(x => x.Status),
  277. new SortOrder<LeaveRequest>(x => x.EmployeeLink.Name)
  278. );
  279. var first = StartDate.DateTime.Value;
  280. var last = DateTime.Today.AddYears(1);
  281. foreach (var row in leave.Rows)
  282. {
  283. var id = row.Get<LeaveRequest, Guid>(x => x.ID);
  284. var empid = row.Get<LeaveRequest, Guid>(x => x.EmployeeLink.ID);
  285. var from = row.Get<LeaveRequest, DateTime>(x => x.From);
  286. from = from < first ? first : from;
  287. var to = row.Get<LeaveRequest, DateTime>(x => x.To);
  288. to = to > last ? last : to;
  289. last = _employees.Keys.Contains(id) && to > last ? to : last;
  290. var actid = row.Get<LeaveRequest, Guid>(x => x.LeaveType.ID);
  291. var type = row.Get<LeaveRequest, string>(x => x.LeaveType.Description);
  292. var status = row.Get<LeaveRequest, LeaveRequestStatus>(x => x.Status);
  293. for (var date = from; date <= to; date = date.AddDays(1))
  294. crosstab.Add(new LeaveValue(id, empid, date, actid, status));
  295. }
  296. data = new DataTable();
  297. data.Columns.Add("Date", typeof(DateTime));
  298. foreach (var employee in _employees.Keys)
  299. data.Columns.Add(employee.ToString(), typeof(object));
  300. for (var date = first; date <= last; date = date.AddDays(1))
  301. {
  302. var values = new List<object>();
  303. values.Add(date);
  304. foreach (var employee in _employees.Keys)
  305. {
  306. var value = date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday
  307. ? null
  308. : crosstab.FirstOrDefault(x => x.Employee.Equals(employee) && x.Date.Equals(date));
  309. values.Add(value == null ? new LeaveValue(Guid.Empty, employee, date, Guid.Empty, LeaveRequestStatus.InProgress) : value);
  310. }
  311. data.Rows.Add(values.ToArray());
  312. }
  313. dataGrid.ItemsSource = data;
  314. }
  315. }
  316. private void DataGrid_AutoGeneratingColumn(object sender, AutoGeneratingColumnArgs e)
  317. {
  318. e.Column.TextAlignment = TextAlignment.Center;
  319. e.Column.HorizontalHeaderContentAlignment = HorizontalAlignment.Center;
  320. e.Column.ColumnSizer = GridLengthUnitType.None;
  321. var value = e.Column.ValueBinding as Binding;
  322. if (value.Path.Path.Equals("Date"))
  323. {
  324. e.Column.Width = 100;
  325. e.Column.HeaderStyle = Resources["DateHeaderStyle"] as Style;
  326. }
  327. else
  328. {
  329. var style = new Style(typeof(GridCell));
  330. style.Setters.Add(new Setter(BackgroundProperty,
  331. new Binding(value.Path.Path) { Converter = new LeaveBackgroundConverter { Colors = _activityColors } }));
  332. style.Setters.Add(new Setter(ForegroundProperty, new Binding(value.Path.Path) { Converter = new LeaveForegroundConverter() }));
  333. style.Setters.Add(new Setter(FontStyleProperty, new Binding(value.Path.Path) { Converter = new LeaveFontStyleConverter() }));
  334. style.Setters.Add(new Setter(FontWeightProperty, new Binding(value.Path.Path) { Converter = new LeaveFontWeightConverter() }));
  335. e.Column.CellStyle = style;
  336. e.Column.Width = 30;
  337. e.Column.HeaderStyle = Resources["ContentHeaderStyle"] as Style;
  338. e.Column.HeaderText = _employees[Guid.Parse(value.Path.Path)];
  339. e.Column.DisplayBinding = new Binding
  340. { Path = new PropertyPath(e.Column.MappingName), Converter = new LeaveContentConverter { Abbreviations = _activityCodes } };
  341. //e.Column.ValueBinding = new Binding() { Path = new PropertyPath(e.Column.MappingName), Converter = new LeaveContentConverter() };
  342. //e.Column.UseBindingValue = true;
  343. }
  344. }
  345. //private void DataGrid_FilterItemsPopulating(object sender, GridFilterItemsPopulatingEventArgs e)
  346. //{
  347. // e.FilterControl.FilterMode = FilterMode.AdvancedFilter;
  348. //}
  349. private void GetSelectionData(out DateTime from, out DateTime to, out Guid[] ids)
  350. {
  351. var emps = new List<Guid>();
  352. from = DateTime.MaxValue;
  353. to = DateTime.MinValue;
  354. foreach (var cell in dataGrid.GetSelectedCells())
  355. {
  356. var binding = cell.Column.ValueBinding as Binding;
  357. if (Guid.TryParse(binding.Path.Path, out var emp))
  358. if (!emps.Contains(emp))
  359. emps.Add(emp);
  360. var row = cell.RowData as DataRowView;
  361. var date = (DateTime)row.Row.ItemArray.First();
  362. if (date < from)
  363. from = date;
  364. if (date > to)
  365. to = date;
  366. }
  367. ids = emps.Any() ? emps.ToArray() : _employees.Keys.ToArray();
  368. }
  369. private bool HasData()
  370. {
  371. foreach (var cell in dataGrid.GetSelectedCells())
  372. {
  373. if (!cell.IsDataRowCell)
  374. continue;
  375. var propertyCollection = dataGrid.View.GetPropertyAccessProvider();
  376. var cellvalue = propertyCollection.GetValue(cell.RowData, cell.Column.MappingName) as LeaveValue;
  377. if (cellvalue != null && cellvalue.ID != Guid.Empty)
  378. return true;
  379. }
  380. return false;
  381. }
  382. private IList<LeaveValue> GetData()
  383. {
  384. return dataGrid.GetSelectedCells()
  385. .Where(cell => cell.IsDataRowCell)
  386. .Select(cell =>
  387. {
  388. var propertyCollection = dataGrid.View.GetPropertyAccessProvider();
  389. var cellvalue = propertyCollection.GetValue(cell.RowData, cell.Column.MappingName) as LeaveValue;
  390. if (cellvalue != null && cellvalue.ID != Guid.Empty)
  391. return cellvalue;
  392. return null;
  393. })
  394. .Where(x => x != null)
  395. .Select(x => x!)
  396. .ToList();
  397. }
  398. private LeaveValue? GetData(GridCellInfo cell)
  399. {
  400. if (!cell.IsDataRowCell)
  401. return null;
  402. var propertyCollection = dataGrid.View.GetPropertyAccessProvider();
  403. var cellvalue = propertyCollection.GetValue(cell.RowData, cell.Column.MappingName) as LeaveValue;
  404. return cellvalue != null && cellvalue.ID != Guid.Empty ? cellvalue : null;
  405. }
  406. private bool HasData(GridCellInfo cell)
  407. {
  408. if (!cell.IsDataRowCell)
  409. return false;
  410. var propertyCollection = dataGrid.View.GetPropertyAccessProvider();
  411. var cellvalue = propertyCollection.GetValue(cell.RowData, cell.Column.MappingName) as LeaveValue;
  412. return cellvalue != null && cellvalue.ID != Guid.Empty;
  413. }
  414. private void CreateLeaveClick(object sender, RoutedEventArgs e)
  415. {
  416. var activity = (sender as MenuItem).Tag as Activity;
  417. GetSelectionData(out var from, out var to, out var ids);
  418. var leaves = new List<LeaveRequest>();
  419. foreach (var id in ids)
  420. {
  421. var leave = new LeaveRequest();
  422. leave.From = from;
  423. leave.To = to;
  424. leave.LeaveType.ID = activity.ID;
  425. leave.EmployeeLink.ID = id;
  426. leaves.Add(leave);
  427. }
  428. if (lg == null)
  429. lg = new LeaveRequestGrid();
  430. if (lg.EditItems(leaves.ToArray()))
  431. //Progress.Show("Saving Leave Requests");
  432. //new Client<LeaveRequest>().Save(leaves, "Created From Leave Calendar");
  433. //Progress.Close();
  434. Refresh();
  435. }
  436. private void EditLeaveClick(object sender, RoutedEventArgs e)
  437. {
  438. GetSelectionData(out var from, out var to, out var ids);
  439. var requests = new Client<LeaveRequest>().Load(new Filter<LeaveRequest>(x => x.From).IsLessThanOrEqualTo(to).And(x => x.To)
  440. .IsGreaterThanOrEqualTo(from));
  441. requests = requests.Where(x => ids.Contains(x.EmployeeLink.ID)).ToArray();
  442. var lg = new LeaveRequests();
  443. if (lg.EditItems(requests.ToArray()))
  444. //Progress.Show("Saving Leave Requests");
  445. //new Client<LeaveRequest>().Save(requests, "Updated From Leave Calendar");
  446. //Progress.Close();
  447. Refresh();
  448. }
  449. private void DeleteLeaveClick(object sender, RoutedEventArgs e)
  450. {
  451. if (MessageBox.Show("Delete Leave Information?", "Confirm Delete", MessageBoxButton.YesNo, MessageBoxImage.Warning) ==
  452. MessageBoxResult.Yes)
  453. {
  454. GetSelectionData(out var from, out var to, out var ids);
  455. var requests = new Client<LeaveRequest>().Load(new Filter<LeaveRequest>(x => x.From).IsLessThanOrEqualTo(to).And(x => x.To)
  456. .IsGreaterThanOrEqualTo(from));
  457. Progress.Show("Clearing Leave Requests");
  458. foreach (var request in requests.Where(x => ids.Contains(x.EmployeeLink.ID)))
  459. new Client<LeaveRequest>().Delete(request, "Deleted from Calendar");
  460. Progress.Close();
  461. Refresh();
  462. }
  463. }
  464. private void DataGrid_PreviewMouseDown(object sender, MouseButtonEventArgs e)
  465. {
  466. if (e.RightButton == MouseButtonState.Pressed)
  467. {
  468. var vc = dataGrid.GetVisualContainer();
  469. var point = e.GetPosition(vc);
  470. var rci = vc.PointToCellRowColumnIndex(point);
  471. if (rci.RowIndex == 0 || rci.ColumnIndex == 0)
  472. return;
  473. var menu = new ContextMenu();
  474. if (!HasData(dataGrid.CurrentCellInfo))
  475. foreach (var row in _activities.Rows)
  476. {
  477. var createleave = new MenuItem { Header = row.Get<Activity, string>(c => c.Description) };
  478. createleave.Tag = row.ToObject<Activity>();
  479. createleave.Click += CreateLeaveClick;
  480. menu.Items.Add(createleave);
  481. }
  482. if (HasData())
  483. {
  484. var deleteleave = new MenuItem { Header = "Delete Leave" };
  485. deleteleave.Click += DeleteLeaveClick;
  486. menu.Items.Add(deleteleave);
  487. }
  488. dataGrid.ContextMenu = menu;
  489. menu.IsOpen = true;
  490. }
  491. }
  492. private void DataGrid_ContextMenuOpening(object sender, ContextMenuEventArgs e)
  493. {
  494. var vc = dataGrid.GetVisualContainer();
  495. var p = Mouse.GetPosition(vc);
  496. var rci = vc.PointToCellRowColumnIndex(p);
  497. if (rci.RowIndex < 1 || rci.ColumnIndex < 1)
  498. {
  499. e.Handled = true;
  500. return;
  501. }
  502. dataGrid.ContextMenu.Items.Clear();
  503. var bCreate = !HasData(dataGrid.CurrentCellInfo);
  504. var bEdit = HasData();
  505. if (bCreate)
  506. foreach (var row in _activities.Rows)
  507. {
  508. var createleave = new MenuItem { Header = row.Get<Activity, string>(c => c.Description) };
  509. createleave.Tag = row.ToObject<Activity>();
  510. createleave.Click += CreateLeaveClick;
  511. dataGrid.ContextMenu.Items.Add(createleave);
  512. }
  513. if (bEdit && bCreate)
  514. dataGrid.ContextMenu.Items.Add(new Separator());
  515. if (bEdit)
  516. {
  517. var editleave = new MenuItem { Header = "Edit Leave" };
  518. editleave.Click += EditLeaveClick;
  519. dataGrid.ContextMenu.Items.Add(editleave);
  520. dataGrid.ContextMenu.Items.Add(new Separator());
  521. var deleteleave = new MenuItem { Header = "Delete Leave" };
  522. deleteleave.Click += DeleteLeaveClick;
  523. dataGrid.ContextMenu.Items.Add(deleteleave);
  524. var cell = GetData(dataGrid.CurrentCellInfo);
  525. dataGrid.ContextMenu.Items.Add(new Separator());
  526. var formsItem = new MenuItem { Header = "Digital Forms" };
  527. DynamicGridUtils.PopulateFormMenu<LeaveRequestForm, LeaveRequest, LeaveRequestLink>(formsItem, cell.ID);
  528. dataGrid.ContextMenu.Items.Add(formsItem);
  529. }
  530. }
  531. private void DateTimeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  532. {
  533. if (!bReady)
  534. return;
  535. Refresh();
  536. }
  537. private void SyncSelectedTeams(Guid teamid)
  538. {
  539. var bOldReady = bReady;
  540. bReady = false;
  541. if (teamid != CoreUtils.FullGuid)
  542. {
  543. SelectedTeams.SelectedItems.Clear();
  544. foreach (KeyValuePair<Guid, string> sel in SelectedTeams.Items)
  545. if (sel.Key == teamid)
  546. SelectedTeams.SelectedItems.Add(sel);
  547. }
  548. LoadEmployees(true);
  549. bReady = bOldReady;
  550. }
  551. private void GroupsSelectionChanged(object sender, SelectionChangedEventArgs e)
  552. {
  553. if (Teams.SelectedValue == null)
  554. return;
  555. var teamid = (Guid)Teams.SelectedValue;
  556. ChangeSelectedTeams(teamid);
  557. SyncSelectedTeams(teamid);
  558. }
  559. private void ChangeSelectedTeams(Guid teamid)
  560. {
  561. if (teamid == CoreUtils.FullGuid)
  562. {
  563. EmployeeGrid.RowDefinitions[1].Height = new GridLength(_settings.ListSize, GridUnitType.Pixel);
  564. EmployeeGrid.RowDefinitions[2].Height = new GridLength(1, GridUnitType.Auto);
  565. }
  566. else
  567. {
  568. var oldbReady = bReady;
  569. bReady = false;
  570. EmployeeGrid.RowDefinitions[1].Height = new GridLength(0, GridUnitType.Pixel);
  571. EmployeeGrid.RowDefinitions[2].Height = new GridLength(0, GridUnitType.Pixel);
  572. bReady = oldbReady;
  573. }
  574. //bHandled = false;
  575. }
  576. //bool bHandled = false;
  577. //private void SelectedTeams_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
  578. //{
  579. // if (!bReady)
  580. // return;
  581. // if (!bHandled)
  582. // LoadEmployees();
  583. // bHandled = !bHandled;
  584. //}
  585. private void SelectedTeams_ItemChecked(object sender, ItemCheckedEventArgs e)
  586. {
  587. if (!bReady)
  588. return;
  589. LoadEmployees(true);
  590. }
  591. private void LoadEmployees(bool selectall)
  592. {
  593. var emps = new Dictionary<Guid, string>();
  594. foreach (var pair in SelectedTeams.SelectedItems)
  595. if (pair != null)
  596. {
  597. var key = ((KeyValuePair<Guid, string>)pair).Key;
  598. foreach (var row in _employeeTeams.Rows.Where(r =>
  599. r.Get<EmployeeTeam, Guid>(c => c.TeamLink.ID).Equals(key) || key.Equals(CoreUtils.FullGuid)))
  600. emps[row.Get<EmployeeTeam, Guid>(c => c.EmployeeLink.ID)] = row.Get<EmployeeTeam, string>(c => c.EmployeeLink.Name);
  601. }
  602. var bOldReady = bReady;
  603. bReady = false;
  604. SelectedEmployees.ItemsSource = emps;
  605. foreach (var item in SelectedEmployees.Items)
  606. {
  607. var pair = (KeyValuePair<Guid, string>)item;
  608. if (_settings.SelectedEmployees.Contains(pair.Key) || selectall)
  609. SelectedEmployees.SelectedItems.Add(item);
  610. }
  611. bReady = bOldReady;
  612. SaveSettings();
  613. Refresh();
  614. }
  615. private void EmployeesSelectionChanged(object sender, SelectionChangedEventArgs e)
  616. {
  617. if (!bReady || e.AddedItems.Count == 0 || e.AddedItems[0] == null)
  618. return;
  619. //ReloadColumns();
  620. SaveSettings();
  621. Refresh();
  622. }
  623. private void Export_Click(object sender, RoutedEventArgs e)
  624. {
  625. var options = new ExcelExportingOptions();
  626. options.ExcelVersion = ExcelVersion.Excel2013;
  627. var excelEngine = dataGrid.ExportToExcel(dataGrid.View, options);
  628. var workBook = excelEngine.Excel.Workbooks[0];
  629. var dlg = new SaveFileDialog();
  630. dlg.Filter = "Excel Files (*.xlsx)|*.xlsx";
  631. dlg.FileName = typeof(LeaveRequest).EntityName().Split('.').Last() + ".xlsx";
  632. if (dlg.ShowDialog() == true)
  633. try
  634. {
  635. workBook.SaveAs(dlg.FileName);
  636. Process.Start(new ProcessStartInfo(dlg.FileName) { UseShellExecute = true });
  637. }
  638. catch (Exception e2)
  639. {
  640. MessageBox.Show("Error saving spreadsheet!\n\n" + e2.Message);
  641. }
  642. //workBook.SaveAs("Leave Requests.xlsx");
  643. }
  644. private void SelectedTeams_SizeChanged(object sender, SizeChangedEventArgs e)
  645. {
  646. SaveSettings();
  647. }
  648. }
  649. }