diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml.cs
index 6db54e586..c4aea5cd7 100644
--- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml.cs
+++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml.cs
@@ -25,7 +25,7 @@ namespace eShopOnContainers
private void InitApp()
{
- UseMockServices = false;
+ UseMockServices = true;
ViewModelLocator.Instance.UpdateDependencies(UseMockServices);
}
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs
index 693fbde21..ce26b6d19 100644
--- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs
+++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs
@@ -161,15 +161,18 @@ namespace eShopOnContainers.Core.ViewModels
foreach (var basketItem in basketItems)
{
- orderItems.Add(new OrderItem
+ if (!string.IsNullOrEmpty(basketItem.ProductName))
{
- OrderId = null,
- ProductId = basketItem.ProductId,
- ProductName = basketItem.ProductName,
- PictureUrl = basketItem.PictureUrl,
- Quantity = basketItem.Quantity,
- UnitPrice = basketItem.UnitPrice
- });
+ orderItems.Add(new OrderItem
+ {
+ OrderId = null,
+ ProductId = basketItem.ProductId,
+ ProductName = basketItem.ProductName,
+ PictureUrl = basketItem.PictureUrl,
+ Quantity = basketItem.Quantity,
+ UnitPrice = basketItem.UnitPrice
+ });
+ }
}
return orderItems;
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj
index 5e83a91c3..8a3b32690 100644
--- a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj
+++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj
@@ -17,7 +17,7 @@
Off
Properties\AndroidManifest.xml
true
- v6.0
+ v7.0
armeabi,armeabi-v7a,x86
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/eShopOnContainers.TestRunner.Droid.csproj b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/eShopOnContainers.TestRunner.Droid.csproj
index c9cb8a265..ffa9c0b55 100644
--- a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/eShopOnContainers.TestRunner.Droid.csproj
+++ b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/eShopOnContainers.TestRunner.Droid.csproj
@@ -16,7 +16,7 @@
Resources\Resource.Designer.cs
Off
True
- v6.0
+ v7.0
Properties\AndroidManifest.xml
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/eShopOnContainers.TestRunner.Droid.csproj.bak b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/eShopOnContainers.TestRunner.Droid.csproj.bak
index ffa9c0b55..c9cb8a265 100644
--- a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/eShopOnContainers.TestRunner.Droid.csproj.bak
+++ b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/eShopOnContainers.TestRunner.Droid.csproj.bak
@@ -16,7 +16,7 @@
Resources\Resource.Designer.cs
Off
True
- v7.0
+ v6.0
Properties\AndroidManifest.xml
diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/app.module.ts b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/app.module.ts
index bdad19f82..997eacbfb 100644
--- a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/app.module.ts
+++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/app.module.ts
@@ -9,6 +9,7 @@ import { AppService } from './app.service';
import { AppComponent } from './app.component';
import { SharedModule } from './shared/shared.module';
import { CatalogModule } from './catalog/catalog.module';
+import { OrdersModule } from './orders/orders.module';
import { BasketModule } from './basket/basket.module';
@NgModule({
@@ -20,6 +21,7 @@ import { BasketModule } from './basket/basket.module';
// Only module that app module loads
SharedModule.forRoot(),
CatalogModule,
+ OrdersModule,
BasketModule
],
providers: [
diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/app.routes.ts b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/app.routes.ts
index 3ce3eda19..853b64ac4 100644
--- a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/app.routes.ts
+++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/app.routes.ts
@@ -2,11 +2,15 @@ import { Routes, RouterModule } from '@angular/router';
import { BasketComponent } from './basket/basket.component';
import { CatalogComponent } from './catalog/catalog.component';
+import { OrdersComponent } from './orders/orders.component';
+import { OrdersDetailComponent } from './orders/orders-detail/orders-detail.component';
export const routes: Routes = [
{ path: '', redirectTo: 'catalog', pathMatch: 'full' },
{ path: 'basket', component: BasketComponent },
- { path: 'catalog', component: CatalogComponent }
+ { path: 'catalog', component: CatalogComponent },
+ { path: 'orders', component: OrdersComponent },
+ { path: 'orders/:id', component: OrdersDetailComponent },
//Lazy async modules (angular-loader-router) and enable a router in each module.
//{
// path: 'basket', loadChildren: '/basket/basket.module' });
diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/basket/basket.routes.ts b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/basket/basket.routes.ts
deleted file mode 100644
index 3ed2bc003..000000000
--- a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/basket/basket.routes.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-//import { Routes, RouterModule } from '@angular/router';
-
-//import { BasketComponent } from './basket.component';
-
-//const routes: Routes = [
-// { path: '', component: BasketComponent }
-//];
-
-//export const routing = RouterModule.forChild(routes);
diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/catalog/catalog.routes.ts b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/catalog/catalog.routes.ts
deleted file mode 100644
index cee81b259..000000000
--- a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/catalog/catalog.routes.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-//import { Routes, RouterModule } from '@angular/router';
-
-//import { CatalogComponent } from './catalog.component';
-
-//const routes: Routes = [
-// { path: '', component: CatalogComponent }
-//];
-
-//export const routing = RouterModule.forChild(routes);
diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/orders/orders-detail/orders-detail.component.html b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/orders/orders-detail/orders-detail.component.html
new file mode 100644
index 000000000..a6bd0c41b
--- /dev/null
+++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/orders/orders-detail/orders-detail.component.html
@@ -0,0 +1,59 @@
+
+
+
+
+ ORDER NUMBER
+ {{order.ordernumber}}
+
+
+ DATE
+ {{order.date | date:'short'}}
+
+
+ TOTAL
+ $ {{order.total}}
+
+
+ STATUS
+ {{order.status}}
+
+
+
+
+ SHIPING ADDRESS
+ {{order.street}}
+ {{order.city}}
+ {{order.country}}
+
+
+
+
+
+
+
+
+ |
+ {{item.productname}} |
+ ROSLYN |
+ $ {{item.unitprice}} |
+ {{item.units}} |
+ $ {{item.units * item.unitprice}} |
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/orders/orders-detail/orders-detail.component.scss b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/orders/orders-detail/orders-detail.component.scss
new file mode 100644
index 000000000..6ca4d6fbf
--- /dev/null
+++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/orders/orders-detail/orders-detail.component.scss
@@ -0,0 +1,86 @@
+@import '../../_variables.scss';
+
+.esh-orders-detail {
+ min-height: 80vh;
+
+ &-header {
+ background-color: #00A69C;
+ height: 63px;
+
+ li {
+ list-style: none;
+ display: inline;
+ opacity: 0.5;
+ margin-top: 25px;
+ margin-left: 10px;
+ float: right;
+ cursor: pointer;
+ color: white;
+ }
+
+ li a {
+ color: white;
+ }
+
+ &-back {
+ float: left !important;
+ margin-top: 20px !important;
+ text-transform: uppercase;
+ }
+
+ li a:hover {
+ text-decoration: none;
+ }
+ }
+
+ &-container {
+ min-height: 70vh;
+ padding-top: 40px;
+ margin-bottom: 30px;
+ }
+
+ &-container .table tbody tr:first-child td {
+ border-top: none;
+ }
+
+ &-container .table tr {
+ border-bottom: none;
+ }
+
+ &-section {
+ margin-top: 50px;
+ }
+
+ &-container .table {
+ margin-left: -7px;
+ }
+
+ &-total {
+ margin-bottom: 5px;
+ margin-left: 20px;
+ text-align: left;
+ }
+
+ &-total-label {
+ font-size: 14px;
+ color: #404040;
+ margin-top:10px;
+ }
+
+ &-total-value {
+ font-size: 28px;
+ color: #00a69c;
+ text-align: left;
+ }
+
+ &-image {
+ max-width: 210px;
+ }
+
+ &-column {
+ max-width: 120px;
+ padding: 8px;
+ text-transform: uppercase;
+ vertical-align: middle!important;
+ }
+}
diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/orders/orders-detail/orders-detail.component.ts b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/orders/orders-detail/orders-detail.component.ts
new file mode 100644
index 000000000..804aaa57e
--- /dev/null
+++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/orders/orders-detail/orders-detail.component.ts
@@ -0,0 +1,31 @@
+import { Component, OnInit } from '@angular/core';
+import { OrdersService } from '../orders.service';
+import { IOrder } from '../../shared/models/order.model';
+import { ActivatedRoute } from '@angular/router';
+
+@Component({
+ selector: 'esh-orders-detail .esh-orders-detail',
+ styleUrls: ['./orders-detail.component.scss'],
+ templateUrl: './orders-detail.component.html'
+})
+export class OrdersDetailComponent implements OnInit {
+ order = {}; // new order
+
+ constructor(private service: OrdersService, private route: ActivatedRoute) { }
+
+ ngOnInit() {
+ this.route.params.subscribe(params => {
+ let id = +params['id']; // (+) converts string 'id' to a number
+ this.getOrder(id);
+ });
+ }
+
+ getOrder(id: number) {
+ this.service.getOrder(id).subscribe(order => {
+ this.order = order;
+ console.log('order retrieved: ' + order.ordernumber);
+ console.log(this.order);
+ });
+ }
+}
+
diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/orders/orders.component.html b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/orders/orders.component.html
new file mode 100644
index 000000000..deb2eb37f
--- /dev/null
+++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/orders/orders.component.html
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+ ORDER NUMBER
+ |
+
+ DATE
+ |
+
+ TOTAL
+ |
+
+ STATUS
+ |
+ |
+
+
+
+
+ {{order.ordernumber}} |
+ {{order.date | date:'short'}} |
+ $ {{order.total}} |
+ {{order.status}} |
+
+ Detail
+ |
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/orders/orders.component.scss b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/orders/orders.component.scss
new file mode 100644
index 000000000..bb0ab0552
--- /dev/null
+++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/orders/orders.component.scss
@@ -0,0 +1,85 @@
+@import '../_variables.scss';
+
+.esh-orders {
+ min-height: 80vh;
+
+ &-header {
+ background-color: #00A69C;
+ height: 63px;
+
+ li {
+ list-style: none;
+ display: inline;
+ opacity: 0.5;
+ margin-top: 25px;
+ margin-left: 10px;
+ float: right;
+ cursor: pointer;
+ color: white;
+ }
+
+ li a {
+ color: white;
+ }
+
+ &-back {
+ float: left !important;
+ margin-top: 20px !important;
+ text-transform: uppercase;
+ }
+
+ li a:hover {
+ text-decoration: none;
+ }
+ }
+
+ &-container {
+ min-height: 70vh;
+ padding-top: 40px;
+ margin-bottom: 30px;
+ min-width: 992px;
+ }
+
+ &-order-column {
+ max-width: 120px;
+ vertical-align: middle !important;
+ }
+
+ &-order-link {
+ color: #83d01b;
+ }
+
+ &-order-image {
+ max-width: 210px;
+ }
+
+ &-total-value {
+ font-size: 20px;
+ color: #00a69c;
+ }
+
+ &-total-label {
+ font-size: 14px;
+ color: #404040;
+ margin-top: 10px;
+ }
+
+ &-totals {
+ border-bottom:none!important;
+ }
+}
+
+.table td {
+ border-top: solid 1px #ddd;
+}
+
+.table thead th {
+ border: none !important;
+}
+
+
+
+
+
+
+
diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/orders/orders.component.ts b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/orders/orders.component.ts
new file mode 100644
index 000000000..8dd3b0485
--- /dev/null
+++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/orders/orders.component.ts
@@ -0,0 +1,27 @@
+import { Component, OnInit } from '@angular/core';
+import { OrdersService } from './orders.service';
+import { IOrder } from '../shared/models/order.model';
+
+@Component({
+ selector: 'esh-orders .esh-orders',
+ styleUrls: ['./orders.component.scss'],
+ templateUrl: './orders.component.html'
+})
+export class OrdersComponent implements OnInit {
+ orders: IOrder[];
+
+ constructor(private service: OrdersService) { }
+
+ ngOnInit() {
+ this.getOrders();
+ }
+
+
+ getOrders() {
+ this.service.getOrders().subscribe(orders => {
+ this.orders = orders;
+ console.log('orders items retrieved: ' + orders.length);
+ });
+ }
+}
+
diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/orders/orders.module.ts b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/orders/orders.module.ts
new file mode 100644
index 000000000..f3a920f59
--- /dev/null
+++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/orders/orders.module.ts
@@ -0,0 +1,15 @@
+import { NgModule } from '@angular/core';
+import { BrowserModule } from '@angular/platform-browser';
+
+import { SharedModule } from '../shared/shared.module';
+import { OrdersComponent } from './orders.component';
+import { OrdersDetailComponent } from './orders-detail/orders-detail.component';
+import { OrdersService } from './orders.service';
+import { Pager } from '../shared/components/pager/pager';
+
+@NgModule({
+ imports: [BrowserModule, SharedModule],
+ declarations: [OrdersComponent, OrdersDetailComponent],
+ providers: [OrdersService]
+})
+export class OrdersModule { }
diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/orders/orders.service.ts b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/orders/orders.service.ts
new file mode 100644
index 000000000..be1455058
--- /dev/null
+++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/orders/orders.service.ts
@@ -0,0 +1,35 @@
+import { Injectable } from '@angular/core';
+import { Response } from '@angular/http';
+
+import { DataService } from '../shared/services/data.service';
+import { IOrder } from '../shared/models/order.model';
+
+import 'rxjs/Rx';
+import { Observable } from 'rxjs/Observable';
+import 'rxjs/add/observable/throw';
+import { Observer } from 'rxjs/Observer';
+import 'rxjs/add/operator/map';
+
+@Injectable()
+export class OrdersService {
+ private ordersUrl: string = 'http://eshopcontainers:5102/api/v1/orders';
+
+ constructor(private service: DataService) {
+ }
+
+ getOrders(): Observable {
+ let url = this.ordersUrl;
+
+ return this.service.get(url).map((response: Response) => {
+ return response.json();
+ });
+ }
+
+ getOrder(id: number): Observable {
+ let url = `${this.ordersUrl}/${id}`;
+
+ return this.service.get(url).map((response: Response) => {
+ return response.json();
+ });
+ }
+}
diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/catalogItem.model.ts b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/catalogItem.model.ts
index 521df03a7..bf4c7ea70 100644
--- a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/catalogItem.model.ts
+++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/catalogItem.model.ts
@@ -8,4 +8,5 @@ export interface ICatalogItem {
catalogBrand: string;
catalogTypeId: number;
catalogType: string;
+ units: number;
}
diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/order.model.ts b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/order.model.ts
new file mode 100644
index 000000000..8d38c6a0d
--- /dev/null
+++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/order.model.ts
@@ -0,0 +1,13 @@
+import {IOrderItem} from './orderItem.model';
+
+export interface IOrder {
+ ordernumber: number;
+ date: Date;
+ status: string;
+ total: number;
+ street?: string;
+ city?: string;
+ zipcode?: string;
+ country?: string;
+ orderitems?: IOrderItem[];
+}
diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/orderItem.model.ts b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/orderItem.model.ts
new file mode 100644
index 000000000..8727d8156
--- /dev/null
+++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/orderItem.model.ts
@@ -0,0 +1,6 @@
+export interface IOrderItem {
+ pictureurl: string;
+ productname: string;
+ unitprice: number;
+ units: number;
+}