From b36bd97876cf3be8aa3b28d535c25b02b821bc0c Mon Sep 17 00:00:00 2001 From: Quique Fernandez Date: Thu, 29 Dec 2016 18:21:02 +0100 Subject: [PATCH 1/7] add ts lint --- .../Client/modules/app.routes.ts | 5 - .../Client/modules/basket/basket.component.ts | 5 +- .../Client/modules/basket/basket.module.ts | 2 +- .../modules/catalog/catalog.component.ts | 2 +- .../Client/modules/catalog/catalog.service.ts | 2 +- .../orders/orders-new/orders-new.component.ts | 7 +- .../Client/modules/orders/orders.service.ts | 9 +- .../shared/components/identity/identity.ts | 5 +- .../modules/shared/components/pager/pager.ts | 3 +- .../modules/shared/models/basket.model.ts | 6 +- .../modules/shared/models/basketItem.model.ts | 13 +- .../modules/shared/models/catalog.model.ts | 8 +- .../shared/models/catalogBrand.model.ts | 4 +- .../shared/models/catalogType.model.ts | 4 +- .../modules/shared/models/order.model.ts | 4 +- .../modules/shared/models/orderItem.model.ts | 2 +- .../modules/shared/models/pager.model.ts | 12 +- .../shared/services/basket.wrapper.service.ts | 9 +- .../modules/shared/services/data.service.ts | 8 +- .../shared/services/security.service.ts | 131 +++++++++--------- .../Client/modules/shared/shared.module.ts | 6 +- .../eShopOnContainers.WebSPA/package.json | 9 +- .../eShopOnContainers.WebSPA/tslint.json | 101 ++++++++++++++ 23 files changed, 222 insertions(+), 135 deletions(-) create mode 100644 src/Web/WebSPA/eShopOnContainers.WebSPA/tslint.json 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 2bc69d248..ecda0c3d0 100644 --- a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/app.routes.ts +++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/app.routes.ts @@ -13,11 +13,6 @@ export const routes: Routes = [ { path: 'orders', component: OrdersComponent }, { path: 'orders/:id', component: OrdersDetailComponent }, { path: 'order', component: OrdersNewComponent } - //Lazy async modules (angular-loader-router) and enable a router in each module. - //{ - // path: 'basket', loadChildren: '/basket/basket.module' }); - // }) - //} ]; export const routing = RouterModule.forRoot(routes); diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/basket/basket.component.ts b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/basket/basket.component.ts index 5bde088a0..d07da4594 100644 --- a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/basket/basket.component.ts +++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/basket/basket.component.ts @@ -37,10 +37,7 @@ export class BasketComponent implements OnInit { private calculateTotalPrice() { this.totalPrice = 0; this.basket.items.forEach(item => { - this.totalPrice += (item.unitPrice * item.quantity) + this.totalPrice += (item.unitPrice * item.quantity); }); } - - } - diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/basket/basket.module.ts b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/basket/basket.module.ts index a7b14e090..f29bf942d 100644 --- a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/basket/basket.module.ts +++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/basket/basket.module.ts @@ -9,7 +9,7 @@ import { Header } from '../shared/components/header/header'; @NgModule({ imports: [SharedModule], - declarations: [BasketComponent, BasketStatusComponent], + declarations: [BasketComponent, BasketStatusComponent], providers: [BasketService], exports: [BasketStatusComponent] }) diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/catalog/catalog.component.ts b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/catalog/catalog.component.ts index 254690de2..5ae78fd9c 100644 --- a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/catalog/catalog.component.ts +++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/catalog/catalog.component.ts @@ -54,7 +54,7 @@ export class CatalogComponent implements OnInit { this.basketService.addItemToBasket(item); } - getCatalog(pageSize:number, pageIndex: number, brand?: number, type?: number) { + getCatalog(pageSize: number, pageIndex: number, brand?: number, type?: number) { this.service.getCatalog(pageIndex, pageSize, brand, type).subscribe(catalog => { this.catalog = catalog; diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/catalog/catalog.service.ts b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/catalog/catalog.service.ts index a5e92133a..f79840179 100644 --- a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/catalog/catalog.service.ts +++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/catalog/catalog.service.ts @@ -22,7 +22,7 @@ export class CatalogService { } getCatalog(pageIndex: number, pageSize: number, brand: number, type: number): Observable { - var url = this.catalogUrl; + let url = this.catalogUrl; if (brand || type) { url = this.catalogUrl + '/type/' + ((type) ? type.toString() : 'null') + '/brand/' + ((brand) ? brand.toString() : 'null'); } diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/orders/orders-new/orders-new.component.ts b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/orders/orders-new/orders-new.component.ts index 04fea604b..aadcabc1c 100644 --- a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/orders/orders-new/orders-new.component.ts +++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/orders/orders-new/orders-new.component.ts @@ -12,11 +12,11 @@ import { Router } from '@angular/router'; templateUrl: './orders-new.component.html' }) export class OrdersNewComponent implements OnInit { - private newOrderForm : FormGroup; // new order form + private newOrderForm: FormGroup; // new order form private order: IOrder; constructor(private service: OrdersService, fb: FormBuilder, private router: Router, private basketEvents: BasketWrapperService) { - //Obtener información del perfil de usuario. + // Obtener información del perfil de usuario. this.order = service.mapBasketAndIdentityInfoNewOrder(); this.newOrderForm = fb.group({ 'street': [this.order.street, Validators.required], @@ -31,7 +31,6 @@ export class OrdersNewComponent implements OnInit { } ngOnInit() { - } submitForm(value: any) { @@ -45,7 +44,7 @@ export class OrdersNewComponent implements OnInit { this.order.cardsecuritynumber = this.newOrderForm.controls['securitycode'].value; this.service.postOrder(this.order).subscribe(res => { - //this will emit an observable. Basket service is subscribed to this observable, and will react deleting the basket for the current user. + // this will emit an observable. Basket service is subscribed to this observable, and will react deleting the basket for the current user. this.basketEvents.orderCreated(); this.router.navigate(['orders']); 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 index d85bbab28..8d0b4d91a 100644 --- a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/orders/orders.service.ts +++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/orders/orders.service.ts @@ -36,7 +36,7 @@ export class OrdersService { return response.json(); }); } - + postOrder(item): Observable { return this.service.post(this.ordersUrl + '/new', item).map((response: Response) => { return true; @@ -51,7 +51,7 @@ export class OrdersService { console.log(basket); console.log(identityInfo); - //Identity data mapping: + // Identity data mapping: order.street = identityInfo.address_street; order.city = identityInfo.address_city; order.country = identityInfo.address_country; @@ -65,10 +65,9 @@ export class OrdersService { order.total = 0; order.expiration = identityInfo.card_expiration; - //basket data mapping: + // basket data mapping: order.orderItems = new Array(); - basket.items.forEach(x => - { + basket.items.forEach(x => { let item: IOrderItem = {}; item.pictureurl = x.pictureUrl; item.productId = +x.productId; diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/components/identity/identity.ts b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/components/identity/identity.ts index bd5102ddf..606249c0a 100644 --- a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/components/identity/identity.ts +++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/components/identity/identity.ts @@ -12,15 +12,14 @@ import { SecurityService } from '../../services/security.service'; export class Identity implements OnInit { private authenticated: boolean = false; private subscription: Subscription; - private userName: string = ""; + private userName: string = ''; constructor(private service: SecurityService) { } ngOnInit() { - this.subscription = this.service.authenticationChallenge$.subscribe(res => - { + this.subscription = this.service.authenticationChallenge$.subscribe(res => { this.authenticated = res; this.userName = this.service.UserData.email; }); diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/components/pager/pager.ts b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/components/pager/pager.ts index 73764a9a8..9be34463a 100644 --- a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/components/pager/pager.ts +++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/components/pager/pager.ts @@ -18,10 +18,9 @@ export class Pager implements OnInit, OnChanges { buttonStates: any = { nextDisabled: true, previousDisabled: true, - } + }; ngOnInit() { - //console.log(this.model); } ngOnChanges() { diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/basket.model.ts b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/basket.model.ts index dcd9c3321..a7bcd21e4 100644 --- a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/basket.model.ts +++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/basket.model.ts @@ -1,6 +1,6 @@ import { IBasketItem } from './basketItem.model'; export interface IBasket { - items: IBasketItem[] - buyerId: string -} \ No newline at end of file + items: IBasketItem[]; + buyerId: string; +} diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/basketItem.model.ts b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/basketItem.model.ts index 42681bb67..8701ae1d6 100644 --- a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/basketItem.model.ts +++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/basketItem.model.ts @@ -1,9 +1,8 @@ export interface IBasketItem { - id: string - productId: string - productName: string - unitPrice: number, - quantity: number, - pictureUrl: string + id: string; + productId: string; + productName: string; + unitPrice: number; + quantity: number; + pictureUrl: string; } - diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/catalog.model.ts b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/catalog.model.ts index 72cc38009..56ca2d652 100644 --- a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/catalog.model.ts +++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/catalog.model.ts @@ -1,8 +1,8 @@ import {ICatalogItem} from './catalogItem.model'; export interface ICatalog { - pageIndex: number - data: ICatalogItem[] - pageSize: number - count: number + pageIndex: number; + data: ICatalogItem[]; + pageSize: number; + count: number; } diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/catalogBrand.model.ts b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/catalogBrand.model.ts index 3f7a183da..0fdb63f47 100644 --- a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/catalogBrand.model.ts +++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/catalogBrand.model.ts @@ -1,4 +1,4 @@ export interface ICatalogBrand { - id: number - brand: string + id: number; + brand: string; } \ No newline at end of file diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/catalogType.model.ts b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/catalogType.model.ts index 53a2a2ad3..6f0002f52 100644 --- a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/catalogType.model.ts +++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/catalogType.model.ts @@ -1,4 +1,4 @@ export interface ICatalogType { - id: number - type: string + id: number; + type: string; } \ No newline at end of file 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 index 7dd14282e..9780f40ad 100644 --- 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 @@ -13,7 +13,7 @@ export interface IOrder { cardholdername: string; cardtypeid: number; buyer: string; - ordernumber: string, - total: number, + ordernumber: string; + total: number; 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 index 75a2f54f2..40fa11460 100644 --- 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 @@ -3,5 +3,5 @@ export interface IOrderItem { productname: string; unitprice: number; units: number; - productId: number + productId: number; } diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/pager.model.ts b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/pager.model.ts index 6ff85c092..726c299a7 100644 --- a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/pager.model.ts +++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/models/pager.model.ts @@ -1,7 +1,7 @@ export interface IPager { - itemsPage: number, - totalItems: number, - actualPage: number, - totalPages: number, - items: number, -} \ No newline at end of file + itemsPage: number; + totalItems: number; + actualPage: number; + totalPages: number; + items: number; +} diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/services/basket.wrapper.service.ts b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/services/basket.wrapper.service.ts index 93cd5a364..05924c0f5 100644 --- a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/services/basket.wrapper.service.ts +++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/services/basket.wrapper.service.ts @@ -8,17 +8,17 @@ import { SecurityService } from '../services/security.service'; @Injectable() export class BasketWrapperService { - public basket: IBasket + public basket: IBasket; constructor(private identityService: SecurityService) { } - //observable that is fired when a product is added to the cart + // observable that is fired when a product is added to the cart private addItemToBasketSource = new Subject(); addItemToBasket$ = this.addItemToBasketSource.asObservable(); private orderCreatedSource = new Subject(); orderCreated$ = this.orderCreatedSource.asObservable(); - + addItemToBasket(item: ICatalogItem) { if (this.identityService.IsAuthorized) { let basket: IBasketItem = { @@ -28,7 +28,8 @@ export class BasketWrapperService { quantity: 1, unitPrice: item.price, id: '' - } + }; + this.addItemToBasketSource.next(basket); } else { this.identityService.Authorize(); diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/services/data.service.ts b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/services/data.service.ts index 064e024e1..78dd29747 100644 --- a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/services/data.service.ts +++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/services/data.service.ts @@ -19,9 +19,9 @@ export class DataService { if (this.securityService) { options.headers = new Headers(); - options.headers.append("Authorization", "Bearer " + this.securityService.GetToken()); + options.headers.append('Authorization', 'Bearer ' + this.securityService.GetToken()); } - + return this.http.get(url, options).map( (res: Response) => { return res; @@ -33,7 +33,7 @@ export class DataService { if (this.securityService) { options.headers = new Headers(); - options.headers.append("Authorization", "Bearer " + this.securityService.GetToken()); + options.headers.append('Authorization', 'Bearer ' + this.securityService.GetToken()); } return this.http.post(url, data, options).map( @@ -47,7 +47,7 @@ export class DataService { if (this.securityService) { options.headers = new Headers(); - options.headers.append("Authorization", "Bearer " + this.securityService.GetToken()); + options.headers.append('Authorization', 'Bearer ' + this.securityService.GetToken()); } console.log('data.service deleting'); diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/services/security.service.ts b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/services/security.service.ts index b3f73b569..fb5e42331 100644 --- a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/services/security.service.ts +++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/services/security.service.ts @@ -3,7 +3,6 @@ import { Http, Response, Headers } from '@angular/http'; import 'rxjs/add/operator/map'; import { Observable } from 'rxjs/Observable'; import { Subject } from 'rxjs/Subject'; -//import { Configuration } from '../app.constants'; import { Router } from '@angular/router'; import { ActivatedRoute } from '@angular/router'; @@ -20,45 +19,45 @@ export class SecurityService { this.headers = new Headers(); this.headers.append('Content-Type', 'application/json'); this.headers.append('Accept', 'application/json'); - this.storage = sessionStorage; //localStorage; + this.storage = sessionStorage; // localStorage; - if (this.retrieve("IsAuthorized") !== "") { - this.IsAuthorized = this.retrieve("IsAuthorized"); + if (this.retrieve('IsAuthorized') !== '') { + this.IsAuthorized = this.retrieve('IsAuthorized'); this.authenticationSource.next(true); - this.UserData = this.retrieve("userData"); + this.UserData = this.retrieve('userData'); } } public IsAuthorized: boolean; public GetToken(): any { - return this.retrieve("authorizationData"); + return this.retrieve('authorizationData'); } public ResetAuthorizationData() { - this.store("authorizationData", ""); - this.store("authorizationDataIdToken", ""); + this.store('authorizationData', ''); + this.store('authorizationDataIdToken', ''); this.IsAuthorized = false; - this.store("IsAuthorized", false); + this.store('IsAuthorized', false); } public UserData: any; - public SetAuthorizationData(token: any, id_token:any) { - if (this.retrieve("authorizationData") !== "") { - this.store("authorizationData", ""); + public SetAuthorizationData(token: any, id_token: any) { + if (this.retrieve('authorizationData') !== '') { + this.store('authorizationData', ''); } - this.store("authorizationData", token); - this.store("authorizationDataIdToken", id_token); + this.store('authorizationData', token); + this.store('authorizationDataIdToken', id_token); this.IsAuthorized = true; - this.store("IsAuthorized", true); + this.store('IsAuthorized', true); this.getUserData() .subscribe(data => { this.UserData = data; - this.store("userData", data); - //emit observable + this.store('userData', data); + // emit observable this.authenticationSource.next(true); window.location.href = 'http://localhost:5104'; }, @@ -71,25 +70,25 @@ export class SecurityService { public Authorize() { this.ResetAuthorizationData(); - var authorizationUrl = 'http://localhost:5105/connect/authorize'; - var client_id = 'js'; - var redirect_uri = 'http://localhost:5104/'; - var response_type = "id_token token"; - var scope = "openid profile orders basket"; - var nonce = "N" + Math.random() + "" + Date.now(); - var state = Date.now() + "" + Math.random(); + let authorizationUrl = 'http://localhost:5105/connect/authorize'; + let client_id = 'js'; + let redirect_uri = 'http://localhost:5104/'; + let response_type = 'id_token token'; + let scope = 'openid profile orders basket'; + let nonce = 'N' + Math.random() + '' + Date.now(); + let state = Date.now() + '' + Math.random(); - this.store("authStateControl", state); - this.store("authNonce", nonce); + this.store('authStateControl', state); + this.store('authNonce', nonce); - var url = - authorizationUrl + "?" + - "response_type=" + encodeURI(response_type) + "&" + - "client_id=" + encodeURI(client_id) + "&" + - "redirect_uri=" + encodeURI(redirect_uri) + "&" + - "scope=" + encodeURI(scope) + "&" + - "nonce=" + encodeURI(nonce) + "&" + - "state=" + encodeURI(state); + let url = + authorizationUrl + '?' + + 'response_type=' + encodeURI(response_type) + '&' + + 'client_id=' + encodeURI(client_id) + '&' + + 'redirect_uri=' + encodeURI(redirect_uri) + '&' + + 'scope=' + encodeURI(scope) + '&' + + 'nonce=' + encodeURI(nonce) + '&' + + 'state=' + encodeURI(state); window.location.href = url; } @@ -97,41 +96,41 @@ export class SecurityService { public AuthorizedCallback() { this.ResetAuthorizationData(); - var hash = window.location.hash.substr(1); + let hash = window.location.hash.substr(1); - var result: any = hash.split('&').reduce(function (result : any, item: string) { - var parts = item.split('='); + let result: any = hash.split('&').reduce(function (result: any, item: string) { + let parts = item.split('='); result[parts[0]] = parts[1]; return result; }, {}); console.log(result); - var token = ""; - var id_token = ""; - var authResponseIsValid = false; + let token = ''; + let id_token = ''; + let authResponseIsValid = false; if (!result.error) { - if (result.state !== this.retrieve("authStateControl")) { - console.log("AuthorizedCallback incorrect state"); + if (result.state !== this.retrieve('authStateControl')) { + console.log('AuthorizedCallback incorrect state'); } else { token = result.access_token; - id_token = result.id_token + id_token = result.id_token; - var dataIdToken: any = this.getDataFromToken(id_token); + let dataIdToken: any = this.getDataFromToken(id_token); console.log(dataIdToken); // validate nonce - if (dataIdToken.nonce !== this.retrieve("authNonce")) { - console.log("AuthorizedCallback incorrect nonce"); + if (dataIdToken.nonce !== this.retrieve('authNonce')) { + console.log('AuthorizedCallback incorrect nonce'); } else { - this.store("authNonce", ""); - this.store("authStateControl", ""); + this.store('authNonce', ''); + this.store('authStateControl', ''); authResponseIsValid = true; - console.log("AuthorizedCallback state and nonce validated, returning access token"); + console.log('AuthorizedCallback state and nonce validated, returning access token'); } } } @@ -143,18 +142,18 @@ export class SecurityService { } public Logoff() { - var authorizationUrl = 'http://localhost:5105/connect/endsession'; - var id_token_hint = this.retrieve("authorizationDataIdToken"); - var post_logout_redirect_uri = 'http://localhost:5104/'; + let authorizationUrl = 'http://localhost:5105/connect/endsession'; + let id_token_hint = this.retrieve('authorizationDataIdToken'); + let post_logout_redirect_uri = 'http://localhost:5104/'; - var url = - authorizationUrl + "?" + - "id_token_hint=" + encodeURI(id_token_hint) + "&" + - "post_logout_redirect_uri=" + encodeURI(post_logout_redirect_uri); + let url = + authorizationUrl + '?' + + 'id_token_hint=' + encodeURI(id_token_hint) + '&' + + 'post_logout_redirect_uri=' + encodeURI(post_logout_redirect_uri); this.ResetAuthorizationData(); - //emit observable + // emit observable this.authenticationSource.next(false); window.location.href = url; } @@ -162,16 +161,16 @@ export class SecurityService { public HandleError(error: any) { console.log(error); if (error.status == 403) { - this._router.navigate(['/Forbidden']) + this._router.navigate(['/Forbidden']); } else if (error.status == 401) { - //this.ResetAuthorizationData(); - this._router.navigate(['/Unauthorized']) + // this.ResetAuthorizationData(); + this._router.navigate(['/Unauthorized']); } } private urlBase64Decode(str: string) { - var output = str.replace('-', '+').replace('_', '/'); + let output = str.replace('-', '+').replace('_', '/'); switch (output.length % 4) { case 0: break; @@ -189,9 +188,9 @@ export class SecurityService { } private getDataFromToken(token: any) { - var data = {}; + let data = {}; if (typeof token !== 'undefined') { - var encoded = token.split('.')[1]; + let encoded = token.split('.')[1]; data = JSON.parse(this.urlBase64Decode(encoded)); } @@ -199,7 +198,7 @@ export class SecurityService { } private retrieve(key: string): any { - var item = this.storage.getItem(key); + let item = this.storage.getItem(key); if (item && item !== 'undefined') { return JSON.parse(this.storage.getItem(key)); @@ -225,9 +224,9 @@ export class SecurityService { this.headers.append('Content-Type', 'application/json'); this.headers.append('Accept', 'application/json'); - var token = this.GetToken(); + let token = this.GetToken(); - if (token !== "") { + if (token !== '') { this.headers.append('Authorization', 'Bearer ' + token); } } diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/shared.module.ts b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/shared.module.ts index cde0b9a5e..a946d6ca7 100644 --- a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/shared.module.ts +++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/shared.module.ts @@ -19,7 +19,7 @@ import { UppercasePipe } from './pipes/uppercase.pipe'; import { BasketWrapperService} from './services/basket.wrapper.service'; import { SecurityService } from './services/security.service'; -//Components: +// Components: import { Pager } from './components/pager/pager'; import { Header } from './components/header/header'; import { Identity } from './components/identity/identity'; @@ -58,8 +58,6 @@ import { Identity } from './components/identity/identity'; DynamicFormControlComponent, ErrorSummaryComponent, ErrorMessageComponent, - //FooterComponent, - //HeaderComponent, PageHeadingComponent, UppercasePipe, Pager, @@ -76,7 +74,7 @@ export class SharedModule { DataService, FormControlService, UtilityService, - BasketWrapperService, + BasketWrapperService, SecurityService ] }; diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/package.json b/src/Web/WebSPA/eShopOnContainers.WebSPA/package.json index b6e05332b..05792c0cf 100644 --- a/src/Web/WebSPA/eShopOnContainers.WebSPA/package.json +++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/package.json @@ -29,10 +29,11 @@ "build:main": "node node_modules/webpack/bin/webpack.js --config config/webpack.config.js", "setdev": "set ASPNETCORE_ENVIRONMENT=Development", "setprod": "set ASPNETCORE_ENVIRONMENT=Production", - "build:dev": "npm run lint:sass && npm run setdev && npm run clean:dist && npm run build:vendor && npm run build:main", + "build:dev": "npm run setdev && npm run clean:dist && npm run build:vendor && npm run build:main", "build:prod": "npm run setprod && npm run clean:dist && npm run build:vendor && npm run build:main", "version": "npm run build", - "lint:sass": "sass-lint -c .sass-lint.yml Client/**/*.scss --verbose" + "lint:sass": "sass-lint -c .sass-lint.yml Client/**/*.scss --verbose", + "lint:ts": "tslint -c tslint.json Client/**/*.ts" }, "dependencies": { "@angular/common": "2.1.2", @@ -92,9 +93,9 @@ "sass-loader": "4.0.2", "ts-helpers": "1.1.1", "ts-node": "1.4.3", - "tslint": "3.15.1", + "tslint": "^3.15.1", "typedoc": "0.5.0", - "typescript": "2.0.6", + "typescript": "^2.0.6", "url-loader": "^0.5.7", "webpack": "2.1.0-beta.25", "webpack-externals-plugin": "1.0.0", diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/tslint.json b/src/Web/WebSPA/eShopOnContainers.WebSPA/tslint.json new file mode 100644 index 000000000..5ca8b5b5b --- /dev/null +++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/tslint.json @@ -0,0 +1,101 @@ +{ + "jsRules": { + "class-name": true, + "comment-format": [ + true, + "check-space" + ], + "indent": [ + true, + "spaces" + ], + "no-duplicate-variable": true, + "no-eval": true, + "no-trailing-whitespace": true, + "no-unsafe-finally": true, + "one-line": [ + true, + "check-open-brace", + "check-whitespace" + ], + "quotemark": [ + true, + "single" + ], + "semicolon": [ + true, + "always" + ], + "triple-equals": [ + false, + "allow-null-check" + ], + "variable-name": [ + true, + "ban-keywords" + ], + "whitespace": [ + true, + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type" + ] + }, + "rules": { + "class-name": true, + "comment-format": [ + true, + "check-space" + ], + "indent": [ + true, + "spaces" + ], + "no-eval": true, + "no-internal-module": true, + "no-trailing-whitespace": true, + "no-unsafe-finally": true, + "no-var-keyword": true, + "one-line": [ + true, + "check-open-brace", + "check-whitespace" + ], + "quotemark": [ + true, + "single" + ], + "semicolon": [ + true, + "always" + ], + "triple-equals": [ + false, + "allow-null-check" + ], + "typedef-whitespace": [ + true, + { + "call-signature": "nospace", + "index-signature": "nospace", + "parameter": "nospace", + "property-declaration": "nospace", + "variable-declaration": "nospace" + } + ], + "variable-name": [ + true, + "ban-keywords" + ], + "whitespace": [ + true, + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type" + ] + } +} \ No newline at end of file From 463b2569bef2c549a14d9d708f4803ce603e9f70 Mon Sep 17 00:00:00 2001 From: Quique Fernandez Date: Thu, 29 Dec 2016 18:41:57 +0100 Subject: [PATCH 2/7] Disable cart when is empty on SPA --- .../basket/basket-status/basket-status.component.html | 1 + .../basket/basket-status/basket-status.component.scss | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/basket/basket-status/basket-status.component.html b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/basket/basket-status/basket-status.component.html index 03a7875c7..7509a2281 100644 --- a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/basket/basket-status/basket-status.component.html +++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/basket/basket-status/basket-status.component.html @@ -1,4 +1,5 @@
diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/basket/basket-status/basket-status.component.scss b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/basket/basket-status/basket-status.component.scss index d50b8c9d2..d78604898 100644 --- a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/basket/basket-status/basket-status.component.scss +++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/basket/basket-status/basket-status.component.scss @@ -6,6 +6,11 @@ position: relative; transition: all $animation-speed-default; + &.is-disabled { + opacity: .5; + pointer-events: none; + } + &-image { height: 36px; margin-top: .5rem; From 9bd73c42cb19d70caebbe64cb11a5348f1bbd489 Mon Sep 17 00:00:00 2001 From: Quique Fernandez Date: Thu, 29 Dec 2016 18:52:16 +0100 Subject: [PATCH 3/7] Fix pager styles on SPA and MVC webstes --- src/Web/WebMVC/wwwroot/css/app.min.css | 2 +- src/Web/WebMVC/wwwroot/css/shared/components/pager/pager.css | 3 ++- .../Client/modules/shared/components/pager/pager.html | 4 ++-- .../Client/modules/shared/components/pager/pager.scss | 5 +++++ 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/Web/WebMVC/wwwroot/css/app.min.css b/src/Web/WebMVC/wwwroot/css/app.min.css index 3a900417b..eb62eb500 100644 --- a/src/Web/WebMVC/wwwroot/css/app.min.css +++ b/src/Web/WebMVC/wwwroot/css/app.min.css @@ -1 +1 @@ -.esh-basket,.esh-orders,.esh-orders_detail,.esh-orders_new{min-height:80vh}@font-face{font-family:Montserrat;font-weight:400;src:url(../fonts/Montserrat-Regular.eot?) format("eot"),url(../fonts/Montserrat-Regular.woff) format("woff"),url(../fonts/Montserrat-Regular.ttf) format("truetype"),url(../fonts/Montserrat-Regular.svg#Montserrat) format("svg")}@font-face{font-family:Montserrat;font-weight:700;src:url(../fonts/Montserrat-Bold.eot?) format("eot"),url(../fonts/Montserrat-Bold.woff) format("woff"),url(../fonts/Montserrat-Bold.ttf) format("truetype"),url(../fonts/Montserrat-Bold.svg#Montserrat) format("svg")}body,html{font-family:Montserrat,sans-serif;font-size:16px;font-weight:400;z-index:10}*,::after,::before{box-sizing:border-box}.preloading{color:#00A69C;display:block;font-size:1.5rem;left:50%;position:fixed;top:50%;transform:translate(-50%,-50%)}select::-ms-expand{display:none}@media screen and (min-width:992px){.form-input{max-width:360px;width:360px}}.form-input{border-radius:0;height:45px;padding:10px}.form-input-small{max-width:100px!important}.form-input-medium{width:150px!important}.alert{padding-left:0}.alert-danger{background-color:transparent;border:0;color:#FB0D0D;font-size:12px}a,a:active,a:hover,a:visited{color:#000;text-decoration:none;transition:color .35s}a:active,a:hover{color:#75B918;transition:color .35s}.esh-app-footer{background-color:#000;border-top:1px solid #EEE;margin-top:2.5rem;padding-bottom:2.5rem;padding-top:2.5rem;width:100%}.esh-app-footer-brand{height:50px;width:230px}.esh-app-footer-text{color:#83D01B;line-height:50px;text-align:right;width:100%}.esh-pager-wrapper{padding-top:1rem;text-align:center}.esh-identity,.esh-orders_new-section--right{text-align:right}.esh-pager-item{margin:0 5vw}.esh-pager-item--navigable{cursor:pointer}.esh-pager-item--navigable.is-disabled{display:none}.esh-identity-image,.esh-identity-name{display:inline-block}.esh-pager-item--navigable:hover{color:#83D01B}@media screen and (max-width:1280px){.esh-pager-item{font-size:.85rem}}@media screen and (max-width:1024px){.esh-pager-item{margin:0 4vw}}.esh-identity{line-height:3rem;position:relative}.esh-header-back,.esh-orders-back{line-height:4rem;text-decoration:none;text-transform:uppercase}.esh-identity-section{display:inline-block;width:100%}.esh-identity-name--upper{text-transform:uppercase}@media screen and (max-width:768px){.esh-identity-name{font-size:.85rem}}.esh-identity-drop{background:#FFF;height:0;min-width:14rem;right:0;overflow:hidden;padding:.5rem;position:absolute;top:2.5rem;transition:height .35s}.esh-identity:hover .esh-identity-drop{border:1px solid #EEE;height:7rem;transition:height .35s}.esh-header,.esh-orders-header{background-color:#00A69C;height:4rem}.esh-identity-item{cursor:pointer;display:block;transition:color .35s}.esh-identity-item:hover{color:#75b918;transition:color .35s}.esh-header-back{color:rgba(255,255,255,.5)!important;transition:color .35s}.esh-header-back:hover{color:#FFF!important;transition:color .35s}.esh-orders{overflow-x:hidden}.esh-orders-back{color:rgba(255,255,255,.4);transition:color .35s}.esh-orders-back:hover{color:#FFF;transition:color .35s}.esh-orders-titles{padding-bottom:1rem;padding-top:2rem}.esh-orders-title{text-transform:uppercase}.esh-orders-items{height:2rem;line-height:2rem;position:relative}.esh-orders-items:nth-of-type(2n+1):before{background-color:#EEF;content:'';height:100%;left:0;margin-left:-100vw;position:absolute;top:0;width:200vw;z-index:-1}.esh-orders-item{font-weight:300}.esh-orders-item--hover{opacity:0;pointer-events:none}.esh-orders-items:hover .esh-orders-item--hover{opacity:1;pointer-events:all}.esh-orders-link{color:#83D01B;text-decoration:none;transition:color .35s}.esh-orders-link:hover{color:#75b918;transition:color .35s}.esh-orders_new-header{background-color:#00A69C;height:4rem}.esh-orders_detail-image,.esh-orders_new-image{height:8rem}.esh-orders_new-back{color:rgba(255,255,255,.4);line-height:4rem;text-decoration:none;text-transform:uppercase;transition:color .35s}.esh-orders_new-back:hover{color:#FFF;transition:color .35s}.esh-orders_new-section{padding:1rem 0}.esh-orders_new-placeOrder{background-color:#83D01B;border:0;border-radius:0;color:#FFF;display:inline-block;font-size:1rem;font-weight:400;margin-top:1rem;padding:1rem 1.5rem;text-align:center;text-transform:uppercase;transition:all .35s}.esh-orders_detail-item--mark,.esh-orders_new-item--mark{color:#83D01B}.esh-orders_new-placeOrder:hover{background-color:#4a760f;transition:all .35s}.esh-orders_new-titles{padding-bottom:1rem;padding-top:2rem}.esh-orders_new-title{font-size:1.25rem}.esh-orders_detail-item,.esh-orders_new-item{font-size:1rem;font-weight:300}.esh-orders_new-items--border{border-bottom:1px solid #EEE;padding:.5rem 0}.esh-orders_new-items--border:last-of-type{border-color:transparent}.esh-orders_new-item--middle{line-height:8rem}@media screen and (max-width:768px){.esh-orders_new-item--middle{line-height:1rem}}.esh-orders_detail-section{padding:1rem 0}.esh-orders_detail-section--right{text-align:right}.esh-orders_detail-titles{padding-bottom:1rem;padding-top:2rem}.esh-orders_detail-title{text-transform:uppercase}.esh-orders_detail-items--border{border-bottom:1px solid #EEE;padding:.5rem 0}.esh-orders_detail-items--border:last-of-type{border-color:transparent}.esh-orders_detail-item--middle{line-height:8rem}.esh-catalog-hero{background-image:url(../../images/main_banner.png);background-size:cover;height:260px;width:100%}.esh-catalog-title{position:relative;top:74.29px}.esh-catalog-filters{background-color:#00A69C;height:65px}.esh-catalog-filter{background-color:transparent;border-color:#00d9cc;color:#FFF;cursor:pointer;margin-right:1rem;margin-top:.5rem;outline-color:#83D01B;min-width:140px;-webkit-appearance:none;padding:1.5rem .5rem 0}.esh-catalog-filter option{background-color:#00A69C}.esh-catalog-label{display:inline-block;position:relative;z-index:0}.esh-catalog-label::before{color:rgba(255,255,255,.5);content:attr(data-title);font-size:.65rem;margin-top:.65rem;margin-left:.5rem;position:absolute;text-transform:uppercase;z-index:1}.esh-catalog-button,.esh-catalog-send{color:#FFF;transition:all .35s;cursor:pointer}.esh-catalog-label::after{background-image:url(../../images/arrow-down.png);height:7px;content:'';position:absolute;right:1.5rem;top:2.5rem;width:10px;z-index:1}.esh-catalog-send{background-color:#83D01B;font-size:1rem;transform:translateY(.5rem);padding:.5rem}.esh-catalog-send:hover{background-color:#4a760f;transition:all .35s}.esh-catalog-items{margin-top:1rem}.esh-catalog-item{text-align:center;margin-bottom:1.5rem;width:33%}@media screen and (max-width:1024px){.esh-catalog-item{width:50%}}@media screen and (max-width:768px){.esh-orders_detail-item--middle{line-height:1rem}.esh-catalog-item{width:100%}}.esh-catalog-thumbnail{max-width:370px;width:100%}.esh-catalog-button{background-color:#83D01B;border:none;font-size:1rem;height:3rem;margin-top:1rem;width:80%}.esh-catalog-button:hover{background-color:#4a760f;transition:all .35s}.esh-catalog-name{font-size:1rem;font-weight:300;margin-top:.5rem;text-align:center;text-transform:uppercase}.esh-catalog-price{text-align:center;font-weight:900;font-size:28px}.esh-catalog-price::before{content:'$'}.esh-basket-titles{padding-bottom:1rem;padding-top:2rem}.esh-basket-titles--clean{padding-bottom:0;padding-top:0}.esh-basket-title{text-transform:uppercase}.esh-basket-items--border{border-bottom:1px solid #EEE;padding:.5rem 0}.esh-basket-items--border:last-of-type{border-color:transparent}.esh-basket-item{font-size:1rem;font-weight:300}.esh-basket-item--middle{line-height:8rem}@media screen and (max-width:1024px){.esh-basket-item--middle{line-height:1rem}}.esh-basket-item--mark{color:#00A69C}.esh-basket-checkout,.esh-basketstatus-badge{color:#FFF;text-align:center;transition:all .35s}.esh-basket-image{height:8rem}.esh-basket-input{line-height:1rem;width:100%}.esh-basket-checkout{border:none;border-radius:0;background-color:#83D01B;display:inline-block;font-size:1rem;font-weight:400;margin-top:1rem;padding:1rem 1.5rem;text-transform:uppercase}.esh-basket-checkout:hover{background-color:#4a760f;transition:all .35s}.esh-basketstatus{cursor:pointer;float:right;position:relative;transition:all .35s}.esh-basketstatus.is-disabled{opacity:.5;pointer-events:none}.esh-basketstatus-image{height:36px;margin-top:.5rem}.esh-basketstatus-badge{background-color:#83D01B;border-radius:50%;display:block;height:1.5rem;left:50%;position:absolute;top:0;transform:translateX(-38%);width:1.5rem}.esh-basketstatus:hover .esh-basketstatus-badge{background-color:transparent;color:#75b918;transition:all .35s} \ No newline at end of file +.esh-basket,.esh-orders,.esh-orders_detail,.esh-orders_new{min-height:80vh}@font-face{font-family:Montserrat;font-weight:400;src:url(../fonts/Montserrat-Regular.eot?) format("eot"),url(../fonts/Montserrat-Regular.woff) format("woff"),url(../fonts/Montserrat-Regular.ttf) format("truetype"),url(../fonts/Montserrat-Regular.svg#Montserrat) format("svg")}@font-face{font-family:Montserrat;font-weight:700;src:url(../fonts/Montserrat-Bold.eot?) format("eot"),url(../fonts/Montserrat-Bold.woff) format("woff"),url(../fonts/Montserrat-Bold.ttf) format("truetype"),url(../fonts/Montserrat-Bold.svg#Montserrat) format("svg")}body,html{font-family:Montserrat,sans-serif;font-size:16px;font-weight:400;z-index:10}*,::after,::before{box-sizing:border-box}.preloading{color:#00A69C;display:block;font-size:1.5rem;left:50%;position:fixed;top:50%;transform:translate(-50%,-50%)}select::-ms-expand{display:none}@media screen and (min-width:992px){.form-input{max-width:360px;width:360px}}.form-input{border-radius:0;height:45px;padding:10px}.form-input-small{max-width:100px!important}.form-input-medium{width:150px!important}.alert{padding-left:0}.alert-danger{background-color:transparent;border:0;color:#FB0D0D;font-size:12px}a,a:active,a:hover,a:visited{color:#000;text-decoration:none;transition:color .35s}a:active,a:hover{color:#75B918;transition:color .35s}.esh-app-footer{background-color:#000;border-top:1px solid #EEE;margin-top:2.5rem;padding-bottom:2.5rem;padding-top:2.5rem;width:100%}.esh-app-footer-brand{height:50px;width:230px}.esh-app-footer-text{color:#83D01B;line-height:50px;text-align:right;width:100%}.esh-pager-wrapper{padding-top:1rem;text-align:center}.esh-identity,.esh-orders_new-section--right{text-align:right}.esh-pager-item{margin:0 5vw}.esh-pager-item--navigable{cursor:pointer}.esh-pager-item--navigable.is-disabled{opacity: 0;pointer-events: none;}.esh-identity-image,.esh-identity-name{display:inline-block}.esh-pager-item--navigable:hover{color:#83D01B}@media screen and (max-width:1280px){.esh-pager-item{font-size:.85rem}}@media screen and (max-width:1024px){.esh-pager-item{margin:0 4vw}}.esh-identity{line-height:3rem;position:relative}.esh-header-back,.esh-orders-back{line-height:4rem;text-decoration:none;text-transform:uppercase}.esh-identity-section{display:inline-block;width:100%}.esh-identity-name--upper{text-transform:uppercase}@media screen and (max-width:768px){.esh-identity-name{font-size:.85rem}}.esh-identity-drop{background:#FFF;height:0;min-width:14rem;right:0;overflow:hidden;padding:.5rem;position:absolute;top:2.5rem;transition:height .35s}.esh-identity:hover .esh-identity-drop{border:1px solid #EEE;height:7rem;transition:height .35s}.esh-header,.esh-orders-header{background-color:#00A69C;height:4rem}.esh-identity-item{cursor:pointer;display:block;transition:color .35s}.esh-identity-item:hover{color:#75b918;transition:color .35s}.esh-header-back{color:rgba(255,255,255,.5)!important;transition:color .35s}.esh-header-back:hover{color:#FFF!important;transition:color .35s}.esh-orders{overflow-x:hidden}.esh-orders-back{color:rgba(255,255,255,.4);transition:color .35s}.esh-orders-back:hover{color:#FFF;transition:color .35s}.esh-orders-titles{padding-bottom:1rem;padding-top:2rem}.esh-orders-title{text-transform:uppercase}.esh-orders-items{height:2rem;line-height:2rem;position:relative}.esh-orders-items:nth-of-type(2n+1):before{background-color:#EEF;content:'';height:100%;left:0;margin-left:-100vw;position:absolute;top:0;width:200vw;z-index:-1}.esh-orders-item{font-weight:300}.esh-orders-item--hover{opacity:0;pointer-events:none}.esh-orders-items:hover .esh-orders-item--hover{opacity:1;pointer-events:all}.esh-orders-link{color:#83D01B;text-decoration:none;transition:color .35s}.esh-orders-link:hover{color:#75b918;transition:color .35s}.esh-orders_new-header{background-color:#00A69C;height:4rem}.esh-orders_detail-image,.esh-orders_new-image{height:8rem}.esh-orders_new-back{color:rgba(255,255,255,.4);line-height:4rem;text-decoration:none;text-transform:uppercase;transition:color .35s}.esh-orders_new-back:hover{color:#FFF;transition:color .35s}.esh-orders_new-section{padding:1rem 0}.esh-orders_new-placeOrder{background-color:#83D01B;border:0;border-radius:0;color:#FFF;display:inline-block;font-size:1rem;font-weight:400;margin-top:1rem;padding:1rem 1.5rem;text-align:center;text-transform:uppercase;transition:all .35s}.esh-orders_detail-item--mark,.esh-orders_new-item--mark{color:#83D01B}.esh-orders_new-placeOrder:hover{background-color:#4a760f;transition:all .35s}.esh-orders_new-titles{padding-bottom:1rem;padding-top:2rem}.esh-orders_new-title{font-size:1.25rem}.esh-orders_detail-item,.esh-orders_new-item{font-size:1rem;font-weight:300}.esh-orders_new-items--border{border-bottom:1px solid #EEE;padding:.5rem 0}.esh-orders_new-items--border:last-of-type{border-color:transparent}.esh-orders_new-item--middle{line-height:8rem}@media screen and (max-width:768px){.esh-orders_new-item--middle{line-height:1rem}}.esh-orders_detail-section{padding:1rem 0}.esh-orders_detail-section--right{text-align:right}.esh-orders_detail-titles{padding-bottom:1rem;padding-top:2rem}.esh-orders_detail-title{text-transform:uppercase}.esh-orders_detail-items--border{border-bottom:1px solid #EEE;padding:.5rem 0}.esh-orders_detail-items--border:last-of-type{border-color:transparent}.esh-orders_detail-item--middle{line-height:8rem}.esh-catalog-hero{background-image:url(../../images/main_banner.png);background-size:cover;height:260px;width:100%}.esh-catalog-title{position:relative;top:74.29px}.esh-catalog-filters{background-color:#00A69C;height:65px}.esh-catalog-filter{background-color:transparent;border-color:#00d9cc;color:#FFF;cursor:pointer;margin-right:1rem;margin-top:.5rem;outline-color:#83D01B;min-width:140px;-webkit-appearance:none;padding:1.5rem .5rem 0}.esh-catalog-filter option{background-color:#00A69C}.esh-catalog-label{display:inline-block;position:relative;z-index:0}.esh-catalog-label::before{color:rgba(255,255,255,.5);content:attr(data-title);font-size:.65rem;margin-top:.65rem;margin-left:.5rem;position:absolute;text-transform:uppercase;z-index:1}.esh-catalog-button,.esh-catalog-send{color:#FFF;transition:all .35s;cursor:pointer}.esh-catalog-label::after{background-image:url(../../images/arrow-down.png);height:7px;content:'';position:absolute;right:1.5rem;top:2.5rem;width:10px;z-index:1}.esh-catalog-send{background-color:#83D01B;font-size:1rem;transform:translateY(.5rem);padding:.5rem}.esh-catalog-send:hover{background-color:#4a760f;transition:all .35s}.esh-catalog-items{margin-top:1rem}.esh-catalog-item{text-align:center;margin-bottom:1.5rem;width:33%}@media screen and (max-width:1024px){.esh-catalog-item{width:50%}}@media screen and (max-width:768px){.esh-orders_detail-item--middle{line-height:1rem}.esh-catalog-item{width:100%}}.esh-catalog-thumbnail{max-width:370px;width:100%}.esh-catalog-button{background-color:#83D01B;border:none;font-size:1rem;height:3rem;margin-top:1rem;width:80%}.esh-catalog-button:hover{background-color:#4a760f;transition:all .35s}.esh-catalog-name{font-size:1rem;font-weight:300;margin-top:.5rem;text-align:center;text-transform:uppercase}.esh-catalog-price{text-align:center;font-weight:900;font-size:28px}.esh-catalog-price::before{content:'$'}.esh-basket-titles{padding-bottom:1rem;padding-top:2rem}.esh-basket-titles--clean{padding-bottom:0;padding-top:0}.esh-basket-title{text-transform:uppercase}.esh-basket-items--border{border-bottom:1px solid #EEE;padding:.5rem 0}.esh-basket-items--border:last-of-type{border-color:transparent}.esh-basket-item{font-size:1rem;font-weight:300}.esh-basket-item--middle{line-height:8rem}@media screen and (max-width:1024px){.esh-basket-item--middle{line-height:1rem}}.esh-basket-item--mark{color:#00A69C}.esh-basket-checkout,.esh-basketstatus-badge{color:#FFF;text-align:center;transition:all .35s}.esh-basket-image{height:8rem}.esh-basket-input{line-height:1rem;width:100%}.esh-basket-checkout{border:none;border-radius:0;background-color:#83D01B;display:inline-block;font-size:1rem;font-weight:400;margin-top:1rem;padding:1rem 1.5rem;text-transform:uppercase}.esh-basket-checkout:hover{background-color:#4a760f;transition:all .35s}.esh-basketstatus{cursor:pointer;float:right;position:relative;transition:all .35s}.esh-basketstatus.is-disabled{opacity:.5;pointer-events:none}.esh-basketstatus-image{height:36px;margin-top:.5rem}.esh-basketstatus-badge{background-color:#83D01B;border-radius:50%;display:block;height:1.5rem;left:50%;position:absolute;top:0;transform:translateX(-38%);width:1.5rem}.esh-basketstatus:hover .esh-basketstatus-badge{background-color:transparent;color:#75b918;transition:all .35s} \ No newline at end of file diff --git a/src/Web/WebMVC/wwwroot/css/shared/components/pager/pager.css b/src/Web/WebMVC/wwwroot/css/shared/components/pager/pager.css index e6b19cdd4..e8a69895e 100644 --- a/src/Web/WebMVC/wwwroot/css/shared/components/pager/pager.css +++ b/src/Web/WebMVC/wwwroot/css/shared/components/pager/pager.css @@ -12,7 +12,8 @@ } .esh-pager-item--navigable.is-disabled { - display: none; + opacity: 0; + pointer-events: none; } .esh-pager-item--navigable:hover { diff --git a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/components/pager/pager.html b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/components/pager/pager.html index e2d938d05..68996a928 100644 --- a/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/components/pager/pager.html +++ b/src/Web/WebSPA/eShopOnContainers.WebSPA/Client/modules/shared/components/pager/pager.html @@ -4,7 +4,7 @@