Skip to content

Commit 1be0eef

Browse files
author
rodriguez-facundo
committed
#135 Moved drawer menu actions to redux
1 parent 18edde2 commit 1be0eef

22 files changed

Lines changed: 279 additions & 177 deletions

File tree

webapp/Utils.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ const Utils = {
145145
},
146146

147147
parsePythonException (exception){
148-
return <pre dangerouslySetInnerHTML={{ __html: IPython.utils.fixConsole(exception) }}></pre>
148+
return <pre style={{ whiteSpace: 'pre-wrap' }} dangerouslySetInnerHTML={{ __html: IPython.utils.fixConsole(exception) }}></pre>
149149
},
150150

151151
handleUpdate (updateCondition, newValue, originalValue, context, componentName) {

webapp/components/NetPyNE.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,19 @@ export default class NetPyNE extends React.Component {
2222

2323
}
2424

25+
openPythonCallDialog (event) {
26+
const payload = { errorMessage: event['evalue'], errorDetails: event['traceback'].join('\n') }
27+
this.props.pythonCallErrorDialogBox(payload)
28+
}
29+
30+
componentDidMount () {
31+
GEPPETTO.on(GEPPETTO.Events.Error_while_exec_python_command, this.openPythonCallDialog, this)
32+
}
33+
34+
componentWillUnmount () {
35+
GEPPETTO.off(GEPPETTO.Events.Error_while_exec_python_command, this.openPythonCallDialog, this)
36+
}
37+
2538
UNSAFE_componentWillReceiveProps (nextProps) {
2639
if (this.props.data != nextProps.data) {
2740
console.log("Initialising NetPyNE Tabs");

webapp/components/definition/cellRules/NetPyNECellRules.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,15 @@ export default class NetPyNECellRules extends React.Component {
307307
if (newMechanismName !== undefined) {
308308
this.setState({ selectedMechanism: newMechanismName });
309309
}
310+
311+
if (Object.keys(this.state.value).length === 0) {
312+
this.setState({
313+
selectedCellRule: undefined,
314+
selectedSection: undefined,
315+
selectedMechanism: undefined,
316+
page: 'main'
317+
})
318+
}
310319
}
311320

312321
handleHierarchyClick = nextPage => {
@@ -540,7 +549,7 @@ export default class NetPyNECellRules extends React.Component {
540549
/>
541550
)
542551
}
543-
} else if (page == "sections") {
552+
} else if (page == "sections" && Object.keys(model).length > 0) {
544553
const sectionsModel = model[selectedCellRule].secs;
545554
if ( selectedSection !== undefined && Object.keys(sectionsModel).indexOf(selectedSection) > -1 ) {
546555
selection = (
@@ -562,7 +571,7 @@ export default class NetPyNECellRules extends React.Component {
562571
handleClick={this.selectSection}
563572
/>
564573
)
565-
} else if (page == "mechanisms") {
574+
} else if (page == "mechanisms" && Object.keys(model).length > 0) {
566575
const mechanismsModel = model[selectedCellRule].secs[selectedSection].mechs;
567576
if ((selectedMechanism !== undefined) && Object.keys(mechanismsModel).indexOf(selectedMechanism) > -1) {
568577
selection = (

webapp/components/definition/cellRules/sections/NetPyNESectionThumbnail.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import FontIcon from '@material-ui/core/Icon';
33
import Button from '@material-ui/core/Button';
44
import DeleteDialogBox from '../../../general/DeleteDialogBox';
55

6-
const styles = { btn: { borderRadius: '25px', marginRight: '8px' } };
6+
const styles = { btn: { borderRadius: '25px', margin: '8px' } };
77

88
export default class NetPyNESectionThumbnail extends React.Component {
99

webapp/components/general/Checkbox.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export default class Checkbox extends Component {
1313
control={
1414
<MuiCheckbox
1515
id={this.props.id}
16-
checked={this.props.checked}
16+
checked={this.props.checked || false}
1717
onChange={this.props.onChange}
1818
/>
1919
}

webapp/components/general/Select.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,20 @@ import MuiSelect from '@material-ui/core/Select';
55

66
export default class Select extends Component {
77
render () {
8+
var value = this.props.value
9+
if (this.props.multiple && this.props.value.constructor.name != 'Array') {
10+
// when loading values from a script, we can't allow strings if *multiple* is enabled
11+
value = [this.props.value]
12+
} else if (!this.props.multiple && this.props.value.length === 0 && this.props.value.constructor.name === 'Array' ) {
13+
// when *multiple* is disabled, we can't allow arrays
14+
value = ''
15+
}
816
return (
917
<FormControl >
1018
<InputLabel>{this.props.label}</InputLabel>
1119
<MuiSelect
1220
id={this.props.id}
13-
value={!this.props.multiple && this.props.value.length === 0 ? '' : this.props.value}
21+
value={value}
1422
onChange={this.props.onChange}
1523
multiple={!!this.props.multiple}
1624
>

webapp/components/index.js

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@ import {
88
minimizeWidget,
99
maximizeWidget
1010
} from "../redux/actions/flexlayout";
11-
12-
import { updateCards, editModel, createNetwork, createAndSimulateNetwork, showNetwork } from "../redux/actions/general";
11+
import { openBackendErrorDialog, closeBackendErrorDialog } from '../redux/actions/errors';
12+
import { updateCards, editModel, createNetwork, createAndSimulateNetwork, showNetwork, pythonCall } from "../redux/actions/general";
13+
import { closeDrawerDialogBox, openDrawerDialogBox } from '../redux/actions/drawer';
1314
import { newWidget } from "../redux/actions/flexlayout";
1415

1516
const updateCardsDispatch = dispatch => ({ updateCards: () => dispatch(updateCards) });
16-
const editModelDispatch = dispatch => ({ editModel: () => dispatch(editModel) });
17-
17+
const pythonCallErrorDispatch = dispatch => ({ pythonCallErrorDialogBox: payload => dispatch(openBackendErrorDialog(payload)) });
1818

1919
/** **** COMPONENT PROXIES ******/
2020

@@ -74,7 +74,7 @@ export const Dimensions = connect(
7474
import _NetPyNE from "./NetPyNE";
7575
export const NetPyNE = connect(
7676
state => ({ editMode: state.general.editMode, }),
77-
editModelDispatch
77+
pythonCallErrorDispatch
7878
)(_NetPyNE);
7979

8080
import _NetPyNECellRule from "./definition/cellRules/NetPyNECellRule";
@@ -163,7 +163,11 @@ export const NetPyNETabs = connect(
163163

164164
import _NetPyNEToolbar from "./settings/NetPyNEToolBar";
165165
export const NetPyNEToolBar = connect(
166-
state => state.general
166+
state => ({ ...state.general, ...state.drawer }),
167+
dispatch => ({
168+
closeDrawerDialogBox: () => dispatch(closeDrawerDialogBox),
169+
openDrawerDialogBox: () => dispatch(openDrawerDialogBox),
170+
})
167171
)(_NetPyNEToolbar);
168172

169173
import SelectField from "./general/Select";
@@ -187,6 +191,15 @@ export const NetPyNEInstantiated = connect(
187191
dispatch => ({ newWidget: conf => dispatch(newWidget(conf)), })
188192
)(_NetPyNEInstantiated)
189193

194+
195+
import _ActionDialog from './settings/actions/ActionDialog'
196+
export const ActionDialog = connect(
197+
state => ({ ...state.errors, openErrorDialogBox: state.errors.openDialog }),
198+
dispatch => ({
199+
pythonCall: (cmd, args) => dispatch(pythonCall(cmd, args)),
200+
closeBackendErrorDialog: () => dispatch(closeBackendErrorDialog)
201+
})
202+
)(_ActionDialog)
190203
// ---------------------------------------------------------------------------------------- //
191204

192205
// DEFAULTS

webapp/components/instantiation/NetPyNEInstantiated.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,11 @@ export default class NetPyNEInstantiated extends React.Component {
164164
componentDidMount () {
165165
this.canvasRef.current.engine.setLinesThreshold(10000);
166166
this.canvasRef.current.displayAllInstances();
167-
this.canvasRef.current.engine.updateSceneWithNewInstances(window.Instances);
167+
if (Instances.length > 2) {
168+
// update canvas only if there are instances to show
169+
this.canvasRef.current.engine.updateSceneWithNewInstances(window.Instances);
170+
}
171+
168172
this.canvasRef.current.setBackgroundColor('#191919')
169173

170174
window.addEventListener('resize', this.delayedResize.bind(this))

webapp/components/settings/NetPyNEToolBar.js

Lines changed: 46 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,33 @@ const ExportIcon = props => <SvgIcon {...props}><svg viewBox='0 0 750 750'><path
2222
const ImportIcon = props => <SvgIcon {...props}><svg viewBox='0 0 750 750'><path d='M16 288c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h112v-64H16zm336-152V0H152c-13.3 0-24 10.7-24 24v264h127.99v-65.18c0-14.28 17.29-21.41 27.36-11.27l95.7 96.43c6.6 6.65 6.6 17.39 0 24.04l-95.7 96.42c-10.06 10.14-27.36 3.01-27.36-11.27V352H128v136c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H376c-13.2 0-24-10.8-24-24zm153-31L407.1 7c-4.5-4.5-10.6-7-17-7H384v128h128v-6.1c0-6.3-2.5-12.4-7-16.9z'></path></svg></SvgIcon>;
2323
const CellTemplateIcon = props => <SvgIcon {...props}><svg viewBox="0 0 448 512"><path d="M448 75.2v361.7c0 24.3-19 43.2-43.2 43.2H43.2C19.3 480 0 461.4 0 436.8V75.2C0 51.1 18.8 32 43.2 32h361.7c24 0 43.1 18.8 43.1 43.2zm-37.3 361.6V75.2c0-3-2.6-5.8-5.8-5.8h-9.3L285.3 144 224 94.1 162.8 144 52.5 69.3h-9.3c-3.2 0-5.8 2.8-5.8 5.8v361.7c0 3 2.6 5.8 5.8 5.8h361.7c3.2.1 5.8-2.7 5.8-5.8zM150.2 186v37H76.7v-37h73.5zm0 74.4v37.3H76.7v-37.3h73.5zm11.1-147.3l54-43.7H96.8l64.5 43.7zm210 72.9v37h-196v-37h196zm0 74.4v37.3h-196v-37.3h196zm-84.6-147.3l64.5-43.7H232.8l53.9 43.7zM371.3 335v37.3h-99.4V335h99.4z"></path></svg></SvgIcon>;
2424

25+
const OPTIONS = {
26+
Load: { component: LoadFile, },
27+
Save: { component: SaveFile },
28+
ImportHLS: {
29+
component: ImportExportHLS,
30+
mode: 'IMPORT'
31+
},
32+
ExportHLS: {
33+
component: ImportExportHLS,
34+
mode: 'EXPORT'
35+
},
36+
ImportCellTemplate: { component: ImportCellParams, },
37+
NewModel: { component: NewModel, },
38+
UploadFiles: {
39+
component: UploadDownloadFiles,
40+
mode: 'UPLOAD'
41+
},
42+
DownloadFiles: {
43+
component: UploadDownloadFiles,
44+
mode: 'DOWNLOAD'
45+
},
46+
}
47+
2548
export default class NetPyNEToolBar extends React.Component {
2649
constructor (props) {
2750
super(props);
2851
this.state = {
29-
openDialogBox: false,
3052
open: false,
3153
openSnackBar: false,
3254
action: null
@@ -35,69 +57,73 @@ export default class NetPyNEToolBar extends React.Component {
3557
}
3658

3759
handleMenuItemClick = action => {
38-
this.setState({ action:action, openDialogBox:true, open: false })
60+
this.props.openDrawerDialogBox()
61+
this.setState({ action:action, open: false })
3962
}
4063

4164
handleOpenSnackBar (message) {
4265
this.snackBarMessage = message
4366
this.setState({ openSnackBar: true })
4467
}
4568

46-
69+
handleClose () {
70+
this.setState({ open: false })
71+
this.props.closeDrawerDialogBox()
72+
}
4773
render () {
4874

49-
if (this.state.openDialogBox){
75+
if (this.props.dialogBoxOpen){
5076
switch (this.state.action){
5177
case 'Load':
5278
var content = <LoadFile
53-
open={this.state.openDialogBox}
54-
onRequestClose={() => this.setState({ openDialogBox: false })}
79+
open={this.props.dialogBoxOpen}
80+
onRequestClose={() => this.handleClose()}
5581
/>
5682
break;
5783
case 'Save':
5884
var content = <SaveFile
59-
open={this.state.openDialogBox}
60-
onRequestClose={() => this.setState({ openDialogBox: false })}
85+
open={this.props.dialogBoxOpen}
86+
onRequestClose={() => this.handleClose()}
6187
/>
6288
break;
6389
case 'ImportHLS':
6490
var content = <ImportExportHLS
65-
open={this.state.openDialogBox}
66-
onRequestClose={() => this.setState({ openDialogBox: false })}
91+
open={this.props.dialogBoxOpen}
92+
onRequestClose={() => this.handleClose()}
6793
mode ={"IMPORT"}/>
6894
break;
6995
case 'ExportHLS':
7096
var content = <ImportExportHLS
71-
open={this.state.openDialogBox}
72-
onRequestClose={() => this.setState({ openDialogBox: false })}
97+
open={this.props.dialogBoxOpen}
98+
onRequestClose={() => this.handleClose()}
7399
mode ={"EXPORT"}
74100
/>
75101
break;
76102
case 'ImportCellTemplate':
77103
var content = <ImportCellParams
78-
open={this.state.openDialogBox}
79-
onRequestClose={() => this.setState({ openDialogBox: false })}
104+
open={this.props.dialogBoxOpen}
105+
onRequestClose={() => this.handleClose()}
80106
/>
81107
break;
82108
case 'NewModel':
83109
var content = <NewModel
84-
open={this.state.openDialogBox}
85-
onRequestClose={() => this.setState({ openDialogBox: false })}
110+
open={this.props.dialogBoxOpen}
111+
onRequestClose={() => this.handleClose()}
86112
/>
87113
break;
88114
case 'UploadFiles':
89115
var content = <UploadDownloadFiles
90-
open={this.state.openDialogBox}
91-
onRequestClose={() => this.setState({ openDialogBox: false })}
116+
open={this.props.dialogBoxOpen}
117+
onRequestClose={() => this.handleClose()}
92118
openSnackBar={message => {
93119
this.handleOpenSnackBar(message)
94120
} }
95121
mode ={"UPLOAD"}/>
96122
break;
97123
case 'DownloadFiles':
98124
var content = <UploadDownloadFiles
99-
open={this.state.openDialogBox}
100-
onRequestClose={() => this.setState({ openDialogBox: false })}
125+
open={this.props.dialogBoxOpen}
126+
onRequestClose={() => this.handleClose()}
101127
openSnackBar={message => {
102128
this.handleOpenSnackBar(message)
103129
} }

0 commit comments

Comments
 (0)