diff --git a/openbis_ng_ui/src/js/components/App.jsx b/openbis_ng_ui/src/js/components/App.jsx index 425a8f84bab242e4c67b966b81b5603da9333756..e06b48c7d8848d9a5f662d9eceda8cd49a649cb6 100644 --- a/openbis_ng_ui/src/js/components/App.jsx +++ b/openbis_ng_ui/src/js/components/App.jsx @@ -17,6 +17,9 @@ import Users from '@src/js/components/users/Users.jsx' import Types from '@src/js/components/types/Types.jsx' import Tools from '@src/js/components/tools/Tools.jsx' +import AppController from '@src/js/components/AppController.js' +import ComponentContext from '@src/js/components/common/ComponentContext.js' + const styles = { container: { height: '100%', @@ -64,6 +67,20 @@ function mapDispatchToProps(dispatch) { } class App extends React.Component { + constructor(props) { + super(props) + + this.state = {} + + if (this.props.controller) { + this.controller = this.props.controller + } else { + this.controller = AppController + } + + this.controller.init(new ComponentContext(this)) + } + componentDidMount() { this.props.init() } @@ -72,11 +89,15 @@ class App extends React.Component { logger.log(logger.DEBUG, 'App.render') return ( - <Loading loading={this.props.loading}> - <Error error={this.props.error} errorClosed={this.props.errorClosed}> - {this.props.initialized && this.renderPage()} - </Error> - </Loading> + <AppController.LastObjectModificationsContext.Provider + value={AppController.getLastObjectModifications()} + > + <Loading loading={this.props.loading}> + <Error error={this.props.error} errorClosed={this.props.errorClosed}> + {this.props.initialized && this.renderPage()} + </Error> + </Loading> + </AppController.LastObjectModificationsContext.Provider> ) } diff --git a/openbis_ng_ui/src/js/components/AppController.js b/openbis_ng_ui/src/js/components/AppController.js new file mode 100644 index 0000000000000000000000000000000000000000..20f17f11ce583afec9bf91fcfb4c2c8dbcbc8c9c --- /dev/null +++ b/openbis_ng_ui/src/js/components/AppController.js @@ -0,0 +1,53 @@ +import React from 'react' + +class AppController { + constructor() { + this.LastObjectModificationsContext = React.createContext() + } + + init(context) { + this.context = context + + const initialState = { + lastObjectModifications: 'abc' + } + + context.initState(initialState) + } + + getLastObjectModifications() { + return this.context.getState().lastObjectModifications + } + + setLastObjectModifications(lastObjectModifications) { + this.context.setState({ + lastObjectModifications: lastObjectModifications + }) + } + + withLastObjectModifications() { + return this._withContext( + this.LastObjectModificationsContext, + 'lastObjectModifications' + ) + } + + _withContext(Context, propertyName) { + const WithContext = Component => { + const WithConsumer = props => { + return React.createElement(Context.Consumer, {}, value => + React.createElement(Component, { + ...props, + [propertyName]: value + }) + ) + } + WithConsumer.displayName = 'WithConsumer' + return WithConsumer + } + WithContext.displayName = 'WithContext' + return WithContext + } +} + +export default new AppController() diff --git a/openbis_ng_ui/src/js/components/common/browser/BrowserButtons.jsx b/openbis_ng_ui/src/js/components/common/browser/BrowserButtons.jsx index ed6505afb9447e022333891b4ba0c6d698de824f..4aece59442f9ff62c6426f892bfc022bf78139d0 100644 --- a/openbis_ng_ui/src/js/components/common/browser/BrowserButtons.jsx +++ b/openbis_ng_ui/src/js/components/common/browser/BrowserButtons.jsx @@ -1,3 +1,4 @@ +import _ from 'lodash' import React from 'react' import { withStyles } from '@material-ui/core/styles' import Container from '@src/js/components/common/form/Container.jsx' @@ -5,6 +6,8 @@ import Button from '@src/js/components/common/form/Button.jsx' import messages from '@src/js/common/messages.js' import logger from '@src/js/common/logger.js' +import AppController from '@src/js/components/AppController.js' + const styles = theme => ({ container: { display: 'flex', @@ -22,7 +25,13 @@ class BrowserButtons extends React.Component { render() { logger.log(logger.DEBUG, 'BrowserButtons.render') - const { controller, classes, addEnabled, removeEnabled } = this.props + const { + controller, + classes, + addEnabled, + removeEnabled, + lastObjectModifications + } = this.props return ( <Container className={classes.container}> @@ -40,9 +49,13 @@ class BrowserButtons extends React.Component { onClick={controller.nodeRemove} disabled={!removeEnabled} /> + {lastObjectModifications} </Container> ) } } -export default withStyles(styles)(BrowserButtons) +export default _.flow( + withStyles(styles), + AppController.withLastObjectModifications() +)(BrowserButtons) diff --git a/openbis_ng_ui/src/js/components/common/grid/Grid.jsx b/openbis_ng_ui/src/js/components/common/grid/Grid.jsx index c92e7f64234b5775ad0b2e1fe32e18fdc4fcddae..2ff2aa5e6e17f98aaeab002f68b56999648343da 100644 --- a/openbis_ng_ui/src/js/components/common/grid/Grid.jsx +++ b/openbis_ng_ui/src/js/components/common/grid/Grid.jsx @@ -19,6 +19,8 @@ import GridFiltersConfig from '@src/js/components/common/grid/GridFiltersConfig. import ComponentContext from '@src/js/components/common/ComponentContext.js' import logger from '@src/js/common/logger.js' +import AppController from '@src/js/components/AppController.js' + const styles = theme => ({ container: { minWidth: '800px', @@ -176,6 +178,13 @@ class Grid extends React.PureComponent { {this.renderPaging()} {this.renderConfigs()} {this.renderExports()} + <button + onClick={() => { + AppController.setLastObjectModifications(Math.random()) + }} + > + Test + </button> </GridRowFullWidth> ) }