@@ -6,11 +6,21 @@ import { FC, ReactNode, useContext, useMemo } from 'react'
66import { ActionLoading } from '~/apps/admin/src/lib'
77
88import { 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'
1016import {
1117 useDownloadSubmission ,
1218 useDownloadSubmissionProps ,
13- useRole , useRoleProps } from '../../hooks'
19+ useRole ,
20+ useRoleProps ,
21+ useSubmissionDownloadAccess ,
22+ UseSubmissionDownloadAccessResult ,
23+ } from '../../hooks'
1424import {
1525 useFetchChallengeResults ,
1626 useFetchChallengeResultsProps ,
@@ -25,12 +35,14 @@ import TabContentIterativeReview from './TabContentIterativeReview'
2535import TabContentRegistration from './TabContentRegistration'
2636import TabContentReview from './TabContentReview'
2737import TabContentScreening from './TabContentScreening'
38+ import TabContentSubmissions from './TabContentSubmissions'
2839import TabContentWinners from './TabContentWinners'
2940
3041interface 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+
55144export 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 /> }
0 commit comments