blob: ada96ffacc48b860ecd4c69c0c39faf796a65b5b [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()"
Philipp Schrader817cce32022-03-26 15:00:00 -070029 type="number"
30 id="team_number"
31 min="1"
32 max="9999"
33 />
34 </div>
Philipp Schrader8aeb14f2022-04-08 21:23:18 -070035 <div class="row">
Philipp Schrader30b4a682022-04-16 14:36:17 -070036 <label for="set_number">Set Number</label>
37 <input
38 [(ngModel)]="setNumber"
Philipp Schrader8702b782023-04-15 17:33:37 -070039 (ngModelChange)="updateTeamSelectionValidity()"
Philipp Schrader30b4a682022-04-16 14:36:17 -070040 type="number"
41 id="set_number"
42 min="1"
43 max="10"
44 />
Philipp Schrader8aeb14f2022-04-08 21:23:18 -070045 </div>
46 <div class="row">
Philipp Schrader30b4a682022-04-16 14:36:17 -070047 <label for="comp_level">Comp Level</label>
Philipp Schrader8702b782023-04-15 17:33:37 -070048 <select
49 [(ngModel)]="compLevel"
50 (ngModelChange)="updateTeamSelectionValidity()"
51 type="number"
52 id="comp_level"
53 >
Philipp Schrader8aeb14f2022-04-08 21:23:18 -070054 <option *ngFor="let level of COMP_LEVELS" [ngValue]="level">
55 {{COMP_LEVEL_LABELS[level]}}
56 </option>
57 </select>
58 </div>
Philipp Schradere1498852023-04-15 18:06:45 -070059 <div class="row">
60 <label>
61 <input
62 id="pre_scouting"
63 type="checkbox"
64 [(ngModel)]="preScouting"
65 (ngModelChange)="updateTeamSelectionValidity()"
66 />
67 Pre-scouting
68 </label>
69 </div>
Philipp Schrader817cce32022-03-26 15:00:00 -070070 <div class="buttons">
71 <!-- hack to right align the next button -->
72 <div></div>
Philipp Schrader8702b782023-04-15 17:33:37 -070073 <button
74 class="btn btn-primary"
75 (click)="changeSectionTo('Init');"
76 [disabled]="!teamSelectionIsValid"
77 >
Filip Kujawa0ef334c2023-02-20 19:42:45 -080078 Next
79 </button>
Philipp Schrader817cce32022-03-26 15:00:00 -070080 </div>
81 </div>
Filip Kujawa0ef334c2023-02-20 19:42:45 -080082 <div *ngSwitchCase="'Init'" id="init" class="container-fluid">
83 <h2>Select Starting Position</h2>
Filip Kujawa1d9add92023-03-03 13:14:40 -080084 <img
85 id="field_starting_positions_image"
86 src="/sha256/b71def525fb78486617a8b350c0ba6907e8ea25f78d4084a932cba8ae922528c/pictures/field/field.jpg"
87 alt="Starting Positions Image"
88 class="img-fluid"
89 />
Filip Kujawa0ef334c2023-02-20 19:42:45 -080090 <div *ngFor="let i of [1, 2, 3, 4]">
91 <label>
Philipp Schrader817cce32022-03-26 15:00:00 -070092 <input
93 type="radio"
Filip Kujawa0ef334c2023-02-20 19:42:45 -080094 name="radio-group"
95 [value]="i"
96 (change)="selectedValue = $event.target.value"
Philipp Schrader817cce32022-03-26 15:00:00 -070097 />
Filip Kujawa0ef334c2023-02-20 19:42:45 -080098 {{ i }}
Philipp Schrader817cce32022-03-26 15:00:00 -070099 </label>
Filip Kujawa0ef334c2023-02-20 19:42:45 -0800100 </div>
Philipp Schrader817cce32022-03-26 15:00:00 -0700101 <div class="buttons">
Filip Kujawa375aaac2023-02-28 21:43:47 -0800102 <!-- Creates a responsive stack of full-width, "block buttons". -->
Filip Kujawa36f56082023-03-03 10:58:53 -0800103 <div class="d-grid gap-5">
Filip Kujawa375aaac2023-02-28 21:43:47 -0800104 <button
105 class="btn btn-primary"
106 [disabled]="!selectedValue"
107 (click)="changeSectionTo('Pickup'); addAction({type: 'startMatchAction', position: selectedValue});"
108 >
109 Start Match
110 </button>
111 </div>
Philipp Schrader817cce32022-03-26 15:00:00 -0700112 </div>
113 </div>
Filip Kujawa0ef334c2023-02-20 19:42:45 -0800114 <div *ngSwitchCase="'Pickup'" id="PickUp" class="container-fluid">
Filip Kujawa493b59f2023-03-11 17:58:59 -0800115 <h6 class="text-muted">
116 Last Action: {{actionList[actionList.length - 1].type}}
117 </h6>
Philipp Schrader9ade12c2023-04-20 13:03:33 -0700118 <!--
Filip Kujawaaa7d11f2023-04-13 09:12:32 -0700119 Decrease distance between buttons during auto to make space for auto balancing
120 selection and keep all buttons visible without scrolling on most devices.
121 -->
122 <div
123 [ngClass]="{'d-grid': true, 'gap-3': autoPhase === true, 'gap-5': autoPhase === false}"
124 >
Filip Kujawa9f56d0e2023-03-03 19:44:43 -0800125 <button class="btn btn-secondary" (click)="undoLastAction()">UNDO</button>
126 <button
127 class="btn btn-danger"
128 (click)="changeSectionTo('Dead'); addAction({type: 'robotDeathAction', robotOn: false});"
129 >
130 DEAD
131 </button>
Filip Kujawa375aaac2023-02-28 21:43:47 -0800132 <button
133 class="btn btn-warning"
134 (click)="changeSectionTo('Place'); addAction({type: 'pickupObjectAction', objectType: ObjectType.kCone});"
135 >
136 CONE
137 </button>
138 <button
139 class="btn btn-primary"
140 (click)="changeSectionTo('Place'); addAction({type: 'pickupObjectAction', objectType: ObjectType.kCube});"
141 >
142 CUBE
143 </button>
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700144 <button
Filip Kujawab73e94c2023-04-19 09:33:14 -0700145 *ngIf="autoPhase && !mobilityCompleted"
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700146 class="btn btn-light"
147 (click)="addAction({type: 'mobilityAction', mobility: true});"
148 >
149 Mobility
150 </button>
Filip Kujawa375aaac2023-02-28 21:43:47 -0800151 <!-- 'Balancing' during auto. -->
152 <div *ngIf="autoPhase" class="d-grid gap-2">
153 <label>
Evelyn Yang6cc153d2023-05-24 19:35:16 -0700154 <input
155 #docked
156 type="radio"
157 id="option1"
158 name="docked_engaged"
159 value="docked"
160 />
Philipp Schrader87fe98a2023-04-15 17:26:34 -0700161 Docked (on the charging station)
Filip Kujawa375aaac2023-02-28 21:43:47 -0800162 </label>
163 <label>
Evelyn Yang6cc153d2023-05-24 19:35:16 -0700164 <input
165 #engaged
166 type="radio"
167 id="option2"
168 name="docked_engaged"
169 value="dockedengaged"
170 />
171 Docked &amp; Engaged (level &amp; station lights on)
Filip Kujawa375aaac2023-02-28 21:43:47 -0800172 </label>
Emily Markova63c63f62023-03-29 20:57:35 -0700173 <label>
Evelyn Yang6cc153d2023-05-24 19:35:16 -0700174 <input
175 #attempted
176 type="radio"
177 id="option3"
178 name="docked_engaged"
179 value="failed"
180 />
Emily Markova63c63f62023-03-29 20:57:35 -0700181 Attempted to dock and engage but failed
182 </label>
Philipp Schrader9ade12c2023-04-20 13:03:33 -0700183 <button
184 class="btn btn-dark"
185 (click)="autoPhase = false; addAction({type: 'endAutoPhase'}); addAction({type: 'autoBalanceAction', docked: docked.checked, engaged: engaged.checked, balanceAttempt: attempted.checked});"
186 >
187 Start Teleop
188 </button>
Filip Kujawa375aaac2023-02-28 21:43:47 -0800189 </div>
190 <button
Filip Kujawa375aaac2023-02-28 21:43:47 -0800191 *ngIf="!autoPhase"
192 class="btn btn-info"
193 (click)="changeSectionTo('Endgame')"
194 >
195 Endgame
196 </button>
197 </div>
198 </div>
Filip Kujawa375aaac2023-02-28 21:43:47 -0800199 <div *ngSwitchCase="'Place'" id="Place" class="container-fluid">
Filip Kujawa493b59f2023-03-11 17:58:59 -0800200 <h6 class="text-muted">
201 Last Action: {{actionList[actionList.length - 1].type}}
202 </h6>
Philipp Schrader9ade12c2023-04-20 13:03:33 -0700203 <!--
Filip Kujawaaa7d11f2023-04-13 09:12:32 -0700204 Decrease distance between buttons during auto to make space for auto balancing
205 selection and keep all buttons visible without scrolling on most devices.
206 -->
207 <div
208 [ngClass]="{'d-grid': true, 'gap-3': autoPhase === true, 'gap-5': autoPhase === false}"
209 >
Filip Kujawa9f56d0e2023-03-03 19:44:43 -0800210 <button class="btn btn-secondary" (click)="undoLastAction()">UNDO</button>
211 <button
212 class="btn btn-danger"
213 (click)="changeSectionTo('Dead'); addAction({type: 'robotDeathAction', robotOn: false});"
214 >
215 DEAD
216 </button>
Filip Kujawa375aaac2023-02-28 21:43:47 -0800217 <button
218 class="btn btn-success"
219 (click)="changeSectionTo('Pickup'); addAction({type: 'placeObjectAction', scoreLevel: ScoreLevel.kHigh});"
220 >
221 HIGH
222 </button>
223 <button
224 class="btn btn-warning"
225 (click)="changeSectionTo('Pickup'); addAction({type: 'placeObjectAction', scoreLevel: ScoreLevel.kMiddle});"
226 >
227 MID
228 </button>
229 <button
230 class="btn btn-danger"
231 (click)="changeSectionTo('Pickup'); addAction({type: 'placeObjectAction', scoreLevel: ScoreLevel.kLow});"
232 >
233 LOW
234 </button>
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700235 <button
Filip Kujawab73e94c2023-04-19 09:33:14 -0700236 *ngIf="autoPhase && !mobilityCompleted"
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700237 class="btn btn-light"
238 (click)="addAction({type: 'mobilityAction', mobility: true});"
239 >
240 Mobility
241 </button>
Filip Kujawa7a045e72023-04-13 08:41:09 -0700242 <!-- Impossible to place supercharged pieces in auto. -->
243 <div *ngIf="autoPhase == false" class="d-grid gap-2">
244 <button
245 class="btn btn-dark"
246 (click)="changeSectionTo('Pickup'); addAction({type: 'placeObjectAction', scoreLevel: ScoreLevel.kSupercharged});"
247 >
248 SUPERCHARGED
249 </button>
250 </div>
Filip Kujawa375aaac2023-02-28 21:43:47 -0800251 <!-- 'Balancing' during auto. -->
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700252 <div *ngIf="autoPhase" class="d-grid gap-1">
Filip Kujawa375aaac2023-02-28 21:43:47 -0800253 <label>
Evelyn Yang6cc153d2023-05-24 19:35:16 -0700254 <input
255 #docked
256 type="radio"
257 id="option1"
258 name="docked_engaged"
259 value="docked"
260 />
Philipp Schrader87fe98a2023-04-15 17:26:34 -0700261 Docked (on the charging station)
Filip Kujawa375aaac2023-02-28 21:43:47 -0800262 </label>
263 <label>
Evelyn Yang6cc153d2023-05-24 19:35:16 -0700264 <input
265 #engaged
266 type="radio"
267 id="option2"
268 name="docked_engaged"
269 value="dockedengaged"
270 />
271 Docked &amp; Engaged (level &amp; station lights on)
Filip Kujawa375aaac2023-02-28 21:43:47 -0800272 </label>
Emily Markova63c63f62023-03-29 20:57:35 -0700273 <label>
Evelyn Yang6cc153d2023-05-24 19:35:16 -0700274 <input
275 #attempted
276 type="radio"
277 id="option3"
278 name="docked_engaged"
279 value="failed"
280 />
Emily Markova63c63f62023-03-29 20:57:35 -0700281 Attempted to dock and engage but failed
282 </label>
Philipp Schrader9ade12c2023-04-20 13:03:33 -0700283 <button
284 class="btn btn-dark"
285 (click)="autoPhase = false; addAction({type: 'endAutoPhase'}); addAction({type: 'autoBalanceAction', docked: docked.checked, engaged: engaged.checked, balanceAttempt: attempted.checked});"
286 >
287 Start Teleop
288 </button>
Filip Kujawa375aaac2023-02-28 21:43:47 -0800289 </div>
290 <button
Filip Kujawa375aaac2023-02-28 21:43:47 -0800291 *ngIf="!autoPhase"
292 class="btn btn-info"
293 (click)="changeSectionTo('Endgame')"
294 >
295 Endgame
296 </button>
297 </div>
298 </div>
Filip Kujawa375aaac2023-02-28 21:43:47 -0800299 <div *ngSwitchCase="'Endgame'" id="Endgame" class="container-fluid">
Filip Kujawa493b59f2023-03-11 17:58:59 -0800300 <h6 class="text-muted">
301 Last Action: {{actionList[actionList.length - 1].type}}
302 </h6>
Filip Kujawa36f56082023-03-03 10:58:53 -0800303 <div class="d-grid gap-5">
Filip Kujawa9f56d0e2023-03-03 19:44:43 -0800304 <button class="btn btn-secondary" (click)="undoLastAction()">UNDO</button>
305 <button
306 class="btn btn-danger"
307 (click)="changeSectionTo('Dead'); addAction({type: 'robotDeathAction', robotOn: false});"
308 >
309 DEAD
310 </button>
Filip Kujawa4413a592023-03-01 10:54:34 -0800311 <label>
Evelyn Yang6cc153d2023-05-24 19:35:16 -0700312 <input
313 #docked
314 type="radio"
315 id="option1"
316 name="docked_engaged"
317 value="docked"
318 />
Philipp Schrader87fe98a2023-04-15 17:26:34 -0700319 Docked (on the charging station)
Filip Kujawa4413a592023-03-01 10:54:34 -0800320 </label>
321 <label>
Evelyn Yang6cc153d2023-05-24 19:35:16 -0700322 <input
323 #engaged
324 type="radio"
325 id="option2"
326 name="docked_engaged"
327 value="dockedengaged"
328 />
329 Docked &amp; Engaged (level &amp; station lights on)
Filip Kujawa4413a592023-03-01 10:54:34 -0800330 </label>
Emily Markova63c63f62023-03-29 20:57:35 -0700331 <label>
Evelyn Yang6cc153d2023-05-24 19:35:16 -0700332 <input
333 #attempted
334 type="radio"
335 id="option3"
336 name="docked_engaged"
337 value="failed"
338 />
Emily Markova63c63f62023-03-29 20:57:35 -0700339 Attempted to dock and engage but failed
340 </label>
Filip Kujawa4413a592023-03-01 10:54:34 -0800341 <button
Filip Kujawa375aaac2023-02-28 21:43:47 -0800342 *ngIf="!autoPhase"
Filip Kujawa4413a592023-03-01 10:54:34 -0800343 class="btn btn-info"
Emily Markova63c63f62023-03-29 20:57:35 -0700344 (click)="changeSectionTo('Review and Submit'); addAction({type: 'endMatchAction', docked: docked.checked, engaged: engaged.checked, balanceAttempt: attempted.checked});"
Filip Kujawa4413a592023-03-01 10:54:34 -0800345 >
Filip Kujawa375aaac2023-02-28 21:43:47 -0800346 End Match
Filip Kujawa4413a592023-03-01 10:54:34 -0800347 </button>
348 </div>
Filip Kujawa0ef334c2023-02-20 19:42:45 -0800349 </div>
Filip Kujawa9f56d0e2023-03-03 19:44:43 -0800350 <div *ngSwitchCase="'Dead'" id="Dead" class="container-fluid">
351 <h2>Robot is dead</h2>
352 <div class="d-grid gap-2">
353 <button
354 class="btn btn-success"
355 (click)="changeSectionTo('Pickup'); addAction({type: 'robotDeathAction', robotOn: true}); "
356 >
357 Revive
358 </button>
Filip Kujawa32d13b62023-03-11 17:41:53 -0800359 <button
360 class="btn btn-info"
Philipp Schrader8686bbb2023-03-22 20:15:21 -0700361 (click)="changeSectionTo('Review and Submit'); addAction({type: 'endMatchAction', docked: docked.checked, engaged: engaged.checked});"
Filip Kujawa32d13b62023-03-11 17:41:53 -0800362 >
363 End Match
364 </button>
Filip Kujawa9f56d0e2023-03-03 19:44:43 -0800365 </div>
366 </div>
Filip Kujawa0ef334c2023-02-20 19:42:45 -0800367 <div *ngSwitchCase="'Review and Submit'" id="Review" class="container-fluid">
Emily Markovaf4b06a22023-05-10 17:44:09 -0700368 <div class="row">
369 <ul id="review_data">
370 <li
371 *ngFor="let action of actionList"
372 [ngValue]="action"
373 style="display: flex"
374 >
375 <div [ngSwitch]="action.type" style="padding: 0px">
376 <span *ngSwitchCase="'startMatchAction'">
377 Started match at position {{action.position}}
378 </span>
379 <span *ngSwitchCase="'pickupObjectAction'">
380 Picked up {{stringifyObjectType(action.objectType)}}
381 </span>
382 <span *ngSwitchCase="'placeObjectAction'">
383 Placed at {{stringifyScoreLevel(action.scoreLevel)}}
384 </span>
385 <span *ngSwitchCase="'autoBalanceAction'">
386 Docked: {{action.docked}}, engaged: {{action.engaged}}, attempted
387 to balance and engage: {{action.balanceAttempt}}
388 </span>
389 <span *ngSwitchCase="'endAutoPhase'">Ended auto phase</span>
390 <span *ngSwitchCase="'endMatchAction'">
391 Ended Match; docked: {{action.docked}}, engaged:
392 {{action.engaged}}, attempted to dock and engage:
393 {{action.balanceAttempt}}
394 </span>
395 <span *ngSwitchCase="'robotDeathAction'">
396 Robot on: {{action.robotOn}}
397 </span>
398 <span *ngSwitchCase="'mobilityAction'">
399 Mobility: {{action.mobility}}
400 </span>
401 <span *ngSwitchDefault>{{action.type}}</span>
402 </div>
403 </li>
404 </ul>
405 </div>
Filip Kujawa36f56082023-03-03 10:58:53 -0800406 <div class="d-grid gap-5">
Filip Kujawa9f56d0e2023-03-03 19:44:43 -0800407 <button class="btn btn-secondary" (click)="undoLastAction()">UNDO</button>
Filip Kujawa32d13b62023-03-11 17:41:53 -0800408 <button class="btn btn-warning" (click)="submitActions();">Submit</button>
Filip Kujawa375aaac2023-02-28 21:43:47 -0800409 </div>
Filip Kujawa0ef334c2023-02-20 19:42:45 -0800410 </div>
Filip Kujawa0ef334c2023-02-20 19:42:45 -0800411 <div *ngSwitchCase="'Success'" id="Success" class="container-fluid">
412 <h2>Successfully submitted data.</h2>
Philipp Schrader817cce32022-03-26 15:00:00 -0700413 </div>
Philipp Schrader8686bbb2023-03-22 20:15:21 -0700414
Philipp Schrader8702b782023-04-15 17:33:37 -0700415 <span class="progress_message" role="alert">{{ progressMessage }}</span>
Philipp Schrader8686bbb2023-03-22 20:15:21 -0700416 <span class="error_message" role="alert">{{ errorMessage }}</span>
Philipp Schrader80587432022-03-05 15:41:22 -0800417</ng-container>