@grafana/scenes 1.11.1 β 1.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/dist/esm/components/SceneTimePicker.js +16 -3
- package/dist/esm/components/SceneTimePicker.js.map +1 -1
- package/dist/esm/querying/SceneQueryRunner.js +40 -9
- package/dist/esm/querying/SceneQueryRunner.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersSet.js +2 -42
- package/dist/esm/variables/adhoc/AdHocFiltersSet.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersVariableUrlSyncHandler.js +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersVariableUrlSyncHandler.js.map +1 -1
- package/dist/index.d.ts +8 -3
- package/dist/index.js +798 -795
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,20 @@
|
|
|
1
|
+
# v1.12.0 (Tue Oct 03 2023)
|
|
2
|
+
|
|
3
|
+
#### π Enhancement
|
|
4
|
+
|
|
5
|
+
- AdhocFilters: Pass filters via request object [#382](https://github.com/grafana/scenes/pull/382) ([@torkelo](https://github.com/torkelo))
|
|
6
|
+
|
|
7
|
+
#### π Bug Fix
|
|
8
|
+
|
|
9
|
+
- SceneTimeRange: Implement onZoom behavior [#374](https://github.com/grafana/scenes/pull/374) ([@polibb](https://github.com/polibb))
|
|
10
|
+
|
|
11
|
+
#### Authors: 2
|
|
12
|
+
|
|
13
|
+
- Polina Boneva ([@polibb](https://github.com/polibb))
|
|
14
|
+
- Torkel Γdegaard ([@torkelo](https://github.com/torkelo))
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
1
18
|
# v1.11.1 (Tue Oct 03 2023)
|
|
2
19
|
|
|
3
20
|
#### π Bug Fix
|
|
@@ -2,10 +2,16 @@ import React from 'react';
|
|
|
2
2
|
import { TimeRangePicker } from '@grafana/ui';
|
|
3
3
|
import { SceneObjectBase } from '../core/SceneObjectBase.js';
|
|
4
4
|
import { sceneGraph } from '../core/sceneGraph/index.js';
|
|
5
|
+
import { toUtc } from '@grafana/data';
|
|
5
6
|
|
|
6
7
|
class SceneTimePicker extends SceneObjectBase {
|
|
7
8
|
constructor() {
|
|
8
9
|
super(...arguments);
|
|
10
|
+
this.onZoom = () => {
|
|
11
|
+
const timeRange = sceneGraph.getTimeRange(this);
|
|
12
|
+
const zoomedTimeRange = getZoomedTimeRange(timeRange.state.value, 2);
|
|
13
|
+
timeRange.onTimeRangeChange(zoomedTimeRange);
|
|
14
|
+
};
|
|
9
15
|
this.onChangeFiscalYearStartMonth = (month) => {
|
|
10
16
|
const timeRange = sceneGraph.getTimeRange(this);
|
|
11
17
|
timeRange.setState({ fiscalYearStartMonth: month });
|
|
@@ -31,12 +37,19 @@ function SceneTimePickerRenderer({ model }) {
|
|
|
31
37
|
},
|
|
32
38
|
onMoveForward: () => {
|
|
33
39
|
},
|
|
34
|
-
onZoom:
|
|
35
|
-
},
|
|
40
|
+
onZoom: model.onZoom,
|
|
36
41
|
onChangeTimeZone: timeRange.onTimeZoneChange,
|
|
37
42
|
onChangeFiscalYearStartMonth: model.onChangeFiscalYearStartMonth
|
|
38
43
|
});
|
|
39
44
|
}
|
|
45
|
+
function getZoomedTimeRange(timeRange, factor) {
|
|
46
|
+
const timespan = timeRange.to.valueOf() - timeRange.from.valueOf();
|
|
47
|
+
const center = timeRange.to.valueOf() - timespan / 2;
|
|
48
|
+
const newTimespan = timespan === 0 ? 3e4 : timespan * factor;
|
|
49
|
+
const to = center + newTimespan / 2;
|
|
50
|
+
const from = center - newTimespan / 2;
|
|
51
|
+
return { from: toUtc(from), to: toUtc(to), raw: { from: toUtc(from), to: toUtc(to) } };
|
|
52
|
+
}
|
|
40
53
|
|
|
41
|
-
export { SceneTimePicker };
|
|
54
|
+
export { SceneTimePicker, getZoomedTimeRange };
|
|
42
55
|
//# sourceMappingURL=SceneTimePicker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SceneTimePicker.js","sources":["../../../src/components/SceneTimePicker.tsx"],"sourcesContent":["import React from 'react';\n\nimport { TimeRangePicker } from '@grafana/ui';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneComponentProps, SceneObjectState } from '../core/types';\n\nexport interface SceneTimePickerState extends SceneObjectState {\n hidePicker?: boolean;\n isOnCanvas?: boolean;\n}\n\nexport class SceneTimePicker extends SceneObjectBase<SceneTimePickerState> {\n public static Component = SceneTimePickerRenderer;\n\n public onChangeFiscalYearStartMonth = (month: number) => {\n const timeRange = sceneGraph.getTimeRange(this);\n timeRange.setState({ fiscalYearStartMonth: month });\n };\n}\n\nfunction SceneTimePickerRenderer({ model }: SceneComponentProps<SceneTimePicker>) {\n const { hidePicker, isOnCanvas } = model.useState();\n const timeRange = sceneGraph.getTimeRange(model);\n const timeZone = timeRange.getTimeZone();\n const timeRangeState = timeRange.useState();\n\n if (hidePicker) {\n return null;\n }\n\n return (\n <TimeRangePicker\n isOnCanvas={isOnCanvas ?? true}\n value={timeRangeState.value}\n onChange={timeRange.onTimeRangeChange}\n timeZone={timeZone}\n fiscalYearStartMonth={timeRangeState.fiscalYearStartMonth}\n onMoveBackward={() => {}}\n onMoveForward={() => {}}\n onZoom={
|
|
1
|
+
{"version":3,"file":"SceneTimePicker.js","sources":["../../../src/components/SceneTimePicker.tsx"],"sourcesContent":["import React from 'react';\n\nimport { TimeRangePicker } from '@grafana/ui';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneComponentProps, SceneObjectState } from '../core/types';\nimport { TimeRange, toUtc } from '@grafana/data';\n\nexport interface SceneTimePickerState extends SceneObjectState {\n hidePicker?: boolean;\n isOnCanvas?: boolean;\n}\n\nexport class SceneTimePicker extends SceneObjectBase<SceneTimePickerState> {\n public static Component = SceneTimePickerRenderer;\n\n public onZoom = () => {\n const timeRange = sceneGraph.getTimeRange(this);\n const zoomedTimeRange = getZoomedTimeRange(timeRange.state.value, 2);\n timeRange.onTimeRangeChange(zoomedTimeRange);\n };\n\n public onChangeFiscalYearStartMonth = (month: number) => {\n const timeRange = sceneGraph.getTimeRange(this);\n timeRange.setState({ fiscalYearStartMonth: month });\n };\n}\n\nfunction SceneTimePickerRenderer({ model }: SceneComponentProps<SceneTimePicker>) {\n const { hidePicker, isOnCanvas } = model.useState();\n const timeRange = sceneGraph.getTimeRange(model);\n const timeZone = timeRange.getTimeZone();\n const timeRangeState = timeRange.useState();\n\n if (hidePicker) {\n return null;\n }\n\n return (\n <TimeRangePicker\n isOnCanvas={isOnCanvas ?? true}\n value={timeRangeState.value}\n onChange={timeRange.onTimeRangeChange}\n timeZone={timeZone}\n fiscalYearStartMonth={timeRangeState.fiscalYearStartMonth}\n onMoveBackward={() => {}}\n onMoveForward={() => {}}\n onZoom={model.onZoom}\n onChangeTimeZone={timeRange.onTimeZoneChange}\n onChangeFiscalYearStartMonth={model.onChangeFiscalYearStartMonth}\n />\n );\n}\n\nexport function getZoomedTimeRange(timeRange: TimeRange, factor: number): TimeRange {\n const timespan = timeRange.to.valueOf() - timeRange.from.valueOf();\n const center = timeRange.to.valueOf() - timespan / 2;\n // If the timepsan is 0, zooming out would do nothing, so we force a zoom out to 30s\n const newTimespan = timespan === 0 ? 30000 : timespan * factor;\n\n const to = center + newTimespan / 2;\n const from = center - newTimespan / 2;\n\n return { from: toUtc(from), to: toUtc(to), raw: { from: toUtc(from), to: toUtc(to) } };\n}\n"],"names":[],"mappings":";;;;;;AAcO,MAAM,wBAAwB,eAAsC,CAAA;AAAA,EAApE,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA,CAAA;AAGL,IAAA,IAAA,CAAO,SAAS,MAAM;AACpB,MAAM,MAAA,SAAA,GAAY,UAAW,CAAA,YAAA,CAAa,IAAI,CAAA,CAAA;AAC9C,MAAA,MAAM,eAAkB,GAAA,kBAAA,CAAmB,SAAU,CAAA,KAAA,CAAM,OAAO,CAAC,CAAA,CAAA;AACnE,MAAA,SAAA,CAAU,kBAAkB,eAAe,CAAA,CAAA;AAAA,KAC7C,CAAA;AAEA,IAAO,IAAA,CAAA,4BAAA,GAA+B,CAAC,KAAkB,KAAA;AACvD,MAAM,MAAA,SAAA,GAAY,UAAW,CAAA,YAAA,CAAa,IAAI,CAAA,CAAA;AAC9C,MAAA,SAAA,CAAU,QAAS,CAAA,EAAE,oBAAsB,EAAA,KAAA,EAAO,CAAA,CAAA;AAAA,KACpD,CAAA;AAAA,GAAA;AACF,CAAA;AAba,eAAA,CACG,SAAY,GAAA,uBAAA,CAAA;AAc5B,SAAS,uBAAA,CAAwB,EAAE,KAAA,EAA+C,EAAA;AAChF,EAAA,MAAM,EAAE,UAAA,EAAY,UAAW,EAAA,GAAI,MAAM,QAAS,EAAA,CAAA;AAClD,EAAM,MAAA,SAAA,GAAY,UAAW,CAAA,YAAA,CAAa,KAAK,CAAA,CAAA;AAC/C,EAAM,MAAA,QAAA,GAAW,UAAU,WAAY,EAAA,CAAA;AACvC,EAAM,MAAA,cAAA,GAAiB,UAAU,QAAS,EAAA,CAAA;AAE1C,EAAA,IAAI,UAAY,EAAA;AACd,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAEA,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,eAAA,EAAA;AAAA,IACC,YAAY,UAAc,IAAA,IAAA,GAAA,UAAA,GAAA,IAAA;AAAA,IAC1B,OAAO,cAAe,CAAA,KAAA;AAAA,IACtB,UAAU,SAAU,CAAA,iBAAA;AAAA,IACpB,QAAA;AAAA,IACA,sBAAsB,cAAe,CAAA,oBAAA;AAAA,IACrC,gBAAgB,MAAM;AAAA,KAAC;AAAA,IACvB,eAAe,MAAM;AAAA,KAAC;AAAA,IACtB,QAAQ,KAAM,CAAA,MAAA;AAAA,IACd,kBAAkB,SAAU,CAAA,gBAAA;AAAA,IAC5B,8BAA8B,KAAM,CAAA,4BAAA;AAAA,GACtC,CAAA,CAAA;AAEJ,CAAA;AAEgB,SAAA,kBAAA,CAAmB,WAAsB,MAA2B,EAAA;AAClF,EAAA,MAAM,WAAW,SAAU,CAAA,EAAA,CAAG,SAAY,GAAA,SAAA,CAAU,KAAK,OAAQ,EAAA,CAAA;AACjE,EAAA,MAAM,MAAS,GAAA,SAAA,CAAU,EAAG,CAAA,OAAA,KAAY,QAAW,GAAA,CAAA,CAAA;AAEnD,EAAA,MAAM,WAAc,GAAA,QAAA,KAAa,CAAI,GAAA,GAAA,GAAQ,QAAW,GAAA,MAAA,CAAA;AAExD,EAAM,MAAA,EAAA,GAAK,SAAS,WAAc,GAAA,CAAA,CAAA;AAClC,EAAM,MAAA,IAAA,GAAO,SAAS,WAAc,GAAA,CAAA,CAAA;AAEpC,EAAA,OAAO,EAAE,IAAM,EAAA,KAAA,CAAM,IAAI,CAAG,EAAA,EAAA,EAAI,MAAM,EAAE,CAAA,EAAG,KAAK,EAAE,IAAA,EAAM,MAAM,IAAI,CAAA,EAAG,IAAI,KAAM,CAAA,EAAE,GAAI,EAAA,CAAA;AACvF;;;;"}
|
|
@@ -2,7 +2,7 @@ import { cloneDeep } from 'lodash';
|
|
|
2
2
|
import { ReplaySubject, merge, mergeAll, map, forkJoin } from 'rxjs';
|
|
3
3
|
import { LoadingState } from '@grafana/schema';
|
|
4
4
|
import { rangeUtil, preProcessPanelData, DataTopic, transformDataFrame } from '@grafana/data';
|
|
5
|
-
import { getRunRequest, toDataQueryError } from '@grafana/runtime';
|
|
5
|
+
import { getRunRequest, toDataQueryError, getDataSourceSrv } from '@grafana/runtime';
|
|
6
6
|
import { SceneObjectBase } from '../core/SceneObjectBase.js';
|
|
7
7
|
import { sceneGraph } from '../core/sceneGraph/index.js';
|
|
8
8
|
import { getDataSource } from '../utils/getDataSource.js';
|
|
@@ -15,6 +15,7 @@ import { getClosest } from '../core/sceneGraph/utils.js';
|
|
|
15
15
|
import { timeShiftQueryResponseOperator } from './timeShiftQueryResponseOperator.js';
|
|
16
16
|
import { filterAnnotationsOperator } from './layers/annotations/filterAnnotationsOperator.js';
|
|
17
17
|
import { getEnrichedDataRequest } from './getEnrichedDataRequest.js';
|
|
18
|
+
import { AdHocFilterSet } from '../variables/adhoc/AdHocFiltersSet.js';
|
|
18
19
|
|
|
19
20
|
var __defProp = Object.defineProperty;
|
|
20
21
|
var __defProps = Object.defineProperties;
|
|
@@ -44,6 +45,7 @@ class SceneQueryRunner extends SceneObjectBase {
|
|
|
44
45
|
super(initialState);
|
|
45
46
|
this._variableValueRecorder = new VariableValueRecorder();
|
|
46
47
|
this._results = new ReplaySubject();
|
|
48
|
+
this._scopedVars = { __sceneObject: { value: this, text: "__sceneObject" } };
|
|
47
49
|
this._variableDependency = new VariableDependencyConfig(this, {
|
|
48
50
|
statePaths: ["queries", "datasource"],
|
|
49
51
|
onVariableUpdatesCompleted: (variables, dependencyChanged) => this.onVariableUpdatesCompleted(variables, dependencyChanged)
|
|
@@ -51,9 +53,6 @@ class SceneQueryRunner extends SceneObjectBase {
|
|
|
51
53
|
this.prepareRequests = (timeRange, ds) => {
|
|
52
54
|
const comparer = this.getTimeCompare();
|
|
53
55
|
const { minInterval, queries } = this.state;
|
|
54
|
-
const sceneObjectScopedVar = {
|
|
55
|
-
__sceneObject: { text: "__sceneObject", value: this }
|
|
56
|
-
};
|
|
57
56
|
let secondaryRequest;
|
|
58
57
|
let request = __spreadValues({
|
|
59
58
|
app: "scenes",
|
|
@@ -65,7 +64,7 @@ class SceneQueryRunner extends SceneObjectBase {
|
|
|
65
64
|
intervalMs: 1e3,
|
|
66
65
|
targets: cloneDeep(queries),
|
|
67
66
|
maxDataPoints: this.getMaxDataPoints(),
|
|
68
|
-
scopedVars:
|
|
67
|
+
scopedVars: this._scopedVars,
|
|
69
68
|
startTime: Date.now(),
|
|
70
69
|
liveStreaming: this.state.liveStreaming,
|
|
71
70
|
rangeRaw: {
|
|
@@ -73,6 +72,9 @@ class SceneQueryRunner extends SceneObjectBase {
|
|
|
73
72
|
to: timeRange.state.to
|
|
74
73
|
}
|
|
75
74
|
}, getEnrichedDataRequest(this));
|
|
75
|
+
if (this._adhocFilterSet) {
|
|
76
|
+
request.filters = this._adhocFilterSet.state.filters;
|
|
77
|
+
}
|
|
76
78
|
request.targets = request.targets.map((query) => {
|
|
77
79
|
if (!query.datasource) {
|
|
78
80
|
query.datasource = ds.getRef();
|
|
@@ -227,6 +229,9 @@ class SceneQueryRunner extends SceneObjectBase {
|
|
|
227
229
|
this._dataLayersSub.unsubscribe();
|
|
228
230
|
this._dataLayersSub = void 0;
|
|
229
231
|
}
|
|
232
|
+
if (this._adhocFilterSub) {
|
|
233
|
+
this._adhocFilterSub.unsubscribe();
|
|
234
|
+
}
|
|
230
235
|
this._variableValueRecorder.recordCurrentDependencyValuesForSceneObject(this);
|
|
231
236
|
}
|
|
232
237
|
setContainerWidth(width) {
|
|
@@ -286,16 +291,16 @@ class SceneQueryRunner extends SceneObjectBase {
|
|
|
286
291
|
this.setState({ _isWaitingForVariables: false });
|
|
287
292
|
}
|
|
288
293
|
const { queries } = this.state;
|
|
289
|
-
const sceneObjectScopedVar = {
|
|
290
|
-
__sceneObject: { text: "__sceneObject", value: this }
|
|
291
|
-
};
|
|
292
294
|
if (!(queries == null ? void 0 : queries.length)) {
|
|
293
295
|
this._setNoDataState();
|
|
294
296
|
return;
|
|
295
297
|
}
|
|
296
298
|
try {
|
|
297
299
|
const datasource = (_b = this.state.datasource) != null ? _b : findFirstDatasource(queries);
|
|
298
|
-
const ds = await getDataSource(datasource,
|
|
300
|
+
const ds = await getDataSource(datasource, this._scopedVars);
|
|
301
|
+
if (!this._adhocFilterSet) {
|
|
302
|
+
this.findAndSubscribeToAdhocFilters(ds.uid);
|
|
303
|
+
}
|
|
299
304
|
const [request, secondaryRequest] = this.prepareRequests(timeRange, ds);
|
|
300
305
|
writeSceneLog("SceneQueryRunner", "Starting runRequest", this.state.key);
|
|
301
306
|
if (secondaryRequest) {
|
|
@@ -342,6 +347,32 @@ class SceneQueryRunner extends SceneObjectBase {
|
|
|
342
347
|
return found;
|
|
343
348
|
});
|
|
344
349
|
}
|
|
350
|
+
findAndSubscribeToAdhocFilters(ourDataSourceUid) {
|
|
351
|
+
var _a;
|
|
352
|
+
const set = getClosest(this, (s) => {
|
|
353
|
+
var _a2, _b;
|
|
354
|
+
let found = null;
|
|
355
|
+
if (s instanceof AdHocFilterSet && ((_a2 = s.state.datasource) == null ? void 0 : _a2.uid) === ((_b = this.state.datasource) == null ? void 0 : _b.uid)) {
|
|
356
|
+
return s;
|
|
357
|
+
}
|
|
358
|
+
s.forEachChild((child) => {
|
|
359
|
+
var _a3, _b2;
|
|
360
|
+
if (child instanceof AdHocFilterSet && ((_a3 = child.state.datasource) == null ? void 0 : _a3.uid) === ((_b2 = this.state.datasource) == null ? void 0 : _b2.uid)) {
|
|
361
|
+
found = child;
|
|
362
|
+
}
|
|
363
|
+
});
|
|
364
|
+
return found;
|
|
365
|
+
});
|
|
366
|
+
if (!set || set.state.applyMode !== "same-datasource") {
|
|
367
|
+
return;
|
|
368
|
+
}
|
|
369
|
+
const setDataSource = getDataSourceSrv().getInstanceSettings(set == null ? void 0 : set.state.datasource, this._scopedVars);
|
|
370
|
+
if ((setDataSource == null ? void 0 : setDataSource.uid) !== ourDataSourceUid) {
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
this._adhocFilterSet = set;
|
|
374
|
+
this._adhocFilterSub = (_a = this._adhocFilterSet) == null ? void 0 : _a.subscribeToState(() => this.runQueries());
|
|
375
|
+
}
|
|
345
376
|
}
|
|
346
377
|
function findFirstDatasource(targets) {
|
|
347
378
|
var _a, _b;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SceneQueryRunner.js","sources":["../../../src/querying/SceneQueryRunner.ts"],"sourcesContent":["import { cloneDeep } from 'lodash';\nimport { forkJoin, map, merge, mergeAll, Observable, ReplaySubject, Unsubscribable } from 'rxjs';\n\nimport { DataQuery, DataSourceRef, LoadingState } from '@grafana/schema';\n\nimport {\n DataFrame,\n DataQueryRequest,\n DataSourceApi,\n DataTopic,\n PanelData,\n preProcessPanelData,\n rangeUtil,\n ScopedVar,\n transformDataFrame,\n} from '@grafana/data';\nimport { getRunRequest, toDataQueryError } from '@grafana/runtime';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport {\n DataLayerFilter,\n SceneDataLayerProviderResult,\n SceneDataProvider,\n SceneDataProviderResult,\n SceneObjectState,\n SceneTimeRangeLike,\n} from '../core/types';\nimport { getDataSource } from '../utils/getDataSource';\nimport { VariableDependencyConfig } from '../variables/VariableDependencyConfig';\nimport { SceneVariable } from '../variables/types';\nimport { writeSceneLog } from '../utils/writeSceneLog';\nimport { VariableValueRecorder } from '../variables/VariableValueRecorder';\nimport { emptyPanelData } from '../core/SceneDataNode';\nimport { SceneTimeRangeCompare } from '../components/SceneTimeRangeCompare';\nimport { getClosest } from '../core/sceneGraph/utils';\nimport { timeShiftQueryResponseOperator } from './timeShiftQueryResponseOperator';\nimport { filterAnnotationsOperator } from './layers/annotations/filterAnnotationsOperator';\nimport { getEnrichedDataRequest } from './getEnrichedDataRequest';\n\nlet counter = 100;\n\nexport function getNextRequestId() {\n return 'SQR' + counter++;\n}\n\nexport interface QueryRunnerState extends SceneObjectState {\n data?: PanelData;\n queries: DataQueryExtended[];\n datasource?: DataSourceRef;\n minInterval?: string;\n maxDataPoints?: number;\n liveStreaming?: boolean;\n maxDataPointsFromWidth?: boolean;\n // Filters to be applied to data layer results before combining them with SQR results\n dataLayerFilter?: DataLayerFilter;\n // Private runtime state\n _isWaitingForVariables?: boolean;\n _hasFetchedData?: boolean;\n}\n\nexport interface DataQueryExtended extends DataQuery {\n [key: string]: any;\n}\n\nexport class SceneQueryRunner extends SceneObjectBase<QueryRunnerState> implements SceneDataProvider {\n private _querySub?: Unsubscribable;\n private _dataLayersSub?: Unsubscribable;\n private _containerWidth?: number;\n private _variableValueRecorder = new VariableValueRecorder();\n private _results = new ReplaySubject<SceneDataProviderResult>();\n\n public getResultsStream() {\n return this._results;\n }\n\n protected _variableDependency: VariableDependencyConfig<QueryRunnerState> = new VariableDependencyConfig(this, {\n statePaths: ['queries', 'datasource'],\n onVariableUpdatesCompleted: (variables, dependencyChanged) =>\n this.onVariableUpdatesCompleted(variables, dependencyChanged),\n });\n\n public constructor(initialState: QueryRunnerState) {\n super(initialState);\n\n this.addActivationHandler(() => this._onActivate());\n }\n\n private _onActivate() {\n const timeRange = sceneGraph.getTimeRange(this);\n const comparer = this.getTimeCompare();\n\n if (comparer) {\n this._subs.add(\n comparer.subscribeToState((n, p) => {\n if (n.compareWith !== p.compareWith) {\n this.runQueries();\n }\n })\n );\n }\n\n this._subs.add(\n timeRange.subscribeToState(() => {\n this.runWithTimeRange(timeRange);\n })\n );\n\n if (this.shouldRunQueriesOnActivate()) {\n this.runQueries();\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 const observables: Array<Observable<SceneDataLayerProviderResult>> = [];\n\n // This keeps track of multiple SceneDataLayers. The key responsibility od this map is to make sure individual from independent SceneDataLayers do not overwrite each other.\n const resultsMap: Map<string, PanelData> = new Map();\n\n if (dataLayers.length > 0) {\n dataLayers.forEach((layer) => {\n observables.push(layer.getResultsStream());\n });\n\n // possibly we want to combine the results from all layers and only then update, but this is tricky ;(\n this._dataLayersSub = merge(observables)\n .pipe(\n mergeAll(),\n map((v) => {\n // Is there a better, rxjs only way to combine multiple same-data-topic observables?\n // Indexing by origin state key is to make sure we do not duplicate/overwrite data from the different origins\n resultsMap.set(v.origin.state.key!, v.data);\n return resultsMap;\n })\n )\n .subscribe((result) => {\n this._onLayersReceived(result);\n });\n }\n }\n\n private _onLayersReceived(results: Map<string, PanelData>) {\n const { dataLayerFilter } = this.state;\n let annotations: DataFrame[] = [];\n\n Array.from(results.values()).forEach((result) => {\n if (result[DataTopic.Annotations]) {\n annotations = annotations.concat(result[DataTopic.Annotations]);\n }\n });\n\n if (dataLayerFilter?.panelId) {\n transformDataFrame([filterAnnotationsOperator(dataLayerFilter)], annotations).subscribe((result) => {\n this.setState({\n data: {\n ...this.state.data!,\n annotations: result,\n },\n });\n });\n } else {\n this.setState({\n data: {\n ...this.state.data!,\n annotations,\n },\n });\n }\n }\n\n /**\n * Handles some tricky cases where we need to run queries even when they have not changed in case\n * the query execution on activate was stopped due to VariableSet still not having processed all variables.\n */\n private onVariableUpdatesCompleted(_variablesThatHaveChanged: Set<SceneVariable>, dependencyChanged: boolean) {\n if (this.state._isWaitingForVariables && this.shouldRunQueriesOnActivate()) {\n this.runQueries();\n return;\n }\n\n if (dependencyChanged) {\n this.runQueries();\n }\n }\n\n private shouldRunQueriesOnActivate() {\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 false;\n }\n\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 if (data.timeRange === timeRange.state.value) {\n return false;\n }\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._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._querySub) {\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 public runQueries() {\n const timeRange = sceneGraph.getTimeRange(this);\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 data layers subscription doesn't exist, create one\n //\n if (!this._dataLayersSub) {\n this._handleDataLayers();\n }\n\n const runRequest = getRunRequest();\n // Cancel any running queries\n this._querySub?.unsubscribe();\n\n // Skip executing queries if variable dependency is in loading state\n if (sceneGraph.hasVariableDependencyInLoadingState(this)) {\n writeSceneLog('SceneQueryRunner', 'Variable dependency is in loading state, skipping query execution');\n this.setState({ _isWaitingForVariables: true });\n return;\n }\n\n // If we were waiting for variables, clear that flag\n if (this.state._isWaitingForVariables) {\n this.setState({ _isWaitingForVariables: false });\n }\n\n const { queries } = this.state;\n const sceneObjectScopedVar: Record<string, ScopedVar<SceneQueryRunner>> = {\n __sceneObject: { text: '__sceneObject', value: this },\n };\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, sceneObjectScopedVar);\n\n const [request, secondaryRequest] = this.prepareRequests(timeRange, ds);\n\n writeSceneLog('SceneQueryRunner', 'Starting runRequest', this.state.key);\n\n if (secondaryRequest) {\n // change subscribe callback below to pipe operator\n this._querySub = forkJoin([runRequest(ds, request), runRequest(ds, secondaryRequest)])\n .pipe(timeShiftQueryResponseOperator)\n .subscribe(this.onDataReceived);\n } else {\n this._querySub = runRequest(ds, request).subscribe(this.onDataReceived);\n }\n } catch (err) {\n console.error('PanelQueryRunner Error', err);\n\n const result = {\n ...emptyPanelData,\n ...this.state.data,\n state: LoadingState.Error,\n errors: [toDataQueryError(err)],\n };\n\n this.setState({\n data: result,\n });\n }\n }\n\n private prepareRequests = (\n timeRange: SceneTimeRangeLike,\n ds: DataSourceApi\n ): [DataQueryRequest, DataQueryRequest | undefined] => {\n const comparer = this.getTimeCompare();\n const { minInterval, queries } = this.state;\n const sceneObjectScopedVar: Record<string, ScopedVar<SceneQueryRunner>> = {\n __sceneObject: { text: '__sceneObject', value: this },\n };\n\n let secondaryRequest: DataQueryRequest | undefined;\n\n let request: DataQueryRequest = {\n app: 'scenes',\n requestId: getNextRequestId(),\n timezone: timeRange.getTimeZone(),\n panelId: 1,\n range: timeRange.state.value,\n interval: '1s',\n intervalMs: 1000,\n targets: cloneDeep(queries),\n maxDataPoints: this.getMaxDataPoints(),\n scopedVars: sceneObjectScopedVar,\n startTime: Date.now(),\n liveStreaming: this.state.liveStreaming,\n rangeRaw: {\n from: timeRange.state.from,\n to: timeRange.state.to,\n },\n // This asks the scene root to provide context properties like app, panel and dashboardUID\n ...getEnrichedDataRequest(this),\n };\n\n request.targets = request.targets.map((query) => {\n if (!query.datasource) {\n query.datasource = ds.getRef();\n }\n return query;\n });\n\n // TODO interpolate minInterval\n const lowerIntervalLimit = minInterval ? 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 const primaryTimeRange = timeRange.state.value;\n if (comparer) {\n const secondaryTimeRange = comparer.getCompareTimeRange(primaryTimeRange);\n if (secondaryTimeRange) {\n secondaryRequest = {\n ...request,\n range: secondaryTimeRange,\n requestId: getNextRequestId(),\n };\n\n request = {\n ...request,\n range: primaryTimeRange,\n };\n }\n }\n\n return [request, secondaryRequest];\n };\n\n private onDataReceived = (data: PanelData) => {\n this._results.next({ origin: this, data });\n\n // Will combine annotations from SQR queries (frames with meta.dataTopic === DataTopic.Annotations)\n const preProcessedData = preProcessPanelData(data, this.state.data);\n\n // Will combine annotations & --- 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 };\n\n private _combineDataLayers(data: PanelData) {\n if (this.state.data && this.state.data.annotations) {\n data.annotations = (data.annotations || []).concat(this.state.data.annotations);\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 * Will walk up the scene graph and find the closest time range compare object\n * It performs buttom-up search, including shallow search across object children for supporting controls/header actions\n */\n private getTimeCompare() {\n if (!this.parent) {\n return null;\n }\n return getClosest(this.parent, (s) => {\n let found = null;\n if (s instanceof SceneTimeRangeCompare) {\n return s;\n }\n s.forEachChild((child) => {\n if (child instanceof SceneTimeRangeCompare) {\n found = child;\n }\n });\n\n return found;\n });\n }\n}\n\nexport function findFirstDatasource(targets: DataQuery[]): DataSourceRef | undefined {\n return targets.find((t) => t.datasource !== null)?.datasource ?? undefined;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SceneQueryRunner.js","sources":["../../../src/querying/SceneQueryRunner.ts"],"sourcesContent":["import { cloneDeep } from 'lodash';\nimport { forkJoin, map, merge, mergeAll, Observable, ReplaySubject, Unsubscribable } from 'rxjs';\n\nimport { DataQuery, DataSourceRef, LoadingState } from '@grafana/schema';\n\nimport {\n DataFrame,\n DataQueryRequest,\n DataSourceApi,\n DataTopic,\n PanelData,\n preProcessPanelData,\n rangeUtil,\n transformDataFrame,\n} from '@grafana/data';\nimport { getDataSourceSrv, getRunRequest, toDataQueryError } from '@grafana/runtime';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport {\n DataLayerFilter,\n SceneDataLayerProviderResult,\n SceneDataProvider,\n SceneDataProviderResult,\n SceneObjectState,\n SceneTimeRangeLike,\n} from '../core/types';\nimport { getDataSource } from '../utils/getDataSource';\nimport { VariableDependencyConfig } from '../variables/VariableDependencyConfig';\nimport { SceneVariable } from '../variables/types';\nimport { writeSceneLog } from '../utils/writeSceneLog';\nimport { VariableValueRecorder } from '../variables/VariableValueRecorder';\nimport { emptyPanelData } from '../core/SceneDataNode';\nimport { SceneTimeRangeCompare } from '../components/SceneTimeRangeCompare';\nimport { getClosest } from '../core/sceneGraph/utils';\nimport { timeShiftQueryResponseOperator } from './timeShiftQueryResponseOperator';\nimport { filterAnnotationsOperator } from './layers/annotations/filterAnnotationsOperator';\nimport { getEnrichedDataRequest } from './getEnrichedDataRequest';\nimport { AdHocFilterSet } from '../variables/adhoc/AdHocFiltersSet';\n\nlet counter = 100;\n\nexport function getNextRequestId() {\n return 'SQR' + counter++;\n}\n\nexport interface QueryRunnerState extends SceneObjectState {\n data?: PanelData;\n queries: DataQueryExtended[];\n datasource?: DataSourceRef;\n minInterval?: string;\n maxDataPoints?: number;\n liveStreaming?: boolean;\n maxDataPointsFromWidth?: boolean;\n // Filters to be applied to data layer results before combining them with SQR results\n dataLayerFilter?: DataLayerFilter;\n // Private runtime state\n _isWaitingForVariables?: boolean;\n _hasFetchedData?: boolean;\n}\n\nexport interface DataQueryExtended extends DataQuery {\n [key: string]: any;\n}\n\nexport class SceneQueryRunner extends SceneObjectBase<QueryRunnerState> implements SceneDataProvider {\n private _querySub?: Unsubscribable;\n private _dataLayersSub?: Unsubscribable;\n private _containerWidth?: number;\n private _variableValueRecorder = new VariableValueRecorder();\n private _results = new ReplaySubject<SceneDataProviderResult>();\n private _scopedVars = { __sceneObject: { value: this, text: '__sceneObject' } };\n\n // Closest filter set if found)\n private _adhocFilterSet?: AdHocFilterSet;\n private _adhocFilterSub?: Unsubscribable;\n\n public getResultsStream() {\n return this._results;\n }\n\n protected _variableDependency: VariableDependencyConfig<QueryRunnerState> = new VariableDependencyConfig(this, {\n statePaths: ['queries', 'datasource'],\n onVariableUpdatesCompleted: (variables, dependencyChanged) =>\n this.onVariableUpdatesCompleted(variables, dependencyChanged),\n });\n\n public constructor(initialState: QueryRunnerState) {\n super(initialState);\n\n this.addActivationHandler(() => this._onActivate());\n }\n\n private _onActivate() {\n const timeRange = sceneGraph.getTimeRange(this);\n const comparer = this.getTimeCompare();\n\n if (comparer) {\n this._subs.add(\n comparer.subscribeToState((n, p) => {\n if (n.compareWith !== p.compareWith) {\n this.runQueries();\n }\n })\n );\n }\n\n this._subs.add(\n timeRange.subscribeToState(() => {\n this.runWithTimeRange(timeRange);\n })\n );\n\n if (this.shouldRunQueriesOnActivate()) {\n this.runQueries();\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 const observables: Array<Observable<SceneDataLayerProviderResult>> = [];\n\n // This keeps track of multiple SceneDataLayers. The key responsibility od this map is to make sure individual from independent SceneDataLayers do not overwrite each other.\n const resultsMap: Map<string, PanelData> = new Map();\n\n if (dataLayers.length > 0) {\n dataLayers.forEach((layer) => {\n observables.push(layer.getResultsStream());\n });\n\n // possibly we want to combine the results from all layers and only then update, but this is tricky ;(\n this._dataLayersSub = merge(observables)\n .pipe(\n mergeAll(),\n map((v) => {\n // Is there a better, rxjs only way to combine multiple same-data-topic observables?\n // Indexing by origin state key is to make sure we do not duplicate/overwrite data from the different origins\n resultsMap.set(v.origin.state.key!, v.data);\n return resultsMap;\n })\n )\n .subscribe((result) => {\n this._onLayersReceived(result);\n });\n }\n }\n\n private _onLayersReceived(results: Map<string, PanelData>) {\n const { dataLayerFilter } = this.state;\n let annotations: DataFrame[] = [];\n\n Array.from(results.values()).forEach((result) => {\n if (result[DataTopic.Annotations]) {\n annotations = annotations.concat(result[DataTopic.Annotations]);\n }\n });\n\n if (dataLayerFilter?.panelId) {\n transformDataFrame([filterAnnotationsOperator(dataLayerFilter)], annotations).subscribe((result) => {\n this.setState({\n data: {\n ...this.state.data!,\n annotations: result,\n },\n });\n });\n } else {\n this.setState({\n data: {\n ...this.state.data!,\n annotations,\n },\n });\n }\n }\n\n /**\n * Handles some tricky cases where we need to run queries even when they have not changed in case\n * the query execution on activate was stopped due to VariableSet still not having processed all variables.\n */\n private onVariableUpdatesCompleted(_variablesThatHaveChanged: Set<SceneVariable>, dependencyChanged: boolean) {\n if (this.state._isWaitingForVariables && this.shouldRunQueriesOnActivate()) {\n this.runQueries();\n return;\n }\n\n if (dependencyChanged) {\n this.runQueries();\n }\n }\n\n private shouldRunQueriesOnActivate() {\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 false;\n }\n\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 if (data.timeRange === timeRange.state.value) {\n return false;\n }\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 if (this._adhocFilterSub) {\n this._adhocFilterSub.unsubscribe();\n }\n\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._querySub) {\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 public runQueries() {\n const timeRange = sceneGraph.getTimeRange(this);\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 data layers subscription doesn't exist, create one\n //\n if (!this._dataLayersSub) {\n this._handleDataLayers();\n }\n\n const runRequest = getRunRequest();\n // Cancel any running queries\n this._querySub?.unsubscribe();\n\n // Skip executing queries if variable dependency is in loading state\n if (sceneGraph.hasVariableDependencyInLoadingState(this)) {\n writeSceneLog('SceneQueryRunner', 'Variable dependency is in loading state, skipping query execution');\n this.setState({ _isWaitingForVariables: true });\n return;\n }\n\n // If we were waiting for variables, clear that flag\n if (this.state._isWaitingForVariables) {\n this.setState({ _isWaitingForVariables: false });\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 if (!this._adhocFilterSet) {\n this.findAndSubscribeToAdhocFilters(ds.uid);\n }\n\n const [request, secondaryRequest] = this.prepareRequests(timeRange, ds);\n\n writeSceneLog('SceneQueryRunner', 'Starting runRequest', this.state.key);\n\n if (secondaryRequest) {\n // change subscribe callback below to pipe operator\n this._querySub = forkJoin([runRequest(ds, request), runRequest(ds, secondaryRequest)])\n .pipe(timeShiftQueryResponseOperator)\n .subscribe(this.onDataReceived);\n } else {\n this._querySub = runRequest(ds, request).subscribe(this.onDataReceived);\n }\n } catch (err) {\n console.error('PanelQueryRunner Error', err);\n\n const result = {\n ...emptyPanelData,\n ...this.state.data,\n state: LoadingState.Error,\n errors: [toDataQueryError(err)],\n };\n\n this.setState({\n data: result,\n });\n }\n }\n\n private prepareRequests = (\n timeRange: SceneTimeRangeLike,\n ds: DataSourceApi\n ): [DataQueryRequest, DataQueryRequest | undefined] => {\n const comparer = this.getTimeCompare();\n const { minInterval, queries } = this.state;\n\n let secondaryRequest: DataQueryRequest | undefined;\n\n let request: DataQueryRequest = {\n app: 'scenes',\n requestId: getNextRequestId(),\n timezone: timeRange.getTimeZone(),\n panelId: 1,\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 // This asks the scene root to provide context properties like app, panel and dashboardUID\n ...getEnrichedDataRequest(this),\n };\n\n if (this._adhocFilterSet) {\n // @ts-ignore (Temporary ignore until we update @grafana/data)\n request.filters = this._adhocFilterSet.state.filters;\n }\n\n request.targets = request.targets.map((query) => {\n if (!query.datasource) {\n query.datasource = ds.getRef();\n }\n return query;\n });\n\n // TODO interpolate minInterval\n const lowerIntervalLimit = minInterval ? 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 const primaryTimeRange = timeRange.state.value;\n if (comparer) {\n const secondaryTimeRange = comparer.getCompareTimeRange(primaryTimeRange);\n if (secondaryTimeRange) {\n secondaryRequest = {\n ...request,\n range: secondaryTimeRange,\n requestId: getNextRequestId(),\n };\n\n request = {\n ...request,\n range: primaryTimeRange,\n };\n }\n }\n\n return [request, secondaryRequest];\n };\n\n private onDataReceived = (data: PanelData) => {\n this._results.next({ origin: this, data });\n\n // Will combine annotations from SQR queries (frames with meta.dataTopic === DataTopic.Annotations)\n const preProcessedData = preProcessPanelData(data, this.state.data);\n\n // Will combine annotations & --- 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 };\n\n private _combineDataLayers(data: PanelData) {\n if (this.state.data && this.state.data.annotations) {\n data.annotations = (data.annotations || []).concat(this.state.data.annotations);\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 * Will walk up the scene graph and find the closest time range compare object\n * It performs buttom-up search, including shallow search across object children for supporting controls/header actions\n */\n private getTimeCompare() {\n if (!this.parent) {\n return null;\n }\n return getClosest(this.parent, (s) => {\n let found = null;\n if (s instanceof SceneTimeRangeCompare) {\n return s;\n }\n s.forEachChild((child) => {\n if (child instanceof SceneTimeRangeCompare) {\n found = child;\n }\n });\n\n return found;\n });\n }\n\n /**\n * Walk up scene graph and find the closest filterset with matching data source\n */\n private findAndSubscribeToAdhocFilters(ourDataSourceUid: string) {\n const set = getClosest(this, (s) => {\n let found = null;\n if (s instanceof AdHocFilterSet && s.state.datasource?.uid === this.state.datasource?.uid) {\n return s;\n }\n s.forEachChild((child) => {\n if (child instanceof AdHocFilterSet && child.state.datasource?.uid === this.state.datasource?.uid) {\n found = child;\n }\n });\n return found;\n });\n\n if (!set || set.state.applyMode !== 'same-datasource') {\n return;\n }\n\n const setDataSource = getDataSourceSrv().getInstanceSettings(set?.state.datasource, this._scopedVars);\n\n if (setDataSource?.uid !== ourDataSourceUid) {\n return;\n }\n\n // Subscribe to filter set state changes so that queries are re-issued when it changes\n this._adhocFilterSet = set;\n this._adhocFilterSub = this._adhocFilterSet?.subscribeToState(() => this.runQueries());\n }\n}\n\nexport function findFirstDatasource(targets: DataQuery[]): DataSourceRef | undefined {\n return targets.find((t) => t.datasource !== null)?.datasource ?? undefined;\n}\n"],"names":["_a","_b"],"mappings":"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"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { SceneObjectBase } from '../../core/SceneObjectBase.js';
|
|
2
2
|
import { patchGetAdhocFilters } from './patchGetAdhocFilters.js';
|
|
3
3
|
import { getDataSourceSrv } from '@grafana/runtime';
|
|
4
|
-
import { SceneQueryRunner } from '../../querying/SceneQueryRunner.js';
|
|
5
4
|
import { AdHocFiltersVariableUrlSyncHandler } from './AdHocFiltersVariableUrlSyncHandler.js';
|
|
6
5
|
import { useStyles2 } from '@grafana/ui';
|
|
7
6
|
import React from 'react';
|
|
@@ -53,7 +52,6 @@ class AdHocFilterSet extends SceneObjectBase {
|
|
|
53
52
|
if (filter === _wip) {
|
|
54
53
|
if (prop === "value") {
|
|
55
54
|
this.setState({ filters: [...filters, __spreadProps(__spreadValues({}, _wip), { [prop]: value })], _wip: void 0 });
|
|
56
|
-
this._runSceneQueries();
|
|
57
55
|
} else {
|
|
58
56
|
this.setState({ _wip: __spreadProps(__spreadValues({}, filter), { [prop]: value }) });
|
|
59
57
|
}
|
|
@@ -65,18 +63,14 @@ class AdHocFilterSet extends SceneObjectBase {
|
|
|
65
63
|
}
|
|
66
64
|
return f;
|
|
67
65
|
});
|
|
68
|
-
this.
|
|
66
|
+
this.setState({ filters: updatedFilters });
|
|
69
67
|
}
|
|
70
68
|
_removeFilter(filter) {
|
|
71
69
|
if (filter === this.state._wip) {
|
|
72
70
|
this.setState({ _wip: void 0 });
|
|
73
71
|
return;
|
|
74
72
|
}
|
|
75
|
-
this.
|
|
76
|
-
}
|
|
77
|
-
updateFilters(filters) {
|
|
78
|
-
this.setState({ filters });
|
|
79
|
-
this._runSceneQueries();
|
|
73
|
+
this.setState({ filters: this.state.filters.filter((f) => f !== filter) });
|
|
80
74
|
}
|
|
81
75
|
async _getKeys(currentKey) {
|
|
82
76
|
var _a, _b;
|
|
@@ -121,40 +115,6 @@ class AdHocFilterSet extends SceneObjectBase {
|
|
|
121
115
|
value
|
|
122
116
|
}));
|
|
123
117
|
}
|
|
124
|
-
_runSceneQueries() {
|
|
125
|
-
if (this.state.applyMode === "manual") {
|
|
126
|
-
return;
|
|
127
|
-
}
|
|
128
|
-
const startingPoint = this.parent;
|
|
129
|
-
if (!startingPoint) {
|
|
130
|
-
console.error("AdHocFiltersVariable could not find a parent scene to broadcast changes to");
|
|
131
|
-
return;
|
|
132
|
-
}
|
|
133
|
-
const ourDS = this._dataSourceSrv.getInstanceSettings(this.state.datasource, this._scopedVars);
|
|
134
|
-
if (!ourDS) {
|
|
135
|
-
console.error("AdHocFiltersVariable ds not found", this.state.datasource);
|
|
136
|
-
return;
|
|
137
|
-
}
|
|
138
|
-
const triggerQueriesRecursive = (startingPoint2) => {
|
|
139
|
-
if (startingPoint2 instanceof SceneQueryRunner && this._isSameDS(ourDS, startingPoint2.state.datasource)) {
|
|
140
|
-
startingPoint2.runQueries();
|
|
141
|
-
} else {
|
|
142
|
-
startingPoint2.forEachChild(triggerQueriesRecursive);
|
|
143
|
-
}
|
|
144
|
-
};
|
|
145
|
-
triggerQueriesRecursive(startingPoint);
|
|
146
|
-
}
|
|
147
|
-
_isSameDS(ourDS, queryRunnerDS) {
|
|
148
|
-
var _a;
|
|
149
|
-
if (this.state.datasource === queryRunnerDS) {
|
|
150
|
-
return true;
|
|
151
|
-
}
|
|
152
|
-
if (((_a = this.state.datasource) == null ? void 0 : _a.uid) === (queryRunnerDS == null ? void 0 : queryRunnerDS.uid)) {
|
|
153
|
-
return true;
|
|
154
|
-
}
|
|
155
|
-
const resolved = this._dataSourceSrv.getInstanceSettings(queryRunnerDS, this._scopedVars);
|
|
156
|
-
return (ourDS == null ? void 0 : ourDS.uid) === (resolved == null ? void 0 : resolved.uid);
|
|
157
|
-
}
|
|
158
118
|
}
|
|
159
119
|
AdHocFilterSet.Component = AdHocFiltersSetRenderer;
|
|
160
120
|
function AdHocFiltersSetRenderer({ model }) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdHocFiltersSet.js","sources":["../../../../src/variables/adhoc/AdHocFiltersSet.tsx"],"sourcesContent":["import { SceneObjectBase } from '../../core/SceneObjectBase';\nimport {\n AdHocVariableFilter,\n DataSourceInstanceSettings,\n GrafanaTheme2,\n MetricFindValue,\n SelectableValue,\n} from '@grafana/data';\nimport { patchGetAdhocFilters } from './patchGetAdhocFilters';\nimport { DataSourceRef } from '@grafana/schema';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { SceneQueryRunner } from '../../querying/SceneQueryRunner';\nimport { SceneComponentProps, SceneObject, SceneObjectState, SceneObjectUrlSyncHandler } from '../../core/types';\nimport { AdHocFiltersVariableUrlSyncHandler } from './AdHocFiltersVariableUrlSyncHandler';\nimport { useStyles2 } from '@grafana/ui';\nimport React from 'react';\nimport { ControlsLabel } from '../../utils/ControlsLabel';\nimport { AdHocFilterRenderer } from './AdHocFilterRenderer';\nimport { AdHocFilterBuilder } from './AdHocFilterBuilder';\nimport { css } from '@emotion/css';\n\nexport interface AdHocFilterSetState extends SceneObjectState {\n /** Defaults to Filters */\n name?: string;\n /** The visible filters */\n filters: AdHocVariableFilter[];\n /** Base filters to always apply when looking up keys*/\n baseFilters?: AdHocVariableFilter[];\n /** Datasource to use for getTagKeys and getTagValues and also controls which scene queries the filters should apply to */\n datasource: DataSourceRef | null;\n /** Controls if the filters can be changed */\n readOnly?: boolean;\n /**\n * Defaults to same-datasource which means filters will automatically be applied to all queries with the same data source as this AdHocFilterSet.\n * In manual mode no queries are re-run on changes, and you have to manually apply the filter to whatever queries you want.\n */\n applyMode?: 'same-datasource' | 'manual';\n /**\n * Extension hook for customizing the key lookup.\n * Return replace: true if you want to override the default lookup\n * Return replace: false if you want to combine the results with the default lookup\n */\n getTagKeysProvider?: getTagKeysProvider;\n /**\n * Extension hook for customizing the value lookup.\n * Return replace: true if you want to override the default lookup.\n * Return replace: false if you want to combine the results with the default lookup\n */\n getTagValuesProvider?: getTagValuesProvider;\n\n /**\n * @internal state of the new filter being added\n */\n _wip?: AdHocVariableFilter;\n}\n\nexport type getTagKeysProvider = (\n set: AdHocFilterSet,\n currentKey: string | null\n) => Promise<{ replace?: boolean; values: MetricFindValue[] }>;\n\nexport type getTagValuesProvider = (\n set: AdHocFilterSet,\n filter: AdHocVariableFilter\n) => Promise<{ replace?: boolean; values: MetricFindValue[] }>;\n\nexport class AdHocFilterSet extends SceneObjectBase<AdHocFilterSetState> {\n static Component = AdHocFiltersSetRenderer;\n\n protected _urlSync: SceneObjectUrlSyncHandler = new AdHocFiltersVariableUrlSyncHandler(this);\n\n private _scopedVars = { __sceneObject: { value: this } };\n private _dataSourceSrv = getDataSourceSrv();\n\n public constructor(initialState: Partial<AdHocFilterSetState>) {\n super({\n name: 'Filters',\n filters: [],\n baseFilters: [],\n datasource: null,\n applyMode: 'same-datasource',\n ...initialState,\n });\n\n if (this.state.applyMode === 'same-datasource') {\n patchGetAdhocFilters(this);\n }\n }\n\n public _updateFilter(filter: AdHocVariableFilter, prop: keyof AdHocVariableFilter, value: string | undefined | null) {\n if (value == null) {\n return;\n }\n\n const { filters, _wip } = this.state;\n\n if (filter === _wip) {\n // If we set value we are done with this \"work in progress\" filter and we can add it\n if (prop === 'value') {\n this.setState({ filters: [...filters, { ..._wip, [prop]: value }], _wip: undefined });\n this._runSceneQueries();\n } else {\n this.setState({ _wip: { ...filter, [prop]: value } });\n }\n return;\n }\n\n const updatedFilters = this.state.filters.map((f) => {\n if (f === filter) {\n return { ...f, [prop]: value };\n }\n return f;\n });\n\n this.updateFilters(updatedFilters);\n }\n\n public _removeFilter(filter: AdHocVariableFilter) {\n if (filter === this.state._wip) {\n this.setState({ _wip: undefined });\n return;\n }\n\n this.updateFilters(this.state.filters.filter((f) => f !== filter));\n }\n\n public updateFilters(filters: AdHocVariableFilter[]) {\n this.setState({ filters });\n this._runSceneQueries();\n }\n\n /**\n * Get possible keys given current filters. Do not call from plugins directly\n */\n public async _getKeys(currentKey: string | null): Promise<Array<SelectableValue<string>>> {\n const override = await this.state.getTagKeysProvider?.(this, currentKey);\n\n if (override && override.replace) {\n return override.values.map(toSelectableValue);\n }\n\n const ds = await this._dataSourceSrv.get(this.state.datasource, this._scopedVars);\n if (!ds || !ds.getTagKeys) {\n return [];\n }\n\n const otherFilters = this.state.filters.filter((f) => f.key !== currentKey).concat(this.state.baseFilters!);\n let keys = await ds.getTagKeys({ filters: otherFilters });\n\n if (override) {\n keys = keys.concat(override.values);\n }\n\n return keys.map(toSelectableValue);\n }\n\n /**\n * Get possible key values for a specific key given current filters. Do not call from plugins directly\n */\n public async _getValuesFor(filter: AdHocVariableFilter): Promise<Array<SelectableValue<string>>> {\n const override = await this.state.getTagValuesProvider?.(this, filter);\n\n if (override && override.replace) {\n return override.values.map(toSelectableValue);\n }\n\n const ds = await this._dataSourceSrv.get(this.state.datasource, this._scopedVars);\n\n if (!ds || !ds.getTagValues) {\n return [];\n }\n\n // Filter out the current filter key from the list of all filters\n const otherFilters = this.state.filters.filter((f) => f.key !== filter.key).concat(this.state.baseFilters!);\n let values = await ds.getTagValues({ key: filter.key, filters: otherFilters });\n\n if (override) {\n values = values.concat(override.values);\n }\n\n return values.map(toSelectableValue);\n }\n\n public _addWip() {\n this.setState({ _wip: { key: '', value: '', operator: '=', condition: '' } });\n }\n\n public _getOperators() {\n return ['=', '!=', '<', '>', '=~', '!~'].map<SelectableValue<string>>((value) => ({\n label: value,\n value,\n }));\n }\n\n private _runSceneQueries() {\n // In manual mode we do not trigger any queries\n if (this.state.applyMode === 'manual') {\n return;\n }\n\n const startingPoint = this.parent;\n if (!startingPoint) {\n console.error('AdHocFiltersVariable could not find a parent scene to broadcast changes to');\n return;\n }\n\n const ourDS = this._dataSourceSrv.getInstanceSettings(this.state.datasource, this._scopedVars);\n if (!ourDS) {\n console.error('AdHocFiltersVariable ds not found', this.state.datasource);\n return;\n }\n\n const triggerQueriesRecursive = (startingPoint: SceneObject) => {\n if (startingPoint instanceof SceneQueryRunner && this._isSameDS(ourDS, startingPoint.state.datasource)) {\n startingPoint.runQueries();\n } else {\n startingPoint.forEachChild(triggerQueriesRecursive);\n }\n };\n\n triggerQueriesRecursive(startingPoint);\n }\n\n private _isSameDS(ourDS: DataSourceInstanceSettings, queryRunnerDS: DataSourceRef | null | undefined) {\n // This function does some initial checks to try to avoid haing to call _dataSourceSrv.getInstanceSettings\n // Which is only needed when queryRunner is using data source variable but the adhoc filter is not\n\n if (this.state.datasource === queryRunnerDS) {\n return true;\n }\n\n // This works when both are using a variable as well\n if (this.state.datasource?.uid === queryRunnerDS?.uid) {\n return true;\n }\n\n // Finally the fool proof check that works when either we or the query runner is using a variable ds\n const resolved = this._dataSourceSrv.getInstanceSettings(queryRunnerDS, this._scopedVars);\n return ourDS?.uid === resolved?.uid;\n }\n}\n\nexport function AdHocFiltersSetRenderer({ model }: SceneComponentProps<AdHocFilterSet>) {\n const { filters, readOnly } = model.useState();\n const styles = useStyles2(getStyles);\n\n return (\n <div className={styles.wrapper}>\n <ControlsLabel label=\"Filters\" icon=\"filter\" />\n\n {filters.map((filter, index) => (\n <React.Fragment key={index}>\n <AdHocFilterRenderer filter={filter} model={model} />\n </React.Fragment>\n ))}\n\n {!readOnly && <AdHocFilterBuilder model={model} key=\"'builder\" />}\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css({\n display: 'flex',\n gap: theme.spacing(1),\n alignItems: 'center',\n }),\n filterIcon: css({\n color: theme.colors.text.secondary,\n paddingRight: theme.spacing(0.5),\n }),\n});\n\nfunction toSelectableValue({ text, value }: MetricFindValue): SelectableValue<string> {\n return {\n label: text,\n value: String(value ?? text),\n };\n}\n"],"names":["startingPoint"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AdHocFiltersSet.js","sources":["../../../../src/variables/adhoc/AdHocFiltersSet.tsx"],"sourcesContent":["import { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { AdHocVariableFilter, GrafanaTheme2, MetricFindValue, SelectableValue } from '@grafana/data';\nimport { patchGetAdhocFilters } from './patchGetAdhocFilters';\nimport { DataSourceRef } from '@grafana/schema';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { SceneComponentProps, SceneObjectState, SceneObjectUrlSyncHandler } from '../../core/types';\nimport { AdHocFiltersVariableUrlSyncHandler } from './AdHocFiltersVariableUrlSyncHandler';\nimport { useStyles2 } from '@grafana/ui';\nimport React from 'react';\nimport { ControlsLabel } from '../../utils/ControlsLabel';\nimport { AdHocFilterRenderer } from './AdHocFilterRenderer';\nimport { AdHocFilterBuilder } from './AdHocFilterBuilder';\nimport { css } from '@emotion/css';\n\nexport interface AdHocFilterSetState extends SceneObjectState {\n /** Defaults to Filters */\n name?: string;\n /** The visible filters */\n filters: AdHocVariableFilter[];\n /** Base filters to always apply when looking up keys*/\n baseFilters?: AdHocVariableFilter[];\n /** Datasource to use for getTagKeys and getTagValues and also controls which scene queries the filters should apply to */\n datasource: DataSourceRef | null;\n /** Controls if the filters can be changed */\n readOnly?: boolean;\n /**\n * Defaults to same-datasource which means filters will automatically be applied to all queries with the same data source as this AdHocFilterSet.\n * In manual mode no queries are re-run on changes, and you have to manually apply the filter to whatever queries you want.\n */\n applyMode?: 'same-datasource' | 'manual';\n /**\n * Extension hook for customizing the key lookup.\n * Return replace: true if you want to override the default lookup\n * Return replace: false if you want to combine the results with the default lookup\n */\n getTagKeysProvider?: getTagKeysProvider;\n /**\n * Extension hook for customizing the value lookup.\n * Return replace: true if you want to override the default lookup.\n * Return replace: false if you want to combine the results with the default lookup\n */\n getTagValuesProvider?: getTagValuesProvider;\n\n /**\n * @internal state of the new filter being added\n */\n _wip?: AdHocVariableFilter;\n}\n\nexport type getTagKeysProvider = (\n set: AdHocFilterSet,\n currentKey: string | null\n) => Promise<{ replace?: boolean; values: MetricFindValue[] }>;\n\nexport type getTagValuesProvider = (\n set: AdHocFilterSet,\n filter: AdHocVariableFilter\n) => Promise<{ replace?: boolean; values: MetricFindValue[] }>;\n\nexport class AdHocFilterSet extends SceneObjectBase<AdHocFilterSetState> {\n static Component = AdHocFiltersSetRenderer;\n\n protected _urlSync: SceneObjectUrlSyncHandler = new AdHocFiltersVariableUrlSyncHandler(this);\n\n private _scopedVars = { __sceneObject: { value: this } };\n private _dataSourceSrv = getDataSourceSrv();\n\n public constructor(initialState: Partial<AdHocFilterSetState>) {\n super({\n name: 'Filters',\n filters: [],\n baseFilters: [],\n datasource: null,\n applyMode: 'same-datasource',\n ...initialState,\n });\n\n if (this.state.applyMode === 'same-datasource') {\n patchGetAdhocFilters(this);\n }\n }\n\n public _updateFilter(filter: AdHocVariableFilter, prop: keyof AdHocVariableFilter, value: string | undefined | null) {\n if (value == null) {\n return;\n }\n\n const { filters, _wip } = this.state;\n\n if (filter === _wip) {\n // If we set value we are done with this \"work in progress\" filter and we can add it\n if (prop === 'value') {\n this.setState({ filters: [...filters, { ..._wip, [prop]: value }], _wip: undefined });\n } else {\n this.setState({ _wip: { ...filter, [prop]: value } });\n }\n return;\n }\n\n const updatedFilters = this.state.filters.map((f) => {\n if (f === filter) {\n return { ...f, [prop]: value };\n }\n return f;\n });\n\n this.setState({ filters: updatedFilters });\n }\n\n public _removeFilter(filter: AdHocVariableFilter) {\n if (filter === this.state._wip) {\n this.setState({ _wip: undefined });\n return;\n }\n\n this.setState({ filters: this.state.filters.filter((f) => f !== filter) });\n }\n\n /**\n * Get possible keys given current filters. Do not call from plugins directly\n */\n public async _getKeys(currentKey: string | null): Promise<Array<SelectableValue<string>>> {\n const override = await this.state.getTagKeysProvider?.(this, currentKey);\n\n if (override && override.replace) {\n return override.values.map(toSelectableValue);\n }\n\n const ds = await this._dataSourceSrv.get(this.state.datasource, this._scopedVars);\n if (!ds || !ds.getTagKeys) {\n return [];\n }\n\n const otherFilters = this.state.filters.filter((f) => f.key !== currentKey).concat(this.state.baseFilters!);\n let keys = await ds.getTagKeys({ filters: otherFilters });\n\n if (override) {\n keys = keys.concat(override.values);\n }\n\n return keys.map(toSelectableValue);\n }\n\n /**\n * Get possible key values for a specific key given current filters. Do not call from plugins directly\n */\n public async _getValuesFor(filter: AdHocVariableFilter): Promise<Array<SelectableValue<string>>> {\n const override = await this.state.getTagValuesProvider?.(this, filter);\n\n if (override && override.replace) {\n return override.values.map(toSelectableValue);\n }\n\n const ds = await this._dataSourceSrv.get(this.state.datasource, this._scopedVars);\n\n if (!ds || !ds.getTagValues) {\n return [];\n }\n\n // Filter out the current filter key from the list of all filters\n const otherFilters = this.state.filters.filter((f) => f.key !== filter.key).concat(this.state.baseFilters!);\n let values = await ds.getTagValues({ key: filter.key, filters: otherFilters });\n\n if (override) {\n values = values.concat(override.values);\n }\n\n return values.map(toSelectableValue);\n }\n\n public _addWip() {\n this.setState({ _wip: { key: '', value: '', operator: '=', condition: '' } });\n }\n\n public _getOperators() {\n return ['=', '!=', '<', '>', '=~', '!~'].map<SelectableValue<string>>((value) => ({\n label: value,\n value,\n }));\n }\n}\n\nexport function AdHocFiltersSetRenderer({ model }: SceneComponentProps<AdHocFilterSet>) {\n const { filters, readOnly } = model.useState();\n const styles = useStyles2(getStyles);\n\n return (\n <div className={styles.wrapper}>\n <ControlsLabel label=\"Filters\" icon=\"filter\" />\n\n {filters.map((filter, index) => (\n <React.Fragment key={index}>\n <AdHocFilterRenderer filter={filter} model={model} />\n </React.Fragment>\n ))}\n\n {!readOnly && <AdHocFilterBuilder model={model} key=\"'builder\" />}\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css({\n display: 'flex',\n gap: theme.spacing(1),\n alignItems: 'center',\n }),\n filterIcon: css({\n color: theme.colors.text.secondary,\n paddingRight: theme.spacing(0.5),\n }),\n});\n\nfunction toSelectableValue({ text, value }: MetricFindValue): SelectableValue<string> {\n return {\n label: text,\n value: String(value ?? text),\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdHocFiltersVariableUrlSyncHandler.js","sources":["../../../../src/variables/adhoc/AdHocFiltersVariableUrlSyncHandler.ts"],"sourcesContent":["import { AdHocVariableFilter } from '@grafana/data';\nimport { SceneObjectUrlSyncHandler, SceneObjectUrlValue, SceneObjectUrlValues } from '../../core/types';\nimport { AdHocFilterSet } from './AdHocFiltersSet';\n\nexport class AdHocFiltersVariableUrlSyncHandler implements SceneObjectUrlSyncHandler {\n public constructor(private _variable: AdHocFilterSet) {}\n\n private getKey(): string {\n return `var-${this._variable.state.name}`;\n }\n\n public getKeys(): string[] {\n return [this.getKey()];\n }\n\n public getUrlState(): SceneObjectUrlValues {\n let filters = this._variable.state.filters;\n const value = filters.map((filter) => toArray(filter).map(escapeDelimiter).join('|'));\n return { [this.getKey()]: value };\n }\n\n public updateFromUrl(values: SceneObjectUrlValues): void {\n const urlValue = values[this.getKey()];\n\n if (urlValue == null) {\n return;\n }\n\n const filters = deserializeUrlToFilters(urlValue);\n this._variable.
|
|
1
|
+
{"version":3,"file":"AdHocFiltersVariableUrlSyncHandler.js","sources":["../../../../src/variables/adhoc/AdHocFiltersVariableUrlSyncHandler.ts"],"sourcesContent":["import { AdHocVariableFilter } from '@grafana/data';\nimport { SceneObjectUrlSyncHandler, SceneObjectUrlValue, SceneObjectUrlValues } from '../../core/types';\nimport { AdHocFilterSet } from './AdHocFiltersSet';\n\nexport class AdHocFiltersVariableUrlSyncHandler implements SceneObjectUrlSyncHandler {\n public constructor(private _variable: AdHocFilterSet) {}\n\n private getKey(): string {\n return `var-${this._variable.state.name}`;\n }\n\n public getKeys(): string[] {\n return [this.getKey()];\n }\n\n public getUrlState(): SceneObjectUrlValues {\n let filters = this._variable.state.filters;\n const value = filters.map((filter) => toArray(filter).map(escapeDelimiter).join('|'));\n return { [this.getKey()]: value };\n }\n\n public updateFromUrl(values: SceneObjectUrlValues): void {\n const urlValue = values[this.getKey()];\n\n if (urlValue == null) {\n return;\n }\n\n const filters = deserializeUrlToFilters(urlValue);\n this._variable.setState({ filters });\n }\n}\n\nfunction deserializeUrlToFilters(value: SceneObjectUrlValue): AdHocVariableFilter[] {\n if (Array.isArray(value)) {\n const values = value;\n return values.map(toFilter).filter(isFilter);\n }\n\n const filter = toFilter(value);\n return filter === null ? [] : [filter];\n}\n\nfunction escapeDelimiter(value: string | undefined): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n return /\\|/g[Symbol.replace](value, '__gfp__');\n}\n\nfunction unescapeDelimiter(value: string | undefined): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n return /__gfp__/g[Symbol.replace](value, '|');\n}\n\nfunction toArray(filter: AdHocVariableFilter): string[] {\n return [filter.key, filter.operator, filter.value];\n}\n\nfunction toFilter(value: string | number | boolean | undefined | null): AdHocVariableFilter | null {\n if (typeof value !== 'string' || value.length === 0) {\n return null;\n }\n\n const parts = value.split('|').map(unescapeDelimiter);\n\n return {\n key: parts[0],\n operator: parts[1],\n value: parts[2],\n condition: '',\n };\n}\n\nfunction isFilter(filter: AdHocVariableFilter | null): filter is AdHocVariableFilter {\n return filter !== null && typeof filter.key === 'string' && typeof filter.value === 'string';\n}\n"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -732,6 +732,9 @@ declare class SceneQueryRunner extends SceneObjectBase<QueryRunnerState> impleme
|
|
|
732
732
|
private _containerWidth?;
|
|
733
733
|
private _variableValueRecorder;
|
|
734
734
|
private _results;
|
|
735
|
+
private _scopedVars;
|
|
736
|
+
private _adhocFilterSet?;
|
|
737
|
+
private _adhocFilterSub?;
|
|
735
738
|
getResultsStream(): ReplaySubject<SceneDataProviderResult>;
|
|
736
739
|
protected _variableDependency: VariableDependencyConfig<QueryRunnerState>;
|
|
737
740
|
constructor(initialState: QueryRunnerState);
|
|
@@ -761,6 +764,10 @@ declare class SceneQueryRunner extends SceneObjectBase<QueryRunnerState> impleme
|
|
|
761
764
|
* It performs buttom-up search, including shallow search across object children for supporting controls/header actions
|
|
762
765
|
*/
|
|
763
766
|
private getTimeCompare;
|
|
767
|
+
/**
|
|
768
|
+
* Walk up scene graph and find the closest filterset with matching data source
|
|
769
|
+
*/
|
|
770
|
+
private findAndSubscribeToAdhocFilters;
|
|
764
771
|
}
|
|
765
772
|
|
|
766
773
|
interface SceneDataLayersState extends SceneObjectState {
|
|
@@ -1131,7 +1138,6 @@ declare class AdHocFilterSet extends SceneObjectBase<AdHocFilterSetState> {
|
|
|
1131
1138
|
constructor(initialState: Partial<AdHocFilterSetState>);
|
|
1132
1139
|
_updateFilter(filter: AdHocVariableFilter, prop: keyof AdHocVariableFilter, value: string | undefined | null): void;
|
|
1133
1140
|
_removeFilter(filter: AdHocVariableFilter): void;
|
|
1134
|
-
updateFilters(filters: AdHocVariableFilter[]): void;
|
|
1135
1141
|
/**
|
|
1136
1142
|
* Get possible keys given current filters. Do not call from plugins directly
|
|
1137
1143
|
*/
|
|
@@ -1142,8 +1148,6 @@ declare class AdHocFilterSet extends SceneObjectBase<AdHocFilterSetState> {
|
|
|
1142
1148
|
_getValuesFor(filter: AdHocVariableFilter): Promise<Array<SelectableValue<string>>>;
|
|
1143
1149
|
_addWip(): void;
|
|
1144
1150
|
_getOperators(): SelectableValue<string>[];
|
|
1145
|
-
private _runSceneQueries;
|
|
1146
|
-
private _isSameDS;
|
|
1147
1151
|
}
|
|
1148
1152
|
declare function AdHocFiltersSetRenderer({ model }: SceneComponentProps<AdHocFilterSet>): JSX.Element;
|
|
1149
1153
|
|
|
@@ -1321,6 +1325,7 @@ interface SceneTimePickerState extends SceneObjectState {
|
|
|
1321
1325
|
}
|
|
1322
1326
|
declare class SceneTimePicker extends SceneObjectBase<SceneTimePickerState> {
|
|
1323
1327
|
static Component: typeof SceneTimePickerRenderer;
|
|
1328
|
+
onZoom: () => void;
|
|
1324
1329
|
onChangeFiscalYearStartMonth: (month: number) => void;
|
|
1325
1330
|
}
|
|
1326
1331
|
declare function SceneTimePickerRenderer({ model }: SceneComponentProps<SceneTimePicker>): JSX.Element | null;
|