1
- import { Competition , Defense , Drivetrain , IntakeTypes , Pitreport , Report , SwerveLevel } from "@/lib/Types" ;
1
+ import { Competition , Defense , Drivetrain , IntakeTypes , Pitreport , Report , SubjectiveReport , SwerveLevel } from "@/lib/Types" ;
2
2
import { useEffect , useState } from "react" ;
3
3
4
4
import {
@@ -109,7 +109,9 @@ function TeamCard(props: {
109
109
< span className = { `${ props . rank === 1 && "drop-shadow-glowStrong" } ` } > #{ props . number } </ span >
110
110
< div className = { `badge badge-${ badgeColor } text-2xl p-3` } > { props . rank } { rankSuffix } </ div >
111
111
</ h2 >
112
- < p > Avg Points: { avgPoints } ({ pointsDiffFromAvgFormatted } )</ p >
112
+ < p > Avg Points: { avgPoints } { " " }
113
+ < span className = "tooltip" data-tip = "Difference from comp-wide average" > ({ pointsDiffFromAvgFormatted } )</ span >
114
+ </ p >
113
115
< div className = "card-actions" >
114
116
< div className = { `badge badge-sm badge-${ defenseBadgeColor } ` } >
115
117
{ defense } Defense
@@ -162,66 +164,69 @@ function TeamCard(props: {
162
164
) ;
163
165
}
164
166
165
- export default function TeamPage ( props : { reports : Report [ ] , pitReports : Pitreport [ ] } ) {
167
+ export default function TeamPage ( props : { reports : Report [ ] , pitReports : Pitreport [ ] , subjectiveReports : SubjectiveReport [ ] } ) {
166
168
const reports = props . reports ;
167
169
const pitReports : { [ key : number ] : Pitreport } = { } ;
168
-
169
- const [ associatingTeams , setAssociatingTeams ] = useState ( true ) ;
170
170
const [ teamReports , setTeamReports ] = useState < { [ key : number ] : Report [ ] } > (
171
171
{ }
172
172
) ;
173
+ const [ teamSubjectiveReports , setTeamSubjectiveReports ] = useState < { [ key : number ] : SubjectiveReport [ ] } > ( { } ) ;
173
174
174
175
const teamNumbers = Object . keys ( teamReports ) ;
175
176
176
- const [ teamRanking , setTeamRanking ] = useState < string [ ] > ( [ ] ) ;
177
-
178
177
const [ selectedTeam , setSelectedTeam ] = useState < number > ( ) ;
179
178
const selectedReports = teamReports [ selectedTeam ? selectedTeam : 0 ] ;
180
179
181
180
const associateTeams = ( ) => {
182
- setAssociatingTeams ( true ) ;
183
-
181
+ const newTeamReports : typeof teamReports = { } ;
184
182
reports . forEach ( ( report ) => {
185
- if ( ! ( report . robotNumber in teamReports ) ) {
186
- teamReports [ report . robotNumber ] = [ report ] ;
183
+ if ( ! ( report . robotNumber in newTeamReports ) ) {
184
+ newTeamReports [ report . robotNumber ] = [ report ] ;
187
185
} else {
188
- teamReports [ report . robotNumber ] . push ( report ) ;
186
+ newTeamReports [ report . robotNumber ] . push ( report ) ;
189
187
}
190
188
} ) ;
191
-
192
- setAssociatingTeams ( false ) ;
189
+ setTeamReports ( newTeamReports ) ;
193
190
} ;
194
191
192
+ useEffect ( ( ) => {
193
+ const subjectiveReports : typeof teamSubjectiveReports = { } ;
194
+ props . subjectiveReports . forEach ( ( subjectiveReport ) => {
195
+ for ( const teamNumber of Object . keys ( subjectiveReport . robotComments ) ) {
196
+ if ( ! Object . keys ( subjectiveReports ) . includes ( teamNumber ) ) {
197
+ subjectiveReports [ Number ( teamNumber ) ] = [ subjectiveReport ] ;
198
+ } else {
199
+ subjectiveReports [ Number ( teamNumber ) ] . push ( subjectiveReport ) ;
200
+ }
201
+ }
202
+ } ) ;
203
+ setTeamSubjectiveReports ( subjectiveReports ) ;
204
+ } , [ props . subjectiveReports ] ) ;
205
+
195
206
const pointTotals = reports . map ( ( report ) => TotalPoints ( [ report ] ) ) ;
196
207
const avgPoints = AveragePoints ( reports ) ;
197
208
const stDev = StandardDeviation ( pointTotals ) ;
198
209
199
- const rankTeams = ( ) => {
200
- const ranked = Object . keys ( teamReports ) . sort ( ( a , b ) => {
201
- const a1 = AveragePoints ( teamReports [ Number ( a ) ] ) ;
202
- const b1 = AveragePoints ( teamReports [ Number ( b ) ] ) ;
203
- if ( a1 < b1 ) {
204
- return 1 ;
205
- } else if ( a1 > b1 ) {
206
- return - 1 ;
207
- }
208
- return 0 ;
209
- } ) ;
210
- setTeamRanking ( ranked ) ;
211
- } ;
212
-
213
210
useEffect ( ( ) => {
214
- if ( teamNumbers . length < 1 ) {
215
211
associateTeams ( ) ;
216
- rankTeams ( ) ;
217
- }
218
- } ) ;
212
+ } , [ reports ] ) ;
219
213
220
214
// Associate pit reports
221
215
props . pitReports . forEach ( ( pitReport ) => {
222
216
pitReports [ pitReport . teamNumber ] = pitReport ;
223
217
} ) ;
224
218
219
+ const teamRanking = Object . keys ( teamReports ) . sort ( ( a , b ) => {
220
+ const a1 = AveragePoints ( teamReports [ Number ( a ) ] ) ;
221
+ const b1 = AveragePoints ( teamReports [ Number ( b ) ] ) ;
222
+ if ( a1 < b1 ) {
223
+ return 1 ;
224
+ } else if ( a1 > b1 ) {
225
+ return - 1 ;
226
+ }
227
+ return 0 ;
228
+ } ) ;
229
+
225
230
return (
226
231
< div className = "w-full h-min flex flex-row space-x-4" >
227
232
< div className = "w-1/5 h-[50rem] flex flex-col space-y-4 overflow-y-scroll" >
@@ -233,9 +238,7 @@ export default function TeamPage(props: { reports: Report[], pitReports: Pitrepo
233
238
reports = { teamReports [ Number ( number ) ] }
234
239
pitReport = { pitReports [ Number ( number ) ] }
235
240
rank = { index + 1 }
236
- onClick = { ( ) => {
237
- setSelectedTeam ( Number ( number ) ) ;
238
- } }
241
+ onClick = { ( ) => setSelectedTeam ( Number ( number ) ) }
239
242
compAvgPoints = { avgPoints }
240
243
compPointsStDev = { stDev }
241
244
> </ TeamCard >
@@ -246,6 +249,7 @@ export default function TeamPage(props: { reports: Report[], pitReports: Pitrepo
246
249
selectedReports = { selectedReports }
247
250
selectedTeam = { selectedTeam }
248
251
pitReport = { pitReports [ selectedTeam ?? 0 ] }
252
+ subjectiveReports = { teamSubjectiveReports [ selectedTeam ?? 0 ] }
249
253
> </ TeamStats >
250
254
251
255
< div className = "w-5/12 h-full flex flex-col space-y-4" >
0 commit comments