Unbind dispatch from fetchTimeSeriesAsync

pull/10616/head
Andrew Watkins 2017-04-11 12:49:36 -06:00
parent b4ccd90f90
commit 99552d34ce
9 changed files with 30 additions and 60 deletions

View File

@ -105,10 +105,6 @@ class CellEditorOverlay extends Component {
this.setState({activeQueryIndex}) this.setState({activeQueryIndex})
} }
handleValidateQuery() {
// fetch info from server and update query configs
}
async handleEditRawText(url, id, text) { async handleEditRawText(url, id, text) {
// use this as the handler passed into fetchTimeSeries to update a query status // use this as the handler passed into fetchTimeSeries to update a query status
try { try {
@ -127,7 +123,6 @@ class CellEditorOverlay extends Component {
onCancel, onCancel,
timeRange, timeRange,
autoRefresh, autoRefresh,
fetchTimeSeries,
editQueryStatus, editQueryStatus,
} = this.props } = this.props
@ -154,7 +149,6 @@ class CellEditorOverlay extends Component {
activeQueryIndex={0} activeQueryIndex={0}
cellType={cellWorkingType} cellType={cellWorkingType}
cellName={cellWorkingName} cellName={cellWorkingName}
fetchTimeSeries={fetchTimeSeries}
editQueryStatus={editQueryStatus} editQueryStatus={editQueryStatus}
/> />
<ResizeBottom> <ResizeBottom>
@ -204,7 +198,6 @@ CellEditorOverlay.propTypes = {
queries: string.isRequired, queries: string.isRequired,
}), }),
}), }),
fetchTimeSeries: func.isRequired,
editQueryStatus: func.isRequired, editQueryStatus: func.isRequired,
queryStatus: shape({ queryStatus: shape({
queryID: string, queryID: string,

View File

@ -9,7 +9,6 @@ import DashboardHeaderEdit from 'src/dashboards/components/DashboardHeaderEdit'
import Dashboard from 'src/dashboards/components/Dashboard' import Dashboard from 'src/dashboards/components/Dashboard'
import * as dashboardActionCreators from 'src/dashboards/actions' import * as dashboardActionCreators from 'src/dashboards/actions'
import {fetchTimeSeriesAsync} from 'src/shared/actions/timeSeries'
import {setAutoRefresh} from 'shared/actions/app' import {setAutoRefresh} from 'shared/actions/app'
import {presentationButtonDispatcher} from 'shared/dispatchers' import {presentationButtonDispatcher} from 'shared/dispatchers'
@ -55,7 +54,6 @@ const DashboardPage = React.createClass({
timeRange: shape({}).isRequired, timeRange: shape({}).isRequired,
inPresentationMode: bool.isRequired, inPresentationMode: bool.isRequired,
handleClickPresentationButton: func, handleClickPresentationButton: func,
fetchTimeSeries: func,
cellQueryStatus: shape({ cellQueryStatus: shape({
queryID: string, queryID: string,
status: shape(), status: shape(),
@ -168,7 +166,6 @@ const DashboardPage = React.createClass({
timeRange, timeRange,
dashboards, dashboards,
autoRefresh, autoRefresh,
fetchTimeSeries,
cellQueryStatus, cellQueryStatus,
dashboardActions, dashboardActions,
inPresentationMode, inPresentationMode,
@ -195,7 +192,6 @@ const DashboardPage = React.createClass({
timeRange={timeRange} timeRange={timeRange}
onCancel={this.handleDismissOverlay} onCancel={this.handleDismissOverlay}
onSave={this.handleSaveEditedCell} onSave={this.handleSaveEditedCell}
fetchTimeSeries={fetchTimeSeries}
editQueryStatus={dashboardActions.editCellQueryStatus} editQueryStatus={dashboardActions.editCellQueryStatus}
queryStatus={cellQueryStatus} queryStatus={cellQueryStatus}
/> : /> :
@ -285,7 +281,6 @@ const mapDispatchToProps = (dispatch) => ({
handleChooseAutoRefresh: bindActionCreators(setAutoRefresh, dispatch), handleChooseAutoRefresh: bindActionCreators(setAutoRefresh, dispatch),
handleClickPresentationButton: presentationButtonDispatcher(dispatch), handleClickPresentationButton: presentationButtonDispatcher(dispatch),
dashboardActions: bindActionCreators(dashboardActionCreators, dispatch), dashboardActions: bindActionCreators(dashboardActionCreators, dispatch),
fetchTimeSeries: bindActionCreators(fetchTimeSeriesAsync, dispatch),
}) })
export default connect(mapStateToProps, mapDispatchToProps)(DashboardPage) export default connect(mapStateToProps, mapDispatchToProps)(DashboardPage)

View File

@ -3,6 +3,7 @@ import {Table, Column, Cell} from 'fixed-data-table'
import Dimensions from 'react-dimensions' import Dimensions from 'react-dimensions'
import _ from 'lodash' import _ from 'lodash'
import moment from 'moment' import moment from 'moment'
import {fetchTimeSeriesAsync} from 'shared/actions/timeSeries'
const { const {
arrayOf, arrayOf,
@ -22,7 +23,7 @@ const defaultTableHeight = 1000
const CustomCell = React.createClass({ const CustomCell = React.createClass({
propTypes: { propTypes: {
data: oneOfType([number, string]).isRequired, data: oneOfType([number, string]),
columnName: string.isRequired, columnName: string.isRequired,
}, },
@ -48,8 +49,7 @@ const ChronoTable = React.createClass({
}).isRequired, }).isRequired,
containerWidth: number.isRequired, containerWidth: number.isRequired,
height: number, height: number,
onEditRawStatus: func, editQueryStatus: func.isRequired,
fetchTimeSeries: func.isRequired,
}, },
getInitialState() { getInitialState() {
@ -86,7 +86,7 @@ const ChronoTable = React.createClass({
this.setState({isLoading: true}) this.setState({isLoading: true})
// second param is db, we want to leave this blank // second param is db, we want to leave this blank
try { try {
const {results} = await this.props.fetchTimeSeries({source: query.host, query}) const {results} = await fetchTimeSeriesAsync({source: query.host, query})
this.setState({isLoading: false}) this.setState({isLoading: false})
if (!results) { if (!results) {

View File

@ -14,7 +14,6 @@ const View = ({
autoRefresh, autoRefresh,
heightPixels, heightPixels,
editQueryStatus, editQueryStatus,
fetchTimeSeries,
activeQueryIndex, activeQueryIndex,
}) => { }) => {
const activeQuery = queries[activeQueryIndex] const activeQuery = queries[activeQueryIndex]
@ -31,7 +30,6 @@ const View = ({
query={query} query={query}
height={heightPixels} height={heightPixels}
editQueryStatus={editQueryStatus} editQueryStatus={editQueryStatus}
fetchTimeSeries={fetchTimeSeries}
/> />
) )
} }
@ -53,7 +51,6 @@ const View = ({
isInDataExplorer={true} isInDataExplorer={true}
showSingleStat={cellType === "line-plus-single-stat"} showSingleStat={cellType === "line-plus-single-stat"}
displayOptions={displayOptions} displayOptions={displayOptions}
fetchTimeSeries={fetchTimeSeries}
editQueryStatus={editQueryStatus} editQueryStatus={editQueryStatus}
/> />
) )
@ -73,8 +70,7 @@ View.propTypes = {
cellType: string, cellType: string,
autoRefresh: number.isRequired, autoRefresh: number.isRequired,
heightPixels: number, heightPixels: number,
editQueryStatus: func, editQueryStatus: func.isRequired,
fetchTimeSeries: func.isRequired,
activeQueryIndex: number, activeQueryIndex: number,
} }

View File

@ -29,8 +29,7 @@ const Visualization = React.createClass({
activeQueryIndex: number, activeQueryIndex: number,
height: string, height: string,
heightPixels: number, heightPixels: number,
fetchTimeSeries: func.isRequired, editQueryStatus: func.isRequired,
editQueryStatus: func,
}, },
contextTypes: { contextTypes: {
@ -79,7 +78,6 @@ const Visualization = React.createClass({
heightPixels, heightPixels,
queryConfigs, queryConfigs,
editQueryStatus, editQueryStatus,
fetchTimeSeries,
activeQueryIndex, activeQueryIndex,
} = this.props } = this.props
const {source} = this.context const {source} = this.context
@ -105,7 +103,6 @@ const Visualization = React.createClass({
autoRefresh={autoRefresh} autoRefresh={autoRefresh}
heightPixels={heightPixels} heightPixels={heightPixels}
editQueryStatus={editQueryStatus} editQueryStatus={editQueryStatus}
fetchTimeSeries={fetchTimeSeries}
activeQueryIndex={activeQueryIndex} activeQueryIndex={activeQueryIndex}
/> />
</div> </div>

View File

@ -10,8 +10,6 @@ import Header from '../containers/Header'
import ResizeContainer, {ResizeBottom} from 'src/shared/components/ResizeContainer' import ResizeContainer, {ResizeBottom} from 'src/shared/components/ResizeContainer'
import {setAutoRefresh} from 'shared/actions/app' import {setAutoRefresh} from 'shared/actions/app'
import {fetchTimeSeriesAsync} from 'shared/actions/timeSeries'
import {editQueryStatus} from 'src/data_explorer/actions/view'
import * as viewActions from 'src/data_explorer/actions/view' import * as viewActions from 'src/data_explorer/actions/view'
const { const {
@ -32,7 +30,9 @@ const DataExplorer = React.createClass({
}).isRequired, }).isRequired,
}).isRequired, }).isRequired,
queryConfigs: arrayOf(shape({})).isRequired, queryConfigs: arrayOf(shape({})).isRequired,
queryConfigActions: shape({}).isRequired, queryConfigActions: shape({
editQueryStatus: func.isRequired,
}).isRequired,
autoRefresh: number.isRequired, autoRefresh: number.isRequired,
handleChooseAutoRefresh: func.isRequired, handleChooseAutoRefresh: func.isRequired,
timeRange: shape({ timeRange: shape({
@ -43,7 +43,6 @@ const DataExplorer = React.createClass({
dataExplorer: shape({ dataExplorer: shape({
queryIDs: arrayOf(string).isRequired, queryIDs: arrayOf(string).isRequired,
}).isRequired, }).isRequired,
fetchTimeSeries: func.isRequired,
}, },
childContextTypes: { childContextTypes: {
@ -83,7 +82,6 @@ const DataExplorer = React.createClass({
setTimeRange, setTimeRange,
queryConfigs, queryConfigs,
queryConfigActions, queryConfigActions,
fetchTimeSeries,
source, source,
} = this.props } = this.props
const {activeQueryIndex} = this.state const {activeQueryIndex} = this.state
@ -105,7 +103,6 @@ const DataExplorer = React.createClass({
setActiveQueryIndex={this.handleSetActiveQueryIndex} setActiveQueryIndex={this.handleSetActiveQueryIndex}
onDeleteQuery={this.handleDeleteQuery} onDeleteQuery={this.handleDeleteQuery}
activeQueryIndex={activeQueryIndex} activeQueryIndex={activeQueryIndex}
fetchTimeSeries={fetchTimeSeries}
/> />
<ResizeBottom> <ResizeBottom>
<Visualization <Visualization
@ -113,8 +110,7 @@ const DataExplorer = React.createClass({
timeRange={timeRange} timeRange={timeRange}
queryConfigs={queryConfigs} queryConfigs={queryConfigs}
activeQueryIndex={activeQueryIndex} activeQueryIndex={activeQueryIndex}
fetchTimeSeries={fetchTimeSeries} editQueryStatus={queryConfigActions.editQueryStatus}
editQueryStatus={editQueryStatus}
/> />
</ResizeBottom> </ResizeBottom>
</ResizeContainer> </ResizeContainer>
@ -140,7 +136,6 @@ function mapDispatchToProps(dispatch) {
handleChooseAutoRefresh: bindActionCreators(setAutoRefresh, dispatch), handleChooseAutoRefresh: bindActionCreators(setAutoRefresh, dispatch),
setTimeRange: bindActionCreators(viewActions.setTimeRange, dispatch), setTimeRange: bindActionCreators(viewActions.setTimeRange, dispatch),
queryConfigActions: bindActionCreators(viewActions, dispatch), queryConfigActions: bindActionCreators(viewActions, dispatch),
fetchTimeSeries: bindActionCreators(fetchTimeSeriesAsync, dispatch),
} }
} }

View File

@ -20,3 +20,8 @@ export const setAutoRefresh = (milliseconds) => ({
milliseconds, milliseconds,
}, },
}) })
export const noop = () => ({
type: 'NOOP',
payload: {},
})

View File

@ -1,50 +1,47 @@
import {proxy} from 'utils/queryUrlGenerator' import {proxy} from 'utils/queryUrlGenerator'
import {noop} from 'shared/actions/app'
import _ from 'lodash' import _ from 'lodash'
const NOOP = () => ({ export const handleLoading = (query, editQueryStatus) => {
type: 'RUNNING_FETCH_TIME_SERIES', editQueryStatus(query.id, {loading: true})
})
export const handleLoading = (query, editQueryStatus, dispatch) => {
dispatch(editQueryStatus(query.id, {loading: true}))
} }
// {results: [{}]} // {results: [{}]}
export const handleSuccess = (data, query, editQueryStatus, dispatch) => { export const handleSuccess = (data, query, editQueryStatus) => {
const {results} = data const {results} = data
const error = _.get(results, ['0', 'error'], false) const error = _.get(results, ['0', 'error'], false)
const series = _.get(results, ['0', 'series'], false) const series = _.get(results, ['0', 'series'], false)
// 200 from server and no results = warn // 200 from server and no results = warn
if (!series && !error) { if (!series && !error) {
dispatch(editQueryStatus(query.id, {warn: 'Your query is syntactically correct but returned no results'})) editQueryStatus(query.id, {warn: 'Your query is syntactically correct but returned no results'})
return data return data
} }
// 200 from chrono server but influx returns an "error" = warning // 200 from chrono server but influx returns an "error" = warning
if (error) { if (error) {
dispatch(editQueryStatus(query.id, {warn: error})) editQueryStatus(query.id, {warn: error})
return data return data
} }
// 200 from server and results contains data = success // 200 from server and results contains data = success
dispatch(editQueryStatus(query.id, {success: 'Success!'})) editQueryStatus(query.id, {success: 'Success!'})
return data return data
} }
export const handleError = (error, query, editQueryStatus, dispatch) => { export const handleError = (error, query, editQueryStatus) => {
const message = _.get(error, ['data', 'message'], error) const message = _.get(error, ['data', 'message'], error)
// 400 from chrono server = fail // 400 from chrono server = fail
dispatch(editQueryStatus(query.id, {error: message})) editQueryStatus(query.id, {error: message})
console.error(error) console.error(error)
} }
export const fetchTimeSeriesAsync = ({source, db, rp, query}, editQueryStatus = NOOP) => async (dispatch) => { export const fetchTimeSeriesAsync = async ({source, db, rp, query}, editQueryStatus = noop) => {
handleLoading(query, editQueryStatus, dispatch) handleLoading(query, editQueryStatus)
try { try {
const {data} = await proxy({source, db, rp, query: query.text}) const {data} = await proxy({source, db, rp, query: query.text})
return handleSuccess(data, query, editQueryStatus, dispatch) return handleSuccess(data, query, editQueryStatus)
} catch (error) { } catch (error) {
handleError(error, query, editQueryStatus, dispatch) handleError(error, query, editQueryStatus)
throw error throw error
} }
} }

View File

@ -1,8 +1,5 @@
import React, {PropTypes} from 'react' import React, {PropTypes} from 'react'
import {connect} from 'react-redux'
import {bindActionCreators} from 'redux'
import _ from 'lodash' import _ from 'lodash'
import {fetchTimeSeriesAsync} from 'shared/actions/timeSeries' import {fetchTimeSeriesAsync} from 'shared/actions/timeSeries'
const { const {
@ -24,7 +21,6 @@ const AutoRefresh = (ComposedComponent) => {
host: oneOfType([string, arrayOf(string)]), host: oneOfType([string, arrayOf(string)]),
text: string, text: string,
}).isRequired).isRequired, }).isRequired).isRequired,
fetchTimeSeries: func.isRequired,
editQueryStatus: func, editQueryStatus: func,
}, },
getInitialState() { getInitialState() {
@ -73,7 +69,7 @@ const AutoRefresh = (ComposedComponent) => {
const newSeries = [] const newSeries = []
for (const query of queries) { for (const query of queries) {
const {host, database, rp} = query const {host, database, rp} = query
const response = await this.props.fetchTimeSeries({source: host, db: database, rp, query}, this.props.editQueryStatus) const response = await fetchTimeSeriesAsync({source: host, db: database, rp, query}, this.props.editQueryStatus)
newSeries.push({response}) newSeries.push({response})
count += 1 count += 1
if (count === queries.length) { if (count === queries.length) {
@ -150,11 +146,7 @@ const AutoRefresh = (ComposedComponent) => {
}, },
}) })
const mapDispatchToProps = (dispatch) => ({ return wrapper
fetchTimeSeries: bindActionCreators(fetchTimeSeriesAsync, dispatch),
})
return connect(null, mapDispatchToProps)(wrapper)
} }
export default AutoRefresh export default AutoRefresh