@grafana/scenes 1.8.1 → 1.9.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.
Files changed (36) hide show
  1. package/CHANGELOG.md +21 -2
  2. package/dist/esm/components/EmbeddedScene.js +7 -1
  3. package/dist/esm/components/EmbeddedScene.js.map +1 -1
  4. package/dist/esm/core/SceneTimeRange.js +43 -22
  5. package/dist/esm/core/SceneTimeRange.js.map +1 -1
  6. package/dist/esm/core/SceneTimeZoneOverride.js +10 -2
  7. package/dist/esm/core/SceneTimeZoneOverride.js.map +1 -1
  8. package/dist/esm/core/types.js.map +1 -1
  9. package/dist/esm/index.js +2 -0
  10. package/dist/esm/index.js.map +1 -1
  11. package/dist/esm/utils/ControlsLabel.js +18 -15
  12. package/dist/esm/utils/ControlsLabel.js.map +1 -1
  13. package/dist/esm/utils/compatibility/patchTimeSrv.js +17 -0
  14. package/dist/esm/utils/compatibility/patchTimeSrv.js.map +1 -0
  15. package/dist/esm/variables/adhoc/AdHocFilterBuilder.js +24 -0
  16. package/dist/esm/variables/adhoc/AdHocFilterBuilder.js.map +1 -0
  17. package/dist/esm/variables/adhoc/AdHocFilterRenderer.js +129 -0
  18. package/dist/esm/variables/adhoc/AdHocFilterRenderer.js.map +1 -0
  19. package/dist/esm/variables/adhoc/AdHocFiltersSet.js +197 -0
  20. package/dist/esm/variables/adhoc/AdHocFiltersSet.js.map +1 -0
  21. package/dist/esm/variables/adhoc/AdHocFiltersVariable.js +90 -0
  22. package/dist/esm/variables/adhoc/AdHocFiltersVariable.js.map +1 -0
  23. package/dist/esm/variables/adhoc/AdHocFiltersVariableUrlSyncHandler.js +65 -0
  24. package/dist/esm/variables/adhoc/AdHocFiltersVariableUrlSyncHandler.js.map +1 -0
  25. package/dist/esm/variables/adhoc/patchGetAdhocFilters.js +38 -0
  26. package/dist/esm/variables/adhoc/patchGetAdhocFilters.js.map +1 -0
  27. package/dist/esm/variables/components/VariableValueSelectors.js +1 -0
  28. package/dist/esm/variables/components/VariableValueSelectors.js.map +1 -1
  29. package/dist/esm/variables/sets/SceneVariableSet.js +2 -1
  30. package/dist/esm/variables/sets/SceneVariableSet.js.map +1 -1
  31. package/dist/esm/variables/variants/TestVariable.js +3 -0
  32. package/dist/esm/variables/variants/TestVariable.js.map +1 -1
  33. package/dist/index.d.ts +92 -6
  34. package/dist/index.js +1053 -496
  35. package/dist/index.js.map +1 -1
  36. package/package.json +2 -2
@@ -0,0 +1,129 @@
1
+ import React, { useState } from 'react';
2
+ import { toOption } from '@grafana/data';
3
+ import { useStyles2, Select, Button } from '@grafana/ui';
4
+ import { css } from '@emotion/css';
5
+
6
+ var __defProp = Object.defineProperty;
7
+ var __defProps = Object.defineProperties;
8
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
9
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
10
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
11
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
12
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
13
+ var __spreadValues = (a, b) => {
14
+ for (var prop in b || (b = {}))
15
+ if (__hasOwnProp.call(b, prop))
16
+ __defNormalProp(a, prop, b[prop]);
17
+ if (__getOwnPropSymbols)
18
+ for (var prop of __getOwnPropSymbols(b)) {
19
+ if (__propIsEnum.call(b, prop))
20
+ __defNormalProp(a, prop, b[prop]);
21
+ }
22
+ return a;
23
+ };
24
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
25
+ function AdHocFilterRenderer({ filter, model }) {
26
+ var _a;
27
+ const styles = useStyles2(getStyles);
28
+ const [state, setState] = useState({});
29
+ const keyValue = filter.key !== "" ? toOption(filter.key) : null;
30
+ const valueValue = filter.value !== "" ? toOption(filter.value) : null;
31
+ return /* @__PURE__ */ React.createElement("div", {
32
+ className: styles.wrapper,
33
+ "data-testid": `AdHocFilter-${filter.key}`
34
+ }, /* @__PURE__ */ React.createElement(Select, {
35
+ disabled: model.state.readOnly,
36
+ className: state.isKeysOpen ? styles.widthWhenOpen : void 0,
37
+ width: "auto",
38
+ value: keyValue,
39
+ placeholder: "Select label",
40
+ options: state.keys,
41
+ onChange: (v) => model._updateFilter(filter, "key", v.value),
42
+ autoFocus: filter.key === "",
43
+ isOpen: state.isKeysOpen,
44
+ isLoading: state.isKeysLoading,
45
+ onOpenMenu: async () => {
46
+ setState(__spreadProps(__spreadValues({}, state), { isKeysLoading: true }));
47
+ const keys = await model._getKeys(filter.key);
48
+ setState(__spreadProps(__spreadValues({}, state), { isKeysLoading: false, isKeysOpen: true, keys }));
49
+ },
50
+ onCloseMenu: () => {
51
+ setState(__spreadProps(__spreadValues({}, state), { isKeysOpen: false }));
52
+ },
53
+ openMenuOnFocus: true
54
+ }), /* @__PURE__ */ React.createElement(Select, {
55
+ value: filter.operator,
56
+ disabled: model.state.readOnly,
57
+ options: model._getOperators(),
58
+ width: "auto",
59
+ onChange: (v) => model._updateFilter(filter, "operator", v.value)
60
+ }), /* @__PURE__ */ React.createElement(Select, {
61
+ disabled: model.state.readOnly,
62
+ className: state.isKeysOpen ? styles.widthWhenOpen : void 0,
63
+ width: "auto",
64
+ value: valueValue,
65
+ placeholder: "value",
66
+ options: state.values,
67
+ onChange: (v) => model._updateFilter(filter, "value", v.value),
68
+ isOpen: state.isValuesOpen,
69
+ isLoading: state.isValuesLoading,
70
+ onOpenMenu: async () => {
71
+ setState(__spreadProps(__spreadValues({}, state), { isValuesLoading: true }));
72
+ const values = await model._getValuesFor(filter);
73
+ setState(__spreadProps(__spreadValues({}, state), { isValuesLoading: false, isValuesOpen: true, values }));
74
+ },
75
+ onCloseMenu: () => {
76
+ setState(__spreadProps(__spreadValues({}, state), { isValuesOpen: false }));
77
+ }
78
+ }), /* @__PURE__ */ React.createElement(Button, {
79
+ variant: "secondary",
80
+ "aria-label": "Remove filter",
81
+ title: "Remove filter",
82
+ className: styles.removeButton,
83
+ icon: "times",
84
+ "data-testid": `AdHocFilter-remove-${(_a = filter.key) != null ? _a : ""}`,
85
+ onClick: () => model._removeFilter(filter)
86
+ }));
87
+ }
88
+ const getStyles = (theme) => ({
89
+ wrapper: css({
90
+ display: "flex",
91
+ "> *": {
92
+ "&:not(:first-child)": {
93
+ marginLeft: -1
94
+ },
95
+ "&:first-child": {
96
+ borderTopRightRadius: 0,
97
+ borderBottomRightRadius: 0
98
+ },
99
+ "&:last-child": {
100
+ borderTopLeftRadius: 0,
101
+ borderBottomLeftRadius: 0
102
+ },
103
+ "&:not(:first-child):not(:last-child)": {
104
+ borderRadius: 0
105
+ },
106
+ position: "relative",
107
+ zIndex: 0,
108
+ "&:hover": {
109
+ zIndex: 1
110
+ },
111
+ "&:focus-within": {
112
+ zIndex: 2
113
+ }
114
+ }
115
+ }),
116
+ widthWhenOpen: css({
117
+ minWidth: theme.spacing(16)
118
+ }),
119
+ removeButton: css({
120
+ paddingLeft: theme.spacing(3 / 2),
121
+ paddingRight: theme.spacing(3 / 2),
122
+ borderLeft: "none",
123
+ position: "relative",
124
+ left: "1px"
125
+ })
126
+ });
127
+
128
+ export { AdHocFilterRenderer };
129
+ //# sourceMappingURL=AdHocFilterRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdHocFilterRenderer.js","sources":["../../../../src/variables/adhoc/AdHocFilterRenderer.tsx"],"sourcesContent":["import React, { useState } from 'react';\n\nimport { AdHocFilterSet } from './AdHocFiltersSet';\nimport { AdHocVariableFilter, GrafanaTheme2, SelectableValue, toOption } from '@grafana/data';\nimport { Button, Select, useStyles2 } from '@grafana/ui';\nimport { css } from '@emotion/css';\n\ninterface Props {\n filter: AdHocVariableFilter;\n model: AdHocFilterSet;\n}\n\nexport function AdHocFilterRenderer({ filter, model }: Props) {\n const styles = useStyles2(getStyles);\n\n // there's a bug in react-select where the menu doesn't recalculate its position when the options are loaded asynchronously\n // see https://github.com/grafana/grafana/issues/63558\n // instead, we explicitly control the menu visibility and prevent showing it until the options have fully loaded\n\n const [state, setState] = useState<{\n keys?: SelectableValue[];\n values?: SelectableValue[];\n isKeysLoading?: boolean;\n isValuesLoading?: boolean;\n isKeysOpen?: boolean;\n isValuesOpen?: boolean;\n }>({});\n\n const keyValue = filter.key !== '' ? toOption(filter.key) : null;\n const valueValue = filter.value !== '' ? toOption(filter.value) : null;\n\n return (\n <div className={styles.wrapper} data-testid={`AdHocFilter-${filter.key}`}>\n <Select\n disabled={model.state.readOnly}\n className={state.isKeysOpen ? styles.widthWhenOpen : undefined}\n width=\"auto\"\n value={keyValue}\n placeholder={'Select label'}\n options={state.keys}\n onChange={(v) => model._updateFilter(filter, 'key', v.value)}\n autoFocus={filter.key === ''}\n isOpen={state.isKeysOpen}\n isLoading={state.isKeysLoading}\n onOpenMenu={async () => {\n setState({ ...state, isKeysLoading: true });\n const keys = await model._getKeys(filter.key);\n setState({ ...state, isKeysLoading: false, isKeysOpen: true, keys });\n }}\n onCloseMenu={() => {\n setState({ ...state, isKeysOpen: false });\n }}\n openMenuOnFocus={true}\n />\n <Select\n value={filter.operator}\n disabled={model.state.readOnly}\n options={model._getOperators()}\n width=\"auto\"\n onChange={(v) => model._updateFilter(filter, 'operator', v.value)}\n />\n <Select\n disabled={model.state.readOnly}\n className={state.isKeysOpen ? styles.widthWhenOpen : undefined}\n width=\"auto\"\n value={valueValue}\n placeholder={'value'}\n options={state.values}\n onChange={(v) => model._updateFilter(filter, 'value', v.value)}\n isOpen={state.isValuesOpen}\n isLoading={state.isValuesLoading}\n onOpenMenu={async () => {\n setState({ ...state, isValuesLoading: true });\n const values = await model._getValuesFor(filter);\n setState({ ...state, isValuesLoading: false, isValuesOpen: true, values });\n }}\n onCloseMenu={() => {\n setState({ ...state, isValuesOpen: false });\n }}\n />\n <Button\n variant=\"secondary\"\n aria-label=\"Remove filter\"\n title=\"Remove filter\"\n className={styles.removeButton}\n icon=\"times\"\n data-testid={`AdHocFilter-remove-${filter.key ?? ''}`}\n onClick={() => model._removeFilter(filter)}\n />\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css({\n display: 'flex',\n '> *': {\n '&:not(:first-child)': {\n // Negative margin hides the double-border on adjacent selects\n marginLeft: -1,\n },\n\n '&:first-child': {\n borderTopRightRadius: 0,\n borderBottomRightRadius: 0,\n },\n\n '&:last-child': {\n borderTopLeftRadius: 0,\n borderBottomLeftRadius: 0,\n },\n\n '&:not(:first-child):not(:last-child)': {\n borderRadius: 0,\n },\n\n // Fix focus state zIndex issues\n position: 'relative',\n zIndex: 0,\n\n // Adjacent borders are overlapping, so raise children up when hovering etc\n // so all that child's borders are visible.\n '&:hover': {\n zIndex: 1,\n },\n\n '&:focus-within': {\n zIndex: 2,\n },\n },\n }),\n widthWhenOpen: css({\n minWidth: theme.spacing(16),\n }),\n removeButton: css({\n paddingLeft: theme.spacing(3 / 2),\n paddingRight: theme.spacing(3 / 2),\n borderLeft: 'none',\n // To not have button background and last select border intersect\n position: 'relative',\n left: '1px',\n }),\n});\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,197 @@
1
+ import { SceneObjectBase } from '../../core/SceneObjectBase.js';
2
+ import { patchGetAdhocFilters } from './patchGetAdhocFilters.js';
3
+ import { getDataSourceSrv } from '@grafana/runtime';
4
+ import { SceneQueryRunner } from '../../querying/SceneQueryRunner.js';
5
+ import { AdHocFiltersVariableUrlSyncHandler } from './AdHocFiltersVariableUrlSyncHandler.js';
6
+ import { useStyles2 } from '@grafana/ui';
7
+ import React from 'react';
8
+ import { ControlsLabel } from '../../utils/ControlsLabel.js';
9
+ import { AdHocFilterRenderer } from './AdHocFilterRenderer.js';
10
+ import { AdHocFilterBuilder } from './AdHocFilterBuilder.js';
11
+ import { css } from '@emotion/css';
12
+
13
+ var __defProp = Object.defineProperty;
14
+ var __defProps = Object.defineProperties;
15
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
16
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
17
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
18
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
19
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
20
+ var __spreadValues = (a, b) => {
21
+ for (var prop in b || (b = {}))
22
+ if (__hasOwnProp.call(b, prop))
23
+ __defNormalProp(a, prop, b[prop]);
24
+ if (__getOwnPropSymbols)
25
+ for (var prop of __getOwnPropSymbols(b)) {
26
+ if (__propIsEnum.call(b, prop))
27
+ __defNormalProp(a, prop, b[prop]);
28
+ }
29
+ return a;
30
+ };
31
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
32
+ class AdHocFilterSet extends SceneObjectBase {
33
+ constructor(initialState) {
34
+ super(__spreadValues({
35
+ name: "Filters",
36
+ filters: [],
37
+ baseFilters: [],
38
+ datasource: null,
39
+ applyMode: "same-datasource"
40
+ }, initialState));
41
+ this._urlSync = new AdHocFiltersVariableUrlSyncHandler(this);
42
+ this._scopedVars = { __sceneObject: { value: this } };
43
+ this._dataSourceSrv = getDataSourceSrv();
44
+ if (this.state.applyMode === "same-datasource") {
45
+ patchGetAdhocFilters(this);
46
+ }
47
+ }
48
+ _updateFilter(filter, prop, value) {
49
+ if (value == null) {
50
+ return;
51
+ }
52
+ const { filters, _wip } = this.state;
53
+ if (filter === _wip) {
54
+ if (prop === "value") {
55
+ this.setState({ filters: [...filters, __spreadProps(__spreadValues({}, _wip), { [prop]: value })], _wip: void 0 });
56
+ this._runSceneQueries();
57
+ } else {
58
+ this.setState({ _wip: __spreadProps(__spreadValues({}, filter), { [prop]: value }) });
59
+ }
60
+ return;
61
+ }
62
+ const updatedFilters = this.state.filters.map((f) => {
63
+ if (f === filter) {
64
+ return __spreadProps(__spreadValues({}, f), { [prop]: value });
65
+ }
66
+ return f;
67
+ });
68
+ this.updateFilters(updatedFilters);
69
+ }
70
+ _removeFilter(filter) {
71
+ if (filter === this.state._wip) {
72
+ this.setState({ _wip: void 0 });
73
+ return;
74
+ }
75
+ this.updateFilters(this.state.filters.filter((f) => f !== filter));
76
+ }
77
+ updateFilters(filters) {
78
+ this.setState({ filters });
79
+ this._runSceneQueries();
80
+ }
81
+ async _getKeys(currentKey) {
82
+ var _a, _b;
83
+ const override = await ((_b = (_a = this.state).getTagKeysProvider) == null ? void 0 : _b.call(_a, this, currentKey));
84
+ if (override && override.replace) {
85
+ return override.values.map(toSelectableValue);
86
+ }
87
+ const ds = await this._dataSourceSrv.get(this.state.datasource, this._scopedVars);
88
+ if (!ds || !ds.getTagKeys) {
89
+ return [];
90
+ }
91
+ const otherFilters = this.state.filters.filter((f) => f.key !== currentKey).concat(this.state.baseFilters);
92
+ let keys = await ds.getTagKeys({ filters: otherFilters });
93
+ if (override) {
94
+ keys = keys.concat(override.values);
95
+ }
96
+ return keys.map(toSelectableValue);
97
+ }
98
+ async _getValuesFor(filter) {
99
+ var _a, _b;
100
+ const override = await ((_b = (_a = this.state).getTagValuesProvider) == null ? void 0 : _b.call(_a, this, filter));
101
+ if (override && override.replace) {
102
+ return override.values.map(toSelectableValue);
103
+ }
104
+ const ds = await this._dataSourceSrv.get(this.state.datasource, this._scopedVars);
105
+ if (!ds || !ds.getTagValues) {
106
+ return [];
107
+ }
108
+ const otherFilters = this.state.filters.filter((f) => f.key !== filter.key).concat(this.state.baseFilters);
109
+ let values = await ds.getTagValues({ key: filter.key, filters: otherFilters });
110
+ if (override) {
111
+ values = values.concat(override.values);
112
+ }
113
+ return values.map(toSelectableValue);
114
+ }
115
+ _addWip() {
116
+ this.setState({ _wip: { key: "", value: "", operator: "=", condition: "" } });
117
+ }
118
+ _getOperators() {
119
+ return ["=", "!=", "<", ">", "=~", "!~"].map((value) => ({
120
+ label: value,
121
+ value
122
+ }));
123
+ }
124
+ _runSceneQueries() {
125
+ if (this.state.applyMode === "manual") {
126
+ return;
127
+ }
128
+ const startingPoint = this.parent;
129
+ if (!startingPoint) {
130
+ console.error("AdHocFiltersVariable could not find a parent scene to broadcast changes to");
131
+ return;
132
+ }
133
+ const ourDS = this._dataSourceSrv.getInstanceSettings(this.state.datasource, this._scopedVars);
134
+ if (!ourDS) {
135
+ console.error("AdHocFiltersVariable ds not found", this.state.datasource);
136
+ return;
137
+ }
138
+ const triggerQueriesRecursive = (startingPoint2) => {
139
+ if (startingPoint2 instanceof SceneQueryRunner && this._isSameDS(ourDS, startingPoint2.state.datasource)) {
140
+ startingPoint2.runQueries();
141
+ } else {
142
+ startingPoint2.forEachChild(triggerQueriesRecursive);
143
+ }
144
+ };
145
+ triggerQueriesRecursive(startingPoint);
146
+ }
147
+ _isSameDS(ourDS, queryRunnerDS) {
148
+ var _a;
149
+ if (this.state.datasource === queryRunnerDS) {
150
+ return true;
151
+ }
152
+ if (((_a = this.state.datasource) == null ? void 0 : _a.uid) === (queryRunnerDS == null ? void 0 : queryRunnerDS.uid)) {
153
+ return true;
154
+ }
155
+ const resolved = this._dataSourceSrv.getInstanceSettings(queryRunnerDS, this._scopedVars);
156
+ return (ourDS == null ? void 0 : ourDS.uid) === (resolved == null ? void 0 : resolved.uid);
157
+ }
158
+ }
159
+ AdHocFilterSet.Component = AdHocFiltersSetRenderer;
160
+ function AdHocFiltersSetRenderer({ model }) {
161
+ const { filters, readOnly } = model.useState();
162
+ const styles = useStyles2(getStyles);
163
+ return /* @__PURE__ */ React.createElement("div", {
164
+ className: styles.wrapper
165
+ }, /* @__PURE__ */ React.createElement(ControlsLabel, {
166
+ label: "Filters",
167
+ icon: "filter"
168
+ }), filters.map((filter, index) => /* @__PURE__ */ React.createElement(React.Fragment, {
169
+ key: index
170
+ }, /* @__PURE__ */ React.createElement(AdHocFilterRenderer, {
171
+ filter,
172
+ model
173
+ }))), !readOnly && /* @__PURE__ */ React.createElement(AdHocFilterBuilder, {
174
+ model,
175
+ key: "'builder"
176
+ }));
177
+ }
178
+ const getStyles = (theme) => ({
179
+ wrapper: css({
180
+ display: "flex",
181
+ gap: theme.spacing(1),
182
+ alignItems: "center"
183
+ }),
184
+ filterIcon: css({
185
+ color: theme.colors.text.secondary,
186
+ paddingRight: theme.spacing(0.5)
187
+ })
188
+ });
189
+ function toSelectableValue({ text, value }) {
190
+ return {
191
+ label: text,
192
+ value: String(value != null ? value : text)
193
+ };
194
+ }
195
+
196
+ export { AdHocFilterSet, AdHocFiltersSetRenderer };
197
+ //# sourceMappingURL=AdHocFiltersSet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdHocFiltersSet.js","sources":["../../../../src/variables/adhoc/AdHocFiltersSet.tsx"],"sourcesContent":["import { SceneObjectBase } from '../../core/SceneObjectBase';\nimport {\n AdHocVariableFilter,\n DataSourceInstanceSettings,\n GrafanaTheme2,\n MetricFindValue,\n SelectableValue,\n} from '@grafana/data';\nimport { patchGetAdhocFilters } from './patchGetAdhocFilters';\nimport { DataSourceRef } from '@grafana/schema';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { SceneQueryRunner } from '../../querying/SceneQueryRunner';\nimport { SceneComponentProps, SceneObject, SceneObjectState, SceneObjectUrlSyncHandler } from '../../core/types';\nimport { AdHocFiltersVariableUrlSyncHandler } from './AdHocFiltersVariableUrlSyncHandler';\nimport { useStyles2 } from '@grafana/ui';\nimport React from 'react';\nimport { ControlsLabel } from '../../utils/ControlsLabel';\nimport { AdHocFilterRenderer } from './AdHocFilterRenderer';\nimport { AdHocFilterBuilder } from './AdHocFilterBuilder';\nimport { css } from '@emotion/css';\n\nexport interface AdHocFilterSetState extends SceneObjectState {\n /** Defaults to Filters */\n name?: string;\n /** The visible filters */\n filters: AdHocVariableFilter[];\n /** Base filters to always apply when looking up keys*/\n baseFilters?: AdHocVariableFilter[];\n /** Datasource to use for getTagKeys and getTagValues and also controls which scene queries the filters should apply to */\n datasource: DataSourceRef | null;\n /** Controls if the filters can be changed */\n readOnly?: boolean;\n /**\n * Defaults to same-datasource which means filters will automatically be applied to all queries with the same data source as this AdHocFilterSet.\n * In manual mode no queries are re-run on changes, and you have to manually apply the filter to whatever queries you want.\n */\n applyMode?: 'same-datasource' | 'manual';\n /**\n * Extension hook for customizing the key lookup.\n * Return replace: true if you want to override the default lookup\n * Return replace: false if you want to combine the results with the default lookup\n */\n getTagKeysProvider?: getTagKeysProvider;\n /**\n * Extension hook for customizing the value lookup.\n * Return replace: true if you want to override the default lookup.\n * Return replace: false if you want to combine the results with the default lookup\n */\n getTagValuesProvider?: getTagValuesProvider;\n\n /**\n * @internal state of the new filter being added\n */\n _wip?: AdHocVariableFilter;\n}\n\nexport type getTagKeysProvider = (\n set: AdHocFilterSet,\n currentKey: string | null\n) => Promise<{ replace?: boolean; values: MetricFindValue[] }>;\n\nexport type getTagValuesProvider = (\n set: AdHocFilterSet,\n filter: AdHocVariableFilter\n) => Promise<{ replace?: boolean; values: MetricFindValue[] }>;\n\nexport class AdHocFilterSet extends SceneObjectBase<AdHocFilterSetState> {\n static Component = AdHocFiltersSetRenderer;\n\n protected _urlSync: SceneObjectUrlSyncHandler = new AdHocFiltersVariableUrlSyncHandler(this);\n\n private _scopedVars = { __sceneObject: { value: this } };\n private _dataSourceSrv = getDataSourceSrv();\n\n public constructor(initialState: Partial<AdHocFilterSetState>) {\n super({\n name: 'Filters',\n filters: [],\n baseFilters: [],\n datasource: null,\n applyMode: 'same-datasource',\n ...initialState,\n });\n\n if (this.state.applyMode === 'same-datasource') {\n patchGetAdhocFilters(this);\n }\n }\n\n public _updateFilter(filter: AdHocVariableFilter, prop: keyof AdHocVariableFilter, value: string | undefined | null) {\n if (value == null) {\n return;\n }\n\n const { filters, _wip } = this.state;\n\n if (filter === _wip) {\n // If we set value we are done with this \"work in progress\" filter and we can add it\n if (prop === 'value') {\n this.setState({ filters: [...filters, { ..._wip, [prop]: value }], _wip: undefined });\n this._runSceneQueries();\n } else {\n this.setState({ _wip: { ...filter, [prop]: value } });\n }\n return;\n }\n\n const updatedFilters = this.state.filters.map((f) => {\n if (f === filter) {\n return { ...f, [prop]: value };\n }\n return f;\n });\n\n this.updateFilters(updatedFilters);\n }\n\n public _removeFilter(filter: AdHocVariableFilter) {\n if (filter === this.state._wip) {\n this.setState({ _wip: undefined });\n return;\n }\n\n this.updateFilters(this.state.filters.filter((f) => f !== filter));\n }\n\n public updateFilters(filters: AdHocVariableFilter[]) {\n this.setState({ filters });\n this._runSceneQueries();\n }\n\n /**\n * Get possible keys given current filters. Do not call from plugins directly\n */\n public async _getKeys(currentKey: string | null): Promise<Array<SelectableValue<string>>> {\n const override = await this.state.getTagKeysProvider?.(this, currentKey);\n\n if (override && override.replace) {\n return override.values.map(toSelectableValue);\n }\n\n const ds = await this._dataSourceSrv.get(this.state.datasource, this._scopedVars);\n if (!ds || !ds.getTagKeys) {\n return [];\n }\n\n const otherFilters = this.state.filters.filter((f) => f.key !== currentKey).concat(this.state.baseFilters!);\n let keys = await ds.getTagKeys({ filters: otherFilters });\n\n if (override) {\n keys = keys.concat(override.values);\n }\n\n return keys.map(toSelectableValue);\n }\n\n /**\n * Get possible key values for a specific key given current filters. Do not call from plugins directly\n */\n public async _getValuesFor(filter: AdHocVariableFilter): Promise<Array<SelectableValue<string>>> {\n const override = await this.state.getTagValuesProvider?.(this, filter);\n\n if (override && override.replace) {\n return override.values.map(toSelectableValue);\n }\n\n const ds = await this._dataSourceSrv.get(this.state.datasource, this._scopedVars);\n\n if (!ds || !ds.getTagValues) {\n return [];\n }\n\n // Filter out the current filter key from the list of all filters\n const otherFilters = this.state.filters.filter((f) => f.key !== filter.key).concat(this.state.baseFilters!);\n let values = await ds.getTagValues({ key: filter.key, filters: otherFilters });\n\n if (override) {\n values = values.concat(override.values);\n }\n\n return values.map(toSelectableValue);\n }\n\n public _addWip() {\n this.setState({ _wip: { key: '', value: '', operator: '=', condition: '' } });\n }\n\n public _getOperators() {\n return ['=', '!=', '<', '>', '=~', '!~'].map<SelectableValue<string>>((value) => ({\n label: value,\n value,\n }));\n }\n\n private _runSceneQueries() {\n // In manual mode we do not trigger any queries\n if (this.state.applyMode === 'manual') {\n return;\n }\n\n const startingPoint = this.parent;\n if (!startingPoint) {\n console.error('AdHocFiltersVariable could not find a parent scene to broadcast changes to');\n return;\n }\n\n const ourDS = this._dataSourceSrv.getInstanceSettings(this.state.datasource, this._scopedVars);\n if (!ourDS) {\n console.error('AdHocFiltersVariable ds not found', this.state.datasource);\n return;\n }\n\n const triggerQueriesRecursive = (startingPoint: SceneObject) => {\n if (startingPoint instanceof SceneQueryRunner && this._isSameDS(ourDS, startingPoint.state.datasource)) {\n startingPoint.runQueries();\n } else {\n startingPoint.forEachChild(triggerQueriesRecursive);\n }\n };\n\n triggerQueriesRecursive(startingPoint);\n }\n\n private _isSameDS(ourDS: DataSourceInstanceSettings, queryRunnerDS: DataSourceRef | null | undefined) {\n // This function does some initial checks to try to avoid haing to call _dataSourceSrv.getInstanceSettings\n // Which is only needed when queryRunner is using data source variable but the adhoc filter is not\n\n if (this.state.datasource === queryRunnerDS) {\n return true;\n }\n\n // This works when both are using a variable as well\n if (this.state.datasource?.uid === queryRunnerDS?.uid) {\n return true;\n }\n\n // Finally the fool proof check that works when either we or the query runner is using a variable ds\n const resolved = this._dataSourceSrv.getInstanceSettings(queryRunnerDS, this._scopedVars);\n return ourDS?.uid === resolved?.uid;\n }\n}\n\nexport function AdHocFiltersSetRenderer({ model }: SceneComponentProps<AdHocFilterSet>) {\n const { filters, readOnly } = model.useState();\n const styles = useStyles2(getStyles);\n\n return (\n <div className={styles.wrapper}>\n <ControlsLabel label=\"Filters\" icon=\"filter\" />\n\n {filters.map((filter, index) => (\n <React.Fragment key={index}>\n <AdHocFilterRenderer filter={filter} model={model} />\n </React.Fragment>\n ))}\n\n {!readOnly && <AdHocFilterBuilder model={model} key=\"'builder\" />}\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css({\n display: 'flex',\n gap: theme.spacing(1),\n alignItems: 'center',\n }),\n filterIcon: css({\n color: theme.colors.text.secondary,\n paddingRight: theme.spacing(0.5),\n }),\n});\n\nfunction toSelectableValue({ text, value }: MetricFindValue): SelectableValue<string> {\n return {\n label: text,\n value: String(value ?? text),\n };\n}\n"],"names":["startingPoint"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkEO,MAAM,uBAAuB,eAAqC,CAAA;AAAA,EAQhE,YAAY,YAA4C,EAAA;AAC7D,IAAM,KAAA,CAAA,cAAA,CAAA;AAAA,MACJ,IAAM,EAAA,SAAA;AAAA,MACN,SAAS,EAAC;AAAA,MACV,aAAa,EAAC;AAAA,MACd,UAAY,EAAA,IAAA;AAAA,MACZ,SAAW,EAAA,iBAAA;AAAA,KAAA,EACR,YACJ,CAAA,CAAA,CAAA;AAbH,IAAU,IAAA,CAAA,QAAA,GAAsC,IAAI,kCAAA,CAAmC,IAAI,CAAA,CAAA;AAE3F,IAAA,IAAA,CAAQ,cAAc,EAAE,aAAA,EAAe,EAAE,KAAA,EAAO,MAAO,EAAA,CAAA;AACvD,IAAA,IAAA,CAAQ,iBAAiB,gBAAiB,EAAA,CAAA;AAYxC,IAAI,IAAA,IAAA,CAAK,KAAM,CAAA,SAAA,KAAc,iBAAmB,EAAA;AAC9C,MAAA,oBAAA,CAAqB,IAAI,CAAA,CAAA;AAAA,KAC3B;AAAA,GACF;AAAA,EAEO,aAAA,CAAc,MAA6B,EAAA,IAAA,EAAiC,KAAkC,EAAA;AACnH,IAAA,IAAI,SAAS,IAAM,EAAA;AACjB,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,MAAM,EAAE,OAAA,EAAS,IAAK,EAAA,GAAI,IAAK,CAAA,KAAA,CAAA;AAE/B,IAAA,IAAI,WAAW,IAAM,EAAA;AAEnB,MAAA,IAAI,SAAS,OAAS,EAAA;AACpB,QAAA,IAAA,CAAK,SAAS,EAAE,OAAA,EAAS,CAAC,GAAG,SAAS,aAAK,CAAA,cAAA,CAAA,EAAA,EAAA,IAAA,CAAA,EAAL,EAAW,CAAC,OAAO,KAAM,EAAA,CAAC,CAAG,EAAA,IAAA,EAAM,QAAW,CAAA,CAAA;AACpF,QAAA,IAAA,CAAK,gBAAiB,EAAA,CAAA;AAAA,OACjB,MAAA;AACL,QAAK,IAAA,CAAA,QAAA,CAAS,EAAE,IAAA,EAAM,aAAK,CAAA,cAAA,CAAA,EAAA,EAAA,MAAA,CAAA,EAAL,EAAa,CAAC,IAAA,GAAO,KAAM,EAAA,CAAA,EAAG,CAAA,CAAA;AAAA,OACtD;AACA,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,MAAM,iBAAiB,IAAK,CAAA,KAAA,CAAM,OAAQ,CAAA,GAAA,CAAI,CAAC,CAAM,KAAA;AACnD,MAAA,IAAI,MAAM,MAAQ,EAAA;AAChB,QAAA,OAAO,aAAK,CAAA,cAAA,CAAA,EAAA,EAAA,CAAA,CAAA,EAAL,EAAQ,CAAC,OAAO,KAAM,EAAA,CAAA,CAAA;AAAA,OAC/B;AACA,MAAO,OAAA,CAAA,CAAA;AAAA,KACR,CAAA,CAAA;AAED,IAAA,IAAA,CAAK,cAAc,cAAc,CAAA,CAAA;AAAA,GACnC;AAAA,EAEO,cAAc,MAA6B,EAAA;AAChD,IAAI,IAAA,MAAA,KAAW,IAAK,CAAA,KAAA,CAAM,IAAM,EAAA;AAC9B,MAAA,IAAA,CAAK,QAAS,CAAA,EAAE,IAAM,EAAA,KAAA,CAAA,EAAW,CAAA,CAAA;AACjC,MAAA,OAAA;AAAA,KACF;AAEA,IAAK,IAAA,CAAA,aAAA,CAAc,KAAK,KAAM,CAAA,OAAA,CAAQ,OAAO,CAAC,CAAA,KAAM,CAAM,KAAA,MAAM,CAAC,CAAA,CAAA;AAAA,GACnE;AAAA,EAEO,cAAc,OAAgC,EAAA;AACnD,IAAK,IAAA,CAAA,QAAA,CAAS,EAAE,OAAA,EAAS,CAAA,CAAA;AACzB,IAAA,IAAA,CAAK,gBAAiB,EAAA,CAAA;AAAA,GACxB;AAAA,EAKA,MAAa,SAAS,UAAoE,EAAA;AAtI5F,IAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AAuII,IAAA,MAAM,WAAW,OAAM,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,IAAA,CAAK,KAAM,EAAA,kBAAA,KAAX,4BAAgC,IAAM,EAAA,UAAA,CAAA,CAAA,CAAA;AAE7D,IAAI,IAAA,QAAA,IAAY,SAAS,OAAS,EAAA;AAChC,MAAO,OAAA,QAAA,CAAS,MAAO,CAAA,GAAA,CAAI,iBAAiB,CAAA,CAAA;AAAA,KAC9C;AAEA,IAAM,MAAA,EAAA,GAAK,MAAM,IAAK,CAAA,cAAA,CAAe,IAAI,IAAK,CAAA,KAAA,CAAM,UAAY,EAAA,IAAA,CAAK,WAAW,CAAA,CAAA;AAChF,IAAA,IAAI,CAAC,EAAA,IAAM,CAAC,EAAA,CAAG,UAAY,EAAA;AACzB,MAAA,OAAO,EAAC,CAAA;AAAA,KACV;AAEA,IAAA,MAAM,YAAe,GAAA,IAAA,CAAK,KAAM,CAAA,OAAA,CAAQ,OAAO,CAAC,CAAA,KAAM,CAAE,CAAA,GAAA,KAAQ,UAAU,CAAA,CAAE,MAAO,CAAA,IAAA,CAAK,MAAM,WAAY,CAAA,CAAA;AAC1G,IAAA,IAAI,OAAO,MAAM,EAAA,CAAG,WAAW,EAAE,OAAA,EAAS,cAAc,CAAA,CAAA;AAExD,IAAA,IAAI,QAAU,EAAA;AACZ,MAAO,IAAA,GAAA,IAAA,CAAK,MAAO,CAAA,QAAA,CAAS,MAAM,CAAA,CAAA;AAAA,KACpC;AAEA,IAAO,OAAA,IAAA,CAAK,IAAI,iBAAiB,CAAA,CAAA;AAAA,GACnC;AAAA,EAKA,MAAa,cAAc,MAAsE,EAAA;AA/JnG,IAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AAgKI,IAAA,MAAM,WAAW,OAAM,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,IAAA,CAAK,KAAM,EAAA,oBAAA,KAAX,4BAAkC,IAAM,EAAA,MAAA,CAAA,CAAA,CAAA;AAE/D,IAAI,IAAA,QAAA,IAAY,SAAS,OAAS,EAAA;AAChC,MAAO,OAAA,QAAA,CAAS,MAAO,CAAA,GAAA,CAAI,iBAAiB,CAAA,CAAA;AAAA,KAC9C;AAEA,IAAM,MAAA,EAAA,GAAK,MAAM,IAAK,CAAA,cAAA,CAAe,IAAI,IAAK,CAAA,KAAA,CAAM,UAAY,EAAA,IAAA,CAAK,WAAW,CAAA,CAAA;AAEhF,IAAA,IAAI,CAAC,EAAA,IAAM,CAAC,EAAA,CAAG,YAAc,EAAA;AAC3B,MAAA,OAAO,EAAC,CAAA;AAAA,KACV;AAGA,IAAA,MAAM,YAAe,GAAA,IAAA,CAAK,KAAM,CAAA,OAAA,CAAQ,OAAO,CAAC,CAAA,KAAM,CAAE,CAAA,GAAA,KAAQ,OAAO,GAAG,CAAA,CAAE,MAAO,CAAA,IAAA,CAAK,MAAM,WAAY,CAAA,CAAA;AAC1G,IAAI,IAAA,MAAA,GAAS,MAAM,EAAA,CAAG,YAAa,CAAA,EAAE,KAAK,MAAO,CAAA,GAAA,EAAK,OAAS,EAAA,YAAA,EAAc,CAAA,CAAA;AAE7E,IAAA,IAAI,QAAU,EAAA;AACZ,MAAS,MAAA,GAAA,MAAA,CAAO,MAAO,CAAA,QAAA,CAAS,MAAM,CAAA,CAAA;AAAA,KACxC;AAEA,IAAO,OAAA,MAAA,CAAO,IAAI,iBAAiB,CAAA,CAAA;AAAA,GACrC;AAAA,EAEO,OAAU,GAAA;AACf,IAAA,IAAA,CAAK,QAAS,CAAA,EAAE,IAAM,EAAA,EAAE,GAAK,EAAA,EAAA,EAAI,KAAO,EAAA,EAAA,EAAI,QAAU,EAAA,GAAA,EAAK,SAAW,EAAA,EAAA,IAAM,CAAA,CAAA;AAAA,GAC9E;AAAA,EAEO,aAAgB,GAAA;AACrB,IAAO,OAAA,CAAC,GAAK,EAAA,IAAA,EAAM,GAAK,EAAA,GAAA,EAAK,MAAM,IAAI,CAAA,CAAE,GAA6B,CAAA,CAAC,KAAW,MAAA;AAAA,MAChF,KAAO,EAAA,KAAA;AAAA,MACP,KAAA;AAAA,KACA,CAAA,CAAA,CAAA;AAAA,GACJ;AAAA,EAEQ,gBAAmB,GAAA;AAEzB,IAAI,IAAA,IAAA,CAAK,KAAM,CAAA,SAAA,KAAc,QAAU,EAAA;AACrC,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,MAAM,gBAAgB,IAAK,CAAA,MAAA,CAAA;AAC3B,IAAA,IAAI,CAAC,aAAe,EAAA;AAClB,MAAA,OAAA,CAAQ,MAAM,4EAA4E,CAAA,CAAA;AAC1F,MAAA,OAAA;AAAA,KACF;AAEA,IAAM,MAAA,KAAA,GAAQ,KAAK,cAAe,CAAA,mBAAA,CAAoB,KAAK,KAAM,CAAA,UAAA,EAAY,KAAK,WAAW,CAAA,CAAA;AAC7F,IAAA,IAAI,CAAC,KAAO,EAAA;AACV,MAAA,OAAA,CAAQ,KAAM,CAAA,mCAAA,EAAqC,IAAK,CAAA,KAAA,CAAM,UAAU,CAAA,CAAA;AACxE,MAAA,OAAA;AAAA,KACF;AAEA,IAAM,MAAA,uBAAA,GAA0B,CAACA,cAA+B,KAAA;AAC9D,MAAIA,IAAAA,cAAAA,YAAyB,oBAAoB,IAAK,CAAA,SAAA,CAAU,OAAOA,cAAc,CAAA,KAAA,CAAM,UAAU,CAAG,EAAA;AACtG,QAAAA,eAAc,UAAW,EAAA,CAAA;AAAA,OACpB,MAAA;AACL,QAAAA,cAAAA,CAAc,aAAa,uBAAuB,CAAA,CAAA;AAAA,OACpD;AAAA,KACF,CAAA;AAEA,IAAA,uBAAA,CAAwB,aAAa,CAAA,CAAA;AAAA,GACvC;AAAA,EAEQ,SAAA,CAAU,OAAmC,aAAiD,EAAA;AA/NxG,IAAA,IAAA,EAAA,CAAA;AAmOI,IAAI,IAAA,IAAA,CAAK,KAAM,CAAA,UAAA,KAAe,aAAe,EAAA;AAC3C,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAGA,IAAA,IAAA,CAAA,CAAI,UAAK,KAAM,CAAA,UAAA,KAAX,IAAuB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,GAAA,OAAQ,+CAAe,GAAK,CAAA,EAAA;AACrD,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAGA,IAAA,MAAM,WAAW,IAAK,CAAA,cAAA,CAAe,mBAAoB,CAAA,aAAA,EAAe,KAAK,WAAW,CAAA,CAAA;AACxF,IAAO,OAAA,CAAA,KAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,KAAA,CAAO,UAAQ,QAAU,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,QAAA,CAAA,GAAA,CAAA,CAAA;AAAA,GAClC;AACF,CAAA;AA9Ka,cAAA,CACJ,SAAY,GAAA,uBAAA,CAAA;AA+KL,SAAA,uBAAA,CAAwB,EAAE,KAAA,EAA8C,EAAA;AACtF,EAAA,MAAM,EAAE,OAAA,EAAS,QAAS,EAAA,GAAI,MAAM,QAAS,EAAA,CAAA;AAC7C,EAAM,MAAA,MAAA,GAAS,WAAW,SAAS,CAAA,CAAA;AAEnC,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA;AAAA,IAAI,WAAW,MAAO,CAAA,OAAA;AAAA,GAAA,kBACpB,KAAA,CAAA,aAAA,CAAA,aAAA,EAAA;AAAA,IAAc,KAAM,EAAA,SAAA;AAAA,IAAU,IAAK,EAAA,QAAA;AAAA,GAAS,CAAA,EAE5C,QAAQ,GAAI,CAAA,CAAC,QAAQ,KACpB,qBAAA,KAAA,CAAA,aAAA,CAAC,MAAM,QAAN,EAAA;AAAA,IAAe,GAAK,EAAA,KAAA;AAAA,GAAA,kBAClB,KAAA,CAAA,aAAA,CAAA,mBAAA,EAAA;AAAA,IAAoB,MAAA;AAAA,IAAgB,KAAA;AAAA,GAAc,CACrD,CACD,CAEA,EAAA,CAAC,4BAAa,KAAA,CAAA,aAAA,CAAA,kBAAA,EAAA;AAAA,IAAmB,KAAA;AAAA,IAAc,GAAI,EAAA,UAAA;AAAA,GAAW,CACjE,CAAA,CAAA;AAEJ,CAAA;AAEA,MAAM,SAAA,GAAY,CAAC,KAA0B,MAAA;AAAA,EAC3C,SAAS,GAAI,CAAA;AAAA,IACX,OAAS,EAAA,MAAA;AAAA,IACT,GAAA,EAAK,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,IACpB,UAAY,EAAA,QAAA;AAAA,GACb,CAAA;AAAA,EACD,YAAY,GAAI,CAAA;AAAA,IACd,KAAA,EAAO,KAAM,CAAA,MAAA,CAAO,IAAK,CAAA,SAAA;AAAA,IACzB,YAAA,EAAc,KAAM,CAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,GAChC,CAAA;AACH,CAAA,CAAA,CAAA;AAEA,SAAS,iBAAkB,CAAA,EAAE,IAAM,EAAA,KAAA,EAAmD,EAAA;AACpF,EAAO,OAAA;AAAA,IACL,KAAO,EAAA,IAAA;AAAA,IACP,KAAA,EAAO,MAAO,CAAA,KAAA,IAAA,IAAA,GAAA,KAAA,GAAS,IAAI,CAAA;AAAA,GAC7B,CAAA;AACF;;;;"}
@@ -0,0 +1,90 @@
1
+ import React from 'react';
2
+ import { SceneObjectBase } from '../../core/SceneObjectBase.js';
3
+ import { SceneVariableValueChangedEvent } from '../types.js';
4
+ import { AdHocFilterSet } from './AdHocFiltersSet.js';
5
+ import { VariableHide } from '@grafana/schema';
6
+
7
+ var __defProp = Object.defineProperty;
8
+ var __defProps = Object.defineProperties;
9
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
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
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
26
+ const _AdHocFiltersVariable = class extends SceneObjectBase {
27
+ static create(state) {
28
+ var _a;
29
+ return new _AdHocFiltersVariable({
30
+ type: "adhoc",
31
+ hide: VariableHide.hideLabel,
32
+ name: (_a = state.name) != null ? _a : "Filters",
33
+ set: new AdHocFilterSet(__spreadProps(__spreadValues({}, state), {
34
+ applyMode: "manual"
35
+ }))
36
+ });
37
+ }
38
+ constructor(state) {
39
+ super(state);
40
+ this.addActivationHandler(() => {
41
+ this._subs.add(
42
+ this.state.set.subscribeToState((newState, prevState) => {
43
+ if (newState.filters !== prevState.filters) {
44
+ this._filtersChanged(newState.filters);
45
+ }
46
+ })
47
+ );
48
+ this._filtersChanged(this.state.set.state.filters);
49
+ });
50
+ }
51
+ getValue() {
52
+ return this.state.filterExpression;
53
+ }
54
+ _filtersChanged(filters) {
55
+ let expr = "";
56
+ for (const filter of filters) {
57
+ expr += `${this._renderFilter(filter)},`;
58
+ }
59
+ this.setState({ filterExpression: expr });
60
+ this.publishEvent(new SceneVariableValueChangedEvent(this), true);
61
+ }
62
+ _renderFilter(filter) {
63
+ let value = "";
64
+ if (filter.operator === "=~" || filter.operator === "!~\xA8") {
65
+ value = escapeLabelValueInRegexSelector(filter.value);
66
+ } else {
67
+ value = escapeLabelValueInExactSelector(filter.value);
68
+ }
69
+ return `${filter.key}${filter.operator}"${value}"`;
70
+ }
71
+ };
72
+ let AdHocFiltersVariable = _AdHocFiltersVariable;
73
+ AdHocFiltersVariable.Component = ({ model }) => {
74
+ return /* @__PURE__ */ React.createElement(AdHocFilterSet.Component, {
75
+ model: model.state.set
76
+ });
77
+ };
78
+ function escapeLabelValueInExactSelector(labelValue) {
79
+ return labelValue.replace(/\\/g, "\\\\").replace(/\n/g, "\\n").replace(/"/g, '\\"');
80
+ }
81
+ function escapeLabelValueInRegexSelector(labelValue) {
82
+ return escapeLabelValueInExactSelector(escapeLokiRegexp(labelValue));
83
+ }
84
+ const RE2_METACHARACTERS = /[*+?()|\\.\[\]{}^$]/g;
85
+ function escapeLokiRegexp(value) {
86
+ return value.replace(RE2_METACHARACTERS, "\\$&");
87
+ }
88
+
89
+ export { AdHocFiltersVariable, escapeLabelValueInExactSelector, escapeLabelValueInRegexSelector };
90
+ //# sourceMappingURL=AdHocFiltersVariable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdHocFiltersVariable.js","sources":["../../../../src/variables/adhoc/AdHocFiltersVariable.tsx"],"sourcesContent":["import React from 'react';\nimport { AdHocVariableFilter } from '@grafana/data';\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { SceneVariable, SceneVariableState, SceneVariableValueChangedEvent } from '../types';\nimport { AdHocFilterSet, AdHocFilterSetState } from './AdHocFiltersSet';\nimport { SceneComponentProps } from '../../core/types';\nimport { VariableHide } from '@grafana/schema';\n\nexport interface AdHocFiltersVariableState extends SceneVariableState {\n /**\n * Important that you set applyFiltersTo: 'manual' when you create the set.\n */\n set: AdHocFilterSet;\n /**\n * This is the expression that the filters resulted in. Defaults to\n * Prometheus / Loki compatible label fitler expression\n */\n filterExpression?: string;\n}\n\nexport type AdHocFiltersVariableCreateHelperArgs = Pick<\n AdHocFilterSetState,\n 'name' | 'filters' | 'baseFilters' | 'datasource' | 'getTagKeysProvider' | 'getTagValuesProvider'\n>;\n\nexport class AdHocFiltersVariable\n extends SceneObjectBase<AdHocFiltersVariableState>\n implements SceneVariable<AdHocFiltersVariableState>\n{\n /** Helper factory function that makes sure AdHocFilterSet is created correctly */\n public static create(state: AdHocFiltersVariableCreateHelperArgs): AdHocFiltersVariable {\n return new AdHocFiltersVariable({\n type: 'adhoc',\n hide: VariableHide.hideLabel,\n name: state.name ?? 'Filters',\n set: new AdHocFilterSet({\n ...state,\n // Main reason for this helper factory functyion\n applyMode: 'manual',\n }),\n });\n }\n\n public constructor(state: AdHocFiltersVariableState) {\n super(state);\n\n // Subscribe to filter changes and up the variable value (filterExpression)\n this.addActivationHandler(() => {\n this._subs.add(\n this.state.set.subscribeToState((newState, prevState) => {\n if (newState.filters !== prevState.filters) {\n this._filtersChanged(newState.filters);\n }\n })\n );\n this._filtersChanged(this.state.set.state.filters);\n });\n }\n\n public getValue() {\n return this.state.filterExpression;\n }\n\n private _filtersChanged(filters: AdHocVariableFilter[]) {\n let expr = '';\n\n for (const filter of filters) {\n expr += `${this._renderFilter(filter)},`;\n }\n\n this.setState({ filterExpression: expr });\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n }\n\n private _renderFilter(filter: AdHocVariableFilter) {\n let value = '';\n\n if (filter.operator === '=~' || filter.operator === '!~¨') {\n value = escapeLabelValueInRegexSelector(filter.value);\n } else {\n value = escapeLabelValueInExactSelector(filter.value);\n }\n\n return `${filter.key}${filter.operator}\"${value}\"`;\n }\n\n // Same UI as the standalone AdHocFilterSet\n public static Component = ({ model }: SceneComponentProps<AdHocFiltersVariable>) => {\n return <AdHocFilterSet.Component model={model.state.set} />;\n };\n}\n\n// based on the openmetrics-documentation, the 3 symbols we have to handle are:\n// - \\n ... the newline character\n// - \\ ... the backslash character\n// - \" ... the double-quote character\nexport function escapeLabelValueInExactSelector(labelValue: string): string {\n return labelValue.replace(/\\\\/g, '\\\\\\\\').replace(/\\n/g, '\\\\n').replace(/\"/g, '\\\\\"');\n}\n\nexport function escapeLabelValueInRegexSelector(labelValue: string): string {\n return escapeLabelValueInExactSelector(escapeLokiRegexp(labelValue));\n}\n\nexport function isRegexSelector(selector?: string) {\n if (selector && (selector.includes('=~') || selector.includes('!~'))) {\n return true;\n }\n return false;\n}\n\n// Loki regular-expressions use the RE2 syntax (https://github.com/google/re2/wiki/Syntax),\n// so every character that matches something in that list has to be escaped.\n// the list of meta characters is: *+?()|\\.[]{}^$\n// we make a javascript regular expression that matches those characters:\nconst RE2_METACHARACTERS = /[*+?()|\\\\.\\[\\]{}^$]/g;\nfunction escapeLokiRegexp(value: string): string {\n return value.replace(RE2_METACHARACTERS, '\\\\$&');\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ class AdHocFiltersVariableUrlSyncHandler {
2
+ constructor(_variable) {
3
+ this._variable = _variable;
4
+ }
5
+ getKey() {
6
+ return `var-${this._variable.state.name}`;
7
+ }
8
+ getKeys() {
9
+ return [this.getKey()];
10
+ }
11
+ getUrlState() {
12
+ let filters = this._variable.state.filters;
13
+ const value = filters.map((filter) => toArray(filter).map(escapeDelimiter).join("|"));
14
+ return { [this.getKey()]: value };
15
+ }
16
+ updateFromUrl(values) {
17
+ const urlValue = values[this.getKey()];
18
+ if (urlValue == null) {
19
+ return;
20
+ }
21
+ const filters = deserializeUrlToFilters(urlValue);
22
+ this._variable.updateFilters(filters);
23
+ }
24
+ }
25
+ function deserializeUrlToFilters(value) {
26
+ if (Array.isArray(value)) {
27
+ const values = value;
28
+ return values.map(toFilter).filter(isFilter);
29
+ }
30
+ const filter = toFilter(value);
31
+ return filter === null ? [] : [filter];
32
+ }
33
+ function escapeDelimiter(value) {
34
+ if (value === null || value === void 0) {
35
+ return "";
36
+ }
37
+ return /\|/g[Symbol.replace](value, "__gfp__");
38
+ }
39
+ function unescapeDelimiter(value) {
40
+ if (value === null || value === void 0) {
41
+ return "";
42
+ }
43
+ return /__gfp__/g[Symbol.replace](value, "|");
44
+ }
45
+ function toArray(filter) {
46
+ return [filter.key, filter.operator, filter.value];
47
+ }
48
+ function toFilter(value) {
49
+ if (typeof value !== "string" || value.length === 0) {
50
+ return null;
51
+ }
52
+ const parts = value.split("|").map(unescapeDelimiter);
53
+ return {
54
+ key: parts[0],
55
+ operator: parts[1],
56
+ value: parts[2],
57
+ condition: ""
58
+ };
59
+ }
60
+ function isFilter(filter) {
61
+ return filter !== null && typeof filter.key === "string" && typeof filter.value === "string";
62
+ }
63
+
64
+ export { AdHocFiltersVariableUrlSyncHandler };
65
+ //# sourceMappingURL=AdHocFiltersVariableUrlSyncHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdHocFiltersVariableUrlSyncHandler.js","sources":["../../../../src/variables/adhoc/AdHocFiltersVariableUrlSyncHandler.ts"],"sourcesContent":["import { AdHocVariableFilter } from '@grafana/data';\nimport { SceneObjectUrlSyncHandler, SceneObjectUrlValue, SceneObjectUrlValues } from '../../core/types';\nimport { AdHocFilterSet } from './AdHocFiltersSet';\n\nexport class AdHocFiltersVariableUrlSyncHandler implements SceneObjectUrlSyncHandler {\n public constructor(private _variable: AdHocFilterSet) {}\n\n private getKey(): string {\n return `var-${this._variable.state.name}`;\n }\n\n public getKeys(): string[] {\n return [this.getKey()];\n }\n\n public getUrlState(): SceneObjectUrlValues {\n let filters = this._variable.state.filters;\n const value = filters.map((filter) => toArray(filter).map(escapeDelimiter).join('|'));\n return { [this.getKey()]: value };\n }\n\n public updateFromUrl(values: SceneObjectUrlValues): void {\n const urlValue = values[this.getKey()];\n\n if (urlValue == null) {\n return;\n }\n\n const filters = deserializeUrlToFilters(urlValue);\n this._variable.updateFilters(filters);\n }\n}\n\nfunction deserializeUrlToFilters(value: SceneObjectUrlValue): AdHocVariableFilter[] {\n if (Array.isArray(value)) {\n const values = value;\n return values.map(toFilter).filter(isFilter);\n }\n\n const filter = toFilter(value);\n return filter === null ? [] : [filter];\n}\n\nfunction escapeDelimiter(value: string | undefined): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n return /\\|/g[Symbol.replace](value, '__gfp__');\n}\n\nfunction unescapeDelimiter(value: string | undefined): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n return /__gfp__/g[Symbol.replace](value, '|');\n}\n\nfunction toArray(filter: AdHocVariableFilter): string[] {\n return [filter.key, filter.operator, filter.value];\n}\n\nfunction toFilter(value: string | number | boolean | undefined | null): AdHocVariableFilter | null {\n if (typeof value !== 'string' || value.length === 0) {\n return null;\n }\n\n const parts = value.split('|').map(unescapeDelimiter);\n\n return {\n key: parts[0],\n operator: parts[1],\n value: parts[2],\n condition: '',\n };\n}\n\nfunction isFilter(filter: AdHocVariableFilter | null): filter is AdHocVariableFilter {\n return filter !== null && typeof filter.key === 'string' && typeof filter.value === 'string';\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { getTemplateSrv, getDataSourceSrv } from '@grafana/runtime';
2
+
3
+ let originalGetAdhocFilters = void 0;
4
+ let allActiveFilterSets = /* @__PURE__ */ new Set();
5
+ function patchGetAdhocFilters(filterSet) {
6
+ filterSet.addActivationHandler(() => {
7
+ allActiveFilterSets.add(filterSet);
8
+ return () => allActiveFilterSets.delete(filterSet);
9
+ });
10
+ if (originalGetAdhocFilters) {
11
+ return;
12
+ }
13
+ const templateSrv = getTemplateSrv();
14
+ if (!(templateSrv == null ? void 0 : templateSrv.getAdhocFilters)) {
15
+ console.log("Failed to patch getAdhocFilters");
16
+ return;
17
+ }
18
+ originalGetAdhocFilters = templateSrv.getAdhocFilters;
19
+ templateSrv.getAdhocFilters = function getAdhocFiltersScenePatch(dsName) {
20
+ var _a;
21
+ if (allActiveFilterSets.size === 0) {
22
+ return originalGetAdhocFilters.call(templateSrv);
23
+ }
24
+ const ds = getDataSourceSrv().getInstanceSettings(dsName);
25
+ if (!ds) {
26
+ return [];
27
+ }
28
+ for (const filter of allActiveFilterSets.values()) {
29
+ if (((_a = filter.state.datasource) == null ? void 0 : _a.uid) === ds.uid) {
30
+ return filter.state.filters;
31
+ }
32
+ }
33
+ return [];
34
+ }.bind(templateSrv);
35
+ }
36
+
37
+ export { patchGetAdhocFilters };
38
+ //# sourceMappingURL=patchGetAdhocFilters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patchGetAdhocFilters.js","sources":["../../../../src/variables/adhoc/patchGetAdhocFilters.ts"],"sourcesContent":["import { getDataSourceSrv, getTemplateSrv } from '@grafana/runtime';\nimport { AdHocFilterSet } from './AdHocFiltersSet';\nimport { AdHocVariableFilter } from '@grafana/data';\n\nlet originalGetAdhocFilters: any = undefined;\nlet allActiveFilterSets = new Set<AdHocFilterSet>();\n\nexport function patchGetAdhocFilters(filterSet: AdHocFilterSet) {\n filterSet.addActivationHandler(() => {\n allActiveFilterSets.add(filterSet);\n return () => allActiveFilterSets.delete(filterSet);\n });\n\n if (originalGetAdhocFilters) {\n return;\n }\n\n const templateSrv: any = getTemplateSrv();\n if (!templateSrv?.getAdhocFilters) {\n console.log('Failed to patch getAdhocFilters');\n return;\n }\n\n originalGetAdhocFilters = templateSrv.getAdhocFilters;\n\n templateSrv.getAdhocFilters = function getAdhocFiltersScenePatch(dsName: string): AdHocVariableFilter[] {\n if (allActiveFilterSets.size === 0) {\n return originalGetAdhocFilters.call(templateSrv);\n }\n\n const ds = getDataSourceSrv().getInstanceSettings(dsName);\n if (!ds) {\n return [];\n }\n\n for (const filter of allActiveFilterSets.values()) {\n if (filter.state.datasource?.uid === ds.uid) {\n return filter.state.filters;\n }\n }\n\n return [];\n }.bind(templateSrv);\n}\n"],"names":[],"mappings":";;AAIA,IAAI,uBAA+B,GAAA,KAAA,CAAA,CAAA;AACnC,IAAI,mBAAA,uBAA0B,GAAoB,EAAA,CAAA;AAE3C,SAAS,qBAAqB,SAA2B,EAAA;AAC9D,EAAA,SAAA,CAAU,qBAAqB,MAAM;AACnC,IAAA,mBAAA,CAAoB,IAAI,SAAS,CAAA,CAAA;AACjC,IAAO,OAAA,MAAM,mBAAoB,CAAA,MAAA,CAAO,SAAS,CAAA,CAAA;AAAA,GAClD,CAAA,CAAA;AAED,EAAA,IAAI,uBAAyB,EAAA;AAC3B,IAAA,OAAA;AAAA,GACF;AAEA,EAAA,MAAM,cAAmB,cAAe,EAAA,CAAA;AACxC,EAAI,IAAA,EAAC,2CAAa,eAAiB,CAAA,EAAA;AACjC,IAAA,OAAA,CAAQ,IAAI,iCAAiC,CAAA,CAAA;AAC7C,IAAA,OAAA;AAAA,GACF;AAEA,EAAA,uBAAA,GAA0B,WAAY,CAAA,eAAA,CAAA;AAEtC,EAAY,WAAA,CAAA,eAAA,GAAkB,SAAS,yBAAA,CAA0B,MAAuC,EAAA;AAzB1G,IAAA,IAAA,EAAA,CAAA;AA0BI,IAAI,IAAA,mBAAA,CAAoB,SAAS,CAAG,EAAA;AAClC,MAAO,OAAA,uBAAA,CAAwB,KAAK,WAAW,CAAA,CAAA;AAAA,KACjD;AAEA,IAAA,MAAM,EAAK,GAAA,gBAAA,EAAmB,CAAA,mBAAA,CAAoB,MAAM,CAAA,CAAA;AACxD,IAAA,IAAI,CAAC,EAAI,EAAA;AACP,MAAA,OAAO,EAAC,CAAA;AAAA,KACV;AAEA,IAAW,KAAA,MAAA,MAAA,IAAU,mBAAoB,CAAA,MAAA,EAAU,EAAA;AACjD,MAAA,IAAA,CAAA,CAAI,YAAO,KAAM,CAAA,UAAA,KAAb,IAAyB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,GAAA,MAAQ,GAAG,GAAK,EAAA;AAC3C,QAAA,OAAO,OAAO,KAAM,CAAA,OAAA,CAAA;AAAA,OACtB;AAAA,KACF;AAEA,IAAA,OAAO,EAAC,CAAA;AAAA,GACV,CAAE,KAAK,WAAW,CAAA,CAAA;AACpB;;;;"}
@@ -43,6 +43,7 @@ function VariableLabel({ model }) {
43
43
  return (_a2 = model.onCancel) == null ? void 0 : _a2.call(model);
44
44
  },
45
45
  label: labelOrName,
46
+ error: model.state.error,
46
47
  description: (_b = model.state.description) != null ? _b : void 0
47
48
  });
48
49
  }
@@ -1 +1 @@
1
- {"version":3,"file":"VariableValueSelectors.js","sources":["../../../../src/variables/components/VariableValueSelectors.tsx"],"sourcesContent":["import React from 'react';\n\nimport { VariableHide } from '@grafana/data';\n\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { SceneComponentProps, SceneObjectState } from '../../core/types';\nimport { SceneVariable } from '../types';\nimport { ControlsLabel } from '../../utils/ControlsLabel';\nimport { css } from '@emotion/css';\n\nexport class VariableValueSelectors extends SceneObjectBase<SceneObjectState> {\n public static Component = VariableValueSelectorsRenderer;\n}\n\nfunction VariableValueSelectorsRenderer({ model }: SceneComponentProps<VariableValueSelectors>) {\n const variables = sceneGraph.getVariables(model)!.useState();\n\n return (\n <>\n {variables.variables.map((variable) => (\n <VariableValueSelectWrapper key={variable.state.key} variable={variable} />\n ))}\n </>\n );\n}\n\nfunction VariableValueSelectWrapper({ variable }: { variable: SceneVariable }) {\n const state = variable.useState();\n\n if (state.hide === VariableHide.hideVariable) {\n return null;\n }\n\n return (\n <div className={containerStyle}>\n <VariableLabel model={variable} />\n <variable.Component model={variable} />\n </div>\n );\n}\n\nfunction VariableLabel({ model }: { model: SceneVariable }) {\n if (model.state.hide === VariableHide.hideLabel) {\n return null;\n }\n\n const elementId = `var-${model.state.key}`;\n const labelOrName = model.state.label ?? model.state.name;\n\n return (\n <ControlsLabel\n htmlFor={elementId}\n isLoading={model.state.loading}\n onCancel={() => model.onCancel?.()}\n label={labelOrName}\n description={model.state.description ?? undefined}\n />\n );\n}\n\nconst containerStyle = css({ display: 'flex' });\n"],"names":["_a"],"mappings":";;;;;;;AAWO,MAAM,+BAA+B,eAAkC,CAAA;AAE9E,CAAA;AAFa,sBAAA,CACG,SAAY,GAAA,8BAAA,CAAA;AAG5B,SAAS,8BAAA,CAA+B,EAAE,KAAA,EAAsD,EAAA;AAC9F,EAAA,MAAM,SAAY,GAAA,UAAA,CAAW,YAAa,CAAA,KAAK,EAAG,QAAS,EAAA,CAAA;AAE3D,EAAA,iEAEK,SAAU,CAAA,SAAA,CAAU,GAAI,CAAA,CAAC,6BACvB,KAAA,CAAA,aAAA,CAAA,0BAAA,EAAA;AAAA,IAA2B,GAAA,EAAK,SAAS,KAAM,CAAA,GAAA;AAAA,IAAK,QAAA;AAAA,GAAoB,CAC1E,CACH,CAAA,CAAA;AAEJ,CAAA;AAEA,SAAS,0BAAA,CAA2B,EAAE,QAAA,EAAyC,EAAA;AAC7E,EAAM,MAAA,KAAA,GAAQ,SAAS,QAAS,EAAA,CAAA;AAEhC,EAAI,IAAA,KAAA,CAAM,IAAS,KAAA,YAAA,CAAa,YAAc,EAAA;AAC5C,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAEA,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA;AAAA,IAAI,SAAW,EAAA,cAAA;AAAA,GAAA,kBACb,KAAA,CAAA,aAAA,CAAA,aAAA,EAAA;AAAA,IAAc,KAAO,EAAA,QAAA;AAAA,GAAU,CAAA,kBAC/B,KAAA,CAAA,aAAA,CAAA,QAAA,CAAS,SAAT,EAAA;AAAA,IAAmB,KAAO,EAAA,QAAA;AAAA,GAAU,CACvC,CAAA,CAAA;AAEJ,CAAA;AAEA,SAAS,aAAA,CAAc,EAAE,KAAA,EAAmC,EAAA;AA1C5D,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AA2CE,EAAA,IAAI,KAAM,CAAA,KAAA,CAAM,IAAS,KAAA,YAAA,CAAa,SAAW,EAAA;AAC/C,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAEA,EAAM,MAAA,SAAA,GAAY,CAAO,IAAA,EAAA,KAAA,CAAM,KAAM,CAAA,GAAA,CAAA,CAAA,CAAA;AACrC,EAAA,MAAM,eAAc,EAAM,GAAA,KAAA,CAAA,KAAA,CAAM,KAAZ,KAAA,IAAA,GAAA,EAAA,GAAqB,MAAM,KAAM,CAAA,IAAA,CAAA;AAErD,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,aAAA,EAAA;AAAA,IACC,OAAS,EAAA,SAAA;AAAA,IACT,SAAA,EAAW,MAAM,KAAM,CAAA,OAAA;AAAA,IACvB,UAAU,MAAG;AAtDnB,MAAAA,IAAAA,GAAAA,CAAAA;AAsDsB,MAAA,OAAA,CAAAA,GAAA,GAAA,KAAA,CAAM,QAAN,KAAA,IAAA,GAAA,KAAA,CAAA,GAAAA,GAAA,CAAA,IAAA,CAAA,KAAA,CAAA,CAAA;AAAA,KAAA;AAAA,IAChB,KAAO,EAAA,WAAA;AAAA,IACP,WAAa,EAAA,CAAA,EAAA,GAAA,KAAA,CAAM,KAAM,CAAA,WAAA,KAAZ,IAA2B,GAAA,EAAA,GAAA,KAAA,CAAA;AAAA,GAC1C,CAAA,CAAA;AAEJ,CAAA;AAEA,MAAM,cAAiB,GAAA,GAAA,CAAI,EAAE,OAAA,EAAS,QAAQ,CAAA;;;;"}
1
+ {"version":3,"file":"VariableValueSelectors.js","sources":["../../../../src/variables/components/VariableValueSelectors.tsx"],"sourcesContent":["import React from 'react';\n\nimport { VariableHide } from '@grafana/data';\n\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { SceneComponentProps, SceneObjectState } from '../../core/types';\nimport { SceneVariable } from '../types';\nimport { ControlsLabel } from '../../utils/ControlsLabel';\nimport { css } from '@emotion/css';\n\nexport class VariableValueSelectors extends SceneObjectBase<SceneObjectState> {\n public static Component = VariableValueSelectorsRenderer;\n}\n\nfunction VariableValueSelectorsRenderer({ model }: SceneComponentProps<VariableValueSelectors>) {\n const variables = sceneGraph.getVariables(model)!.useState();\n\n return (\n <>\n {variables.variables.map((variable) => (\n <VariableValueSelectWrapper key={variable.state.key} variable={variable} />\n ))}\n </>\n );\n}\n\nfunction VariableValueSelectWrapper({ variable }: { variable: SceneVariable }) {\n const state = variable.useState();\n\n if (state.hide === VariableHide.hideVariable) {\n return null;\n }\n\n return (\n <div className={containerStyle}>\n <VariableLabel model={variable} />\n <variable.Component model={variable} />\n </div>\n );\n}\n\nfunction VariableLabel({ model }: { model: SceneVariable }) {\n if (model.state.hide === VariableHide.hideLabel) {\n return null;\n }\n\n const elementId = `var-${model.state.key}`;\n const labelOrName = model.state.label ?? model.state.name;\n\n return (\n <ControlsLabel\n htmlFor={elementId}\n isLoading={model.state.loading}\n onCancel={() => model.onCancel?.()}\n label={labelOrName}\n error={model.state.error}\n description={model.state.description ?? undefined}\n />\n );\n}\n\nconst containerStyle = css({ display: 'flex' });\n"],"names":["_a"],"mappings":";;;;;;;AAWO,MAAM,+BAA+B,eAAkC,CAAA;AAE9E,CAAA;AAFa,sBAAA,CACG,SAAY,GAAA,8BAAA,CAAA;AAG5B,SAAS,8BAAA,CAA+B,EAAE,KAAA,EAAsD,EAAA;AAC9F,EAAA,MAAM,SAAY,GAAA,UAAA,CAAW,YAAa,CAAA,KAAK,EAAG,QAAS,EAAA,CAAA;AAE3D,EAAA,iEAEK,SAAU,CAAA,SAAA,CAAU,GAAI,CAAA,CAAC,6BACvB,KAAA,CAAA,aAAA,CAAA,0BAAA,EAAA;AAAA,IAA2B,GAAA,EAAK,SAAS,KAAM,CAAA,GAAA;AAAA,IAAK,QAAA;AAAA,GAAoB,CAC1E,CACH,CAAA,CAAA;AAEJ,CAAA;AAEA,SAAS,0BAAA,CAA2B,EAAE,QAAA,EAAyC,EAAA;AAC7E,EAAM,MAAA,KAAA,GAAQ,SAAS,QAAS,EAAA,CAAA;AAEhC,EAAI,IAAA,KAAA,CAAM,IAAS,KAAA,YAAA,CAAa,YAAc,EAAA;AAC5C,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAEA,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA;AAAA,IAAI,SAAW,EAAA,cAAA;AAAA,GAAA,kBACb,KAAA,CAAA,aAAA,CAAA,aAAA,EAAA;AAAA,IAAc,KAAO,EAAA,QAAA;AAAA,GAAU,CAAA,kBAC/B,KAAA,CAAA,aAAA,CAAA,QAAA,CAAS,SAAT,EAAA;AAAA,IAAmB,KAAO,EAAA,QAAA;AAAA,GAAU,CACvC,CAAA,CAAA;AAEJ,CAAA;AAEA,SAAS,aAAA,CAAc,EAAE,KAAA,EAAmC,EAAA;AA1C5D,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AA2CE,EAAA,IAAI,KAAM,CAAA,KAAA,CAAM,IAAS,KAAA,YAAA,CAAa,SAAW,EAAA;AAC/C,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAEA,EAAM,MAAA,SAAA,GAAY,CAAO,IAAA,EAAA,KAAA,CAAM,KAAM,CAAA,GAAA,CAAA,CAAA,CAAA;AACrC,EAAA,MAAM,eAAc,EAAM,GAAA,KAAA,CAAA,KAAA,CAAM,KAAZ,KAAA,IAAA,GAAA,EAAA,GAAqB,MAAM,KAAM,CAAA,IAAA,CAAA;AAErD,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,aAAA,EAAA;AAAA,IACC,OAAS,EAAA,SAAA;AAAA,IACT,SAAA,EAAW,MAAM,KAAM,CAAA,OAAA;AAAA,IACvB,UAAU,MAAG;AAtDnB,MAAAA,IAAAA,GAAAA,CAAAA;AAsDsB,MAAA,OAAA,CAAAA,GAAA,GAAA,KAAA,CAAM,QAAN,KAAA,IAAA,GAAA,KAAA,CAAA,GAAAA,GAAA,CAAA,IAAA,CAAA,KAAA,CAAA,CAAA;AAAA,KAAA;AAAA,IAChB,KAAO,EAAA,WAAA;AAAA,IACP,KAAA,EAAO,MAAM,KAAM,CAAA,KAAA;AAAA,IACnB,WAAa,EAAA,CAAA,EAAA,GAAA,KAAA,CAAM,KAAM,CAAA,WAAA,KAAZ,IAA2B,GAAA,EAAA,GAAA,KAAA,CAAA;AAAA,GAC1C,CAAA,CAAA;AAEJ,CAAA;AAEA,MAAM,cAAiB,GAAA,GAAA,CAAI,EAAE,OAAA,EAAS,QAAQ,CAAA;;;;"}