@@ -1,87 +1,120 @@ | |||||
<div class="container"> | |||||
<div class="container" *ngIf="playerDetails"> | |||||
<section class="player-primary-data"> | <section class="player-primary-data"> | ||||
<section class="details"> | |||||
<div class="teams-holder"> | |||||
<figure> | |||||
<img src="assets/home-team/KXIP.svg" alt=""> | |||||
</figure> | |||||
<figure> | |||||
<img src="assets/home-team/india.png" alt=""> | |||||
</figure> | |||||
</div> | |||||
<h2 class="name"> KL Rahul </h2> | |||||
<section class="details"> | |||||
<h2 class="name"> {{ playerDetails.name }} </h2> | |||||
<div class="role"> <ion-icon name="shirt-outline"></ion-icon> Batsman, <br> Wicket Keeper </div> | |||||
<div class="role"> <ion-icon name="shirt-outline"></ion-icon> {{ playerDetails.player_skill.text }} </div> | |||||
</section> | </section> | ||||
<figure class="player-image"> | |||||
<img src="assets/home-team/player.png" alt=""> | |||||
</figure> | |||||
</section> | </section> | ||||
<ng-container *ngFor="let stat of playerDetails.stats.format;let i = index;"> | |||||
<ng-container *ngIf="i === 2"> | |||||
<header class="stats-header"> | |||||
<h4> {{ stat.comp_type }} </h4> | |||||
</header> | |||||
<ul class="statistics"> | |||||
<li> | |||||
<label> Age </label> | |||||
<h5> 26 </h5> | |||||
</li> | |||||
<li> | |||||
<label> Games </label> | |||||
<h5> 64 </h5> | |||||
</li> | |||||
<li> | |||||
<label> Centuries </label> | |||||
<h5> 18 </h5> | |||||
</li> | |||||
</ul> | |||||
<section class="news"> | |||||
<header> | |||||
<span></span> <h4> Now discussing </h4> | |||||
</header> | |||||
<ul> | |||||
<li> | |||||
<label> 30 <span> Jan </span> </label> | |||||
<p> | |||||
KL Rahul wins the player of the season 2018 confirms BCCI | |||||
</p> | |||||
<button class="share-button"> <ion-icon name="share-social-outline"></ion-icon> </button> | |||||
</li> | |||||
<li> | |||||
<label> 22 <span> Oct </span> </label> | |||||
<p> | |||||
KL Rahul planning to head back to RCB | |||||
</p> | |||||
<button class="share-button"> <ion-icon name="share-social-outline"></ion-icon> </button> | |||||
</li> | |||||
</ul> | |||||
</section> | |||||
<ul class="statistics" *ngIf="stat.overall.batting_record"> | |||||
<li> | |||||
<label> 100s </label> | |||||
<h5> {{ stat.overall.batting_record.hundreds }} </h5> | |||||
</li> | |||||
<li> | |||||
<label> 50s </label> | |||||
<h5> {{ stat.overall.batting_record.fifties }} </h5> | |||||
</li> | |||||
<li> | |||||
<label> SR </label> | |||||
<h5> {{ stat.overall.batting_record.strike_rate }} </h5> | |||||
</li> | |||||
</ul> | |||||
<ul class="statistics" *ngIf="stat.overall.bowling_record"> | |||||
<li> | |||||
<label> Wickets </label> | |||||
<h5> {{ stat.overall.bowling_record.wickets }} </h5> | |||||
</li> | |||||
<li> | |||||
<label> Maidens </label> | |||||
<h5> {{ stat.overall.bowling_record.wickets }} </h5> | |||||
</li> | |||||
<li> | |||||
<label> Economy </label> | |||||
<h5> {{ stat.overall.bowling_record.economy_rate }} </h5> | |||||
</li> | |||||
</ul> | |||||
</ng-container> | |||||
</ng-container> | |||||
<section class="about"> | <section class="about"> | ||||
<header> ABOUT </header> | <header> ABOUT </header> | ||||
<ul> | <ul> | ||||
<li> | <li> | ||||
<label> Full name </label> | <label> Full name </label> | ||||
<p> KL Rahul </p> | |||||
<p> {{ playerDetails.fullname }} </p> | |||||
</li> | </li> | ||||
<li> | <li> | ||||
<label> Age </label> | |||||
<p> 26 </p> | |||||
<label> Nick Name </label> | |||||
<p> {{ playerDetails.nick_name }} </p> | |||||
</li> | </li> | ||||
<li> | <li> | ||||
<label> Native </label> | |||||
<p> Mangaluru </p> | |||||
<label> DOB </label> | |||||
<p> {{ playerDetails.dob }} </p> | |||||
</li> | </li> | ||||
<li> | <li> | ||||
<label> Avg. Run rate </label> | |||||
<p> 43.64 </p> | |||||
<label> POB </label> | |||||
<p> {{ playerDetails.place_birth }} </p> | |||||
</li> | |||||
<li *ngIf="playerDetails.writeup"> | |||||
<label> Description </label> | |||||
<p [innerHTML]="playerDetails.writeup"></p> | |||||
</li> | </li> | ||||
</ul> | </ul> | ||||
</section> | </section> | ||||
<ng-container *ngFor="let stat of playerDetails.stats.format;let i = index;"> | |||||
<ng-container *ngIf="i !== 2"> | |||||
<header class="stats-header"> | |||||
<h4> {{ stat.comp_type }} </h4> | |||||
</header> | |||||
<ul class="statistics" *ngIf="stat.overall.batting_record"> | |||||
<li> | |||||
<label> 100s </label> | |||||
<h5> {{ stat.overall.batting_record.hundreds }} </h5> | |||||
</li> | |||||
<li> | |||||
<label> 50s </label> | |||||
<h5> {{ stat.overall.batting_record.fifties }} </h5> | |||||
</li> | |||||
<li> | |||||
<label> SR </label> | |||||
<h5> {{ stat.overall.batting_record.strike_rate }} </h5> | |||||
</li> | |||||
</ul> | |||||
<ul class="statistics" *ngIf="stat.overall.bowling_record"> | |||||
<li> | |||||
<label> Wickets </label> | |||||
<h5> {{ stat.overall.bowling_record.wickets }} </h5> | |||||
</li> | |||||
<li> | |||||
<label> Maidens </label> | |||||
<h5> {{ stat.overall.bowling_record.wickets }} </h5> | |||||
</li> | |||||
<li> | |||||
<label> Economy </label> | |||||
<h5> {{ stat.overall.bowling_record.economy_rate }} </h5> | |||||
</li> | |||||
</ul> | |||||
</ng-container> | |||||
</ng-container> | |||||
</div> | </div> |
@@ -3,6 +3,7 @@ | |||||
.container { | .container { | ||||
background: linear-gradient(45deg, darken($brand-blue, 15%), darken($brand-blue, 20%) 80%); | background: linear-gradient(45deg, darken($brand-blue, 15%), darken($brand-blue, 20%) 80%); | ||||
padding: 40px 0; | padding: 40px 0; | ||||
width: 100vw; | |||||
} | } | ||||
.player-primary-data { | .player-primary-data { | ||||
@@ -10,57 +11,12 @@ | |||||
width: 95%; | width: 95%; | ||||
padding-left: 5%; | padding-left: 5%; | ||||
position: relative; | position: relative; | ||||
&::before { | |||||
content: ''; | |||||
position: absolute; | |||||
left: 0; | |||||
top: 0; | |||||
width: 100%; | |||||
height: 100%; | |||||
background-image: url('../../../assets/home-team/KXIP-lion-white.svg'); | |||||
background-size: contain; | |||||
background-position: center; | |||||
background-repeat: no-repeat; | |||||
opacity: 0.1; | |||||
} | |||||
.details { | .details { | ||||
width: 50%; | |||||
width: 100%; | |||||
position: relative; | position: relative; | ||||
} | } | ||||
.teams-holder { | |||||
position: relative; | |||||
z-index: 0; | |||||
display: flex; | |||||
justify-content: flex-start; | |||||
figure { | |||||
width: 50px; | |||||
height: 50px; | |||||
border-radius: 50%; | |||||
position: relative; | |||||
z-index: 1; | |||||
margin: 0; | |||||
display: block; | |||||
overflow: hidden; | |||||
box-shadow: 0px 0px 5px darken($brand-blue, 20%); | |||||
&:nth-child(2) { | |||||
z-index: 0; | |||||
transform: translateX(-10px); | |||||
} | |||||
img { | |||||
width: 100%; | |||||
height: 100%; | |||||
display: block; | |||||
transform: scale(1.5); | |||||
} | |||||
} | |||||
} | |||||
.name { | .name { | ||||
font-size: 2rem; | font-size: 2rem; | ||||
font-weight: 700; | font-weight: 700; | ||||
@@ -86,19 +42,21 @@ | |||||
color: lighten($brand-red, 15%); | color: lighten($brand-red, 15%); | ||||
} | } | ||||
} | } | ||||
} | |||||
.player-image { | |||||
width: 50%; | |||||
display: block; | |||||
height: 40vh; | |||||
img { | |||||
display: block; | |||||
object-fit: contain; | |||||
width: 100%; | |||||
height: 100%; | |||||
object-position: bottom; | |||||
} | |||||
.stats-header { | |||||
display: flex; | |||||
align-items: center; | |||||
justify-content: flex-start; | |||||
width: 100%; | |||||
padding: 0 5%; | |||||
h4 { | |||||
color: $green; | |||||
font-size: 1.5rem; | |||||
font-weight: 500; | |||||
letter-spacing: 0.5px; | |||||
margin: 0; | |||||
} | } | ||||
} | } | ||||
@@ -107,9 +65,8 @@ | |||||
width: 100%; | width: 100%; | ||||
padding: 0 5%; | padding: 0 5%; | ||||
list-style: none; | list-style: none; | ||||
margin: 0 auto -30px auto; | |||||
margin: 20px auto; | |||||
justify-content: space-between; | justify-content: space-between; | ||||
transform: translateY(-50px); | |||||
z-index: 1; | z-index: 1; | ||||
position: relative; | position: relative; | ||||
background-color: rgba(darken($brand-blue, 20%), 0.8); | background-color: rgba(darken($brand-blue, 20%), 0.8); | ||||
@@ -120,11 +77,8 @@ | |||||
height: 27vw; | height: 27vw; | ||||
background-color: rgba($brand-blue, 0.8); | background-color: rgba($brand-blue, 0.8); | ||||
border: 1px solid rgba($blue-grey, 0.3); | border: 1px solid rgba($blue-grey, 0.3); | ||||
display: flex; | |||||
border-radius: 10px; | border-radius: 10px; | ||||
color: white; | color: white; | ||||
align-items: flex-end; | |||||
justify-content: space-between; | |||||
padding: 10px; | padding: 10px; | ||||
overflow: hidden; | overflow: hidden; | ||||
position: relative; | position: relative; | ||||
@@ -143,115 +97,18 @@ | |||||
label { | label { | ||||
font-weight: 500; | font-weight: 500; | ||||
font-size: 0.8rem; | font-size: 0.8rem; | ||||
align-self: flex-start; | |||||
width: 50%; | |||||
overflow: visible; | |||||
white-space: nowrap; | |||||
position: relative; | |||||
position: absolute; | |||||
top: 10px; | |||||
left: 10px; | |||||
} | } | ||||
h5 { | h5 { | ||||
width: 50%; | |||||
white-space: nowrap; | |||||
overflow: visible; | |||||
margin: 0; | margin: 0; | ||||
font-weight: 700; | font-weight: 700; | ||||
font-size: 1.8rem; | |||||
align-self: flex-end; | |||||
text-align: right; | |||||
position: relative; | |||||
} | |||||
} | |||||
.news { | |||||
width: 90%; | |||||
margin: 0 auto 20px auto; | |||||
header { | |||||
display: flex; | |||||
align-items: center; | |||||
justify-content: flex-start; | |||||
h4 { | |||||
color: lighten($green, 10%); | |||||
font-size: 0.8rem; | |||||
font-weight: 500; | |||||
letter-spacing: 0.5px; | |||||
margin: 0; | |||||
} | |||||
span { | |||||
margin-right: 10px; | |||||
border: 7px solid lighten($green, 10%); | |||||
border-radius: 50%; | |||||
height: 25px; | |||||
width: 25px; | |||||
background-color: darken($brand-blue, 20%); | |||||
} | |||||
} | |||||
ul { | |||||
list-style: none; | |||||
padding: 0; | |||||
background-color: darken($brand-blue, 10%); | |||||
box-shadow: 0px 0px 10px darken($brand-blue, 20%); | |||||
border-radius: 10px; | |||||
overflow: hidden; | |||||
li { | |||||
width: 90%; | |||||
margin: 0 auto; | |||||
padding: 15px 0px; | |||||
display: flex; | |||||
align-items: center; | |||||
justify-content: space-between; | |||||
border-bottom: 1px solid rgba($blue-grey, 0.2); | |||||
&:last-child { | |||||
border-bottom: none; | |||||
} | |||||
} | |||||
label { | |||||
width: 40px; | |||||
text-align: center; | |||||
color: white; | |||||
font-size: 0.8rem; | |||||
display: block; | |||||
line-height: 1.3; | |||||
span { | |||||
color: lighten($brand-blue, 10%); | |||||
font-size: 0.8rem; | |||||
display: block; | |||||
} | |||||
} | |||||
p { | |||||
width: calc(100% - 100px); | |||||
font-size: 0.8rem; | |||||
color: white; | |||||
font-weight: 500; | |||||
line-height: 1.5; | |||||
margin: 0; | |||||
} | |||||
.share-button { | |||||
width: 30px; | |||||
height: 30px; | |||||
border: 1px solid lighten($brand-blue, 10%); | |||||
background-color: rgba(lighten($brand-blue, 10%), 0.2); | |||||
border-radius: 50%; | |||||
display: flex; | |||||
align-items: center; | |||||
justify-content: center; | |||||
margin-left: 10px; | |||||
ion-icon { | |||||
color: lighten($brand-blue, 10%); | |||||
font-size: 15px; | |||||
} | |||||
} | |||||
font-size: 1.5rem; | |||||
position: absolute; | |||||
right: 10px; | |||||
bottom: 10px; | |||||
} | } | ||||
} | } | ||||
@@ -261,7 +118,7 @@ | |||||
border-radius: 10px; | border-radius: 10px; | ||||
overflow: hidden; | overflow: hidden; | ||||
width: 90%; | width: 90%; | ||||
margin: 0 auto; | |||||
margin: 0 auto 40px auto; | |||||
padding: 0px 0px 5px 0px; | padding: 0px 0px 5px 0px; | ||||
header { | header { | ||||
@@ -269,7 +126,7 @@ | |||||
font-weight: 500; | font-weight: 500; | ||||
color: white; | color: white; | ||||
padding: 15px 5%; | padding: 15px 5%; | ||||
border-bottom: 1px solid rgba($blue-grey, 0.2); | |||||
border-bottom: 1px solid lighten($brand-blue, 5%); | |||||
margin: 0; | margin: 0; | ||||
} | } | ||||
@@ -281,12 +138,9 @@ | |||||
} | } | ||||
li { | li { | ||||
padding: 10px 5px; | |||||
display: flex; | |||||
padding: 20px 10px; | |||||
width: 100%; | width: 100%; | ||||
align-items: center; | |||||
justify-content: space-between; | |||||
border-bottom: 1px solid rgba($blue-grey, 0.2); | |||||
border-bottom: 1px solid lighten($brand-blue, 5%); | |||||
text-align: left; | text-align: left; | ||||
&:last-child { | &:last-child { | ||||
@@ -295,15 +149,15 @@ | |||||
} | } | ||||
label { | label { | ||||
color: lighten($brand-blue, 10%); | |||||
font-size: 0.7rem; | |||||
color: lighten($brand-blue, 20%); | |||||
font-size: 1rem; | |||||
display: block; | display: block; | ||||
line-height: 1.3; | line-height: 1.3; | ||||
width: 100px; | |||||
display: block; | |||||
margin-bottom: 10px; | |||||
} | } | ||||
p { | p { | ||||
width: calc(100% - 100px); | |||||
font-size: 0.9rem; | font-size: 0.9rem; | ||||
color: white; | color: white; | ||||
font-weight: 500; | font-weight: 500; | ||||
@@ -1,4 +1,110 @@ | |||||
import { Component, OnInit } from '@angular/core'; | |||||
import { Component, OnInit, Input } from '@angular/core'; | |||||
import { MatchService } from '../../services/match.service'; | |||||
import { ToastService } from '../../services/toast.service'; | |||||
interface HighestScoreDetails { | |||||
score: { | |||||
is_no: string; | |||||
balls_faced: string; | |||||
text: string; | |||||
}; | |||||
match_id: string; | |||||
match_date: string; | |||||
vs: IdentifiableData; | |||||
} | |||||
interface BattingRecord { | |||||
matches: string; | |||||
innings: string; | |||||
not_outs: string; | |||||
runs: string; | |||||
balls_faced: string; | |||||
hundreds: string; | |||||
fifties: string; | |||||
fours: string; | |||||
sixes: string; | |||||
average: string; | |||||
strike_rate: string; | |||||
hs: HighestScoreDetails; | |||||
} | |||||
interface BestBowlingDetails { | |||||
figure: { | |||||
wickets: string; | |||||
runs_given: string; | |||||
text: string; | |||||
}; | |||||
match_id: string; | |||||
match_date: string; | |||||
vs: HighestScoreDetails; | |||||
} | |||||
interface BowlingRecord { | |||||
matches: string; | |||||
innings: string; | |||||
overs: string; | |||||
balls_bowled: string; | |||||
maidens: string; | |||||
runs: string; | |||||
wickets: string; | |||||
average: string; | |||||
strike_rate: string; | |||||
economy_rate: string; | |||||
four_wk_hauls: string; | |||||
five_wk_hauls: string; | |||||
best_bowling: BestBowlingDetails; | |||||
} | |||||
interface FieldingRecord { | |||||
catches: string; | |||||
stumpings: string; | |||||
run_outs: string; | |||||
} | |||||
interface StatsForFormat { | |||||
comp_type_id: string; | |||||
comp_type: string; | |||||
rankings: { | |||||
bat: string; | |||||
bowl: string; | |||||
}; | |||||
overall: { | |||||
batting_record: BattingRecord; | |||||
bowling_record: BowlingRecord; | |||||
fielding_record: FieldingRecord; | |||||
} | |||||
} | |||||
interface RawPlayerTeamDetails { | |||||
id: string; | |||||
active: string; | |||||
is_primary: string; | |||||
is_international: string; | |||||
text: string; | |||||
} | |||||
interface RawPlayerProfile { | |||||
player_id: string; | |||||
last_updated: string; | |||||
fullname: string; | |||||
name: string; | |||||
dob: string; | |||||
date_of_death: string; | |||||
place_birth: string; | |||||
nick_name: string; | |||||
majorteams: { | |||||
team: Array<RawPlayerTeamDetails>; | |||||
}; | |||||
stats: { | |||||
format: Array<StatsForFormat>; | |||||
}; | |||||
} | |||||
export interface RawPlayerData { | |||||
profile: RawPlayerProfile; | |||||
} | |||||
@Component({ | @Component({ | ||||
selector: 'app-player-details', | selector: 'app-player-details', | ||||
@@ -6,9 +112,22 @@ import { Component, OnInit } from '@angular/core'; | |||||
styleUrls: ['./player-details.component.scss'], | styleUrls: ['./player-details.component.scss'], | ||||
}) | }) | ||||
export class PlayerDetailsComponent implements OnInit { | export class PlayerDetailsComponent implements OnInit { | ||||
@Input() playerId: string; | |||||
playerDetails: RawPlayerData; | |||||
constructor() { } | |||||
constructor( | |||||
private matchService: MatchService, | |||||
private toastService: ToastService | |||||
) { } | |||||
ngOnInit() {} | |||||
ngOnInit() { | |||||
this.matchService.getPlayerDetails(this.playerId).then((data: RawPlayerData) => { | |||||
console.log(data); | |||||
this.playerDetails = data; | |||||
}, (err) => { | |||||
console.log(err); | |||||
this.toastService.presentToastWithOptions("Failed to fetch player details", "danger"); | |||||
}); | |||||
} | |||||
} | } |
@@ -278,7 +278,7 @@ export class LivePage implements OnInit { | |||||
} | } | ||||
showMatchDetails() { | showMatchDetails() { | ||||
this.router.navigate(['/match-details']); | |||||
this.router.navigate(['/match-details', { match_id: this.currentMatch.Matchdetail.Match.Id }]); | |||||
} | } | ||||
} | } |
@@ -1,11 +1,11 @@ | |||||
<ion-content *ngIf="matchStats" [scrollEvents]="true"> | |||||
<ion-content *ngIf="currentMatch"> | |||||
<section class="header-with-action-buttons"> | <section class="header-with-action-buttons"> | ||||
<div class="nav"> | <div class="nav"> | ||||
<button (click)="back()"> <ion-icon name="chevron-back-outline"></ion-icon> <span> BACK </span> </button> | <button (click)="back()"> <ion-icon name="chevron-back-outline"></ion-icon> <span> BACK </span> </button> | ||||
</div> | </div> | ||||
<header> {{ matchStats.homeTeam.teamName }} v/s {{ matchStats.awayTeam.teamName }} <br> | |||||
<span> Live from {{ matchStats.stadium }} Stadium </span> </header> | |||||
<header> {{ currentMatch.Teams[currentMatch.Matchdetail.Team_Home].Name_Short }} v/s {{ currentMatch.Teams[currentMatch.Matchdetail.Team_Away].Name_Short }} <br> | |||||
<span> {{ currentMatch.Matchdetail.Venue.Name }} </span> </header> | |||||
<div class="action"> | <div class="action"> | ||||
<button> <ion-icon name="share-social"></ion-icon> </button> | <button> <ion-icon name="share-social"></ion-icon> </button> | ||||
</div> | </div> | ||||
@@ -20,7 +20,8 @@ | |||||
<div class="score-container" *ngIf="selectedSegment === 'SCORE'"> | <div class="score-container" *ngIf="selectedSegment === 'SCORE'"> | ||||
<section class="score-card"> | |||||
<!-- <section class="score-card"> | |||||
<header> | <header> | ||||
<img [src]="matchStats.awayTeam.teamLogo"> <h5> {{ matchStats.awayTeam.teamName }} </h5> | <img [src]="matchStats.awayTeam.teamLogo"> <h5> {{ matchStats.awayTeam.teamName }} </h5> | ||||
@@ -82,10 +83,10 @@ | |||||
</table> | </table> | ||||
</div> | </div> | ||||
</section> | |||||
</section> --> | |||||
<section class="score-card"> | |||||
<!-- <section class="score-card"> | |||||
<header> | <header> | ||||
<img [src]="matchStats.homeTeam.teamLogo"> <h5> {{ matchStats.homeTeam.teamName }} </h5> | <img [src]="matchStats.homeTeam.teamLogo"> <h5> {{ matchStats.homeTeam.teamName }} </h5> | ||||
@@ -146,7 +147,7 @@ | |||||
</table> | </table> | ||||
</div> | </div> | ||||
</section> | |||||
</section> --> | |||||
</div> | </div> | ||||
@@ -222,23 +223,21 @@ | |||||
</div> | </div> | ||||
<div *ngIf="selectedSegment === 'MATCH'" class="team-selection" [ngClass]="{'active': selectedRoster === 'AWAY', 'live': selectedRoster === 'LIVE', 'change-bg' : selectedRoster !== 'LIVE' }"> | <div *ngIf="selectedSegment === 'MATCH'" class="team-selection" [ngClass]="{'active': selectedRoster === 'AWAY', 'live': selectedRoster === 'LIVE', 'change-bg' : selectedRoster !== 'LIVE' }"> | ||||
<button (click)="selectedRoster = 'HOME'"> {{ matchData.home.name }} </button> | |||||
<button (click)="selectedRoster = 'HOME'"> {{ currentMatch.Teams[currentMatch.Matchdetail.Team_Home].Name_Short }} </button> | |||||
<button class="live" (click)="selectedRoster = 'LIVE'"> <span></span> </button> | <button class="live" (click)="selectedRoster = 'LIVE'"> <span></span> </button> | ||||
<button (click)="selectedRoster = 'AWAY'"> {{ matchData.away.name }} </button> | |||||
<button (click)="selectedRoster = 'AWAY'"> {{ currentMatch.Teams[currentMatch.Matchdetail.Team_Away].Name_Short }} </button> | |||||
</div> | </div> | ||||
<section class="player-list" *ngIf="selectedRoster === 'HOME'"> | <section class="player-list" *ngIf="selectedRoster === 'HOME'"> | ||||
<ul> | <ul> | ||||
<li *ngFor="let player of matchData.home.players" (click)="selectPlayerDetails()"> | |||||
<label> {{ player.jersey }} </label> | |||||
<img [src]="player.image" class="player-image"> | |||||
<li *ngFor="let player of getArrayOfPlayers(currentMatch.Teams[currentMatch.Matchdetail.Team_Home].Players)" (click)="selectPlayerDetails(player)"> | |||||
<label> {{ currentMatch.Teams[currentMatch.Matchdetail.Team_Home].Players[player].Position }} </label> | |||||
<div class="details"> | <div class="details"> | ||||
<h4> {{ player.name }} </h4> | |||||
<img *ngIf="player.isCaptain" src="assets/icons/captain-band.png"> | |||||
<img *ngIf="player.isKeeper" src="assets/icons/gloves.png"> | |||||
<img *ngIf="player.isTopScorer" src="assets/icons/orange-cap.png"> | |||||
<img *ngIf="player.role === 'BATSMAN'" src="assets/icons/batsman.png"> | |||||
<img *ngIf="player.role === 'BOWLER'" src="assets/icons/ball.png"> | |||||
<h4> {{ currentMatch.Teams[currentMatch.Matchdetail.Team_Home].Players[player].Name_Full }} </h4> | |||||
<!-- <img *ngIf="currentMatch.Teams[currentMatch.Matchdetail.Team_Home].Players[player].Skill === '4'" src="assets/icons/captain-band.png"> --> | |||||
<img *ngIf="currentMatch.Teams[currentMatch.Matchdetail.Team_Home].Players[player].Skill === '4'" src="assets/icons/gloves.png"> | |||||
<img *ngIf="currentMatch.Teams[currentMatch.Matchdetail.Team_Home].Players[player].Skill === '1'" src="assets/icons/batsman.png"> | |||||
<img *ngIf="currentMatch.Teams[currentMatch.Matchdetail.Team_Home].Players[player].Skill === '2'" src="assets/icons/ball.png"> | |||||
</div> | </div> | ||||
</li> | </li> | ||||
</ul> | </ul> | ||||
@@ -246,30 +245,25 @@ | |||||
<section class="player-list" *ngIf="selectedRoster === 'AWAY'"> | <section class="player-list" *ngIf="selectedRoster === 'AWAY'"> | ||||
<ul> | <ul> | ||||
<li *ngFor="let player of matchData.away.players" (click)="selectPlayerDetails()"> | |||||
<label> {{ player.jersey }} </label> | |||||
<img [src]="player.image" class="player-image"> | |||||
<div class="details"> | |||||
<h4> {{ player.name }} </h4> | |||||
<img *ngIf="player.isCaptain" src="assets/icons/captain-band.png"> | |||||
<img *ngIf="player.isKeeper" src="assets/icons/gloves.png"> | |||||
<img *ngIf="player.isTopScorer" src="assets/icons/orange-cap.png"> | |||||
<img *ngIf="player.role === 'BATSMAN'" src="assets/icons/batsman.png"> | |||||
<img *ngIf="player.role === 'BOWLER'" src="assets/icons/ball.png"> | |||||
</div> | |||||
</li> | |||||
<li *ngFor="let player of getArrayOfPlayers(currentMatch.Teams[currentMatch.Matchdetail.Team_Away].Players)" (click)="selectPlayerDetails(player)"> | |||||
<label> {{ currentMatch.Teams[currentMatch.Matchdetail.Team_Away].Players[player].Position }} </label> | |||||
<div class="details"> | |||||
<h4> {{ currentMatch.Teams[currentMatch.Matchdetail.Team_Away].Players[player].Name_Full }} </h4> | |||||
<!-- <img *ngIf="currentMatch.Teams[currentMatch.Matchdetail.Team_Away].Players[player].Skill === '4'" src="assets/icons/captain-band.png"> --> | |||||
<img *ngIf="currentMatch.Teams[currentMatch.Matchdetail.Team_Away].Players[player].Skill === '4'" src="assets/icons/gloves.png"> | |||||
<img *ngIf="currentMatch.Teams[currentMatch.Matchdetail.Team_Away].Players[player].Skill === '1'" src="assets/icons/batsman.png"> | |||||
<img *ngIf="currentMatch.Teams[currentMatch.Matchdetail.Team_Away].Players[player].Skill === '2'" src="assets/icons/ball.png"> | |||||
</div> | |||||
</li> | |||||
</ul> | </ul> | ||||
</section> | </section> | ||||
</ng-container> | </ng-container> | ||||
<section class="player-details" *ngIf="isPlayerSelected"> | <section class="player-details" *ngIf="isPlayerSelected"> | ||||
<button class="close-button" (click)="isPlayerSelected = false"> | <button class="close-button" (click)="isPlayerSelected = false"> | ||||
<ion-icon name="close-outline"></ion-icon> | <ion-icon name="close-outline"></ion-icon> | ||||
</button> | </button> | ||||
<app-player-details></app-player-details> | |||||
<app-player-details [playerId]="selectedPlayer"></app-player-details> | |||||
</section> | </section> | ||||
</ion-content> | </ion-content> |
@@ -85,14 +85,30 @@ | |||||
} | } | ||||
.player-details { | .player-details { | ||||
position: relative; | |||||
position: fixed; | |||||
z-index: 2; | z-index: 2; | ||||
border-radius: 10px; | border-radius: 10px; | ||||
overflow: hidden; | overflow: hidden; | ||||
box-shadow: 0px 0px 5px darken($brand-blue, 30%); | box-shadow: 0px 0px 5px darken($brand-blue, 30%); | ||||
background-color: darken($brand-blue, 30%); | background-color: darken($brand-blue, 30%); | ||||
left: 0; | left: 0; | ||||
top: 0; | |||||
top: 10%; | |||||
height: 90%; | |||||
overflow: auto; | |||||
transform: translateY(50vh); | |||||
opacity: 0; | |||||
animation: riseUp 0.3s forwards; | |||||
@keyframes riseUp { | |||||
from { | |||||
transform: translateY(50vh); | |||||
opacity: 0; | |||||
} to { | |||||
transform: translateY(0vh); | |||||
opacity: 1; | |||||
} | |||||
} | |||||
.close-button { | .close-button { | ||||
display: block; | display: block; | ||||
@@ -418,6 +434,7 @@ | |||||
list-style: none; | list-style: none; | ||||
margin: 0; | margin: 0; | ||||
padding: 0; | padding: 0; | ||||
padding-bottom: 80px; | |||||
} | } | ||||
li { | li { | ||||
@@ -438,6 +455,7 @@ | |||||
align-items: center; | align-items: center; | ||||
justify-content: center; | justify-content: center; | ||||
border-radius: 50%; | border-radius: 50%; | ||||
margin-right: 10px; | |||||
} | } | ||||
.player-image { | .player-image { | ||||
@@ -461,7 +479,7 @@ | |||||
margin: 0; | margin: 0; | ||||
font-size: 1rem; | font-size: 1rem; | ||||
color: white; | color: white; | ||||
max-width: calc(100% - 80px); | |||||
max-width: calc(100% - 40px); | |||||
white-space: nowrap; | white-space: nowrap; | ||||
text-overflow: ellipsis; | text-overflow: ellipsis; | ||||
overflow: hidden; | overflow: hidden; | ||||
@@ -1,26 +1,9 @@ | |||||
import { Component, OnInit, ViewChild } from '@angular/core'; | |||||
import { Component, OnInit } from '@angular/core'; | |||||
import { Location } from '@angular/common'; | import { Location } from '@angular/common'; | ||||
import { ActivatedRoute } from '@angular/router'; | import { ActivatedRoute } from '@angular/router'; | ||||
import * as faker from 'faker'; | |||||
import { IonContent } from '@ionic/angular'; | |||||
type IPlayer = { | |||||
name: string, | |||||
image: string, | |||||
jersey: number, | |||||
isCaptain?: boolean, | |||||
isKeeper?: boolean, | |||||
isTopScorer?: boolean, | |||||
role: string, | |||||
}; | |||||
type ITeam = { | |||||
name: string, | |||||
image: string, | |||||
players: Array<IPlayer> | |||||
}; | |||||
import { MatchService } from '../services/match.service'; | |||||
import { ToastService } from '../services/toast.service'; | |||||
import { RawMatchData } from '../live/live.page'; | |||||
@Component({ | @Component({ | ||||
selector: 'app-match-details', | selector: 'app-match-details', | ||||
@@ -28,91 +11,46 @@ type ITeam = { | |||||
styleUrls: ['./match-details.page.scss'], | styleUrls: ['./match-details.page.scss'], | ||||
}) | }) | ||||
export class MatchDetailsPage implements OnInit { | export class MatchDetailsPage implements OnInit { | ||||
@ViewChild(IonContent, { static: false }) content: IonContent; | |||||
isPlayerSelected: boolean = false; | isPlayerSelected: boolean = false; | ||||
isHomeTeamSelected: boolean = true; | isHomeTeamSelected: boolean = true; | ||||
selectedSegment: 'MATCH' | 'SCORE' = 'MATCH'; | selectedSegment: 'MATCH' | 'SCORE' = 'MATCH'; | ||||
selectedRoster: 'LIVE' | 'HOME' | 'AWAY' = 'LIVE'; | selectedRoster: 'LIVE' | 'HOME' | 'AWAY' = 'LIVE'; | ||||
roles = ['BOWLER', 'BATSMAN']; | |||||
currentMatch: RawMatchData; | |||||
matchData: { | |||||
home: ITeam, | |||||
away: ITeam, | |||||
}; | |||||
matchStats: { | |||||
stadium: string, | |||||
homeTeam: any, | |||||
awayTeam: any | |||||
}; | |||||
selectedPlayer: string = ''; | |||||
constructor( | constructor( | ||||
private location: Location, | private location: Location, | ||||
private route: ActivatedRoute, | private route: ActivatedRoute, | ||||
private matchService: MatchService, | |||||
private toastService: ToastService | |||||
) { } | ) { } | ||||
scrollToPlayerDetails() { | |||||
let details: any = document.querySelector('.player-details'); | |||||
this.content.scrollToPoint(0, (details.offsetTop - 200), 1000); | |||||
} | |||||
ngOnInit() { | ngOnInit() { | ||||
this.matchStats = JSON.parse(this.route.snapshot.paramMap.get('matchStats')); | |||||
this.matchData = { | |||||
home : { | |||||
name: 'KXIP', | |||||
image: 'assets/home-team/KXIP.svg', | |||||
players: [] | |||||
}, | |||||
away: { | |||||
name: 'MI', | |||||
image: 'assets/logos/mi.svg', | |||||
players: [] | |||||
} | |||||
}; | |||||
let match_id = JSON.parse(this.route.snapshot.paramMap.get('match_id')); | |||||
for (let i = 1; i < 12; i += 1) { | |||||
this.matchData.home.players.push({ | |||||
name: faker.name.findName(), | |||||
image: 'assets/home-team/roster/' + i.toString() + '.png', | |||||
jersey: Math.ceil(Math.random() * (99 - 1)), | |||||
isCaptain: i == 3? true : false, | |||||
isKeeper: i === 5? true : false, | |||||
role: this.roles[Math.floor(Math.random() * (2 - 0))], | |||||
isTopScorer: i === 3? true : false | |||||
}); | |||||
this.matchData.away.players.push({ | |||||
name: faker.name.findName(), | |||||
image: 'assets/mi-roster/' + i.toString() + '.png', | |||||
jersey: Math.ceil(Math.random() * (99 - 1)), | |||||
isCaptain: i == 5? true : false, | |||||
isKeeper: i === 4? true : false, | |||||
role: this.roles[Math.floor(Math.random() * (2 - 0))] | |||||
}); | |||||
} | |||||
this.matchService.getMatchDetails(match_id).then((match_data: RawMatchData) => { | |||||
this.currentMatch = match_data; | |||||
}); | |||||
} | } | ||||
back() { | back() { | ||||
this.location.back(); | this.location.back(); | ||||
} | } | ||||
selectPlayerDetails() { | |||||
selectPlayerDetails(playerId: string) { | |||||
this.selectedPlayer = playerId; | |||||
this.isPlayerSelected = true; | this.isPlayerSelected = true; | ||||
setTimeout(() => { | |||||
this.scrollToPlayerDetails(); | |||||
}, 100); | |||||
} | } | ||||
limitDecimals(value: number) { | limitDecimals(value: number) { | ||||
return value.toPrecision(2); | return value.toPrecision(2); | ||||
} | } | ||||
getArrayOfPlayers(players) { | |||||
return Object.keys(players); | |||||
} | |||||
} | } |
@@ -31,4 +31,8 @@ export class MatchService { | |||||
return this.http.get(BASE_URL + '/standings/').toPromise(); | return this.http.get(BASE_URL + '/standings/').toPromise(); | ||||
} | } | ||||
getPlayerDetails(id: number | string) { | |||||
return this.http.get(BASE_URL + '/player/' + id).toPromise(); | |||||
} | |||||
} | } |