AssignmentDetails.xaml.cs 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  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. 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 AssignmentEditDataModel DataModel => BindingContext as AssignmentEditDataModel;
  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 && InABox.Core.Security.CanEdit<Assignment>();
  40. Start.IsEnabled = open && InABox.Core.Security.CanEdit<Assignment>();
  41. Finish.IsEnabled = open && InABox.Core.Security.CanEdit<Assignment>();
  42. Job.IsEnabled = open && InABox.Core.Security.CanEdit<Assignment>();
  43. Task.IsEnabled = open && InABox.Core.Security.CanEdit<Assignment>();
  44. Activity.IsEnabled = open && InABox.Core.Security.CanEdit<Assignment>();
  45. Description.IsEnabled = open && InABox.Core.Security.CanEdit<Assignment>();
  46. Completed.IsEnabled = open || InABox.Core.Security.CanEdit<Assignment>();
  47. }
  48. private async void Activity_Clicked(object sender, EventArgs e)
  49. {
  50. try
  51. {
  52. GenericSelectionPage page = new GenericSelectionPage(
  53. "Select Activity",
  54. new SelectionViewModel<EmployeeActivity>(
  55. new Filter<EmployeeActivity>(x => x.Employee.ID).IsEqualTo(App.Data.Employee.ID),
  56. new Expression<Func<EmployeeActivity, object>>[]
  57. { x => x.Activity.Code, x => x.Activity.Description },
  58. new Expression<Func<EmployeeActivity, object>>[] { x => x.Activity.ID },
  59. new SortOrder<EmployeeActivity>(x => x.Activity.Code)
  60. )
  61. );
  62. page.OnItemSelected += (row) =>
  63. {
  64. Device.BeginInvokeOnMainThread(() =>
  65. {
  66. DataModel.Item.ActivityID = row.Get<EmployeeActivity, Guid>(c => c.Activity.ID);
  67. DataModel.Item.ActivityCode = row.Get<EmployeeActivity, String>(c => c.Activity.Code);
  68. DataModel.Item.ActivityDescription = row.Get<EmployeeActivity, String>(c => c.Activity.Description);
  69. OnDetailsChanged?.Invoke(this,new AssignmentDetailsChangedArgs("Activity"));
  70. });
  71. };
  72. Navigation.PushAsync(page);
  73. }
  74. catch
  75. {
  76. }
  77. }
  78. private void Job_Clicked(object sender, EventArgs e)
  79. {
  80. try
  81. {
  82. GenericSelectionPage page = new GenericSelectionPage(
  83. "Select Job",
  84. new SelectionViewModel<Job>(
  85. new Filter<Job>(x => x.JobStatus.Active).IsEqualTo(true),
  86. new Expression<Func<Job, object>>[]
  87. { x => x.JobNumber, x => x.Name },
  88. new Expression<Func<Job, object>>[] { x => x.ID, x=>x.SiteAddress.Location.Latitude, x=>x.SiteAddress.Location.Longitude },
  89. new SortOrder<Job>(x => x.JobNumber,SortDirection.Descending)
  90. )
  91. );
  92. page.OnItemSelected += (row) =>
  93. {
  94. Device.BeginInvokeOnMainThread(() =>
  95. {
  96. DataModel.Item.JobID = row.Get<Job, Guid>(c => c.ID);
  97. DataModel.Item.JobNumber = row.Get<Job, String>(c => c.JobNumber);
  98. DataModel.Item.JobName = row.Get<Job, String>(c => c.Name);
  99. DataModel.Coordinates = new PointF(
  100. (float)row.Get<Job, double>(c => c.SiteAddress.Location.Longitude),
  101. (float)row.Get<Job, double>(c => c.SiteAddress.Location.Latitude)
  102. );
  103. OnDetailsChanged?.Invoke(this,new AssignmentDetailsChangedArgs("Job"));
  104. });
  105. };
  106. Navigation.PushAsync(page);
  107. }
  108. catch
  109. {
  110. }
  111. }
  112. private void Task_Clicked(object sender, EventArgs e)
  113. {
  114. try
  115. {
  116. GenericSelectionPage page = new GenericSelectionPage(
  117. "Select Task",
  118. new SelectionViewModel<Kanban>(
  119. new Filter<Kanban>(x => x.Completed).IsEqualTo(DateTime.MinValue),
  120. new Expression<Func<Kanban, object>>[]
  121. { x => x.Number, x => x.Title },
  122. new Expression<Func<Kanban, object>>[] { x => x.ID},
  123. new SortOrder<Kanban>(x => x.Number, SortDirection.Descending)
  124. )
  125. );
  126. page.OnItemSelected += (row) =>
  127. {
  128. Device.BeginInvokeOnMainThread(() =>
  129. {
  130. DataModel.Item.TaskID = row.Get<Kanban, Guid>(c => c.ID);
  131. DataModel.Item.TaskNumber = row.Get<Kanban, int>(c => c.Number);
  132. DataModel.Item.TaskName = row.Get<Kanban, String>(c => c.Title);
  133. OnDetailsChanged?.Invoke(this,new AssignmentDetailsChangedArgs("Task"));
  134. });
  135. };
  136. Navigation.PushAsync(page);
  137. }
  138. catch
  139. {
  140. }
  141. }
  142. private async void Complete_Clicked(object sender, EventArgs e)
  143. {
  144. if (!DataModel.Item.Completed.IsEmpty())
  145. {
  146. DataModel.Item.Completed = DateTime.MinValue;
  147. DataModel.Save("Re-opened on Mobile Device");
  148. Load();
  149. return;
  150. }
  151. bool bOpenForms = DataModel.Forms.Any(x => !x.Completed);
  152. if (bOpenForms)
  153. {
  154. await MaterialDialog.Instance.AlertAsync("Please finish all open forms before completing this assignment","Open Forms Found");
  155. return;
  156. }
  157. bool bConfirm = await MaterialDialog.Instance.ConfirmAsync(message: "Complete Assignment?",
  158. confirmingText: "Yes",
  159. dismissiveText: "No") == true;
  160. if (bConfirm)
  161. {
  162. DataModel.Item.Completed = DateTime.Now;
  163. DataModel.Save("Completed on Mobile Device");
  164. Navigation.PopAsync();
  165. }
  166. }
  167. private void Start_OnUnfocused(object sender, FocusEventArgs e)
  168. {
  169. OnDetailsChanged?.Invoke(this,new AssignmentDetailsChangedArgs("Start"));
  170. }
  171. private void Finish_OnUnfocused(object sender, FocusEventArgs e)
  172. {
  173. OnDetailsChanged?.Invoke(this,new AssignmentDetailsChangedArgs("Finish"));
  174. }
  175. private void Description_OnTextChanged(object sender, TextChangedEventArgs e)
  176. {
  177. if (Description.IsFocused)
  178. OnDetailsChanged?.Invoke(this, new AssignmentDetailsChangedArgs("Description"));
  179. }
  180. private void Subject_OnTextChanged(object sender, TextChangedEventArgs e)
  181. {
  182. if (Subject.IsFocused)
  183. OnDetailsChanged?.Invoke(this,new AssignmentDetailsChangedArgs("Subject"));
  184. }
  185. }
  186. }