Skip to content

Commit 5cc3afc

Browse files
authored
Merge pull request #146 from MetaCell/feature/142
Feature/142: Layout refactor
2 parents b376843 + 05a60a5 commit 5cc3afc

38 files changed

Lines changed: 4827 additions & 5116 deletions

netpyne_ui/geppetto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Subproject commit 7588ed3475f0da25e6caed3d48e43b86d1fb4fc4

package-lock.json

Lines changed: 0 additions & 3 deletions
This file was deleted.

webapp/Main.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ jQuery(function () {
88
const MuiThemeProvider = require('@material-ui/core/styles').MuiThemeProvider;
99
const NetPyNE = require('./components').NetPyNE;
1010

11-
const theme = require('./Theme').default
11+
const theme = require('./theme').default
1212

1313
const Provider = require("react-redux").Provider;
1414
const configureStore = require('./redux/store').default;

webapp/Utils.js

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -185,32 +185,5 @@ const Utils = {
185185
evalPythonMessage: evalPythonMessage
186186
}
187187

188-
/**
189-
* Deep object comparison
190-
* @param {*} a
191-
* @param {*} b
192-
*/
193-
export function isEqual (a, b) {
194-
if (a === b) {
195-
return true;
196-
}
197-
if (a instanceof Date && b instanceof Date) {
198-
return a.getTime() === b.getTime();
199-
}
200-
if (!a || !b || (typeof a !== 'object' && typeof b !== 'object')) {
201-
return a === b;
202-
}
203-
if (a === null || a === undefined || b === null || b === undefined) {
204-
return false;
205-
}
206-
if (a.prototype !== b.prototype) {
207-
return false;
208-
}
209-
let keys = Object.keys(a);
210-
if (keys.length !== Object.keys(b).length) {
211-
return false;
212-
}
213-
return keys.every(k => isEqual(a[k], b[k]));
214-
}
215188

216189
export default Utils

webapp/components/NetPyNE.js

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
} from "netpyne/components";
88

99
import { withStyles } from '@material-ui/core/styles'
10-
10+
import Utils from '../Utils';
1111
const styles = ({ zIndex, palette, spacing }) => ({
1212
root: { height: '100%', overflow: 'hidden' },
1313
container: {
@@ -18,18 +18,44 @@ const styles = ({ zIndex, palette, spacing }) => ({
1818
},
1919
topbar: { position: "relative", zIndex: zIndex.drawer + 1 },
2020
content: { flexGrow:1, display: 'flex', flexDirection: 'row', position: 'relative' }
21-
})
21+
});
22+
23+
import { EDIT_WIDGETS, PYTHON_CONSOLE_WIDGET, WidgetStatus } from '../constants'
2224

2325

2426
class NetPyNE extends React.Component {
2527

2628
openPythonCallDialog (event) {
2729
const payload = { errorMessage: event['evalue'], errorDetails: event['traceback'].join('\n') }
28-
this.props.pythonCallErrorDialogBox(payload)
30+
this.props.pythonCallErrorDialogBox(payload);
31+
}
32+
33+
addMetadataToWindow (data) {
34+
console.log("Initialising NetPyNE Tabs");
35+
window.metadata = data.metadata;
36+
window.currentFolder = data.currentFolder;
37+
window.isDocker = data.isDocker;
38+
window.pythonConsoleLoaded = true
2939
}
3040

3141
componentDidMount () {
32-
GEPPETTO.on(GEPPETTO.Events.Error_while_exec_python_command, this.openPythonCallDialog, this)
42+
GEPPETTO.on(GEPPETTO.Events.Error_while_exec_python_command, this.openPythonCallDialog, this);
43+
this.props.setWidgets({ [PYTHON_CONSOLE_WIDGET.id]: { ...PYTHON_CONSOLE_WIDGET, panelName: PYTHON_CONSOLE_WIDGET.defaultPanel, status: WidgetStatus.ACTIVE } });
44+
GEPPETTO.on('jupyter_geppetto_extension_ready', data => {
45+
let project = { id: 1, name: 'Project', experiments: [{ "id": 1, "name": 'Experiment', "status": 'DESIGN' }] }
46+
GEPPETTO.Manager.loadProject(project, false);
47+
GEPPETTO.Manager.loadExperiment(1, [], []);
48+
Utils.execPythonMessage('from netpyne_ui.netpyne_geppetto import netpyne_geppetto');
49+
Utils.evalPythonMessage('netpyne_geppetto.getData',[]).then(response => {
50+
const data = Utils.convertToJSON(response);
51+
this.addMetadataToWindow(data);
52+
this.props.modelLoaded();
53+
this.props.setWidgets(EDIT_WIDGETS);
54+
GEPPETTO.trigger("spinner:hide");
55+
})
56+
57+
});
58+
3359
}
3460

3561
componentWillUnmount () {
@@ -38,6 +64,7 @@ class NetPyNE extends React.Component {
3864

3965
render () {
4066
const { classes } = this.props
67+
const Layout = LayoutManager();
4168
return (
4269
<div className={classes.root}>
4370
<div className={classes.container}>
@@ -46,7 +73,7 @@ class NetPyNE extends React.Component {
4673
</div>
4774
<div className={classes.content}>
4875
<Drawer/>
49-
<LayoutManager/>
76+
<Layout />
5077
</div>
5178
</div>
5279
</div>

webapp/components/general/NetPyNEIcons.js

Lines changed: 3 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 9 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,25 @@
11
import React, { Component } from 'react'
2-
import Utils from '../../Utils'
32

43
import PythonConsole from '@geppettoengine/geppetto-client/js/components/interface/pythonConsole/PythonConsole';
54

6-
export default class NetPyNEPythonConsole extends Component {
7-
8-
addMetadataToWindow (data) {
9-
console.log("Initialising NetPyNE Tabs");
10-
window.metadata = data.metadata;
11-
window.currentFolder = data.currentFolder;
12-
window.isDocker = data.isDocker;
13-
window.pythonConsoleLoaded = true
5+
export class NetPyNEPythonConsole extends Component {
6+
7+
shouldComponentUpdate () {
8+
return false;
149
}
1510

1611
componentWillUnmount () {
17-
console.log("unmounting python console")
12+
console.info("unmounting python console");
1813
}
1914

2015
componentDidMount () {
21-
if (!window.pythonConsoleLoaded) {
22-
GEPPETTO.on('jupyter_geppetto_extension_ready', data => {
23-
let project = { id: 1, name: 'Project', experiments: [{ "id": 1, "name": 'Experiment', "status": 'DESIGN' }] }
24-
GEPPETTO.Manager.loadProject(project, false);
25-
GEPPETTO.Manager.loadExperiment(1, [], []);
26-
Utils.execPythonMessage('from netpyne_ui.netpyne_geppetto import netpyne_geppetto');
27-
Utils.evalPythonMessage('netpyne_geppetto.getData',[]).then(response => {
28-
const data = Utils.convertToJSON(response);
29-
this.addMetadataToWindow(data)
30-
this.props.modelLoaded();
31-
GEPPETTO.trigger("spinner:hide");
32-
})
33-
});
34-
}
16+
3517

3618
}
3719
render () {
3820
return <PythonConsole pythonNotebookPath={"notebooks/notebook.ipynb"} />
3921
}
4022
}
23+
24+
25+
export default NetPyNEPythonConsole;

webapp/components/index.js

Lines changed: 14 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,10 @@ import PythonControlledCapability from "geppetto-client/js/communication/geppett
44

55
import {
66
activateWidget,
7-
destroyWidget,
8-
minimizeWidget,
9-
maximizeWidget,
7+
setWidgets,
108
updateWidget,
119
newWidget
12-
} from "../redux/actions/flexlayout";
10+
} from "../redux/actions/layout";
1311
import { openBackendErrorDialog, closeBackendErrorDialog } from '../redux/actions/errors';
1412
import {
1513
updateCards, editModel, simulateNetwork, createNetwork,
@@ -79,8 +77,14 @@ export const Dimensions = connect(
7977

8078
import _NetPyNE from "./NetPyNE";
8179
export const NetPyNE = connect(
82-
state => ({ editMode: state.general.editMode }),
83-
pythonCallErrorDispatch
80+
null,
81+
dispatch => ({
82+
pythonCallErrorDialogBox: payload => dispatch(openBackendErrorDialog(payload)),
83+
setWidgets: payload => dispatch(setWidgets(payload)),
84+
modelLoaded: () => dispatch(modelLoaded),
85+
newWidget: widget => dispatch(newWidget(widget)),
86+
activateWidget: widgetId => dispatch(activateWidget(widgetId))
87+
})
8488
)(_NetPyNE);
8589

8690
import _NetPyNECellRule from "./definition/cellRules/NetPyNECellRule";
@@ -90,17 +94,8 @@ export const NetPyNECellRule = connect((state, ownProps) => ({
9094
}))(_NetPyNECellRule);
9195

9296

93-
import _LayoutManager from "./layout/LayoutManager";
94-
export const LayoutManager = connect(
95-
state => ({ ...state.flexlayout, editMode: state.general.editMode }),
96-
dispatch => ({
97-
updateWidget: widget => dispatch(updateWidget(widget)),
98-
minimizeWidget: id => dispatch(minimizeWidget(id)),
99-
destroyWidget: id => dispatch(destroyWidget(id)),
100-
maximizeWidget: id => dispatch(maximizeWidget(id)),
101-
activateWidget: id => dispatch(activateWidget(id))
102-
})
103-
)(_LayoutManager);
97+
import { getInstance as getLayoutManagerInstance } from "./layout/LayoutManager";
98+
export const LayoutManager = () => connect(state => ({ layout: state.layout, }))(getLayoutManagerInstance().getComponent());
10499

105100

106101
import _NetPyNEPopulation from "./definition/populations/NetPyNEPopulation";
@@ -196,22 +191,11 @@ export const ActionDialog = connect(
196191
})
197192
)(_ActionDialog)
198193

199-
import _NetPyNEPythonConsole from './general/NetPyNEPythonConsole'
200-
export const NetPyNEPythonConsole = connect(
201-
null,
202-
dispatch => ({
203-
modelLoaded: () => dispatch(modelLoaded),
204-
newWidget: widget => dispatch(newWidget(widget)),
205-
activateWidget: widgetId => dispatch(activateWidget(widgetId))
206-
})
207-
)(_NetPyNEPythonConsole)
194+
export { NetPyNEPythonConsole } from './general/NetPyNEPythonConsole';
208195

209196
import _Drawer from './settings/Drawer'
210197
export const Drawer = connect(
211-
state => ({
212-
widgets: state.flexlayout.widgets,
213-
editMode: state.general.editMode
214-
}),
198+
state => ({ editMode: state.general.editMode, layout: state.layout }),
215199
dispatch => ({
216200
updateWidget: newConf => dispatch(updateWidget(newConf)),
217201
newWidget: widget => dispatch(newWidget(widget)),

0 commit comments

Comments
 (0)