From 839e81426e7c3ad520736d4ccfc0435d6b54795c Mon Sep 17 00:00:00 2001 From: Valeriy Date: Tue, 11 Jun 2019 18:46:36 +0300 Subject: [PATCH] feat(client): show and execute backend project tests (#35673) --- .../src/templates/Challenges/backend/Show.js | 34 ++++++--- .../Challenges/project/ProjectForm.js | 73 ++----------------- .../src/templates/Challenges/project/Show.js | 2 +- .../src/templates/Challenges/redux/index.js | 13 +++- .../src/templates/Challenges/utils/build.js | 3 +- client/utils/challengeTypes.js | 2 +- 6 files changed, 44 insertions(+), 83 deletions(-) diff --git a/client/src/templates/Challenges/backend/Show.js b/client/src/templates/Challenges/backend/Show.js index 743fae029e..4b6c4aad0c 100644 --- a/client/src/templates/Challenges/backend/Show.js +++ b/client/src/templates/Challenges/backend/Show.js @@ -12,6 +12,7 @@ import { consoleOutputSelector, initTests, updateChallengeMeta, + updateProjectFormValues, backendNS } from '../redux'; import { createGuideUrl } from '../utils'; @@ -24,6 +25,7 @@ import Output from '../components/Output'; import CompletionModal from '../components/CompletionModal'; import HelpModal from '../components/HelpModal'; import ProjectToolPanel from '../project/Tool-Panel'; +import ProjectForm from '../project/ProjectForm'; import { createFormValidator, isValidURL, @@ -32,6 +34,8 @@ import { } from '../../../components/formHelpers'; import Spacer from '../../../components/helpers/Spacer'; +import { backend } from '../../../../utils/challengeTypes'; + import '../components/test-frame.css'; // provided by redux form @@ -52,6 +56,7 @@ const propTypes = { tests: PropTypes.array, title: PropTypes.string, updateChallengeMeta: PropTypes.func.isRequired, + updateProjectFormValues: PropTypes.func.isRequired, ...reduxFormPropTypes }; @@ -74,7 +79,8 @@ const mapDispatchToActions = { challengeMounted, executeChallenge, initTests, - updateChallengeMeta + updateChallengeMeta, + updateProjectFormValues }; const formFields = ['solution']; @@ -150,6 +156,7 @@ export class BackEnd extends Component { data: { challengeNode: { fields: { blockName, slug }, + challengeType, title, description, instructions @@ -158,7 +165,8 @@ export class BackEnd extends Component { output, tests, submitting, - executeChallenge + executeChallenge, + updateProjectFormValues } = this.props; // TODO: Should be tied to user.isSignedIn @@ -177,13 +185,21 @@ export class BackEnd extends Component { description={description} instructions={instructions} /> -
+ {challengeType === backend ? ( + + ) : ( + + )}
({ - ...state, - keysDown: { ...state.keysDown, Control: true } - })); - } - if (e.key === 'Enter') { - this.setState(state => ({ - ...state, - keysDown: { ...state.keysDown, Enter: true } - })); - } - } - handleKeyUp(e) { - if (e.key === 'Control') { - this.setState(state => ({ - ...state, - keysDown: { ...state.keysDown, Control: false } - })); - } - if (e.key === 'Enter') { - this.setState(state => ({ - ...state, - keysDown: { ...state.keysDown, Enter: false } - })); - } + this.props.updateProjectForm({}); } handleSubmit(values) { - const { - keysDown: { Control, Enter } - } = this.state; - if ((Control && Enter) || !Enter) { - this.props.openModal('completion'); - this.props.updateProjectForm(values); - } + this.props.updateProjectForm(values); + this.props.onSubmit(); } render() { const { isSubmitting, isFrontEnd } = this.props; @@ -104,14 +46,11 @@ export class ProjectForm extends Component { : "I've completed this challenge"; return ( ); } diff --git a/client/src/templates/Challenges/project/Show.js b/client/src/templates/Challenges/project/Show.js index 54596c4ef1..7eb883c9e5 100644 --- a/client/src/templates/Challenges/project/Show.js +++ b/client/src/templates/Challenges/project/Show.js @@ -117,7 +117,7 @@ export class Project extends Component { /> diff --git a/client/src/templates/Challenges/redux/index.js b/client/src/templates/Challenges/redux/index.js index 59308775a0..f319c69d96 100644 --- a/client/src/templates/Challenges/redux/index.js +++ b/client/src/templates/Challenges/redux/index.js @@ -192,10 +192,15 @@ export const challengeDataSelector = state => { ...challengeData, url }; - } else if ( - challengeType === challengeTypes.frontEndProject || - challengeType === challengeTypes.backendEndProject - ) { + } else if (challengeType === challengeTypes.backEndProject) { + const values = projectFormValuesSelector(state); + const { solution: url } = values; + challengeData = { + ...challengeData, + ...values, + url + }; + } else if (challengeType === challengeTypes.frontEndProject) { challengeData = { ...challengeData, ...projectFormValuesSelector(state) diff --git a/client/src/templates/Challenges/utils/build.js b/client/src/templates/Challenges/utils/build.js index ba050ee974..46aafdbf37 100644 --- a/client/src/templates/Challenges/utils/build.js +++ b/client/src/templates/Challenges/utils/build.js @@ -61,7 +61,8 @@ const buildFunctions = { [challengeTypes.bonfire]: buildJSChallenge, [challengeTypes.html]: buildDOMChallenge, [challengeTypes.modern]: buildDOMChallenge, - [challengeTypes.backend]: buildBackendChallenge + [challengeTypes.backend]: buildBackendChallenge, + [challengeTypes.backEndProject]: buildBackendChallenge }; export async function buildChallenge(challengeData) { diff --git a/client/utils/challengeTypes.js b/client/utils/challengeTypes.js index d4abcc77f0..7090c111fc 100644 --- a/client/utils/challengeTypes.js +++ b/client/utils/challengeTypes.js @@ -40,7 +40,7 @@ exports.viewTypes = { [js]: 'classic', [bonfire]: 'classic', [frontEndProject]: 'project', - [backEndProject]: 'project', + [backEndProject]: 'backend', [modern]: 'modern', [step]: 'step', [quiz]: 'quiz',