Skip to content

Commit 3a17f40

Browse files
committed
Fix up reivew progress indicator on active-challenges list, and make sure submitters don't see their review scores until appeals or after iterative review
1 parent 1bfa7b8 commit 3a17f40

File tree

2 files changed

+117
-7
lines changed

2 files changed

+117
-7
lines changed

src/apps/review/src/lib/components/TableReviewAppealsForSubmitter/TableReviewAppealsForSubmitter.tsx

Lines changed: 94 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
/**
22
* Table Winners.
33
*/
4-
import { FC, MouseEvent, useContext, useMemo } from 'react'
4+
import {
5+
FC,
6+
MouseEvent,
7+
useCallback,
8+
useContext,
9+
useMemo,
10+
} from 'react'
511
import { Link } from 'react-router-dom'
612
import { toast } from 'react-toastify'
713
import { includes, noop } from 'lodash'
@@ -20,8 +26,15 @@ import {
2026
AggregatedReviewDetail,
2127
AggregatedSubmissionReviews,
2228
aggregateSubmissionReviews,
29+
isAppealsPhase,
30+
isAppealsResponsePhase,
2331
} from '../../utils'
24-
import { NO_RESOURCE_ID, WITHOUT_APPEAL } from '../../../config/index.config'
32+
import {
33+
FIRST2FINISH,
34+
NO_RESOURCE_ID,
35+
TRACK_CHALLENGE,
36+
WITHOUT_APPEAL,
37+
} from '../../../config/index.config'
2538
import { ChallengeDetailContext } from '../../contexts'
2639
import { useSubmissionDownloadAccess } from '../../hooks'
2740
import type { UseSubmissionDownloadAccessResult } from '../../hooks/useSubmissionDownloadAccess'
@@ -73,6 +86,29 @@ export const TableReviewAppealsForSubmitter: FC<Props> = (props: Props) => {
7386
[challengeTrack, challengeType],
7487
)
7588

89+
const isFirst2FinishChallenge = useMemo(
90+
() => [challengeType, challengeTrack]
91+
.some(type => type === FIRST2FINISH),
92+
[challengeTrack, challengeType],
93+
)
94+
95+
const isStandardChallenge = useMemo(
96+
() => [challengeType, challengeTrack]
97+
.some(type => type === TRACK_CHALLENGE),
98+
[challengeTrack, challengeType],
99+
)
100+
101+
const isAppealsWindowOpen = useMemo(
102+
() => isAppealsPhase(challengeInfo)
103+
|| isAppealsResponsePhase(challengeInfo),
104+
[challengeInfo],
105+
)
106+
107+
const shouldShowAppealsColumn = useMemo(
108+
() => allowsAppeals && (isAppealsWindowOpen || isChallengeCompleted),
109+
[allowsAppeals, isAppealsWindowOpen, isChallengeCompleted],
110+
)
111+
76112
const aggregatedRows = useMemo(() => aggregateSubmissionReviews({
77113
mappingReviewAppeal,
78114
reviewers,
@@ -95,6 +131,43 @@ export const TableReviewAppealsForSubmitter: FC<Props> = (props: Props) => {
95131
[aggregatedRows],
96132
)
97133

134+
const canDisplayScores = useCallback(
135+
(submission: SubmissionRow): boolean => {
136+
if (isChallengeCompleted) {
137+
return true
138+
}
139+
140+
if (isFirst2FinishChallenge) {
141+
const reviews = submission.aggregated?.reviews ?? []
142+
if (!reviews.length) {
143+
return false
144+
}
145+
146+
const allReviewsCompleted = reviews.every(review => {
147+
const status = (review.reviewInfo?.status ?? '').toUpperCase()
148+
const committed = review.reviewInfo?.committed ?? false
149+
150+
return committed
151+
|| includes(['COMPLETED', 'SUBMITTED'], status)
152+
})
153+
154+
return allReviewsCompleted
155+
}
156+
157+
if (isStandardChallenge) {
158+
return isAppealsWindowOpen
159+
}
160+
161+
return true
162+
},
163+
[
164+
isAppealsWindowOpen,
165+
isChallengeCompleted,
166+
isFirst2FinishChallenge,
167+
isStandardChallenge,
168+
],
169+
)
170+
98171
const columns = useMemo<TableColumn<SubmissionRow>[]>(() => {
99172
const submissionColumn: TableColumn<SubmissionRow> = {
100173
className: styles.submissionColumn,
@@ -222,6 +295,14 @@ export const TableReviewAppealsForSubmitter: FC<Props> = (props: Props) => {
222295
columnId: 'review-score',
223296
label: 'Review Score',
224297
renderer: (data: SubmissionRow) => {
298+
if (!canDisplayScores(data)) {
299+
return (
300+
<span className={styles.notReviewed}>
301+
--
302+
</span>
303+
)
304+
}
305+
225306
const scoreDisplay = data.aggregated?.averageFinalScoreDisplay
226307
if (!scoreDisplay) {
227308
return (
@@ -294,6 +375,14 @@ export const TableReviewAppealsForSubmitter: FC<Props> = (props: Props) => {
294375
)
295376
}
296377

378+
if (!canDisplayScores(data)) {
379+
return (
380+
<span className={styles.notReviewed}>
381+
--
382+
</span>
383+
)
384+
}
385+
297386
const finalScore = reviewDetail?.finalScore
298387
const formattedScore = typeof finalScore === 'number' && Number.isFinite(finalScore)
299388
? finalScore.toFixed(2)
@@ -386,7 +475,7 @@ export const TableReviewAppealsForSubmitter: FC<Props> = (props: Props) => {
386475
type: 'element',
387476
})
388477

389-
if (allowsAppeals) {
478+
if (shouldShowAppealsColumn) {
390479
aggregatedColumns.push({
391480
className: styles.tableCellNoWrap,
392481
columnId: `appeals-${index}`,
@@ -400,11 +489,13 @@ export const TableReviewAppealsForSubmitter: FC<Props> = (props: Props) => {
400489
return aggregatedColumns
401490
}, [
402491
allowsAppeals,
492+
canDisplayScores,
403493
downloadSubmission,
404494
isSubmissionDownloadRestricted,
405495
isDownloading,
406496
isChallengeCompleted,
407497
maxReviewCount,
498+
shouldShowAppealsColumn,
408499
restrictionMessage,
409500
])
410501

src/apps/review/src/lib/hooks/useFetchActiveReviews.ts

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,24 @@ export interface useFetchActiveReviewsProps {
4141
pagination: ActiveReviewsPagination
4242
}
4343

44+
const normalizeReviewProgressValue = (value: number): number => {
45+
if (!Number.isFinite(value)) {
46+
return 0
47+
}
48+
49+
const percentage = value <= 1 ? value * 100 : value
50+
51+
if (percentage < 0) {
52+
return 0
53+
}
54+
55+
if (percentage > 100) {
56+
return 100
57+
}
58+
59+
return percentage
60+
}
61+
4462
export const transformAssignments = (
4563
assignments: BackendMyReviewAssignment[],
4664
startIndex = 1,
@@ -92,14 +110,15 @@ export const transformAssignments = (
92110
)
93111
: undefined
94112

95-
const reviewProgressValues = items
113+
const normalizedReviewProgressValues = items
96114
.map(item => item.reviewProgress)
97115
.filter((value): value is number => typeof value === 'number')
116+
.map(normalizeReviewProgressValue)
98117

99-
const aggregatedReviewProgress = reviewProgressValues.length
118+
const aggregatedReviewProgress = normalizedReviewProgressValues.length
100119
? Math.round(
101-
reviewProgressValues.reduce((total, value) => total + value, 0)
102-
/ reviewProgressValues.length,
120+
normalizedReviewProgressValues.reduce((total, value) => total + value, 0)
121+
/ normalizedReviewProgressValues.length,
103122
)
104123
: undefined
105124

0 commit comments

Comments
 (0)