@grafana/scenes 0.0.1

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.
Files changed (102) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +26 -0
  3. package/dist/esm/components/NestedScene.js +119 -0
  4. package/dist/esm/components/NestedScene.js.map +1 -0
  5. package/dist/esm/components/Scene.js +39 -0
  6. package/dist/esm/components/Scene.js.map +1 -0
  7. package/dist/esm/components/SceneCanvasText.js +41 -0
  8. package/dist/esm/components/SceneCanvasText.js.map +1 -0
  9. package/dist/esm/components/SceneDragHandle.js +18 -0
  10. package/dist/esm/components/SceneDragHandle.js.map +1 -0
  11. package/dist/esm/components/ScenePanelRepeater.js +66 -0
  12. package/dist/esm/components/ScenePanelRepeater.js.map +1 -0
  13. package/dist/esm/components/SceneSubMenu.js +18 -0
  14. package/dist/esm/components/SceneSubMenu.js.map +1 -0
  15. package/dist/esm/components/SceneTimePicker.js +40 -0
  16. package/dist/esm/components/SceneTimePicker.js.map +1 -0
  17. package/dist/esm/components/SceneToolbarButton.js +28 -0
  18. package/dist/esm/components/SceneToolbarButton.js.map +1 -0
  19. package/dist/esm/components/VizPanel/VizPanel.js +105 -0
  20. package/dist/esm/components/VizPanel/VizPanel.js.map +1 -0
  21. package/dist/esm/components/VizPanel/VizPanelRenderer.js +76 -0
  22. package/dist/esm/components/VizPanel/VizPanelRenderer.js.map +1 -0
  23. package/dist/esm/components/layout/SceneFlexLayout.js +88 -0
  24. package/dist/esm/components/layout/SceneFlexLayout.js.map +1 -0
  25. package/dist/esm/components/layout/SceneGridLayout.js +288 -0
  26. package/dist/esm/components/layout/SceneGridLayout.js.map +1 -0
  27. package/dist/esm/components/layout/SceneGridRow.js +124 -0
  28. package/dist/esm/components/layout/SceneGridRow.js.map +1 -0
  29. package/dist/esm/components/layout/constants.js +7 -0
  30. package/dist/esm/components/layout/constants.js.map +1 -0
  31. package/dist/esm/core/SceneComponentWrapper.js +84 -0
  32. package/dist/esm/core/SceneComponentWrapper.js.map +1 -0
  33. package/dist/esm/core/SceneDataNode.js +7 -0
  34. package/dist/esm/core/SceneDataNode.js.map +1 -0
  35. package/dist/esm/core/SceneDataTransformer.js +51 -0
  36. package/dist/esm/core/SceneDataTransformer.js.map +1 -0
  37. package/dist/esm/core/SceneObjectBase.js +141 -0
  38. package/dist/esm/core/SceneObjectBase.js.map +1 -0
  39. package/dist/esm/core/SceneTimeRange.js +108 -0
  40. package/dist/esm/core/SceneTimeRange.js.map +1 -0
  41. package/dist/esm/core/events.js +8 -0
  42. package/dist/esm/core/events.js.map +1 -0
  43. package/dist/esm/core/sceneGraph.js +68 -0
  44. package/dist/esm/core/sceneGraph.js.map +1 -0
  45. package/dist/esm/core/types.js +6 -0
  46. package/dist/esm/core/types.js.map +1 -0
  47. package/dist/esm/core/utils.js +57 -0
  48. package/dist/esm/core/utils.js.map +1 -0
  49. package/dist/esm/index.js +33 -0
  50. package/dist/esm/index.js.map +1 -0
  51. package/dist/esm/querying/SceneQueryRunner.js +161 -0
  52. package/dist/esm/querying/SceneQueryRunner.js.map +1 -0
  53. package/dist/esm/services/SceneObjectUrlSyncConfig.js +18 -0
  54. package/dist/esm/services/SceneObjectUrlSyncConfig.js.map +1 -0
  55. package/dist/esm/services/UrlSyncManager.js +133 -0
  56. package/dist/esm/services/UrlSyncManager.js.map +1 -0
  57. package/dist/esm/utils/metricTree.js +53 -0
  58. package/dist/esm/utils/metricTree.js.map +1 -0
  59. package/dist/esm/variables/VariableDependencyConfig.js +86 -0
  60. package/dist/esm/variables/VariableDependencyConfig.js.map +1 -0
  61. package/dist/esm/variables/components/VariableValueSelect.js +58 -0
  62. package/dist/esm/variables/components/VariableValueSelect.js.map +1 -0
  63. package/dist/esm/variables/components/VariableValueSelectors.js +56 -0
  64. package/dist/esm/variables/components/VariableValueSelectors.js.map +1 -0
  65. package/dist/esm/variables/constants.js +6 -0
  66. package/dist/esm/variables/constants.js.map +1 -0
  67. package/dist/esm/variables/interpolation/ScopedVarsVariable.js +49 -0
  68. package/dist/esm/variables/interpolation/ScopedVarsVariable.js.map +1 -0
  69. package/dist/esm/variables/interpolation/defaults.js +17 -0
  70. package/dist/esm/variables/interpolation/defaults.js.map +1 -0
  71. package/dist/esm/variables/interpolation/formatRegistry.js +280 -0
  72. package/dist/esm/variables/interpolation/formatRegistry.js.map +1 -0
  73. package/dist/esm/variables/interpolation/sceneInterpolator.js +83 -0
  74. package/dist/esm/variables/interpolation/sceneInterpolator.js.map +1 -0
  75. package/dist/esm/variables/sets/SceneVariableSet.js +123 -0
  76. package/dist/esm/variables/sets/SceneVariableSet.js.map +1 -0
  77. package/dist/esm/variables/types.js +8 -0
  78. package/dist/esm/variables/types.js.map +1 -0
  79. package/dist/esm/variables/variants/ConstantVariable.js +33 -0
  80. package/dist/esm/variables/variants/ConstantVariable.js.map +1 -0
  81. package/dist/esm/variables/variants/CustomVariable.js +58 -0
  82. package/dist/esm/variables/variants/CustomVariable.js.map +1 -0
  83. package/dist/esm/variables/variants/DataSourceVariable.js +92 -0
  84. package/dist/esm/variables/variants/DataSourceVariable.js.map +1 -0
  85. package/dist/esm/variables/variants/MultiValueVariable.js +183 -0
  86. package/dist/esm/variables/variants/MultiValueVariable.js.map +1 -0
  87. package/dist/esm/variables/variants/TestVariable.js +81 -0
  88. package/dist/esm/variables/variants/TestVariable.js.map +1 -0
  89. package/dist/esm/variables/variants/query/QueryVariable.js +137 -0
  90. package/dist/esm/variables/variants/query/QueryVariable.js.map +1 -0
  91. package/dist/esm/variables/variants/query/createQueryVariableRunner.js +93 -0
  92. package/dist/esm/variables/variants/query/createQueryVariableRunner.js.map +1 -0
  93. package/dist/esm/variables/variants/query/guards.js +18 -0
  94. package/dist/esm/variables/variants/query/guards.js.map +1 -0
  95. package/dist/esm/variables/variants/query/toMetricFindValues.js +93 -0
  96. package/dist/esm/variables/variants/query/toMetricFindValues.js.map +1 -0
  97. package/dist/esm/variables/variants/query/utils.js +93 -0
  98. package/dist/esm/variables/variants/query/utils.js.map +1 -0
  99. package/dist/index.d.ts +796 -0
  100. package/dist/index.js +3356 -0
  101. package/dist/index.js.map +1 -0
  102. package/package.json +103 -0
@@ -0,0 +1,81 @@
1
+ import { Subject, Observable } from 'rxjs';
2
+ import { sceneGraph } from '../../core/sceneGraph.js';
3
+ import { queryMetricTree } from '../../utils/metricTree.js';
4
+ import { VariableDependencyConfig } from '../VariableDependencyConfig.js';
5
+ import { renderSelectForVariable } from '../components/VariableValueSelect.js';
6
+ import { MultiValueVariable } from './MultiValueVariable.js';
7
+
8
+ var __defProp = Object.defineProperty;
9
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
10
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
11
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
12
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
13
+ var __spreadValues = (a, b) => {
14
+ for (var prop in b || (b = {}))
15
+ if (__hasOwnProp.call(b, prop))
16
+ __defNormalProp(a, prop, b[prop]);
17
+ if (__getOwnPropSymbols)
18
+ for (var prop of __getOwnPropSymbols(b)) {
19
+ if (__propIsEnum.call(b, prop))
20
+ __defNormalProp(a, prop, b[prop]);
21
+ }
22
+ return a;
23
+ };
24
+ class TestVariable extends MultiValueVariable {
25
+ constructor(initialState) {
26
+ super(__spreadValues({
27
+ type: "custom",
28
+ name: "Test",
29
+ value: "Value",
30
+ text: "Text",
31
+ query: "Query",
32
+ options: []
33
+ }, initialState));
34
+ this.completeUpdate = new Subject();
35
+ this.isGettingValues = true;
36
+ this.getValueOptionsCount = 0;
37
+ this._variableDependency = new VariableDependencyConfig(this, {
38
+ statePaths: ["query"]
39
+ });
40
+ }
41
+ getValueOptions(args) {
42
+ const { delayMs } = this.state;
43
+ this.getValueOptionsCount += 1;
44
+ return new Observable((observer) => {
45
+ this.setState({ loading: true });
46
+ const sub = this.completeUpdate.subscribe({
47
+ next: () => {
48
+ observer.next(this.issueQuery());
49
+ }
50
+ });
51
+ let timeout;
52
+ if (delayMs) {
53
+ timeout = setTimeout(() => this.signalUpdateCompleted(), delayMs);
54
+ }
55
+ this.isGettingValues = true;
56
+ return () => {
57
+ sub.unsubscribe();
58
+ clearTimeout(timeout);
59
+ this.isGettingValues = false;
60
+ };
61
+ });
62
+ }
63
+ issueQuery() {
64
+ const interpolatedQuery = sceneGraph.interpolate(this, this.state.query);
65
+ const options = queryMetricTree(interpolatedQuery).map((x) => ({ label: x.name, value: x.name }));
66
+ this.setState({
67
+ issuedQuery: interpolatedQuery,
68
+ options
69
+ });
70
+ return options;
71
+ }
72
+ signalUpdateCompleted() {
73
+ this.completeUpdate.next(1);
74
+ }
75
+ }
76
+ TestVariable.Component = ({ model }) => {
77
+ return renderSelectForVariable(model);
78
+ };
79
+
80
+ export { TestVariable };
81
+ //# sourceMappingURL=TestVariable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestVariable.js","sources":["../../../../src/variables/variants/TestVariable.tsx"],"sourcesContent":["import { Observable, Subject } from 'rxjs';\n\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { SceneComponentProps } from '../../core/types';\nimport { queryMetricTree } from '../../utils/metricTree';\nimport { VariableDependencyConfig } from '../VariableDependencyConfig';\nimport { renderSelectForVariable } from '../components/VariableValueSelect';\nimport { VariableValueOption } from '../types';\n\nimport { MultiValueVariable, MultiValueVariableState, VariableGetOptionsArgs } from './MultiValueVariable';\n\nexport interface TestVariableState extends MultiValueVariableState {\n query: string;\n delayMs?: number;\n issuedQuery?: string;\n}\n\n/**\n * This variable is only designed for unit tests and potentially e2e tests.\n */\nexport class TestVariable extends MultiValueVariable<TestVariableState> {\n private completeUpdate = new Subject<number>();\n public isGettingValues = true;\n public getValueOptionsCount = 0;\n\n protected _variableDependency = new VariableDependencyConfig(this, {\n statePaths: ['query'],\n });\n\n public constructor(initialState: Partial<TestVariableState>) {\n super({\n type: 'custom',\n name: 'Test',\n value: 'Value',\n text: 'Text',\n query: 'Query',\n options: [],\n ...initialState,\n });\n }\n\n public getValueOptions(args: VariableGetOptionsArgs): Observable<VariableValueOption[]> {\n const { delayMs } = this.state;\n\n this.getValueOptionsCount += 1;\n\n return new Observable<VariableValueOption[]>((observer) => {\n this.setState({ loading: true });\n\n const sub = this.completeUpdate.subscribe({\n next: () => {\n observer.next(this.issueQuery());\n },\n });\n\n let timeout: NodeJS.Timeout | undefined;\n\n if (delayMs) {\n timeout = setTimeout(() => this.signalUpdateCompleted(), delayMs);\n }\n\n this.isGettingValues = true;\n\n return () => {\n sub.unsubscribe();\n clearTimeout(timeout);\n this.isGettingValues = false;\n };\n });\n }\n\n private issueQuery() {\n const interpolatedQuery = sceneGraph.interpolate(this, this.state.query);\n const options = queryMetricTree(interpolatedQuery).map((x) => ({ label: x.name, value: x.name }));\n\n this.setState({\n issuedQuery: interpolatedQuery,\n options,\n });\n\n return options;\n }\n\n /** Useful from tests */\n public signalUpdateCompleted() {\n this.completeUpdate.next(1);\n }\n\n public static Component = ({ model }: SceneComponentProps<MultiValueVariable>) => {\n return renderSelectForVariable(model);\n };\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAoBO,MAAM,qBAAqB,kBAAsC,CAAA;AAAA,EAS/D,YAAY,YAA0C,EAAA;AAC3D,IAAM,KAAA,CAAA,cAAA,CAAA;AAAA,MACJ,IAAM,EAAA,QAAA;AAAA,MACN,IAAM,EAAA,MAAA;AAAA,MACN,KAAO,EAAA,OAAA;AAAA,MACP,IAAM,EAAA,MAAA;AAAA,MACN,KAAO,EAAA,OAAA;AAAA,MACP,SAAS,EAAC;AAAA,KAAA,EACP,YACJ,CAAA,CAAA,CAAA;AAjBH,IAAQ,IAAA,CAAA,cAAA,GAAiB,IAAI,OAAgB,EAAA,CAAA;AAC7C,IAAA,IAAA,CAAO,eAAkB,GAAA,IAAA,CAAA;AACzB,IAAA,IAAA,CAAO,oBAAuB,GAAA,CAAA,CAAA;AAE9B,IAAU,IAAA,CAAA,mBAAA,GAAsB,IAAI,wBAAA,CAAyB,IAAM,EAAA;AAAA,MACjE,UAAA,EAAY,CAAC,OAAO,CAAA;AAAA,KACrB,CAAA,CAAA;AAAA,GAYD;AAAA,EAEO,gBAAgB,IAAiE,EAAA;AACtF,IAAM,MAAA,EAAE,OAAQ,EAAA,GAAI,IAAK,CAAA,KAAA,CAAA;AAEzB,IAAA,IAAA,CAAK,oBAAwB,IAAA,CAAA,CAAA;AAE7B,IAAO,OAAA,IAAI,UAAkC,CAAA,CAAC,QAAa,KAAA;AACzD,MAAA,IAAA,CAAK,QAAS,CAAA,EAAE,OAAS,EAAA,IAAA,EAAM,CAAA,CAAA;AAE/B,MAAM,MAAA,GAAA,GAAM,IAAK,CAAA,cAAA,CAAe,SAAU,CAAA;AAAA,QACxC,MAAM,MAAM;AACV,UAAS,QAAA,CAAA,IAAA,CAAK,IAAK,CAAA,UAAA,EAAY,CAAA,CAAA;AAAA,SACjC;AAAA,OACD,CAAA,CAAA;AAED,MAAI,IAAA,OAAA,CAAA;AAEJ,MAAA,IAAI,OAAS,EAAA;AACX,QAAA,OAAA,GAAU,UAAW,CAAA,MAAM,IAAK,CAAA,qBAAA,IAAyB,OAAO,CAAA,CAAA;AAAA,OAClE;AAEA,MAAA,IAAA,CAAK,eAAkB,GAAA,IAAA,CAAA;AAEvB,MAAA,OAAO,MAAM;AACX,QAAA,GAAA,CAAI,WAAY,EAAA,CAAA;AAChB,QAAA,YAAA,CAAa,OAAO,CAAA,CAAA;AACpB,QAAA,IAAA,CAAK,eAAkB,GAAA,KAAA,CAAA;AAAA,OACzB,CAAA;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AAAA,EAEQ,UAAa,GAAA;AACnB,IAAA,MAAM,oBAAoB,UAAW,CAAA,WAAA,CAAY,IAAM,EAAA,IAAA,CAAK,MAAM,KAAK,CAAA,CAAA;AACvE,IAAA,MAAM,OAAU,GAAA,eAAA,CAAgB,iBAAiB,CAAA,CAAE,IAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAO,CAAE,CAAA,IAAA,EAAM,KAAO,EAAA,CAAA,CAAE,MAAO,CAAA,CAAA,CAAA;AAEhG,IAAA,IAAA,CAAK,QAAS,CAAA;AAAA,MACZ,WAAa,EAAA,iBAAA;AAAA,MACb,OAAA;AAAA,KACD,CAAA,CAAA;AAED,IAAO,OAAA,OAAA,CAAA;AAAA,GACT;AAAA,EAGO,qBAAwB,GAAA;AAC7B,IAAK,IAAA,CAAA,cAAA,CAAe,KAAK,CAAC,CAAA,CAAA;AAAA,GAC5B;AAKF,CAAA;AAvEa,YAAA,CAoEG,SAAY,GAAA,CAAC,EAAE,KAAA,EAAqD,KAAA;AAChF,EAAA,OAAO,wBAAwB,KAAK,CAAA,CAAA;AACtC,CAAA;;;;"}
@@ -0,0 +1,137 @@
1
+ import React from 'react';
2
+ import { of, from, mergeMap, filter, take, throwError, catchError } from 'rxjs';
3
+ import { v4 } from 'uuid';
4
+ import { VariableRefresh, VariableSort, LoadingState, getDefaultTimeRange, CoreApp } from '@grafana/data';
5
+ import { getDataSourceSrv } from '@grafana/runtime';
6
+ import { sceneGraph } from '../../../core/sceneGraph.js';
7
+ import { VariableDependencyConfig } from '../../VariableDependencyConfig.js';
8
+ import { VariableValueSelect } from '../../components/VariableValueSelect.js';
9
+ import { MultiValueVariable } from '../MultiValueVariable.js';
10
+ import { createQueryVariableRunner } from './createQueryVariableRunner.js';
11
+ import { metricNamesToVariableValues } from './utils.js';
12
+ import { toMetricFindValues } from './toMetricFindValues.js';
13
+
14
+ var __defProp = Object.defineProperty;
15
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
16
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
17
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
18
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
19
+ var __spreadValues = (a, b) => {
20
+ for (var prop in b || (b = {}))
21
+ if (__hasOwnProp.call(b, prop))
22
+ __defNormalProp(a, prop, b[prop]);
23
+ if (__getOwnPropSymbols)
24
+ for (var prop of __getOwnPropSymbols(b)) {
25
+ if (__propIsEnum.call(b, prop))
26
+ __defNormalProp(a, prop, b[prop]);
27
+ }
28
+ return a;
29
+ };
30
+ class QueryVariable extends MultiValueVariable {
31
+ constructor(initialState) {
32
+ super(__spreadValues({
33
+ type: "query",
34
+ name: "",
35
+ value: "",
36
+ text: "",
37
+ query: "",
38
+ options: [],
39
+ datasource: null,
40
+ regex: "",
41
+ refresh: VariableRefresh.onDashboardLoad,
42
+ sort: VariableSort.alphabeticalAsc
43
+ }, initialState));
44
+ this._variableDependency = new VariableDependencyConfig(this, {
45
+ statePaths: ["regex", "query", "datasource"]
46
+ });
47
+ }
48
+ activate() {
49
+ super.activate();
50
+ const timeRange = sceneGraph.getTimeRange(this);
51
+ if (this.state.refresh === VariableRefresh.onTimeRangeChanged) {
52
+ this._subs.add(
53
+ timeRange.subscribeToState({
54
+ next: () => {
55
+ this.updateSubscription = this.validateAndUpdate().subscribe();
56
+ }
57
+ })
58
+ );
59
+ }
60
+ }
61
+ deactivate() {
62
+ super.deactivate();
63
+ if (this.updateSubscription) {
64
+ this.updateSubscription.unsubscribe();
65
+ }
66
+ if (this.dataSourceSubject) {
67
+ this.dataSourceSubject.unsubscribe();
68
+ }
69
+ }
70
+ getValueOptions(args) {
71
+ if (this.state.query === "" || !this.state.datasource) {
72
+ return of([]);
73
+ }
74
+ return from(this.getDataSource()).pipe(
75
+ mergeMap((ds) => {
76
+ const runner = createQueryVariableRunner(ds);
77
+ const target = runner.getTarget(this);
78
+ const request = this.getRequest(target);
79
+ return runner.runRequest({ variable: this }, request).pipe(
80
+ filter((data) => data.state === LoadingState.Done || data.state === LoadingState.Error),
81
+ take(1),
82
+ mergeMap((data) => {
83
+ if (data.state === LoadingState.Error) {
84
+ return throwError(() => data.error);
85
+ }
86
+ return of(data);
87
+ }),
88
+ toMetricFindValues(),
89
+ mergeMap((values) => {
90
+ let regex = "";
91
+ if (this.state.regex) {
92
+ regex = sceneGraph.interpolate(this, this.state.regex, void 0, "regex");
93
+ }
94
+ return of(metricNamesToVariableValues(regex, this.state.sort, values));
95
+ }),
96
+ catchError((error) => {
97
+ if (error.cancelled) {
98
+ return of([]);
99
+ }
100
+ return throwError(() => error);
101
+ })
102
+ );
103
+ })
104
+ );
105
+ }
106
+ async getDataSource() {
107
+ return getDataSourceSrv().get(this.state.datasource, {
108
+ __sceneObject: { text: "__sceneObject", value: this }
109
+ });
110
+ }
111
+ getRequest(target) {
112
+ const scopedVars = {
113
+ __sceneObject: { text: "__sceneObject", value: this }
114
+ };
115
+ const range = this.state.refresh === VariableRefresh.onTimeRangeChanged ? sceneGraph.getTimeRange(this).state.value : getDefaultTimeRange();
116
+ const request = {
117
+ app: CoreApp.Dashboard,
118
+ requestId: v4(),
119
+ timezone: "",
120
+ range,
121
+ interval: "",
122
+ intervalMs: 0,
123
+ targets: [target],
124
+ scopedVars,
125
+ startTime: Date.now()
126
+ };
127
+ return request;
128
+ }
129
+ }
130
+ QueryVariable.Component = ({ model }) => {
131
+ return /* @__PURE__ */ React.createElement(VariableValueSelect, {
132
+ model
133
+ });
134
+ };
135
+
136
+ export { QueryVariable };
137
+ //# sourceMappingURL=QueryVariable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryVariable.js","sources":["../../../../../src/variables/variants/query/QueryVariable.tsx"],"sourcesContent":["import React from 'react';\nimport { Observable, Subject, of, Unsubscribable, filter, take, mergeMap, catchError, throwError, from } from 'rxjs';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport {\n CoreApp,\n DataQuery,\n DataQueryRequest,\n DataSourceApi,\n DataSourceRef,\n getDefaultTimeRange,\n LoadingState,\n PanelData,\n ScopedVars,\n VariableRefresh,\n VariableSort,\n} from '@grafana/data';\nimport { getDataSourceSrv } from '@grafana/runtime';\n\nimport { sceneGraph } from '../../../core/sceneGraph';\nimport { SceneComponentProps } from '../../../core/types';\nimport { VariableDependencyConfig } from '../../VariableDependencyConfig';\nimport { VariableValueSelect } from '../../components/VariableValueSelect';\nimport { VariableValueOption } from '../../types';\nimport { MultiValueVariable, MultiValueVariableState, VariableGetOptionsArgs } from '../MultiValueVariable';\n\nimport { createQueryVariableRunner } from './createQueryVariableRunner';\nimport { metricNamesToVariableValues } from './utils';\nimport { toMetricFindValues } from './toMetricFindValues';\n\nexport interface QueryVariableState extends MultiValueVariableState {\n type: 'query';\n datasource: DataSourceRef | null;\n query: any;\n regex: string;\n refresh: VariableRefresh;\n sort: VariableSort;\n}\n\nexport class QueryVariable extends MultiValueVariable<QueryVariableState> {\n private updateSubscription?: Unsubscribable;\n private dataSourceSubject?: Subject<DataSourceApi>;\n\n protected _variableDependency = new VariableDependencyConfig(this, {\n statePaths: ['regex', 'query', 'datasource'],\n });\n\n public constructor(initialState: Partial<QueryVariableState>) {\n super({\n type: 'query',\n name: '',\n value: '',\n text: '',\n query: '',\n options: [],\n datasource: null,\n regex: '',\n refresh: VariableRefresh.onDashboardLoad,\n sort: VariableSort.alphabeticalAsc,\n ...initialState,\n });\n }\n\n public activate(): void {\n super.activate();\n const timeRange = sceneGraph.getTimeRange(this);\n\n if (this.state.refresh === VariableRefresh.onTimeRangeChanged) {\n this._subs.add(\n timeRange.subscribeToState({\n next: () => {\n this.updateSubscription = this.validateAndUpdate().subscribe();\n },\n })\n );\n }\n }\n\n public deactivate(): void {\n super.deactivate();\n if (this.updateSubscription) {\n this.updateSubscription.unsubscribe();\n }\n\n if (this.dataSourceSubject) {\n this.dataSourceSubject.unsubscribe();\n }\n }\n\n public getValueOptions(args: VariableGetOptionsArgs): Observable<VariableValueOption[]> {\n if (this.state.query === '' || !this.state.datasource) {\n return of([]);\n }\n\n return from(this.getDataSource()).pipe(\n mergeMap((ds) => {\n const runner = createQueryVariableRunner(ds);\n const target = runner.getTarget(this);\n const request = this.getRequest(target);\n return runner.runRequest({ variable: this }, request).pipe(\n filter((data) => data.state === LoadingState.Done || data.state === LoadingState.Error), // we only care about done or error for now\n take(1), // take the first result, using first caused a bug where it in some situations throw an uncaught error because of no results had been received yet\n mergeMap((data: PanelData) => {\n if (data.state === LoadingState.Error) {\n return throwError(() => data.error);\n }\n return of(data);\n }),\n toMetricFindValues(),\n mergeMap((values) => {\n let regex = '';\n if (this.state.regex) {\n regex = sceneGraph.interpolate(this, this.state.regex, undefined, 'regex');\n }\n return of(metricNamesToVariableValues(regex, this.state.sort, values));\n }),\n catchError((error) => {\n if (error.cancelled) {\n return of([]);\n }\n return throwError(() => error);\n })\n );\n })\n );\n }\n\n private async getDataSource(): Promise<DataSourceApi> {\n return getDataSourceSrv().get(this.state.datasource, {\n __sceneObject: { text: '__sceneObject', value: this },\n });\n }\n\n private getRequest(target: DataQuery) {\n // TODO: add support for search filter\n // const { searchFilter } = this.state.searchFilter;\n // const searchFilterScope = { searchFilter: { text: searchFilter, value: searchFilter } };\n // const searchFilterAsVars = searchFilter ? searchFilterScope : {};\n const scopedVars: ScopedVars = {\n // ...searchFilterAsVars,\n __sceneObject: { text: '__sceneObject', value: this },\n };\n\n const range =\n this.state.refresh === VariableRefresh.onTimeRangeChanged\n ? sceneGraph.getTimeRange(this).state.value\n : getDefaultTimeRange();\n\n const request: DataQueryRequest = {\n app: CoreApp.Dashboard,\n requestId: uuidv4(),\n timezone: '',\n range,\n interval: '',\n intervalMs: 0,\n targets: [target],\n scopedVars,\n startTime: Date.now(),\n };\n return request;\n }\n\n public static Component = ({ model }: SceneComponentProps<MultiValueVariable>) => {\n return <VariableValueSelect model={model} />;\n };\n}\n"],"names":["uuidv4"],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ import { from, mergeMap, of } from 'rxjs';
2
+ import { LoadingState, getDefaultTimeRange } from '@grafana/data';
3
+ import { getRunRequest } from '@grafana/runtime';
4
+ import { hasStandardVariableSupport, hasLegacyVariableSupport } from './guards.js';
5
+
6
+ var __defProp = Object.defineProperty;
7
+ var __defProps = Object.defineProperties;
8
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
9
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
10
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
11
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
12
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
13
+ var __spreadValues = (a, b) => {
14
+ for (var prop in b || (b = {}))
15
+ if (__hasOwnProp.call(b, prop))
16
+ __defNormalProp(a, prop, b[prop]);
17
+ if (__getOwnPropSymbols)
18
+ for (var prop of __getOwnPropSymbols(b)) {
19
+ if (__propIsEnum.call(b, prop))
20
+ __defNormalProp(a, prop, b[prop]);
21
+ }
22
+ return a;
23
+ };
24
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
25
+ class StandardQueryRunner {
26
+ constructor(datasource, _runRequest = getRunRequest()) {
27
+ this.datasource = datasource;
28
+ this._runRequest = _runRequest;
29
+ }
30
+ getTarget(variable) {
31
+ if (hasStandardVariableSupport(this.datasource)) {
32
+ return this.datasource.variables.toDataQuery(variable.state.query);
33
+ }
34
+ throw new Error("Couldn't create a target with supplied arguments.");
35
+ }
36
+ runRequest(_, request) {
37
+ if (!hasStandardVariableSupport(this.datasource)) {
38
+ return getEmptyMetricFindValueObservable();
39
+ }
40
+ if (!this.datasource.variables.query) {
41
+ return this._runRequest(this.datasource, request);
42
+ }
43
+ return this._runRequest(this.datasource, request, this.datasource.variables.query);
44
+ }
45
+ }
46
+ class LegacyQueryRunner {
47
+ constructor(datasource) {
48
+ this.datasource = datasource;
49
+ }
50
+ getTarget(variable) {
51
+ if (hasLegacyVariableSupport(this.datasource)) {
52
+ return variable.state.query;
53
+ }
54
+ throw new Error("Couldn't create a target with supplied arguments.");
55
+ }
56
+ runRequest({ variable }, request) {
57
+ if (!hasLegacyVariableSupport(this.datasource)) {
58
+ return getEmptyMetricFindValueObservable();
59
+ }
60
+ return from(
61
+ this.datasource.metricFindQuery(variable.state.query, __spreadProps(__spreadValues({}, request), {
62
+ variable: {
63
+ name: variable.state.name,
64
+ type: variable.state.type
65
+ }
66
+ }))
67
+ ).pipe(
68
+ mergeMap((values) => {
69
+ if (!values || !values.length) {
70
+ return getEmptyMetricFindValueObservable();
71
+ }
72
+ const series = values;
73
+ return of({ series, state: LoadingState.Done, timeRange: request.range });
74
+ })
75
+ );
76
+ }
77
+ }
78
+ function getEmptyMetricFindValueObservable() {
79
+ return of({ state: LoadingState.Done, series: [], timeRange: getDefaultTimeRange() });
80
+ }
81
+ function createQueryVariableRunnerFactory(datasource) {
82
+ if (hasStandardVariableSupport(datasource)) {
83
+ return new StandardQueryRunner(datasource, getRunRequest());
84
+ }
85
+ if (hasLegacyVariableSupport(datasource)) {
86
+ return new LegacyQueryRunner(datasource);
87
+ }
88
+ throw new Error(`Couldn't create a query runner for datasource ${datasource.type}`);
89
+ }
90
+ let createQueryVariableRunner = createQueryVariableRunnerFactory;
91
+
92
+ export { createQueryVariableRunner };
93
+ //# sourceMappingURL=createQueryVariableRunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createQueryVariableRunner.js","sources":["../../../../../src/variables/variants/query/createQueryVariableRunner.ts"],"sourcesContent":["import { from, mergeMap, Observable, of } from 'rxjs';\n\nimport {\n DataQuery,\n DataQueryRequest,\n DataSourceApi,\n getDefaultTimeRange,\n LoadingState,\n PanelData,\n} from '@grafana/data';\nimport { getRunRequest } from '@grafana/runtime';\n\nimport { hasLegacyVariableSupport, hasStandardVariableSupport } from './guards';\n\nimport { QueryVariable } from './QueryVariable';\n\nexport interface RunnerArgs {\n searchFilter?: string;\n variable: QueryVariable;\n}\n\nexport interface QueryRunner {\n getTarget: (variable: QueryVariable) => DataQuery;\n runRequest: (args: RunnerArgs, request: DataQueryRequest) => Observable<PanelData>;\n}\n\nclass StandardQueryRunner implements QueryRunner {\n public constructor(private datasource: DataSourceApi, private _runRequest = getRunRequest()) {}\n\n public getTarget(variable: QueryVariable) {\n if (hasStandardVariableSupport(this.datasource)) {\n return this.datasource.variables.toDataQuery(variable.state.query);\n }\n\n throw new Error(\"Couldn't create a target with supplied arguments.\");\n }\n\n public runRequest(_: RunnerArgs, request: DataQueryRequest) {\n if (!hasStandardVariableSupport(this.datasource)) {\n return getEmptyMetricFindValueObservable();\n }\n\n if (!this.datasource.variables.query) {\n return this._runRequest(this.datasource, request);\n }\n\n return this._runRequest(this.datasource, request, this.datasource.variables.query);\n }\n}\n\nclass LegacyQueryRunner implements QueryRunner {\n public constructor(private datasource: DataSourceApi) {}\n\n public getTarget(variable: QueryVariable) {\n if (hasLegacyVariableSupport(this.datasource)) {\n return variable.state.query;\n }\n\n throw new Error(\"Couldn't create a target with supplied arguments.\");\n }\n\n public runRequest({ variable }: RunnerArgs, request: DataQueryRequest) {\n if (!hasLegacyVariableSupport(this.datasource)) {\n return getEmptyMetricFindValueObservable();\n }\n\n return from(\n this.datasource.metricFindQuery(variable.state.query, {\n ...request,\n // variable is used by SQL common data source\n variable: {\n name: variable.state.name,\n type: variable.state.type,\n },\n // TODO: add support for search filter\n // searchFilter\n })\n ).pipe(\n mergeMap((values) => {\n if (!values || !values.length) {\n return getEmptyMetricFindValueObservable();\n }\n\n const series: any = values;\n return of({ series, state: LoadingState.Done, timeRange: request.range });\n })\n );\n }\n}\n\nfunction getEmptyMetricFindValueObservable(): Observable<PanelData> {\n return of({ state: LoadingState.Done, series: [], timeRange: getDefaultTimeRange() });\n}\n\nfunction createQueryVariableRunnerFactory(datasource: DataSourceApi): QueryRunner {\n if (hasStandardVariableSupport(datasource)) {\n return new StandardQueryRunner(datasource, getRunRequest());\n }\n\n if (hasLegacyVariableSupport(datasource)) {\n return new LegacyQueryRunner(datasource);\n }\n\n // TODO: add support for legacy, cutom and datasource query runners\n\n throw new Error(`Couldn't create a query runner for datasource ${datasource.type}`);\n}\n\nexport let createQueryVariableRunner = createQueryVariableRunnerFactory;\n\n/**\n * Use only in tests\n */\nexport function setCreateQueryVariableRunnerFactory(fn: (datasource: DataSourceApi) => QueryRunner) {\n createQueryVariableRunner = fn;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { VariableSupportType } from '@grafana/data';
2
+
3
+ const hasLegacyVariableSupport = (datasource) => {
4
+ return Boolean(datasource.metricFindQuery) && !Boolean(datasource.variables);
5
+ };
6
+ const hasStandardVariableSupport = (datasource) => {
7
+ if (!datasource.variables) {
8
+ return false;
9
+ }
10
+ if (datasource.variables.getType() !== VariableSupportType.Standard) {
11
+ return false;
12
+ }
13
+ const variableSupport = datasource.variables;
14
+ return "toDataQuery" in variableSupport && Boolean(variableSupport.toDataQuery);
15
+ };
16
+
17
+ export { hasLegacyVariableSupport, hasStandardVariableSupport };
18
+ //# sourceMappingURL=guards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guards.js","sources":["../../../../../src/variables/variants/query/guards.ts"],"sourcesContent":["import {\n DataQuery,\n DataSourceJsonData,\n DataSourceApi,\n MetricFindValue,\n VariableSupportType,\n StandardVariableQuery,\n DataQueryRequest,\n DataQueryResponse,\n} from '@grafana/data';\n\nimport { Observable } from 'rxjs';\n\n/**\n * Interfaces and guards below are copied from core.\n * Not exposing via grafana/data as these are not intended to be used in context other than variables.\n */\n\ninterface DataSourceWithLegacyVariableSupport<\n TQuery extends DataQuery = DataQuery,\n TOptions extends DataSourceJsonData = DataSourceJsonData\n> extends DataSourceApi<TQuery, TOptions> {\n metricFindQuery(query: any, options?: any): Promise<MetricFindValue[]>;\n variables: undefined;\n}\n\ninterface DataSourceWithStandardVariableSupport<\n TQuery extends DataQuery = DataQuery,\n TOptions extends DataSourceJsonData = DataSourceJsonData\n> extends DataSourceApi<TQuery, TOptions> {\n variables: {\n getType(): VariableSupportType;\n toDataQuery(query: StandardVariableQuery): TQuery;\n query(request: DataQueryRequest<TQuery>): Observable<DataQueryResponse>;\n };\n}\n\nexport const hasLegacyVariableSupport = <\n TQuery extends DataQuery = DataQuery,\n TOptions extends DataSourceJsonData = DataSourceJsonData\n>(\n datasource: DataSourceApi<TQuery, TOptions>\n): datasource is DataSourceWithLegacyVariableSupport<TQuery, TOptions> => {\n return Boolean(datasource.metricFindQuery) && !Boolean(datasource.variables);\n};\n\nexport const hasStandardVariableSupport = <\n TQuery extends DataQuery = DataQuery,\n TOptions extends DataSourceJsonData = DataSourceJsonData\n>(\n datasource: DataSourceApi<TQuery, TOptions>\n): datasource is DataSourceWithStandardVariableSupport<TQuery, TOptions> => {\n if (!datasource.variables) {\n return false;\n }\n\n if (datasource.variables.getType() !== VariableSupportType.Standard) {\n return false;\n }\n\n const variableSupport = datasource.variables;\n return 'toDataQuery' in variableSupport && Boolean(variableSupport.toDataQuery);\n};\n"],"names":[],"mappings":";;AAqCa,MAAA,wBAAA,GAA2B,CAItC,UACwE,KAAA;AACxE,EAAA,OAAO,QAAQ,UAAW,CAAA,eAAe,KAAK,CAAC,OAAA,CAAQ,WAAW,SAAS,CAAA,CAAA;AAC7E,EAAA;AAEa,MAAA,0BAAA,GAA6B,CAIxC,UAC0E,KAAA;AAC1E,EAAI,IAAA,CAAC,WAAW,SAAW,EAAA;AACzB,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAEA,EAAA,IAAI,UAAW,CAAA,SAAA,CAAU,OAAQ,EAAA,KAAM,oBAAoB,QAAU,EAAA;AACnE,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAEA,EAAA,MAAM,kBAAkB,UAAW,CAAA,SAAA,CAAA;AACnC,EAAA,OAAO,aAAiB,IAAA,eAAA,IAAmB,OAAQ,CAAA,eAAA,CAAgB,WAAW,CAAA,CAAA;AAChF;;;;"}
@@ -0,0 +1,93 @@
1
+ import { getProcessedDataFrames, getFieldDisplayName, FieldType, isDataFrame } from '@grafana/data';
2
+ import { map } from 'rxjs';
3
+
4
+ function toMetricFindValues() {
5
+ return (source) => source.pipe(
6
+ map((panelData) => {
7
+ const frames = panelData.series;
8
+ if (!frames || !frames.length) {
9
+ return [];
10
+ }
11
+ if (areMetricFindValues(frames)) {
12
+ return frames;
13
+ }
14
+ const processedDataFrames = getProcessedDataFrames(frames);
15
+ const metrics = [];
16
+ let valueIndex = -1;
17
+ let textIndex = -1;
18
+ let stringIndex = -1;
19
+ let expandableIndex = -1;
20
+ for (const frame of processedDataFrames) {
21
+ for (let index = 0; index < frame.fields.length; index++) {
22
+ const field = frame.fields[index];
23
+ const fieldName = getFieldDisplayName(field, frame, frames).toLowerCase();
24
+ if (field.type === FieldType.string && stringIndex === -1) {
25
+ stringIndex = index;
26
+ }
27
+ if (fieldName === "text" && field.type === FieldType.string && textIndex === -1) {
28
+ textIndex = index;
29
+ }
30
+ if (fieldName === "value" && field.type === FieldType.string && valueIndex === -1) {
31
+ valueIndex = index;
32
+ }
33
+ if (fieldName === "expandable" && (field.type === FieldType.boolean || field.type === FieldType.number) && expandableIndex === -1) {
34
+ expandableIndex = index;
35
+ }
36
+ }
37
+ }
38
+ if (stringIndex === -1) {
39
+ throw new Error("Couldn't find any field of type string in the results.");
40
+ }
41
+ for (const frame of frames) {
42
+ for (let index = 0; index < frame.length; index++) {
43
+ const expandable = expandableIndex !== -1 ? frame.fields[expandableIndex].values.get(index) : void 0;
44
+ const string = frame.fields[stringIndex].values.get(index);
45
+ const text = textIndex !== -1 ? frame.fields[textIndex].values.get(index) : null;
46
+ const value = valueIndex !== -1 ? frame.fields[valueIndex].values.get(index) : null;
47
+ if (valueIndex === -1 && textIndex === -1) {
48
+ metrics.push({ text: string, value: string, expandable });
49
+ continue;
50
+ }
51
+ if (valueIndex === -1 && textIndex !== -1) {
52
+ metrics.push({ text, value: text, expandable });
53
+ continue;
54
+ }
55
+ if (valueIndex !== -1 && textIndex === -1) {
56
+ metrics.push({ text: value, value, expandable });
57
+ continue;
58
+ }
59
+ metrics.push({ text, value, expandable });
60
+ }
61
+ }
62
+ return metrics;
63
+ })
64
+ );
65
+ }
66
+ function areMetricFindValues(data) {
67
+ if (!data) {
68
+ return false;
69
+ }
70
+ if (!data.length) {
71
+ return true;
72
+ }
73
+ const firstValue = data[0];
74
+ if (isDataFrame(firstValue)) {
75
+ return false;
76
+ }
77
+ for (const firstValueKey in firstValue) {
78
+ if (!firstValue.hasOwnProperty(firstValueKey)) {
79
+ continue;
80
+ }
81
+ if (firstValue[firstValueKey] !== null && typeof firstValue[firstValueKey] !== "string" && typeof firstValue[firstValueKey] !== "number") {
82
+ continue;
83
+ }
84
+ const key = firstValueKey.toLowerCase();
85
+ if (key === "text" || key === "value") {
86
+ return true;
87
+ }
88
+ }
89
+ return false;
90
+ }
91
+
92
+ export { toMetricFindValues };
93
+ //# sourceMappingURL=toMetricFindValues.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toMetricFindValues.js","sources":["../../../../../src/variables/variants/query/toMetricFindValues.ts"],"sourcesContent":["import {\n FieldType,\n getFieldDisplayName,\n isDataFrame,\n MetricFindValue,\n PanelData,\n getProcessedDataFrames,\n} from '@grafana/data';\nimport { map, OperatorFunction } from 'rxjs';\n\nexport function toMetricFindValues(): OperatorFunction<PanelData, MetricFindValue[]> {\n return (source) =>\n source.pipe(\n map((panelData) => {\n const frames = panelData.series;\n if (!frames || !frames.length) {\n return [];\n }\n\n if (areMetricFindValues(frames)) {\n return frames;\n }\n\n const processedDataFrames = getProcessedDataFrames(frames);\n const metrics: MetricFindValue[] = [];\n\n let valueIndex = -1;\n let textIndex = -1;\n let stringIndex = -1;\n let expandableIndex = -1;\n\n for (const frame of processedDataFrames) {\n for (let index = 0; index < frame.fields.length; index++) {\n const field = frame.fields[index];\n const fieldName = getFieldDisplayName(field, frame, frames).toLowerCase();\n\n if (field.type === FieldType.string && stringIndex === -1) {\n stringIndex = index;\n }\n\n if (fieldName === 'text' && field.type === FieldType.string && textIndex === -1) {\n textIndex = index;\n }\n\n if (fieldName === 'value' && field.type === FieldType.string && valueIndex === -1) {\n valueIndex = index;\n }\n\n if (\n fieldName === 'expandable' &&\n (field.type === FieldType.boolean || field.type === FieldType.number) &&\n expandableIndex === -1\n ) {\n expandableIndex = index;\n }\n }\n }\n\n if (stringIndex === -1) {\n throw new Error(\"Couldn't find any field of type string in the results.\");\n }\n\n for (const frame of frames) {\n for (let index = 0; index < frame.length; index++) {\n const expandable = expandableIndex !== -1 ? frame.fields[expandableIndex].values.get(index) : undefined;\n const string = frame.fields[stringIndex].values.get(index);\n const text = textIndex !== -1 ? frame.fields[textIndex].values.get(index) : null;\n const value = valueIndex !== -1 ? frame.fields[valueIndex].values.get(index) : null;\n\n if (valueIndex === -1 && textIndex === -1) {\n metrics.push({ text: string, value: string, expandable });\n continue;\n }\n\n if (valueIndex === -1 && textIndex !== -1) {\n metrics.push({ text, value: text, expandable });\n continue;\n }\n\n if (valueIndex !== -1 && textIndex === -1) {\n metrics.push({ text: value, value, expandable });\n continue;\n }\n\n metrics.push({ text, value, expandable });\n }\n }\n\n return metrics;\n })\n );\n}\n\nfunction areMetricFindValues(data: any[]): data is MetricFindValue[] {\n if (!data) {\n return false;\n }\n\n if (!data.length) {\n return true;\n }\n\n const firstValue: any = data[0];\n\n if (isDataFrame(firstValue)) {\n return false;\n }\n\n for (const firstValueKey in firstValue) {\n if (!firstValue.hasOwnProperty(firstValueKey)) {\n continue;\n }\n\n if (\n firstValue[firstValueKey] !== null &&\n typeof firstValue[firstValueKey] !== 'string' &&\n typeof firstValue[firstValueKey] !== 'number'\n ) {\n continue;\n }\n\n const key = firstValueKey.toLowerCase();\n\n if (key === 'text' || key === 'value') {\n return true;\n }\n }\n\n return false;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ import { isNumber, uniqBy, sortBy, toLower } from 'lodash';
2
+ import { stringToJsRegex, VariableSort } from '@grafana/data';
3
+
4
+ const metricNamesToVariableValues = (variableRegEx, sort, metricNames) => {
5
+ var _a, _b, _c, _d, _e, _f;
6
+ let regex;
7
+ let options = [];
8
+ if (variableRegEx) {
9
+ regex = stringToJsRegex(variableRegEx);
10
+ }
11
+ for (let i = 0; i < metricNames.length; i++) {
12
+ const item = metricNames[i];
13
+ let text = item.text === void 0 || item.text === null ? item.value : item.text;
14
+ let value = item.value === void 0 || item.value === null ? item.text : item.value;
15
+ if (isNumber(value)) {
16
+ value = value.toString();
17
+ }
18
+ if (isNumber(text)) {
19
+ text = text.toString();
20
+ }
21
+ if (regex) {
22
+ const matches = getAllMatches(value, regex);
23
+ if (!matches.length) {
24
+ continue;
25
+ }
26
+ const valueGroup = matches.find((m) => m.groups && m.groups.value);
27
+ const textGroup = matches.find((m) => m.groups && m.groups.text);
28
+ const firstMatch = matches.find((m) => m.length > 1);
29
+ const manyMatches = matches.length > 1 && firstMatch;
30
+ if (valueGroup || textGroup) {
31
+ value = (_c = (_a = valueGroup == null ? void 0 : valueGroup.groups) == null ? void 0 : _a.value) != null ? _c : (_b = textGroup == null ? void 0 : textGroup.groups) == null ? void 0 : _b.text;
32
+ text = (_f = (_d = textGroup == null ? void 0 : textGroup.groups) == null ? void 0 : _d.text) != null ? _f : (_e = valueGroup == null ? void 0 : valueGroup.groups) == null ? void 0 : _e.value;
33
+ } else if (manyMatches) {
34
+ for (let j = 0; j < matches.length; j++) {
35
+ const match = matches[j];
36
+ options.push({ label: match[1], value: match[1] });
37
+ }
38
+ continue;
39
+ } else if (firstMatch) {
40
+ text = firstMatch[1];
41
+ value = firstMatch[1];
42
+ }
43
+ }
44
+ options.push({ label: text, value });
45
+ }
46
+ options = uniqBy(options, "value");
47
+ return sortVariableValues(options, sort);
48
+ };
49
+ const getAllMatches = (str, regex) => {
50
+ const results = [];
51
+ let matches = null;
52
+ regex.lastIndex = 0;
53
+ do {
54
+ matches = regex.exec(str);
55
+ if (matches) {
56
+ results.push(matches);
57
+ }
58
+ } while (regex.global && matches && matches[0] !== "" && matches[0] !== void 0);
59
+ return results;
60
+ };
61
+ const sortVariableValues = (options, sortOrder) => {
62
+ if (sortOrder === VariableSort.disabled) {
63
+ return options;
64
+ }
65
+ const sortType = Math.ceil(sortOrder / 2);
66
+ const reverseSort = sortOrder % 2 === 0;
67
+ if (sortType === 1) {
68
+ options = sortBy(options, "text");
69
+ } else if (sortType === 2) {
70
+ options = sortBy(options, (opt) => {
71
+ if (!opt.text) {
72
+ return -1;
73
+ }
74
+ const matches = opt.text.match(/.*?(\d+).*/);
75
+ if (!matches || matches.length < 2) {
76
+ return -1;
77
+ } else {
78
+ return parseInt(matches[1], 10);
79
+ }
80
+ });
81
+ } else if (sortType === 3) {
82
+ options = sortBy(options, (opt) => {
83
+ return toLower(opt.text);
84
+ });
85
+ }
86
+ if (reverseSort) {
87
+ options = options.reverse();
88
+ }
89
+ return options;
90
+ };
91
+
92
+ export { metricNamesToVariableValues, sortVariableValues };
93
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sources":["../../../../../src/variables/variants/query/utils.ts"],"sourcesContent":["import { isNumber, sortBy, toLower, uniqBy } from 'lodash';\n\nimport { stringToJsRegex, VariableSort } from '@grafana/data';\n\nimport { VariableValueOption } from '../../types';\n\nexport const metricNamesToVariableValues = (variableRegEx: string, sort: VariableSort, metricNames: any[]) => {\n let regex;\n let options: VariableValueOption[] = [];\n\n if (variableRegEx) {\n regex = stringToJsRegex(variableRegEx);\n }\n\n for (let i = 0; i < metricNames.length; i++) {\n const item = metricNames[i];\n let text = item.text === undefined || item.text === null ? item.value : item.text;\n let value = item.value === undefined || item.value === null ? item.text : item.value;\n\n if (isNumber(value)) {\n value = value.toString();\n }\n\n if (isNumber(text)) {\n text = text.toString();\n }\n\n if (regex) {\n const matches = getAllMatches(value, regex);\n if (!matches.length) {\n continue;\n }\n\n const valueGroup = matches.find((m) => m.groups && m.groups.value);\n const textGroup = matches.find((m) => m.groups && m.groups.text);\n const firstMatch = matches.find((m) => m.length > 1);\n const manyMatches = matches.length > 1 && firstMatch;\n\n if (valueGroup || textGroup) {\n value = valueGroup?.groups?.value ?? textGroup?.groups?.text;\n text = textGroup?.groups?.text ?? valueGroup?.groups?.value;\n } else if (manyMatches) {\n for (let j = 0; j < matches.length; j++) {\n const match = matches[j];\n options.push({ label: match[1], value: match[1] });\n }\n continue;\n } else if (firstMatch) {\n text = firstMatch[1];\n value = firstMatch[1];\n }\n }\n\n options.push({ label: text, value: value });\n }\n\n options = uniqBy(options, 'value');\n return sortVariableValues(options, sort);\n};\n\nconst getAllMatches = (str: string, regex: RegExp): RegExpExecArray[] => {\n const results: RegExpExecArray[] = [];\n let matches = null;\n\n regex.lastIndex = 0;\n\n do {\n matches = regex.exec(str);\n if (matches) {\n results.push(matches);\n }\n } while (regex.global && matches && matches[0] !== '' && matches[0] !== undefined);\n\n return results;\n};\n\nexport const sortVariableValues = (options: any[], sortOrder: VariableSort) => {\n if (sortOrder === VariableSort.disabled) {\n return options;\n }\n\n const sortType = Math.ceil(sortOrder / 2);\n const reverseSort = sortOrder % 2 === 0;\n\n if (sortType === 1) {\n options = sortBy(options, 'text');\n } else if (sortType === 2) {\n options = sortBy(options, (opt) => {\n if (!opt.text) {\n return -1;\n }\n\n const matches = opt.text.match(/.*?(\\d+).*/);\n if (!matches || matches.length < 2) {\n return -1;\n } else {\n return parseInt(matches[1], 10);\n }\n });\n } else if (sortType === 3) {\n options = sortBy(options, (opt) => {\n return toLower(opt.text);\n });\n }\n\n if (reverseSort) {\n options = options.reverse();\n }\n\n return options;\n};\n"],"names":[],"mappings":"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"}