refactor: blockType -> blockLabel (#62548)

Co-authored-by: Huyen Nguyen <25715018+huyenltnguyen@users.noreply.github.com>
This commit is contained in:
Oliver Eyton-Williams
2025-10-23 19:50:15 +02:00
committed by GitHub
parent 808d0d0d74
commit 27a54624c3
530 changed files with 612 additions and 603 deletions
+2 -2
View File
@@ -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
+2 -3
View File
@@ -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
+1 -1
View File
@@ -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',
+1 -1
View File
@@ -15,7 +15,7 @@ const schema = Joi.object()
'legacy-link',
'legacy-challenge-grid'
).required(),
blockType: Joi.valid(
blockLabel: Joi.valid(
'workshop',
'lab',
'lecture',
+2 -2
View File
@@ -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: '',
+1 -1
View File
@@ -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;
+2 -2
View File
@@ -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 -1
View File
@@ -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