-
@@ -398,6 +398,6 @@ FiltersPanel.propTypes = {
setFilterState: PT.func.isRequired,
setSearchText: PT.func.isRequired,
validKeywords: PT.arrayOf(PT.string).isRequired,
- validSubtracks: PT.arrayOf(PT.shape()).isRequired,
+ validTypes: PT.arrayOf(PT.shape()).isRequired,
onClose: PT.func,
};
diff --git a/src/shared/components/challenge-listing/Listing/index.jsx b/src/shared/components/challenge-listing/Listing/index.jsx
index 814bde49ec..12e29b1b91 100644
--- a/src/shared/components/challenge-listing/Listing/index.jsx
+++ b/src/shared/components/challenge-listing/Listing/index.jsx
@@ -225,7 +225,7 @@ const mapStateToProps = (state) => {
return {
allActiveChallengesLoaded: cl.allActiveChallengesLoaded,
pastSearchTimestamp: cl.pastSearchTimestamp,
- challengeTypes: cl.challengeSubtracks,
+ challengeTypes: cl.challengeTypes,
};
};
diff --git a/src/shared/components/challenge-listing/Tooltips/TrackAbbreviationTooltip/index.jsx b/src/shared/components/challenge-listing/Tooltips/TrackAbbreviationTooltip/index.jsx
index 224117ded4..026209837e 100644
--- a/src/shared/components/challenge-listing/Tooltips/TrackAbbreviationTooltip/index.jsx
+++ b/src/shared/components/challenge-listing/Tooltips/TrackAbbreviationTooltip/index.jsx
@@ -92,6 +92,7 @@ const TRACK_COLOR_CLASS = {
DESIGN: 'blue',
DEVELOP: 'green',
DATA_SCIENCE: 'orange',
+ QA: 'purple',
};
/**
diff --git a/src/shared/components/challenge-listing/Tooltips/TrackAbbreviationTooltip/style.scss b/src/shared/components/challenge-listing/Tooltips/TrackAbbreviationTooltip/style.scss
index 739b189366..aab74eb239 100644
--- a/src/shared/components/challenge-listing/Tooltips/TrackAbbreviationTooltip/style.scss
+++ b/src/shared/components/challenge-listing/Tooltips/TrackAbbreviationTooltip/style.scss
@@ -25,6 +25,10 @@ $track-radius-4: $corner-radius * 2;
&.orange {
border-left: $track-radius-4 solid $tc-orange;
}
+
+ &.purple {
+ border-left: $track-radius-4 solid $tc-purple;
+ }
}
.body {
diff --git a/src/shared/components/tc-communities/ChallengesBlock/Card/index.jsx b/src/shared/components/tc-communities/ChallengesBlock/Card/index.jsx
index 1fde9ce118..5c3e4e4b65 100644
--- a/src/shared/components/tc-communities/ChallengesBlock/Card/index.jsx
+++ b/src/shared/components/tc-communities/ChallengesBlock/Card/index.jsx
@@ -7,6 +7,7 @@ import {
DataScienceTrackTag,
DesignTrackTag,
DevelopmentTrackTag,
+ QATrackTag,
} from 'topcoder-react-ui-kit';
import { Link } from 'topcoder-react-utils';
@@ -24,11 +25,9 @@ export default function Card({
}) {
const {
subTrack,
- legacy,
+ track,
} = challenge;
- const { track } = legacy;
-
let TrackTag;
switch (track.toLowerCase()) {
case 'datasci':
@@ -41,6 +40,9 @@ export default function Card({
case COMPETITION_TRACKS.DEVELOP:
TrackTag = DevelopmentTrackTag;
break;
+ case COMPETITION_TRACKS.QA:
+ TrackTag = QATrackTag;
+ break;
default:
throw new Error('Wrong competition track value');
}
@@ -101,10 +103,8 @@ Card.propTypes = {
technologies: PT.string.isRequired,
registrationStartDate: PT.string.isRequired,
submissionEndDate: PT.string.isRequired,
- legacy: PT.shape({
- track: PT.string.isRequired,
- }),
subTrack: PT.string.isRequired,
+ track: PT.string.isRequired,
}).isRequired,
setChallengeListingFilter: PT.func.isRequired,
};
diff --git a/src/shared/containers/Dashboard/index.jsx b/src/shared/containers/Dashboard/index.jsx
index 1b42d6920d..866cc83742 100644
--- a/src/shared/containers/Dashboard/index.jsx
+++ b/src/shared/containers/Dashboard/index.jsx
@@ -193,7 +193,7 @@ export class DashboardPageContainer extends React.Component {
xlBadge,
errorLoadingRss,
userResources,
- challengeSubtracksMap,
+ challengeTypesMap,
getTypes,
} = this.props;
@@ -206,7 +206,7 @@ export class DashboardPageContainer extends React.Component {
({ announcementPreviewId } = qs.parse(urlQuery));
}
- if (_.isEmpty(challengeSubtracksMap)) {
+ if (_.isEmpty(challengeTypesMap)) {
getTypes();
}
@@ -244,7 +244,7 @@ export class DashboardPageContainer extends React.Component {
xlBadge={xlBadge}
errorLoadingRss={errorLoadingRss}
userResources={userResources ? userResources.resources : []}
- challengeSubtracksMap={challengeSubtracksMap}
+ challengeTypesMap={challengeTypesMap}
/>
);
}
@@ -321,7 +321,7 @@ DashboardPageContainer.propTypes = {
errorLoadingRss: PT.bool,
getMemberResources: PT.func.isRequired,
userResources: PT.shape(),
- challengeSubtracksMap: PT.shape().isRequired,
+ challengeTypesMap: PT.shape().isRequired,
getTypes: PT.func.isRequired,
};
@@ -338,7 +338,7 @@ function mapStateToProps(state, props) {
const tcBlog = state.rss ? (state.rss[TOPCODER_BLOG_ID] || {}) : {};
updateChallengeType(
- state.challengeListing.challenges, state.challengeListing.challengeSubtracksMap,
+ state.challengeListing.challenges, state.challengeListing.challengeTypesMap,
);
return {
achievements: achievements.data,
@@ -379,7 +379,7 @@ function mapStateToProps(state, props) {
xlBadge: dash.xlBadge,
errorLoadingRss: state.rss.errorLoadingRss,
userResources: state.members.userResources,
- challengeSubtracksMap: state.challengeListing.challengeSubtracksMap,
+ challengeTypesMap: state.challengeListing.challengeTypesMap,
};
}
diff --git a/src/shared/containers/challenge-detail/index.jsx b/src/shared/containers/challenge-detail/index.jsx
index 15d15dc5dc..dab60b189f 100644
--- a/src/shared/containers/challenge-detail/index.jsx
+++ b/src/shared/containers/challenge-detail/index.jsx
@@ -38,7 +38,6 @@ import { actions } from 'topcoder-react-lib';
import { getService } from 'services/contentful';
import {
getDisplayRecommendedChallenges,
- getChallengeSubTrack,
getRecommendedTags,
} from 'utils/challenge-detail/helper';
@@ -79,9 +78,9 @@ const DAY = 24 * 60 * MIN;
* @param {Object} challenge
* @return {String}
*/
-function getOgImage(challenge, challengeTypes) {
+function getOgImage(challenge) {
const { legacy } = challenge;
- const { track } = legacy;
+ const { track, subTrack } = legacy;
if (challenge.name.startsWith('LUX -')) return ogLuxChallenge;
if (challenge.name.startsWith('RUX -')) return ogRuxChallenge;
if (challenge.prizes) {
@@ -89,8 +88,6 @@ function getOgImage(challenge, challengeTypes) {
if (totalPrize > 2500) return ogBigPrizesChallenge;
}
- const subTrack = getChallengeSubTrack(challenge.type, challengeTypes);
-
switch (subTrack) {
case SUBTRACKS.FIRST_2_FINISH: return ogFirst2Finish;
case SUBTRACKS.UI_PROTOTYPE_COMPETITION: {
@@ -150,7 +147,7 @@ class ChallengeDetailPageContainer extends React.Component {
getCommunitiesList,
loadChallengeDetails,
challengeId,
- challengeSubtracksMap,
+ challengeTypesMap,
getTypes,
allCountries,
reviewTypes,
@@ -190,7 +187,7 @@ class ChallengeDetailPageContainer extends React.Component {
getCommunitiesList(auth);
- if (_.isEmpty(challengeSubtracksMap)) {
+ if (_.isEmpty(challengeTypesMap)) {
getTypes();
}
@@ -299,7 +296,7 @@ class ChallengeDetailPageContainer extends React.Component {
challenge,
challengeTypes,
challengeId,
- challengeSubtracksMap,
+ challengeTypesMap,
challengesUrl,
checkpointResults,
checkpointResultsUi,
@@ -430,7 +427,7 @@ class ChallengeDetailPageContainer extends React.Component {
&& (
5 * MIN)) {
getCommunityList(auth);
}
- if (!loadingSubtracks) getTypes();
+ if (!loadingTypes) getTypes();
if (!loadingKeywords) getKeywords();
@@ -154,7 +154,7 @@ Container.propTypes = {
isSavingFilter: PT.bool,
savedFilters: PT.arrayOf(PT.shape()).isRequired,
loadingKeywords: PT.bool.isRequired,
- loadingSubtracks: PT.bool.isRequired,
+ loadingTypes: PT.bool.isRequired,
saveFilter: PT.func.isRequired,
selectBucket: PT.func.isRequired,
setFilterState: PT.func.isRequired,
@@ -203,9 +203,9 @@ function mapStateToProps(state, ownProps) {
defaultCommunityId: ownProps.defaultCommunityId,
filterState: cl.filter,
loadingKeywords: cl.loadingChallengeTags,
- loadingSubtracks: cl.loadingChallengeTypes,
+ loadingTypes: cl.loadingChallengeTypes,
validKeywords: cl.challengeTags,
- validSubtracks: cl.challengeSubtracks,
+ validTypes: cl.challengeTypes,
selectedCommunityId: cl.selectedCommunityId,
auth: state.auth,
tokenV2: state.auth.tokenV2,
diff --git a/src/shared/containers/challenge-listing/Listing/index.jsx b/src/shared/containers/challenge-listing/Listing/index.jsx
index f657e33156..9ef1e90437 100644
--- a/src/shared/containers/challenge-listing/Listing/index.jsx
+++ b/src/shared/containers/challenge-listing/Listing/index.jsx
@@ -174,7 +174,6 @@ export class ListingContainer extends React.Component {
challenges,
challengeTypes,
challengesUrl,
- challengeSubtracks,
challengeTags,
communityFilters,
communityId,
@@ -273,7 +272,6 @@ export class ListingContainer extends React.Component {
activeBucket={activeBucket}
challenges={challenges}
challengeTypes={challengeTypes}
- challengeSubtracks={challengeSubtracks}
challengeTags={challengeTags}
challengesUrl={challengesUrl}
communityFilter={communityFilter}
@@ -358,7 +356,6 @@ ListingContainer.propTypes = {
challenges: PT.arrayOf(PT.shape({})).isRequired,
challengeTypes: PT.arrayOf(PT.shape()),
challengesUrl: PT.string,
- challengeSubtracks: PT.arrayOf(PT.shape()).isRequired,
challengeTags: PT.arrayOf(PT.string).isRequired,
communitiesList: PT.shape({
data: PT.arrayOf(PT.shape({
@@ -421,7 +418,7 @@ const mapStateToProps = (state, ownProps) => {
const cl = state.challengeListing;
const tc = state.tcCommunities;
updateChallengeType(
- state.challengeListing.challenges, state.challengeListing.challengeSubtracksMap,
+ state.challengeListing.challenges, state.challengeListing.challengeTypesMap,
);
return {
auth: state.auth,
@@ -430,8 +427,7 @@ const mapStateToProps = (state, ownProps) => {
allReviewOpportunitiesLoaded: cl.allReviewOpportunitiesLoaded,
filter: cl.filter,
challenges: cl.challenges,
- challengeTypes: cl.challengeSubtracks,
- challengeSubtracks: cl.challengeSubtracks,
+ challengeTypes: cl.challengeTypes,
challengeTags: cl.challengeTags,
communitiesList: tc.list,
communityFilters: tc.list.data,
diff --git a/src/shared/containers/challenge-listing/Sidebar.jsx b/src/shared/containers/challenge-listing/Sidebar.jsx
index afa9b45077..dd89d7795b 100644
--- a/src/shared/containers/challenge-listing/Sidebar.jsx
+++ b/src/shared/containers/challenge-listing/Sidebar.jsx
@@ -155,7 +155,7 @@ function mapStateToProps(state, ownProps) {
const { activeBucket } = state.challengeListing.sidebar;
const pending = _.keys(state.challengeListing.pendingRequests);
updateChallengeType(
- state.challengeListing.challenges, state.challengeListing.challengeSubtracksMap,
+ state.challengeListing.challenges, state.challengeListing.challengeTypesMap,
);
return {
...state.challengeListing.sidebar,
diff --git a/src/shared/containers/tc-communities/cognitive/home.jsx b/src/shared/containers/tc-communities/cognitive/home.jsx
index cbe342ffa8..aa817e8b7a 100644
--- a/src/shared/containers/tc-communities/cognitive/home.jsx
+++ b/src/shared/containers/tc-communities/cognitive/home.jsx
@@ -98,7 +98,7 @@ HomeContainer.propTypes = {
function mapStateToProps(state) {
updateChallengeType(
- state.challengeListing.challenges, state.challengeListing.challengeSubtracksMap,
+ state.challengeListing.challenges, state.challengeListing.challengeTypesMap,
);
return {
auth: state.auth,
diff --git a/src/shared/reducers/challenge-listing/index.js b/src/shared/reducers/challenge-listing/index.js
index 1c8a1d1e9b..6e83a9d969 100644
--- a/src/shared/reducers/challenge-listing/index.js
+++ b/src/shared/reducers/challenge-listing/index.js
@@ -262,8 +262,8 @@ function onGetChallengeTypesDone(state, action) {
if (action.error) logger.error(action.payload);
return {
...state,
- challengeSubtracks: action.error ? [] : action.payload,
- challengeSubtracksMap: action.error ? {} : _.keyBy(action.payload, 'id'),
+ challengeTypes: action.error ? [] : action.payload,
+ challengeTypesMap: action.error ? {} : _.keyBy(action.payload, 'id'),
loadingChallengeTypes: false,
};
}
@@ -601,8 +601,8 @@ function create(initialState) {
challenges: [],
recommendedChallenges: {},
- challengeSubtracks: [],
- challengeSubtracksMap: {},
+ challengeTypes: [],
+ challengeTypesMap: {},
challengeTags: [],
expandedTags: [],
diff --git a/src/shared/utils/challenge-detail/helper.jsx b/src/shared/utils/challenge-detail/helper.jsx
index a1c803f68e..d81ac31fc7 100644
--- a/src/shared/utils/challenge-detail/helper.jsx
+++ b/src/shared/utils/challenge-detail/helper.jsx
@@ -21,10 +21,10 @@ export const PRIZE_MODE = {
};
/**
- * Get challenge subTrack from type id
+ * Get challenge type abbreviation
* @param {Object} challenge challenge info
*/
-export function getChallengeSubTrack(track, challengeTypes) {
+export function getChallengeTypeAbbr(track, challengeTypes) {
const subTrack = _.find(challengeTypes, { name: track });
if (subTrack) {
return subTrack.abbreviation;
@@ -36,8 +36,8 @@ export function getChallengeSubTrack(track, challengeTypes) {
* Get end date
* @param {Object} challenge challenge info
*/
-export function getEndDate(challenge, challengeTypes) {
- const subTrack = getChallengeSubTrack(challenge.type, challengeTypes);
+export function getEndDate(challenge) {
+ const { subTrack } = challenge.legacy;
let phases = challenge.phases || [];
if (subTrack === 'FIRST_2_FINISH' && challenge.status === 'COMPLETED') {
phases = challenge.phases.filter(p => p.phaseType === 'Iterative Review' && p.phaseStatus === 'Closed');
diff --git a/src/shared/utils/challenge.js b/src/shared/utils/challenge.js
index 8ce43a945b..c7aab75dae 100644
--- a/src/shared/utils/challenge.js
+++ b/src/shared/utils/challenge.js
@@ -22,13 +22,13 @@ export function isDevelopMM(challenge) {
/**
* Set challenge type to challenge
* @param {Object} challenges challenge object
- * @param {Object} challengeSubtracksMap all challenge type object
+ * @param {Object} challengeTypeMap all challenge type object
*/
-export function updateChallengeType(challenges, challengeSubtracksMap) {
- if (challengeSubtracksMap) {
+export function updateChallengeType(challenges, challengeTypeMap) {
+ if (challengeTypeMap) {
_.each(challenges, (challenge) => {
// eslint-disable-next-line no-param-reassign
- challenge.challengeType = challengeSubtracksMap[challenge.typeId] || {};
+ challenge.challengeType = challengeTypeMap[challenge.typeId] || {};
});
}
}