diff --git a/packages/grafana-ui/src/types/datasource.ts b/packages/grafana-ui/src/types/datasource.ts index 22bf4b060b9..b9f4a574972 100644 --- a/packages/grafana-ui/src/types/datasource.ts +++ b/packages/grafana-ui/src/types/datasource.ts @@ -30,6 +30,11 @@ export class DataSourcePlugin< return this; } + setConfigCtrl(ConfigCtrl: any) { + this.angularConfigCtrl = ConfigCtrl; + return this; + } + setQueryCtrl(QueryCtrl: any) { this.components.QueryCtrl = QueryCtrl; return this; @@ -199,6 +204,21 @@ export abstract class DataSourceApi< options?: TContextQueryOptions ) => Promise; + /** + * Variable query action. + */ + metricFindQuery?(query: any, options?: any): Promise; + + /** + * Get tag keys for adhoc filters + */ + getTagKeys?(options: any): Promise; + + /** + * Get tag values for adhoc filters + */ + getTagValues?(options: { key: any }): Promise; + /** * Set after constructor call, as the data source instance is the most common thing to pass around * we attach the components to this instance for easy access @@ -396,6 +416,10 @@ export interface QueryHint { fix?: QueryFix; } +export interface MetricFindValue { + text: string; +} + export interface DataSourceJsonData { authType?: string; defaultRegion?: string; @@ -440,6 +464,7 @@ export interface DataSourceInstanceSettings ({ + keyValueContainer: css` + label: key-value-container; + display: flex; + flex-flow: row nowrap; + `, +}); + +enum ChangeType { + Key = 'key', + Value = 'value', + Operator = 'operator', +} + +export interface Props { + keys: string[]; + keysPlaceHolder?: string; + initialKey?: string; + initialOperator?: string; + initialValue?: string; + values?: string[]; + valuesPlaceHolder?: string; + onKeyChanged: (key: string) => void; + onValueChanged: (value: string) => void; + onOperatorChanged: (operator: string) => void; +} + +export const AdHocFilter: React.FunctionComponent = props => { + const theme = useContext(ThemeContext); + const styles = getStyles(theme); + + const onChange = (changeType: ChangeType) => (item: SelectOptionItem) => { + const { onKeyChanged, onValueChanged, onOperatorChanged } = props; + switch (changeType) { + case ChangeType.Key: + onKeyChanged(item.value); + break; + case ChangeType.Operator: + onOperatorChanged(item.value); + break; + case ChangeType.Value: + onValueChanged(item.value); + break; + } + }; + + const stringToOption = (value: string) => ({ label: value, value: value }); + + const { keys, initialKey, keysPlaceHolder, initialOperator, values, initialValue, valuesPlaceHolder } = props; + const operators = ['=', '!=']; + const keysAsOptions = keys ? keys.map(stringToOption) : []; + const selectedKey = initialKey ? keysAsOptions.filter(option => option.value === initialKey) : null; + const valuesAsOptions = values ? values.map(stringToOption) : []; + const selectedValue = initialValue ? valuesAsOptions.filter(option => option.value === initialValue) : null; + const operatorsAsOptions = operators.map(stringToOption); + const selectedOperator = initialOperator + ? operatorsAsOptions.filter(option => option.value === initialOperator) + : null; + + return ( +
+ +