Ver Fonte

PRS MOBILE - data grid searching complete, ordering by header in progress

Nick há 2 anos atrás
pai
commit
a8ee9bddb0

+ 1 - 1
prs.mobile/comal.timesheets.Android/Resources/Resource.designer.cs

@@ -14,7 +14,7 @@ namespace comal.timesheets.Droid
 {
 	
 	
-	[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "13.0.0.73")]
+	[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "13.1.0.5")]
 	public partial class Resource
 	{
 		

+ 37 - 1
prs.mobile/comal.timesheets/Data Classes/SearchUtils.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.Linq;
 using System.Text;
 
 namespace comal.timesheets.Data_Classes
@@ -20,7 +21,6 @@ namespace comal.timesheets.Data_Classes
             return new string(a);
         }
 
-
         public static String UpperCaseSecond(string s)
         {
             char[] a = s.ToCharArray();
@@ -62,5 +62,41 @@ namespace comal.timesheets.Data_Classes
             else
                 return s;
         }
+
+        public enum SortDirection
+        {
+            Default,
+            Ascending,
+            Descending
+        }
+
+        public static IOrderedEnumerable<T> OrderByPropertyName<T>
+        (
+            this IEnumerable<T> items,
+            string propertyName,
+            SortDirection sortDirection = SortDirection.Ascending
+        )
+        {
+            var propInfo = typeof(T).GetProperty(propertyName);
+            return items.OrderByDirection(x => propInfo.GetValue(x, null), sortDirection);
+        }
+
+        public static IOrderedEnumerable<T> OrderByDirection<T, TKey>
+        (
+            this IEnumerable<T> items,
+            Func<T, TKey> keyExpression,
+            SortDirection sortDirection = SortDirection.Ascending
+        )
+        {
+            switch (sortDirection)
+            {
+                case SortDirection.Ascending:
+                    return items.OrderBy(keyExpression);
+                case SortDirection.Descending:
+                    return items.OrderByDescending(keyExpression);
+                default: 
+                    return items.OrderBy(keyExpression);
+            }            
+        }
     }
 }

+ 0 - 25
prs.mobile/comal.timesheets/DataGrid.xaml

@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
-             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:timesheets="clr-namespace:comal.timesheets"
-             x:Class="comal.timesheets.DataGrid">
-    <ContentPage.Content>
-        <Grid>
-            <Grid.RowDefinitions>
-                <RowDefinition Height="60"/>
-                <RowDefinition Height="80"/>
-                <RowDefinition Height="*"/>
-            </Grid.RowDefinitions>
-
-            <!-- Header Rows-->
-            <Grid Grid.Row="1" x:Name="headerGrid">
-                <Grid.RowDefinitions>
-                    <RowDefinition Height="40"/>
-                    <RowDefinition Height="40"/>
-                </Grid.RowDefinitions>
-            </Grid>
-
-            <ListView Grid.Row="2" HasUnevenRows="True" x:Name="listView"/>
-
-        </Grid>
-    </ContentPage.Content>
-</ContentPage>

+ 0 - 126
prs.mobile/comal.timesheets/DataGrid.xaml.cs

@@ -1,126 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-using Xamarin.Forms;
-using Xamarin.Forms.Xaml;
-
-namespace comal.timesheets
-{
-    [XamlCompilation(XamlCompilationOptions.Compile)]
-    public partial class DataGrid : ContentPage
-    {
-        public List<DataGridViewModelItem> Items { get; set; }
-
-        public DataGrid()
-        {
-            InitializeComponent();
-        }
-
-        public void Setup(List<DataGridViewModelItem> items)
-        {
-            SetupHeadersAndDataTemplate(items.First());
-            Items = items;
-            listView.ItemsSource = Items;
-        }
-
-        public void SetupHeadersAndDataTemplate(DataGridViewModelItem item)
-        {
-            GenerateHeaders(item);
-            GenerateDataTemplate(item);
-        }
-
-        private void GenerateDataTemplate(DataGridViewModelItem item)
-        {
-            var grid = new Grid();
-            int count = 0;
-            foreach (var tuple in item.Data)
-            {
-                grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
-                grid.Children.Add(CreateNewListViewLabel(count));
-                count++;
-            }
-            if (item.Image != null)
-            {
-                grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
-                grid.Children.Add(CreatNewListViewImage(count, item.Image.Source));
-            }
-            listView.ItemTemplate = new DataTemplate(() =>
-            {
-                return new ViewCell { View = grid };
-            });
-        }
-
-        private View CreatNewListViewImage(int count, ImageSource source)
-        {
-            var img = new Image { Source = source };
-            img.SetBinding(Image.SourceProperty, "Source");
-            return SetGridValues(img, 0, count);
-        }
-
-        private View CreateNewListViewLabel(int count)
-        {
-            var lbl = new Label();
-            lbl.SetBinding(Label.TextProperty, "Col" + count);
-            return SetGridValues(lbl, 0, count);
-        }
-
-        public void GenerateHeaders(DataGridViewModelItem item)
-        {
-            int count = 0;
-            foreach (var tuple in item.Data)
-            {
-                CreateNewHeader(tuple.Item1, count);
-                count++;
-            }
-            if (item.Image != null)
-                CreateNewHeader("Image", count);
-        }
-
-        private void CreateNewHeader(string name, int count)
-        {
-            headerGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
-            var header = new DataGridHeaderRow { ColumnName = name, ColumnNumber = count };
-            header.OnDataGridHeaderFilterTapped += Header_OnDataGridHeaderFilterTapped;
-            header.OnDataGridHeaderTapped += Header_OnDataGridHeaderTapped;
-            headerGrid.Children.Add(SetGridValues(header, 0, count));
-            CreateSearchEntry(name, count);
-        }
-
-        private void CreateSearchEntry(string name, int count)
-        {
-            var searchEnt = new DataGridSearchEntry { ColumnName = name, ColumnNumber = count };
-            searchEnt.OnDataGridSearchEntryChanged += SearchEnt_OnDataGridSearchEntryChanged;
-            searchEnt.IsEnabled = name == "Image" ? false : true;
-            headerGrid.Children.Add(SetGridValues(searchEnt, 1, count));
-        }
-
-        private View SetGridValues(View view, int row, int column)
-        {
-            view.SetValue(Grid.RowProperty, row);
-            view.SetValue(Grid.ColumnProperty, column);
-            return view;
-        }
-
-        #region Events
-        private void SearchEnt_OnDataGridSearchEntryChanged(int columnnumber, string value)
-        {
-
-        }
-
-        private void Header_OnDataGridHeaderTapped(int columnnumber)
-        {
-
-        }
-
-        private void Header_OnDataGridHeaderFilterTapped(int columnnumber, string columnname)
-        {
-
-        }
-        #endregion
-
-    }
-    
-}

+ 1 - 1
prs.mobile/comal.timesheets/DataGridHeaderRow.xaml

@@ -12,7 +12,7 @@
 
 
                 <Label Grid.Row="0" x:Name="headerBtn" LineBreakMode="WordWrap" MaxLines="2" HorizontalTextAlignment="Center"
-                   HorizontalOptions="Center" Text="placeholder">
+                   HorizontalOptions="Center" Text="placeholder" FontAttributes="Bold">
                     <Label.GestureRecognizers>
                         <TapGestureRecognizer Tapped="HeaderBtn_Clicked"/>
                     </Label.GestureRecognizers>

+ 7 - 3
prs.mobile/comal.timesheets/DataGridHeaderRow.xaml.cs

@@ -1,4 +1,5 @@
-using System;
+using comal.timesheets.Data_Classes;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
@@ -9,7 +10,7 @@ using Xamarin.Forms.Xaml;
 
 namespace comal.timesheets
 {
-    public delegate void DataGridHeaderTapped(int columnnumber);
+    public delegate void DataGridHeaderTapped(int columnnumber, SearchUtils.SortDirection SortDirection);
     public delegate void DataGridHeaderFilterTapped(int columnnumber, string columnname);
 
     [XamlCompilation(XamlCompilationOptions.Compile)]
@@ -20,14 +21,17 @@ namespace comal.timesheets
         public string ColumnName    { get; set; }
 
         public int ColumnNumber { get; set; }
+
+        public SearchUtils.SortDirection SortDirection { get; set; }
         public DataGridHeaderRow()
         {
             InitializeComponent();
+            SortDirection = SearchUtils.SortDirection.Default;
         }
 
         private void HeaderBtn_Clicked(object sender, EventArgs e)
         {
-            OnDataGridHeaderTapped?.Invoke(ColumnNumber);
+            OnDataGridHeaderTapped?.Invoke(ColumnNumber, SortDirection);
         }
 
         private void Image_tapped(object sender, EventArgs e)

+ 1 - 1
prs.mobile/comal.timesheets/MobileDataGrid.xaml

@@ -17,7 +17,7 @@
                         <ColumnDefinition Width="auto"/>
                         <ColumnDefinition Width="*"/>
                     </Grid.ColumnDefinitions>
-                    <Label Grid.Column="0" Text="Filters:" VerticalOptions="Center" FontAttributes="Bold"/>
+                    <Label Grid.Column="0" Text="Filters:" VerticalOptions="Center" FontAttributes="Bold" Margin="3, 0, 0, 0"/>
                     <FlexLayout Grid.Column="1" x:Name="filterLayout" Wrap="Wrap"
                                     Direction="Row"
                                     JustifyContent="SpaceEvenly"

+ 78 - 26
prs.mobile/comal.timesheets/MobileDataGrid.xaml.cs

@@ -1,4 +1,6 @@
 using Android.Content;
+using comal.timesheets.Data_Classes;
+using Nest;
 using System;
 using System.Collections.Generic;
 using System.Collections.ObjectModel;
@@ -6,6 +8,7 @@ using System.Linq;
 using System.Reflection;
 using Xamarin.Forms;
 using Xamarin.Forms.Xaml;
+using static Android.Renderscripts.Sampler;
 
 namespace comal.timesheets
 {
@@ -13,7 +16,8 @@ namespace comal.timesheets
     public partial class MobileDataGrid : ContentView
     {
         ObservableCollection<DataGridFilter> Filters = new ObservableCollection<DataGridFilter>();
-        public List<DataGridViewModelItem> Items { get; set; }
+        List<DataGridViewModelItem> Items = new List<DataGridViewModelItem>();
+        List<DataGridViewModelItem> CurrentItems = new List<DataGridViewModelItem>();
 
         PropertyInfo[] info = typeof(DataGridViewModelItem).GetProperties();
 
@@ -36,6 +40,11 @@ namespace comal.timesheets
         {
             listView.ItemsSource = items;
             countLbl.Text = items.Count + " Records";
+            CurrentItems.Clear();
+            foreach (var item in items)
+            {
+                CurrentItems.Add(item);
+            }
         }
 
         public void SetupHeadersAndDataTemplate(DataGridViewModelItem item)
@@ -161,11 +170,6 @@ namespace comal.timesheets
             }
         }
 
-        private void DoSearch()
-        {
-
-        }
-
         bool bSearching = false;
 
         private void Filters_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
@@ -180,8 +184,7 @@ namespace comal.timesheets
             if (Filters.FirstOrDefault(x => x.FilterNumber == FilterNumber.Zero) != null)
             {
                 var filter = Filters.FirstOrDefault(x => x.FilterNumber == FilterNumber.Zero);
-                var list = Items.Where(x => x.Col0.Contains(filter.Value));
-                foreach (DataGridViewModelItem item in list)
+                foreach (DataGridViewModelItem item in RunSearch(Items, filter.Value, "Col0"))
                     finalList.Add(item);
             }
             else
@@ -194,11 +197,9 @@ namespace comal.timesheets
             {
                 List<DataGridViewModelItem> intermediatelist = new List<DataGridViewModelItem>();
                 var filter = Filters.FirstOrDefault(x => x.FilterNumber == FilterNumber.One);
-                var list = finalList.Where(x => x.Col1.Contains(filter.Value));
-                foreach (var item in list)                
+                foreach (DataGridViewModelItem item in RunSearch(finalList, filter.Value, "Col1"))
                     intermediatelist.Add(item);
-                if (intermediatelist.Count > 0)
-                    finalList.Clear();
+                finalList.Clear();
                 foreach (DataGridViewModelItem item in intermediatelist)
                     finalList.Add(item);
             }
@@ -212,42 +213,93 @@ namespace comal.timesheets
             {
                 List<DataGridViewModelItem> intermediatelist = new List<DataGridViewModelItem>();
                 var filter = Filters.FirstOrDefault(x => x.FilterNumber == FilterNumber.Two);
-                var list = finalList.Where(x => x.Col2.Contains(filter.Value));
-                foreach (var item in list)
+                foreach (DataGridViewModelItem item in RunSearch(finalList, filter.Value, "Col2"))
                     intermediatelist.Add(item);
-                if (intermediatelist.Count > 0)
-                    finalList.Clear();
+                finalList.Clear();
                 foreach (DataGridViewModelItem item in intermediatelist)
                     finalList.Add(item);
             }
-            else if (finalList.Count == 0)
-            {
-                foreach (DataGridViewModelItem item in Items)
-                    finalList.Add(item);
-            }
+
 
             if (Filters.FirstOrDefault(x => x.FilterNumber == FilterNumber.Three) != null)
             {
                 List<DataGridViewModelItem> intermediatelist = new List<DataGridViewModelItem>();
                 var filter = Filters.FirstOrDefault(x => x.FilterNumber == FilterNumber.Three);
-                var list = finalList.Where(x => x.Col3.Contains(filter.Value));
-                foreach (var item in list)
+                foreach (DataGridViewModelItem item in RunSearch(finalList, filter.Value, "Col3"))
                     intermediatelist.Add(item);
-                if (intermediatelist.Count > 0)
-                    finalList.Clear();
+                finalList.Clear();
                 foreach (DataGridViewModelItem item in intermediatelist)
                     finalList.Add(item);
             }
 
+            else if (finalList.Count == 0 && Filters.Count == 0)
+            {
+                foreach (DataGridViewModelItem item in Items)
+                    finalList.Add(item);
+            }
+
             Refresh(finalList);
 
             bSearching = false;
         }
 
+        private IEnumerable<DataGridViewModelItem> RunSearch(IEnumerable<DataGridViewModelItem> list, string value, string propertyname)
+        {
+            var intermediatelist = new List<DataGridViewModelItem>();
+            foreach (var property in info)
+            {
+                if (property.Name == propertyname)
+                {
+                    foreach (var item in list)
+                    {
+                        if (GetStringValue(property, item).Contains(value)
+                            || GetStringValue(property, item).Contains(value.ToUpper())
+                            || GetStringValue(property, item).Contains(value.ToLower())
+                            || GetStringValue(property, item).Contains(SearchUtils.LowerCaseFirst(value))
+                            || GetStringValue(property, item).Contains(SearchUtils.UpperCaseFirst(value))
+                            || GetStringValue(property, item).Contains(SearchUtils.UpperCaseSecond(value))
+                            )
+                        {
+                            if (!intermediatelist.Contains(item))
+                                intermediatelist.Add(item);
+                        }
+                    }
+                }
+            }
+            return intermediatelist;
+        }
 
-        private void Header_OnDataGridHeaderTapped(int columnnumber)
+        private string GetStringValue(PropertyInfo property, object item)
         {
+            if (property.PropertyType == typeof(string))
+                return (string)property.GetValue(item);
+            else
+                return "";
+        }
 
+        private void Header_OnDataGridHeaderTapped(int columnnumber, SearchUtils.SortDirection sortdirection)
+        {
+            sortdirection = sortdirection == SearchUtils.SortDirection.Ascending ? SearchUtils.SortDirection.Descending
+                : sortdirection == SearchUtils.SortDirection.Descending ? SearchUtils.SortDirection.Ascending
+                : SearchUtils.SortDirection.Ascending;
+
+            var intermediatelist = new List<DataGridViewModelItem>();
+            foreach (var property in info)
+            {
+                if (property.Name == "Col" + columnnumber)
+                {
+                    foreach (var item in SearchUtils.OrderByPropertyName(CurrentItems, "Col" + columnnumber, sortdirection))
+                    {
+                        intermediatelist.Add(item);
+                    }
+                    Refresh(intermediatelist);
+                }
+            }
+        }
+
+        private void SortList(List<DataGridViewModelItem> items, int columnnumber)
+        {
+          
         }
 
         private void Header_OnDataGridHeaderFilterTapped(int columnnumber, string columnname)

+ 0 - 10
prs.mobile/comal.timesheets/comal.timesheets.projitems

@@ -162,10 +162,6 @@
     <Compile Include="$(MSBuildThisFileDirectory)BaseMobileGrid.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)Data Classes\CacheLoader.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)Data Classes\NotifyChanges.cs" />
-    <Compile Include="$(MSBuildThisFileDirectory)DataGrid.xaml.cs">
-      <DependentUpon>DataGrid.xaml</DependentUpon>
-      <SubType>Code</SubType>
-    </Compile>
     <Compile Include="$(MSBuildThisFileDirectory)DataGridHeaderRow.xaml.cs">
       <DependentUpon>DataGridHeaderRow.xaml</DependentUpon>
       <SubType>Code</SubType>
@@ -1045,12 +1041,6 @@
       <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
     </EmbeddedResource>
   </ItemGroup>
-  <ItemGroup>
-    <EmbeddedResource Include="$(MSBuildThisFileDirectory)DataGrid.xaml">
-      <SubType>Designer</SubType>
-      <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
-    </EmbeddedResource>
-  </ItemGroup>
   <ItemGroup>
     <EmbeddedResource Include="$(MSBuildThisFileDirectory)DataGridHeaderRow.xaml">
       <SubType>Designer</SubType>