Skip to content

Commit 062f275

Browse files
luizrrodriguescagdas001
authored andcommitted
Merge pull request topcoder-platform#4842 from cagdas001/fix-4723
fix(challenge-detail): wrong dates/phases at deadlines panel
1 parent a874f87 commit 062f275

File tree

3 files changed

+33
-23
lines changed

3 files changed

+33
-23
lines changed

src/shared/components/challenge-detail/Header/DeadlinesPanel/index.jsx

+4-3
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@ import moment from 'moment-timezone';
66
import PT from 'prop-types';
77
import React from 'react';
88

9+
import { phaseEndDate, phaseStartDate } from 'utils/challenge-listing/helper';
910
import Card from './Card';
1011
import './style.scss';
1112

1213
export default function DeadlinesPanel({ deadlines }) {
1314
/* Calculates challenge start time. */
1415
let start = deadlines[0] || {};
15-
start = start.actualStartDate || start.scheduledStartDate;
16-
const started = moment(start).isBefore(moment());
16+
start = phaseStartDate(start);
17+
const started = moment(start).isBefore();
1718

1819
return (
1920
<div styleName="panel" tabIndex="0" role="tabpanel">
@@ -29,7 +30,7 @@ export default function DeadlinesPanel({ deadlines }) {
2930
{ deadlines.map((d, index) => (
3031
<Card
3132
key={d.name}
32-
time={d.scheduledEndDate || d.actualEndDate}
33+
time={phaseEndDate(d)}
3334
title={index === deadlines.length - 1 ? 'Winners' : d.name}
3435
/>
3536
))}

src/shared/components/challenge-detail/Header/index.jsx

+24-19
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import React from 'react';
1515
import { DangerButton, PrimaryButton } from 'topcoder-react-ui-kit';
1616
import { Link } from 'topcoder-react-utils';
1717
import { COMPETITION_TRACKS } from 'utils/tc';
18+
import { phaseEndDate } from 'utils/challenge-listing/helper';
1819

1920
import LeftArrow from 'assets/images/arrow-prev.svg';
2021

@@ -69,16 +70,17 @@ export default function ChallengeHeader(props) {
6970
numOfRegistrants,
7071
numOfCheckpointSubmissions,
7172
numOfSubmissions,
72-
endDate,
7373
status,
7474
type,
7575
track,
7676
} = challenge;
7777

7878
const tags = challenge.tags || [];
79-
const appealsEndDate = endDate;
8079

8180
const allPhases = challenge.phases || [];
81+
const sortedAllPhases = _.cloneDeep(allPhases)
82+
.sort((a, b) => moment(phaseEndDate(a)).diff(phaseEndDate(b)));
83+
8284
const { prizes } = prizeSets && prizeSets.length ? prizeSets[0] : [];
8385

8486
const checkpointPrizes = _.find(prizeSets, { type: 'checkpoint' });
@@ -122,14 +124,14 @@ export default function ChallengeHeader(props) {
122124
*/
123125
const hasSubmissions = !_.isEmpty(mySubmissions);
124126

125-
let nextPhase = allPhases.filter(p => p.isOpen)
126-
.sort((a, b) => moment(a.scheduledEndDate).diff(b.scheduledEndDate))[0];
127-
if (hasRegistered && allPhases[0] && allPhases[0].name === 'Registration') {
128-
nextPhase = allPhases[1] || {};
127+
const openPhases = sortedAllPhases.filter(p => p.isOpen);
128+
let nextPhase = openPhases[0];
129+
if (hasRegistered && openPhases[0] && openPhases[0].name === 'Registration') {
130+
nextPhase = openPhases[1] || {};
129131
}
130132
const nextDeadline = nextPhase && nextPhase.name;
131133

132-
const deadlineEnd = moment(nextPhase && nextPhase.scheduledEndDate);
134+
const deadlineEnd = moment(nextPhase && phaseEndDate(nextPhase));
133135
const currentTime = moment();
134136

135137
let timeLeft = deadlineEnd.isAfter(currentTime)
@@ -147,8 +149,8 @@ export default function ChallengeHeader(props) {
147149
if (showDeadlineDetail) {
148150
relevantPhases = (allPhases || []).filter((phase) => {
149151
if (phase.name === 'Iterative Review') {
150-
const end = phase.actualEndDate || phase.scheduledEndDate;
151-
return moment(end).isAfter(moment());
152+
const end = phaseEndDate(phase);
153+
return moment(end).isAfter();
152154
}
153155
const phaseLowerCase = phase.name.toLowerCase();
154156
if (phaseLowerCase.includes('screening') || phaseLowerCase.includes('specification')) {
@@ -168,30 +170,34 @@ export default function ChallengeHeader(props) {
168170
if (b.name.toLowerCase().includes('registration')) {
169171
return 1;
170172
}
171-
return (new Date(a.scheduledEndDate || a.actualEndDate)).getTime()
172-
- (new Date(b.scheduledEndDate || b.actualEndDate)).getTime();
173+
const aEndDate = phaseEndDate(a);
174+
const bEndDate = phaseEndDate(b);
175+
return moment(aEndDate).diff(bEndDate);
173176
});
174177
if (type === 'First2Finish' && status === 'Completed') {
175178
const phases2 = allPhases.filter(p => p.name === 'Iterative Review' && !p.isOpen);
176-
const endPhaseDate = Math.max(...phases2.map(d => new Date(d.scheduledEndDate)));
179+
const endPhaseDate = Math.max(...phases2.map(d => phaseEndDate(d)));
177180
relevantPhases = _.filter(relevantPhases, p => (p.name.toLowerCase().includes('registration')
178-
|| new Date(p.scheduledEndDate).getTime() < endPhaseDate));
181+
|| phaseEndDate(p).getTime() < endPhaseDate));
179182
relevantPhases.push({
180183
id: -1,
181184
name: 'Winners',
185+
isOpen: false,
186+
actualEndDate: endPhaseDate,
182187
scheduledEndDate: endPhaseDate,
183188
});
184189
} else if (relevantPhases.length > 1) {
185190
const lastPhase = relevantPhases[relevantPhases.length - 1];
186-
const lastPhaseTime = (
187-
new Date(lastPhase.actualEndDate || lastPhase.scheduledEndDate)
188-
).getTime();
191+
const lastPhaseTime = phaseEndDate(lastPhase).getTime();
189192

190-
const appealsEnd = (new Date(appealsEndDate).getTime());
191-
if (lastPhaseTime < appealsEnd && lastPhase.name !== 'Review') {
193+
const appealsEndDate = phaseEndDate(sortedAllPhases[sortedAllPhases.length - 1]);
194+
const appealsEnd = appealsEndDate.getTime();
195+
if (lastPhaseTime < appealsEnd) {
192196
relevantPhases.push({
193197
id: -1,
194198
name: 'Winners',
199+
isOpen: false,
200+
actualEndDate: appealsEndDate,
195201
scheduledEndDate: appealsEndDate,
196202
});
197203
}
@@ -495,7 +501,6 @@ ChallengeHeader.propTypes = {
495501
numOfCheckpointSubmissions: PT.any,
496502
numOfSubmissions: PT.any,
497503
status: PT.any,
498-
endDate: PT.any,
499504
phases: PT.any,
500505
roundId: PT.any,
501506
prizeSets: PT.any,

src/shared/utils/challenge-listing/helper.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@ export function phaseEndDate(phase) {
99
// Case 1: phase is still open. take the `scheduledEndDate`
1010
// Case 2: phase is not open but `scheduledStartDate` is a future date.
1111
// This means phase is not yet started. So take the `scheduledEndDate`
12-
if (phase.isOpen || moment(phase.scheduledStartDate).isAfter()) {
12+
// Case 3: phase is not open & `scheduledStartDate` is a past date,
13+
// but the phase is `Iterative Review`. It will take the `scheduledEndDate`
14+
// as it's a valid scenario for iterative review,
15+
// there might not be any submission yet to open the phase
16+
if (phase.isOpen || moment(phase.scheduledStartDate).isAfter() || phase.name === 'Iterative Review') {
1317
return new Date(phase.scheduledEndDate);
1418
}
1519
// for other cases, take the `actualEndDate` as phase is already closed

0 commit comments

Comments
 (0)