@grafana/scenes 1.29.0 → 1.30.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 CHANGED
@@ -1,3 +1,22 @@
1
+ # v1.30.0 (Thu Jan 18 2024)
2
+
3
+ #### 🚀 Enhancement
4
+
5
+ - SceneGridLayout: Support new visualization tooltips [#530](https://github.com/grafana/scenes/pull/530) ([@torkelo](https://github.com/torkelo))
6
+ - Adhoc filters variable improvements [#518](https://github.com/grafana/scenes/pull/518) ([@javiruiz01](https://github.com/javiruiz01))
7
+
8
+ #### 🐛 Bug Fix
9
+
10
+ - Revert "Chore: Update peer dependencies" [#533](https://github.com/grafana/scenes/pull/533) ([@leventebalogh](https://github.com/leventebalogh))
11
+
12
+ #### Authors: 3
13
+
14
+ - Javier Ruiz ([@javiruiz01](https://github.com/javiruiz01))
15
+ - Levente Balogh ([@leventebalogh](https://github.com/leventebalogh))
16
+ - Torkel Ödegaard ([@torkelo](https://github.com/torkelo))
17
+
18
+ ---
19
+
1
20
  # v1.29.0 (Tue Jan 16 2024)
2
21
 
3
22
  #### 🚀 Enhancement
@@ -1,9 +1,42 @@
1
- import React from 'react';
1
+ import React, { useRef, useReducer, useCallback, useMemo } from 'react';
2
2
  import ReactGridLayout from 'react-grid-layout';
3
3
  import AutoSizer from 'react-virtualized-auto-sizer';
4
4
  import { GRID_CELL_VMARGIN, GRID_COLUMN_COUNT, GRID_CELL_HEIGHT } from './constants.js';
5
5
  import { LazyLoader } from '../LazyLoader.js';
6
+ import { useTheme2, LayoutItemContext } from '@grafana/ui';
7
+ import { cx } from '@emotion/css';
6
8
 
9
+ var __defProp = Object.defineProperty;
10
+ var __defProps = Object.defineProperties;
11
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
12
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
13
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
14
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
15
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
16
+ var __spreadValues = (a, b) => {
17
+ for (var prop in b || (b = {}))
18
+ if (__hasOwnProp.call(b, prop))
19
+ __defNormalProp(a, prop, b[prop]);
20
+ if (__getOwnPropSymbols)
21
+ for (var prop of __getOwnPropSymbols(b)) {
22
+ if (__propIsEnum.call(b, prop))
23
+ __defNormalProp(a, prop, b[prop]);
24
+ }
25
+ return a;
26
+ };
27
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
28
+ var __objRest = (source, exclude) => {
29
+ var target = {};
30
+ for (var prop in source)
31
+ if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
32
+ target[prop] = source[prop];
33
+ if (source != null && __getOwnPropSymbols)
34
+ for (var prop of __getOwnPropSymbols(source)) {
35
+ if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
36
+ target[prop] = source[prop];
37
+ }
38
+ return target;
39
+ };
7
40
  function SceneGridLayoutRenderer({ model }) {
8
41
  const { children, isLazy, isDraggable, isResizable } = model.useState();
9
42
  validateChildrenSize(children);
@@ -15,7 +48,7 @@ function SceneGridLayoutRenderer({ model }) {
15
48
  }
16
49
  const layout = model.buildGridLayout(width);
17
50
  return /* @__PURE__ */ React.createElement("div", {
18
- style: { width: `${width}px`, height: "100%" }
51
+ style: { width: `${width}px`, height: "100%", position: "relative", zIndex: 1 }
19
52
  }, /* @__PURE__ */ React.createElement(ReactGridLayout, {
20
53
  width,
21
54
  isDraggable: isDraggable && width > 768,
@@ -32,28 +65,62 @@ function SceneGridLayoutRenderer({ model }) {
32
65
  onResizeStop: model.onResizeStop,
33
66
  onLayoutChange: model.onLayoutChange,
34
67
  isBounded: false
35
- }, layout.map((gridItem) => {
36
- var _a;
37
- const sceneChild = model.getSceneLayoutChild(gridItem.i);
38
- const className = (_a = sceneChild.getClassName) == null ? void 0 : _a.call(sceneChild);
39
- return isLazy ? /* @__PURE__ */ React.createElement(LazyLoader, {
40
- key: sceneChild.state.key,
41
- "data-griditem-key": sceneChild.state.key,
42
- className
43
- }, /* @__PURE__ */ React.createElement(sceneChild.Component, {
44
- model: sceneChild,
45
- key: sceneChild.state.key
46
- })) : /* @__PURE__ */ React.createElement("div", {
47
- key: sceneChild.state.key,
48
- "data-griditem-key": sceneChild.state.key,
49
- className
50
- }, /* @__PURE__ */ React.createElement(sceneChild.Component, {
51
- model: sceneChild,
52
- key: sceneChild.state.key
53
- }));
54
- })));
68
+ }, layout.map((gridItem, index) => /* @__PURE__ */ React.createElement(GridItemWrapper, {
69
+ key: gridItem.i,
70
+ grid: model,
71
+ layoutItem: gridItem,
72
+ index,
73
+ isLazy,
74
+ totalCount: layout.length
75
+ }))));
55
76
  });
56
77
  }
78
+ const GridItemWrapper = React.forwardRef((props, ref) => {
79
+ var _b;
80
+ const _a = props, { grid, layoutItem, index, totalCount, isLazy, style, onLoad, onChange } = _a, divProps = __objRest(_a, ["grid", "layoutItem", "index", "totalCount", "isLazy", "style", "onLoad", "onChange"]);
81
+ const sceneChild = grid.getSceneLayoutChild(layoutItem.i);
82
+ const className = (_b = sceneChild.getClassName) == null ? void 0 : _b.call(sceneChild);
83
+ const theme = useTheme2();
84
+ const boostedCount = useRef(0);
85
+ const [_, forceUpdate] = useReducer((x) => x + 1, 0);
86
+ const boostZIndex = useCallback(() => {
87
+ boostedCount.current += 1;
88
+ forceUpdate();
89
+ return () => {
90
+ boostedCount.current -= 1;
91
+ forceUpdate();
92
+ };
93
+ }, [forceUpdate]);
94
+ const ctxValue = useMemo(() => ({ boostZIndex }), [boostZIndex]);
95
+ const descIndex = totalCount - index;
96
+ const innerContent = /* @__PURE__ */ React.createElement(sceneChild.Component, {
97
+ model: sceneChild,
98
+ key: sceneChild.state.key
99
+ });
100
+ const innerContentWithContext = LayoutItemContext ? /* @__PURE__ */ React.createElement(LayoutItemContext.Provider, {
101
+ value: ctxValue
102
+ }, innerContent) : innerContent;
103
+ const newStyle = __spreadProps(__spreadValues({}, style), {
104
+ zIndex: boostedCount.current === 0 ? descIndex : theme.zIndex.dropdown
105
+ });
106
+ if (isLazy) {
107
+ return /* @__PURE__ */ React.createElement(LazyLoader, __spreadProps(__spreadValues({}, divProps), {
108
+ key: sceneChild.state.key,
109
+ "data-griditem-key": sceneChild.state.key,
110
+ className: cx(className, props.className),
111
+ style: newStyle,
112
+ ref
113
+ }), innerContentWithContext);
114
+ }
115
+ return /* @__PURE__ */ React.createElement("div", __spreadProps(__spreadValues({}, divProps), {
116
+ ref,
117
+ key: sceneChild.state.key,
118
+ "data-griditem-key": sceneChild.state.key,
119
+ className: cx(className, props.className),
120
+ style: newStyle
121
+ }), innerContentWithContext);
122
+ });
123
+ GridItemWrapper.displayName = "GridItemWrapper";
57
124
  function validateChildrenSize(children) {
58
125
  if (children.some(
59
126
  (c) => c.state.height === void 0 || c.state.width === void 0 || c.state.x === void 0 || c.state.y === void 0
@@ -1 +1 @@
1
- {"version":3,"file":"SceneGridLayoutRenderer.js","sources":["../../../../../src/components/layout/grid/SceneGridLayoutRenderer.tsx"],"sourcesContent":["import React from 'react';\nimport ReactGridLayout from 'react-grid-layout';\nimport AutoSizer from 'react-virtualized-auto-sizer';\nimport { SceneComponentProps } from '../../../core/types';\nimport { GRID_CELL_VMARGIN, GRID_COLUMN_COUNT, GRID_CELL_HEIGHT } from './constants';\nimport { LazyLoader } from '../LazyLoader';\nimport { SceneGridLayout } from './SceneGridLayout';\nimport { SceneGridItemLike } from './types';\n\nexport function SceneGridLayoutRenderer({ model }: SceneComponentProps<SceneGridLayout>) {\n const { children, isLazy, isDraggable, isResizable } = model.useState();\n validateChildrenSize(children);\n\n return (\n <AutoSizer disableHeight>\n {({ width }) => {\n if (width === 0) {\n return null;\n }\n\n const layout = model.buildGridLayout(width);\n\n return (\n /**\n * The children is using a width of 100% so we need to guarantee that it is wrapped\n * in an element that has the calculated size given by the AutoSizer. The AutoSizer\n * has a width of 0 and will let its content overflow its div.\n */\n <div style={{ width: `${width}px`, height: '100%' }}>\n <ReactGridLayout\n width={width}\n /**\n Disable draggable if mobile device, solving an issue with unintentionally\n moving panels. https://github.com/grafana/grafana/issues/18497\n theme.breakpoints.md = 769\n */\n isDraggable={isDraggable && width > 768}\n isResizable={isResizable ?? false}\n containerPadding={[0, 0]}\n useCSSTransforms={false}\n margin={[GRID_CELL_VMARGIN, GRID_CELL_VMARGIN]}\n cols={GRID_COLUMN_COUNT}\n rowHeight={GRID_CELL_HEIGHT}\n draggableHandle={`.grid-drag-handle-${model.state.key}`}\n draggableCancel=\".grid-drag-cancel\"\n // @ts-ignore: ignoring for now until we make the size type numbers-only\n layout={layout}\n onDragStop={model.onDragStop}\n onResizeStop={model.onResizeStop}\n onLayoutChange={model.onLayoutChange}\n isBounded={false}\n >\n {layout.map((gridItem) => {\n const sceneChild = model.getSceneLayoutChild(gridItem.i)!;\n const className = sceneChild.getClassName?.();\n\n return isLazy ? (\n <LazyLoader\n key={sceneChild.state.key!}\n data-griditem-key={sceneChild.state.key}\n className={className}\n >\n <sceneChild.Component model={sceneChild} key={sceneChild.state.key} />\n </LazyLoader>\n ) : (\n <div key={sceneChild.state.key} data-griditem-key={sceneChild.state.key} className={className}>\n <sceneChild.Component model={sceneChild} key={sceneChild.state.key} />\n </div>\n );\n })}\n </ReactGridLayout>\n </div>\n );\n }}\n </AutoSizer>\n );\n}\n\nfunction validateChildrenSize(children: SceneGridItemLike[]) {\n if (\n children.some(\n (c) =>\n c.state.height === undefined ||\n c.state.width === undefined ||\n c.state.x === undefined ||\n c.state.y === undefined\n )\n ) {\n throw new Error('All children must have a size specified');\n }\n}\n"],"names":[],"mappings":";;;;;;AASgB,SAAA,uBAAA,CAAwB,EAAE,KAAA,EAA+C,EAAA;AACvF,EAAA,MAAM,EAAE,QAAU,EAAA,MAAA,EAAQ,aAAa,WAAY,EAAA,GAAI,MAAM,QAAS,EAAA,CAAA;AACtE,EAAA,oBAAA,CAAqB,QAAQ,CAAA,CAAA;AAE7B,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,SAAA,EAAA;AAAA,IAAU,aAAa,EAAA,IAAA;AAAA,GACrB,EAAA,CAAC,EAAE,KAAA,EAAY,KAAA;AACd,IAAA,IAAI,UAAU,CAAG,EAAA;AACf,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAEA,IAAM,MAAA,MAAA,GAAS,KAAM,CAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AAE1C,IAAA,uBAMG,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA;AAAA,MAAI,OAAO,EAAE,KAAA,EAAO,CAAG,EAAA,KAAA,CAAA,EAAA,CAAA,EAAW,QAAQ,MAAO,EAAA;AAAA,KAAA,kBAC/C,KAAA,CAAA,aAAA,CAAA,eAAA,EAAA;AAAA,MACC,KAAA;AAAA,MAMA,WAAA,EAAa,eAAe,KAAQ,GAAA,GAAA;AAAA,MACpC,aAAa,WAAe,IAAA,IAAA,GAAA,WAAA,GAAA,KAAA;AAAA,MAC5B,gBAAA,EAAkB,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,MACvB,gBAAkB,EAAA,KAAA;AAAA,MAClB,MAAA,EAAQ,CAAC,iBAAA,EAAmB,iBAAiB,CAAA;AAAA,MAC7C,IAAM,EAAA,iBAAA;AAAA,MACN,SAAW,EAAA,gBAAA;AAAA,MACX,eAAA,EAAiB,CAAqB,kBAAA,EAAA,KAAA,CAAM,KAAM,CAAA,GAAA,CAAA,CAAA;AAAA,MAClD,eAAgB,EAAA,mBAAA;AAAA,MAEhB,MAAA;AAAA,MACA,YAAY,KAAM,CAAA,UAAA;AAAA,MAClB,cAAc,KAAM,CAAA,YAAA;AAAA,MACpB,gBAAgB,KAAM,CAAA,cAAA;AAAA,MACtB,SAAW,EAAA,KAAA;AAAA,KAEV,EAAA,MAAA,CAAO,GAAI,CAAA,CAAC,QAAa,KAAA;AApDxC,MAAA,IAAA,EAAA,CAAA;AAqDgB,MAAA,MAAM,UAAa,GAAA,KAAA,CAAM,mBAAoB,CAAA,QAAA,CAAS,CAAC,CAAA,CAAA;AACvD,MAAM,MAAA,SAAA,GAAA,CAAY,gBAAW,YAAX,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,UAAA,CAAA,CAAA;AAElB,MAAA,OAAO,yBACJ,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA;AAAA,QACC,GAAA,EAAK,WAAW,KAAM,CAAA,GAAA;AAAA,QACtB,mBAAA,EAAmB,WAAW,KAAM,CAAA,GAAA;AAAA,QACpC,SAAA;AAAA,OAEA,kBAAA,KAAA,CAAA,aAAA,CAAC,WAAW,SAAX,EAAA;AAAA,QAAqB,KAAO,EAAA,UAAA;AAAA,QAAY,GAAA,EAAK,WAAW,KAAM,CAAA,GAAA;AAAA,OAAK,CACtE,oBAEC,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA;AAAA,QAAI,GAAA,EAAK,WAAW,KAAM,CAAA,GAAA;AAAA,QAAK,mBAAA,EAAmB,WAAW,KAAM,CAAA,GAAA;AAAA,QAAK,SAAA;AAAA,OACvE,kBAAA,KAAA,CAAA,aAAA,CAAC,WAAW,SAAX,EAAA;AAAA,QAAqB,KAAO,EAAA,UAAA;AAAA,QAAY,GAAA,EAAK,WAAW,KAAM,CAAA,GAAA;AAAA,OAAK,CACtE,CAAA,CAAA;AAAA,KAEH,CACH,CACF,CAAA,CAAA;AAAA,GAGN,CAAA,CAAA;AAEJ,CAAA;AAEA,SAAS,qBAAqB,QAA+B,EAAA;AAC3D,EAAA,IACE,QAAS,CAAA,IAAA;AAAA,IACP,CAAC,CACC,KAAA,CAAA,CAAE,KAAM,CAAA,MAAA,KAAW,UACnB,CAAE,CAAA,KAAA,CAAM,KAAU,KAAA,KAAA,CAAA,IAClB,EAAE,KAAM,CAAA,CAAA,KAAM,KACd,CAAA,IAAA,CAAA,CAAE,MAAM,CAAM,KAAA,KAAA,CAAA;AAAA,GAElB,EAAA;AACA,IAAM,MAAA,IAAI,MAAM,yCAAyC,CAAA,CAAA;AAAA,GAC3D;AACF;;;;"}
1
+ {"version":3,"file":"SceneGridLayoutRenderer.js","sources":["../../../../../src/components/layout/grid/SceneGridLayoutRenderer.tsx"],"sourcesContent":["import React, { useCallback, useMemo, useReducer, useRef } from 'react';\nimport ReactGridLayout from 'react-grid-layout';\nimport AutoSizer from 'react-virtualized-auto-sizer';\nimport { SceneComponentProps } from '../../../core/types';\nimport { GRID_CELL_VMARGIN, GRID_COLUMN_COUNT, GRID_CELL_HEIGHT } from './constants';\nimport { LazyLoader } from '../LazyLoader';\nimport { SceneGridLayout } from './SceneGridLayout';\nimport { SceneGridItemLike } from './types';\n// @ts-expect-error TODO remove when @grafana/ui is upgraded to 10.4\nimport { LayoutItemContext, useTheme2 } from '@grafana/ui';\nimport { cx } from '@emotion/css';\n\nexport function SceneGridLayoutRenderer({ model }: SceneComponentProps<SceneGridLayout>) {\n const { children, isLazy, isDraggable, isResizable } = model.useState();\n validateChildrenSize(children);\n\n return (\n <AutoSizer disableHeight>\n {({ width }) => {\n if (width === 0) {\n return null;\n }\n\n const layout = model.buildGridLayout(width);\n\n return (\n /**\n * The children is using a width of 100% so we need to guarantee that it is wrapped\n * in an element that has the calculated size given by the AutoSizer. The AutoSizer\n * has a width of 0 and will let its content overflow its div.\n */\n <div style={{ width: `${width}px`, height: '100%', position: 'relative', zIndex: 1 }}>\n <ReactGridLayout\n width={width}\n /**\n Disable draggable if mobile device, solving an issue with unintentionally\n moving panels. https://github.com/grafana/grafana/issues/18497\n theme.breakpoints.md = 769\n */\n isDraggable={isDraggable && width > 768}\n isResizable={isResizable ?? false}\n containerPadding={[0, 0]}\n useCSSTransforms={false}\n margin={[GRID_CELL_VMARGIN, GRID_CELL_VMARGIN]}\n cols={GRID_COLUMN_COUNT}\n rowHeight={GRID_CELL_HEIGHT}\n draggableHandle={`.grid-drag-handle-${model.state.key}`}\n draggableCancel=\".grid-drag-cancel\"\n // @ts-ignore: ignoring for now until we make the size type numbers-only\n layout={layout}\n onDragStop={model.onDragStop}\n onResizeStop={model.onResizeStop}\n onLayoutChange={model.onLayoutChange}\n isBounded={false}\n >\n {layout.map((gridItem, index) => (\n <GridItemWrapper\n key={gridItem.i}\n grid={model}\n layoutItem={gridItem}\n index={index}\n isLazy={isLazy}\n totalCount={layout.length}\n />\n ))}\n </ReactGridLayout>\n </div>\n );\n }}\n </AutoSizer>\n );\n}\n\ninterface GridItemWrapperProps extends React.HTMLAttributes<HTMLDivElement> {\n grid: SceneGridLayout;\n layoutItem: ReactGridLayout.Layout;\n index: number;\n totalCount: number;\n isLazy?: boolean;\n}\n\nconst GridItemWrapper = React.forwardRef<HTMLDivElement, GridItemWrapperProps>((props, ref) => {\n const { grid, layoutItem, index, totalCount, isLazy, style, onLoad, onChange, ...divProps } = props;\n const sceneChild = grid.getSceneLayoutChild(layoutItem.i)!;\n const className = sceneChild.getClassName?.();\n const theme = useTheme2();\n\n const boostedCount = useRef(0);\n const [_, forceUpdate] = useReducer((x) => x + 1, 0);\n\n const boostZIndex = useCallback(() => {\n boostedCount.current += 1;\n forceUpdate();\n\n return () => {\n boostedCount.current -= 1;\n forceUpdate();\n };\n }, [forceUpdate]);\n\n const ctxValue = useMemo(() => ({ boostZIndex }), [boostZIndex]);\n const descIndex = totalCount - index;\n const innerContent = <sceneChild.Component model={sceneChild} key={sceneChild.state.key} />;\n const innerContentWithContext = LayoutItemContext ? (\n <LayoutItemContext.Provider value={ctxValue}>{innerContent}</LayoutItemContext.Provider>\n ) : (\n innerContent\n );\n\n const newStyle = {\n ...style,\n zIndex: boostedCount.current === 0 ? descIndex : theme.zIndex.dropdown,\n };\n\n if (isLazy) {\n return (\n <LazyLoader\n {...divProps}\n key={sceneChild.state.key!}\n data-griditem-key={sceneChild.state.key}\n className={cx(className, props.className)}\n style={newStyle}\n ref={ref}\n >\n {innerContentWithContext}\n </LazyLoader>\n );\n }\n\n return (\n <div\n {...divProps}\n ref={ref}\n key={sceneChild.state.key}\n data-griditem-key={sceneChild.state.key}\n className={cx(className, props.className)}\n style={newStyle}\n >\n {innerContentWithContext}\n </div>\n );\n});\n\nGridItemWrapper.displayName = 'GridItemWrapper';\n\nfunction validateChildrenSize(children: SceneGridItemLike[]) {\n if (\n children.some(\n (c) =>\n c.state.height === undefined ||\n c.state.width === undefined ||\n c.state.x === undefined ||\n c.state.y === undefined\n )\n ) {\n throw new Error('All children must have a size specified');\n }\n}\n"],"names":[],"mappings":"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"}
package/dist/esm/index.js CHANGED
@@ -4,6 +4,7 @@ import { cloneSceneObjectState } from './core/sceneGraph/utils.js';
4
4
  import { registerRuntimeDataSource } from './querying/RuntimeDataSource.js';
5
5
  export { RuntimeDataSource, registerRuntimeDataSource } from './querying/RuntimeDataSource.js';
6
6
  import { registerVariableMacro } from './variables/macros/index.js';
7
+ import { renderPrometheusLabelFilters } from './variables/utils.js';
7
8
  import { isAdHocVariable, isConstantVariable, isCustomVariable, isDataSourceVariable, isIntervalVariable, isQueryVariable, isTextBoxVariable } from './variables/variants/guards.js';
8
9
  export { isDataRequestEnricher, isSceneObject } from './core/types.js';
9
10
  export { SceneObjectStateChangedEvent, UserActionEvent } from './core/events.js';
@@ -73,6 +74,7 @@ const sceneUtils = {
73
74
  registerRuntimeDataSource,
74
75
  registerVariableMacro,
75
76
  cloneSceneObjectState,
77
+ renderPrometheusLabelFilters,
76
78
  isAdHocVariable,
77
79
  isConstantVariable,
78
80
  isCustomVariable,
@@ -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 { registerVariableMacro } from './variables/macros';\nimport {\n isAdHocVariable,\n isQueryVariable,\n isTextBoxVariable,\n isCustomVariable,\n isDataSourceVariable,\n isConstantVariable,\n isIntervalVariable,\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 } 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 { SceneDataLayers } from './querying/SceneDataLayers';\nexport { SceneDataLayerBase } from './querying/layers/SceneDataLayerBase';\nexport { SceneDataLayerControls } from './querying/layers/SceneDataLayerControls';\nexport { SceneDataTransformer } from './querying/SceneDataTransformer';\nexport { registerRuntimeDataSource, RuntimeDataSource } from './querying/RuntimeDataSource';\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 { 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 { AdHocFilterSet } from './variables/adhoc/AdHocFiltersSet';\nexport { AdHocFiltersVariable } from './variables/adhoc/AdHocFiltersVariable';\nexport { type MacroVariableConstructor } from './variables/macros/types';\n\nexport { type UrlSyncManagerLike as 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 { 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 { PanelBuilders, PanelOptionsBuilders, FieldConfigBuilders } 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\n // Variable guards\n isAdHocVariable,\n isConstantVariable,\n isCustomVariable,\n isDataSourceVariable,\n isIntervalVariable,\n isQueryVariable,\n isTextBoxVariable,\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6FO,MAAM,UAAa,GAAA;AAAA,EACxB,kBAAA;AAAA,EACA,0BAAA;AAAA,EACA,yBAAA;AAAA,EACA,qBAAA;AAAA,EACA,qBAAA;AAAA,EAGA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,oBAAA;AAAA,EACA,kBAAA;AAAA,EACA,eAAA;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 { 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} 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 } 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 { SceneDataLayers } from './querying/SceneDataLayers';\nexport { SceneDataLayerBase } from './querying/layers/SceneDataLayerBase';\nexport { SceneDataLayerControls } from './querying/layers/SceneDataLayerControls';\nexport { SceneDataTransformer } from './querying/SceneDataTransformer';\nexport { registerRuntimeDataSource, RuntimeDataSource } from './querying/RuntimeDataSource';\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 { 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 { AdHocFilterSet } from './variables/adhoc/AdHocFiltersSet';\nexport { AdHocFiltersVariable } from './variables/adhoc/AdHocFiltersVariable';\nexport { type MacroVariableConstructor } from './variables/macros/types';\n\nexport { type UrlSyncManagerLike as 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 { 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 { PanelBuilders, PanelOptionsBuilders, FieldConfigBuilders } 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 renderPrometheusLabelFilters,\n\n // Variable guards\n isAdHocVariable,\n isConstantVariable,\n isCustomVariable,\n isDataSourceVariable,\n isIntervalVariable,\n isQueryVariable,\n isTextBoxVariable,\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8FO,MAAM,UAAa,GAAA;AAAA,EACxB,kBAAA;AAAA,EACA,0BAAA;AAAA,EACA,yBAAA;AAAA,EACA,qBAAA;AAAA,EACA,qBAAA;AAAA,EACA,4BAAA;AAAA,EAGA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,oBAAA;AAAA,EACA,kBAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AACF;;;;"}
@@ -8,6 +8,7 @@ import { ControlsLabel } from '../../utils/ControlsLabel.js';
8
8
  import { AdHocFilterRenderer } from './AdHocFilterRenderer.js';
9
9
  import { AdHocFilterBuilder } from './AdHocFilterBuilder.js';
10
10
  import { css } from '@emotion/css';
11
+ import { sceneGraph } from '../../core/sceneGraph/index.js';
11
12
 
12
13
  var __defProp = Object.defineProperty;
13
14
  var __defProps = Object.defineProperties;
@@ -105,7 +106,8 @@ class AdHocFilterSet extends SceneObjectBase {
105
106
  return [];
106
107
  }
107
108
  const otherFilters = this.state.filters.filter((f) => f.key !== filter.key).concat(this.state.baseFilters);
108
- let values = await ds.getTagValues({ key: filter.key, filters: otherFilters });
109
+ const timeRange = sceneGraph.getTimeRange(this).state.value;
110
+ let values = await ds.getTagValues({ key: filter.key, filters: otherFilters, timeRange });
109
111
  if (override) {
110
112
  values = values.concat(override.values);
111
113
  }
@@ -1 +1 @@
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, ControlsLayout } 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 * @experimental\n * Controls the layout and design of the label.\n * Vertical layout does not yet support operator selector.\n */\n layout?: ControlsLayout;\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 * Filter out the keys that do not match the regex.\n */\n tagKeyRegexFilter?: RegExp;\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 layout: 'horizontal',\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 const tagKeyRegexFilter = this.state.tagKeyRegexFilter;\n if (tagKeyRegexFilter) {\n keys = keys.filter((f) => f.text.match(tagKeyRegexFilter));\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, layout, name } = model.useState();\n const styles = useStyles2(getStyles);\n\n return (\n <div className={styles.wrapper}>\n {layout !== 'vertical' && <ControlsLabel label={name ?? '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(2),\n alignItems: 'flex-end',\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
+ {"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, ControlsLayout } 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';\nimport { sceneGraph } from '../../core/sceneGraph';\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 * @experimental\n * Controls the layout and design of the label.\n * Vertical layout does not yet support operator selector.\n */\n layout?: ControlsLayout;\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 * Filter out the keys that do not match the regex.\n */\n tagKeyRegexFilter?: RegExp;\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 layout: 'horizontal',\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 const tagKeyRegexFilter = this.state.tagKeyRegexFilter;\n if (tagKeyRegexFilter) {\n keys = keys.filter((f) => f.text.match(tagKeyRegexFilter));\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\n const timeRange = sceneGraph.getTimeRange(this).state.value;\n let values = await ds.getTagValues({ key: filter.key, filters: otherFilters, timeRange });\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, layout, name } = model.useState();\n const styles = useStyles2(getStyles);\n\n return (\n <div className={styles.wrapper}>\n {layout !== 'vertical' && <ControlsLabel label={name ?? '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(2),\n alignItems: 'flex-end',\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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"}
@@ -3,6 +3,7 @@ import { SceneObjectBase } from '../../core/SceneObjectBase.js';
3
3
  import { SceneVariableValueChangedEvent } from '../types.js';
4
4
  import { AdHocFilterSet } from './AdHocFiltersSet.js';
5
5
  import { VariableHide } from '@grafana/schema';
6
+ import { renderPrometheusLabelFilters } from '../utils.js';
6
7
 
7
8
  var __defProp = Object.defineProperty;
8
9
  var __defProps = Object.defineProperties;
@@ -38,7 +39,7 @@ const _AdHocFiltersVariable = class extends SceneObjectBase {
38
39
  constructor(state) {
39
40
  var _a;
40
41
  super(__spreadProps(__spreadValues({}, state), {
41
- filterExpression: (_a = state.filterExpression) != null ? _a : renderFilters(state.set.state.filters)
42
+ filterExpression: (_a = state.filterExpression) != null ? _a : renderPrometheusLabelFilters(state.set.state.filters)
42
43
  }));
43
44
  this.addActivationHandler(() => {
44
45
  this._subs.add(
@@ -55,7 +56,7 @@ const _AdHocFiltersVariable = class extends SceneObjectBase {
55
56
  return this.state.filterExpression;
56
57
  }
57
58
  _updateFilterExpression(filters, publishEvent) {
58
- let expr = renderFilters(filters);
59
+ let expr = renderPrometheusLabelFilters(filters);
59
60
  if (expr === this.state.filterExpression) {
60
61
  return;
61
62
  }
@@ -71,35 +72,6 @@ AdHocFiltersVariable.Component = ({ model }) => {
71
72
  model: model.state.set
72
73
  });
73
74
  };
74
- function renderFilters(filters) {
75
- let expr = "";
76
- for (const filter of filters) {
77
- expr += `${renderFilter(filter)},`;
78
- }
79
- if (expr.length > 0) {
80
- expr = expr.slice(0, -1);
81
- }
82
- return expr;
83
- }
84
- function renderFilter(filter) {
85
- let value = "";
86
- if (filter.operator === "=~" || filter.operator === "!~\xA8") {
87
- value = escapeLabelValueInRegexSelector(filter.value);
88
- } else {
89
- value = escapeLabelValueInExactSelector(filter.value);
90
- }
91
- return `${filter.key}${filter.operator}"${value}"`;
92
- }
93
- function escapeLabelValueInExactSelector(labelValue) {
94
- return labelValue.replace(/\\/g, "\\\\").replace(/\n/g, "\\n").replace(/"/g, '\\"');
95
- }
96
- function escapeLabelValueInRegexSelector(labelValue) {
97
- return escapeLabelValueInExactSelector(escapeLokiRegexp(labelValue));
98
- }
99
- const RE2_METACHARACTERS = /[*+?()|\\.\[\]{}^$]/g;
100
- function escapeLokiRegexp(value) {
101
- return value.replace(RE2_METACHARACTERS, "\\$&");
102
- }
103
75
 
104
- export { AdHocFiltersVariable, escapeLabelValueInExactSelector, escapeLabelValueInRegexSelector };
76
+ export { AdHocFiltersVariable };
105
77
  //# sourceMappingURL=AdHocFiltersVariable.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AdHocFiltersVariable.js","sources":["../../../../src/variables/adhoc/AdHocFiltersVariable.tsx"],"sourcesContent":["import React from 'react';\nimport { AdHocVariableFilter } from '@grafana/data';\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { SceneVariable, SceneVariableState, SceneVariableValueChangedEvent } from '../types';\nimport { AdHocFilterSet, AdHocFilterSetState } from './AdHocFiltersSet';\nimport { SceneComponentProps } from '../../core/types';\nimport { VariableHide } from '@grafana/schema';\n\nexport interface AdHocFiltersVariableState extends SceneVariableState {\n /**\n * Important that you set applyFiltersTo: 'manual' when you create the set.\n */\n set: AdHocFilterSet;\n /**\n * This is the expression that the filters resulted in. Defaults to\n * Prometheus / Loki compatible label fitler expression\n */\n filterExpression?: string;\n}\n\nexport type AdHocFiltersVariableCreateHelperArgs = Pick<\n AdHocFilterSetState,\n 'name' | 'filters' | 'baseFilters' | 'datasource' | 'tagKeyRegexFilter' | 'getTagKeysProvider' | 'getTagValuesProvider' | 'name' | 'layout'\n>;\n\nexport class AdHocFiltersVariable\n extends SceneObjectBase<AdHocFiltersVariableState>\n implements SceneVariable<AdHocFiltersVariableState>\n{\n /** Helper factory function that makes sure AdHocFilterSet is created correctly */\n public static create(state: AdHocFiltersVariableCreateHelperArgs): AdHocFiltersVariable {\n return new AdHocFiltersVariable({\n type: 'adhoc',\n hide: VariableHide.hideLabel,\n name: state.name ?? 'Filters',\n set: new AdHocFilterSet({\n ...state,\n // Main reason for this helper factory functyion\n applyMode: 'manual',\n }),\n });\n }\n\n public constructor(state: AdHocFiltersVariableState) {\n super({\n ...state,\n filterExpression: state.filterExpression ?? renderFilters(state.set.state.filters),\n });\n\n // Subscribe to filter changes and up the variable value (filterExpression)\n this.addActivationHandler(() => {\n this._subs.add(\n this.state.set.subscribeToState((newState, prevState) => {\n if (newState.filters !== prevState.filters) {\n this._updateFilterExpression(newState.filters, true);\n }\n })\n );\n\n this._updateFilterExpression(this.state.set.state.filters, false);\n });\n }\n\n public getValue() {\n return this.state.filterExpression;\n }\n\n private _updateFilterExpression(filters: AdHocVariableFilter[], publishEvent: boolean) {\n let expr = renderFilters(filters);\n\n if (expr === this.state.filterExpression) {\n return;\n }\n\n this.setState({ filterExpression: expr });\n\n if (publishEvent) {\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n }\n }\n\n // Same UI as the standalone AdHocFilterSet\n public static Component = ({ model }: SceneComponentProps<AdHocFiltersVariable>) => {\n return <AdHocFilterSet.Component model={model.state.set} />;\n };\n}\n\nfunction renderFilters(filters: AdHocVariableFilter[]) {\n let expr = '';\n for (const filter of filters) {\n expr += `${renderFilter(filter)},`;\n }\n\n if (expr.length > 0) {\n expr = expr.slice(0, -1);\n }\n\n return expr;\n}\n\nfunction renderFilter(filter: AdHocVariableFilter) {\n let value = '';\n\n if (filter.operator === '=~' || filter.operator === '!~¨') {\n value = escapeLabelValueInRegexSelector(filter.value);\n } else {\n value = escapeLabelValueInExactSelector(filter.value);\n }\n\n return `${filter.key}${filter.operator}\"${value}\"`;\n}\n\n// based on the openmetrics-documentation, the 3 symbols we have to handle are:\n// - \\n ... the newline character\n// - \\ ... the backslash character\n// - \" ... the double-quote character\nexport function escapeLabelValueInExactSelector(labelValue: string): string {\n return labelValue.replace(/\\\\/g, '\\\\\\\\').replace(/\\n/g, '\\\\n').replace(/\"/g, '\\\\\"');\n}\n\nexport function escapeLabelValueInRegexSelector(labelValue: string): string {\n return escapeLabelValueInExactSelector(escapeLokiRegexp(labelValue));\n}\n\nexport function isRegexSelector(selector?: string) {\n if (selector && (selector.includes('=~') || selector.includes('!~'))) {\n return true;\n }\n return false;\n}\n\n// Loki regular-expressions use the RE2 syntax (https://github.com/google/re2/wiki/Syntax),\n// so every character that matches something in that list has to be escaped.\n// the list of meta characters is: *+?()|\\.[]{}^$\n// we make a javascript regular expression that matches those characters:\nconst RE2_METACHARACTERS = /[*+?()|\\\\.\\[\\]{}^$]/g;\nfunction escapeLokiRegexp(value: string): string {\n return value.replace(RE2_METACHARACTERS, '\\\\$&');\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AdHocFiltersVariable.js","sources":["../../../../src/variables/adhoc/AdHocFiltersVariable.tsx"],"sourcesContent":["import React from 'react';\nimport { AdHocVariableFilter } from '@grafana/data';\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { SceneVariable, SceneVariableState, SceneVariableValueChangedEvent, VariableValue } from '../types';\nimport { AdHocFilterSet, AdHocFilterSetState } from './AdHocFiltersSet';\nimport { SceneComponentProps } from '../../core/types';\nimport { VariableHide } from '@grafana/schema';\nimport { renderPrometheusLabelFilters } from '../utils';\n\nexport interface AdHocFiltersVariableState extends SceneVariableState {\n /**\n * Important that you set applyFiltersTo: 'manual' when you create the set.\n */\n set: AdHocFilterSet;\n /**\n * This is the expression that the filters resulted in. Defaults to\n * Prometheus / Loki compatible label fitler expression\n */\n filterExpression?: string;\n}\n\nexport type AdHocFiltersVariableCreateHelperArgs = Pick<\n AdHocFilterSetState,\n 'name' | 'filters' | 'baseFilters' | 'datasource' | 'tagKeyRegexFilter' | 'getTagKeysProvider' | 'getTagValuesProvider' | 'name' | 'layout'\n>;\n\nexport class AdHocFiltersVariable\n extends SceneObjectBase<AdHocFiltersVariableState>\n implements SceneVariable<AdHocFiltersVariableState>\n{\n /** Helper factory function that makes sure AdHocFilterSet is created correctly */\n public static create(state: AdHocFiltersVariableCreateHelperArgs): AdHocFiltersVariable {\n return new AdHocFiltersVariable({\n type: 'adhoc',\n hide: VariableHide.hideLabel,\n name: state.name ?? 'Filters',\n set: new AdHocFilterSet({\n ...state,\n // Main reason for this helper factory functyion\n applyMode: 'manual',\n }),\n });\n }\n\n public constructor(state: AdHocFiltersVariableState) {\n super({\n ...state,\n filterExpression: state.filterExpression ?? renderPrometheusLabelFilters(state.set.state.filters),\n });\n\n // Subscribe to filter changes and up the variable value (filterExpression)\n this.addActivationHandler(() => {\n this._subs.add(\n this.state.set.subscribeToState((newState, prevState) => {\n if (newState.filters !== prevState.filters) {\n this._updateFilterExpression(newState.filters, true);\n }\n })\n );\n\n this._updateFilterExpression(this.state.set.state.filters, false);\n });\n }\n\n public getValue(): VariableValue | undefined {\n return this.state.filterExpression;\n }\n\n private _updateFilterExpression(filters: AdHocVariableFilter[], publishEvent: boolean) {\n let expr = renderPrometheusLabelFilters(filters);\n\n if (expr === this.state.filterExpression) {\n return;\n }\n\n this.setState({ filterExpression: expr });\n\n if (publishEvent) {\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n }\n }\n\n // Same UI as the standalone AdHocFilterSet\n public static Component = ({ model }: SceneComponentProps<AdHocFiltersVariable>) => {\n return <AdHocFilterSet.Component model={model.state.set} />;\n };\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA0BO,MAAM,qBAAA,GAAN,cACG,eAEV,CAAA;AAAA,EAEE,OAAc,OAAO,KAAmE,EAAA;AA/B1F,IAAA,IAAA,EAAA,CAAA;AAgCI,IAAA,OAAO,IAAI,qBAAqB,CAAA;AAAA,MAC9B,IAAM,EAAA,OAAA;AAAA,MACN,MAAM,YAAa,CAAA,SAAA;AAAA,MACnB,IAAA,EAAA,CAAM,EAAM,GAAA,KAAA,CAAA,IAAA,KAAN,IAAc,GAAA,EAAA,GAAA,SAAA;AAAA,MACpB,GAAK,EAAA,IAAI,cAAe,CAAA,aAAA,CAAA,cAAA,CAAA,EAAA,EACnB,KADmB,CAAA,EAAA;AAAA,QAGtB,SAAW,EAAA,QAAA;AAAA,OACZ,CAAA,CAAA;AAAA,KACF,CAAA,CAAA;AAAA,GACH;AAAA,EAEO,YAAY,KAAkC,EAAA;AA5CvD,IAAA,IAAA,EAAA,CAAA;AA6CI,IAAA,KAAA,CAAM,iCACD,KADC,CAAA,EAAA;AAAA,MAEJ,gBAAA,EAAA,CAAkB,WAAM,gBAAN,KAAA,IAAA,GAAA,EAAA,GAA0B,6BAA6B,KAAM,CAAA,GAAA,CAAI,MAAM,OAAO,CAAA;AAAA,KACjG,CAAA,CAAA,CAAA;AAGD,IAAA,IAAA,CAAK,qBAAqB,MAAM;AAC9B,MAAA,IAAA,CAAK,KAAM,CAAA,GAAA;AAAA,QACT,KAAK,KAAM,CAAA,GAAA,CAAI,gBAAiB,CAAA,CAAC,UAAU,SAAc,KAAA;AACvD,UAAI,IAAA,QAAA,CAAS,OAAY,KAAA,SAAA,CAAU,OAAS,EAAA;AAC1C,YAAK,IAAA,CAAA,uBAAA,CAAwB,QAAS,CAAA,OAAA,EAAS,IAAI,CAAA,CAAA;AAAA,WACrD;AAAA,SACD,CAAA;AAAA,OACH,CAAA;AAEA,MAAA,IAAA,CAAK,wBAAwB,IAAK,CAAA,KAAA,CAAM,GAAI,CAAA,KAAA,CAAM,SAAS,KAAK,CAAA,CAAA;AAAA,KACjE,CAAA,CAAA;AAAA,GACH;AAAA,EAEO,QAAsC,GAAA;AAC3C,IAAA,OAAO,KAAK,KAAM,CAAA,gBAAA,CAAA;AAAA,GACpB;AAAA,EAEQ,uBAAA,CAAwB,SAAgC,YAAuB,EAAA;AACrF,IAAI,IAAA,IAAA,GAAO,6BAA6B,OAAO,CAAA,CAAA;AAE/C,IAAI,IAAA,IAAA,KAAS,IAAK,CAAA,KAAA,CAAM,gBAAkB,EAAA;AACxC,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,QAAS,CAAA,EAAE,gBAAkB,EAAA,IAAA,EAAM,CAAA,CAAA;AAExC,IAAA,IAAI,YAAc,EAAA;AAChB,MAAA,IAAA,CAAK,YAAa,CAAA,IAAI,8BAA+B,CAAA,IAAI,GAAG,IAAI,CAAA,CAAA;AAAA,KAClE;AAAA,GACF;AAMF,CAAA,CAAA;AA5DO,IAAM,oBAAN,GAAA,sBAAA;AAAM,oBAAA,CAyDG,SAAY,GAAA,CAAC,EAAE,KAAA,EAAuD,KAAA;AAClF,EAAO,uBAAA,KAAA,CAAA,aAAA,CAAC,eAAe,SAAf,EAAA;AAAA,IAAyB,KAAA,EAAO,MAAM,KAAM,CAAA,GAAA;AAAA,GAAK,CAAA,CAAA;AAC3D,CAAA;;;;"}
@@ -14,6 +14,28 @@ function safeStringifyValue(value) {
14
14
  }
15
15
  return "";
16
16
  }
17
+ function renderPrometheusLabelFilters(filters) {
18
+ return filters.map((filter) => renderFilter(filter)).join(",");
19
+ }
20
+ function renderFilter(filter) {
21
+ let value = "";
22
+ if (filter.operator === "=~" || filter.operator === "!~\xA8") {
23
+ value = escapeLabelValueInRegexSelector(filter.value);
24
+ } else {
25
+ value = escapeLabelValueInExactSelector(filter.value);
26
+ }
27
+ return `${filter.key}${filter.operator}"${value}"`;
28
+ }
29
+ function escapeLabelValueInExactSelector(labelValue) {
30
+ return labelValue.replace(/\\/g, "\\\\").replace(/\n/g, "\\n").replace(/"/g, '\\"');
31
+ }
32
+ function escapeLabelValueInRegexSelector(labelValue) {
33
+ return escapeLabelValueInExactSelector(escapeLokiRegexp(labelValue));
34
+ }
35
+ const RE2_METACHARACTERS = /[*+?()|\\.\[\]{}^$]/g;
36
+ function escapeLokiRegexp(value) {
37
+ return value.replace(RE2_METACHARACTERS, "\\$&");
38
+ }
17
39
 
18
- export { isVariableValueEqual, safeStringifyValue };
40
+ export { escapeLabelValueInExactSelector, escapeLabelValueInRegexSelector, isVariableValueEqual, renderPrometheusLabelFilters, safeStringifyValue };
19
41
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../src/variables/utils.ts"],"sourcesContent":["import { isEqual } from 'lodash';\nimport { VariableValue } from './types';\n\nexport function isVariableValueEqual(a: VariableValue | null | undefined, b: VariableValue | null | undefined) {\n if (a === b) {\n return true;\n }\n\n return isEqual(a, b);\n}\n\nexport function safeStringifyValue(value: unknown) {\n try {\n return JSON.stringify(value, null);\n } catch (error) {\n console.error(error);\n }\n\n return '';\n}\n"],"names":[],"mappings":";;AAGgB,SAAA,oBAAA,CAAqB,GAAqC,CAAqC,EAAA;AAC7G,EAAA,IAAI,MAAM,CAAG,EAAA;AACX,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAEA,EAAO,OAAA,OAAA,CAAQ,GAAG,CAAC,CAAA,CAAA;AACrB,CAAA;AAEO,SAAS,mBAAmB,KAAgB,EAAA;AACjD,EAAI,IAAA;AACF,IAAO,OAAA,IAAA,CAAK,SAAU,CAAA,KAAA,EAAO,IAAI,CAAA,CAAA;AAAA,WAC1B,KAAP,EAAA;AACA,IAAA,OAAA,CAAQ,MAAM,KAAK,CAAA,CAAA;AAAA,GACrB;AAEA,EAAO,OAAA,EAAA,CAAA;AACT;;;;"}
1
+ {"version":3,"file":"utils.js","sources":["../../../src/variables/utils.ts"],"sourcesContent":["import { isEqual } from 'lodash';\nimport { VariableValue } from './types';\nimport { AdHocVariableFilter } from '@grafana/data';\n\nexport function isVariableValueEqual(a: VariableValue | null | undefined, b: VariableValue | null | undefined) {\n if (a === b) {\n return true;\n }\n\n return isEqual(a, b);\n}\n\nexport function safeStringifyValue(value: unknown) {\n try {\n return JSON.stringify(value, null);\n } catch (error) {\n console.error(error);\n }\n\n return '';\n}\n\nexport function renderPrometheusLabelFilters(filters: AdHocVariableFilter[]) {\n return filters.map((filter) => renderFilter(filter)).join(',');\n}\n\nfunction renderFilter(filter: AdHocVariableFilter) {\n let value = '';\n\n if (filter.operator === '=~' || filter.operator === '!~¨') {\n value = escapeLabelValueInRegexSelector(filter.value);\n } else {\n value = escapeLabelValueInExactSelector(filter.value);\n }\n\n return `${filter.key}${filter.operator}\"${value}\"`;\n}\n\n// based on the openmetrics-documentation, the 3 symbols we have to handle are:\n// - \\n ... the newline character\n// - \\ ... the backslash character\n// - \" ... the double-quote character\nexport function escapeLabelValueInExactSelector(labelValue: string): string {\n return labelValue.replace(/\\\\/g, '\\\\\\\\').replace(/\\n/g, '\\\\n').replace(/\"/g, '\\\\\"');\n}\n\nexport function escapeLabelValueInRegexSelector(labelValue: string): string {\n return escapeLabelValueInExactSelector(escapeLokiRegexp(labelValue));\n}\n\nexport function isRegexSelector(selector?: string) {\n if (selector && (selector.includes('=~') || selector.includes('!~'))) {\n return true;\n }\n return false;\n}\n\n// Loki regular-expressions use the RE2 syntax (https://github.com/google/re2/wiki/Syntax),\n// so every character that matches something in that list has to be escaped.\n// the list of meta characters is: *+?()|\\.[]{}^$\n// we make a javascript regular expression that matches those characters:\nconst RE2_METACHARACTERS = /[*+?()|\\\\.\\[\\]{}^$]/g;\nfunction escapeLokiRegexp(value: string): string {\n return value.replace(RE2_METACHARACTERS, '\\\\$&');\n}\n"],"names":[],"mappings":";;AAIgB,SAAA,oBAAA,CAAqB,GAAqC,CAAqC,EAAA;AAC7G,EAAA,IAAI,MAAM,CAAG,EAAA;AACX,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAEA,EAAO,OAAA,OAAA,CAAQ,GAAG,CAAC,CAAA,CAAA;AACrB,CAAA;AAEO,SAAS,mBAAmB,KAAgB,EAAA;AACjD,EAAI,IAAA;AACF,IAAO,OAAA,IAAA,CAAK,SAAU,CAAA,KAAA,EAAO,IAAI,CAAA,CAAA;AAAA,WAC1B,KAAP,EAAA;AACA,IAAA,OAAA,CAAQ,MAAM,KAAK,CAAA,CAAA;AAAA,GACrB;AAEA,EAAO,OAAA,EAAA,CAAA;AACT,CAAA;AAEO,SAAS,6BAA6B,OAAgC,EAAA;AAC3E,EAAO,OAAA,OAAA,CAAQ,IAAI,CAAC,MAAA,KAAW,aAAa,MAAM,CAAC,CAAE,CAAA,IAAA,CAAK,GAAG,CAAA,CAAA;AAC/D,CAAA;AAEA,SAAS,aAAa,MAA6B,EAAA;AACjD,EAAA,IAAI,KAAQ,GAAA,EAAA,CAAA;AAEZ,EAAA,IAAI,MAAO,CAAA,QAAA,KAAa,IAAQ,IAAA,MAAA,CAAO,aAAa,QAAO,EAAA;AACzD,IAAQ,KAAA,GAAA,+BAAA,CAAgC,OAAO,KAAK,CAAA,CAAA;AAAA,GAC/C,MAAA;AACL,IAAQ,KAAA,GAAA,+BAAA,CAAgC,OAAO,KAAK,CAAA,CAAA;AAAA,GACtD;AAEA,EAAA,OAAO,CAAG,EAAA,MAAA,CAAO,GAAM,CAAA,EAAA,MAAA,CAAO,QAAY,CAAA,CAAA,EAAA,KAAA,CAAA,CAAA,CAAA,CAAA;AAC5C,CAAA;AAMO,SAAS,gCAAgC,UAA4B,EAAA;AAC1E,EAAO,OAAA,UAAA,CAAW,OAAQ,CAAA,KAAA,EAAO,MAAM,CAAA,CAAE,OAAQ,CAAA,KAAA,EAAO,KAAK,CAAA,CAAE,OAAQ,CAAA,IAAA,EAAM,KAAK,CAAA,CAAA;AACpF,CAAA;AAEO,SAAS,gCAAgC,UAA4B,EAAA;AAC1E,EAAO,OAAA,+BAAA,CAAgC,gBAAiB,CAAA,UAAU,CAAC,CAAA,CAAA;AACrE,CAAA;AAaA,MAAM,kBAAqB,GAAA,sBAAA,CAAA;AAC3B,SAAS,iBAAiB,KAAuB,EAAA;AAC/C,EAAO,OAAA,KAAA,CAAM,OAAQ,CAAA,kBAAA,EAAoB,MAAM,CAAA,CAAA;AACjD;;;;"}
package/dist/index.d.ts CHANGED
@@ -443,6 +443,8 @@ interface MacroVariableConstructor {
443
443
  */
444
444
  declare function registerVariableMacro(name: string, macro: MacroVariableConstructor): () => void;
445
445
 
446
+ declare function renderPrometheusLabelFilters(filters: AdHocVariableFilter[]): string;
447
+
446
448
  interface AdHocFilterSetState extends SceneObjectState {
447
449
  /** Defaults to Filters */
448
450
  name?: string;
@@ -531,7 +533,7 @@ declare class AdHocFiltersVariable extends SceneObjectBase<AdHocFiltersVariableS
531
533
  /** Helper factory function that makes sure AdHocFilterSet is created correctly */
532
534
  static create(state: AdHocFiltersVariableCreateHelperArgs): AdHocFiltersVariable;
533
535
  constructor(state: AdHocFiltersVariableState);
534
- getValue(): string | undefined;
536
+ getValue(): VariableValue | undefined;
535
537
  private _updateFilterExpression;
536
538
  static Component: ({ model }: SceneComponentProps<AdHocFiltersVariable>) => JSX.Element;
537
539
  }
@@ -2190,6 +2192,7 @@ declare const sceneUtils: {
2190
2192
  registerRuntimeDataSource: typeof registerRuntimeDataSource;
2191
2193
  registerVariableMacro: typeof registerVariableMacro;
2192
2194
  cloneSceneObjectState: typeof cloneSceneObjectState;
2195
+ renderPrometheusLabelFilters: typeof renderPrometheusLabelFilters;
2193
2196
  isAdHocVariable: typeof isAdHocVariable;
2194
2197
  isConstantVariable: typeof isConstantVariable;
2195
2198
  isCustomVariable: typeof isCustomVariable;