From 8edf6f099f00ffe61af11e2b8845981abc1026c1 Mon Sep 17 00:00:00 2001 From: Iris Scholten Date: Tue, 12 Jun 2018 15:39:47 -0700 Subject: [PATCH] Display implicit yield func node by default Co-authored-by: Delmer Reed --- ui/src/flux/components/ExpressionNode.tsx | 78 ++++++++++++++++++++--- 1 file changed, 69 insertions(+), 9 deletions(-) diff --git a/ui/src/flux/components/ExpressionNode.tsx b/ui/src/flux/components/ExpressionNode.tsx index 716689e947..d1561a3f8c 100644 --- a/ui/src/flux/components/ExpressionNode.tsx +++ b/ui/src/flux/components/ExpressionNode.tsx @@ -1,4 +1,5 @@ import React, {PureComponent, Fragment} from 'react' +import _ from 'lodash' import {FluxContext} from 'src/flux/containers/FluxPage' import FuncSelector from 'src/flux/components/FuncSelector' @@ -20,6 +21,7 @@ interface State { nonYieldableIndexesToggled: { [x: number]: boolean } + isImplicitYieldToggled: boolean } // an Expression is a group of one or more functions @@ -29,6 +31,7 @@ class ExpressionNode extends PureComponent { this.state = { nonYieldableIndexesToggled: {}, + isImplicitYieldToggled: this.isImplicitYieldToggled, } } @@ -127,6 +130,38 @@ class ExpressionNode extends PureComponent { /> ) + } else if (this.isEndOfScript(i)) { + const script = scriptUpToYield(bodyID, declarationID, i, true) + + return ( + + + + + ) } else { return funcNode } @@ -146,8 +181,13 @@ class ExpressionNode extends PureComponent { private isNextFuncYield = (funcIndex: number): boolean => { const {funcs, isLastBody} = this.props + const {isImplicitYieldToggled} = this.state - if (funcIndex === funcs.length - 1 && isLastBody) { + if ( + funcIndex === funcs.length - 1 && + isLastBody && + isImplicitYieldToggled + ) { return true } @@ -164,25 +204,45 @@ class ExpressionNode extends PureComponent { return false } + private get isImplicitYieldToggled(): boolean { + const {isLastBody} = this.props + + return isLastBody && this.isLastFuncYield + } + + private get isLastFuncYield(): boolean { + const {funcs} = this.props + + return _.get(funcs, `${funcs.length - 1}.name`) !== 'yield' + } + // if funcNode is not yieldable, add last before yield() private handleToggleYieldWithLast = (funcNodeIndex: number) => { this.setState(({nonYieldableIndexesToggled}) => { - let isFuncYieldToggled = !!nonYieldableIndexesToggled[funcNodeIndex] - - if (isFuncYieldToggled) { - isFuncYieldToggled = false - } else { - isFuncYieldToggled = true - } + const isFuncYieldToggled = !!nonYieldableIndexesToggled[funcNodeIndex] return { nonYieldableIndexesToggled: { ...nonYieldableIndexesToggled, - [funcNodeIndex]: isFuncYieldToggled, + [funcNodeIndex]: !isFuncYieldToggled, }, } }) } + + private handleHideImplicitYield = () => { + this.setState(() => ({ + isImplicitYieldToggled: false, + })) + } + + private isEndOfScript(index: number): boolean { + const {isLastBody, funcs} = this.props + const {isImplicitYieldToggled} = this.state + const isLastScriptFunc = isLastBody && index === funcs.length - 1 + + return isLastScriptFunc && isImplicitYieldToggled + } } export default ExpressionNode