mirror of
https://github.com/freeCodeCamp/freeCodeCamp.git
synced 2026-05-28 18:26:54 +00:00
refactor: blockType -> blockLabel (#62548)
Co-authored-by: Huyen Nguyen <25715018+huyenltnguyen@users.noreply.github.com>
This commit is contained in:
committed by
GitHub
parent
808d0d0d74
commit
27a54624c3
@@ -73,7 +73,7 @@ exports.createPages = async function createPages({
|
||||
id
|
||||
challenge {
|
||||
block
|
||||
blockType
|
||||
blockLabel
|
||||
blockLayout
|
||||
certification
|
||||
challengeType
|
||||
@@ -310,7 +310,7 @@ exports.createSchemaCustomization = ({ actions }) => {
|
||||
block: String
|
||||
blockId: String
|
||||
blockLayout: String
|
||||
blockType: String
|
||||
blockLabel: String
|
||||
certification: String
|
||||
challengeFiles: [FileContents]
|
||||
challengeOrder: Int
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { HandlerProps } from 'react-reflex';
|
||||
import { SuperBlocks } from '../../../shared-dist/config/curriculum';
|
||||
import type { Chapter } from '../../../shared-dist/config/chapters';
|
||||
import { BlockLayouts, BlockTypes } from '../../../shared-dist/config/blocks';
|
||||
import { BlockLayouts, BlockLabel } from '../../../shared-dist/config/blocks';
|
||||
import type { ChallengeFile, Ext } from '../../../shared-dist/utils/polyvinyl';
|
||||
import { type CertTitle } from '../../config/cert-and-project-map';
|
||||
import { UserThemes } from './types';
|
||||
@@ -188,7 +188,7 @@ type InteractiveEditorNodule = {
|
||||
export type ChallengeNode = {
|
||||
challenge: {
|
||||
block: string;
|
||||
blockType: BlockTypes;
|
||||
blockLabel: BlockLabel;
|
||||
blockLayout: BlockLayouts;
|
||||
certification: string;
|
||||
challengeOrder: number;
|
||||
@@ -514,7 +514,6 @@ export type ChallengeMeta = {
|
||||
superBlock: SuperBlocks | 'daily-coding-challenge';
|
||||
title?: string;
|
||||
challengeType?: number;
|
||||
blockType?: BlockTypes;
|
||||
helpCategory: string;
|
||||
disableLoopProtectTests: boolean;
|
||||
disableLoopProtectPreview: boolean;
|
||||
|
||||
@@ -28,7 +28,6 @@ import {
|
||||
initTests
|
||||
} from '../redux/actions';
|
||||
import { isChallengeCompletedSelector } from '../redux/selectors';
|
||||
import { BlockTypes } from '../../../../../shared-dist/config/blocks';
|
||||
import { getChallengePaths } from '../utils/challenge-paths';
|
||||
import Scene from '../components/scene/scene';
|
||||
import MultipleChoiceQuestions from '../components/multiple-choice-questions';
|
||||
@@ -90,7 +89,6 @@ const ShowGeneric = ({
|
||||
assignments,
|
||||
bilibiliIds,
|
||||
block,
|
||||
blockType,
|
||||
description,
|
||||
nodules,
|
||||
explanation,
|
||||
@@ -133,7 +131,6 @@ const ShowGeneric = ({
|
||||
title,
|
||||
challengeType,
|
||||
helpCategory,
|
||||
blockType,
|
||||
...challengePaths
|
||||
});
|
||||
challengeMounted(challengeMeta.id);
|
||||
@@ -310,7 +307,7 @@ const ShowGeneric = ({
|
||||
)}
|
||||
|
||||
<Button block={true} variant='primary' onClick={handleSubmit}>
|
||||
{blockType === BlockTypes.review
|
||||
{questions.length == 0
|
||||
? t('buttons.submit')
|
||||
: t('buttons.check-answer')}
|
||||
</Button>
|
||||
@@ -349,7 +346,6 @@ export const query = graphql`
|
||||
cid
|
||||
}
|
||||
block
|
||||
blockType
|
||||
challengeType
|
||||
description
|
||||
nodules {
|
||||
|
||||
@@ -258,7 +258,6 @@ export default function completionEpic(action$, state$) {
|
||||
nextChallengePath,
|
||||
challengeType,
|
||||
superBlock,
|
||||
blockType,
|
||||
block,
|
||||
module,
|
||||
blockHashSlug
|
||||
@@ -296,7 +295,7 @@ export default function completionEpic(action$, state$) {
|
||||
|
||||
const donationData =
|
||||
chapterBasedSuperBlocks.includes(superBlock) &&
|
||||
blockType !== 'review' &&
|
||||
challengeType !== challengeTypes.review &&
|
||||
isModuleNewlyCompletedSelector(state)
|
||||
? { module, superBlock }
|
||||
: !chapterBasedSuperBlocks.includes(superBlock) &&
|
||||
|
||||
@@ -21,7 +21,6 @@ const initialState = {
|
||||
superBlock: '',
|
||||
block: '',
|
||||
blockHashSlug: '/',
|
||||
blockType: '',
|
||||
id: '',
|
||||
isLastChallengeInBlock: false,
|
||||
nextChallengePath: '/',
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import React from 'react';
|
||||
import { isEmpty } from 'lodash';
|
||||
|
||||
import { BlockTypes } from '../../../../../shared-dist/config/blocks';
|
||||
import type { BlockLabel as BlockLabelType } from '../../../../../shared-dist/config/blocks';
|
||||
import { ProgressBar } from '../../../components/Progress/progress-bar';
|
||||
import DropDown from '../../../assets/icons/dropdown';
|
||||
import CheckMark from './check-mark';
|
||||
@@ -11,7 +11,7 @@ import BlockIntros from './block-intros';
|
||||
interface BlockHeaderProps {
|
||||
blockDashed: string;
|
||||
blockTitle: string;
|
||||
blockType: BlockTypes | null;
|
||||
blockLabel: BlockLabelType | null;
|
||||
courseCompletionStatus: string;
|
||||
completedCount: number;
|
||||
handleClick: () => void;
|
||||
@@ -24,7 +24,7 @@ interface BlockHeaderProps {
|
||||
function BlockHeader({
|
||||
blockDashed,
|
||||
blockTitle,
|
||||
blockType,
|
||||
blockLabel,
|
||||
completedCount,
|
||||
courseCompletionStatus,
|
||||
handleClick,
|
||||
@@ -44,7 +44,7 @@ function BlockHeader({
|
||||
>
|
||||
<span className='block-header-button-text map-title'>
|
||||
<CheckMark isCompleted={isCompleted} />
|
||||
{blockType && <BlockLabel blockType={blockType} />}
|
||||
{blockLabel && <BlockLabel blockLabel={blockLabel} />}
|
||||
<span>
|
||||
{blockTitle}
|
||||
<span className='sr-only'>, {courseCompletionStatus}</span>
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
import React from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { BlockTypes } from '../../../../../shared-dist/config/blocks';
|
||||
import { BlockLabel as BlockLabelType } from '../../../../../shared-dist/config/blocks';
|
||||
|
||||
interface BlockLabelProps {
|
||||
blockType: BlockTypes;
|
||||
blockLabel: BlockLabelType;
|
||||
}
|
||||
|
||||
function BlockLabel({ blockType }: BlockLabelProps): JSX.Element {
|
||||
function BlockLabel({ blockLabel }: BlockLabelProps): JSX.Element {
|
||||
const { t } = useTranslation();
|
||||
|
||||
return (
|
||||
<div className={`block-label block-label-${blockType}`}>
|
||||
{t(`learn.block-type.${blockType}`)}
|
||||
<div className={`block-label block-label-${blockLabel}`}>
|
||||
{t(`learn.block-type.${blockLabel}`)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ import {
|
||||
import { isAuditedSuperBlock } from '../../../../../shared-dist/utils/is-audited';
|
||||
import {
|
||||
BlockLayouts,
|
||||
BlockTypes
|
||||
BlockLabel
|
||||
} from '../../../../../shared-dist/config/blocks';
|
||||
import { Block } from './block';
|
||||
|
||||
@@ -27,11 +27,11 @@ vi.mock('../../../utils/get-words');
|
||||
|
||||
const defaultProps = {
|
||||
block: 'test-block',
|
||||
blockType: null,
|
||||
blockLabel: null,
|
||||
challenges: [
|
||||
{
|
||||
block: 'testblock',
|
||||
blockType: BlockTypes.lab,
|
||||
blockLabel: BlockLabel.lab,
|
||||
blockLayout: BlockLayouts.ChallengeGrid,
|
||||
certification: 'mockCertification',
|
||||
challengeOrder: 1,
|
||||
|
||||
@@ -22,7 +22,7 @@ import { makeExpandedBlockSelector, toggleBlock } from '../redux';
|
||||
import { isProjectBased } from '../../../utils/curriculum-layout';
|
||||
import {
|
||||
BlockLayouts,
|
||||
BlockTypes
|
||||
BlockLabel as BlockLabelType
|
||||
} from '../../../../../shared-dist/config/blocks';
|
||||
import CheckMark from './check-mark';
|
||||
import {
|
||||
@@ -67,7 +67,7 @@ interface ChallengeInfo {
|
||||
|
||||
interface BlockProps {
|
||||
block: string;
|
||||
blockType: BlockTypes | null;
|
||||
blockLabel: BlockLabelType | null;
|
||||
challenges: ChallengeInfo[];
|
||||
completedChallengeIds: string[];
|
||||
isExpanded: boolean;
|
||||
@@ -108,7 +108,7 @@ export class Block extends Component<BlockProps> {
|
||||
render(): ReactNode {
|
||||
const {
|
||||
block,
|
||||
blockType,
|
||||
blockLabel,
|
||||
completedChallengeIds,
|
||||
challenges,
|
||||
isExpanded,
|
||||
@@ -187,7 +187,7 @@ export class Block extends Component<BlockProps> {
|
||||
>
|
||||
<div className='block-header'>
|
||||
<h3 className='big-block-title'>{blockTitle}</h3>
|
||||
{blockType && <BlockLabel blockType={blockType} />}
|
||||
{blockLabel && <BlockLabel blockLabel={blockLabel} />}
|
||||
{!isAudited && (
|
||||
<div className='block-cta-wrapper'>
|
||||
<Link
|
||||
@@ -243,7 +243,7 @@ export class Block extends Component<BlockProps> {
|
||||
>
|
||||
<div className='block-header'>
|
||||
<h3 className='big-block-title'>{blockTitle}</h3>
|
||||
{blockType && <BlockLabel blockType={blockType} />}
|
||||
{blockLabel && <BlockLabel blockLabel={blockLabel} />}
|
||||
{!isAudited && (
|
||||
<div className='block-cta-wrapper'>
|
||||
<Link
|
||||
@@ -276,7 +276,7 @@ export class Block extends Component<BlockProps> {
|
||||
<BlockHeader
|
||||
blockDashed={block}
|
||||
blockTitle={blockTitle}
|
||||
blockType={blockType}
|
||||
blockLabel={blockLabel}
|
||||
completedCount={completedCount}
|
||||
courseCompletionStatus={courseCompletionStatus()}
|
||||
handleClick={this.handleBlockClick}
|
||||
@@ -323,7 +323,7 @@ export class Block extends Component<BlockProps> {
|
||||
<BlockHeader
|
||||
blockDashed={block}
|
||||
blockTitle={blockTitle}
|
||||
blockType={blockType}
|
||||
blockLabel={blockLabel}
|
||||
completedCount={completedCount}
|
||||
courseCompletionStatus={courseCompletionStatus()}
|
||||
handleClick={this.handleBlockClick}
|
||||
@@ -387,7 +387,7 @@ export class Block extends Component<BlockProps> {
|
||||
)}
|
||||
</div>
|
||||
<div className='title-wrapper map-title'>
|
||||
{blockType && <BlockLabel blockType={blockType} />}
|
||||
{blockLabel && <BlockLabel blockLabel={blockLabel} />}
|
||||
<h3 className='block-grid-title'>
|
||||
<Link
|
||||
className='block-header'
|
||||
@@ -427,7 +427,7 @@ export class Block extends Component<BlockProps> {
|
||||
<BlockHeader
|
||||
blockDashed={block}
|
||||
blockTitle={blockTitle}
|
||||
blockType={blockType}
|
||||
blockLabel={blockLabel}
|
||||
completedCount={completedCount}
|
||||
courseCompletionStatus={courseCompletionStatus()}
|
||||
handleClick={this.handleBlockClick}
|
||||
|
||||
@@ -10,7 +10,7 @@ import { ChapterIcon } from '../../../assets/chapter-icon';
|
||||
import { type Chapter } from '../../../../../shared-dist/config/chapters';
|
||||
import {
|
||||
BlockLayouts,
|
||||
BlockTypes
|
||||
BlockLabel
|
||||
} from '../../../../../shared-dist/config/blocks';
|
||||
import { FsdChapters } from '../../../../../shared-dist/config/chapters';
|
||||
import { type Module } from '../../../../../shared-dist/config/modules';
|
||||
@@ -44,7 +44,7 @@ interface ModuleProps {
|
||||
interface Challenge {
|
||||
id: string;
|
||||
block: string;
|
||||
blockType: BlockTypes;
|
||||
blockLabel: BlockLabel;
|
||||
title: string;
|
||||
fields: { slug: string };
|
||||
dashedName: string;
|
||||
@@ -162,7 +162,7 @@ const LinkBlock = ({
|
||||
<li className='link-block'>
|
||||
<Block
|
||||
block={challenges[0].block}
|
||||
blockType={challenges[0].blockType}
|
||||
blockLabel={challenges[0].blockLabel}
|
||||
challenges={challenges}
|
||||
superBlock={superBlock}
|
||||
/>
|
||||
@@ -226,7 +226,7 @@ export const SuperBlockAccordion = ({
|
||||
|
||||
return {
|
||||
name: block,
|
||||
blockType: blockChallenges[0]?.blockType ?? null,
|
||||
blockLabel: blockChallenges[0]?.blockLabel ?? null,
|
||||
challenges: blockChallenges
|
||||
};
|
||||
});
|
||||
@@ -358,7 +358,7 @@ export const SuperBlockAccordion = ({
|
||||
<li key={block.name}>
|
||||
<Block
|
||||
block={block.name}
|
||||
blockType={block.blockType}
|
||||
blockLabel={block.blockLabel}
|
||||
challenges={block.challenges}
|
||||
superBlock={superBlock}
|
||||
/>
|
||||
|
||||
@@ -36,7 +36,7 @@ import { CertTitle, liveCerts } from '../../../config/cert-and-project-map';
|
||||
import { superBlockToCertMap } from '../../../../shared-dist/config/certification-settings';
|
||||
import {
|
||||
BlockLayouts,
|
||||
BlockTypes
|
||||
BlockLabel
|
||||
} from '../../../../shared-dist/config/blocks';
|
||||
import Block from './components/block';
|
||||
import CertChallenge from './components/cert-challenge';
|
||||
@@ -59,7 +59,7 @@ type ChallengeNode = {
|
||||
fields: { slug: string; blockName: string };
|
||||
id: string;
|
||||
block: string;
|
||||
blockType: BlockTypes;
|
||||
blockLabel: BlockLabel;
|
||||
challengeType: number;
|
||||
title: string;
|
||||
order: number;
|
||||
@@ -287,13 +287,13 @@ const SuperBlockIntroductionPage = (props: SuperBlockProps) => {
|
||||
const blockChallenges = superBlockChallenges.filter(
|
||||
c => c.block === block
|
||||
);
|
||||
const blockType = blockChallenges[0].blockType;
|
||||
const blockLabel = blockChallenges[0].blockLabel;
|
||||
|
||||
return (
|
||||
<Block
|
||||
key={block}
|
||||
block={block}
|
||||
blockType={blockType}
|
||||
blockLabel={blockLabel}
|
||||
challenges={blockChallenges}
|
||||
superBlock={superBlock}
|
||||
/>
|
||||
@@ -360,7 +360,7 @@ export const query = graphql`
|
||||
}
|
||||
id
|
||||
block
|
||||
blockType
|
||||
blockLabel
|
||||
challengeType
|
||||
title
|
||||
order
|
||||
|
||||
@@ -129,7 +129,7 @@ const quizJoi = Joi.object().keys({
|
||||
const schema = Joi.object().keys({
|
||||
block: Joi.string().regex(slugRE).required(),
|
||||
blockId: Joi.objectId(),
|
||||
blockType: Joi.when('superBlock', {
|
||||
blockLabel: Joi.when('superBlock', {
|
||||
is: [...chapterBasedSuperBlocks, ...catalogSuperBlocks],
|
||||
then: Joi.valid(
|
||||
'workshop',
|
||||
|
||||
@@ -15,7 +15,7 @@ const schema = Joi.object()
|
||||
'legacy-link',
|
||||
'legacy-challenge-grid'
|
||||
).required(),
|
||||
blockType: Joi.valid(
|
||||
blockLabel: Joi.valid(
|
||||
'workshop',
|
||||
'lab',
|
||||
'lecture',
|
||||
|
||||
@@ -70,7 +70,7 @@ const dummyUnfinishedSuperBlock = {
|
||||
const dummyBlockMeta = {
|
||||
name: 'Test Block',
|
||||
blockLayout: 'challenge-list',
|
||||
blockType: 'workshop',
|
||||
blockLabel: 'workshop',
|
||||
isUpcomingChange: false,
|
||||
dashedName: 'test-block',
|
||||
superBlock: 'responsive-web-design',
|
||||
@@ -124,7 +124,7 @@ const expectedChallengeProperties = {
|
||||
isLastChallengeInBlock: expect.any(Boolean),
|
||||
block: dummyBlockMeta.dashedName,
|
||||
blockLayout: dummyBlockMeta.blockLayout,
|
||||
blockType: dummyBlockMeta.blockType,
|
||||
blockLabel: dummyBlockMeta.blockLabel,
|
||||
hasEditableBoundaries: dummyBlockMeta.hasEditableBoundaries,
|
||||
order: dummyBlockMeta.order,
|
||||
description: '',
|
||||
|
||||
@@ -156,7 +156,7 @@ export function addMetaToChallenge(
|
||||
|
||||
// Add basic meta properties
|
||||
challenge.block = meta.dashedName;
|
||||
challenge.blockType = meta.blockType;
|
||||
challenge.blockLabel = meta.blockLabel;
|
||||
challenge.blockLayout = meta.blockLayout;
|
||||
challenge.hasEditableBoundaries = !!meta.hasEditableBoundaries;
|
||||
challenge.order = meta.order;
|
||||
|
||||
@@ -132,7 +132,7 @@ export type Challenge = {
|
||||
instructions?: string;
|
||||
questions?: string[];
|
||||
block?: string;
|
||||
blockType?: string;
|
||||
blockLabel?: string;
|
||||
blockLayout?: string;
|
||||
hasEditableBoundaries?: boolean;
|
||||
order?: number;
|
||||
@@ -165,7 +165,7 @@ export interface BlockStructure {
|
||||
disableLoopProtectTests?: boolean;
|
||||
disableLoopProtectPreview?: boolean;
|
||||
blockLayout: string;
|
||||
blockType: string;
|
||||
blockLabel: string;
|
||||
challengeOrder: Challenge[];
|
||||
dashedName: string;
|
||||
isUpcomingChange?: boolean;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Build a Cat Blog Page",
|
||||
"blockType": "workshop",
|
||||
"blockLabel": "workshop",
|
||||
"blockLayout": "challenge-grid",
|
||||
"isUpcomingChange": true,
|
||||
"usesMultifileEditor": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Build a Cat Photo App",
|
||||
"blockType": "workshop",
|
||||
"blockLabel": "workshop",
|
||||
"blockLayout": "challenge-grid",
|
||||
"isUpcomingChange": true,
|
||||
"usesMultifileEditor": true,
|
||||
|
||||
@@ -7,5 +7,5 @@
|
||||
"challengeOrder": [
|
||||
{ "id": "68d2a85831f330ab9c100e87", "title": "Dialogue 1: I'm Tom" }
|
||||
],
|
||||
"blockType": "learn"
|
||||
"blockLabel": "learn"
|
||||
}
|
||||
|
||||
@@ -19,5 +19,5 @@
|
||||
"title": "How to Set Up the Spanish Keyboard on Mobile"
|
||||
}
|
||||
],
|
||||
"blockType": "learn"
|
||||
"blockLabel": "learn"
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"dashedName": "es-a1-learn-greetings-during-the-day",
|
||||
"helpCategory": "English",
|
||||
"blockLayout": "challenge-grid",
|
||||
"blockType": "learn",
|
||||
"blockLabel": "learn",
|
||||
"challengeOrder": [
|
||||
{ "id": "68c488abd71a3e27190965e0", "title": "Task 1" },
|
||||
{ "id": "68c84d44d91406c37b3ad73f", "title": "Task 2" },
|
||||
|
||||
@@ -5,5 +5,5 @@
|
||||
"helpCategory": "English",
|
||||
"blockLayout": "challenge-grid",
|
||||
"challengeOrder": [{ "id": "68dc7593a29e5c7621d873ee", "title": "Task 1" }],
|
||||
"blockType": "learn"
|
||||
"blockLabel": "learn"
|
||||
}
|
||||
|
||||
@@ -5,5 +5,5 @@
|
||||
"helpCategory": "English",
|
||||
"blockLayout": "challenge-grid",
|
||||
"challengeOrder": [{ "id": "68dc74dc55e05b6ee15b743d", "title": "Task 1" }],
|
||||
"blockType": "learn"
|
||||
"blockLabel": "learn"
|
||||
}
|
||||
|
||||
@@ -5,5 +5,5 @@
|
||||
"helpCategory": "English",
|
||||
"blockLayout": "challenge-grid",
|
||||
"challengeOrder": [{ "id": "68dc747c75837c6bb82aeeb8", "title": "Task 1" }],
|
||||
"blockType": "learn"
|
||||
"blockLabel": "learn"
|
||||
}
|
||||
|
||||
@@ -5,5 +5,5 @@
|
||||
"helpCategory": "English",
|
||||
"blockLayout": "challenge-grid",
|
||||
"challengeOrder": [{ "id": "68dc74a6f1c8c46cfd4af3f4", "title": "Task 1" }],
|
||||
"blockType": "learn"
|
||||
"blockLabel": "learn"
|
||||
}
|
||||
|
||||
@@ -7,5 +7,5 @@
|
||||
"challengeOrder": [
|
||||
{ "id": "68d2a874b217f0aedcf331d5", "title": "Dialogue 1: I'm Tom" }
|
||||
],
|
||||
"blockType": "learn"
|
||||
"blockLabel": "learn"
|
||||
}
|
||||
|
||||
@@ -5,5 +5,5 @@
|
||||
"helpCategory": "English",
|
||||
"blockLayout": "challenge-grid",
|
||||
"challengeOrder": [{ "id": "68dc75b0fe65b57754913412", "title": "Task 1" }],
|
||||
"blockType": "practice"
|
||||
"blockLabel": "practice"
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"dashedName": "es-a1-practice-greetings-and-farewells",
|
||||
"helpCategory": "English",
|
||||
"blockLayout": "challenge-grid",
|
||||
"blockType": "practice",
|
||||
"blockLabel": "practice",
|
||||
"challengeOrder": [
|
||||
{ "id": "68c850c5eb642cc96ed86544", "title": "Task 1" },
|
||||
{ "id": "68de9f4c14f4d1335059da98", "title": "Task 2" },
|
||||
|
||||
@@ -5,5 +5,5 @@
|
||||
"helpCategory": "English",
|
||||
"blockLayout": "challenge-grid",
|
||||
"challengeOrder": [{ "id": "68dc7500da504f7042474b20", "title": "Task 1" }],
|
||||
"blockType": "practice"
|
||||
"blockLabel": "practice"
|
||||
}
|
||||
|
||||
@@ -7,5 +7,5 @@
|
||||
"challengeOrder": [
|
||||
{ "id": "68d2a8fa725f6db0b7215411", "title": "Dialogue 1: I'm Tom" }
|
||||
],
|
||||
"blockType": "quiz"
|
||||
"blockLabel": "quiz"
|
||||
}
|
||||
|
||||
@@ -7,5 +7,5 @@
|
||||
"challengeOrder": [
|
||||
{ "id": "68dc75ee867ccc79d18df2ef", "title": "First Questions Quiz" }
|
||||
],
|
||||
"blockType": "quiz"
|
||||
"blockLabel": "quiz"
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"dashedName": "es-a1-quiz-greetings-and-farewells",
|
||||
"helpCategory": "English",
|
||||
"blockLayout": "link",
|
||||
"blockType": "quiz",
|
||||
"blockLabel": "quiz",
|
||||
"challengeOrder": [
|
||||
{
|
||||
"id": "68c8510f4a9c00ca2a67160c",
|
||||
|
||||
@@ -7,5 +7,5 @@
|
||||
"challengeOrder": [
|
||||
{ "id": "68dc7558bca0aa734dba9c05", "title": "Introducing Yourself Quiz" }
|
||||
],
|
||||
"blockType": "quiz"
|
||||
"blockLabel": "quiz"
|
||||
}
|
||||
|
||||
@@ -5,5 +5,5 @@
|
||||
"helpCategory": "English",
|
||||
"blockLayout": "link",
|
||||
"challengeOrder": [{ "id": "68dc75d172549d787975d2fc", "title": "Task 1" }],
|
||||
"blockType": "review"
|
||||
"blockLabel": "review"
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"dashedName": "es-a1-review-greetings-and-farewells",
|
||||
"helpCategory": "English",
|
||||
"blockLayout": "link",
|
||||
"blockType": "review",
|
||||
"blockLabel": "review",
|
||||
"challengeOrder": [
|
||||
{ "id": "68c850ed23d494c9be5cb22a", "title": "Grammar Highlights" },
|
||||
{ "id": "68c994e8517cd6bde390e923", "title": "Glossary" }
|
||||
|
||||
@@ -7,5 +7,5 @@
|
||||
"challengeOrder": [
|
||||
{ "id": "68dc753010b6b271ac564e93", "title": "Dialogue 1: I'm Tom" }
|
||||
],
|
||||
"blockType": "review"
|
||||
"blockLabel": "review"
|
||||
}
|
||||
|
||||
@@ -5,5 +5,5 @@
|
||||
"helpCategory": "English",
|
||||
"blockLayout": "challenge-grid",
|
||||
"challengeOrder": [{ "id": "68dc7578ad62ca74e21c23e0", "title": "Task 1" }],
|
||||
"blockType": "warm-up"
|
||||
"blockLabel": "warm-up"
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"name": "Greetings and Farewells Basics",
|
||||
"dashedName": "es-a1-warm-up-greetings-and-farewells-basics",
|
||||
"isUpcomingChange": true,
|
||||
"blockType": "warm-up",
|
||||
"blockLabel": "warm-up",
|
||||
"blockLayout": "challenge-grid",
|
||||
"helpCategory": "English",
|
||||
"challengeOrder": [
|
||||
|
||||
@@ -5,5 +5,5 @@
|
||||
"helpCategory": "English",
|
||||
"blockLayout": "challenge-grid",
|
||||
"challengeOrder": [{ "id": "68dc7452147bb2678bccc29a", "title": "Task 1" }],
|
||||
"blockType": "warm-up"
|
||||
"blockLabel": "warm-up"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Build an Event Hub",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"isUpcomingChange": true,
|
||||
"usesMultifileEditor": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Back End Development and APIs Certification Exam",
|
||||
"blockType": "exam",
|
||||
"blockLabel": "exam",
|
||||
"blockLayout": "link",
|
||||
"isUpcomingChange": true,
|
||||
"dashedName": "exam-back-end-development-and-apis-certification",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Certified Full Stack Developer Exam",
|
||||
"blockType": "exam",
|
||||
"blockLabel": "exam",
|
||||
"blockLayout": "link",
|
||||
"isUpcomingChange": true,
|
||||
"dashedName": "exam-certified-full-stack-developer",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Front End Development Libraries Certification Exam",
|
||||
"blockType": "exam",
|
||||
"blockLabel": "exam",
|
||||
"blockLayout": "link",
|
||||
"isUpcomingChange": true,
|
||||
"dashedName": "exam-front-end-development-libraries-certification",
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"isUpcomingChange": true,
|
||||
"dashedName": "exam-javascript-certification",
|
||||
"helpCategory": "JavaScript",
|
||||
"blockType": "exam",
|
||||
"blockLabel": "exam",
|
||||
"blockLayout": "link",
|
||||
"challengeOrder": [
|
||||
{
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Python Certification Exam",
|
||||
"blockType": "exam",
|
||||
"blockLabel": "exam",
|
||||
"blockLayout": "link",
|
||||
"isUpcomingChange": true,
|
||||
"dashedName": "exam-python-certification",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Relational Databases Certification Exam",
|
||||
"blockType": "exam",
|
||||
"blockLabel": "exam",
|
||||
"blockLayout": "link",
|
||||
"isUpcomingChange": true,
|
||||
"dashedName": "exam-relational-databases-certification",
|
||||
|
||||
@@ -10,5 +10,5 @@
|
||||
"title": "Responsive Web Design Certification Exam"
|
||||
}
|
||||
],
|
||||
"blockType": "exam"
|
||||
"blockLabel": "exam"
|
||||
}
|
||||
|
||||
@@ -10,5 +10,5 @@
|
||||
}
|
||||
],
|
||||
"blockLayout": "link",
|
||||
"blockType": "lab"
|
||||
"blockLabel": "lab"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Build an All-True Property Validator",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"isUpcomingChange": false,
|
||||
"usesMultifileEditor": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Build an Availability Table",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"isUpcomingChange": false,
|
||||
"usesMultifileEditor": true,
|
||||
|
||||
@@ -10,6 +10,6 @@
|
||||
}
|
||||
],
|
||||
"helpCategory": "JavaScript",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link"
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"isUpcomingChange": true,
|
||||
"dashedName": "lab-bisection-method",
|
||||
"blockLayout": "link",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"helpCategory": "Python",
|
||||
"challengeOrder": [
|
||||
{
|
||||
|
||||
@@ -7,6 +7,6 @@
|
||||
{ "id": "66eaddd04a9e533fba689001", "title": "Design a Blog Post Card" }
|
||||
],
|
||||
"helpCategory": "HTML-CSS",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Build a Book Catalog Table",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"isUpcomingChange": false,
|
||||
"usesMultifileEditor": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Build a Book Inventory App",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"isUpcomingChange": false,
|
||||
"usesMultifileEditor": true,
|
||||
|
||||
@@ -7,6 +7,6 @@
|
||||
{ "id": "67172b43f84bcd2dec238a3d", "title": "Build a Book Organizer" }
|
||||
],
|
||||
"helpCategory": "JavaScript",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Build a Bookmark Manager App",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"isUpcomingChange": false,
|
||||
"usesMultifileEditor": true,
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
"title": "Build a Boolean Check Function"
|
||||
}
|
||||
],
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"usesMultifileEditor": true
|
||||
}
|
||||
|
||||
@@ -11,5 +11,5 @@
|
||||
],
|
||||
"helpCategory": "Python",
|
||||
"blockLayout": "link",
|
||||
"blockType": "lab"
|
||||
"blockLabel": "lab"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Design a Business Card",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"isUpcomingChange": false,
|
||||
"usesMultifileEditor": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Build a Celestial Bodies Database",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"isUpcomingChange": false,
|
||||
"dashedName": "lab-celestial-bodies-database",
|
||||
|
||||
@@ -10,6 +10,6 @@
|
||||
}
|
||||
],
|
||||
"usesMultifileEditor": true,
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Build a Checkout Page",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"isUpcomingChange": false,
|
||||
"usesMultifileEditor": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Implement the Chunky Monkey Algorithm",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"isUpcomingChange": false,
|
||||
"usesMultifileEditor": true,
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
{ "id": "67bf4350777ac6ffdc027745", "title": "Build a Color Picker App" }
|
||||
],
|
||||
"helpCategory": "JavaScript",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"disableLoopProtectPreview": true
|
||||
}
|
||||
|
||||
@@ -7,6 +7,6 @@
|
||||
{ "id": "66f3f6eb66ea9dc41cdc30df", "title": "Design a Set Colored Boxes" }
|
||||
],
|
||||
"helpCategory": "HTML-CSS",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Build a Confidential Email Page",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"isUpcomingChange": false,
|
||||
"usesMultifileEditor": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Design a Contact Form",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"isUpcomingChange": false,
|
||||
"usesMultifileEditor": true,
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
"title": "Build a Card Counting Assistant"
|
||||
}
|
||||
],
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"usesMultifileEditor": true
|
||||
}
|
||||
|
||||
@@ -11,5 +11,5 @@
|
||||
"helpCategory": "JavaScript",
|
||||
"isUpcomingChange": false,
|
||||
"blockLayout": "link",
|
||||
"blockType": "lab"
|
||||
"blockLabel": "lab"
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"name": "Build a Customer Complaint Form",
|
||||
"isUpcomingChange": false,
|
||||
"usesMultifileEditor": true,
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"dashedName": "lab-customer-complaint-form",
|
||||
"challengeOrder": [
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Build a Date Conversion Program",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"isUpcomingChange": false,
|
||||
"usesMultifileEditor": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Debug Camperbot's Profile Page",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"isUpcomingChange": false,
|
||||
"usesMultifileEditor": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Debug a Pet Adoption Page",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"isUpcomingChange": false,
|
||||
"dashedName": "lab-debug-pet-adoption-page",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Create a Deep Flattening Tool",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"isUpcomingChange": false,
|
||||
"usesMultifileEditor": true,
|
||||
|
||||
@@ -10,6 +10,6 @@
|
||||
"title": "Implement the Depth-First Search Algorithm"
|
||||
}
|
||||
],
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"usesMultifileEditor": true
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"dashedName": "lab-dna-pair-generator",
|
||||
"helpCategory": "JavaScript",
|
||||
"blockLayout": "link",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"challengeOrder": [
|
||||
{
|
||||
"id": "afd15382cdfb22c9efe8b7de",
|
||||
|
||||
@@ -8,5 +8,5 @@
|
||||
"helpCategory": "JavaScript",
|
||||
"isUpcomingChange": false,
|
||||
"blockLayout": "link",
|
||||
"blockType": "lab"
|
||||
"blockLabel": "lab"
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"dashedName": "lab-element-skipper",
|
||||
"helpCategory": "JavaScript",
|
||||
"blockLayout": "link",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"usesMultifileEditor": true,
|
||||
"challengeOrder": [
|
||||
{
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Build an Email Masker",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"isUpcomingChange": false,
|
||||
"usesMultifileEditor": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Build an Event Flyer Page",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"isUpcomingChange": false,
|
||||
"usesMultifileEditor": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Build an Event Hub",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"isUpcomingChange": false,
|
||||
"usesMultifileEditor": true,
|
||||
|
||||
@@ -11,5 +11,5 @@
|
||||
"helpCategory": "JavaScript",
|
||||
"isUpcomingChange": false,
|
||||
"blockLayout": "link",
|
||||
"blockType": "lab"
|
||||
"blockLabel": "lab"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Build a Factorial Calculator ",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"isUpcomingChange": false,
|
||||
"usesMultifileEditor": true,
|
||||
|
||||
@@ -7,6 +7,6 @@
|
||||
{ "id": "adf08ec01beb4f99fc7a68f2", "title": "Implement a Falsy Remover" }
|
||||
],
|
||||
"usesMultifileEditor": true,
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Build a Favorite Icon Toggler",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"isUpcomingChange": false,
|
||||
"usesMultifileEditor": true,
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"name": "Build an fCC Forum Leaderboard",
|
||||
"isUpcomingChange": false,
|
||||
"usesMultifileEditor": true,
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"dashedName": "lab-fcc-forum-leaderboard",
|
||||
"challengeOrder": [
|
||||
|
||||
@@ -10,6 +10,6 @@
|
||||
"title": "Design a Feature Selection Page"
|
||||
}
|
||||
],
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"usesMultifileEditor": true
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Build a First Element Finder",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"isUpcomingChange": false,
|
||||
"dashedName": "lab-first-element-finder",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Build a Set of Football Team Cards",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"isUpcomingChange": false,
|
||||
"usesMultifileEditor": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Build a Fortune Teller App",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"isUpcomingChange": false,
|
||||
"usesMultifileEditor": true,
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
"title": "Build a Golf Score Translator"
|
||||
}
|
||||
],
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"usesMultifileEditor": true
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Build a Gradebook App",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"isUpcomingChange": false,
|
||||
"usesMultifileEditor": true,
|
||||
|
||||
@@ -7,5 +7,5 @@
|
||||
],
|
||||
"helpCategory": "Python",
|
||||
"blockLayout": "link",
|
||||
"blockType": "lab"
|
||||
"blockLabel": "lab"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Build a House Painting",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"isUpcomingChange": false,
|
||||
"usesMultifileEditor": true,
|
||||
|
||||
@@ -10,6 +10,6 @@
|
||||
"title": "Build an HTML Audio and Video Player"
|
||||
}
|
||||
],
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"usesMultifileEditor": true
|
||||
}
|
||||
|
||||
@@ -10,6 +10,6 @@
|
||||
}
|
||||
],
|
||||
"usesMultifileEditor": true,
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Build an Inventory Management Program",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"isUpcomingChange": false,
|
||||
"usesMultifileEditor": true,
|
||||
|
||||
@@ -7,5 +7,5 @@
|
||||
{ "id": "686b9720ee1d032bd77a480a", "title": "Debug an ISBN Validator" }
|
||||
],
|
||||
"blockLayout": "link",
|
||||
"blockType": "lab"
|
||||
"blockLabel": "lab"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Build a JavaScript Trivia Bot",
|
||||
"blockType": "lab",
|
||||
"blockLabel": "lab",
|
||||
"blockLayout": "link",
|
||||
"isUpcomingChange": false,
|
||||
"usesMultifileEditor": true,
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user