/** * Created by avim on 11/25/2014. */ /*global ace:true*/ define(['react', 'lodash']/*, 'ace'*/, function (React, _/*, ace*/) { 'use strict'; return React.createClass({ displayName: 'BraceEditor', propTypes: { id: React.PropTypes.string, mode: React.PropTypes.string, readOnly: React.PropTypes.bool, value: React.PropTypes.string, valueLink: React.PropTypes.string, onChange: React.PropTypes.function }, getInitialState: function () { return { editorId: _.uniqueId() }; }, componentWillMount: _.noop, render: function () { var props = _.omit(this.props, ['ref', 'key', 'value', 'valueLink', 'onChange']); props.id = this.props.id || this.state.editorId; return React.DOM.div(props); }, componentWillUpdate: function (nextProps/*, nextState*/) { var value = nextProps.valueLink ? nextProps.valueLink() : nextProps.value; if (this.editor && this.editor.getValue() !== value) { this.editor.setValue(value, 0); } }, componentDidMount: function () { this.editor = ace.edit(this.props.id || this.state.editorId); // this.editor.setTheme('ace/theme/monokai'); this.editor.setTheme('ace/theme/solarized_light'); if (this.props.mode === 'html') { this.editor.getSession().setMode('ace/mode/html'); } else { this.editor.getSession().setMode('ace/mode/javascript'); } this.editor.getSession().setUseWorker(false); var value = this.props.valueLink ? this.props.valueLink() : this.props.value; this.editor.setValue(value, 0); if (this.props.readOnly) { this.editor.setReadOnly(true); } else { this.editor.setReadOnly(false); this.editor.on('change', function (/*e*/) { if (this.props.valueLink) { this.props.valueLink(this.editor.getValue()); } else if (this.props.onChange) { this.props.onChange({target: {value: this.editor.getValue()}}); } }.bind(this)); } this.editor.clearSelection(); }, componentWillUnmount: function () { this.editor.destroy(); } }); });