Refactor template builders to use template values

Refactors template builders to take an onChoose prop passed by the
TemplateVariableEditor and to utilize template.values for rendering
template preview list to gain access to what values are selected.
pull/3802/head
Delmer Reed 2018-06-26 10:33:17 -04:00
parent 32e28ca94e
commit 393ae0f721
13 changed files with 59 additions and 157 deletions

View File

@ -6,7 +6,6 @@ import TemplatePreviewList from 'src/tempVars/components/TemplatePreviewList'
import {TemplateBuilderProps, TemplateValueType} from 'src/types' import {TemplateBuilderProps, TemplateValueType} from 'src/types'
interface State { interface State {
templateValues: string[]
templateValuesString: string templateValuesString: string
} }
@ -18,14 +17,14 @@ class CSVTemplateBuilder extends PureComponent<TemplateBuilderProps, State> {
const templateValues = props.template.values.map(v => v.value) const templateValues = props.template.values.map(v => v.value)
this.state = { this.state = {
templateValues,
templateValuesString: templateValues.join(', '), templateValuesString: templateValues.join(', '),
} }
} }
public render() { public render() {
const {templateValues, templateValuesString} = this.state const {onChooseValue, template} = this.props
const pluralizer = templateValues.length === 1 ? '' : 's' const {templateValuesString} = this.state
const pluralizer = template.values.length === 1 ? '' : 's'
return ( return (
<div className="temp-builder csv-temp-builder"> <div className="temp-builder csv-temp-builder">
@ -42,14 +41,14 @@ class CSVTemplateBuilder extends PureComponent<TemplateBuilderProps, State> {
</div> </div>
<div className="temp-builder-results"> <div className="temp-builder-results">
<p> <p>
CSV contains <strong>{templateValues.length}</strong> value{ CSV contains <strong>{template.values.length}</strong> value{
pluralizer pluralizer
} }
</p> </p>
{templateValues.length > 0 && ( {template.values.length > 0 && (
<TemplatePreviewList <TemplatePreviewList
items={templateValues} items={template.values}
onChoose={this.handleChooseCSVValue} onChoose={onChooseValue}
/> />
)} )}
</div> </div>
@ -73,8 +72,6 @@ class CSVTemplateBuilder extends PureComponent<TemplateBuilderProps, State> {
templateValues = templateValuesString.split(',').map(s => s.trim()) templateValues = templateValuesString.split(',').map(s => s.trim())
} }
this.setState({templateValues})
const nextValues = templateValues.map(value => { const nextValues = templateValues.map(value => {
return { return {
type: TemplateValueType.CSV, type: TemplateValueType.CSV,
@ -89,21 +86,6 @@ class CSVTemplateBuilder extends PureComponent<TemplateBuilderProps, State> {
onUpdateTemplate({...template, values: nextValues}) onUpdateTemplate({...template, values: nextValues})
} }
private handleChooseCSVValue = (csvValue: string) => {
const {template, onUpdateTemplate} = this.props
const {templateValues} = this.state
const nextValues = templateValues.map(value => {
return {
type: TemplateValueType.CSV,
value,
selected: value === csvValue,
}
})
onUpdateTemplate({...template, values: nextValues})
}
} }
export default CSVTemplateBuilder export default CSVTemplateBuilder

View File

@ -12,7 +12,6 @@ import {
} from 'src/types' } from 'src/types'
interface State { interface State {
databases: string[]
databasesStatus: RemoteDataState databasesStatus: RemoteDataState
} }
@ -25,7 +24,6 @@ class DatabasesTemplateBuilder extends PureComponent<
super(props) super(props)
this.state = { this.state = {
databases: [],
databasesStatus: RemoteDataState.Loading, databasesStatus: RemoteDataState.Loading,
} }
} }
@ -35,7 +33,8 @@ class DatabasesTemplateBuilder extends PureComponent<
} }
public render() { public render() {
const {databases, databasesStatus} = this.state const {template, onChooseValue} = this.props
const {databasesStatus} = this.state
return ( return (
<div className="temp-builder databases-temp-builder"> <div className="temp-builder databases-temp-builder">
@ -46,9 +45,9 @@ class DatabasesTemplateBuilder extends PureComponent<
</div> </div>
</div> </div>
<TemplateMetaQueryPreview <TemplateMetaQueryPreview
items={databases} items={template.values}
loadingStatus={databasesStatus} loadingStatus={databasesStatus}
onChoose={this.handleChooseDatabaseValue} onChoose={onChooseValue}
/> />
</div> </div>
) )
@ -63,10 +62,7 @@ class DatabasesTemplateBuilder extends PureComponent<
const {data} = await showDatabases(source.links.proxy) const {data} = await showDatabases(source.links.proxy)
const {databases} = parseShowDatabases(data) const {databases} = parseShowDatabases(data)
this.setState({ this.setState({databasesStatus: RemoteDataState.Done})
databases,
databasesStatus: RemoteDataState.Done,
})
const nextValues = databases.map(db => { const nextValues = databases.map(db => {
return { return {
@ -90,21 +86,6 @@ class DatabasesTemplateBuilder extends PureComponent<
this.setState({databasesStatus: RemoteDataState.Error}) this.setState({databasesStatus: RemoteDataState.Error})
} }
} }
private handleChooseDatabaseValue = (dbValue: string) => {
const {template, onUpdateTemplate} = this.props
const {databases} = this.state
const nextValues = databases.map(value => {
return {
type: TemplateValueType.Database,
value,
selected: value === dbValue,
}
})
onUpdateTemplate({...template, values: nextValues})
}
} }
export default DatabasesTemplateBuilder export default DatabasesTemplateBuilder

View File

@ -21,7 +21,7 @@ const fetchKeys = async (source, db, measurement): Promise<string[]> => {
class FieldKeysTemplateBuilder extends PureComponent<TemplateBuilderProps> { class FieldKeysTemplateBuilder extends PureComponent<TemplateBuilderProps> {
public render() { public render() {
const {template, source, onUpdateTemplate} = this.props const {template, source, onUpdateTemplate, onChooseValue} = this.props
return ( return (
<KeysTemplateBuilder <KeysTemplateBuilder
@ -31,6 +31,7 @@ class FieldKeysTemplateBuilder extends PureComponent<TemplateBuilderProps> {
template={template} template={template}
source={source} source={source}
onUpdateTemplate={onUpdateTemplate} onUpdateTemplate={onUpdateTemplate}
onChooseValue={onChooseValue}
/> />
) )
} }

View File

@ -33,7 +33,6 @@ interface State {
measurements: string[] measurements: string[]
measurementsStatus: RemoteDataState measurementsStatus: RemoteDataState
selectedMeasurement: string selectedMeasurement: string
keys: string[]
keysStatus: RemoteDataState keysStatus: RemoteDataState
} }
@ -52,7 +51,6 @@ class KeysTemplateBuilder extends PureComponent<Props, State> {
measurements: [], measurements: [],
measurementsStatus: RemoteDataState.Loading, measurementsStatus: RemoteDataState.Loading,
selectedMeasurement, selectedMeasurement,
keys: [],
keysStatus: RemoteDataState.Loading, keysStatus: RemoteDataState.Loading,
} }
} }
@ -64,7 +62,7 @@ class KeysTemplateBuilder extends PureComponent<Props, State> {
} }
public render() { public render() {
const {queryPrefix} = this.props const {queryPrefix, template, onChooseValue} = this.props
const { const {
databases, databases,
databasesStatus, databasesStatus,
@ -72,7 +70,6 @@ class KeysTemplateBuilder extends PureComponent<Props, State> {
measurements, measurements,
measurementsStatus, measurementsStatus,
selectedMeasurement, selectedMeasurement,
keys,
keysStatus, keysStatus,
} = this.state } = this.state
@ -102,9 +99,9 @@ class KeysTemplateBuilder extends PureComponent<Props, State> {
</div> </div>
</div> </div>
<TemplateMetaQueryPreview <TemplateMetaQueryPreview
items={keys} items={template.values}
loadingStatus={keysStatus} loadingStatus={keysStatus}
onChoose={this.handleChooseKeyValue} onChoose={onChooseValue}
/> />
</div> </div>
) )
@ -182,10 +179,7 @@ class KeysTemplateBuilder extends PureComponent<Props, State> {
selectedMeasurement selectedMeasurement
) )
this.setState({ this.setState({keysStatus: RemoteDataState.Done})
keys,
keysStatus: RemoteDataState.Done,
})
const nextValues = keys.map(value => { const nextValues = keys.map(value => {
return { return {
@ -206,21 +200,6 @@ class KeysTemplateBuilder extends PureComponent<Props, State> {
} }
} }
private handleChooseKeyValue = (keyValue: string) => {
const {template, onUpdateTemplate, templateValueType} = this.props
const {keys} = this.state
const nextValues = keys.map(value => {
return {
type: templateValueType,
value,
selected: value === keyValue,
}
})
onUpdateTemplate({...template, values: nextValues})
}
private handleChooseDatabaseDropdown = ({text}) => { private handleChooseDatabaseDropdown = ({text}) => {
this.handleChooseDatabase(text) this.handleChooseDatabase(text)
} }

View File

@ -19,7 +19,6 @@ interface State {
databases: string[] databases: string[]
databasesStatus: RemoteDataState databasesStatus: RemoteDataState
selectedDatabase: string selectedDatabase: string
measurements: string[]
measurementsStatus: RemoteDataState measurementsStatus: RemoteDataState
} }
@ -37,7 +36,6 @@ class MeasurementsTemplateBuilder extends PureComponent<
databases: [], databases: [],
databasesStatus: RemoteDataState.Loading, databasesStatus: RemoteDataState.Loading,
selectedDatabase, selectedDatabase,
measurements: [],
measurementsStatus: RemoteDataState.Loading, measurementsStatus: RemoteDataState.Loading,
} }
} }
@ -48,11 +46,11 @@ class MeasurementsTemplateBuilder extends PureComponent<
} }
public render() { public render() {
const {template, onChooseValue} = this.props
const { const {
databases, databases,
databasesStatus, databasesStatus,
selectedDatabase, selectedDatabase,
measurements,
measurementsStatus, measurementsStatus,
} = this.state } = this.state
@ -73,9 +71,9 @@ class MeasurementsTemplateBuilder extends PureComponent<
</div> </div>
</div> </div>
<TemplateMetaQueryPreview <TemplateMetaQueryPreview
items={measurements} items={template.values}
loadingStatus={measurementsStatus} loadingStatus={measurementsStatus}
onChoose={this.handleChooseMeasurementValue} onChoose={onChooseValue}
/> />
</div> </div>
) )
@ -120,10 +118,7 @@ class MeasurementsTemplateBuilder extends PureComponent<
const measurements = _.get(measurementSets, '0.measurements', []) const measurements = _.get(measurementSets, '0.measurements', [])
this.setState({ this.setState({measurementsStatus: RemoteDataState.Done})
measurements,
measurementsStatus: RemoteDataState.Done,
})
const nextValues = measurements.map(value => { const nextValues = measurements.map(value => {
return { return {
@ -144,21 +139,6 @@ class MeasurementsTemplateBuilder extends PureComponent<
} }
} }
private handleChooseMeasurementValue = (measurementValue: string) => {
const {template, onUpdateTemplate} = this.props
const {measurements} = this.state
const nextValues = measurements.map(value => {
return {
type: TemplateValueType.Measurement,
value,
selected: value === measurementValue,
}
})
onUpdateTemplate({...template, values: nextValues})
}
private handleChooseDatabaseDropdown = ({text}) => { private handleChooseDatabaseDropdown = ({text}) => {
this.handleChooseDatabase(text) this.handleChooseDatabase(text)
} }

View File

@ -18,7 +18,6 @@ const DEBOUNCE_DELAY = 750
interface State { interface State {
metaQueryInput: string // bound to input metaQueryInput: string // bound to input
metaQuery: string // debounced view of metaQueryInput metaQuery: string // debounced view of metaQueryInput
metaQueryResults: string[]
metaQueryResultsStatus: RemoteDataState metaQueryResultsStatus: RemoteDataState
} }
@ -45,7 +44,6 @@ class CustomMetaQueryTemplateBuilder extends PureComponent<
this.state = { this.state = {
metaQuery, metaQuery,
metaQueryInput: metaQuery, metaQueryInput: metaQuery,
metaQueryResults: [],
metaQueryResultsStatus: RemoteDataState.NotStarted, metaQueryResultsStatus: RemoteDataState.NotStarted,
} }
} }
@ -76,7 +74,8 @@ class CustomMetaQueryTemplateBuilder extends PureComponent<
} }
private renderResults() { private renderResults() {
const {metaQueryResults, metaQueryResultsStatus} = this.state const {template, onChooseValue} = this.props
const {metaQueryResultsStatus} = this.state
if (this.showInvalidMetaQueryMessage) { if (this.showInvalidMetaQueryMessage) {
return ( return (
@ -88,9 +87,9 @@ class CustomMetaQueryTemplateBuilder extends PureComponent<
return ( return (
<TemplateMetaQueryPreview <TemplateMetaQueryPreview
items={metaQueryResults} items={template.values}
loadingStatus={metaQueryResultsStatus} loadingStatus={metaQueryResultsStatus}
onChoose={this.handleChooseQueryValue} onChoose={onChooseValue}
/> />
) )
} }
@ -132,10 +131,7 @@ class CustomMetaQueryTemplateBuilder extends PureComponent<
const metaQueryResults = parseMetaQuery(metaQuery, data) const metaQueryResults = parseMetaQuery(metaQuery, data)
this.setState({ this.setState({metaQueryResultsStatus: RemoteDataState.Done})
metaQueryResults,
metaQueryResultsStatus: RemoteDataState.Done,
})
const nextValues = metaQueryResults.map(result => { const nextValues = metaQueryResults.map(result => {
return { return {
@ -160,26 +156,10 @@ class CustomMetaQueryTemplateBuilder extends PureComponent<
onUpdateTemplate(nextTemplate) onUpdateTemplate(nextTemplate)
} catch { } catch {
this.setState({ this.setState({
metaQueryResults: [],
metaQueryResultsStatus: RemoteDataState.Error, metaQueryResultsStatus: RemoteDataState.Error,
}) })
} }
} }
private handleChooseQueryValue = (metaQueryResultValue: string) => {
const {template, onUpdateTemplate} = this.props
const {metaQueryResults} = this.state
const nextValues = metaQueryResults.map(value => {
return {
type: TemplateValueType.MetaQuery,
value,
selected: value === metaQueryResultValue,
}
})
onUpdateTemplate({...template, values: nextValues})
}
} }
export default CustomMetaQueryTemplateBuilder export default CustomMetaQueryTemplateBuilder

View File

@ -24,7 +24,7 @@ export const fetchTagKeys = async (
class TagKeysTemplateBuilder extends PureComponent<TemplateBuilderProps> { class TagKeysTemplateBuilder extends PureComponent<TemplateBuilderProps> {
public render() { public render() {
const {template, source, onUpdateTemplate} = this.props const {template, source, onUpdateTemplate, onChooseValue} = this.props
return ( return (
<KeysTemplateBuilder <KeysTemplateBuilder
@ -34,6 +34,7 @@ class TagKeysTemplateBuilder extends PureComponent<TemplateBuilderProps> {
template={template} template={template}
source={source} source={source}
onUpdateTemplate={onUpdateTemplate} onUpdateTemplate={onUpdateTemplate}
onChooseValue={onChooseValue}
/> />
) )
} }

View File

@ -28,7 +28,6 @@ interface State {
tagKeys: string[] tagKeys: string[]
tagKeysStatus: RemoteDataState tagKeysStatus: RemoteDataState
selectedTagKey: string selectedTagKey: string
tagValues: string[]
tagValuesStatus: RemoteDataState tagValuesStatus: RemoteDataState
} }
@ -51,7 +50,6 @@ class KeysTemplateBuilder extends PureComponent<TemplateBuilderProps, State> {
tagKeys: [], tagKeys: [],
tagKeysStatus: RemoteDataState.Loading, tagKeysStatus: RemoteDataState.Loading,
selectedTagKey, selectedTagKey,
tagValues: [],
tagValuesStatus: RemoteDataState.Loading, tagValuesStatus: RemoteDataState.Loading,
} }
} }
@ -64,6 +62,7 @@ class KeysTemplateBuilder extends PureComponent<TemplateBuilderProps, State> {
} }
public render() { public render() {
const {template, onChooseValue} = this.props
const { const {
databases, databases,
databasesStatus, databasesStatus,
@ -74,7 +73,6 @@ class KeysTemplateBuilder extends PureComponent<TemplateBuilderProps, State> {
tagKeys, tagKeys,
tagKeysStatus, tagKeysStatus,
selectedTagKey, selectedTagKey,
tagValues,
tagValuesStatus, tagValuesStatus,
} = this.state } = this.state
@ -115,9 +113,9 @@ class KeysTemplateBuilder extends PureComponent<TemplateBuilderProps, State> {
</div> </div>
</div> </div>
<TemplateMetaQueryPreview <TemplateMetaQueryPreview
items={tagValues} items={template.values}
loadingStatus={tagValuesStatus} loadingStatus={tagValuesStatus}
onChoose={this.handleChooseTagValue} onChoose={onChooseValue}
/> />
</div> </div>
) )
@ -220,10 +218,7 @@ class KeysTemplateBuilder extends PureComponent<TemplateBuilderProps, State> {
const {tags} = parseShowTagValues(data) const {tags} = parseShowTagValues(data)
const tagValues = _.get(Object.values(tags), 0, []) const tagValues = _.get(Object.values(tags), 0, [])
this.setState({ this.setState({tagValuesStatus: RemoteDataState.Done})
tagValues,
tagValuesStatus: RemoteDataState.Done,
})
const nextValues = tagValues.map(value => { const nextValues = tagValues.map(value => {
return { return {
@ -304,21 +299,6 @@ class KeysTemplateBuilder extends PureComponent<TemplateBuilderProps, State> {
}, },
}) })
} }
private handleChooseTagValue = (tagValue: string) => {
const {template, onUpdateTemplate} = this.props
const {databases} = this.state
const nextValues = databases.map(value => {
return {
type: TemplateValueType.TagValue,
value,
selected: value === tagValue,
}
})
onUpdateTemplate({...template, values: nextValues})
}
} }
export default KeysTemplateBuilder export default KeysTemplateBuilder

View File

@ -3,12 +3,12 @@ import React, {PureComponent} from 'react'
import {ErrorHandling} from 'src/shared/decorators/errors' import {ErrorHandling} from 'src/shared/decorators/errors'
import TemplatePreviewList from 'src/tempVars/components/TemplatePreviewList' import TemplatePreviewList from 'src/tempVars/components/TemplatePreviewList'
import {RemoteDataState} from 'src/types' import {RemoteDataState, TemplateValue} from 'src/types'
interface Props { interface Props {
items: string[] items: TemplateValue[]
loadingStatus: RemoteDataState loadingStatus: RemoteDataState
onChoose: (item: string) => void onChoose: (item: TemplateValue) => void
} }
@ErrorHandling @ErrorHandling

View File

@ -5,13 +5,15 @@ import {ErrorHandling} from 'src/shared/decorators/errors'
import FancyScrollbar from 'src/shared/components/FancyScrollbar' import FancyScrollbar from 'src/shared/components/FancyScrollbar'
import TemplatePreviewListItem from 'src/tempVars/components/TemplatePreviewListItem' import TemplatePreviewListItem from 'src/tempVars/components/TemplatePreviewListItem'
import {TemplateValue} from 'src/types'
const LI_HEIGHT = 35 const LI_HEIGHT = 35
const LI_MARGIN_BOTTOM = 3 const LI_MARGIN_BOTTOM = 3
const RESULTS_TO_DISPLAY = 10 const RESULTS_TO_DISPLAY = 10
interface Props { interface Props {
items: string[] items: TemplateValue[]
onChoose: (item: string) => void onChoose: (item: TemplateValue) => void
} }
@ErrorHandling @ErrorHandling

View File

@ -1,8 +1,10 @@
import React, {PureComponent} from 'react' import React, {PureComponent} from 'react'
import {TemplateValue} from 'src/types'
interface Props { interface Props {
item: string item: TemplateValue
onClick: (item: string) => void onClick: (item: TemplateValue) => void
style: { style: {
height: string height: string
marginBottom: string marginBottom: string
@ -15,7 +17,7 @@ class TemplatePreviewListItem extends PureComponent<Props> {
return ( return (
<li onClick={this.handleClick} style={style}> <li onClick={this.handleClick} style={style}>
{item} {item.value}
</li> </li>
) )
} }

View File

@ -23,6 +23,7 @@ import MetaQueryTemplateBuilder from 'src/tempVars/components/MetaQueryTemplateB
import { import {
Template, Template,
TemplateType, TemplateType,
TemplateValue,
TemplateBuilderProps, TemplateBuilderProps,
Source, Source,
RemoteDataState, RemoteDataState,
@ -148,6 +149,7 @@ class TemplateVariableEditor extends PureComponent<Props, State> {
<TemplateBuilder <TemplateBuilder
template={nextTemplate} template={nextTemplate}
source={source} source={source}
onChooseValue={this.handleChooseTemplateValue}
onUpdateTemplate={this.handleUpdateTemplate} onUpdateTemplate={this.handleUpdateTemplate}
/> />
</div> </div>
@ -182,6 +184,17 @@ class TemplateVariableEditor extends PureComponent<Props, State> {
this.setState({nextTemplate}) this.setState({nextTemplate})
} }
private handleChooseTemplateValue = (item: TemplateValue) => {
this.setState(({nextTemplate: template}) => {
const nextValues = template.values.map(t => ({
...t,
selected: t.value === item.value,
}))
return {nextTemplate: {...template, values: nextValues}}
})
}
private handleChooseType = ({type}) => { private handleChooseType = ({type}) => {
const { const {
nextTemplate: {id, tempVar}, nextTemplate: {id, tempVar},

View File

@ -61,4 +61,5 @@ export interface TemplateBuilderProps {
template: Template template: Template
source: Source source: Source
onUpdateTemplate: (nextTemplate: Template) => void onUpdateTemplate: (nextTemplate: Template) => void
onChooseValue: (item: TemplateValue) => void
} }