123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Linq.Expressions;
- using InABox.Clients;
- using InABox.Core;
- using Xamarin.Forms;
- using XF.Material.Forms.UI;
- using XF.Material.Forms.UI.Dialogs;
- namespace comal.timesheets
- {
- public delegate void ItemSelectedEvent(CoreRow row);
- public interface ISelectionViewModel
- {
- Dictionary<String,CoreRow> Load();
- }
- public class SelectionViewModel<T> : ISelectionViewModel where T : Entity, IRemotable, IPersistent, new()
- {
- private Filter<T> _filter = null;
- private Expression<Func<T, object>>[] _visible = null;
- private Expression<Func<T, object>>[] _hidden = null;
- private SortOrder<T> _sort = null;
- 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)
- {
- _filter = filter;
- _visible = visible;
- _hidden = hidden == null ? new Expression<Func<T, object>>[] { } : hidden;
- _sort = sort;
- _format = format;
- }
- private Func<CoreRow, String> _format = null;
- public Dictionary<String, CoreRow> Load()
- {
- var columns = new Columns<T>(x=>x.ID);
- foreach (var column in _visible)
- columns.Add(column);
- foreach (var column in _hidden)
- columns.Add(column);
- var data = new Client<T>().Query(
- _filter,
- columns,
- _sort
- );
- Dictionary<String, CoreRow> result = new Dictionary<string, CoreRow>();
- foreach (var row in data.Rows)
- {
- if (_format != null)
- result[_format(row)] = row;
- else
- {
- List<object> display = new List<object>();
- foreach (var visible in _visible)
- display.Add(row.Get<T, object>(visible));
- result[String.Join(" : ", display)] = row;
- }
-
- }
- return result;
- }
- }
- public partial class GenericSelectionPage
- {
- public event ItemSelectedEvent OnItemSelected;
- private ISelectionViewModel _model = null;
- private Dictionary<String, CoreRow> _items = new Dictionary<String, CoreRow>();
- public bool AutoClose { get; set; } = true;
- public GenericSelectionPage(String title, ISelectionViewModel model)
- {
- _model = model;
- InitializeComponent();
- Title = title;
- }
- bool bFirst = true;
- protected override async void OnAppearing()
- {
- base.OnAppearing();
- if (bFirst)
- {
- bFirst = false;
- var progress = await MaterialDialog.Instance.LoadingDialogAsync(message: "Loading Data");
- _items = _model.Load();
- Items.ItemsSource = _items;
- await progress.DismissAsync();
- }
- }
- void Item_Selected(System.Object sender, Xamarin.Forms.SelectedItemChangedEventArgs e)
- {
- if (e.SelectedItem == null)
- return;
- KeyValuePair<string, CoreRow> selected = (KeyValuePair<string, CoreRow>)e.SelectedItem;
- OnItemSelected?.Invoke(selected.Value);
- if (AutoClose)
- Navigation.PopAsync();
- }
- void MaterialTextField_TextChanged(System.Object sender, Xamarin.Forms.TextChangedEventArgs e)
- {
- MaterialTextField field = sender as MaterialTextField;
- Items.ItemsSource = null;
- if (String.IsNullOrWhiteSpace(field.Text))
- Items.ItemsSource = _items;
- else
- Items.ItemsSource = new Dictionary<String,CoreRow>(_items.Where(x => x.Key.ToUpper().Contains(field.Text.ToUpper())));
- }
- }
- }
|