Merge branch 'staging' of github.com:FreeCodeCamp/freecodecamp into staging
This commit is contained in:
@ -69,7 +69,7 @@
|
|||||||
"lodash": "^3.9.3",
|
"lodash": "^3.9.3",
|
||||||
"loopback": "https://github.com/FreeCodeCamp/loopback.git#fix/no-password",
|
"loopback": "https://github.com/FreeCodeCamp/loopback.git#fix/no-password",
|
||||||
"loopback-boot": "^2.8.0",
|
"loopback-boot": "^2.8.0",
|
||||||
"loopback-component-passport": "^1.5.0",
|
"loopback-component-passport": "https://github.com/FreeCodeCamp/loopback-component-passport.git#feature/flashfailure",
|
||||||
"loopback-connector-mongodb": "^1.10.0",
|
"loopback-connector-mongodb": "^1.10.0",
|
||||||
"lusca": "~1.0.2",
|
"lusca": "~1.0.2",
|
||||||
"method-override": "~2.3.0",
|
"method-override": "~2.3.0",
|
||||||
|
@ -388,3 +388,7 @@ var resetEditor = function resetEditor() {
|
|||||||
editor.setValue(allSeeds);
|
editor.setValue(allSeeds);
|
||||||
codeStorage.updateStorage();
|
codeStorage.updateStorage();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
$(document).ready(function(){
|
||||||
|
bonfireExecute();
|
||||||
|
});
|
||||||
|
@ -22,67 +22,6 @@ $(document).ready(function() {
|
|||||||
|
|
||||||
setCSRFToken($('meta[name="csrf-token"]').attr('content'));
|
setCSRFToken($('meta[name="csrf-token"]').attr('content'));
|
||||||
|
|
||||||
$('#i-want-help').on('click', function() {
|
|
||||||
$('#help-modal').modal('hide');
|
|
||||||
var editorValue = editor.getValue();
|
|
||||||
var currentLocation = window.location.href;
|
|
||||||
$.post(
|
|
||||||
'/get-help',
|
|
||||||
{
|
|
||||||
payload: {
|
|
||||||
code: editorValue,
|
|
||||||
challenge: currentLocation
|
|
||||||
}
|
|
||||||
},
|
|
||||||
function(res) {
|
|
||||||
if (res) {
|
|
||||||
window.open('https://gitter.im/FreeCodeCamp/Help', '_blank')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
$('#i-want-help-editorless').on('click', function() {
|
|
||||||
$('#help-editorless-modal').modal('hide');
|
|
||||||
var currentLocation = window.location.href;
|
|
||||||
$.post(
|
|
||||||
'/get-help',
|
|
||||||
{
|
|
||||||
payload: {
|
|
||||||
challenge: currentLocation
|
|
||||||
}
|
|
||||||
},
|
|
||||||
function(res) {
|
|
||||||
if (res) {
|
|
||||||
window.open('https://gitter.im/FreeCodeCamp/Help', '_blank')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
$('#report-issue').on('click', function() {
|
|
||||||
$('#issue-modal').modal('hide');
|
|
||||||
window.open('https://github.com/freecodecamp/freecodecamp/issues/new?&body=Challenge '+ window.location.href +' has an issue. Please describe how to reproduce it, and include links to screenshots if possible.', '_blank')
|
|
||||||
});
|
|
||||||
|
|
||||||
$('#i-want-to-pair').on('click', function() {
|
|
||||||
$('#pair-modal').modal('hide');
|
|
||||||
var currentLocation = window.location.href;
|
|
||||||
$.post(
|
|
||||||
'/get-pair',
|
|
||||||
{
|
|
||||||
payload: {
|
|
||||||
challenge: currentLocation
|
|
||||||
}
|
|
||||||
},
|
|
||||||
function(res) {
|
|
||||||
if (res) {
|
|
||||||
window.open('https://gitter.im/FreeCodeCamp/LetsPair', '_blank')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
$('.checklist-element').each(function() {
|
$('.checklist-element').each(function() {
|
||||||
var checklistElementId = $(this).attr('id');
|
var checklistElementId = $(this).attr('id');
|
||||||
if(!!localStorage[checklistElementId]) {
|
if(!!localStorage[checklistElementId]) {
|
||||||
@ -118,41 +57,126 @@ $(document).ready(function() {
|
|||||||
$(this).unbind("error").attr("src", "https://s3.amazonaws.com/freecodecamp/camper-image-placeholder.png");
|
$(this).unbind("error").attr("src", "https://s3.amazonaws.com/freecodecamp/camper-image-placeholder.png");
|
||||||
});
|
});
|
||||||
|
|
||||||
$('#completed-courseware').on('click', function() {
|
function reBindModals(){
|
||||||
$('#complete-courseware-dialog').modal('show');
|
|
||||||
});
|
|
||||||
|
|
||||||
$('#completed-courseware-editorless').on('click', function() {
|
$('#i-want-help').unbind('click');
|
||||||
$('#complete-courseware-editorless-dialog').modal('show');
|
$('#i-want-help').on('click', function() {
|
||||||
});
|
$('#help-modal').modal('hide');
|
||||||
|
var editorValue = editor.getValue();
|
||||||
|
var currentLocation = window.location.href;
|
||||||
|
$.post(
|
||||||
|
'/get-help',
|
||||||
|
{
|
||||||
|
payload: {
|
||||||
|
code: editorValue,
|
||||||
|
challenge: currentLocation
|
||||||
|
}
|
||||||
|
},
|
||||||
|
function(res) {
|
||||||
|
if (res) {
|
||||||
|
window.open('https://gitter.im/FreeCodeCamp/Help', '_blank')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
$('#trigger-pair-modal').on('click', function() {
|
$('#i-want-help-editorless').unbind('click');
|
||||||
$('#pair-modal').modal('show');
|
$('#i-want-help-editorless').on('click', function() {
|
||||||
});
|
$('#help-editorless-modal').modal('hide');
|
||||||
|
var currentLocation = window.location.href;
|
||||||
|
$.post(
|
||||||
|
'/get-help',
|
||||||
|
{
|
||||||
|
payload: {
|
||||||
|
challenge: currentLocation
|
||||||
|
}
|
||||||
|
},
|
||||||
|
function(res) {
|
||||||
|
if (res) {
|
||||||
|
window.open('https://gitter.im/FreeCodeCamp/Help', '_blank')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
$('#trigger-reset-modal').on('click', function() {
|
$('#report-issue').unbind('click');
|
||||||
$('#reset-modal').modal('show');
|
$('#report-issue').on('click', function() {
|
||||||
});
|
$('#issue-modal').modal('hide');
|
||||||
|
window.open('https://github.com/freecodecamp/freecodecamp/issues/new?&body=Challenge '+ window.location.href +' has an issue. Please describe how to reproduce it, and include links to screenshots if possible.', '_blank')
|
||||||
|
});
|
||||||
|
|
||||||
$('#trigger-help-modal').on('click', function() {
|
$('#i-want-help').unbind('click');
|
||||||
$('#help-modal').modal('show');
|
$('#i-want-to-pair').on('click', function() {
|
||||||
});
|
$('#pair-modal').modal('hide');
|
||||||
|
var currentLocation = window.location.href;
|
||||||
|
$.post(
|
||||||
|
'/get-pair',
|
||||||
|
{
|
||||||
|
payload: {
|
||||||
|
challenge: currentLocation
|
||||||
|
}
|
||||||
|
},
|
||||||
|
function(res) {
|
||||||
|
if (res) {
|
||||||
|
window.open('https://gitter.im/FreeCodeCamp/LetsPair', '_blank')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
$('#trigger-issue-modal').on('click', function() {
|
$('#completed-courseware').unbind('click');
|
||||||
$('#issue-modal').modal('show');
|
$('#completed-courseware').on('click', function() {
|
||||||
});
|
$('#complete-courseware-dialog').modal('show');
|
||||||
|
});
|
||||||
|
|
||||||
$('#completed-zipline-or-basejump').on('click', function() {
|
$('#completed-courseware-editorless').unbind('click');
|
||||||
$('#complete-zipline-or-basejump-dialog').modal('show');
|
$('#completed-courseware-editorless').on('click', function() {
|
||||||
});
|
$('#complete-courseware-editorless-dialog').modal('show');
|
||||||
|
});
|
||||||
|
|
||||||
$('#complete-courseware-dialog').on('hidden.bs.modal', function() {
|
$('#trigger-pair-modal').unbind('click');
|
||||||
editor.focus();
|
$('#trigger-pair-modal').on('click', function() {
|
||||||
});
|
$('#pair-modal').modal('show');
|
||||||
|
});
|
||||||
|
|
||||||
$('#complete-challenge-dialog').on('hidden.bs.modal', function() {
|
$('#trigger-reset-modal').unbind('click');
|
||||||
editor.focus();
|
$('#trigger-reset-modal').on('click', function() {
|
||||||
});
|
$('#reset-modal').modal('show');
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#trigger-help-modal').unbind('click');
|
||||||
|
$('#trigger-help-modal').on('click', function() {
|
||||||
|
$('#help-modal').modal('show');
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#trigger-issue-modal').unbind('click');
|
||||||
|
$('#trigger-issue-modal').on('click', function() {
|
||||||
|
$('#issue-modal').modal('show');
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#completed-zipline-or-basejump').unbind('click');
|
||||||
|
$('#completed-zipline-or-basejump').on('click', function() {
|
||||||
|
$('#complete-zipline-or-basejump-dialog').modal('show');
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#completed-courseware-dialog').unbind('click');
|
||||||
|
$('#complete-courseware-dialog').on('hidden.bs.modal', function() {
|
||||||
|
editor.focus();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#completed-zipline-or-basejump').unbind('click');
|
||||||
|
$('#complete-zipline-or-basejump').on('hidden.bs.modal', function() {
|
||||||
|
editor.focus();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$(window).resize(function(){
|
||||||
|
reBindModals();
|
||||||
|
});
|
||||||
|
|
||||||
|
reBindModals();
|
||||||
|
|
||||||
var challengeTypes = {
|
var challengeTypes = {
|
||||||
'HTML_CSS_JQ': '0',
|
'HTML_CSS_JQ': '0',
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
|
import{ Observable } from 'rx';
|
||||||
import { observeMethod, observeQuery } from '../utils/rx';
|
import { observeMethod, observeQuery } from '../utils/rx';
|
||||||
import { getSocialProvider } from '../utils/auth';
|
import { getSocialProvider } from '../utils/auth';
|
||||||
|
import debugFactory from 'debug';
|
||||||
|
|
||||||
|
const debug = debugFactory('fcc:userIdent');
|
||||||
|
|
||||||
export default function({ models }) {
|
export default function({ models }) {
|
||||||
const { User, UserIdentity, UserCredential } = models;
|
const { User, UserIdentity, UserCredential } = models;
|
||||||
@ -20,15 +24,18 @@ export default function({ models }) {
|
|||||||
options = {};
|
options = {};
|
||||||
}
|
}
|
||||||
const user$ = findUserById(userId);
|
const user$ = findUserById(userId);
|
||||||
console.log('provider', provider);
|
const query = {
|
||||||
console.log('id', profile.id);
|
where: {
|
||||||
findIdent({
|
provider: getSocialProvider(provider),
|
||||||
provider: getSocialProvider(provider),
|
externalId: profile.id
|
||||||
externalId: profile.id
|
}
|
||||||
})
|
};
|
||||||
|
|
||||||
|
debug('link identity query', query);
|
||||||
|
findIdent(query)
|
||||||
.flatMap(identity => {
|
.flatMap(identity => {
|
||||||
const modified = new Date();
|
const modified = new Date();
|
||||||
if (!identity || identity.externalId !== profile.id) {
|
if (!identity) {
|
||||||
return observeQuery(UserIdentity, 'create', {
|
return observeQuery(UserIdentity, 'create', {
|
||||||
provider: getSocialProvider(provider),
|
provider: getSocialProvider(provider),
|
||||||
externalId: profile.id,
|
externalId: profile.id,
|
||||||
@ -40,6 +47,11 @@ export default function({ models }) {
|
|||||||
modified
|
modified
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
if (identity.userId !== userId) {
|
||||||
|
return Observable.throw(
|
||||||
|
new Error('An account is already linked to that profile')
|
||||||
|
);
|
||||||
|
}
|
||||||
identity.credentials = credentials;
|
identity.credentials = credentials;
|
||||||
return observeQuery(identity, 'updateAttributes', {
|
return observeQuery(identity, 'updateAttributes', {
|
||||||
profile: getSocialProvider(provider),
|
profile: getSocialProvider(provider),
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
var successRedirect = '/';
|
var successRedirect = '/';
|
||||||
var failureRedirect = '/login';
|
var failureRedirect = '/login';
|
||||||
|
var linkFailureRedirect = '/account';
|
||||||
module.exports = {
|
module.exports = {
|
||||||
local: {
|
local: {
|
||||||
provider: 'local',
|
provider: 'local',
|
||||||
@ -34,7 +35,7 @@ module.exports = {
|
|||||||
callbackURL: '/link/facebook/callback',
|
callbackURL: '/link/facebook/callback',
|
||||||
callbackPath: '/link/facebook/callback',
|
callbackPath: '/link/facebook/callback',
|
||||||
successRedirect: successRedirect,
|
successRedirect: successRedirect,
|
||||||
failureRedirect: failureRedirect,
|
failureRedirect: linkFailureRedirect,
|
||||||
scope: ['email', 'user_likes'],
|
scope: ['email', 'user_likes'],
|
||||||
link: true,
|
link: true,
|
||||||
failureFlash: true
|
failureFlash: true
|
||||||
@ -63,7 +64,7 @@ module.exports = {
|
|||||||
callbackURL: '/link/google/callback',
|
callbackURL: '/link/google/callback',
|
||||||
callbackPath: '/link/google/callback',
|
callbackPath: '/link/google/callback',
|
||||||
successRedirect: successRedirect,
|
successRedirect: successRedirect,
|
||||||
failureRedirect: failureRedirect,
|
failureRedirect: linkFailureRedirect,
|
||||||
scope: ['email', 'profile'],
|
scope: ['email', 'profile'],
|
||||||
link: true,
|
link: true,
|
||||||
failureFlash: true
|
failureFlash: true
|
||||||
@ -89,7 +90,7 @@ module.exports = {
|
|||||||
callbackURL: '/link/twitter/callback',
|
callbackURL: '/link/twitter/callback',
|
||||||
callbackPath: '/link/twitter/callback',
|
callbackPath: '/link/twitter/callback',
|
||||||
successRedirect: successRedirect,
|
successRedirect: successRedirect,
|
||||||
failureRedirect: failureRedirect,
|
failureRedirect: linkFailureRedirect,
|
||||||
consumerKey: process.env.TWITTER_KEY,
|
consumerKey: process.env.TWITTER_KEY,
|
||||||
consumerSecret: process.env.TWITTER_SECRET,
|
consumerSecret: process.env.TWITTER_SECRET,
|
||||||
link: true,
|
link: true,
|
||||||
@ -120,7 +121,7 @@ module.exports = {
|
|||||||
callbackURL: '/link/linkedin/callback',
|
callbackURL: '/link/linkedin/callback',
|
||||||
callbackPath: '/link/linkedin/callback',
|
callbackPath: '/link/linkedin/callback',
|
||||||
successRedirect: successRedirect,
|
successRedirect: successRedirect,
|
||||||
failureRedirect: failureRedirect,
|
failureRedirect: linkFailureRedirect,
|
||||||
clientID: process.env.LINKEDIN_ID,
|
clientID: process.env.LINKEDIN_ID,
|
||||||
clientSecret: process.env.LINKEDIN_SECRET,
|
clientSecret: process.env.LINKEDIN_SECRET,
|
||||||
scope: ['r_basicprofile', 'r_emailaddress'],
|
scope: ['r_basicprofile', 'r_emailaddress'],
|
||||||
@ -152,7 +153,7 @@ module.exports = {
|
|||||||
callbackURL: '/auth/github/callback/link',
|
callbackURL: '/auth/github/callback/link',
|
||||||
callbackPath: '/auth/github/callback/link',
|
callbackPath: '/auth/github/callback/link',
|
||||||
successRedirect: successRedirect,
|
successRedirect: successRedirect,
|
||||||
failureRedirect: failureRedirect,
|
failureRedirect: linkFailureRedirect,
|
||||||
clientID: process.env.GITHUB_ID,
|
clientID: process.env.GITHUB_ID,
|
||||||
clientSecret: process.env.GITHUB_SECRET,
|
clientSecret: process.env.GITHUB_SECRET,
|
||||||
scope: ['email'],
|
scope: ['email'],
|
||||||
|
@ -34,7 +34,7 @@
|
|||||||
| .
|
| .
|
||||||
h3 If you've already read the errors and searched Google, you should ask for help.
|
h3 If you've already read the errors and searched Google, you should ask for help.
|
||||||
h3 This will take you to our help room.
|
h3 This will take you to our help room.
|
||||||
a.btn.btn-lg.btn-primary.btn-block(href='https://gitter.im/FreeCodeCamp/LetsPair', data-dismiss='modal', aria-hidden='true' target='_blank') Take me to the help room
|
a.btn.btn-lg.btn-primary.btn-block(href='https://gitter.im/FreeCodeCamp/help', data-dismiss='modal', aria-hidden='true' target='_blank') Take me to the help room
|
||||||
a.btn.btn-lg.btn-info.btn-block(href='#', data-dismiss='modal', aria-hidden='true') Cancel
|
a.btn.btn-lg.btn-info.btn-block(href='#', data-dismiss='modal', aria-hidden='true') Cancel
|
||||||
|
|
||||||
#reset-modal.modal(tabindex='-1')
|
#reset-modal.modal(tabindex='-1')
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
.row
|
.row
|
||||||
.col-xs-12
|
.col-xs-12
|
||||||
if messages.errors
|
if (messages.errors || messages.error)
|
||||||
.alert.alert-danger.fade.in
|
.alert.alert-danger.fade.in
|
||||||
button.close(type='button', data-dismiss='alert')
|
button.close(type='button', data-dismiss='alert')
|
||||||
span.ion-close-circled
|
span.ion-close-circled
|
||||||
for error in messages.errors
|
for error in (messages.errors || messages.error)
|
||||||
div!= error.msg
|
div!= error.msg || error
|
||||||
if messages.info
|
if messages.info
|
||||||
.alert.alert-info.fade.in
|
.alert.alert-info.fade.in
|
||||||
button.close(type='button', data-dismiss='alert')
|
button.close(type='button', data-dismiss='alert')
|
||||||
|
Reference in New Issue
Block a user