Set Dashboard time range from query string middleware

Co-authored-by: Deniz Kusefoglu <denizk@gmail.com>
Co-authored-by: Jared Scheib <jared.scheib@gmail.com>
pull/10616/head
ebb-tide 2018-05-31 16:45:33 -07:00
parent 74f13d6114
commit ffca9ad0f1
6 changed files with 55 additions and 41 deletions

View File

@ -45,14 +45,6 @@ export const loadDeafaultDashTimeV1 = dashboardID => ({
}, },
}) })
export const addDashTimeV1 = (dashboardID, timeRange) => ({
type: 'ADD_DASHBOARD_TIME_V1',
payload: {
dashboardID,
timeRange,
},
})
export const setDashTimeV1 = (dashboardID, timeRange) => ({ export const setDashTimeV1 = (dashboardID, timeRange) => ({
type: 'SET_DASHBOARD_TIME_V1', type: 'SET_DASHBOARD_TIME_V1',
payload: { payload: {

View File

@ -49,6 +49,7 @@ import {
TEMP_VAR_DASHBOARD_TIME, TEMP_VAR_DASHBOARD_TIME,
TEMP_VAR_UPPER_DASHBOARD_TIME, TEMP_VAR_UPPER_DASHBOARD_TIME,
} from 'shared/constants' } from 'shared/constants'
import {FORMAT_INFLUXQL, defaultTimeRange} from 'src/shared/data/timeRanges'
import { import {
notifyDashboardNotFound, notifyDashboardNotFound,
notifyInvalidTempVarValueInURLQuery, notifyInvalidTempVarValueInURLQuery,
@ -57,14 +58,6 @@ import {colorsStringSchema, colorsNumberSchema} from 'shared/schemas'
import {ErrorHandling} from 'src/shared/decorators/errors' import {ErrorHandling} from 'src/shared/decorators/errors'
import {OverlayContext} from 'src/shared/components/OverlayTechnology' import {OverlayContext} from 'src/shared/components/OverlayTechnology'
const FORMAT_INFLUXQL = 'influxql'
const defaultTimeRange = {
upper: null,
lower: 'now() - 15m',
seconds: 900,
format: FORMAT_INFLUXQL,
}
@ErrorHandling @ErrorHandling
class DashboardPage extends Component { class DashboardPage extends Component {
constructor(props) { constructor(props) {

View File

@ -5,13 +5,6 @@ const initialState = {
const dashTimeV1 = (state = initialState, action) => { const dashTimeV1 = (state = initialState, action) => {
switch (action.type) { switch (action.type) {
case 'ADD_DASHBOARD_TIME_V1': {
const {dashboardID, timeRange} = action.payload
const ranges = [...state.ranges, {dashboardID, timeRange}]
return {...state, ranges}
}
case 'DELETE_DASHBOARD': { case 'DELETE_DASHBOARD': {
const {dashboardID} = action.payload const {dashboardID} = action.payload
const ranges = state.ranges.filter(r => r.dashboardID !== dashboardID) const ranges = state.ranges.filter(r => r.dashboardID !== dashboardID)

View File

@ -72,3 +72,12 @@ export const timeRanges = [
menuOption: 'Past 30d', menuOption: 'Past 30d',
}, },
] ]
export const FORMAT_INFLUXQL = 'influxql'
export const defaultTimeRange = {
upper: null,
lower: 'now() - 15m',
seconds: 900,
format: FORMAT_INFLUXQL,
}

View File

@ -2,13 +2,51 @@
import queryString from 'query-string' import queryString from 'query-string'
import {enablePresentationMode} from 'src/shared/actions/app' import {enablePresentationMode} from 'src/shared/actions/app'
import {setDashTimeV1} from 'src/dashboards/actions'
import {timeRanges, defaultTimeRange} from 'src/shared/data/timeRanges'
import idNormalizer, {TYPE_ID} from 'src/normalizers/id'
export const queryStringConfig = () => dispatch => action => { export const queryStringConfig = store => {
dispatch(action) let prevPath
const urlQueries = queryString.parse(window.location.search) return dispatch => action => {
dispatch(action)
const urlQueries = queryString.parse(window.location.search)
// Presentation Mode // Presentation Mode
if (urlQueries.present === 'true') { if (urlQueries.present === 'true') {
dispatch(enablePresentationMode()) dispatch(enablePresentationMode())
}
const dashboardRegex = /\/sources\/\d+\/dashboards\/(\d+)/
if (dashboardRegex.test(window.location.pathname)) {
const currentPath = window.location.pathname
const dashboardID = currentPath.match(dashboardRegex)[1]
if (currentPath !== prevPath) {
const {dashTimeV1} = store.getState()
const foundTimeRange = dashTimeV1.ranges.find(
r => r.dashboardID === idNormalizer(TYPE_ID, dashboardID)
)
let timeRange = foundTimeRange || defaultTimeRange
// if lower and upper in urlQueries.
// and if valid.
if (urlQueries.upper) {
timeRange = {
...timeRange,
upper: urlQueries.upper,
lower: urlQueries.lower,
}
} else {
timeRange = timeRanges.find(t => t.lower === urlQueries.lower)
}
if (foundTimeRange) {
dispatch(setDashTimeV1(+dashboardID, timeRange))
}
}
prevPath = currentPath
}
} }
} }

View File

@ -1,9 +1,5 @@
import reducer from 'src/dashboards/reducers/dashTimeV1' import reducer from 'src/dashboards/reducers/dashTimeV1'
import { import {setDashTimeV1, deleteDashboard} from 'src/dashboards/actions/index'
addDashTimeV1,
setDashTimeV1,
deleteDashboard,
} from 'src/dashboards/actions/index'
const emptyState = undefined const emptyState = undefined
const dashboardID = 1 const dashboardID = 1
@ -18,13 +14,6 @@ describe('Dashboards.Reducers.DashTimeV1', () => {
expect(actual).toEqual(expected) expect(actual).toEqual(expected)
}) })
it('can add a dashboard time', () => {
const actual = reducer(emptyState, addDashTimeV1(dashboardID, timeRange))
const expected = [{dashboardID, timeRange}]
expect(actual.ranges).toEqual(expected)
})
it('can delete a dashboard time range', () => { it('can delete a dashboard time range', () => {
const state = { const state = {
ranges: [{dashboardID, timeRange}], ranges: [{dashboardID, timeRange}],