@@ -1,23 +1,24 @@ | |||
<ion-content> | |||
<div class="content-container"> | |||
<section class="action-buttons"> | |||
<div class="nav"> | |||
<button (click)="back()"> <ion-icon name="chevron-back-outline"></ion-icon> <span> BACK </span> </button> | |||
</div> | |||
<header> {{ matchDay.matchDetails.home.name }} v/s {{ matchDay.matchDetails.away.name }} <br> <span> {{ matchDay.staduim.name }} Stadium </span> </header> | |||
<div class="action"> | |||
<button> <ion-icon name="share-social-outline"></ion-icon> </button> | |||
</div> | |||
</section> | |||
<section class="action-buttons"> | |||
<div class="nav"> | |||
<button (click)="back()"> <ion-icon name="chevron-back-outline"></ion-icon> <span> BACK </span> </button> | |||
</div> | |||
<header> {{ matchDay.matchDetails.home.name }} v/s {{ matchDay.matchDetails.away.name }} <br> | |||
<span> {{ matchDay.staduim.name }} Stadium, <br> {{ getEventDateTime(matchDay.dateTime) }} </span> </header> | |||
<div class="action"> | |||
<button> <ion-icon name="share-social-outline"></ion-icon> </button> | |||
</div> | |||
</section> | |||
<div class="content-container" [ngClass]="{'push-bottom' : selectedSeats.length > 0}"> | |||
<section class="upfold"> | |||
<img class="bg-img" [src]="matchDay.staduim.sideView"> | |||
<!-- <img class="bg-img" [src]="matchDay.staduim.sideView"> --> | |||
<ul class="quadrants"> | |||
<li *ngFor="let stands of matchDay.seatsAvailable" | |||
[ngClass]="{'active' : selectedStand === stands.stand}" | |||
(click)="selectedStand = stands.stand"> | |||
<li *ngFor="let stands of matchDay.seatsAvailable; let i = index;" | |||
[ngClass]="{'active' : selectedStand === i}" | |||
(click)="selectedStand = i"> | |||
<label> {{ stands.stand }} Stand </label> | |||
</li> | |||
</ul> | |||
@@ -35,19 +36,32 @@ | |||
</header> | |||
<ul class="stand-list"> | |||
<li *ngFor="let stands of matchDay.seatsAvailable" | |||
[ngClass]="{'active' : selectedStand === stands.stand}" | |||
(click)="selectedStand = stands.stand"> | |||
<li *ngFor="let stands of matchDay.seatsAvailable; let i = index;" | |||
[ngClass]="{'active' : selectedStand === i}" | |||
(click)="selectedStand = i"> | |||
<label> | |||
{{ getFirstChar(stands.stand) }} | |||
</label> | |||
<p> | |||
{{ stands.seats.length }} seats remaining, <br> starts from <strong> ₹ {{ stands.seats[0].price }} </strong> | |||
<span *ngIf="stands.seats.length > 0"> {{ stands.seats.length }} </span> | |||
<span *ngIf="stands.seats.length === 0"> {{ stands.seats.length }} </span> | |||
seats remaining, <br> <span *ngIf="stands.seats.length > 0"> starts from <strong> ₹ {{ stands.seats[0].price }} </strong> </span> | |||
</p> | |||
<div class="count-action" *ngIf="selectedStand === i"> | |||
<button (click)="removeSeat()" | |||
[ngClass]="{'active' : selectedSeats.length > 0}"> - </button> | |||
<span class="count"> {{ selectedSeats.length }} </span> | |||
<button (click)="addSeat()" | |||
[ngClass]="{'active' : stands.seats.length > 0}"> + </button> | |||
</div> | |||
</li> | |||
</ul> | |||
</section> | |||
</div> | |||
<section class="checkout-data" *ngIf="selectedSeats.length > 0"> | |||
<p> <span> Total: </span> ₹ {{ getTotalAmount() }} </p> | |||
<button class="checkout-button"> Proceed to Payment </button> | |||
</section> | |||
</ion-content> |
@@ -1,20 +1,24 @@ | |||
$dark-blue: #161e2d; | |||
$blue-grey: #949599; | |||
$sea-blue: #2ea9f5; | |||
$green: #01b868; | |||
ion-content { | |||
--background: transparent; | |||
background-color: $dark-blue; | |||
} | |||
.push-bottom { | |||
margin-bottom: 50px; | |||
} | |||
.action-buttons { | |||
display: flex; | |||
justify-content: space-between; | |||
align-items: flex-start; | |||
padding: 0 3% 0 0%; | |||
height: 50px; | |||
position: sticky; | |||
position: -webkit-sticky; | |||
height: 70px; | |||
position: fixed; | |||
left: 0; | |||
top: 0; | |||
background-color: lighten($blue-grey, 35%); | |||
@@ -39,7 +43,6 @@ ion-content { | |||
} | |||
span { | |||
font-size: 0.9rem; | |||
font-size: 14px; | |||
} | |||
} | |||
@@ -56,7 +59,7 @@ ion-content { | |||
text-overflow: ellipsis; | |||
span { | |||
font-weight: 400; | |||
font-weight: 500; | |||
color: $blue-grey; | |||
font-size: 12px; | |||
} | |||
@@ -92,9 +95,10 @@ ion-content { | |||
position: sticky; | |||
position: -webkit-sticky; | |||
left: 0; | |||
top: 50px; | |||
top: 70px; | |||
z-index: 0; | |||
overflow: hidden; | |||
margin-bottom: 50px; | |||
.quadrants { | |||
position: absolute; | |||
@@ -274,7 +278,7 @@ ion-content { | |||
position: relative; | |||
background-color: white; | |||
z-index: 1; | |||
padding: 5px 0% 10px 0%; | |||
padding: 5px 0% 15px 0%; | |||
border-top-left-radius: 7px; | |||
border-top-right-radius: 7px; | |||
overflow: hidden; | |||
@@ -297,14 +301,25 @@ ion-content { | |||
.stand-list { | |||
list-style: none; | |||
padding: 0 5%; | |||
padding: 0; | |||
margin: 10px 0px 0px 0px; | |||
li { | |||
display: flex; | |||
align-items: center; | |||
justify-content: flex-start; | |||
padding: 10px 0; | |||
padding: 10px 15px; | |||
border-radius: 7px; | |||
width: 95%; | |||
margin: 0 auto; | |||
&.active { | |||
background-color: $dark-blue; | |||
p { | |||
color: white; | |||
} | |||
} | |||
} | |||
label { | |||
@@ -320,7 +335,7 @@ ion-content { | |||
letter-spacing: 1px; | |||
background-color: $sea-blue; | |||
font-size: 0.8rem; | |||
margin-right: 20px; | |||
margin-right: 15px; | |||
} | |||
p { | |||
@@ -328,5 +343,85 @@ ion-content { | |||
color: $blue-grey; | |||
line-height: 1.5; | |||
font-size: 1rem; | |||
width: calc(100% - 30px - 100px); | |||
} | |||
.count-action { | |||
width: 100px; | |||
display: flex; | |||
align-items: center; | |||
justify-content: space-between; | |||
background-color: rgba($blue-grey, 0.1); | |||
border-radius: 30px; | |||
padding: 5px; | |||
button { | |||
width: 25px; | |||
height: 25px; | |||
border-radius: 50%; | |||
font-size: 16px; | |||
border: 1px solid $blue-grey; | |||
background-color: rgba($blue-grey, 0.1); | |||
border-radius: 50%; | |||
display: flex; | |||
align-items: center; | |||
justify-content: center; | |||
color: $blue-grey; | |||
opacity: 0; | |||
pointer-events: none; | |||
transition: opacity 0.3s; | |||
&.active { | |||
pointer-events: all; | |||
opacity: 1; | |||
} | |||
} | |||
.count { | |||
color: white; | |||
font-weight: 700; | |||
font-size: 20px; | |||
} | |||
} | |||
} | |||
.checkout-data { | |||
position: fixed; | |||
left: 0; | |||
bottom: 0; | |||
z-index: 2; | |||
background-color: lighten($blue-grey, 35%); | |||
padding: 0 10px 0 5%; | |||
box-shadow: 0px 0px 10px $blue-grey; | |||
display: flex; | |||
align-items: center; | |||
justify-content: space-between; | |||
width: 100%; | |||
height: 60px; | |||
border-top-left-radius: 7px; | |||
border-top-right-radius: 7px; | |||
p { | |||
display: flex; | |||
align-items: center; | |||
justify-content: flex-start; | |||
font-size: 20px; | |||
font-weight: 400; | |||
color: darken($blue-grey, 20%); | |||
span { | |||
font-weight: 500; | |||
margin-right: 10px; | |||
} | |||
} | |||
button { | |||
background-color: $green; | |||
color: white; | |||
font-size: 14px; | |||
border-radius: 5px; | |||
height: 40px; | |||
padding: 0 10px; | |||
box-shadow: 0px 0px 5px $blue-grey; | |||
} | |||
} |
@@ -1,6 +1,7 @@ | |||
import { Component, OnInit } from '@angular/core'; | |||
import { ActivatedRoute } from '@angular/router'; | |||
import { Location } from '@angular/common'; | |||
import * as moment from 'moment'; | |||
@Component({ | |||
selector: 'app-booking-details', | |||
@@ -9,7 +10,11 @@ import { Location } from '@angular/common'; | |||
}) | |||
export class BookingDetailsPage implements OnInit { | |||
matchDay: any; | |||
selectedStand: string = ''; | |||
selectedStand: number; | |||
selectedSeats: Array<{ | |||
id: string, | |||
price: string, | |||
}> = []; | |||
constructor( | |||
private route: ActivatedRoute, | |||
@@ -29,4 +34,31 @@ export class BookingDetailsPage implements OnInit { | |||
return text.charAt(0) | |||
} | |||
getEventDateTime(dateTime: Date) { | |||
return moment(dateTime).format('ddd, MMM DD YYYY hh:mm a'); | |||
} | |||
addSeat() { | |||
let seats: Array<any> = this.matchDay.seatsAvailable[this.selectedStand].seats; | |||
this.selectedSeats.push(seats.pop()); | |||
} | |||
removeSeat() { | |||
let seats: Array<any> = this.matchDay.seatsAvailable[this.selectedStand].seats; | |||
seats.push(this.selectedSeats.pop()); | |||
} | |||
getTotalAmount() { | |||
let total = 0; | |||
this.selectedSeats.forEach((seat) => { | |||
total += Number(seat.price) | |||
}); | |||
return total; | |||
} | |||
} |
@@ -114,7 +114,7 @@ export class BookingPage implements OnInit { | |||
let price = faker.commerce.price(); | |||
let randomNumber = Math.random() * (4 - 0) + 0; | |||
let randomNumber = Math.random() * (15 - 0) + 0; | |||
for (let k = 0; k < randomNumber; k += 1) { | |||
this.bookingSeatsData[i].seatsAvailable[j].seats.push({ | |||