From 1c4b40c8e6ee616aa60cf25d900d5670d8c6bd9a Mon Sep 17 00:00:00 2001 From: terakilobyte Date: Mon, 25 May 2015 17:27:27 -0400 Subject: [PATCH] Update to bonfires. Successfully completing triggers a save. "Paired with" form field moved to bonfire view. Controller hardened for checking pair as button is no longer disabled for unfound username --- controllers/challenge.js | 72 ++++++++++++------- .../coursewaresJSFramework_0.0.2.js | 28 ++++++-- public/js/main.js | 21 +----- views/coursewares/showBonfire.jade | 28 ++++---- 4 files changed, 84 insertions(+), 65 deletions(-) diff --git a/controllers/challenge.js b/controllers/challenge.js index 06f33e704a..76e273f681 100644 --- a/controllers/challenge.js +++ b/controllers/challenge.js @@ -324,44 +324,62 @@ exports.completedBonfire = function (req, res, next) { req.user.uncompletedChallenges.splice(index, 1); } pairedWith = pairedWith.pop(); + if (pairedWith) { - index = pairedWith.uncompletedChallenges.indexOf(challengeId); - if (index > -1) { - pairedWith.progressTimestamps.push(Date.now() || 0); - pairedWith.uncompletedChallenges.splice(index, 1); + index = pairedWith.uncompletedChallenges.indexOf(challengeId); + if (index > -1) { + pairedWith.progressTimestamps.push(Date.now() || 0); + pairedWith.uncompletedChallenges.splice(index, 1); + } + + pairedWith.completedChallenges.push({ + _id: challengeId, + name: challengeName, + completedWith: req.user._id, + completedDate: isCompletedDate, + solution: isSolution, + challengeType: 5 + }); + + req.user.completedChallenges.push({ + _id: challengeId, + name: challengeName, + completedWith: pairedWith._id, + completedDate: isCompletedDate, + solution: isSolution, + challengeType: 5 + }); } + // User said they paired, but pair wasn't found + req.user.completedChallenges.push({ + _id: challengeId, + name: challengeName, + completedWith: null, + completedDate: isCompletedDate, + solution: isSolution, + challengeType: 5 + }); - pairedWith.completedChallenges.push({ - _id: challengeId, - name: challengeName, - completedWith: req.user._id, - completedDate: isCompletedDate, - solution: isSolution, - challengeType: 5 - }); - - req.user.completedChallenges.push({ - _id: challengeId, - name: challengeName, - completedWith: pairedWith._id, - completedDate: isCompletedDate, - solution: isSolution, - challengeType: 5 - }); req.user.save(function (err, user) { if (err) { return next(err); } - pairedWith.save(function (err, paired) { - if (err) { - return next(err); - } - if (user && paired) { + if (pairedWith) { + pairedWith.save(function (err, paired) { + if (err) { + return next(err); + } + if (user && paired) { + res.send(true); + } + }); + } else { + if (user) { res.send(true); } - }); + } }); } }); diff --git a/public/js/lib/coursewares/coursewaresJSFramework_0.0.2.js b/public/js/lib/coursewares/coursewaresJSFramework_0.0.2.js index 01f09d8f19..3abe01c1dc 100644 --- a/public/js/lib/coursewares/coursewaresJSFramework_0.0.2.js +++ b/public/js/lib/coursewares/coursewaresJSFramework_0.0.2.js @@ -239,10 +239,28 @@ var runTests = function(err, data) { function showCompletion() { var time = Math.floor(Date.now()) - started; ga('send', 'event', 'Challenge', 'solved', challenge_Name + ', Time: ' + time +', Attempts: ' + attempts); - $('#complete-courseware-dialog').modal('show'); - $('#complete-courseware-dialog').keydown(function(e) { - if (e.ctrlKey && e.keyCode == 13) { - $('#next-courseware-button').click(); + var bonfireSolution = myCodeMirror.getValue(); + var didCompleteWith = $('#completed-with').val() || null; + $.post( + '/completed-bonfire/', + { + challengeInfo: { + challengeId: challenge_Id, + challengeName: challenge_Name, + completedWith: didCompleteWith, + challengeType: challengeType, + solution: bonfireSolution + } + }, function(res) { + if (res) { + $('#complete-courseware-dialog').modal('show'); + $('#complete-courseware-dialog').keydown(function (e) { + if (e.ctrlKey && e.keyCode == 13) { + $('#next-courseware-button').click(); + } + }); + } } - }); + ); + } diff --git a/public/js/main.js b/public/js/main.js index ef692b4d42..ed6c881f99 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -215,29 +215,10 @@ $(document).ready(function() { }); break; case challengeTypes.BONFIRE: - var bonfireSolution = myCodeMirror.getValue(); - var didCompleteWith = $('#completed-with').val() || null; - $.post( - '/completed-bonfire/', - { - challengeInfo: { - challengeId: challenge_Id, - challengeName: challenge_Name, - completedWith: didCompleteWith, - challengeType: challengeType, - solution: bonfireSolution - } - }, - function(res) { - if (res) { - window.location.href = '/challenges/next-challenge'; - } - } - ); + window.location.href = '/challenges/next-challenge'; default: break; } - } }); diff --git a/views/coursewares/showBonfire.jade b/views/coursewares/showBonfire.jade index e68b9d4115..00787fee1d 100644 --- a/views/coursewares/showBonfire.jade +++ b/views/coursewares/showBonfire.jade @@ -16,7 +16,7 @@ block content script(type='text/javascript', src='/js/lib/jailed/jailed.js') script(type='text/javascript', src='/js/lib/coursewares/sandbox.js') - .row + .row(ng-controller="pairedWithController") .col-xs-12.col-sm-12.col-md-4.bonfire-top #testCreatePanel h1#bonfire-name.text-center= name @@ -79,6 +79,18 @@ block content span.ion-arrow-up-b | Less information + if (user) + form.form-horizontal(novalidate='novalidate', name='completedWithForm') + .form-group.text-center + .col-xs-10.col-xs-offset-1.col-sm-8.col-sm-offset-2.col-md-8.col-md-offset-2.animated.fadeIn + // extra field to distract password tools like lastpass from injecting css into our username field + input.form-control(ng-show="false") + label(for="existingUser") If you're pairing with someone, enter their FreeCodeCamp username here + input.form-control#completed-with(name="existingUser", placeholder="Pair Username", existing-username='', ng-model="existingUser", autofocus) + .col-xs-10.col-xs-offset-1.col-sm-8.col-sm-offset-2.col-md-8.col-md-offset-2(ng-cloak, ng-show="completedWithForm.$error.exists && !completedWithForm.existingUser.$pristine && existingUser.length > 0") + alert(type='danger') + span.ion-close-circled + | Username not found #submitButton.btn.btn-primary.btn-big.btn-block Run code (ctrl + enter) .button-spacer .btn-group.input-group.btn-group-justified @@ -122,23 +134,13 @@ block content .modal-content .modal-header.challenge-list-header= compliment a.close.closing-x(href='#', data-dismiss='modal', aria-hidden='true') × - .modal-body(ng-controller="pairedWithController") + .modal-body .text-center .animated.zoomInDown.delay-half span.completion-icon.ion-checkmark-circled.text-primary - if (user) - form.form-horizontal(novalidate='novalidate', name='completedWithForm') - .form-group.text-center - .col-xs-10.col-xs-offset-1.col-sm-8.col-sm-offset-2.col-md-8.col-md-offset-2.animated.fadeIn - // extra field to distract password tools like lastpass from injecting css into our username field - input.form-control(ng-show="false") - input.form-control#completed-with(name="existingUser", placeholder="If you paired, enter your pair's username here", existing-username='', ng-model="existingUser", autofocus) - .col-xs-10.col-xs-offset-1.col-sm-8.col-sm-offset-2.col-md-8.col-md-offset-2(ng-cloak, ng-show="completedWithForm.$error.exists && !completedWithForm.existingUser.$pristine && existingUser.length > 0") - alert(type='danger') - span.ion-close-circled - | Username not found - a.animated.fadeIn.btn.btn-lg.btn-primary.btn-block#next-courseware-button(name='_csrf', value=_csrf, ng-disabled='completedWithForm.$invalid && existingUser.length > 0') Go to my next bonfire (ctrl + enter) + a.animated.fadeIn.btn.btn-lg.btn-primary.btn-block#next-courseware-button(name='_csrf', value=_csrf) Go to my next challenge (ctrl + enter) - if (user.progressTimestamps.length > 2)