AssignmentDetails.xaml.cs 10 KB

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