Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -26,33 +26,41 @@ export default function Graph({ statisticsData, baseline, awardLine }) {
});
});

const pointDatas = _.map(flatData, (data) => {
let color;
let isSelected = false;
if (point) {
isSelected = point.customData.handle === data.handle;
if (isSelected) {
color = getHighlightedColor(data.rating || 0);
const pointDatas = _.chain(flatData)
.map((data) => {
let color;
let isSelected = false;
if (point) {
isSelected = point.customData.handle === data.handle;
if (isSelected) {
color = getHighlightedColor(data.rating || 0);
} else {
color = getUnSelectedColors(data.rating || 0);
}
} else {
color = getUnSelectedColors(data.rating || 0);
color = data.ratingColor || getRatingColor(data.rating || 0);
}
} else {
color = data.ratingColor || getRatingColor(data.rating || 0);
}
return {
x: moment(data.created || data.createdAt).valueOf(),
y: _.max([0, data.score ? (parseFloat(data.score)) : 0]),
name: data.handle,
color,
customData: data,
marker: {
enabled: true,
width: 'circle',
radius: isSelected ? 6 : 4,
},
className: !isSelected && point ? styles.selectedPoint : '',
};
});

const score = parseFloat(data.score);
const x = moment(data.created || data.createdAt).valueOf();
const y = _.max([0, Number.isFinite(score) ? score : 0]);

return {
x,
y,
name: data.handle,
color,
customData: data,
marker: {
enabled: true,
width: 'circle',
radius: isSelected ? 6 : 4,
},
className: !isSelected && point ? styles.selectedPoint : '',
};
})
.filter(pointData => Number.isFinite(pointData.x) && Number.isFinite(pointData.y))
.value();

const options = {
plotOptions: {
Expand All @@ -79,6 +87,7 @@ export default function Graph({ statisticsData, baseline, awardLine }) {
series: [
{
data: pointDatas,
turboThreshold: 0,
pointStart: moment(_.min(dates)).valueOf(),
pointInterval: 24 * 3600 * 1000,
backgroundColor: 'rgb(51,51,51)',
Expand Down
19 changes: 13 additions & 6 deletions src/shared/containers/challenge-detail/index.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,14 @@ export function getDisplayWinners(challenge = {}) {
});
}

function hasRenderableStatisticsData(statisticsData) {
return Array.isArray(statisticsData)
&& statisticsData.some(entry => (
Array.isArray(_.get(entry, 'submissions'))
&& _.get(entry, 'submissions.length', 0) > 0
));
}

/**
* Given challenge details object, it returns the URL of the image to be used in
* OpenGraph (i.e. in social sharing posts).
Expand Down Expand Up @@ -349,9 +357,8 @@ class ChallengeDetailPageContainer extends React.Component {

const previousToken = _.get(auth, 'tokenV3');
const nextToken = _.get(nextProps, 'auth.tokenV3');
const hasStatisticsData = Array.isArray(statisticsData) && statisticsData.length > 0;
const nextHasStatisticsData = Array.isArray(nextProps.statisticsData)
&& nextProps.statisticsData.length > 0;
const hasStatisticsData = hasRenderableStatisticsData(statisticsData);
const nextHasStatisticsData = hasRenderableStatisticsData(nextProps.statisticsData);
const enteringMmDashboard = selectedTab !== DETAIL_TABS.MM_DASHBOARD
&& nextProps.selectedTab === DETAIL_TABS.MM_DASHBOARD;
const tokenBecameAvailable = !previousToken && !!nextToken;
Expand Down Expand Up @@ -737,7 +744,7 @@ class ChallengeDetailPageContainer extends React.Component {
}
{
!isEmpty && selectedTab === DETAIL_TABS.MM_DASHBOARD
&& (!statisticsData || statisticsData.length === 0)
&& !hasRenderableStatisticsData(statisticsData)
&& (
<div styleName="page">
{
Expand All @@ -748,7 +755,7 @@ class ChallengeDetailPageContainer extends React.Component {
}
{
!isEmpty && selectedTab === DETAIL_TABS.MM_DASHBOARD
&& statisticsData && statisticsData.length > 0
&& hasRenderableStatisticsData(statisticsData)
&& (
<MMDashboardGraph
statisticsData={statisticsData}
Expand Down Expand Up @@ -1152,7 +1159,7 @@ function mapStateToProps(state, props) {
}
const { auth } = state;
let statisticsData = extractArrayFromStateSlice(state.challenge.statisticsData, challengeId);
if ((!Array.isArray(statisticsData) || !statisticsData.length) && reviewSummations.length) {
if (!hasRenderableStatisticsData(statisticsData) && reviewSummations.length) {
statisticsData = buildStatisticsData(reviewSummations);
}
const challenge = state.challenge.details || {};
Expand Down
48 changes: 33 additions & 15 deletions src/shared/utils/mm-review-summations.js
Original file line number Diff line number Diff line change
Expand Up @@ -577,6 +577,10 @@ export function buildStatisticsData(reviewSummations = []) {
if (!summation) {
return false;
}
const score = normalizeScoreValue(_.get(summation, 'aggregateScore'));
if (_.isNil(score)) {
return false;
}
return getSummationScoreClassification(summation).isProvisional;
});

Expand All @@ -587,6 +591,19 @@ export function buildStatisticsData(reviewSummations = []) {
return;
}

const timestamp = getSummationTimestamp(summation);
const timestampValue = toTimestampValue(timestamp);
const score = normalizeScoreValue(_.get(summation, 'aggregateScore'));
if (_.isNil(score)) {
return;
}
const scoreType = getSummationScoreClassification(summation);
if (includeOnlyProvisional) {
if (!scoreType.isProvisional) {
return;
}
}

const handle = getSummationHandle(summation);
if (!grouped.has(handle)) {
grouped.set(handle, {
Expand All @@ -597,7 +614,6 @@ export function buildStatisticsData(reviewSummations = []) {
}

const entry = grouped.get(handle);

const rating = getSummationRating(summation);
if (_.isNil(entry.rating) && !_.isNil(rating)) {
entry.rating = rating;
Expand Down Expand Up @@ -643,20 +659,22 @@ export function buildStatisticsData(reviewSummations = []) {
entry.submissionsMap.set(submissionId, updatedSubmission);
});

return Array.from(grouped.values()).map(entry => ({
handle: entry.handle,
rating: entry.rating,
submissions: Array.from(entry.submissionsMap.values())
.map(submission => ({
submissionId: submission.submissionId,
created: submission.created,
createdAt: submission.createdAt,
score: submission.score,
}))
.sort(
(a, b) => toTimestampValue(b.createdAt) - toTimestampValue(a.createdAt),
),
}));
return Array.from(grouped.values())
.map(entry => ({
handle: entry.handle,
rating: entry.rating,
submissions: Array.from(entry.submissionsMap.values())
.map(submission => ({
submissionId: submission.submissionId,
created: submission.created,
createdAt: submission.createdAt,
score: submission.score,
}))
.sort(
(a, b) => toTimestampValue(b.createdAt) - toTimestampValue(a.createdAt),
),
}))
.filter(entry => Array.isArray(entry.submissions) && entry.submissions.length > 0);
}

export default {
Expand Down
6 changes: 4 additions & 2 deletions src/shared/utils/tc.js
Original file line number Diff line number Diff line change
Expand Up @@ -199,8 +199,10 @@ export function getUnSelectedColors(rating) {
*/
export function getAuthTokens(req = {}) {
const cookies = req.cookies || {};
let tokenV2 = cookies.tcjwt;
let tokenV3 = cookies.tcjwt;
// Support both historical cookie names used across environments.
const authToken = cookies.tcjwt || cookies.tcJwt;
let tokenV2 = authToken;
let tokenV3 = authToken;

if (!tokenV2 || isTokenExpired(tokenV2, config.AUTH_DROP_TIME)) {
tokenV2 = '';
Expand Down
Loading