blob: 1b3a96644ebe5800069d34c7effe797144ac720b [file] [log] [blame]
<div class="header" #header>
<h2>
<span *ngIf="section != 'Team Selection'">{{teamNumber}}</span>
{{section}}
</h2>
</div>
<ng-container [ngSwitch]="section">
<div
*ngSwitchCase="'Team Selection'"
id="team_selection"
class="container-fluid"
>
<div class="row">
<label for="match_number">Match Number</label>
<input
[(ngModel)]="matchNumber"
(ngModelChange)="updateTeamSelectionValidity()"
type="number"
id="match_number"
min="1"
max="999"
/>
</div>
<div class="row">
<label for="team_number">Team Number</label>
<input
[(ngModel)]="teamNumber"
(ngModelChange)="updateTeamSelectionValidity()"
type="text"
id="team_number"
/>
</div>
<div class="row">
<label for="set_number">Set Number</label>
<input
[(ngModel)]="setNumber"
(ngModelChange)="updateTeamSelectionValidity()"
type="number"
id="set_number"
min="1"
max="10"
/>
</div>
<div class="row">
<label for="comp_level">Comp Level</label>
<select
[(ngModel)]="compLevel"
(ngModelChange)="updateTeamSelectionValidity()"
type="number"
id="comp_level"
>
<option *ngFor="let level of COMP_LEVELS" [ngValue]="level">
{{COMP_LEVEL_LABELS[level]}}
</option>
</select>
</div>
<div class="row">
<label>
<input
id="pre_scouting"
name="comp_type"
type="radio"
[(ngModel)]="compType"
value="Prescouting"
(ngModelChange)="updateTeamSelectionValidity()"
/>
Pre-scouting
</label>
</div>
<div class="row">
<label>
<input
id="practice_match"
name="comp_type"
type="radio"
[(ngModel)]="compType"
value="Practice"
(ngModelChange)="updateTeamSelectionValidity()"
/>
Practice Match
</label>
</div>
<div class="buttons">
<!-- hack to right align the next button -->
<div></div>
<button
class="btn btn-primary"
(click)="changeSectionTo('Init');"
[disabled]="!teamSelectionIsValid"
>
Next
</button>
</div>
</div>
<div *ngSwitchCase="'Init'" id="init" class="container-fluid">
<h2>Select Starting Position</h2>
<img
id="field_starting_positions_image"
src="/sha256/bb83d2c976c1496bb470371821d1d1882d6baf31178009a6f6cba579880c6a03/pictures/field/2024_field.png"
alt="Starting Positions Image"
class="img-fluid"
/>
<div *ngFor="let i of [1, 2, 3, 4]">
<label>
<input
type="radio"
name="radio-group"
[value]="i"
[(ngModel)]="selectedValue"
/>
{{ i }}
</label>
</div>
<div class="buttons">
<!-- Creates a responsive stack of full-width, "block buttons". -->
<div class="d-grid gap-5">
<button
class="btn btn-warning"
(click)="changeSectionTo('Review and Submit'); actionHelper.addNoShowAction({});"
>
No Show
</button>
<button
class="btn btn-primary"
[disabled]="!selectedValue"
(click)="changeSectionTo('Pickup'); actionHelper.addStartMatchAction({position: selectedValue});"
>
Start Match
</button>
</div>
</div>
</div>
<div *ngSwitchCase="'Pickup'" id="PickUp" class="container-fluid">
<h6 class="text-muted">
Last Action: {{ActionType[actionList[actionList.length -
1].actionTakenType]}}
</h6>
<!--
Decrease distance between buttons during auto to make space for auto balancing
selection and keep all buttons visible without scrolling on most devices.
-->
<div
[ngClass]="{'d-grid': true, 'gap-3': autoPhase === true, 'gap-5': autoPhase === false}"
>
<button class="btn btn-secondary" (click)="undoLastAction()">UNDO</button>
<button
class="btn btn-danger"
(click)="changeSectionTo('Dead'); actionHelper.addRobotDeathAction({robotDead: true});"
>
DEAD
</button>
<button
class="btn btn-warning"
(click)="changeSectionTo('Place'); actionHelper.addPickupNoteAction({auto: autoPhase});"
>
NOTE
</button>
<button
*ngIf="autoPhase && !mobilityCompleted"
class="btn btn-light"
(click)="actionHelper.addMobilityAction({mobility: true});"
>
Mobility
</button>
<div style="display: flex">
<h5>Penalties :</h5>
<button
class="btn-light"
style="width: 40px; margin-right: 15px"
(click)="removePenalty()"
>
-
</button>
<p>{{this.penalties}}</p>
<button
class="btn-light"
style="width: 40px; margin-left: 15px"
(click)="addPenalty()"
>
+
</button>
</div>
<button
*ngIf="autoPhase"
class="btn btn-primary"
(click)="autoPhase = false; actionHelper.addEndAutoPhaseAction({});"
>
Start Teleop
</button>
<button
*ngIf="!autoPhase"
class="btn btn-primary"
(click)="changeSectionTo('Endgame'); actionHelper.addEndTeleopPhaseAction({});"
>
Endgame
</button>
</div>
</div>
<div *ngSwitchCase="'Place'" id="Place" class="container-fluid">
<h6 class="text-muted">
Last Action: {{ActionType[actionList[actionList.length -
1].actionTakenType]}}
</h6>
<!--
Decrease distance between buttons during auto to make space for auto balancing
selection and keep all buttons visible without scrolling on most devices.
-->
<div
[ngClass]="{'d-grid': true, 'gap-4': autoPhase === true, 'gap-3': autoPhase === false}"
>
<button class="btn btn-secondary" (click)="undoLastAction()">UNDO</button>
<button
class="btn btn-danger"
(click)="changeSectionTo('Dead'); actionHelper.addRobotDeathAction({robotDead: true});"
>
DEAD
</button>
<div class="half-button-container">
<button
class="btn btn-info half-button"
(click)="changeSectionTo('Pickup'); actionHelper.addPlaceNoteAction({auto: autoPhase, scoreType: ScoreType.kDROPPED});"
>
Dropped
</button>
<button
class="btn btn-info half-button"
(click)="changeSectionTo('Pickup'); actionHelper.addPlaceNoteAction({auto: autoPhase, scoreType: ScoreType.kOUT_OF_FIELD});"
>
Out Of Field
</button>
</div>
<div
*ngIf="!autoPhase"
class="d-grid gap-1"
style="padding: 0; margin: 0"
>
<div class="half-button-container">
<button
class="btn btn-success half-button"
(click)="changeSectionTo('Pickup'); actionHelper.addPlaceNoteAction({auto: autoPhase, scoreType: ScoreType.kAMP});"
>
AMP
</button>
<button
class="btn btn-warning half-button"
(click)="changeSectionTo('Pickup'); actionHelper.addPlaceNoteAction({auto: autoPhase, scoreType: ScoreType.kSHUTTLED});"
>
SHUTTLED
</button>
<button
class="btn btn-success half-button"
(click)="changeSectionTo('Pickup'); actionHelper.addPlaceNoteAction({auto: autoPhase, scoreType: ScoreType.kSPEAKER});"
>
SPEAKER
</button>
<button
class="btn btn-warning half-button"
(click)="changeSectionTo('Pickup'); actionHelper.addPlaceNoteAction({auto: autoPhase, scoreType: ScoreType.kSPEAKER_AMPLIFIED});"
>
SPEAKER AMPLIFIED
</button>
</div>
</div>
<button
*ngIf="autoPhase"
class="btn btn-success"
(click)="changeSectionTo('Pickup'); actionHelper.addPlaceNoteAction({auto: autoPhase, scoreType: ScoreType.kAMP});"
>
AMP
</button>
<button
*ngIf="autoPhase"
class="btn btn-warning"
(click)="changeSectionTo('Pickup'); actionHelper.addPlaceNoteAction({auto: autoPhase, scoreType: ScoreType.kSPEAKER});"
>
SPEAKER
</button>
<button
*ngIf="autoPhase && !mobilityCompleted"
class="btn btn-light"
(click)="actionHelper.addMobilityAction({mobility: true});"
>
Mobility
</button>
<div style="display: flex">
<h5>Penalties :</h5>
<button
class="btn-light"
style="width: 40px; margin-right: 15px"
(click)="removePenalty()"
>
-
</button>
<p>{{this.penalties}}</p>
<button
class="btn-light"
style="width: 40px; margin-left: 15px"
(click)="addPenalty()"
>
+
</button>
</div>
<button
class="btn btn-primary"
*ngIf="autoPhase"
(click)="autoPhase = false; actionHelper.addEndAutoPhaseAction({});"
>
Start Teleop
</button>
<button
*ngIf="!autoPhase"
class="btn btn-primary"
(click)="changeSectionTo('Endgame'); actionHelper.addEndTeleopPhaseAction({});"
>
Endgame
</button>
</div>
</div>
<div *ngSwitchCase="'Endgame'" id="Endgame" class="container-fluid">
<h6 class="text-muted">
Last Action: {{ActionType[actionList[actionList.length -
1].actionTakenType]}}
</h6>
<div class="d-grid gap-2">
<button class="btn btn-secondary" (click)="undoLastAction()">UNDO</button>
<button
class="btn btn-danger"
(click)="changeSectionTo('Dead'); actionHelper.addRobotDeathAction({robotDead: true});"
>
DEAD
</button>
<div class="button_row">
<label>
<input
type="radio"
name="endgameaction"
[value]="StageType.kPARK"
[(ngModel)]="endGameAction"
/>
Park
</label>
<label>
<input
type="radio"
name="endgameaction"
[value]="StageType.kON_STAGE"
[(ngModel)]="endGameAction"
/>
On Stage
</label>
</div>
<div class="button_row">
<label>
<input
type="radio"
name="endgameaction"
[value]="StageType.kHARMONY"
[(ngModel)]="endGameAction"
/>
Harmony
</label>
<label>
<input
type="radio"
name="endgameaction"
[value]="StageType.kMISSING"
[(ngModel)]="endGameAction"
/>
N/A
</label>
</div>
<label>
<input type="checkbox" name="trapnote" [(ngModel)]="noteIsTrapped" />
Trap Note
</label>
<label>
<input
type="checkbox"
name="spotlight"
[(ngModel)]="endGameSpotlight"
/>
Spotlight
</label>
<div style="display: flex">
<h5>Penalties :</h5>
<button
class="btn-light"
style="width: 40px; margin-right: 15px"
(click)="removePenalty()"
>
-
</button>
<p>{{this.penalties}}</p>
<button
class="btn-light"
style="width: 40px; margin-left: 15px"
(click)="addPenalty()"
>
+
</button>
</div>
<button
*ngIf="!autoPhase"
class="btn btn-primary"
(click)="changeSectionTo('Review and Submit'); addPenalties(); actionHelper.addEndMatchAction({stageType: endGameAction, trapNote: noteIsTrapped, spotlight: endGameSpotlight});"
>
End Match
</button>
</div>
</div>
<div *ngSwitchCase="'Dead'" id="Dead" class="container-fluid">
<h2>Robot is dead</h2>
<div class="d-grid gap-3">
<button class="btn btn-secondary" (click)="undoLastAction()">UNDO</button>
<div style="display: flex">
<h5>Penalties :</h5>
<button
class="btn-light"
style="width: 40px; margin-right: 15px"
(click)="removePenalty()"
>
-
</button>
<p>{{this.penalties}}</p>
<button
class="btn-light"
style="width: 40px; margin-left: 15px"
(click)="addPenalty()"
>
+
</button>
</div>
<button
class="btn btn-success"
(click)="changeSectionTo('Pickup'); actionHelper.addRobotDeathAction({robotDead: false}); "
>
Revive
</button>
<button
class="btn btn-primary"
(click)="changeSectionTo('Review and Submit'); addPenalties(); actionHelper.addEndMatchAction({stageType: endGameAction, trapNote: noteIsTrapped, spotlight: endGameSpotlight});"
>
End Match
</button>
</div>
</div>
<div *ngSwitchCase="'Review and Submit'" id="Review" class="container-fluid">
<div class="row">
<ul id="review_data">
<div *ngIf="compType!='Regular'">This is a {{this.compType}} match</div>
<li *ngFor="let action of actionList" style="display: flex">
<div [ngSwitch]="action.actionTakenType" style="padding: 0px">
<span *ngSwitchCase="ActionType.StartMatchAction">
Started match at position {{(action.actionTaken | cast:
StartMatchActionT).position}}
</span>
<span *ngSwitchCase="ActionType.PickupNoteAction">
Picked up Note
</span>
<span *ngSwitchCase="ActionType.PlaceNoteAction">
Placed at {{stringifyScoreType((action.actionTaken | cast:
PlaceNoteActionT).scoreType)}}
</span>
<span *ngSwitchCase="ActionType.EndAutoPhaseAction">
Ended auto phase
</span>
<span *ngSwitchCase="ActionType.EndMatchAction">
Ended Match; stageType: {{stringifyStageType((action.actionTaken |
cast: EndMatchActionT).stageType)}}, trapNote:
{{(action.actionTaken | cast: EndMatchActionT).trapNote}},
spotlight: {{(action.actionTaken | cast:
EndMatchActionT).spotlight}}
</span>
<span *ngSwitchCase="ActionType.RobotDeathAction">
Robot dead: {{(action.actionTaken | cast:
RobotDeathActionT).robotDead}}
</span>
<span *ngSwitchCase="ActionType.MobilityAction">
Mobility: {{(action.actionTaken | cast:
MobilityActionT).mobility}}
</span>
<span *ngSwitchCase="ActionType.NoShowAction">NoShow: true</span>
<span *ngSwitchDefault>{{action.actionTakenType}}</span>
<span *ngSwitchCase="ActionType.PenaltyAction">
Penalties: {{(action.actionTaken | cast:
PenaltyActionT).penalties}}
</span>
</div>
</li>
</ul>
</div>
<div class="d-grid gap-5">
<button class="btn btn-secondary" (click)="undoLastAction()">UNDO</button>
<button class="btn btn-info" (click)="changeSectionTo('QR Code');">
Create QR Code
</button>
<button class="btn btn-warning" (click)="submit2024Actions();">
Submit
</button>
</div>
</div>
<div *ngSwitchCase="'Success'" id="Success" class="container-fluid">
<h2>Successfully submitted data.</h2>
<div class="d-grid gap-5" *ngIf="nextTeamNumber != ''">
<button class="btn btn-primary" (click)="goToNextTeam();">
SCOUT NEXT TEAM
</button>
</div>
</div>
<div *ngSwitchCase="'QR Code'" id="QR Code" class="container-fluid">
<span>Density:</span>
<select
[(ngModel)]="qrCodeValuePieceSize"
(ngModelChange)="updateQrCodeValuePieceSize()"
type="number"
id="qr_code_piece_size"
>
<option
*ngFor="let pieceSize of QR_CODE_PIECE_SIZES"
[ngValue]="pieceSize"
>
{{pieceSize}}
</option>
</select>
<div class="qr-container">
<qrcode
[qrdata]="qrCodeValuePieces[qrCodeValueIndex]"
[width]="1000"
[errorCorrectionLevel]="'M'"
[margin]="6"
class="qrcode"
></qrcode>
</div>
<nav class="qrcode-nav">
<ul
class="qrcode-buttons pagination pagination-lg justify-content-center"
>
<li class="page-item">
<a
class="page-link"
href="#"
aria-label="Previous"
(click)="setQrCodeValueIndex(qrCodeValueIndex - 1)"
>
<span aria-hidden="true">&laquo;</span>
<span class="visually-hidden">Previous</span>
</a>
</li>
<li *ngFor="let _ of qrCodeValuePieces; index as i" class="page-item">
<a
class="page-link"
href="#"
(click)="setQrCodeValueIndex(i)"
[class.active]="qrCodeValueIndex == i"
>
{{i + 1}}
</a>
</li>
<li class="page-item">
<a
class="page-link"
href="#"
aria-label="Next"
(click)="setQrCodeValueIndex(qrCodeValueIndex + 1)"
>
<span aria-hidden="true">&raquo;</span>
<span class="visually-hidden">Next</span>
</a>
</li>
</ul>
</nav>
<button
class="btn btn-secondary"
(click)="changeSectionTo('Review and Submit')"
>
BACK
</button>
</div>
<span class="progress_message" role="alert">{{ progressMessage }}</span>
<span class="error_message" role="alert">{{ errorMessage }}</span>
</ng-container>