diff --git a/controllers/user.js b/controllers/user.js index b53ea15d37c..a69c7b64e0b 100644 --- a/controllers/user.js +++ b/controllers/user.js @@ -186,8 +186,9 @@ exports.returnUser = function(req, res, next) { coderbyteProfile: user.profile.linkedinProfile, githubProfile: user.profile.githubProfile, linkedinProfile: user.profile.linkedinProfile, - codepenProfile: user.codepenProfile, - twitterHandle: user.twitterHandle, + codepenProfile: user.profile.codepenProfile, + twitterHandle: user.profile.twitterHandle, + bio: user.profile.bio, website1: user.portfolio.website1Link, website1Title: user.portfolio.website1Title, website1Image: user.portfolio.website1Image, @@ -281,6 +282,7 @@ exports.postUpdateProfile = function(req, res, next) { user.profile.linkedinProfile = req.body.linkedinProfile || ''; user.profile.codepenProfile = req.body.codepenProfile || ''; user.profile.twitterHandle = req.body.twitterHandle || ''; + user.profile.bio = req.body.bio || ''; user.portfolio.website1Title = req.body.website1Title || ''; user.portfolio.website1Link = req.body.website1Link || ''; user.portfolio.website1Image = req.body.website1Image || ''; diff --git a/models/User.js b/models/User.js index f1dff68894f..c09199f6b5f 100644 --- a/models/User.js +++ b/models/User.js @@ -271,6 +271,10 @@ var userSchema = new mongoose.Schema({ lowercase: true, trim: true }, + bio: { + type: String, + defaults: '' + }, name: { type: String, default: '' diff --git a/public/css/main.less b/public/css/main.less index bbf2a1d26da..b07a2055294 100644 --- a/public/css/main.less +++ b/public/css/main.less @@ -386,9 +386,21 @@ thead { font-size: 40px; } +.public-profile-img { + height: 200px; + width: 200px; +} + .ng-invalid.ng-dirty { border-color: #FA787E; } .ng-valid.ng-dirty { border-color: #78FA89; +} + +.desktop-narrow { + @media (min-width: 767px) { + marign: 0 auto; + width: 80%; + } } \ No newline at end of file diff --git a/views/account/login.jade b/views/account/login.jade index 04983d112b4..d892867042c 100644 --- a/views/account/login.jade +++ b/views/account/login.jade @@ -2,19 +2,19 @@ extends ../layout block content .jumbotron.text-center h2 Sign in with one of these options: - a.btn.btn-lg.btn-block.btn-google-plus.btn-social(href='/auth/google') + a.btn.btn-lg.btn-block.btn-google-plus.btn-social-login(href='/auth/google') i.fa.fa-google-plus | Sign in with Google - a.btn.btn-lg.btn-block.btn-facebook.btn-social(href='/auth/facebook') + a.btn.btn-lg.btn-block.btn-facebook.btn-social-login(href='/auth/facebook') i.fa.fa-facebook | Sign in with Facebook - //a.btn.btn-lg.btn-block.btn-github.btn-social(href='/auth/github') + //a.btn.btn-lg.btn-block.btn-github.btn-social-login(href='/auth/github') // i.fa.fa-github // | Sign in with GitHub - a.btn.btn-lg.btn-block.btn-linkedin.btn-social(href='/auth/linkedin') + a.btn.btn-lg.btn-block.btn-linkedin.btn-social-login(href='/auth/linkedin') i.fa.fa-linkedin | Sign in with LinkedIn - a.btn.btn-lg.btn-block.btn-twitter.btn-social(href='/auth/twitter') + a.btn.btn-lg.btn-block.btn-twitter.btn-social-login(href='/auth/twitter') i.fa.fa-twitter | Sign in with Twitter br diff --git a/views/account/profile.jade b/views/account/profile.jade index 7e1047cf75d..0fb61c6926d 100644 --- a/views/account/profile.jade +++ b/views/account/profile.jade @@ -1,198 +1,207 @@ extends ../layout block content - link(href="//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css", rel="stylesheet") - .panel(ng-controller="profileValidationController") - .container.text-center - h1 Update your profile here: - form.form-horizontal(action='/account/profile', method='POST', novalidate='novalidate', name='profileForm') - input(type='hidden', name='_csrf', value=_csrf) + .panel.panel-primary(ng-controller="profileValidationController") + .panel-heading.text-center Update your profile here: + .panel-body + .container.text-center + form.form-horizontal(action='/account/profile', method='POST', novalidate='novalidate', name='profileForm') + input(type='hidden', name='_csrf', value=_csrf) - .col-sm-4.col-sm-offset-5 - h2 Bio + .col-sm-4.col-sm-offset-5 + h2 Bio - .form-group - label.col-sm-3.col-sm-offset-2.control-label(for='name') Name - .col-sm-4 - input.form-control(type='text', placeholder='Name', name='name', ng-model='user.profile.name', ng-minlength='3', ng-maxlength='50', required='required', ng-focus='ng-focus', id='name') - .col-sm-4.col-sm-offset-5(ng-show="profileForm.name.$invalid && !profileForm.name.$pristine && profileForm.name.$error.required") - alert(type='danger') - span.ion-close-circled - | Your name is required. - .col-sm-4.col-sm-offset-5(ng-show='profileForm.name.$error.minlength && !profileForm.name.$pristine') - alert(type='danger') - span.ion-close-circled - | Your name must be at least 3 characters. - .col-sm-4.col-sm-offset-5(ng-show='profileForm.name.$error.maxlength && !profileForm.name.$pristine') - alert(type='danger') - span.ion-close-circled - | Your name must be fewer than 50 characters. + .form-group + label.col-sm-3.col-sm-offset-2.control-label(for='name') Name * + .col-sm-4 + input.form-control(type='text', placeholder='Name', name='name', ng-model='user.profile.name', ng-minlength='3', ng-maxlength='50', required='required', id='name') + .col-sm-4.col-sm-offset-5(ng-show="profileForm.name.$invalid && !profileForm.name.$pristine && profileForm.name.$error.required") + alert(type='danger') + span.ion-close-circled + | Your name is required. + .col-sm-4.col-sm-offset-5(ng-show='profileForm.name.$error.minlength && !profileForm.name.$pristine') + alert(type='danger') + span.ion-close-circled + | Your name must be at least 3 characters. + .col-sm-4.col-sm-offset-5(ng-show='profileForm.name.$error.maxlength && !profileForm.name.$pristine') + alert(type='danger') + span.ion-close-circled + | Your name must be fewer than 50 characters. - .form-group - label.col-sm-3.col-sm-offset-2.control-label(for='username') Username (path to public profile) * - .col-sm-4 - input.form-control(type='text', placeholder='username' name='username', id='username', ng-model='user.profile.username', required='required', ng-minlength='5', ng-maxlength='20') - .col-sm-4.col-sm-offset-5(ng-show="profileForm.username.$error.required && !profileForm.username.$pristine") - alert(type='danger') - span.ion-close-circled - | Please enter a username. - .col-sm-4.col-sm-offset-5(ng-show="profileForm.username.$error.minlength && !profileForm.username.$pristine") - alert(type='danger') - span.ion-close-circled - | Your username must be at least 5 characters. - .col-sm-4.col-sm-offset-5(ng-show="profileForm.username.$error.maxlength && !profileForm.username.$pristine") - alert(type='danger') - span.ion-close-circled - | Your username must be fewer than 15 characters. + .form-group + label.col-sm-3.col-sm-offset-2.control-label(for='username') Username (path to public profile) * + .col-sm-4 + input.form-control(type='text', placeholder='username' name='username', id='username', ng-model='user.profile.username', required='required', ng-minlength='5', ng-maxlength='20') + .col-sm-4.col-sm-offset-5(ng-show="profileForm.username.$error.required && !profileForm.username.$pristine") + alert(type='danger') + span.ion-close-circled + | Please enter a username. + .col-sm-4.col-sm-offset-5(ng-show="profileForm.username.$error.minlength && !profileForm.username.$pristine") + alert(type='danger') + span.ion-close-circled + | Your username must be at least 5 characters. + .col-sm-4.col-sm-offset-5(ng-show="profileForm.username.$error.maxlength && !profileForm.username.$pristine") + alert(type='danger') + span.ion-close-circled + | Your username must be fewer than 15 characters. - .form-group - label.col-sm-3.col-sm-offset-2.control-label(for='email') Email * - .col-sm-4 - input.form-control(type='email', name='email', id='email', ng-model='user.email', required='required') - .col-sm-4.col-sm-offset-5(ng-show="profileForm.email.$error.required && !profileForm.email.$pristine") - alert(type='danger') - span.ion-close-circled - | An email address is required. - .col-sm-4.col-sm-offset-5(ng-show="profileForm.$error.email && !profileForm.email.$pristine") - alert(type='danger') - span.ion-close-circled - | Please enter a valid email format. + .form-group + label.col-sm-3.col-sm-offset-2.control-label(for='email') Email * + .col-sm-4 + input.form-control(type='email', name='email', id='email', ng-model='user.email', required='required') + .col-sm-4.col-sm-offset-5(ng-show="profileForm.email.$error.required && !profileForm.email.$pristine") + alert(type='danger') + span.ion-close-circled + | An email address is required. + .col-sm-4.col-sm-offset-5(ng-show="profileForm.$error.email && !profileForm.email.$pristine") + alert(type='danger') + span.ion-close-circled + | Please enter a valid email format. - .form-group - label.col-sm-3.col-sm-offset-2.control-label(for='location') Location - .col-sm-4 - input.form-control(type='text', name='location', id='location', ng-model='user.profile.location') + .form-group + label.col-sm-3.col-sm-offset-2.control-label(for='location') Location + .col-sm-4 + input.form-control(type='text', name='location', id='location', ng-model='user.profile.location') - .form-group - .col-sm-offset-5.col-sm-4 - button.btn.btn-primary.btn-block(type='submit', ng-disabled='profileForm.$invalid') - span.ion-edit - | Update my Bio + .form-group + label.col-sm-3.col-sm-offset-2.control-label(for='bio') Bio (140 characters) + .col-sm-4 + input.form-control(type='text', name='bio', ng-model='user.profile.bio', ng-maxlength='140', id='bio') + .col-sm-4.col-sm-offset-5(ng-show='profileForm.bio.$error.maxlength && !profileForm.bio.$pristine') + alert(type='danger') + span.ion-close-circled + | Your bio must be fewer than 140 characters. - .col-sm-4.col-sm-offset-5 - h2 Social + .form-group + .col-sm-offset-5.col-sm-4 + button.btn.btn-primary.btn-block(type='submit', ng-disabled='profileForm.$invalid') + span.ion-edit + | Update my Bio - .form-group - label.col-sm-3.col-sm-offset-2.control-label(for='email') Twitter Handle - .col-sm-4 - .input-group.twitter-input - span.input-group-addon @ - input.form-control(type='text', name='twitterHandle', id='twitterHandle', ng-model='user.profile.twitterHandle', ng-maxlength='15', ng-pattern="/^[A-z0-9_]+$/") - .col-sm-4.col-sm-offset-5(ng-show="profileForm.twitterHandle.$error.pattern") - alert(type='danger') - span.ion-close-circled - | Your Twitter handle should only contain letters, numbers and underscores (@az10_). - .col-sm-4.col-sm-offset-5(ng-show='profileForm.twitterHandle.$error.maxlength && !profileForm.twitterHandle.$pristine') - alert(type='danger') - span.ion-close-circled - | Your name must be fewer than 15 characters. - .form-group - label.col-sm-3.col-sm-offset-2.control-label(for='email') Github Profile Link - .col-sm-4 - input.form-control(type='url', name='githubProfile', id='githubProfile', ng-model='user.profile.githubProfile', placeholder='http://') - .col-sm-4.col-sm-offset-5(ng-show="profileForm.githubProfile.$error.url && !profileForm.githubProfile.$pristine") - alert(type='danger') - span.ion-close-circled - | Please enter a valid URL format (http://www.example.com). + .col-sm-4.col-sm-offset-5 + h2 Social - .form-group - label.col-sm-3.col-sm-offset-2.control-label(for='email') CodePen Profile Link - .col-sm-4 - input.form-control(type='url', name='codepenProfile', id='codepenProfile', ng-model='user.profile.codepenProfile', placeholder='http://') - .col-sm-4.col-sm-offset-5(ng-show="profileForm.codepenProfile.$error.url && !profileForm.codepenProfile.$pristine") - alert(type='danger') - span.ion-close-circled - | Please enter a valid URL format (http://www.example.com). + .form-group + label.col-sm-3.col-sm-offset-2.control-label(for='email') Twitter Handle + .col-sm-4 + .input-group.twitter-input + span.input-group-addon @ + input.form-control(type='text', name='twitterHandle', id='twitterHandle', ng-model='user.profile.twitterHandle', ng-maxlength='15', ng-pattern="/^[A-z0-9_]+$/") + .col-sm-4.col-sm-offset-5(ng-show="profileForm.twitterHandle.$error.pattern") + alert(type='danger') + span.ion-close-circled + | Your Twitter handle should only contain letters, numbers and underscores (@az10_). + .col-sm-4.col-sm-offset-5(ng-show='profileForm.twitterHandle.$error.maxlength && !profileForm.twitterHandle.$pristine') + alert(type='danger') + span.ion-close-circled + | Your name must be fewer than 15 characters. + .form-group + label.col-sm-3.col-sm-offset-2.control-label(for='email') Github Profile Link + .col-sm-4 + input.form-control(type='url', name='githubProfile', id='githubProfile', ng-model='user.profile.githubProfile', placeholder='http://') + .col-sm-4.col-sm-offset-5(ng-show="profileForm.githubProfile.$error.url && !profileForm.githubProfile.$pristine") + alert(type='danger') + span.ion-close-circled + | Please enter a valid URL format (http://www.example.com). - .form-group - label.col-sm-3.col-sm-offset-2.control-label(for='email') CoderByte Profile Link - .col-sm-4 - input.form-control(type='url', name='coderbyteProfile', id='coderbyteProfile', ng-model='user.profile.coderbyteProfile', placeholder='http://') - .col-sm-4.col-sm-offset-5(ng-show="profileForm.coderbyteProfile.$error.url && !profileForm.coderbyteProfile.$pristine") - alert(type='danger') - span.ion-close-circled - | Please enter a valid URL format (http://www.example.com). + .form-group + label.col-sm-3.col-sm-offset-2.control-label(for='email') CodePen Profile Link + .col-sm-4 + input.form-control(type='url', name='codepenProfile', id='codepenProfile', ng-model='user.profile.codepenProfile', placeholder='http://') + .col-sm-4.col-sm-offset-5(ng-show="profileForm.codepenProfile.$error.url && !profileForm.codepenProfile.$pristine") + alert(type='danger') + span.ion-close-circled + | Please enter a valid URL format (http://www.example.com). - .form-group - label.col-sm-3.col-sm-offset-2.control-label(for='email') LinkedIn Profile Link - .col-sm-4 - input.form-control(type='url', name='linkedinProfile', id='linkedinProfile', ng-model='user.profile.linkedinProfile', placeholder='http://') - .col-sm-4.col-sm-offset-5(ng-show="profileForm.linkedinProfile.$error.url && !profileForm.linkedinProfile.$pristine") - alert(type='danger') - span.ion-close-circled - | Please enter a valid URL format (http://www.example.com). + .form-group + label.col-sm-3.col-sm-offset-2.control-label(for='email') CoderByte Profile Link + .col-sm-4 + input.form-control(type='url', name='coderbyteProfile', id='coderbyteProfile', ng-model='user.profile.coderbyteProfile', placeholder='http://') + .col-sm-4.col-sm-offset-5(ng-show="profileForm.coderbyteProfile.$error.url && !profileForm.coderbyteProfile.$pristine") + alert(type='danger') + span.ion-close-circled + | Please enter a valid URL format (http://www.example.com). - .form-group - .col-sm-offset-5.col-sm-4 - button.btn.btn-primary.btn-block(type='submit', ng-disabled='profileForm.$invalid') - span.ion-edit - | Update my Social Links + .form-group + label.col-sm-3.col-sm-offset-2.control-label(for='email') LinkedIn Profile Link + .col-sm-4 + input.form-control(type='url', name='linkedinProfile', id='linkedinProfile', ng-model='user.profile.linkedinProfile', placeholder='http://') + .col-sm-4.col-sm-offset-5(ng-show="profileForm.linkedinProfile.$error.url && !profileForm.linkedinProfile.$pristine") + alert(type='danger') + span.ion-close-circled + | Please enter a valid URL format (http://www.example.com). - .col-sm-4.col-sm-offset-5 - h2 Portfolio + .form-group + .col-sm-offset-5.col-sm-4 + button.btn.btn-primary.btn-block(type='submit', ng-disabled='profileForm.$invalid') + span.ion-edit + | Update my Social Links - .form-group - label.col-sm-3.col-sm-offset-2.control-label(for='website1Title') 1st Portfolio Website Title - .col-sm-4 - input.form-control(type='text', name='website1Title', id='website1Title', ng-model='user.portfolio.website1Title', ng-maxlength='140') - .col-sm-4.col-sm-offset-5(ng-show="profileForm.website1Title.$error.maxlength && !profileForm.website1Title.$pristine") - alert(type='danger') - span.ion-close-circled - | Portfolio project title must be fewer than 140 characters. + .col-sm-4.col-sm-offset-5 + h2 Portfolio - .form-group - label.col-sm-3.col-sm-offset-2.control-label(for='website1Link') 1st Portfolio Website Link - .col-sm-4 - input.form-control(type='text', name='website1Link', id='website1Link', ng-model='user.portfolio.website1Link', placeholder='http://') + .form-group + label.col-sm-3.col-sm-offset-2.control-label(for='website1Title') 1st Portfolio Website Title + .col-sm-4 + input.form-control(type='text', name='website1Title', id='website1Title', ng-model='user.portfolio.website1Title', ng-maxlength='140') + .col-sm-4.col-sm-offset-5(ng-show="profileForm.website1Title.$error.maxlength && !profileForm.website1Title.$pristine") + alert(type='danger') + span.ion-close-circled + | Portfolio project title must be fewer than 140 characters. - .form-group - label.col-sm-3.col-sm-offset-2.control-label(for='website1Image') 1st Portfolio Website Image Link - .col-sm-4 - input.form-control(type='text', name='website1Image', id='website1Image', ng-model='user.portfolio.website1Image', placeholder='http://') + .form-group + label.col-sm-3.col-sm-offset-2.control-label(for='website1Link') 1st Portfolio Website Link + .col-sm-4 + input.form-control(type='text', name='website1Link', id='website1Link', ng-model='user.portfolio.website1Link', placeholder='http://') - .form-group - label.col-sm-3.col-sm-offset-2.control-label(for='website2Title') 2nd Portfolio Website Title - .col-sm-4 - input.form-control(type='text', name='website2Title', id='website2Title', ng-model='user.portfolio.website2Title', ng-maxlength='140') - .col-sm-4.col-sm-offset-5(ng-show="profileForm.website2Title.$error.maxlength && !profileForm.website2Title.$pristine") - alert(type='danger') - span.ion-close-circled - | Portfolio project title must be fewer than 140 characters. + .form-group + label.col-sm-3.col-sm-offset-2.control-label(for='website1Image') 1st Portfolio Website Image Link + .col-sm-4 + input.form-control(type='text', name='website1Image', id='website1Image', ng-model='user.portfolio.website1Image', placeholder='http://') - .form-group - label.col-sm-3.col-sm-offset-2.control-label(for='website2Link') 2nd Portfolio Website Link - .col-sm-4 - input.form-control(type='text', name='website2Link', id='website2Link', ng-model='user.portfolio.website2Link', placeholder='http://') + .form-group + label.col-sm-3.col-sm-offset-2.control-label(for='website2Title') 2nd Portfolio Website Title + .col-sm-4 + input.form-control(type='text', name='website2Title', id='website2Title', ng-model='user.portfolio.website2Title', ng-maxlength='140') + .col-sm-4.col-sm-offset-5(ng-show="profileForm.website2Title.$error.maxlength && !profileForm.website2Title.$pristine") + alert(type='danger') + span.ion-close-circled + | Portfolio project title must be fewer than 140 characters. - .form-group - label.col-sm-3.col-sm-offset-2.control-label(for='website2Image') 2nd Portfolio Website Image Link - .col-sm-4 - input.form-control(type='text', name='website2Image', id='website2Image', ng-model='user.portfolio.website2Image', placeholder='http://') + .form-group + label.col-sm-3.col-sm-offset-2.control-label(for='website2Link') 2nd Portfolio Website Link + .col-sm-4 + input.form-control(type='text', name='website2Link', id='website2Link', ng-model='user.portfolio.website2Link', placeholder='http://') - .form-group - label.col-sm-3.col-sm-offset-2.control-label(for='website3Title') 3rd Portfolio Website Title - .col-sm-4 - input.form-control(type='text', name='website3Title', id='website3Title', ng-model='user.portfolio.website3Title', ng-maxlength='140') - .col-sm-4.col-sm-offset-5(ng-show="profileForm.website3Title.$error.maxlength && !profileForm.website3Title.$pristine") - alert(type='danger') - span.ion-close-circled - | Portfolio project title must be fewer than 140 characters. + .form-group + label.col-sm-3.col-sm-offset-2.control-label(for='website2Image') 2nd Portfolio Website Image Link + .col-sm-4 + input.form-control(type='text', name='website2Image', id='website2Image', ng-model='user.portfolio.website2Image', placeholder='http://') - .form-group - label.col-sm-3.col-sm-offset-2.control-label(for='website3Link') 3rd Portfolio Website Link - .col-sm-4 - input.form-control(type='text', name='website3Link', id='website3Link', ng-model='user.portfolio.website3Link', placeholder='http://') + .form-group + label.col-sm-3.col-sm-offset-2.control-label(for='website3Title') 3rd Portfolio Website Title + .col-sm-4 + input.form-control(type='text', name='website3Title', id='website3Title', ng-model='user.portfolio.website3Title', ng-maxlength='140') + .col-sm-4.col-sm-offset-5(ng-show="profileForm.website3Title.$error.maxlength && !profileForm.website3Title.$pristine") + alert(type='danger') + span.ion-close-circled + | Portfolio project title must be fewer than 140 characters. - .form-group - label.col-sm-3.col-sm-offset-2.control-label(for='website3Image') 3rd Portfolio Website Image Link - .col-sm-4 - input.form-control(type='text', name='website3Image', id='website3Image', ng-model='user.portfolio.website3Image', placeholder='http://') + .form-group + label.col-sm-3.col-sm-offset-2.control-label(for='website3Link') 3rd Portfolio Website Link + .col-sm-4 + input.form-control(type='text', name='website3Link', id='website3Link', ng-model='user.portfolio.website3Link', placeholder='http://') - .form-group - .col-sm-offset-5.col-sm-4 - button.btn.btn-primary.btn-block(type='submit', ng-disabled='profileForm.$invalid') - span.ion-edit - | Update my Portfolio - br + .form-group + label.col-sm-3.col-sm-offset-2.control-label(for='website3Image') 3rd Portfolio Website Image Link + .col-sm-4 + input.form-control(type='text', name='website3Image', id='website3Image', ng-model='user.portfolio.website3Image', placeholder='http://') + + .form-group + .col-sm-offset-5.col-sm-4 + button.btn.btn-primary.btn-block(type='submit', ng-disabled='profileForm.$invalid') + span.ion-edit + | Update my Portfolio + br .panel .big-break .container.text-center diff --git a/views/account/show.jade b/views/account/show.jade index 71e740bd235..068f98586ea 100644 --- a/views/account/show.jade +++ b/views/account/show.jade @@ -1,39 +1,43 @@ extends ../layout block content - .panel.panel-primary - .panel-heading.text-center @#{username} - .panel-body - .row - .col-xs-2.col-sm-1.col-md-1 - img(src="#{user.picture}") - .col-xs-4.col-sm-2.col-md-2 - h2.nameline - = "[ " + user.points + " ]" - .col-xs-6.col-sm-9.col-md-9 - h2.nameline - = name - h4= location - a(href="http://twitter.com/#{user.profile.twitterHandle}") - |= "@#{twitterHandle} on Twitter" - a(href="#{user.profile.coderbyteProfile") - | Coderbyte Profile - a(href="#{user.profile.linkedin") - | LinkedIn Profile - a(href="#{user.profile.codepen") - | Codepen Portfolio - a(href=linkedin) - - if (ch[0] > 0) - .container - h1 Completed Challenges + .row + .col-sm-12.col-md-8.col-xs-12 + .panel.panel-primary + .panel-heading.text-center @#{username}'s Portfolio: + .panel-body + .col-sm-12.col-md-4.col-xs-12 + .panel.panel-primary + .panel-heading.text-center About @#{username}: + .panel-body .col-xs-12 - table.table.table-striped - thead - tr - th Challenge - th Date Finished - for challenge in challenges - if ch[challenge.challengeNumber] > 0 - tr - td= challenges[challenge.challengeNumber].name - td= moment(ch[challenge.challengeNumber], 'X').format("MMM DD, YYYY") - br \ No newline at end of file + img.img-center.img-responsive.public-profile-img(src=picture) + .row + .col-xs-4 + h1.text-center + = "[ " + user.points + " ]" + .col-xs-8 + h1 + - if (twitterHandle) + a.ion-social-twitter.text-primary(title="@#{username}'s Twitter Profile", href="http://twitter.com/#{twitterHandle}") + a.ion-social-github.text-primary(title="@#{username}'s GitHub Profile", href=githubProfile) + a.ion-social-linkedin.text-primary(title="@#{username}'s LinkedIn Profile", href=linkedinProfile) + a.ion-social-codepen.text-primary(title="@#{username}'s CodePen Profile", href=codepenProfile) + a.ion-social-javascript.text-primary(title="@#{username}'s CoderByte Profile", href=coderbyteProfile) + .col-xs-12 + h2= name + h3= location + - if (ch[0] > 0) + .container + h1 Completed Challenges + .col-xs-12 + table.table.table-striped + thead + tr + th Challenge + th Date Finished + for challenge in challenges + if ch[challenge.challengeNumber] > 0 + tr + td= challenges[challenge.challengeNumber].name + td= moment(ch[challenge.challengeNumber], 'X').format("MMM DD, YYYY") + br \ No newline at end of file diff --git a/views/challenges/show.jade b/views/challenges/show.jade index 6afb19d44e3..2881728da58 100644 --- a/views/challenges/show.jade +++ b/views/challenges/show.jade @@ -27,9 +27,9 @@ block content - if (cc) a.animated.fadeIn.delay-2.btn.btn-lg.btn-primary.btn-block.next-button(name='_csrf', value=_csrf, aria-hidden='true') Take me to my next challenge - if (points && points > 2) - a.animated.fadeIn.delay-2.btn-twitter.btn.btn-lg.btn-info.btn-block(href="https://twitter.com/intent/tweet?text=I%20just%20#{verb}%20Free%20Code%20Camp%20Challenge%20%23#{number}:%20#{name}&url=http%3A%2F%2Ffreecodecamp.com/challenges/#{number}&hashtags=learntocode, javascript" target="_blank") + a.animated.fadeIn.delay-2.btn.btn-lg.btn-block.btn-twitter.btn-social.btn-social-tweet(href="https://twitter.com/intent/tweet?text=I%20just%20#{verb}%20Free%20Code%20Camp%20Challenge%20%23#{number}:%20#{name}&url=http%3A%2F%2Ffreecodecamp.com/challenges/#{number}&hashtags=learntocode, javascript" target="_blank") i.fa.fa-twitter   - = phrase + = phrase - else a.animated.fadeIn.delay-2.btn.btn-lg.signup-btn.btn-block(href='/login') Sign in so you can save your progress #skip-dialog.modal diff --git a/views/layout.jade b/views/layout.jade index 70efc451203..f1d2a7e9319 100644 --- a/views/layout.jade +++ b/views/layout.jade @@ -5,6 +5,8 @@ html(ng-app='profileValidation') script(src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.8/angular.min.js") script(src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/0.12.0/ui-bootstrap-tpls.min.js") link(rel='shortcut icon', href='https://s3.amazonaws.com/freecodecamp/favicon.ico') + link(rel='stylesheet', href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css') + //link(rel='stylesheet', href='http://code.ionicframework.com/ionicons/2.0.0/css/ionicons.min.css') include partials/meta title #{title} | Free Code Camp meta(charset='utf-8')