From 55499c1ee22ca8c0493d8daa2ae52194caa8e883 Mon Sep 17 00:00:00 2001 From: Nick Litwin Date: Wed, 20 Jan 2016 15:09:31 -0800 Subject: [PATCH 1/3] Add new page for successful submission --- app/index.jade | 3 +++ app/submissions/submissions.routes.js | 8 +++++++- .../submit-file-completed.controller.js | 19 +++++++++++++++++++ .../submit-file/submit-file-completed.jade | 8 ++++++++ .../submit-file/submit-file.controller.js | 6 +++--- 5 files changed, 40 insertions(+), 4 deletions(-) create mode 100644 app/submissions/submit-file/submit-file-completed.controller.js create mode 100644 app/submissions/submit-file/submit-file-completed.jade diff --git a/app/index.jade b/app/index.jade index 5354bf8a4..74baefe71 100644 --- a/app/index.jade +++ b/app/index.jade @@ -156,6 +156,8 @@ html script(src='../bower_components/react/react.js') script(src='../bower_components/react/react-dom.js') script(src='../bower_components/classnames/index.js') + script(src='../bower_components/classnames/bind.js') + script(src='../bower_components/classnames/dedupe.js') script(src='../bower_components/react-input-autosize/dist/react-input-autosize.min.js') script(src='../bower_components/react-select/dist/react-select.min.js') script(src='../bower_components/ngReact/ngReact.js') @@ -334,6 +336,7 @@ html script(src="submissions/submissions.controller.js") script(src="submissions/submissions.routes.js") script(src="submissions/submit-file/submit-file.controller.js") + script(src="submissions/submit-file/submit-file-completed.controller.js") script(src="topcoder.constants.js") script(src="topcoder.controller.js") script(src="topcoder.interceptors.js") diff --git a/app/submissions/submissions.routes.js b/app/submissions/submissions.routes.js index a80987887..00fc25257 100644 --- a/app/submissions/submissions.routes.js +++ b/app/submissions/submissions.routes.js @@ -84,10 +84,16 @@ } }, 'submissions.file': { - url: '?method=file', + url: '?method', templateUrl: 'submissions/submit-file/submit-file.html', controller: 'SubmitFileController', controllerAs: 'vm', + }, + 'submissions.completed': { + url: 'completed', + templateUrl: 'submissions/submit-file-completed/submit-file-completed.html', + controller: 'SubmitFileCompletedController', + controllerAs: 'vm' } }; diff --git a/app/submissions/submit-file/submit-file-completed.controller.js b/app/submissions/submit-file/submit-file-completed.controller.js new file mode 100644 index 000000000..4588a5699 --- /dev/null +++ b/app/submissions/submit-file/submit-file-completed.controller.js @@ -0,0 +1,19 @@ +(function () { + 'use strict'; + + angular.module('tc.submissions').controller('SubmitFileCompletedController', SubmitFileCompletedController); + + SubmitFileCompletedController.$inject = ['$log', 'challengeToSubmitTo']; + + function SubmitFileCompletedController($log, challengeToSubmitTo) { + $log = $log.getInstance('SubmitFileCompletedController'); + var vm = this; + vm.test = 'hi' + + activate(); + + function activate() { + console.log('ACTIVATED') + } + } +})(); diff --git a/app/submissions/submit-file/submit-file-completed.jade b/app/submissions/submit-file/submit-file-completed.jade new file mode 100644 index 000000000..b07a168e6 --- /dev/null +++ b/app/submissions/submit-file/submit-file-completed.jade @@ -0,0 +1,8 @@ +p {{vm.test}}, world. +p parent controller value: {{submissions.challengeId}} + +p Thank you for submitting! + +a.tc-btn(ng-href="https://www.{{DOMAIN}}/challenge-details/{{submissions.challengeId}}/?type={{submissions.track}}") Back to challenge details + +a.tc-btn(ui-sref="submissions.file") Submit again diff --git a/app/submissions/submit-file/submit-file.controller.js b/app/submissions/submit-file/submit-file.controller.js index 4eaf1c356..16188aa68 100644 --- a/app/submissions/submit-file/submit-file.controller.js +++ b/app/submissions/submit-file/submit-file.controller.js @@ -3,9 +3,9 @@ angular.module('tc.submissions').controller('SubmitFileController', SubmitFileController); - SubmitFileController.$inject = ['$scope', '$stateParams', '$log', 'UserService', 'SubmissionsService', 'challengeToSubmitTo']; + SubmitFileController.$inject = ['$scope','$state', '$stateParams', '$log', 'UserService', 'SubmissionsService', 'challengeToSubmitTo']; - function SubmitFileController($scope, $stateParams, $log, UserService, SubmissionsService, challengeToSubmitTo) { + function SubmitFileController($scope, $state, $stateParams, $log, UserService, SubmissionsService, challengeToSubmitTo) { var vm = this; $log = $log.getInstance('SubmitFileController'); var files = {}; @@ -212,7 +212,7 @@ vm.finishing = false; vm.showProgress = false; - // TODO redirect to submission listing / challenge details page + $state.go('submissions.completed'); } } else { // assume it to be error condition $log.debug("Error Condition: " + phase); From ade537bc6ee21399c33b44f3ef1a8361752ed648 Mon Sep 17 00:00:00 2001 From: Nick Litwin Date: Thu, 21 Jan 2016 18:06:43 -0800 Subject: [PATCH 2/3] Add buttons when upload is complete and change routes to handle different tracks --- README.md | 8 +++-- app/index.jade | 3 +- app/submissions/submissions.controller.js | 15 ++++++++-- app/submissions/submissions.routes.js | 30 ++++++++++--------- .../submit-design-files.controller.js} | 29 +++++++++--------- .../submit-design-files.jade} | 17 +++++++---- .../submit-design-files.spec.js} | 25 ++++++++++++++-- .../submit-file-completed.controller.js | 19 ------------ .../submit-file/submit-file-completed.jade | 8 ----- app/topcoder.routes.js | 8 ++--- assets/css/submissions/submit-file.scss | 20 +++++++++---- 11 files changed, 99 insertions(+), 83 deletions(-) rename app/submissions/{submit-file/submit-file.controller.js => submit-design-files/submit-design-files.controller.js} (89%) rename app/submissions/{submit-file/submit-file.jade => submit-design-files/submit-design-files.jade} (94%) rename app/submissions/{submit-file/submit-file.spec.js => submit-design-files/submit-design-files.spec.js} (92%) delete mode 100644 app/submissions/submit-file/submit-file-completed.controller.js delete mode 100644 app/submissions/submit-file/submit-file-completed.jade diff --git a/README.md b/README.md index 61dc00699..4d1013e6c 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,8 @@ Spec files live alongside the code they are testing. For example, in peer-review ## UI-Router and States See any *.routes.js file as an example. +**Important** Make sure the url in your routes files ends with a / + ## Contributing ### Style Guide and Naming Conventions @@ -78,9 +80,9 @@ Jade Files ``` .wrapper h1 Lorem ipsum - + p Sibling tag - + .wrapper2 p Child ``` @@ -99,7 +101,7 @@ SCSS Files height: 100px; width: 100px; } - + .inside-box { font-size: 14px; @media screen and (min-width: 768px) { diff --git a/app/index.jade b/app/index.jade index 74baefe71..4c78788d2 100644 --- a/app/index.jade +++ b/app/index.jade @@ -335,8 +335,7 @@ html script(src="submissions/submissions.module.js") script(src="submissions/submissions.controller.js") script(src="submissions/submissions.routes.js") - script(src="submissions/submit-file/submit-file.controller.js") - script(src="submissions/submit-file/submit-file-completed.controller.js") + script(src="submissions/submit-design-files/submit-design-files.controller.js") script(src="topcoder.constants.js") script(src="topcoder.controller.js") script(src="topcoder.interceptors.js") diff --git a/app/submissions/submissions.controller.js b/app/submissions/submissions.controller.js index 63c24e445..ff9b79729 100644 --- a/app/submissions/submissions.controller.js +++ b/app/submissions/submissions.controller.js @@ -3,9 +3,10 @@ angular.module('tc.submissions').controller('SubmissionsController', SubmissionsController); - SubmissionsController.$inject = ['challengeToSubmitTo']; + SubmissionsController.$inject = ['challengeToSubmitTo', '$state']; + + function SubmissionsController(challengeToSubmitTo, $state) { - function SubmissionsController(challengeToSubmitTo) { var vm = this; var challenge = challengeToSubmitTo.challenge; @@ -15,6 +16,14 @@ activate(); - function activate() {} + function activate() { + var track = challengeToSubmitTo.challenge.track; + + if (track === 'DESIGN') { + $state.go('submissions.file.design'); + } else if (track === 'DEVELOP') { + $state.go('submissions.file.develop') + } + } } })(); diff --git a/app/submissions/submissions.routes.js b/app/submissions/submissions.routes.js index 00fc25257..e0199c956 100644 --- a/app/submissions/submissions.routes.js +++ b/app/submissions/submissions.routes.js @@ -18,9 +18,7 @@ controllerAs: 'submissions', data: { authRequired: true, - - // TODO: Get title from PMs - title: 'Submit' + title: 'Challenge Submission' }, resolve: { challengeToSubmitTo: ['ChallengeService', '$stateParams', 'UserService', function(ChallengeService, $stateParams, UserService) { @@ -36,10 +34,9 @@ challenge = challenge[0]; if (!challenge) { - // There should be a challenge, redirect? + // TODO: There should be a challenge, redirect? alert('User is not associated with this challenge.'); } - var phaseType; var phaseId; @@ -84,17 +81,22 @@ } }, 'submissions.file': { - url: '?method', - templateUrl: 'submissions/submit-file/submit-file.html', - controller: 'SubmitFileController', + url:'file/', + abstract: true, + template: '' + }, + 'submissions.file.design': { + url:'', + templateUrl: 'submissions/submit-design-files/submit-design-files.html', + controller: 'SubmitDesignFilesController', + controllerAs: 'vm', + }, + 'submissions.file.develop': { + url:'', + templateUrl: 'submissions/submit-develop-files/submit-develop-files.html', + controller: 'SubmitDevelopFilesController', controllerAs: 'vm', }, - 'submissions.completed': { - url: 'completed', - templateUrl: 'submissions/submit-file-completed/submit-file-completed.html', - controller: 'SubmitFileCompletedController', - controllerAs: 'vm' - } }; for (var name in states) { diff --git a/app/submissions/submit-file/submit-file.controller.js b/app/submissions/submit-design-files/submit-design-files.controller.js similarity index 89% rename from app/submissions/submit-file/submit-file.controller.js rename to app/submissions/submit-design-files/submit-design-files.controller.js index 16188aa68..056795f25 100644 --- a/app/submissions/submit-file/submit-file.controller.js +++ b/app/submissions/submit-design-files/submit-design-files.controller.js @@ -1,13 +1,13 @@ (function () { 'use strict'; - angular.module('tc.submissions').controller('SubmitFileController', SubmitFileController); + angular.module('tc.submissions').controller('SubmitDesignFilesController', SubmitDesignFilesController); - SubmitFileController.$inject = ['$scope','$state', '$stateParams', '$log', 'UserService', 'SubmissionsService', 'challengeToSubmitTo']; + SubmitDesignFilesController.$inject = ['$scope','$window', '$stateParams', '$log', 'UserService', 'SubmissionsService', 'challengeToSubmitTo']; - function SubmitFileController($scope, $state, $stateParams, $log, UserService, SubmissionsService, challengeToSubmitTo) { + function SubmitDesignFilesController($scope, $window, $stateParams, $log, UserService, SubmissionsService, challengeToSubmitTo) { var vm = this; - $log = $log.getInstance('SubmitFileController'); + $log = $log.getInstance('SubmitDesignFilesController'); var files = {}; var fileUploadProgress = {}; vm.urlRegEx = new RegExp(/^(http(s?):\/\/)?(www\.)?[a-zA-Z0-9\.\-\_]+(\.[a-zA-Z]{2,3})+(\/[a-zA-Z0-9\_\-\s\.\/\?\%\#\&\=]*)?$/); @@ -39,8 +39,6 @@ vm.submissionsBody = { reference: { - - // type dynamic or static? type: 'CHALLENGE', id: $stateParams.challengeId, phaseType: challengeToSubmitTo.phaseType, @@ -48,9 +46,7 @@ }, userId: userId, data: { - - // Dynamic or static? - method: 'DESIGN_CHALLENGE_ZIP_FILE', + method: challengeToSubmitTo.challenge.track.toUpperCase() + '_CHALLENGE_ZIP_FILE', // Can delete below since they are processed and added later? files: [], @@ -64,6 +60,7 @@ vm.setRankTo1 = setRankTo1; vm.setFileReference = setFileReference; vm.uploadSubmission = uploadSubmission; + vm.refreshPage = refreshPage; vm.cancelRetry = cancelRetry; activate(); @@ -194,11 +191,13 @@ count++; } vm.uploadProgress = total / count; + // initiate digest cycle because this event (xhr event) is caused outside angular $scope.$apply(); } else { // typeof args === 'number', mainly used a s fallback to mark completion of the UPLOAD phase vm.uploadProgress = args; } + // start next phase when UPLOAD is done if (vm.uploadProgress == 100) { $log.debug('Uploaded files.'); @@ -209,20 +208,20 @@ // we are concerned only for completion of the phase if (args === 100) { $log.debug('Finished upload.'); - vm.finishing = false; - vm.showProgress = false; - - $state.go('submissions.completed'); } - } else { // assume it to be error condition + } else { + // assume it to be error condition $log.debug("Error Condition: " + phase); vm.errorInUpload = true; } } + function refreshPage() { + $window.location.reload(true); + } + function cancelRetry() { vm.showProgress = false; - // TODO redirect to submission listing / challenge details page } } })(); diff --git a/app/submissions/submit-file/submit-file.jade b/app/submissions/submit-design-files/submit-design-files.jade similarity index 94% rename from app/submissions/submit-file/submit-file.jade rename to app/submissions/submit-design-files/submit-design-files.jade index b4c383845..4225636ec 100644 --- a/app/submissions/submit-file/submit-file.jade +++ b/app/submissions/submit-design-files/submit-design-files.jade @@ -151,7 +151,7 @@ button.tc-btn.tc-btn-secondary(type="submit", ng-disabled="submissionForm.$invalid") Submit -modal.transition(show="vm.showProgress", background-click-close="true", style="background-color:white;") +modal.transition(show="vm.showProgress", background-click-close="false", style="background-color:white;") .upload-progress(ng-class="{'upload-progress--error': vm.errorInUpload}") .upload-progress__title p Uploading submission for @@ -159,17 +159,24 @@ modal.transition(show="vm.showProgress", background-click-close="true", style="b p.upload-progress-title__challenge-name [Challenge name] img.upload-progress__image(src="/images/robot.svg", ng-hide="vm.errorInUpload") - img.upload-progress__image--error(src="/images/robot-embarresed.svg", ng-show="vm.errorInUpload") - p.upload-progress__message(ng-hide="vm.errorInUpload") Hey, your work is AWESOME! Please don’t close the window while I’m working, you’ll loose all files! + p.upload-progress__message(ng-hide="vm.errorInUpload") Hey, your work is AWESOME! Please don’t close the window while I’m working or you’ll loose all files! - p.upload-progress__message--error(ng-show="vm.errorInUpload") Oh, that’s embarrassing! The file couldn’t be uploaded, I’m so sorry. + p.upload-progress__message--error(ng-show="vm.errorInUpload") Oh, that’s embarrassing! One of the files couldn’t be uploaded, I’m so sorry. progress-bar.upload-progress__progress-bar(completed="vm.uploadProgress", message="of 3 files uploaded") .upload-progress__preparing(ng-show="vm.preparing && !vm.errorInUpload") #[span Preparing...] - .upload-progress__finishing(ng-show="vm.finishing && !vm.errorInUpload") #[span Finishing...] + .upload-progress__finishing(ng-show="vm.finishing && !vm.errorInUpload") + p Finished! + + .upload-progess__links + a.tc-btn.tc-btn-s(ng-href="https://www.{{DOMAIN}}/challenge-details/{{submissions.challengeId}}/?type={{submissions.track}}") Back to the challenge + + a.tc-btn.tc-btn-s.tc-btn-ghost(ng-click="vm.refreshPage()") Submit another + + .upload-progress__error(ng-show="vm.errorInUpload") #[span File upload failed] .upload-progress__error-action(ng-show="vm.errorInUpload") diff --git a/app/submissions/submit-file/submit-file.spec.js b/app/submissions/submit-design-files/submit-design-files.spec.js similarity index 92% rename from app/submissions/submit-file/submit-file.spec.js rename to app/submissions/submit-design-files/submit-design-files.spec.js index acff67737..d2ec1d680 100644 --- a/app/submissions/submit-file/submit-file.spec.js +++ b/app/submissions/submit-design-files/submit-design-files.spec.js @@ -1,5 +1,5 @@ /* jshint -W117, -W030 */ -describe('Submit File Controller', function() { +describe('Submit Design Files Controller', function() { var controller, vm, scope; var mockChallenge = { @@ -22,6 +22,12 @@ describe('Submit File Controller', function() { getPresignedURL: function() {} }; + var mockWindow = { + location: { + reload: function(val) { return val; } + } + }; + beforeEach(function() { bard.appModule('tc.submissions'); bard.inject(this, '$controller', '$rootScope'); @@ -32,11 +38,12 @@ describe('Submit File Controller', function() { bard.verifyNoOutstandingHttpRequests(); beforeEach(function() { - controller = $controller('SubmitFileController', { + controller = $controller('SubmitDesignFilesController', { $scope: scope, UserService: userService, challengeToSubmitTo: mockChallenge, - SubmissionsService: submissionsService + SubmissionsService: submissionsService, + $window: mockWindow }); vm = controller; }); @@ -265,6 +272,18 @@ describe('Submit File Controller', function() { }); }); + describe('refreshPage', function() { + it('reloads the page', function() { + var mockRefresh = sinon.spy(mockWindow.location, 'reload'); + + vm.refreshPage(); + scope.$digest(); + + expect(mockRefresh).calledWith(true); + expect(mockRefresh).calledOnce; + }); + }); + describe('cancelRetry', function() { it('sets showProgress to false', function() { vm.showProgress = true; diff --git a/app/submissions/submit-file/submit-file-completed.controller.js b/app/submissions/submit-file/submit-file-completed.controller.js deleted file mode 100644 index 4588a5699..000000000 --- a/app/submissions/submit-file/submit-file-completed.controller.js +++ /dev/null @@ -1,19 +0,0 @@ -(function () { - 'use strict'; - - angular.module('tc.submissions').controller('SubmitFileCompletedController', SubmitFileCompletedController); - - SubmitFileCompletedController.$inject = ['$log', 'challengeToSubmitTo']; - - function SubmitFileCompletedController($log, challengeToSubmitTo) { - $log = $log.getInstance('SubmitFileCompletedController'); - var vm = this; - vm.test = 'hi' - - activate(); - - function activate() { - console.log('ACTIVATED') - } - } -})(); diff --git a/app/submissions/submit-file/submit-file-completed.jade b/app/submissions/submit-file/submit-file-completed.jade deleted file mode 100644 index b07a168e6..000000000 --- a/app/submissions/submit-file/submit-file-completed.jade +++ /dev/null @@ -1,8 +0,0 @@ -p {{vm.test}}, world. -p parent controller value: {{submissions.challengeId}} - -p Thank you for submitting! - -a.tc-btn(ng-href="https://www.{{DOMAIN}}/challenge-details/{{submissions.challengeId}}/?type={{submissions.track}}") Back to challenge details - -a.tc-btn(ui-sref="submissions.file") Submit again diff --git a/app/topcoder.routes.js b/app/topcoder.routes.js index e063cb6e5..2b9ca95b1 100644 --- a/app/topcoder.routes.js +++ b/app/topcoder.routes.js @@ -42,10 +42,8 @@ window.location.href = CONSTANTS.MAIN_URL + '/404/'; }] }, - /** - * Base state that all other routes should inherit from. - * Child routes can override any of the specified regions - */ + // Base state that all other routes should inherit from. + // Child routes can override any of the specified regions 'root': { url: '', abstract: true, @@ -70,10 +68,8 @@ } }, 'home': { - // TODO - set new home page parent: 'root', url: '/', - // template: 'This is the home page', controller: ['$state', function($state) { $state.go('dashboard'); }] diff --git a/assets/css/submissions/submit-file.scss b/assets/css/submissions/submit-file.scss index b5a91be56..217e7af95 100644 --- a/assets/css/submissions/submit-file.scss +++ b/assets/css/submissions/submit-file.scss @@ -112,11 +112,8 @@ tc-form-fonts, tc-form-stockart { } modal { - .close { - .icon.cross { - background-image: url(/images/x-mark-gray.svg); - background-size: 25px; - } + > button { + display: none; } } .upload-progress { @@ -162,6 +159,7 @@ modal { font-size: 12px; line-height: 14px; color: $accent-gray-dark; + text-align: center; } .upload-progress__error { @@ -180,3 +178,15 @@ modal { } } } + +.upload-progess__links { + margin-top: 40px; + + a { + display: inline-block; + + &:first-child { + margin-right: 10px; + } + } +} From b3639fbd3ed588ed66f6d172d92209ad14641fef Mon Sep 17 00:00:00 2001 From: Nick Litwin Date: Fri, 22 Jan 2016 14:38:01 -0800 Subject: [PATCH 3/3] Added unit tests for new functionality --- app/specs.html | 12 +++---- app/submissions/submissions.spec.js | 36 +++++++++++++++++-- .../submit-design-files.spec.js | 22 +++++++++++- 3 files changed, 60 insertions(+), 10 deletions(-) diff --git a/app/specs.html b/app/specs.html index 07ae65a8d..982ab2f85 100644 --- a/app/specs.html +++ b/app/specs.html @@ -108,7 +108,7 @@

Spec Runner

- + @@ -288,8 +288,8 @@

Spec Runner

- + @@ -298,9 +298,9 @@

Spec Runner

+ - @@ -309,19 +309,19 @@

Spec Runner

- + - + - + diff --git a/app/submissions/submissions.spec.js b/app/submissions/submissions.spec.js index d37f5fce4..4e2b16fa1 100644 --- a/app/submissions/submissions.spec.js +++ b/app/submissions/submissions.spec.js @@ -10,6 +10,10 @@ describe('Submissions Controller', function() { } }; + var state = { + go: sinon.spy() + } + beforeEach(function() { bard.appModule('tc.submissions'); bard.inject(this, '$controller'); @@ -19,18 +23,44 @@ describe('Submissions Controller', function() { beforeEach(function() { controller = $controller('SubmissionsController', { - challengeToSubmitTo: mockChallenge + challengeToSubmitTo: mockChallenge, + $state: state }); vm = controller; }); - it('should exist', function() { + it('exists', function() { expect(vm).to.exist; }); - it('should have properties on vm from the routes resolve', function() { + it('has properties on vm from the routes resolve', function() { expect(vm.challengeTitle).to.equal(mockChallenge.challenge.name); expect(vm.challengeId).to.equal(30049240); expect(vm.track).to.equal(mockChallenge.challenge.track.toLowerCase()); }); + + describe('routes to the correct child state for', function() { + it('design challenges', function() { + + expect(state.go).calledWith('submissions.file.design'); + }); + + it('develop challenges', function() { + + controller = $controller('SubmissionsController', { + challengeToSubmitTo: { + challenge: { + name: 'Challenge Name', + track: 'DEVELOP', + id: 30049240 + } + }, + $state: state + }); + vm = controller; + + expect(state.go).calledWith('submissions.file.develop'); + }); + + }); }); diff --git a/app/submissions/submit-design-files/submit-design-files.spec.js b/app/submissions/submit-design-files/submit-design-files.spec.js index d2ec1d680..13898bd86 100644 --- a/app/submissions/submit-design-files/submit-design-files.spec.js +++ b/app/submissions/submit-design-files/submit-design-files.spec.js @@ -48,10 +48,30 @@ describe('Submit Design Files Controller', function() { vm = controller; }); - it('should exist', function() { + it('exists', function() { expect(vm).to.exist; }); + it('sets the right track for the method', function() { + controller = $controller('SubmitDesignFilesController', { + $scope: scope, + UserService: userService, + challengeToSubmitTo: { + challenge: { + name: 'Challenge Name', + track: 'DEVELOP', + id: 30049240 + } + }, + SubmissionsService: submissionsService, + $window: mockWindow + }); + vm = controller; + scope.$digest(); + + expect(vm.submissionsBody.data.method).to.equal('DEVELOP_CHALLENGE_ZIP_FILE'); + }); + describe('setRankTo1', function() { it('returns 1 if the input is blank', function() { expect(vm.setRankTo1('')).to.equal(1);