import React, { ChangeEvent, PureComponent } from 'react'; import { InlineFormLabel, LegacyForms } from '@grafana/ui'; import { selectors } from '@grafana/e2e-selectors'; import templateSrv from '../../templating/template_srv'; import { SelectionOptionsEditor } from '../editor/SelectionOptionsEditor'; import { QueryVariableModel, VariableRefresh, VariableSort, VariableWithMultiSupport } from '../../templating/types'; import { QueryVariableEditorState } from './reducer'; import { changeQueryVariableDataSource, changeQueryVariableQuery, initQueryVariableEditor } from './actions'; import { VariableEditorState } from '../editor/reducer'; import { OnPropChangeArguments, VariableEditorProps } from '../editor/types'; import { MapDispatchToProps, MapStateToProps } from 'react-redux'; import { StoreState } from '../../../types'; import { connectWithStore } from '../../../core/utils/connectWithReduxStore'; import { toVariableIdentifier } from '../state/types'; import { changeVariableMultiValue } from '../state/actions'; const { Switch } = LegacyForms; export interface OwnProps extends VariableEditorProps {} interface ConnectedProps { editor: VariableEditorState; } interface DispatchProps { initQueryVariableEditor: typeof initQueryVariableEditor; changeQueryVariableDataSource: typeof changeQueryVariableDataSource; changeQueryVariableQuery: typeof changeQueryVariableQuery; changeVariableMultiValue: typeof changeVariableMultiValue; } type Props = OwnProps & ConnectedProps & DispatchProps; export interface State { regex: string | null; tagsQuery: string | null; tagValuesQuery: string | null; } export class QueryVariableEditorUnConnected extends PureComponent { state: State = { regex: null, tagsQuery: null, tagValuesQuery: null, }; async componentDidMount() { await this.props.initQueryVariableEditor(toVariableIdentifier(this.props.variable)); } componentDidUpdate(prevProps: Readonly): void { if (prevProps.variable.datasource !== this.props.variable.datasource) { this.props.changeQueryVariableDataSource( toVariableIdentifier(this.props.variable), this.props.variable.datasource ); } } getSelectedDataSourceValue = (): string => { if (!this.props.editor.extended?.dataSources.length) { return ''; } const foundItem = this.props.editor.extended?.dataSources.find(ds => ds.value === this.props.variable.datasource); const value = foundItem ? foundItem.value : this.props.editor.extended?.dataSources[0].value; return value ?? ''; }; onDataSourceChange = (event: ChangeEvent) => { this.props.onPropChange({ propName: 'query', propValue: '' }); this.props.onPropChange({ propName: 'datasource', propValue: event.target.value }); }; onQueryChange = async (query: any, definition: string) => { this.props.changeQueryVariableQuery(toVariableIdentifier(this.props.variable), query, definition); }; onRegExChange = (event: ChangeEvent) => { this.setState({ regex: event.target.value }); }; onRegExBlur = async (event: ChangeEvent) => { this.props.onPropChange({ propName: 'regex', propValue: event.target.value, updateOptions: true }); }; onTagsQueryChange = async (event: ChangeEvent) => { this.setState({ tagsQuery: event.target.value }); }; onTagsQueryBlur = async (event: ChangeEvent) => { this.props.onPropChange({ propName: 'tagsQuery', propValue: event.target.value, updateOptions: true }); }; onTagValuesQueryChange = async (event: ChangeEvent) => { this.setState({ tagValuesQuery: event.target.value }); }; onTagValuesQueryBlur = async (event: ChangeEvent) => { this.props.onPropChange({ propName: 'tagValuesQuery', propValue: event.target.value, updateOptions: true }); }; onRefreshChange = (event: ChangeEvent) => { this.props.onPropChange({ propName: 'refresh', propValue: parseInt(event.target.value, 10) }); }; onSortChange = async (event: ChangeEvent) => { this.props.onPropChange({ propName: 'sort', propValue: parseInt(event.target.value, 10), updateOptions: true }); }; onSelectionOptionsChange = async ({ propValue, propName }: OnPropChangeArguments) => { this.props.onPropChange({ propName, propValue, updateOptions: true }); }; onUseTagsChange = async (event: ChangeEvent) => { this.props.onPropChange({ propName: 'useTags', propValue: event.target.checked, updateOptions: true }); }; render() { const VariableQueryEditor = this.props.editor.extended?.VariableQueryEditor; return ( <>
Query Options
Data source
Refresh
{VariableQueryEditor && this.props.editor.extended?.dataSource && ( )}
Regex
Sort
Value groups/tags (Experimental feature)
{this.props.variable.useTags && ( <>
Tags query
  • Tag values query
  • )}
    ); } } const mapStateToProps: MapStateToProps = (state, ownProps) => ({ editor: state.templating.editor as VariableEditorState, }); const mapDispatchToProps: MapDispatchToProps = { initQueryVariableEditor, changeQueryVariableDataSource, changeQueryVariableQuery, changeVariableMultiValue, }; export const QueryVariableEditor = connectWithStore( QueryVariableEditorUnConnected, mapStateToProps, mapDispatchToProps );