blob: 43575cde573911b1d507d1a7cadcb05e82435e94 [file] [log] [blame]
Philipp Schrader6b2e9502022-03-15 23:42:56 -07001<div class="header" #header>
Philipp Schrader2b334272023-04-11 21:27:36 -07002 <h2>
3 <span *ngIf="section != 'Team Selection'">{{teamNumber}}</span>
4 {{section}}
5 </h2>
Philipp Schrader80587432022-03-05 15:41:22 -08006</div>
Philipp Schrader80587432022-03-05 15:41:22 -08007<ng-container [ngSwitch]="section">
Philipp Schrader817cce32022-03-26 15:00:00 -07008 <div
9 *ngSwitchCase="'Team Selection'"
10 id="team_selection"
11 class="container-fluid"
12 >
13 <div class="row">
14 <label for="match_number">Match Number</label>
15 <input
16 [(ngModel)]="matchNumber"
Philipp Schrader8702b782023-04-15 17:33:37 -070017 (ngModelChange)="updateTeamSelectionValidity()"
Philipp Schrader817cce32022-03-26 15:00:00 -070018 type="number"
19 id="match_number"
20 min="1"
21 max="999"
22 />
23 </div>
24 <div class="row">
25 <label for="team_number">Team Number</label>
26 <input
27 [(ngModel)]="teamNumber"
Philipp Schrader8702b782023-04-15 17:33:37 -070028 (ngModelChange)="updateTeamSelectionValidity()"
Emily Markovae68b7632023-12-30 14:17:55 -080029 type="text"
Philipp Schrader817cce32022-03-26 15:00:00 -070030 id="team_number"
Philipp Schrader817cce32022-03-26 15:00:00 -070031 />
32 </div>
Philipp Schrader8aeb14f2022-04-08 21:23:18 -070033 <div class="row">
Philipp Schrader30b4a682022-04-16 14:36:17 -070034 <label for="set_number">Set Number</label>
35 <input
36 [(ngModel)]="setNumber"
Philipp Schrader8702b782023-04-15 17:33:37 -070037 (ngModelChange)="updateTeamSelectionValidity()"
Philipp Schrader30b4a682022-04-16 14:36:17 -070038 type="number"
39 id="set_number"
40 min="1"
41 max="10"
42 />
Philipp Schrader8aeb14f2022-04-08 21:23:18 -070043 </div>
44 <div class="row">
Philipp Schrader30b4a682022-04-16 14:36:17 -070045 <label for="comp_level">Comp Level</label>
Philipp Schrader8702b782023-04-15 17:33:37 -070046 <select
47 [(ngModel)]="compLevel"
48 (ngModelChange)="updateTeamSelectionValidity()"
49 type="number"
50 id="comp_level"
51 >
Philipp Schrader8aeb14f2022-04-08 21:23:18 -070052 <option *ngFor="let level of COMP_LEVELS" [ngValue]="level">
53 {{COMP_LEVEL_LABELS[level]}}
54 </option>
55 </select>
56 </div>
Philipp Schradere1498852023-04-15 18:06:45 -070057 <div class="row">
58 <label>
59 <input
60 id="pre_scouting"
61 type="checkbox"
62 [(ngModel)]="preScouting"
63 (ngModelChange)="updateTeamSelectionValidity()"
64 />
65 Pre-scouting
66 </label>
67 </div>
Philipp Schrader817cce32022-03-26 15:00:00 -070068 <div class="buttons">
69 <!-- hack to right align the next button -->
70 <div></div>
Philipp Schrader8702b782023-04-15 17:33:37 -070071 <button
72 class="btn btn-primary"
73 (click)="changeSectionTo('Init');"
74 [disabled]="!teamSelectionIsValid"
75 >
Filip Kujawa0ef334c2023-02-20 19:42:45 -080076 Next
77 </button>
Philipp Schrader817cce32022-03-26 15:00:00 -070078 </div>
79 </div>
Filip Kujawa0ef334c2023-02-20 19:42:45 -080080 <div *ngSwitchCase="'Init'" id="init" class="container-fluid">
81 <h2>Select Starting Position</h2>
Filip Kujawa1d9add92023-03-03 13:14:40 -080082 <img
83 id="field_starting_positions_image"
84 src="/sha256/b71def525fb78486617a8b350c0ba6907e8ea25f78d4084a932cba8ae922528c/pictures/field/field.jpg"
85 alt="Starting Positions Image"
86 class="img-fluid"
87 />
Filip Kujawa0ef334c2023-02-20 19:42:45 -080088 <div *ngFor="let i of [1, 2, 3, 4]">
89 <label>
Philipp Schrader817cce32022-03-26 15:00:00 -070090 <input
91 type="radio"
Filip Kujawa0ef334c2023-02-20 19:42:45 -080092 name="radio-group"
93 [value]="i"
94 (change)="selectedValue = $event.target.value"
Philipp Schrader817cce32022-03-26 15:00:00 -070095 />
Filip Kujawa0ef334c2023-02-20 19:42:45 -080096 {{ i }}
Philipp Schrader817cce32022-03-26 15:00:00 -070097 </label>
Filip Kujawa0ef334c2023-02-20 19:42:45 -080098 </div>
Philipp Schrader817cce32022-03-26 15:00:00 -070099 <div class="buttons">
Filip Kujawa375aaac2023-02-28 21:43:47 -0800100 <!-- Creates a responsive stack of full-width, "block buttons". -->
Filip Kujawa36f56082023-03-03 10:58:53 -0800101 <div class="d-grid gap-5">
Filip Kujawa375aaac2023-02-28 21:43:47 -0800102 <button
103 class="btn btn-primary"
104 [disabled]="!selectedValue"
105 (click)="changeSectionTo('Pickup'); addAction({type: 'startMatchAction', position: selectedValue});"
106 >
107 Start Match
108 </button>
109 </div>
Philipp Schrader817cce32022-03-26 15:00:00 -0700110 </div>
111 </div>
Filip Kujawa0ef334c2023-02-20 19:42:45 -0800112 <div *ngSwitchCase="'Pickup'" id="PickUp" class="container-fluid">
Filip Kujawa493b59f2023-03-11 17:58:59 -0800113 <h6 class="text-muted">
114 Last Action: {{actionList[actionList.length - 1].type}}
115 </h6>
Philipp Schrader9ade12c2023-04-20 13:03:33 -0700116 <!--
Filip Kujawaaa7d11f2023-04-13 09:12:32 -0700117 Decrease distance between buttons during auto to make space for auto balancing
118 selection and keep all buttons visible without scrolling on most devices.
119 -->
120 <div
121 [ngClass]="{'d-grid': true, 'gap-3': autoPhase === true, 'gap-5': autoPhase === false}"
122 >
Filip Kujawa9f56d0e2023-03-03 19:44:43 -0800123 <button class="btn btn-secondary" (click)="undoLastAction()">UNDO</button>
124 <button
125 class="btn btn-danger"
126 (click)="changeSectionTo('Dead'); addAction({type: 'robotDeathAction', robotOn: false});"
127 >
128 DEAD
129 </button>
Filip Kujawa375aaac2023-02-28 21:43:47 -0800130 <button
131 class="btn btn-warning"
132 (click)="changeSectionTo('Place'); addAction({type: 'pickupObjectAction', objectType: ObjectType.kCone});"
133 >
134 CONE
135 </button>
136 <button
137 class="btn btn-primary"
138 (click)="changeSectionTo('Place'); addAction({type: 'pickupObjectAction', objectType: ObjectType.kCube});"
139 >
140 CUBE
141 </button>
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700142 <button
Filip Kujawab73e94c2023-04-19 09:33:14 -0700143 *ngIf="autoPhase && !mobilityCompleted"
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700144 class="btn btn-light"
145 (click)="addAction({type: 'mobilityAction', mobility: true});"
146 >
147 Mobility
148 </button>
Filip Kujawa375aaac2023-02-28 21:43:47 -0800149 <!-- 'Balancing' during auto. -->
150 <div *ngIf="autoPhase" class="d-grid gap-2">
151 <label>
Evelyn Yang6cc153d2023-05-24 19:35:16 -0700152 <input
153 #docked
154 type="radio"
155 id="option1"
156 name="docked_engaged"
157 value="docked"
158 />
Philipp Schrader87fe98a2023-04-15 17:26:34 -0700159 Docked (on the charging station)
Filip Kujawa375aaac2023-02-28 21:43:47 -0800160 </label>
161 <label>
Evelyn Yang6cc153d2023-05-24 19:35:16 -0700162 <input
163 #engaged
164 type="radio"
165 id="option2"
166 name="docked_engaged"
167 value="dockedengaged"
168 />
169 Docked &amp; Engaged (level &amp; station lights on)
Filip Kujawa375aaac2023-02-28 21:43:47 -0800170 </label>
Emily Markova63c63f62023-03-29 20:57:35 -0700171 <label>
Evelyn Yang6cc153d2023-05-24 19:35:16 -0700172 <input
173 #attempted
174 type="radio"
175 id="option3"
176 name="docked_engaged"
177 value="failed"
178 />
Emily Markova63c63f62023-03-29 20:57:35 -0700179 Attempted to dock and engage but failed
180 </label>
Philipp Schrader9ade12c2023-04-20 13:03:33 -0700181 <button
182 class="btn btn-dark"
183 (click)="autoPhase = false; addAction({type: 'endAutoPhase'}); addAction({type: 'autoBalanceAction', docked: docked.checked, engaged: engaged.checked, balanceAttempt: attempted.checked});"
184 >
185 Start Teleop
186 </button>
Filip Kujawa375aaac2023-02-28 21:43:47 -0800187 </div>
188 <button
Filip Kujawa375aaac2023-02-28 21:43:47 -0800189 *ngIf="!autoPhase"
190 class="btn btn-info"
191 (click)="changeSectionTo('Endgame')"
192 >
193 Endgame
194 </button>
195 </div>
196 </div>
Filip Kujawa375aaac2023-02-28 21:43:47 -0800197 <div *ngSwitchCase="'Place'" id="Place" class="container-fluid">
Filip Kujawa493b59f2023-03-11 17:58:59 -0800198 <h6 class="text-muted">
199 Last Action: {{actionList[actionList.length - 1].type}}
200 </h6>
Philipp Schrader9ade12c2023-04-20 13:03:33 -0700201 <!--
Filip Kujawaaa7d11f2023-04-13 09:12:32 -0700202 Decrease distance between buttons during auto to make space for auto balancing
203 selection and keep all buttons visible without scrolling on most devices.
204 -->
205 <div
206 [ngClass]="{'d-grid': true, 'gap-3': autoPhase === true, 'gap-5': autoPhase === false}"
207 >
Filip Kujawa9f56d0e2023-03-03 19:44:43 -0800208 <button class="btn btn-secondary" (click)="undoLastAction()">UNDO</button>
209 <button
210 class="btn btn-danger"
211 (click)="changeSectionTo('Dead'); addAction({type: 'robotDeathAction', robotOn: false});"
212 >
213 DEAD
214 </button>
Filip Kujawa375aaac2023-02-28 21:43:47 -0800215 <button
216 class="btn btn-success"
217 (click)="changeSectionTo('Pickup'); addAction({type: 'placeObjectAction', scoreLevel: ScoreLevel.kHigh});"
218 >
219 HIGH
220 </button>
221 <button
222 class="btn btn-warning"
223 (click)="changeSectionTo('Pickup'); addAction({type: 'placeObjectAction', scoreLevel: ScoreLevel.kMiddle});"
224 >
225 MID
226 </button>
227 <button
228 class="btn btn-danger"
229 (click)="changeSectionTo('Pickup'); addAction({type: 'placeObjectAction', scoreLevel: ScoreLevel.kLow});"
230 >
231 LOW
232 </button>
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700233 <button
Filip Kujawab73e94c2023-04-19 09:33:14 -0700234 *ngIf="autoPhase && !mobilityCompleted"
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700235 class="btn btn-light"
236 (click)="addAction({type: 'mobilityAction', mobility: true});"
237 >
238 Mobility
239 </button>
Filip Kujawa7a045e72023-04-13 08:41:09 -0700240 <!-- Impossible to place supercharged pieces in auto. -->
241 <div *ngIf="autoPhase == false" class="d-grid gap-2">
242 <button
243 class="btn btn-dark"
244 (click)="changeSectionTo('Pickup'); addAction({type: 'placeObjectAction', scoreLevel: ScoreLevel.kSupercharged});"
245 >
246 SUPERCHARGED
247 </button>
248 </div>
Filip Kujawa375aaac2023-02-28 21:43:47 -0800249 <!-- 'Balancing' during auto. -->
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700250 <div *ngIf="autoPhase" class="d-grid gap-1">
Filip Kujawa375aaac2023-02-28 21:43:47 -0800251 <label>
Evelyn Yang6cc153d2023-05-24 19:35:16 -0700252 <input
253 #docked
254 type="radio"
255 id="option1"
256 name="docked_engaged"
257 value="docked"
258 />
Philipp Schrader87fe98a2023-04-15 17:26:34 -0700259 Docked (on the charging station)
Filip Kujawa375aaac2023-02-28 21:43:47 -0800260 </label>
261 <label>
Evelyn Yang6cc153d2023-05-24 19:35:16 -0700262 <input
263 #engaged
264 type="radio"
265 id="option2"
266 name="docked_engaged"
267 value="dockedengaged"
268 />
269 Docked &amp; Engaged (level &amp; station lights on)
Filip Kujawa375aaac2023-02-28 21:43:47 -0800270 </label>
Emily Markova63c63f62023-03-29 20:57:35 -0700271 <label>
Evelyn Yang6cc153d2023-05-24 19:35:16 -0700272 <input
273 #attempted
274 type="radio"
275 id="option3"
276 name="docked_engaged"
277 value="failed"
278 />
Emily Markova63c63f62023-03-29 20:57:35 -0700279 Attempted to dock and engage but failed
280 </label>
Philipp Schrader9ade12c2023-04-20 13:03:33 -0700281 <button
282 class="btn btn-dark"
283 (click)="autoPhase = false; addAction({type: 'endAutoPhase'}); addAction({type: 'autoBalanceAction', docked: docked.checked, engaged: engaged.checked, balanceAttempt: attempted.checked});"
284 >
285 Start Teleop
286 </button>
Filip Kujawa375aaac2023-02-28 21:43:47 -0800287 </div>
288 <button
Filip Kujawa375aaac2023-02-28 21:43:47 -0800289 *ngIf="!autoPhase"
290 class="btn btn-info"
291 (click)="changeSectionTo('Endgame')"
292 >
293 Endgame
294 </button>
295 </div>
296 </div>
Filip Kujawa375aaac2023-02-28 21:43:47 -0800297 <div *ngSwitchCase="'Endgame'" id="Endgame" class="container-fluid">
Filip Kujawa493b59f2023-03-11 17:58:59 -0800298 <h6 class="text-muted">
299 Last Action: {{actionList[actionList.length - 1].type}}
300 </h6>
Filip Kujawa36f56082023-03-03 10:58:53 -0800301 <div class="d-grid gap-5">
Filip Kujawa9f56d0e2023-03-03 19:44:43 -0800302 <button class="btn btn-secondary" (click)="undoLastAction()">UNDO</button>
303 <button
304 class="btn btn-danger"
305 (click)="changeSectionTo('Dead'); addAction({type: 'robotDeathAction', robotOn: false});"
306 >
307 DEAD
308 </button>
Filip Kujawa4413a592023-03-01 10:54:34 -0800309 <label>
Evelyn Yang6cc153d2023-05-24 19:35:16 -0700310 <input
311 #docked
312 type="radio"
313 id="option1"
314 name="docked_engaged"
315 value="docked"
316 />
Philipp Schrader87fe98a2023-04-15 17:26:34 -0700317 Docked (on the charging station)
Filip Kujawa4413a592023-03-01 10:54:34 -0800318 </label>
319 <label>
Evelyn Yang6cc153d2023-05-24 19:35:16 -0700320 <input
321 #engaged
322 type="radio"
323 id="option2"
324 name="docked_engaged"
325 value="dockedengaged"
326 />
327 Docked &amp; Engaged (level &amp; station lights on)
Filip Kujawa4413a592023-03-01 10:54:34 -0800328 </label>
Emily Markova63c63f62023-03-29 20:57:35 -0700329 <label>
Evelyn Yang6cc153d2023-05-24 19:35:16 -0700330 <input
331 #attempted
332 type="radio"
333 id="option3"
334 name="docked_engaged"
335 value="failed"
336 />
Emily Markova63c63f62023-03-29 20:57:35 -0700337 Attempted to dock and engage but failed
338 </label>
Filip Kujawa4413a592023-03-01 10:54:34 -0800339 <button
Filip Kujawa375aaac2023-02-28 21:43:47 -0800340 *ngIf="!autoPhase"
Filip Kujawa4413a592023-03-01 10:54:34 -0800341 class="btn btn-info"
Emily Markova63c63f62023-03-29 20:57:35 -0700342 (click)="changeSectionTo('Review and Submit'); addAction({type: 'endMatchAction', docked: docked.checked, engaged: engaged.checked, balanceAttempt: attempted.checked});"
Filip Kujawa4413a592023-03-01 10:54:34 -0800343 >
Filip Kujawa375aaac2023-02-28 21:43:47 -0800344 End Match
Filip Kujawa4413a592023-03-01 10:54:34 -0800345 </button>
346 </div>
Filip Kujawa0ef334c2023-02-20 19:42:45 -0800347 </div>
Filip Kujawa9f56d0e2023-03-03 19:44:43 -0800348 <div *ngSwitchCase="'Dead'" id="Dead" class="container-fluid">
349 <h2>Robot is dead</h2>
350 <div class="d-grid gap-2">
351 <button
352 class="btn btn-success"
353 (click)="changeSectionTo('Pickup'); addAction({type: 'robotDeathAction', robotOn: true}); "
354 >
355 Revive
356 </button>
Filip Kujawa32d13b62023-03-11 17:41:53 -0800357 <button
358 class="btn btn-info"
Philipp Schrader8686bbb2023-03-22 20:15:21 -0700359 (click)="changeSectionTo('Review and Submit'); addAction({type: 'endMatchAction', docked: docked.checked, engaged: engaged.checked});"
Filip Kujawa32d13b62023-03-11 17:41:53 -0800360 >
361 End Match
362 </button>
Filip Kujawa9f56d0e2023-03-03 19:44:43 -0800363 </div>
364 </div>
Filip Kujawa0ef334c2023-02-20 19:42:45 -0800365 <div *ngSwitchCase="'Review and Submit'" id="Review" class="container-fluid">
Emily Markovaf4b06a22023-05-10 17:44:09 -0700366 <div class="row">
367 <ul id="review_data">
368 <li
369 *ngFor="let action of actionList"
370 [ngValue]="action"
371 style="display: flex"
372 >
373 <div [ngSwitch]="action.type" style="padding: 0px">
374 <span *ngSwitchCase="'startMatchAction'">
375 Started match at position {{action.position}}
376 </span>
377 <span *ngSwitchCase="'pickupObjectAction'">
378 Picked up {{stringifyObjectType(action.objectType)}}
379 </span>
380 <span *ngSwitchCase="'placeObjectAction'">
381 Placed at {{stringifyScoreLevel(action.scoreLevel)}}
382 </span>
383 <span *ngSwitchCase="'autoBalanceAction'">
384 Docked: {{action.docked}}, engaged: {{action.engaged}}, attempted
385 to balance and engage: {{action.balanceAttempt}}
386 </span>
387 <span *ngSwitchCase="'endAutoPhase'">Ended auto phase</span>
388 <span *ngSwitchCase="'endMatchAction'">
389 Ended Match; docked: {{action.docked}}, engaged:
390 {{action.engaged}}, attempted to dock and engage:
391 {{action.balanceAttempt}}
392 </span>
393 <span *ngSwitchCase="'robotDeathAction'">
394 Robot on: {{action.robotOn}}
395 </span>
396 <span *ngSwitchCase="'mobilityAction'">
397 Mobility: {{action.mobility}}
398 </span>
399 <span *ngSwitchDefault>{{action.type}}</span>
400 </div>
401 </li>
402 </ul>
403 </div>
Filip Kujawa36f56082023-03-03 10:58:53 -0800404 <div class="d-grid gap-5">
Filip Kujawa9f56d0e2023-03-03 19:44:43 -0800405 <button class="btn btn-secondary" (click)="undoLastAction()">UNDO</button>
Filip Kujawa32d13b62023-03-11 17:41:53 -0800406 <button class="btn btn-warning" (click)="submitActions();">Submit</button>
Filip Kujawa375aaac2023-02-28 21:43:47 -0800407 </div>
Filip Kujawa0ef334c2023-02-20 19:42:45 -0800408 </div>
Filip Kujawa0ef334c2023-02-20 19:42:45 -0800409 <div *ngSwitchCase="'Success'" id="Success" class="container-fluid">
410 <h2>Successfully submitted data.</h2>
Philipp Schrader817cce32022-03-26 15:00:00 -0700411 </div>
Philipp Schrader8686bbb2023-03-22 20:15:21 -0700412
Philipp Schrader8702b782023-04-15 17:33:37 -0700413 <span class="progress_message" role="alert">{{ progressMessage }}</span>
Philipp Schrader8686bbb2023-03-22 20:15:21 -0700414 <span class="error_message" role="alert">{{ errorMessage }}</span>
Philipp Schrader80587432022-03-05 15:41:22 -0800415</ng-container>