import React from 'react'; import { Alert, Button, ButtonGroup, ProgressBar } from 'react-bootstrap'; import { Table } from 'reactable'; import shortid from 'shortid'; import VisualizeModal from './VisualizeModal'; import HighlightedSql from './HighlightedSql'; const propTypes = { actions: React.PropTypes.object, csv: React.PropTypes.bool, query: React.PropTypes.object, search: React.PropTypes.bool, searchText: React.PropTypes.string, showSql: React.PropTypes.bool, visualize: React.PropTypes.bool, cache: React.PropTypes.bool, }; const defaultProps = { search: true, visualize: true, showSql: false, csv: true, searchText: '', actions: {}, cache: false, }; class ResultSet extends React.PureComponent { constructor(props) { super(props); this.state = { searchText: '', showModal: false, data: [], }; } componentWillReceiveProps(nextProps) { // when new results comes in, save them locally and clear in store if (this.props.cache && (!nextProps.query.cached) && nextProps.query.results && nextProps.query.results.data.length > 0) { this.setState( { data: nextProps.query.results.data }, this.clearQueryResults(nextProps.query) ); } } getControls() { if (this.props.search || this.props.visualize || this.props.csv) { let csvButton; if (this.props.csv) { csvButton = ( ); } let visualizeButton; if (this.props.visualize) { visualizeButton = ( ); } let searchBox; if (this.props.search) { searchBox = ( ); } return (
{visualizeButton} {csvButton}
{searchBox}
); } return
; } clearQueryResults(query) { this.props.actions.clearQueryResults(query); } popSelectStar() { const qe = { id: shortid.generate(), title: this.props.query.tempTable, autorun: false, dbId: this.props.query.dbId, sql: `SELECT * FROM ${this.props.query.tempTable}`, }; this.props.actions.addQueryEditor(qe); } showModal() { this.setState({ showModal: true }); } hideModal() { this.setState({ showModal: false }); } changeSearch(event) { this.setState({ searchText: event.target.value }); } fetchResults(query) { this.props.actions.fetchQueryResults(query); } reFetchQueryResults(query) { this.props.actions.reFetchQueryResults(query); } render() { const query = this.props.query; const results = query.results; let data; if (this.props.cache && query.cached) { data = this.state.data; } else { data = results ? results.data : []; } let sql; if (this.props.showSql) { sql = ; } if (['running', 'pending', 'fetching'].indexOf(query.state) > -1) { let progressBar; if (query.progress > 0 && query.state === 'running') { progressBar = ( ); } return (
Loading... {progressBar}
); } else if (query.state === 'failed') { return {query.errorMessage}; } else if (query.state === 'success' && query.ctas) { return (
Table [{query.tempTable}] was created  
); } else if (query.state === 'success') { if (results && data && data.length > 0) { return (
{this.getControls.bind(this)()} {sql}
col.name)} sortable className="table table-condensed table-bordered" filterBy={this.state.searchText} filterable={results.columns.map((c) => c.name)} hideFilterInput /> ); } else if (query.resultsKey) { return (
This query was run asynchronously  
); } } if (query.cached) { return ( ); } return (The query returned no data); } } ResultSet.propTypes = propTypes; ResultSet.defaultProps = defaultProps; export default ResultSet;