react-templates/playground/aceEditor.js

62 lines
2.0 KiB
JavaScript
Raw Normal View History

/**
* Created by avim on 11/25/2014.
*/
2014-11-27 17:53:37 +01:00
'use strict';
2014-12-08 11:45:32 +01:00
/*global ace:true*/
define(['react', 'lodash'/*, 'ace'*/], function (React, _/*, ace*/) {
var editor = React.createClass({
2014-11-27 17:53:37 +01:00
displayName: 'BraceEditor',
getInitialState: function () {
return {
editorId: _.uniqueId()
2014-11-27 17:53:37 +01:00
};
},
componentWillMount: function () {
},
render: function () {
2014-12-08 11:45:32 +01:00
var props = _.omit(this.props, ['ref', 'key', 'value', 'valueLink', 'onChange']);
props.id = this.props.id || this.state.editorId;
2014-11-27 17:53:37 +01:00
return React.DOM.div(props);
},
2014-11-27 17:53:37 +01:00
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 () {
2014-12-08 11:45:32 +01:00
this.editor = ace.edit(this.props.id || this.state.editorId);
2014-11-30 12:59:44 +01:00
// this.editor.setTheme('ace/theme/monokai');
this.editor.setTheme('ace/theme/solarized_light');
2014-11-27 17:53:37 +01:00
if (this.props.mode !== 'html') {
this.editor.getSession().setMode('ace/mode/javascript');
} else {
this.editor.getSession().setMode('ace/mode/html');
}
this.editor.getSession().setUseWorker(false);
2014-11-27 17:53:37 +01:00
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);
2014-11-27 17:53:37 +01:00
this.editor.on('change', function (/*e*/) {
if (this.props.valueLink) {
this.props.valueLink(this.editor.getValue());
} else if (this.props.onChange) {
2014-11-27 17:53:37 +01:00
this.props.onChange({target: {value: this.editor.getValue()}});
}
}.bind(this));
}
2014-11-30 12:59:44 +01:00
this.editor.clearSelection();
},
componentWillUnmount: function () {
this.editor.destroy();
}
});
return editor;
});