From 21df3dcade1a9c6a41cc785e5b15b61c30d5dd50 Mon Sep 17 00:00:00 2001 From: Stuart Taylor Date: Fri, 9 Mar 2018 09:12:38 +0000 Subject: [PATCH] fix(toolPanel): Disable buttons when challenge block is incomplete --- client/less/main.less | 4 +++ common/app/routes/Challenges/Tool-Panel.jsx | 38 +++++++++++++++++---- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/client/less/main.less b/client/less/main.less index 42a315273d..2b2b1151cb 100644 --- a/client/less/main.less +++ b/client/less/main.less @@ -337,6 +337,10 @@ p { border-radius: 6px; } +.btn-big.btn-primary[disabled] { + color: rgb(141, 139, 132) +} + .btn-bigger { font-size: 30px; } diff --git a/common/app/routes/Challenges/Tool-Panel.jsx b/common/app/routes/Challenges/Tool-Panel.jsx index d84f8fabba..b18105af84 100644 --- a/common/app/routes/Challenges/Tool-Panel.jsx +++ b/common/app/routes/Challenges/Tool-Panel.jsx @@ -1,6 +1,16 @@ import React, { PureComponent } from 'react'; import PropTypes from 'prop-types'; +import { connect } from 'react-redux'; +import { createSelector } from 'reselect'; import { Button, Tooltip, OverlayTrigger } from 'react-bootstrap'; +import { isCurrentBlockCompleteSelector } from '../../redux'; + +const mapStateToProps = createSelector( + isCurrentBlockCompleteSelector, + blockComplete => ({ + isDisabled: !blockComplete + }) +); const unlockWarning = ( @@ -15,13 +25,14 @@ const propTypes = { guideUrl: PropTypes.string, hint: PropTypes.string, isCodeLocked: PropTypes.bool, + isDisabled: PropTypes.bool, makeToast: PropTypes.func.isRequired, openHelpModal: PropTypes.func.isRequired, unlockUntrustedCode: PropTypes.func.isRequired, updateHint: PropTypes.func.isRequired }; -export default class ToolPanel extends PureComponent { +class ToolPanel extends PureComponent { constructor(...props) { super(...props); this.makeHint = this.makeHint.bind(this); @@ -44,7 +55,7 @@ export default class ToolPanel extends PureComponent { }); } - renderHint(hint, makeHint) { + renderHint(hint, makeHint, isDisabled) { if (!hint) { return null; } @@ -53,6 +64,7 @@ export default class ToolPanel extends PureComponent { block={ true } bsStyle='primary' className='btn-big' + disabled={ isDisabled } onClick={ makeHint } > Hint @@ -60,7 +72,12 @@ export default class ToolPanel extends PureComponent { ); } - renderExecute(isCodeLocked, executeChallenge, unlockUntrustedCode) { + renderExecute( + isCodeLocked, + executeChallenge, + unlockUntrustedCode, + isDisabled + ) { if (isCodeLocked) { return ( I trust this code. Unlock it. @@ -83,6 +101,7 @@ export default class ToolPanel extends PureComponent { block={ true } bsStyle='primary' className='btn-big' + disabled={ isDisabled } onClick={ executeChallenge } > Run tests (ctrl + enter) @@ -96,18 +115,20 @@ export default class ToolPanel extends PureComponent { guideUrl, hint, isCodeLocked, + isDisabled, openHelpModal, unlockUntrustedCode } = this.props; - + console.log(isDisabled); return (
- { this.renderHint(hint, this.makeHint) } + { this.renderHint(hint, this.makeHintm, isDisabled) } { this.renderExecute( isCodeLocked, executeChallenge, - unlockUntrustedCode + unlockUntrustedCode, + isDisabled ) }
@@ -115,6 +136,7 @@ export default class ToolPanel extends PureComponent { block={ true } bsStyle='primary' className='btn-big' + disabled={ isDisabled } onClick={ this.makeReset } > Reset your code @@ -127,6 +149,7 @@ export default class ToolPanel extends PureComponent { block={ true } bsStyle='primary' className='btn-big' + disabled={ isDisabled } href={ guideUrl } target='_blank' > @@ -139,6 +162,7 @@ export default class ToolPanel extends PureComponent { block={ true } bsStyle='primary' className='btn-big' + disabled={ isDisabled } onClick={ openHelpModal } > Ask for help on the forum @@ -151,3 +175,5 @@ export default class ToolPanel extends PureComponent { ToolPanel.displayName = 'ToolPanel'; ToolPanel.propTypes = propTypes; + +export default connect(mapStateToProps)(ToolPanel);