feat: mvp features for soft launch (#44539)
* refactor: use enum * feat: create links between legacy and new * refactor: pull out legacy-links component * fix: import order * fix: provide icon for new superblock * feat: only show the copy on the new superblock * fix: use the proper i18n keys correctly * feat: put the new superblock at the end of the map * feat: update the new superblock title * test: update for soft launch order * fix: show original project links on /settings Soft launch only. * test: use SHOW_NEW_CURRICULUM in tests * fix: rename the remaining rwd-22s * feat: make the messge prettier * fix: message copy * refactor: make comment make sense Co-authored-by: Ahmad Abdolsaheb <ahmad.abdolsaheb@gmail.com> Co-authored-by: Nicholas Carrigan (he/him) <nhcarrigan@gmail.com>
This commit is contained in:
committed by
GitHub
parent
10f0d3c07a
commit
fd63bb6f85
@ -67,7 +67,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"2022/responsive-web-design": {
|
"2022/responsive-web-design": {
|
||||||
"title": "Responsive Web Design",
|
"title": "Responsive Web Design (Beta)",
|
||||||
"intro": [
|
"intro": [
|
||||||
"In this Responsive Web Design Certification, you'll learn the languages that developers use to build webpages: HTML (Hypertext Markup Language) for content, and CSS (Cascading Style Sheets) for design.",
|
"In this Responsive Web Design Certification, you'll learn the languages that developers use to build webpages: HTML (Hypertext Markup Language) for content, and CSS (Cascading Style Sheets) for design.",
|
||||||
"First, you'll build a cat photo app to learn the basics of HTML and CSS. Later, you'll learn modern techniques like CSS variables by building a penguin, and best practices for accessibility by building a web form.",
|
"First, you'll build a cat photo app to learn the basics of HTML and CSS. Later, you'll learn modern techniques like CSS variables by building a penguin, and best practices for accessibility by building a web form.",
|
||||||
@ -672,6 +672,8 @@
|
|||||||
"expand": "Expand courses",
|
"expand": "Expand courses",
|
||||||
"collapse": "Collapse courses",
|
"collapse": "Collapse courses",
|
||||||
"legacy-header": "Legacy Courses",
|
"legacy-header": "Legacy Courses",
|
||||||
"legacy-desc": "These courses are no longer part of the certification path, but are still available for you to further your learning."
|
"legacy-desc": "These courses are no longer part of the certification path, but are still available for you to further your learning.",
|
||||||
|
"viewing-upcoming-change": "You are looking at a beta version of the curriculum. ",
|
||||||
|
"go-back-to-learn": "Go back to the stable version."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,7 @@ import ResponsiveDesign from './responsive-design';
|
|||||||
import Shield from './shield';
|
import Shield from './shield';
|
||||||
|
|
||||||
const iconMap = {
|
const iconMap = {
|
||||||
|
[SuperBlocks.RespWebDesignNew]: ResponsiveDesign,
|
||||||
[SuperBlocks.RespWebDesign]: ResponsiveDesign,
|
[SuperBlocks.RespWebDesign]: ResponsiveDesign,
|
||||||
[SuperBlocks.JsAlgoDataStruct]: JavaScriptIcon,
|
[SuperBlocks.JsAlgoDataStruct]: JavaScriptIcon,
|
||||||
[SuperBlocks.FrontEndDevLibs]: ReactIcon,
|
[SuperBlocks.FrontEndDevLibs]: ReactIcon,
|
||||||
|
@ -595,7 +595,9 @@ blockquote .small {
|
|||||||
border-color: #31708f;
|
border-color: #31708f;
|
||||||
}
|
}
|
||||||
.alert .btn:hover,
|
.alert .btn:hover,
|
||||||
.alert .btn:focus {
|
.alert .btn:focus,
|
||||||
|
.alert a:hover,
|
||||||
|
.alert a:hover {
|
||||||
background-color: #31708f;
|
background-color: #31708f;
|
||||||
color: #d9edf7;
|
color: #d9edf7;
|
||||||
border-color: #31708f;
|
border-color: #31708f;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { SuperBlocks } from '../../../config/certification-settings';
|
import { SuperBlocks } from '../../../config/certification-settings';
|
||||||
import envData from '../../../config/env.json';
|
import envData from '../../../config/env.json';
|
||||||
|
|
||||||
const { showNewCurriculum } = envData;
|
const { showNewCurriculum, showUpcomingChanges } = envData;
|
||||||
|
|
||||||
const responsiveWebBase =
|
const responsiveWebBase =
|
||||||
'/learn/responsive-web-design/responsive-web-design-projects';
|
'/learn/responsive-web-design/responsive-web-design-projects';
|
||||||
@ -729,7 +729,8 @@ function getResponsiveWebDesignPath(
|
|||||||
project: string,
|
project: string,
|
||||||
{ showNewCurriculum }: { showNewCurriculum: boolean }
|
{ showNewCurriculum }: { showNewCurriculum: boolean }
|
||||||
) {
|
) {
|
||||||
return showNewCurriculum
|
// TODO: for the hard launch, the conditional should just be `showNewCurriculum`
|
||||||
|
return showNewCurriculum && showUpcomingChanges
|
||||||
? `${responsiveWeb22Base}/${project}-project/${project}`
|
? `${responsiveWeb22Base}/${project}-project/${project}`
|
||||||
: `${responsiveWebBase}/${project}/`;
|
: `${responsiveWebBase}/${project}/`;
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,29 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { useTranslation } from 'react-i18next';
|
||||||
|
import { SuperBlocks } from '../../../../../config/certification-settings';
|
||||||
|
import { Link } from '../../../components/helpers';
|
||||||
|
import { Alert } from '@freecodecamp/react-bootstrap';
|
||||||
|
|
||||||
|
interface LegacyLinksProps {
|
||||||
|
superBlock: SuperBlocks;
|
||||||
|
}
|
||||||
|
|
||||||
|
function LegacyLinks({ superBlock }: LegacyLinksProps): JSX.Element {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{superBlock === SuperBlocks.RespWebDesignNew && (
|
||||||
|
<Alert bsStyle='info'>
|
||||||
|
<p>
|
||||||
|
{t('intro:misc-text.viewing-upcoming-change')}{' '}
|
||||||
|
<Link sameTab={false} to={`/learn/`}>
|
||||||
|
{t('intro:misc-text.go-back-to-learn')}
|
||||||
|
</Link>
|
||||||
|
</p>
|
||||||
|
</Alert>
|
||||||
|
)}
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default LegacyLinks;
|
@ -3,6 +3,11 @@
|
|||||||
font-size: 1.17rem;
|
font-size: 1.17rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.super-block-intro-page .alert p {
|
||||||
|
font-family: inherit;
|
||||||
|
font-size: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
.big-subheading {
|
.big-subheading {
|
||||||
font-size: 2rem;
|
font-size: 2rem;
|
||||||
overflow-wrap: break-word;
|
overflow-wrap: break-word;
|
||||||
|
@ -27,6 +27,7 @@ import {
|
|||||||
import { MarkdownRemark, AllChallengeNode, User } from '../../redux/prop-types';
|
import { MarkdownRemark, AllChallengeNode, User } from '../../redux/prop-types';
|
||||||
import Block from './components/block';
|
import Block from './components/block';
|
||||||
import CertChallenge from './components/cert-challenge';
|
import CertChallenge from './components/cert-challenge';
|
||||||
|
import LegacyLinks from './components/legacy-links';
|
||||||
import SuperBlockIntro from './components/super-block-intro';
|
import SuperBlockIntro from './components/super-block-intro';
|
||||||
import { resetExpansion, toggleBlock } from './redux';
|
import { resetExpansion, toggleBlock } from './redux';
|
||||||
|
|
||||||
@ -196,8 +197,9 @@ const SuperBlockIntroductionPage = (props: SuperBlockProp) => {
|
|||||||
<Row className='super-block-intro-page'>
|
<Row className='super-block-intro-page'>
|
||||||
<Col md={8} mdOffset={2} sm={10} smOffset={1} xs={12}>
|
<Col md={8} mdOffset={2} sm={10} smOffset={1} xs={12}>
|
||||||
<Spacer size={2} />
|
<Spacer size={2} />
|
||||||
|
<LegacyLinks superBlock={superBlock} />
|
||||||
<SuperBlockIntro superBlock={superBlock} />
|
<SuperBlockIntro superBlock={superBlock} />
|
||||||
{superBlock === 'relational-databases' && isSignedIn && (
|
{superBlock === SuperBlocks.RelationalDb && isSignedIn && (
|
||||||
<WebhookToken isSuperBlockPage={true} />
|
<WebhookToken isSuperBlockPage={true} />
|
||||||
)}
|
)}
|
||||||
<Spacer size={2} />
|
<Spacer size={2} />
|
||||||
|
@ -18,6 +18,7 @@ export const certTypes = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export enum SuperBlocks {
|
export enum SuperBlocks {
|
||||||
|
RespWebDesignNew = '2022/responsive-web-design',
|
||||||
RespWebDesign = 'responsive-web-design',
|
RespWebDesign = 'responsive-web-design',
|
||||||
JsAlgoDataStruct = 'javascript-algorithms-and-data-structures',
|
JsAlgoDataStruct = 'javascript-algorithms-and-data-structures',
|
||||||
FrontEndDevLibs = 'front-end-development-libraries',
|
FrontEndDevLibs = 'front-end-development-libraries',
|
||||||
|
@ -274,10 +274,17 @@ function populateTestsForLang({ lang, challenges, meta }) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
it(`${superBlock} should have the same order in every meta`, function () {
|
it(`${superBlock} should have the same order in every meta`, function () {
|
||||||
const firstOrder = getSuperOrder(filteredMeta[0].superBlock);
|
const firstOrder = getSuperOrder(filteredMeta[0].superBlock, {
|
||||||
|
showNewCurriculum: process.env.SHOW_NEW_CURRICULUM
|
||||||
|
});
|
||||||
assert.isNumber(firstOrder);
|
assert.isNumber(firstOrder);
|
||||||
assert.isTrue(
|
assert.isTrue(
|
||||||
filteredMeta.every(el => getSuperOrder(el.superBlock) === firstOrder),
|
filteredMeta.every(
|
||||||
|
el =>
|
||||||
|
getSuperOrder(el.superBlock, {
|
||||||
|
showNewCurriculum: process.env.SHOW_NEW_CURRICULUM
|
||||||
|
}) === firstOrder
|
||||||
|
),
|
||||||
'The superOrder properties are mismatched.'
|
'The superOrder properties are mismatched.'
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
@ -36,7 +36,7 @@ const superBlockToOrder = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const superBlockToNewOrder = {
|
const superBlockToNewOrder = {
|
||||||
'2022/responsive-web-design': 0,
|
'responsive-web-design': 0,
|
||||||
'javascript-algorithms-and-data-structures': 1,
|
'javascript-algorithms-and-data-structures': 1,
|
||||||
'front-end-development-libraries': 2,
|
'front-end-development-libraries': 2,
|
||||||
'data-visualization': 3,
|
'data-visualization': 3,
|
||||||
@ -48,7 +48,7 @@ const superBlockToNewOrder = {
|
|||||||
'information-security': 9,
|
'information-security': 9,
|
||||||
'machine-learning-with-python': 10,
|
'machine-learning-with-python': 10,
|
||||||
'coding-interview-prep': 11,
|
'coding-interview-prep': 11,
|
||||||
'responsive-web-design': 12
|
'2022/responsive-web-design': 12
|
||||||
};
|
};
|
||||||
|
|
||||||
function getSuperOrder(
|
function getSuperOrder(
|
||||||
|
@ -38,7 +38,7 @@ describe('getSuperOrder', () => {
|
|||||||
it('returns a different order if passed the option showNewCurriculum: true', () => {
|
it('returns a different order if passed the option showNewCurriculum: true', () => {
|
||||||
expect.assertions(13);
|
expect.assertions(13);
|
||||||
expect(
|
expect(
|
||||||
getSuperOrder('2022/responsive-web-design', { showNewCurriculum: true })
|
getSuperOrder('responsive-web-design', { showNewCurriculum: true })
|
||||||
).toBe(0);
|
).toBe(0);
|
||||||
expect(
|
expect(
|
||||||
getSuperOrder('javascript-algorithms-and-data-structures', {
|
getSuperOrder('javascript-algorithms-and-data-structures', {
|
||||||
@ -82,7 +82,7 @@ describe('getSuperOrder', () => {
|
|||||||
getSuperOrder('coding-interview-prep', { showNewCurriculum: true })
|
getSuperOrder('coding-interview-prep', { showNewCurriculum: true })
|
||||||
).toBe(11);
|
).toBe(11);
|
||||||
expect(
|
expect(
|
||||||
getSuperOrder('responsive-web-design', { showNewCurriculum: true })
|
getSuperOrder('2022/responsive-web-design', { showNewCurriculum: true })
|
||||||
).toBe(12);
|
).toBe(12);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
Reference in New Issue
Block a user