import React from 'react'; import { Button, ButtonGroup, Col, FormGroup, InputGroup, Form, FormControl, Label, OverlayTrigger, Row, 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 SouthPane from './SouthPane'; import Timer from './Timer'; import SqlEditorLeftBar from './SqlEditorLeftBar'; class SqlEditor extends React.Component { constructor(props) { super(props); this.state = { autorun: props.queryEditor.autorun, sql: props.queryEditor.sql, ctas: '', }; } componentDidMount() { this.onMount(); } onMount() { if (this.state.autorun) { this.setState({ autorun: false }); this.props.actions.queryEditorSetAutorun(this.props.queryEditor, false); this.startQuery(); } } runQuery(runAsync = false) { this.startQuery(runAsync); } startQuery(runAsync = false, ctas = false) { const query = { dbId: this.props.queryEditor.dbId, sql: this.props.queryEditor.sql, sqlEditorId: this.props.queryEditor.id, tab: this.props.queryEditor.title, tempTableName: this.state.ctas, runAsync, ctas, }; this.props.actions.runQuery(query); } stopQuery() { this.props.actions.stopQuery(this.props.latestQuery); } createTableAs() { this.startQuery(true, true); } 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() {} ctasChanged(event) { this.setState({ ctas: event.target.value }); } sqlEditorHeight() { // quick hack to make the white bg of the tab stretch full height. const tabNavHeight = 40; const navBarHeight = 56; const mysteryVerticalHeight = 50; return window.innerHeight - tabNavHeight - navBarHeight - mysteryVerticalHeight; } render() { let runButtons = []; if (this.props.database && this.props.database.allow_run_sync) { runButtons.push( ); } if (this.props.database && this.props.database.allow_run_async) { runButtons.push( ); } runButtons = ( {runButtons} ); if (this.props.latestQuery && ['running', 'pending'].includes(this.props.latestQuery.state)) { runButtons = ( ); } let limitWarning = null; if (this.props.latestQuery && this.props.latestQuery.limit_reached) { const tooltip = ( It appears that the number of rows in the query results displayed was limited on the server side to the {this.props.latestQuery.rows} limit. ); limitWarning = ( ); } let ctasControls; if (this.props.database && this.props.database.allow_ctas) { ctasControls = ( ); } const editorBottomBar = (
{runButtons} {ctasControls}
{limitWarning}
); return (
{editorBottomBar}
); } } SqlEditor.propTypes = { actions: React.PropTypes.object, database: React.PropTypes.object, latestQuery: React.PropTypes.object, queryEditor: React.PropTypes.object, }; SqlEditor.defaultProps = { }; function mapStateToProps() { return {}; } function mapDispatchToProps(dispatch) { return { actions: bindActionCreators(Actions, dispatch), }; } export default connect(mapStateToProps, mapDispatchToProps)(SqlEditor);