Merge "scouting: Re-authorize users when their auth expires"
diff --git a/scouting/www/driver_ranking/driver_ranking.component.ts b/scouting/www/driver_ranking/driver_ranking.component.ts
index 2148b63..3981811 100644
--- a/scouting/www/driver_ranking/driver_ranking.component.ts
+++ b/scouting/www/driver_ranking/driver_ranking.component.ts
@@ -7,7 +7,7 @@
 // teams to rank and the match number.
 // Data: Display the ranking interface where
 // the scout can reorder teams and submit data.
-type Section = 'TeamSelection' | 'Data';
+type Section = 'TeamSelection' | 'TeamSelectionAdd' | 'Data';
 
 @Component({
   selector: 'app-driver-ranking',
@@ -19,6 +19,7 @@
 
   // 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;
 
@@ -28,6 +29,15 @@
     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);
@@ -35,8 +45,14 @@
   }
 
   rankDown(index: number) {
-    if (index < 2) {
-      this.changeRank(index, index + 1);
+    if (this.team_ranking.length == 6) {
+      if (index < 5) {
+        this.changeRank(index, index + 1);
+      }
+    } else {
+      if (index < 2) {
+        this.changeRank(index, index + 1);
+      }
     }
   }
 
@@ -56,20 +72,71 @@
     this.section = 'TeamSelection';
   }
 
+  addTeams() {
+    this.section = 'TeamSelectionAdd';
+  }
+
   async submitData() {
     const builder = new Builder();
-    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
-      )
-    );
+    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',
diff --git a/scouting/www/driver_ranking/driver_ranking.ng.html b/scouting/www/driver_ranking/driver_ranking.ng.html
index d361c9d..129a05b 100644
--- a/scouting/www/driver_ranking/driver_ranking.ng.html
+++ b/scouting/www/driver_ranking/driver_ranking.ng.html
@@ -14,13 +14,24 @@
     />
     <br />
     <br />
-    <label>Team Numbers</label>
-    <input
-      *ngFor="let x of [1,2,3]; let i = index;"
-      [(ngModel)]="team_ranking[i]"
-      type="text"
-      id="team_input_{{i}}"
-    />
+    <div *ngIf="team_ranking.length==3">
+      <label>Team Numbers</label>
+      <input
+        *ngFor="let x of [1,2,3]; let i = index;"
+        [(ngModel)]="team_ranking[i]"
+        type="text"
+        id="team_input_{{i}}"
+      />
+    </div>
+    <div *ngIf="team_ranking.length==6">
+      <label>Team Numbers</label>
+      <input
+        *ngFor="let x of [1,2,3,4,5,6]; let i = index;"
+        [(ngModel)]="team_ranking[i]"
+        type="text"
+        id="team_input_{{i}}"
+      />
+    </div>
     <button
       class="btn btn-primary"
       (click)="setTeamNumbers()"
@@ -29,6 +40,24 @@
       Select
     </button>
   </div>
+
+  <div *ngSwitchCase="'TeamSelectionAdd'">
+    <label>Team Numbers</label>
+    <input
+      *ngFor="let x of [1,2,3]; let i = index;"
+      [(ngModel)]="added_teams[i]"
+      type="text"
+      id="team_input_{{i}}"
+    />
+    <button
+      class="btn btn-primary"
+      (click)="addTeamNumbers()"
+      id="select_button"
+    >
+      Add
+    </button>
+  </div>
+
   <div *ngSwitchCase="'Data'">
     <h4 id="match_number_heading">Match #{{match_number}}</h4>
     <div *ngFor="let team_key of team_ranking; let i = index">
@@ -65,6 +94,15 @@
           Edit Teams
         </button>
       </div>
+      <div *ngIf="team_ranking.length != 6">
+        <button
+          id="add-team-button"
+          class="btn btn-primary"
+          (click)="addTeams()"
+        >
+          Add Teams
+        </button>
+      </div>
       <div>
         <button
           class="btn btn-success"