EquipmentSchedulesDashboard.xaml.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. using Comal.Classes;
  2. using InABox.Clients;
  3. using InABox.Core;
  4. using InABox.DynamicGrid;
  5. using Microsoft.CodeAnalysis.VisualBasic.Syntax;
  6. using PRSDesktop.WidgetGroups;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Globalization;
  10. using System.Linq;
  11. using System.Windows.Controls;
  12. using System.Windows.Data;
  13. using System.Windows.Media;
  14. using Client = InABox.Clients.Client;
  15. namespace PRSDesktop.Dashboards
  16. {
  17. public class EquipmentSchedulesDashboardProperties : IDashboardProperties
  18. {
  19. }
  20. public class ScheduleViewModel
  21. {
  22. public Guid ID { get; set; }
  23. public string Title { get; set; }
  24. public DateTime DueDate { get; set; }
  25. }
  26. public class EquipmentScheduleViewModel
  27. {
  28. public Guid ID { get; set; }
  29. public string Code { get; set; }
  30. public string Description { get; set; }
  31. public List<ScheduleViewModel> Schedules { get; set; }
  32. }
  33. [ValueConversion(typeof(DateTime), typeof(SolidColorBrush))]
  34. class ScheduleBackgroundConverter : IValueConverter
  35. {
  36. public Color GetColor(DateTime date)
  37. {
  38. var diff = date - DateTime.Today;
  39. if (diff < TimeSpan.Zero)
  40. return Colors.Salmon;
  41. else if (diff.TotalDays <= 7)
  42. return Colors.Orange;
  43. else if (diff.Days <= 30)
  44. return Colors.LightYellow;
  45. else
  46. return Colors.LightGreen;
  47. }
  48. public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  49. {
  50. var date = (DateTime)value;
  51. var color = GetColor(date);
  52. return new SolidColorBrush(color);
  53. }
  54. public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  55. {
  56. throw new NotImplementedException();
  57. }
  58. }
  59. /// <summary>
  60. /// Interaction logic for EquipmentSchedulesDashboard.xaml
  61. /// </summary>
  62. public partial class EquipmentSchedulesDashboard : UserControl, IDashboardWidget<EquipmentDashboardGroup, EquipmentSchedulesDashboardProperties>
  63. {
  64. public EquipmentSchedulesDashboardProperties Properties { get; set; } = null!;
  65. public EquipmentSchedulesDashboard()
  66. {
  67. InitializeComponent();
  68. }
  69. public void Setup()
  70. {
  71. }
  72. public void Refresh()
  73. {
  74. var results = Client.QueryMultiple(
  75. new KeyedQueryDef<Equipment>(
  76. new Filter<Equipment>().All(),
  77. new Columns<Equipment>(x => x.ID)
  78. .Add(x => x.Code)
  79. .Add(x => x.Description)),
  80. new KeyedQueryDef<Schedule>(
  81. new Filter<Schedule>(x => x.DocumentClass).IsEqualTo(typeof(Equipment).EntityName()),
  82. new Columns<Schedule>(x => x.ID)
  83. .Add(x => x.Title)
  84. .Add(x => x.DueDate)
  85. .Add(x => x.DocumentID)));
  86. var equipmentItems = results.Get<Equipment>().Rows.Select(x => x.ToObject<Equipment>());
  87. var schedules = results.Get<Schedule>().Rows
  88. .Select(x => x.ToObject<Schedule>())
  89. .GroupBy(x => x.DocumentID)
  90. .ToDictionary(x => x.Key, x => x.OrderBy(x => x.DueDate).ToList());
  91. var models = new List<EquipmentScheduleViewModel>();
  92. foreach (var equipmentItem in equipmentItems)
  93. {
  94. var equipmentSchedules = schedules.GetValueOrDefault(equipmentItem.ID);
  95. if(equipmentSchedules is not null)
  96. {
  97. var model = new EquipmentScheduleViewModel
  98. {
  99. Code = equipmentItem.Code,
  100. Description = equipmentItem.Description,
  101. ID = equipmentItem.ID
  102. };
  103. model.Schedules = equipmentSchedules
  104. .Select(x => new ScheduleViewModel { Title = x.Title, DueDate = x.DueDate, ID = x.ID })
  105. .ToList() ?? new List<ScheduleViewModel>();
  106. models.Add(model);
  107. }
  108. }
  109. EquipmentList.ItemsSource = models;
  110. }
  111. public void Shutdown()
  112. {
  113. }
  114. private void ViewEquipment_Click(object sender, System.Windows.RoutedEventArgs e)
  115. {
  116. var equipmentID = (Guid)(sender as MenuItem)!.Tag;
  117. var equipment = new Client<Equipment>().Load(
  118. new Filter<Equipment>(x => x.ID).IsEqualTo(equipmentID)).FirstOrDefault();
  119. if(equipment != null)
  120. {
  121. var grid = DynamicGridUtils.CreateDynamicGrid(typeof(DynamicDataGrid<>), typeof(Equipment));
  122. if(grid.EditItems(new[] { equipment }))
  123. {
  124. new Client<Equipment>().Save(equipment, "Edited by user from schedules dashboard");
  125. Refresh();
  126. }
  127. }
  128. }
  129. private void ViewSchedule_Click(object sender, System.Windows.RoutedEventArgs e)
  130. {
  131. var scheduleID = (Guid)(sender as MenuItem)!.Tag;
  132. var schedule = new Client<Schedule>().Load(
  133. new Filter<Schedule>(x => x.ID).IsEqualTo(scheduleID)).FirstOrDefault();
  134. if (schedule != null)
  135. {
  136. var grid = DynamicGridUtils.CreateDynamicGrid(typeof(DynamicDataGrid<>), typeof(Schedule));
  137. if (grid.EditItems(new[] { schedule }))
  138. {
  139. new Client<Schedule>().Save(schedule, "Edited by user from schedules dashboard");
  140. Refresh();
  141. }
  142. }
  143. }
  144. }
  145. public class EquipmentSchedulesDashboardElement :
  146. DashboardElement<EquipmentSchedulesDashboard, EquipmentDashboardGroup, EquipmentSchedulesDashboardProperties> { }
  147. }