MobileDataGrid.xaml.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. using Android.Content;
  2. using comal.timesheets.Data_Classes;
  3. using Nest;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Collections.ObjectModel;
  7. using System.Linq;
  8. using System.Reflection;
  9. using Xamarin.Forms;
  10. using Xamarin.Forms.Xaml;
  11. using static Android.Renderscripts.Sampler;
  12. namespace comal.timesheets
  13. {
  14. [XamlCompilation(XamlCompilationOptions.Compile)]
  15. public partial class MobileDataGrid : ContentView
  16. {
  17. ObservableCollection<DataGridFilter> Filters = new ObservableCollection<DataGridFilter>();
  18. List<DataGridViewModelItem> Items = new List<DataGridViewModelItem>();
  19. List<DataGridViewModelItem> CurrentItems = new List<DataGridViewModelItem>();
  20. PropertyInfo[] info = typeof(DataGridViewModelItem).GetProperties();
  21. Type Type;
  22. public MobileDataGrid()
  23. {
  24. InitializeComponent();
  25. Filters.CollectionChanged += Filters_CollectionChanged;
  26. }
  27. public void Setup(List<DataGridViewModelItem> items, Type type)
  28. {
  29. Type = type;
  30. SetupHeadersAndDataTemplate(items.First());
  31. Items = items;
  32. Refresh(Items);
  33. }
  34. private void Refresh(List<DataGridViewModelItem> items)
  35. {
  36. listView.ItemsSource = items;
  37. countLbl.Text = items.Count + " Records";
  38. CurrentItems.Clear();
  39. foreach (var item in items)
  40. {
  41. CurrentItems.Add(item);
  42. }
  43. }
  44. public void SetupHeadersAndDataTemplate(DataGridViewModelItem item)
  45. {
  46. GenerateHeaders(item);
  47. //GenerateDataTemplate(item);
  48. }
  49. private void GenerateDataTemplate(DataGridViewModelItem item)
  50. {
  51. var grid = new Grid
  52. {
  53. HorizontalOptions = LayoutOptions.FillAndExpand,
  54. VerticalOptions = LayoutOptions.Center,
  55. Margin = new Thickness(0),
  56. Padding = new Thickness(2),
  57. };
  58. grid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Auto) });
  59. int count = 0;
  60. foreach (var tuple in item.Data)
  61. {
  62. grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
  63. grid.Children.Add(CreateNewListViewLabel(count));
  64. count++;
  65. }
  66. if (item.Image != null)
  67. {
  68. grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
  69. grid.Children.Add(CreatNewListViewImage(count, item.Image));
  70. }
  71. listView.ItemTemplate = new DataTemplate(() =>
  72. {
  73. return new ViewCell { View = grid };
  74. });
  75. }
  76. private View CreatNewListViewImage(int count, Image img)
  77. {
  78. var newImage = new Image
  79. {
  80. Source = img.Source,
  81. HeightRequest = 30,
  82. WidthRequest = 30,
  83. HorizontalOptions = LayoutOptions.Center,
  84. VerticalOptions = LayoutOptions.Center
  85. };
  86. newImage.SetBinding(Image.SourceProperty, "Source");
  87. return SetGridValues(newImage, 0, count);
  88. }
  89. private View CreateNewListViewLabel(int count)
  90. {
  91. var lbl = new Label();
  92. lbl.SetBinding(Label.TextProperty, new Binding("Col" + count));
  93. return SetGridValues(lbl, 0, count);
  94. }
  95. public void GenerateHeaders(DataGridViewModelItem item)
  96. {
  97. int count = 0;
  98. foreach (var tuple in item.Data)
  99. {
  100. CreateNewHeader(tuple.Item1, count);
  101. count++;
  102. }
  103. //if (item.Image != null)
  104. //CreateNewHeader("Image", count);
  105. }
  106. private void CreateNewHeader(string name, int count)
  107. {
  108. headerGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
  109. DataGridHeaderRow header = new DataGridHeaderRow { ColumnName = name, ColumnNumber = count };
  110. header.Setup();
  111. header.OnDataGridHeaderFilterTapped += Header_OnDataGridHeaderFilterTapped;
  112. header.OnDataGridHeaderTapped += Header_OnDataGridHeaderTapped;
  113. headerGrid.Children.Add(SetGridValues(header, 0, count));
  114. CreateSearchEntry(name, count);
  115. }
  116. private void CreateSearchEntry(string name, int count)
  117. {
  118. var searchEnt = new DataGridSearchEntry { ColumnName = name, ColumnNumber = count };
  119. searchEnt.OnDataGridSearchEntryChanged += SearchEnt_OnDataGridSearchEntryChanged;
  120. searchEnt.IsEnabled = name == "Image" ? false : true;
  121. headerGrid.Children.Add(SetGridValues(searchEnt, 1, count));
  122. }
  123. private View SetGridValues(View view, int row, int column)
  124. {
  125. view.SetValue(Grid.RowProperty, row);
  126. view.SetValue(Grid.ColumnProperty, column);
  127. return view;
  128. }
  129. #region Events
  130. private void SearchEnt_OnDataGridSearchEntryChanged(int columnnumber, string value)
  131. {
  132. if (string.IsNullOrWhiteSpace(value))
  133. Filters.Remove(Filters.FirstOrDefault(x => x.ColNumber == "Col" + columnnumber));
  134. else
  135. {
  136. if (Filters.FirstOrDefault(x => x.ColNumber == "Col" + columnnumber) != null)
  137. Filters.Remove(Filters.FirstOrDefault(x => x.ColNumber == "Col" + columnnumber));
  138. Filters.Add(new DataGridFilter { ColNumber = "Col" + columnnumber, Value = value, FilterNumber = FindNumber(columnnumber) });
  139. }
  140. }
  141. private FilterNumber FindNumber(int columnnumber)
  142. {
  143. switch (columnnumber)
  144. {
  145. case 0:
  146. return FilterNumber.Zero;
  147. case 1:
  148. return FilterNumber.One;
  149. case 2:
  150. return FilterNumber.Two;
  151. case 3:
  152. return FilterNumber.Three;
  153. default:
  154. return FilterNumber.Zero;
  155. }
  156. }
  157. bool bSearching = false;
  158. private void Filters_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
  159. {
  160. if (bSearching)
  161. return;
  162. bSearching = true;
  163. List<DataGridViewModelItem> finalList = new List<DataGridViewModelItem>();
  164. if (Filters.FirstOrDefault(x => x.FilterNumber == FilterNumber.Zero) != null)
  165. {
  166. var filter = Filters.FirstOrDefault(x => x.FilterNumber == FilterNumber.Zero);
  167. foreach (DataGridViewModelItem item in RunSearch(Items, filter.Value, "Col0"))
  168. finalList.Add(item);
  169. }
  170. else
  171. {
  172. foreach (DataGridViewModelItem item in Items)
  173. finalList.Add(item);
  174. }
  175. if (Filters.FirstOrDefault(x => x.FilterNumber == FilterNumber.One) != null)
  176. {
  177. List<DataGridViewModelItem> intermediatelist = new List<DataGridViewModelItem>();
  178. var filter = Filters.FirstOrDefault(x => x.FilterNumber == FilterNumber.One);
  179. foreach (DataGridViewModelItem item in RunSearch(finalList, filter.Value, "Col1"))
  180. intermediatelist.Add(item);
  181. finalList.Clear();
  182. foreach (DataGridViewModelItem item in intermediatelist)
  183. finalList.Add(item);
  184. }
  185. else if (finalList.Count == 0)
  186. {
  187. foreach (DataGridViewModelItem item in Items)
  188. finalList.Add(item);
  189. }
  190. if (Filters.FirstOrDefault(x => x.FilterNumber == FilterNumber.Two) != null)
  191. {
  192. List<DataGridViewModelItem> intermediatelist = new List<DataGridViewModelItem>();
  193. var filter = Filters.FirstOrDefault(x => x.FilterNumber == FilterNumber.Two);
  194. foreach (DataGridViewModelItem item in RunSearch(finalList, filter.Value, "Col2"))
  195. intermediatelist.Add(item);
  196. finalList.Clear();
  197. foreach (DataGridViewModelItem item in intermediatelist)
  198. finalList.Add(item);
  199. }
  200. if (Filters.FirstOrDefault(x => x.FilterNumber == FilterNumber.Three) != null)
  201. {
  202. List<DataGridViewModelItem> intermediatelist = new List<DataGridViewModelItem>();
  203. var filter = Filters.FirstOrDefault(x => x.FilterNumber == FilterNumber.Three);
  204. foreach (DataGridViewModelItem item in RunSearch(finalList, filter.Value, "Col3"))
  205. intermediatelist.Add(item);
  206. finalList.Clear();
  207. foreach (DataGridViewModelItem item in intermediatelist)
  208. finalList.Add(item);
  209. }
  210. else if (finalList.Count == 0 && Filters.Count == 0)
  211. {
  212. foreach (DataGridViewModelItem item in Items)
  213. finalList.Add(item);
  214. }
  215. Refresh(finalList);
  216. bSearching = false;
  217. }
  218. private IEnumerable<DataGridViewModelItem> RunSearch(IEnumerable<DataGridViewModelItem> list, string value, string propertyname)
  219. {
  220. var intermediatelist = new List<DataGridViewModelItem>();
  221. foreach (var property in info)
  222. {
  223. if (property.Name == propertyname)
  224. {
  225. foreach (var item in list)
  226. {
  227. if (GetStringValue(property, item).Contains(value)
  228. || GetStringValue(property, item).Contains(value.ToUpper())
  229. || GetStringValue(property, item).Contains(value.ToLower())
  230. || GetStringValue(property, item).Contains(SearchUtils.LowerCaseFirst(value))
  231. || GetStringValue(property, item).Contains(SearchUtils.UpperCaseFirst(value))
  232. || GetStringValue(property, item).Contains(SearchUtils.UpperCaseSecond(value))
  233. )
  234. {
  235. if (!intermediatelist.Contains(item))
  236. intermediatelist.Add(item);
  237. }
  238. }
  239. }
  240. }
  241. return intermediatelist;
  242. }
  243. private string GetStringValue(PropertyInfo property, object item)
  244. {
  245. if (property.PropertyType == typeof(string))
  246. return (string)property.GetValue(item);
  247. else
  248. return "";
  249. }
  250. private void Header_OnDataGridHeaderTapped(int columnnumber, SearchUtils.SortDirection sortdirection)
  251. {
  252. var intermediatelist = new List<DataGridViewModelItem>();
  253. foreach (var property in info)
  254. {
  255. if (property.Name == "Col" + columnnumber)
  256. {
  257. foreach (var item in SearchUtils.OrderByPropertyName(CurrentItems, "Col" + columnnumber, sortdirection))
  258. {
  259. intermediatelist.Add(item);
  260. }
  261. Refresh(intermediatelist);
  262. }
  263. }
  264. }
  265. private void Header_OnDataGridHeaderFilterTapped(int columnnumber, string columnname)
  266. {
  267. }
  268. #endregion
  269. }
  270. public enum FilterNumber
  271. {
  272. Zero,
  273. One,
  274. Two,
  275. Three
  276. }
  277. public class DataGridFilter
  278. {
  279. public string ColNumber { get; set; }
  280. public string Value { get; set; }
  281. public FilterNumber FilterNumber { get; set; }
  282. }
  283. public class DataGridViewModelItem
  284. {
  285. public Guid ID { get; set; }
  286. public List<Tuple<string, string>> Data { get; set; }
  287. public string Col0 { get; set; }
  288. public string Col1 { get; set; }
  289. public string Col2 { get; set; }
  290. public string Col3 { get; set; }
  291. public Image Image { get; set; }
  292. public ImageSource Source
  293. {
  294. get
  295. {
  296. return Image.Source;
  297. }
  298. }
  299. public GridLength ColWidth0 { get; set; }
  300. public GridLength ColWidth1 { get; set; }
  301. public GridLength ColWidth2 { get; set; }
  302. public GridLength ColWidth3 { get; set; }
  303. public DataGridViewModelItem(Guid id, List<Tuple<string, string>> data, Image image = null)
  304. {
  305. ID = id;
  306. Data = data;
  307. Image = image;
  308. Col0 = data.Count > 0 ? data[0].Item2 : "";
  309. Col1 = data.Count > 1 ? data[1].Item2 : "";
  310. Col2 = data.Count > 2 ? data[2].Item2 : "";
  311. Col3 = data.Count > 3 ? data[3].Item2 : "";
  312. ColWidth0 = data.Count > 0 ? new GridLength(1, GridUnitType.Star) : new GridLength(0, GridUnitType.Absolute);
  313. ColWidth1 = data.Count > 1 ? new GridLength(1, GridUnitType.Star) : new GridLength(0, GridUnitType.Absolute);
  314. ColWidth2 = data.Count > 2 ? new GridLength(1, GridUnitType.Star) : new GridLength(0, GridUnitType.Absolute);
  315. ColWidth3 = data.Count > 3 ? new GridLength(1, GridUnitType.Star) : new GridLength(0, GridUnitType.Absolute);
  316. }
  317. }
  318. }