AssignmentDetails.xaml.cs 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. using System;
  2. using System.Linq;
  3. using System.Linq.Expressions;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using Comal.Classes;
  7. using InABox.Core;
  8. using Syncfusion.Drawing;
  9. using Xamarin.Forms;
  10. using Xamarin.Forms.Xaml;
  11. using XF.Material.Forms.UI.Dialogs;
  12. using PRSSecurity = InABox.Core.Security;
  13. namespace comal.timesheets
  14. {
  15. public class AssignmentDetailsChangedArgs : EventArgs
  16. {
  17. public string Property { get; }
  18. public AssignmentDetailsChangedArgs(String property)
  19. {
  20. Property = property;
  21. }
  22. }
  23. public delegate void AssignmentDetailsChangedDelegate(object sender, AssignmentDetailsChangedArgs args);
  24. [XamlCompilation(XamlCompilationOptions.Compile)]
  25. public partial class AssignmentDetails : ContentView, IAssignmentPage
  26. {
  27. public event AssignmentDetailsChangedDelegate OnDetailsChanged;
  28. public AssignmentDetailModel DataModel => BindingContext as AssignmentDetailModel;
  29. public AssignmentDetails()
  30. {
  31. InitializeComponent();
  32. }
  33. public void Load()
  34. {
  35. bool open = DataModel.Item.Completed.IsEmpty();
  36. Completed.Text = open
  37. ? "Complete"
  38. : InABox.Core.Security.CanEdit<Assignment>() ? "Re-Open" : $"Completed {DataModel.Item.Completed:dd/MM/yy}";
  39. Subject.IsEnabled = open && PRSSecurity.CanEdit<Assignment>();
  40. BookedStart.IsEnabled = open && PRSSecurity.IsAllowed<CanEditAssignmentBookings>();
  41. BookedFinish.IsEnabled = open && PRSSecurity.IsAllowed<CanEditAssignmentBookings>();
  42. ActualStart.IsEnabled = open && PRSSecurity.IsAllowed<CanEditAssignmentActualTimes>();
  43. ActualFinish.IsEnabled = open && PRSSecurity.IsAllowed<CanEditAssignmentActualTimes>();
  44. //AsBookedBtn.IsEnabled = open && PRSSecurity.IsAllowed<CanEditAssignmentActualTimes>();
  45. Job.IsEnabled = open && PRSSecurity.CanEdit<Assignment>();
  46. Task.IsEnabled = open && PRSSecurity.CanEdit<Assignment>();
  47. Activity.IsEnabled = open && PRSSecurity.CanEdit<Assignment>();
  48. Description.IsEnabled = open && PRSSecurity.CanEdit<Assignment>();
  49. Completed.IsEnabled = open || PRSSecurity.CanEdit<Assignment>();
  50. }
  51. private async void Activity_Clicked(object sender, EventArgs e)
  52. {
  53. try
  54. {
  55. GenericSelectionPage page = new GenericSelectionPage(
  56. "Select Activity",
  57. new SelectionViewModel<EmployeeActivity>(
  58. new Filter<EmployeeActivity>(x => x.Employee.ID).IsEqualTo(App.Data.Me.ID),
  59. new Expression<Func<EmployeeActivity, object>>[]
  60. { x => x.Activity.Code, x => x.Activity.Description },
  61. new Expression<Func<EmployeeActivity, object>>[] { x => x.Activity.ID },
  62. new SortOrder<EmployeeActivity>(x => x.Activity.Code)
  63. )
  64. );
  65. page.OnItemSelected += (row) =>
  66. {
  67. Device.BeginInvokeOnMainThread(() =>
  68. {
  69. DataModel.Item.ActivityID = row.Get<EmployeeActivity, Guid>(c => c.Activity.ID);
  70. DataModel.Item.ActivityCode = row.Get<EmployeeActivity, String>(c => c.Activity.Code);
  71. DataModel.Item.ActivityDescription = row.Get<EmployeeActivity, String>(c => c.Activity.Description);
  72. OnDetailsChanged?.Invoke(this, new AssignmentDetailsChangedArgs("Activity"));
  73. });
  74. };
  75. Navigation.PushAsync(page);
  76. }
  77. catch
  78. {
  79. }
  80. }
  81. private void SelectJob_Clicked(object sender, EventArgs e)
  82. {
  83. try
  84. {
  85. GenericSelectionPage page = new GenericSelectionPage(
  86. "Select Job",
  87. new SelectionViewModel<Job>(
  88. new Filter<Job>(x => x.JobStatus.Active).IsEqualTo(true),
  89. new Expression<Func<Job, object>>[]
  90. { x => x.JobNumber, x => x.Name },
  91. new Expression<Func<Job, object>>[] { x => x.ID, x => x.SiteAddress.Location.Latitude, x => x.SiteAddress.Location.Longitude },
  92. new SortOrder<Job>(x => x.JobNumber, SortDirection.Descending)
  93. )
  94. );
  95. page.OnItemSelected += (row) =>
  96. {
  97. Device.BeginInvokeOnMainThread(() =>
  98. {
  99. DataModel.Item.JobID = row.Get<Job, Guid>(c => c.ID);
  100. DataModel.Item.JobNumber = row.Get<Job, String>(c => c.JobNumber);
  101. DataModel.Item.JobName = row.Get<Job, String>(c => c.Name);
  102. DataModel.Item.Latitude = row.Get<Job, double>(c => c.SiteAddress.Location.Latitude);
  103. DataModel.Item.Longitude = row.Get<Job, double>(c => c.SiteAddress.Location.Longitude);
  104. OnDetailsChanged?.Invoke(this, new AssignmentDetailsChangedArgs("Job"));
  105. });
  106. };
  107. Navigation.PushAsync(page);
  108. }
  109. catch
  110. {
  111. }
  112. }
  113. private void Task_Clicked(object sender, EventArgs e)
  114. {
  115. try
  116. {
  117. GenericSelectionPage page = new GenericSelectionPage(
  118. "Select Task",
  119. new SelectionViewModel<Kanban>(
  120. new Filter<Kanban>(x => x.Completed).IsEqualTo(DateTime.MinValue),
  121. new Expression<Func<Kanban, object>>[]
  122. { x => x.Number, x => x.Title },
  123. new Expression<Func<Kanban, object>>[] { x => x.ID },
  124. new SortOrder<Kanban>(x => x.Number, SortDirection.Descending)
  125. )
  126. );
  127. page.OnItemSelected += (row) =>
  128. {
  129. Device.BeginInvokeOnMainThread(() =>
  130. {
  131. DataModel.Item.TaskID = row.Get<Kanban, Guid>(c => c.ID);
  132. DataModel.Item.TaskNumber = row.Get<Kanban, int>(c => c.Number);
  133. DataModel.Item.TaskName = row.Get<Kanban, String>(c => c.Title);
  134. OnDetailsChanged?.Invoke(this, new AssignmentDetailsChangedArgs("Task"));
  135. });
  136. };
  137. Navigation.PushAsync(page);
  138. }
  139. catch
  140. {
  141. }
  142. }
  143. private async void Complete_Clicked(object sender, EventArgs e)
  144. {
  145. if (!DataModel.Item.Completed.IsEmpty())
  146. {
  147. DataModel.Item.Completed = DateTime.MinValue;
  148. DataModel.Save("Re-opened on Mobile Device");
  149. Load();
  150. return;
  151. }
  152. bool bOpenForms = DataModel.Forms.Any(x => x.Completed.IsEmpty());
  153. if (bOpenForms)
  154. {
  155. await MaterialDialog.Instance.AlertAsync("Please finish all open forms before completing this assignment", "Open Forms Found");
  156. return;
  157. }
  158. bool bConfirm = await MaterialDialog.Instance.ConfirmAsync(message: "Complete Assignment?",
  159. confirmingText: "Yes",
  160. dismissiveText: "No") == true;
  161. if (bConfirm)
  162. {
  163. DataModel.Item.Completed = DateTime.Now;
  164. DataModel.Save("Completed on Mobile Device");
  165. Navigation.PopAsync();
  166. }
  167. }
  168. private void Description_OnTextChanged(object sender, TextChangedEventArgs e)
  169. {
  170. if (Description.IsFocused)
  171. OnDetailsChanged?.Invoke(this, new AssignmentDetailsChangedArgs("Description"));
  172. }
  173. private void Subject_OnTextChanged(object sender, TextChangedEventArgs e)
  174. {
  175. if (Subject.IsFocused)
  176. OnDetailsChanged?.Invoke(this, new AssignmentDetailsChangedArgs("Subject"));
  177. }
  178. private void BookedStart_OnChanged(object sender, TimeButtonChangedArgs args)
  179. {
  180. OnDetailsChanged?.Invoke(this, new AssignmentDetailsChangedArgs("BookedStart"));
  181. if (DataModel.Item.BookedStart > DataModel.Item.BookedFinish)
  182. {
  183. DataModel.Item.BookedFinish = DataModel.Item.BookedStart;
  184. OnDetailsChanged?.Invoke(this, new AssignmentDetailsChangedArgs("BookedFinish"));
  185. }
  186. }
  187. private void ActualStart_OnChanged(object sender, TimeButtonChangedArgs args)
  188. {
  189. OnDetailsChanged?.Invoke(this, new AssignmentDetailsChangedArgs("ActualStart"));
  190. if (DataModel.Item.ActualStart > DataModel.Item.ActualFinish)
  191. {
  192. DataModel.Item.ActualFinish = DataModel.Item.ActualStart;
  193. OnDetailsChanged?.Invoke(this, new AssignmentDetailsChangedArgs("ActualFinish"));
  194. }
  195. }
  196. private void BookedFinish_OnChanged(object sender, TimeButtonChangedArgs args)
  197. {
  198. if (DataModel.Item.BookedStart > DataModel.Item.BookedFinish)
  199. {
  200. DataModel.Item.BookedFinish = DataModel.Item.BookedStart;
  201. OnDetailsChanged?.Invoke(this, new AssignmentDetailsChangedArgs("BookedFinish"));
  202. }
  203. }
  204. private void ActualFinish_OnChanged(object sender, TimeButtonChangedArgs args)
  205. {
  206. if (DataModel.Item.ActualStart > DataModel.Item.ActualFinish)
  207. {
  208. DataModel.Item.ActualFinish = DataModel.Item.ActualStart;
  209. OnDetailsChanged?.Invoke(this, new AssignmentDetailsChangedArgs("ActualFinish"));
  210. }
  211. }
  212. }
  213. }