opt-cc/static/src/app/statistic/war/scoreboard/scoreboard.component.ts

147 lines
4.6 KiB
TypeScript
Raw Normal View History

2018-03-08 09:44:35 +01:00
import {Component, ElementRef, EventEmitter, Input, OnChanges, Output, SimpleChanges} from '@angular/core';
2018-03-07 11:56:50 +01:00
import {War} from '../../../models/model-interfaces';
import {Fraction} from '../../../utils/fraction.enum';
import {PlayerUtils} from '../../../utils/player-utils';
2018-04-02 13:20:44 +02:00
import {saveAs} from 'file-saver/FileSaver';
import {MatSort} from '@angular/material';
import {SortUtils} from '../../../utils/sort-utils';
2018-10-04 11:48:22 +02:00
import {TranslateService} from '@ngx-translate/core';
2019-10-11 20:25:07 +02:00
import {FractionHelpers} from '../../../utils/global.helpers';
@Component({
2018-03-08 10:17:10 +01:00
selector: 'cc-scoreboard',
templateUrl: './scoreboard.component.html',
styleUrls: ['./scoreboard.component.scss']
})
2018-03-08 09:44:35 +01:00
export class ScoreboardComponent implements OnChanges {
readonly fraction = Fraction;
2019-10-11 20:25:07 +02:00
readonly fractionHelpers = FractionHelpers;
2018-03-07 11:56:50 +01:00
@Input() war: War;
2018-03-07 11:56:50 +01:00
@Input() fractionFilterSelected: string;
2019-02-27 23:13:23 +01:00
@Input() isSmallLayout: boolean;
2018-03-07 11:56:50 +01:00
@Output() playerTabSwitch = new EventEmitter();
tableHead = PlayerUtils.attributeDisplayNames;
2018-04-02 13:20:44 +02:00
2018-03-07 11:56:50 +01:00
isSteamUUID = PlayerUtils.isSteamUUID;
rows = [];
2018-07-12 21:48:08 +02:00
sortedRows = [];
currentSort = new MatSort();
2018-07-12 21:48:08 +02:00
displayedColumns = this.tableHead.map(head => head.prop);
2018-07-11 21:10:55 +02:00
2018-10-04 11:48:22 +02:00
constructor(private elRef: ElementRef,
private translate: TranslateService) {
2018-07-12 21:48:08 +02:00
this.displayedColumns.push('interact');
}
selectPlayerDetail(view: number, player) {
this.playerTabSwitch.emit({
view: view,
player: player
2018-03-07 11:56:50 +01:00
});
}
ngOnChanges(changes: SimpleChanges) {
2019-02-27 23:13:23 +01:00
if (changes['isSmallLayout'] && changes['isSmallLayout'].previousValue !== changes['isSmallLayout'].currentValue) {
const colIdxFraction = this.displayedColumns.findIndex(c => c === 'fraction');
if (this.isSmallLayout) {
this.displayedColumns.splice(colIdxFraction, 1);
} else if (colIdxFraction === -1) {
this.displayedColumns.splice(1, 0, 'fraction');
}
}
2019-02-27 23:13:23 +01:00
if (changes.war) {
changes.war.currentValue.players
.filter(player => !player.initalized)
.forEach(player => {
// meters to kilometer or fill with null, since optional
player.travelDistance = player.travelDistance ? Math.round(player.travelDistance / 1000) : 0;
player.driverDistance = player.driverDistance ? Math.round(player.driverDistance / 1000) : 0;
// mark initialized to avoid processing again on navigation
player.initalized = true;
});
this.rows = changes.war.currentValue.players;
this.currentSort.active = 'kill';
this.sortScoreboardData(this.currentSort);
2018-07-11 21:10:55 +02:00
// this.elRef.nativeElement
// .querySelector('.datatable-body')
// .scrollTo(0, 0);
}
if (changes.fractionFilterSelected) {
2018-03-07 11:56:50 +01:00
this.filterPlayersByFraction(this.fractionFilterSelected);
}
}
filterPlayersByFraction(fraction?: string) {
if (fraction) {
this.rows = this.war.players.filter((player) => {
return player.fraction === fraction;
2018-03-07 11:56:50 +01:00
});
} else {
this.rows = this.war.players;
}
this.sortScoreboardData(this.currentSort);
}
sortScoreboardData(sort: MatSort) {
if (sort) {
this.currentSort = sort;
}
2018-07-12 21:48:08 +02:00
const data = this.rows.slice();
if (!sort.active || sort.direction === '') {
this.sortedRows = data;
return;
}
this.sortedRows = data.sort((a, b) => {
const isAsc = sort.direction === 'desc';
const sortProperty = sort.active;
return SortUtils.compare(a[sortProperty], b[sortProperty], isAsc);
2018-07-12 21:48:08 +02:00
});
}
2018-04-02 13:20:44 +02:00
exportCSV() {
let csvOut = '';
for (let i = 0; i < this.tableHead.length; i++) {
2018-10-04 11:48:22 +02:00
this.translate.get(this.tableHead[i].head).subscribe((translated) => {
csvOut += translated;
if (i !== this.tableHead.length - 1) {
csvOut += ',';
}
});
2018-04-02 13:20:44 +02:00
}
for (let j = 0; j < this.war.players.length; j++) {
const player = this.war.players[j];
csvOut += '\r\n';
csvOut += '"' + player.name + '",';
csvOut += player.fraction + ',';
csvOut += player.kill + ',';
csvOut += player.friendlyFire + ',';
csvOut += player.revive + ',';
csvOut += player.flagTouch + ',';
2018-04-14 17:46:01 +02:00
csvOut += player.vehicleLight + ',';
csvOut += player.vehicleHeavy + ',';
csvOut += player.vehicleAir + ',';
csvOut += player.travelDistance + ',';
csvOut += player.driverDistance + ',';
2018-04-02 13:20:44 +02:00
csvOut += player.death + ',';
csvOut += player.respawn;
}
const blob = new Blob([csvOut], {type: 'text/plain'});
saveAs(blob, this.war.title.toLowerCase().replace(' ', '_').concat('.csv'));
}
}