Add notes scouting page to scouting app.

Change-Id: Ie2c60ba4a69ae68f407cb2a0c0fb6e90b7bfe1c5
Signed-off-by: Alex Perry <alex.perry96@gmail.com>
diff --git a/scouting/www/notes/notes.component.ts b/scouting/www/notes/notes.component.ts
new file mode 100644
index 0000000..09178f8
--- /dev/null
+++ b/scouting/www/notes/notes.component.ts
@@ -0,0 +1,90 @@
+import {Component} from '@angular/core';
+import {Builder, ByteBuffer} from 'flatbuffers';
+import {ErrorResponse} from 'org_frc971/scouting/webserver/requests/messages/error_response_generated';
+import {RequestNotesForTeam} from 'org_frc971/scouting/webserver/requests/messages/request_notes_for_team_generated';
+import {Note as NoteFb, RequestNotesForTeamResponse} from 'org_frc971/scouting/webserver/requests/messages/request_notes_for_team_response_generated';
+import {SubmitNotes} from 'org_frc971/scouting/webserver/requests/messages/submit_notes_generated';
+import {SubmitNotesResponse} from 'org_frc971/scouting/webserver/requests/messages/submit_notes_response_generated';
+
+type Section = 'TeamSelection'|'Data';
+
+interface Note {
+  readonly data: string;
+}
+
+@Component({
+  selector: 'frc971-notes',
+  templateUrl: './notes.ng.html',
+  styleUrls: ['../common.css', './notes.component.css']
+})
+export class Notes {
+  section: Section = 'TeamSelection';
+  notes: Note[] = [];
+
+  errorMessage = '';
+
+  teamNumber: number = 971;
+  newData = '';
+
+  async setTeamNumber() {
+    const builder = new Builder();
+    RequestNotesForTeam.startRequestNotesForTeam(builder);
+    RequestNotesForTeam.addTeam(builder, this.teamNumber);
+    builder.finish(RequestNotesForTeam.endRequestNotesForTeam(builder));
+
+    const buffer = builder.asUint8Array();
+    const res = await fetch(
+        '/requests/request/notes_for_team', {method: 'POST', body: buffer});
+
+    const resBuffer = await res.arrayBuffer();
+    const fbBuffer = new ByteBuffer(new Uint8Array(resBuffer));
+
+    if (res.ok) {
+      this.notes = [];
+      const parsedResponse =
+          RequestNotesForTeamResponse.getRootAsRequestNotesForTeamResponse(
+              fbBuffer);
+      for (let i = 0; i < parsedResponse.notesLength(); i++) {
+        const fbNote = parsedResponse.notes(i);
+        this.notes.push({data: fbNote.data()});
+      }
+      this.section = 'Data';
+    } else {
+      const parsedResponse = ErrorResponse.getRootAsErrorResponse(fbBuffer);
+
+      const errorMessage = parsedResponse.errorMessage();
+      this.errorMessage =
+          `Received ${res.status} ${res.statusText}: "${errorMessage}"`;
+    }
+  }
+
+  changeTeam() {
+    this.section = "TeamSelection";
+  }
+  
+  async submitData() {
+    const builder = new Builder();
+    const dataFb = builder.createString(this.newData);
+    builder.finish(
+        SubmitNotes.createSubmitNotes(builder, this.teamNumber, dataFb));
+
+    const buffer = builder.asUint8Array();
+    const res = await fetch(
+        '/requests/submit/submit_notes', {method: 'POST', body: buffer});
+
+    if (res.ok) {
+      this.newData = '';
+      this.errorMessage = '';
+      await this.setTeamNumber();
+    } else {
+      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}"`;
+    }
+  }
+}
+