PurchaseOrderModule.xaml.cs 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using Comal.Classes;
  7. using InABox.Clients;
  8. using InABox.Configuration;
  9. using InABox.Core;
  10. using Plugin.Media;
  11. using Xamarin.Forms;
  12. using Xamarin.Forms.Xaml;
  13. using Xamarin.Forms;
  14. using Xamarin.Forms.Xaml;
  15. namespace comal.timesheets
  16. {
  17. [XamlCompilation(XamlCompilationOptions.Compile)]
  18. public partial class PurchaseOrderModule : ContentPage
  19. {
  20. List<PurchaseOrderShell> purchaseOrderShells = new List<PurchaseOrderShell>();
  21. bool bLoading = true;
  22. List<string> filterOptions = new List<string>();
  23. bool firstLoad = true;
  24. public PurchaseOrderModule()
  25. {
  26. InitializeComponent();
  27. LoadList();
  28. }
  29. private async void LoadList()
  30. {
  31. await Task.Run(() =>
  32. {
  33. bLoading = true;
  34. purchaseOrderShells.Clear();
  35. filterOptions.Clear();
  36. filterOptions.Add("All");
  37. CoreTable table = DoQuery();
  38. if (table.Rows.Any())
  39. LoadAndDisplayFromTable(table);
  40. });
  41. }
  42. private void LoadAndDisplayFromTable(CoreTable table)
  43. {
  44. foreach (CoreRow row in table.Rows)
  45. {
  46. purchaseOrderShells.Add(GenerateShellFromRow(row));
  47. }
  48. firstLoad = false;
  49. DisplayList();
  50. }
  51. private void DisplayList()
  52. {
  53. Device.BeginInvokeOnMainThread(() =>
  54. {
  55. searchEnt.Text = "";
  56. filterOptionsControl.Options = filterOptions;
  57. filterOptionsControl.CreateRadioButtonsAndSetDefault(filterOptions.First());
  58. purchaseOrderListView.ItemsSource = purchaseOrderShells;
  59. filterOptionsControl.OnFilterOptionChanged += FilterOptionsControl_OnFilterOptionChanged;
  60. bLoading = false;
  61. });
  62. }
  63. private PurchaseOrderShell GenerateShellFromRow(CoreRow row)
  64. {
  65. var list = CheckListForNulls(row);
  66. var purchaseOrderShell = CreateShell(list);
  67. AddFilterOptions(purchaseOrderShell);
  68. return purchaseOrderShell;
  69. }
  70. private void AddFilterOptions(PurchaseOrderShell purchaseOrderShell)
  71. {
  72. if (!string.IsNullOrWhiteSpace(purchaseOrderShell.SupplierName))
  73. {
  74. if (!filterOptions.Contains(purchaseOrderShell.SupplierName))
  75. {
  76. filterOptions.Add(purchaseOrderShell.SupplierName);
  77. }
  78. }
  79. }
  80. private PurchaseOrderShell CreateShell(List<object> list)
  81. {
  82. PurchaseOrderShell purchaseOrderShell = new PurchaseOrderShell()
  83. {
  84. ID = Guid.Parse(list[0].ToString()),
  85. PONumber = list[1].ToString(),
  86. DueDate = "Due: " + DateTime.Parse(list[2].ToString()).ToString("dd-MMMM-yy"),
  87. Status = list[3].ToString(),
  88. SupplierID = Guid.Parse(list[4].ToString()),
  89. SupplierName = list[5].ToString(),
  90. Notes = list[6].ToString()
  91. };
  92. return purchaseOrderShell;
  93. }
  94. private List<object> CheckListForNulls(CoreRow row)
  95. {
  96. List<object> list = row.Values;
  97. if (list[0] == null) { list[0] = Guid.Empty; } //0
  98. if (list[1] == null) { list[1] = ""; } //1
  99. if (list[2] == null) { list[2] = DateTime.MinValue; } //2
  100. if (list[3] == null) { list[3] = ""; } //3
  101. if (list[4] == null) { list[4] = Guid.Empty; } //4
  102. if (list[5] == null) { list[5] = ""; } //5
  103. if (list[6] == null) { list[6] = ""; } //6
  104. return list;
  105. }
  106. private CoreTable DoQuery()
  107. {
  108. return new Client<PurchaseOrder>().Query
  109. (
  110. new Filter<PurchaseOrder>(x => x.ClosedDate).IsEqualTo(DateTime.MinValue),
  111. new Columns<PurchaseOrder>(
  112. x => x.ID, //0
  113. x => x.PONumber, //1
  114. x => x.DueDate, //2
  115. x => x.Status, //3
  116. x => x.SupplierLink.ID, //4
  117. x => x.SupplierName, //5
  118. x => x.Notes //6
  119. ),
  120. new SortOrder<PurchaseOrder>(x => x.DueDate, SortDirection.Descending)
  121. );
  122. }
  123. private void FilterOptionsControl_OnFilterOptionChanged(string filterOption)
  124. {
  125. if (filterOption == filterOptionsControl.CurrentOption)
  126. return;
  127. bLoading = true;
  128. searchEnt.Text = "";
  129. bLoading = false;
  130. filterOptionsControl.CurrentOption = filterOption;
  131. if (filterOption == "All")
  132. {
  133. purchaseOrderListView.ItemsSource = purchaseOrderShells;
  134. listCountLbl.Text = "Number of items in list: " + purchaseOrderShells.Count;
  135. }
  136. else
  137. {
  138. var list = purchaseOrderShells.Where(x => x.SupplierName.Equals(filterOption));
  139. purchaseOrderListView.ItemsSource = list;
  140. listCountLbl.Text = "Number of items in list: " + list.Count();
  141. }
  142. }
  143. private async void PurchaseOrder_Clicked(object sender, EventArgs e)
  144. {
  145. PurchaseOrderShell purchaseOrderShell = purchaseOrderListView.SelectedItem as PurchaseOrderShell;
  146. PurchaseOrderDetails details = new PurchaseOrderDetails(purchaseOrderShell);
  147. Navigation.PushAsync(details);
  148. }
  149. private void SearchEnt_Changed(object sender, EventArgs e)
  150. {
  151. if (bLoading)
  152. return;
  153. if (!string.IsNullOrWhiteSpace(searchEnt.Text))
  154. {
  155. RunSearch();
  156. }
  157. else
  158. {
  159. listCountLbl.Text = "Number of items in list: " + purchaseOrderShells.Count;
  160. purchaseOrderListView.ItemsSource = purchaseOrderShells;
  161. }
  162. }
  163. private async void RunSearch()
  164. {
  165. await Task.Run(() =>
  166. {
  167. List<PurchaseOrderShell> searchList = new List<PurchaseOrderShell>();
  168. if (filterOptionsControl.CurrentOption == "All")
  169. {
  170. searchList = purchaseOrderShells;
  171. }
  172. else
  173. {
  174. var newList = purchaseOrderShells.Where(x => x.SupplierName.Equals(filterOptionsControl.CurrentOption));
  175. foreach (var shell in newList)
  176. {
  177. searchList.Add(shell);
  178. }
  179. }
  180. var list = searchList.Where(x =>
  181. x.PONumber.Contains(searchEnt.Text) || x.PONumber.Contains(UpperCaseFirst(searchEnt.Text)) || x.PONumber.Contains(searchEnt.Text.ToLower()) || x.PONumber.Contains(searchEnt.Text.ToUpper()) ||
  182. x.Notes.Contains(searchEnt.Text) || x.Notes.Contains(UpperCaseFirst(searchEnt.Text)) || x.Notes.Contains(searchEnt.Text.ToLower()) || x.Notes.Contains(searchEnt.Text.ToUpper()) ||
  183. x.SupplierName.Contains(searchEnt.Text) || x.SupplierName.Contains(UpperCaseFirst(searchEnt.Text)) || x.SupplierName.Contains(searchEnt.Text.ToLower()) || x.SupplierName.Contains(searchEnt.Text.ToUpper()) ||
  184. x.Status.Contains(searchEnt.Text) || x.Status.Contains(UpperCaseFirst(searchEnt.Text)) || x.Status.Contains(searchEnt.Text.ToLower()) || x.Status.Contains(searchEnt.Text.ToUpper()) ||
  185. x.DueDate.Contains(searchEnt.Text) || x.DueDate.Contains(UpperCaseFirst(searchEnt.Text)) || x.DueDate.Contains(searchEnt.Text.ToLower()) || x.DueDate.Contains(searchEnt.Text.ToUpper())
  186. );
  187. Device.BeginInvokeOnMainThread(() =>
  188. {
  189. listCountLbl.Text = "Number of items in list: " + list.Count();
  190. purchaseOrderListView.ItemsSource = list;
  191. });
  192. });
  193. }
  194. static String UpperCaseFirst(string s)
  195. {
  196. char[] a = s.ToCharArray();
  197. a[0] = char.ToUpper(a[0]);
  198. return new string(a);
  199. }
  200. }
  201. }