/* eslint camelcase: 0 */ import React, { PropTypes } from 'react'; import { bindActionCreators } from 'redux'; import * as actions from '../actions/exploreActions'; import { connect } from 'react-redux'; import ChartContainer from './ChartContainer'; import ControlPanelsContainer from './ControlPanelsContainer'; import SaveModal from './SaveModal'; import QueryAndSaveBtns from './QueryAndSaveBtns'; import { getExploreUrl } from '../exploreUtils'; import { getFormDataFromFields } from '../stores/store'; const propTypes = { actions: PropTypes.object.isRequired, datasource_type: PropTypes.string.isRequired, chartStatus: PropTypes.string.isRequired, fields: PropTypes.object.isRequired, forcedHeight: PropTypes.string, form_data: PropTypes.object.isRequired, standalone: PropTypes.bool.isRequired, triggerQuery: PropTypes.bool.isRequired, queryRequest: PropTypes.object, }; class ExploreViewContainer extends React.Component { constructor(props) { super(props); this.state = { height: this.getHeight(), showModal: false, }; } componentDidMount() { this.props.actions.fetchDatasources(); window.addEventListener('resize', this.handleResize.bind(this)); } componentWillReceiveProps(np) { if (np.fields.viz_type.value !== this.props.fields.viz_type.value) { this.props.actions.resetFields(); this.props.actions.triggerQuery(); } if (np.fields.datasource.value !== this.props.fields.datasource.value) { this.props.actions.fetchDatasourceMetadata(np.form_data.datasource, true); } } componentDidUpdate() { if (this.props.triggerQuery) { this.runQuery(); } } componentWillUnmount() { window.removeEventListener('resize', this.handleResize.bind(this)); } onQuery() { // remove alerts when query this.props.actions.removeControlPanelAlert(); this.props.actions.removeChartAlert(); this.runQuery(); history.pushState( {}, document.title, getExploreUrl(this.props.form_data)); } onStop() { this.props.actions.chartUpdateStopped(this.props.queryRequest); } getHeight() { if (this.props.forcedHeight) { return this.props.forcedHeight + 'px'; } const navHeight = this.props.standalone ? 0 : 90; return `${window.innerHeight - navHeight}px`; } runQuery() { this.props.actions.runQuery(this.props.form_data, this.props.datasource_type); } handleResize() { clearTimeout(this.resizeTimer); this.resizeTimer = setTimeout(() => { this.setState({ height: this.getHeight() }); }, 250); } toggleModal() { this.setState({ showModal: !this.state.showModal }); } renderErrorMessage() { // Returns an error message as a node if any errors are in the store const errors = []; for (const fieldName in this.props.fields) { const field = this.props.fields[fieldName]; if (field.validationErrors && field.validationErrors.length > 0) { errors.push(
{`[ ${field.label} ] `} {field.validationErrors.join('. ')}
); } } let errorMessage; if (errors.length > 0) { errorMessage = (
{errors}
); } return errorMessage; } renderChartContainer() { return ( ); } render() { if (this.props.standalone) { return this.renderChartContainer(); } return (
{this.state.showModal && }

{this.renderChartContainer()}
); } } ExploreViewContainer.propTypes = propTypes; function mapStateToProps(state) { const form_data = getFormDataFromFields(state.fields); return { chartStatus: state.chartStatus, datasource_type: state.datasource_type, fields: state.fields, form_data, standalone: state.standalone, triggerQuery: state.triggerQuery, forcedHeight: state.forced_height, queryRequest: state.queryRequest, }; } function mapDispatchToProps(dispatch) { return { actions: bindActionCreators(actions, dispatch), }; } export { ExploreViewContainer }; export default connect(mapStateToProps, mapDispatchToProps)(ExploreViewContainer);