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 Load(); } public class SelectionViewModel : ISelectionViewModel where T : Entity, IRemotable, IPersistent, new() { private Filter _filter = null; private Expression>[] _visible = null; private Expression>[] _hidden = null; private SortOrder _sort = null; public SelectionViewModel(Filter filter, Expression>[] visible, Expression>[] hidden = null, SortOrder sort = null, Func format = null) { _filter = filter; _visible = visible; _hidden = hidden == null ? new Expression>[] { } : hidden; _sort = sort; _format = format; } private Func _format = null; public Dictionary Load() { var columns = new Columns(x=>x.ID); foreach (var column in _visible) columns.Add(column); foreach (var column in _hidden) columns.Add(column); var data = new Client().Query( _filter, columns, _sort ); Dictionary result = new Dictionary(); foreach (var row in data.Rows) { if (_format != null) result[_format(row)] = row; else { List display = new List(); foreach (var visible in _visible) display.Add(row.Get(visible)); result[String.Join(" : ", display)] = row; } } return result; } } public partial class GenericSelectionPage { public event ItemSelectedEvent OnItemSelected; private ISelectionViewModel _model = null; private Dictionary _items = new Dictionary(); 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 selected = (KeyValuePair)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(_items.Where(x => x.Key.ToUpper().Contains(field.Text.ToUpper()))); } } }