blob: 3981811d754788e2231d1bfbb40db9659933752e [file] [log] [blame]
import {Component, OnInit} from '@angular/core';
import {Builder, ByteBuffer} from 'flatbuffers';
import {SubmitDriverRanking} from '@org_frc971/scouting/webserver/requests/messages/submit_driver_ranking_generated';
import {ErrorResponse} from '@org_frc971/scouting/webserver/requests/messages/error_response_generated';
// TeamSelection: Display form to input which
// teams to rank and the match number.
// Data: Display the ranking interface where
// the scout can reorder teams and submit data.
type Section = 'TeamSelection' | 'TeamSelectionAdd' | 'Data';
@Component({
selector: 'app-driver-ranking',
templateUrl: './driver_ranking.ng.html',
styleUrls: ['../app/common.css', './driver_ranking.component.css'],
})
export class DriverRankingComponent {
section: Section = 'TeamSelection';
// Stores the team keys and rank (order of the array).
team_ranking: string[] = ['971', '972', '973'];
added_teams: string[] = ['974', '975', '976'];
match_number: number = 1;
errorMessage = '';
setTeamNumbers() {
this.section = 'Data';
}
addTeamNumbers() {
for (let i = 0; i < this.added_teams.length; i++) {
this.team_ranking.push(this.added_teams[i]);
}
this.added_teams.splice(0, this.added_teams.length);
this.added_teams = ['974', '975', '976'];
this.section = 'Data';
}
rankUp(index: number) {
if (index > 0) {
this.changeRank(index, index - 1);
}
}
rankDown(index: number) {
if (this.team_ranking.length == 6) {
if (index < 5) {
this.changeRank(index, index + 1);
}
} else {
if (index < 2) {
this.changeRank(index, index + 1);
}
}
}
// Change the rank of a team in team_ranking.
// Move the the team at index 'fromIndex'
// to the index 'toIndex'.
// Ex. Moving the rank 2 (index 1) team to rank1 (index 0)
// would be changeRank(1, 0)
changeRank(fromIndex: number, toIndex: number) {
var element = this.team_ranking[fromIndex];
this.team_ranking.splice(fromIndex, 1);
this.team_ranking.splice(toIndex, 0, element);
}
editTeams() {
this.section = 'TeamSelection';
}
addTeams() {
this.section = 'TeamSelectionAdd';
}
async submitData() {
const builder = new Builder();
if (this.team_ranking.length == 3) {
const teamRanking1 = builder.createString(this.team_ranking[0]);
const teamRanking2 = builder.createString(this.team_ranking[1]);
const teamRanking3 = builder.createString(this.team_ranking[2]);
builder.finish(
SubmitDriverRanking.createSubmitDriverRanking(
builder,
this.match_number,
teamRanking1,
teamRanking2,
teamRanking3
)
);
} else {
const teamRanking1 = builder.createString(this.team_ranking[0]);
const teamRanking2 = builder.createString(this.team_ranking[1]);
const teamRanking3 = builder.createString(this.team_ranking[2]);
const teamRanking4 = builder.createString(this.team_ranking[3]);
const teamRanking5 = builder.createString(this.team_ranking[4]);
const teamRanking6 = builder.createString(this.team_ranking[5]);
// Submits the ranking 4 times to prevent data loss
// since driver ranking compares three teams at a time.
builder.finish(
SubmitDriverRanking.createSubmitDriverRanking(
builder,
this.match_number,
teamRanking1,
teamRanking2,
teamRanking3
)
);
builder.finish(
SubmitDriverRanking.createSubmitDriverRanking(
builder,
this.match_number,
teamRanking4,
teamRanking5,
teamRanking6
)
);
builder.finish(
SubmitDriverRanking.createSubmitDriverRanking(
builder,
this.match_number,
teamRanking3,
teamRanking4,
teamRanking5
)
);
builder.finish(
SubmitDriverRanking.createSubmitDriverRanking(
builder,
this.match_number,
teamRanking1,
teamRanking2,
teamRanking6
)
);
}
const buffer = builder.asUint8Array();
const res = await fetch('/requests/submit/submit_driver_ranking', {
method: 'POST',
body: buffer,
});
if (!res.ok) {
const resBuffer = await res.arrayBuffer();
const fbBuffer = new ByteBuffer(new Uint8Array(resBuffer));
const parsedResponse = ErrorResponse.getRootAsErrorResponse(fbBuffer);
const errorMessage = parsedResponse.errorMessage();
this.errorMessage = `Received ${res.status} ${res.statusText}: "${errorMessage}"`;
return;
}
// Increment the match number.
this.match_number = this.match_number + 1;
// Reset Data.
this.section = 'TeamSelection';
this.team_ranking = ['971', '972', '973'];
}
}