Просмотр исходного кода

MobileTabStrip now allows images as well as text
Fixed Issues with Mobile Date and Time Buttons
MobileButtons now defaults to rounded corners
ICoreRepository.Search() now returns itself

Frank van den Bos 1 год назад
Родитель
Сommit
c4145c17a1

+ 7 - 2
InABox.Core/CoreUtils.cs

@@ -85,6 +85,7 @@ namespace InABox.Core
         v20_2,
         v20_3,
         v22_1,
+        v23_1,
         Unspecified
     }
 
@@ -166,8 +167,12 @@ namespace InABox.Core
                     "NzY3MzEzQDMyMzAyZTMzMmUzMGR2bk5Bb1lOK2pJV2lLdys4YlVDMGViYUhCY21PM2xITTRWZlhYYmRlVm89;NzY3MzE0QDMyMzAyZTMzMmUzMG9vSEdIY1d1NDFPYjBGSnJMcTlQSmpMUzYwNk9HZUNXWHNJZWlXZloyT0U9"
                 },
                 {
-                        SyncfusionVersion.v22_1,
-                        "MjU0OTIyM0AzMjMyMmUzMDJlMzBhMTc2SkUzUFkyUzcyUFVhNzFLWDRCOElLTkVjQ2JQOG9zZ09CUTBuZjN3PQ==;MjU0OTIyNEAzMjMyMmUzMDJlMzBtaG5naUZPVVRwdENBWGRNSDdYK3orQ3NCcjVkYjRVUzQ4ZHoyRkloeStVPQ==;MjU0OTIyNUAzMjMyMmUzMDJlMzBtaG5naUZPVVRwdENBWGRNSDdYK3orQ3NCcjVkYjRVUzQ4ZHoyRkloeStVPQ=="
+                    SyncfusionVersion.v22_1,
+                    "MjU0OTIyM0AzMjMyMmUzMDJlMzBhMTc2SkUzUFkyUzcyUFVhNzFLWDRCOElLTkVjQ2JQOG9zZ09CUTBuZjN3PQ==;MjU0OTIyNEAzMjMyMmUzMDJlMzBtaG5naUZPVVRwdENBWGRNSDdYK3orQ3NCcjVkYjRVUzQ4ZHoyRkloeStVPQ==;MjU0OTIyNUAzMjMyMmUzMDJlMzBtaG5naUZPVVRwdENBWGRNSDdYK3orQ3NCcjVkYjRVUzQ4ZHoyRkloeStVPQ=="
+                },
+                {
+                    SyncfusionVersion.v23_1,
+                    "MjgwNDUxMkAzMjMzMmUzMDJlMzBlYjFtTGpVVkFBVjB5K0VXWXJBazhXa3htWGFQMnJuK0txb0VTL2EycmlBPQ==;MjgwNDUxM0AzMjMzMmUzMDJlMzBXTC9sRzg4aFV1VU1uS1F5a1UrZHdFSzMxaFFsYVpPbDlsc0F5OVNEVFhJPQ==;MjgwNDUxNEAzMjMzMmUzMDJlMzBXTC9sRzg4aFV1VU1uS1F5a1UrZHdFSzMxaFFsYVpPbDlsc0F5OVNEVFhJPQ=="
                 },
                 {
                     SyncfusionVersion.Unspecified,

+ 2 - 1
InABox.Mobile/InABox.Mobile.Shared/Components/MobileButton/MobileButton.xaml.cs

@@ -78,7 +78,8 @@ namespace InABox.Mobile
         public static readonly BindableProperty CornerRadiusProperty = BindableProperty.Create(
             nameof(CornerRadius), 
             typeof(float), 
-            typeof(MobileButton));
+            typeof(MobileButton),
+            5.0f);
         
         public float CornerRadius 
         {

+ 0 - 1
InABox.Mobile/InABox.Mobile.Shared/Components/MobileDateSelector/MobileDateSelector.xaml.cs

@@ -1,5 +1,4 @@
 using System;
-using Syncfusion.XForms.Pickers;
 using Xamarin.Forms.Xaml;
 
 namespace InABox.Mobile

+ 243 - 56
InABox.Mobile/InABox.Mobile.Shared/Components/MobileTabStrip/MobileTabStrip.xaml

@@ -3,9 +3,239 @@
 <ContentView xmlns="http://xamarin.com/schemas/2014/forms"
              xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
              xmlns:mobile="clr-namespace:InABox.Mobile;assembly=InABox.Mobile.Shared"
-             xmlns:ui="clr-namespace:XF.Material.Forms.UI;assembly=XF.Material"
              x:Class="InABox.Mobile.MobileTabStrip"
              x:DataType="mobile:MobileTabStrip">
+    
+    <ContentView.Resources>
+        <ResourceDictionary>
+            
+            <DataTemplate x:Key="VerticalTemplate" x:DataType="mobile:MobileTabStripItem">
+                <Frame
+                    Grid.Column="{Binding Index}"
+                    HasShadow="False" 
+                    Margin="0" 
+                    Padding="5"
+                    BorderColor="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='UnselectedBackground'}" 
+                    BackgroundColor="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='UnselectedBackground'}" 
+                    CornerRadius="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='CornerRadius'}"
+                    IsClippedToBounds="True"
+                    VerticalOptions="Fill"
+                    HorizontalOptions="Fill">
+                    
+                    <Frame.GestureRecognizers>
+                        <TapGestureRecognizer Tapped="DoTap"/>
+                    </Frame.GestureRecognizers>
+                    
+                    <Frame.Triggers>
+                        <DataTrigger TargetType="Frame" Binding="{Binding Selected}" Value="True">
+                            <Setter Property="BackgroundColor" Value="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='SelectedBackground'}" />
+                        </DataTrigger>
+                    </Frame.Triggers>
+                    
+                    <Grid>
+                        
+                        <Grid.RowDefinitions>
+                            <RowDefinition Height="*"/>
+                            <RowDefinition Height="Auto"/>
+                        </Grid.RowDefinitions>
+                        
+                        <Image
+                            x:Name="_image"
+                            Source="{Binding Image}"
+                            Grid.Row="0"
+                            Aspect="AspectFit"
+                            BackgroundColor="Transparent"
+                            HeightRequest="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='ImageSize.Height'}"
+                            WidthRequest="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='ImageSize.Width'}">
+                            <Image.GestureRecognizers>
+                                <TapGestureRecognizer Tapped="DoTap"/>
+                            </Image.GestureRecognizers>
+                        </Image>
+                        
+                        <Label 
+                            x:Name="_label"
+                            Text="{Binding Text}"
+                            Grid.Row="1"
+                            FontSize="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='FontSize'}" 
+                            FontAttributes="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='FontAttributes'}"
+                            HorizontalTextAlignment="Center" 
+                            VerticalTextAlignment="Center" 
+                            BackgroundColor="Transparent"
+                            TextColor="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='UnselectedForeground'}">
+                            <Label.GestureRecognizers>
+                                <TapGestureRecognizer Tapped="DoTap" />
+                            </Label.GestureRecognizers>
+                            <Label.Triggers>
+                                <DataTrigger TargetType="Label" Binding="{Binding Selected}" Value="True">
+                                    <Setter Property="TextColor" Value="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='SelectedForeground'}" />
+                                </DataTrigger>
+                            </Label.Triggers>
+                        </Label> 
+                        
+                    </Grid>
+                </Frame>
+            </DataTemplate>
+            
+            <DataTemplate x:Key="HorizontalTemplate" x:DataType="mobile:MobileTabStripItem">
+                <Frame
+                    Grid.Column="{Binding Index}"
+                    HasShadow="False" 
+                    Margin="0" 
+                    Padding="5"
+                    BorderColor="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='UnselectedBackground'}" 
+                    BackgroundColor="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='UnselectedBackground'}" 
+                    CornerRadius="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='CornerRadius'}"
+                    IsClippedToBounds="True"
+                    VerticalOptions="Fill"
+                    HorizontalOptions="Fill">
+                    
+                    <Frame.GestureRecognizers>
+                        <TapGestureRecognizer Tapped="DoTap"/>
+                    </Frame.GestureRecognizers>
+                    
+                    <Frame.Triggers>
+                        <DataTrigger TargetType="Frame" Binding="{Binding Selected}" Value="True">
+                            <Setter Property="BackgroundColor" Value="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='SelectedBackground'}" />
+                        </DataTrigger>
+                    </Frame.Triggers>
+                    
+                    <Grid>
+                        
+                        <Grid.ColumnDefinitions>
+                            <ColumnDefinition Width="Auto"/>
+                            <ColumnDefinition Width="*"/>
+                        </Grid.ColumnDefinitions>
+                        
+                        <Image
+                            x:Name="_image"
+                            Source="{Binding Image}"
+                            Grid.Column="0"
+                            Aspect="AspectFit"
+                            BackgroundColor="Transparent"
+                            HeightRequest="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='ImageSize.Height'}"
+                            WidthRequest="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='ImageSize.Width'}">
+                            <Image.GestureRecognizers>
+                                <TapGestureRecognizer Tapped="DoTap"/>
+                            </Image.GestureRecognizers>
+                        </Image>
+                        
+                        <Label 
+                            x:Name="_label"
+                            Text="{Binding Text}"
+                            Grid.Column="1"
+                            FontSize="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='FontSize'}" 
+                            FontAttributes="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='FontAttributes'}"
+                            HorizontalTextAlignment="Center" 
+                            VerticalTextAlignment="Center" 
+                            BackgroundColor="Transparent"
+                            TextColor="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='UnselectedForeground'}">
+                            <Label.GestureRecognizers>
+                                <TapGestureRecognizer Tapped="DoTap" />
+                            </Label.GestureRecognizers>
+                            <Label.Triggers>
+                                <DataTrigger TargetType="Label" Binding="{Binding Selected}" Value="True">
+                                    <Setter Property="TextColor" Value="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='SelectedForeground'}" />
+                                </DataTrigger>
+                            </Label.Triggers>
+                        </Label> 
+                        
+                    </Grid>
+                </Frame>
+            </DataTemplate>
+            
+            <DataTemplate x:Key="TextOnlyTemplate" x:DataType="mobile:MobileTabStripItem">
+                <Frame
+                    Grid.Column="{Binding Index}"
+                    HasShadow="False" 
+                    Margin="0" 
+                    Padding="5"
+                    BorderColor="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='UnselectedBackground'}" 
+                    BackgroundColor="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='UnselectedBackground'}" 
+                    CornerRadius="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='CornerRadius'}"
+                    IsClippedToBounds="True"
+                    VerticalOptions="Fill"
+                    HorizontalOptions="Fill">
+                    
+                    <Frame.GestureRecognizers>
+                        <TapGestureRecognizer Tapped="DoTap"/>
+                    </Frame.GestureRecognizers>
+                    
+                    <Frame.Triggers>
+                        <DataTrigger TargetType="Frame" Binding="{Binding Selected}" Value="True">
+                            <Setter Property="BackgroundColor" Value="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='SelectedBackground'}" />
+                        </DataTrigger>
+                    </Frame.Triggers>
+                    
+                    <Label 
+                        x:Name="_label"
+                        Text="{Binding Text}"
+                        FontSize="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='FontSize'}" 
+                        FontAttributes="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='FontAttributes'}"
+                        HorizontalTextAlignment="Center" 
+                        VerticalTextAlignment="Center" 
+                        BackgroundColor="Transparent"
+                        TextColor="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='UnselectedForeground'}">
+                        <Label.GestureRecognizers>
+                            <TapGestureRecognizer Tapped="DoTap" />
+                        </Label.GestureRecognizers>
+                        <Label.Triggers>
+                            <DataTrigger TargetType="Label" Binding="{Binding Selected}" Value="True">
+                                <Setter Property="TextColor" Value="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='SelectedForeground'}" />
+                            </DataTrigger>
+                        </Label.Triggers>
+                    </Label> 
+
+                </Frame>
+            </DataTemplate>
+            
+            <DataTemplate x:Key="ImageOnlyTemplate" x:DataType="mobile:MobileTabStripItem">
+                <Frame
+                    Grid.Column="{Binding Index}"
+                    HasShadow="False" 
+                    Margin="0" 
+                    Padding="5"
+                    BorderColor="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='UnselectedBackground'}" 
+                    BackgroundColor="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='UnselectedBackground'}" 
+                    CornerRadius="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='CornerRadius'}"
+                    IsClippedToBounds="True"
+                    VerticalOptions="Fill"
+                    HorizontalOptions="Fill">
+                    
+                    <Frame.GestureRecognizers>
+                        <TapGestureRecognizer Tapped="DoTap"/>
+                    </Frame.GestureRecognizers>
+                    
+                    <Frame.Triggers>
+                        <DataTrigger TargetType="Frame" Binding="{Binding Selected}" Value="True">
+                            <Setter Property="BackgroundColor" Value="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='SelectedBackground'}" />
+                        </DataTrigger>
+                    </Frame.Triggers>
+                    
+                    <Image
+                        x:Name="_image"
+                        Source="{Binding Image}"
+                        Aspect="AspectFit"
+                        BackgroundColor="Transparent"
+                        HeightRequest="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='ImageSize.Height'}"
+                        WidthRequest="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='ImageSize.Width'}">
+                        <Image.GestureRecognizers>
+                            <TapGestureRecognizer Tapped="DoTap"/>
+                        </Image.GestureRecognizers>
+                    </Image>
+                    
+                </Frame>
+            </DataTemplate>
+            
+            <mobile:MobileTabStripDataTemplateSelector 
+                x:Key="MobileTabStripDataTemplateSelector"
+                x:Name="_mobileTabStripDataTemplateSelector"
+                TextOnlyTemplate="{StaticResource TextOnlyTemplate}" 
+                ImageOnlyTemplate="{StaticResource ImageOnlyTemplate}"
+                VerticalTemplate="{StaticResource VerticalTemplate}"
+                HorizontalTemplate="{StaticResource HorizontalTemplate}"/>
+            
+        </ResourceDictionary>
+    </ContentView.Resources>
     <ContentView.Content>
         
         <Frame
@@ -25,62 +255,19 @@
                 </OnPlatform>
             </Frame.Padding>
             
-            <Grid x:Name="_grid" ColumnSpacing="0">
-                
-                <BindableLayout.ItemTemplate>
+            <Grid 
+                x:Name="_grid" 
+                ColumnSpacing="0" 
+                BindableLayout.ItemTemplateSelector="{StaticResource MobileTabStripDataTemplateSelector}">
                 
-                    <DataTemplate x:DataType="mobile:MobileTabStripItem">
-                        <Grid 
-                            Margin="0"
-                            Grid.Column="{Binding Index}"
-                        VerticalOptions="Fill"
-                        HorizontalOptions="Fill">
-                        
-                        <Grid.ColumnDefinitions>
-                            <ColumnDefinition Width="*"/>
-                        </Grid.ColumnDefinitions>
-                        
-                        <Grid.RowDefinitions>
-                            <RowDefinition Height="*"/>
-                        </Grid.RowDefinitions>
-                            
-                        <Frame
-                            HasShadow="False" 
-                            Margin="0" 
-                            Padding="0"
-                            BorderColor="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='UnselectedBackground'}" 
-                            BackgroundColor="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='UnselectedBackground'}" 
-                            CornerRadius="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='CornerRadius'}"
-                            IsClippedToBounds="True">
-
-                            <Label 
-                                Grid.Row="0" 
-                                x:Name="_label"
-                                Text="{Binding Text}" 
-                                FontSize="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='FontSize'}" 
-                                FontAttributes="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='FontAttributes'}"
-                                HorizontalTextAlignment="Center" 
-                                VerticalTextAlignment="Center" 
-                                BackgroundColor="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='UnselectedBackground'}"
-                                TextColor="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='UnselectedForeground'}"
-                                Margin="0">
-                                <Label.GestureRecognizers>
-                                    <TapGestureRecognizer Tapped="DoTap" />
-                                </Label.GestureRecognizers>
-                                <Label.Triggers>
-                                    <DataTrigger TargetType="Label" Binding="{Binding Selected}" Value="True">
-                                        <Setter Property="TextColor" Value="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='SelectedForeground'}" />
-                                        <Setter Property="BackgroundColor" Value="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='SelectedBackground'}" />
-                                    </DataTrigger>
-                                </Label.Triggers>
-                            </Label> 
-                        </Frame>
-                        
-                    </Grid>
-                        
-                </DataTemplate>
-                    
-            </BindableLayout.ItemTemplate>
+                <!-- <BindableLayout.ItemTemplateSelector> -->
+                <!--     <mobile:MobileTabStripDataTemplateSelector  -->
+                <!--         SelectedLayout="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='ItemsLayout'}" -->
+                <!--         TextOnlyTemplate="{StaticResource TextOnlyTemplate}"  -->
+                <!--         ImageOnlyTemplate="{StaticResource ImageOnlyTemplate}" -->
+                <!--         VerticalTemplate="{StaticResource VerticalTemplate}" -->
+                <!--         HorizontalTemplate="{StaticResource HorizontalTemplate}"/> -->
+                <!-- </BindableLayout.ItemTemplateSelector> -->
                 
             </Grid>
             

+ 60 - 1
InABox.Mobile/InABox.Mobile.Shared/Components/MobileTabStrip/MobileTabStrip.xaml.cs

@@ -8,6 +8,36 @@ using Xamarin.Forms.Xaml;
 
 namespace InABox.Mobile
 {
+
+    public enum MobileTabStripItemLayout
+    {
+        TextOnly,
+        ImageOnly,
+        Vertical,
+        Horizontal
+    }
+
+    public class MobileTabStripDataTemplateSelector : DataTemplateSelector
+    {
+        
+        public MobileTabStripItemLayout SelectedLayout { get; set; }
+        
+        public DataTemplate VerticalTemplate { get; set; }
+        public DataTemplate HorizontalTemplate { get; set; }
+        public DataTemplate TextOnlyTemplate { get; set; }
+        public DataTemplate ImageOnlyTemplate { get; set; }
+
+        protected override DataTemplate OnSelectTemplate (object item, BindableObject container)
+        {
+            return SelectedLayout switch
+            {
+                MobileTabStripItemLayout.ImageOnly => ImageOnlyTemplate,
+                MobileTabStripItemLayout.Vertical => VerticalTemplate,
+                MobileTabStripItemLayout.Horizontal => HorizontalTemplate,
+                _ => TextOnlyTemplate
+            };
+        }
+    }
     
     [XamlCompilation(XamlCompilationOptions.Compile)]
     public partial class MobileTabStrip
@@ -125,6 +155,35 @@ namespace InABox.Mobile
             set => SetValue(FontAttributesProperty, value);
         }
         
+        private readonly BindableProperty ItemsLayoutProperty = BindableProperty.Create(
+            nameof(ItemsLayout),
+            typeof(MobileTabStripItemLayout),
+            typeof(MobileTabStrip),
+            MobileTabStripItemLayout.TextOnly);
+
+        public MobileTabStripItemLayout ItemsLayout
+        {
+            get => (MobileTabStripItemLayout)GetValue(ItemsLayoutProperty);
+            set
+            {
+                _mobileTabStripDataTemplateSelector.SelectedLayout = value;
+                SetValue(ItemsLayoutProperty, value);
+            }
+        }
+        
+        private readonly BindableProperty ImageSizeProperty = BindableProperty.Create(
+            nameof(ImageSize),
+            typeof(Size),
+            typeof(MobileTabStrip),
+            new Size(30,30));
+
+        public Size ImageSize
+        {
+            get => (Size)GetValue(ImageSizeProperty);
+            set => SetValue(ImageSizeProperty, value);
+        }
+
+        
         public MobileTabStripItem SelectedItem 
         {
             get => Items.FirstOrDefault(x => x.Selected);
@@ -171,7 +230,7 @@ namespace InABox.Mobile
             Device.BeginInvokeOnMainThread(() =>
             {
                 foreach (var item in Items)
-                    item.Selected = item == (sender as Label)?.BindingContext;
+                    item.Selected = item == (sender as BindableObject)?.BindingContext;
                 OnPropertyChanged(nameof(Items));
                 SelectionChanged?.Invoke(this,EventArgs.Empty);
             });

+ 11 - 0
InABox.Mobile/InABox.Mobile.Shared/Components/MobileTabStrip/MobileTabStripItem.cs

@@ -18,6 +18,17 @@ namespace InABox.Mobile
             set => SetValue(TextProperty, value);
         }
         
+        private readonly BindableProperty ImageProperty = BindableProperty.Create(
+            nameof(Image),
+            typeof(ImageSource),
+            typeof(MobileTabStripItem));
+
+        public ImageSource Image
+        {
+            get => (ImageSource)GetValue(ImageProperty);
+            set => SetValue(ImageProperty, value);
+        }
+        
         private readonly BindableProperty SelectedProperty = BindableProperty.Create(
             nameof(Selected),
             typeof(bool),

+ 1 - 1
InABox.Mobile/InABox.Mobile.Shared/Components/MobileTimeSelector/MobileTimeButton.xaml

@@ -7,7 +7,7 @@
              x:Class="InABox.Mobile.MobileTimeButton">
 
     <ContentView.Resources>
-        <local:TimeSpanFormatter x:Key="TimeSpanFormatter" x:Name="_timespanFormatter"/>
+        <local:TimeSpanFormatter x:Key="TimeSpanFormatter" x:Name="_timespanFormatter" Prompt="Select Time"/>
     </ContentView.Resources>
     
     <ContentView.ControlTemplate>

+ 5 - 3
InABox.Mobile/InABox.Mobile.Shared/DataModels/CoreRepository.cs

@@ -298,13 +298,14 @@ namespace InABox.Mobile
         
         public Func<TItem, bool> SearchPredicate { get; set; }
 
-        public void Search(Func<TItem, bool> predicate)
+        public ICoreRepository Search(Func<TItem, bool> predicate)
         {
             SearchPredicate = predicate;
             Search();
+            return this;
         }
 
-        public void Search()
+        public ICoreRepository Search()
         {
             var curselected = _selectedItems.ToArray();
             var items = _allitems == null
@@ -321,9 +322,10 @@ namespace InABox.Mobile
             //_items.Clear();
             //_items.ReplaceRange(items);
             OnPropertyChanged(nameof(Items));
+            return this;
         }
  
-        void ICoreRepository.Search(Func<object,bool> method)
+        ICoreRepository ICoreRepository.Search(Func<object,bool> method)
             => Search((o) => method(o as TItem));
 
 

+ 2 - 2
InABox.Mobile/InABox.Mobile.Shared/DataModels/ICoreRepository.cs

@@ -37,8 +37,8 @@ namespace InABox.Mobile
         object AddItem();
         void DeleteItem(object item);
         IEnumerable Items { get; }
-        void Search();
-        void Search(Func<object,bool> predicate);
+        ICoreRepository Search();
+        ICoreRepository Search(Func<object,bool> predicate);
         
         void ToggleSelection(object item);
         void SelectItem(object item);

+ 7 - 5
InABox.Mobile/InABox.Mobile.Shared/InABox.Mobile.Shared.csproj

@@ -22,11 +22,13 @@
         </PackageReference>
         <PackageReference Include="Serilog" Version="3.0.1" />
         <PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
-        <PackageReference Include="Syncfusion.Licensing" Version="22.1.39" />
-        <PackageReference Include="Syncfusion.Xamarin.Pdf" Version="22.1.39" />
-        <PackageReference Include="Syncfusion.Xamarin.SfDataGrid" Version="22.1.39" />
-        <PackageReference Include="Syncfusion.Xamarin.SfPopupLayout" Version="22.1.39" />
-        <PackageReference Include="Syncfusion.Xamarin.SfPullToRefresh" Version="22.1.39" />
+        <PackageReference Include="Syncfusion.Licensing" Version="23.1.44" />
+        <PackageReference Include="Syncfusion.Xamarin.Pdf" Version="23.1.44" />
+        <PackageReference Include="Syncfusion.Xamarin.SfBusyIndicator" Version="23.1.44" />
+        <PackageReference Include="Syncfusion.Xamarin.SfDataGrid" Version="23.1.44" />
+        <PackageReference Include="Syncfusion.Xamarin.SfPicker" Version="23.1.44" />
+        <PackageReference Include="Syncfusion.Xamarin.SfPopupLayout" Version="23.1.44" />
+        <PackageReference Include="Syncfusion.Xamarin.SfPullToRefresh" Version="23.1.44" />
         <PackageReference Include="Xamarin.Essentials" Version="1.8.0" />
         <PackageReference Include="Xamarin.Forms" Version="5.0.0.2612" />
         <PackageReference Include="XF.Material" Version="1.8.0" />

+ 1 - 1
InABox.Mobile/InABox.Mobile.Shared/MobileUtils.cs

@@ -15,7 +15,7 @@ namespace InABox.Mobile
 
         public static void Init()
         {
-            Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense(CoreUtils.SyncfusionLicense(SyncfusionVersion.v22_1));
+            Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense(CoreUtils.SyncfusionLicense(SyncfusionVersion.v23_1));
         }
 
         public static String GetDeviceID()