DigitalFormsPicker.xaml.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
  1. using Comal.Classes;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using InABox.Clients;
  6. using InABox.Core;
  7. using InABox.Mobile;
  8. using Xamarin.Forms;
  9. using Xamarin.Forms.Xaml;
  10. using XF.Material.Forms.UI.Dialogs;
  11. namespace PRS.Mobile
  12. {
  13. [XamlCompilation(XamlCompilationOptions.Compile)]
  14. public partial class DigitalFormsPicker : MobilePage
  15. {
  16. public Guid JobID { get; set; } = Guid.Empty;
  17. #region Fields
  18. bool _searching = false;
  19. Kanban addToTaskKanban = new Kanban();
  20. List<String> types = new List<String>();
  21. private bool firstLoad = true;
  22. private bool incompleteVisible = true;
  23. private bool addingToTask = false;
  24. List<ExistingFormShell> incompleteForms = new List<ExistingFormShell>();
  25. List<ExistingFormShell> completeForms = new List<ExistingFormShell>();
  26. #endregion
  27. private String _appliesTo;
  28. private Guid _parent;
  29. public DigitalFormsPicker(String appliesto, Guid parent)
  30. {
  31. _appliesTo = appliesto;
  32. _parent = _parent;
  33. InitializeComponent();
  34. // This is for New Forms
  35. App.Data.DigitalForms.Refresh(false,
  36. () => Device.BeginInvokeOnMainThread(LoadScreen)
  37. );
  38. // This is for Existing Forms
  39. }
  40. private void ExitBtn_Clicked(object sender, EventArgs e)
  41. {
  42. Navigation.PopAsync();
  43. }
  44. #region OnAppearing and Loading Screen
  45. protected override void OnDisappearing()
  46. {
  47. base.OnDisappearing();
  48. }
  49. protected override void OnAppearing()
  50. {
  51. _searching = false;
  52. if (RetainedResults.IsFormRetained)
  53. {
  54. DigitalFormHost host = new DigitalFormHost(DigitalFormsHelper.LoadModel(RetainedResults.LastDigitalFormLayout, CheckType(), addToTaskKanban, JobID, null, addingToTask), JobID);
  55. Navigation.PushAsync(host);
  56. }
  57. LoadExistingForms();
  58. base.OnAppearing();
  59. }
  60. public void LoadScreen()
  61. {
  62. var layouts = Enumerable.ToArray(App.Data.DigitalForms.Layouts
  63. .Where(l => String.Equals(l.Form.AppliesTo, _appliesTo)));
  64. // GetAverages();
  65. layoutsList.ItemsSource = layouts;
  66. types = layouts
  67. .Select(x => x.Form.Group)
  68. .Where(x => String.IsNullOrWhiteSpace(x))
  69. .Distinct()
  70. .OrderBy(x=>x)
  71. .Prepend("All")
  72. .ToList();
  73. filterOptionsControl.Options = types;
  74. filterOptionsControl.CreateRadioButtonsAndSetDefault(types.First());
  75. firstLoad = false;
  76. }
  77. // private void GetAverages()
  78. // {
  79. // try
  80. // {
  81. // Task.Run(() =>
  82. // {
  83. // foreach (var layout in layouts)
  84. // {
  85. // TimeSpan span = new TimeSpan();
  86. // CoreTable table = new Client<KanbanForm>().Query
  87. // (
  88. // new Filter<KanbanForm>(x => x.Form.ID).IsEqualTo(layout.FormID).And(x => x.FormOpen).IsNotEqualTo(null),
  89. // new Columns<KanbanForm>(x => x.FormOpen)
  90. // );
  91. // if (table.Rows.Any())
  92. // {
  93. // foreach (CoreRow row in table.Rows)
  94. // {
  95. // List<object> list = row.Values;
  96. // TimeSpan timespan = TimeSpan.Parse(list[0].ToString());
  97. // span = span + timespan;
  98. // }
  99. // TimeSpan average = span / table.Rows.Count();
  100. // layout.AverageTime = "Average time to complete: " + average.Minutes.ToString() + "m " + average.Seconds.ToString() + "s";
  101. // layout.AverageTimeRow = 30;
  102. // layout.ImageRowSpan = 2;
  103. // }
  104. // }
  105. // Device.BeginInvokeOnMainThread(() =>
  106. // {
  107. // layoutsList.ItemsSource = null;
  108. // if (filterOptionsControl.CurrentOption == "All")
  109. // {
  110. // layoutsList.ItemsSource = layouts;
  111. // }
  112. // else
  113. // {
  114. // layoutsList.ItemsSource = layouts.Where(x => x.FormGroupDescription.Equals(filterOptionsControl.CurrentOption));
  115. // }
  116. // });
  117. // });
  118. // }
  119. // catch { }
  120. // }
  121. private void LoadExistingForms()
  122. {
  123. //Task.Run(() =>
  124. //{
  125. try
  126. {
  127. List<IFormPickerQueryLoader> loaderList = new List<IFormPickerQueryLoader>()
  128. {
  129. new FormPickerQueryLoader<Kanban, KanbanLink, KanbanForm>(),
  130. new FormPickerQueryLoader<Job, JobLink, JobForm>()
  131. };
  132. incompleteForms.Clear();
  133. completeForms.Clear();
  134. foreach (var loader in loaderList)
  135. {
  136. List<ExistingFormShell> incomplete = loader.QueryIncomplete();
  137. foreach (var v in incomplete)
  138. {
  139. incompleteForms.Add(v);
  140. }
  141. List<ExistingFormShell> complete = loader.QueryComplete();
  142. foreach (var v in complete)
  143. {
  144. completeForms.Add(v);
  145. }
  146. }
  147. SortForms(completeForms, FormCompletion.Complete);
  148. SortForms(incompleteForms, FormCompletion.Incomplete);
  149. Device.BeginInvokeOnMainThread(() =>
  150. {
  151. myFormsButton.Alert = incompleteForms.Count > 0 ? incompleteForms.Count.ToString() : "";
  152. RefreshMyForms();
  153. });
  154. }
  155. catch (Exception ex)
  156. {
  157. InABox.Mobile.MobileLogging.Log(ex);
  158. }
  159. //});
  160. }
  161. enum FormCompletion
  162. {
  163. Incomplete,
  164. Complete
  165. }
  166. private void SortForms(List<ExistingFormShell> shells, FormCompletion completion)
  167. {
  168. if (completion == FormCompletion.Complete && shells.Count > 0)
  169. shells.Sort((x, y) => y.DateCompleted.CompareTo(x.DateCompleted)); //descending
  170. else if (completion == FormCompletion.Incomplete && shells.Count > 0)
  171. shells.Sort((x, y) => x.DateStarted.CompareTo(y.DateStarted)); //ascending
  172. }
  173. private void ShowOrHideIncompleteFormsNotifications()
  174. {
  175. }
  176. private void RefreshMyForms()
  177. {
  178. incompleteFormsList.ItemsSource = null;
  179. completeFormsList.ItemsSource = null;
  180. incompleteFormsList.ItemsSource = incompleteForms;
  181. completeFormsList.ItemsSource = completeForms;
  182. incompleteBtn.Text = "Incomplete (" + incompleteForms.Count + ")";
  183. completeBtn.Text = "Complete (" + completeForms.Count + ")";
  184. }
  185. #endregion
  186. #region User Interaction
  187. #region New Forms Section
  188. private void NewButton_Clicked(object sender, EventArgs e)
  189. {
  190. templatesColumn.Width = GridLength.Star;
  191. formsColumn.Width = 0;
  192. existingFormsGrid.IsVisible = false;
  193. templatesGrid.IsVisible = true;
  194. ((VisualElement)newButton).BackgroundColor = Color.FromHex("#15C7C1");
  195. ((VisualElement)myFormsButton).BackgroundColor = Color.Default;
  196. }
  197. private void MyFormsButton_Clicked(object sender, EventArgs e)
  198. {
  199. templatesColumn.Width = 0;
  200. formsColumn.Width = GridLength.Star;
  201. existingFormsGrid.IsVisible = true;
  202. templatesGrid.IsVisible = false;
  203. ((VisualElement)newButton).BackgroundColor = Color.Default;
  204. ((VisualElement)myFormsButton).BackgroundColor = Color.FromHex("#15C7C1");
  205. }
  206. private void FilterOptionsControl_OnFilterOptionChanged(string filterOption)
  207. {
  208. try
  209. {
  210. if (filterOption == filterOptionsControl.CurrentOption)
  211. return;
  212. filterOptionsControl.CurrentOption = filterOption;
  213. // if (filterOption == "All")
  214. // {
  215. // layoutsList.ItemsSource = layouts;
  216. // }
  217. // else
  218. // {
  219. // layoutsList.ItemsSource = layouts.Where(x => x.FormGroupDescription.Equals(filterOption));
  220. // }
  221. }
  222. catch { }
  223. }
  224. #endregion
  225. #region My Forms Section
  226. private async void IncompleteFormsList_Tapped(object sender, EventArgs e)
  227. {
  228. using (await MaterialDialog.Instance.LoadingDialogAsync(message: "Loading"))
  229. {
  230. var form = incompleteFormsList.SelectedItem as ExistingFormShell;
  231. DigitalFormLayout layout = new Client<DigitalFormLayout>().Query(
  232. new Filter<DigitalFormLayout>(x => x.Form.ID).IsEqualTo(form.FormID)
  233. ).Rows.FirstOrDefault().ToObject<DigitalFormLayout>();
  234. if (form.Type == typeof(JobForm))
  235. JobID = form.ParentID;
  236. else
  237. JobID = Guid.Empty;
  238. DigitalFormHost host = new DigitalFormHost(DigitalFormsHelper.LoadModel(layout, form.Type, addToTaskKanban, JobID, form, addingToTask), JobID);
  239. Navigation.PushAsync(host);
  240. }
  241. }
  242. private async void CompleteFormsList_Tapped(object sender, EventArgs e)
  243. {
  244. using (await MaterialDialog.Instance.LoadingDialogAsync(message: "Loading"))
  245. {
  246. var form = completeFormsList.SelectedItem as ExistingFormShell;
  247. DigitalFormLayout layout = new Client<DigitalFormLayout>().Query(
  248. new Filter<DigitalFormLayout>(x => x.Form.ID).IsEqualTo(form.FormID)
  249. ).Rows.FirstOrDefault().ToObject<DigitalFormLayout>();
  250. if (form.Type == typeof(JobForm))
  251. JobID = form.ParentID;
  252. else
  253. JobID = Guid.Empty;
  254. DigitalFormHost host = new DigitalFormHost(DigitalFormsHelper.LoadModel(layout, form.Type, addToTaskKanban, JobID, form, addingToTask), JobID);
  255. Navigation.PushAsync(host);
  256. }
  257. }
  258. private void Incomplete_Tapped(object sender, EventArgs e)
  259. {
  260. incompleteFormsColumn.Width = GridLength.Star;
  261. completeFormsColumn.Width = 0;
  262. incompleteFormsList.IsVisible = true;
  263. completeFormsList.IsVisible = false;
  264. incompleteBtn.BackgroundColor = Color.FromHex("#15C7C1");
  265. completeBtn.BackgroundColor = Color.Default;
  266. incompleteVisible = true;
  267. searchEnt.Text = "";
  268. }
  269. private void Complete_Tapped(object sender, EventArgs e)
  270. {
  271. completeFormsColumn.Width = GridLength.Star;
  272. incompleteFormsColumn.Width = 0;
  273. completeFormsList.IsVisible = true;
  274. incompleteFormsList.IsVisible = false;
  275. incompleteBtn.BackgroundColor = Color.Default;
  276. completeBtn.BackgroundColor = Color.FromHex("#15C7C1");
  277. incompleteVisible = false;
  278. searchEnt.Text = "";
  279. }
  280. private async void Delete_Tapped(object sender, EventArgs e)
  281. {
  282. var item = ((TappedEventArgs)e).Parameter as ExistingFormShell;
  283. if (item == null) return;
  284. string chosenOption = await DisplayActionSheet("Delete Form?", "Cancel", null, "Yes", "No");
  285. switch (chosenOption)
  286. {
  287. case "Yes":
  288. break;
  289. default:
  290. return;
  291. }
  292. DeleteForm(item);
  293. LoadExistingForms();
  294. }
  295. private void DeleteForm(ExistingFormShell item)
  296. {
  297. if (item.Type == typeof(KanbanForm))
  298. DeleteKanbanForm(item.ID);
  299. if (item.Type == typeof(JobForm))
  300. DeleteJobForm(item.ID);
  301. }
  302. private void DeleteJobForm(Guid id)
  303. {
  304. JobForm form = new JobForm { ID = id };
  305. new Client<JobForm>().Delete(form, "Deleted from Mobile App - My Forms section");
  306. }
  307. private void DeleteKanbanForm(Guid id)
  308. {
  309. KanbanForm form = new KanbanForm { ID = id };
  310. new Client<KanbanForm>().Delete(form, "Deleted from Mobile App - My Forms section");
  311. }
  312. #region Loading From History Section
  313. private void LayoutsList_Tapped(object sender, EventArgs e)
  314. {
  315. if (_searching)
  316. return;
  317. else
  318. LoadHost();
  319. }
  320. private async void LoadHost()
  321. {
  322. try
  323. {
  324. var digitalFormLayoutShell = layoutsList.SelectedItem as DigitalFormLayoutShell;
  325. DigitalFormLayout digitalFormLayout = new DigitalFormLayout();
  326. using (await MaterialDialog.Instance.LoadingDialogAsync(message: "Loading"))
  327. {
  328. _searching = true;
  329. digitalFormLayout.ID = digitalFormLayoutShell.ID;
  330. // digitalFormLayout.Description = digitalFormLayoutShell.Description;
  331. // digitalFormLayout.Code = digitalFormLayoutShell.Code;
  332. // digitalFormLayout.Form.AppliesTo = digitalFormLayoutShell.AppliesTo;
  333. // digitalFormLayout.Form.ID = digitalFormLayoutShell.FormID;
  334. // digitalFormLayout.Layout = digitalFormLayoutShell.Layout;
  335. // digitalFormLayout.Form.Group.Description = digitalFormLayoutShell.FormGroupDescription;
  336. RetainedResults.LastDigitalFormLayout = digitalFormLayout;
  337. }
  338. DigitalFormHost host = new DigitalFormHost(DigitalFormsHelper.LoadModel(digitalFormLayout, CheckType(), addToTaskKanban, JobID, null, addingToTask), JobID);
  339. Navigation.PushAsync(host);
  340. }
  341. catch (Exception ex)
  342. {
  343. InABox.Mobile.MobileLogging.Log(ex);
  344. }
  345. }
  346. private Type CheckType()
  347. {
  348. if (JobID != Guid.Empty)
  349. return typeof(JobForm);
  350. else
  351. return typeof(KanbanForm);
  352. }
  353. private IDigitalFormHostModel LoadModel(DigitalFormLayout layout, Type type, ExistingFormShell form = null)
  354. {
  355. if (type == typeof(JobForm))
  356. {
  357. var model = new DigitalFormHostModel<Job, JobLink, JobForm>();
  358. var job = new Job();
  359. var jobForm = new JobForm();
  360. jobForm.Form.ID = layout.Form.ID;
  361. if (form == null)
  362. {
  363. job.ID = JobID;
  364. }
  365. else
  366. {
  367. jobForm.ID = form.ID;
  368. job.ID = form.ParentID;
  369. }
  370. model.LoadItems(job, jobForm, layout);
  371. return model;
  372. }
  373. else
  374. {
  375. var model = new DigitalFormHostModel<Kanban, KanbanLink, KanbanForm>();
  376. var kanban = new Kanban();
  377. var kanbanForm = new KanbanForm();
  378. kanbanForm.Form.ID = layout.Form.ID;
  379. if (form != null)
  380. {
  381. kanbanForm.ID = form.ID;
  382. kanban.ID = form.ParentID;
  383. }
  384. if (addingToTask)
  385. {
  386. kanbanForm.Parent.ID = addToTaskKanban.ID;
  387. kanban.ID = addToTaskKanban.ID;
  388. }
  389. model.LoadItems(kanban, kanbanForm, layout);
  390. return model;
  391. }
  392. }
  393. #endregion
  394. #region Searching
  395. private void SearchEnt_Changed(object sender, EventArgs e)
  396. {
  397. if (CheckEmptySearch())
  398. return;
  399. else
  400. {
  401. RunSearch();
  402. }
  403. }
  404. private bool CheckEmptySearch()
  405. {
  406. if (string.IsNullOrWhiteSpace(searchEnt.Text))
  407. {
  408. incompleteFormsList.ItemsSource = incompleteForms;
  409. completeFormsList.ItemsSource = completeForms;
  410. return true;
  411. }
  412. else
  413. return false;
  414. }
  415. private void RunSearch()
  416. {
  417. try
  418. {
  419. if (incompleteVisible)
  420. RunSearchOnIncomplete();
  421. else
  422. RunSearchOnHistory();
  423. }
  424. catch (Exception ex)
  425. {
  426. InABox.Mobile.MobileLogging.Log(ex);
  427. }
  428. }
  429. private void RunSearchOnIncomplete()
  430. {
  431. incompleteFormsList.ItemsSource = incompleteForms.Where(x =>x.Description.ToUpper().Contains(searchEnt.Text.ToUpper()));
  432. }
  433. private void RunSearchOnHistory()
  434. {
  435. completeFormsList.ItemsSource = completeForms.Where(x => x.Description.ToUpper().Contains(searchEnt.Text.ToUpper()));
  436. }
  437. #endregion
  438. #endregion
  439. #endregion
  440. }
  441. }