From a76c8aff5a11276ad235759fe920b4935c95274a Mon Sep 17 00:00:00 2001 From: Stuart Taylor Date: Mon, 21 May 2018 16:21:15 +0100 Subject: [PATCH] Fix: Settings/Portfolio UI (#17202) * chore(names): Certificate -> Certification * fix(style): Profile Certs alignment and font-size * fix(button): Remove user icon * fix(style): Adjust profile timeline UI * fix(style): General account settings style fixes * chore(updateEmail): Remove update email until we sort out auth0 * fix(copy): website -> personal website * fix(copy): profile -> portfolio * feat(home): Add legacy certs to user home page * fix(copy): Change Honest settings copy * fix(cert-settings): Filter out 'take home's * fix(copy): next lesson -> next coding challenge * fix(alignment): Align portfolio item settings' buttons --- common/app/entities/index.js | 4 +- .../routes/Profile/components/CamperHOC.jsx | 2 +- .../Profile/components/Certificates.jsx | 68 +++++------ .../routes/Profile/components/Timeline.jsx | 106 ++++++++++++++++-- common/app/routes/Profile/profile.less | 16 ++- common/app/routes/Settings/Settings.jsx | 4 +- .../Settings/components/About-Settings.jsx | 4 - .../Settings/components/Cert-Settings.jsx | 14 +-- .../Settings/components/Email-Settings.jsx | 33 ++++-- .../routes/Settings/components/Honesty.jsx | 2 +- .../Settings/components/Internet-Settings.jsx | 17 ++- .../Settings/components/JSAlgoAndDSForm.jsx | 4 +- .../routes/Settings/components/ResetModal.jsx | 2 +- .../app/routes/Settings/formHelpers/Form.jsx | 32 +++--- common/resource/academicPolicy.js | 2 +- server/boot/certificate.js | 8 +- server/boot/home.js | 4 +- server/component-passport.js | 8 ++ .../views/certificate/advanced-front-end.jade | 4 +- .../certificate/apis-and-microservices.jade | 4 +- .../views/certificate/data-visualization.jade | 4 +- .../certificate/front-end-libraries.jade | 4 +- ...mation-security-and-quality-assurance.jade | 4 +- ...script-algorithms-and-data-structures.jade | 6 +- server/views/certificate/legacy/back-end.jade | 4 +- .../legacy/data-visualization.jade | 4 +- .../views/certificate/legacy/front-end.jade | 4 +- .../views/certificate/legacy/full-stack.jade | 4 +- .../certificate/responsive-web-design.jade | 4 +- server/views/emails/certified.ejs | 4 +- server/views/homePartials/stats.jade | 9 ++ server/views/noUserHome.jade | 2 +- server/views/userHome.jade | 2 +- 33 files changed, 259 insertions(+), 134 deletions(-) diff --git a/common/app/entities/index.js b/common/app/entities/index.js index 892b25e0d0..90e2b3aa68 100644 --- a/common/app/entities/index.js +++ b/common/app/entities/index.js @@ -121,7 +121,9 @@ export function projectsSelector(state) { ); return Object.keys(blocks) .filter(key => - key.includes('projects') && !key.includes('coding-interview') + key.includes('projects') && !( + key.includes('coding-interview') || key.includes('take-home') + ) ) .map(key => blocks[key]) .concat(legacyWithDashedNames) diff --git a/common/app/routes/Profile/components/CamperHOC.jsx b/common/app/routes/Profile/components/CamperHOC.jsx index 9199cb6907..b9e784b0c3 100644 --- a/common/app/routes/Profile/components/CamperHOC.jsx +++ b/common/app/routes/Profile/components/CamperHOC.jsx @@ -58,7 +58,7 @@ function CamperHOC({ location={ showLocation && location } name={ showName && name } picture={ picture } - points={ showPoints && points } + points={ showPoints ? points : 0 } username={ username } />
diff --git a/common/app/routes/Profile/components/Certificates.jsx b/common/app/routes/Profile/components/Certificates.jsx index cecca5d961..ff2fb607fc 100644 --- a/common/app/routes/Profile/components/Certificates.jsx +++ b/common/app/routes/Profile/components/Certificates.jsx @@ -9,6 +9,8 @@ import { Col } from 'react-bootstrap'; +import { FullWidthRow } from '../../../helperComponents'; + import { userByNameSelector } from '../../../redux'; const mapStateToProps = createSelector( @@ -40,59 +42,59 @@ const mapStateToProps = createSelector( currentCerts: [ { show: is2018FullStackCert, - title: 'Full Stack Certificate:', + title: 'Full Stack Certification:', showURL: '2018-full-stack' }, { show: isRespWebDesignCert, - title: 'Responsive Web Design Certificate:', + title: 'Responsive Web Design Certification:', showURL: 'responsive-web-design' }, { show: isJsAlgoDataStructCert, - title: 'JavaScript Algorithms and Data Structures Certificate:', + title: 'JavaScript Algorithms and Data Structures Certification:', showURL: 'javascript-algorithms-and-data-structures' }, { show: isFrontEndLibsCert, - title: 'Front End Libraries Certificate:', + title: 'Front End Libraries Certification:', showURL: 'front-end-libraries' }, { show: is2018DataVisCert, - title: 'Data Visualization Certificate:', + title: 'Data Visualization Certification:', showURL: 'data-visualization' }, { show: isApisMicroservicesCert, - title: 'APIs and Microservices Certificate:', + title: 'APIs and Microservices Certification:', showURL: 'apis-and-microservices' }, { show: isInfosecQaCert, - title: 'Information Security and Quality Assurance Certificate:', + title: 'Information Security and Quality Assurance Certification:', showURL: 'information-security-and-quality-assurance' } ], legacyCerts: [ { show: isFullStackCert, - title: 'Full Stack Certificate:', + title: 'Full Stack Certification:', showURL: 'legacy-full-stack' }, { show: isFrontEndCert, - title: 'Front End Certificate:', + title: 'Front End Certification:', showURL: 'legacy-front-end' }, { show: isBackEndCert, - title: 'Back End Certificate:', + title: 'Back End Certification:', showURL: 'legacy-back-end' }, { show: isDataVisCert, - title: 'Data Visualization Certificate:', + title: 'Data Visualization Certification:', showURL: 'legacy-data-visualization' } ] @@ -123,7 +125,7 @@ function renderCertShow(username, cert) { return cert.show ? ( -

+

{ cert.title } @@ -134,7 +136,7 @@ function renderCertShow(username, cert) { block={ true } bsSize='lg' bsStyle='primary' - href={ `/certificates/${username}/${cert.showURL}`} + href={ `/certification/${username}/${cert.showURL}`} > Show @@ -154,25 +156,27 @@ function Certificates({ const renderCertShowWithUsername = _.curry(renderCertShow)(username); return (

-

freeCodeCamp Certificates

-
- { - hasModernCert ? - currentCerts.map(renderCertShowWithUsername) : -

- No certificates have been earned under the current curriculum -

- } - { - hasLegacyCert ? -
-

Legacy Certifications

- { - legacyCerts.map(renderCertShowWithUsername) - } -
: - null - } + +

freeCodeCamp Certifications

+
+ { + hasModernCert ? + currentCerts.map(renderCertShowWithUsername) : +

+ No certifications have been earned under the current curriculum +

+ } + { + hasLegacyCert ? +
+

Legacy Certifications

+ { + legacyCerts.map(renderCertShowWithUsername) + } +
: + null + } +

); diff --git a/common/app/routes/Profile/components/Timeline.jsx b/common/app/routes/Profile/components/Timeline.jsx index 86e01fb3f1..0a98b9cbf0 100644 --- a/common/app/routes/Profile/components/Timeline.jsx +++ b/common/app/routes/Profile/components/Timeline.jsx @@ -3,8 +3,10 @@ import PropTypes from 'prop-types'; import { createSelector } from 'reselect'; import { connect } from 'react-redux'; import format from 'date-fns/format'; -import { reverse, sortBy } from 'lodash'; +import { find, reverse, sortBy } from 'lodash'; import { + Button, + Modal, Table } from 'react-bootstrap'; @@ -12,18 +14,20 @@ import { challengeIdToNameMapSelector } from '../../../entities'; import { userByNameSelector } from '../../../redux'; import { homeURL } from '../../../../utils/constantStrings.json'; import blockNameify from '../../../utils/blockNameify'; -import { FullWidthRow } from '../../../helperComponents'; import { Link } from '../../../Router'; +import { FullWidthRow } from '../../../helperComponents'; +import SolutionViewer from '../../Settings/components/SolutionViewer.jsx'; const mapStateToProps = createSelector( challengeIdToNameMapSelector, userByNameSelector, ( idToNameMap, - { completedChallenges: completedMap = [] } + { completedChallenges: completedMap = [], username } ) => ({ completedMap, - idToNameMap + idToNameMap, + username }) ); @@ -32,38 +36,94 @@ const propTypes = { PropTypes.shape({ id: PropTypes.string, completedDate: PropTypes.number, - challengeType: PropTypes.number + challengeType: PropTypes.number, + solution: PropTypes.string, + files: PropTypes.shape({ + ext: PropTypes.string, + contents: PropTypes.string + }) }) ), - idToNameMap: PropTypes.objectOf(PropTypes.string) + idToNameMap: PropTypes.objectOf(PropTypes.string), + username: PropTypes.string }; class Timeline extends PureComponent { constructor(props) { super(props); + this.state = { + solutionToView: null, + solutionOpen: false + }; + + this.closeSolution = this.closeSolution.bind(this); this.renderCompletion = this.renderCompletion.bind(this); + this.viewSolution = this.viewSolution.bind(this); } renderCompletion(completed) { const { idToNameMap } = this.props; - const { id, completedDate } = completed; + const { id, completedDate, solution, files } = completed; + const challengeDashedName = idToNameMap[id]; return ( - { blockNameify(idToNameMap[id]) } + + { blockNameify(challengeDashedName) } + + + + + {/* eslint-disable no-nested-ternary */ + files ? ( + + ) : solution ? ( + + ) : '' + } + ); } + viewSolution(id) { + this.setState(state => ({ + ...state, + solutionToView: id, + solutionOpen: true + })); + } + + closeSolution() { + this.setState(state => ({ + ...state, + solutionToView: null, + solutionOpen: false + })); + } render() { - const { completedMap, idToNameMap } = this.props; + const { completedMap, idToNameMap, username } = this.props; + const { solutionToView: id, solutionOpen } = this.state; if (!Object.keys(idToNameMap).length) { return null; } @@ -82,7 +142,7 @@ class Timeline extends PureComponent { Challenge - First Completed + First Completed @@ -98,6 +158,30 @@ class Timeline extends PureComponent { } + { + id && + + + + { `${username}'s Solution to ${blockNameify(idToNameMap[id])}` } + + + + completedId === id) + } + /> + + + + + + } ); } diff --git a/common/app/routes/Profile/profile.less b/common/app/routes/Profile/profile.less index 1f61aa3fac..de1bb54db2 100644 --- a/common/app/routes/Profile/profile.less +++ b/common/app/routes/Profile/profile.less @@ -13,6 +13,18 @@ background-color: #fff; } +.bigger-text { + font-size: 1.7rem; +} + +.bio { + text-align: center; +} + +.name, .location, .bio, .points { + font-size: 2rem; + margin-bottom: 0; +} .@{ns}-container { @@ -41,10 +53,6 @@ } } - .bio { - text-align: center; - } - h2, h3 { &.name, &.username, &.points, &.location { margin-top: 0; diff --git a/common/app/routes/Settings/Settings.jsx b/common/app/routes/Settings/Settings.jsx index 9d16a9a1db..88779602ab 100644 --- a/common/app/routes/Settings/Settings.jsx +++ b/common/app/routes/Settings/Settings.jsx @@ -4,7 +4,6 @@ import { connect } from 'react-redux'; import { createSelector } from 'reselect'; import { Button } from 'react-bootstrap'; -import FA from 'react-fontawesome'; import ns from './ns.json'; import { FullWidthRow, Spacer, Loader } from '../../helperComponents'; @@ -85,8 +84,7 @@ export class Settings extends React.Component { bsStyle='primary' className='btn-link-social' > - - Show me my public profile + Show me my public portfolio : null } @@ -215,11 +215,11 @@ class CertificationSettings extends PureComponent { const { allProjects } = this.props; let project = _.find(allProjects, { superBlock: id }); if (!project) { - // the submitted projects do not belong to current/legacy certificates + // the submitted projects do not belong to current/legacy certifications return this.props.createError( new Error( 'Submitted projects do not belong to either current or ' + - 'legacy certificates' + 'legacy certifications' ) ); } @@ -268,7 +268,7 @@ class CertificationSettings extends PureComponent {

Add links to the live demos of your projects as you finish them. - Then, once you have added all 5 projects required for a certificate, + Then, once you have added all 5 projects required for a certification, you can claim it.

@@ -276,7 +276,7 @@ class CertificationSettings extends PureComponent { modernProjects.map(this.buildProjectForms) } - Legacy Certificate Settings + Legacy Certification Settings { legacyProjects.map(this.buildProjectForms) diff --git a/common/app/routes/Settings/components/Email-Settings.jsx b/common/app/routes/Settings/components/Email-Settings.jsx index d3b454f52c..d9f1aac76b 100644 --- a/common/app/routes/Settings/components/Email-Settings.jsx +++ b/common/app/routes/Settings/components/Email-Settings.jsx @@ -13,13 +13,29 @@ import { } from 'react-bootstrap'; import TB from '../Toggle-Button'; -import EmailForm from './EmailForm.jsx'; +// import EmailForm from './EmailForm.jsx'; import { Link } from '../../../Router'; -import { FullWidthRow, Spacer } from '../../../helperComponents'; +import { FullWidthRow } from '../../../helperComponents'; import SectionHeader from './SectionHeader.jsx'; import { userSelector } from '../../../redux'; import { onRouteUpdateEmail, updateMyEmail, updateUserBackend } from '../redux'; +/** + Removed functionality until we can update auth0 at the same time + + + + + + + + + + + */ + const mapStateToProps = createSelector( userSelector, ({ @@ -101,9 +117,8 @@ class EmailSettings extends PureComponent { You do not have an email associated with this account.

- - - + + ); } @@ -124,12 +139,8 @@ class EmailSettings extends PureComponent { } - - - - + + diff --git a/common/app/routes/Settings/components/Honesty.jsx b/common/app/routes/Settings/components/Honesty.jsx index ae095ef8ca..7dd8a0673c 100644 --- a/common/app/routes/Settings/components/Honesty.jsx +++ b/common/app/routes/Settings/components/Honesty.jsx @@ -45,7 +45,7 @@ class Honesty extends PureComponent { const isHonestAgreed = (

- You have already accepted our Academic Honesty Policy + You have accepted our Academic Honesty Policy

); diff --git a/common/app/routes/Settings/components/Internet-Settings.jsx b/common/app/routes/Settings/components/Internet-Settings.jsx index 245c79e998..8c090c7e55 100644 --- a/common/app/routes/Settings/components/Internet-Settings.jsx +++ b/common/app/routes/Settings/components/Internet-Settings.jsx @@ -22,12 +22,17 @@ const mapStateToProps = createSelector( githubProfile, linkedin, twitter, - website + personalWebsite: website } }) ); -const formFields = [ 'githubProfile', 'linkedin', 'twitter', 'website' ]; +const formFields = [ + 'githubProfile', + 'linkedin', + 'twitter', + 'personalWebsite' +]; function mapDispatchToProps(dispatch) { return bindActionCreators({ @@ -40,10 +45,10 @@ const propTypes = { githubProfile: PropTypes.string, handleSubmit: PropTypes.func.isRequired, linkedin: PropTypes.string, + personalWebsite: PropTypes.string, twitter: PropTypes.string, updateUserBackend: PropTypes.func.isRequired, - username: PropTypes.string, - website: PropTypes.string + username: PropTypes.string }; class InternetSettings extends PureComponent { @@ -53,8 +58,8 @@ class InternetSettings extends PureComponent { this.handleSubmit = this.handleSubmit.bind(this); } - handleSubmit(values) { - this.props.updateUserBackend(values); + handleSubmit({personalWebsite, ...others}) { + this.props.updateUserBackend({ ...others, website: personalWebsite }); } render() { diff --git a/common/app/routes/Settings/components/JSAlgoAndDSForm.jsx b/common/app/routes/Settings/components/JSAlgoAndDSForm.jsx index 1a73e56be1..0749996c17 100644 --- a/common/app/routes/Settings/components/JSAlgoAndDSForm.jsx +++ b/common/app/routes/Settings/components/JSAlgoAndDSForm.jsx @@ -43,7 +43,7 @@ class JSAlgoAndDSForm extends PureComponent { e.preventDefault(); const { username, superBlock, isCertClaimed } = this.props; if (isCertClaimed) { - return this.props.hardGoTo(`/certificates/${username}/${superBlock}`); + return this.props.hardGoTo(`/certification/${username}/${superBlock}`); } return this.props.claimCert(superBlock); } @@ -107,7 +107,7 @@ class JSAlgoAndDSForm extends PureComponent { Object.keys(jsProjects).length === completeCount ? - { isCertClaimed ? 'Show' : 'Claim'} Certificate + { isCertClaimed ? 'Show' : 'Claim'} Certification : null diff --git a/common/app/routes/Settings/components/ResetModal.jsx b/common/app/routes/Settings/components/ResetModal.jsx index 456702ec2d..a4c0ffbd29 100644 --- a/common/app/routes/Settings/components/ResetModal.jsx +++ b/common/app/routes/Settings/components/ResetModal.jsx @@ -26,7 +26,7 @@ function ResetModal(props) {

This will really delete all of your progress, points, completed - challenges, our records of your projects, any certificates you have, + challenges, our records of your projects, any certifications you have, everything.

diff --git a/common/app/routes/Settings/formHelpers/Form.jsx b/common/app/routes/Settings/formHelpers/Form.jsx index f9461c2172..54bfe34316 100644 --- a/common/app/routes/Settings/formHelpers/Form.jsx +++ b/common/app/routes/Settings/formHelpers/Form.jsx @@ -2,7 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { reduxForm } from 'redux-form'; -import { FormFields, BlockSaveButton, BlockSaveWrapper } from './'; +import { FormFields, BlockSaveButton } from './'; const propTypes = { buttonText: PropTypes.string, @@ -50,22 +50,20 @@ function DynamicForm({ fields={ fields } options={ options } /> - - { - hideButton ? - null : - errors[key]).length) - } - > - { - buttonText ? buttonText : null - } - - } - + { + hideButton ? + null : + errors[key]).length) + } + > + { + buttonText ? buttonText : null + } + + } ); } diff --git a/common/resource/academicPolicy.js b/common/resource/academicPolicy.js index 4efc832ee2..6f2a7cb43e 100644 --- a/common/resource/academicPolicy.js +++ b/common/resource/academicPolicy.js @@ -1,5 +1,5 @@ const policy = [ - 'Before you can claim a verified certificate, you must accept the ' + + 'Before you can claim a verified certification, you must accept the ' + 'Academic Honesty Policy below.', 'I understand that plagiarism means copying someone else’s work and ' + 'presenting the work as if it were my own, without clearly attributing ' + diff --git a/server/boot/certificate.js b/server/boot/certificate.js index 468ebfddf1..df6f312d52 100644 --- a/server/boot/certificate.js +++ b/server/boot/certificate.js @@ -138,7 +138,7 @@ function sendCertifiedEmail( from: 'team@freeCodeCamp.org', subject: dedent` Congratulations on completing all of the - freeCodeCamp certificates! + freeCodeCamp certifications! `, text: renderCertifedEmail({ username, @@ -190,16 +190,16 @@ export default function certificate(app) { verifyCert ); router.get( - '/certificates/:username/:cert', + '/certification/:username/:cert', showCert ); app.use(router); const noNameMessage = dedent` - We need your name so we can put it on your certificate. + We need your name so we can put it on your certification. Add your name to your account settings and click the save button. - Then we can issue your certificate. + Then we can issue your certification. `; const notCertifiedMessage = name => dedent` diff --git a/server/boot/home.js b/server/boot/home.js index d32736d63f..2c2f2b591d 100644 --- a/server/boot/home.js +++ b/server/boot/home.js @@ -39,11 +39,12 @@ module.exports = function(app, done) { const homePage = user ? 'userHome' : 'noUserHome'; const { quote, author} = getRandomQuote(); const title = user ? - `Welcome back ${user.name ? user.name : 'Camper'}` : + `Welcome, ${user.name ? user.name : 'Camper'}!` : 'Learn to Code and Help Nonprofits'; const completedChallengeCount = user && user.completedChallengeCount || 0; const completedProjectCount = user && user.completedProjectCount || 0; const completedCertCount = user && user.completedCertCount || 0; + const completedLegacyCertCount = user && user.completedLegacyCertCount || 0; Promise.all([ // news.getFeed(), About.getActiveUsersForRendering() @@ -60,6 +61,7 @@ module.exports = function(app, done) { completedChallengeCount, completedProjectCount, completedCertCount, + completedLegacyCertCount, // feed, quote, title diff --git a/server/component-passport.js b/server/component-passport.js index 63104737ff..f3a0101f35 100644 --- a/server/component-passport.js +++ b/server/component-passport.js @@ -22,7 +22,14 @@ function getCompletedCertCount(user) { 'isJsAlgoDataStructCert', 'isRespWebDesignCert' ].reduce((sum, key) => user[key] ? sum + 1 : sum, 0); +} +function getLegacyCertCount(user) { + return [ + 'isFrontEndCert', + 'isBackEndCert', + 'isDataVisCert' + ].reduce((sum, key) => user[key] ? sum + 1 : sum, 0); } PassportConfigurator.prototype.init = function passportInit(noSession) { @@ -72,6 +79,7 @@ PassportConfigurator.prototype.init = function passportInit(noSession) { user.completedChallengeCount = completedChallengeCount; user.completedProjectCount = completedProjectCount; user.completedCertCount = getCompletedCertCount(user); + user.completedLegacyCertCount = getLegacyCertCount(user); user.completedChallenges = []; return done(null, user); }); diff --git a/server/views/certificate/advanced-front-end.jade b/server/views/certificate/advanced-front-end.jade index e25d05cbc7..0409b6314d 100644 --- a/server/views/certificate/advanced-front-end.jade +++ b/server/views/certificate/advanced-front-end.jade @@ -20,7 +20,7 @@ include styles h3 has successfully completed freeCodeCamp's h1 strong Advanced Frontend Projects - h4 1 of 3 legacy freeCodeCamp certificates, representing approximately 400 hours of coursework + h4 1 of 3 legacy freeCodeCamp certification, representing approximately 400 hours of coursework footer .row.signatures @@ -29,4 +29,4 @@ include styles strong Quincy Larson p Executive Director, freeCodeCamp.org .row - p.verify Verify this certificate at: https://freecodecamp.org/certificates/#{username}/advanced-front-end \ No newline at end of file + p.verify Verify this certification at: https://freecodecamp.org/certification/#{username}/advanced-front-end \ No newline at end of file diff --git a/server/views/certificate/apis-and-microservices.jade b/server/views/certificate/apis-and-microservices.jade index 5f5793565f..1b4b4cdf33 100644 --- a/server/views/certificate/apis-and-microservices.jade +++ b/server/views/certificate/apis-and-microservices.jade @@ -20,7 +20,7 @@ include styles h3 has successfully completed freeCodeCamp's h1 strong APIs and Microservices Projects - h4 1 of 6 freeCodeCamp certificates, representing approximately 300 hours of coursework + h4 1 of 6 freeCodeCamp certifications, representing approximately 300 hours of coursework footer .row.signatures @@ -29,4 +29,4 @@ include styles strong Quincy Larson p Executive Director, freeCodeCamp.org .row - p.verify Verify this certificate at: https://freecodecamp.org/certificates/#{username}/apis-and-microservices + p.verify Verify this certification at: https://freecodecamp.org/certification/#{username}/apis-and-microservices diff --git a/server/views/certificate/data-visualization.jade b/server/views/certificate/data-visualization.jade index e4c34c3543..301917125e 100644 --- a/server/views/certificate/data-visualization.jade +++ b/server/views/certificate/data-visualization.jade @@ -20,7 +20,7 @@ include styles h3 has successfully completed freeCodeCamp's h1 strong Data Visualization Projects - h4 1 of 6 freeCodeCamp certificates, representing approximately 300 hours of coursework + h4 1 of 6 freeCodeCamp certifications, representing approximately 300 hours of coursework footer .row.signatures @@ -29,4 +29,4 @@ include styles strong Quincy Larson p Executive Director, freeCodeCamp.org .row - p.verify Verify this certificate at: https://freecodecamp.org/certificates/#{username}/data-visualization + p.verify Verify this certification at: https://freecodecamp.org/certification/#{username}/data-visualization diff --git a/server/views/certificate/front-end-libraries.jade b/server/views/certificate/front-end-libraries.jade index 1108949a40..eef1cfd084 100644 --- a/server/views/certificate/front-end-libraries.jade +++ b/server/views/certificate/front-end-libraries.jade @@ -20,7 +20,7 @@ include styles h3 has successfully completed freeCodeCamp's h1 strong Front End Libraries Projects - h4 1 of 6 freeCodeCamp certificates, representing approximately 300 hours of coursework + h4 1 of 6 freeCodeCamp certifications, representing approximately 300 hours of coursework footer .row.signatures @@ -29,4 +29,4 @@ include styles strong Quincy Larson p Executive Director, freeCodeCamp.org .row - p.verify Verify this certificate at: https://freecodecamp.org/certificates/#{username}/front-end-libraries + p.verify Verify this certification at: https://freecodecamp.org/certification/#{username}/front-end-libraries diff --git a/server/views/certificate/information-security-and-quality-assurance.jade b/server/views/certificate/information-security-and-quality-assurance.jade index a6a7ecbd62..c0b87f40ff 100644 --- a/server/views/certificate/information-security-and-quality-assurance.jade +++ b/server/views/certificate/information-security-and-quality-assurance.jade @@ -20,7 +20,7 @@ include styles h3 has successfully completed freeCodeCamp's h1 strong Information Security and Quality Assurance Projects - h4 1 of 6 freeCodeCamp certificates, representing approximately 300 hours of coursework + h4 1 of 6 freeCodeCamp certifications, representing approximately 300 hours of coursework footer .row.signatures @@ -29,4 +29,4 @@ include styles strong Quincy Larson p Executive Director, freeCodeCamp.org .row - p.verify Verify this certificate at: https://freecodecamp.org/certificates/#{username}/information-security-and-quality-assurance + p.verify Verify this certification at: https://freecodecamp.org/certification/#{username}/information-security-and-quality-assurance diff --git a/server/views/certificate/javascript-algorithms-and-data-structures.jade b/server/views/certificate/javascript-algorithms-and-data-structures.jade index 0033d50e2d..f710c44564 100644 --- a/server/views/certificate/javascript-algorithms-and-data-structures.jade +++ b/server/views/certificate/javascript-algorithms-and-data-structures.jade @@ -19,8 +19,8 @@ include styles strong= name h3 has successfully completed freeCodeCamp's h1 - strong JavaScript Algorithms and Data Structures Certificate - h4 1 of 6 freeCodeCamp certificates, representing approximately 300 hours of coursework + strong JavaScript Algorithms and Data Structures Projects + h4 1 of 6 freeCodeCamp certifications, representing approximately 300 hours of coursework footer .row.signatures @@ -29,4 +29,4 @@ include styles strong Quincy Larson p Executive Director, freeCodeCamp.org .row - p.verify Verify this certificate at: https://freecodecamp.org/certificates/#{username}/javascript-algorithms-and-data-structures + p.verify Verify this certification at: https://freecodecamp.org/certification/#{username}/javascript-algorithms-and-data-structures diff --git a/server/views/certificate/legacy/back-end.jade b/server/views/certificate/legacy/back-end.jade index c2cce165da..eb2e50b253 100644 --- a/server/views/certificate/legacy/back-end.jade +++ b/server/views/certificate/legacy/back-end.jade @@ -20,7 +20,7 @@ include ../styles h3 has successfully completed freeCodeCamp's h1 strong Back End Development Projects - h4 1 of 3 legacy freeCodeCamp certificates, representing approximately 400 hours of coursework + h4 1 of 3 legacy freeCodeCamp certifications, representing approximately 400 hours of coursework footer .row.signatures @@ -29,4 +29,4 @@ include ../styles strong Quincy Larson p Executive Director, freeCodeCamp.org .row - p.verify Verify this certificate at: https://freecodecamp.org/certificates/#{username}/legacy-back-end + p.verify Verify this certification at: https://freecodecamp.org/certification/#{username}/legacy-back-end diff --git a/server/views/certificate/legacy/data-visualization.jade b/server/views/certificate/legacy/data-visualization.jade index bf9537fca4..91b462e588 100644 --- a/server/views/certificate/legacy/data-visualization.jade +++ b/server/views/certificate/legacy/data-visualization.jade @@ -20,7 +20,7 @@ include ../styles h3 has successfully completed freeCodeCamp's h1 strong Data Visualization Projects - h4 1 of 3 legacy freeCodeCamp certificates, representing approximately 400 hours of coursework + h4 1 of 3 legacy freeCodeCamp certifications, representing approximately 400 hours of coursework footer .row.signatures @@ -29,4 +29,4 @@ include ../styles strong Quincy Larson p Executive Director, freeCodeCamp.org .row - p.verify Verify this certificate at: https://freecodecamp.org/certificates/#{username}/legacy-data-visualization + p.verify Verify this certification at: https://freecodecamp.org/certification/#{username}/legacy-data-visualization diff --git a/server/views/certificate/legacy/front-end.jade b/server/views/certificate/legacy/front-end.jade index 56cd262af4..f11460354f 100644 --- a/server/views/certificate/legacy/front-end.jade +++ b/server/views/certificate/legacy/front-end.jade @@ -20,7 +20,7 @@ include ../styles h3 has successfully completed freeCodeCamp's h1 strong Front End Development Projects - h4 1 of 3 legacy freeCodeCamp certificates, representing approximately 400 hours of coursework + h4 1 of 3 legacy freeCodeCamp certifications, representing approximately 400 hours of coursework footer .row.signatures @@ -29,4 +29,4 @@ include ../styles strong Quincy Larson p Executive Director, freeCodeCamp.org .row - p.verify Verify this certificate at: https://freecodecamp.org/certificates/#{username}/legacy-front-end + p.verify Verify this certification at: https://freecodecamp.org/certification/#{username}/legacy-front-end diff --git a/server/views/certificate/legacy/full-stack.jade b/server/views/certificate/legacy/full-stack.jade index 5fd4ab7920..4dda5f8a70 100644 --- a/server/views/certificate/legacy/full-stack.jade +++ b/server/views/certificate/legacy/full-stack.jade @@ -20,7 +20,7 @@ include ../styles h3 has successfully completed freeCodeCamp's h1 strong Legacy Full Stack Development Program - h4 All three of the legacy freeCodeCamp certificates, representing approximately 12000 hours of coursework + h4 All three of the legacy freeCodeCamp certifications, representing approximately 12000 hours of coursework footer .row.signatures @@ -29,4 +29,4 @@ include ../styles strong Quincy Larson p Executive Director, freeCodeCamp.org .row - p.verify Verify this certificate at: https://freecodecamp.org/certificates/#{username}/legacy-full-stack \ No newline at end of file + p.verify Verify this certification at: https://freecodecamp.org/certification/#{username}/legacy-full-stack \ No newline at end of file diff --git a/server/views/certificate/responsive-web-design.jade b/server/views/certificate/responsive-web-design.jade index 5030b879d4..f55245000d 100644 --- a/server/views/certificate/responsive-web-design.jade +++ b/server/views/certificate/responsive-web-design.jade @@ -20,7 +20,7 @@ include styles h3 has successfully completed freeCodeCamp's h1 strong Responsive Web Design Projects - h4 1 of 6 freeCodeCamp certificates, representing approximately 300 hours of coursework + h4 1 of 6 freeCodeCamp certifications, representing approximately 300 hours of coursework footer .row.signatures @@ -29,4 +29,4 @@ include styles strong Quincy Larson p Executive Director, freeCodeCamp.org .row - p.verify Verify this certificate at: https://freecodecamp.org/certificates/#{username}/responsive-web-design + p.verify Verify this certification at: https://freecodecamp.org/certification/#{username}/responsive-web-design diff --git a/server/views/emails/certified.ejs b/server/views/emails/certified.ejs index 5d72f78cf8..15958f2298 100644 --- a/server/views/emails/certified.ejs +++ b/server/views/emails/certified.ejs @@ -1,8 +1,8 @@ Hi <%= name || username %>, -Congratulations on completing all of the freeCodeCamp certificates! +Congratulations on completing all of the freeCodeCamp certifications! -All of your certificates are now live at at: https://www.freecodecamp.org/<%= username %> +All of your certifications are now live at at: https://www.freecodecamp.org/<%= username %> Please tell me a bit more about you and your near-term goals. diff --git a/server/views/homePartials/stats.jade b/server/views/homePartials/stats.jade index dc913c03ef..e54a2c3433 100644 --- a/server/views/homePartials/stats.jade +++ b/server/views/homePartials/stats.jade @@ -16,6 +16,15 @@ strong span.green-text 30 | projects + if !!completedLegacyCertCount + p.stats + | You have earned  + strong + span.green-text=completedLegacyCertCount + | out of  + strong + span.green-text 3 + | legacy certifications p.stats | You have earned  strong diff --git a/server/views/noUserHome.jade b/server/views/noUserHome.jade index db3db52b16..2872228ec3 100644 --- a/server/views/noUserHome.jade +++ b/server/views/noUserHome.jade @@ -13,7 +13,7 @@ block content .col-xs-12.col-sm-12.col-md-4 img.img-responsive.landing-icon.img-center(src= 'https://s3.amazonaws.com/freecodecamp/landing-icon-certificate.svg', alt='Help nonprofits with bro bono code projects') - p.large-p Build projects and earn free certificates. + p.large-p Build projects and earn free certifications. .col-xs-12.col-sm-12.col-md-4 img.img-responsive.landing-icon.img-center(src= 'https://s3.amazonaws.com/freecodecamp/landing-icon-experience.svg', alt='Get hired as a developer and start your software engineer career') diff --git a/server/views/userHome.jade b/server/views/userHome.jade index b1528ff831..56c2dbba2f 100644 --- a/server/views/userHome.jade +++ b/server/views/userHome.jade @@ -15,7 +15,7 @@ block content .big-break .row .col-xs-12.col-sm-8.col-sm-offset-2 - a.btn.btn-cta.btn-block.btn-lg.btn-primary(href="/challenges/current-challenge") Go to my next lesson + a.btn.btn-cta.btn-block.btn-lg.btn-primary(href="/challenges/current-challenge") Go to my next coding challenge .big-break .big-break .big-break