From 23a5acc959855a29e121ef1820c2443f6742c3c2 Mon Sep 17 00:00:00 2001 From: Alirie Gray Date: Mon, 18 Jun 2018 16:43:16 -0700 Subject: [PATCH 1/9] Implement custom meta query template variable type Co-authored-by: Chris Henn Co-authored-by: Alirie Gray --- ui/src/shared/parsing/showSeries.ts | 26 +++ .../components/MetaQueryTemplateBuilder.tsx | 166 ++++++++++++++++++ .../components/TemplateVariableEditor.tsx | 2 + ui/src/tempVars/constants/index.ts | 16 ++ ui/src/tempVars/utils/parsing.ts | 84 +++++++++ ui/src/types/tempVars.ts | 1 + 6 files changed, 295 insertions(+) create mode 100644 ui/src/shared/parsing/showSeries.ts create mode 100644 ui/src/tempVars/components/MetaQueryTemplateBuilder.tsx create mode 100644 ui/src/tempVars/utils/parsing.ts diff --git a/ui/src/shared/parsing/showSeries.ts b/ui/src/shared/parsing/showSeries.ts new file mode 100644 index 0000000000..3cad741e04 --- /dev/null +++ b/ui/src/shared/parsing/showSeries.ts @@ -0,0 +1,26 @@ +interface ParseShowSeriesResponse { + errors: string[] + series: string[] +} + +const parseShowSeries = (response): ParseShowSeriesResponse => { + const results = response.results[0] + + if (results.error) { + return {errors: [results.error], series: []} + } + + const series = results.series[0] + + if (!series.values) { + return {errors: [], series: []} + } + + const seriesValues = series.values.map(s => { + return s[0] + }) + + return {errors: [], series: seriesValues} +} + +export default parseShowSeries diff --git a/ui/src/tempVars/components/MetaQueryTemplateBuilder.tsx b/ui/src/tempVars/components/MetaQueryTemplateBuilder.tsx new file mode 100644 index 0000000000..b78d64b5fd --- /dev/null +++ b/ui/src/tempVars/components/MetaQueryTemplateBuilder.tsx @@ -0,0 +1,166 @@ +import React, {PureComponent, ChangeEvent} from 'react' +import _ from 'lodash' + +import {proxy} from 'src/utils/queryUrlGenerator' +import {ErrorHandling} from 'src/shared/decorators/errors' +import TemplateMetaQueryPreview from 'src/tempVars/components/TemplateMetaQueryPreview' +import {parseMetaQuery, isInvalidMetaQuery} from 'src/tempVars/utils/parsing' + +import { + TemplateBuilderProps, + RemoteDataState, + TemplateValueType, +} from 'src/types' + +// TODO: Ensure save is wired up to changes + +const DEBOUNCE_DELAY = 750 + +interface State { + metaQueryInput: string // bound to input + metaQuery: string // debounced view of metaQueryInput + metaQueryResults: string[] + metaQueryResultsStatus: RemoteDataState +} + +@ErrorHandling +class CustomMetaQueryTemplateBuilder extends PureComponent< + TemplateBuilderProps, + State +> { + private handleMetaQueryChange: () => void = _.debounce(() => { + const {metaQuery, metaQueryInput} = this.state + const {template, onUpdateTemplate} = this.props + + if (metaQuery === metaQueryInput) { + return + } + + this.setState({metaQuery: metaQueryInput}, this.executeQuery) + + const nextTemplate = {...template, query: {influxql: metaQueryInput}} + + onUpdateTemplate(nextTemplate) + }, DEBOUNCE_DELAY) + + constructor(props) { + super(props) + + this.state = { + metaQueryInput: '', + metaQuery: '', + metaQueryResults: [], + metaQueryResultsStatus: RemoteDataState.NotStarted, + } + } + + public render() { + const {metaQueryInput} = this.state + + return ( +
+
+ +
+