@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,123 @@
1
+ import { SceneObjectBase } from '../../core/SceneObjectBase.js';
2
+ import { forEachSceneObjectInState } from '../../core/utils.js';
3
+ import { SceneVariableValueChangedEvent } from '../types.js';
4
+
5
+ class SceneVariableSet extends SceneObjectBase {
6
+ constructor() {
7
+ super(...arguments);
8
+ this.variablesThatHaveChanged = /* @__PURE__ */ new Set();
9
+ this.variablesToUpdate = /* @__PURE__ */ new Set();
10
+ this.updating = /* @__PURE__ */ new Map();
11
+ this.onVariableValueChanged = (event) => {
12
+ const variableThatChanged = event.payload;
13
+ this.variablesThatHaveChanged.add(variableThatChanged);
14
+ if (this.updating.has(variableThatChanged)) {
15
+ return;
16
+ }
17
+ for (const otherVariable of this.state.variables) {
18
+ if (otherVariable.variableDependency) {
19
+ if (otherVariable.variableDependency.hasDependencyOn(variableThatChanged.state.name)) {
20
+ this.variablesToUpdate.add(otherVariable);
21
+ }
22
+ }
23
+ }
24
+ this.updateNextBatch();
25
+ };
26
+ }
27
+ getByName(name) {
28
+ return this.state.variables.find((x) => x.state.name === name);
29
+ }
30
+ activate() {
31
+ super.activate();
32
+ this._subs.add(this.subscribeToEvent(SceneVariableValueChangedEvent, this.onVariableValueChanged));
33
+ this.validateAndUpdateAll();
34
+ }
35
+ deactivate() {
36
+ var _a;
37
+ super.deactivate();
38
+ this.variablesToUpdate.clear();
39
+ for (const update of this.updating.values()) {
40
+ (_a = update.subscription) == null ? void 0 : _a.unsubscribe();
41
+ }
42
+ }
43
+ updateNextBatch() {
44
+ if (this.variablesToUpdate.size === 0 && this.variablesThatHaveChanged.size > 0) {
45
+ this.notifyDependentSceneObjects();
46
+ return;
47
+ }
48
+ for (const variable of this.variablesToUpdate) {
49
+ if (!variable.validateAndUpdate) {
50
+ throw new Error("Variable added to variablesToUpdate but does not have validateAndUpdate");
51
+ }
52
+ if (this.updating.has(variable)) {
53
+ continue;
54
+ }
55
+ if (this.hasDependendencyInUpdateQueue(variable)) {
56
+ continue;
57
+ }
58
+ const variableToUpdate = {
59
+ variable
60
+ };
61
+ this.updating.set(variable, variableToUpdate);
62
+ variableToUpdate.subscription = variable.validateAndUpdate().subscribe({
63
+ next: () => this.validateAndUpdateCompleted(variable),
64
+ error: (err) => this.handleVariableError(variable, err)
65
+ });
66
+ }
67
+ }
68
+ validateAndUpdateCompleted(variable) {
69
+ var _a;
70
+ const update = this.updating.get(variable);
71
+ (_a = update == null ? void 0 : update.subscription) == null ? void 0 : _a.unsubscribe();
72
+ this.updating.delete(variable);
73
+ this.variablesToUpdate.delete(variable);
74
+ this.updateNextBatch();
75
+ }
76
+ handleVariableError(variable, err) {
77
+ var _a;
78
+ const update = this.updating.get(variable);
79
+ (_a = update == null ? void 0 : update.subscription) == null ? void 0 : _a.unsubscribe();
80
+ this.updating.delete(variable);
81
+ this.variablesToUpdate.delete(variable);
82
+ variable.setState({ loading: false, error: err });
83
+ }
84
+ hasDependendencyInUpdateQueue(variable) {
85
+ var _a;
86
+ if (!variable.variableDependency) {
87
+ return false;
88
+ }
89
+ for (const otherVariable of this.variablesToUpdate.values()) {
90
+ if ((_a = variable.variableDependency) == null ? void 0 : _a.hasDependencyOn(otherVariable.state.name)) {
91
+ return true;
92
+ }
93
+ }
94
+ return false;
95
+ }
96
+ validateAndUpdateAll() {
97
+ for (const variable of this.state.variables) {
98
+ if (variable.validateAndUpdate) {
99
+ this.variablesToUpdate.add(variable);
100
+ }
101
+ }
102
+ this.updateNextBatch();
103
+ }
104
+ notifyDependentSceneObjects() {
105
+ if (!this.parent) {
106
+ return;
107
+ }
108
+ this.traverseSceneAndNotify(this.parent);
109
+ this.variablesThatHaveChanged.clear();
110
+ }
111
+ traverseSceneAndNotify(sceneObject) {
112
+ if (this === sceneObject) {
113
+ return;
114
+ }
115
+ if (sceneObject.variableDependency) {
116
+ sceneObject.variableDependency.variableValuesChanged(this.variablesThatHaveChanged);
117
+ }
118
+ forEachSceneObjectInState(sceneObject.state, (child) => this.traverseSceneAndNotify(child));
119
+ }
120
+ }
121
+
122
+ export { SceneVariableSet };
123
+ //# sourceMappingURL=SceneVariableSet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SceneVariableSet.js","sources":["../../../../src/variables/sets/SceneVariableSet.ts"],"sourcesContent":["import { Unsubscribable } from 'rxjs';\n\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { SceneObject } from '../../core/types';\nimport { forEachSceneObjectInState } from '../../core/utils';\nimport { SceneVariable, SceneVariables, SceneVariableSetState, SceneVariableValueChangedEvent } from '../types';\n\nexport class SceneVariableSet extends SceneObjectBase<SceneVariableSetState> implements SceneVariables {\n /** Variables that have changed in since the activation or since the first manual value change */\n private variablesThatHaveChanged = new Set<SceneVariable>();\n\n /** Variables that are scheduled to be validated and updated */\n private variablesToUpdate = new Set<SceneVariable>();\n\n /** Variables currently updating */\n private updating = new Map<SceneVariable, VariableUpdateInProgress>();\n\n public getByName(name: string): SceneVariable | undefined {\n // TODO: Replace with index\n return this.state.variables.find((x) => x.state.name === name);\n }\n\n /**\n * Subscribes to child variable value changes\n * And starts the variable value validation process\n */\n public activate(): void {\n super.activate();\n\n // Subscribe to changes to child variables\n this._subs.add(this.subscribeToEvent(SceneVariableValueChangedEvent, this.onVariableValueChanged));\n this.validateAndUpdateAll();\n }\n\n /**\n * Cancel all currently running updates\n */\n public deactivate(): void {\n super.deactivate();\n this.variablesToUpdate.clear();\n\n for (const update of this.updating.values()) {\n update.subscription?.unsubscribe();\n }\n }\n\n /**\n * This loops through variablesToUpdate and update all that that can.\n * If one has a dependency that is currently in variablesToUpdate it will be skipped for now.\n */\n private updateNextBatch() {\n // If we have nothing more to update and variable values changed we need to update scene objects that depend on these variables\n if (this.variablesToUpdate.size === 0 && this.variablesThatHaveChanged.size > 0) {\n this.notifyDependentSceneObjects();\n return;\n }\n\n for (const variable of this.variablesToUpdate) {\n if (!variable.validateAndUpdate) {\n throw new Error('Variable added to variablesToUpdate but does not have validateAndUpdate');\n }\n\n // Ignore it if it's already started\n if (this.updating.has(variable)) {\n continue;\n }\n\n // Wait for variables that has dependencies that also needs updates\n if (this.hasDependendencyInUpdateQueue(variable)) {\n continue;\n }\n\n const variableToUpdate: VariableUpdateInProgress = {\n variable,\n };\n\n this.updating.set(variable, variableToUpdate);\n variableToUpdate.subscription = variable.validateAndUpdate().subscribe({\n next: () => this.validateAndUpdateCompleted(variable),\n error: (err) => this.handleVariableError(variable, err),\n });\n }\n }\n\n /**\n * A variable has completed it's update process. This could mean that variables that depend on it can now be updated in turn.\n */\n private validateAndUpdateCompleted(variable: SceneVariable) {\n const update = this.updating.get(variable);\n update?.subscription?.unsubscribe();\n\n this.updating.delete(variable);\n this.variablesToUpdate.delete(variable);\n this.updateNextBatch();\n }\n\n /**\n * TODO handle this properly (and show error in UI).\n * Not sure if this should be handled here on in MultiValueVariable\n */\n private handleVariableError(variable: SceneVariable, err: Error) {\n const update = this.updating.get(variable);\n update?.subscription?.unsubscribe();\n\n this.updating.delete(variable);\n this.variablesToUpdate.delete(variable);\n variable.setState({ loading: false, error: err });\n }\n\n /**\n * Checks if the variable has any dependencies that is currently in variablesToUpdate\n */\n private hasDependendencyInUpdateQueue(variable: SceneVariable) {\n if (!variable.variableDependency) {\n return false;\n }\n\n for (const otherVariable of this.variablesToUpdate.values()) {\n if (variable.variableDependency?.hasDependencyOn(otherVariable.state.name)) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Extract dependencies from all variables and add those that needs update to the variablesToUpdate map\n * Then it will start the update process.\n */\n private validateAndUpdateAll() {\n for (const variable of this.state.variables) {\n if (variable.validateAndUpdate) {\n this.variablesToUpdate.add(variable);\n }\n }\n\n this.updateNextBatch();\n }\n\n /**\n * This will trigger an update of all variables that depend on it.\n * */\n private onVariableValueChanged = (event: SceneVariableValueChangedEvent) => {\n const variableThatChanged = event.payload;\n\n this.variablesThatHaveChanged.add(variableThatChanged);\n\n // Ignore this change if it is currently updating\n if (this.updating.has(variableThatChanged)) {\n return;\n }\n\n // Add variables that depend on the changed variable to the update queue\n for (const otherVariable of this.state.variables) {\n if (otherVariable.variableDependency) {\n if (otherVariable.variableDependency.hasDependencyOn(variableThatChanged.state.name)) {\n this.variablesToUpdate.add(otherVariable);\n }\n }\n }\n\n this.updateNextBatch();\n };\n\n /**\n * Walk scene object graph and update all objects that depend on variables that have changed\n */\n private notifyDependentSceneObjects() {\n if (!this.parent) {\n return;\n }\n\n this.traverseSceneAndNotify(this.parent);\n this.variablesThatHaveChanged.clear();\n }\n\n /**\n * Recursivly walk the full scene object graph and notify all objects with dependencies that include any of changed variables\n */\n private traverseSceneAndNotify(sceneObject: SceneObject) {\n // No need to notify variables under this SceneVariableSet\n if (this === sceneObject) {\n return;\n }\n\n if (sceneObject.variableDependency) {\n sceneObject.variableDependency.variableValuesChanged(this.variablesThatHaveChanged);\n }\n\n forEachSceneObjectInState(sceneObject.state, (child) => this.traverseSceneAndNotify(child));\n }\n}\n\nexport interface VariableUpdateInProgress {\n variable: SceneVariable;\n subscription?: Unsubscribable;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { BusEventWithPayload } from '@grafana/data';
2
+
3
+ class SceneVariableValueChangedEvent extends BusEventWithPayload {
4
+ }
5
+ SceneVariableValueChangedEvent.type = "scene-variable-changed-value";
6
+
7
+ export { SceneVariableValueChangedEvent };
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sources":["../../../src/variables/types.ts"],"sourcesContent":["import { Observable } from 'rxjs';\n\nimport { BusEventWithPayload } from '@grafana/data';\nimport { VariableType, VariableHide } from '@grafana/schema';\n\nimport { SceneObject, SceneObjectStatePlain } from '../core/types';\n\nexport interface SceneVariableState extends SceneObjectStatePlain {\n type: VariableType;\n name: string;\n label?: string;\n hide?: VariableHide;\n skipUrlSync?: boolean;\n loading?: boolean;\n error?: any | null;\n description?: string | null;\n}\n\nexport interface SceneVariable<TState extends SceneVariableState = SceneVariableState> extends SceneObject<TState> {\n /**\n * This function is called on activation or when a dependency changes.\n */\n validateAndUpdate?(): Observable<ValidateAndUpdateResult>;\n\n /**\n * Should return the value for the given field path\n */\n getValue(fieldPath?: string): VariableValue | undefined | null;\n\n /**\n * Should return the value display text, used by the \"text\" formatter\n * Example: ${podId:text}\n * Useful for variables that have non user friendly values but friendly display text names.\n */\n getValueText?(fieldPath?: string): string;\n}\n\nexport type VariableValue = VariableValueSingle | VariableValueSingle[];\n\nexport type VariableValueSingle = string | boolean | number | VariableValueCustom;\n\n/**\n * This is for edge case values like the custom \"allValue\" that should not be escaped/formatted like other values.\n * The custom all value usually contain wildcards that should not be escaped.\n */\nexport interface VariableValueCustom {\n isCustomValue: true;\n toString(): string;\n}\n\nexport interface ValidateAndUpdateResult {}\nexport interface VariableValueOption {\n label: string;\n value: VariableValueSingle;\n}\n\nexport interface SceneVariableSetState extends SceneObjectStatePlain {\n variables: SceneVariable[];\n}\n\nexport interface SceneVariables extends SceneObject<SceneVariableSetState> {\n getByName(name: string): SceneVariable | undefined;\n}\n\nexport class SceneVariableValueChangedEvent extends BusEventWithPayload<SceneVariable> {\n public static type = 'scene-variable-changed-value';\n}\n\nexport interface SceneVariableDependencyConfigLike {\n /** Return all variable names this object depend on */\n getNames(): Set<string>;\n\n /** Used to check for dependency on a specific variable */\n hasDependencyOn(name: string): boolean;\n\n /**\n * Will be called when any variable value has changed.\n **/\n variableValuesChanged(variables: Set<SceneVariable>): void;\n}\n"],"names":[],"mappings":";;AAgEO,MAAM,uCAAuC,mBAAmC,CAAA;AAEvF,CAAA;AAFa,8BAAA,CACG,IAAO,GAAA,8BAAA;;;;"}
@@ -0,0 +1,33 @@
1
+ import { SceneObjectBase } from '../../core/SceneObjectBase.js';
2
+
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ class ConstantVariable extends SceneObjectBase {
20
+ constructor(initialState) {
21
+ super(__spreadValues({
22
+ type: "constant",
23
+ value: "",
24
+ name: ""
25
+ }, initialState));
26
+ }
27
+ getValue() {
28
+ return this.state.value;
29
+ }
30
+ }
31
+
32
+ export { ConstantVariable };
33
+ //# sourceMappingURL=ConstantVariable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConstantVariable.js","sources":["../../../../src/variables/variants/ConstantVariable.ts"],"sourcesContent":["import { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { SceneVariable, SceneVariableState, VariableValue } from '../types';\n\nexport interface ConstantVariableState extends SceneVariableState {\n value: string;\n}\n\nexport class ConstantVariable\n extends SceneObjectBase<ConstantVariableState>\n implements SceneVariable<ConstantVariableState>\n{\n public constructor(initialState: Partial<ConstantVariableState>) {\n super({\n type: 'constant',\n value: '',\n name: '',\n ...initialState,\n });\n }\n public getValue(): VariableValue {\n return this.state.value;\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAOO,MAAM,yBACH,eAEV,CAAA;AAAA,EACS,YAAY,YAA8C,EAAA;AAC/D,IAAM,KAAA,CAAA,cAAA,CAAA;AAAA,MACJ,IAAM,EAAA,UAAA;AAAA,MACN,KAAO,EAAA,EAAA;AAAA,MACP,IAAM,EAAA,EAAA;AAAA,KAAA,EACH,YACJ,CAAA,CAAA,CAAA;AAAA,GACH;AAAA,EACO,QAA0B,GAAA;AAC/B,IAAA,OAAO,KAAK,KAAM,CAAA,KAAA,CAAA;AAAA,GACpB;AACF;;;;"}
@@ -0,0 +1,58 @@
1
+ import { of } from 'rxjs';
2
+ import { VariableDependencyConfig } from '../VariableDependencyConfig.js';
3
+ import { renderSelectForVariable } from '../components/VariableValueSelect.js';
4
+ import { MultiValueVariable } from './MultiValueVariable.js';
5
+
6
+ var __defProp = Object.defineProperty;
7
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
10
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
11
+ var __spreadValues = (a, b) => {
12
+ for (var prop in b || (b = {}))
13
+ if (__hasOwnProp.call(b, prop))
14
+ __defNormalProp(a, prop, b[prop]);
15
+ if (__getOwnPropSymbols)
16
+ for (var prop of __getOwnPropSymbols(b)) {
17
+ if (__propIsEnum.call(b, prop))
18
+ __defNormalProp(a, prop, b[prop]);
19
+ }
20
+ return a;
21
+ };
22
+ class CustomVariable extends MultiValueVariable {
23
+ constructor(initialState) {
24
+ super(__spreadValues({
25
+ type: "custom",
26
+ query: "",
27
+ value: "",
28
+ text: "",
29
+ options: [],
30
+ name: ""
31
+ }, initialState));
32
+ this._variableDependency = new VariableDependencyConfig(this, {
33
+ statePaths: ["query"]
34
+ });
35
+ }
36
+ getValueOptions(args) {
37
+ var _a;
38
+ const match = (_a = this.state.query.match(/(?:\\,|[^,])+/g)) != null ? _a : [];
39
+ const options = match.map((text) => {
40
+ var _a2;
41
+ text = text.replace(/\\,/g, ",");
42
+ const textMatch = (_a2 = /^(.+)\s:\s(.+)$/g.exec(text)) != null ? _a2 : [];
43
+ if (textMatch.length === 3) {
44
+ const [, key, value] = textMatch;
45
+ return { label: key.trim(), value: value.trim() };
46
+ } else {
47
+ return { label: text.trim(), value: text.trim() };
48
+ }
49
+ });
50
+ return of(options);
51
+ }
52
+ }
53
+ CustomVariable.Component = ({ model }) => {
54
+ return renderSelectForVariable(model);
55
+ };
56
+
57
+ export { CustomVariable };
58
+ //# sourceMappingURL=CustomVariable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CustomVariable.js","sources":["../../../../src/variables/variants/CustomVariable.tsx"],"sourcesContent":["import { Observable, of } from 'rxjs';\n\nimport { SceneComponentProps } from '../../core/types';\nimport { VariableDependencyConfig } from '../VariableDependencyConfig';\nimport { renderSelectForVariable } from '../components/VariableValueSelect';\nimport { VariableValueOption } from '../types';\n\nimport { MultiValueVariable, MultiValueVariableState, VariableGetOptionsArgs } from './MultiValueVariable';\n\nexport interface CustomVariableState extends MultiValueVariableState {\n query: string;\n}\n\nexport class CustomVariable extends MultiValueVariable<CustomVariableState> {\n protected _variableDependency = new VariableDependencyConfig(this, {\n statePaths: ['query'],\n });\n\n public constructor(initialState: Partial<CustomVariableState>) {\n super({\n type: 'custom',\n query: '',\n value: '',\n text: '',\n options: [],\n name: '',\n ...initialState,\n });\n }\n\n public getValueOptions(args: VariableGetOptionsArgs): Observable<VariableValueOption[]> {\n const match = this.state.query.match(/(?:\\\\,|[^,])+/g) ?? [];\n const options = match.map((text) => {\n text = text.replace(/\\\\,/g, ',');\n const textMatch = /^(.+)\\s:\\s(.+)$/g.exec(text) ?? [];\n if (textMatch.length === 3) {\n const [, key, value] = textMatch;\n return { label: key.trim(), value: value.trim() };\n } else {\n return { label: text.trim(), value: text.trim() };\n }\n });\n\n return of(options);\n }\n\n public static Component = ({ model }: SceneComponentProps<MultiValueVariable>) => {\n return renderSelectForVariable(model);\n };\n}\n"],"names":["_a"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAaO,MAAM,uBAAuB,kBAAwC,CAAA;AAAA,EAKnE,YAAY,YAA4C,EAAA;AAC7D,IAAM,KAAA,CAAA,cAAA,CAAA;AAAA,MACJ,IAAM,EAAA,QAAA;AAAA,MACN,KAAO,EAAA,EAAA;AAAA,MACP,KAAO,EAAA,EAAA;AAAA,MACP,IAAM,EAAA,EAAA;AAAA,MACN,SAAS,EAAC;AAAA,MACV,IAAM,EAAA,EAAA;AAAA,KAAA,EACH,YACJ,CAAA,CAAA,CAAA;AAbH,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;AA9B1F,IAAA,IAAA,EAAA,CAAA;AA+BI,IAAM,MAAA,KAAA,GAAA,CAAQ,UAAK,KAAM,CAAA,KAAA,CAAM,MAAM,gBAAgB,CAAA,KAAvC,YAA4C,EAAC,CAAA;AAC3D,IAAA,MAAM,OAAU,GAAA,KAAA,CAAM,GAAI,CAAA,CAAC,IAAS,KAAA;AAhCxC,MAAAA,IAAAA,GAAAA,CAAAA;AAiCM,MAAO,IAAA,GAAA,IAAA,CAAK,OAAQ,CAAA,MAAA,EAAQ,GAAG,CAAA,CAAA;AAC/B,MAAM,MAAA,SAAA,GAAA,CAAYA,MAAA,kBAAmB,CAAA,IAAA,CAAK,IAAI,CAA5B,KAAA,IAAA,GAAAA,MAAiC,EAAC,CAAA;AACpD,MAAI,IAAA,SAAA,CAAU,WAAW,CAAG,EAAA;AAC1B,QAAA,MAAM,GAAG,GAAK,EAAA,KAAK,CAAI,GAAA,SAAA,CAAA;AACvB,QAAO,OAAA,EAAE,OAAO,GAAI,CAAA,IAAA,IAAQ,KAAO,EAAA,KAAA,CAAM,MAAO,EAAA,CAAA;AAAA,OAC3C,MAAA;AACL,QAAO,OAAA,EAAE,OAAO,IAAK,CAAA,IAAA,IAAQ,KAAO,EAAA,IAAA,CAAK,MAAO,EAAA,CAAA;AAAA,OAClD;AAAA,KACD,CAAA,CAAA;AAED,IAAA,OAAO,GAAG,OAAO,CAAA,CAAA;AAAA,GACnB;AAKF,CAAA;AApCa,cAAA,CAiCG,SAAY,GAAA,CAAC,EAAE,KAAA,EAAqD,KAAA;AAChF,EAAA,OAAO,wBAAwB,KAAK,CAAA,CAAA;AACtC,CAAA;;;;"}
@@ -0,0 +1,92 @@
1
+ import { of } from 'rxjs';
2
+ import { stringToJsRegex } from '@grafana/data';
3
+ import { getDataSourceSrv } from '@grafana/runtime';
4
+ import { sceneGraph } from '../../core/sceneGraph.js';
5
+ import { VariableDependencyConfig } from '../VariableDependencyConfig.js';
6
+ import { renderSelectForVariable } from '../components/VariableValueSelect.js';
7
+ import { MultiValueVariable } from './MultiValueVariable.js';
8
+
9
+ var __defProp = Object.defineProperty;
10
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
11
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
12
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
13
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
14
+ var __spreadValues = (a, b) => {
15
+ for (var prop in b || (b = {}))
16
+ if (__hasOwnProp.call(b, prop))
17
+ __defNormalProp(a, prop, b[prop]);
18
+ if (__getOwnPropSymbols)
19
+ for (var prop of __getOwnPropSymbols(b)) {
20
+ if (__propIsEnum.call(b, prop))
21
+ __defNormalProp(a, prop, b[prop]);
22
+ }
23
+ return a;
24
+ };
25
+ class DataSourceVariable extends MultiValueVariable {
26
+ constructor(initialState) {
27
+ super(__spreadValues({
28
+ type: "datasource",
29
+ value: "",
30
+ text: "",
31
+ options: [],
32
+ name: "",
33
+ regex: "",
34
+ query: ""
35
+ }, initialState));
36
+ this._variableDependency = new VariableDependencyConfig(this, {
37
+ statePaths: ["regex"]
38
+ });
39
+ }
40
+ getValueOptions(args) {
41
+ if (!this.state.query) {
42
+ return of([]);
43
+ }
44
+ const dataSourceTypes = this.getDataSourceTypes();
45
+ let regex;
46
+ if (this.state.regex) {
47
+ const interpolated = sceneGraph.interpolate(this, this.state.regex, void 0, "regex");
48
+ regex = stringToJsRegex(interpolated);
49
+ }
50
+ const options = [];
51
+ for (let i = 0; i < dataSourceTypes.length; i++) {
52
+ const source = dataSourceTypes[i];
53
+ if (source.meta.id !== this.state.query) {
54
+ continue;
55
+ }
56
+ if (isValid(source, regex)) {
57
+ options.push({ label: source.name, value: source.name });
58
+ }
59
+ if (isDefault(source, regex)) {
60
+ options.push({ label: "default", value: "default" });
61
+ }
62
+ }
63
+ if (options.length === 0) {
64
+ options.push({ label: "No data sources found", value: "" });
65
+ }
66
+ return of(options);
67
+ }
68
+ getDataSourceTypes() {
69
+ return getDataSourceSrv().getList({ metrics: true, variables: false });
70
+ }
71
+ }
72
+ DataSourceVariable.Component = ({ model }) => {
73
+ return renderSelectForVariable(model);
74
+ };
75
+ function isValid(source, regex) {
76
+ if (!regex) {
77
+ return true;
78
+ }
79
+ return regex.exec(source.name);
80
+ }
81
+ function isDefault(source, regex) {
82
+ if (!source.isDefault) {
83
+ return false;
84
+ }
85
+ if (!regex) {
86
+ return true;
87
+ }
88
+ return regex.exec("default");
89
+ }
90
+
91
+ export { DataSourceVariable };
92
+ //# sourceMappingURL=DataSourceVariable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataSourceVariable.js","sources":["../../../../src/variables/variants/DataSourceVariable.tsx"],"sourcesContent":["import { Observable, of } from 'rxjs';\n\nimport { stringToJsRegex, DataSourceInstanceSettings } from '@grafana/data';\nimport { getDataSourceSrv } from '@grafana/runtime';\n\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { SceneComponentProps } from '../../core/types';\nimport { VariableDependencyConfig } from '../VariableDependencyConfig';\nimport { renderSelectForVariable } from '../components/VariableValueSelect';\nimport { VariableValueOption } from '../types';\n\nimport { MultiValueVariable, MultiValueVariableState, VariableGetOptionsArgs } from './MultiValueVariable';\n\nexport interface DataSourceVariableState extends MultiValueVariableState {\n query: string;\n regex: string;\n}\n\nexport class DataSourceVariable extends MultiValueVariable<DataSourceVariableState> {\n protected _variableDependency = new VariableDependencyConfig(this, {\n statePaths: ['regex'],\n });\n\n public constructor(initialState: Partial<DataSourceVariableState>) {\n super({\n type: 'datasource',\n value: '',\n text: '',\n options: [],\n name: '',\n regex: '',\n query: '',\n ...initialState,\n });\n }\n\n public getValueOptions(args: VariableGetOptionsArgs): Observable<VariableValueOption[]> {\n if (!this.state.query) {\n return of([]);\n }\n\n const dataSourceTypes = this.getDataSourceTypes();\n\n let regex;\n if (this.state.regex) {\n const interpolated = sceneGraph.interpolate(this, this.state.regex, undefined, 'regex');\n regex = stringToJsRegex(interpolated);\n }\n\n const options: VariableValueOption[] = [];\n\n for (let i = 0; i < dataSourceTypes.length; i++) {\n const source = dataSourceTypes[i];\n // must match on type\n if (source.meta.id !== this.state.query) {\n continue;\n }\n\n if (isValid(source, regex)) {\n options.push({ label: source.name, value: source.name });\n }\n\n if (isDefault(source, regex)) {\n options.push({ label: 'default', value: 'default' });\n }\n }\n\n if (options.length === 0) {\n options.push({ label: 'No data sources found', value: '' });\n }\n\n return of(options);\n }\n\n private getDataSourceTypes(): DataSourceInstanceSettings[] {\n return getDataSourceSrv().getList({ metrics: true, variables: false });\n }\n\n public static Component = ({ model }: SceneComponentProps<MultiValueVariable>) => {\n return renderSelectForVariable(model);\n };\n}\n\nfunction isValid(source: DataSourceInstanceSettings, regex?: RegExp) {\n if (!regex) {\n return true;\n }\n\n return regex.exec(source.name);\n}\n\nfunction isDefault(source: DataSourceInstanceSettings, regex?: RegExp) {\n if (!source.isDefault) {\n return false;\n }\n\n if (!regex) {\n return true;\n }\n\n return regex.exec('default');\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,183 @@
1
+ import { isEqual } from 'lodash';
2
+ import { map } from 'rxjs';
3
+ import { ALL_VARIABLE_TEXT, ALL_VARIABLE_VALUE } from '../constants.js';
4
+ import { SceneObjectBase } from '../../core/SceneObjectBase.js';
5
+ import { SceneVariableValueChangedEvent } from '../types.js';
6
+
7
+ class MultiValueVariable extends SceneObjectBase {
8
+ constructor() {
9
+ super(...arguments);
10
+ this._urlSync = new MultiValueUrlSyncHandler(this);
11
+ }
12
+ validateAndUpdate() {
13
+ return this.getValueOptions({}).pipe(
14
+ map((options) => {
15
+ this.updateValueGivenNewOptions(options);
16
+ return {};
17
+ })
18
+ );
19
+ }
20
+ updateValueGivenNewOptions(options) {
21
+ const stateUpdate = {
22
+ options,
23
+ loading: false,
24
+ value: this.state.value,
25
+ text: this.state.text
26
+ };
27
+ if (options.length === 0) ; else if (this.hasAllValue()) ; else if (this.state.isMulti) {
28
+ const currentValues = Array.isArray(this.state.value) ? this.state.value : [this.state.value];
29
+ const validValues = currentValues.filter((v) => options.find((o) => o.value === v));
30
+ if (validValues.length === 0) {
31
+ const defaultState = this.getDefaultMultiState(options);
32
+ stateUpdate.value = defaultState.value;
33
+ stateUpdate.text = defaultState.text;
34
+ } else if (!isEqual(validValues, this.state.value)) {
35
+ const validTexts = validValues.map((v) => options.find((o) => o.value === v).label);
36
+ stateUpdate.value = validValues;
37
+ stateUpdate.text = validTexts;
38
+ }
39
+ } else {
40
+ const foundCurrent = options.find((x) => x.value === this.state.value);
41
+ if (!foundCurrent) {
42
+ if (this.state.defaultToAll) {
43
+ stateUpdate.value = ALL_VARIABLE_VALUE;
44
+ stateUpdate.text = ALL_VARIABLE_TEXT;
45
+ } else {
46
+ stateUpdate.value = options[0].value;
47
+ stateUpdate.text = options[0].label;
48
+ }
49
+ }
50
+ }
51
+ const { value: prevValue, text: prevText } = this.state;
52
+ this.setStateHelper(stateUpdate);
53
+ if (stateUpdate.value !== prevValue || stateUpdate.text !== prevText || this.hasAllValue()) {
54
+ this.publishEvent(new SceneVariableValueChangedEvent(this), true);
55
+ }
56
+ }
57
+ getValue() {
58
+ if (this.hasAllValue()) {
59
+ if (this.state.allValue) {
60
+ return new CustomAllValue(this.state.allValue);
61
+ }
62
+ return this.state.options.map((x) => x.value);
63
+ }
64
+ return this.state.value;
65
+ }
66
+ getValueText() {
67
+ if (this.hasAllValue()) {
68
+ return ALL_VARIABLE_TEXT;
69
+ }
70
+ if (Array.isArray(this.state.text)) {
71
+ return this.state.text.join(" + ");
72
+ }
73
+ return String(this.state.text);
74
+ }
75
+ hasAllValue() {
76
+ const value = this.state.value;
77
+ return value === ALL_VARIABLE_VALUE || Array.isArray(value) && value[0] === ALL_VARIABLE_VALUE;
78
+ }
79
+ getDefaultMultiState(options) {
80
+ if (this.state.defaultToAll) {
81
+ return { value: [ALL_VARIABLE_VALUE], text: [ALL_VARIABLE_TEXT] };
82
+ } else {
83
+ return { value: [options[0].value], text: [options[0].label] };
84
+ }
85
+ }
86
+ changeValueTo(value, text) {
87
+ if (value === this.state.value && text === this.state.text) {
88
+ return;
89
+ }
90
+ if (!text) {
91
+ if (Array.isArray(value)) {
92
+ text = value.map((v) => this.findLabelTextForValue(v));
93
+ } else {
94
+ text = this.findLabelTextForValue(value);
95
+ }
96
+ }
97
+ if (Array.isArray(value)) {
98
+ if (value.length === 0) {
99
+ const state = this.getDefaultMultiState(this.state.options);
100
+ value = state.value;
101
+ text = state.text;
102
+ }
103
+ if (value[value.length - 1] === ALL_VARIABLE_VALUE) {
104
+ value = [ALL_VARIABLE_VALUE];
105
+ text = [ALL_VARIABLE_TEXT];
106
+ } else if (value[0] === ALL_VARIABLE_VALUE && value.length > 1) {
107
+ value.shift();
108
+ if (Array.isArray(text)) {
109
+ text.shift();
110
+ }
111
+ }
112
+ }
113
+ this.setStateHelper({ value, text, loading: false });
114
+ this.publishEvent(new SceneVariableValueChangedEvent(this), true);
115
+ }
116
+ findLabelTextForValue(value) {
117
+ const option = this.state.options.find((x) => x.value === value);
118
+ if (option) {
119
+ return option.label;
120
+ }
121
+ const optionByLabel = this.state.options.find((x) => x.label === value);
122
+ if (optionByLabel) {
123
+ return optionByLabel.label;
124
+ }
125
+ return value;
126
+ }
127
+ setStateHelper(state) {
128
+ const test = this;
129
+ test.setState(state);
130
+ }
131
+ getOptionsForSelect() {
132
+ let options = this.state.options;
133
+ if (this.state.includeAll) {
134
+ options = [{ value: ALL_VARIABLE_VALUE, label: ALL_VARIABLE_TEXT }, ...options];
135
+ }
136
+ if (!Array.isArray(this.state.value)) {
137
+ const current = options.find((x) => x.value === this.state.value);
138
+ if (!current) {
139
+ options = [{ value: this.state.value, label: String(this.state.text) }, ...options];
140
+ }
141
+ }
142
+ return options;
143
+ }
144
+ }
145
+ class CustomAllValue {
146
+ constructor(_value) {
147
+ this._value = _value;
148
+ this.isCustomValue = true;
149
+ }
150
+ toString() {
151
+ return this._value;
152
+ }
153
+ }
154
+ class MultiValueUrlSyncHandler {
155
+ constructor(_sceneObject) {
156
+ this._sceneObject = _sceneObject;
157
+ }
158
+ getKey() {
159
+ return `var-${this._sceneObject.state.name}`;
160
+ }
161
+ getKeys() {
162
+ return [this.getKey()];
163
+ }
164
+ getUrlState(state) {
165
+ let urlValue = null;
166
+ let value = state.value;
167
+ if (Array.isArray(value)) {
168
+ urlValue = value.map(String);
169
+ } else {
170
+ urlValue = String(value);
171
+ }
172
+ return { [this.getKey()]: urlValue };
173
+ }
174
+ updateFromUrl(values) {
175
+ const urlValue = values[this.getKey()];
176
+ if (urlValue != null) {
177
+ this._sceneObject.changeValueTo(urlValue);
178
+ }
179
+ }
180
+ }
181
+
182
+ export { MultiValueUrlSyncHandler, MultiValueVariable };
183
+ //# sourceMappingURL=MultiValueVariable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MultiValueVariable.js","sources":["../../../../src/variables/variants/MultiValueVariable.ts"],"sourcesContent":["import { isEqual } from 'lodash';\nimport { map, Observable } from 'rxjs';\n\nimport { ALL_VARIABLE_TEXT, ALL_VARIABLE_VALUE } from '../constants';\n\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { SceneObject, SceneObjectUrlSyncHandler, SceneObjectUrlValues } from '../../core/types';\nimport {\n SceneVariable,\n SceneVariableValueChangedEvent,\n SceneVariableState,\n ValidateAndUpdateResult,\n VariableValue,\n VariableValueOption,\n VariableValueCustom,\n VariableValueSingle,\n} from '../types';\n\nexport interface MultiValueVariableState extends SceneVariableState {\n value: VariableValue; // old current.text\n text: VariableValue; // old current.value\n options: VariableValueOption[];\n isMulti?: boolean;\n includeAll?: boolean;\n defaultToAll?: boolean;\n allValue?: string;\n placeholder?: string;\n}\n\nexport interface VariableGetOptionsArgs {\n searchFilter?: string;\n}\n\nexport abstract class MultiValueVariable<TState extends MultiValueVariableState = MultiValueVariableState>\n extends SceneObjectBase<TState>\n implements SceneVariable<TState>\n{\n protected _urlSync: SceneObjectUrlSyncHandler<TState> = new MultiValueUrlSyncHandler(this);\n\n /**\n * The source of value options.\n */\n public abstract getValueOptions(args: VariableGetOptionsArgs): Observable<VariableValueOption[]>;\n\n /**\n * This function is called on when SceneVariableSet is activated or when a dependency changes.\n */\n public validateAndUpdate(): Observable<ValidateAndUpdateResult> {\n return this.getValueOptions({}).pipe(\n map((options) => {\n this.updateValueGivenNewOptions(options);\n return {};\n })\n );\n }\n\n /**\n * Check if current value is valid given new options. If not update the value.\n */\n private updateValueGivenNewOptions(options: VariableValueOption[]) {\n const stateUpdate: Partial<MultiValueVariableState> = {\n options,\n loading: false,\n value: this.state.value,\n text: this.state.text,\n };\n\n if (options.length === 0) {\n // TODO handle the no value state\n } else if (this.hasAllValue()) {\n // If value is set to All then we keep it set to All but just store the options\n } else if (this.state.isMulti) {\n // If we are a multi valued variable validate the current values are among the options\n const currentValues = Array.isArray(this.state.value) ? this.state.value : [this.state.value];\n const validValues = currentValues.filter((v) => options.find((o) => o.value === v));\n\n // If no valid values pick the first option\n if (validValues.length === 0) {\n const defaultState = this.getDefaultMultiState(options);\n stateUpdate.value = defaultState.value;\n stateUpdate.text = defaultState.text;\n }\n // We have valid values, if it's different from current valid values update current values\n else if (!isEqual(validValues, this.state.value)) {\n const validTexts = validValues.map((v) => options.find((o) => o.value === v)!.label);\n stateUpdate.value = validValues;\n stateUpdate.text = validTexts;\n }\n } else {\n // Single valued variable\n const foundCurrent = options.find((x) => x.value === this.state.value);\n if (!foundCurrent) {\n if (this.state.defaultToAll) {\n stateUpdate.value = ALL_VARIABLE_VALUE;\n stateUpdate.text = ALL_VARIABLE_TEXT;\n } else {\n // Current value is not valid. Set to first of the available options\n stateUpdate.value = options[0].value;\n stateUpdate.text = options[0].label;\n }\n }\n }\n\n // Remember current value and text\n const { value: prevValue, text: prevText } = this.state;\n\n // Perform state change\n this.setStateHelper(stateUpdate);\n\n // Publish value changed event only if value changed\n if (stateUpdate.value !== prevValue || stateUpdate.text !== prevText || this.hasAllValue()) {\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n }\n }\n\n public getValue(): VariableValue {\n if (this.hasAllValue()) {\n if (this.state.allValue) {\n return new CustomAllValue(this.state.allValue);\n }\n\n return this.state.options.map((x) => x.value);\n }\n\n return this.state.value;\n }\n\n public getValueText(): string {\n if (this.hasAllValue()) {\n return ALL_VARIABLE_TEXT;\n }\n\n if (Array.isArray(this.state.text)) {\n return this.state.text.join(' + ');\n }\n\n return String(this.state.text);\n }\n\n private hasAllValue() {\n const value = this.state.value;\n return value === ALL_VARIABLE_VALUE || (Array.isArray(value) && value[0] === ALL_VARIABLE_VALUE);\n }\n\n private getDefaultMultiState(options: VariableValueOption[]) {\n if (this.state.defaultToAll) {\n return { value: [ALL_VARIABLE_VALUE], text: [ALL_VARIABLE_TEXT] };\n } else {\n return { value: [options[0].value], text: [options[0].label] };\n }\n }\n\n /**\n * Change the value and publish SceneVariableValueChangedEvent event\n */\n public changeValueTo(value: VariableValue, text?: VariableValue) {\n // Igore if there is no change\n if (value === this.state.value && text === this.state.text) {\n return;\n }\n\n if (!text) {\n if (Array.isArray(value)) {\n text = value.map((v) => this.findLabelTextForValue(v));\n } else {\n text = this.findLabelTextForValue(value);\n }\n }\n\n if (Array.isArray(value)) {\n // If we are a multi valued variable is cleared (empty array) we need to set the default empty state\n if (value.length === 0) {\n const state = this.getDefaultMultiState(this.state.options);\n value = state.value;\n text = state.text;\n }\n\n // If last value is the All value then replace all with it\n if (value[value.length - 1] === ALL_VARIABLE_VALUE) {\n value = [ALL_VARIABLE_VALUE];\n text = [ALL_VARIABLE_TEXT];\n }\n // If the first value is the ALL value and we have other values, then remove the All value\n else if (value[0] === ALL_VARIABLE_VALUE && value.length > 1) {\n value.shift();\n if (Array.isArray(text)) {\n text.shift();\n }\n }\n }\n\n this.setStateHelper({ value, text, loading: false });\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n }\n\n private findLabelTextForValue(value: VariableValueSingle): VariableValueSingle {\n const option = this.state.options.find((x) => x.value === value);\n if (option) {\n return option.label;\n }\n\n const optionByLabel = this.state.options.find((x) => x.label === value);\n if (optionByLabel) {\n return optionByLabel.label;\n }\n\n return value;\n }\n\n /**\n * This helper function is to counter the contravariance of setState\n */\n private setStateHelper(state: Partial<MultiValueVariableState>) {\n const test: SceneObject<MultiValueVariableState> = this;\n test.setState(state);\n }\n\n public getOptionsForSelect(): VariableValueOption[] {\n let options = this.state.options;\n\n if (this.state.includeAll) {\n options = [{ value: ALL_VARIABLE_VALUE, label: ALL_VARIABLE_TEXT }, ...options];\n }\n\n if (!Array.isArray(this.state.value)) {\n const current = options.find((x) => x.value === this.state.value);\n if (!current) {\n options = [{ value: this.state.value, label: String(this.state.text) }, ...options];\n }\n }\n\n return options;\n }\n}\n\n/**\n * The custom allValue needs a special wrapping / handling to make it not be formatted / escaped like normal values\n */\nclass CustomAllValue implements VariableValueCustom {\n public isCustomValue: true = true;\n\n public constructor(private _value: string) {}\n\n public toString() {\n return this._value;\n }\n}\n\nexport class MultiValueUrlSyncHandler<TState extends MultiValueVariableState = MultiValueVariableState>\n implements SceneObjectUrlSyncHandler<TState>\n{\n public constructor(private _sceneObject: MultiValueVariable<TState>) {}\n\n private getKey(): string {\n return `var-${this._sceneObject.state.name}`;\n }\n\n public getKeys(): string[] {\n return [this.getKey()];\n }\n\n public getUrlState(state: TState): SceneObjectUrlValues {\n let urlValue: string | string[] | null = null;\n let value = state.value;\n\n if (Array.isArray(value)) {\n urlValue = value.map(String);\n } else {\n urlValue = String(value);\n }\n\n return { [this.getKey()]: urlValue };\n }\n\n public updateFromUrl(values: SceneObjectUrlValues): void {\n const urlValue = values[this.getKey()];\n\n if (urlValue != null) {\n this._sceneObject.changeValueTo(urlValue);\n }\n }\n}\n"],"names":[],"mappings":"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"}