@grafana/scenes 5.11.2 → 5.11.3--canary.858.10679390033.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. package/CHANGELOG.md +5 -5
  2. package/dist/esm/behaviors/SceneQueryController.js +60 -5
  3. package/dist/esm/behaviors/SceneQueryController.js.map +1 -1
  4. package/dist/esm/behaviors/SceneRenderProfiler.js +168 -0
  5. package/dist/esm/behaviors/SceneRenderProfiler.js.map +1 -0
  6. package/dist/esm/components/SceneRefreshPicker.js +4 -1
  7. package/dist/esm/components/SceneRefreshPicker.js.map +1 -1
  8. package/dist/esm/components/VizPanel/VizPanel.js +9 -6
  9. package/dist/esm/components/VizPanel/VizPanel.js.map +1 -1
  10. package/dist/esm/core/SceneTimeRange.js +3 -0
  11. package/dist/esm/core/SceneTimeRange.js.map +1 -1
  12. package/dist/esm/core/sceneGraph/getQueryController.js +19 -0
  13. package/dist/esm/core/sceneGraph/getQueryController.js.map +1 -0
  14. package/dist/esm/core/sceneGraph/index.js +2 -1
  15. package/dist/esm/core/sceneGraph/index.js.map +1 -1
  16. package/dist/esm/core/sceneGraph/sceneGraph.js +1 -16
  17. package/dist/esm/core/sceneGraph/sceneGraph.js.map +1 -1
  18. package/dist/esm/index.js.map +1 -1
  19. package/dist/esm/querying/SceneQueryRunner.js +1 -3
  20. package/dist/esm/querying/SceneQueryRunner.js.map +1 -1
  21. package/dist/esm/querying/registerQueryWithController.js +19 -2
  22. package/dist/esm/querying/registerQueryWithController.js.map +1 -1
  23. package/dist/esm/services/useUrlSync.js.map +1 -1
  24. package/dist/esm/utils/getDataSource.js +17 -1
  25. package/dist/esm/utils/getDataSource.js.map +1 -1
  26. package/dist/esm/variables/components/VariableValueSelect.js +5 -0
  27. package/dist/esm/variables/components/VariableValueSelect.js.map +1 -1
  28. package/dist/esm/variables/variants/MultiValueVariable.js.map +1 -1
  29. package/dist/esm/variables/variants/TestVariable.js.map +1 -1
  30. package/dist/index.d.ts +43 -25
  31. package/dist/index.js +464 -206
  32. package/dist/index.js.map +1 -1
  33. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"SceneQueryRunner.js","sources":["../../../src/querying/SceneQueryRunner.ts"],"sourcesContent":["import { cloneDeep, isEqual } from 'lodash';\nimport { forkJoin, ReplaySubject, Unsubscribable } from 'rxjs';\n\nimport { DataQuery, DataSourceRef, LoadingState } from '@grafana/schema';\n\nimport {\n AlertStateInfo,\n DataFrame,\n DataFrameView,\n DataQueryRequest,\n DataSourceApi,\n DataTopic,\n PanelData,\n preProcessPanelData,\n rangeUtil,\n} from '@grafana/data';\n\n// TODO: Remove this ignore annotation when the grafana runtime dependency has been updated\n// @ts-ignore\nimport { getRunRequest, toDataQueryError, isExpressionReference, config } from '@grafana/runtime';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport {\n DataLayerFilter,\n SceneDataProvider,\n SceneDataProviderResult,\n SceneDataQuery,\n SceneObjectState,\n SceneTimeRangeLike,\n} from '../core/types';\nimport { getDataSource } from '../utils/getDataSource';\nimport { VariableDependencyConfig } from '../variables/VariableDependencyConfig';\nimport { writeSceneLog } from '../utils/writeSceneLog';\nimport { VariableValueRecorder } from '../variables/VariableValueRecorder';\nimport { emptyPanelData } from '../core/SceneDataNode';\nimport { getClosest } from '../core/sceneGraph/utils';\nimport { isExtraQueryProvider, ExtraQueryDataProcessor, ExtraQueryProvider } from './ExtraQueryProvider';\nimport { passthroughProcessor, extraQueryProcessingOperator } from './extraQueryProcessingOperator';\nimport { filterAnnotations } from './layers/annotations/filterAnnotations';\nimport { getEnrichedDataRequest } from './getEnrichedDataRequest';\nimport { findActiveAdHocFilterVariableByUid } from '../variables/adhoc/patchGetAdhocFilters';\nimport { registerQueryWithController } from './registerQueryWithController';\nimport { findActiveGroupByVariablesByUid } from '../variables/groupby/findActiveGroupByVariablesByUid';\nimport { GroupByVariable } from '../variables/groupby/GroupByVariable';\nimport { AdHocFiltersVariable, isFilterComplete } from '../variables/adhoc/AdHocFiltersVariable';\nimport { SceneVariable } from '../variables/types';\nimport { DataLayersMerger } from './DataLayersMerger';\nimport { interpolate } from '../core/sceneGraph/sceneGraph';\nimport { wrapInSafeSerializableSceneObject } from '../utils/wrapInSafeSerializableSceneObject';\n\nlet counter = 100;\n\nexport function getNextRequestId() {\n return 'SQR' + counter++;\n}\n\nexport interface QueryRunnerState extends SceneObjectState {\n data?: PanelData;\n queries: SceneDataQuery[];\n datasource?: DataSourceRef;\n minInterval?: string;\n maxDataPoints?: number;\n liveStreaming?: boolean;\n maxDataPointsFromWidth?: boolean;\n cacheTimeout?: DataQueryRequest['cacheTimeout'];\n queryCachingTTL?: DataQueryRequest['queryCachingTTL'];\n /**\n * When set to auto (the default) query runner will issue queries on activate (when variable dependencies are ready) or when time range change.\n * Set to manual to have full manual control over when queries are issued. Try not to set this. This is mainly useful for unit tests, or special edge case workflows.\n */\n runQueriesMode?: 'auto' | 'manual';\n // Filters to be applied to data layer results before combining them with SQR results\n dataLayerFilter?: DataLayerFilter;\n // Private runtime state\n _hasFetchedData?: boolean;\n}\n\nexport interface DataQueryExtended extends DataQuery {\n [key: string]: any;\n\n // Opt this query out of time window comparison\n timeRangeCompare?: boolean;\n}\n\n// The requests that will be run by the query runner.\n//\n// Generally the query runner will run a single primary request.\n// If the scene graph contains implementations of\n// `ExtraQueryProvider`, the requests created by these\n// implementations will be added to the list of secondary requests,\n// and these will be executed at the same time as the primary request.\n//\n// The results of each secondary request will be passed to an associated\n// processor function (along with the results of the primary request),\n// which can transform the results as desired.\ninterface PreparedRequests {\n // The primary request to run.\n primary: DataQueryRequest;\n // A possibly empty list of secondary requests to run alongside\n // the primary request.\n secondaries: DataQueryRequest[];\n // A map from `requestId` of secondary requests to processors\n // for those requests. Provided by the `ExtraQueryProvider`.\n processors: Map<string, ExtraQueryDataProcessor>;\n}\n\nexport class SceneQueryRunner extends SceneObjectBase<QueryRunnerState> implements SceneDataProvider {\n private _querySub?: Unsubscribable;\n private _dataLayersSub?: Unsubscribable;\n private _dataLayersMerger = new DataLayersMerger();\n private _timeSub?: Unsubscribable;\n private _timeSubRange?: SceneTimeRangeLike;\n private _containerWidth?: number;\n private _variableValueRecorder = new VariableValueRecorder();\n private _results = new ReplaySubject<SceneDataProviderResult>(1);\n private _scopedVars = { __sceneObject: wrapInSafeSerializableSceneObject(this) };\n private _layerAnnotations?: DataFrame[];\n private _resultAnnotations?: DataFrame[];\n\n private _adhocFiltersVar?: AdHocFiltersVariable;\n private _groupByVar?: GroupByVariable;\n\n public getResultsStream() {\n return this._results;\n }\n\n protected _variableDependency: VariableDependencyConfig<QueryRunnerState> = new VariableDependencyConfig(this, {\n statePaths: ['queries', 'datasource'],\n onVariableUpdateCompleted: this.onVariableUpdatesCompleted.bind(this),\n onAnyVariableChanged: this.onAnyVariableChanged.bind(this),\n });\n\n public constructor(initialState: QueryRunnerState) {\n super(initialState);\n\n this.addActivationHandler(() => this._onActivate());\n }\n\n private _onActivate() {\n if (this.isQueryModeAuto()) {\n const timeRange = sceneGraph.getTimeRange(this);\n\n // Add subscriptions to any extra providers so that they rerun queries\n // when their state changes and they should rerun.\n const providers = this.getClosestExtraQueryProviders();\n for (const provider of providers) {\n this._subs.add(\n provider.subscribeToState((n, p) => {\n if (provider.shouldRerun(p, n, this.state.queries)) {\n this.runQueries();\n }\n }),\n );\n }\n\n this.subscribeToTimeRangeChanges(\n timeRange,\n );\n\n if (this.shouldRunQueriesOnActivate()) {\n this.runQueries();\n }\n }\n\n if (!this._dataLayersSub) {\n this._handleDataLayers();\n }\n\n return () => this._onDeactivate();\n }\n\n // This method subscribes to all SceneDataLayers up until the root, and combines the results into data provided from SceneQueryRunner\n private _handleDataLayers() {\n const dataLayers = sceneGraph.getDataLayers(this);\n\n if (dataLayers.length === 0) {\n return;\n }\n\n this._dataLayersSub = this._dataLayersMerger\n .getMergedStream(dataLayers)\n .subscribe(this._onLayersReceived.bind(this));\n }\n\n private _onLayersReceived(results: Iterable<SceneDataProviderResult>) {\n const timeRange = sceneGraph.getTimeRange(this);\n const { dataLayerFilter } = this.state;\n\n let annotations: DataFrame[] = [];\n let alertStates: DataFrame[] = [];\n let alertState: AlertStateInfo | undefined;\n\n for (const result of results) {\n for (let frame of result.data.series) {\n if (frame.meta?.dataTopic === DataTopic.Annotations) {\n annotations = annotations.concat(frame);\n }\n if (frame.meta?.dataTopic === DataTopic.AlertStates) {\n alertStates = alertStates.concat(frame);\n }\n }\n }\n\n if (dataLayerFilter?.panelId) {\n if (annotations.length > 0) {\n annotations = filterAnnotations(annotations, dataLayerFilter);\n }\n\n if (alertStates.length > 0) {\n for (const frame of alertStates) {\n const frameView = new DataFrameView<AlertStateInfo>(frame);\n\n for (const row of frameView) {\n if (row.panelId === dataLayerFilter.panelId) {\n alertState = row;\n break;\n }\n }\n }\n }\n }\n\n // Skip unnessary state updates\n if (\n allFramesEmpty(annotations) &&\n allFramesEmpty(this._layerAnnotations) &&\n isEqual(alertState, this.state.data?.alertState)\n ) {\n return;\n }\n\n this._layerAnnotations = annotations;\n\n const baseStateUpdate = this.state.data ? this.state.data : { ...emptyPanelData, timeRange: timeRange.state.value };\n\n this.setState({\n data: {\n ...baseStateUpdate,\n annotations: [...(this._resultAnnotations ?? []), ...annotations],\n alertState: alertState ?? this.state.data?.alertState,\n },\n });\n }\n\n /**\n * This tries to start a new query whenever a variable completes or is changed.\n *\n * We care about variable update completions even when the variable has not changed and even when it is not a direct dependency.\n * Example: Variables A and B (B depends on A). A update depends on time range. So when time change query runner will\n * find that variable A is loading which is a dependency on of variable B so will set _isWaitingForVariables to true and\n * not issue any query.\n *\n * When A completes it's loading (with no value change, so B never updates) it will cause a call of this function letting\n * the query runner know that A has completed, and in case _isWaitingForVariables we try to run the query. The query will\n * only run if all variables are in a non loading state so in other scenarios where a query depends on many variables this will\n * be called many times until all dependencies are in a non loading state. *\n */\n private onVariableUpdatesCompleted() {\n if(this.isQueryModeAuto()){\n this.runQueries();\n }\n }\n\n /**\n * Check if value changed is a adhoc filter o group by variable that did not exist when we issued the last query\n */\n private onAnyVariableChanged(variable: SceneVariable) {\n // If this variable has already been detected this variable as a dependency onVariableUpdatesCompleted above will handle value changes\n if (this._adhocFiltersVar === variable || this._groupByVar === variable || !this.isQueryModeAuto()) {\n return;\n }\n\n if (variable instanceof AdHocFiltersVariable && this._isRelevantAutoVariable(variable)) {\n this.runQueries();\n }\n\n if (variable instanceof GroupByVariable && this._isRelevantAutoVariable(variable)) {\n this.runQueries();\n }\n }\n\n private _isRelevantAutoVariable(variable: AdHocFiltersVariable | GroupByVariable) {\n const datasource = this.state.datasource ?? findFirstDatasource(this.state.queries);\n return variable.state.applyMode === 'auto' && datasource?.uid === variable.state.datasource?.uid;\n }\n\n private shouldRunQueriesOnActivate() {\n if (this._variableValueRecorder.hasDependenciesChanged(this)) {\n writeSceneLog(\n 'SceneQueryRunner',\n 'Variable dependency changed while inactive, shouldRunQueriesOnActivate returns true'\n );\n return true;\n }\n\n // If we don't have any data we should run queries\n if (!this.state.data) {\n return true;\n }\n\n // If time range is stale / different we should run queries\n if (this._isDataTimeRangeStale(this.state.data)) {\n return true;\n }\n\n return false;\n }\n\n private _isDataTimeRangeStale(data: PanelData) {\n const timeRange = sceneGraph.getTimeRange(this);\n\n const stateTimeRange = timeRange.state.value;\n const dataTimeRange = data.timeRange;\n\n if (\n stateTimeRange.from.unix() === dataTimeRange.from.unix() &&\n stateTimeRange.to.unix() === dataTimeRange.to.unix()\n ) {\n return false;\n }\n writeSceneLog('SceneQueryRunner', 'Data time range is stale');\n return true;\n }\n\n private _onDeactivate(): void {\n if (this._querySub) {\n this._querySub.unsubscribe();\n this._querySub = undefined;\n }\n\n if (this._dataLayersSub) {\n this._dataLayersSub.unsubscribe();\n this._dataLayersSub = undefined;\n }\n\n this._timeSub?.unsubscribe();\n this._timeSub = undefined;\n this._timeSubRange = undefined;\n this._adhocFiltersVar = undefined;\n this._groupByVar = undefined;\n this._variableValueRecorder.recordCurrentDependencyValuesForSceneObject(this);\n }\n\n public setContainerWidth(width: number) {\n // If we don't have a width we should run queries\n if (!this._containerWidth && width > 0) {\n this._containerWidth = width;\n\n // If we don't have maxDataPoints specifically set and maxDataPointsFromWidth is true\n if (this.state.maxDataPointsFromWidth && !this.state.maxDataPoints) {\n // As this is called from render path we need to wait for next tick before running queries\n setTimeout(() => {\n if (this.isActive && !this.state._hasFetchedData) {\n this.runQueries();\n }\n }, 0);\n }\n } else {\n // if the updated container width is bigger than 0 let's remember the width until next query issue\n if (width > 0) {\n this._containerWidth = width;\n }\n }\n }\n\n public isDataReadyToDisplay() {\n return Boolean(this.state._hasFetchedData);\n }\n\n private subscribeToTimeRangeChanges(timeRange: SceneTimeRangeLike) {\n if (this._timeSubRange === timeRange) {\n // Nothing to do, already subscribed\n return;\n }\n\n if (this._timeSub) {\n this._timeSub.unsubscribe();\n }\n\n this._timeSubRange = timeRange;\n this._timeSub = timeRange.subscribeToState(() => {\n this.runWithTimeRange(timeRange);\n });\n }\n\n public runQueries() {\n const timeRange = sceneGraph.getTimeRange(this);\n if(this.isQueryModeAuto()){\n this.subscribeToTimeRangeChanges(timeRange);\n }\n\n this.runWithTimeRange(timeRange);\n }\n\n private getMaxDataPoints() {\n if (this.state.maxDataPoints) {\n return this.state.maxDataPoints;\n }\n\n return this.state.maxDataPointsFromWidth ? this._containerWidth ?? 500 : 500;\n }\n\n public cancelQuery() {\n this._querySub?.unsubscribe();\n\n if (this._dataLayersSub) {\n this._dataLayersSub.unsubscribe();\n this._dataLayersSub = undefined;\n }\n\n this.setState({\n data: { ...this.state.data!, state: LoadingState.Done },\n });\n }\n\n private async runWithTimeRange(timeRange: SceneTimeRangeLike) {\n // If no maxDataPoints specified we might need to wait for container width to be set from the outside\n if (!this.state.maxDataPoints && this.state.maxDataPointsFromWidth && !this._containerWidth) {\n return;\n }\n\n // If data layers subscription doesn't exist, create one\n if (!this._dataLayersSub) {\n this._handleDataLayers();\n }\n\n // Cancel any running queries\n this._querySub?.unsubscribe();\n\n // Skip executing queries if variable dependency is in loading state\n if (this._variableDependency.hasDependencyInLoadingState()) {\n writeSceneLog('SceneQueryRunner', 'Variable dependency is in loading state, skipping query execution');\n this.setState({ data: { ...(this.state.data ?? emptyPanelData), state: LoadingState.Loading } });\n return;\n }\n\n const { queries } = this.state;\n\n // Simple path when no queries exist\n if (!queries?.length) {\n this._setNoDataState();\n return;\n }\n\n try {\n const datasource = this.state.datasource ?? findFirstDatasource(queries);\n const ds = await getDataSource(datasource, this._scopedVars);\n\n this.findAndSubscribeToAdHocFilters(datasource?.uid);\n\n const runRequest = getRunRequest();\n const { primary, secondaries, processors } = this.prepareRequests(timeRange, ds);\n\n writeSceneLog('SceneQueryRunner', 'Starting runRequest', this.state.key);\n\n let stream = runRequest(ds, primary);\n\n if (secondaries.length > 0) {\n // Submit all secondary requests in parallel.\n const secondaryStreams = secondaries.map((r) => runRequest(ds, r));\n // Create the rxjs operator which will combine the primary and secondary responses\n // by calling the correct processor functions provided by the\n // extra request providers.\n const op = extraQueryProcessingOperator(processors);\n // Combine the primary and secondary streams into a single stream, and apply the operator.\n stream = forkJoin([stream, ...secondaryStreams]).pipe(op);\n }\n\n stream = stream.pipe(\n registerQueryWithController({\n type: 'data',\n request: primary,\n origin: this,\n cancel: () => this.cancelQuery(),\n })\n );\n\n this._querySub = stream.subscribe(this.onDataReceived);\n } catch (err) {\n console.error('PanelQueryRunner Error', err);\n\n this.onDataReceived({\n ...emptyPanelData,\n ...this.state.data,\n state: LoadingState.Error,\n errors: [toDataQueryError(err)],\n });\n }\n }\n\n public clone(withState?: Partial<QueryRunnerState>) {\n const clone = super.clone(withState);\n\n if (this._resultAnnotations) {\n clone['_resultAnnotations'] = this._resultAnnotations.map((frame) => ({ ...frame }));\n }\n\n if (this._layerAnnotations) {\n clone['_layerAnnotations'] = this._layerAnnotations.map((frame) => ({ ...frame }));\n }\n\n clone['_variableValueRecorder'] = this._variableValueRecorder.cloneAndRecordCurrentValuesForSceneObject(this);\n clone['_containerWidth'] = this._containerWidth;\n clone['_results'].next({ origin: this, data: this.state.data ?? emptyPanelData });\n\n return clone;\n }\n\n private prepareRequests(timeRange: SceneTimeRangeLike, ds: DataSourceApi): PreparedRequests {\n const { minInterval, queries } = this.state;\n\n let request: DataQueryRequest<DataQueryExtended> = {\n app: 'scenes',\n requestId: getNextRequestId(),\n timezone: timeRange.getTimeZone(),\n range: timeRange.state.value,\n interval: '1s',\n intervalMs: 1000,\n targets: cloneDeep(queries),\n maxDataPoints: this.getMaxDataPoints(),\n scopedVars: this._scopedVars,\n startTime: Date.now(),\n liveStreaming: this.state.liveStreaming,\n rangeRaw: {\n from: timeRange.state.from,\n to: timeRange.state.to,\n },\n cacheTimeout: this.state.cacheTimeout,\n queryCachingTTL: this.state.queryCachingTTL,\n // This asks the scene root to provide context properties like app, panel and dashboardUID\n ...getEnrichedDataRequest(this),\n };\n\n if (this._adhocFiltersVar) {\n // only pass filters that have both key and value\n // @ts-ignore (Temporary ignore until we update @grafana/data)\n request.filters = this._adhocFiltersVar.state.filters.filter(isFilterComplete);\n }\n\n if (this._groupByVar) {\n // @ts-ignore (Temporary ignore until we update @grafana/data)\n request.groupByKeys = this._groupByVar.state.value;\n }\n\n request.targets = request.targets.map((query) => {\n if (\n !query.datasource ||\n (query.datasource.uid !== ds.uid &&\n !ds.meta?.mixed &&\n isExpressionReference /* TODO: Remove this check when isExpressionReference is properly exported from grafan runtime */ &&\n !isExpressionReference(query.datasource))\n ) {\n query.datasource = ds.getRef();\n }\n return query;\n });\n\n const lowerIntervalLimit = minInterval ? interpolate(this, minInterval) : ds.interval;\n const norm = rangeUtil.calculateInterval(timeRange.state.value, request.maxDataPoints!, lowerIntervalLimit);\n\n // make shallow copy of scoped vars,\n // and add built in variables interval and interval_ms\n request.scopedVars = Object.assign({}, request.scopedVars, {\n __interval: { text: norm.interval, value: norm.interval },\n __interval_ms: { text: norm.intervalMs.toString(), value: norm.intervalMs },\n });\n\n request.interval = norm.interval;\n request.intervalMs = norm.intervalMs;\n\n // If there are any extra request providers, we need to add a new request for each\n // and map the request's ID to the processor function given by the provider, to ensure that\n // the processor is called with the correct response data.\n const primaryTimeRange = timeRange.state.value;\n let secondaryRequests: DataQueryRequest[] = [];\n let secondaryProcessors = new Map();\n for (const provider of this.getClosestExtraQueryProviders() ?? []) {\n for (const { req, processor } of provider.getExtraQueries(request)) {\n const requestId = getNextRequestId();\n secondaryRequests.push({ ...req, requestId });\n secondaryProcessors.set(requestId, processor ?? passthroughProcessor);\n }\n }\n request.range = primaryTimeRange;\n return { primary: request, secondaries: secondaryRequests, processors: secondaryProcessors };\n }\n\n private onDataReceived = (data: PanelData) => {\n // Will combine annotations from SQR queries (frames with meta.dataTopic === DataTopic.Annotations)\n const preProcessedData = preProcessPanelData(data, this.state.data);\n\n // Save query annotations\n this._resultAnnotations = data.annotations;\n\n // Will combine annotations & alert state from data layer providers\n const dataWithLayersApplied = this._combineDataLayers(preProcessedData);\n\n let hasFetchedData = this.state._hasFetchedData;\n\n if (!hasFetchedData && preProcessedData.state !== LoadingState.Loading) {\n hasFetchedData = true;\n }\n\n this.setState({ data: dataWithLayersApplied, _hasFetchedData: hasFetchedData });\n this._results.next({ origin: this, data: dataWithLayersApplied });\n };\n\n private _combineDataLayers(data: PanelData) {\n if (this._layerAnnotations && this._layerAnnotations.length > 0) {\n data.annotations = (data.annotations || []).concat(this._layerAnnotations);\n }\n\n if (this.state.data && this.state.data.alertState) {\n data.alertState = this.state.data.alertState;\n }\n\n return data;\n }\n\n private _setNoDataState() {\n if (this.state.data !== emptyPanelData) {\n this.setState({ data: emptyPanelData });\n }\n }\n\n /**\n * Walk up the scene graph and find any ExtraQueryProviders.\n *\n * This will return an array of the closest provider of each type.\n */\n private getClosestExtraQueryProviders(): Array<ExtraQueryProvider<any>> {\n // Maintain a map from provider constructor to provider object. The constructor\n // is used as a unique key for each class, to ensure we have no more than one\n // type of each type of provider.\n const found = new Map();\n if (!this.parent) {\n return [];\n }\n getClosest(this.parent, (s) => {\n if (isExtraQueryProvider(s) && !found.has(s.constructor)) {\n found.set(s.constructor, s);\n }\n s.forEachChild((child) => {\n if (isExtraQueryProvider(child) && !found.has(child.constructor)) {\n found.set(child.constructor, child);\n }\n });\n // Always return null so that the search continues to the top of\n // the scene graph.\n return null;\n });\n return Array.from(found.values());\n }\n\n /**\n * Walk up scene graph and find the closest filterset with matching data source\n */\n private findAndSubscribeToAdHocFilters(uid: string | undefined) {\n const filtersVar = findActiveAdHocFilterVariableByUid(uid);\n\n if (this._adhocFiltersVar !== filtersVar) {\n this._adhocFiltersVar = filtersVar;\n this._updateExplicitVariableDependencies();\n }\n\n const groupByVar = findActiveGroupByVariablesByUid(uid);\n if (this._groupByVar !== groupByVar) {\n this._groupByVar = groupByVar;\n this._updateExplicitVariableDependencies();\n }\n }\n\n private _updateExplicitVariableDependencies() {\n const explicitDependencies: string[] = [];\n\n if (this._adhocFiltersVar) {\n explicitDependencies.push(this._adhocFiltersVar.state.name);\n }\n\n if (this._groupByVar) {\n explicitDependencies.push(this._groupByVar.state.name);\n }\n\n this._variableDependency.setVariableNames(explicitDependencies);\n }\n\n private isQueryModeAuto(): boolean {\n return (this.state.runQueriesMode ?? 'auto') === 'auto'\n }\n}\n\nexport function findFirstDatasource(targets: DataQuery[]): DataSourceRef | undefined {\n return targets.find((t) => t.datasource !== null)?.datasource ?? undefined;\n}\n\nfunction allFramesEmpty(frames?: DataFrame[]) {\n if (!frames) {\n return true;\n }\n\n for (let i = 0; i < frames.length; i++) {\n if (frames[i].length > 0) {\n return false;\n }\n }\n\n return true;\n}\n"],"names":["_a"],"mappings":"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"}
1
+ {"version":3,"file":"SceneQueryRunner.js","sources":["../../../src/querying/SceneQueryRunner.ts"],"sourcesContent":["import { cloneDeep, isEqual } from 'lodash';\nimport { forkJoin, ReplaySubject, Unsubscribable } from 'rxjs';\n\nimport { DataQuery, DataSourceRef, LoadingState } from '@grafana/schema';\n\nimport {\n AlertStateInfo,\n DataFrame,\n DataFrameView,\n DataQueryRequest,\n DataSourceApi,\n DataTopic,\n PanelData,\n preProcessPanelData,\n rangeUtil,\n} from '@grafana/data';\n\n// TODO: Remove this ignore annotation when the grafana runtime dependency has been updated\n// @ts-ignore\nimport { getRunRequest, toDataQueryError, isExpressionReference, config } from '@grafana/runtime';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport {\n DataLayerFilter,\n SceneDataProvider,\n SceneDataProviderResult,\n SceneDataQuery,\n SceneObjectState,\n SceneTimeRangeLike,\n} from '../core/types';\nimport { getDataSource } from '../utils/getDataSource';\nimport { VariableDependencyConfig } from '../variables/VariableDependencyConfig';\nimport { writeSceneLog } from '../utils/writeSceneLog';\nimport { VariableValueRecorder } from '../variables/VariableValueRecorder';\nimport { emptyPanelData } from '../core/SceneDataNode';\nimport { getClosest } from '../core/sceneGraph/utils';\nimport { isExtraQueryProvider, ExtraQueryDataProcessor, ExtraQueryProvider } from './ExtraQueryProvider';\nimport { passthroughProcessor, extraQueryProcessingOperator } from './extraQueryProcessingOperator';\nimport { filterAnnotations } from './layers/annotations/filterAnnotations';\nimport { getEnrichedDataRequest } from './getEnrichedDataRequest';\nimport { findActiveAdHocFilterVariableByUid } from '../variables/adhoc/patchGetAdhocFilters';\nimport { registerQueryWithController } from './registerQueryWithController';\nimport { findActiveGroupByVariablesByUid } from '../variables/groupby/findActiveGroupByVariablesByUid';\nimport { GroupByVariable } from '../variables/groupby/GroupByVariable';\nimport { AdHocFiltersVariable, isFilterComplete } from '../variables/adhoc/AdHocFiltersVariable';\nimport { SceneVariable } from '../variables/types';\nimport { DataLayersMerger } from './DataLayersMerger';\nimport { interpolate } from '../core/sceneGraph/sceneGraph';\nimport { wrapInSafeSerializableSceneObject } from '../utils/wrapInSafeSerializableSceneObject';\n\nlet counter = 100;\n\nexport function getNextRequestId() {\n return 'SQR' + counter++;\n}\n\nexport interface QueryRunnerState extends SceneObjectState {\n data?: PanelData;\n queries: SceneDataQuery[];\n datasource?: DataSourceRef;\n minInterval?: string;\n maxDataPoints?: number;\n liveStreaming?: boolean;\n maxDataPointsFromWidth?: boolean;\n cacheTimeout?: DataQueryRequest['cacheTimeout'];\n queryCachingTTL?: DataQueryRequest['queryCachingTTL'];\n /**\n * When set to auto (the default) query runner will issue queries on activate (when variable dependencies are ready) or when time range change.\n * Set to manual to have full manual control over when queries are issued. Try not to set this. This is mainly useful for unit tests, or special edge case workflows.\n */\n runQueriesMode?: 'auto' | 'manual';\n // Filters to be applied to data layer results before combining them with SQR results\n dataLayerFilter?: DataLayerFilter;\n // Private runtime state\n _hasFetchedData?: boolean;\n}\n\nexport interface DataQueryExtended extends DataQuery {\n [key: string]: any;\n\n // Opt this query out of time window comparison\n timeRangeCompare?: boolean;\n}\n\n// The requests that will be run by the query runner.\n//\n// Generally the query runner will run a single primary request.\n// If the scene graph contains implementations of\n// `ExtraQueryProvider`, the requests created by these\n// implementations will be added to the list of secondary requests,\n// and these will be executed at the same time as the primary request.\n//\n// The results of each secondary request will be passed to an associated\n// processor function (along with the results of the primary request),\n// which can transform the results as desired.\ninterface PreparedRequests {\n // The primary request to run.\n primary: DataQueryRequest;\n // A possibly empty list of secondary requests to run alongside\n // the primary request.\n secondaries: DataQueryRequest[];\n // A map from `requestId` of secondary requests to processors\n // for those requests. Provided by the `ExtraQueryProvider`.\n processors: Map<string, ExtraQueryDataProcessor>;\n}\n\nexport class SceneQueryRunner extends SceneObjectBase<QueryRunnerState> implements SceneDataProvider {\n private _querySub?: Unsubscribable;\n private _dataLayersSub?: Unsubscribable;\n private _dataLayersMerger = new DataLayersMerger();\n private _timeSub?: Unsubscribable;\n private _timeSubRange?: SceneTimeRangeLike;\n private _containerWidth?: number;\n private _variableValueRecorder = new VariableValueRecorder();\n private _results = new ReplaySubject<SceneDataProviderResult>(1);\n private _scopedVars = { __sceneObject: wrapInSafeSerializableSceneObject(this) };\n private _layerAnnotations?: DataFrame[];\n private _resultAnnotations?: DataFrame[];\n\n private _adhocFiltersVar?: AdHocFiltersVariable;\n private _groupByVar?: GroupByVariable;\n\n public getResultsStream() {\n return this._results;\n }\n\n protected _variableDependency: VariableDependencyConfig<QueryRunnerState> = new VariableDependencyConfig(this, {\n statePaths: ['queries', 'datasource'],\n onVariableUpdateCompleted: this.onVariableUpdatesCompleted.bind(this),\n onAnyVariableChanged: this.onAnyVariableChanged.bind(this),\n });\n\n public constructor(initialState: QueryRunnerState) {\n super(initialState);\n\n this.addActivationHandler(() => this._onActivate());\n }\n\n private _onActivate() {\n if (this.isQueryModeAuto()) {\n const timeRange = sceneGraph.getTimeRange(this);\n\n // Add subscriptions to any extra providers so that they rerun queries\n // when their state changes and they should rerun.\n const providers = this.getClosestExtraQueryProviders();\n for (const provider of providers) {\n this._subs.add(\n provider.subscribeToState((n, p) => {\n if (provider.shouldRerun(p, n, this.state.queries)) {\n this.runQueries();\n }\n })\n );\n }\n\n this.subscribeToTimeRangeChanges(timeRange);\n\n if (this.shouldRunQueriesOnActivate()) {\n this.runQueries();\n }\n }\n\n if (!this._dataLayersSub) {\n this._handleDataLayers();\n }\n\n return () => this._onDeactivate();\n }\n\n // This method subscribes to all SceneDataLayers up until the root, and combines the results into data provided from SceneQueryRunner\n private _handleDataLayers() {\n const dataLayers = sceneGraph.getDataLayers(this);\n\n if (dataLayers.length === 0) {\n return;\n }\n\n this._dataLayersSub = this._dataLayersMerger\n .getMergedStream(dataLayers)\n .subscribe(this._onLayersReceived.bind(this));\n }\n\n private _onLayersReceived(results: Iterable<SceneDataProviderResult>) {\n const timeRange = sceneGraph.getTimeRange(this);\n const { dataLayerFilter } = this.state;\n\n let annotations: DataFrame[] = [];\n let alertStates: DataFrame[] = [];\n let alertState: AlertStateInfo | undefined;\n\n for (const result of results) {\n for (let frame of result.data.series) {\n if (frame.meta?.dataTopic === DataTopic.Annotations) {\n annotations = annotations.concat(frame);\n }\n if (frame.meta?.dataTopic === DataTopic.AlertStates) {\n alertStates = alertStates.concat(frame);\n }\n }\n }\n\n if (dataLayerFilter?.panelId) {\n if (annotations.length > 0) {\n annotations = filterAnnotations(annotations, dataLayerFilter);\n }\n\n if (alertStates.length > 0) {\n for (const frame of alertStates) {\n const frameView = new DataFrameView<AlertStateInfo>(frame);\n\n for (const row of frameView) {\n if (row.panelId === dataLayerFilter.panelId) {\n alertState = row;\n break;\n }\n }\n }\n }\n }\n\n // Skip unnessary state updates\n if (\n allFramesEmpty(annotations) &&\n allFramesEmpty(this._layerAnnotations) &&\n isEqual(alertState, this.state.data?.alertState)\n ) {\n return;\n }\n\n this._layerAnnotations = annotations;\n\n const baseStateUpdate = this.state.data ? this.state.data : { ...emptyPanelData, timeRange: timeRange.state.value };\n\n this.setState({\n data: {\n ...baseStateUpdate,\n annotations: [...(this._resultAnnotations ?? []), ...annotations],\n alertState: alertState ?? this.state.data?.alertState,\n },\n });\n }\n\n /**\n * This tries to start a new query whenever a variable completes or is changed.\n *\n * We care about variable update completions even when the variable has not changed and even when it is not a direct dependency.\n * Example: Variables A and B (B depends on A). A update depends on time range. So when time change query runner will\n * find that variable A is loading which is a dependency on of variable B so will set _isWaitingForVariables to true and\n * not issue any query.\n *\n * When A completes it's loading (with no value change, so B never updates) it will cause a call of this function letting\n * the query runner know that A has completed, and in case _isWaitingForVariables we try to run the query. The query will\n * only run if all variables are in a non loading state so in other scenarios where a query depends on many variables this will\n * be called many times until all dependencies are in a non loading state. *\n */\n private onVariableUpdatesCompleted() {\n if (this.isQueryModeAuto()) {\n this.runQueries();\n }\n }\n\n /**\n * Check if value changed is a adhoc filter o group by variable that did not exist when we issued the last query\n */\n private onAnyVariableChanged(variable: SceneVariable) {\n // If this variable has already been detected this variable as a dependency onVariableUpdatesCompleted above will handle value changes\n if (this._adhocFiltersVar === variable || this._groupByVar === variable || !this.isQueryModeAuto()) {\n return;\n }\n\n if (variable instanceof AdHocFiltersVariable && this._isRelevantAutoVariable(variable)) {\n this.runQueries();\n }\n\n if (variable instanceof GroupByVariable && this._isRelevantAutoVariable(variable)) {\n this.runQueries();\n }\n }\n\n private _isRelevantAutoVariable(variable: AdHocFiltersVariable | GroupByVariable) {\n const datasource = this.state.datasource ?? findFirstDatasource(this.state.queries);\n return variable.state.applyMode === 'auto' && datasource?.uid === variable.state.datasource?.uid;\n }\n\n private shouldRunQueriesOnActivate() {\n if (this._variableValueRecorder.hasDependenciesChanged(this)) {\n writeSceneLog(\n 'SceneQueryRunner',\n 'Variable dependency changed while inactive, shouldRunQueriesOnActivate returns true'\n );\n return true;\n }\n\n // If we don't have any data we should run queries\n if (!this.state.data) {\n return true;\n }\n\n // If time range is stale / different we should run queries\n if (this._isDataTimeRangeStale(this.state.data)) {\n return true;\n }\n\n return false;\n }\n\n private _isDataTimeRangeStale(data: PanelData) {\n const timeRange = sceneGraph.getTimeRange(this);\n\n const stateTimeRange = timeRange.state.value;\n const dataTimeRange = data.timeRange;\n\n if (\n stateTimeRange.from.unix() === dataTimeRange.from.unix() &&\n stateTimeRange.to.unix() === dataTimeRange.to.unix()\n ) {\n return false;\n }\n writeSceneLog('SceneQueryRunner', 'Data time range is stale');\n return true;\n }\n\n private _onDeactivate(): void {\n if (this._querySub) {\n this._querySub.unsubscribe();\n this._querySub = undefined;\n }\n\n if (this._dataLayersSub) {\n this._dataLayersSub.unsubscribe();\n this._dataLayersSub = undefined;\n }\n\n this._timeSub?.unsubscribe();\n this._timeSub = undefined;\n this._timeSubRange = undefined;\n this._adhocFiltersVar = undefined;\n this._groupByVar = undefined;\n this._variableValueRecorder.recordCurrentDependencyValuesForSceneObject(this);\n }\n\n public setContainerWidth(width: number) {\n // If we don't have a width we should run queries\n if (!this._containerWidth && width > 0) {\n this._containerWidth = width;\n\n // If we don't have maxDataPoints specifically set and maxDataPointsFromWidth is true\n if (this.state.maxDataPointsFromWidth && !this.state.maxDataPoints) {\n // As this is called from render path we need to wait for next tick before running queries\n setTimeout(() => {\n if (this.isActive && !this.state._hasFetchedData) {\n this.runQueries();\n }\n }, 0);\n }\n } else {\n // if the updated container width is bigger than 0 let's remember the width until next query issue\n if (width > 0) {\n this._containerWidth = width;\n }\n }\n }\n\n public isDataReadyToDisplay() {\n return Boolean(this.state._hasFetchedData);\n }\n\n private subscribeToTimeRangeChanges(timeRange: SceneTimeRangeLike) {\n if (this._timeSubRange === timeRange) {\n // Nothing to do, already subscribed\n return;\n }\n\n if (this._timeSub) {\n this._timeSub.unsubscribe();\n }\n\n this._timeSubRange = timeRange;\n this._timeSub = timeRange.subscribeToState(() => {\n this.runWithTimeRange(timeRange);\n });\n }\n\n public runQueries() {\n const timeRange = sceneGraph.getTimeRange(this);\n if (this.isQueryModeAuto()) {\n this.subscribeToTimeRangeChanges(timeRange);\n }\n\n this.runWithTimeRange(timeRange);\n }\n\n private getMaxDataPoints() {\n if (this.state.maxDataPoints) {\n return this.state.maxDataPoints;\n }\n\n return this.state.maxDataPointsFromWidth ? this._containerWidth ?? 500 : 500;\n }\n\n public cancelQuery() {\n this._querySub?.unsubscribe();\n\n if (this._dataLayersSub) {\n this._dataLayersSub.unsubscribe();\n this._dataLayersSub = undefined;\n }\n\n this.setState({\n data: { ...this.state.data!, state: LoadingState.Done },\n });\n }\n\n private async runWithTimeRange(timeRange: SceneTimeRangeLike) {\n // If no maxDataPoints specified we might need to wait for container width to be set from the outside\n if (!this.state.maxDataPoints && this.state.maxDataPointsFromWidth && !this._containerWidth) {\n return;\n }\n\n // If data layers subscription doesn't exist, create one\n if (!this._dataLayersSub) {\n this._handleDataLayers();\n }\n\n // Cancel any running queries\n this._querySub?.unsubscribe();\n\n // Skip executing queries if variable dependency is in loading state\n if (this._variableDependency.hasDependencyInLoadingState()) {\n writeSceneLog('SceneQueryRunner', 'Variable dependency is in loading state, skipping query execution');\n this.setState({ data: { ...(this.state.data ?? emptyPanelData), state: LoadingState.Loading } });\n return;\n }\n\n const { queries } = this.state;\n\n // Simple path when no queries exist\n if (!queries?.length) {\n this._setNoDataState();\n return;\n }\n\n try {\n const datasource = this.state.datasource ?? findFirstDatasource(queries);\n const ds = await getDataSource(datasource, this._scopedVars);\n\n this.findAndSubscribeToAdHocFilters(datasource?.uid);\n\n const runRequest = getRunRequest();\n const { primary, secondaries, processors } = this.prepareRequests(timeRange, ds);\n\n writeSceneLog('SceneQueryRunner', 'Starting runRequest', this.state.key);\n\n let stream = runRequest(ds, primary);\n\n if (secondaries.length > 0) {\n // Submit all secondary requests in parallel.\n const secondaryStreams = secondaries.map((r) => runRequest(ds, r));\n // Create the rxjs operator which will combine the primary and secondary responses\n // by calling the correct processor functions provided by the\n // extra request providers.\n const op = extraQueryProcessingOperator(processors);\n // Combine the primary and secondary streams into a single stream, and apply the operator.\n stream = forkJoin([stream, ...secondaryStreams]).pipe(op);\n }\n\n stream = stream.pipe(\n registerQueryWithController({\n type: 'data',\n request: primary,\n origin: this,\n cancel: () => this.cancelQuery(),\n })\n );\n\n this._querySub = stream.subscribe(this.onDataReceived);\n } catch (err) {\n console.error('PanelQueryRunner Error', err);\n\n this.onDataReceived({\n ...emptyPanelData,\n ...this.state.data,\n state: LoadingState.Error,\n errors: [toDataQueryError(err)],\n });\n }\n }\n\n public clone(withState?: Partial<QueryRunnerState>) {\n const clone = super.clone(withState);\n\n if (this._resultAnnotations) {\n clone['_resultAnnotations'] = this._resultAnnotations.map((frame) => ({ ...frame }));\n }\n\n if (this._layerAnnotations) {\n clone['_layerAnnotations'] = this._layerAnnotations.map((frame) => ({ ...frame }));\n }\n\n clone['_variableValueRecorder'] = this._variableValueRecorder.cloneAndRecordCurrentValuesForSceneObject(this);\n clone['_containerWidth'] = this._containerWidth;\n clone['_results'].next({ origin: this, data: this.state.data ?? emptyPanelData });\n\n return clone;\n }\n\n private prepareRequests(timeRange: SceneTimeRangeLike, ds: DataSourceApi): PreparedRequests {\n const { minInterval, queries } = this.state;\n\n let request: DataQueryRequest<DataQueryExtended> = {\n app: 'scenes',\n requestId: getNextRequestId(),\n timezone: timeRange.getTimeZone(),\n range: timeRange.state.value,\n interval: '1s',\n intervalMs: 1000,\n targets: cloneDeep(queries),\n maxDataPoints: this.getMaxDataPoints(),\n scopedVars: this._scopedVars,\n startTime: Date.now(),\n liveStreaming: this.state.liveStreaming,\n rangeRaw: {\n from: timeRange.state.from,\n to: timeRange.state.to,\n },\n cacheTimeout: this.state.cacheTimeout,\n queryCachingTTL: this.state.queryCachingTTL,\n // This asks the scene root to provide context properties like app, panel and dashboardUID\n ...getEnrichedDataRequest(this),\n };\n\n if (this._adhocFiltersVar) {\n // only pass filters that have both key and value\n // @ts-ignore (Temporary ignore until we update @grafana/data)\n request.filters = this._adhocFiltersVar.state.filters.filter(isFilterComplete);\n }\n\n if (this._groupByVar) {\n // @ts-ignore (Temporary ignore until we update @grafana/data)\n request.groupByKeys = this._groupByVar.state.value;\n }\n\n request.targets = request.targets.map((query) => {\n if (\n !query.datasource ||\n (query.datasource.uid !== ds.uid &&\n !ds.meta?.mixed &&\n isExpressionReference /* TODO: Remove this check when isExpressionReference is properly exported from grafan runtime */ &&\n !isExpressionReference(query.datasource))\n ) {\n query.datasource = ds.getRef();\n }\n return query;\n });\n\n const lowerIntervalLimit = minInterval ? interpolate(this, minInterval) : ds.interval;\n const norm = rangeUtil.calculateInterval(timeRange.state.value, request.maxDataPoints!, lowerIntervalLimit);\n\n // make shallow copy of scoped vars,\n // and add built in variables interval and interval_ms\n request.scopedVars = Object.assign({}, request.scopedVars, {\n __interval: { text: norm.interval, value: norm.interval },\n __interval_ms: { text: norm.intervalMs.toString(), value: norm.intervalMs },\n });\n\n request.interval = norm.interval;\n request.intervalMs = norm.intervalMs;\n\n // If there are any extra request providers, we need to add a new request for each\n // and map the request's ID to the processor function given by the provider, to ensure that\n // the processor is called with the correct response data.\n const primaryTimeRange = timeRange.state.value;\n let secondaryRequests: DataQueryRequest[] = [];\n let secondaryProcessors = new Map();\n for (const provider of this.getClosestExtraQueryProviders() ?? []) {\n for (const { req, processor } of provider.getExtraQueries(request)) {\n const requestId = getNextRequestId();\n secondaryRequests.push({ ...req, requestId });\n secondaryProcessors.set(requestId, processor ?? passthroughProcessor);\n }\n }\n request.range = primaryTimeRange;\n return { primary: request, secondaries: secondaryRequests, processors: secondaryProcessors };\n }\n\n private onDataReceived = (data: PanelData) => {\n // Will combine annotations from SQR queries (frames with meta.dataTopic === DataTopic.Annotations)\n const preProcessedData = preProcessPanelData(data, this.state.data);\n\n // Save query annotations\n this._resultAnnotations = data.annotations;\n\n // Will combine annotations & alert state from data layer providers\n const dataWithLayersApplied = this._combineDataLayers(preProcessedData);\n\n let hasFetchedData = this.state._hasFetchedData;\n\n if (!hasFetchedData && preProcessedData.state !== LoadingState.Loading) {\n hasFetchedData = true;\n }\n\n this.setState({ data: dataWithLayersApplied, _hasFetchedData: hasFetchedData });\n this._results.next({ origin: this, data: dataWithLayersApplied });\n };\n\n private _combineDataLayers(data: PanelData) {\n if (this._layerAnnotations && this._layerAnnotations.length > 0) {\n data.annotations = (data.annotations || []).concat(this._layerAnnotations);\n }\n\n if (this.state.data && this.state.data.alertState) {\n data.alertState = this.state.data.alertState;\n }\n\n return data;\n }\n\n private _setNoDataState() {\n if (this.state.data !== emptyPanelData) {\n this.setState({ data: emptyPanelData });\n }\n }\n\n /**\n * Walk up the scene graph and find any ExtraQueryProviders.\n *\n * This will return an array of the closest provider of each type.\n */\n private getClosestExtraQueryProviders(): Array<ExtraQueryProvider<any>> {\n // Maintain a map from provider constructor to provider object. The constructor\n // is used as a unique key for each class, to ensure we have no more than one\n // type of each type of provider.\n const found = new Map();\n if (!this.parent) {\n return [];\n }\n getClosest(this.parent, (s) => {\n if (isExtraQueryProvider(s) && !found.has(s.constructor)) {\n found.set(s.constructor, s);\n }\n s.forEachChild((child) => {\n if (isExtraQueryProvider(child) && !found.has(child.constructor)) {\n found.set(child.constructor, child);\n }\n });\n // Always return null so that the search continues to the top of\n // the scene graph.\n return null;\n });\n return Array.from(found.values());\n }\n\n /**\n * Walk up scene graph and find the closest filterset with matching data source\n */\n private findAndSubscribeToAdHocFilters(uid: string | undefined) {\n const filtersVar = findActiveAdHocFilterVariableByUid(uid);\n\n if (this._adhocFiltersVar !== filtersVar) {\n this._adhocFiltersVar = filtersVar;\n this._updateExplicitVariableDependencies();\n }\n\n const groupByVar = findActiveGroupByVariablesByUid(uid);\n if (this._groupByVar !== groupByVar) {\n this._groupByVar = groupByVar;\n this._updateExplicitVariableDependencies();\n }\n }\n\n private _updateExplicitVariableDependencies() {\n const explicitDependencies: string[] = [];\n\n if (this._adhocFiltersVar) {\n explicitDependencies.push(this._adhocFiltersVar.state.name);\n }\n\n if (this._groupByVar) {\n explicitDependencies.push(this._groupByVar.state.name);\n }\n\n this._variableDependency.setVariableNames(explicitDependencies);\n }\n\n private isQueryModeAuto(): boolean {\n return (this.state.runQueriesMode ?? 'auto') === 'auto';\n }\n}\n\nexport function findFirstDatasource(targets: DataQuery[]): DataSourceRef | undefined {\n return targets.find((t) => t.datasource !== null)?.datasource ?? undefined;\n}\n\nfunction allFramesEmpty(frames?: DataFrame[]) {\n if (!frames) {\n return true;\n }\n\n for (let i = 0; i < frames.length; i++) {\n if (frames[i].length > 0) {\n return false;\n }\n }\n\n return true;\n}\n"],"names":["_a"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { Observable } from 'rxjs';
1
+ import { Observable, from, map, catchError } from 'rxjs';
2
2
  import { LoadingState } from '@grafana/schema';
3
3
  import { sceneGraph } from '../core/sceneGraph/index.js';
4
4
 
@@ -36,6 +36,23 @@ function registerQueryWithController(entry) {
36
36
  });
37
37
  };
38
38
  }
39
+ function wrapPromiseInStateObservable(promise) {
40
+ console.log("wrapPromiseInStateObservable", promise);
41
+ return new Observable((observer) => {
42
+ observer.next({ state: LoadingState.Loading });
43
+ const promiseObservable = from(promise);
44
+ promiseObservable.pipe(
45
+ map(() => ({ state: LoadingState.Done })),
46
+ catchError(() => {
47
+ observer.next({ state: LoadingState.Error });
48
+ return [];
49
+ })
50
+ ).subscribe({
51
+ next: (result) => observer.next(result),
52
+ complete: () => observer.complete()
53
+ });
54
+ });
55
+ }
39
56
 
40
- export { registerQueryWithController };
57
+ export { registerQueryWithController, wrapPromiseInStateObservable };
41
58
  //# sourceMappingURL=registerQueryWithController.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"registerQueryWithController.js","sources":["../../../src/querying/registerQueryWithController.ts"],"sourcesContent":["import { Observable } from 'rxjs';\nimport { LoadingState } from '@grafana/schema';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { QueryResultWithState, SceneQueryControllerEntry } from '../behaviors/SceneQueryController';\n\n/**\n * Will look for a scene object with a behavior that is a SceneQueryController and register the query with it.\n */\nexport function registerQueryWithController<T extends QueryResultWithState>(entry: SceneQueryControllerEntry) {\n return (queryStream: Observable<T>) => {\n const queryControler = sceneGraph.getQueryController(entry.origin);\n if (!queryControler) {\n return queryStream;\n }\n\n return new Observable<T>((observer) => {\n if (!entry.cancel) {\n entry.cancel = () => observer.complete();\n }\n\n queryControler.queryStarted(entry);\n let markedAsCompleted = false;\n\n const sub = queryStream.subscribe({\n next: (v) => {\n if (!markedAsCompleted && v.state !== LoadingState.Loading) {\n markedAsCompleted = true;\n queryControler.queryCompleted(entry);\n }\n\n observer.next(v);\n },\n error: (e) => observer.error(e),\n complete: () => {\n observer.complete();\n },\n });\n\n return () => {\n sub.unsubscribe();\n\n if (!markedAsCompleted) {\n queryControler.queryCompleted(entry);\n }\n };\n });\n };\n}\n"],"names":[],"mappings":";;;;AAQO,SAAS,4BAA4D,KAAkC,EAAA;AAC5G,EAAA,OAAO,CAAC,WAA+B,KAAA;AACrC,IAAA,MAAM,cAAiB,GAAA,UAAA,CAAW,kBAAmB,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AACjE,IAAA,IAAI,CAAC,cAAgB,EAAA;AACnB,MAAO,OAAA,WAAA,CAAA;AAAA,KACT;AAEA,IAAO,OAAA,IAAI,UAAc,CAAA,CAAC,QAAa,KAAA;AACrC,MAAI,IAAA,CAAC,MAAM,MAAQ,EAAA;AACjB,QAAM,KAAA,CAAA,MAAA,GAAS,MAAM,QAAA,CAAS,QAAS,EAAA,CAAA;AAAA,OACzC;AAEA,MAAA,cAAA,CAAe,aAAa,KAAK,CAAA,CAAA;AACjC,MAAA,IAAI,iBAAoB,GAAA,KAAA,CAAA;AAExB,MAAM,MAAA,GAAA,GAAM,YAAY,SAAU,CAAA;AAAA,QAChC,IAAA,EAAM,CAAC,CAAM,KAAA;AACX,UAAA,IAAI,CAAC,iBAAA,IAAqB,CAAE,CAAA,KAAA,KAAU,aAAa,OAAS,EAAA;AAC1D,YAAoB,iBAAA,GAAA,IAAA,CAAA;AACpB,YAAA,cAAA,CAAe,eAAe,KAAK,CAAA,CAAA;AAAA,WACrC;AAEA,UAAA,QAAA,CAAS,KAAK,CAAC,CAAA,CAAA;AAAA,SACjB;AAAA,QACA,KAAO,EAAA,CAAC,CAAM,KAAA,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,QAC9B,UAAU,MAAM;AACd,UAAA,QAAA,CAAS,QAAS,EAAA,CAAA;AAAA,SACpB;AAAA,OACD,CAAA,CAAA;AAED,MAAA,OAAO,MAAM;AACX,QAAA,GAAA,CAAI,WAAY,EAAA,CAAA;AAEhB,QAAA,IAAI,CAAC,iBAAmB,EAAA;AACtB,UAAA,cAAA,CAAe,eAAe,KAAK,CAAA,CAAA;AAAA,SACrC;AAAA,OACF,CAAA;AAAA,KACD,CAAA,CAAA;AAAA,GACH,CAAA;AACF;;;;"}
1
+ {"version":3,"file":"registerQueryWithController.js","sources":["../../../src/querying/registerQueryWithController.ts"],"sourcesContent":["import { Observable, catchError, from, map } from 'rxjs';\nimport { LoadingState } from '@grafana/schema';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { QueryResultWithState, SceneQueryControllerEntry } from '../behaviors/types';\n\n/**\n * Will look for a scene object with a behavior that is a SceneQueryController and register the query with it.\n */\nexport function registerQueryWithController<T extends QueryResultWithState>(entry: SceneQueryControllerEntry) {\n return (queryStream: Observable<T>) => {\n const queryControler = sceneGraph.getQueryController(entry.origin);\n if (!queryControler) {\n return queryStream;\n }\n\n return new Observable<T>((observer) => {\n if (!entry.cancel) {\n entry.cancel = () => observer.complete();\n }\n\n queryControler.queryStarted(entry);\n let markedAsCompleted = false;\n\n const sub = queryStream.subscribe({\n next: (v) => {\n if (!markedAsCompleted && v.state !== LoadingState.Loading) {\n markedAsCompleted = true;\n queryControler.queryCompleted(entry);\n }\n\n observer.next(v);\n },\n error: (e) => observer.error(e),\n complete: () => {\n observer.complete();\n },\n });\n\n return () => {\n sub.unsubscribe();\n\n if (!markedAsCompleted) {\n queryControler.queryCompleted(entry);\n }\n };\n });\n };\n}\n\n// Wraps an arbitrary Promise in an observble that emits Promise state\nexport function wrapPromiseInStateObservable(promise: Promise<any>): Observable<QueryResultWithState> {\n console.log('wrapPromiseInStateObservable', promise);\n return new Observable<QueryResultWithState>((observer) => {\n // Emit 'loading' state initially\n observer.next({ state: LoadingState.Loading });\n\n // Convert the promise to an observable\n const promiseObservable = from(promise);\n\n // Subscribe to the promise observable\n promiseObservable\n .pipe(\n map(() => ({ state: LoadingState.Done })),\n\n catchError(() => {\n observer.next({ state: LoadingState.Error });\n return [];\n })\n )\n .subscribe({\n next: (result) => observer.next(result),\n complete: () => observer.complete(),\n });\n });\n}\n"],"names":[],"mappings":";;;;AAQO,SAAS,4BAA4D,KAAkC,EAAA;AAC5G,EAAA,OAAO,CAAC,WAA+B,KAAA;AACrC,IAAA,MAAM,cAAiB,GAAA,UAAA,CAAW,kBAAmB,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AACjE,IAAA,IAAI,CAAC,cAAgB,EAAA;AACnB,MAAO,OAAA,WAAA,CAAA;AAAA,KACT;AAEA,IAAO,OAAA,IAAI,UAAc,CAAA,CAAC,QAAa,KAAA;AACrC,MAAI,IAAA,CAAC,MAAM,MAAQ,EAAA;AACjB,QAAM,KAAA,CAAA,MAAA,GAAS,MAAM,QAAA,CAAS,QAAS,EAAA,CAAA;AAAA,OACzC;AAEA,MAAA,cAAA,CAAe,aAAa,KAAK,CAAA,CAAA;AACjC,MAAA,IAAI,iBAAoB,GAAA,KAAA,CAAA;AAExB,MAAM,MAAA,GAAA,GAAM,YAAY,SAAU,CAAA;AAAA,QAChC,IAAA,EAAM,CAAC,CAAM,KAAA;AACX,UAAA,IAAI,CAAC,iBAAA,IAAqB,CAAE,CAAA,KAAA,KAAU,aAAa,OAAS,EAAA;AAC1D,YAAoB,iBAAA,GAAA,IAAA,CAAA;AACpB,YAAA,cAAA,CAAe,eAAe,KAAK,CAAA,CAAA;AAAA,WACrC;AAEA,UAAA,QAAA,CAAS,KAAK,CAAC,CAAA,CAAA;AAAA,SACjB;AAAA,QACA,KAAO,EAAA,CAAC,CAAM,KAAA,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,QAC9B,UAAU,MAAM;AACd,UAAA,QAAA,CAAS,QAAS,EAAA,CAAA;AAAA,SACpB;AAAA,OACD,CAAA,CAAA;AAED,MAAA,OAAO,MAAM;AACX,QAAA,GAAA,CAAI,WAAY,EAAA,CAAA;AAEhB,QAAA,IAAI,CAAC,iBAAmB,EAAA;AACtB,UAAA,cAAA,CAAe,eAAe,KAAK,CAAA,CAAA;AAAA,SACrC;AAAA,OACF,CAAA;AAAA,KACD,CAAA,CAAA;AAAA,GACH,CAAA;AACF,CAAA;AAGO,SAAS,6BAA6B,OAAyD,EAAA;AACpG,EAAQ,OAAA,CAAA,GAAA,CAAI,gCAAgC,OAAO,CAAA,CAAA;AACnD,EAAO,OAAA,IAAI,UAAiC,CAAA,CAAC,QAAa,KAAA;AAExD,IAAA,QAAA,CAAS,IAAK,CAAA,EAAE,KAAO,EAAA,YAAA,CAAa,SAAS,CAAA,CAAA;AAG7C,IAAM,MAAA,iBAAA,GAAoB,KAAK,OAAO,CAAA,CAAA;AAGtC,IACG,iBAAA,CAAA,IAAA;AAAA,MACC,IAAI,OAAO,EAAE,KAAO,EAAA,YAAA,CAAa,MAAO,CAAA,CAAA;AAAA,MAExC,WAAW,MAAM;AACf,QAAA,QAAA,CAAS,IAAK,CAAA,EAAE,KAAO,EAAA,YAAA,CAAa,OAAO,CAAA,CAAA;AAC3C,QAAA,OAAO,EAAC,CAAA;AAAA,OACT,CAAA;AAAA,MAEF,SAAU,CAAA;AAAA,MACT,IAAM,EAAA,CAAC,MAAW,KAAA,QAAA,CAAS,KAAK,MAAM,CAAA;AAAA,MACtC,QAAA,EAAU,MAAM,QAAA,CAAS,QAAS,EAAA;AAAA,KACnC,CAAA,CAAA;AAAA,GACJ,CAAA,CAAA;AACH;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useUrlSync.js","sources":["../../../src/services/useUrlSync.ts"],"sourcesContent":["import { SceneObject } from '../core/types';\nimport { useEffect, useState } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { getUrlSyncManager } from './UrlSyncManager';\nimport { locationService } from '@grafana/runtime';\nimport { writeSceneLog } from '../utils/writeSceneLog';\n\nexport function useUrlSync(sceneRoot: SceneObject): boolean {\n const urlSyncManager = getUrlSyncManager();\n const location = useLocation();\n const [isInitialized, setIsInitialized] = useState(false);\n\n useEffect(() => {\n urlSyncManager.initSync(sceneRoot);\n setIsInitialized(true);\n return () => urlSyncManager.cleanUp(sceneRoot);\n }, [sceneRoot, urlSyncManager]);\n\n useEffect(() => {\n // Use latest location, as by the time this effect runs, the location might have changed again\n const latestLocation = locationService.getLocation();\n const locationToHandle = latestLocation !== location ? latestLocation : location;\n\n if (latestLocation !== location) {\n writeSceneLog('useUrlSync', 'latestLocation different from location')\n }\n\n urlSyncManager.handleNewLocation(locationToHandle);\n }, [sceneRoot, urlSyncManager, location]);\n\n return isInitialized;\n}\n\nexport interface UrlSyncContextProviderProps {\n scene: SceneObject;\n children: React.ReactNode;\n}\n"],"names":[],"mappings":";;;;;;AAOO,SAAS,WAAW,SAAiC,EAAA;AAC1D,EAAA,MAAM,iBAAiB,iBAAkB,EAAA,CAAA;AACzC,EAAA,MAAM,WAAW,WAAY,EAAA,CAAA;AAC7B,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAS,KAAK,CAAA,CAAA;AAExD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,cAAA,CAAe,SAAS,SAAS,CAAA,CAAA;AACjC,IAAA,gBAAA,CAAiB,IAAI,CAAA,CAAA;AACrB,IAAO,OAAA,MAAM,cAAe,CAAA,OAAA,CAAQ,SAAS,CAAA,CAAA;AAAA,GAC5C,EAAA,CAAC,SAAW,EAAA,cAAc,CAAC,CAAA,CAAA;AAE9B,EAAA,SAAA,CAAU,MAAM;AAEd,IAAM,MAAA,cAAA,GAAiB,gBAAgB,WAAY,EAAA,CAAA;AACnD,IAAM,MAAA,gBAAA,GAAmB,cAAmB,KAAA,QAAA,GAAW,cAAiB,GAAA,QAAA,CAAA;AAExE,IAAA,IAAI,mBAAmB,QAAU,EAAA;AAC/B,MAAA,aAAA,CAAc,cAAc,wCAAwC,CAAA,CAAA;AAAA,KACtE;AAEA,IAAA,cAAA,CAAe,kBAAkB,gBAAgB,CAAA,CAAA;AAAA,GAChD,EAAA,CAAC,SAAW,EAAA,cAAA,EAAgB,QAAQ,CAAC,CAAA,CAAA;AAExC,EAAO,OAAA,aAAA,CAAA;AACT;;;;"}
1
+ {"version":3,"file":"useUrlSync.js","sources":["../../../src/services/useUrlSync.ts"],"sourcesContent":["import { SceneObject } from '../core/types';\nimport { useEffect, useState } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { getUrlSyncManager } from './UrlSyncManager';\nimport { locationService } from '@grafana/runtime';\nimport { writeSceneLog } from '../utils/writeSceneLog';\n\nexport function useUrlSync(sceneRoot: SceneObject): boolean {\n const urlSyncManager = getUrlSyncManager();\n const location = useLocation();\n const [isInitialized, setIsInitialized] = useState(false);\n\n useEffect(() => {\n urlSyncManager.initSync(sceneRoot);\n setIsInitialized(true);\n return () => urlSyncManager.cleanUp(sceneRoot);\n }, [sceneRoot, urlSyncManager]);\n\n useEffect(() => {\n // Use latest location, as by the time this effect runs, the location might have changed again\n const latestLocation = locationService.getLocation();\n const locationToHandle = latestLocation !== location ? latestLocation : location;\n\n if (latestLocation !== location) {\n writeSceneLog('useUrlSync', 'latestLocation different from location');\n }\n\n urlSyncManager.handleNewLocation(locationToHandle);\n }, [sceneRoot, urlSyncManager, location]);\n\n return isInitialized;\n}\n\nexport interface UrlSyncContextProviderProps {\n scene: SceneObject;\n children: React.ReactNode;\n}\n"],"names":[],"mappings":";;;;;;AAOO,SAAS,WAAW,SAAiC,EAAA;AAC1D,EAAA,MAAM,iBAAiB,iBAAkB,EAAA,CAAA;AACzC,EAAA,MAAM,WAAW,WAAY,EAAA,CAAA;AAC7B,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAS,KAAK,CAAA,CAAA;AAExD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,cAAA,CAAe,SAAS,SAAS,CAAA,CAAA;AACjC,IAAA,gBAAA,CAAiB,IAAI,CAAA,CAAA;AACrB,IAAO,OAAA,MAAM,cAAe,CAAA,OAAA,CAAQ,SAAS,CAAA,CAAA;AAAA,GAC5C,EAAA,CAAC,SAAW,EAAA,cAAc,CAAC,CAAA,CAAA;AAE9B,EAAA,SAAA,CAAU,MAAM;AAEd,IAAM,MAAA,cAAA,GAAiB,gBAAgB,WAAY,EAAA,CAAA;AACnD,IAAM,MAAA,gBAAA,GAAmB,cAAmB,KAAA,QAAA,GAAW,cAAiB,GAAA,QAAA,CAAA;AAExE,IAAA,IAAI,mBAAmB,QAAU,EAAA;AAC/B,MAAA,aAAA,CAAc,cAAc,wCAAwC,CAAA,CAAA;AAAA,KACtE;AAEA,IAAA,cAAA,CAAe,kBAAkB,gBAAgB,CAAA,CAAA;AAAA,GAChD,EAAA,CAAC,SAAW,EAAA,cAAA,EAAgB,QAAQ,CAAC,CAAA,CAAA;AAExC,EAAO,OAAA,aAAA,CAAA;AACT;;;;"}
@@ -1,5 +1,7 @@
1
1
  import { getDataSourceSrv } from '@grafana/runtime';
2
2
  import { runtimeDataSources } from '../querying/RuntimeDataSource.js';
3
+ import { wrapPromiseInStateObservable, registerQueryWithController } from '../querying/registerQueryWithController.js';
4
+ import { sceneGraph } from '../core/sceneGraph/index.js';
3
5
 
4
6
  async function getDataSource(datasource, scopedVars) {
5
7
  if (datasource == null ? void 0 : datasource.uid) {
@@ -11,7 +13,21 @@ async function getDataSource(datasource, scopedVars) {
11
13
  if (datasource && datasource.query) {
12
14
  return datasource;
13
15
  }
14
- return await getDataSourceSrv().get(datasource, scopedVars);
16
+ const dsPromise = getDataSourceSrv().get(datasource, scopedVars);
17
+ if (scopedVars.__sceneObject && scopedVars.__sceneObject.value.valueOf()) {
18
+ const queryControler = sceneGraph.getQueryController(scopedVars.__sceneObject.value.valueOf());
19
+ if (queryControler && queryControler.state.enableProfiling) {
20
+ wrapPromiseInStateObservable(dsPromise).pipe(
21
+ registerQueryWithController({
22
+ type: "plugin",
23
+ origin: scopedVars.__sceneObject.value.valueOf()
24
+ })
25
+ ).subscribe(() => {
26
+ });
27
+ }
28
+ }
29
+ const result = await dsPromise;
30
+ return result;
15
31
  }
16
32
 
17
33
  export { getDataSource };
@@ -1 +1 @@
1
- {"version":3,"file":"getDataSource.js","sources":["../../../src/utils/getDataSource.ts"],"sourcesContent":["import { DataSourceApi, ScopedVars } from '@grafana/data';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { DataSourceRef } from '@grafana/schema';\nimport { runtimeDataSources } from '../querying/RuntimeDataSource';\n\nexport async function getDataSource(\n datasource: DataSourceRef | undefined | null,\n scopedVars: ScopedVars\n): Promise<DataSourceApi> {\n if (datasource?.uid) {\n const runtimeDataSource = runtimeDataSources.get(datasource.uid);\n if (runtimeDataSource) {\n return runtimeDataSource;\n }\n }\n\n if (datasource && (datasource as any).query) {\n return datasource as DataSourceApi;\n }\n\n return await getDataSourceSrv().get(datasource as string, scopedVars);\n}\n"],"names":[],"mappings":";;;AAKsB,eAAA,aAAA,CACpB,YACA,UACwB,EAAA;AACxB,EAAA,IAAI,yCAAY,GAAK,EAAA;AACnB,IAAA,MAAM,iBAAoB,GAAA,kBAAA,CAAmB,GAAI,CAAA,UAAA,CAAW,GAAG,CAAA,CAAA;AAC/D,IAAA,IAAI,iBAAmB,EAAA;AACrB,MAAO,OAAA,iBAAA,CAAA;AAAA,KACT;AAAA,GACF;AAEA,EAAI,IAAA,UAAA,IAAe,WAAmB,KAAO,EAAA;AAC3C,IAAO,OAAA,UAAA,CAAA;AAAA,GACT;AAEA,EAAA,OAAO,MAAM,gBAAA,EAAmB,CAAA,GAAA,CAAI,YAAsB,UAAU,CAAA,CAAA;AACtE;;;;"}
1
+ {"version":3,"file":"getDataSource.js","sources":["../../../src/utils/getDataSource.ts"],"sourcesContent":["import { DataSourceApi, ScopedVars } from '@grafana/data';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { DataSourceRef } from '@grafana/schema';\nimport { runtimeDataSources } from '../querying/RuntimeDataSource';\nimport { registerQueryWithController, wrapPromiseInStateObservable } from '../querying/registerQueryWithController';\nimport { SceneObject } from '../core/types';\nimport { sceneGraph } from '../core/sceneGraph';\n\nexport async function getDataSource(\n datasource: DataSourceRef | undefined | null,\n scopedVars: ScopedVars\n): Promise<DataSourceApi> {\n if (datasource?.uid) {\n const runtimeDataSource = runtimeDataSources.get(datasource.uid);\n if (runtimeDataSource) {\n return runtimeDataSource;\n }\n }\n\n if (datasource && (datasource as any).query) {\n return datasource as DataSourceApi;\n }\n\n const dsPromise = getDataSourceSrv().get(datasource as string, scopedVars);\n\n if (scopedVars.__sceneObject && scopedVars.__sceneObject.value.valueOf()) {\n const queryControler = sceneGraph.getQueryController(scopedVars.__sceneObject.value.valueOf() as SceneObject);\n if (queryControler && queryControler.state.enableProfiling) {\n wrapPromiseInStateObservable(dsPromise)\n .pipe(\n registerQueryWithController({\n type: 'plugin',\n origin: scopedVars.__sceneObject.value.valueOf() as SceneObject,\n })\n )\n .subscribe(() => {});\n }\n }\n\n const result = await dsPromise;\n return result;\n}\n"],"names":[],"mappings":";;;;;AAQsB,eAAA,aAAA,CACpB,YACA,UACwB,EAAA;AACxB,EAAA,IAAI,yCAAY,GAAK,EAAA;AACnB,IAAA,MAAM,iBAAoB,GAAA,kBAAA,CAAmB,GAAI,CAAA,UAAA,CAAW,GAAG,CAAA,CAAA;AAC/D,IAAA,IAAI,iBAAmB,EAAA;AACrB,MAAO,OAAA,iBAAA,CAAA;AAAA,KACT;AAAA,GACF;AAEA,EAAI,IAAA,UAAA,IAAe,WAAmB,KAAO,EAAA;AAC3C,IAAO,OAAA,UAAA,CAAA;AAAA,GACT;AAEA,EAAA,MAAM,SAAY,GAAA,gBAAA,EAAmB,CAAA,GAAA,CAAI,YAAsB,UAAU,CAAA,CAAA;AAEzE,EAAA,IAAI,WAAW,aAAiB,IAAA,UAAA,CAAW,aAAc,CAAA,KAAA,CAAM,SAAW,EAAA;AACxE,IAAA,MAAM,iBAAiB,UAAW,CAAA,kBAAA,CAAmB,WAAW,aAAc,CAAA,KAAA,CAAM,SAAwB,CAAA,CAAA;AAC5G,IAAI,IAAA,cAAA,IAAkB,cAAe,CAAA,KAAA,CAAM,eAAiB,EAAA;AAC1D,MAAA,4BAAA,CAA6B,SAAS,CACnC,CAAA,IAAA;AAAA,QACC,2BAA4B,CAAA;AAAA,UAC1B,IAAM,EAAA,QAAA;AAAA,UACN,MAAQ,EAAA,UAAA,CAAW,aAAc,CAAA,KAAA,CAAM,OAAQ,EAAA;AAAA,SAChD,CAAA;AAAA,OACH,CACC,UAAU,MAAM;AAAA,OAAE,CAAA,CAAA;AAAA,KACvB;AAAA,GACF;AAEA,EAAA,MAAM,SAAS,MAAM,SAAA,CAAA;AACrB,EAAO,OAAA,MAAA,CAAA;AACT;;;;"}
@@ -4,6 +4,7 @@ import { Select, MultiSelect, useTheme2, getSelectStyles, useStyles2, Checkbox }
4
4
  import { selectors } from '@grafana/e2e-selectors';
5
5
  import { cx, css } from '@emotion/css';
6
6
  import { getOptionSearcher } from './getOptionSearcher.js';
7
+ import { sceneGraph } from '../../core/sceneGraph/index.js';
7
8
 
8
9
  var __defProp = Object.defineProperty;
9
10
  var __defProps = Object.defineProperties;
@@ -48,6 +49,7 @@ function VariableValueSelect({ model }) {
48
49
  const [inputValue, setInputValue] = useState("");
49
50
  const [hasCustomValue, setHasCustomValue] = useState(false);
50
51
  const selectValue = toSelectableValue(value, String(text));
52
+ const queryController = sceneGraph.getQueryController(model);
51
53
  const optionSearcher = useMemo(() => getOptionSearcher(options, includeAll), [options, includeAll]);
52
54
  const onInputChange = (value2, { action }) => {
53
55
  if (action === "input-change") {
@@ -87,6 +89,7 @@ function VariableValueSelect({ model }) {
87
89
  "data-testid": selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownValueLinkTexts(`${value}`),
88
90
  onChange: (newValue) => {
89
91
  model.changeValueTo(newValue.value, newValue.label);
92
+ queryController == null ? void 0 : queryController.startProfile(model);
90
93
  if (hasCustomValue !== newValue.__isNew__) {
91
94
  setHasCustomValue(newValue.__isNew__);
92
95
  }
@@ -98,6 +101,7 @@ function VariableValueSelectMulti({ model }) {
98
101
  const arrayValue = useMemo(() => isArray(value) ? value : [value], [value]);
99
102
  const [uncommittedValue, setUncommittedValue] = useState(arrayValue);
100
103
  const [inputValue, setInputValue] = useState("");
104
+ const queryController = sceneGraph.getQueryController(model);
101
105
  const optionSearcher = useMemo(() => getOptionSearcher(options, includeAll), [options, includeAll]);
102
106
  useEffect(() => {
103
107
  setUncommittedValue(arrayValue);
@@ -138,6 +142,7 @@ function VariableValueSelectMulti({ model }) {
138
142
  onInputChange,
139
143
  onBlur: () => {
140
144
  model.changeValueTo(uncommittedValue);
145
+ queryController == null ? void 0 : queryController.startProfile(model);
141
146
  },
142
147
  filterOption: filterNoOp,
143
148
  "data-testid": selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownValueLinkTexts(`${uncommittedValue}`),
@@ -1 +1 @@
1
- {"version":3,"file":"VariableValueSelect.js","sources":["../../../../src/variables/components/VariableValueSelect.tsx"],"sourcesContent":["import { isArray } from 'lodash';\nimport React, { RefCallback, useEffect, useMemo, useState } from 'react';\n\nimport { Checkbox, InputActionMeta, MultiSelect, Select, getSelectStyles, useStyles2, useTheme2 } from '@grafana/ui';\n\nimport { SceneComponentProps } from '../../core/types';\nimport { MultiValueVariable } from '../variants/MultiValueVariable';\nimport { VariableValue, VariableValueSingle } from '../types';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { GrafanaTheme2, SelectableValue } from '@grafana/data';\nimport { css, cx } from '@emotion/css';\nimport { getOptionSearcher } from './getOptionSearcher';\n\nconst filterNoOp = () => true;\n\nexport function toSelectableValue<T>(value: T, label?: string): SelectableValue<T> {\n return {\n value,\n label: label ?? String(value),\n };\n}\n\nexport function VariableValueSelect({ model }: SceneComponentProps<MultiValueVariable>) {\n const { value, text, key, options, includeAll, isReadOnly } = model.useState();\n const [inputValue, setInputValue] = useState('');\n const [hasCustomValue, setHasCustomValue] = useState(false);\n const selectValue = toSelectableValue(value, String(text));\n\n const optionSearcher = useMemo(() => getOptionSearcher(options, includeAll), [options, includeAll]);\n\n const onInputChange = (value: string, { action }: InputActionMeta) => {\n if (action === 'input-change') {\n setInputValue(value);\n if (model.onSearchChange) {\n model.onSearchChange!(value);\n }\n return value;\n }\n\n return value;\n };\n\n const filteredOptions = optionSearcher(inputValue);\n\n const onOpenMenu = () => {\n if (hasCustomValue) {\n setInputValue(String(text));\n }\n };\n\n const onCloseMenu = () => {\n setInputValue('');\n };\n\n return (\n <Select<VariableValue>\n id={key}\n isValidNewOption={(inputValue) => inputValue.trim().length > 0}\n placeholder=\"Select value\"\n width=\"auto\"\n disabled={isReadOnly}\n value={selectValue}\n inputValue={inputValue}\n allowCustomValue\n virtualized\n filterOption={filterNoOp}\n tabSelectsValue={false}\n onInputChange={onInputChange}\n onOpenMenu={onOpenMenu}\n onCloseMenu={onCloseMenu}\n options={filteredOptions}\n data-testid={selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownValueLinkTexts(`${value}`)}\n onChange={(newValue) => {\n model.changeValueTo(newValue.value!, newValue.label!);\n\n if (hasCustomValue !== newValue.__isNew__) {\n setHasCustomValue(newValue.__isNew__);\n }\n }}\n />\n );\n}\n\nexport function VariableValueSelectMulti({ model }: SceneComponentProps<MultiValueVariable>) {\n const { value, options, key, maxVisibleValues, noValueOnClear, includeAll, isReadOnly } = model.useState();\n const arrayValue = useMemo(() => (isArray(value) ? value : [value]), [value]);\n // To not trigger queries on every selection we store this state locally here and only update the variable onBlur\n const [uncommittedValue, setUncommittedValue] = useState(arrayValue);\n const [inputValue, setInputValue] = useState('');\n\n const optionSearcher = useMemo(() => getOptionSearcher(options, includeAll), [options, includeAll]);\n\n // Detect value changes outside\n useEffect(() => {\n setUncommittedValue(arrayValue);\n }, [arrayValue]);\n\n const onInputChange = (value: string, { action }: InputActionMeta) => {\n if (action === 'input-change') {\n setInputValue(value);\n if (model.onSearchChange) {\n model.onSearchChange!(value);\n }\n return value;\n }\n\n if (action === 'input-blur') {\n setInputValue('');\n return '';\n }\n\n return inputValue;\n };\n\n const placeholder = options.length > 0 ? 'Select value' : '';\n const filteredOptions = optionSearcher(inputValue);\n\n return (\n <MultiSelect<VariableValueSingle>\n id={key}\n placeholder={placeholder}\n width=\"auto\"\n inputValue={inputValue}\n disabled={isReadOnly}\n value={uncommittedValue}\n noMultiValueWrap={true}\n maxVisibleValues={maxVisibleValues ?? 5}\n tabSelectsValue={false}\n virtualized\n allowCustomValue\n options={filteredOptions}\n closeMenuOnSelect={false}\n components={{ Option: OptionWithCheckbox }}\n isClearable={true}\n hideSelectedOptions={false}\n onInputChange={onInputChange}\n onBlur={() => {\n model.changeValueTo(uncommittedValue);\n }}\n filterOption={filterNoOp}\n data-testid={selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownValueLinkTexts(`${uncommittedValue}`)}\n onChange={(newValue, action) => {\n if (action.action === 'clear' && noValueOnClear) {\n model.changeValueTo([]);\n }\n setUncommittedValue(newValue.map((x) => x.value!));\n }}\n />\n );\n}\n\ninterface SelectMenuOptionProps<T> {\n isDisabled: boolean;\n isFocused: boolean;\n isSelected: boolean;\n innerProps: JSX.IntrinsicElements['div'];\n innerRef: RefCallback<HTMLDivElement>;\n renderOptionLabel?: (value: SelectableValue<T>) => JSX.Element;\n data: SelectableValue<T>;\n}\n\nexport const OptionWithCheckbox = ({\n children,\n data,\n innerProps,\n innerRef,\n isFocused,\n isSelected,\n renderOptionLabel,\n}: React.PropsWithChildren<SelectMenuOptionProps<unknown>>) => {\n // We are removing onMouseMove and onMouseOver from innerProps because they cause the whole\n // list to re-render everytime the user hovers over an option. This is a performance issue.\n // See https://github.com/JedWatson/react-select/issues/3128#issuecomment-451936743\n const { onMouseMove, onMouseOver, ...rest } = innerProps;\n const theme = useTheme2();\n const selectStyles = getSelectStyles(theme);\n const optionStyles = useStyles2(getOptionStyles);\n\n return (\n <div\n ref={innerRef}\n className={cx(selectStyles.option, isFocused && selectStyles.optionFocused)}\n {...rest}\n // TODO: use below selector once we update grafana dependencies to ^11.1.0\n // data-testid={selectors.components.Select.option}\n data-testid=\"data-testid Select option\"\n title={data.title}\n >\n <div className={optionStyles.checkbox}>\n <Checkbox value={isSelected} />\n </div>\n <div\n className={selectStyles.optionBody}\n data-testid={selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts(\n data.label ?? String(data.value)\n )}\n >\n <span>{children}</span>\n </div>\n </div>\n );\n};\n\nOptionWithCheckbox.displayName = 'SelectMenuOptions';\n\nconst getOptionStyles = (theme: GrafanaTheme2) => ({\n checkbox: css({\n marginRight: theme.spacing(2),\n }),\n});\n\nexport function renderSelectForVariable(model: MultiValueVariable) {\n if (model.state.isMulti) {\n return <VariableValueSelectMulti model={model} />;\n } else {\n return <VariableValueSelect model={model} />;\n }\n}\n"],"names":["value","inputValue"],"mappings":"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"}
1
+ {"version":3,"file":"VariableValueSelect.js","sources":["../../../../src/variables/components/VariableValueSelect.tsx"],"sourcesContent":["import { isArray } from 'lodash';\nimport React, { RefCallback, useEffect, useMemo, useState } from 'react';\n\nimport { Checkbox, InputActionMeta, MultiSelect, Select, getSelectStyles, useStyles2, useTheme2 } from '@grafana/ui';\n\nimport { SceneComponentProps } from '../../core/types';\nimport { MultiValueVariable } from '../variants/MultiValueVariable';\nimport { VariableValue, VariableValueSingle } from '../types';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { GrafanaTheme2, SelectableValue } from '@grafana/data';\nimport { css, cx } from '@emotion/css';\nimport { getOptionSearcher } from './getOptionSearcher';\nimport { sceneGraph } from '../../core/sceneGraph';\n\nconst filterNoOp = () => true;\n\nexport function toSelectableValue<T>(value: T, label?: string): SelectableValue<T> {\n return {\n value,\n label: label ?? String(value),\n };\n}\n\nexport function VariableValueSelect({ model }: SceneComponentProps<MultiValueVariable>) {\n const { value, text, key, options, includeAll, isReadOnly } = model.useState();\n const [inputValue, setInputValue] = useState('');\n const [hasCustomValue, setHasCustomValue] = useState(false);\n const selectValue = toSelectableValue(value, String(text));\n const queryController = sceneGraph.getQueryController(model);\n const optionSearcher = useMemo(() => getOptionSearcher(options, includeAll), [options, includeAll]);\n\n const onInputChange = (value: string, { action }: InputActionMeta) => {\n if (action === 'input-change') {\n setInputValue(value);\n if (model.onSearchChange) {\n model.onSearchChange!(value);\n }\n return value;\n }\n\n return value;\n };\n\n const filteredOptions = optionSearcher(inputValue);\n\n const onOpenMenu = () => {\n if (hasCustomValue) {\n setInputValue(String(text));\n }\n };\n\n const onCloseMenu = () => {\n setInputValue('');\n };\n\n return (\n <Select<VariableValue>\n id={key}\n isValidNewOption={(inputValue) => inputValue.trim().length > 0}\n placeholder=\"Select value\"\n width=\"auto\"\n disabled={isReadOnly}\n value={selectValue}\n inputValue={inputValue}\n allowCustomValue\n virtualized\n filterOption={filterNoOp}\n tabSelectsValue={false}\n onInputChange={onInputChange}\n onOpenMenu={onOpenMenu}\n onCloseMenu={onCloseMenu}\n options={filteredOptions}\n data-testid={selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownValueLinkTexts(`${value}`)}\n onChange={(newValue) => {\n model.changeValueTo(newValue.value!, newValue.label!);\n queryController?.startProfile(model);\n\n if (hasCustomValue !== newValue.__isNew__) {\n setHasCustomValue(newValue.__isNew__);\n }\n }}\n />\n );\n}\n\nexport function VariableValueSelectMulti({ model }: SceneComponentProps<MultiValueVariable>) {\n const { value, options, key, maxVisibleValues, noValueOnClear, includeAll, isReadOnly } = model.useState();\n const arrayValue = useMemo(() => (isArray(value) ? value : [value]), [value]);\n // To not trigger queries on every selection we store this state locally here and only update the variable onBlur\n const [uncommittedValue, setUncommittedValue] = useState(arrayValue);\n const [inputValue, setInputValue] = useState('');\n const queryController = sceneGraph.getQueryController(model);\n\n const optionSearcher = useMemo(() => getOptionSearcher(options, includeAll), [options, includeAll]);\n\n // Detect value changes outside\n useEffect(() => {\n setUncommittedValue(arrayValue);\n }, [arrayValue]);\n\n const onInputChange = (value: string, { action }: InputActionMeta) => {\n if (action === 'input-change') {\n setInputValue(value);\n if (model.onSearchChange) {\n model.onSearchChange!(value);\n }\n return value;\n }\n\n if (action === 'input-blur') {\n setInputValue('');\n return '';\n }\n\n return inputValue;\n };\n\n const placeholder = options.length > 0 ? 'Select value' : '';\n const filteredOptions = optionSearcher(inputValue);\n\n return (\n <MultiSelect<VariableValueSingle>\n id={key}\n placeholder={placeholder}\n width=\"auto\"\n inputValue={inputValue}\n disabled={isReadOnly}\n value={uncommittedValue}\n noMultiValueWrap={true}\n maxVisibleValues={maxVisibleValues ?? 5}\n tabSelectsValue={false}\n virtualized\n allowCustomValue\n options={filteredOptions}\n closeMenuOnSelect={false}\n components={{ Option: OptionWithCheckbox }}\n isClearable={true}\n hideSelectedOptions={false}\n onInputChange={onInputChange}\n onBlur={() => {\n model.changeValueTo(uncommittedValue);\n queryController?.startProfile(model);\n }}\n filterOption={filterNoOp}\n data-testid={selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownValueLinkTexts(`${uncommittedValue}`)}\n onChange={(newValue, action) => {\n if (action.action === 'clear' && noValueOnClear) {\n model.changeValueTo([]);\n }\n setUncommittedValue(newValue.map((x) => x.value!));\n }}\n />\n );\n}\n\ninterface SelectMenuOptionProps<T> {\n isDisabled: boolean;\n isFocused: boolean;\n isSelected: boolean;\n innerProps: JSX.IntrinsicElements['div'];\n innerRef: RefCallback<HTMLDivElement>;\n renderOptionLabel?: (value: SelectableValue<T>) => JSX.Element;\n data: SelectableValue<T>;\n}\n\nexport const OptionWithCheckbox = ({\n children,\n data,\n innerProps,\n innerRef,\n isFocused,\n isSelected,\n renderOptionLabel,\n}: React.PropsWithChildren<SelectMenuOptionProps<unknown>>) => {\n // We are removing onMouseMove and onMouseOver from innerProps because they cause the whole\n // list to re-render everytime the user hovers over an option. This is a performance issue.\n // See https://github.com/JedWatson/react-select/issues/3128#issuecomment-451936743\n const { onMouseMove, onMouseOver, ...rest } = innerProps;\n const theme = useTheme2();\n const selectStyles = getSelectStyles(theme);\n const optionStyles = useStyles2(getOptionStyles);\n\n return (\n <div\n ref={innerRef}\n className={cx(selectStyles.option, isFocused && selectStyles.optionFocused)}\n {...rest}\n // TODO: use below selector once we update grafana dependencies to ^11.1.0\n // data-testid={selectors.components.Select.option}\n data-testid=\"data-testid Select option\"\n title={data.title}\n >\n <div className={optionStyles.checkbox}>\n <Checkbox value={isSelected} />\n </div>\n <div\n className={selectStyles.optionBody}\n data-testid={selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts(\n data.label ?? String(data.value)\n )}\n >\n <span>{children}</span>\n </div>\n </div>\n );\n};\n\nOptionWithCheckbox.displayName = 'SelectMenuOptions';\n\nconst getOptionStyles = (theme: GrafanaTheme2) => ({\n checkbox: css({\n marginRight: theme.spacing(2),\n }),\n});\n\nexport function renderSelectForVariable(model: MultiValueVariable) {\n if (model.state.isMulti) {\n return <VariableValueSelectMulti model={model} />;\n } else {\n return <VariableValueSelect model={model} />;\n }\n}\n"],"names":["value","inputValue"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"MultiValueVariable.js","sources":["../../../../src/variables/variants/MultiValueVariable.ts"],"sourcesContent":["import { isArray, isEqual } from 'lodash';\nimport { map, Observable } from 'rxjs';\n\nimport { ALL_VARIABLE_TEXT, ALL_VARIABLE_VALUE } from '../constants';\n\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { SceneObjectUrlSyncHandler, SceneObjectUrlValues } from '../../core/types';\nimport {\n SceneVariable,\n SceneVariableValueChangedEvent,\n SceneVariableState,\n ValidateAndUpdateResult,\n VariableValue,\n VariableValueOption,\n VariableValueSingle,\n CustomVariableValue,\n VariableCustomFormatterFn,\n} from '../types';\nimport { formatRegistry } from '../interpolation/formatRegistry';\nimport { VariableFormatID } from '@grafana/schema';\nimport { SceneVariableSet } from '../sets/SceneVariableSet';\nimport { setBaseClassState } from '../../utils/utils';\n\nexport interface MultiValueVariableState extends SceneVariableState {\n value: VariableValue; // old current.text\n text: VariableValue; // old current.value\n options: VariableValueOption[];\n isMulti?: boolean;\n includeAll?: boolean;\n defaultToAll?: boolean;\n allValue?: string;\n placeholder?: string;\n /**\n * For multi value variables, this option controls how many values to show before they are collapsed into +N.\n * Defaults to 5\n */\n maxVisibleValues?: number;\n noValueOnClear?: boolean;\n isReadOnly?: boolean;\n}\n\nexport interface VariableGetOptionsArgs {\n searchFilter?: string;\n}\n\nexport abstract class MultiValueVariable<TState extends MultiValueVariableState = MultiValueVariableState>\n extends SceneObjectBase<TState>\n implements SceneVariable<TState>\n{\n protected _urlSync: SceneObjectUrlSyncHandler = new MultiValueUrlSyncHandler(this);\n\n /**\n * Set to true to skip next value validation to maintain the current value even it it's not among the options (ie valid values)\n */\n public skipNextValidation?: boolean;\n\n /**\n * The source of value options.\n */\n public abstract getValueOptions(args: VariableGetOptionsArgs): Observable<VariableValueOption[]>;\n\n /**\n * This function is called on when SceneVariableSet is activated or when a dependency changes.\n */\n public validateAndUpdate(): Observable<ValidateAndUpdateResult> {\n return this.getValueOptions({}).pipe(\n map((options) => {\n this.updateValueGivenNewOptions(options);\n return {};\n })\n );\n }\n\n public onCancel(): void {\n this.setStateHelper({ loading: false });\n const sceneVarSet = this.parent as SceneVariableSet;\n sceneVarSet?.cancel(this);\n }\n\n /**\n * Check if current value is valid given new options. If not update the value.\n */\n private updateValueGivenNewOptions(options: VariableValueOption[]) {\n // Remember current value and text\n const { value: currentValue, text: currentText } = this.state;\n\n const stateUpdate = this.getStateUpdateGivenNewOptions(options, currentValue, currentText);\n\n this.interceptStateUpdateAfterValidation(stateUpdate);\n\n // Perform state change\n this.setStateHelper(stateUpdate);\n\n // Publish value changed event only if value changed\n if (stateUpdate.value !== currentValue || stateUpdate.text !== currentText || this.hasAllValue()) {\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n }\n }\n\n private getStateUpdateGivenNewOptions(\n options: VariableValueOption[],\n currentValue: VariableValue,\n currentText: VariableValue\n ): Partial<MultiValueVariableState> {\n const stateUpdate: Partial<MultiValueVariableState> = {\n options,\n loading: false,\n value: currentValue,\n text: currentText,\n };\n\n if (options.length === 0) {\n if (this.state.defaultToAll || this.state.includeAll) {\n stateUpdate.value = ALL_VARIABLE_VALUE;\n stateUpdate.text = ALL_VARIABLE_TEXT;\n } else if (this.state.isMulti) {\n stateUpdate.value = [];\n stateUpdate.text = [];\n } else {\n stateUpdate.value = '';\n stateUpdate.text = '';\n }\n\n return stateUpdate;\n }\n\n if (this.hasAllValue()) {\n if (!this.state.includeAll) {\n stateUpdate.value = options[0].value;\n stateUpdate.text = options[0].label;\n // If multi switch to arrays\n if (this.state.isMulti) {\n stateUpdate.value = [stateUpdate.value];\n stateUpdate.text = [stateUpdate.text];\n }\n }\n return stateUpdate;\n }\n\n if (this.state.isMulti) {\n // If we are a multi valued variable validate the current values are among the options\n const currentValues = Array.isArray(currentValue) ? currentValue : [currentValue];\n const validValues = currentValues.filter((v) => options.find((o) => o.value === v));\n const validTexts = validValues.map((v) => options.find((o) => o.value === v)!.label);\n\n // If no valid values pick the first option\n if (validValues.length === 0) {\n const defaultState = this.getDefaultMultiState(options);\n stateUpdate.value = defaultState.value;\n stateUpdate.text = defaultState.text;\n } else {\n // We have valid values, if it's different from current valid values update current values\n if (!isEqual(validValues, currentValue)) {\n stateUpdate.value = validValues;\n }\n if (!isEqual(validTexts, currentText)) {\n stateUpdate.text = validTexts;\n }\n }\n return stateUpdate;\n }\n\n // Single value variable validation\n\n // Try find by value then text\n let matchingOption = findOptionMatchingCurrent(currentValue, currentText, options);\n if (matchingOption) {\n // When updating the initial state from URL the text property is set the same as value\n // Here we can correct the text value state\n stateUpdate.text = matchingOption.label;\n stateUpdate.value = matchingOption.value;\n } else {\n // Current value is found in options\n if (this.state.defaultToAll) {\n stateUpdate.value = ALL_VARIABLE_VALUE;\n stateUpdate.text = ALL_VARIABLE_TEXT;\n } else {\n // Current value is not valid. Set to first of the available options\n stateUpdate.value = options[0].value;\n stateUpdate.text = options[0].label;\n }\n }\n\n return stateUpdate;\n }\n\n /**\n * Values set by initial URL sync needs to survive the next validation and update.\n * This function can intercept and make sure those values are preserved.\n */\n protected interceptStateUpdateAfterValidation(stateUpdate: Partial<MultiValueVariableState>): void {\n // If the validation wants to fix the all value (All ==> $__all) then we should let that pass\n const isAllValueFix = stateUpdate.value === ALL_VARIABLE_VALUE && this.state.text === ALL_VARIABLE_TEXT;\n\n if (this.skipNextValidation && stateUpdate.value !== this.state.value && stateUpdate.text !== this.state.text && !isAllValueFix) {\n stateUpdate.value = this.state.value;\n stateUpdate.text = this.state.text;\n }\n\n this.skipNextValidation = false;\n }\n\n public getValue(): VariableValue {\n if (this.hasAllValue()) {\n if (this.state.allValue) {\n return new CustomAllValue(this.state.allValue, this);\n }\n\n return this.state.options.map((x) => x.value);\n }\n\n return this.state.value;\n }\n\n public getValueText(): string {\n if (this.hasAllValue()) {\n return ALL_VARIABLE_TEXT;\n }\n\n if (Array.isArray(this.state.text)) {\n return this.state.text.join(' + ');\n }\n\n return String(this.state.text);\n }\n\n public hasAllValue() {\n const value = this.state.value;\n return value === ALL_VARIABLE_VALUE || (Array.isArray(value) && value[0] === ALL_VARIABLE_VALUE);\n }\n\n public getDefaultMultiState(options: VariableValueOption[]) {\n if (this.state.defaultToAll) {\n return { value: [ALL_VARIABLE_VALUE], text: [ALL_VARIABLE_TEXT] };\n } else if (options.length > 0) {\n return { value: [options[0].value], text: [options[0].label] };\n } else {\n return { value: [], text: [] };\n }\n }\n\n /**\n * Change the value and publish SceneVariableValueChangedEvent event.\n */\n public changeValueTo(value: VariableValue, text?: VariableValue) {\n // Ignore if there is no change\n if (value === this.state.value && text === this.state.text) {\n return;\n }\n\n if (!text) {\n if (Array.isArray(value)) {\n text = value.map((v) => this.findLabelTextForValue(v));\n } else {\n text = this.findLabelTextForValue(value);\n }\n }\n\n if (Array.isArray(value)) {\n // If we are a multi valued variable is cleared (empty array) we need to set the default empty state\n if (value.length === 0) {\n const state = this.getDefaultMultiState(this.state.options);\n value = state.value;\n text = state.text;\n }\n\n // If last value is the All value then replace all with it\n if (value[value.length - 1] === ALL_VARIABLE_VALUE) {\n value = [ALL_VARIABLE_VALUE];\n text = [ALL_VARIABLE_TEXT];\n }\n // If the first value is the ALL value and we have other values, then remove the All value\n else if (value[0] === ALL_VARIABLE_VALUE && value.length > 1) {\n value.shift();\n if (Array.isArray(text)) {\n text.shift();\n }\n }\n }\n\n // Do nothing if value and text are the same\n if (isEqual(value, this.state.value) && isEqual(text, this.state.text)) {\n return;\n }\n\n this.setStateHelper({ value, text, loading: false });\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n }\n\n private findLabelTextForValue(value: VariableValueSingle): VariableValueSingle {\n if (value === ALL_VARIABLE_VALUE) {\n return ALL_VARIABLE_TEXT;\n }\n\n const option = this.state.options.find((x) => x.value === value);\n if (option) {\n return option.label;\n }\n\n const optionByLabel = this.state.options.find((x) => x.label === value);\n if (optionByLabel) {\n return optionByLabel.label;\n }\n\n return value;\n }\n\n /**\n * This helper function is to counter the contravariance of setState\n */\n private setStateHelper(state: Partial<MultiValueVariableState>) {\n setBaseClassState<MultiValueVariableState>(this, state);\n }\n\n public getOptionsForSelect(): VariableValueOption[] {\n let options = this.state.options;\n\n if (this.state.includeAll) {\n options = [{ value: ALL_VARIABLE_VALUE, label: ALL_VARIABLE_TEXT }, ...options];\n }\n\n if (!Array.isArray(this.state.value)) {\n const current = options.find((x) => x.value === this.state.value);\n if (!current) {\n options = [{ value: this.state.value, label: String(this.state.text) }, ...options];\n }\n }\n\n return options;\n }\n\n public refreshOptions() {\n this.getValueOptions({}).subscribe((options) => {\n this.updateValueGivenNewOptions(options);\n });\n }\n\n /**\n * Can be used by subclasses to do custom handling of option search based on search input\n */\n public onSearchChange?(searchFilter: string): void;\n}\n\n/**\n * Looks for matching option, first by value but as a fallback by text (label).\n */\nfunction findOptionMatchingCurrent(\n currentValue: VariableValue,\n currentText: VariableValue,\n options: VariableValueOption[]\n) {\n let textMatch: VariableValueOption | undefined;\n\n for (const item of options) {\n if (item.value === currentValue) {\n return item;\n }\n\n // No early return here as want to continue to look a value match\n if (item.label === currentText) {\n textMatch = item;\n }\n }\n\n return textMatch;\n}\n\nexport class MultiValueUrlSyncHandler<TState extends MultiValueVariableState = MultiValueVariableState>\n implements SceneObjectUrlSyncHandler\n{\n public constructor(private _sceneObject: MultiValueVariable<TState>) {}\n\n private getKey(): string {\n return `var-${this._sceneObject.state.name}`;\n }\n\n public getKeys(): string[] {\n if (this._sceneObject.state.skipUrlSync) {\n return [];\n }\n\n return [this.getKey()];\n }\n\n public getUrlState(): SceneObjectUrlValues {\n if (this._sceneObject.state.skipUrlSync) {\n return {};\n }\n\n let urlValue: string | string[] | null = null;\n let value = this._sceneObject.state.value;\n\n if (Array.isArray(value)) {\n urlValue = value.map(String);\n } else if ((this, this._sceneObject.state.isMulti)) {\n // If we are inMulti mode we must return an array here as otherwise UrlSyncManager will not pass all values (in an array) in updateFromUrl\n urlValue = [String(value)];\n } else {\n urlValue = String(value);\n }\n\n return { [this.getKey()]: urlValue };\n }\n\n public updateFromUrl(values: SceneObjectUrlValues): void {\n let urlValue = values[this.getKey()];\n\n if (urlValue != null) {\n // This is to be backwards compatible with old url all value\n if (this._sceneObject.state.includeAll) {\n urlValue = handleLegacyUrlAllValue(urlValue);\n }\n\n // For edge cases where data links include variables with custom all value.\n // We want the variable to maintain the \"All\" meta value not the actual custom vall value. (Fixes https://github.com/grafana/grafana/issues/28635)\n if (this._sceneObject.state.allValue && this._sceneObject.state.allValue === urlValue) {\n urlValue = ALL_VARIABLE_VALUE;\n }\n\n /**\n * Initial URL Sync happens before scene objects are activated.\n * We need to skip validation in this case to make sure values set via URL are maintained.\n */\n if (!this._sceneObject.isActive) {\n this._sceneObject.skipNextValidation = true;\n }\n\n this._sceneObject.changeValueTo(urlValue);\n }\n }\n}\n\nfunction handleLegacyUrlAllValue(value: string | string[]) {\n if (isArray(value) && value[0] === ALL_VARIABLE_TEXT) {\n return [ALL_VARIABLE_VALUE];\n } else if (value === ALL_VARIABLE_TEXT) {\n return ALL_VARIABLE_VALUE;\n }\n\n return value;\n}\n\n/**\n * Variable getValue can return this to skip any subsequent formatting.\n * This is useful for custom all values that should not be escaped/formatted.\n */\nexport class CustomAllValue implements CustomVariableValue {\n public constructor(private _value: string, private _variable: SceneVariable) {}\n\n public formatter(formatNameOrFn?: string | VariableCustomFormatterFn): string {\n if (formatNameOrFn === VariableFormatID.Text) {\n return ALL_VARIABLE_TEXT;\n }\n\n if (formatNameOrFn === VariableFormatID.PercentEncode) {\n return formatRegistry.get(VariableFormatID.PercentEncode).formatter(this._value, [], this._variable);\n }\n\n if (formatNameOrFn === VariableFormatID.QueryParam) {\n return formatRegistry.get(VariableFormatID.QueryParam).formatter(ALL_VARIABLE_TEXT, [], this._variable);\n }\n\n return this._value;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MultiValueVariable.js","sources":["../../../../src/variables/variants/MultiValueVariable.ts"],"sourcesContent":["import { isArray, isEqual } from 'lodash';\nimport { map, Observable } from 'rxjs';\n\nimport { ALL_VARIABLE_TEXT, ALL_VARIABLE_VALUE } from '../constants';\n\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { SceneObjectUrlSyncHandler, SceneObjectUrlValues } from '../../core/types';\nimport {\n SceneVariable,\n SceneVariableValueChangedEvent,\n SceneVariableState,\n ValidateAndUpdateResult,\n VariableValue,\n VariableValueOption,\n VariableValueSingle,\n CustomVariableValue,\n VariableCustomFormatterFn,\n} from '../types';\nimport { formatRegistry } from '../interpolation/formatRegistry';\nimport { VariableFormatID } from '@grafana/schema';\nimport { SceneVariableSet } from '../sets/SceneVariableSet';\nimport { setBaseClassState } from '../../utils/utils';\n\nexport interface MultiValueVariableState extends SceneVariableState {\n value: VariableValue; // old current.text\n text: VariableValue; // old current.value\n options: VariableValueOption[];\n isMulti?: boolean;\n includeAll?: boolean;\n defaultToAll?: boolean;\n allValue?: string;\n placeholder?: string;\n /**\n * For multi value variables, this option controls how many values to show before they are collapsed into +N.\n * Defaults to 5\n */\n maxVisibleValues?: number;\n noValueOnClear?: boolean;\n isReadOnly?: boolean;\n}\n\nexport interface VariableGetOptionsArgs {\n searchFilter?: string;\n}\n\nexport abstract class MultiValueVariable<TState extends MultiValueVariableState = MultiValueVariableState>\n extends SceneObjectBase<TState>\n implements SceneVariable<TState>\n{\n protected _urlSync: SceneObjectUrlSyncHandler = new MultiValueUrlSyncHandler(this);\n\n /**\n * Set to true to skip next value validation to maintain the current value even it it's not among the options (ie valid values)\n */\n public skipNextValidation?: boolean;\n\n /**\n * The source of value options.\n */\n public abstract getValueOptions(args: VariableGetOptionsArgs): Observable<VariableValueOption[]>;\n\n /**\n * This function is called on when SceneVariableSet is activated or when a dependency changes.\n */\n public validateAndUpdate(): Observable<ValidateAndUpdateResult> {\n return this.getValueOptions({}).pipe(\n map((options) => {\n this.updateValueGivenNewOptions(options);\n return {};\n })\n );\n }\n\n public onCancel(): void {\n this.setStateHelper({ loading: false });\n const sceneVarSet = this.parent as SceneVariableSet;\n sceneVarSet?.cancel(this);\n }\n\n /**\n * Check if current value is valid given new options. If not update the value.\n */\n private updateValueGivenNewOptions(options: VariableValueOption[]) {\n // Remember current value and text\n const { value: currentValue, text: currentText } = this.state;\n\n const stateUpdate = this.getStateUpdateGivenNewOptions(options, currentValue, currentText);\n\n this.interceptStateUpdateAfterValidation(stateUpdate);\n\n // Perform state change\n this.setStateHelper(stateUpdate);\n\n // Publish value changed event only if value changed\n if (stateUpdate.value !== currentValue || stateUpdate.text !== currentText || this.hasAllValue()) {\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n }\n }\n\n private getStateUpdateGivenNewOptions(\n options: VariableValueOption[],\n currentValue: VariableValue,\n currentText: VariableValue\n ): Partial<MultiValueVariableState> {\n const stateUpdate: Partial<MultiValueVariableState> = {\n options,\n loading: false,\n value: currentValue,\n text: currentText,\n };\n\n if (options.length === 0) {\n if (this.state.defaultToAll || this.state.includeAll) {\n stateUpdate.value = ALL_VARIABLE_VALUE;\n stateUpdate.text = ALL_VARIABLE_TEXT;\n } else if (this.state.isMulti) {\n stateUpdate.value = [];\n stateUpdate.text = [];\n } else {\n stateUpdate.value = '';\n stateUpdate.text = '';\n }\n\n return stateUpdate;\n }\n\n if (this.hasAllValue()) {\n if (!this.state.includeAll) {\n stateUpdate.value = options[0].value;\n stateUpdate.text = options[0].label;\n // If multi switch to arrays\n if (this.state.isMulti) {\n stateUpdate.value = [stateUpdate.value];\n stateUpdate.text = [stateUpdate.text];\n }\n }\n return stateUpdate;\n }\n\n if (this.state.isMulti) {\n // If we are a multi valued variable validate the current values are among the options\n const currentValues = Array.isArray(currentValue) ? currentValue : [currentValue];\n const validValues = currentValues.filter((v) => options.find((o) => o.value === v));\n const validTexts = validValues.map((v) => options.find((o) => o.value === v)!.label);\n\n // If no valid values pick the first option\n if (validValues.length === 0) {\n const defaultState = this.getDefaultMultiState(options);\n stateUpdate.value = defaultState.value;\n stateUpdate.text = defaultState.text;\n } else {\n // We have valid values, if it's different from current valid values update current values\n if (!isEqual(validValues, currentValue)) {\n stateUpdate.value = validValues;\n }\n if (!isEqual(validTexts, currentText)) {\n stateUpdate.text = validTexts;\n }\n }\n return stateUpdate;\n }\n\n // Single value variable validation\n\n // Try find by value then text\n let matchingOption = findOptionMatchingCurrent(currentValue, currentText, options);\n if (matchingOption) {\n // When updating the initial state from URL the text property is set the same as value\n // Here we can correct the text value state\n stateUpdate.text = matchingOption.label;\n stateUpdate.value = matchingOption.value;\n } else {\n // Current value is found in options\n if (this.state.defaultToAll) {\n stateUpdate.value = ALL_VARIABLE_VALUE;\n stateUpdate.text = ALL_VARIABLE_TEXT;\n } else {\n // Current value is not valid. Set to first of the available options\n stateUpdate.value = options[0].value;\n stateUpdate.text = options[0].label;\n }\n }\n\n return stateUpdate;\n }\n\n /**\n * Values set by initial URL sync needs to survive the next validation and update.\n * This function can intercept and make sure those values are preserved.\n */\n protected interceptStateUpdateAfterValidation(stateUpdate: Partial<MultiValueVariableState>): void {\n // If the validation wants to fix the all value (All ==> $__all) then we should let that pass\n const isAllValueFix = stateUpdate.value === ALL_VARIABLE_VALUE && this.state.text === ALL_VARIABLE_TEXT;\n\n if (\n this.skipNextValidation &&\n stateUpdate.value !== this.state.value &&\n stateUpdate.text !== this.state.text &&\n !isAllValueFix\n ) {\n stateUpdate.value = this.state.value;\n stateUpdate.text = this.state.text;\n }\n\n this.skipNextValidation = false;\n }\n\n public getValue(): VariableValue {\n if (this.hasAllValue()) {\n if (this.state.allValue) {\n return new CustomAllValue(this.state.allValue, this);\n }\n\n return this.state.options.map((x) => x.value);\n }\n\n return this.state.value;\n }\n\n public getValueText(): string {\n if (this.hasAllValue()) {\n return ALL_VARIABLE_TEXT;\n }\n\n if (Array.isArray(this.state.text)) {\n return this.state.text.join(' + ');\n }\n\n return String(this.state.text);\n }\n\n public hasAllValue() {\n const value = this.state.value;\n return value === ALL_VARIABLE_VALUE || (Array.isArray(value) && value[0] === ALL_VARIABLE_VALUE);\n }\n\n public getDefaultMultiState(options: VariableValueOption[]) {\n if (this.state.defaultToAll) {\n return { value: [ALL_VARIABLE_VALUE], text: [ALL_VARIABLE_TEXT] };\n } else if (options.length > 0) {\n return { value: [options[0].value], text: [options[0].label] };\n } else {\n return { value: [], text: [] };\n }\n }\n\n /**\n * Change the value and publish SceneVariableValueChangedEvent event.\n */\n public changeValueTo(value: VariableValue, text?: VariableValue) {\n // Ignore if there is no change\n if (value === this.state.value && text === this.state.text) {\n return;\n }\n\n if (!text) {\n if (Array.isArray(value)) {\n text = value.map((v) => this.findLabelTextForValue(v));\n } else {\n text = this.findLabelTextForValue(value);\n }\n }\n\n if (Array.isArray(value)) {\n // If we are a multi valued variable is cleared (empty array) we need to set the default empty state\n if (value.length === 0) {\n const state = this.getDefaultMultiState(this.state.options);\n value = state.value;\n text = state.text;\n }\n\n // If last value is the All value then replace all with it\n if (value[value.length - 1] === ALL_VARIABLE_VALUE) {\n value = [ALL_VARIABLE_VALUE];\n text = [ALL_VARIABLE_TEXT];\n }\n // If the first value is the ALL value and we have other values, then remove the All value\n else if (value[0] === ALL_VARIABLE_VALUE && value.length > 1) {\n value.shift();\n if (Array.isArray(text)) {\n text.shift();\n }\n }\n }\n\n // Do nothing if value and text are the same\n if (isEqual(value, this.state.value) && isEqual(text, this.state.text)) {\n return;\n }\n\n this.setStateHelper({ value, text, loading: false });\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n }\n\n private findLabelTextForValue(value: VariableValueSingle): VariableValueSingle {\n if (value === ALL_VARIABLE_VALUE) {\n return ALL_VARIABLE_TEXT;\n }\n\n const option = this.state.options.find((x) => x.value === value);\n if (option) {\n return option.label;\n }\n\n const optionByLabel = this.state.options.find((x) => x.label === value);\n if (optionByLabel) {\n return optionByLabel.label;\n }\n\n return value;\n }\n\n /**\n * This helper function is to counter the contravariance of setState\n */\n private setStateHelper(state: Partial<MultiValueVariableState>) {\n setBaseClassState<MultiValueVariableState>(this, state);\n }\n\n public getOptionsForSelect(): VariableValueOption[] {\n let options = this.state.options;\n\n if (this.state.includeAll) {\n options = [{ value: ALL_VARIABLE_VALUE, label: ALL_VARIABLE_TEXT }, ...options];\n }\n\n if (!Array.isArray(this.state.value)) {\n const current = options.find((x) => x.value === this.state.value);\n if (!current) {\n options = [{ value: this.state.value, label: String(this.state.text) }, ...options];\n }\n }\n\n return options;\n }\n\n public refreshOptions() {\n this.getValueOptions({}).subscribe((options) => {\n this.updateValueGivenNewOptions(options);\n });\n }\n\n /**\n * Can be used by subclasses to do custom handling of option search based on search input\n */\n public onSearchChange?(searchFilter: string): void;\n}\n\n/**\n * Looks for matching option, first by value but as a fallback by text (label).\n */\nfunction findOptionMatchingCurrent(\n currentValue: VariableValue,\n currentText: VariableValue,\n options: VariableValueOption[]\n) {\n let textMatch: VariableValueOption | undefined;\n\n for (const item of options) {\n if (item.value === currentValue) {\n return item;\n }\n\n // No early return here as want to continue to look a value match\n if (item.label === currentText) {\n textMatch = item;\n }\n }\n\n return textMatch;\n}\n\nexport class MultiValueUrlSyncHandler<TState extends MultiValueVariableState = MultiValueVariableState>\n implements SceneObjectUrlSyncHandler\n{\n public constructor(private _sceneObject: MultiValueVariable<TState>) {}\n\n private getKey(): string {\n return `var-${this._sceneObject.state.name}`;\n }\n\n public getKeys(): string[] {\n if (this._sceneObject.state.skipUrlSync) {\n return [];\n }\n\n return [this.getKey()];\n }\n\n public getUrlState(): SceneObjectUrlValues {\n if (this._sceneObject.state.skipUrlSync) {\n return {};\n }\n\n let urlValue: string | string[] | null = null;\n let value = this._sceneObject.state.value;\n\n if (Array.isArray(value)) {\n urlValue = value.map(String);\n } else if ((this, this._sceneObject.state.isMulti)) {\n // If we are inMulti mode we must return an array here as otherwise UrlSyncManager will not pass all values (in an array) in updateFromUrl\n urlValue = [String(value)];\n } else {\n urlValue = String(value);\n }\n\n return { [this.getKey()]: urlValue };\n }\n\n public updateFromUrl(values: SceneObjectUrlValues): void {\n let urlValue = values[this.getKey()];\n\n if (urlValue != null) {\n // This is to be backwards compatible with old url all value\n if (this._sceneObject.state.includeAll) {\n urlValue = handleLegacyUrlAllValue(urlValue);\n }\n\n // For edge cases where data links include variables with custom all value.\n // We want the variable to maintain the \"All\" meta value not the actual custom vall value. (Fixes https://github.com/grafana/grafana/issues/28635)\n if (this._sceneObject.state.allValue && this._sceneObject.state.allValue === urlValue) {\n urlValue = ALL_VARIABLE_VALUE;\n }\n\n /**\n * Initial URL Sync happens before scene objects are activated.\n * We need to skip validation in this case to make sure values set via URL are maintained.\n */\n if (!this._sceneObject.isActive) {\n this._sceneObject.skipNextValidation = true;\n }\n\n this._sceneObject.changeValueTo(urlValue);\n }\n }\n}\n\nfunction handleLegacyUrlAllValue(value: string | string[]) {\n if (isArray(value) && value[0] === ALL_VARIABLE_TEXT) {\n return [ALL_VARIABLE_VALUE];\n } else if (value === ALL_VARIABLE_TEXT) {\n return ALL_VARIABLE_VALUE;\n }\n\n return value;\n}\n\n/**\n * Variable getValue can return this to skip any subsequent formatting.\n * This is useful for custom all values that should not be escaped/formatted.\n */\nexport class CustomAllValue implements CustomVariableValue {\n public constructor(private _value: string, private _variable: SceneVariable) {}\n\n public formatter(formatNameOrFn?: string | VariableCustomFormatterFn): string {\n if (formatNameOrFn === VariableFormatID.Text) {\n return ALL_VARIABLE_TEXT;\n }\n\n if (formatNameOrFn === VariableFormatID.PercentEncode) {\n return formatRegistry.get(VariableFormatID.PercentEncode).formatter(this._value, [], this._variable);\n }\n\n if (formatNameOrFn === VariableFormatID.QueryParam) {\n return formatRegistry.get(VariableFormatID.QueryParam).formatter(ALL_VARIABLE_TEXT, [], this._variable);\n }\n\n return this._value;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TestVariable.js","sources":["../../../../src/variables/variants/TestVariable.tsx"],"sourcesContent":["import { Observable, Subject } from 'rxjs';\n\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { SceneComponentProps } from '../../core/types';\nimport { queryMetricTree } from '../../utils/metricTree';\nimport { VariableDependencyConfig } from '../VariableDependencyConfig';\nimport { renderSelectForVariable } from '../components/VariableValueSelect';\nimport { VariableValueOption } from '../types';\n\nimport { MultiValueVariable, MultiValueVariableState, VariableGetOptionsArgs } from './MultiValueVariable';\nimport { VariableRefresh } from '@grafana/data';\nimport { getClosest } from '../../core/sceneGraph/utils';\nimport { SceneVariableSet } from '../sets/SceneVariableSet';\nimport { SceneQueryControllerEntry } from '../../behaviors/SceneQueryController';\n\nexport interface TestVariableState extends MultiValueVariableState {\n query: string;\n delayMs?: number;\n issuedQuery?: string;\n refresh?: VariableRefresh;\n throwError?: string;\n optionsToReturn?: VariableValueOption[];\n}\n\n/**\n * This variable is only designed for unit tests and potentially e2e tests.\n */\nexport class TestVariable extends MultiValueVariable<TestVariableState> {\n private completeUpdate = new Subject<number>();\n public isGettingValues = true;\n public getValueOptionsCount = 0;\n isLazy = false;\n\n protected _variableDependency = new VariableDependencyConfig(this, {\n statePaths: ['query'],\n });\n\n public constructor(initialState: Partial<TestVariableState>, isLazy = false) {\n super({\n type: 'custom',\n name: 'Test',\n value: 'Value',\n text: 'Text',\n query: 'Query',\n options: [],\n refresh: VariableRefresh.onDashboardLoad,\n ...initialState,\n });\n this.isLazy = isLazy;\n }\n\n public getValueOptions(args: VariableGetOptionsArgs): Observable<VariableValueOption[]> {\n const { delayMs } = this.state;\n\n this.getValueOptionsCount += 1;\n\n const queryController = sceneGraph.getQueryController(this);\n\n return new Observable<VariableValueOption[]>((observer) => {\n const queryEntry: SceneQueryControllerEntry = {\n type: 'variable',\n origin: this,\n cancel: () => observer.complete(),\n };\n\n if (queryController) {\n queryController.queryStarted(queryEntry);\n }\n\n this.setState({ loading: true });\n\n if (this.state.throwError) {\n throw new Error(this.state.throwError);\n }\n\n const interpolatedQuery = sceneGraph.interpolate(this, this.state.query);\n const options = this.getOptions(interpolatedQuery);\n\n const sub = this.completeUpdate.subscribe({\n next: () => {\n this.setState({ issuedQuery: interpolatedQuery, options, loading: false });\n observer.next(options);\n observer.complete();\n },\n });\n\n let timeout: number | undefined;\n if (delayMs) {\n timeout = window.setTimeout(() => this.signalUpdateCompleted(), delayMs);\n } else if (delayMs === 0) {\n this.signalUpdateCompleted();\n }\n\n this.isGettingValues = true;\n\n return () => {\n sub.unsubscribe();\n window.clearTimeout(timeout);\n this.isGettingValues = false;\n\n if (this.state.loading) {\n this.setState({ loading: false });\n }\n\n if (queryController) {\n queryController.queryCompleted(queryEntry);\n }\n };\n });\n }\n\n public cancel() {\n const sceneVarSet = getClosest(this, (s) => (s instanceof SceneVariableSet ? s : undefined));\n sceneVarSet?.cancel(this);\n }\n\n private getOptions(interpolatedQuery: string) {\n if (this.state.optionsToReturn) {\n return this.state.optionsToReturn;\n }\n\n return queryMetricTree(interpolatedQuery).map((x) => ({ label: x.name, value: x.name }));\n }\n\n /** Useful from tests */\n public signalUpdateCompleted() {\n this.completeUpdate.next(1);\n }\n\n public static Component = ({ model }: SceneComponentProps<MultiValueVariable>) => {\n return renderSelectForVariable(model);\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TestVariable.js","sources":["../../../../src/variables/variants/TestVariable.tsx"],"sourcesContent":["import { Observable, Subject } from 'rxjs';\n\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { SceneComponentProps } from '../../core/types';\nimport { queryMetricTree } from '../../utils/metricTree';\nimport { VariableDependencyConfig } from '../VariableDependencyConfig';\nimport { renderSelectForVariable } from '../components/VariableValueSelect';\nimport { VariableValueOption } from '../types';\n\nimport { MultiValueVariable, MultiValueVariableState, VariableGetOptionsArgs } from './MultiValueVariable';\nimport { VariableRefresh } from '@grafana/data';\nimport { getClosest } from '../../core/sceneGraph/utils';\nimport { SceneVariableSet } from '../sets/SceneVariableSet';\nimport { SceneQueryControllerEntry } from '../../behaviors/types';\n\nexport interface TestVariableState extends MultiValueVariableState {\n query: string;\n delayMs?: number;\n issuedQuery?: string;\n refresh?: VariableRefresh;\n throwError?: string;\n optionsToReturn?: VariableValueOption[];\n}\n\n/**\n * This variable is only designed for unit tests and potentially e2e tests.\n */\nexport class TestVariable extends MultiValueVariable<TestVariableState> {\n private completeUpdate = new Subject<number>();\n public isGettingValues = true;\n public getValueOptionsCount = 0;\n isLazy = false;\n\n protected _variableDependency = new VariableDependencyConfig(this, {\n statePaths: ['query'],\n });\n\n public constructor(initialState: Partial<TestVariableState>, isLazy = false) {\n super({\n type: 'custom',\n name: 'Test',\n value: 'Value',\n text: 'Text',\n query: 'Query',\n options: [],\n refresh: VariableRefresh.onDashboardLoad,\n ...initialState,\n });\n this.isLazy = isLazy;\n }\n\n public getValueOptions(args: VariableGetOptionsArgs): Observable<VariableValueOption[]> {\n const { delayMs } = this.state;\n\n this.getValueOptionsCount += 1;\n\n const queryController = sceneGraph.getQueryController(this);\n\n return new Observable<VariableValueOption[]>((observer) => {\n const queryEntry: SceneQueryControllerEntry = {\n type: 'variable',\n origin: this,\n cancel: () => observer.complete(),\n };\n\n if (queryController) {\n queryController.queryStarted(queryEntry);\n }\n\n this.setState({ loading: true });\n\n if (this.state.throwError) {\n throw new Error(this.state.throwError);\n }\n\n const interpolatedQuery = sceneGraph.interpolate(this, this.state.query);\n const options = this.getOptions(interpolatedQuery);\n\n const sub = this.completeUpdate.subscribe({\n next: () => {\n this.setState({ issuedQuery: interpolatedQuery, options, loading: false });\n observer.next(options);\n observer.complete();\n },\n });\n\n let timeout: number | undefined;\n if (delayMs) {\n timeout = window.setTimeout(() => this.signalUpdateCompleted(), delayMs);\n } else if (delayMs === 0) {\n this.signalUpdateCompleted();\n }\n\n this.isGettingValues = true;\n\n return () => {\n sub.unsubscribe();\n window.clearTimeout(timeout);\n this.isGettingValues = false;\n\n if (this.state.loading) {\n this.setState({ loading: false });\n }\n\n if (queryController) {\n queryController.queryCompleted(queryEntry);\n }\n };\n });\n }\n\n public cancel() {\n const sceneVarSet = getClosest(this, (s) => (s instanceof SceneVariableSet ? s : undefined));\n sceneVarSet?.cancel(this);\n }\n\n private getOptions(interpolatedQuery: string) {\n if (this.state.optionsToReturn) {\n return this.state.optionsToReturn;\n }\n\n return queryMetricTree(interpolatedQuery).map((x) => ({ label: x.name, value: x.name }));\n }\n\n /** Useful from tests */\n public signalUpdateCompleted() {\n this.completeUpdate.next(1);\n }\n\n public static Component = ({ model }: SceneComponentProps<MultiValueVariable>) => {\n return renderSelectForVariable(model);\n };\n}\n"],"names":[],"mappings":"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"}