From 4a5d24f2d1b8c0c83d76a69e4123309f47bd884c Mon Sep 17 00:00:00 2001 From: Delucse <46593742+Delucse@users.noreply.github.com> Date: Mon, 28 Sep 2020 15:12:19 +0200 Subject: [PATCH] template created for not deactivated blocks in the instructions --- src/components/Blockly/BlocklyWindow.js | 8 ++- src/components/Home.js | 2 +- src/components/Tutorial/Assessment.js | 1 + .../Tutorial/Builder/BlocklyExample.js | 59 ++++++++++++++----- src/components/Tutorial/Builder/StepType.js | 15 +++-- src/components/Tutorial/Instruction.js | 1 + src/components/Tutorial/Tutorial.js | 2 +- src/components/WorkspaceFunc.js | 2 +- 8 files changed, 65 insertions(+), 25 deletions(-) diff --git a/src/components/Blockly/BlocklyWindow.js b/src/components/Blockly/BlocklyWindow.js index 7512870..b4769ee 100644 --- a/src/components/Blockly/BlocklyWindow.js +++ b/src/components/Blockly/BlocklyWindow.js @@ -26,14 +26,18 @@ class BlocklyWindow extends Component { this.props.clearStats(); workspace.addChangeListener((event) => { this.props.onChangeWorkspace(event); - Blockly.Events.disableOrphans(event); + // switch on that a block is displayed disabled or not depending on whether it is correctly connected + // for SVG display, a deactivated block in the display is undesirable + if(this.props.blockDisabled){ + Blockly.Events.disableOrphans(event); + } }); Blockly.svgResize(workspace); } componentDidUpdate(props) { const workspace = Blockly.getMainWorkspace(); - var xml = this.props.initialXml + var xml = this.props.initialXml; // if svg is true, then the update process is done in the BlocklySvg component if(props.initialXml !== xml && !this.props.svg){ // guarantees that the current xml-code (this.props.initialXml) is rendered diff --git a/src/components/Home.js b/src/components/Home.js index af14068..fc0f35d 100644 --- a/src/components/Home.js +++ b/src/components/Home.js @@ -87,7 +87,7 @@ class Home extends Component { - + {this.state.codeOn ? diff --git a/src/components/Tutorial/Assessment.js b/src/components/Tutorial/Assessment.js index 36d107f..2756ba2 100644 --- a/src/components/Tutorial/Assessment.js +++ b/src/components/Tutorial/Assessment.js @@ -41,6 +41,7 @@ class Assessment extends Component { diff --git a/src/components/Tutorial/Builder/BlocklyExample.js b/src/components/Tutorial/Builder/BlocklyExample.js index ef7b590..18050c4 100644 --- a/src/components/Tutorial/Builder/BlocklyExample.js +++ b/src/components/Tutorial/Builder/BlocklyExample.js @@ -7,6 +7,7 @@ import moment from 'moment'; import localization from 'moment/locale/de'; import * as Blockly from 'blockly/core'; +import { initialXml } from '../../Blockly//initialXml.js'; import BlocklyWindow from '../../Blockly/BlocklyWindow'; import { withStyles } from '@material-ui/core/styles'; @@ -41,10 +42,12 @@ class BlocklyExample extends Component { this.state={ checked: props.task ? props.task : props.value ? true : false, input: null, + disabled: false }; } componentDidMount(){ + moment.updateLocale('de', localization); this.isError(); // if(this.props.task){ // this.props.setError(this.props.index, 'xml'); @@ -57,14 +60,36 @@ class BlocklyExample extends Component { () => this.isError() ); } - if(state.checked !== this.state.checked){ + if(state.checked !== this.state.checked && this.state.checked){ this.isError(); } + if(props.xml !== this.props.xml){ + // check if there is at least one block, otherwise the workspace cannot be submitted + var workspace = Blockly.getMainWorkspace(); + var areBlocks = workspace.getAllBlocks().length > 0; + this.setState({disabled: !areBlocks}); + } } isError = () => { - if(this.state.checked && !this.props.value){ - this.props.setError(this.props.index, 'xml'); + if(this.state.checked){ + var xml = this.props.value; + // check if value is valid xml; + try{ + Blockly.Xml.textToDom(xml); + this.props.deleteError(this.props.index, 'xml'); + } + catch(err){ + xml = initialXml; + // not valid xml, throw error in redux store + this.props.setError(this.props.index, 'xml'); + } + if(!this.props.task){ + // instruction can also display only one block, which does not necessarily + // have to be the initial block + xml = xml.replace('deletable="false"', 'deletable="true"'); + } + this.setState({xml: xml}); } else { this.props.deleteError(this.props.index, 'xml'); @@ -79,8 +104,13 @@ class BlocklyExample extends Component { } } + setXml = () => { + var xml = this.props.xml; + this.props.changeContent(this.props.index, 'xml', xml); + this.setState({input: moment(Date.now()).format('LTS')}); + } + render() { - moment.locale('de', localization); return (
{!this.props.task ? @@ -100,22 +130,18 @@ class BlocklyExample extends Component { {`Reiche deine Blöcke ein, indem du auf den '${this.props.task ? 'Musterlösung einreichen' : 'Beispiel einreichen'}'-Button klickst.`} : this.state.input ? Die letzte Einreichung erfolgte um {this.state.input} Uhr. : null : null} + {this.state.checked && !this.props.task ? + Anmerkung: Man kann den initialen Setup()- bzw. Endlosschleifen()-Block löschen. Zusätzlich ist es möglich u.a. nur einen beliebigen Block auszuwählen, ohne dass dieser als deaktiviert dargestellt wird. + : null} {this.state.checked ? (() => { - var initialXml = this.props.value; - // check if value is valid xml; - try{ - Blockly.Xml.textToDom(initialXml); - } - catch(err){ - initialXml = null; - // this.props.setError(this.props.index, 'xml'); - } - return ( + return(
@@ -125,7 +151,8 @@ class BlocklyExample extends Component { style={{marginTop: '5px', height: '40px'}} variant='contained' color='primary' - onClick={() => {this.props.changeContent(this.props.index, 'xml', this.props.xml); this.setState({input: moment(Date.now()).format('LTS')})}} + disabled={this.state.disabled} + onClick={() => this.setXml()} > {this.props.task ? 'Musterlösung einreichen' : 'Beispiel einreichen'} diff --git a/src/components/Tutorial/Builder/StepType.js b/src/components/Tutorial/Builder/StepType.js index 910b2df..cf6d9ac 100644 --- a/src/components/Tutorial/Builder/StepType.js +++ b/src/components/Tutorial/Builder/StepType.js @@ -1,7 +1,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; -import { changeContent } from '../../../actions/tutorialBuilderActions'; +import { changeContent, deleteProperty } from '../../../actions/tutorialBuilderActions'; import Radio from '@material-ui/core/Radio'; import RadioGroup from '@material-ui/core/RadioGroup'; @@ -9,9 +9,15 @@ import FormControlLabel from '@material-ui/core/FormControlLabel'; class StepType extends Component { + onChange = (value) => { + this.props.changeContent(this.props.index, 'type', value); + // delete property 'xml', so that all used blocks are reset + this.props.deleteProperty(this.props.index, 'xml'); + } + render() { return ( - {this.props.changeContent(this.props.index, 'type', e.target.value)}}> + this.onChange(e.target.value)}> } @@ -31,7 +37,8 @@ class StepType extends Component { } StepType.propTypes = { - changeContent: PropTypes.func.isRequired + changeContent: PropTypes.func.isRequired, + deleteProperty: PropTypes.func.isRequired }; -export default connect(null, { changeContent })(StepType); +export default connect(null, { changeContent, deleteProperty })(StepType); diff --git a/src/components/Tutorial/Instruction.js b/src/components/Tutorial/Instruction.js index a9858d7..739d798 100644 --- a/src/components/Tutorial/Instruction.js +++ b/src/components/Tutorial/Instruction.js @@ -28,6 +28,7 @@ class Instruction extends Component { diff --git a/src/components/Tutorial/Tutorial.js b/src/components/Tutorial/Tutorial.js index 1372ddb..f2a7bb7 100644 --- a/src/components/Tutorial/Tutorial.js +++ b/src/components/Tutorial/Tutorial.js @@ -42,7 +42,7 @@ class Tutorial extends Component { var step = steps ? steps[this.props.activeStep] : null; var name = step ? `${detectWhitespacesAndReturnReadableResult(tutorial.title)}_${detectWhitespacesAndReturnReadableResult(step.headline)}` : null; return ( - !Number.isInteger(currentTutorialId) || currentTutorialId < 1 || currentTutorialId > tutorials.length ? + !Number.isInteger(currentTutorialId) || currentTutorialId < 1 || !tutorial ? :
diff --git a/src/components/WorkspaceFunc.js b/src/components/WorkspaceFunc.js index fd73a19..96f3cb4 100644 --- a/src/components/WorkspaceFunc.js +++ b/src/components/WorkspaceFunc.js @@ -125,7 +125,7 @@ class WorkspaceFunc extends Component { this.state.file === 'xml' ? this.saveXmlFile() : this.getSvg() } else{ - this.setState({ saveFile: true, file: filetype, open: true, title: this.state.file === 'xml' ? 'Blöcke speichern' : 'Screenshot erstellen', content: `Bitte gib einen Namen für die Bennenung der ${this.state.file === 'xml' ? 'XML' : 'SVG'}-Datei ein und bestätige diesen mit einem Klick auf \'Eingabe\'.` }); + this.setState({ saveFile: true, file: filetype, open: true, title: this.state.file === 'xml' ? 'Blöcke speichern' : 'Screenshot erstellen', content: `Bitte gib einen Namen für die Bennenung der ${this.state.file === 'xml' ? 'XML' : 'SVG'}-Datei ein und bestätige diesen mit einem Klick auf 'Eingabe'.` }); } }); }