const $ = window.$ = require('jquery'); import React from 'react'; import { Button, ButtonGroup, DropdownButton, Label, MenuItem, OverlayTrigger, Tooltip, } from 'react-bootstrap'; import AceEditor from 'react-ace'; import 'brace/mode/sql'; import 'brace/theme/github'; import 'brace/ext/language_tools'; import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; import * as Actions from '../actions'; import shortid from 'shortid'; import ButtonWithTooltip from './ButtonWithTooltip'; import SouthPane from './SouthPane'; import Timer from './Timer'; import SqlEditorTopToolbar from './SqlEditorTopToolbar'; // CSS import 'react-select/dist/react-select.css'; class SqlEditor extends React.Component { constructor(props) { super(props); this.state = { autorun: props.queryEditor.autorun, sql: props.queryEditor.sql, }; } componentDidMount() { this.onMount(); } onMount() { if (this.state.autorun) { this.setState({ autorun: false }); this.props.actions.queryEditorSetAutorun(this.props.queryEditor, false); this.startQuery(); } } getTableOptions(input, callback) { const url = '/tableasync/api/read?_oc_DatabaseAsync=database_name&_od_DatabaseAsync=asc'; $.get(url, function (data) { const options = []; for (let i = 0; i < data.pks.length; i++) { options.push({ value: data.pks[i], label: data.result[i].table_name }); } callback(null, { options, cache: false, }); }); } startQuery() { const that = this; const query = { id: shortid.generate(), sqlEditorId: this.props.queryEditor.id, sql: this.state.sql, state: 'running', tab: this.props.queryEditor.title, dbId: this.props.queryEditor.dbId, startDttm: new Date(), }; const url = '/caravel/sql_json/'; const data = { sql: this.state.sql, database_id: this.props.queryEditor.dbId, schema: this.props.queryEditor.schema, json: true, }; this.props.actions.startQuery(query); $.ajax({ type: 'POST', dataType: 'json', url, data, success(results) { try { that.props.actions.querySuccess(query, results); } catch (e) { that.props.actions.queryFailed(query, e); } }, error(err) { let msg = ''; try { msg = err.responseJSON.error; } catch (e) { msg = (err.responseText) ? err.responseText : e; } that.props.actions.queryFailed(query, msg); }, }); } stopQuery() { this.props.actions.stopQuery(this.props.latestQuery); } textChange(text) { this.setState({ sql: text }); this.props.actions.queryEditorSetSql(this.props.queryEditor, text); } addWorkspaceQuery() { this.props.actions.addWorkspaceQuery({ id: shortid.generate(), sql: this.state.sql, dbId: this.props.queryEditor.dbId, schema: this.props.queryEditor.schema, title: this.props.queryEditor.title, }); } ctasChange() {} visualize() {} render() { let runButtons = ( ); if (this.props.latestQuery && this.props.latestQuery.state === 'running') { runButtons = ( ); } const rightButtons = (   }> export to .csv export to .json ); let limitWarning = null; const rowLimit = 1000; if (this.props.latestQuery && this.props.latestQuery.rows === rowLimit) { const tooltip = ( It appears that the number of rows in the query results displayed was limited on the server side to the {rowLimit} limit. ); limitWarning = ( ); } const editorBottomBar = (
{runButtons}
{limitWarning} {rightButtons}
); return (
{editorBottomBar}
); } } SqlEditor.propTypes = { queryEditor: React.PropTypes.object, actions: React.PropTypes.object, latestQuery: React.PropTypes.object, }; SqlEditor.defaultProps = { }; function mapStateToProps() { return {}; } function mapDispatchToProps(dispatch) { return { actions: bindActionCreators(Actions, dispatch), }; } export default connect(mapStateToProps, mapDispatchToProps)(SqlEditor);