@grafana/scenes 4.26.1--canary.770.9381823391.0 → 4.26.1--canary.770.9383024969.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,13 +1,18 @@
1
- import { rangeUtil, dateTime } from '@grafana/data';
1
+ import { rangeUtil, dateTime, FieldType } from '@grafana/data';
2
+ import { config } from '@grafana/runtime';
2
3
  import { useStyles2, ButtonGroup, ToolbarButton, Checkbox, ButtonSelect } from '@grafana/ui';
3
4
  import React from 'react';
4
5
  import { sceneGraph } from '../core/sceneGraph/index.js';
5
6
  import { SceneObjectBase } from '../core/SceneObjectBase.js';
6
7
  import { SceneObjectUrlSyncConfig } from '../services/SceneObjectUrlSyncConfig.js';
8
+ import { getCompareSeriesRefId } from '../utils/getCompareSeriesRefId.js';
7
9
  import { parseUrlParam } from '../utils/parseUrlParam.js';
8
10
  import { css } from '@emotion/css';
11
+ import { of } from 'rxjs';
9
12
 
10
13
  var __defProp = Object.defineProperty;
14
+ var __defProps = Object.defineProperties;
15
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
11
16
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
12
17
  var __hasOwnProp = Object.prototype.hasOwnProperty;
13
18
  var __propIsEnum = Object.prototype.propertyIsEnumerable;
@@ -23,6 +28,7 @@ var __spreadValues = (a, b) => {
23
28
  }
24
29
  return a;
25
30
  };
31
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
26
32
  const PREVIOUS_PERIOD_VALUE = "__previousPeriod";
27
33
  const NO_PERIOD_VALUE = "__noPeriod";
28
34
  const PREVIOUS_PERIOD_COMPARE_OPTION = {
@@ -80,6 +86,27 @@ class SceneTimeRangeCompare extends SceneObjectBase {
80
86
  };
81
87
  this.addActivationHandler(this._onActivate);
82
88
  }
89
+ getExtraQueries(request) {
90
+ const extraQueries = [];
91
+ const compareRange = this.getCompareTimeRange(request.range);
92
+ if (!compareRange) {
93
+ return extraQueries;
94
+ }
95
+ const targets = request.targets.filter((query) => query.timeRangeCompare !== false);
96
+ if (targets.length) {
97
+ extraQueries.push({
98
+ req: __spreadProps(__spreadValues({}, request), {
99
+ targets,
100
+ range: compareRange
101
+ }),
102
+ processor: timeShiftAlignmentProcessor
103
+ });
104
+ }
105
+ return extraQueries;
106
+ }
107
+ shouldRerun(prev, next) {
108
+ return prev.compareWith !== next.compareWith;
109
+ }
83
110
  getCompareTimeRange(timeRange) {
84
111
  let compareFrom;
85
112
  let compareTo;
@@ -128,6 +155,33 @@ class SceneTimeRangeCompare extends SceneObjectBase {
128
155
  }
129
156
  }
130
157
  SceneTimeRangeCompare.Component = SceneTimeRangeCompareRenderer;
158
+ const timeShiftAlignmentProcessor = (primary, secondary) => {
159
+ const diff = secondary.timeRange.from.diff(primary.timeRange.from);
160
+ secondary.series.forEach((series) => {
161
+ series.refId = getCompareSeriesRefId(series.refId || "");
162
+ series.meta = __spreadProps(__spreadValues({}, series.meta), {
163
+ timeCompare: {
164
+ diffMs: diff,
165
+ isTimeShiftQuery: true
166
+ }
167
+ });
168
+ series.fields.forEach((field) => {
169
+ if (field.type === FieldType.time) {
170
+ field.values = field.values.map((v) => {
171
+ return diff < 0 ? v - diff : v + diff;
172
+ });
173
+ }
174
+ field.config = __spreadProps(__spreadValues({}, field.config), {
175
+ color: {
176
+ mode: "fixed",
177
+ fixedColor: config.theme.palette.gray60
178
+ }
179
+ });
180
+ return field;
181
+ });
182
+ });
183
+ return of(secondary);
184
+ };
131
185
  function SceneTimeRangeCompareRenderer({ model }) {
132
186
  var _a;
133
187
  const styles = useStyles2(getStyles);
@@ -1 +1 @@
1
- {"version":3,"file":"SceneTimeRangeCompare.js","sources":["../../../src/components/SceneTimeRangeCompare.tsx"],"sourcesContent":["import { DateTime, dateTime, GrafanaTheme2, rangeUtil, TimeRange } from '@grafana/data';\nimport { ButtonGroup, ButtonSelect, Checkbox, ToolbarButton, useStyles2 } from '@grafana/ui';\nimport React from 'react';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { SceneComponentProps, SceneObjectState, SceneObjectUrlValues } from '../core/types';\nimport { SceneObjectUrlSyncConfig } from '../services/SceneObjectUrlSyncConfig';\nimport { parseUrlParam } from '../utils/parseUrlParam';\nimport { css } from '@emotion/css';\n\nexport interface TimeRangeCompareProvider {\n getCompareTimeRange(timeRange: TimeRange): TimeRange | undefined;\n}\n\ninterface SceneTimeRangeCompareState extends SceneObjectState {\n compareWith?: string;\n compareOptions: Array<{ label: string; value: string }>;\n}\n\nconst PREVIOUS_PERIOD_VALUE = '__previousPeriod';\nconst NO_PERIOD_VALUE = '__noPeriod';\n\nexport const PREVIOUS_PERIOD_COMPARE_OPTION = {\n label: 'Previous period',\n value: PREVIOUS_PERIOD_VALUE,\n};\n\nexport const NO_COMPARE_OPTION = {\n label: 'No comparison',\n value: NO_PERIOD_VALUE,\n};\n\nexport const DEFAULT_COMPARE_OPTIONS = [\n { label: 'Day before', value: '24h' },\n { label: 'Week before', value: '1w' },\n { label: 'Month before', value: '1M' },\n];\n\nexport class SceneTimeRangeCompare\n extends SceneObjectBase<SceneTimeRangeCompareState>\n implements TimeRangeCompareProvider\n{\n static Component = SceneTimeRangeCompareRenderer;\n protected _urlSync = new SceneObjectUrlSyncConfig(this, { keys: ['compareWith'] });\n\n public constructor(state: Partial<SceneTimeRangeCompareState>) {\n super({ compareOptions: DEFAULT_COMPARE_OPTIONS, ...state });\n this.addActivationHandler(this._onActivate);\n }\n\n private _onActivate = () => {\n const sceneTimeRange = sceneGraph.getTimeRange(this);\n this.setState({ compareOptions: this.getCompareOptions(sceneTimeRange.state.value) });\n\n this._subs.add(\n sceneTimeRange.subscribeToState((timeRange) => {\n const compareOptions = this.getCompareOptions(timeRange.value);\n const stateUpdate: Partial<SceneTimeRangeCompareState> = { compareOptions };\n\n // if current compareWith is not applicable to the new time range, set it to previous period comparison\n if (Boolean(this.state.compareWith) && !compareOptions.find(({ value }) => value === this.state.compareWith)) {\n stateUpdate.compareWith = PREVIOUS_PERIOD_VALUE;\n }\n\n this.setState(stateUpdate);\n })\n );\n };\n\n public getCompareOptions = (timeRange: TimeRange) => {\n const diffDays = Math.ceil(timeRange.to.diff(timeRange.from));\n\n const matchIndex = DEFAULT_COMPARE_OPTIONS.findIndex(({ value }) => {\n const intervalInMs = rangeUtil.intervalToMs(value);\n return intervalInMs >= diffDays;\n });\n\n return [\n NO_COMPARE_OPTION,\n PREVIOUS_PERIOD_COMPARE_OPTION,\n ...DEFAULT_COMPARE_OPTIONS.slice(matchIndex).map(({ label, value }) => ({ label, value })),\n ];\n };\n\n public onCompareWithChanged = (compareWith: string) => {\n if (compareWith === NO_PERIOD_VALUE) {\n this.onClearCompare();\n } else {\n this.setState({ compareWith });\n }\n };\n\n public onClearCompare = () => {\n this.setState({ compareWith: undefined });\n };\n\n public getCompareTimeRange(timeRange: TimeRange): TimeRange | undefined {\n let compareFrom: DateTime;\n let compareTo: DateTime;\n\n if (this.state.compareWith) {\n if (this.state.compareWith === PREVIOUS_PERIOD_VALUE) {\n const diffMs = timeRange.to.diff(timeRange.from);\n compareFrom = dateTime(timeRange.from!).subtract(diffMs);\n compareTo = dateTime(timeRange.to!).subtract(diffMs);\n } else {\n compareFrom = dateTime(timeRange.from!).subtract(rangeUtil.intervalToMs(this.state.compareWith));\n compareTo = dateTime(timeRange.to!).subtract(rangeUtil.intervalToMs(this.state.compareWith));\n }\n return {\n from: compareFrom,\n to: compareTo,\n raw: {\n from: compareFrom,\n to: compareTo,\n },\n };\n }\n\n return undefined;\n }\n\n public getUrlState(): SceneObjectUrlValues {\n return {\n compareWith: this.state.compareWith,\n };\n }\n\n public updateFromUrl(values: SceneObjectUrlValues) {\n if (!values.compareWith) {\n return;\n }\n\n const compareWith = parseUrlParam(values.compareWith);\n\n if (compareWith) {\n const compareOptions = this.getCompareOptions(sceneGraph.getTimeRange(this).state.value);\n\n if (compareOptions.find(({ value }) => value === compareWith)) {\n this.setState({\n compareWith,\n });\n } else {\n this.setState({\n compareWith: '__previousPeriod',\n });\n }\n }\n }\n}\n\nfunction SceneTimeRangeCompareRenderer({ model }: SceneComponentProps<SceneTimeRangeCompare>) {\n const styles = useStyles2(getStyles);\n const { compareWith, compareOptions } = model.useState();\n\n const [previousCompare, setPreviousCompare] = React.useState(compareWith);\n const previousValue = compareOptions.find(({ value }) => value === previousCompare) ?? PREVIOUS_PERIOD_COMPARE_OPTION;\n\n const value = compareOptions.find(({ value }) => value === compareWith);\n const enabled = Boolean(value);\n\n const onClick = () => {\n if (enabled) {\n setPreviousCompare(compareWith);\n model.onClearCompare();\n } else if (!enabled) {\n model.onCompareWithChanged(previousValue.value);\n }\n };\n\n return (\n <ButtonGroup>\n <ToolbarButton\n variant=\"canvas\"\n tooltip=\"Enable time frame comparison\"\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n onClick();\n }}\n >\n <Checkbox label=\" \" value={enabled} onClick={onClick} />\n Comparison\n </ToolbarButton>\n\n {enabled ? (\n <ButtonSelect\n variant=\"canvas\"\n value={value}\n options={compareOptions}\n onChange={(v) => {\n model.onCompareWithChanged(v.value!);\n }}\n />\n ) : (\n <ToolbarButton className={styles.previewButton} disabled variant=\"canvas\" isOpen={false}>\n {previousValue.label}\n </ToolbarButton>\n )}\n </ButtonGroup>\n );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n previewButton: css({\n '&:disabled': {\n border: `1px solid ${theme.colors.secondary.border}`,\n color: theme.colors.text.disabled,\n opacity: 1,\n },\n }),\n };\n}\n"],"names":["value"],"mappings":"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"}
1
+ {"version":3,"file":"SceneTimeRangeCompare.js","sources":["../../../src/components/SceneTimeRangeCompare.tsx"],"sourcesContent":["import { DataQueryRequest, DateTime, dateTime, FieldType, GrafanaTheme2, rangeUtil, TimeRange } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { ButtonGroup, ButtonSelect, Checkbox, ToolbarButton, useStyles2 } from '@grafana/ui';\nimport React from 'react';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { SceneComponentProps, SceneObjectState, SceneObjectUrlValues } from '../core/types';\nimport { DataQueryExtended } from '../querying/SceneQueryRunner';\nimport { ExtraQueryDescriptor, ExtraQueryDataProcessor, ExtraQueryProvider } from '../querying/ExtraQueryProvider';\nimport { SceneObjectUrlSyncConfig } from '../services/SceneObjectUrlSyncConfig';\nimport { getCompareSeriesRefId } from '../utils/getCompareSeriesRefId';\nimport { parseUrlParam } from '../utils/parseUrlParam';\nimport { css } from '@emotion/css';\nimport { of } from 'rxjs';\n\ninterface SceneTimeRangeCompareState extends SceneObjectState {\n compareWith?: string;\n compareOptions: Array<{ label: string; value: string }>;\n}\n\nconst PREVIOUS_PERIOD_VALUE = '__previousPeriod';\nconst NO_PERIOD_VALUE = '__noPeriod';\n\nexport const PREVIOUS_PERIOD_COMPARE_OPTION = {\n label: 'Previous period',\n value: PREVIOUS_PERIOD_VALUE,\n};\n\nexport const NO_COMPARE_OPTION = {\n label: 'No comparison',\n value: NO_PERIOD_VALUE,\n};\n\nexport const DEFAULT_COMPARE_OPTIONS = [\n { label: 'Day before', value: '24h' },\n { label: 'Week before', value: '1w' },\n { label: 'Month before', value: '1M' },\n];\n\nexport class SceneTimeRangeCompare\n extends SceneObjectBase<SceneTimeRangeCompareState>\n implements ExtraQueryProvider<SceneTimeRangeCompareState> {\n\n static Component = SceneTimeRangeCompareRenderer;\n protected _urlSync = new SceneObjectUrlSyncConfig(this, { keys: ['compareWith'] });\n\n public constructor(state: Partial<SceneTimeRangeCompareState>) {\n super({ compareOptions: DEFAULT_COMPARE_OPTIONS, ...state });\n this.addActivationHandler(this._onActivate);\n }\n\n private _onActivate = () => {\n const sceneTimeRange = sceneGraph.getTimeRange(this);\n this.setState({ compareOptions: this.getCompareOptions(sceneTimeRange.state.value) });\n\n this._subs.add(\n sceneTimeRange.subscribeToState((timeRange) => {\n const compareOptions = this.getCompareOptions(timeRange.value);\n const stateUpdate: Partial<SceneTimeRangeCompareState> = { compareOptions };\n\n // if current compareWith is not applicable to the new time range, set it to previous period comparison\n if (Boolean(this.state.compareWith) && !compareOptions.find(({ value }) => value === this.state.compareWith)) {\n stateUpdate.compareWith = PREVIOUS_PERIOD_VALUE;\n }\n\n this.setState(stateUpdate);\n })\n );\n };\n\n public getCompareOptions = (timeRange: TimeRange) => {\n const diffDays = Math.ceil(timeRange.to.diff(timeRange.from));\n\n const matchIndex = DEFAULT_COMPARE_OPTIONS.findIndex(({ value }) => {\n const intervalInMs = rangeUtil.intervalToMs(value);\n return intervalInMs >= diffDays;\n });\n\n return [\n NO_COMPARE_OPTION,\n PREVIOUS_PERIOD_COMPARE_OPTION,\n ...DEFAULT_COMPARE_OPTIONS.slice(matchIndex).map(({ label, value }) => ({ label, value })),\n ];\n };\n\n public onCompareWithChanged = (compareWith: string) => {\n if (compareWith === NO_PERIOD_VALUE) {\n this.onClearCompare();\n } else {\n this.setState({ compareWith });\n }\n };\n\n public onClearCompare = () => {\n this.setState({ compareWith: undefined });\n };\n\n // Get a time shifted request to compare with the primary request.\n public getExtraQueries(request: DataQueryRequest): ExtraQueryDescriptor[] {\n const extraQueries: ExtraQueryDescriptor[] = [];\n const compareRange = this.getCompareTimeRange(request.range);\n if (!compareRange) {\n return extraQueries;\n }\n\n const targets = request.targets.filter((query: DataQueryExtended) => query.timeRangeCompare !== false);\n if (targets.length) {\n extraQueries.push({\n req: {\n ...request,\n targets,\n range: compareRange,\n },\n processor: timeShiftAlignmentProcessor,\n });\n }\n return extraQueries;\n }\n\n // The query runner should rerun the comparison query if the compareWith value has changed.\n public shouldRerun(prev: SceneTimeRangeCompareState, next: SceneTimeRangeCompareState): boolean {\n return prev.compareWith !== next.compareWith;\n }\n\n public getCompareTimeRange(timeRange: TimeRange): TimeRange | undefined {\n let compareFrom: DateTime;\n let compareTo: DateTime;\n\n if (this.state.compareWith) {\n if (this.state.compareWith === PREVIOUS_PERIOD_VALUE) {\n const diffMs = timeRange.to.diff(timeRange.from);\n compareFrom = dateTime(timeRange.from!).subtract(diffMs);\n compareTo = dateTime(timeRange.to!).subtract(diffMs);\n } else {\n compareFrom = dateTime(timeRange.from!).subtract(rangeUtil.intervalToMs(this.state.compareWith));\n compareTo = dateTime(timeRange.to!).subtract(rangeUtil.intervalToMs(this.state.compareWith));\n }\n return {\n from: compareFrom,\n to: compareTo,\n raw: {\n from: compareFrom,\n to: compareTo,\n },\n };\n }\n\n return undefined;\n }\n\n public getUrlState(): SceneObjectUrlValues {\n return {\n compareWith: this.state.compareWith,\n };\n }\n\n public updateFromUrl(values: SceneObjectUrlValues) {\n if (!values.compareWith) {\n return;\n }\n\n const compareWith = parseUrlParam(values.compareWith);\n\n if (compareWith) {\n const compareOptions = this.getCompareOptions(sceneGraph.getTimeRange(this).state.value);\n\n if (compareOptions.find(({ value }) => value === compareWith)) {\n this.setState({\n compareWith,\n });\n } else {\n this.setState({\n compareWith: '__previousPeriod',\n });\n }\n }\n }\n}\n\n// Processor function for use with time shifted comparison series.\n// This aligns the secondary series with the primary and adds custom\n// metadata and config to the secondary series' fields so that it is\n// rendered appropriately.\nconst timeShiftAlignmentProcessor: ExtraQueryDataProcessor = (primary, secondary) => {\n const diff = secondary.timeRange.from.diff(primary.timeRange.from);\n secondary.series.forEach((series) => {\n series.refId = getCompareSeriesRefId(series.refId || '');\n series.meta = {\n ...series.meta,\n // @ts-ignore Remove when https://github.com/grafana/grafana/pull/71129 is released\n timeCompare: {\n diffMs: diff,\n isTimeShiftQuery: true,\n },\n };\n series.fields.forEach((field) => {\n // Align compare series time stamps with reference series\n if (field.type === FieldType.time) {\n field.values = field.values.map((v) => {\n return diff < 0 ? v - diff : v + diff;\n });\n }\n\n field.config = {\n ...field.config,\n color: {\n mode: 'fixed',\n fixedColor: config.theme.palette.gray60,\n },\n };\n return field;\n });\n });\n return of(secondary);\n}\n\nfunction SceneTimeRangeCompareRenderer({ model }: SceneComponentProps<SceneTimeRangeCompare>) {\n const styles = useStyles2(getStyles);\n const { compareWith, compareOptions } = model.useState();\n\n const [previousCompare, setPreviousCompare] = React.useState(compareWith);\n const previousValue = compareOptions.find(({ value }) => value === previousCompare) ?? PREVIOUS_PERIOD_COMPARE_OPTION;\n\n const value = compareOptions.find(({ value }) => value === compareWith);\n const enabled = Boolean(value);\n\n const onClick = () => {\n if (enabled) {\n setPreviousCompare(compareWith);\n model.onClearCompare();\n } else if (!enabled) {\n model.onCompareWithChanged(previousValue.value);\n }\n };\n\n return (\n <ButtonGroup>\n <ToolbarButton\n variant=\"canvas\"\n tooltip=\"Enable time frame comparison\"\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n onClick();\n }}\n >\n <Checkbox label=\" \" value={enabled} onClick={onClick} />\n Comparison\n </ToolbarButton>\n\n {enabled ? (\n <ButtonSelect\n variant=\"canvas\"\n value={value}\n options={compareOptions}\n onChange={(v) => {\n model.onCompareWithChanged(v.value!);\n }}\n />\n ) : (\n <ToolbarButton className={styles.previewButton} disabled variant=\"canvas\" isOpen={false}>\n {previousValue.label}\n </ToolbarButton>\n )}\n </ButtonGroup>\n );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n previewButton: css({\n '&:disabled': {\n border: `1px solid ${theme.colors.secondary.border}`,\n color: theme.colors.text.disabled,\n opacity: 1,\n },\n }),\n };\n}\n"],"names":["value"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBA,MAAM,qBAAwB,GAAA,kBAAA,CAAA;AAC9B,MAAM,eAAkB,GAAA,YAAA,CAAA;AAEjB,MAAM,8BAAiC,GAAA;AAAA,EAC5C,KAAO,EAAA,iBAAA;AAAA,EACP,KAAO,EAAA,qBAAA;AACT,EAAA;AAEO,MAAM,iBAAoB,GAAA;AAAA,EAC/B,KAAO,EAAA,eAAA;AAAA,EACP,KAAO,EAAA,eAAA;AACT,EAAA;AAEO,MAAM,uBAA0B,GAAA;AAAA,EACrC,EAAE,KAAA,EAAO,YAAc,EAAA,KAAA,EAAO,KAAM,EAAA;AAAA,EACpC,EAAE,KAAA,EAAO,aAAe,EAAA,KAAA,EAAO,IAAK,EAAA;AAAA,EACpC,EAAE,KAAA,EAAO,cAAgB,EAAA,KAAA,EAAO,IAAK,EAAA;AACvC,EAAA;AAEO,MAAM,8BACH,eACkD,CAAA;AAAA,EAKnD,YAAY,KAA4C,EAAA;AAC7D,IAAM,KAAA,CAAA,cAAA,CAAA,EAAE,cAAgB,EAAA,uBAAA,EAAA,EAA4B,KAAO,CAAA,CAAA,CAAA;AAH7D,IAAU,IAAA,CAAA,QAAA,GAAW,IAAI,wBAAyB,CAAA,IAAA,EAAM,EAAE,IAAM,EAAA,CAAC,aAAa,CAAA,EAAG,CAAA,CAAA;AAOjF,IAAA,IAAA,CAAQ,cAAc,MAAM;AAC1B,MAAM,MAAA,cAAA,GAAiB,UAAW,CAAA,YAAA,CAAa,IAAI,CAAA,CAAA;AACnD,MAAK,IAAA,CAAA,QAAA,CAAS,EAAE,cAAgB,EAAA,IAAA,CAAK,kBAAkB,cAAe,CAAA,KAAA,CAAM,KAAK,CAAA,EAAG,CAAA,CAAA;AAEpF,MAAA,IAAA,CAAK,KAAM,CAAA,GAAA;AAAA,QACT,cAAA,CAAe,gBAAiB,CAAA,CAAC,SAAc,KAAA;AAC7C,UAAA,MAAM,cAAiB,GAAA,IAAA,CAAK,iBAAkB,CAAA,SAAA,CAAU,KAAK,CAAA,CAAA;AAC7D,UAAM,MAAA,WAAA,GAAmD,EAAE,cAAe,EAAA,CAAA;AAG1E,UAAA,IAAI,QAAQ,IAAK,CAAA,KAAA,CAAM,WAAW,CAAA,IAAK,CAAC,cAAe,CAAA,IAAA,CAAK,CAAC,EAAE,OAAY,KAAA,KAAA,KAAU,IAAK,CAAA,KAAA,CAAM,WAAW,CAAG,EAAA;AAC5G,YAAA,WAAA,CAAY,WAAc,GAAA,qBAAA,CAAA;AAAA,WAC5B;AAEA,UAAA,IAAA,CAAK,SAAS,WAAW,CAAA,CAAA;AAAA,SAC1B,CAAA;AAAA,OACH,CAAA;AAAA,KACF,CAAA;AAEA,IAAO,IAAA,CAAA,iBAAA,GAAoB,CAAC,SAAyB,KAAA;AACnD,MAAM,MAAA,QAAA,GAAW,KAAK,IAAK,CAAA,SAAA,CAAU,GAAG,IAAK,CAAA,SAAA,CAAU,IAAI,CAAC,CAAA,CAAA;AAE5D,MAAA,MAAM,aAAa,uBAAwB,CAAA,SAAA,CAAU,CAAC,EAAE,OAAY,KAAA;AAClE,QAAM,MAAA,YAAA,GAAe,SAAU,CAAA,YAAA,CAAa,KAAK,CAAA,CAAA;AACjD,QAAA,OAAO,YAAgB,IAAA,QAAA,CAAA;AAAA,OACxB,CAAA,CAAA;AAED,MAAO,OAAA;AAAA,QACL,iBAAA;AAAA,QACA,8BAAA;AAAA,QACA,GAAG,uBAAA,CAAwB,KAAM,CAAA,UAAU,EAAE,GAAI,CAAA,CAAC,EAAE,KAAA,EAAO,KAAM,EAAA,MAAO,EAAE,KAAA,EAAO,OAAQ,CAAA,CAAA;AAAA,OAC3F,CAAA;AAAA,KACF,CAAA;AAEA,IAAO,IAAA,CAAA,oBAAA,GAAuB,CAAC,WAAwB,KAAA;AACrD,MAAA,IAAI,gBAAgB,eAAiB,EAAA;AACnC,QAAA,IAAA,CAAK,cAAe,EAAA,CAAA;AAAA,OACf,MAAA;AACL,QAAK,IAAA,CAAA,QAAA,CAAS,EAAE,WAAA,EAAa,CAAA,CAAA;AAAA,OAC/B;AAAA,KACF,CAAA;AAEA,IAAA,IAAA,CAAO,iBAAiB,MAAM;AAC5B,MAAA,IAAA,CAAK,QAAS,CAAA,EAAE,WAAa,EAAA,KAAA,CAAA,EAAW,CAAA,CAAA;AAAA,KAC1C,CAAA;AA/CE,IAAK,IAAA,CAAA,oBAAA,CAAqB,KAAK,WAAW,CAAA,CAAA;AAAA,GAC5C;AAAA,EAiDO,gBAAgB,OAAmD,EAAA;AACxE,IAAA,MAAM,eAAuC,EAAC,CAAA;AAC9C,IAAA,MAAM,YAAe,GAAA,IAAA,CAAK,mBAAoB,CAAA,OAAA,CAAQ,KAAK,CAAA,CAAA;AAC3D,IAAA,IAAI,CAAC,YAAc,EAAA;AACjB,MAAO,OAAA,YAAA,CAAA;AAAA,KACT;AAEA,IAAM,MAAA,OAAA,GAAU,QAAQ,OAAQ,CAAA,MAAA,CAAO,CAAC,KAA6B,KAAA,KAAA,CAAM,qBAAqB,KAAK,CAAA,CAAA;AACrG,IAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,MAAA,YAAA,CAAa,IAAK,CAAA;AAAA,QAChB,GAAA,EAAK,iCACA,OADA,CAAA,EAAA;AAAA,UAEH,OAAA;AAAA,UACA,KAAO,EAAA,YAAA;AAAA,SACT,CAAA;AAAA,QACA,SAAW,EAAA,2BAAA;AAAA,OACZ,CAAA,CAAA;AAAA,KACH;AACA,IAAO,OAAA,YAAA,CAAA;AAAA,GACT;AAAA,EAGO,WAAA,CAAY,MAAkC,IAA2C,EAAA;AAC9F,IAAO,OAAA,IAAA,CAAK,gBAAgB,IAAK,CAAA,WAAA,CAAA;AAAA,GACnC;AAAA,EAEO,oBAAoB,SAA6C,EAAA;AACtE,IAAI,IAAA,WAAA,CAAA;AACJ,IAAI,IAAA,SAAA,CAAA;AAEJ,IAAI,IAAA,IAAA,CAAK,MAAM,WAAa,EAAA;AAC1B,MAAI,IAAA,IAAA,CAAK,KAAM,CAAA,WAAA,KAAgB,qBAAuB,EAAA;AACpD,QAAA,MAAM,MAAS,GAAA,SAAA,CAAU,EAAG,CAAA,IAAA,CAAK,UAAU,IAAI,CAAA,CAAA;AAC/C,QAAA,WAAA,GAAc,QAAS,CAAA,SAAA,CAAU,IAAK,CAAA,CAAE,SAAS,MAAM,CAAA,CAAA;AACvD,QAAA,SAAA,GAAY,QAAS,CAAA,SAAA,CAAU,EAAG,CAAA,CAAE,SAAS,MAAM,CAAA,CAAA;AAAA,OAC9C,MAAA;AACL,QAAc,WAAA,GAAA,QAAA,CAAS,SAAU,CAAA,IAAK,CAAE,CAAA,QAAA,CAAS,UAAU,YAAa,CAAA,IAAA,CAAK,KAAM,CAAA,WAAW,CAAC,CAAA,CAAA;AAC/F,QAAY,SAAA,GAAA,QAAA,CAAS,SAAU,CAAA,EAAG,CAAE,CAAA,QAAA,CAAS,UAAU,YAAa,CAAA,IAAA,CAAK,KAAM,CAAA,WAAW,CAAC,CAAA,CAAA;AAAA,OAC7F;AACA,MAAO,OAAA;AAAA,QACL,IAAM,EAAA,WAAA;AAAA,QACN,EAAI,EAAA,SAAA;AAAA,QACJ,GAAK,EAAA;AAAA,UACH,IAAM,EAAA,WAAA;AAAA,UACN,EAAI,EAAA,SAAA;AAAA,SACN;AAAA,OACF,CAAA;AAAA,KACF;AAEA,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACT;AAAA,EAEO,WAAoC,GAAA;AACzC,IAAO,OAAA;AAAA,MACL,WAAA,EAAa,KAAK,KAAM,CAAA,WAAA;AAAA,KAC1B,CAAA;AAAA,GACF;AAAA,EAEO,cAAc,MAA8B,EAAA;AACjD,IAAI,IAAA,CAAC,OAAO,WAAa,EAAA;AACvB,MAAA,OAAA;AAAA,KACF;AAEA,IAAM,MAAA,WAAA,GAAc,aAAc,CAAA,MAAA,CAAO,WAAW,CAAA,CAAA;AAEpD,IAAA,IAAI,WAAa,EAAA;AACf,MAAM,MAAA,cAAA,GAAiB,KAAK,iBAAkB,CAAA,UAAA,CAAW,aAAa,IAAI,CAAA,CAAE,MAAM,KAAK,CAAA,CAAA;AAEvF,MAAI,IAAA,cAAA,CAAe,KAAK,CAAC,EAAE,OAAY,KAAA,KAAA,KAAU,WAAW,CAAG,EAAA;AAC7D,QAAA,IAAA,CAAK,QAAS,CAAA;AAAA,UACZ,WAAA;AAAA,SACD,CAAA,CAAA;AAAA,OACI,MAAA;AACL,QAAA,IAAA,CAAK,QAAS,CAAA;AAAA,UACZ,WAAa,EAAA,kBAAA;AAAA,SACd,CAAA,CAAA;AAAA,OACH;AAAA,KACF;AAAA,GACF;AACF,CAAA;AA1Ia,qBAAA,CAIJ,SAAY,GAAA,6BAAA,CAAA;AA4IrB,MAAM,2BAAA,GAAuD,CAAC,OAAA,EAAS,SAAc,KAAA;AACnF,EAAA,MAAM,OAAO,SAAU,CAAA,SAAA,CAAU,KAAK,IAAK,CAAA,OAAA,CAAQ,UAAU,IAAI,CAAA,CAAA;AACjE,EAAU,SAAA,CAAA,MAAA,CAAO,OAAQ,CAAA,CAAC,MAAW,KAAA;AACnC,IAAA,MAAA,CAAO,KAAQ,GAAA,qBAAA,CAAsB,MAAO,CAAA,KAAA,IAAS,EAAE,CAAA,CAAA;AACvD,IAAO,MAAA,CAAA,IAAA,GAAO,aACT,CAAA,cAAA,CAAA,EAAA,EAAA,MAAA,CAAO,IADE,CAAA,EAAA;AAAA,MAGZ,WAAa,EAAA;AAAA,QACX,MAAQ,EAAA,IAAA;AAAA,QACR,gBAAkB,EAAA,IAAA;AAAA,OACpB;AAAA,KACF,CAAA,CAAA;AACA,IAAO,MAAA,CAAA,MAAA,CAAO,OAAQ,CAAA,CAAC,KAAU,KAAA;AAE/B,MAAI,IAAA,KAAA,CAAM,IAAS,KAAA,SAAA,CAAU,IAAM,EAAA;AACjC,QAAA,KAAA,CAAM,MAAS,GAAA,KAAA,CAAM,MAAO,CAAA,GAAA,CAAI,CAAC,CAAM,KAAA;AACrC,UAAA,OAAO,IAAO,GAAA,CAAA,GAAI,CAAI,GAAA,IAAA,GAAO,CAAI,GAAA,IAAA,CAAA;AAAA,SAClC,CAAA,CAAA;AAAA,OACH;AAEA,MAAM,KAAA,CAAA,MAAA,GAAS,aACV,CAAA,cAAA,CAAA,EAAA,EAAA,KAAA,CAAM,MADI,CAAA,EAAA;AAAA,QAEb,KAAO,EAAA;AAAA,UACL,IAAM,EAAA,OAAA;AAAA,UACN,UAAA,EAAY,MAAO,CAAA,KAAA,CAAM,OAAQ,CAAA,MAAA;AAAA,SACnC;AAAA,OACF,CAAA,CAAA;AACA,MAAO,OAAA,KAAA,CAAA;AAAA,KACR,CAAA,CAAA;AAAA,GACF,CAAA,CAAA;AACD,EAAA,OAAO,GAAG,SAAS,CAAA,CAAA;AACrB,CAAA,CAAA;AAEA,SAAS,6BAAA,CAA8B,EAAE,KAAA,EAAqD,EAAA;AAxN9F,EAAA,IAAA,EAAA,CAAA;AAyNE,EAAM,MAAA,MAAA,GAAS,WAAW,SAAS,CAAA,CAAA;AACnC,EAAA,MAAM,EAAE,WAAA,EAAa,cAAe,EAAA,GAAI,MAAM,QAAS,EAAA,CAAA;AAEvD,EAAA,MAAM,CAAC,eAAiB,EAAA,kBAAkB,CAAI,GAAA,KAAA,CAAM,SAAS,WAAW,CAAA,CAAA;AACxE,EAAM,MAAA,aAAA,GAAA,CAAgB,EAAe,GAAA,cAAA,CAAA,IAAA,CAAK,CAAC,EAAE,KAAAA,EAAAA,MAAAA,EAAYA,KAAAA,MAAAA,KAAU,eAAe,CAAA,KAA5D,IAAiE,GAAA,EAAA,GAAA,8BAAA,CAAA;AAEvF,EAAM,MAAA,KAAA,GAAQ,eAAe,IAAK,CAAA,CAAC,EAAE,KAAAA,EAAAA,MAAAA,EAAYA,KAAAA,MAAAA,KAAU,WAAW,CAAA,CAAA;AACtE,EAAM,MAAA,OAAA,GAAU,QAAQ,KAAK,CAAA,CAAA;AAE7B,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,IAAI,OAAS,EAAA;AACX,MAAA,kBAAA,CAAmB,WAAW,CAAA,CAAA;AAC9B,MAAA,KAAA,CAAM,cAAe,EAAA,CAAA;AAAA,KACvB,MAAA,IAAW,CAAC,OAAS,EAAA;AACnB,MAAM,KAAA,CAAA,oBAAA,CAAqB,cAAc,KAAK,CAAA,CAAA;AAAA,KAChD;AAAA,GACF,CAAA;AAEA,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,mCACE,KAAA,CAAA,aAAA,CAAA,aAAA,EAAA;AAAA,IACC,OAAQ,EAAA,QAAA;AAAA,IACR,OAAQ,EAAA,8BAAA;AAAA,IACR,OAAA,EAAS,CAAC,CAAM,KAAA;AACd,MAAA,CAAA,CAAE,eAAgB,EAAA,CAAA;AAClB,MAAA,CAAA,CAAE,cAAe,EAAA,CAAA;AACjB,MAAQ,OAAA,EAAA,CAAA;AAAA,KACV;AAAA,GAAA,kBAEC,KAAA,CAAA,aAAA,CAAA,QAAA,EAAA;AAAA,IAAS,KAAM,EAAA,GAAA;AAAA,IAAI,KAAO,EAAA,OAAA;AAAA,IAAS,OAAA;AAAA,GAAkB,CAAE,EAAA,YAE1D,CAEC,EAAA,OAAA,mBACE,KAAA,CAAA,aAAA,CAAA,YAAA,EAAA;AAAA,IACC,OAAQ,EAAA,QAAA;AAAA,IACR,KAAA;AAAA,IACA,OAAS,EAAA,cAAA;AAAA,IACT,QAAA,EAAU,CAAC,CAAM,KAAA;AACf,MAAM,KAAA,CAAA,oBAAA,CAAqB,EAAE,KAAM,CAAA,CAAA;AAAA,KACrC;AAAA,GACF,oBAEC,KAAA,CAAA,aAAA,CAAA,aAAA,EAAA;AAAA,IAAc,WAAW,MAAO,CAAA,aAAA;AAAA,IAAe,QAAQ,EAAA,IAAA;AAAA,IAAC,OAAQ,EAAA,QAAA;AAAA,IAAS,MAAQ,EAAA,KAAA;AAAA,GAC/E,EAAA,aAAA,CAAc,KACjB,CAEJ,CAAA,CAAA;AAEJ,CAAA;AAEA,SAAS,UAAU,KAAsB,EAAA;AACvC,EAAO,OAAA;AAAA,IACL,eAAe,GAAI,CAAA;AAAA,MACjB,YAAc,EAAA;AAAA,QACZ,MAAQ,EAAA,CAAA,UAAA,EAAa,KAAM,CAAA,MAAA,CAAO,SAAU,CAAA,MAAA,CAAA,CAAA;AAAA,QAC5C,KAAA,EAAO,KAAM,CAAA,MAAA,CAAO,IAAK,CAAA,QAAA;AAAA,QACzB,OAAS,EAAA,CAAA;AAAA,OACX;AAAA,KACD,CAAA;AAAA,GACH,CAAA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["import { getUrlWithAppState } from './components/SceneApp/utils';\nimport { registerRuntimePanelPlugin } from './components/VizPanel/registerRuntimePanelPlugin';\nimport { cloneSceneObjectState } from './core/sceneGraph/utils';\nimport { registerRuntimeDataSource } from './querying/RuntimeDataSource';\nimport { getUrlState, syncStateFromSearchParams } from './services/utils';\nimport { registerVariableMacro } from './variables/macros';\nimport { renderPrometheusLabelFilters } from './variables/utils';\nimport {\n isAdHocVariable,\n isQueryVariable,\n isTextBoxVariable,\n isCustomVariable,\n isDataSourceVariable,\n isConstantVariable,\n isIntervalVariable,\n isGroupByVariable,\n} from './variables/variants/guards';\n\nexport * from './core/types';\nexport * from './core/events';\nexport { sceneGraph } from './core/sceneGraph';\nexport * as behaviors from './behaviors';\nexport * as dataLayers from './querying/layers';\n\nexport { SceneObjectBase, useSceneObjectState } from './core/SceneObjectBase';\nexport { SceneDataNode } from './core/SceneDataNode';\nexport { SceneTimeRange } from './core/SceneTimeRange';\nexport { SceneTimeZoneOverride } from './core/SceneTimeZoneOverride';\n\nexport { SceneQueryRunner, type QueryRunnerState } from './querying/SceneQueryRunner';\nexport { SceneDataLayerSet, SceneDataLayerSetBase } from './querying/SceneDataLayerSet';\nexport { SceneDataLayerBase } from './querying/layers/SceneDataLayerBase';\nexport { SceneDataLayerControls } from './querying/layers/SceneDataLayerControls';\nexport { SceneDataTransformer } from './querying/SceneDataTransformer';\nexport { registerQueryWithController } from './querying/registerQueryWithController';\nexport { registerRuntimeDataSource, RuntimeDataSource } from './querying/RuntimeDataSource';\nexport type {\n SceneQueryControllerLike,\n SceneQueryControllerEntryType,\n SceneQueryControllerEntry,\n} from './behaviors/SceneQueryController';\n\nexport * from './variables/types';\nexport { VariableDependencyConfig } from './variables/VariableDependencyConfig';\nexport { formatRegistry, type FormatVariable } from './variables/interpolation/formatRegistry';\nexport { VariableValueSelectors } from './variables/components/VariableValueSelectors';\nexport { VariableValueControl } from './variables/components/VariableValueControl';\nexport { SceneVariableSet } from './variables/sets/SceneVariableSet';\nexport { ConstantVariable } from './variables/variants/ConstantVariable';\nexport { CustomVariable } from './variables/variants/CustomVariable';\nexport { DataSourceVariable } from './variables/variants/DataSourceVariable';\nexport { QueryVariable } from './variables/variants/query/QueryVariable';\nexport { TestVariable } from './variables/variants/TestVariable';\nexport { TextBoxVariable } from './variables/variants/TextBoxVariable';\nexport { MultiValueVariable } from './variables/variants/MultiValueVariable';\nexport { LocalValueVariable } from './variables/variants/LocalValueVariable';\nexport { IntervalVariable } from './variables/variants/IntervalVariable';\nexport { AdHocFiltersVariable } from './variables/adhoc/AdHocFiltersVariable';\nexport { GroupByVariable } from './variables/groupby/GroupByVariable';\nexport { type MacroVariableConstructor } from './variables/macros/types';\n\nexport { type UrlSyncManagerLike, UrlSyncManager, getUrlSyncManager } from './services/UrlSyncManager';\nexport { SceneObjectUrlSyncConfig } from './services/SceneObjectUrlSyncConfig';\n\nexport { EmbeddedScene, type EmbeddedSceneState } from './components/EmbeddedScene';\nexport { VizPanel, type VizPanelState } from './components/VizPanel/VizPanel';\nexport { VizPanelMenu } from './components/VizPanel/VizPanelMenu';\nexport { NestedScene } from './components/NestedScene';\nexport { SceneCanvasText } from './components/SceneCanvasText';\nexport { SceneToolbarButton, SceneToolbarInput } from './components/SceneToolbarButton';\nexport { SceneTimePicker } from './components/SceneTimePicker';\nexport { SceneRefreshPicker } from './components/SceneRefreshPicker';\nexport { SceneTimeRangeTransformerBase } from './core/SceneTimeRangeTransformerBase';\nexport { SceneTimeRangeCompare } from './components/SceneTimeRangeCompare';\nexport { SceneByFrameRepeater } from './components/SceneByFrameRepeater';\nexport { SceneByVariableRepeater } from './components/SceneByVariableRepeater';\nexport { SceneControlsSpacer } from './components/SceneControlsSpacer';\nexport {\n SceneFlexLayout,\n SceneFlexItem,\n type SceneFlexItemState,\n type SceneFlexItemLike,\n} from './components/layout/SceneFlexLayout';\nexport { SceneCSSGridLayout, SceneCSSGridItem } from './components/layout/CSSGrid/SceneCSSGridLayout';\nexport { SceneGridLayout } from './components/layout/grid/SceneGridLayout';\nexport { SceneGridItem } from './components/layout/grid/SceneGridItem';\nexport { SceneGridRow } from './components/layout/grid/SceneGridRow';\nexport { type SceneGridItemStateLike, type SceneGridItemLike } from './components/layout/grid/types';\nexport { SplitLayout } from './components/layout/split/SplitLayout';\nexport {\n type SceneAppPageLike,\n type SceneRouteMatch,\n type SceneAppPageState,\n type SceneAppDrilldownView,\n type SceneAppRoute,\n} from './components/SceneApp/types';\nexport { SceneApp, useSceneApp } from './components/SceneApp/SceneApp';\nexport { SceneAppPage } from './components/SceneApp/SceneAppPage';\nexport { SceneReactObject } from './components/SceneReactObject';\nexport { SceneObjectRef } from './core/SceneObjectRef';\nexport {\n PanelBuilders,\n PanelOptionsBuilders,\n FieldConfigBuilders,\n FieldConfigOverridesBuilder,\n} from './core/PanelBuilders';\nexport { VizPanelBuilder } from './core/PanelBuilders/VizPanelBuilder';\nexport { SceneDebugger } from './components/SceneDebugger/SceneDebugger';\n\nexport const sceneUtils = {\n getUrlWithAppState,\n registerRuntimePanelPlugin,\n registerRuntimeDataSource,\n registerVariableMacro,\n cloneSceneObjectState,\n syncStateFromSearchParams,\n getUrlState,\n renderPrometheusLabelFilters,\n\n // Variable guards\n isAdHocVariable,\n isConstantVariable,\n isCustomVariable,\n isDataSourceVariable,\n isIntervalVariable,\n isQueryVariable,\n isTextBoxVariable,\n isGroupByVariable,\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6GO,MAAM,UAAa,GAAA;AAAA,EACxB,kBAAA;AAAA,EACA,0BAAA;AAAA,EACA,yBAAA;AAAA,EACA,qBAAA;AAAA,EACA,qBAAA;AAAA,EACA,yBAAA;AAAA,EACA,WAAA;AAAA,EACA,4BAAA;AAAA,EAGA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,oBAAA;AAAA,EACA,kBAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA;AACF;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["import { getUrlWithAppState } from './components/SceneApp/utils';\nimport { registerRuntimePanelPlugin } from './components/VizPanel/registerRuntimePanelPlugin';\nimport { cloneSceneObjectState } from './core/sceneGraph/utils';\nimport { registerRuntimeDataSource } from './querying/RuntimeDataSource';\nimport { getUrlState, syncStateFromSearchParams } from './services/utils';\nimport { registerVariableMacro } from './variables/macros';\nimport { renderPrometheusLabelFilters } from './variables/utils';\nimport {\n isAdHocVariable,\n isQueryVariable,\n isTextBoxVariable,\n isCustomVariable,\n isDataSourceVariable,\n isConstantVariable,\n isIntervalVariable,\n isGroupByVariable,\n} from './variables/variants/guards';\n\nexport * from './core/types';\nexport * from './core/events';\nexport { sceneGraph } from './core/sceneGraph';\nexport * as behaviors from './behaviors';\nexport * as dataLayers from './querying/layers';\n\nexport { SceneObjectBase, useSceneObjectState } from './core/SceneObjectBase';\nexport { SceneDataNode } from './core/SceneDataNode';\nexport { SceneTimeRange } from './core/SceneTimeRange';\nexport { SceneTimeZoneOverride } from './core/SceneTimeZoneOverride';\n\nexport { SceneQueryRunner, type QueryRunnerState } from './querying/SceneQueryRunner';\nexport { type ExtraQueryDescriptor, type ExtraQueryProvider, type ExtraQueryDataProcessor } from './querying/ExtraQueryProvider';\nexport { SceneDataLayerSet, SceneDataLayerSetBase } from './querying/SceneDataLayerSet';\nexport { SceneDataLayerBase } from './querying/layers/SceneDataLayerBase';\nexport { SceneDataLayerControls } from './querying/layers/SceneDataLayerControls';\nexport { SceneDataTransformer } from './querying/SceneDataTransformer';\nexport { registerQueryWithController } from './querying/registerQueryWithController';\nexport { registerRuntimeDataSource, RuntimeDataSource } from './querying/RuntimeDataSource';\nexport type {\n SceneQueryControllerLike,\n SceneQueryControllerEntryType,\n SceneQueryControllerEntry,\n} from './behaviors/SceneQueryController';\n\nexport * from './variables/types';\nexport { VariableDependencyConfig } from './variables/VariableDependencyConfig';\nexport { formatRegistry, type FormatVariable } from './variables/interpolation/formatRegistry';\nexport { VariableValueSelectors } from './variables/components/VariableValueSelectors';\nexport { VariableValueControl } from './variables/components/VariableValueControl';\nexport { SceneVariableSet } from './variables/sets/SceneVariableSet';\nexport { ConstantVariable } from './variables/variants/ConstantVariable';\nexport { CustomVariable } from './variables/variants/CustomVariable';\nexport { DataSourceVariable } from './variables/variants/DataSourceVariable';\nexport { QueryVariable } from './variables/variants/query/QueryVariable';\nexport { TestVariable } from './variables/variants/TestVariable';\nexport { TextBoxVariable } from './variables/variants/TextBoxVariable';\nexport { MultiValueVariable } from './variables/variants/MultiValueVariable';\nexport { LocalValueVariable } from './variables/variants/LocalValueVariable';\nexport { IntervalVariable } from './variables/variants/IntervalVariable';\nexport { AdHocFiltersVariable } from './variables/adhoc/AdHocFiltersVariable';\nexport { GroupByVariable } from './variables/groupby/GroupByVariable';\nexport { type MacroVariableConstructor } from './variables/macros/types';\n\nexport { type UrlSyncManagerLike, UrlSyncManager, getUrlSyncManager } from './services/UrlSyncManager';\nexport { SceneObjectUrlSyncConfig } from './services/SceneObjectUrlSyncConfig';\n\nexport { EmbeddedScene, type EmbeddedSceneState } from './components/EmbeddedScene';\nexport { VizPanel, type VizPanelState } from './components/VizPanel/VizPanel';\nexport { VizPanelMenu } from './components/VizPanel/VizPanelMenu';\nexport { NestedScene } from './components/NestedScene';\nexport { SceneCanvasText } from './components/SceneCanvasText';\nexport { SceneToolbarButton, SceneToolbarInput } from './components/SceneToolbarButton';\nexport { SceneTimePicker } from './components/SceneTimePicker';\nexport { SceneRefreshPicker } from './components/SceneRefreshPicker';\nexport { SceneTimeRangeTransformerBase } from './core/SceneTimeRangeTransformerBase';\nexport { SceneTimeRangeCompare } from './components/SceneTimeRangeCompare';\nexport { SceneByFrameRepeater } from './components/SceneByFrameRepeater';\nexport { SceneByVariableRepeater } from './components/SceneByVariableRepeater';\nexport { SceneControlsSpacer } from './components/SceneControlsSpacer';\nexport {\n SceneFlexLayout,\n SceneFlexItem,\n type SceneFlexItemState,\n type SceneFlexItemLike,\n} from './components/layout/SceneFlexLayout';\nexport { SceneCSSGridLayout, SceneCSSGridItem } from './components/layout/CSSGrid/SceneCSSGridLayout';\nexport { SceneGridLayout } from './components/layout/grid/SceneGridLayout';\nexport { SceneGridItem } from './components/layout/grid/SceneGridItem';\nexport { SceneGridRow } from './components/layout/grid/SceneGridRow';\nexport { type SceneGridItemStateLike, type SceneGridItemLike } from './components/layout/grid/types';\nexport { SplitLayout } from './components/layout/split/SplitLayout';\nexport {\n type SceneAppPageLike,\n type SceneRouteMatch,\n type SceneAppPageState,\n type SceneAppDrilldownView,\n type SceneAppRoute,\n} from './components/SceneApp/types';\nexport { SceneApp, useSceneApp } from './components/SceneApp/SceneApp';\nexport { SceneAppPage } from './components/SceneApp/SceneAppPage';\nexport { SceneReactObject } from './components/SceneReactObject';\nexport { SceneObjectRef } from './core/SceneObjectRef';\nexport {\n PanelBuilders,\n PanelOptionsBuilders,\n FieldConfigBuilders,\n FieldConfigOverridesBuilder,\n} from './core/PanelBuilders';\nexport { VizPanelBuilder } from './core/PanelBuilders/VizPanelBuilder';\nexport { SceneDebugger } from './components/SceneDebugger/SceneDebugger';\n\nexport const sceneUtils = {\n getUrlWithAppState,\n registerRuntimePanelPlugin,\n registerRuntimeDataSource,\n registerVariableMacro,\n cloneSceneObjectState,\n syncStateFromSearchParams,\n getUrlState,\n renderPrometheusLabelFilters,\n\n // Variable guards\n isAdHocVariable,\n isConstantVariable,\n isCustomVariable,\n isDataSourceVariable,\n isIntervalVariable,\n isQueryVariable,\n isTextBoxVariable,\n isGroupByVariable,\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8GO,MAAM,UAAa,GAAA;AAAA,EACxB,kBAAA;AAAA,EACA,0BAAA;AAAA,EACA,yBAAA;AAAA,EACA,qBAAA;AAAA,EACA,qBAAA;AAAA,EACA,yBAAA;AAAA,EACA,WAAA;AAAA,EACA,4BAAA;AAAA,EAGA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,oBAAA;AAAA,EACA,kBAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA;AACF;;;;"}
@@ -0,0 +1,6 @@
1
+ function isExtraQueryProvider(obj) {
2
+ return typeof obj === "object" && "getExtraQueries" in obj;
3
+ }
4
+
5
+ export { isExtraQueryProvider };
6
+ //# sourceMappingURL=ExtraQueryProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExtraQueryProvider.js","sources":["../../../src/querying/ExtraQueryProvider.ts"],"sourcesContent":["import { DataQueryRequest, PanelData } from \"@grafana/data\";\nimport { Observable } from \"rxjs\";\n\nimport { SceneObjectBase } from \"../core/SceneObjectBase\";\nimport { SceneObjectState } from \"../core/types\";\n\n// A processor function called by the query runner with responses\n// to any extra requests.\n//\n// A processor function should accept two arguments: the data returned by the\n// _primary_ query, and the data returned by the `ExtraQueryProvider`'s\n// _secondary_ query. It should return a new `PanelData` representing the processed output.\n// It should _not_ modify the primary PanelData.\n//\n// Examples of valid processing include alignment of data between primary and secondary\n// (see the `timeShiftAlignmentProcessor` returned by `SceneTimeRangeCompare`), or doing\n// some more advanced processing such as fitting a time series model on the secondary data.\n//\n// See the docs for `extraQueryProcessingOperator` for more information.\nexport type ExtraQueryDataProcessor = (primary: PanelData, secondary: PanelData) => Observable<PanelData>;\n\n// An extra request that should be run by a query runner, and an optional\n// processor that should be called with the response data.\nexport interface ExtraQueryDescriptor {\n // The extra request to add.\n req: DataQueryRequest;\n // An optional function used to process the data before passing it\n // to any transformations or visualizations.\n processor?: ExtraQueryDataProcessor;\n}\n\n// Indicates that this type wants to add extra requests, along with\n// optional processing functions, to a query runner.\nexport interface ExtraQueryProvider<T extends SceneObjectState> extends SceneObjectBase<T> {\n // Get any extra requests and their required processors.\n getExtraQueries(request: DataQueryRequest): ExtraQueryDescriptor[];\n // Determine whether a query should be rerun.\n //\n // When the provider's state changes this function will be passed both the previous and the\n // next state. The implementation can use this to determine whether the change should trigger\n // a rerun of the query or not.\n shouldRerun(prev: T, next: T): boolean;\n}\n\nexport function isExtraQueryProvider(obj: any): obj is ExtraQueryProvider<any> {\n return typeof obj === 'object' && 'getExtraQueries' in obj;\n}\n"],"names":[],"mappings":"AA4CO,SAAS,qBAAqB,GAA0C,EAAA;AAC7E,EAAO,OAAA,OAAO,GAAQ,KAAA,QAAA,IAAY,iBAAqB,IAAA,GAAA,CAAA;AACzD;;;;"}
@@ -1,8 +1,8 @@
1
- import { cloneDeep, isEqual } from 'lodash';
1
+ import { isEqual, cloneDeep } from 'lodash';
2
2
  import { ReplaySubject, forkJoin } from 'rxjs';
3
3
  import { LoadingState } from '@grafana/schema';
4
- import { rangeUtil, preProcessPanelData, DataTopic, DataFrameView } from '@grafana/data';
5
- import { isExpressionReference, getRunRequest, toDataQueryError } from '@grafana/runtime';
4
+ import { preProcessPanelData, DataTopic, DataFrameView, rangeUtil } from '@grafana/data';
5
+ import { getRunRequest, toDataQueryError, isExpressionReference } 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';
@@ -10,16 +10,16 @@ import { VariableDependencyConfig } from '../variables/VariableDependencyConfig.
10
10
  import { writeSceneLog } from '../utils/writeSceneLog.js';
11
11
  import { VariableValueRecorder } from '../variables/VariableValueRecorder.js';
12
12
  import { emptyPanelData } from '../core/SceneDataNode.js';
13
- import { SceneTimeRangeCompare } from '../components/SceneTimeRangeCompare.js';
14
13
  import { getClosest } from '../core/sceneGraph/utils.js';
15
- import { timeShiftQueryResponseOperator } from './timeShiftQueryResponseOperator.js';
14
+ import { isExtraQueryProvider } from './ExtraQueryProvider.js';
15
+ import { extraQueryProcessingOperator, passthroughProcessor } from './extraQueryProcessingOperator.js';
16
16
  import { filterAnnotations } from './layers/annotations/filterAnnotations.js';
17
17
  import { getEnrichedDataRequest } from './getEnrichedDataRequest.js';
18
18
  import { findActiveAdHocFilterVariableByUid } from '../variables/adhoc/patchGetAdhocFilters.js';
19
19
  import { registerQueryWithController } from './registerQueryWithController.js';
20
20
  import { findActiveGroupByVariablesByUid } from '../variables/groupby/findActiveGroupByVariablesByUid.js';
21
21
  import { GroupByVariable } from '../variables/groupby/GroupByVariable.js';
22
- import { isFilterComplete, AdHocFiltersVariable } from '../variables/adhoc/AdHocFiltersVariable.js';
22
+ import { AdHocFiltersVariable, isFilterComplete } from '../variables/adhoc/AdHocFiltersVariable.js';
23
23
  import { DataLayersMerger } from './DataLayersMerger.js';
24
24
 
25
25
  var __defProp = Object.defineProperty;
@@ -57,70 +57,6 @@ class SceneQueryRunner extends SceneObjectBase {
57
57
  onVariableUpdateCompleted: this.onVariableUpdatesCompleted.bind(this),
58
58
  onAnyVariableChanged: this.onAnyVariableChanged.bind(this)
59
59
  });
60
- this.prepareRequests = (timeRange, ds) => {
61
- const comparer = this.getTimeCompare();
62
- const { minInterval, queries } = this.state;
63
- let secondaryRequest;
64
- let request = __spreadValues({
65
- app: "scenes",
66
- requestId: getNextRequestId(),
67
- timezone: timeRange.getTimeZone(),
68
- panelId: 1,
69
- range: timeRange.state.value,
70
- interval: "1s",
71
- intervalMs: 1e3,
72
- targets: cloneDeep(queries),
73
- maxDataPoints: this.getMaxDataPoints(),
74
- scopedVars: this._scopedVars,
75
- startTime: Date.now(),
76
- liveStreaming: this.state.liveStreaming,
77
- rangeRaw: {
78
- from: timeRange.state.from,
79
- to: timeRange.state.to
80
- },
81
- cacheTimeout: this.state.cacheTimeout,
82
- queryCachingTTL: this.state.queryCachingTTL
83
- }, getEnrichedDataRequest(this));
84
- if (this._adhocFiltersVar) {
85
- request.filters = this._adhocFiltersVar.state.filters.filter(isFilterComplete);
86
- }
87
- if (this._groupByVar) {
88
- request.groupByKeys = this._groupByVar.state.value;
89
- }
90
- request.targets = request.targets.map((query) => {
91
- var _a;
92
- if (!query.datasource || query.datasource.uid !== ds.uid && !((_a = ds.meta) == null ? void 0 : _a.mixed) && isExpressionReference && !isExpressionReference(query.datasource)) {
93
- query.datasource = ds.getRef();
94
- }
95
- return query;
96
- });
97
- const lowerIntervalLimit = minInterval ? minInterval : ds.interval;
98
- const norm = rangeUtil.calculateInterval(timeRange.state.value, request.maxDataPoints, lowerIntervalLimit);
99
- request.scopedVars = Object.assign({}, request.scopedVars, {
100
- __interval: { text: norm.interval, value: norm.interval },
101
- __interval_ms: { text: norm.intervalMs.toString(), value: norm.intervalMs }
102
- });
103
- request.interval = norm.interval;
104
- request.intervalMs = norm.intervalMs;
105
- const primaryTimeRange = timeRange.state.value;
106
- if (comparer) {
107
- const secondaryTimeRange = comparer.getCompareTimeRange(primaryTimeRange);
108
- if (secondaryTimeRange) {
109
- const secondaryTargets = request.targets.filter((query) => query.timeRangeCompare !== false);
110
- if (secondaryTargets.length) {
111
- secondaryRequest = __spreadProps(__spreadValues({}, request), {
112
- targets: secondaryTargets,
113
- range: secondaryTimeRange,
114
- requestId: getNextRequestId()
115
- });
116
- }
117
- request = __spreadProps(__spreadValues({}, request), {
118
- range: primaryTimeRange
119
- });
120
- }
121
- }
122
- return [request, secondaryRequest];
123
- };
124
60
  this.onDataReceived = (data) => {
125
61
  const preProcessedData = preProcessPanelData(data, this.state.data);
126
62
  this._resultAnnotations = data.annotations;
@@ -139,11 +75,11 @@ class SceneQueryRunner extends SceneObjectBase {
139
75
  }
140
76
  _onActivate() {
141
77
  const timeRange = sceneGraph.getTimeRange(this);
142
- const comparer = this.getTimeCompare();
143
- if (comparer) {
78
+ const providers = this.getClosestExtraQueryProviders();
79
+ for (const provider of providers) {
144
80
  this._subs.add(
145
- comparer.subscribeToState((n, p) => {
146
- if (n.compareWith !== p.compareWith) {
81
+ provider.subscribeToState((n, p) => {
82
+ if (provider.shouldRerun(p, n)) {
147
83
  this.runQueries();
148
84
  }
149
85
  })
@@ -349,16 +285,18 @@ class SceneQueryRunner extends SceneObjectBase {
349
285
  const ds = await getDataSource(datasource, this._scopedVars);
350
286
  this.findAndSubscribeToAdHocFilters(datasource == null ? void 0 : datasource.uid);
351
287
  const runRequest = getRunRequest();
352
- const [request, secondaryRequest] = this.prepareRequests(timeRange, ds);
288
+ const { primary, secondaries, processors } = this.prepareRequests(timeRange, ds);
353
289
  writeSceneLog("SceneQueryRunner", "Starting runRequest", this.state.key);
354
- let stream = runRequest(ds, request);
355
- if (secondaryRequest) {
356
- stream = forkJoin([stream, runRequest(ds, secondaryRequest)]).pipe(timeShiftQueryResponseOperator);
290
+ let stream = runRequest(ds, primary);
291
+ if (secondaries.length > 0) {
292
+ const secondaryStreams = secondaries.map((r) => runRequest(ds, r));
293
+ const op = extraQueryProcessingOperator(processors);
294
+ stream = forkJoin([stream, ...secondaryStreams]).pipe(op);
357
295
  }
358
296
  stream = stream.pipe(
359
297
  registerQueryWithController({
360
298
  type: "data",
361
- request,
299
+ request: primary,
362
300
  origin: this,
363
301
  cancel: () => this.cancelQuery()
364
302
  })
@@ -386,6 +324,63 @@ class SceneQueryRunner extends SceneObjectBase {
386
324
  clone["_results"].next({ origin: this, data: (_a = this.state.data) != null ? _a : emptyPanelData });
387
325
  return clone;
388
326
  }
327
+ prepareRequests(timeRange, ds) {
328
+ var _a;
329
+ const { minInterval, queries } = this.state;
330
+ let request = __spreadValues({
331
+ app: "scenes",
332
+ requestId: getNextRequestId(),
333
+ timezone: timeRange.getTimeZone(),
334
+ panelId: 1,
335
+ range: timeRange.state.value,
336
+ interval: "1s",
337
+ intervalMs: 1e3,
338
+ targets: cloneDeep(queries),
339
+ maxDataPoints: this.getMaxDataPoints(),
340
+ scopedVars: this._scopedVars,
341
+ startTime: Date.now(),
342
+ liveStreaming: this.state.liveStreaming,
343
+ rangeRaw: {
344
+ from: timeRange.state.from,
345
+ to: timeRange.state.to
346
+ },
347
+ cacheTimeout: this.state.cacheTimeout,
348
+ queryCachingTTL: this.state.queryCachingTTL
349
+ }, getEnrichedDataRequest(this));
350
+ if (this._adhocFiltersVar) {
351
+ request.filters = this._adhocFiltersVar.state.filters.filter(isFilterComplete);
352
+ }
353
+ if (this._groupByVar) {
354
+ request.groupByKeys = this._groupByVar.state.value;
355
+ }
356
+ request.targets = request.targets.map((query) => {
357
+ var _a2;
358
+ if (!query.datasource || query.datasource.uid !== ds.uid && !((_a2 = ds.meta) == null ? void 0 : _a2.mixed) && isExpressionReference && !isExpressionReference(query.datasource)) {
359
+ query.datasource = ds.getRef();
360
+ }
361
+ return query;
362
+ });
363
+ const lowerIntervalLimit = minInterval ? minInterval : ds.interval;
364
+ const norm = rangeUtil.calculateInterval(timeRange.state.value, request.maxDataPoints, lowerIntervalLimit);
365
+ request.scopedVars = Object.assign({}, request.scopedVars, {
366
+ __interval: { text: norm.interval, value: norm.interval },
367
+ __interval_ms: { text: norm.intervalMs.toString(), value: norm.intervalMs }
368
+ });
369
+ request.interval = norm.interval;
370
+ request.intervalMs = norm.intervalMs;
371
+ const primaryTimeRange = timeRange.state.value;
372
+ let secondaryRequests = [];
373
+ let secondaryProcessors = /* @__PURE__ */ new Map();
374
+ for (const provider of (_a = this.getClosestExtraQueryProviders()) != null ? _a : []) {
375
+ for (const { req, processor } of provider.getExtraQueries(request)) {
376
+ const requestId = getNextRequestId();
377
+ secondaryRequests.push(__spreadProps(__spreadValues({}, req), { requestId }));
378
+ secondaryProcessors.set(requestId, processor != null ? processor : passthroughProcessor);
379
+ }
380
+ }
381
+ request.range = primaryTimeRange;
382
+ return { primary: request, secondaries: secondaryRequests, processors: secondaryProcessors };
383
+ }
389
384
  _combineDataLayers(data) {
390
385
  if (this._layerAnnotations && this._layerAnnotations.length > 0) {
391
386
  data.annotations = (data.annotations || []).concat(this._layerAnnotations);
@@ -400,22 +395,23 @@ class SceneQueryRunner extends SceneObjectBase {
400
395
  this.setState({ data: emptyPanelData });
401
396
  }
402
397
  }
403
- getTimeCompare() {
398
+ getClosestExtraQueryProviders() {
399
+ const found = /* @__PURE__ */ new Map();
404
400
  if (!this.parent) {
405
- return null;
401
+ return [];
406
402
  }
407
- return getClosest(this.parent, (s) => {
408
- let found = null;
409
- if (s instanceof SceneTimeRangeCompare) {
410
- return s;
403
+ getClosest(this.parent, (s) => {
404
+ if (isExtraQueryProvider(s) && !found.has(s.constructor)) {
405
+ found.set(s.constructor, s);
411
406
  }
412
407
  s.forEachChild((child) => {
413
- if (child instanceof SceneTimeRangeCompare) {
414
- found = child;
408
+ if (isExtraQueryProvider(child) && !found.has(child.constructor)) {
409
+ found.set(child.constructor, child);
415
410
  }
416
411
  });
417
- return found;
412
+ return null;
418
413
  });
414
+ return Array.from(found.values());
419
415
  }
420
416
  findAndSubscribeToAdHocFilters(uid) {
421
417
  const filtersVar = findActiveAdHocFilterVariableByUid(uid);