@grafana/scenes 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -0
- package/dist/esm/components/EmbeddedScene.js.map +1 -1
- package/dist/esm/components/NestedScene.js +1 -28
- package/dist/esm/components/NestedScene.js.map +1 -1
- package/dist/esm/components/SceneByFrameRepeater.js.map +1 -1
- package/dist/esm/components/SceneCanvasText.js +0 -12
- package/dist/esm/components/SceneCanvasText.js.map +1 -1
- package/dist/esm/components/SceneReactObject.js.map +1 -1
- package/dist/esm/components/SceneRefreshPicker.js.map +1 -1
- package/dist/esm/components/SceneTimePicker.js.map +1 -1
- package/dist/esm/components/SceneToolbarButton.js.map +1 -1
- package/dist/esm/components/VizPanel/VizPanel.js +95 -9
- package/dist/esm/components/VizPanel/VizPanel.js.map +1 -1
- package/dist/esm/components/VizPanel/VizPanelMenu.js.map +1 -1
- package/dist/esm/components/VizPanel/VizPanelRenderer.js +20 -13
- package/dist/esm/components/VizPanel/VizPanelRenderer.js.map +1 -1
- package/dist/esm/components/VizPanel/colorSeriesConfigFactory.js +72 -0
- package/dist/esm/components/VizPanel/colorSeriesConfigFactory.js.map +1 -0
- package/dist/esm/components/VizPanel/seriesVisibilityConfigFactory.js +164 -0
- package/dist/esm/components/VizPanel/seriesVisibilityConfigFactory.js.map +1 -0
- package/dist/esm/components/layout/SceneFlexLayout.js.map +1 -1
- package/dist/esm/components/layout/grid/SceneGridLayout.js.map +1 -1
- package/dist/esm/core/SceneComponentWrapper.js +1 -10
- package/dist/esm/core/SceneComponentWrapper.js.map +1 -1
- package/dist/esm/core/SceneDataNode.js +29 -1
- package/dist/esm/core/SceneDataNode.js.map +1 -1
- package/dist/esm/core/SceneObjectBase.js +44 -20
- package/dist/esm/core/SceneObjectBase.js.map +1 -1
- package/dist/esm/core/events.js.map +1 -1
- package/dist/esm/core/types.js.map +1 -1
- package/dist/esm/core/utils.js +1 -15
- package/dist/esm/core/utils.js.map +1 -1
- package/dist/esm/querying/SceneDataTransformer.js.map +1 -1
- package/dist/esm/querying/SceneQueryRunner.js +14 -14
- package/dist/esm/querying/SceneQueryRunner.js.map +1 -1
- package/dist/esm/services/UrlSyncManager.js +9 -10
- package/dist/esm/services/UrlSyncManager.js.map +1 -1
- package/dist/esm/variables/components/VariableValueSelectors.js.map +1 -1
- package/dist/esm/variables/interpolation/defaults.js +1 -8
- package/dist/esm/variables/interpolation/defaults.js.map +1 -1
- package/dist/esm/variables/interpolation/sceneInterpolator.js +12 -8
- package/dist/esm/variables/interpolation/sceneInterpolator.js.map +1 -1
- package/dist/esm/variables/macros/DataValueMacro.js +60 -0
- package/dist/esm/variables/macros/DataValueMacro.js.map +1 -0
- package/dist/esm/variables/macros/index.js +3 -1
- package/dist/esm/variables/macros/index.js.map +1 -1
- package/dist/esm/variables/macros/types.js.map +1 -1
- package/dist/esm/variables/sets/SceneVariableSet.js +28 -29
- package/dist/esm/variables/sets/SceneVariableSet.js.map +1 -1
- package/dist/esm/variables/types.js.map +1 -1
- package/dist/esm/variables/variants/query/QueryVariable.js +14 -15
- package/dist/esm/variables/variants/query/QueryVariable.js.map +1 -1
- package/dist/index.d.ts +112 -95
- package/dist/index.js +723 -363
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
|
@@ -14,22 +14,26 @@ function sceneInterpolator(sceneObject, target, scopedVars, format) {
|
|
|
14
14
|
return target.replace(VARIABLE_REGEX, (match, var1, var2, fmt2, var3, fieldPath, fmt3) => {
|
|
15
15
|
const variableName = var1 || var2 || var3;
|
|
16
16
|
const fmt = fmt2 || fmt3 || format;
|
|
17
|
-
const variable = lookupFormatVariable(variableName, scopedVars, sceneObject);
|
|
17
|
+
const variable = lookupFormatVariable(variableName, match, scopedVars, sceneObject);
|
|
18
18
|
if (!variable) {
|
|
19
19
|
return match;
|
|
20
20
|
}
|
|
21
21
|
return formatValue(variable, variable.getValue(fieldPath), fmt);
|
|
22
22
|
});
|
|
23
23
|
}
|
|
24
|
-
function lookupFormatVariable(name, scopedVars, sceneObject) {
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
function lookupFormatVariable(name, match, scopedVars, sceneObject) {
|
|
25
|
+
const scopedVar = scopedVars == null ? void 0 : scopedVars[name];
|
|
26
|
+
if (scopedVar) {
|
|
27
|
+
return getSceneVariableForScopedVar(name, scopedVar);
|
|
27
28
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
const variable = lookupVariable(name, sceneObject);
|
|
30
|
+
if (variable) {
|
|
31
|
+
return variable;
|
|
32
|
+
}
|
|
33
|
+
if (macrosIndex[name]) {
|
|
34
|
+
return new macrosIndex[name](name, sceneObject, match, scopedVars);
|
|
32
35
|
}
|
|
36
|
+
return null;
|
|
33
37
|
}
|
|
34
38
|
function formatValue(variable, value, formatNameOrFn) {
|
|
35
39
|
if (value === null || value === void 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sceneInterpolator.js","sources":["../../../../src/variables/interpolation/sceneInterpolator.ts"],"sourcesContent":["import { ScopedVars } from '@grafana/data';\nimport { VariableType, VariableFormatID } from '@grafana/schema';\n\nimport { SceneObject } from '../../core/types';\nimport {
|
|
1
|
+
{"version":3,"file":"sceneInterpolator.js","sources":["../../../../src/variables/interpolation/sceneInterpolator.ts"],"sourcesContent":["import { ScopedVars } from '@grafana/data';\nimport { VariableType, VariableFormatID } from '@grafana/schema';\n\nimport { SceneObject } from '../../core/types';\nimport { InterpolationFormatParameter, isCustomVariableValue, VariableValue } from '../types';\n\nimport { getSceneVariableForScopedVar } from './ScopedVarsVariable';\nimport { formatRegistry, FormatVariable } from './formatRegistry';\nimport { VARIABLE_REGEX } from '../constants';\nimport { lookupVariable } from '../lookupVariable';\nimport { macrosIndex } from '../macros';\n\n/**\n * This function will try to parse and replace any variable expression found in the target string. The sceneObject will be used as the source of variables. It will\n * use the scene graph and walk up the parent tree until it finds the closest variable.\n *\n * ScopedVars should not really be needed much in the new scene architecture as they can be added to the local scene node instead of passed in interpolate function.\n * It is supported here for backward compatibility and some edge cases where adding scoped vars to local scene node is not practical.\n */\nexport function sceneInterpolator(\n sceneObject: SceneObject,\n target: string | undefined | null,\n scopedVars?: ScopedVars,\n format?: InterpolationFormatParameter\n): string {\n if (!target) {\n return target ?? '';\n }\n\n VARIABLE_REGEX.lastIndex = 0;\n\n return target.replace(VARIABLE_REGEX, (match, var1, var2, fmt2, var3, fieldPath, fmt3) => {\n const variableName = var1 || var2 || var3;\n const fmt = fmt2 || fmt3 || format;\n const variable = lookupFormatVariable(variableName, match, scopedVars, sceneObject);\n\n if (!variable) {\n return match;\n }\n\n return formatValue(variable, variable.getValue(fieldPath), fmt);\n });\n}\n\nfunction lookupFormatVariable(\n name: string,\n match: string,\n scopedVars: ScopedVars | undefined,\n sceneObject: SceneObject\n): FormatVariable | null {\n const scopedVar = scopedVars?.[name];\n\n if (scopedVar) {\n return getSceneVariableForScopedVar(name, scopedVar);\n }\n\n const variable = lookupVariable(name, sceneObject);\n if (variable) {\n return variable;\n }\n\n if (macrosIndex[name]) {\n return new macrosIndex[name](name, sceneObject, match, scopedVars);\n }\n\n return null;\n}\n\nfunction formatValue(\n variable: FormatVariable,\n value: VariableValue | undefined | null,\n formatNameOrFn?: InterpolationFormatParameter\n): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n // Variable can return a custom value that handles formatting\n // This is useful for customAllValue and macros that return values that are already formatted or need special formatting\n if (isCustomVariableValue(value)) {\n return value.formatter(formatNameOrFn);\n }\n\n // if it's an object transform value to string\n if (!Array.isArray(value) && typeof value === 'object') {\n value = `${value}`;\n }\n\n if (typeof formatNameOrFn === 'function') {\n return formatNameOrFn(value, {\n name: variable.state.name,\n type: variable.state.type as VariableType,\n multi: variable.state.isMulti,\n includeAll: variable.state.includeAll,\n });\n }\n\n let args: string[] = [];\n\n if (!formatNameOrFn) {\n formatNameOrFn = VariableFormatID.Glob;\n } else {\n // some formats have arguments that come after ':' character\n args = formatNameOrFn.split(':');\n if (args.length > 1) {\n formatNameOrFn = args[0];\n args = args.slice(1);\n } else {\n args = [];\n }\n }\n\n let formatter = formatRegistry.getIfExists(formatNameOrFn);\n\n if (!formatter) {\n console.error(`Variable format ${formatNameOrFn} not found. Using glob format as fallback.`);\n formatter = formatRegistry.get(VariableFormatID.Glob);\n }\n\n return formatter.formatter(value, args, variable);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { getDisplayProcessor, formattedValueToString, FieldType } from '@grafana/data';
|
|
2
|
+
|
|
3
|
+
class DataValueMacro {
|
|
4
|
+
constructor(name, sceneObject, _match, _scopedVars) {
|
|
5
|
+
this._match = _match;
|
|
6
|
+
this._scopedVars = _scopedVars;
|
|
7
|
+
this.state = { name, type: "url_variable" };
|
|
8
|
+
}
|
|
9
|
+
getValue(fieldPath) {
|
|
10
|
+
var _a, _b;
|
|
11
|
+
const dataContext = (_a = this._scopedVars) == null ? void 0 : _a.__dataContext;
|
|
12
|
+
if (!dataContext) {
|
|
13
|
+
return this._match;
|
|
14
|
+
}
|
|
15
|
+
const { frame, rowIndex, field, calculatedValue } = dataContext.value;
|
|
16
|
+
if (calculatedValue) {
|
|
17
|
+
switch (fieldPath) {
|
|
18
|
+
case "numeric":
|
|
19
|
+
return calculatedValue.numeric;
|
|
20
|
+
case "raw":
|
|
21
|
+
return calculatedValue.numeric;
|
|
22
|
+
case "time":
|
|
23
|
+
return "";
|
|
24
|
+
case "text":
|
|
25
|
+
default:
|
|
26
|
+
return formattedValueToString(calculatedValue);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (!rowIndex) {
|
|
30
|
+
return this._match;
|
|
31
|
+
}
|
|
32
|
+
if (fieldPath === "time") {
|
|
33
|
+
const timeField = frame.fields.find((f) => f.type === FieldType.time);
|
|
34
|
+
return timeField ? timeField.values.get(rowIndex) : void 0;
|
|
35
|
+
}
|
|
36
|
+
if (!field) {
|
|
37
|
+
return this._match;
|
|
38
|
+
}
|
|
39
|
+
const value = field.values.get(rowIndex);
|
|
40
|
+
if (fieldPath === "raw") {
|
|
41
|
+
return value;
|
|
42
|
+
}
|
|
43
|
+
const displayProcessor = (_b = field.display) != null ? _b : fallbackDisplayProcessor;
|
|
44
|
+
const result = displayProcessor(value);
|
|
45
|
+
switch (fieldPath) {
|
|
46
|
+
case "numeric":
|
|
47
|
+
return result.numeric;
|
|
48
|
+
case "text":
|
|
49
|
+
default:
|
|
50
|
+
return formattedValueToString(result);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
getValueText() {
|
|
54
|
+
return "";
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const fallbackDisplayProcessor = getDisplayProcessor();
|
|
58
|
+
|
|
59
|
+
export { DataValueMacro };
|
|
60
|
+
//# sourceMappingURL=DataValueMacro.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataValueMacro.js","sources":["../../../../src/variables/macros/DataValueMacro.ts"],"sourcesContent":["import {\n FieldType,\n formattedValueToString,\n getDisplayProcessor,\n ScopedVars,\n DataContextScopedVar,\n} from '@grafana/data';\nimport { SceneObject } from '../../core/types';\nimport { FormatVariable } from '../interpolation/formatRegistry';\nimport { VariableValue } from '../types';\n\n/**\n * match represents the regex match and is the full expression, example `${varname.fieldpath}`\n * Macros can return the match when they identify that there required data context is not provided.\n * This leaves the expression intact so that it can be interpolated later when the data context is available.\n */\nexport class DataValueMacro implements FormatVariable {\n public state: { name: string; type: string };\n\n public constructor(name: string, sceneObject: SceneObject, private _match: string, private _scopedVars?: ScopedVars) {\n this.state = { name, type: 'url_variable' };\n }\n\n public getValue(fieldPath?: string): VariableValue {\n const dataContext: DataContextScopedVar | undefined = this._scopedVars?.__dataContext;\n if (!dataContext) {\n return this._match;\n }\n\n const { frame, rowIndex, field, calculatedValue } = dataContext.value;\n\n if (calculatedValue) {\n switch (fieldPath) {\n case 'numeric':\n return calculatedValue.numeric;\n case 'raw':\n return calculatedValue.numeric;\n case 'time':\n return '';\n case 'text':\n default:\n return formattedValueToString(calculatedValue);\n }\n }\n\n if (!rowIndex) {\n return this._match;\n }\n\n if (fieldPath === 'time') {\n const timeField = frame.fields.find((f) => f.type === FieldType.time);\n return timeField ? timeField.values.get(rowIndex) : undefined;\n }\n\n if (!field) {\n return this._match;\n }\n\n const value = field.values.get(rowIndex);\n if (fieldPath === 'raw') {\n return value;\n }\n\n const displayProcessor = field.display ?? fallbackDisplayProcessor;\n const result = displayProcessor(value);\n\n switch (fieldPath) {\n case 'numeric':\n return result.numeric;\n case 'text':\n default:\n return formattedValueToString(result);\n }\n }\n\n public getValueText?(): string {\n return '';\n }\n}\n\nconst fallbackDisplayProcessor = getDisplayProcessor();\n"],"names":[],"mappings":";;AAgBO,MAAM,cAAyC,CAAA;AAAA,EAG7C,WAAY,CAAA,IAAA,EAAc,WAAkC,EAAA,MAAA,EAAwB,WAA0B,EAAA;AAAlD,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA,CAAA;AAAwB,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA,CAAA;AACzF,IAAA,IAAA,CAAK,KAAQ,GAAA,EAAE,IAAM,EAAA,IAAA,EAAM,cAAe,EAAA,CAAA;AAAA,GAC5C;AAAA,EAEO,SAAS,SAAmC,EAAA;AAvBrD,IAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AAwBI,IAAM,MAAA,WAAA,GAAA,CAAgD,EAAK,GAAA,IAAA,CAAA,WAAA,KAAL,IAAkB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,aAAA,CAAA;AACxE,IAAA,IAAI,CAAC,WAAa,EAAA;AAChB,MAAA,OAAO,IAAK,CAAA,MAAA,CAAA;AAAA,KACd;AAEA,IAAA,MAAM,EAAE,KAAO,EAAA,QAAA,EAAU,KAAO,EAAA,eAAA,KAAoB,WAAY,CAAA,KAAA,CAAA;AAEhE,IAAA,IAAI,eAAiB,EAAA;AACnB,MAAQ,QAAA,SAAA;AAAA,QACD,KAAA,SAAA;AACH,UAAA,OAAO,eAAgB,CAAA,OAAA,CAAA;AAAA,QACpB,KAAA,KAAA;AACH,UAAA,OAAO,eAAgB,CAAA,OAAA,CAAA;AAAA,QACpB,KAAA,MAAA;AACH,UAAO,OAAA,EAAA,CAAA;AAAA,QACJ,KAAA,MAAA,CAAA;AAAA,QAAA;AAEH,UAAA,OAAO,uBAAuB,eAAe,CAAA,CAAA;AAAA,OAAA;AAAA,KAEnD;AAEA,IAAA,IAAI,CAAC,QAAU,EAAA;AACb,MAAA,OAAO,IAAK,CAAA,MAAA,CAAA;AAAA,KACd;AAEA,IAAA,IAAI,cAAc,MAAQ,EAAA;AACxB,MAAM,MAAA,SAAA,GAAY,MAAM,MAAO,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,IAAS,KAAA,SAAA,CAAU,IAAI,CAAA,CAAA;AACpE,MAAA,OAAO,SAAY,GAAA,SAAA,CAAU,MAAO,CAAA,GAAA,CAAI,QAAQ,CAAI,GAAA,KAAA,CAAA,CAAA;AAAA,KACtD;AAEA,IAAA,IAAI,CAAC,KAAO,EAAA;AACV,MAAA,OAAO,IAAK,CAAA,MAAA,CAAA;AAAA,KACd;AAEA,IAAA,MAAM,KAAQ,GAAA,KAAA,CAAM,MAAO,CAAA,GAAA,CAAI,QAAQ,CAAA,CAAA;AACvC,IAAA,IAAI,cAAc,KAAO,EAAA;AACvB,MAAO,OAAA,KAAA,CAAA;AAAA,KACT;AAEA,IAAM,MAAA,gBAAA,GAAA,CAAmB,EAAM,GAAA,KAAA,CAAA,OAAA,KAAN,IAAiB,GAAA,EAAA,GAAA,wBAAA,CAAA;AAC1C,IAAM,MAAA,MAAA,GAAS,iBAAiB,KAAK,CAAA,CAAA;AAErC,IAAQ,QAAA,SAAA;AAAA,MACD,KAAA,SAAA;AACH,QAAA,OAAO,MAAO,CAAA,OAAA,CAAA;AAAA,MACX,KAAA,MAAA,CAAA;AAAA,MAAA;AAEH,QAAA,OAAO,uBAAuB,MAAM,CAAA,CAAA;AAAA,KAAA;AAAA,GAE1C;AAAA,EAEO,YAAwB,GAAA;AAC7B,IAAO,OAAA,EAAA,CAAA;AAAA,GACT;AACF,CAAA;AAEA,MAAM,2BAA2B,mBAAoB,EAAA;;;;"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { DataLinkBuiltInVars } from '@grafana/data';
|
|
2
2
|
import { UrlTimeRangeMacro } from './UrlTimeRangeMacro.js';
|
|
3
3
|
import { AllVariablesMacro } from './AllVariablesMacro.js';
|
|
4
|
+
import { DataValueMacro } from './DataValueMacro.js';
|
|
4
5
|
|
|
5
6
|
const macrosIndex = {
|
|
6
7
|
[DataLinkBuiltInVars.includeVars]: AllVariablesMacro,
|
|
7
|
-
[DataLinkBuiltInVars.keepTime]: UrlTimeRangeMacro
|
|
8
|
+
[DataLinkBuiltInVars.keepTime]: UrlTimeRangeMacro,
|
|
9
|
+
["__value"]: DataValueMacro
|
|
8
10
|
};
|
|
9
11
|
|
|
10
12
|
export { macrosIndex };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/variables/macros/index.ts"],"sourcesContent":["import { DataLinkBuiltInVars } from '@grafana/data';\nimport { MacroVariableConstructor } from './types';\nimport { UrlTimeRangeMacro } from './UrlTimeRangeMacro';\nimport { AllVariablesMacro } from './AllVariablesMacro';\n\nexport const macrosIndex: Record<string, MacroVariableConstructor> = {\n [DataLinkBuiltInVars.includeVars]: AllVariablesMacro,\n [DataLinkBuiltInVars.keepTime]: UrlTimeRangeMacro,\n};\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/variables/macros/index.ts"],"sourcesContent":["import { DataLinkBuiltInVars } from '@grafana/data';\nimport { MacroVariableConstructor } from './types';\nimport { UrlTimeRangeMacro } from './UrlTimeRangeMacro';\nimport { AllVariablesMacro } from './AllVariablesMacro';\nimport { DataValueMacro } from './DataValueMacro';\n\nexport const macrosIndex: Record<string, MacroVariableConstructor> = {\n [DataLinkBuiltInVars.includeVars]: AllVariablesMacro,\n [DataLinkBuiltInVars.keepTime]: UrlTimeRangeMacro,\n ['__value']: DataValueMacro,\n};\n"],"names":[],"mappings":";;;;;AAMO,MAAM,WAAwD,GAAA;AAAA,EACnE,CAAC,oBAAoB,WAAc,GAAA,iBAAA;AAAA,EACnC,CAAC,oBAAoB,QAAW,GAAA,iBAAA;AAAA,EAChC,CAAC,SAAY,GAAA,cAAA;AACf;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sources":["../../../../src/variables/macros/types.ts"],"sourcesContent":["import { SceneObject } from '../../core/types';\nimport { FormatVariable } from '../interpolation/formatRegistry';\nimport { CustomVariableValue } from '../types';\n\nexport interface MacroVariableConstructor {\n new (name: string, sceneObject: SceneObject): FormatVariable;\n}\n\n/**\n * The sceneInterpolator will detect if getValue returns VariableValueCustom and will skip the normal formatting\n * This is useful as otherwise we would url encode macros like $__all_variables twice.\n */\nexport class SkipFormattingValue implements CustomVariableValue {\n public constructor(private _value: string) {}\n\n public formatter(): string {\n return this._value;\n }\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sources":["../../../../src/variables/macros/types.ts"],"sourcesContent":["import { ScopedVars } from '@grafana/data';\nimport { SceneObject } from '../../core/types';\nimport { FormatVariable } from '../interpolation/formatRegistry';\nimport { CustomVariableValue } from '../types';\n\nexport interface MacroVariableConstructor {\n new (name: string, sceneObject: SceneObject, fullMatch: string, scopedVars?: ScopedVars): FormatVariable;\n}\n\n/**\n * The sceneInterpolator will detect if getValue returns VariableValueCustom and will skip the normal formatting\n * This is useful as otherwise we would url encode macros like $__all_variables twice.\n */\nexport class SkipFormattingValue implements CustomVariableValue {\n public constructor(private _value: string) {}\n\n public formatter(): string {\n return this._value;\n }\n}\n"],"names":[],"mappings":"AAaO,MAAM,mBAAmD,CAAA;AAAA,EACvD,YAAoB,MAAgB,EAAA;AAAhB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA,CAAA;AAAA,GAAiB;AAAA,EAErC,SAAoB,GAAA;AACzB,IAAA,OAAO,IAAK,CAAA,MAAA,CAAA;AAAA,GACd;AACF;;;;"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { SceneObjectBase } from '../../core/SceneObjectBase.js';
|
|
2
|
-
import { forEachSceneObjectInState } from '../../core/utils.js';
|
|
3
2
|
import { writeSceneLog } from '../../utils/writeSceneLog.js';
|
|
4
3
|
import { SceneVariableValueChangedEvent } from '../types.js';
|
|
5
4
|
import { VariableValueRecorder } from '../VariableValueRecorder.js';
|
|
@@ -13,16 +12,16 @@ class SceneVariableSet extends SceneObjectBase {
|
|
|
13
12
|
this._variableValueRecorder = new VariableValueRecorder();
|
|
14
13
|
this._onActivate = () => {
|
|
15
14
|
this._subs.add(
|
|
16
|
-
this.subscribeToEvent(SceneVariableValueChangedEvent, (event) => this.
|
|
15
|
+
this.subscribeToEvent(SceneVariableValueChangedEvent, (event) => this._handleVariableValueChanged(event.payload))
|
|
17
16
|
);
|
|
18
|
-
this._subs.add(this.subscribeToState(this.
|
|
19
|
-
this.
|
|
17
|
+
this._subs.add(this.subscribeToState(this._onStateChanged));
|
|
18
|
+
this._checkForVariablesThatChangedWhileInactive();
|
|
20
19
|
for (const variable of this.state.variables) {
|
|
21
|
-
if (this.
|
|
20
|
+
if (this._variableNeedsUpdate(variable)) {
|
|
22
21
|
this._variablesToUpdate.add(variable);
|
|
23
22
|
}
|
|
24
23
|
}
|
|
25
|
-
this.
|
|
24
|
+
this._updateNextBatch();
|
|
26
25
|
return this._onDeactivate;
|
|
27
26
|
};
|
|
28
27
|
this._onDeactivate = () => {
|
|
@@ -38,7 +37,7 @@ class SceneVariableSet extends SceneObjectBase {
|
|
|
38
37
|
this._variablesToUpdate.clear();
|
|
39
38
|
this._updating.clear();
|
|
40
39
|
};
|
|
41
|
-
this.
|
|
40
|
+
this._onStateChanged = (newState, oldState) => {
|
|
42
41
|
const variablesToUpdateCountStart = this._variablesToUpdate.size;
|
|
43
42
|
for (const variable of oldState.variables) {
|
|
44
43
|
if (!newState.variables.includes(variable)) {
|
|
@@ -52,13 +51,13 @@ class SceneVariableSet extends SceneObjectBase {
|
|
|
52
51
|
}
|
|
53
52
|
for (const variable of newState.variables) {
|
|
54
53
|
if (!oldState.variables.includes(variable)) {
|
|
55
|
-
if (this.
|
|
54
|
+
if (this._variableNeedsUpdate(variable)) {
|
|
56
55
|
this._variablesToUpdate.add(variable);
|
|
57
56
|
}
|
|
58
57
|
}
|
|
59
58
|
}
|
|
60
59
|
if (variablesToUpdateCountStart === 0 && this._variablesToUpdate.size > 0) {
|
|
61
|
-
this.
|
|
60
|
+
this._updateNextBatch();
|
|
62
61
|
}
|
|
63
62
|
};
|
|
64
63
|
this.addActivationHandler(this._onActivate);
|
|
@@ -66,18 +65,18 @@ class SceneVariableSet extends SceneObjectBase {
|
|
|
66
65
|
getByName(name) {
|
|
67
66
|
return this.state.variables.find((x) => x.state.name === name);
|
|
68
67
|
}
|
|
69
|
-
|
|
68
|
+
_checkForVariablesThatChangedWhileInactive() {
|
|
70
69
|
if (!this._variableValueRecorder.hasValues()) {
|
|
71
70
|
return;
|
|
72
71
|
}
|
|
73
72
|
for (const variable of this.state.variables) {
|
|
74
73
|
if (this._variableValueRecorder.hasValueChanged(variable)) {
|
|
75
74
|
writeVariableTraceLog(variable, "Changed while in-active");
|
|
76
|
-
this.
|
|
75
|
+
this._addDependentVariablesToUpdateQueue(variable);
|
|
77
76
|
}
|
|
78
77
|
}
|
|
79
78
|
}
|
|
80
|
-
|
|
79
|
+
_variableNeedsUpdate(variable) {
|
|
81
80
|
if (!variable.validateAndUpdate) {
|
|
82
81
|
return false;
|
|
83
82
|
}
|
|
@@ -87,9 +86,9 @@ class SceneVariableSet extends SceneObjectBase {
|
|
|
87
86
|
}
|
|
88
87
|
return true;
|
|
89
88
|
}
|
|
90
|
-
|
|
89
|
+
_updateNextBatch() {
|
|
91
90
|
if (this._variablesToUpdate.size === 0) {
|
|
92
|
-
this.
|
|
91
|
+
this._notifyDependentSceneObjects();
|
|
93
92
|
return;
|
|
94
93
|
}
|
|
95
94
|
for (const variable of this._variablesToUpdate) {
|
|
@@ -99,7 +98,7 @@ class SceneVariableSet extends SceneObjectBase {
|
|
|
99
98
|
if (this._updating.has(variable)) {
|
|
100
99
|
continue;
|
|
101
100
|
}
|
|
102
|
-
if (this.
|
|
101
|
+
if (this._hasDependendencyInUpdateQueue(variable)) {
|
|
103
102
|
continue;
|
|
104
103
|
}
|
|
105
104
|
const variableToUpdate = {
|
|
@@ -108,21 +107,21 @@ class SceneVariableSet extends SceneObjectBase {
|
|
|
108
107
|
this._updating.set(variable, variableToUpdate);
|
|
109
108
|
writeVariableTraceLog(variable, "updateAndValidate started");
|
|
110
109
|
variableToUpdate.subscription = variable.validateAndUpdate().subscribe({
|
|
111
|
-
next: () => this.
|
|
112
|
-
error: (err) => this.
|
|
110
|
+
next: () => this._validateAndUpdateCompleted(variable),
|
|
111
|
+
error: (err) => this._handleVariableError(variable, err)
|
|
113
112
|
});
|
|
114
113
|
}
|
|
115
114
|
}
|
|
116
|
-
|
|
115
|
+
_validateAndUpdateCompleted(variable) {
|
|
117
116
|
var _a;
|
|
118
117
|
const update = this._updating.get(variable);
|
|
119
118
|
(_a = update == null ? void 0 : update.subscription) == null ? void 0 : _a.unsubscribe();
|
|
120
119
|
this._updating.delete(variable);
|
|
121
120
|
this._variablesToUpdate.delete(variable);
|
|
122
121
|
writeVariableTraceLog(variable, "updateAndValidate completed");
|
|
123
|
-
this.
|
|
122
|
+
this._updateNextBatch();
|
|
124
123
|
}
|
|
125
|
-
|
|
124
|
+
_handleVariableError(variable, err) {
|
|
126
125
|
var _a;
|
|
127
126
|
const update = this._updating.get(variable);
|
|
128
127
|
(_a = update == null ? void 0 : update.subscription) == null ? void 0 : _a.unsubscribe();
|
|
@@ -131,7 +130,7 @@ class SceneVariableSet extends SceneObjectBase {
|
|
|
131
130
|
variable.setState({ loading: false, error: err });
|
|
132
131
|
writeVariableTraceLog(variable, "updateAndValidate error", err);
|
|
133
132
|
}
|
|
134
|
-
|
|
133
|
+
_hasDependendencyInUpdateQueue(variable) {
|
|
135
134
|
var _a;
|
|
136
135
|
if (!variable.variableDependency) {
|
|
137
136
|
return false;
|
|
@@ -143,15 +142,15 @@ class SceneVariableSet extends SceneObjectBase {
|
|
|
143
142
|
}
|
|
144
143
|
return false;
|
|
145
144
|
}
|
|
146
|
-
|
|
145
|
+
_handleVariableValueChanged(variableThatChanged) {
|
|
147
146
|
this._variablesThatHaveChanged.add(variableThatChanged);
|
|
148
147
|
if (this._updating.has(variableThatChanged)) {
|
|
149
148
|
return;
|
|
150
149
|
}
|
|
151
|
-
this.
|
|
152
|
-
this.
|
|
150
|
+
this._addDependentVariablesToUpdateQueue(variableThatChanged);
|
|
151
|
+
this._updateNextBatch();
|
|
153
152
|
}
|
|
154
|
-
|
|
153
|
+
_addDependentVariablesToUpdateQueue(variableThatChanged) {
|
|
155
154
|
for (const otherVariable of this.state.variables) {
|
|
156
155
|
if (otherVariable.variableDependency) {
|
|
157
156
|
if (otherVariable.variableDependency.hasDependencyOn(variableThatChanged.state.name)) {
|
|
@@ -161,14 +160,14 @@ class SceneVariableSet extends SceneObjectBase {
|
|
|
161
160
|
}
|
|
162
161
|
}
|
|
163
162
|
}
|
|
164
|
-
|
|
163
|
+
_notifyDependentSceneObjects() {
|
|
165
164
|
if (!this.parent) {
|
|
166
165
|
return;
|
|
167
166
|
}
|
|
168
|
-
this.
|
|
167
|
+
this._traverseSceneAndNotify(this.parent);
|
|
169
168
|
this._variablesThatHaveChanged.clear();
|
|
170
169
|
}
|
|
171
|
-
|
|
170
|
+
_traverseSceneAndNotify(sceneObject) {
|
|
172
171
|
if (this === sceneObject) {
|
|
173
172
|
return;
|
|
174
173
|
}
|
|
@@ -178,7 +177,7 @@ class SceneVariableSet extends SceneObjectBase {
|
|
|
178
177
|
if (sceneObject.variableDependency) {
|
|
179
178
|
sceneObject.variableDependency.variableUpdatesCompleted(this._variablesThatHaveChanged);
|
|
180
179
|
}
|
|
181
|
-
|
|
180
|
+
sceneObject.forEachChild((child) => this._traverseSceneAndNotify(child));
|
|
182
181
|
}
|
|
183
182
|
isVariableLoadingOrWaitingToUpdate(variable) {
|
|
184
183
|
if (!this.isActive) {
|
|
@@ -1 +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 { writeSceneLog } from '../../utils/writeSceneLog';\nimport { SceneVariable, SceneVariables, SceneVariableSetState, SceneVariableValueChangedEvent } from '../types';\nimport { VariableValueRecorder } from '../VariableValueRecorder';\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 private _variableValueRecorder = new VariableValueRecorder();\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 public constructor(state: SceneVariableSetState) {\n super(state);\n\n this.addActivationHandler(this._onActivate);\n }\n\n /**\n * Subscribes to child variable value changes, and starts the variable value validation process\n */\n private _onActivate = () => {\n // Subscribe to changes to child variables\n this._subs.add(\n this.subscribeToEvent(SceneVariableValueChangedEvent, (event) => this.handleVariableValueChanged(event.payload))\n );\n\n // Subscribe to state changes\n this._subs.add(this.subscribeToState(this.handleStateChanged));\n\n this.checkForVariablesThatChangedWhileInactive();\n\n // Add all variables that need updating to queue\n for (const variable of this.state.variables) {\n if (this.variableNeedsUpdate(variable)) {\n this._variablesToUpdate.add(variable);\n }\n }\n\n this.updateNextBatch();\n\n // Return deactivation handler;\n return this._onDeactivate;\n };\n\n /**\n * Cancel all currently running updates\n */\n private _onDeactivate = () => {\n for (const update of this._updating.values()) {\n update.subscription?.unsubscribe();\n }\n\n // Remember current variable values\n for (const variable of this.state.variables) {\n // if the current variable is not in queue to update and validate and not being actively updated then the value is ok\n if (!this._variablesToUpdate.has(variable) && !this._updating.has(variable)) {\n this._variableValueRecorder.recordCurrentValue(variable);\n }\n }\n\n this._variablesToUpdate.clear();\n this._updating.clear();\n };\n\n /**\n * Look for new variables that need to be initialized\n */\n private handleStateChanged = (newState: SceneVariableSetState, oldState: SceneVariableSetState) => {\n const variablesToUpdateCountStart = this._variablesToUpdate.size;\n\n // Check for removed variables\n for (const variable of oldState.variables) {\n if (!newState.variables.includes(variable)) {\n const updating = this._updating.get(variable);\n if (updating?.subscription) {\n updating.subscription.unsubscribe();\n }\n this._updating.delete(variable);\n this._variablesToUpdate.delete(variable);\n }\n }\n\n // Check for new variables\n for (const variable of newState.variables) {\n if (!oldState.variables.includes(variable)) {\n if (this.variableNeedsUpdate(variable)) {\n this._variablesToUpdate.add(variable);\n }\n }\n }\n\n // Only start a new batch if there was no batch already running\n if (variablesToUpdateCountStart === 0 && this._variablesToUpdate.size > 0) {\n this.updateNextBatch();\n }\n };\n\n /**\n * If variables changed while in in-active state we don't get any change events, so we need to check for that here.\n */\n private checkForVariablesThatChangedWhileInactive() {\n if (!this._variableValueRecorder.hasValues()) {\n return;\n }\n\n for (const variable of this.state.variables) {\n if (this._variableValueRecorder.hasValueChanged(variable)) {\n writeVariableTraceLog(variable, 'Changed while in-active');\n this.addDependentVariablesToUpdateQueue(variable);\n }\n }\n }\n\n private variableNeedsUpdate(variable: SceneVariable): boolean {\n if (!variable.validateAndUpdate) {\n return false;\n }\n\n // If we have recorded valid value (even if it has changed since we do not need to re-validate this variable)\n if (this._variableValueRecorder.hasRecordedValue(variable)) {\n writeVariableTraceLog(variable, 'Skipping updateAndValidate current value valid');\n return false;\n }\n\n return true;\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) {\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 writeVariableTraceLog(variable, 'updateAndValidate started');\n\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\n writeVariableTraceLog(variable, 'updateAndValidate completed');\n\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 writeVariableTraceLog(variable, 'updateAndValidate 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 private handleVariableValueChanged(variableThatChanged: SceneVariable) {\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 this.addDependentVariablesToUpdateQueue(variableThatChanged);\n this.updateNextBatch();\n }\n\n private addDependentVariablesToUpdateQueue(variableThatChanged: SceneVariable) {\n for (const otherVariable of this.state.variables) {\n if (otherVariable.variableDependency) {\n if (otherVariable.variableDependency.hasDependencyOn(variableThatChanged.state.name)) {\n writeVariableTraceLog(otherVariable, 'Added to update quee, dependant variable value changed');\n this._variablesToUpdate.add(otherVariable);\n }\n }\n }\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 // Skip non active scene objects\n if (!sceneObject.isActive) {\n return;\n }\n\n if (sceneObject.variableDependency) {\n sceneObject.variableDependency.variableUpdatesCompleted(this._variablesThatHaveChanged);\n }\n\n forEachSceneObjectInState(sceneObject.state, (child) => this.traverseSceneAndNotify(child));\n }\n\n /**\n * Return true if variable is waiting to update or currently updating\n */\n public isVariableLoadingOrWaitingToUpdate(variable: SceneVariable) {\n // If we have not activated yet then variables are not up to date\n if (!this.isActive) {\n return true;\n }\n\n return this._variablesToUpdate.has(variable) || this._updating.has(variable);\n }\n}\n\nexport interface VariableUpdateInProgress {\n variable: SceneVariable;\n subscription?: Unsubscribable;\n}\n\nfunction writeVariableTraceLog(variable: SceneVariable, message: string, err?: Error) {\n writeSceneLog('SceneVariableSet', `Variable[${variable.state.name}]: ${message}`, err);\n}\n"],"names":[],"mappings":";;;;;;AASO,MAAM,yBAAyB,eAAiE,CAAA;AAAA,EAiB9F,YAAY,KAA8B,EAAA;AAC/C,IAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AAhBb,IAAQ,IAAA,CAAA,yBAAA,uBAAgC,GAAmB,EAAA,CAAA;AAG3D,IAAQ,IAAA,CAAA,kBAAA,uBAAyB,GAAmB,EAAA,CAAA;AAGpD,IAAQ,IAAA,CAAA,SAAA,uBAAgB,GAA6C,EAAA,CAAA;AAErE,IAAQ,IAAA,CAAA,sBAAA,GAAyB,IAAI,qBAAsB,EAAA,CAAA;AAgB3D,IAAA,IAAA,CAAQ,cAAc,MAAM;AAE1B,MAAA,IAAA,CAAK,KAAM,CAAA,GAAA;AAAA,QACT,IAAA,CAAK,iBAAiB,8BAAgC,EAAA,CAAC,UAAU,IAAK,CAAA,0BAAA,CAA2B,KAAM,CAAA,OAAO,CAAC,CAAA;AAAA,OACjH,CAAA;AAGA,MAAA,IAAA,CAAK,MAAM,GAAI,CAAA,IAAA,CAAK,gBAAiB,CAAA,IAAA,CAAK,kBAAkB,CAAC,CAAA,CAAA;AAE7D,MAAA,IAAA,CAAK,yCAA0C,EAAA,CAAA;AAG/C,MAAW,KAAA,MAAA,QAAA,IAAY,IAAK,CAAA,KAAA,CAAM,SAAW,EAAA;AAC3C,QAAI,IAAA,IAAA,CAAK,mBAAoB,CAAA,QAAQ,CAAG,EAAA;AACtC,UAAK,IAAA,CAAA,kBAAA,CAAmB,IAAI,QAAQ,CAAA,CAAA;AAAA,SACtC;AAAA,OACF;AAEA,MAAA,IAAA,CAAK,eAAgB,EAAA,CAAA;AAGrB,MAAA,OAAO,IAAK,CAAA,aAAA,CAAA;AAAA,KACd,CAAA;AAKA,IAAA,IAAA,CAAQ,gBAAgB,MAAM;AA9DhC,MAAA,IAAA,EAAA,CAAA;AA+DI,MAAA,KAAA,MAAW,MAAU,IAAA,IAAA,CAAK,SAAU,CAAA,MAAA,EAAU,EAAA;AAC5C,QAAA,CAAA,EAAA,GAAA,MAAA,CAAO,iBAAP,IAAqB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,WAAA,EAAA,CAAA;AAAA,OACvB;AAGA,MAAW,KAAA,MAAA,QAAA,IAAY,IAAK,CAAA,KAAA,CAAM,SAAW,EAAA;AAE3C,QAAI,IAAA,CAAC,IAAK,CAAA,kBAAA,CAAmB,GAAI,CAAA,QAAQ,CAAK,IAAA,CAAC,IAAK,CAAA,SAAA,CAAU,GAAI,CAAA,QAAQ,CAAG,EAAA;AAC3E,UAAK,IAAA,CAAA,sBAAA,CAAuB,mBAAmB,QAAQ,CAAA,CAAA;AAAA,SACzD;AAAA,OACF;AAEA,MAAA,IAAA,CAAK,mBAAmB,KAAM,EAAA,CAAA;AAC9B,MAAA,IAAA,CAAK,UAAU,KAAM,EAAA,CAAA;AAAA,KACvB,CAAA;AAKA,IAAQ,IAAA,CAAA,kBAAA,GAAqB,CAAC,QAAA,EAAiC,QAAoC,KAAA;AACjG,MAAM,MAAA,2BAAA,GAA8B,KAAK,kBAAmB,CAAA,IAAA,CAAA;AAG5D,MAAW,KAAA,MAAA,QAAA,IAAY,SAAS,SAAW,EAAA;AACzC,QAAA,IAAI,CAAC,QAAA,CAAS,SAAU,CAAA,QAAA,CAAS,QAAQ,CAAG,EAAA;AAC1C,UAAA,MAAM,QAAW,GAAA,IAAA,CAAK,SAAU,CAAA,GAAA,CAAI,QAAQ,CAAA,CAAA;AAC5C,UAAA,IAAI,qCAAU,YAAc,EAAA;AAC1B,YAAA,QAAA,CAAS,aAAa,WAAY,EAAA,CAAA;AAAA,WACpC;AACA,UAAK,IAAA,CAAA,SAAA,CAAU,OAAO,QAAQ,CAAA,CAAA;AAC9B,UAAK,IAAA,CAAA,kBAAA,CAAmB,OAAO,QAAQ,CAAA,CAAA;AAAA,SACzC;AAAA,OACF;AAGA,MAAW,KAAA,MAAA,QAAA,IAAY,SAAS,SAAW,EAAA;AACzC,QAAA,IAAI,CAAC,QAAA,CAAS,SAAU,CAAA,QAAA,CAAS,QAAQ,CAAG,EAAA;AAC1C,UAAI,IAAA,IAAA,CAAK,mBAAoB,CAAA,QAAQ,CAAG,EAAA;AACtC,YAAK,IAAA,CAAA,kBAAA,CAAmB,IAAI,QAAQ,CAAA,CAAA;AAAA,WACtC;AAAA,SACF;AAAA,OACF;AAGA,MAAA,IAAI,2BAAgC,KAAA,CAAA,IAAK,IAAK,CAAA,kBAAA,CAAmB,OAAO,CAAG,EAAA;AACzE,QAAA,IAAA,CAAK,eAAgB,EAAA,CAAA;AAAA,OACvB;AAAA,KACF,CAAA;AAjFE,IAAK,IAAA,CAAA,oBAAA,CAAqB,KAAK,WAAW,CAAA,CAAA;AAAA,GAC5C;AAAA,EATO,UAAU,IAAyC,EAAA;AAExD,IAAO,OAAA,IAAA,CAAK,MAAM,SAAU,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,KAAM,CAAA,IAAA,KAAS,IAAI,CAAA,CAAA;AAAA,GAC/D;AAAA,EA2FQ,yCAA4C,GAAA;AAClD,IAAA,IAAI,CAAC,IAAA,CAAK,sBAAuB,CAAA,SAAA,EAAa,EAAA;AAC5C,MAAA,OAAA;AAAA,KACF;AAEA,IAAW,KAAA,MAAA,QAAA,IAAY,IAAK,CAAA,KAAA,CAAM,SAAW,EAAA;AAC3C,MAAA,IAAI,IAAK,CAAA,sBAAA,CAAuB,eAAgB,CAAA,QAAQ,CAAG,EAAA;AACzD,QAAA,qBAAA,CAAsB,UAAU,yBAAyB,CAAA,CAAA;AACzD,QAAA,IAAA,CAAK,mCAAmC,QAAQ,CAAA,CAAA;AAAA,OAClD;AAAA,KACF;AAAA,GACF;AAAA,EAEQ,oBAAoB,QAAkC,EAAA;AAC5D,IAAI,IAAA,CAAC,SAAS,iBAAmB,EAAA;AAC/B,MAAO,OAAA,KAAA,CAAA;AAAA,KACT;AAGA,IAAA,IAAI,IAAK,CAAA,sBAAA,CAAuB,gBAAiB,CAAA,QAAQ,CAAG,EAAA;AAC1D,MAAA,qBAAA,CAAsB,UAAU,gDAAgD,CAAA,CAAA;AAChF,MAAO,OAAA,KAAA,CAAA;AAAA,KACT;AAEA,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAAA,EAMQ,eAAkB,GAAA;AAExB,IAAI,IAAA,IAAA,CAAK,kBAAmB,CAAA,IAAA,KAAS,CAAG,EAAA;AACtC,MAAA,IAAA,CAAK,2BAA4B,EAAA,CAAA;AACjC,MAAA,OAAA;AAAA,KACF;AAEA,IAAW,KAAA,MAAA,QAAA,IAAY,KAAK,kBAAoB,EAAA;AAC9C,MAAI,IAAA,CAAC,SAAS,iBAAmB,EAAA;AAC/B,QAAM,MAAA,IAAI,MAAM,yEAAyE,CAAA,CAAA;AAAA,OAC3F;AAGA,MAAA,IAAI,IAAK,CAAA,SAAA,CAAU,GAAI,CAAA,QAAQ,CAAG,EAAA;AAChC,QAAA,SAAA;AAAA,OACF;AAGA,MAAI,IAAA,IAAA,CAAK,6BAA8B,CAAA,QAAQ,CAAG,EAAA;AAChD,QAAA,SAAA;AAAA,OACF;AAEA,MAAA,MAAM,gBAA6C,GAAA;AAAA,QACjD,QAAA;AAAA,OACF,CAAA;AAEA,MAAK,IAAA,CAAA,SAAA,CAAU,GAAI,CAAA,QAAA,EAAU,gBAAgB,CAAA,CAAA;AAC7C,MAAA,qBAAA,CAAsB,UAAU,2BAA2B,CAAA,CAAA;AAE3D,MAAA,gBAAA,CAAiB,YAAe,GAAA,QAAA,CAAS,iBAAkB,EAAA,CAAE,SAAU,CAAA;AAAA,QACrE,IAAM,EAAA,MAAM,IAAK,CAAA,0BAAA,CAA2B,QAAQ,CAAA;AAAA,QACpD,OAAO,CAAC,GAAA,KAAQ,IAAK,CAAA,mBAAA,CAAoB,UAAU,GAAG,CAAA;AAAA,OACvD,CAAA,CAAA;AAAA,KACH;AAAA,GACF;AAAA,EAKQ,2BAA2B,QAAyB,EAAA;AAzL9D,IAAA,IAAA,EAAA,CAAA;AA0LI,IAAA,MAAM,MAAS,GAAA,IAAA,CAAK,SAAU,CAAA,GAAA,CAAI,QAAQ,CAAA,CAAA;AAC1C,IAAA,CAAA,EAAA,GAAA,MAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,MAAA,CAAQ,iBAAR,IAAsB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,WAAA,EAAA,CAAA;AAEtB,IAAK,IAAA,CAAA,SAAA,CAAU,OAAO,QAAQ,CAAA,CAAA;AAC9B,IAAK,IAAA,CAAA,kBAAA,CAAmB,OAAO,QAAQ,CAAA,CAAA;AAEvC,IAAA,qBAAA,CAAsB,UAAU,6BAA6B,CAAA,CAAA;AAE7D,IAAA,IAAA,CAAK,eAAgB,EAAA,CAAA;AAAA,GACvB;AAAA,EAMQ,mBAAA,CAAoB,UAAyB,GAAY,EAAA;AAzMnE,IAAA,IAAA,EAAA,CAAA;AA0MI,IAAA,MAAM,MAAS,GAAA,IAAA,CAAK,SAAU,CAAA,GAAA,CAAI,QAAQ,CAAA,CAAA;AAC1C,IAAA,CAAA,EAAA,GAAA,MAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,MAAA,CAAQ,iBAAR,IAAsB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,WAAA,EAAA,CAAA;AAEtB,IAAK,IAAA,CAAA,SAAA,CAAU,OAAO,QAAQ,CAAA,CAAA;AAC9B,IAAK,IAAA,CAAA,kBAAA,CAAmB,OAAO,QAAQ,CAAA,CAAA;AACvC,IAAA,QAAA,CAAS,SAAS,EAAE,OAAA,EAAS,KAAO,EAAA,KAAA,EAAO,KAAK,CAAA,CAAA;AAEhD,IAAsB,qBAAA,CAAA,QAAA,EAAU,2BAA2B,GAAG,CAAA,CAAA;AAAA,GAChE;AAAA,EAKQ,8BAA8B,QAAyB,EAAA;AAvNjE,IAAA,IAAA,EAAA,CAAA;AAwNI,IAAI,IAAA,CAAC,SAAS,kBAAoB,EAAA;AAChC,MAAO,OAAA,KAAA,CAAA;AAAA,KACT;AAEA,IAAA,KAAA,MAAW,aAAiB,IAAA,IAAA,CAAK,kBAAmB,CAAA,MAAA,EAAU,EAAA;AAC5D,MAAA,IAAA,CAAI,cAAS,kBAAT,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAA6B,eAAgB,CAAA,aAAA,CAAc,MAAM,IAAO,CAAA,EAAA;AAC1E,QAAO,OAAA,IAAA,CAAA;AAAA,OACT;AAAA,KACF;AAEA,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAAA,EAEQ,2BAA2B,mBAAoC,EAAA;AACrE,IAAK,IAAA,CAAA,yBAAA,CAA0B,IAAI,mBAAmB,CAAA,CAAA;AAGtD,IAAA,IAAI,IAAK,CAAA,SAAA,CAAU,GAAI,CAAA,mBAAmB,CAAG,EAAA;AAC3C,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,mCAAmC,mBAAmB,CAAA,CAAA;AAC3D,IAAA,IAAA,CAAK,eAAgB,EAAA,CAAA;AAAA,GACvB;AAAA,EAEQ,mCAAmC,mBAAoC,EAAA;AAC7E,IAAW,KAAA,MAAA,aAAA,IAAiB,IAAK,CAAA,KAAA,CAAM,SAAW,EAAA;AAChD,MAAA,IAAI,cAAc,kBAAoB,EAAA;AACpC,QAAA,IAAI,cAAc,kBAAmB,CAAA,eAAA,CAAgB,mBAAoB,CAAA,KAAA,CAAM,IAAI,CAAG,EAAA;AACpF,UAAA,qBAAA,CAAsB,eAAe,wDAAwD,CAAA,CAAA;AAC7F,UAAK,IAAA,CAAA,kBAAA,CAAmB,IAAI,aAAa,CAAA,CAAA;AAAA,SAC3C;AAAA,OACF;AAAA,KACF;AAAA,GACF;AAAA,EAKQ,2BAA8B,GAAA;AACpC,IAAI,IAAA,CAAC,KAAK,MAAQ,EAAA;AAChB,MAAA,OAAA;AAAA,KACF;AAEA,IAAK,IAAA,CAAA,sBAAA,CAAuB,KAAK,MAAM,CAAA,CAAA;AACvC,IAAA,IAAA,CAAK,0BAA0B,KAAM,EAAA,CAAA;AAAA,GACvC;AAAA,EAKQ,uBAAuB,WAA0B,EAAA;AAEvD,IAAA,IAAI,SAAS,WAAa,EAAA;AACxB,MAAA,OAAA;AAAA,KACF;AAGA,IAAI,IAAA,CAAC,YAAY,QAAU,EAAA;AACzB,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,IAAI,YAAY,kBAAoB,EAAA;AAClC,MAAY,WAAA,CAAA,kBAAA,CAAmB,wBAAyB,CAAA,IAAA,CAAK,yBAAyB,CAAA,CAAA;AAAA,KACxF;AAEA,IAAA,yBAAA,CAA0B,YAAY,KAAO,EAAA,CAAC,UAAU,IAAK,CAAA,sBAAA,CAAuB,KAAK,CAAC,CAAA,CAAA;AAAA,GAC5F;AAAA,EAKO,mCAAmC,QAAyB,EAAA;AAEjE,IAAI,IAAA,CAAC,KAAK,QAAU,EAAA;AAClB,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAEA,IAAO,OAAA,IAAA,CAAK,mBAAmB,GAAI,CAAA,QAAQ,KAAK,IAAK,CAAA,SAAA,CAAU,IAAI,QAAQ,CAAA,CAAA;AAAA,GAC7E;AACF,CAAA;AAOA,SAAS,qBAAA,CAAsB,QAAyB,EAAA,OAAA,EAAiB,GAAa,EAAA;AACpF,EAAA,aAAA,CAAc,oBAAoB,CAAY,SAAA,EAAA,QAAA,CAAS,KAAM,CAAA,IAAA,CAAA,GAAA,EAAU,WAAW,GAAG,CAAA,CAAA;AACvF;;;;"}
|
|
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 { writeSceneLog } from '../../utils/writeSceneLog';\nimport { SceneVariable, SceneVariables, SceneVariableSetState, SceneVariableValueChangedEvent } from '../types';\nimport { VariableValueRecorder } from '../VariableValueRecorder';\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 private _variableValueRecorder = new VariableValueRecorder();\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 public constructor(state: SceneVariableSetState) {\n super(state);\n\n this.addActivationHandler(this._onActivate);\n }\n\n /**\n * Subscribes to child variable value changes, and starts the variable value validation process\n */\n private _onActivate = () => {\n // Subscribe to changes to child variables\n this._subs.add(\n this.subscribeToEvent(SceneVariableValueChangedEvent, (event) => this._handleVariableValueChanged(event.payload))\n );\n\n // Subscribe to state changes\n this._subs.add(this.subscribeToState(this._onStateChanged));\n\n this._checkForVariablesThatChangedWhileInactive();\n\n // Add all variables that need updating to queue\n for (const variable of this.state.variables) {\n if (this._variableNeedsUpdate(variable)) {\n this._variablesToUpdate.add(variable);\n }\n }\n\n this._updateNextBatch();\n\n // Return deactivation handler;\n return this._onDeactivate;\n };\n\n /**\n * Cancel all currently running updates\n */\n private _onDeactivate = () => {\n for (const update of this._updating.values()) {\n update.subscription?.unsubscribe();\n }\n\n // Remember current variable values\n for (const variable of this.state.variables) {\n // if the current variable is not in queue to update and validate and not being actively updated then the value is ok\n if (!this._variablesToUpdate.has(variable) && !this._updating.has(variable)) {\n this._variableValueRecorder.recordCurrentValue(variable);\n }\n }\n\n this._variablesToUpdate.clear();\n this._updating.clear();\n };\n\n /**\n * Look for new variables that need to be initialized\n */\n private _onStateChanged = (newState: SceneVariableSetState, oldState: SceneVariableSetState) => {\n const variablesToUpdateCountStart = this._variablesToUpdate.size;\n\n // Check for removed variables\n for (const variable of oldState.variables) {\n if (!newState.variables.includes(variable)) {\n const updating = this._updating.get(variable);\n if (updating?.subscription) {\n updating.subscription.unsubscribe();\n }\n this._updating.delete(variable);\n this._variablesToUpdate.delete(variable);\n }\n }\n\n // Check for new variables\n for (const variable of newState.variables) {\n if (!oldState.variables.includes(variable)) {\n if (this._variableNeedsUpdate(variable)) {\n this._variablesToUpdate.add(variable);\n }\n }\n }\n\n // Only start a new batch if there was no batch already running\n if (variablesToUpdateCountStart === 0 && this._variablesToUpdate.size > 0) {\n this._updateNextBatch();\n }\n };\n\n /**\n * If variables changed while in in-active state we don't get any change events, so we need to check for that here.\n */\n private _checkForVariablesThatChangedWhileInactive() {\n if (!this._variableValueRecorder.hasValues()) {\n return;\n }\n\n for (const variable of this.state.variables) {\n if (this._variableValueRecorder.hasValueChanged(variable)) {\n writeVariableTraceLog(variable, 'Changed while in-active');\n this._addDependentVariablesToUpdateQueue(variable);\n }\n }\n }\n\n private _variableNeedsUpdate(variable: SceneVariable): boolean {\n if (!variable.validateAndUpdate) {\n return false;\n }\n\n // If we have recorded valid value (even if it has changed since we do not need to re-validate this variable)\n if (this._variableValueRecorder.hasRecordedValue(variable)) {\n writeVariableTraceLog(variable, 'Skipping updateAndValidate current value valid');\n return false;\n }\n\n return true;\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) {\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 writeVariableTraceLog(variable, 'updateAndValidate started');\n\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\n writeVariableTraceLog(variable, 'updateAndValidate completed');\n\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 writeVariableTraceLog(variable, 'updateAndValidate 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 private _handleVariableValueChanged(variableThatChanged: SceneVariable) {\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 this._addDependentVariablesToUpdateQueue(variableThatChanged);\n this._updateNextBatch();\n }\n\n private _addDependentVariablesToUpdateQueue(variableThatChanged: SceneVariable) {\n for (const otherVariable of this.state.variables) {\n if (otherVariable.variableDependency) {\n if (otherVariable.variableDependency.hasDependencyOn(variableThatChanged.state.name)) {\n writeVariableTraceLog(otherVariable, 'Added to update quee, dependant variable value changed');\n this._variablesToUpdate.add(otherVariable);\n }\n }\n }\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 // Skip non active scene objects\n if (!sceneObject.isActive) {\n return;\n }\n\n if (sceneObject.variableDependency) {\n sceneObject.variableDependency.variableUpdatesCompleted(this._variablesThatHaveChanged);\n }\n\n sceneObject.forEachChild((child) => this._traverseSceneAndNotify(child));\n }\n\n /**\n * Return true if variable is waiting to update or currently updating\n */\n public isVariableLoadingOrWaitingToUpdate(variable: SceneVariable) {\n // If we have not activated yet then variables are not up to date\n if (!this.isActive) {\n return true;\n }\n\n return this._variablesToUpdate.has(variable) || this._updating.has(variable);\n }\n}\n\nexport interface VariableUpdateInProgress {\n variable: SceneVariable;\n subscription?: Unsubscribable;\n}\n\nfunction writeVariableTraceLog(variable: SceneVariable, message: string, err?: Error) {\n writeSceneLog('SceneVariableSet', `Variable[${variable.state.name}]: ${message}`, err);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +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,
|
|
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, SceneObjectState } from '../core/types';\n\nexport interface SceneVariableState extends SceneObjectState {\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 | CustomVariableValue;\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 CustomVariableValue {\n /**\n * The format name or function used in the expression\n */\n formatter(formatNameOrFn?: string | VariableCustomFormatterFn): string;\n}\n\nexport interface ValidateAndUpdateResult {}\nexport interface VariableValueOption {\n label: string;\n value: VariableValueSingle;\n}\n\nexport interface SceneVariableSetState extends SceneObjectState {\n variables: SceneVariable[];\n}\n\nexport interface SceneVariables extends SceneObject<SceneVariableSetState> {\n /**\n * Will look for and return variable matching name\n */\n getByName(name: string): SceneVariable | undefined;\n /**\n * Will return true if the variable is loading or waiting for an update to complete.\n */\n isVariableLoadingOrWaitingToUpdate(variable: SceneVariable): boolean;\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 the VariableSet have completed an update process\n **/\n variableUpdatesCompleted(changedVariables: Set<SceneVariable>): void;\n}\n\n/**\n * Used in CustomFormatterFn\n */\nexport interface CustomFormatterVariable {\n name: string;\n type: VariableType;\n multi?: boolean;\n includeAll?: boolean;\n}\n\nexport type VariableCustomFormatterFn = (\n value: unknown,\n legacyVariableModel: Partial<CustomFormatterVariable>,\n legacyDefaultFormatter?: VariableCustomFormatterFn\n) => string;\n\nexport type InterpolationFormatParameter = string | VariableCustomFormatterFn | undefined;\n\nexport function isCustomVariableValue(value: VariableValue): value is CustomVariableValue {\n return typeof value === 'object' && 'formatter' in value;\n}\n"],"names":[],"mappings":";;AAyEO,MAAM,uCAAuC,mBAAmC,CAAA;AAEvF,CAAA;AAFa,8BAAA,CACG,IAAO,GAAA,8BAAA,CAAA;AAkChB,SAAS,sBAAsB,KAAoD,EAAA;AACxF,EAAO,OAAA,OAAO,KAAU,KAAA,QAAA,IAAY,WAAe,IAAA,KAAA,CAAA;AACrD;;;;"}
|
|
@@ -44,23 +44,22 @@ class QueryVariable extends MultiValueVariable {
|
|
|
44
44
|
this._variableDependency = new VariableDependencyConfig(this, {
|
|
45
45
|
statePaths: ["regex", "query", "datasource"]
|
|
46
46
|
});
|
|
47
|
-
this.
|
|
48
|
-
const timeRange = sceneGraph.getTimeRange(this);
|
|
49
|
-
if (this.state.refresh === VariableRefresh.onTimeRangeChanged) {
|
|
50
|
-
this._subs.add(
|
|
51
|
-
timeRange.subscribeToState(() => {
|
|
52
|
-
this.updateSubscription = this.validateAndUpdate().subscribe();
|
|
53
|
-
})
|
|
54
|
-
);
|
|
55
|
-
}
|
|
56
|
-
};
|
|
57
|
-
this.addActivationHandler(this._onActivate);
|
|
47
|
+
this.addActivationHandler(() => this._onActivate());
|
|
58
48
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
if (this.
|
|
62
|
-
this.
|
|
49
|
+
_onActivate() {
|
|
50
|
+
const timeRange = sceneGraph.getTimeRange(this);
|
|
51
|
+
if (this.state.refresh === VariableRefresh.onTimeRangeChanged) {
|
|
52
|
+
this._subs.add(
|
|
53
|
+
timeRange.subscribeToState(() => {
|
|
54
|
+
this.updateSubscription = this.validateAndUpdate().subscribe();
|
|
55
|
+
})
|
|
56
|
+
);
|
|
63
57
|
}
|
|
58
|
+
return () => {
|
|
59
|
+
if (this.updateSubscription) {
|
|
60
|
+
this.updateSubscription.unsubscribe();
|
|
61
|
+
}
|
|
62
|
+
};
|
|
64
63
|
}
|
|
65
64
|
getValueOptions(args) {
|
|
66
65
|
if (this.state.query === "" || !this.state.datasource) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryVariable.js","sources":["../../../../../src/variables/variants/query/QueryVariable.tsx"],"sourcesContent":["import React from 'react';\nimport { Observable, 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 DataSourceRef,\n getDefaultTimeRange,\n LoadingState,\n PanelData,\n ScopedVars,\n VariableRefresh,\n VariableSort,\n} from '@grafana/data';\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 { getDataSource } from '../../../utils/getDataSource';\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\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 this.addActivationHandler(this._onActivate);\n }\n\n private _onActivate
|
|
1
|
+
{"version":3,"file":"QueryVariable.js","sources":["../../../../../src/variables/variants/query/QueryVariable.tsx"],"sourcesContent":["import React from 'react';\nimport { Observable, 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 DataSourceRef,\n getDefaultTimeRange,\n LoadingState,\n PanelData,\n ScopedVars,\n VariableRefresh,\n VariableSort,\n} from '@grafana/data';\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 { getDataSource } from '../../../utils/getDataSource';\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\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 this.addActivationHandler(() => this._onActivate());\n }\n\n private _onActivate() {\n const timeRange = sceneGraph.getTimeRange(this);\n\n if (this.state.refresh === VariableRefresh.onTimeRangeChanged) {\n this._subs.add(\n timeRange.subscribeToState(() => {\n this.updateSubscription = this.validateAndUpdate().subscribe();\n })\n );\n }\n\n return () => {\n if (this.updateSubscription) {\n this.updateSubscription.unsubscribe();\n }\n };\n }\n\n public getValueOptions(args: VariableGetOptionsArgs): Observable<VariableValueOption[]> {\n if (this.state.query === '' || !this.state.datasource) {\n return of([]);\n }\n\n this.setState({ loading: true });\n\n return from(\n getDataSource(this.state.datasource, {\n __sceneObject: { text: '__sceneObject', value: this },\n })\n ).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 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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"}
|