From 0734552e1ceb315e8473690ce7ef13431402a58c Mon Sep 17 00:00:00 2001 From: enicolasgomez Date: Wed, 22 Nov 2023 16:28:05 -0300 Subject: [PATCH 1/6] Added AdapterComponent onChange handle to CoordsRange --- webapp/components/general/AdapterComponent.js | 2 +- .../components/general/NetPyNECoordsRange.js | 41 +++++++++---------- 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/webapp/components/general/AdapterComponent.js b/webapp/components/general/AdapterComponent.js index facf3fca..b35336ed 100644 --- a/webapp/components/general/AdapterComponent.js +++ b/webapp/components/general/AdapterComponent.js @@ -51,7 +51,7 @@ export default class AdapterComponent extends Component { // Call to conversion function const newValue = this.props.convertToPython(this.state); - if (newValue != undefined && this.state.value != newValue) { + if (newValue != undefined && this.state.value != newValue && this.props.onChange) { this.props.onChange(null, null, newValue); } } diff --git a/webapp/components/general/NetPyNECoordsRange.js b/webapp/components/general/NetPyNECoordsRange.js index d206efb8..d9314aad 100644 --- a/webapp/components/general/NetPyNECoordsRange.js +++ b/webapp/components/general/NetPyNECoordsRange.js @@ -14,14 +14,6 @@ export default class NetPyNECoordsRange extends Component { this._isMounted = false; } - triggerUpdate (updateMethod) { - // common strategy when triggering processing of a value change, delay it, every time there is a change we reset - if (this.updateTimer != undefined) { - clearTimeout(this.updateTimer); - } - this.updateTimer = setTimeout(updateMethod, 1000); - } - componentDidMount () { this._isMounted = true; this.updateLayout(); @@ -29,19 +21,17 @@ export default class NetPyNECoordsRange extends Component { componentDidUpdate (prevProps, prevState) { if (this.props.name != prevProps.name) { - this.triggerUpdate(() => { - const message = `netpyne_geppetto.${this.props.model}['${this.props.name}']${(this.props.conds != undefined) ? `['${this.props.conds}']` : ''}`; - Utils - .evalPythonMessage(`[key in ${message} for key in ['${this.props.items[0].value}', '${this.props.items[1].value}']]`) - .then((response) => { - if (response[0] && this._isMounted === true) { - this.setState({ rangeType: this.props.items[0].value }); - } else if (response[1] && this._isMounted === true) { - this.setState({ rangeType: this.props.items[1].value }); - } else if (this._isMounted === true) { - this.setState({ rangeType: undefined }); - } - }); + const message = `netpyne_geppetto.${this.props.model}['${this.props.name}']${(this.props.conds != undefined) ? `['${this.props.conds}']` : ''}`; + Utils + .evalPythonMessage(`[key in ${message} for key in ['${this.props.items[0].value}', '${this.props.items[1].value}']]`) + .then((response) => { + if (response[0] && this._isMounted === true) { + this.setState({ rangeType: this.props.items[0].value }); + } else if (response[1] && this._isMounted === true) { + this.setState({ rangeType: this.props.items[1].value }); + } else if (this._isMounted === true) { + this.setState({ rangeType: undefined }); + } }); } else if (this.props.conds != prevProps.conds) { this.updateLayout(); @@ -85,6 +75,14 @@ export default class NetPyNECoordsRange extends Component { this._isMounted = false; } + //preConds: pop, cellType, cellModel, x, y, z, xnorm, ynorm, znorm + handleCoordParamChange(a, b, newValue) { + const pythonMessage = `netpyne_geppetto.${this.model} = [${newValue}]` ; + Utils.execPythonMessage( + pythonMessage + ); + } + render () { if (this.props.conds != undefined) { var meta = `${this.props.model}.${this.props.conds}.${this.props.items[0].value}`; @@ -127,6 +125,7 @@ export default class NetPyNECoordsRange extends Component { return output; } }} + onChange={this.handleCoordParamChange} > From a45fba11a09d02389c57c8d19a648d5c6cad0534 Mon Sep 17 00:00:00 2001 From: enicolasgomez Date: Thu, 23 Nov 2023 11:27:22 -0300 Subject: [PATCH 2/6] Competed missing functionality in CoordsRange component --- .../components/general/NetPyNECoordsRange.js | 78 ++++++++++--------- 1 file changed, 43 insertions(+), 35 deletions(-) diff --git a/webapp/components/general/NetPyNECoordsRange.js b/webapp/components/general/NetPyNECoordsRange.js index d9314aad..51ba51e3 100644 --- a/webapp/components/general/NetPyNECoordsRange.js +++ b/webapp/components/general/NetPyNECoordsRange.js @@ -9,7 +9,7 @@ import Utils from '../../Utils'; export default class NetPyNECoordsRange extends Component { constructor (props) { super(props); - this.state = { rangeType: undefined }; + this.state = { rangeType: undefined, rangeValue: [undefined, undefined] }; this._isMounted = false; } @@ -48,17 +48,34 @@ export default class NetPyNECoordsRange extends Component { const message = `netpyne_geppetto.${model}['${name}']${(conds !== undefined) ? `['${conds}']` : ''}`; + const evalMessage = `[key in ${message} for key in ['${items[0].value}', '${items[1].value}']]` ; + Utils - .evalPythonMessage(`[key in ${message} for key in ['${items[0].value}', '${items[1].value}']]`) - .then((response) => { - if (response[0] && this._isMounted === true) { - this.setState({ rangeType: items[0].value }); - } else if (response[1] && this._isMounted === true) { - this.setState({ rangeType: items[1].value }); - } else if (this._isMounted === true) { - this.setState({ rangeType: undefined }); - } - }); + .evalPythonMessage(evalMessage) + .then((response) => { + + let rangeType = undefined ; + + if (response[0] && this._isMounted === true) { + rangeType = items[0].value ; + } else if (response[1] && this._isMounted === true) { + rangeType = items[1].value ; + } + + this.setState({ rangeType }); + + if (rangeType) + { + const pythonMessage = `netpyne_geppetto.${model}['${name}']['${this.state.rangeType}']` ; + + Utils + .evalPythonMessage(pythonMessage) + .then((response) => { + if (response && response.length > 0 ) { + this.setState({ rangeValue: response }); + }}); + } + }); } createMenuItems = () => this.props.items.map((obj) => ( @@ -76,11 +93,18 @@ export default class NetPyNECoordsRange extends Component { } //preConds: pop, cellType, cellModel, x, y, z, xnorm, ynorm, znorm - handleCoordParamChange(a, b, newValue) { - const pythonMessage = `netpyne_geppetto.${this.model} = [${newValue}]` ; + handleCoordParamChange(index, newValue) { + const { + model, + name, + } = this.props; + const rangeValue = this.state.rangeValue ; + rangeValue[index] = newValue ; + const pythonMessage = `netpyne_geppetto.${model}['${name}']['${this.state.rangeType}'] = [${rangeValue}]` ; Utils.execPythonMessage( pythonMessage ); + this.setState({ rangeValue }) } render () { @@ -93,6 +117,10 @@ export default class NetPyNECoordsRange extends Component { } const min = `${this.props.id}MinRange`; const max = `${this.props.id}MaxRange`; + + const minVal = this.state.rangeValue[0]; + const maxVal = this.state.rangeValue[1]; + return (
@@ -108,28 +136,8 @@ export default class NetPyNECoordsRange extends Component { {(this.state.rangeType != undefined) ? ( - { - if (!state[state.lastUpdated].toString() - .endsWith('.') - && ((!isNaN(parseFloat(state[min]))) && (!isNaN(parseFloat(state[max]))))) { - return [parseFloat(state[min]), parseFloat(state[max])]; - } - }} - convertFromPython={(prevProps, prevState, value) => { - if (value != undefined && prevProps.value != value && value != '') { - const output = {}; - output[min] = value[0]; - output[max] = value[1]; - return output; - } - }} - onChange={this.handleCoordParamChange} - > - - - + { this.handleCoordParamChange(0, parseInt(e.target.value)) } } /> + { this.handleCoordParamChange(1, parseInt(e.target.value)) } } /> ) : null} From fa97c66776448ed9dc40a9e2c1f9829404984ade Mon Sep 17 00:00:00 2001 From: enicolasgomez Date: Fri, 24 Nov 2023 17:39:45 -0300 Subject: [PATCH 3/6] Completed Coords Range missing functionality --- .../components/general/NetPyNECoordsRange.js | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/webapp/components/general/NetPyNECoordsRange.js b/webapp/components/general/NetPyNECoordsRange.js index 51ba51e3..bd0bad21 100644 --- a/webapp/components/general/NetPyNECoordsRange.js +++ b/webapp/components/general/NetPyNECoordsRange.js @@ -96,11 +96,32 @@ export default class NetPyNECoordsRange extends Component { handleCoordParamChange(index, newValue) { const { model, + conds, name, } = this.props; + + function getOppositeObject(list, givenValue) { + const index = list.findIndex(obj => obj.value === givenValue); + + if (index === -1 || list.length !== 2) { + return null; + } + return list[1 - index]; + } + + const opossiteRangeType = getOppositeObject(this.props.items, this.state.rangeType) ; + + if (opossiteRangeType) + { + const pythonMessageDelOpposite = `netpyne_geppetto.${model}['${name}']['${conds}'].pop('${opossiteRangeType.value}', None)`; + Utils.execPythonMessage( + pythonMessageDelOpposite + ); + } + const rangeValue = this.state.rangeValue ; rangeValue[index] = newValue ; - const pythonMessage = `netpyne_geppetto.${model}['${name}']['${this.state.rangeType}'] = [${rangeValue}]` ; + const pythonMessage = `netpyne_geppetto.${model}['${name}']['${conds}']['${this.state.rangeType}'] = [${rangeValue}]` ; Utils.execPythonMessage( pythonMessage ); From 78764483f1dbeeb372cf02b378a6ea4829b45ba7 Mon Sep 17 00:00:00 2001 From: enicolasgomez Date: Fri, 24 Nov 2023 17:46:08 -0300 Subject: [PATCH 4/6] Added numeric validation to coords range fields --- .../components/general/NetPyNECoordsRange.js | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/webapp/components/general/NetPyNECoordsRange.js b/webapp/components/general/NetPyNECoordsRange.js index bd0bad21..7ca65768 100644 --- a/webapp/components/general/NetPyNECoordsRange.js +++ b/webapp/components/general/NetPyNECoordsRange.js @@ -109,23 +109,25 @@ export default class NetPyNECoordsRange extends Component { return list[1 - index]; } - const opossiteRangeType = getOppositeObject(this.props.items, this.state.rangeType) ; + if (newValue === '' || (/^\d+$/.test(newValue))) { + const opossiteRangeType = getOppositeObject(this.props.items, this.state.rangeType) ; - if (opossiteRangeType) - { - const pythonMessageDelOpposite = `netpyne_geppetto.${model}['${name}']['${conds}'].pop('${opossiteRangeType.value}', None)`; + if (opossiteRangeType) + { + const pythonMessageDelOpposite = `netpyne_geppetto.${model}['${name}']['${conds}'].pop('${opossiteRangeType.value}', None)`; + Utils.execPythonMessage( + pythonMessageDelOpposite + ); + } + + const rangeValue = this.state.rangeValue ; + rangeValue[index] = newValue ; + const pythonMessage = `netpyne_geppetto.${model}['${name}']['${conds}']['${this.state.rangeType}'] = [${rangeValue}]` ; Utils.execPythonMessage( - pythonMessageDelOpposite + pythonMessage ); + this.setState({ rangeValue }) } - - const rangeValue = this.state.rangeValue ; - rangeValue[index] = newValue ; - const pythonMessage = `netpyne_geppetto.${model}['${name}']['${conds}']['${this.state.rangeType}'] = [${rangeValue}]` ; - Utils.execPythonMessage( - pythonMessage - ); - this.setState({ rangeValue }) } render () { From c6aeb1f6a8e1e3bebbc5b3b00aa420213f7cb021 Mon Sep 17 00:00:00 2001 From: enicolasgomez Date: Tue, 28 Nov 2023 09:14:32 -0300 Subject: [PATCH 5/6] Added handling for CoordsRange type change --- .../components/general/NetPyNECoordsRange.js | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/webapp/components/general/NetPyNECoordsRange.js b/webapp/components/general/NetPyNECoordsRange.js index 7ca65768..62126a04 100644 --- a/webapp/components/general/NetPyNECoordsRange.js +++ b/webapp/components/general/NetPyNECoordsRange.js @@ -66,7 +66,7 @@ export default class NetPyNECoordsRange extends Component { if (rangeType) { - const pythonMessage = `netpyne_geppetto.${model}['${name}']['${this.state.rangeType}']` ; + const pythonMessage = `netpyne_geppetto.${model}['${name}']['${conds}']['${this.state.rangeType}']` ; Utils .evalPythonMessage(pythonMessage) @@ -92,6 +92,33 @@ export default class NetPyNECoordsRange extends Component { this._isMounted = false; } + handleRangeTypeChange(event) { + const { + model, + conds, + name, + } = this.props; + + const rangeType = event.target.value ; + + const pythonMessageDelAll = `netpyne_geppetto.${model}['${name}']['${conds}'] = {}`; + Utils.execPythonMessage( + pythonMessageDelAll + ); + + const rangeValue = this.state.rangeValue ; + + if (!rangeValue.some(e => e === undefined)) + { + const pythonMessage = `netpyne_geppetto.${model}['${name}']['${conds}']['${rangeType}'] = [${rangeValue}]` ; + Utils.execPythonMessage( + pythonMessage + ); + } + + this.setState({ rangeType}) + } + //preConds: pop, cellType, cellModel, x, y, z, xnorm, ynorm, znorm handleCoordParamChange(index, newValue) { const { @@ -151,7 +178,7 @@ export default class NetPyNECoordsRange extends Component { id={`${this.props.id}Select`} label="Range type" value={this.state.rangeType || ''} - onChange={(event) => this.setState({ rangeType: event.target.value })} + onChange={(event) => { this.handleRangeTypeChange(event); }} > {this.createMenuItems()} From 55e4da2247945c4996fae0b6208414b8b042f455 Mon Sep 17 00:00:00 2001 From: enicolasgomez Date: Tue, 28 Nov 2023 09:56:25 -0300 Subject: [PATCH 6/6] Fixed ids for textfields in coords range component --- webapp/components/general/NetPyNECoordsRange.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webapp/components/general/NetPyNECoordsRange.js b/webapp/components/general/NetPyNECoordsRange.js index 62126a04..dc576000 100644 --- a/webapp/components/general/NetPyNECoordsRange.js +++ b/webapp/components/general/NetPyNECoordsRange.js @@ -186,8 +186,8 @@ export default class NetPyNECoordsRange extends Component { {(this.state.rangeType != undefined) ? ( - { this.handleCoordParamChange(0, parseInt(e.target.value)) } } /> - { this.handleCoordParamChange(1, parseInt(e.target.value)) } } /> + { this.handleCoordParamChange(0, parseInt(e.target.value)) } } /> + { this.handleCoordParamChange(1, parseInt(e.target.value)) } } /> ) : null}