Skip to content

Commit 6ee3659

Browse files
author
Javier Suárez Ruiz
committed
OrderDetail mobile apps view
1 parent 068eb3b commit 6ee3659

41 files changed

Lines changed: 793 additions & 153 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

eShopOnContainers.sln

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopOnContainers.iOS", "sr
5454
EndProject
5555
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopOnContainers.Windows", "src\Mobile\eShopOnContainers\eShopOnContainers.Windows\eShopOnContainers.Windows.csproj", "{C3C1E2CF-B1F7-4654-BBDC-50143DB22E0B}"
5656
EndProject
57+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared Code", "Shared Code", "{778289CA-31F7-4464-8C2A-612EE846F8A7}"
58+
EndProject
59+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Targets", "Targets", "{9CC7814B-72A6-465B-A61C-57B512DEE303}"
60+
EndProject
5761
Global
5862
GlobalSection(SolutionConfigurationPlatforms) = preSolution
5963
Ad-Hoc|Any CPU = Ad-Hoc|Any CPU
@@ -523,9 +527,11 @@ Global
523527
{48FC45C5-223F-4B59-AC77-6CBB1C561E85} = {932D8224-11F6-4D07-B109-DA28AD288A63}
524528
{C10C7B69-CE4F-4167-928E-33B7FA1DFFC7} = {48FC45C5-223F-4B59-AC77-6CBB1C561E85}
525529
{F0333D8E-0B27-42B7-B2C6-78F3657624E2} = {E279BF0F-7F66-4F3A-A3AB-2CDA66C1CD04}
526-
{65116D1C-145B-4693-ABDA-F0FB6F425191} = {F61357CE-1CC2-410E-8776-B16EEBC98EB8}
527-
{62DBB163-9CA9-4818-B48B-13233DF37C24} = {F61357CE-1CC2-410E-8776-B16EEBC98EB8}
528-
{6EEB23DC-7063-4444-9AF8-90DF24F549C0} = {F61357CE-1CC2-410E-8776-B16EEBC98EB8}
529-
{C3C1E2CF-B1F7-4654-BBDC-50143DB22E0B} = {F61357CE-1CC2-410E-8776-B16EEBC98EB8}
530+
{65116D1C-145B-4693-ABDA-F0FB6F425191} = {778289CA-31F7-4464-8C2A-612EE846F8A7}
531+
{62DBB163-9CA9-4818-B48B-13233DF37C24} = {9CC7814B-72A6-465B-A61C-57B512DEE303}
532+
{6EEB23DC-7063-4444-9AF8-90DF24F549C0} = {9CC7814B-72A6-465B-A61C-57B512DEE303}
533+
{C3C1E2CF-B1F7-4654-BBDC-50143DB22E0B} = {9CC7814B-72A6-465B-A61C-57B512DEE303}
534+
{778289CA-31F7-4464-8C2A-612EE846F8A7} = {F61357CE-1CC2-410E-8776-B16EEBC98EB8}
535+
{9CC7814B-72A6-465B-A61C-57B512DEE303} = {F61357CE-1CC2-410E-8776-B16EEBC98EB8}
530536
EndGlobalSection
531537
EndGlobal

src/Mobile/eShopOnContainers.Xamarin.sln

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopOnContainers.Core", "e
1111
EndProject
1212
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopOnContainers.Windows", "eShopOnContainers\eShopOnContainers.Windows\eShopOnContainers.Windows.csproj", "{C3C1E2CF-B1F7-4654-BBDC-50143DB22E0B}"
1313
EndProject
14+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared Code", "Shared Code", "{65D002E7-E869-491C-ABA8-9650CEAF677A}"
15+
EndProject
16+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Targets", "Targets", "{8F848898-6B21-4905-AE2E-B3ABDEDA1963}"
17+
EndProject
1418
Global
1519
GlobalSection(SolutionConfigurationPlatforms) = preSolution
1620
Ad-Hoc|Any CPU = Ad-Hoc|Any CPU
@@ -258,4 +262,10 @@ Global
258262
GlobalSection(SolutionProperties) = preSolution
259263
HideSolutionNode = FALSE
260264
EndGlobalSection
265+
GlobalSection(NestedProjects) = preSolution
266+
{62DBB163-9CA9-4818-B48B-13233DF37C24} = {8F848898-6B21-4905-AE2E-B3ABDEDA1963}
267+
{6EEB23DC-7063-4444-9AF8-90DF24F549C0} = {8F848898-6B21-4905-AE2E-B3ABDEDA1963}
268+
{65116D1C-145B-4693-ABDA-F0FB6F425191} = {65D002E7-E869-491C-ABA8-9650CEAF677A}
269+
{C3C1E2CF-B1F7-4654-BBDC-50143DB22E0B} = {8F848898-6B21-4905-AE2E-B3ABDEDA1963}
270+
EndGlobalSection
261271
EndGlobal

src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@
100100
<!-- CONVERTERS -->
101101
<converters:ToUpperConverter x:Key="ToUpperConverter" />
102102
<converters:DatetimeConverter x:Key="DatetimeConverter" />
103+
<converters:ItemTappedEventArgsConverter x:Key="ItemTappedEventArgsConverter" />
104+
103105
<!-- STYLES -->
104106
<Style x:Key="EntryStyle"
105107
TargetType="{x:Type Entry}">
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using System;
2+
using Xamarin.Forms;
3+
4+
namespace eShopOnContainers.Core.Behaviors.Base
5+
{
6+
public class BindableBehavior<T> : Behavior<T> where T : BindableObject
7+
{
8+
public T AssociatedObject { get; private set; }
9+
10+
protected override void OnAttachedTo(T visualElement)
11+
{
12+
base.OnAttachedTo(visualElement);
13+
14+
AssociatedObject = visualElement;
15+
16+
if (visualElement.BindingContext != null)
17+
BindingContext = visualElement.BindingContext;
18+
19+
visualElement.BindingContextChanged += OnBindingContextChanged;
20+
}
21+
22+
private void OnBindingContextChanged(object sender, EventArgs e)
23+
{
24+
OnBindingContextChanged();
25+
}
26+
27+
protected override void OnDetachingFrom(T view)
28+
{
29+
view.BindingContextChanged -= OnBindingContextChanged;
30+
}
31+
32+
protected override void OnBindingContextChanged()
33+
{
34+
base.OnBindingContextChanged();
35+
BindingContext = AssociatedObject.BindingContext;
36+
}
37+
}
38+
}
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
using eShopOnContainers.Core.Behaviors.Base;
2+
using System;
3+
using System.Globalization;
4+
using System.Linq;
5+
using System.Linq.Expressions;
6+
using System.Reflection;
7+
using System.Windows.Input;
8+
using Xamarin.Forms;
9+
10+
namespace eShopOnContainers.Core.Behaviors
11+
{
12+
public class EventToCommandBehavior : BindableBehavior<View>
13+
{
14+
public static BindableProperty EventNameProperty =
15+
BindableProperty.CreateAttached("EventName", typeof(string), typeof(EventToCommandBehavior), null,
16+
BindingMode.OneWay);
17+
18+
public static BindableProperty CommandProperty =
19+
BindableProperty.CreateAttached("Command", typeof(ICommand), typeof(EventToCommandBehavior), null,
20+
BindingMode.OneWay);
21+
22+
public static BindableProperty CommandParameterProperty =
23+
BindableProperty.CreateAttached("CommandParameter", typeof(object), typeof(EventToCommandBehavior), null,
24+
BindingMode.OneWay);
25+
26+
public static BindableProperty EventArgsConverterProperty =
27+
BindableProperty.CreateAttached("EventArgsConverter", typeof(IValueConverter), typeof(EventToCommandBehavior), null,
28+
BindingMode.OneWay);
29+
30+
public static BindableProperty EventArgsConverterParameterProperty =
31+
BindableProperty.CreateAttached("EventArgsConverterParameter", typeof(object), typeof(EventToCommandBehavior), null,
32+
BindingMode.OneWay);
33+
34+
private Delegate _handler;
35+
private EventInfo _eventInfo;
36+
37+
public string EventName
38+
{
39+
get { return (string)GetValue(EventNameProperty); }
40+
set { SetValue(EventNameProperty, value); }
41+
}
42+
43+
public ICommand Command
44+
{
45+
get { return (ICommand)GetValue(CommandProperty); }
46+
set { SetValue(CommandProperty, value); }
47+
}
48+
49+
public object CommandParameter
50+
{
51+
get { return GetValue(CommandParameterProperty); }
52+
set { SetValue(CommandParameterProperty, value); }
53+
}
54+
55+
public IValueConverter EventArgsConverter
56+
{
57+
get { return (IValueConverter)GetValue(EventArgsConverterProperty); }
58+
set { SetValue(EventArgsConverterProperty, value); }
59+
}
60+
61+
public object EventArgsConverterParameter
62+
{
63+
get { return GetValue(EventArgsConverterParameterProperty); }
64+
set { SetValue(EventArgsConverterParameterProperty, value); }
65+
}
66+
67+
protected override void OnAttachedTo(View visualElement)
68+
{
69+
base.OnAttachedTo(visualElement);
70+
71+
var events = AssociatedObject.GetType().GetRuntimeEvents().ToArray();
72+
if (events.Any())
73+
{
74+
_eventInfo = events.FirstOrDefault(e => e.Name == EventName);
75+
if (_eventInfo == null)
76+
throw new ArgumentException(String.Format("EventToCommand: Can't find any event named '{0}' on attached type", EventName));
77+
78+
AddEventHandler(_eventInfo, AssociatedObject, OnFired);
79+
}
80+
}
81+
82+
protected override void OnDetachingFrom(View view)
83+
{
84+
if (_handler != null)
85+
_eventInfo.RemoveEventHandler(AssociatedObject, _handler);
86+
87+
base.OnDetachingFrom(view);
88+
}
89+
90+
private void AddEventHandler(EventInfo eventInfo, object item, Action<object, EventArgs> action)
91+
{
92+
var eventParameters = eventInfo.EventHandlerType
93+
.GetRuntimeMethods().First(m => m.Name == "Invoke")
94+
.GetParameters()
95+
.Select(p => Expression.Parameter(p.ParameterType))
96+
.ToArray();
97+
98+
var actionInvoke = action.GetType()
99+
.GetRuntimeMethods().First(m => m.Name == "Invoke");
100+
101+
_handler = Expression.Lambda(
102+
eventInfo.EventHandlerType,
103+
Expression.Call(Expression.Constant(action), actionInvoke, eventParameters[0], eventParameters[1]),
104+
eventParameters
105+
)
106+
.Compile();
107+
108+
eventInfo.AddEventHandler(item, _handler);
109+
}
110+
111+
private void OnFired(object sender, EventArgs eventArgs)
112+
{
113+
if (Command == null)
114+
return;
115+
116+
var parameter = CommandParameter;
117+
118+
if (eventArgs != null && eventArgs != EventArgs.Empty)
119+
{
120+
parameter = eventArgs;
121+
122+
if (EventArgsConverter != null)
123+
{
124+
parameter = EventArgsConverter.Convert(eventArgs, typeof(object), EventArgsConverterParameter, CultureInfo.CurrentUICulture);
125+
}
126+
}
127+
128+
if (Command.CanExecute(parameter))
129+
{
130+
Command.Execute(parameter);
131+
}
132+
}
133+
}
134+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using System;
2+
using System.Globalization;
3+
using Xamarin.Forms;
4+
5+
namespace eShopOnContainers.Core.Converters
6+
{
7+
public class ItemTappedEventArgsConverter : IValueConverter
8+
{
9+
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
10+
{
11+
var eventArgs = value as ItemTappedEventArgs;
12+
if (eventArgs == null)
13+
throw new ArgumentException("Expected TappedEventArgs as value", "value");
14+
15+
return eventArgs.Item;
16+
}
17+
18+
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
19+
{
20+
throw new NotImplementedException();
21+
}
22+
}
23+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using System;
2+
3+
namespace eShopOnContainers.Core.Models.Catalog
4+
{
5+
public class CatalogItem
6+
{
7+
public int Id { get; set; }
8+
public string Name { get; set; }
9+
public string Description { get; set; }
10+
public decimal Price { get; set; }
11+
public string Image { get; set; }
12+
}
13+
}
Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,21 @@
11
using System;
2+
using System.Collections.Generic;
23

34
namespace eShopOnContainers.Core.Models.Orders
45
{
56
public class Order
67
{
7-
public long OrderNumber { get; set; }
8+
public int SequenceNumber { get; set; }
89
public double Total { get; set; }
9-
public DateTime Date { get; set; }
10+
public DateTime OrderDate { get; set; }
1011
public OrderStatus Status { get; set; }
12+
public User.User ShippingAddress { get; set; }
13+
public int BuyerId { get; set; }
14+
public List<OrderItem> OrderItems { get; set; }
15+
16+
public string OrderNumber
17+
{
18+
get { return string.Format("{0}/{1}-{2}", OrderDate.Year, OrderDate.Month, SequenceNumber); }
19+
}
1120
}
12-
}
21+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using System;
2+
3+
namespace eShopOnContainers.Core.Models.Orders
4+
{
5+
public class OrderItem
6+
{
7+
public int ProductId { get; set; }
8+
public Guid OrderId { get; set; }
9+
public string ProductName { get; set; }
10+
public decimal UnitPrice { get; set; }
11+
public int Quantity { get; set; }
12+
public decimal Discount { get; set; }
13+
public decimal Total { get { return Quantity * UnitPrice; } }
14+
15+
public override string ToString()
16+
{
17+
return String.Format("Product Id: {0}, Quantity: {1}", ProductId, Quantity);
18+
}
19+
}
20+
}

src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Products/Product.cs

Lines changed: 0 additions & 9 deletions
This file was deleted.

0 commit comments

Comments
 (0)