partridgejiang / Kekule-React

React component wrapper for Kekule.js widgets.
MIT License
3 stars 2 forks source link
cheminformatics javascript kekule kekulejs react reactjs

Kekule-React

React component wrapper for Kekule.js widgets.

Usage

Use the following codes to wrap a Kekule.js widget class to React component:

// composer.js
import { Kekule } from 'kekule';
import { KekuleReact } from 'kekule-react';
import 'kekule/theme';

let Composer = KekuleReact.Utils.wrapWidget(Kekule.Editor.Composer, 
    {
      // reactComponent.props.on[EventName] will be called when Kekule events being invoked in widget   
      exposeWidgetEvents: true,        
      // each of widget's property will map to a React component's property. E.g., setting reactComponent.props.chemObj will modify widget.chemObj
      exposeWidgetPropertiesToReactProps: true,
      // explicitly set property names exposed to React
      //exposedProperties: []
      // property names hide from React
      ignoredProperties: ['editorNexus', 'actionMap']
    });

export default Composer;

Then the wrapped component can be utilized in React application:

// myApp.js
class MyApp extends React.Component {
    constructor(props)
    {
        super(props);
        this.state = {
            composerPredefinedSetting: 'molOnly',             
            chemObj: null
        };
        this.composer = React.createRef();          

        this.onComposerUserModificationDone = this.onComposerUserModificationDone.bind(this);
    }
    render()
    {
        return (<div>
            <Composer predefinedSetting={this.state.composerPredefinedSetting} onUserModificationDone={this.onComposerUserModificationDone}></Composer>           
        </div>);
    }

    onComposerUserModificationDone(e)
    {
        this.setState({chemObj: this.composer.current.getWidget().getChemObj()});           
    }
}

export default MyApp;

Some common-used Kekule widgets has already been wrapped with default options ({exposeWidgetEvents: true, 'exposeWidgetPropertiesToReactProps': true}), you can use them directly:

import { Kekule } from 'kekule';
import { KekuleReact, Components } from 'kekule-react';
import 'kekule/theme';

class App extends React.Component {     
    render()
    {
        return (<div>
                    <Components.PeriodicTable />
                    <Components.Viewer />
                    <Components.SpectrumInspector />
                    <Components.ChemObjInserter />
                    <Components.SpectrumObjInserter />
                    <Components.Composer />
        </div>);
    }
}

Several util methods are also wrapped in the React component to access the widget:

Inside the wrapped Kekule widget, method kekuleWidget.getReactComponent() can be used to retrieve the wrapper React component. E.g.:

console.log(reactComponent.getWidget().getReactComponent() === reactComponent);  // true
console.log(reactComponent.getWidgetPropValue('enabled') === reactComponent.getWidget().enabled);  // true

You may also check the simple demo at the /demo directory of this repository to learn more.