Skip to content

Commit d6ad95d

Browse files
committed
Better handling of screening phase in UI for submitters
1 parent baa7ac4 commit d6ad95d

File tree

10 files changed

+589
-126
lines changed

10 files changed

+589
-126
lines changed

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

Lines changed: 197 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,21 @@ import { FC, ReactNode, useContext, useMemo } from 'react'
66
import { ActionLoading } from '~/apps/admin/src/lib'
77

88
import { ChallengeDetailContext } from '../../contexts'
9-
import { ChallengeInfo, MappingReviewAppeal, Screening, SubmissionInfo } from '../../models'
9+
import {
10+
BackendSubmission,
11+
ChallengeInfo,
12+
MappingReviewAppeal,
13+
Screening,
14+
SubmissionInfo,
15+
} from '../../models'
1016
import {
1117
useDownloadSubmission,
1218
useDownloadSubmissionProps,
13-
useRole, useRoleProps } from '../../hooks'
19+
useRole,
20+
useRoleProps,
21+
useSubmissionDownloadAccess,
22+
UseSubmissionDownloadAccessResult,
23+
} from '../../hooks'
1424
import {
1525
useFetchChallengeResults,
1626
useFetchChallengeResultsProps,
@@ -25,12 +35,14 @@ import TabContentIterativeReview from './TabContentIterativeReview'
2535
import TabContentRegistration from './TabContentRegistration'
2636
import TabContentReview from './TabContentReview'
2737
import TabContentScreening from './TabContentScreening'
38+
import TabContentSubmissions from './TabContentSubmissions'
2839
import TabContentWinners from './TabContentWinners'
2940

3041
interface Props {
3142
selectedTab: string
3243
isLoadingSubmission: boolean
3344
screening: Screening[]
45+
submissions: BackendSubmission[]
3446
checkpoint: Screening[]
3547
checkpointReview: Screening[]
3648
review: SubmissionInfo[]
@@ -52,9 +64,87 @@ const TabContentPlaceholder = (props: { message: string }): JSX.Element => (
5264
</TabContentWrapper>
5365
)
5466

67+
const SUBMISSION_TAB_KEYS = new Set([
68+
'submission',
69+
'screening',
70+
'submission / screening',
71+
])
72+
73+
const CHECKPOINT_TAB_KEYS = new Set([
74+
'checkpoint',
75+
'checkpoint submission',
76+
'checkpoint screening',
77+
'checkpoint review',
78+
])
79+
80+
interface BuildScreeningRowsParams {
81+
screening: Screening[]
82+
actionChallengeRole: useRoleProps['actionChallengeRole']
83+
currentMemberId: UseSubmissionDownloadAccessResult['currentMemberId']
84+
}
85+
86+
const buildScreeningRows = ({
87+
screening,
88+
actionChallengeRole,
89+
currentMemberId,
90+
}: BuildScreeningRowsParams): Screening[] => {
91+
const filteredScreening = actionChallengeRole === SUBMITTER && currentMemberId
92+
? screening.filter(entry => entry.memberId === currentMemberId)
93+
: screening
94+
95+
return hasIsLatestFlag(filteredScreening)
96+
? filteredScreening.filter(submission => submission.isLatest === true)
97+
: filteredScreening
98+
}
99+
100+
interface SubmissionTabParams {
101+
selectedTabLower: string
102+
submissions: BackendSubmission[]
103+
screeningRows: Screening[]
104+
isLoadingSubmission: boolean
105+
isDownloadingSubmission: useDownloadSubmissionProps['isLoading']
106+
downloadSubmission: useDownloadSubmissionProps['downloadSubmission']
107+
isActiveChallenge: boolean
108+
}
109+
110+
const renderSubmissionTab = ({
111+
selectedTabLower,
112+
submissions,
113+
screeningRows,
114+
isLoadingSubmission,
115+
isDownloadingSubmission,
116+
downloadSubmission,
117+
isActiveChallenge,
118+
}: SubmissionTabParams): JSX.Element => {
119+
const canShowSubmissionList = selectedTabLower !== 'screening' && submissions.length > 0
120+
121+
if (canShowSubmissionList) {
122+
return (
123+
<TabContentSubmissions
124+
submissions={submissions}
125+
isLoading={isLoadingSubmission}
126+
isDownloading={isDownloadingSubmission}
127+
downloadSubmission={downloadSubmission}
128+
/>
129+
)
130+
}
131+
132+
return (
133+
<TabContentScreening
134+
screening={screeningRows}
135+
isLoadingScreening={isLoadingSubmission}
136+
isDownloading={isDownloadingSubmission}
137+
downloadSubmission={downloadSubmission}
138+
isActiveChallenge={isActiveChallenge}
139+
showScreeningColumns={selectedTabLower !== 'submission'}
140+
/>
141+
)
142+
}
143+
55144
export const ChallengeDetailsContent: FC<Props> = (props: Props) => {
56145
const { challengeInfo }: { challengeInfo?: ChallengeInfo } = useContext(ChallengeDetailContext)
57146
const { actionChallengeRole }: useRoleProps = useRole()
147+
const { currentMemberId }: UseSubmissionDownloadAccessResult = useSubmissionDownloadAccess()
58148
const {
59149
isLoading: isDownloadingSubmission,
60150
isLoadingBool: isDownloadingSubmissionBool,
@@ -94,118 +184,116 @@ export const ChallengeDetailsContent: FC<Props> = (props: Props) => {
94184
return `The ${name} phase hasn't opened yet.`
95185
}, [selectedPhase, props.selectedTab])
96186

187+
const renderSelectedTab = (): JSX.Element => {
188+
const selectedTabLower = (props.selectedTab || '').toLowerCase()
189+
190+
if (selectedTabLower === 'registration') {
191+
return <TabContentRegistration />
192+
}
193+
194+
const screeningRows = buildScreeningRows({
195+
actionChallengeRole,
196+
currentMemberId,
197+
screening: props.screening,
198+
})
199+
200+
if (SUBMISSION_TAB_KEYS.has(selectedTabLower)) {
201+
return renderSubmissionTab({
202+
downloadSubmission,
203+
isActiveChallenge: props.isActiveChallenge,
204+
isDownloadingSubmission,
205+
isLoadingSubmission: props.isLoadingSubmission,
206+
screeningRows,
207+
selectedTabLower,
208+
submissions: props.submissions,
209+
})
210+
}
211+
212+
if (CHECKPOINT_TAB_KEYS.has(selectedTabLower)) {
213+
return (
214+
<TabContentCheckpoint
215+
checkpoint={props.checkpoint}
216+
checkpointReview={props.checkpointReview}
217+
isLoading={props.isLoadingSubmission}
218+
isDownloading={isDownloadingSubmission}
219+
downloadSubmission={downloadSubmission}
220+
selectedTab={props.selectedTab}
221+
/>
222+
)
223+
}
224+
225+
if (selectedTabLower === 'winners') {
226+
return (
227+
<TabContentWinners
228+
isLoading={isLoadingProjectResult}
229+
projectResults={projectResults}
230+
isDownloading={isDownloadingSubmission}
231+
downloadSubmission={downloadSubmission}
232+
/>
233+
)
234+
}
235+
236+
if (selectedTabLower === 'approval') {
237+
return (
238+
<TabContentApproval
239+
reviews={props.approvalReviews}
240+
submitterReviews={props.submitterReviews}
241+
isLoadingReview={props.isLoadingSubmission}
242+
isDownloading={isDownloadingSubmission}
243+
downloadSubmission={downloadSubmission}
244+
isActiveChallenge={props.isActiveChallenge}
245+
/>
246+
)
247+
}
248+
249+
if (selectedTabLower === 'post-mortem') {
250+
return (
251+
<TabContentIterativeReview
252+
reviews={props.postMortemReviews}
253+
submitterReviews={props.submitterReviews}
254+
isLoadingReview={props.isLoadingSubmission}
255+
isDownloading={isDownloadingSubmission}
256+
downloadSubmission={downloadSubmission}
257+
isActiveChallenge={props.isActiveChallenge}
258+
columnLabel='Post-Mortem'
259+
/>
260+
)
261+
}
262+
263+
if (props.selectedTab.startsWith(ITERATIVE_REVIEW)) {
264+
return (
265+
<TabContentIterativeReview
266+
reviews={props.review}
267+
submitterReviews={props.submitterReviews}
268+
isLoadingReview={props.isLoadingSubmission}
269+
isDownloading={isDownloadingSubmission}
270+
downloadSubmission={downloadSubmission}
271+
isActiveChallenge={props.isActiveChallenge}
272+
phaseIdFilter={props.selectedPhaseId}
273+
/>
274+
)
275+
}
276+
277+
return (
278+
<TabContentReview
279+
selectedTab={props.selectedTab}
280+
reviews={props.review}
281+
submitterReviews={props.submitterReviews}
282+
isLoadingReview={props.isLoadingSubmission}
283+
isDownloading={isDownloadingSubmission}
284+
downloadSubmission={downloadSubmission}
285+
mappingReviewAppeal={props.mappingReviewAppeal}
286+
isActiveChallenge={props.isActiveChallenge}
287+
/>
288+
)
289+
}
290+
97291
return (
98292
<>
99293
{isFuturePhaseForSubmitter ? (
100294
<TabContentPlaceholder message={unopenedPhaseMessage || "This phase hasn't opened yet."} />
101295
) : (
102-
(() => {
103-
const selectedTabLower = (props.selectedTab || '').toLowerCase()
104-
105-
if (selectedTabLower === 'registration') {
106-
return <TabContentRegistration />
107-
}
108-
109-
if (['submission / screening', 'submission', 'screening'].includes(selectedTabLower)) {
110-
const hasLatestFlag = hasIsLatestFlag(props.screening)
111-
const screeningRows = hasLatestFlag
112-
? props.screening.filter(submission => submission.isLatest === true)
113-
: props.screening
114-
115-
return (
116-
<TabContentScreening
117-
screening={screeningRows}
118-
isLoadingScreening={props.isLoadingSubmission}
119-
isDownloading={isDownloadingSubmission}
120-
downloadSubmission={downloadSubmission}
121-
isActiveChallenge={props.isActiveChallenge}
122-
/>
123-
)
124-
}
125-
126-
if ([
127-
'checkpoint',
128-
'checkpoint submission',
129-
'checkpoint screening',
130-
'checkpoint review',
131-
].includes(selectedTabLower)) {
132-
return (
133-
<TabContentCheckpoint
134-
checkpoint={props.checkpoint}
135-
checkpointReview={props.checkpointReview}
136-
isLoading={props.isLoadingSubmission}
137-
isDownloading={isDownloadingSubmission}
138-
downloadSubmission={downloadSubmission}
139-
selectedTab={props.selectedTab}
140-
/>
141-
)
142-
}
143-
144-
if (selectedTabLower === 'winners') {
145-
return (
146-
<TabContentWinners
147-
isLoading={isLoadingProjectResult}
148-
projectResults={projectResults}
149-
isDownloading={isDownloadingSubmission}
150-
downloadSubmission={downloadSubmission}
151-
/>
152-
)
153-
}
154-
155-
if (selectedTabLower === 'approval') {
156-
return (
157-
<TabContentApproval
158-
reviews={props.approvalReviews}
159-
submitterReviews={props.submitterReviews}
160-
isLoadingReview={props.isLoadingSubmission}
161-
isDownloading={isDownloadingSubmission}
162-
downloadSubmission={downloadSubmission}
163-
isActiveChallenge={props.isActiveChallenge}
164-
/>
165-
)
166-
}
167-
168-
if (selectedTabLower === 'post-mortem') {
169-
return (
170-
<TabContentIterativeReview
171-
reviews={props.postMortemReviews}
172-
submitterReviews={props.submitterReviews}
173-
isLoadingReview={props.isLoadingSubmission}
174-
isDownloading={isDownloadingSubmission}
175-
downloadSubmission={downloadSubmission}
176-
isActiveChallenge={props.isActiveChallenge}
177-
columnLabel='Post-Mortem'
178-
/>
179-
)
180-
}
181-
182-
if (props.selectedTab.startsWith(ITERATIVE_REVIEW)) {
183-
return (
184-
<TabContentIterativeReview
185-
reviews={props.review}
186-
submitterReviews={props.submitterReviews}
187-
isLoadingReview={props.isLoadingSubmission}
188-
isDownloading={isDownloadingSubmission}
189-
downloadSubmission={downloadSubmission}
190-
isActiveChallenge={props.isActiveChallenge}
191-
phaseIdFilter={props.selectedPhaseId}
192-
/>
193-
)
194-
}
195-
196-
return (
197-
<TabContentReview
198-
selectedTab={props.selectedTab}
199-
reviews={props.review}
200-
submitterReviews={props.submitterReviews}
201-
isLoadingReview={props.isLoadingSubmission}
202-
isDownloading={isDownloadingSubmission}
203-
downloadSubmission={downloadSubmission}
204-
mappingReviewAppeal={props.mappingReviewAppeal}
205-
isActiveChallenge={props.isActiveChallenge}
206-
/>
207-
)
208-
})()
296+
renderSelectedTab()
209297
)}
210298

211299
{isDownloadingSubmissionBool && <ActionLoading />}

src/apps/review/src/lib/components/ChallengeDetailsContent/TabContentScreening.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@ interface Props {
1818
isDownloading: IsRemovingType
1919
downloadSubmission: (submissionId: string) => void
2020
isActiveChallenge: boolean
21+
showScreeningColumns?: boolean
2122
}
2223

2324
export const TabContentScreening: FC<Props> = (props: Props) => {
2425
const { actionChallengeRole }: useRoleProps = useRole()
26+
const showScreeningColumns: boolean = props.showScreeningColumns ?? true
2527
const hideHandleColumn = props.isActiveChallenge
2628
&& actionChallengeRole === REVIEWER
2729

@@ -41,6 +43,7 @@ export const TabContentScreening: FC<Props> = (props: Props) => {
4143
isDownloading={props.isDownloading}
4244
downloadSubmission={props.downloadSubmission}
4345
hideHandleColumn={hideHandleColumn}
46+
showScreeningColumns={showScreeningColumns}
4447
/>
4548
)
4649
}

0 commit comments

Comments
 (0)