123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using InABox.Core;
- using InABox.Mobile;
- using Xamarin.Forms;
- using Xamarin.Forms.Xaml;
- using Xamarin.Forms.Xaml.Internals;
- namespace PRS.Mobile
- {
- public class SelectionViewConfigureArgs : EventArgs
- {
- public MobileGridColumns Columns { get; private set; }
-
- public MobileButtonStripItems Filters { get; set; }
-
- public SelectionViewConfigureArgs(MobileGridColumns columns, MobileButtonStripItems filters)
- {
- Filters = filters;
- Columns = columns;
- }
- }
- public delegate void SelectionViewConfigureEvent(object sender, SelectionViewConfigureArgs args);
- public class SelectionViewRefreshArgs : EventArgs
- {
- public bool Force { get; private set; }
-
- public string Filter { get; private set; }
-
- public DateTime LastUpdated { get; set; }
- public SelectionViewRefreshArgs(bool force, string filter)
- {
- Force = force;
- Filter = filter;
- }
- }
-
- public delegate object SelectionViewRefreshEvent(object sender, SelectionViewRefreshArgs args);
-
- public class SelectionViewSelectionChangedArgs : EventArgs
- {
- public object[] SelectedItems { get; private set; }
- public SelectionViewSelectionChangedArgs(object[] selecteditems)
- {
- SelectedItems = selecteditems;
- }
- }
-
- public delegate void SelectionViewSelectionChangedEvent(object sender, SelectionViewSelectionChangedArgs args);
-
- [XamlCompilation(XamlCompilationOptions.Compile)]
- public partial class SelectionView
- {
-
- public static View Execute<T>(Action<MobileGridColumns> columns, Func<SelectionViewRefreshArgs, object> refresh, Action<T[]> selected, SelectionPageMode mode = SelectionPageMode.Immediate)
- {
- SelectionView selection = new SelectionView
- {
- VerticalOptions = LayoutOptions.Fill,
- HorizontalOptions = LayoutOptions.Fill
- };
- selection.Configure += (sender, args) =>
- {
- args.Columns
- .BeginUpdate()
- .Clear();
- columns(args.Columns);
- args.Columns.EndUpdate();
- };
- selection.Refresh += (sender, args) =>
- {
- var result = refresh(args);
- if (result is ICoreRepository repository)
- selection.Items.LastUpdated = repository.LastUpdated;
- return result;
- };
- selection.SelectionChanged += (sender, args) =>
- {
- selected(args.SelectedItems.OfType<T>().ToArray());
- };
- selection.Mode = mode;
- selection.Load();
- return selection;
- }
-
- private SelectionPageMode _mode = SelectionPageMode.Immediate;
- public SelectionPageMode Mode
- {
- get => _mode;
- set
- {
- _mode = value;
- Items.SelectionMode = value == SelectionPageMode.MultiSelect
- ? MobileGridSelectionMode.Multiple
- : MobileGridSelectionMode.Single;
- }
- }
- public object[] SelectedItems => Items.SelectedItems;
- public event SelectionViewConfigureEvent Configure;
- public event SelectionViewRefreshEvent Refresh;
- public event SelectionViewSelectionChangedEvent SelectionChanged;
- public bool CanSearch
- {
- get => Items.CanSearch;
- set => Items.CanSearch = value;
- }
- public bool PullToRefresh
- {
- get => Items.PullToRefresh;
- set
- {
- Items.ShowRecordCount = value;
- Items.PullToRefresh = value;
- }
- }
-
- public SelectionView()
- {
- Mode = SelectionPageMode.Immediate;
- InitializeComponent();
- PullToRefresh = true;
-
- }
- public void Load()
- {
-
- Configure?.Invoke(this, new SelectionViewConfigureArgs(Items.Columns, Filters.Items));
- Filters.IsVisible = Filters.Items.Count > 1;
-
- Items.SelectionMode = Mode == SelectionPageMode.MultiSelect
- ? MobileGridSelectionMode.Multiple
- : MobileGridSelectionMode.Single;
-
- var args = new SelectionViewRefreshArgs(false, Filters.SelectedItem?.Text ?? string.Empty);
- Items.ItemsSource = Refresh?.Invoke(this, args);
- Items.LastUpdated = PullToRefresh ? args.LastUpdated : DateTime.MinValue;
- }
-
- public void AddButton(String text, Action clicked)
- {
- MobileButton button = new MobileButton() { Text = text };
- button.Clicked += (sender, args) => clicked?.Invoke();
- button.HeightRequest = 40;
- button.SetValue(Grid.ColumnProperty, Buttons.Children.Count);
- Buttons.Children.Add(button);
- Buttons.IsVisible = true;
- }
-
- private void Items_OnRefreshRequested(object sender, MobileGridRefreshRequestArgs args)
- {
- DoRefresh();
- }
-
- private void Filters_OnSelectionChanged(object sender, EventArgs e)
- {
- DoRefresh();
- }
- private void DoRefresh()
- {
- var args = new SelectionViewRefreshArgs(true, Filters.SelectedItem?.Text ?? string.Empty);
- var items = Refresh?.Invoke(this, args);
- Items.ItemsSource = null;
- Items.ItemsSource = items;
- Items.LastUpdated = args.LastUpdated;
- }
- private void Items_OnSelectionChanged(object sender, MobileGridSelectionArgs args)
- {
- if (Mode == SelectionPageMode.Immediate)
- SelectionChanged?.Invoke(this, new SelectionViewSelectionChangedArgs(Items.SelectedItems));
- }
-
- }
- }
|