Skip to content
This repository was archived by the owner on Mar 4, 2025. It is now read-only.

Commit 2629cce

Browse files
author
Nick Litwin
committed
Wire up Dev and Design challenges
1 parent 46bcb9f commit 2629cce

File tree

7 files changed

+117
-151
lines changed

7 files changed

+117
-151
lines changed

app/directives/challenge-tile/challenge-tile.directive.jade

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,26 @@
1+
// TILE VIEW
12
.challenge.tile-view(ng-show="view === 'tile'", ng-class="challenge.track")
23
.challenge-track
34

45
header
56
a(ng-href="https://www.{{DOMAIN}}/challenge-details/{{challenge.id}}/?type={{challenge.track}}") {{challenge.name}}
67

7-
p {{subTrack}}
8+
p {{challenge.subTrack | underscoreStrip}}
89

910
.challenge-details
10-
//- .thumbnail(ng-if="challenge.track === 'DESIGN'")
11-
//- img(ng-src="http://studio.topcoder.com/studio.jpg?module=DownloadSubmission&sbmid={{challenge.thumbnailId}}&sbt=thumb", fallback-src="/images/lock-icon-small.png")
11+
p.currentPhase {{challenge.userCurrentPhase}}
1212

13-
p.currentPhase {{challenge.currentPhases[0].phaseType}}
13+
.challenge-calendar(ng-show="challenge.userCurrentPhaseEndTime")
14+
p.starts-in Ends In
15+
p.time-remaining {{challenge.userCurrentPhaseEndTime[0]}}
16+
p.unit-of-time {{challenge.userCurrentPhaseEndTime[1]}}
1417

18+
.stalled-challenge(ng-hide="challenge.userCurrentPhaseEndTime") This challenge is currently paused.
1519

16-
.challenge-calendar
17-
p.starts-in Ends In
18-
p.time-remaining 3
19-
p.unit-of-time days
20+
.phase-action(ng-switch="challenge.userAction")
21+
.submit(ng-switch-when="Submit") Submit
2022

21-
button.phase-action(ng-class="{'action-completed': challenge.currentPhaseActionCompleted}") Submit
23+
.submitted(ng-switch-when="Submitted") Submitted
2224

2325
p.roles {{challenge.userDetails.roles | listRoles}}
2426

@@ -39,6 +41,7 @@
3941

4042
p Forum
4143

44+
// LIST VIEW
4245
.challenge.list-view(ng-show="view=='list'")
4346
.challenge-icons
4447
img(ng-show="challenge.track === 'DEVELOP'", src="/images/member-program/svg/development-generic.svg")

app/directives/challenge-tile/challenge-tile.directive.js

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,6 @@
1818

1919
function activate() {
2020
// console.log($scope.challenge.plain());
21-
processChallenge($scope.challenge);
22-
}
23-
24-
function processChallenge(challenge) {
25-
$scope.subTrack = challenge.subTrack.replace(/_/g, ' ');
2621
// if (challenge.track == 'DESIGN' && challenge.userDetails.submissions && challenge.userDetails.submissions.length > 0) {
2722
// challenge.thumbnailId = challenge.userDetails.submissions[0].id;
2823
// }

app/my-dashboard/my-challenges/my-challenges.controller.js

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,16 @@
33

44
angular.module('tc.myDashboard').controller('MyChallengesWidgetController', MyChallengesWidgetController);
55

6-
MyChallengesWidgetController.$inject = ['ChallengeService', 'UserService', '$q', '$log', 'CONSTANTS', 'Helpers'];
6+
MyChallengesWidgetController.$inject = ['ChallengeService', 'UserService', '$log', 'CONSTANTS', 'userIdentity'];
77

8-
function MyChallengesWidgetController(ChallengeService, UserService, $q, $log, CONSTANTS, Helpers) {
8+
function MyChallengesWidgetController(ChallengeService, UserService, $log, CONSTANTS, userIdentity) {
99
var vm = this;
1010
vm.domain = CONSTANTS.domain;
1111
vm.loading = true;
1212
vm.myChallenges = [];
1313
vm.userHasChallenges = true;
1414

15-
var handle = UserService.getUserIdentity().handle;
15+
var handle = userIdentity.handle;
1616

1717
activate();
1818

@@ -25,7 +25,6 @@
2525
getChallenges('active', 'submissionEndDate');
2626
}
2727

28-
// get ACTIVE challenges and spotlight challenges
2928
function getChallenges(status, orderBy) {
3029
var params = {
3130
limit: 8,
@@ -38,10 +37,10 @@
3837

3938
ChallengeService.getUserChallenges(handle, params)
4039
.then(function(challenges){
41-
console.log(challenges);
42-
if (challenges.length > 0) {
43-
// FIXME until we figure out the correct sort order param
40+
ChallengeService.processChallenges(challenges);
41+
console.log(challenges.plain());
4442

43+
if (challenges.length > 0) {
4544
vm.myChallenges = challenges;
4645
vm.userHasChallenges = true;
4746
vm.loading = false;
@@ -54,7 +53,6 @@
5453
$log.error(err);
5554
vm.userHasChallenges = true;
5655
vm.loading = false;
57-
// TODO - handle error
5856
});
5957
}
6058
}

app/services/challenge.service.js

Lines changed: 48 additions & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,10 @@
1313
var service = {
1414
getChallenges: getChallenges,
1515
getUserChallenges: getUserChallenges,
16-
getSpotlightChallenges: getSpotlightChallenges,
1716
getiOSChallenges: getiOSChallenges,
18-
getMyMarathonMatches: _getMyMarathonMatches,
1917
getReviewEndDate: getReviewEndDate,
20-
getChallengeDetails: getChallengeDetails
18+
getChallengeDetails: getChallengeDetails,
19+
processChallenges: processChallenges
2120
};
2221
return service;
2322

@@ -31,133 +30,10 @@
3130
return api.one('members', handle).all('challenges').getList(params);
3231
}
3332

34-
function getSpotlightChallenges() {
35-
var deferred = $q.defer();
36-
37-
var mockChallenges = [
38-
{
39-
challengeName: 'Styx iOS Video Mobile App Bug Fixes - 177+214',
40-
challengeType: 'Code',
41-
totalPrize: '1200',
42-
registrationStartDate: '2015-05-01T00:00:00.000-0400',
43-
track: 'DESIGN',
44-
numRegistrants: 21,
45-
numSubmissions: 8
46-
},
47-
{
48-
challengeName: 'Styx iOS Video Mobile App Bug Fixes - 177+214',
49-
challengeType: 'Code',
50-
totalPrize: '1200',
51-
registrationStartDate: '2015-05-01T00:00:00.000-0400',
52-
track: 'DESIGN',
53-
numRegistrants: 21,
54-
numSubmissions: 8
55-
}
56-
];
57-
58-
deferred.resolve(mockChallenges);
59-
60-
return deferred.promise;
61-
}
62-
6333
function getiOSChallenges(params) {
6434
return api.all('challenges').getList(params);
6535
}
6636

67-
/** NOT USED NEEDS TO BE REFACTORED **/
68-
69-
function _getMyActiveChallenges(request) {
70-
var deferred = $q.defer();
71-
72-
var prevRequest = rApi.request;
73-
74-
// If my active challenges has already been retrieved, simply return it
75-
if(rApi.myActiveChallenges && rApi.myActiveChallenges != "waiting" && !uniqueRequest(prevRequest, request)) {
76-
deferred.resolve(rApi.myActiveChallenges);
77-
} else {
78-
// Otherwise, set state to waiting, so that only one call is done to the server
79-
rApi.myActiveChallenges = "waiting";
80-
81-
// Add promise to list to it can be resolved when call returns
82-
rApi.activeChallengeDeferredList.push(deferred);
83-
84-
// add default paging
85-
var pageIndex = request && request.pageIndex ? request.pageIndex : 1;
86-
var pageSize = request && request.pageSize ? request.pageSize : 10;
87-
var sortColumn = request && request.sortColumn ? request.sortColumn : 'submissionEndDate';
88-
var sortOrder = request && request.sortOrder ? request.sortOrder : 'asc';
89-
var listType = request && request.listType ? request.listType : 'active';
90-
var userId = request && request.userId ? request.userId : null;
91-
92-
rApi.request = request;
93-
94-
var filter = [];
95-
if (listType) {
96-
filter.push("listType=" + listType);
97-
}
98-
if (userId) {
99-
filter.push("userId=" + userId);
100-
}
101-
filter = filter.join("&");
102-
103-
// Fetch list of active challenges for current user
104-
rApi.all("challenges").getList({
105-
type: listType,
106-
pageIndex: pageIndex,
107-
pageSize: pageSize,
108-
sortColumn: sortColumn,
109-
sortOrder: sortOrder
110-
}).then(function(data) {
111-
// Sets the data, and returns it to all pending promises
112-
rApi.myActiveChallenges = data;
113-
angular.forEach(rApi.activeChallengeDeferredList, function(def) {
114-
def.resolve(rApi.myActiveChallenges);
115-
});
116-
rApi.activeChallengeDeferredList = [];
117-
return rApi.myActiveChallenges;
118-
});
119-
}
120-
121-
return deferred.promise;
122-
}
123-
124-
function _getMyMarathonMatches(request) {
125-
var deferred, listType, prevRequest, sortColumn, sortOrder;
126-
deferred = $q.defer();
127-
prevRequest = rApi.mmRequest;
128-
if (rApi.myMarathonMatches && rApi.myMarathonMatches !== 'waiting') {
129-
deferred.resolve(rApi.myMarathonMatches);
130-
} else {
131-
rApi.myMarathonMatches = 'waiting';
132-
rApi.marathonMatchesDeferredList.push(deferred);
133-
sortColumn = request && request.sortColumn ? request.sortColumn : 'submissionEndDate';
134-
sortOrder = request && request.sortOrder ? request.sortOrder : 'asc';
135-
listType = request && request.type ? request.type : 'active';
136-
rApi.request = request;
137-
rApi.all('marathonMatches').getList({
138-
listType: listType,
139-
sortColumn: sortColumn,
140-
sortOrder: sortOrder
141-
}).then(function(data) {
142-
rApi.myMarathonMatches = data;
143-
angular.forEach(rApi.marathonMatchesDeferredList, function(def) {
144-
def.resolve(rApi.myMarathonMatches);
145-
});
146-
rApi.marathonMatchesDeferredList = [];
147-
return rApi.myMarathonMatches;
148-
});
149-
}
150-
return deferred.promise;
151-
}
152-
function _uniqueRequest(prevRequest, currRequest) {
153-
if (!prevRequest || !currRequest) return true;
154-
return prevRequest.pageIndex != currRequest.pageIndex ||
155-
prevRequest.pageSize != currRequest.pageSize ||
156-
prevRequest.sortColumn != currRequest.sortColumn ||
157-
prevRequest.sortOrder != currRequest.sortOrder ||
158-
prevRequest.listType != currRequest.listType;
159-
}
160-
16137
function getReviewEndDate(challengeId) {
16238
var url = CONSTANTS.API_URL + '/phases/?filter=' + encodeURIComponent('challengeId=' + challengeId + ' & phaseType=4');
16339
return ApiService.requestHandler('GET', url);
@@ -168,6 +44,52 @@
16844
return ApiService.requestHandler('GET', url, {}, true);
16945
}
17046

47+
function processChallenges(challenges) {
48+
angular.forEach(challenges, function(challenge) {
49+
var phases = challenge.currentPhases;
50+
var hasCurrentPhase = false;
51+
// If currentPhase is null, the challenge is stalled and there is no end time
52+
challenge.userCurrentPhase = 'Stalled';
53+
challenge.userCurrentPhaseEndTime = null;
54+
challenge.userAction = null;
55+
56+
if (phases && phases.length) {
57+
hasCurrentPhase = true;
58+
challenge.userCurrentPhase = phases[0].phaseType;
59+
challenge.userCurrentPhaseEndTime = phases[0].scheduledEndTime;
60+
}
61+
62+
if (hasCurrentPhase && phases.length > 1) {
63+
angular.forEach(challenge.currentPhases, function(phase, index, phases) {
64+
if (phase.phaseType === 'Submission') {
65+
challenge.userAction = 'Submit';
66+
67+
if (challenge.userDetails.hasUserSubmittedForReview) {
68+
challenge.userCurrentPhase = phase.phaseType;
69+
challenge.userCurrentPhaseEndTime = phase.scheduledEndTime;
70+
challenge.userAction = 'Submitted';
71+
72+
if (phases[index + 1]) {
73+
challenge.userCurrentPhase = phases[index + 1].phaseType;
74+
challenge.userCurrentPhaseEndTime = phases[index + 1].scheduledEndTime;
75+
challenge.userAction = null;
76+
}
77+
}
78+
}
79+
});
80+
}
81+
82+
if (challenge.userCurrentPhaseEndTime) {
83+
var timeAndUnit = moment(challenge.userCurrentPhaseEndTime).fromNow(true);
84+
timeAndUnit = timeAndUnit.split(' ');
85+
if (timeAndUnit[0] === 'a' || timeAndUnit[0] === 'an') {
86+
timeAndUnit[0] = '1';
87+
}
88+
challenge.userCurrentPhaseEndTime = timeAndUnit;
89+
}
90+
});
91+
}
92+
17193
/**
17294
* Helper method to parse the filter param as required by v3 API from JSON format
17395
*/

assets/css/directives/challenge-tile.scss

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,45 @@
9797
}
9898
}
9999

100+
.stalled-challenge {
101+
min-height: 83px;
102+
padding-top: 21px;
103+
}
104+
100105
.phase-action {
101-
margin-bottom: 25px;
102-
@include button-m-wide;
106+
min-height: 55px;
107+
108+
.submit {
109+
margin-bottom: 25px;
110+
@include button-m-wide;
111+
}
112+
113+
.submitted {
114+
position: relative;
115+
height: 30px;
116+
line-height: 30px;
117+
margin-bottom: 25px;
118+
padding-left: 35px;
119+
padding-right: 20px;
120+
border: 1px solid #F0F0F0;
121+
border-radius: 4px;
122+
background-color: $white;
123+
@include sofia-pro-regular;
124+
font-size: 12px;
125+
text-transform: uppercase;
126+
color: $primary-text;
127+
128+
&:before {
129+
content: '';
130+
width: 15px;
131+
height: 15px;
132+
background: url(/images/ico-checkmark.svg);
133+
background-size: 15px 15px;
134+
position: absolute;
135+
bottom: 6px;
136+
left: 14px;
137+
}
138+
}
103139
}
104140

105141
.roles {

assets/css/directives/ios-card.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
@import '../partials/combined';
22

33
// Default Challenge Tile Stylings
4-
.challenge.tile-view {
4+
ios-card .challenge.tile-view {
55
position: relative;
66
width: 270px;
77
border: 1px solid #DCDCDC;

assets/images/ico-checkmark.svg

Lines changed: 12 additions & 0 deletions
Loading

0 commit comments

Comments
 (0)