GenericSelectionPage.xaml.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. using InABox.Clients;
  6. using InABox.Core;
  7. using Xamarin.Forms;
  8. using XF.Material.Forms.UI;
  9. using XF.Material.Forms.UI.Dialogs;
  10. namespace comal.timesheets
  11. {
  12. public delegate void ItemSelectedEvent(CoreRow row);
  13. public interface ISelectionViewModel
  14. {
  15. Dictionary<String,CoreRow> Load();
  16. }
  17. public class SelectionViewModel<T> : ISelectionViewModel where T : Entity, IRemotable, IPersistent, new()
  18. {
  19. private Filter<T> _filter = null;
  20. private Expression<Func<T, object>>[] _visible = null;
  21. private Expression<Func<T, object>>[] _hidden = null;
  22. private SortOrder<T> _sort = null;
  23. public SelectionViewModel(Filter<T> filter, Expression<Func<T, object>>[] visible, Expression<Func<T, object>>[] hidden = null, SortOrder<T> sort = null, Func<CoreRow,String> format = null)
  24. {
  25. _filter = filter;
  26. _visible = visible;
  27. _hidden = hidden == null ? new Expression<Func<T, object>>[] { } : hidden;
  28. _sort = sort;
  29. _format = format;
  30. }
  31. private Func<CoreRow, String> _format = null;
  32. public Dictionary<String, CoreRow> Load()
  33. {
  34. var columns = new Columns<T>(x=>x.ID);
  35. foreach (var column in _visible)
  36. columns.Add(column);
  37. foreach (var column in _hidden)
  38. columns.Add(column);
  39. var data = new Client<T>().Query(
  40. _filter,
  41. columns,
  42. _sort
  43. );
  44. Dictionary<String, CoreRow> result = new Dictionary<string, CoreRow>();
  45. foreach (var row in data.Rows)
  46. {
  47. if (_format != null)
  48. result[_format(row)] = row;
  49. else
  50. {
  51. List<object> display = new List<object>();
  52. foreach (var visible in _visible)
  53. display.Add(row.Get<T, object>(visible));
  54. result[String.Join(" : ", display)] = row;
  55. }
  56. }
  57. return result;
  58. }
  59. }
  60. public partial class GenericSelectionPage
  61. {
  62. public event ItemSelectedEvent OnItemSelected;
  63. private ISelectionViewModel _model = null;
  64. private Dictionary<String, CoreRow> _items = new Dictionary<String, CoreRow>();
  65. public bool AutoClose { get; set; } = true;
  66. public GenericSelectionPage(String title, ISelectionViewModel model)
  67. {
  68. _model = model;
  69. InitializeComponent();
  70. Title = title;
  71. }
  72. bool bFirst = true;
  73. protected override async void OnAppearing()
  74. {
  75. base.OnAppearing();
  76. if (bFirst)
  77. {
  78. bFirst = false;
  79. var progress = await MaterialDialog.Instance.LoadingDialogAsync(message: "Loading Data");
  80. _items = _model.Load();
  81. Items.ItemsSource = _items;
  82. await progress.DismissAsync();
  83. }
  84. }
  85. void Item_Selected(System.Object sender, Xamarin.Forms.SelectedItemChangedEventArgs e)
  86. {
  87. if (e.SelectedItem == null)
  88. return;
  89. KeyValuePair<string, CoreRow> selected = (KeyValuePair<string, CoreRow>)e.SelectedItem;
  90. OnItemSelected?.Invoke(selected.Value);
  91. if (AutoClose)
  92. Navigation.PopAsync();
  93. }
  94. void MaterialTextField_TextChanged(System.Object sender, Xamarin.Forms.TextChangedEventArgs e)
  95. {
  96. MaterialTextField field = sender as MaterialTextField;
  97. Items.ItemsSource = null;
  98. if (String.IsNullOrWhiteSpace(field.Text))
  99. Items.ItemsSource = _items;
  100. else
  101. Items.ItemsSource = new Dictionary<String,CoreRow>(_items.Where(x => x.Key.ToUpper().Contains(field.Text.ToUpper())));
  102. }
  103. }
  104. }