Selaa lähdekoodia

PRS MOBILE - Data Grid (incomplete)

Nick-PRSDigital@bitbucket.org 2 vuotta sitten
vanhempi
commit
829dc07e3a

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1350 - 1266
prs.mobile/comal.timesheets.Android/Resources/Resource.designer.cs


+ 5 - 5
prs.mobile/comal.timesheets.Android/comal.timesheets.Android.csproj

@@ -82,11 +82,8 @@
     <PackageReference Include="PropertyChanged.Fody">
       <Version>3.4.1</Version>
     </PackageReference>
-    <PackageReference Include="Syncfusion.Pdf.Net.Core">
-      <Version>20.3.0.59</Version>
-    </PackageReference>
     <PackageReference Include="Syncfusion.Xamarin.Core">
-      <Version>20.3.0.59</Version>
+      <Version>21.1.38</Version>
     </PackageReference>
     <PackageReference Include="Syncfusion.Xamarin.DocIO">
       <Version>20.3.0.59</Version>
@@ -97,6 +94,9 @@
     <PackageReference Include="Syncfusion.Xamarin.Pdf">
       <Version>20.3.0.59</Version>
     </PackageReference>
+    <PackageReference Include="Syncfusion.Xamarin.SfDataGrid">
+      <Version>21.1.38</Version>
+    </PackageReference>
     <PackageReference Include="Syncfusion.Xamarin.SfDiagram">
       <Version>20.3.0.59</Version>
     </PackageReference>
@@ -137,7 +137,7 @@
       <Version>4.5.0.6</Version>
     </PackageReference>
     <PackageReference Include="Syncfusion.Licensing">
-      <Version>20.3.0.59</Version>
+      <Version>21.1.38</Version>
     </PackageReference>
     <PackageReference Include="Xamarin.GooglePlayServices.Location">
       <Version>118.0.0.1</Version>

+ 2 - 4
prs.mobile/comal.timesheets/BaseMobileGrid.cs

@@ -6,10 +6,8 @@ using System.Text;
 
 namespace comal.timesheets
 {
-    public interface BaseMobileGrid<TEntity> where TEntity : Entity, IRemotable, IPersistent, new()
+    public interface BaseMobileGrid
     {
-        public Columns<TEntity> VisibleColumns { get; set; }
-
-        public void DefineVisibleColumns(Columns<TEntity> columns);
+        public void Setup(List<MobileGridDataModelShell> data);
     }
 }

+ 2 - 1
prs.mobile/comal.timesheets/Data Classes/DataModel.cs

@@ -56,7 +56,8 @@ namespace comal.timesheets
                             x => x.ActivityLink.Description,
                             x => x.StartLocation.Latitude,
                             x => x.StartLocation.Longitude,
-                            x => x.StartLocation.Timestamp
+                            x => x.StartLocation.Timestamp,
+                            x => x.EmployeeLink.ID
                         ),
                         null,
                         (data, error) =>

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

@@ -0,0 +1,42 @@
+<?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">
+                <Grid.RowDefinitions>
+                    <RowDefinition Height="40"/>
+                    <RowDefinition Height="40"/>
+                </Grid.RowDefinitions>
+                <Grid.ColumnDefinitions>
+                    <ColumnDefinition Width="*"/>
+                    <ColumnDefinition Width="*"/>
+                    <ColumnDefinition Width="*"/>
+                    <ColumnDefinition Width="*"/>
+                </Grid.ColumnDefinitions>
+
+                <timesheets:DataGridHeaderRow Grid.Row="0" Grid.Column="0" x:Name="HeaderRow0"/>
+                <timesheets:DataGridHeaderRow Grid.Row="0" Grid.Column="1" x:Name="HeaderRow1"/>
+                <timesheets:DataGridHeaderRow Grid.Row="0" Grid.Column="2" x:Name="HeaderRow2"/>
+                <timesheets:DataGridHeaderRow Grid.Row="0" Grid.Column="3" x:Name="HeaderRow3"/>
+
+                <timesheets:DataGridSearchEntry Grid.Row="1" Grid.Column="0" x:Name="searchEnt0"/>
+                <timesheets:DataGridSearchEntry Grid.Row="1" Grid.Column="1" x:Name="searchEnt1"/>
+                <timesheets:DataGridSearchEntry Grid.Row="1" Grid.Column="2" x:Name="searchEnt2"/>
+                <timesheets:DataGridSearchEntry Grid.Row="1" Grid.Column="3" x:Name="searchEnt3"/>
+                
+            </Grid>
+
+            <ListView Grid.Row="2" HasUnevenRows="True" x:Name="listView"/>
+
+        </Grid>
+    </ContentPage.Content>
+</ContentPage>

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

@@ -0,0 +1,20 @@
+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 DataGrid ()
+		{
+			InitializeComponent ();
+		}
+	}
+}

+ 19 - 0
prs.mobile/comal.timesheets/DataGridHeaderRow.xaml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ContentView xmlns="http://xamarin.com/schemas/2014/forms" 
+             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+             x:Class="comal.timesheets.DataGridHeaderRow">
+  <ContentView.Content>
+        <Grid>
+            <Grid.ColumnDefinitions>
+                <ColumnDefinition Width="*"/>
+                <ColumnDefinition Width="40"/>
+            </Grid.ColumnDefinitions>
+            <Button Grid.Column="0" x:Name="headerBtn" Clicked="HeaderBtn_Clicked"/>
+            <Image Source="filter.png">
+                <Image.GestureRecognizers>
+                    <TapGestureRecognizer Tapped="Image_tapped"/>
+                </Image.GestureRecognizers>
+            </Image>
+        </Grid>
+  </ContentView.Content>
+</ContentView>

+ 37 - 0
prs.mobile/comal.timesheets/DataGridHeaderRow.xaml.cs

@@ -0,0 +1,37 @@
+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
+{
+	public delegate void DataGridHeaderTapped(string columnname);
+	public delegate void DataGridHeaderFilterTapped(string columnname);
+
+	[XamlCompilation(XamlCompilationOptions.Compile)]
+	public partial class DataGridHeaderRow : ContentView
+	{
+		public event DataGridHeaderTapped OnDataGridHeaderTapped;
+		public event DataGridHeaderFilterTapped OnDataGridHeaderFilterTapped;
+		public string ColumnName { get; set; }
+		public DataGridHeaderRow ()
+		{
+			InitializeComponent ();
+		}
+
+		private void HeaderBtn_Clicked(object sender, EventArgs e)
+		{
+			OnDataGridHeaderTapped?.Invoke(ColumnName);
+		}
+
+		private void Image_tapped(object sender, EventArgs e)
+		{
+			OnDataGridHeaderFilterTapped?.Invoke(ColumnName);
+
+        }
+    }
+}

+ 23 - 0
prs.mobile/comal.timesheets/DataGridSearchEntry.cs

@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Xamarin.Forms;
+
+namespace comal.timesheets
+{
+    public delegate void DataGridSearchEntryChanged(string ColumnName, string Value);
+    public class DataGridSearchEntry : Entry
+    {
+        public event DataGridSearchEntryChanged OnDataGridSearchEntryChanged;
+        public string ColumnName { get; set; }
+        public DataGridSearchEntry()
+        {
+            TextChanged += DataGridSearchEntry_TextChanged;
+        }
+
+        private void DataGridSearchEntry_TextChanged(object sender, TextChangedEventArgs e)
+        {
+            OnDataGridSearchEntryChanged?.Invoke(ColumnName, Text);
+        }
+    }
+}

+ 0 - 0
prs.mobile/comal.timesheets/PopupEditor.xaml → prs.mobile/comal.timesheets/DigitalForms/CustomUserControls/PopupEditor.xaml


+ 0 - 0
prs.mobile/comal.timesheets/PopupEditor.xaml.cs → prs.mobile/comal.timesheets/DigitalForms/CustomUserControls/PopupEditor.xaml.cs


+ 15 - 12
prs.mobile/comal.timesheets/Main/MainPage.xaml.cs

@@ -275,7 +275,7 @@ namespace comal.timesheets
                     }
                     clockOnButton.IsEnabled = false;
 
-                    bool PRSReady = (App.Data.Employee != null) && (App.Data.TimeSheets != null);
+                    bool PRSReady = (App.Data.Employee != null) && (App.Data.TimeSheets != null) && (GlobalVariables.EmpID != Guid.Empty);
 
                     bool GateReady = CheckLocation();
 
@@ -1130,7 +1130,7 @@ namespace comal.timesheets
                 var timesheet = new TimeSheet();
                 using (await MaterialDialog.Instance.LoadingDialogAsync(message: "Loading"))
                 {
-                    timesheet.EmployeeLink.ID = App.Data.Employee.ID;
+                    timesheet.EmployeeLink.ID = GlobalVariables.EmpID;
                     timesheet.Date = DateTime.Today;
                     TimeSpan tod = DateTime.Now - DateTime.Today;
                     tod = new TimeSpan(tod.Hours, tod.Minutes, 0);
@@ -1572,16 +1572,19 @@ namespace comal.timesheets
                     };
                     Products.OnTapped += ((object sender, EventArgs e) =>
                     {
-                        if (GlobalVariables.ProductsLoaded)
-                        {
-                            ProductList products = new ProductList(GlobalVariables.ProductShells);
-                            Navigation.PushAsync(products);
-                        }
-                        else
-                        {
-                            ProductList products = new ProductList();
-                            Navigation.PushAsync(products);
-                        }
+                        //if (GlobalVariables.ProductsLoaded)
+                        //{
+                        //    ProductList products = new ProductList(GlobalVariables.ProductShells);
+                        //    Navigation.PushAsync(products);
+                        //}
+                        //else
+                        //{
+                        //    ProductList products = new ProductList();
+                        //    Navigation.PushAsync(products);
+                        //}
+
+                        var page = new TestMobileGrid();
+                        Navigation.PushAsync(page);
                     });
                     toolEntries.Add(Products);
 

+ 24 - 15
prs.mobile/comal.timesheets/Main/MainPageUtils.cs

@@ -142,8 +142,13 @@ namespace comal.timesheets
 
         private static void AssignmentTimerCallback(object state)
         {
-            if (CurrentAssignment != null)
-                SaveCurrentAssignment("PRS Mobile main screen - Saving assignment on 5 minute timer");
+            try
+            {
+                if (CurrentAssignment != null)
+                    SaveCurrentAssignment("PRS Mobile main screen - Saving assignment on 5 minute timer");
+            }
+            catch
+            { }
         }
 
         public static void SaveCurrentAssignment(string auditnote, bool complete = false)
@@ -170,21 +175,25 @@ namespace comal.timesheets
 
         public static void UseCurrentAssignment(Assignment assgn)
         {
-            CurrentAssignment = assgn;
-            SaveCurrentAssignment("PRS Mobile main screen - saving assignment on re-login to App");
-            if (CurrentAssignment.JobLink.ID != Guid.Empty)
-            {
-                Job.ID = CurrentAssignment.JobLink.ID;
-                var job = new Client<Job>().Query(new Filter<Job>(x => x.ID).IsEqualTo(Job.ID)).Rows.FirstOrDefault().ToObject<Job>();
-                Job.JobNumber = job.JobNumber;
-                Job.Name = job.Name;
-                Job.OnJobIDChanged += OnJobIDChanged;
-            }
-            if (CurrentAssignment.Task.ID != Guid.Empty)
+            try
             {
-                var task = new Client<Kanban>().Query(new Filter<Kanban>(x => x.ID).IsEqualTo(CurrentAssignment.Task.ID)).Rows.FirstOrDefault().ToObject<Kanban>();
-                OnTaskTitleChanged?.Invoke(task.Title);
+                CurrentAssignment = assgn;
+                SaveCurrentAssignment("PRS Mobile main screen - saving assignment on re-login to App");
+                if (CurrentAssignment.JobLink.ID != Guid.Empty)
+                {
+                    Job.ID = CurrentAssignment.JobLink.ID;
+                    var job = new Client<Job>().Query(new Filter<Job>(x => x.ID).IsEqualTo(Job.ID)).Rows.FirstOrDefault().ToObject<Job>();
+                    Job.JobNumber = job.JobNumber;
+                    Job.Name = job.Name;
+                    Job.OnJobIDChanged += OnJobIDChanged;
+                }
+                if (CurrentAssignment.Task.ID != Guid.Empty)
+                {
+                    var task = new Client<Kanban>().Query(new Filter<Kanban>(x => x.ID).IsEqualTo(CurrentAssignment.Task.ID)).Rows.FirstOrDefault().ToObject<Kanban>();
+                    OnTaskTitleChanged?.Invoke(task.Title);
+                }
             }
+            catch { }
         }
 
         public static void OnJobIDChanged(Guid jobid)

+ 136 - 21
prs.mobile/comal.timesheets/MobileGrid.cs

@@ -3,52 +3,167 @@ using InABox.Core;
 using Syncfusion.SfDataGrid.XForms;
 using System;
 using System.Collections.Generic;
+using System.ComponentModel;
 using System.Linq;
 using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
 using Xamarin.Forms;
 
 namespace comal.timesheets
 {
-    public abstract class MobileGrid<TEntity> : SfDataGrid, BaseMobileGrid<TEntity> where TEntity : Entity, IRemotable, IPersistent, new()
+    public abstract class MobileGrid : SfDataGrid
     {
-        List<string> ColumnNames = new List<string>();
+        List<MobileGridDataModelShell> Data;
 
-        CoreTable Data;
+        public MobileGrid()
+        {
 
-        public Columns<TEntity> VisibleColumns { get; set; }
+        }
 
-        public MobileGrid(Filter<TEntity> filter, Columns<TEntity> columns, SortOrder<TEntity> sortOrder)
+        public void Setup(List<MobileGridDataModelShell> data)
         {
-            Data = new Client<TEntity>().Query(filter, CheckColumns(columns), sortOrder);
-            Grid grid = new Grid();
-            grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });            
+            AutoGenerateColumns = false;
+            AssignPropertiesToColumns(data);
+            GenerateColumns(data.First());
+            ColumnSizer = ColumnSizer.Star;
+            AllowResizingColumn = true;
+            AllowSorting = true;
+            NavigationMode = NavigationMode.Row;
+            SelectionMode = Syncfusion.SfDataGrid.XForms.SelectionMode.Single;
+            SelectionUnit = SelectionUnit.Row;
+            Data = data;
+
+            Device.BeginInvokeOnMainThread(() =>
+            {
+                ItemsSource = data;
+            });
         }
 
-        public void Init(Filter<TEntity> filter, Columns<TEntity> columns, SortOrder<TEntity> sortOrder)
+        protected void AssignPropertiesToColumns(List<MobileGridDataModelShell> data)
         {
-            Data = new Client<TEntity>().Query(filter, CheckColumns(columns), sortOrder);
+            foreach (var shell in data)
+            {
+                if (shell.Data.Count > 0)
+                    shell.Column1 = shell.Data[0].Item2;
+                if (shell.Data.Count > 1)
+                    shell.Column2 = shell.Data[1].Item2;
+                if (shell.Data.Count > 2)
+                    shell.Column3 = shell.Data[2].Item2;
+                if (shell.Data.Count > 3)
+                    shell.Column4 = shell.Data[3].Item2;
+                if (shell.Data.Count > 4)
+                    shell.Column5 = shell.Data[4].Item2;
+            }
         }
 
-        private Columns<TEntity> CheckColumns(Columns<TEntity> columns)
+        protected void GenerateColumns(MobileGridDataModelShell shell)
         {
-            foreach (var colname in ColumnNames)
+            foreach (var col in shell.Data)
             {
-                if (!columns.ColumnNames().Contains(colname))
-                    columns.Add(new Column<TEntity>(colname));
+                GenerateColumn(new Tuple<string, object>(col.Item1, col.Item2), shell.Data.IndexOf(col));
+            }
+            if (shell.HasImage)
+            { 
+                GenerateColumn(new Tuple<string, object>("Image", shell.Image), -1);
             }
+        }
 
-            if (!columns.ColumnNames().Contains("ID"))
-                columns.Add(new Column<TEntity>(x => x.ID));
+        protected void GenerateColumn(Tuple<string, object> col, int index)
+        {
+            if (index > 4)
+                return;
 
-            return columns;
+            var column = FindColumnType(col.Item2);
+            column = AddMapping(column, index);
+            column = AddCaption(column, col.Item1);
+
+            Device.BeginInvokeOnMainThread(() =>
+            {
+                Columns.Add(column);
+            });
         }
 
-        public void DefineVisibleColumns(Columns<TEntity> columns)
+        protected GridColumn FindColumnType(object value)
         {
-            foreach(var colname in columns.ColumnNames())
-                ColumnNames.Add(colname);
+            if(value == null || value.GetType() == typeof(ImageSource))
+                return new GridImageColumn();
+            if (value.GetType() == typeof(string))
+                return new GridTextColumn();
+
+            return new GridTextColumn();
+        }
 
-            VisibleColumns = columns;
+        protected GridColumn AddMapping(GridColumn col, int index)
+        {
+            switch (index)
+            {
+                case -1:
+                    col.MappingName = "Image";
+                    break;
+                case 0:
+                    col.MappingName = "Column1";
+                    break;
+                case 1:
+                    col.MappingName = "Column2";
+                    break;
+                case 2:
+                    col.MappingName = "Column3";
+                    break;
+                case 3:
+                    col.MappingName = "Column4";
+                    break;
+                case 4:
+                    col.MappingName = "Column5";
+                    break;
+            }
+            return col;
+        }
+
+        protected GridColumn AddCaption(GridColumn col, string caption)
+        {
+            col.HeaderText = caption;
+            col.HeaderCellTextSize = 18;
+            col.HeaderFontAttribute = FontAttributes.Bold;
+
+            return col;
+        }
+    }
+
+    public class MobileGridDataModelShell
+    {
+        public Guid ID { get; set; }
+        public List<Tuple<string, string>> Data { get; set; }
+
+        public string Column1 { get; set; }
+        public string Column2 { get; set; }
+        public string Column3 { get; set; }
+        public string Column4 { get; set; }
+        public string Column5 { get; set; }
+
+        public ImageSource Image { get; set; }
+
+        public bool HasImage { get; set; }
+
+        /// <summary>
+        /// max of 5 columns to display on mobile
+        /// </summary>
+        /// <param name="id"></param>
+        /// <param name="data"></param>
+        public MobileGridDataModelShell(Guid id, List<Tuple<string, string>> data, Image image = null)
+        {
+            ID = id;
+            Data = data;
+            if (image != null)
+            {
+                Image = image.Source;
+                HasImage = true;
+            }
+            else
+            {
+                Image = null;
+                HasImage = false;
+            }
         }
     }
 }

+ 45 - 0
prs.mobile/comal.timesheets/ProductsGrid.cs

@@ -0,0 +1,45 @@
+using Comal.Classes;
+using InABox.Clients;
+using InABox.Core;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Xamarin.Forms;
+
+namespace comal.timesheets
+{
+    public class ProductsGrid : MobileGrid
+    {
+        public ProductsGrid()
+        {
+            CoreTable table = new Client<Product>().Query(null,
+                new Columns<Product>(x => x.ID,
+                    x => x.Code,
+                    x => x.Name,
+                    x => x.Group.Description,
+                    x => x.Image.ID 
+                ));
+            if (!table.Rows.Any())
+                return;
+
+            List<MobileGridDataModelShell> shells = new List<MobileGridDataModelShell>();
+            foreach (var row in table.Rows)
+            {
+                List<Tuple<string, string>> tuples = new List<Tuple<string, string>>();
+                tuples.Add(new Tuple<string, string>("Code", row.Get<Product, string>(x => x.Code)));
+                tuples.Add(new Tuple<string, string>("Name", row.Get<Product, string>(x => x.Name)));
+                tuples.Add(new Tuple<string, string>("Family", row.Get<Product, string>(x => x.Group.Description)));
+
+                shells.Add(new MobileGridDataModelShell
+                    (
+                        row.Get<Product, Guid>(x => x.ID), 
+                        tuples,
+                        row.Get<Product, Guid>(x => x.Image.ID) == Guid.Empty? new Image() : new Image { Source = "productimage.png" } 
+                    ));
+            }
+
+            Setup(shells);
+        }
+    }
+}

+ 0 - 0
prs.mobile/comal.timesheets/JobDocFilterItem.xaml → prs.mobile/comal.timesheets/Site/JobDocFilterItem.xaml


+ 0 - 0
prs.mobile/comal.timesheets/JobDocFilterItem.xaml.cs → prs.mobile/comal.timesheets/Site/JobDocFilterItem.xaml.cs


+ 0 - 0
prs.mobile/comal.timesheets/JobDocsFilterPage.xaml → prs.mobile/comal.timesheets/Site/JobDocsFilterPage.xaml


+ 0 - 0
prs.mobile/comal.timesheets/JobDocsFilterPage.xaml.cs → prs.mobile/comal.timesheets/Site/JobDocsFilterPage.xaml.cs


+ 10 - 0
prs.mobile/comal.timesheets/TestMobileGrid.xaml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
+             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+             x:Class="comal.timesheets.TestMobileGrid">
+    <ContentPage.Content>
+        <StackLayout x:Name="stackLayout">
+            
+        </StackLayout>
+    </ContentPage.Content>
+</ContentPage>

+ 21 - 0
prs.mobile/comal.timesheets/TestMobileGrid.xaml.cs

@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Syncfusion.SfDataGrid.XForms;
+using Xamarin.Forms;
+using Xamarin.Forms.Xaml;
+
+namespace comal.timesheets
+{
+	[XamlCompilation(XamlCompilationOptions.Compile)]
+	public partial class TestMobileGrid : ContentPage
+	{
+		public TestMobileGrid ()
+		{
+			InitializeComponent ();
+			stackLayout.Children.Add(new ProductsGrid());
+		}
+	}
+}

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

@@ -159,8 +159,18 @@
     <Compile Include="$(MSBuildThisFileDirectory)Assignments\DataModels\Lookups\AssignmentKanbanDataModel.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)Assignments\DataModels\Lookups\AssignmentLookupDataModel.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)Assignments\IAssignmentPage.cs" />
+    <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>
+    </Compile>
+    <Compile Include="$(MSBuildThisFileDirectory)DataGridSearchEntry.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)DigitalForms\DataModels\DigitalFormsHelper.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)DigitalForms\CustomUserControls\DigitalFormsHeader.xaml.cs">
       <DependentUpon>DigitalFormsHeader.xaml</DependentUpon>
@@ -225,6 +235,7 @@
       <SubType>Code</SubType>
     </Compile>
     <Compile Include="$(MSBuildThisFileDirectory)Main\MainPageUtils.cs" />
+    <Compile Include="$(MSBuildThisFileDirectory)MobileGrid.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)MyHR\MyDetailsPage.xaml.cs">
       <DependentUpon>MyDetailsPage.xaml</DependentUpon>
       <SubType>Code</SubType>
@@ -233,6 +244,7 @@
       <DependentUpon>PopupEditor.xaml</DependentUpon>
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="$(MSBuildThisFileDirectory)ProductsGrid.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)PurchaseOrderDetails.xaml.cs">
       <DependentUpon>PurchaseOrderDetails.xaml</DependentUpon>
       <SubType>Code</SubType>
@@ -314,6 +326,10 @@
       <DependentUpon>StoreRequiScannerPage.xaml</DependentUpon>
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="$(MSBuildThisFileDirectory)TestMobileGrid.xaml.cs">
+      <DependentUpon>TestMobileGrid.xaml</DependentUpon>
+      <SubType>Code</SubType>
+    </Compile>
     <Compile Include="$(MSBuildThisFileDirectory)Warehousing\Receivals\Receivals.xaml.cs">
       <DependentUpon>Receivals.xaml</DependentUpon>
       <SubType>Code</SubType>
@@ -1019,4 +1035,22 @@
       <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
     </EmbeddedResource>
   </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="$(MSBuildThisFileDirectory)TestMobileGrid.xaml">
+      <SubType>Designer</SubType>
+      <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>
+      <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
+    </EmbeddedResource>
+  </ItemGroup>
 </Project>

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä