@grafana/scenes 8.12.1 → 8.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"QueryVariable.js","sources":["../../../../../src/variables/variants/query/QueryVariable.tsx"],"sourcesContent":["import { Observable, of, filter, take, mergeMap, catchError, throwError, from, lastValueFrom } from 'rxjs';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport {\n CoreApp,\n DataQueryRequest,\n LoadingState,\n PanelData,\n ScopedVars,\n VariableRefresh,\n VariableSort,\n // @ts-expect-error TODO: remove suppression after updating grafana/data\n VariableRegexApplyTo,\n} from '@grafana/data';\n\nimport { sceneGraph } from '../../../core/sceneGraph';\nimport { SceneComponentProps, SceneDataQuery } from '../../../core/types';\nimport { VariableDependencyConfig } from '../../VariableDependencyConfig';\nimport { MultiOrSingleValueSelect } from '../../components/VariableValueSelect';\nimport { VariableValueOption } from '../../types';\nimport { MultiValueVariable, MultiValueVariableState, VariableGetOptionsArgs } from '../MultiValueVariable';\n\nimport { createQueryVariableRunner } from './createQueryVariableRunner';\nimport { metricNamesToVariableValues, sortVariableValues } from './utils';\nimport { toMetricFindValues } from './toMetricFindValues';\nimport { getDataSource } from '../../../utils/getDataSource';\nimport { safeStringifyValue } from '../../utils';\nimport { DataQuery, DataSourceRef } from '@grafana/schema';\nimport { SEARCH_FILTER_VARIABLE } from '../../constants';\nimport { debounce } from 'lodash';\nimport { registerQueryWithController } from '../../../querying/registerQueryWithController';\nimport { wrapInSafeSerializableSceneObject } from '../../../utils/wrapInSafeSerializableSceneObject';\nimport React from 'react';\n\nexport interface QueryVariableState extends MultiValueVariableState {\n type: 'query';\n datasource: DataSourceRef | null;\n query: string | SceneDataQuery;\n regex: string;\n regexApplyTo: VariableRegexApplyTo;\n refresh: VariableRefresh;\n sort: VariableSort;\n\n // works the same as query for custom variable, adding additional static options to ones returned by data source query\n staticOptions?: VariableValueOption[];\n\n // how to order static options in relation to options returned by query\n staticOptionsOrder?: 'before' | 'after' | 'sorted';\n /** @internal Only for use inside core dashboards */\n definition?: string;\n}\n\nexport class QueryVariable extends MultiValueVariable<QueryVariableState> {\n protected _variableDependency = new VariableDependencyConfig(this, {\n statePaths: ['regex', 'regexApplyTo', 'query', 'datasource'],\n });\n\n public constructor(initialState: Partial<QueryVariableState>) {\n super({\n type: 'query',\n name: '',\n value: '',\n text: '',\n options: [],\n datasource: null,\n regex: '',\n query: '',\n regexApplyTo: 'value',\n refresh: VariableRefresh.onDashboardLoad,\n sort: VariableSort.disabled,\n ...initialState,\n });\n }\n\n public getValueOptions(args: VariableGetOptionsArgs): Observable<VariableValueOption[]> {\n if (!this.state.query) {\n return of([]);\n }\n\n this.setState({ loading: true, error: null });\n\n return from(\n getDataSource(this.state.datasource, {\n __sceneObject: wrapInSafeSerializableSceneObject(this),\n })\n ).pipe(\n mergeMap((ds) => {\n const runner = createQueryVariableRunner(ds);\n const target = runner.getTarget(this);\n const request = this.getRequest(target, args.searchFilter);\n\n return runner.runRequest({ variable: this, searchFilter: args.searchFilter }, request).pipe(\n registerQueryWithController({\n type: 'QueryVariable/getValueOptions',\n request: request,\n origin: this,\n }),\n filter((data) => data.state === LoadingState.Done || data.state === LoadingState.Error), // we only care about done or error for now\n take(1), // take the first result, using first caused a bug where it in some situations throw an uncaught error because of no results had been received yet\n mergeMap((data: PanelData) => {\n if (data.state === LoadingState.Error) {\n return throwError(() => data.error);\n }\n return of(data);\n }),\n toMetricFindValues(),\n mergeMap((values) => {\n let regex = '';\n if (this.state.regex) {\n regex = sceneGraph.interpolate(this, this.state.regex, undefined, 'regex');\n }\n let options = metricNamesToVariableValues({\n variableRegEx: regex,\n variableRegexApplyTo: this.state.regexApplyTo,\n sort: this.state.sort,\n metricNames: values,\n });\n if (this.state.staticOptions) {\n const customOptions = this.state.staticOptions;\n options = options.filter((option) => !customOptions.find((custom) => custom.value === option.value));\n if (this.state.staticOptionsOrder === 'after') {\n options.push(...customOptions);\n } else if (this.state.staticOptionsOrder === 'sorted') {\n options = sortVariableValues(options.concat(customOptions), this.state.sort);\n } else {\n options.unshift(...customOptions);\n }\n }\n return of(options);\n }),\n catchError((error) => {\n if (error.cancelled) {\n return of([]);\n }\n return throwError(() => error);\n })\n );\n })\n );\n }\n\n private getRequest(target: DataQuery | string, searchFilter?: string) {\n const scopedVars: ScopedVars = {\n __sceneObject: wrapInSafeSerializableSceneObject(this),\n };\n\n if (searchFilter) {\n scopedVars.__searchFilter = { value: searchFilter, text: searchFilter };\n }\n\n const range = sceneGraph.getTimeRange(this).state.value;\n\n const request: DataQueryRequest = {\n app: CoreApp.Dashboard,\n requestId: uuidv4(),\n timezone: '',\n range,\n interval: '',\n intervalMs: 0,\n // @ts-ignore\n targets: [target],\n scopedVars,\n startTime: Date.now(),\n };\n\n return request;\n }\n\n onSearchChange = (searchFilter: string) => {\n if (!containsSearchFilter(this.state.query)) {\n return;\n }\n\n this._updateOptionsBasedOnSearchFilter(searchFilter);\n };\n\n private _updateOptionsBasedOnSearchFilter = debounce(async (searchFilter: string) => {\n const result = await lastValueFrom(this.getValueOptions({ searchFilter }));\n this.setState({ options: result, loading: false });\n }, 400);\n\n public static Component = ({ model }: SceneComponentProps<MultiValueVariable>) => {\n return <MultiOrSingleValueSelect model={model} />;\n };\n}\n\nfunction containsSearchFilter(query: string | DataQuery) {\n const str = safeStringifyValue(query);\n return str.indexOf(SEARCH_FILTER_VARIABLE) > -1;\n}\n"],"names":["uuidv4"],"mappings":";;;;;;;;;;;;;;;;;;AAoDO,MAAM,sBAAsB,kBAAA,CAAuC;AAAA,EAKjE,YAAY,YAAA,EAA2C;AAC5D,IAAA,KAAA,CAAM;AAAA,MACJ,IAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAM,EAAA;AAAA,MACN,KAAA,EAAO,EAAA;AAAA,MACP,IAAA,EAAM,EAAA;AAAA,MACN,SAAS,EAAC;AAAA,MACV,UAAA,EAAY,IAAA;AAAA,MACZ,KAAA,EAAO,EAAA;AAAA,MACP,KAAA,EAAO,EAAA;AAAA,MACP,YAAA,EAAc,OAAA;AAAA,MACd,SAAS,eAAA,CAAgB,eAAA;AAAA,MACzB,MAAM,YAAA,CAAa,QAAA;AAAA,MACnB,GAAG;AAAA,KACJ,CAAA;AAlBH,IAAA,IAAA,CAAU,mBAAA,GAAsB,IAAI,wBAAA,CAAyB,IAAA,EAAM;AAAA,MACjE,UAAA,EAAY,CAAC,OAAA,EAAS,cAAA,EAAgB,SAAS,YAAY;AAAA,KAC5D,CAAA;AAiHD,IAAA,IAAA,CAAA,cAAA,GAAiB,CAAC,YAAA,KAAyB;AACzC,MAAA,IAAI,CAAC,oBAAA,CAAqB,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,EAAG;AAC3C,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,kCAAkC,YAAY,CAAA;AAAA,IACrD,CAAA;AAEA,IAAA,IAAA,CAAQ,iCAAA,GAAoC,QAAA,CAAS,OAAO,YAAA,KAAyB;AACnF,MAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,IAAA,CAAK,gBAAgB,EAAE,YAAA,EAAc,CAAC,CAAA;AACzE,MAAA,IAAA,CAAK,SAAS,EAAE,OAAA,EAAS,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAA;AAAA,IACnD,GAAG,GAAG,CAAA;AAAA,EA3GN;AAAA,EAEO,gBAAgB,IAAA,EAAiE;AACtF,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO;AACrB,MAAA,OAAO,EAAA,CAAG,EAAE,CAAA;AAAA,IACd;AAEA,IAAA,IAAA,CAAK,SAAS,EAAE,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAE5C,IAAA,OAAO,IAAA;AAAA,MACL,aAAA,CAAc,IAAA,CAAK,KAAA,CAAM,UAAA,EAAY;AAAA,QACnC,aAAA,EAAe,kCAAkC,IAAI;AAAA,OACtD;AAAA,KACH,CAAE,IAAA;AAAA,MACA,QAAA,CAAS,CAAC,EAAA,KAAO;AACf,QAAA,MAAM,MAAA,GAAS,0BAA0B,EAAE,CAAA;AAC3C,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,SAAA,CAAU,IAAI,CAAA;AACpC,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,KAAK,YAAY,CAAA;AAEzD,QAAA,OAAO,MAAA,CAAO,UAAA,CAAW,EAAE,QAAA,EAAU,IAAA,EAAM,cAAc,IAAA,CAAK,YAAA,EAAa,EAAG,OAAO,CAAA,CAAE,IAAA;AAAA,UACrF,2BAAA,CAA4B;AAAA,YAC1B,IAAA,EAAM,+BAAA;AAAA,YACN,OAAA;AAAA,YACA,MAAA,EAAQ;AAAA,WACT,CAAA;AAAA,UACD,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,KAAA,KAAU,aAAa,IAAA,IAAQ,IAAA,CAAK,KAAA,KAAU,YAAA,CAAa,KAAK,CAAA;AAAA;AAAA,UACtF,KAAK,CAAC,CAAA;AAAA;AAAA,UACN,QAAA,CAAS,CAAC,IAAA,KAAoB;AAC5B,YAAA,IAAI,IAAA,CAAK,KAAA,KAAU,YAAA,CAAa,KAAA,EAAO;AACrC,cAAA,OAAO,UAAA,CAAW,MAAM,IAAA,CAAK,KAAK,CAAA;AAAA,YACpC;AACA,YAAA,OAAO,GAAG,IAAI,CAAA;AAAA,UAChB,CAAC,CAAA;AAAA,UACD,kBAAA,EAAmB;AAAA,UACnB,QAAA,CAAS,CAAC,MAAA,KAAW;AACnB,YAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,YAAA,IAAI,IAAA,CAAK,MAAM,KAAA,EAAO;AACpB,cAAA,KAAA,GAAQ,WAAW,WAAA,CAAY,IAAA,EAAM,KAAK,KAAA,CAAM,KAAA,EAAO,QAAW,OAAO,CAAA;AAAA,YAC3E;AACA,YAAA,IAAI,UAAU,2BAAA,CAA4B;AAAA,cACxC,aAAA,EAAe,KAAA;AAAA,cACf,oBAAA,EAAsB,KAAK,KAAA,CAAM,YAAA;AAAA,cACjC,IAAA,EAAM,KAAK,KAAA,CAAM,IAAA;AAAA,cACjB,WAAA,EAAa;AAAA,aACd,CAAA;AACD,YAAA,IAAI,IAAA,CAAK,MAAM,aAAA,EAAe;AAC5B,cAAA,MAAM,aAAA,GAAgB,KAAK,KAAA,CAAM,aAAA;AACjC,cAAA,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,MAAA,KAAW,CAAC,aAAA,CAAc,IAAA,CAAK,CAAC,MAAA,KAAW,MAAA,CAAO,KAAA,KAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AACnG,cAAA,IAAI,IAAA,CAAK,KAAA,CAAM,kBAAA,KAAuB,OAAA,EAAS;AAC7C,gBAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,aAAa,CAAA;AAAA,cAC/B,CAAA,MAAA,IAAW,IAAA,CAAK,KAAA,CAAM,kBAAA,KAAuB,QAAA,EAAU;AACrD,gBAAA,OAAA,GAAU,mBAAmB,OAAA,CAAQ,MAAA,CAAO,aAAa,CAAA,EAAG,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,cAC7E,CAAA,MAAO;AACL,gBAAA,OAAA,CAAQ,OAAA,CAAQ,GAAG,aAAa,CAAA;AAAA,cAClC;AAAA,YACF;AACA,YAAA,OAAO,GAAG,OAAO,CAAA;AAAA,UACnB,CAAC,CAAA;AAAA,UACD,UAAA,CAAW,CAAC,KAAA,KAAU;AACpB,YAAA,IAAI,MAAM,SAAA,EAAW;AACnB,cAAA,OAAO,EAAA,CAAG,EAAE,CAAA;AAAA,YACd;AACA,YAAA,OAAO,UAAA,CAAW,MAAM,KAAK,CAAA;AAAA,UAC/B,CAAC;AAAA,SACH;AAAA,MACF,CAAC;AAAA,KACH;AAAA,EACF;AAAA,EAEQ,UAAA,CAAW,QAA4B,YAAA,EAAuB;AACpE,IAAA,MAAM,UAAA,GAAyB;AAAA,MAC7B,aAAA,EAAe,kCAAkC,IAAI;AAAA,KACvD;AAEA,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,UAAA,CAAW,cAAA,GAAiB,EAAE,KAAA,EAAO,YAAA,EAAc,MAAM,YAAA,EAAa;AAAA,IACxE;AAEA,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,YAAA,CAAa,IAAI,EAAE,KAAA,CAAM,KAAA;AAElD,IAAA,MAAM,OAAA,GAA4B;AAAA,MAChC,KAAK,OAAA,CAAQ,SAAA;AAAA,MACb,WAAWA,EAAA,EAAO;AAAA,MAClB,QAAA,EAAU,EAAA;AAAA,MACV,KAAA;AAAA,MACA,QAAA,EAAU,EAAA;AAAA,MACV,UAAA,EAAY,CAAA;AAAA;AAAA,MAEZ,OAAA,EAAS,CAAC,MAAM,CAAA;AAAA,MAChB,UAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAkBF;AApIa,aAAA,CAiIG,SAAA,GAAY,CAAC,EAAE,KAAA,EAAM,KAA+C;AAChF,EAAA,uBAAO,KAAA,CAAA,aAAA,CAAC,4BAAyB,KAAA,EAAc,CAAA;AACjD,CAAA;AAGF,SAAS,qBAAqB,KAAA,EAA2B;AACvD,EAAA,MAAM,GAAA,GAAM,mBAAmB,KAAK,CAAA;AACpC,EAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,sBAAsB,CAAA,GAAI,EAAA;AAC/C;;;;"}
1
+ {"version":3,"file":"QueryVariable.js","sources":["../../../../../src/variables/variants/query/QueryVariable.tsx"],"sourcesContent":["import { Observable, of, filter, take, mergeMap, catchError, throwError, from, lastValueFrom, forkJoin } from 'rxjs';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport {\n CoreApp,\n DataQueryRequest,\n LoadingState,\n MetricFindValue,\n PanelData,\n ScopedVars,\n VariableRefresh,\n VariableSort,\n // @ts-expect-error TODO: remove suppression after updating grafana/data\n VariableRegexApplyTo,\n} from '@grafana/data';\n\nimport { sceneGraph } from '../../../core/sceneGraph';\nimport { SceneComponentProps, SceneDataQuery } from '../../../core/types';\nimport { VariableDependencyConfig } from '../../VariableDependencyConfig';\nimport { MultiOrSingleValueSelect } from '../../components/VariableValueSelect';\nimport { VariableValueOption } from '../../types';\nimport { MultiValueVariable, MultiValueVariableState, VariableGetOptionsArgs } from '../MultiValueVariable';\n\nimport { createQueryVariableRunner } from './createQueryVariableRunner';\nimport { metricNamesToVariableValues, sortVariableValues } from './utils';\nimport { toMetricFindValues } from './toMetricFindValues';\nimport { getDataSource } from '../../../utils/getDataSource';\nimport { safeStringifyValue } from '../../utils';\nimport { DataQuery, DataSourceRef } from '@grafana/schema';\nimport { SEARCH_FILTER_VARIABLE } from '../../constants';\nimport { debounce } from 'lodash';\nimport { registerQueryWithController } from '../../../querying/registerQueryWithController';\nimport { wrapInSafeSerializableSceneObject } from '../../../utils/wrapInSafeSerializableSceneObject';\nimport { expandMultiValueDatasourceUids } from '../../datasourceVariableRef';\nimport React from 'react';\n\nexport interface QueryVariableState extends MultiValueVariableState {\n type: 'query';\n datasource: DataSourceRef | null;\n query: string | SceneDataQuery;\n regex: string;\n regexApplyTo: VariableRegexApplyTo;\n refresh: VariableRefresh;\n sort: VariableSort;\n\n // works the same as query for custom variable, adding additional static options to ones returned by data source query\n staticOptions?: VariableValueOption[];\n\n // how to order static options in relation to options returned by query\n staticOptionsOrder?: 'before' | 'after' | 'sorted';\n /** @internal Only for use inside core dashboards */\n definition?: string;\n}\n\nexport class QueryVariable extends MultiValueVariable<QueryVariableState> {\n protected _variableDependency = new VariableDependencyConfig(this, {\n statePaths: ['regex', 'regexApplyTo', 'query', 'datasource'],\n });\n\n public constructor(initialState: Partial<QueryVariableState>) {\n super({\n type: 'query',\n name: '',\n value: '',\n text: '',\n options: [],\n datasource: null,\n regex: '',\n query: '',\n regexApplyTo: 'value',\n refresh: VariableRefresh.onDashboardLoad,\n sort: VariableSort.disabled,\n ...initialState,\n });\n }\n\n public getValueOptions(args: VariableGetOptionsArgs): Observable<VariableValueOption[]> {\n if (!this.state.query) {\n return of([]);\n }\n\n this.setState({ loading: true, error: null });\n\n const fanOutUids = expandMultiValueDatasourceUids(this, this.state.datasource);\n const datasourceRefs: Array<DataSourceRef | null> = fanOutUids\n ? fanOutUids.map((uid) => ({ ...this.state.datasource, uid }))\n : [this.state.datasource];\n\n const scopedSceneObject = {\n __sceneObject: wrapInSafeSerializableSceneObject(this),\n };\n\n const perDatasource = datasourceRefs.map((datasource) =>\n from(getDataSource(datasource, scopedSceneObject)).pipe(\n mergeMap((ds) => this.runMetricFindForDatasource(ds, args)),\n catchError((error) => {\n if (error?.cancelled) {\n return of({ values: [] as MetricFindValue[], error: undefined });\n }\n return of({ values: [] as MetricFindValue[], error });\n })\n )\n );\n\n return forkJoin(perDatasource).pipe(\n mergeMap((results) => {\n const values = results.flatMap((result) => result.values);\n const errors = results.map((result) => result.error).filter(Boolean);\n\n if (values.length === 0 && errors.length > 0) {\n return throwError(() => errors[0]);\n }\n\n return of(this.metricFindValuesToOptions(values));\n })\n );\n }\n\n private runMetricFindForDatasource(\n ds: Awaited<ReturnType<typeof getDataSource>>,\n args: VariableGetOptionsArgs\n ): Observable<{ values: MetricFindValue[]; error?: unknown }> {\n const runner = createQueryVariableRunner(ds);\n const target = runner.getTarget(this);\n const request = this.getRequest(target, args.searchFilter);\n\n return runner.runRequest({ variable: this, searchFilter: args.searchFilter }, request).pipe(\n registerQueryWithController({\n type: 'QueryVariable/getValueOptions',\n request: request,\n origin: this,\n }),\n filter((data) => data.state === LoadingState.Done || data.state === LoadingState.Error),\n take(1),\n mergeMap((data: PanelData) => {\n if (data.state === LoadingState.Error) {\n return throwError(() => data.error);\n }\n return of(data);\n }),\n toMetricFindValues(),\n mergeMap((values) => of({ values, error: undefined as unknown }))\n );\n }\n\n private metricFindValuesToOptions(values: MetricFindValue[]): VariableValueOption[] {\n let regex = '';\n if (this.state.regex) {\n regex = sceneGraph.interpolate(this, this.state.regex, undefined, 'regex');\n }\n let options = metricNamesToVariableValues({\n variableRegEx: regex,\n variableRegexApplyTo: this.state.regexApplyTo,\n sort: this.state.sort,\n metricNames: values,\n });\n if (this.state.staticOptions) {\n const customOptions = this.state.staticOptions;\n options = options.filter((option) => !customOptions.find((custom) => custom.value === option.value));\n if (this.state.staticOptionsOrder === 'after') {\n options.push(...customOptions);\n } else if (this.state.staticOptionsOrder === 'sorted') {\n options = sortVariableValues(options.concat(customOptions), this.state.sort);\n } else {\n options.unshift(...customOptions);\n }\n }\n return options;\n }\n\n private getRequest(target: DataQuery | string, searchFilter?: string) {\n const scopedVars: ScopedVars = {\n __sceneObject: wrapInSafeSerializableSceneObject(this),\n };\n\n if (searchFilter) {\n scopedVars.__searchFilter = { value: searchFilter, text: searchFilter };\n }\n\n const range = sceneGraph.getTimeRange(this).state.value;\n\n const request: DataQueryRequest = {\n app: CoreApp.Dashboard,\n requestId: uuidv4(),\n timezone: '',\n range,\n interval: '',\n intervalMs: 0,\n // @ts-ignore\n targets: [target],\n scopedVars,\n startTime: Date.now(),\n };\n\n return request;\n }\n\n onSearchChange = (searchFilter: string) => {\n if (!containsSearchFilter(this.state.query)) {\n return;\n }\n\n this._updateOptionsBasedOnSearchFilter(searchFilter);\n };\n\n private _updateOptionsBasedOnSearchFilter = debounce(async (searchFilter: string) => {\n const result = await lastValueFrom(this.getValueOptions({ searchFilter }));\n this.setState({ options: result, loading: false });\n }, 400);\n\n public static Component = ({ model }: SceneComponentProps<MultiValueVariable>) => {\n return <MultiOrSingleValueSelect model={model} />;\n };\n}\n\nfunction containsSearchFilter(query: string | DataQuery) {\n const str = safeStringifyValue(query);\n return str.indexOf(SEARCH_FILTER_VARIABLE) > -1;\n}\n"],"names":["uuidv4"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1518,6 +1518,8 @@ declare class QueryVariable extends MultiValueVariable<QueryVariableState> {
1518
1518
  protected _variableDependency: VariableDependencyConfig<QueryVariableState>;
1519
1519
  constructor(initialState: Partial<QueryVariableState>);
1520
1520
  getValueOptions(args: VariableGetOptionsArgs): Observable<VariableValueOption[]>;
1521
+ private runMetricFindForDatasource;
1522
+ private metricFindValuesToOptions;
1521
1523
  private getRequest;
1522
1524
  onSearchChange: (searchFilter: string) => void;
1523
1525
  private _updateOptionsBasedOnSearchFilter;
package/dist/index.js CHANGED
@@ -11070,21 +11070,6 @@ class DrilldownDependenciesManager {
11070
11070
  }
11071
11071
  }
11072
11072
 
11073
- let counter$1 = 100;
11074
- const MIXED_DATASOURCE_UID = "-- Mixed --";
11075
- const MIXED_DATASOURCE_REF = { type: "mixed", uid: MIXED_DATASOURCE_UID };
11076
- function getNextRequestId$1(prefix = "SQR") {
11077
- return prefix + counter$1++;
11078
- }
11079
- function isTemplatedDatasourceUid(uid) {
11080
- if (!uid) {
11081
- return false;
11082
- }
11083
- return /^(?:\$[A-Za-z0-9_]+|\$\{[^}]+\})/.test(uid);
11084
- }
11085
- function isTemplatedDatasourceRef(datasource) {
11086
- return isTemplatedDatasourceUid(datasource == null ? void 0 : datasource.uid);
11087
- }
11088
11073
  function getSimpleVariableNameFromDatasourceUid(uid) {
11089
11074
  if (!uid) {
11090
11075
  return void 0;
@@ -11099,19 +11084,53 @@ function getSimpleVariableNameFromDatasourceUid(uid) {
11099
11084
  }
11100
11085
  return void 0;
11101
11086
  }
11102
- function getDatasourceVariableSelectionCount(sceneObject, variableName) {
11087
+ function getDatasourceVariableSelectedUids(sceneObject, variableName) {
11103
11088
  const variable = sceneGraph.lookupVariable(variableName, sceneObject);
11104
11089
  if (!variable) {
11105
11090
  return void 0;
11106
11091
  }
11107
11092
  const value = variable.getValue();
11108
11093
  if (Array.isArray(value)) {
11109
- return value.filter((item) => item !== "default").length;
11094
+ return value.filter((item) => item !== "default").map(String);
11110
11095
  }
11111
11096
  if (value === null || value === void 0) {
11112
11097
  return void 0;
11113
11098
  }
11114
- return value === "default" ? 0 : 1;
11099
+ if (value === "default") {
11100
+ return [];
11101
+ }
11102
+ return [String(value)];
11103
+ }
11104
+ function getDatasourceVariableSelectionCount(sceneObject, variableName) {
11105
+ const uids = getDatasourceVariableSelectedUids(sceneObject, variableName);
11106
+ return uids == null ? void 0 : uids.length;
11107
+ }
11108
+ function expandMultiValueDatasourceUids(sceneObject, datasource) {
11109
+ const variableName = getSimpleVariableNameFromDatasourceUid(datasource == null ? void 0 : datasource.uid);
11110
+ if (!variableName) {
11111
+ return void 0;
11112
+ }
11113
+ const uids = getDatasourceVariableSelectedUids(sceneObject, variableName);
11114
+ if (!uids || uids.length <= 1) {
11115
+ return void 0;
11116
+ }
11117
+ return uids;
11118
+ }
11119
+
11120
+ let counter$1 = 100;
11121
+ const MIXED_DATASOURCE_UID = "-- Mixed --";
11122
+ const MIXED_DATASOURCE_REF = { type: "mixed", uid: MIXED_DATASOURCE_UID };
11123
+ function getNextRequestId$1(prefix = "SQR") {
11124
+ return prefix + counter$1++;
11125
+ }
11126
+ function isTemplatedDatasourceUid(uid) {
11127
+ if (!uid) {
11128
+ return false;
11129
+ }
11130
+ return /^(?:\$[A-Za-z0-9_]+|\$\{[^}]+\})/.test(uid);
11131
+ }
11132
+ function isTemplatedDatasourceRef(datasource) {
11133
+ return isTemplatedDatasourceUid(datasource == null ? void 0 : datasource.uid);
11115
11134
  }
11116
11135
  function shouldUseMixedRuntimeDatasource(sceneObject, datasource, queries) {
11117
11136
  const refs = [datasource, ...queries.map((query) => query.datasource)];
@@ -14389,66 +14408,79 @@ class QueryVariable extends MultiValueVariable {
14389
14408
  return rxjs.of([]);
14390
14409
  }
14391
14410
  this.setState({ loading: true, error: null });
14392
- return rxjs.from(
14393
- getDataSource(this.state.datasource, {
14394
- __sceneObject: wrapInSafeSerializableSceneObject(this)
14395
- })
14396
- ).pipe(
14397
- rxjs.mergeMap((ds) => {
14398
- const runner = createQueryVariableRunner(ds);
14399
- const target = runner.getTarget(this);
14400
- const request = this.getRequest(target, args.searchFilter);
14401
- return runner.runRequest({ variable: this, searchFilter: args.searchFilter }, request).pipe(
14402
- registerQueryWithController({
14403
- type: "QueryVariable/getValueOptions",
14404
- request,
14405
- origin: this
14406
- }),
14407
- rxjs.filter((data$1) => data$1.state === data.LoadingState.Done || data$1.state === data.LoadingState.Error),
14408
- // we only care about done or error for now
14409
- rxjs.take(1),
14410
- // take the first result, using first caused a bug where it in some situations throw an uncaught error because of no results had been received yet
14411
- rxjs.mergeMap((data$1) => {
14412
- if (data$1.state === data.LoadingState.Error) {
14413
- return rxjs.throwError(() => data$1.error);
14414
- }
14415
- return rxjs.of(data$1);
14416
- }),
14417
- toMetricFindValues(),
14418
- rxjs.mergeMap((values) => {
14419
- let regex = "";
14420
- if (this.state.regex) {
14421
- regex = sceneGraph.interpolate(this, this.state.regex, void 0, "regex");
14422
- }
14423
- let options = metricNamesToVariableValues({
14424
- variableRegEx: regex,
14425
- variableRegexApplyTo: this.state.regexApplyTo,
14426
- sort: this.state.sort,
14427
- metricNames: values
14428
- });
14429
- if (this.state.staticOptions) {
14430
- const customOptions = this.state.staticOptions;
14431
- options = options.filter((option) => !customOptions.find((custom) => custom.value === option.value));
14432
- if (this.state.staticOptionsOrder === "after") {
14433
- options.push(...customOptions);
14434
- } else if (this.state.staticOptionsOrder === "sorted") {
14435
- options = sortVariableValues(options.concat(customOptions), this.state.sort);
14436
- } else {
14437
- options.unshift(...customOptions);
14438
- }
14439
- }
14440
- return rxjs.of(options);
14441
- }),
14442
- rxjs.catchError((error) => {
14443
- if (error.cancelled) {
14444
- return rxjs.of([]);
14445
- }
14446
- return rxjs.throwError(() => error);
14447
- })
14448
- );
14411
+ const fanOutUids = expandMultiValueDatasourceUids(this, this.state.datasource);
14412
+ const datasourceRefs = fanOutUids ? fanOutUids.map((uid) => ({ ...this.state.datasource, uid })) : [this.state.datasource];
14413
+ const scopedSceneObject = {
14414
+ __sceneObject: wrapInSafeSerializableSceneObject(this)
14415
+ };
14416
+ const perDatasource = datasourceRefs.map(
14417
+ (datasource) => rxjs.from(getDataSource(datasource, scopedSceneObject)).pipe(
14418
+ rxjs.mergeMap((ds) => this.runMetricFindForDatasource(ds, args)),
14419
+ rxjs.catchError((error) => {
14420
+ if (error == null ? void 0 : error.cancelled) {
14421
+ return rxjs.of({ values: [], error: void 0 });
14422
+ }
14423
+ return rxjs.of({ values: [], error });
14424
+ })
14425
+ )
14426
+ );
14427
+ return rxjs.forkJoin(perDatasource).pipe(
14428
+ rxjs.mergeMap((results) => {
14429
+ const values = results.flatMap((result) => result.values);
14430
+ const errors = results.map((result) => result.error).filter(Boolean);
14431
+ if (values.length === 0 && errors.length > 0) {
14432
+ return rxjs.throwError(() => errors[0]);
14433
+ }
14434
+ return rxjs.of(this.metricFindValuesToOptions(values));
14449
14435
  })
14450
14436
  );
14451
14437
  }
14438
+ runMetricFindForDatasource(ds, args) {
14439
+ const runner = createQueryVariableRunner(ds);
14440
+ const target = runner.getTarget(this);
14441
+ const request = this.getRequest(target, args.searchFilter);
14442
+ return runner.runRequest({ variable: this, searchFilter: args.searchFilter }, request).pipe(
14443
+ registerQueryWithController({
14444
+ type: "QueryVariable/getValueOptions",
14445
+ request,
14446
+ origin: this
14447
+ }),
14448
+ rxjs.filter((data$1) => data$1.state === data.LoadingState.Done || data$1.state === data.LoadingState.Error),
14449
+ rxjs.take(1),
14450
+ rxjs.mergeMap((data$1) => {
14451
+ if (data$1.state === data.LoadingState.Error) {
14452
+ return rxjs.throwError(() => data$1.error);
14453
+ }
14454
+ return rxjs.of(data$1);
14455
+ }),
14456
+ toMetricFindValues(),
14457
+ rxjs.mergeMap((values) => rxjs.of({ values, error: void 0 }))
14458
+ );
14459
+ }
14460
+ metricFindValuesToOptions(values) {
14461
+ let regex = "";
14462
+ if (this.state.regex) {
14463
+ regex = sceneGraph.interpolate(this, this.state.regex, void 0, "regex");
14464
+ }
14465
+ let options = metricNamesToVariableValues({
14466
+ variableRegEx: regex,
14467
+ variableRegexApplyTo: this.state.regexApplyTo,
14468
+ sort: this.state.sort,
14469
+ metricNames: values
14470
+ });
14471
+ if (this.state.staticOptions) {
14472
+ const customOptions = this.state.staticOptions;
14473
+ options = options.filter((option) => !customOptions.find((custom) => custom.value === option.value));
14474
+ if (this.state.staticOptionsOrder === "after") {
14475
+ options.push(...customOptions);
14476
+ } else if (this.state.staticOptionsOrder === "sorted") {
14477
+ options = sortVariableValues(options.concat(customOptions), this.state.sort);
14478
+ } else {
14479
+ options.unshift(...customOptions);
14480
+ }
14481
+ }
14482
+ return options;
14483
+ }
14452
14484
  getRequest(target, searchFilter) {
14453
14485
  const scopedVars = {
14454
14486
  __sceneObject: wrapInSafeSerializableSceneObject(this)