AssignmentDetails.xaml.cs 7.1 KB

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