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 @@ +
+
    +
  • Back to list
  • +
+
+
+
+
+ ORDER NUMBER
+ {{order.ordernumber}} +
+
+ DATE
+ {{order.date | date:'short'}} +
+
+ TOTAL
+ $ {{order.total}} +
+
+ STATUS
+ {{order.status}} +
+
+
+
+ SHIPING ADDRESS
+ {{order.street}}
+ {{order.city}}
+ {{order.country}}
+
+
+
+
ORDER DETAILS
+
+ + + + + + + + + + + +
{{item.productname}}ROSLYN$ {{item.unitprice}}{{item.units}}$ {{item.units * item.unitprice}}
+
+
+
+ +
+
+
+
TOTAL
+
$ 12.00
+
+
+
\ 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 @@ +
+
    +
  • Back to list
  • +
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + +
+ 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; +}