diff --git a/conda/js/src/components/experiment/ExperimentEditor.jsx b/conda/js/src/components/experiment/ExperimentEditor.jsx index f53a51baf91a774d718e35463bc5b9a099f36a7e..d6fc65e6cb83065a1ef45f935aa02cd63e571a90 100644 --- a/conda/js/src/components/experiment/ExperimentEditor.jsx +++ b/conda/js/src/components/experiment/ExperimentEditor.jsx @@ -141,14 +141,15 @@ const isValidEntity = ( possibleObj: {inputs: any, outputs: any} = {inputs:{},outputs:{}}, inferredTypes = {} ): boolean => { - if(!blockTcEntity.hasOwnProperty('inputs') && Object.keys(possibleObj.inputs).length > 0) + const hasInputs = Array.isArray(blockTcEntity.inputs); + const hasOutputs = Array.isArray(blockTcEntity.outputs); + if(!hasInputs && Object.keys(possibleObj.inputs).length > 0) return false; - if(!blockTcEntity.hasOwnProperty('outputs') && Object.keys(possibleObj.outputs).length > 0) + if(!hasOutputs && Object.keys(possibleObj.outputs).length > 0) return false; - if(blockTcEntity.hasOwnProperty('inputs') && blockTcEntity.inputs.length !== Object.keys(possibleObj.inputs).length) + if(hasInputs && blockTcEntity.inputs.length !== Object.keys(possibleObj.inputs).length) return false; - if(blockTcEntity.hasOwnProperty('inputs') && - blockTcEntity.hasOwnProperty('outputs') && + if(hasInputs && hasOutputs && blockTcEntity.outputs.length !== Object.keys(possibleObj.outputs).length ) return false; @@ -590,9 +591,11 @@ export class ExperimentEditor extends React.Component<Props, State> { const newDs = JSON.parse(str); //console.log(newDs); this.setContents({...this.props.data.contents, datasets: newDs}); + /* for(const dataset in this.props.data.contents.datasets){ this.setLockMap(dataset, true); } + */ }} > <option value=''>Protocol...</option> @@ -692,7 +695,7 @@ export class ExperimentEditor extends React.Component<Props, State> { const newDs = {...this.props.data.contents.datasets, [name]: ds}; this.setContents({...this.props.data.contents, datasets: newDs}); - this.setLockMap(name, true); + //this.setLockMap(name, true); }} > <option value=''>Dataset...</option> @@ -897,7 +900,7 @@ export class ExperimentEditor extends React.Component<Props, State> { }; updateBlock(thisBlock, globals); - this.setLockMap(blockName, true); + //this.setLockMap(blockName, true); }} > <option value=''>Algorithm...</option> diff --git a/conda/js/src/components/experiment/ExperimentEditor.spec.jsx b/conda/js/src/components/experiment/ExperimentEditor.spec.jsx index 88baef9d26e7a2a22ddfcd11426a4a81ffa76bcd..dd218f752647b9617661de4ba1d417dec4c6c0e8 100644 --- a/conda/js/src/components/experiment/ExperimentEditor.spec.jsx +++ b/conda/js/src/components/experiment/ExperimentEditor.spec.jsx @@ -611,5 +611,84 @@ describe('<ExperimentEditor />', () => { } }); }); + + it(`doesnt change the lockMap after an algorithm or dataset is assigned`, () => { + const expName = 'user/user/single/1/single_add'; + const saveFunc = sinon.spy(); + const _updateFunc = (obj) => { + wrapper.setProps && wrapper.setProps({ data: obj }); + }; + const updateFunc = sinon.spy(_updateFunc); + const tc = testTcs.find(tc => expName.includes(tc.name)); + wrapper = mount( + <C + data={getValidObj({name: expName, contents: {}}, tc, [...normalBlocks, ...analyzerBlocks])} + experiments={[]} + normalBlocks={normalBlocks} + analyzerBlocks={analyzerBlocks} + datasets={datasets} + toolchain={tc} + saveFunc={saveFunc} + environments={envs} + updateFunc={updateFunc} + /> + ); + + expect(wrapper.props().data).to.have.property('name', expName); + + //console.log('finished name change, doing dataset'); + + wrapper.find('svg #block_set').simulate('click'); + wrapper.find('div.dataset0 select').simulate('change', { target: { value: 'protocol/set (simple/1)'}}); + expect(updateFunc.callCount).to.equal(1); + expect(wrapper.props().data.contents).to.have.deep.property('datasets', { + 'set': { + 'set': 'set', + 'protocol': 'protocol', + 'database': 'simple/1' + } + }); + + //console.log('finished dataset, doing block'); + + wrapper.find('svg #block_echo').simulate('click'); + expect(wrapper.find({ name: 'echo', set: 'blocks'}).find('.tcBlockBackground').prop('className')).to.include('highlighted'); + wrapper.find('div.block0 div.algorithm select').at(0).simulate('change', { target: { value: 'user/integers_add/1'}}); + expect(updateFunc.callCount).to.equal(2); + expect(wrapper.props().data.contents).to.have.deep.property('blocks', { + 'echo': { + 'inputs': { + 'in_data': 'in' + }, + 'algorithm': 'user/integers_add/1', + 'outputs': { + 'out_data': 'out' + }, + parameters: {} + } + }); + + //console.log('finished block, doing analyzer'); + + wrapper.find('svg #block_analysis').simulate('click'); + expect(wrapper.find({ name: 'analysis', set: 'analyzers'}).find('.tcBlockBackground').prop('className')).to.include('highlighted'); + wrapper.find('div.block0 div.algorithm select').at(0).simulate('change', { target: { value: 'user/integers_echo_analyzer/1'}}); + expect(updateFunc.callCount).to.equal(3); + expect(wrapper.props().data.contents).to.have.deep.property('analyzers', { + 'analysis': { + 'inputs': { + 'in_data': 'in' + }, + 'algorithm': 'user/integers_echo_analyzer/1', + parameters: {}, + } + }); + + expect(wrapper.state().lockMap).to.deep.equal({ + set: false, + echo: false, + analysis: false, + }); + }); }); });