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

Commit 9cd28bd

Browse files
author
Nick Litwin
committed
Finish putting peer-review in topcoder
1 parent e7822e6 commit 9cd28bd

27 files changed

+684
-34
lines changed

app/filters/local-time.filter.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
(function() {
2+
'use strict';
3+
4+
angular.module('topcoder').filter('localTime', localTime);
5+
6+
function localTime() {
7+
var timezone = jstz.determine().name();
8+
return function(input) {
9+
return moment(input).tz(timezone).format('MM/DD/YY hh:mm A z');
10+
};
11+
};
12+
13+
})();

app/index.jade

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,13 @@ html
3434

3535
include ./layout/header/header.jade
3636

37-
p This is the top of the index page
38-
3937
.view-container(ng-class="{slided: main.sidebarActive}")
4038
div(ui-view, ng-class="$state.current.name")
4139

42-
p This is the bottom of the index page
43-
4440
include ./layout/footer/footer.jade
4541

4642
script(src="https://cdn.auth0.com/w2/auth0-1.6.4.js", type="text/javascript")
43+
script(src="https://cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.4/jstz.min.js", type="text/javascript")
4744

4845
// build:js js/vendor.js
4946
//- bower:js
@@ -53,25 +50,41 @@ html
5350
script(src='../bower_components/angular-jwt/dist/angular-jwt.js')
5451
script(src='../bower_components/moment/moment.js')
5552
//- endbower
53+
//- inject:nonBowerScripts
54+
script(src="/scripts/moment-timezone-with-data-2010-2020.js")
55+
//- endinject
5656
// endbuild
5757
5858
// build:js js/app.js
5959
//- inject:js
6060
script(src="topcoder.module.js")
6161
script(src="account/account.module.js")
6262
script(src="layout/layout.module.js")
63+
script(src="peer-review/peer-review.module.js")
6364
script(src="topcoder.constants.js")
6465
script(src="topcoder.controller.js")
66+
script(src="topcoder.interceptors.js")
6567
script(src="account/account.routes.js")
68+
script(src="filters/local-time.filter.js")
69+
script(src="peer-review/peer-review.routes.js")
70+
script(src="peer-review/slideable.directive.js")
6671
script(src="services/api.service.js")
6772
script(src="services/auth.service.js")
6873
script(src="services/authtoken.service.js")
74+
script(src="services/challenge.service.js")
6975
script(src="services/helpers.service.js")
7076
script(src="services/profile.service.js")
77+
script(src="services/review.service.js")
78+
script(src="services/scorecard.service.js")
7179
script(src="services/user.service.js")
7280
script(src="account/login/login.controller.js")
7381
script(src="account/register/register.controller.js")
7482
script(src="layout/header/header.controller.js")
83+
script(src="peer-review/completed-review/completed-review.controller.js")
84+
script(src="peer-review/edit-review/edit-review.controller.js")
85+
script(src="peer-review/readOnlyScorecard/readOnlyScorecard.controller.js")
86+
script(src="peer-review/review-status/review-status.controller.js")
87+
script(src="peer-review/review-status/review-status.filter.js")
7588
//- endinject
7689
7790
// inject:templates.js

app/layout/header/header.controller.js

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

44
angular.module('tc.layout').controller('HeaderController', HeaderController);
55

6-
HeaderController.$inject = ['$window', '$stateParams', 'auth', 'CONSTANTS', 'profile'];
6+
HeaderController.$inject = ['$window', '$stateParams', 'auth', 'CONSTANTS'];
77

8-
function HeaderController($window, $stateParams, auth, CONSTANTS, profile) {
8+
function HeaderController($window, $stateParams, auth, CONSTANTS) {
99
var vm = this;
10-
vm.domain = CONSTANTS.domain
11-
vm.login = auth.login
12-
vm.isAuth = auth.isAuthenticated
10+
vm.domain = CONSTANTS.domain;
11+
vm.login = auth.login;
12+
vm.isAuth = auth.isAuthenticated;
1313
vm.logout = function() {
1414
auth.logout(function() {
1515
if($stateParams.challengeId) {
1616
$window.location.href = 'https://www.' + vm.domain + '/challenge-details/' + $stateParams.challengeId + '/?type=develop';
1717
}
1818
});
19-
}
19+
};
2020
}
2121

2222
})();

app/layout/header/header.jade

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
1-
header(ng-controller="HeaderController", ng-class="{slided: main.sidebarActive}")
1+
header(ng-controller="HeaderController as vm", ng-class="{slided: main.sidebarActive}")
22
.container
3-
a(id="topcoder-logo", ng-href="https://www.{{domain}}", title="topcoder")
3+
a(id="topcoder-logo", ng-href="https://www.{{vm.domain}}", title="topcoder")
44
img(src="/images/logo.png", alt="Topcoder Logo")
55

66
nav.top-right
77
ul
8-
li.login(ng-hide="isAuth()") #[a(ui-sref="login") Log In]
8+
li.login(ng-hide="vm.isAuth()") #[a(ui-sref="login") Log In]
99

10-
li.logout(ng-show="isAuth()") #[a(ng-click="logout()") Log Out]
10+
li.logout(ng-show="vm.isAuth()") #[a(ng-click="vm.logout()") Log Out]
1111

1212
li.contact #[a(href="#") Contact]
1313

1414
li.help #[a(href="#") Help]
1515

1616
li.search #[a(href="#") #[i#search] Search]
1717

18-
li.my-account(ng-show="isAuth()") #[a(ng-click="isActive = !isActive", slide-toggle="#user-widget") My Account]
18+
li.my-account(ng-show="vm.isAuth()") #[a(ng-click="vm.isActive = !vm.isActive", slide-toggle="#user-widget") My Account]
1919

20-
li.signup(ng-hide="isAuth()") #[a(ui-sref="register") Sign Up]
20+
li.signup(ng-hide="vm.isAuth()") #[a(ui-sref="register") Sign Up]
2121

2222
button.bars(type="button", ng-click="main.sidebarActive = !main.sidebarActive")
2323
span.icon-bar
@@ -26,16 +26,16 @@ header(ng-controller="HeaderController", ng-class="{slided: main.sidebarActive}"
2626

2727
nav.bottom
2828
ul
29-
li #[a(ng-href="https://www.{{domain}}/challenges/") Challenges]
29+
li #[a(ng-href="https://www.{{vm.domain}}/challenges/") Challenges]
3030

31-
li #[a(ng-href="https://www.{{domain}}/community/") Community]
31+
li #[a(ng-href="https://www.{{vm.domain}}/community/") Community]
3232

33-
li #[a(ng-href="https://www.{{domain}}/about/") About]
33+
li #[a(ng-href="https://www.{{vm.domain}}/about/") About]
3434

35-
li #[a.blog(ng-href="https://www.{{domain}}/blog/") Blog]
35+
li #[a.blog(ng-href="https://www.{{vm.domain}}/blog/") Blog]
3636

37-
a#signup(ng-hide="isAuth()", ui-sref="register") Sign Up
38-
a#my-account(ng-show="isAuth()", ng-click="isActive = !isActive", ng-init="isActive = false", slide-toggle="#user-widget") My Account
37+
a#signup(ng-hide="vm.isAuth()", ui-sref="register") Sign Up
38+
a#my-account(ng-show="vm.isAuth()", ng-click="vm.isActive = !vm.isActive", ng-init="vm.isActive = false", slide-toggle="#user-widget") My Account
3939
i(ng-class="{'active': isActive}")
4040

4141
div#user-widget.slideable
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
(function() {
2+
// The CompletedReview controller displays a completed review.
3+
4+
'use strict';
5+
6+
angular.module('tc.peer-review').controller('CompletedReviewController', CompletedReviewController);
7+
8+
CompletedReviewController.$inject = ['$scope', '$stateParams', 'scorecard', 'review', 'user', 'challenge', 'helpers', '$q', 'CONSTANTS'];
9+
10+
function CompletedReviewController($scope, $stateParams, scorecard, review, user, challenge, helpers, $q, CONSTANTS) {
11+
var promises;
12+
$scope.submissionDownloadPath = CONSTANTS.submissionDownloadPath;
13+
$scope.domain = CONSTANTS.domain;
14+
$scope.challengeId = $stateParams.challengeId;
15+
$scope.loaded = false;
16+
$scope.stats = {};
17+
$scope.scorecard = {
18+
questions: {}
19+
};
20+
promises = [user.getUsername(), challenge.getChallengeDetails($stateParams.challengeId), review.getReview($stateParams.reviewId), scorecard.getScorecard($scope.challengeId)];
21+
$q.all(promises).then(function(response) {
22+
var challenge, review, scorecard, scorecardId, user;
23+
user = response[0].data;
24+
challenge = response[1].data;
25+
review = response[2].data.result.content;
26+
scorecard = response[3].data.result.content[0];
27+
$scope.stats.username = user.handle;
28+
$scope.challenge = challenge;
29+
$scope.stats.submissionId = review.submissionId;
30+
$scope.stats.uploadId = review.uploadId;
31+
$scope.stats.createdAt = review.createdAt;
32+
$scope.stats.updatedAt = review.updatedAt;
33+
$scope.review = review;
34+
scorecardId = scorecard.id;
35+
return scorecard.getScorecardQuestions(scorecardId).then(function(data) {
36+
var questions;
37+
questions = data.data.result.content;
38+
helpers.storeById($scope.scorecard.questions, questions);
39+
helpers.parseQuestions($scope.scorecard.questions);
40+
return review.getReviewItems($stateParams.reviewId);
41+
}).then(function(data) {
42+
var answers;
43+
answers = data.data.result.content;
44+
helpers.parseAnswers($scope.scorecard.questions, answers);
45+
return $scope.loaded = true;
46+
});
47+
});
48+
return $scope.submit = function() {
49+
return $state.go('reviewStatus', {
50+
challengeId: $scope.challengeId
51+
});
52+
};
53+
};
54+
})();
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
.container.completed-review(ng-show="loaded")
2+
.back-link
3+
.arrow
4+
5+
p #[a.back(ui-sref="reviewStatus({challengeId: challengeId})") #[i] Back to Reviews]
6+
7+
.scorecard-container
8+
.challenge-info
9+
img(src="content/images/swift-logo.png")
10+
11+
h1(ng-bind="challenge.challengeName")
12+
13+
table.review-info
14+
tr
15+
td.info Submission:
16+
td
17+
a.subLink(ng-href="https://software.{{domain}}{{submissionDownloadPath}}{{stats.uploadId}}") {{stats.submissionId}}
18+
tr
19+
td.info Last Modified On:
20+
td {{stats.updatedAt || stats.createdAt | localTime}}
21+
tr
22+
td.info Reviewer:
23+
td {{stats.username}}
24+
25+
hr
26+
27+
form(name="completedForm", role="form")
28+
.scorecard(ng-repeat="q in scorecard.questions")
29+
h5.description {{q.description}}
30+
31+
p.guidelines(ng-if="q.questionTypeId === 5", ng-repeat="guideline in q.guidelines track by $index") {{guideline}}
32+
33+
p.answer(ng-if="q.questionTypeId === 5") Your Response: {{q.answer}}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
(function() {
2+
// The EditReviewController controller fetches the scorecard template and any
3+
// answers saved but not submitted.
4+
5+
'use strict';
6+
var EditReviewController;
7+
8+
angular.module('tc.peer-review').controller('EditReviewController', EditReviewController);
9+
10+
EditReviewController.$inject = ['$scope', '$state', '$stateParams', 'review', 'scorecard', 'user', 'challenge', 'helpers', '$q', 'CONSTANTS'];
11+
12+
function EditReviewController($scope, $state, $stateParams, review, scorecard, user, challenge, helpers, $q, CONSTANTS) {
13+
var promises;
14+
$scope.submissionDownloadPath = CONSTANTS.submissionDownloadPath;
15+
$scope.domain = CONSTANTS.domain;
16+
$scope.challengeId = $stateParams.challengeId;
17+
$scope.challenge = null;
18+
$scope.loaded = false;
19+
$scope.saved = false;
20+
$scope.stats = {};
21+
$scope.scorecard = {
22+
questions: {}
23+
};
24+
promises = [user.getUsername(), challenge.getChallengeDetails($scope.challengeId), review.getReview($stateParams.reviewId), scorecard.getScorecard($scope.challengeId)];
25+
$q.all(promises).then(function(response) {
26+
var challenge, review, scorecard, scorecardId, user;
27+
user = response[0].data;
28+
challenge = response[1].data;
29+
review = response[2].data.result.content;
30+
scorecard = response[3].data.result.content[0];
31+
$scope.stats.username = user.handle;
32+
$scope.challenge = challenge;
33+
$scope.stats.submissionId = review.submissionId;
34+
$scope.stats.uploadId = review.uploadId;
35+
$scope.stats.createdAt = review.createdAt;
36+
$scope.stats.updatedAt = review.updatedAt;
37+
$scope.review = review;
38+
scorecardId = scorecard.id;
39+
return scorecard.getScorecardQuestions(scorecardId).then(function(data) {
40+
var questions;
41+
questions = data.data.result.content;
42+
helpers.storeById($scope.scorecard.questions, questions);
43+
helpers.parseQuestions($scope.scorecard.questions);
44+
return review.getReviewItems($stateParams.reviewId);
45+
}).then(function(data) {
46+
var answers;
47+
answers = data.data.result.content;
48+
$scope.saved = helpers.parseAnswers($scope.scorecard.questions, answers);
49+
return $scope.loaded = true;
50+
});
51+
});
52+
$scope.submitReviewItems = function() {
53+
var body;
54+
body = helpers.compileReviewItems($scope.scorecard.questions, $scope.review, $scope.saved);
55+
return review.saveReviewItems(body, $scope.saved).then(function(response) {
56+
return review.markAsCompleted($stateParams.reviewId);
57+
}).then(function(response) {
58+
return $state.go('reviewStatus', {
59+
challengeId: $scope.challengeId
60+
});
61+
})["catch"](function(error) {
62+
var message;
63+
message = 'An error occurred while trying to submit answers.\n' + error.status + ': ' + error.statusText;
64+
alert(message);
65+
return $state.reload();
66+
});
67+
};
68+
return $scope.saveReviewForLater = function() {
69+
var body;
70+
body = helpers.compileReviewItems($scope.scorecard.questions, $scope.review, $scope.saved);
71+
return review.saveReviewItems(body, $scope.saved).then(function(data) {
72+
return $state.go('reviewStatus', {
73+
challengeId: $scope.challengeId
74+
});
75+
})["catch"](function(error) {
76+
var message;
77+
message = 'An error occurred while trying to update answers.\n' + error.status + ': ' + error.statusText;
78+
alert(message);
79+
return $state.reload();
80+
});
81+
};
82+
};
83+
})();
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
.container.edit-review(ng-show="loaded")
2+
.back-link
3+
.arrow
4+
5+
p #[a.back(ui-sref="reviewStatus({challengeId: challengeId})") Back to Reviews]
6+
7+
.scorecard-container
8+
.challenge-info
9+
img(src="content/images/swift-logo.png")
10+
11+
h1(ng-bind="challenge.challengeName")
12+
13+
table.review-info
14+
tr
15+
td.info Submission:
16+
td
17+
a.subLink(ng-href="https://software.{{domain}}{{submissionDownloadPath}}{{stats.uploadId}}") {{stats.submissionId}}
18+
tr
19+
td.info Last Modified On:
20+
td {{stats.updatedAt || stats.createdAt | localTime}}
21+
tr
22+
td.info Reviewer:
23+
td {{stats.username}}
24+
25+
hr
26+
27+
form#review-form(name="editForm", ng-submit="editForm.$valid && submitReviewItems()", role="form", novalidate)
28+
.scorecard(ng-repeat="q in scorecard.questions")
29+
h5.description {{q.description}}
30+
31+
p.guidelines(ng-if="q.questionTypeId === 5", ng-repeat="guideline in q.guidelines track by $index") {{guideline}}
32+
33+
.select-options(ng-form="optionForm", ng-if="q.questionTypeId === 5")
34+
select(
35+
ng-init="q.answer = ''",
36+
ng-model="q.answer",
37+
ng-options="num for num in ['0','1','2','3']",
38+
required,
39+
name="select",
40+
ng-class="{required: editForm.$submitted && optionForm.select.$error.required}")
41+
42+
p.required-message(ng-show="editForm.$submitted && optionForm.select.$error.required") Required
43+
44+
button(type="submit") Save and Mark Complete
45+
46+
button(type="button", ng-click="saveReviewForLater()") Save For Later

app/peer-review/peer-review.module.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
(function() {
2+
'use strict';
3+
4+
var dependencies = [
5+
'angular-jwt',
6+
'ui.router',
7+
'ngCookies',
8+
'angularSlideables'
9+
];
10+
11+
angular
12+
.module('tc.peer-review', dependencies);
13+
14+
})();

0 commit comments

Comments
 (0)