Carlos Cañizares Estévez 8 years ago
parent
commit
0521e1bd32
56 changed files with 1221 additions and 216 deletions
  1. +2
    -0
      src/Mobile/eShopOnContainers.Xamarin.sln
  2. +1
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml
  3. +2
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Controls/BindablePicker.cs
  4. +24
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Converters/InverseBoolConverter.cs
  5. +20
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Extensions/ObservableExtension.cs
  6. +18
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Helpers/NumericHelper.cs
  7. +13
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Catalog/CatalogBrand.cs
  8. +0
    -1
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Catalog/CatalogItem.cs
  9. +13
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Catalog/CatalogType.cs
  10. +7
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Navigation/TabParameter.cs
  11. +1
    -1
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Orders/Order.cs
  12. +25
    -2
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Orders/OrderItem.cs
  13. +43
    -4
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Catalog/CatalogMockService.cs
  14. +3
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Catalog/ICatalogService.cs
  15. +1
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/NavigationService.cs
  16. +4
    -4
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Orders/OrdersMockService.cs
  17. +9
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/User/IUserService.cs
  18. +24
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/User/UserMockService.cs
  19. +9
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/MessengerKeys.cs
  20. +6
    -5
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs
  21. +17
    -3
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CartViewModel.cs
  22. +81
    -1
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CatalogViewModel.cs
  23. +106
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs
  24. +16
    -3
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/MainViewModel.cs
  25. +18
    -1
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/OrderDetailViewModel.cs
  26. +1
    -1
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CartView.xaml
  27. +33
    -23
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CatalogView.xaml
  28. +25
    -1
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CatalogView.xaml.cs
  29. +243
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CheckoutView.xaml
  30. +12
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CheckoutView.xaml.cs
  31. +83
    -61
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/FiltersView.xaml
  32. +17
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/MainView.xaml.cs
  33. +4
    -4
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/OrderDetailView.xaml
  34. +1
    -1
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/OrderDetailView.xaml.cs
  35. +1
    -1
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/ProfileView.xaml.cs
  36. +134
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/Templates/CartOrderItemTemplate.xaml
  37. +12
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/Templates/CartOrderItemTemplate.xaml.cs
  38. +27
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/eShopOnContainers.Core.csproj
  39. +2
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Activities/MainActivity.cs
  40. +103
    -97
      src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Resources/Resource.Designer.cs
  41. BIN
      src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Resources/drawable/fake_product_04.png
  42. BIN
      src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Resources/drawable/fake_product_05.png
  43. +7
    -1
      src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj
  44. +4
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Windows/App.xaml
  45. +3
    -1
      src/Mobile/eShopOnContainers/eShopOnContainers.Windows/App.xaml.cs
  46. BIN
      src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Assets/SplashScreen.scale-200.png
  47. BIN
      src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Assets/Square150x150Logo.scale-200.png
  48. BIN
      src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Assets/Square44x44Logo.scale-200.png
  49. BIN
      src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Assets/Wide310x150Logo.scale-200.png
  50. BIN
      src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Assets/fake_product_04.png
  51. BIN
      src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Assets/fake_product_05.png
  52. +37
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Renderers/SlideDownMenuPageRenderer.cs
  53. +3
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Windows/eShopOnContainers.Windows.csproj
  54. BIN
      src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/fake_product_04.png
  55. BIN
      src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/fake_product_05.png
  56. +6
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.iOS/eShopOnContainers.iOS.csproj

+ 2
- 0
src/Mobile/eShopOnContainers.Xamarin.sln View File

@ -240,6 +240,8 @@ Global
{C3C1E2CF-B1F7-4654-BBDC-50143DB22E0B}.Debug|ARM.Deploy.0 = Debug|ARM
{C3C1E2CF-B1F7-4654-BBDC-50143DB22E0B}.Debug|iPhone.ActiveCfg = Debug|x86
{C3C1E2CF-B1F7-4654-BBDC-50143DB22E0B}.Debug|iPhoneSimulator.ActiveCfg = Debug|x86
{C3C1E2CF-B1F7-4654-BBDC-50143DB22E0B}.Debug|iPhoneSimulator.Build.0 = Debug|x86
{C3C1E2CF-B1F7-4654-BBDC-50143DB22E0B}.Debug|iPhoneSimulator.Deploy.0 = Debug|x86
{C3C1E2CF-B1F7-4654-BBDC-50143DB22E0B}.Debug|x64.ActiveCfg = Debug|x64
{C3C1E2CF-B1F7-4654-BBDC-50143DB22E0B}.Debug|x64.Build.0 = Debug|x64
{C3C1E2CF-B1F7-4654-BBDC-50143DB22E0B}.Debug|x64.Deploy.0 = Debug|x64


+ 1
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml View File

@ -103,6 +103,7 @@
<converters:ImageConverter x:Key="ImageConverter" />
<converters:ItemTappedEventArgsConverter x:Key="ItemTappedEventArgsConverter" />
<converters:InverseCountToBoolConverter x:Key="InverseCountToBoolConverter" />
<converters:InverseBoolConverter x:Key="InverseBoolConverter" />
<converters:ToUpperConverter x:Key="ToUpperConverter" />
<!-- STYLES -->


+ 2
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Controls/BindablePicker.cs View File

@ -101,10 +101,12 @@ namespace eShopOnContainers.Core.Controls
private static void OnSelectedItemChanged(BindableObject bindable, object oldValue, object newValue)
{
var boundPicker = (BindablePicker)bindable;
if (boundPicker.ItemSelected != null)
{
boundPicker.ItemSelected(boundPicker, new SelectedItemChangedEventArgs(newValue));
}
boundPicker.InternalUpdateSelectedIndex();
}
}


+ 24
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Converters/InverseBoolConverter.cs View File

@ -0,0 +1,24 @@
using System;
using System.Globalization;
using Xamarin.Forms;
namespace eShopOnContainers.Core.Converters
{
public class InverseBoolConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (!(value is bool))
{
throw new InvalidOperationException("The target must be a boolean");
}
return !(bool)value;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return null;
}
}
}

+ 20
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Extensions/ObservableExtension.cs View File

@ -0,0 +1,20 @@
using System.Collections.Generic;
using System.Collections.ObjectModel;
namespace eShopOnContainers.Core.Extensions
{
public static class ObservableExtension
{
public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> source)
{
ObservableCollection<T> collection = new ObservableCollection<T>();
foreach (T item in source)
{
collection.Add(item);
}
return collection;
}
}
}

+ 18
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Helpers/NumericHelper.cs View File

@ -0,0 +1,18 @@
using System.Collections.ObjectModel;
namespace eShopOnContainers.Core.Helpers
{
public class NumericHelper
{
public static ObservableCollection<int> GetNumericList(int count = 100)
{
var result = new ObservableCollection<int>();
for (int i = 0; i < count; i++)
{
result.Add(i);
}
return result;
}
}
}

+ 13
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Catalog/CatalogBrand.cs View File

@ -0,0 +1,13 @@
namespace eShopOnContainers.Core.Models.Catalog
{
public class CatalogBrand
{
public int CatalogBrandId { get; set; }
public string Name { get; set; }
public override string ToString()
{
return Name;
}
}
}

+ 0
- 1
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Catalog/CatalogItem.cs View File

@ -11,6 +11,5 @@
public string CatalogBrand { get; set; }
public int CatalogTypeId { get; set; }
public string CatalogType { get; set; }
}
}

+ 13
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Catalog/CatalogType.cs View File

@ -0,0 +1,13 @@
namespace eShopOnContainers.Core.Models.Catalog
{
public class CatalogType
{
public int CatalogTypeId { get; set; }
public string Name { get; set; }
public override string ToString()
{
return Name;
}
}
}

+ 7
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Navigation/TabParameter.cs View File

@ -0,0 +1,7 @@
namespace eShopOnContainers.Core.Models.Navigation
{
public class TabParameter
{
public int TabIndex { get; set; }
}
}

+ 1
- 1
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Orders/Order.cs View File

@ -6,7 +6,7 @@ namespace eShopOnContainers.Core.Models.Orders
public class Order
{
public int SequenceNumber { get; set; }
public double Total { get; set; }
public decimal Total { get; set; }
public DateTime OrderDate { get; set; }
public OrderStatus Status { get; set; }
public User.User ShippingAddress { get; set; }


+ 25
- 2
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Orders/OrderItem.cs View File

@ -1,5 +1,9 @@
using eShopOnContainers.ViewModels.Base;
using eShopOnContainers.Core.Helpers;
using eShopOnContainers.Core.ViewModels.Base;
using eShopOnContainers.ViewModels.Base;
using System;
using System.Collections.ObjectModel;
using Xamarin.Forms;
namespace eShopOnContainers.Core.Models.Orders
{
@ -12,6 +16,12 @@ namespace eShopOnContainers.Core.Models.Orders
private decimal _unitPrice;
private int _quantity;
private decimal _discount;
private ObservableCollection<int> _numbers;
public OrderItem()
{
Numbers = NumericHelper.GetNumericList();
}
public int ProductId
{
@ -60,6 +70,9 @@ namespace eShopOnContainers.Core.Models.Orders
{
_quantity = value;
RaisePropertyChanged(() => Quantity);
RaisePropertyChanged(() => Total);
MessagingCenter.Send(this, MessengerKeys.UpdateProduct);
}
}
@ -85,9 +98,19 @@ namespace eShopOnContainers.Core.Models.Orders
}
}
public ObservableCollection<int> Numbers
{
get { return _numbers; }
set
{
_numbers = value;
RaisePropertyChanged(() => Numbers);
}
}
public override string ToString()
{
return String.Format("Product Id: {0}, Quantity: {1}", ProductId, Quantity);
}
}
}
}

+ 43
- 4
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Catalog/CatalogMockService.cs View File

@ -1,4 +1,5 @@
using eShopOnContainers.Core.Models.Catalog;
using eShopOnContainers.Core.Extensions;
using eShopOnContainers.Core.Models.Catalog;
using System;
using System.Collections.ObjectModel;
using System.Linq;
@ -9,11 +10,25 @@ namespace eShopOnContainers.Core.Services.Catalog
{
public class CatalogMockService : ICatalogService
{
private ObservableCollection<CatalogBrand> MockCatalogBrand = new ObservableCollection<CatalogBrand>
{
new CatalogBrand { CatalogBrandId = 1, Name = "Azure" },
new CatalogBrand { CatalogBrandId = 2, Name = "Visual Studio" }
};
private ObservableCollection<CatalogType> MockCatalogType = new ObservableCollection<CatalogType>
{
new CatalogType { CatalogTypeId = 1, Name = "Mug" },
new CatalogType { CatalogTypeId = 2, Name = "T-Shirt" }
};
private ObservableCollection<CatalogItem> MockCatalog = new ObservableCollection<CatalogItem>
{
new CatalogItem { Id = "1", PictureUri = Device.OS != TargetPlatform.Windows? "fake_product_01" : "Assets/fake_product_01.png", Name = ".NET Bot Blue Sweatshirt (M)", Price = 19.50M },
new CatalogItem { Id = "2", PictureUri = Device.OS != TargetPlatform.Windows? "fake_product_02": "Assets/fake_product_02.png", Name = ".NET Bot Purple Sweatshirt (M)", Price = 19.50M },
new CatalogItem { Id = "3", PictureUri = Device.OS != TargetPlatform.Windows? "fake_product_03": "Assets/fake_product_03.png", Name = ".NET Bot Black Sweatshirt (M)", Price = 19.95M }
new CatalogItem { Id = "1", PictureUri = Device.OS != TargetPlatform.Windows? "fake_product_01" : "Assets/fake_product_01.png", Name = ".NET Bot Blue Sweatshirt (M)", Price = 19.50M, CatalogBrand = "Visual Studio", CatalogType = "T-Shirt" },
new CatalogItem { Id = "2", PictureUri = Device.OS != TargetPlatform.Windows? "fake_product_02": "Assets/fake_product_02.png", Name = ".NET Bot Purple Sweatshirt (M)", Price = 19.50M, CatalogBrand = "Visual Studio", CatalogType = "T-Shirt" },
new CatalogItem { Id = "3", PictureUri = Device.OS != TargetPlatform.Windows? "fake_product_03": "Assets/fake_product_03.png", Name = ".NET Bot Black Sweatshirt (M)", Price = 19.95M, CatalogBrand = "Visual Studio", CatalogType = "T-Shirt" },
new CatalogItem { Id = "4", PictureUri = Device.OS != TargetPlatform.Windows? "fake_product_04": "Assets/fake_product_04.png", Name = ".NET Black Cupt", Price = 17.00M, CatalogBrand = "Visual Studio", CatalogType = "Mug" },
new CatalogItem { Id = "5", PictureUri = Device.OS != TargetPlatform.Windows? "fake_product_05": "Assets/fake_product_05.png", Name = "Azure Black Sweatshirt (M)", Price = 19.50M, CatalogBrand = "Azure", CatalogType = "T-Shirt" }
};
public async Task<ObservableCollection<CatalogItem>> GetCatalogAsync()
@ -23,6 +38,30 @@ namespace eShopOnContainers.Core.Services.Catalog
return MockCatalog;
}
public async Task<ObservableCollection<CatalogItem>> FilterAsync(string catalogBrand, string catalogType)
{
await Task.Delay(500);
return MockCatalog
.Where(c => c.CatalogBrand.Equals(catalogBrand, StringComparison.CurrentCultureIgnoreCase) &&
c.CatalogType.Equals(catalogType, StringComparison.CurrentCultureIgnoreCase))
.ToObservableCollection();
}
public async Task<ObservableCollection<CatalogBrand>> GetCatalogBrandAsync()
{
await Task.Delay(500);
return MockCatalogBrand;
}
public async Task<ObservableCollection<CatalogType>> GetCatalogTypeAsync()
{
await Task.Delay(500);
return MockCatalogType;
}
public async Task<CatalogItem> GetCatalogItemAsync(string id)
{
await Task.Delay(500);


+ 3
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Catalog/ICatalogService.cs View File

@ -6,6 +6,9 @@ namespace eShopOnContainers.Core.Services.Catalog
{
public interface ICatalogService
{
Task<ObservableCollection<CatalogBrand>> GetCatalogBrandAsync();
Task<ObservableCollection<CatalogItem>> FilterAsync(string catalogBrand, string catalogType);
Task<ObservableCollection<CatalogType>> GetCatalogTypeAsync();
Task<ObservableCollection<CatalogItem>> GetCatalogAsync();
Task<CatalogItem> GetCatalogItemAsync(string id);
}


+ 1
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/NavigationService.cs View File

@ -149,6 +149,7 @@ namespace eShopOnContainers.Services
{
_mappings.Add(typeof(CartViewModel), typeof(CartView));
_mappings.Add(typeof(CatalogViewModel), typeof(CatalogView));
_mappings.Add(typeof(CheckoutViewModel), typeof(CheckoutView));
_mappings.Add(typeof(LoginViewModel), typeof(LoginView));
_mappings.Add(typeof(MainViewModel), typeof(MainView));
_mappings.Add(typeof(OrderDetailViewModel), typeof(OrderDetailView));


+ 4
- 4
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Orders/OrdersMockService.cs View File

@ -14,9 +14,9 @@ namespace eShopOnContainers.Core.Services.Orders
return new ObservableCollection<Order>
{
new Order { SequenceNumber = 123, Total = 56.40, OrderDate = DateTime.Now, Status = OrderStatus.Delivered, OrderItems = GetOrderItems() },
new Order { SequenceNumber = 132, Total = 56.40, OrderDate = DateTime.Now, Status = OrderStatus.Delivered, OrderItems = GetOrderItems() },
new Order { SequenceNumber = 231, Total = 56.40, OrderDate = DateTime.Now, Status = OrderStatus.Delivered, OrderItems = GetOrderItems() },
new Order { SequenceNumber = 123, Total = 56.40M, OrderDate = DateTime.Now, Status = OrderStatus.Delivered, OrderItems = GetOrderItems() },
new Order { SequenceNumber = 132, Total = 56.40M, OrderDate = DateTime.Now, Status = OrderStatus.Delivered, OrderItems = GetOrderItems() },
new Order { SequenceNumber = 231, Total = 56.40M, OrderDate = DateTime.Now, Status = OrderStatus.Delivered, OrderItems = GetOrderItems() },
};
}
@ -24,7 +24,7 @@ namespace eShopOnContainers.Core.Services.Orders
{
await Task.Delay(500);
return new Order { SequenceNumber = 0123456789, Total = 56.40, OrderDate = DateTime.Now, Status = OrderStatus.Pending, OrderItems = GetOrderItems() };
return new Order { SequenceNumber = 0123456789, Total = 56.40M, OrderDate = DateTime.Now, Status = OrderStatus.Pending, OrderItems = GetOrderItems() };
}
private List<OrderItem> GetOrderItems()


+ 9
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/User/IUserService.cs View File

@ -0,0 +1,9 @@
using System.Threading.Tasks;
namespace eShopOnContainers.Core.Services.User
{
public interface IUserService
{
Task<Models.User.User> GetUserAsync();
}
}

+ 24
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/User/UserMockService.cs View File

@ -0,0 +1,24 @@
using System.Threading.Tasks;
namespace eShopOnContainers.Core.Services.User
{
public class UserMockService : IUserService
{
private Models.User.User MockUser = new Models.User.User
{
Name = "Jhon",
LastName = "Doe",
City = "Seattle, WA",
Street = "120 E 87th Street",
CountryCode = "98122",
Country = "United States"
};
public async Task<Models.User.User> GetUserAsync()
{
await Task.Delay(500);
return MockUser;
}
}
}

+ 9
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/MessengerKeys.cs View File

@ -4,5 +4,14 @@
{
// Add product to cart
public const string AddProduct = "AddProduct";
// Update product cart
public const string UpdateProduct = "UpdateProduct";
// Filter
public const string Filter = "Filter";
// Change selected Tab programmatically
public const string ChangeTab = "ChangeTab";
}
}

+ 6
- 5
src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs View File

@ -5,6 +5,7 @@ using eShopOnContainers.Services;
using System;
using eShopOnContainers.Core.Services.Catalog;
using eShopOnContainers.Core.Services.OpenUrl;
using eShopOnContainers.Core.Services.User;
namespace eShopOnContainers.ViewModels.Base
{
@ -16,10 +17,7 @@ namespace eShopOnContainers.ViewModels.Base
public static ViewModelLocator Instance
{
get
{
return _instance;
}
get { return _instance; }
}
protected ViewModelLocator()
@ -30,12 +28,15 @@ namespace eShopOnContainers.ViewModels.Base
_unityContainer.RegisterType<IDialogService, DialogService>();
RegisterSingleton<INavigationService, NavigationService>();
_unityContainer.RegisterType<IOpenUrlService, OpenUrlService>();
_unityContainer.RegisterType<ICatalogService, CatalogMockService>();
_unityContainer.RegisterType<IOrdersService, OrdersMockService>();
_unityContainer.RegisterType<IUserService, UserMockService>();
// view models
_unityContainer.RegisterType<CartViewModel>();
_unityContainer.RegisterType<CatalogViewModel>();
_unityContainer.RegisterType<CheckoutViewModel>();
_unityContainer.RegisterType<LoginViewModel>();
_unityContainer.RegisterType<MainViewModel>();
_unityContainer.RegisterType<OrderDetailViewModel>();
@ -67,4 +68,4 @@ namespace eShopOnContainers.ViewModels.Base
_unityContainer.RegisterType<TInterface, T>(new ContainerControlledLifetimeManager());
}
}
}
}

+ 17
- 3
src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CartViewModel.cs View File

@ -1,4 +1,5 @@
using eShopOnContainers.Core.Models.Catalog;
using eShopOnContainers.Core.Helpers;
using eShopOnContainers.Core.Models.Catalog;
using eShopOnContainers.Core.Models.Orders;
using eShopOnContainers.Core.Services.Orders;
using eShopOnContainers.Core.ViewModels.Base;
@ -7,6 +8,7 @@ using System;
using System.Collections.ObjectModel;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Input;
using Xamarin.Forms;
namespace eShopOnContainers.Core.ViewModels
@ -43,7 +45,7 @@ namespace eShopOnContainers.Core.ViewModels
RaisePropertyChanged(() => OrderItems);
}
}
public decimal Total
{
get { return _total; }
@ -54,6 +56,8 @@ namespace eShopOnContainers.Core.ViewModels
}
}
public ICommand CheckoutCommand => new Command(Checkout);
public override Task InitializeAsync(object navigationData)
{
MessagingCenter.Subscribe<CatalogViewModel, CatalogItem>(this, MessengerKeys.AddProduct, (sender, arg) =>
@ -62,6 +66,11 @@ namespace eShopOnContainers.Core.ViewModels
AddCartItem(arg);
});
MessagingCenter.Subscribe<OrderItem>(this, MessengerKeys.UpdateProduct, (sender) =>
{
ReCalculateTotal();
});
OrderItems = new ObservableCollection<OrderItem>();
@ -99,5 +108,10 @@ namespace eShopOnContainers.Core.ViewModels
Total += orderItem.Total;
}
}
private void Checkout()
{
NavigationService.NavigateToAsync<CheckoutViewModel>(OrderItems);
}
}
}
}

+ 81
- 1
src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CatalogViewModel.cs View File

@ -12,6 +12,10 @@ namespace eShopOnContainers.Core.ViewModels
public class CatalogViewModel : ViewModelBase
{
private ObservableCollection<CatalogItem> _products;
private ObservableCollection<CatalogBrand> _brands;
private CatalogBrand _brand;
private ObservableCollection<CatalogType> _types;
private CatalogType _type;
private ICatalogService _productsService;
@ -30,13 +34,63 @@ namespace eShopOnContainers.Core.ViewModels
}
}
public ObservableCollection<CatalogBrand> Brands
{
get { return _brands; }
set
{
_brands = value;
RaisePropertyChanged(() => Brands);
}
}
public CatalogBrand Brand
{
get { return _brand; }
set
{
_brand = value;
RaisePropertyChanged(() => Brand);
RaisePropertyChanged(() => IsFilter);
}
}
public ObservableCollection<CatalogType> Types
{
get { return _types; }
set
{
_types = value;
RaisePropertyChanged(() => Types);
}
}
public CatalogType Type
{
get { return _type; }
set
{
_type = value;
RaisePropertyChanged(() => Type);
RaisePropertyChanged(() => IsFilter);
}
}
public bool IsFilter { get { return Brand != null || Type != null; } }
public ICommand AddCatalogItemCommand => new Command<CatalogItem>(AddCatalogItem);
public ICommand FilterCommand => new Command(Filter);
public ICommand ClearFilterCommand => new Command(ClearFilter);
public override async Task InitializeAsync(object navigationData)
{
IsBusy = true;
Products = await _productsService.GetCatalogAsync();
Brands = await _productsService.GetCatalogBrandAsync();
Types = await _productsService.GetCatalogTypeAsync();
IsBusy = false;
}
@ -45,5 +99,31 @@ namespace eShopOnContainers.Core.ViewModels
{
MessagingCenter.Send(this, MessengerKeys.AddProduct, catalogItem);
}
private async void Filter()
{
if(Brand == null && Type == null)
{
return;
}
IsBusy = true;
MessagingCenter.Send(this, MessengerKeys.Filter);
Products = await _productsService.FilterAsync(Brand.Name, Type.Name);
IsBusy = false;
}
private async void ClearFilter()
{
IsBusy = true;
Brand = null;
Type = null;
Products = await _productsService.GetCatalogAsync();
IsBusy = false;
}
}
}
}

+ 106
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs View File

@ -0,0 +1,106 @@
using eShopOnContainers.Core.Models.Navigation;
using eShopOnContainers.Core.Services.User;
using eShopOnContainers.ViewModels.Base;
using System.Windows.Input;
using Xamarin.Forms;
using System.Threading.Tasks;
using eShopOnContainers.Core.Models.User;
using eShopOnContainers.Core.Models.Orders;
using System;
using System.Collections.ObjectModel;
using System.Linq;
namespace eShopOnContainers.Core.ViewModels
{
public class CheckoutViewModel : ViewModelBase
{
private ObservableCollection<OrderItem> _orderItems;
private Order _order;
private User _user;
private IUserService _userService;
public CheckoutViewModel(IUserService userService)
{
_userService = userService;
}
public ObservableCollection<OrderItem> OrderItems
{
get { return _orderItems; }
set
{
_orderItems = value;
RaisePropertyChanged(() => OrderItems);
}
}
public Order Order
{
get { return _order; }
set
{
_order = value;
RaisePropertyChanged(() => Order);
}
}
public User User
{
get { return _user; }
set
{
_user = value;
RaisePropertyChanged(() => User);
}
}
public ICommand CheckoutCommand => new Command(Checkout);
public override async Task InitializeAsync(object navigationData)
{
if (navigationData is ObservableCollection<OrderItem>)
{
IsBusy = true;
var orderItems = ((ObservableCollection<OrderItem>)navigationData);
OrderItems = orderItems;
User = await _userService.GetUserAsync();
Order = new Order
{
ShippingAddress = User,
OrderItems = orderItems.ToList(),
Status = OrderStatus.Pending,
OrderDate = DateTime.Now,
Total = GetOrderTotal()
};
IsBusy = false;
}
}
private async void Checkout()
{
await NavigationService.NavigateToAsync<MainViewModel>(new TabParameter { TabIndex = 1 });
await NavigationService.RemoveLastFromBackStackAsync();
await DialogService.ShowAlertAsync("Order sent successfully", string.Format("Order {0}", Order.OrderNumber), "Ok");
await NavigationService.RemoveLastFromBackStackAsync();
}
private decimal GetOrderTotal()
{
decimal total = 0;
foreach (var orderItem in OrderItems)
{
total += orderItem.Total;
}
return total;
}
}
}

+ 16
- 3
src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/MainViewModel.cs View File

@ -1,9 +1,22 @@
using eShopOnContainers.ViewModels.Base;
using System.Threading.Tasks;
using eShopOnContainers.ViewModels.Base;
using eShopOnContainers.Core.Models.Navigation;
using Xamarin.Forms;
using eShopOnContainers.Core.ViewModels.Base;
namespace eShopOnContainers.Core.ViewModels
{
public class MainViewModel : ViewModelBase
{
public override Task InitializeAsync(object navigationData)
{
if (navigationData is TabParameter)
{
var tabIndex = ((TabParameter)navigationData).TabIndex;
MessagingCenter.Send(this, MessengerKeys.ChangeTab, tabIndex);
}
return base.InitializeAsync(navigationData);
}
}
}
}

+ 18
- 1
src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/OrderDetailViewModel.cs View File

@ -3,21 +3,27 @@ using eShopOnContainers.Core.Models.Orders;
using eShopOnContainers.ViewModels.Base;
using eShopOnContainers.Core.Services.Orders;
using eShopOnContainers.Core.Services.Catalog;
using eShopOnContainers.Core.Services.User;
using eShopOnContainers.Core.Models.User;
namespace eShopOnContainers.Core.ViewModels
{
public class OrderDetailViewModel : ViewModelBase
{
private Order _order;
private User _user;
private IOrdersService _orderService;
private ICatalogService _catalogService;
private IUserService _userService;
public OrderDetailViewModel(IOrdersService orderService,
ICatalogService catalogService)
ICatalogService catalogService,
IUserService userService)
{
_orderService = orderService;
_catalogService = catalogService;
_userService = userService;
}
public Order Order
@ -30,6 +36,16 @@ namespace eShopOnContainers.Core.ViewModels
}
}
public User User
{
get { return _user; }
set
{
_user = value;
RaisePropertyChanged(() => User);
}
}
public override async Task InitializeAsync(object navigationData)
{
if(navigationData is Order)
@ -45,6 +61,7 @@ namespace eShopOnContainers.Core.ViewModels
}
Order = order;
User = await _userService.GetUserAsync();
IsBusy = false;
}


+ 1
- 1
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CartView.xaml View File

@ -81,7 +81,7 @@
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<templates:OrderItemTemplate />
<templates:CartOrderItemTemplate />
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>


+ 33
- 23
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CatalogView.xaml View File

@ -30,7 +30,6 @@
<Setter Property="VerticalOptions"
Value="Center" />
</Style>
<animations:StoryBoard
x:Key="ProductsAnimation"
@ -70,28 +69,39 @@
</Grid.GestureRecognizers>
</Grid>
<!-- CATALOG -->
<ListView
x:Name="Products"
Grid.Row="1"
ItemsSource="{Binding Products}"
HasUnevenRows="True"
SeparatorVisibility="None"
CachingStrategy="RecycleElement"
Style="{StaticResource ProductsListStyle}">
<ListView.Behaviors>
<behaviors:EventToCommandBehavior
EventName="ItemTapped"
Command="{Binding AddCatalogItemCommand}"
EventArgsConverter="{StaticResource ItemTappedEventArgsConverter}" />
</ListView.Behaviors>
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<templates:ProductTemplate />
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<Grid
Grid.Row="1">
<ListView
x:Name="Products"
IsVisible="{Binding Products.Count, Converter={StaticResource CountToBoolConverter}}"
ItemsSource="{Binding Products}"
HasUnevenRows="True"
SeparatorVisibility="None"
CachingStrategy="RecycleElement"
Style="{StaticResource ProductsListStyle}">
<ListView.Behaviors>
<behaviors:EventToCommandBehavior
EventName="ItemTapped"
Command="{Binding AddCatalogItemCommand}"
EventArgsConverter="{StaticResource ItemTappedEventArgsConverter}" />
</ListView.Behaviors>
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<templates:ProductTemplate />
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<Grid
IsVisible="{Binding IsBusy, Converter={StaticResource InverseBoolConverter}}">
<Label
Text="NO PRODUCTS FOUND"
IsVisible="{Binding Products.Count, Converter={StaticResource InverseCountToBoolConverter}}"
HorizontalOptions="Center"
VerticalOptions="Center"/>
</Grid>
</Grid>
<!-- INDICATOR -->
<ActivityIndicator
Grid.Row="0"


+ 25
- 1
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CatalogView.xaml.cs View File

@ -1,16 +1,27 @@
using System;
using SlideOverKit;
using Xamarin.Forms;
using eShopOnContainers.Core.ViewModels.Base;
using eShopOnContainers.Core.ViewModels;
namespace eShopOnContainers.Core.Views
{
public partial class CatalogView : ContentPage, IMenuContainerPage
{
private FiltersView _filterView;
public CatalogView()
{
InitializeComponent();
SlideMenu = new FiltersView();
_filterView = new FiltersView();
SlideMenu = _filterView;
MessagingCenter.Subscribe<CatalogViewModel>(this, MessengerKeys.Filter, (sender) =>
{
Filter();
});
}
public Action HideMenuAction
@ -31,7 +42,20 @@ namespace eShopOnContainers.Core.Views
set;
}
protected override void OnBindingContextChanged()
{
base.OnBindingContextChanged();
_filterView.BindingContext = BindingContext;
}
private void OnFilterChanged(object sender, EventArgs e)
{
Filter();
}
private void Filter()
{
if (SlideMenu.IsShown)
{


+ 243
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CheckoutView.xaml View File

@ -0,0 +1,243 @@
<?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="eShopOnContainers.Core.Views.CheckoutView"
xmlns:templates="clr-namespace:eShopOnContainers.Core.Views.Templates;assembly=eShopOnContainers.Core"
Title="Checkout">
<ContentPage.Resources>
<ResourceDictionary>
<Style x:Key="OrderTitleStyle"
TargetType="{x:Type Label}">
<Setter Property="FontFamily"
Value="{StaticResource MontserratRegular}" />
<Setter Property="FontSize"
Value="{StaticResource MediumSize}" />
<Setter Property="TextColor"
Value="Gray" />
</Style>
<Style x:Key="OrderContentStyle"
TargetType="{x:Type Label}"
BasedOn="{StaticResource OrderTitleStyle}">
<Setter Property="TextColor"
Value="Black" />
</Style>
<Style x:Key="ShippingAddressStyle"
TargetType="{x:Type Label}"
BasedOn="{StaticResource OrderTitleStyle}">
<Setter Property="FontSize"
Value="{StaticResource LargeSize}" />
<Setter Property="TextColor"
Value="Black" />
</Style>
<Style x:Key="AddressStyle"
TargetType="{x:Type Label}"
BasedOn="{StaticResource OrderTitleStyle}">
<Setter Property="FontSize"
Value="{StaticResource LittleSize}" />
<Setter Property="TextColor"
Value="Black" />
</Style>
<Style x:Key="OrderTotalStyle"
TargetType="{x:Type Label}">
<Setter Property="FontFamily"
Value="{StaticResource MontserratRegular}" />
<Setter Property="FontSize"
Value="{StaticResource LargerSize}" />
<Setter Property="HorizontalOptions"
Value="End" />
</Style>
<Style x:Key="CheckoutButtonStyle"
TargetType="{x:Type Label}">
<Setter Property="FontFamily"
Value="{StaticResource MontserratRegular}" />
<Setter Property="TextColor"
Value="{StaticResource WhiteColor}" />
<Setter Property="HorizontalOptions"
Value="Center" />
<Setter Property="VerticalOptions"
Value="Center" />
</Style>
</ResourceDictionary>
</ContentPage.Resources>
<Grid
BackgroundColor="{StaticResource BackgroundColor}">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="60" />
</Grid.RowDefinitions>
<!-- ORDER -->
<ScrollView
Grid.Row="0">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<!-- ORDER INFO -->
<Grid
x:Name="OrderInfo">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<StackLayout
Grid.Column="0"
Grid.Row="0"
Margin="12">
<Label
Text="ORDER NUMBER"
Style="{StaticResource OrderTitleStyle}"/>
<Label
Text="{Binding Order.OrderNumber, Converter={StaticResource ToUpperConverter}}"
Style="{StaticResource OrderContentStyle}"/>
</StackLayout>
<StackLayout
Grid.Column="0"
Grid.Row="1"
Margin="12">
<Label
Text="TOTAL"
Style="{StaticResource OrderTitleStyle}"/>
<Label
Text="{Binding Order.Total, StringFormat='${0:N}', Converter={StaticResource ToUpperConverter}}"
Style="{StaticResource OrderContentStyle}"/>
</StackLayout>
<StackLayout
Grid.Column="1"
Grid.Row="0"
Margin="12">
<Label
Text="DATE"
Style="{StaticResource OrderTitleStyle}"/>
<Label
Text="{Binding Order.OrderDate, Converter={StaticResource DatetimeConverter}}"
Style="{StaticResource OrderContentStyle}"/>
</StackLayout>
<StackLayout
Grid.Column="1"
Grid.Row="1"
Margin="12">
<Label
Text="STATUS"
Style="{StaticResource OrderTitleStyle}"/>
<Label
Text="{Binding Order.Status, Converter={StaticResource ToUpperConverter}}"
Style="{StaticResource OrderContentStyle}"/>
</StackLayout>
</Grid>
<!-- SHIPPING ADDRESS -->
<Grid
x:Name="ShippingAddress"
Grid.Row="1"
Margin="12">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Label
Grid.Row="0"
Text="SHIPPING ADDRESS"
Style="{StaticResource ShippingAddressStyle}"/>
<StackLayout
Grid.Row="1">
<Label
Text="{Binding User.Street}"
Style="{StaticResource AddressStyle}"/>
<Label
Text="{Binding User.City}"
Style="{StaticResource AddressStyle}"/>
<Label
Text="{Binding User.CountryCode}"
Style="{StaticResource AddressStyle}"/>
<Label
Text="{Binding User.Country}"
Style="{StaticResource AddressStyle}"/>
</StackLayout>
</Grid>
<!-- ORDER ITEMS -->
<Grid
x:Name="OrderItems"
Grid.Row="2">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<ListView
Grid.Row="0"
ItemsSource="{Binding Order.OrderItems}"
HasUnevenRows="True"
SeparatorVisibility="None"
VerticalOptions="FillAndExpand"
CachingStrategy="RecycleElement">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<templates:OrderItemTemplate />
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<StackLayout
Grid.Row="1"
Margin="0,0,0,24">
<Label
Grid.Row="0"
Text="TOTAL"
TextColor="{StaticResource BlackColor}"
Style="{StaticResource OrderTotalStyle}"/>
<Label
Grid.Row="1"
Text="{Binding Order.Total, StringFormat='${0:N}'}"
TextColor="{StaticResource GreenColor}"
Style="{StaticResource OrderTotalStyle}"/>
</StackLayout>
</Grid>
</Grid>
</ScrollView>
<!-- CHECKOUT -->
<Grid
Grid.Row="1"
BackgroundColor="{StaticResource LightGreenColor}"
Padding="0"
ColumnSpacing="0"
RowSpacing="0">
<Label
Text="[ CHECKOUT ]"
Style="{StaticResource CheckoutButtonStyle}"/>
<Grid.GestureRecognizers>
<TapGestureRecognizer
Command="{Binding CheckoutCommand}"
NumberOfTapsRequired="1" />
</Grid.GestureRecognizers>
</Grid>
<!-- INDICATOR -->
<ActivityIndicator
Grid.Row="0"
Grid.RowSpan="2"
Color="{StaticResource LightGreenColor}"
IsRunning="{Binding IsBusy}"
IsVisible="{Binding IsBusy}"
VerticalOptions="Center"
HorizontalOptions="Center">
<ActivityIndicator.WidthRequest>
<OnPlatform
x:TypeArguments="x:Double"
iOS="100"
Android="100"
WinPhone="400" />
</ActivityIndicator.WidthRequest>
</ActivityIndicator>
</Grid>
</ContentPage>

+ 12
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CheckoutView.xaml.cs View File

@ -0,0 +1,12 @@
using Xamarin.Forms;
namespace eShopOnContainers.Core.Views
{
public partial class CheckoutView : ContentPage
{
public CheckoutView()
{
InitializeComponent();
}
}
}

+ 83
- 61
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/FiltersView.xaml View File

@ -2,71 +2,93 @@
<slideOverKit:SlideMenuView
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:slideOverKit="clr-namespace:SlideOverKit"
xmlns:controls="clr-namespace:eShopOnContainers.Core.Controls;assembly=eShopOnContainers.Core"
xmlns:slideOverKit="clr-namespace:SlideOverKit"
xmlns:controls="clr-namespace:eShopOnContainers.Core.Controls;assembly=eShopOnContainers.Core"
x:Class="eShopOnContainers.Core.Views.FiltersView"
MenuOrientations="TopToBottom"
BackgroundColor="{StaticResource BackgroundColor}"
HeightRequest="250"
IsFullScreen="True">
<slideOverKit:SlideMenuView.Resources>
<ResourceDictionary>
<slideOverKit:SlideMenuView.Resources>
<ResourceDictionary>
<Style x:Key="FilterPickerStyle"
TargetType="{x:Type controls:BindablePicker}">
<Setter Property="HeightRequest"
Value="48" />
<Setter Property="BackgroundColor"
Value="Transparent" />
<Setter Property="HorizontalOptions"
Value="Fill" />
<Setter Property="VerticalOptions"
Value="Fill" />
</Style>
<Style x:Key="FilterButtonStyle"
TargetType="{x:Type Button}">
<Setter Property="FontFamily"
Value="{StaticResource MontserratRegular}" />
<Setter Property="TextColor"
Value="{StaticResource WhiteColor}" />
<Setter Property="BackgroundColor"
Value="{StaticResource LightGreenColor}" />
<Setter Property="HeightRequest"
Value="48" />
<Setter Property="BorderRadius"
Value="0" />
<Setter Property="BorderWidth"
Value="0" />
<Setter Property="HorizontalOptions"
Value="Fill" />
<Setter Property="VerticalOptions"
Value="Fill" />
</Style>
<Style x:Key="FilterPickerStyle"
TargetType="{x:Type controls:BindablePicker}">
<Setter Property="HeightRequest"
Value="48" />
<Setter Property="BackgroundColor"
Value="Transparent" />
<Setter Property="HorizontalOptions"
Value="Fill" />
<Setter Property="VerticalOptions"
Value="Fill" />
</Style>
<Style x:Key="FilterButtonStyle"
TargetType="{x:Type Button}">
<Setter Property="FontFamily"
Value="{StaticResource MontserratRegular}" />
<Setter Property="TextColor"
Value="{StaticResource WhiteColor}" />
<Setter Property="BackgroundColor"
Value="{StaticResource LightGreenColor}" />
<Setter Property="HeightRequest"
Value="48" />
<Setter Property="BorderRadius"
Value="0" />
<Setter Property="BorderWidth"
Value="0" />
<Setter Property="HorizontalOptions"
Value="Fill" />
<Setter Property="VerticalOptions"
Value="Fill" />
</Style>
</ResourceDictionary>
</slideOverKit:SlideMenuView.Resources>
<Grid
Padding="0"
ColumnSpacing="0"
RowSpacing="0"
Margin="48, 24">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<controls:BindablePicker
Grid.Row="0"
Title="BRAND"
Style="{StaticResource FilterPickerStyle}"/>
<controls:BindablePicker
Grid.Row="1"
Title="TYPE"
Style="{StaticResource FilterPickerStyle}"/>
<Button
Grid.Row="2"
Text="Apply"
Style="{StaticResource FilterButtonStyle}"/>
</Grid>
</slideOverKit:SlideMenuView>
<Style
x:Key="ClearFilterButtonStyle"
TargetType="{x:Type Button}"
BasedOn="{StaticResource FilterButtonStyle}">
<Setter Property="TextColor"
Value="{StaticResource BlackColor}" />
<Setter Property="BackgroundColor"
Value="{StaticResource GrayColor}" />
</Style>
</ResourceDictionary>
</slideOverKit:SlideMenuView.Resources>
<Grid
Padding="0"
ColumnSpacing="0"
RowSpacing="0"
Margin="48, 24">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<controls:BindablePicker
Grid.Row="0"
Title="BRAND"
ItemsSource="{Binding Brands}"
SelectedItem="{Binding Brand, Mode=TwoWay}"
Style="{StaticResource FilterPickerStyle}"/>
<controls:BindablePicker
Grid.Row="1"
Title="TYPE"
ItemsSource="{Binding Types}"
SelectedItem="{Binding Type, Mode=TwoWay}"
Style="{StaticResource FilterPickerStyle}"/>
<Button
Grid.Row="2"
Text="Apply"
Style="{StaticResource FilterButtonStyle}"
Command="{Binding FilterCommand}"/>
<Button
Grid.Row="3"
Text="Clear"
IsVisible="{Binding IsFilter}"
Style="{StaticResource ClearFilterButtonStyle}"
Command="{Binding ClearFilterCommand}"/>
</Grid>
</slideOverKit:SlideMenuView>

+ 17
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/MainView.xaml.cs View File

@ -1,4 +1,5 @@
using eShopOnContainers.Core.ViewModels;
using eShopOnContainers.Core.ViewModels.Base;
using eShopOnContainers.ViewModels.Base;
using Xamarin.Forms;
@ -15,6 +16,22 @@ namespace eShopOnContainers.Core.Views
{
base.OnAppearing();
MessagingCenter.Subscribe<MainViewModel, int>(this, MessengerKeys.ChangeTab, (sender, arg) =>
{
switch(arg)
{
case 0:
CurrentPage = HomeView;
break;
case 1:
CurrentPage = ProfileView;
break;
case 2:
CurrentPage = CartView;
break;
}
});
var homeViewModel = ViewModelLocator.Instance.Resolve<CatalogViewModel>();
await homeViewModel.InitializeAsync(null);
HomeView.BindingContext = homeViewModel;


+ 4
- 4
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/OrderDetailView.xaml View File

@ -176,16 +176,16 @@
<StackLayout
Grid.Row="1">
<Label
Text="120 E 87th Street"
Text="{Binding User.Street}"
Style="{StaticResource AddressStyle}"/>
<Label
Text="Seattle, WA"
Text="{Binding User.City}"
Style="{StaticResource AddressStyle}"/>
<Label
Text="98122"
Text="{Binding User.CountryCode}"
Style="{StaticResource AddressStyle}"/>
<Label
Text="United States"
Text="{Binding User.Country}"
Style="{StaticResource AddressStyle}"/>
</StackLayout>
</Grid>


+ 1
- 1
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/OrderDetailView.xaml.cs View File

@ -9,4 +9,4 @@ namespace eShopOnContainers.Core.Views
InitializeComponent();
}
}
}
}

+ 1
- 1
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/ProfileView.xaml.cs View File

@ -9,4 +9,4 @@ namespace eShopOnContainers.Core.Views
InitializeComponent();
}
}
}
}

+ 134
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/Templates/CartOrderItemTemplate.xaml View File

@ -0,0 +1,134 @@
<?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="eShopOnContainers.Core.Views.Templates.CartOrderItemTemplate"
xmlns:controls="clr-namespace:eShopOnContainers.Core.Controls;assembly=eShopOnContainers.Core"
xmlns:ffimageloading="clr-namespace:FFImageLoading.Forms;assembly=FFImageLoading.Forms">
<ContentView.Resources>
<ResourceDictionary>
<Style x:Key="OrderItemTitleStyle"
TargetType="{x:Type Label}">
<Setter Property="FontFamily"
Value="{StaticResource MontserratRegular}" />
<Setter Property="FontSize"
Value="{StaticResource MediumSize}" />
<Setter Property="TextColor"
Value="{StaticResource BlackColor}" />
</Style>
<Style x:Key="OrderItemUnitPriceStyle"
TargetType="{x:Type Label}">
<Setter Property="FontFamily"
Value="{StaticResource MontserratRegular}" />
<Setter Property="FontSize"
Value="{StaticResource MidMediumSize}" />
<Setter Property="TextColor"
Value="{StaticResource BlackColor}" />
<Setter Property="HorizontalOptions"
Value="Start" />
</Style>
<Style x:Key="OrderItemQuantityStyle"
TargetType="{x:Type Label}">
<Setter Property="FontFamily"
Value="{StaticResource MontserratRegular}" />
<Setter Property="FontSize"
Value="{StaticResource MidMediumSize}" />
<Setter Property="TextColor"
Value="{StaticResource BlackColor}" />
<Setter Property="HorizontalOptions"
Value="End" />
</Style>
<Style x:Key="OrderTotalStyle"
TargetType="{x:Type Label}">
<Setter Property="FontFamily"
Value="{StaticResource MontserratRegular}" />
<Setter Property="FontSize"
Value="{StaticResource LargerSize}" />
<Setter Property="TextColor"
Value="{StaticResource GreenColor}" />
<Setter Property="HorizontalOptions"
Value="End" />
</Style>
<Style x:Key="QuantityPickerStyle"
TargetType="{x:Type controls:BindablePicker}">
<Setter Property="WidthRequest"
Value="36" />
<Setter Property="BackgroundColor"
Value="Transparent" />
<Setter Property="HorizontalOptions"
Value="End" />
<Setter Property="VerticalOptions"
Value="Fill" />
</Style>
</ResourceDictionary>
</ContentView.Resources>
<ContentView.Content>
<Grid
BackgroundColor="{StaticResource BackgroundColor}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="1" />
</Grid.RowDefinitions>
<ffimageloading:CachedImage
Grid.Column="0"
Grid.Row="0"
Source="{Binding ProductImage, Converter={StaticResource ImageConverter}}"
CacheDuration="30"
CacheType="Disk"
DownsampleToViewSize="True"
HeightRequest="108"
WidthRequest="108"
Aspect="AspectFit"
VerticalOptions="Start"
Margin="12,0,0,0"/>
<Grid
Grid.Column="1"
Grid.Row="0"
Margin="6">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Label
Grid.Row="0"
Text="{Binding ProductName, Converter={StaticResource ToUpperConverter}}"/>
<Grid
Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Label
Grid.Column="0"
Text="{Binding UnitPrice, StringFormat='${0:N}'}"
Style="{StaticResource OrderItemUnitPriceStyle}"/>
<controls:BindablePicker
Grid.Column="1"
ItemsSource="{Binding Numbers}"
SelectedItem="{Binding Quantity, Mode=TwoWay}"
Style="{StaticResource QuantityPickerStyle}"/>
</Grid>
<Label
Grid.Row="2"
Text="{Binding Total, StringFormat='${0:N}'}"
Style="{StaticResource OrderTotalStyle}"/>
</Grid>
<Grid
Grid.Column="0"
Grid.ColumnSpan="2"
Grid.Row="1"
BackgroundColor="Gray"/>
</Grid>
</ContentView.Content>
</ContentView>

+ 12
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/Templates/CartOrderItemTemplate.xaml.cs View File

@ -0,0 +1,12 @@
using Xamarin.Forms;
namespace eShopOnContainers.Core.Views.Templates
{
public partial class CartOrderItemTemplate : ContentView
{
public CartOrderItemTemplate()
{
InitializeComponent();
}
}
}

+ 27
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Core/eShopOnContainers.Core.csproj View File

@ -49,13 +49,19 @@
<Compile Include="Converters\CountToBoolConverter.cs" />
<Compile Include="Converters\DatetimeConverter.cs" />
<Compile Include="Converters\ImageConverter.cs" />
<Compile Include="Converters\InverseBoolConverter.cs" />
<Compile Include="Converters\InverseCountToBoolConverter.cs" />
<Compile Include="Converters\ItemTappedConverter.cs" />
<Compile Include="Converters\ToUpperConverter.cs" />
<Compile Include="Effects\LineColorEffect.cs" />
<Compile Include="Extensions\AnimationExtension.cs" />
<Compile Include="Extensions\ObservableExtension.cs" />
<Compile Include="GlobalSettings.cs" />
<Compile Include="Helpers\EasingHelper.cs" />
<Compile Include="Helpers\NumericHelper.cs" />
<Compile Include="Models\Catalog\CatalogBrand.cs" />
<Compile Include="Models\Catalog\CatalogType.cs" />
<Compile Include="Models\Navigation\TabParameter.cs" />
<Compile Include="Models\Orders\Order.cs" />
<Compile Include="Models\Orders\OrderItem.cs" />
<Compile Include="Models\Orders\OrderStatus.cs" />
@ -72,6 +78,8 @@
<Compile Include="Services\Orders\IOrdersService.cs" />
<Compile Include="Services\Catalog\CatalogMockService.cs" />
<Compile Include="Services\Catalog\ICatalogService.cs" />
<Compile Include="Services\User\IUserService.cs" />
<Compile Include="Services\User\UserMockService.cs" />
<Compile Include="Triggers\BeginAnimation.cs" />
<Compile Include="Validations\IsNotNullOrEmptyRule.cs" />
<Compile Include="Validations\IValidationRule.cs" />
@ -83,6 +91,7 @@
<Compile Include="ViewModels\Base\ViewModelLocator.cs" />
<Compile Include="ViewModels\CartViewModel.cs" />
<Compile Include="ViewModels\CatalogViewModel.cs" />
<Compile Include="ViewModels\CheckoutViewModel.cs" />
<Compile Include="ViewModels\LoginViewModel.cs" />
<Compile Include="ViewModels\MainViewModel.cs" />
<Compile Include="ViewModels\OrderDetailViewModel.cs" />
@ -90,6 +99,9 @@
<Compile Include="Views\CartView.xaml.cs">
<DependentUpon>CartView.xaml</DependentUpon>
</Compile>
<Compile Include="Views\CheckoutView.xaml.cs">
<DependentUpon>CheckoutView.xaml</DependentUpon>
</Compile>
<Compile Include="Views\CustomNavigationPage.xaml.cs">
<DependentUpon>CustomNavigationPage.xaml</DependentUpon>
</Compile>
@ -111,6 +123,9 @@
<Compile Include="Views\ProfileView.xaml.cs">
<DependentUpon>ProfileView.xaml</DependentUpon>
</Compile>
<Compile Include="Views\Templates\CartOrderItemTemplate.xaml.cs">
<DependentUpon>CartOrderItemTemplate.xaml</DependentUpon>
</Compile>
<Compile Include="Views\Templates\OrderItemTemplate.xaml.cs">
<DependentUpon>OrderItemTemplate.xaml</DependentUpon>
</Compile>
@ -267,6 +282,18 @@
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Views\CheckoutView.xaml">
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Views\Templates\CartOrderItemTemplate.xaml">
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
<Import Project="..\..\packages\Xamarin.Forms.2.3.2.127\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\Xamarin.Forms.targets" Condition="Exists('..\..\packages\Xamarin.Forms.2.3.2.127\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\Xamarin.Forms.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">


+ 2
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Activities/MainActivity.cs View File

@ -4,6 +4,7 @@ using Android.Content.PM;
using Android.Views;
using Xamarin.Forms.Platform.Android;
using FFImageLoading.Forms.Droid;
using Acr.UserDialogs;
namespace eShopOnContainers.Droid.Activities
{
@ -28,6 +29,7 @@ namespace eShopOnContainers.Droid.Activities
SupportActionBar.SetDisplayShowTitleEnabled(false);
global::Xamarin.Forms.Forms.Init(this, bundle);
UserDialogs.Init(this);
CachedImageRenderer.Init();
LoadApplication(new App());


+ 103
- 97
src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Resources/Resource.Designer.cs View File

@ -2039,289 +2039,295 @@ namespace eShopOnContainers.Droid
public const int fake_product_03 = 2130837584;
// aapt resource value: 0x7f020051
public const int ic_audiotrack = 2130837585;
public const int fake_product_04 = 2130837585;
// aapt resource value: 0x7f020052
public const int ic_audiotrack_light = 2130837586;
public const int fake_product_05 = 2130837586;
// aapt resource value: 0x7f020053
public const int ic_bluetooth_grey = 2130837587;
public const int ic_audiotrack = 2130837587;
// aapt resource value: 0x7f020054
public const int ic_bluetooth_white = 2130837588;
public const int ic_audiotrack_light = 2130837588;
// aapt resource value: 0x7f020055
public const int ic_cast_dark = 2130837589;
public const int ic_bluetooth_grey = 2130837589;
// aapt resource value: 0x7f020056
public const int ic_cast_disabled_light = 2130837590;
public const int ic_bluetooth_white = 2130837590;
// aapt resource value: 0x7f020057
public const int ic_cast_grey = 2130837591;
public const int ic_cast_dark = 2130837591;
// aapt resource value: 0x7f020058
public const int ic_cast_light = 2130837592;
public const int ic_cast_disabled_light = 2130837592;
// aapt resource value: 0x7f020059
public const int ic_cast_off_light = 2130837593;
public const int ic_cast_grey = 2130837593;
// aapt resource value: 0x7f02005a
public const int ic_cast_on_0_light = 2130837594;
public const int ic_cast_light = 2130837594;
// aapt resource value: 0x7f02005b
public const int ic_cast_on_1_light = 2130837595;
public const int ic_cast_off_light = 2130837595;
// aapt resource value: 0x7f02005c
public const int ic_cast_on_2_light = 2130837596;
public const int ic_cast_on_0_light = 2130837596;
// aapt resource value: 0x7f02005d
public const int ic_cast_on_light = 2130837597;
public const int ic_cast_on_1_light = 2130837597;
// aapt resource value: 0x7f02005e
public const int ic_cast_white = 2130837598;
public const int ic_cast_on_2_light = 2130837598;
// aapt resource value: 0x7f02005f
public const int ic_close_dark = 2130837599;
public const int ic_cast_on_light = 2130837599;
// aapt resource value: 0x7f020060
public const int ic_close_light = 2130837600;
public const int ic_cast_white = 2130837600;
// aapt resource value: 0x7f020061
public const int ic_collapse = 2130837601;
public const int ic_close_dark = 2130837601;
// aapt resource value: 0x7f020062
public const int ic_collapse_00000 = 2130837602;
public const int ic_close_light = 2130837602;
// aapt resource value: 0x7f020063
public const int ic_collapse_00001 = 2130837603;
public const int ic_collapse = 2130837603;
// aapt resource value: 0x7f020064
public const int ic_collapse_00002 = 2130837604;
public const int ic_collapse_00000 = 2130837604;
// aapt resource value: 0x7f020065
public const int ic_collapse_00003 = 2130837605;
public const int ic_collapse_00001 = 2130837605;
// aapt resource value: 0x7f020066
public const int ic_collapse_00004 = 2130837606;
public const int ic_collapse_00002 = 2130837606;
// aapt resource value: 0x7f020067
public const int ic_collapse_00005 = 2130837607;
public const int ic_collapse_00003 = 2130837607;
// aapt resource value: 0x7f020068
public const int ic_collapse_00006 = 2130837608;
public const int ic_collapse_00004 = 2130837608;
// aapt resource value: 0x7f020069
public const int ic_collapse_00007 = 2130837609;
public const int ic_collapse_00005 = 2130837609;
// aapt resource value: 0x7f02006a
public const int ic_collapse_00008 = 2130837610;
public const int ic_collapse_00006 = 2130837610;
// aapt resource value: 0x7f02006b
public const int ic_collapse_00009 = 2130837611;
public const int ic_collapse_00007 = 2130837611;
// aapt resource value: 0x7f02006c
public const int ic_collapse_00010 = 2130837612;
public const int ic_collapse_00008 = 2130837612;
// aapt resource value: 0x7f02006d
public const int ic_collapse_00011 = 2130837613;
public const int ic_collapse_00009 = 2130837613;
// aapt resource value: 0x7f02006e
public const int ic_collapse_00012 = 2130837614;
public const int ic_collapse_00010 = 2130837614;
// aapt resource value: 0x7f02006f
public const int ic_collapse_00013 = 2130837615;
public const int ic_collapse_00011 = 2130837615;
// aapt resource value: 0x7f020070
public const int ic_collapse_00014 = 2130837616;
public const int ic_collapse_00012 = 2130837616;
// aapt resource value: 0x7f020071
public const int ic_collapse_00015 = 2130837617;
public const int ic_collapse_00013 = 2130837617;
// aapt resource value: 0x7f020072
public const int ic_errorstatus = 2130837618;
public const int ic_collapse_00014 = 2130837618;
// aapt resource value: 0x7f020073
public const int ic_expand = 2130837619;
public const int ic_collapse_00015 = 2130837619;
// aapt resource value: 0x7f020074
public const int ic_expand_00000 = 2130837620;
public const int ic_errorstatus = 2130837620;
// aapt resource value: 0x7f020075
public const int ic_expand_00001 = 2130837621;
public const int ic_expand = 2130837621;
// aapt resource value: 0x7f020076
public const int ic_expand_00002 = 2130837622;
public const int ic_expand_00000 = 2130837622;
// aapt resource value: 0x7f020077
public const int ic_expand_00003 = 2130837623;
public const int ic_expand_00001 = 2130837623;
// aapt resource value: 0x7f020078
public const int ic_expand_00004 = 2130837624;
public const int ic_expand_00002 = 2130837624;
// aapt resource value: 0x7f020079
public const int ic_expand_00005 = 2130837625;
public const int ic_expand_00003 = 2130837625;
// aapt resource value: 0x7f02007a
public const int ic_expand_00006 = 2130837626;
public const int ic_expand_00004 = 2130837626;
// aapt resource value: 0x7f02007b
public const int ic_expand_00007 = 2130837627;
public const int ic_expand_00005 = 2130837627;
// aapt resource value: 0x7f02007c
public const int ic_expand_00008 = 2130837628;
public const int ic_expand_00006 = 2130837628;
// aapt resource value: 0x7f02007d
public const int ic_expand_00009 = 2130837629;
public const int ic_expand_00007 = 2130837629;
// aapt resource value: 0x7f02007e
public const int ic_expand_00010 = 2130837630;
public const int ic_expand_00008 = 2130837630;
// aapt resource value: 0x7f02007f
public const int ic_expand_00011 = 2130837631;
public const int ic_expand_00009 = 2130837631;
// aapt resource value: 0x7f020080
public const int ic_expand_00012 = 2130837632;
public const int ic_expand_00010 = 2130837632;
// aapt resource value: 0x7f020081
public const int ic_expand_00013 = 2130837633;
public const int ic_expand_00011 = 2130837633;
// aapt resource value: 0x7f020082
public const int ic_expand_00014 = 2130837634;
public const int ic_expand_00012 = 2130837634;
// aapt resource value: 0x7f020083
public const int ic_expand_00015 = 2130837635;
public const int ic_expand_00013 = 2130837635;
// aapt resource value: 0x7f020084
public const int ic_media_pause = 2130837636;
public const int ic_expand_00014 = 2130837636;
// aapt resource value: 0x7f020085
public const int ic_media_play = 2130837637;
public const int ic_expand_00015 = 2130837637;
// aapt resource value: 0x7f020086
public const int ic_media_route_disabled_mono_dark = 2130837638;
public const int ic_media_pause = 2130837638;
// aapt resource value: 0x7f020087
public const int ic_media_route_off_mono_dark = 2130837639;
public const int ic_media_play = 2130837639;
// aapt resource value: 0x7f020088
public const int ic_media_route_on_0_mono_dark = 2130837640;
public const int ic_media_route_disabled_mono_dark = 2130837640;
// aapt resource value: 0x7f020089
public const int ic_media_route_on_1_mono_dark = 2130837641;
public const int ic_media_route_off_mono_dark = 2130837641;
// aapt resource value: 0x7f02008a
public const int ic_media_route_on_2_mono_dark = 2130837642;
public const int ic_media_route_on_0_mono_dark = 2130837642;
// aapt resource value: 0x7f02008b
public const int ic_media_route_on_mono_dark = 2130837643;
public const int ic_media_route_on_1_mono_dark = 2130837643;
// aapt resource value: 0x7f02008c
public const int ic_pause_dark = 2130837644;
public const int ic_media_route_on_2_mono_dark = 2130837644;
// aapt resource value: 0x7f02008d
public const int ic_pause_light = 2130837645;
public const int ic_media_route_on_mono_dark = 2130837645;
// aapt resource value: 0x7f02008e
public const int ic_play_dark = 2130837646;
public const int ic_pause_dark = 2130837646;
// aapt resource value: 0x7f02008f
public const int ic_play_light = 2130837647;
public const int ic_pause_light = 2130837647;
// aapt resource value: 0x7f020090
public const int ic_speaker_dark = 2130837648;
public const int ic_play_dark = 2130837648;
// aapt resource value: 0x7f020091
public const int ic_speaker_group_dark = 2130837649;
public const int ic_play_light = 2130837649;
// aapt resource value: 0x7f020092
public const int ic_speaker_group_light = 2130837650;
public const int ic_speaker_dark = 2130837650;
// aapt resource value: 0x7f020093
public const int ic_speaker_light = 2130837651;
public const int ic_speaker_group_dark = 2130837651;
// aapt resource value: 0x7f020094
public const int ic_successstatus = 2130837652;
public const int ic_speaker_group_light = 2130837652;
// aapt resource value: 0x7f020095
public const int ic_tv_dark = 2130837653;
public const int ic_speaker_light = 2130837653;
// aapt resource value: 0x7f020096
public const int ic_tv_light = 2130837654;
public const int ic_successstatus = 2130837654;
// aapt resource value: 0x7f020097
public const int icon = 2130837655;
public const int ic_tv_dark = 2130837655;
// aapt resource value: 0x7f020098
public const int menu_cart = 2130837656;
public const int ic_tv_light = 2130837656;
// aapt resource value: 0x7f020099
public const int menu_filter = 2130837657;
public const int icon = 2130837657;
// aapt resource value: 0x7f02009a
public const int menu_profile = 2130837658;
public const int menu_cart = 2130837658;
// aapt resource value: 0x7f02009b
public const int mr_dialog_material_background_dark = 2130837659;
public const int menu_filter = 2130837659;
// aapt resource value: 0x7f02009c
public const int mr_dialog_material_background_light = 2130837660;
public const int menu_profile = 2130837660;
// aapt resource value: 0x7f02009d
public const int mr_ic_audiotrack_light = 2130837661;
public const int mr_dialog_material_background_dark = 2130837661;
// aapt resource value: 0x7f02009e
public const int mr_ic_cast_dark = 2130837662;
public const int mr_dialog_material_background_light = 2130837662;
// aapt resource value: 0x7f02009f
public const int mr_ic_cast_light = 2130837663;
public const int mr_ic_audiotrack_light = 2130837663;
// aapt resource value: 0x7f0200a0
public const int mr_ic_close_dark = 2130837664;
public const int mr_ic_cast_dark = 2130837664;
// aapt resource value: 0x7f0200a1
public const int mr_ic_close_light = 2130837665;
public const int mr_ic_cast_light = 2130837665;
// aapt resource value: 0x7f0200a2
public const int mr_ic_media_route_connecting_mono_dark = 2130837666;
public const int mr_ic_close_dark = 2130837666;
// aapt resource value: 0x7f0200a3
public const int mr_ic_media_route_connecting_mono_light = 2130837667;
public const int mr_ic_close_light = 2130837667;
// aapt resource value: 0x7f0200a4
public const int mr_ic_media_route_mono_dark = 2130837668;
public const int mr_ic_media_route_connecting_mono_dark = 2130837668;
// aapt resource value: 0x7f0200a5
public const int mr_ic_media_route_mono_light = 2130837669;
public const int mr_ic_media_route_connecting_mono_light = 2130837669;
// aapt resource value: 0x7f0200a6
public const int mr_ic_pause_dark = 2130837670;
public const int mr_ic_media_route_mono_dark = 2130837670;
// aapt resource value: 0x7f0200a7
public const int mr_ic_pause_light = 2130837671;
public const int mr_ic_media_route_mono_light = 2130837671;
// aapt resource value: 0x7f0200a8
public const int mr_ic_play_dark = 2130837672;
public const int mr_ic_pause_dark = 2130837672;
// aapt resource value: 0x7f0200a9
public const int mr_ic_play_light = 2130837673;
// aapt resource value: 0x7f0200af
public const int notification_template_icon_bg = 2130837679;
public const int mr_ic_pause_light = 2130837673;
// aapt resource value: 0x7f0200aa
public const int product_add = 2130837674;
public const int mr_ic_play_dark = 2130837674;
// aapt resource value: 0x7f0200ab
public const int roundedbg = 2130837675;
public const int mr_ic_play_light = 2130837675;
// aapt resource value: 0x7f0200b1
public const int notification_template_icon_bg = 2130837681;
// aapt resource value: 0x7f0200ac
public const int roundedbgdark = 2130837676;
public const int product_add = 2130837676;
// aapt resource value: 0x7f0200ad
public const int splash_drawable = 2130837677;
public const int roundedbg = 2130837677;
// aapt resource value: 0x7f0200ae
public const int user_profile = 2130837678;
public const int roundedbgdark = 2130837678;
// aapt resource value: 0x7f0200af
public const int splash_drawable = 2130837679;
// aapt resource value: 0x7f0200b0
public const int user_profile = 2130837680;
static Drawable()
{


BIN
src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Resources/drawable/fake_product_04.png View File

Before After
Width: 650  |  Height: 427  |  Size: 81 KiB

BIN
src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Resources/drawable/fake_product_05.png View File

Before After
Width: 650  |  Height: 500  |  Size: 498 KiB

+ 7
- 1
src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj View File

@ -17,7 +17,7 @@
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
<AndroidUseLatestPlatformSdk>true</AndroidUseLatestPlatformSdk>
<TargetFrameworkVersion>v6.0</TargetFrameworkVersion>
<TargetFrameworkVersion>v7.0</TargetFrameworkVersion>
<AndroidSupportedAbis>armeabi,armeabi-v7a,x86</AndroidSupportedAbis>
<AndroidStoreUncompressedFileExtensions />
<MandroidI18n />
@ -322,6 +322,12 @@
<ItemGroup>
<AndroidResource Include="Resources\drawable-xxxhdpi\background.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable\fake_product_04.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable\fake_product_05.png" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
<Import Project="..\..\packages\Xamarin.Android.Support.Vector.Drawable.23.3.0\build\Xamarin.Android.Support.Vector.Drawable.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Vector.Drawable.23.3.0\build\Xamarin.Android.Support.Vector.Drawable.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">


+ 4
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Windows/App.xaml View File

@ -235,6 +235,10 @@
</Setter.Value>
</Setter>
</Style>
<Style TargetType="PivotItem">
<Setter Property="Margin" Value="0" />
</Style>
</ResourceDictionary>
</Application.Resources>


+ 3
- 1
src/Mobile/eShopOnContainers/eShopOnContainers.Windows/App.xaml.cs View File

@ -55,7 +55,9 @@ namespace eShopOnContainers.UWP
var assembliesToInclude = new List<Assembly>()
{
typeof(CachedImage).GetTypeInfo().Assembly,
typeof(CachedImageRenderer).GetTypeInfo().Assembly
typeof(CachedImageRenderer).GetTypeInfo().Assembly,
typeof(SlideOverKit.MenuContainerPage).GetTypeInfo().Assembly,
typeof(SlideOverKit.UWP.MenuContainerPageUWPRenderer).GetTypeInfo().Assembly
};
Xamarin.Forms.Forms.Init(e, assembliesToInclude);


BIN
src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Assets/SplashScreen.scale-200.png View File

Before After
Width: 1240  |  Height: 600  |  Size: 7.5 KiB Width: 1240  |  Height: 600  |  Size: 8.5 KiB

BIN
src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Assets/Square150x150Logo.scale-200.png View File

Before After
Width: 300  |  Height: 300  |  Size: 2.9 KiB Width: 300  |  Height: 300  |  Size: 3.3 KiB

BIN
src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Assets/Square44x44Logo.scale-200.png View File

Before After
Width: 88  |  Height: 88  |  Size: 1.6 KiB Width: 88  |  Height: 88  |  Size: 1.5 KiB

BIN
src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Assets/Wide310x150Logo.scale-200.png View File

Before After
Width: 620  |  Height: 300  |  Size: 3.1 KiB Width: 620  |  Height: 300  |  Size: 3.7 KiB

BIN
src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Assets/fake_product_04.png View File

Before After
Width: 650  |  Height: 427  |  Size: 81 KiB

BIN
src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Assets/fake_product_05.png View File

Before After
Width: 650  |  Height: 500  |  Size: 498 KiB

+ 37
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Renderers/SlideDownMenuPageRenderer.cs View File

@ -0,0 +1,37 @@
using eShopOnContainers.Core.Views;
using eShopOnContainers.Windows.Renderers;
using SlideOverKit.UWP;
using System;
using Xamarin.Forms;
using Xamarin.Forms.Platform.UWP;
[assembly: ExportRenderer(typeof(CatalogView), typeof(SlideDownMenuPageRenderer))]
namespace eShopOnContainers.Windows.Renderers
{
public class SlideDownMenuPageRenderer : PageRenderer, ISlideOverKitPageRendererUWP
{
public Action<ElementChangedEventArgs<Page>> OnElementChangedEvent { get; set; }
SlideOverKitUWPHandler _handler;
public SlideDownMenuPageRenderer()
{
_handler = new SlideOverKitUWPHandler();
_handler.Init(this);
}
protected override void OnElementChanged(ElementChangedEventArgs<Page> e)
{
base.OnElementChanged(e);
if (OnElementChangedEvent != null)
OnElementChangedEvent(e);
}
protected override void Dispose(bool disposing)
{
_handler.Dispose();
base.Dispose(disposing);
_handler = null;
}
}
}

+ 3
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Windows/eShopOnContainers.Windows.csproj View File

@ -111,6 +111,7 @@
</Compile>
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Renderers\CustomTabbedPageRenderer.cs" />
<Compile Include="Renderers\SlideDownMenuPageRenderer.cs" />
</ItemGroup>
<ItemGroup>
<AppxManifest Include="Package.appxmanifest">
@ -122,6 +123,8 @@
<Content Include="Assets\fake_product_01.png" />
<Content Include="Assets\fake_product_02.png" />
<Content Include="Assets\fake_product_03.png" />
<Content Include="Assets\fake_product_04.png" />
<Content Include="Assets\fake_product_05.png" />
<Content Include="Assets\menu_cart.png" />
<Content Include="Assets\menu_filter.png" />
<Content Include="Assets\menu_profile.png" />


BIN
src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/fake_product_04.png View File

Before After
Width: 650  |  Height: 427  |  Size: 81 KiB

BIN
src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/fake_product_05.png View File

Before After
Width: 650  |  Height: 500  |  Size: 498 KiB

+ 6
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.iOS/eShopOnContainers.iOS.csproj View File

@ -240,6 +240,12 @@
<ItemGroup>
<BundleResource Include="Resources\fake_product_02.png" />
</ItemGroup>
<ItemGroup>
<BundleResource Include="Resources\fake_product_04.png" />
</ItemGroup>
<ItemGroup>
<BundleResource Include="Resources\fake_product_05.png" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.iOS.CSharp.targets" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>


Loading…
Cancel
Save