| 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())));        }    }}
 |