@grafana/scenes 4.13.0--canary.705.8847545922.0 → 4.13.1--canary.711.8884688944.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.
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../src/variables/utils.ts"],"sourcesContent":["import { isEqual } from 'lodash';\nimport { VariableValue } from './types';\nimport { AdHocVariableFilter } from '@grafana/data';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneObject, SceneObjectState } from '../core/types';\nimport { DataQueryExtended, SceneQueryRunner } from '../querying/SceneQueryRunner';\nimport { DataSourceRef } from '@grafana/schema';\n\nexport function isVariableValueEqual(a: VariableValue | null | undefined, b: VariableValue | null | undefined) {\n if (a === b) {\n return true;\n }\n\n return isEqual(a, b);\n}\n\nexport function safeStringifyValue(value: unknown) {\n // Avoid circular references ignoring those references\n const getCircularReplacer = () => {\n const seen = new WeakSet();\n return (_: string, value: object | null) => {\n if (typeof value === 'object' && value !== null) {\n if (seen.has(value)) {\n return;\n }\n seen.add(value);\n }\n return value;\n };\n };\n\n try {\n return JSON.stringify(value, getCircularReplacer());\n } catch (error) {\n console.error(error);\n }\n\n return '';\n}\n\nexport function renderPrometheusLabelFilters(filters: AdHocVariableFilter[]) {\n return filters.map((filter) => renderFilter(filter)).join(',');\n}\n\nfunction renderFilter(filter: AdHocVariableFilter) {\n let value = '';\n\n if (filter.operator === '=~' || filter.operator === '!~¨') {\n value = escapeLabelValueInRegexSelector(filter.value);\n } else {\n value = escapeLabelValueInExactSelector(filter.value);\n }\n\n return `${filter.key}${filter.operator}\"${value}\"`;\n}\n\n// based on the openmetrics-documentation, the 3 symbols we have to handle are:\n// - \\n ... the newline character\n// - \\ ... the backslash character\n// - \" ... the double-quote character\nexport function escapeLabelValueInExactSelector(labelValue: string): string {\n return labelValue.replace(/\\\\/g, '\\\\\\\\').replace(/\\n/g, '\\\\n').replace(/\"/g, '\\\\\"');\n}\n\nexport function escapeLabelValueInRegexSelector(labelValue: string): string {\n return escapeLabelValueInExactSelector(escapeLokiRegexp(labelValue));\n}\n\nexport function isRegexSelector(selector?: string) {\n if (selector && (selector.includes('=~') || selector.includes('!~'))) {\n return true;\n }\n return false;\n}\n\n// Loki regular-expressions use the RE2 syntax (https://github.com/google/re2/wiki/Syntax),\n// so every character that matches something in that list has to be escaped.\n// the list of meta characters is: *+?()|\\.[]{}^$\n// we make a javascript regular expression that matches those characters:\nconst RE2_METACHARACTERS = /[*+?()|\\\\.\\[\\]{}^$]/g;\nfunction escapeLokiRegexp(value: string): string {\n return value.replace(RE2_METACHARACTERS, '\\\\$&');\n}\n\n/**\n * Get all queries in the scene that have the same datasource as provided source object\n */\nexport function getQueriesForVariables(\n sourceObject: SceneObject<SceneObjectState & { datasource: DataSourceRef | null }>\n) {\n const runners = sceneGraph.findAllObjects(\n sourceObject.getRoot(),\n (o) => o instanceof SceneQueryRunner\n ) as SceneQueryRunner[];\n\n const applicableRunners = filterOutInactiveRunnerDuplicates(runners).filter((r) => {\n return r.state.datasource?.uid === sourceObject.state.datasource?.uid;\n });\n\n if (applicableRunners.length === 0) {\n return [];\n }\n\n const result: DataQueryExtended[] = [];\n applicableRunners.forEach((r) => {\n result.push(...r.state.queries);\n });\n\n return result;\n}\n\n// Filters out inactive runner duplicates, keeping only the ones that are currently active.\n// This is needed for scnearios whan a query runner is cloned and the original is not removed but de-activated.\n// Can happen i.e. when editing a panel in Grafana Core dashboards.\nfunction filterOutInactiveRunnerDuplicates(runners: SceneQueryRunner[]) {\n // Group items by key\n const groupedItems: { [key: string]: SceneQueryRunner[] } = {};\n\n for (const item of runners) {\n if (item.state.key) {\n if (!(item.state.key in groupedItems)) {\n groupedItems[item.state.key] = [];\n }\n groupedItems[item.state.key].push(item);\n }\n }\n\n // Filter out inactive items and concatenate active items\n return Object.values(groupedItems).flatMap((group) => {\n const activeItems = group.filter((item) => item.isActive);\n // Keep inactive items if there's only one item with the key\n if (activeItems.length === 0 && group.length === 1) {\n return group;\n }\n return activeItems;\n });\n}\n\nexport function escapeUrlPipeDelimiters(value: string | undefined): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n // Replace the pipe due to using it as a filter separator\n return (value = /\\|/g[Symbol.replace](value, '__gfp__'));\n}\n\nexport function escapeUrlCommaDelimiters(value: string | undefined): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n // Replace the comma due to using it as a value/label separator\n return /,/g[Symbol.replace](value, '__gfc__');\n}\n\nexport function unescapeUrlDelimiters(value: string | undefined): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n value = /__gfp__/g[Symbol.replace](value, '|');\n value = /__gfc__/g[Symbol.replace](value, ',');\n\n return value;\n}\n\nexport function toUrlCommaDelimitedString(key: string, label?: string): string {\n // Omit for identical key/label or when label is not set at all\n if (!label || key === label) {\n return escapeUrlCommaDelimiters(key);\n }\n\n return [key, label].map(escapeUrlCommaDelimiters).join(',');\n}\n"],"names":["value"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sources":["../../../src/variables/utils.ts"],"sourcesContent":["import { isEqual } from 'lodash';\nimport { VariableValue } from './types';\nimport { AdHocVariableFilter } from '@grafana/data';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneObject, SceneObjectState } from '../core/types';\nimport { DataQueryExtended, SceneQueryRunner } from '../querying/SceneQueryRunner';\nimport { DataSourceRef } from '@grafana/schema';\n\nexport function isVariableValueEqual(a: VariableValue | null | undefined, b: VariableValue | null | undefined) {\n if (a === b) {\n return true;\n }\n\n return isEqual(a, b);\n}\n\nexport function safeStringifyValue(value: unknown) {\n // Avoid circular references ignoring those references\n const getCircularReplacer = () => {\n const seen = new WeakSet();\n return (_: string, value: object | null) => {\n if (typeof value === 'object' && value !== null) {\n if (seen.has(value)) {\n return;\n }\n seen.add(value);\n }\n return value;\n };\n };\n\n try {\n return JSON.stringify(value, getCircularReplacer());\n } catch (error) {\n console.error(error);\n }\n\n return '';\n}\n\nexport function renderPrometheusLabelFilters(filters: AdHocVariableFilter[]) {\n return filters.map((filter) => renderFilter(filter)).join(',');\n}\n\nfunction renderFilter(filter: AdHocVariableFilter) {\n let value = '';\n\n if (filter.operator === '=~' || filter.operator === '!~¨') {\n value = escapeLabelValueInRegexSelector(filter.value);\n } else {\n value = escapeLabelValueInExactSelector(filter.value);\n }\n\n return `${filter.key}${filter.operator}\"${value}\"`;\n}\n\n// based on the openmetrics-documentation, the 3 symbols we have to handle are:\n// - \\n ... the newline character\n// - \\ ... the backslash character\n// - \" ... the double-quote character\nexport function escapeLabelValueInExactSelector(labelValue: string): string {\n return labelValue.replace(/\\\\/g, '\\\\\\\\').replace(/\\n/g, '\\\\n').replace(/\"/g, '\\\\\"');\n}\n\nexport function escapeLabelValueInRegexSelector(labelValue: string): string {\n return escapeLabelValueInExactSelector(escapeLokiRegexp(labelValue));\n}\n\nexport function isRegexSelector(selector?: string) {\n if (selector && (selector.includes('=~') || selector.includes('!~'))) {\n return true;\n }\n return false;\n}\n\n// Loki regular-expressions use the RE2 syntax (https://github.com/google/re2/wiki/Syntax),\n// so every character that matches something in that list has to be escaped.\n// the list of meta characters is: *+?()|\\.[]{}^$\n// we make a javascript regular expression that matches those characters:\nconst RE2_METACHARACTERS = /[*+?()|\\\\.\\[\\]{}^$]/g;\nfunction escapeLokiRegexp(value: string): string {\n return value.replace(RE2_METACHARACTERS, '\\\\$&');\n}\n\n/**\n * Get all queries in the scene that have the same datasource as provided source object\n */\nexport function getQueriesForVariables(\n sourceObject: SceneObject<SceneObjectState & { datasource: DataSourceRef | null }>\n) {\n const runners = sceneGraph.findAllObjects(\n sourceObject.getRoot(),\n (o) => o instanceof SceneQueryRunner\n ) as SceneQueryRunner[];\n\n const applicableRunners = filterOutInactiveRunnerDuplicates(runners).filter((r) => {\n return r.state.datasource?.uid === sourceObject.state.datasource?.uid;\n });\n\n if (applicableRunners.length === 0) {\n return [];\n }\n\n const result: DataQueryExtended[] = [];\n applicableRunners.forEach((r) => {\n result.push(...r.state.queries);\n });\n\n return result;\n}\n\n// Filters out inactive runner duplicates, keeping only the ones that are currently active.\n// This is needed for scnearios whan a query runner is cloned and the original is not removed but de-activated.\n// Can happen i.e. when editing a panel in Grafana Core dashboards.\nfunction filterOutInactiveRunnerDuplicates(runners: SceneQueryRunner[]) {\n // Group items by key\n const groupedItems: { [key: string]: SceneQueryRunner[] } = {};\n\n for (const item of runners) {\n if (item.state.key) {\n if (!(item.state.key in groupedItems)) {\n groupedItems[item.state.key] = [];\n }\n groupedItems[item.state.key].push(item);\n }\n }\n\n // Filter out inactive items and concatenate active items\n return Object.values(groupedItems).flatMap((group) => {\n const activeItems = group.filter((item) => item.isActive);\n // Keep inactive items if there's only one item with the key\n if (activeItems.length === 0 && group.length === 1) {\n return group;\n }\n return activeItems;\n });\n}\n"],"names":["value"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -5,6 +5,7 @@ import * as rxjs from 'rxjs';
5
5
  import { Observable, Unsubscribable, MonoTypeOperatorFunction, Subscription, ReplaySubject } from 'rxjs';
6
6
  import * as _grafana_schema from '@grafana/schema';
7
7
  import { VariableType, VariableHide, TimeZone, DataTopic, DataSourceRef, DataQuery as DataQuery$1, VariableRefresh, LoadingState, DashboardCursorSync, MatcherConfig, TableFieldOptions } from '@grafana/schema';
8
+ import { VariableInterpolation } from '@grafana/runtime';
8
9
  import { PanelContext, IconName } from '@grafana/ui';
9
10
  import ReactGridLayout from 'react-grid-layout';
10
11
  import { RouteComponentProps } from 'react-router-dom';
@@ -881,8 +882,6 @@ interface GroupByVariableState extends MultiValueVariableState {
881
882
  name: string;
882
883
  /** The visible keys to group on */
883
884
  defaultOptions?: MetricFindValue[];
884
- /** Options obtained through URL sync */
885
- urlOptions?: MetricFindValue[];
886
885
  /** Base filters to always apply when looking up keys */
887
886
  baseFilters?: AdHocVariableFilter[];
888
887
  /** Datasource to use for getTagKeys and also controls which scene queries the group by should apply to */
@@ -918,7 +917,6 @@ type getTagKeysProvider = (set: GroupByVariable, currentKey: string | null) => P
918
917
  declare class GroupByVariable extends MultiValueVariable<GroupByVariableState> {
919
918
  static Component: typeof GroupByVariableRenderer;
920
919
  isLazy: boolean;
921
- protected _urlSync: SceneObjectUrlSyncHandler;
922
920
  validateAndUpdate(): Observable<ValidateAndUpdateResult>;
923
921
  private _updateValueGivenNewOptions;
924
922
  getValueOptions(args: VariableGetOptionsArgs): Observable<VariableValueOption[]>;
@@ -1017,8 +1015,14 @@ declare function getData(sceneObject: SceneObject): SceneDataProvider;
1017
1015
  declare function getLayout(scene: SceneObject): SceneLayout | null;
1018
1016
  /**
1019
1017
  * Interpolates the given string using the current scene object as context. *
1018
+ *
1019
+ * Note: the interpolations array will be mutated by adding information about variables that
1020
+ * have been interpolated during replacement. Variables that were specified in the target but not found in
1021
+ * the list of available variables are also added to the array. See {@link VariableInterpolation} for more details.
1022
+ *
1023
+ * @param {VariableInterpolation[]} interpolations an optional array that is updated with interpolated variables.
1020
1024
  */
1021
- declare function interpolate(sceneObject: SceneObject, value: string | undefined | null, scopedVars?: ScopedVars, format?: string | VariableCustomFormatterFn): string;
1025
+ declare function interpolate(sceneObject: SceneObject, value: string | undefined | null, scopedVars?: ScopedVars, format?: string | VariableCustomFormatterFn, interpolations?: VariableInterpolation[]): string;
1022
1026
  /**
1023
1027
  * Checks if the variable is currently loading or waiting to update.
1024
1028
  * It also returns true if a dependency of the variable is loading.
package/dist/index.js CHANGED
@@ -1304,7 +1304,7 @@ function lookupVariable(name, sceneObject) {
1304
1304
  return null;
1305
1305
  }
1306
1306
 
1307
- function sceneInterpolator(sceneObject, target, scopedVars, format) {
1307
+ function sceneInterpolator(sceneObject, target, scopedVars, format, interpolations) {
1308
1308
  if (!target) {
1309
1309
  return target != null ? target : "";
1310
1310
  }
@@ -1314,9 +1314,16 @@ function sceneInterpolator(sceneObject, target, scopedVars, format) {
1314
1314
  const fmt = fmt2 || fmt3 || format;
1315
1315
  const variable = lookupFormatVariable(variableName, match, scopedVars, sceneObject);
1316
1316
  if (!variable) {
1317
+ if (interpolations) {
1318
+ interpolations.push({ match, variableName, fieldPath, format: fmt, value: match, found: false });
1319
+ }
1317
1320
  return match;
1318
1321
  }
1319
- return formatValue(variable, variable.getValue(fieldPath), fmt);
1322
+ const value = formatValue(variable, variable.getValue(fieldPath), fmt);
1323
+ if (interpolations) {
1324
+ interpolations.push({ match, variableName, fieldPath, format: fmt, value, found: value !== match });
1325
+ }
1326
+ return value;
1320
1327
  });
1321
1328
  }
1322
1329
  function lookupFormatVariable(name, match, scopedVars, sceneObject) {
@@ -1455,11 +1462,11 @@ function getLayout(scene) {
1455
1462
  }
1456
1463
  return null;
1457
1464
  }
1458
- function interpolate(sceneObject, value, scopedVars, format) {
1465
+ function interpolate(sceneObject, value, scopedVars, format, interpolations) {
1459
1466
  if (value === "" || value == null) {
1460
1467
  return "";
1461
1468
  }
1462
- return sceneInterpolator(sceneObject, value, scopedVars, format);
1469
+ return sceneInterpolator(sceneObject, value, scopedVars, format, interpolations);
1463
1470
  }
1464
1471
  function hasVariableDependencyInLoadingState(sceneObject) {
1465
1472
  if (!sceneObject.variableDependency) {
@@ -2307,7 +2314,7 @@ class SceneTimeRangeCompare extends SceneObjectBase {
2307
2314
  SceneTimeRangeCompare.Component = SceneTimeRangeCompareRenderer;
2308
2315
  function SceneTimeRangeCompareRenderer({ model }) {
2309
2316
  var _a;
2310
- const styles = ui.useStyles2(getStyles$9);
2317
+ const styles = ui.useStyles2(getStyles$a);
2311
2318
  const { compareWith, compareOptions } = model.useState();
2312
2319
  const [previousCompare, setPreviousCompare] = React__default["default"].useState(compareWith);
2313
2320
  const previousValue = (_a = compareOptions.find(({ value: value2 }) => value2 === previousCompare)) != null ? _a : PREVIOUS_PERIOD_COMPARE_OPTION;
@@ -2347,7 +2354,7 @@ function SceneTimeRangeCompareRenderer({ model }) {
2347
2354
  isOpen: false
2348
2355
  }, previousValue.label));
2349
2356
  }
2350
- function getStyles$9(theme) {
2357
+ function getStyles$a(theme) {
2351
2358
  return {
2352
2359
  previewButton: css.css({
2353
2360
  "&:disabled": {
@@ -2840,59 +2847,6 @@ class CustomAllValue {
2840
2847
  }
2841
2848
  }
2842
2849
 
2843
- class GroupByVariableUrlSyncHandler {
2844
- constructor(_sceneObject) {
2845
- this._sceneObject = _sceneObject;
2846
- }
2847
- getKey() {
2848
- return `var-${this._sceneObject.state.name}`;
2849
- }
2850
- getKeys() {
2851
- if (this._sceneObject.state.skipUrlSync) {
2852
- return [];
2853
- }
2854
- return [this.getKey()];
2855
- }
2856
- getUrlState() {
2857
- if (this._sceneObject.state.skipUrlSync) {
2858
- return {};
2859
- }
2860
- let { value: values, text: texts } = this._sceneObject.state;
2861
- values = Array.isArray(values) ? values : [values];
2862
- texts = Array.isArray(texts) ? texts : [texts];
2863
- const urlValue = lodash.zip(values, texts).map(toUrlValues);
2864
- return { [this.getKey()]: urlValue };
2865
- }
2866
- updateFromUrl(values) {
2867
- let urlValue = values[this.getKey()];
2868
- if (urlValue != null) {
2869
- if (!this._sceneObject.isActive) {
2870
- this._sceneObject.skipNextValidation = true;
2871
- }
2872
- urlValue = Array.isArray(urlValue) ? urlValue : [urlValue];
2873
- const valuesLabelsPairs = urlValue.map((value) => value ? value.split(",") : [value]);
2874
- let [values2, labels] = lodash.unzip(valuesLabelsPairs);
2875
- values2 = (values2 != null ? values2 : []).map(unescapeUrlDelimiters);
2876
- labels = (labels != null ? labels : []).map(unescapeUrlDelimiters);
2877
- this._sceneObject.setState({
2878
- urlOptions: values2.map((value, idx) => ({
2879
- value,
2880
- text: labels[idx]
2881
- }))
2882
- });
2883
- this._sceneObject.changeValueTo(values2, labels);
2884
- }
2885
- }
2886
- }
2887
- function toUrlValues([value, label]) {
2888
- if (value === void 0 || value === null) {
2889
- return "";
2890
- }
2891
- value = String(value);
2892
- label = label === void 0 || label === null ? value : String(label);
2893
- return toUrlCommaDelimitedString(value, label);
2894
- }
2895
-
2896
2850
  var __defProp$z = Object.defineProperty;
2897
2851
  var __defProps$n = Object.defineProperties;
2898
2852
  var __getOwnPropDescs$n = Object.getOwnPropertyDescriptors;
@@ -2929,7 +2883,6 @@ class GroupByVariable extends MultiValueVariable {
2929
2883
  noValueOnClear: true
2930
2884
  }));
2931
2885
  this.isLazy = true;
2932
- this._urlSync = new GroupByVariableUrlSyncHandler(this);
2933
2886
  this._getKeys = async (ds) => {
2934
2887
  var _a, _b, _c;
2935
2888
  const override = await ((_b = (_a = this.state).getTagKeysProvider) == null ? void 0 : _b.call(_a, this, null));
@@ -2979,11 +2932,9 @@ class GroupByVariable extends MultiValueVariable {
2979
2932
  this.setState(stateUpdate);
2980
2933
  }
2981
2934
  getValueOptions(args) {
2982
- var _a;
2983
- const urlOptions = (_a = this.state.urlOptions) != null ? _a : [];
2984
2935
  if (this.state.defaultOptions) {
2985
2936
  return rxjs.of(
2986
- lodash.unionBy(this.state.defaultOptions, urlOptions, "value").map((o) => ({
2937
+ this.state.defaultOptions.map((o) => ({
2987
2938
  label: o.text,
2988
2939
  value: String(o.value)
2989
2940
  }))
@@ -2999,7 +2950,7 @@ class GroupByVariable extends MultiValueVariable {
2999
2950
  return rxjs.from(this._getKeys(ds)).pipe(
3000
2951
  rxjs.take(1),
3001
2952
  rxjs.mergeMap((data) => {
3002
- const a = lodash.unionBy(data, urlOptions, "value").map((i) => {
2953
+ const a = data.map((i) => {
3003
2954
  return {
3004
2955
  label: i.text,
3005
2956
  value: i.value ? String(i.value) : i.text
@@ -3017,24 +2968,14 @@ class GroupByVariable extends MultiValueVariable {
3017
2968
  }
3018
2969
  GroupByVariable.Component = GroupByVariableRenderer;
3019
2970
  function GroupByVariableRenderer({ model }) {
3020
- const { value, text, key, maxVisibleValues, noValueOnClear } = model.useState();
3021
- const values = React.useMemo(() => {
3022
- const arrayValue = lodash.isArray(value) ? value : [value];
3023
- const arrayText = lodash.isArray(text) ? text : [text];
3024
- return arrayValue.map((value2, idx) => {
3025
- var _a;
3026
- return {
3027
- value: value2,
3028
- label: String((_a = arrayText[idx]) != null ? _a : value2)
3029
- };
3030
- });
3031
- }, [value, text]);
2971
+ const { value, key, maxVisibleValues, noValueOnClear } = model.useState();
2972
+ const arrayValue = React.useMemo(() => lodash.isArray(value) ? value : [value], [value]);
3032
2973
  const [isFetchingOptions, setIsFetchingOptions] = React.useState(false);
3033
2974
  const [isOptionsOpen, setIsOptionsOpen] = React.useState(false);
3034
- const [uncommittedValue, setUncommittedValue] = React.useState(values);
2975
+ const [uncommittedValue, setUncommittedValue] = React.useState(arrayValue);
3035
2976
  React.useEffect(() => {
3036
- setUncommittedValue(values);
3037
- }, [values]);
2977
+ setUncommittedValue(arrayValue);
2978
+ }, [arrayValue]);
3038
2979
  const onInputChange = model.onSearchChange ? (value2, meta) => {
3039
2980
  if (meta.action === "input-change") {
3040
2981
  model.onSearchChange(value2);
@@ -3059,13 +3000,13 @@ function GroupByVariableRenderer({ model }) {
3059
3000
  isLoading: isFetchingOptions,
3060
3001
  onInputChange,
3061
3002
  onBlur: () => {
3062
- model.changeValueTo(uncommittedValue.map((x) => x.value));
3003
+ model.changeValueTo(uncommittedValue);
3063
3004
  },
3064
3005
  onChange: (newValue, action) => {
3065
3006
  if (action.action === "clear" && noValueOnClear) {
3066
3007
  model.changeValueTo([]);
3067
3008
  }
3068
- setUncommittedValue(newValue);
3009
+ setUncommittedValue(newValue.map((x) => x.value));
3069
3010
  },
3070
3011
  onOpenMenu: async () => {
3071
3012
  setIsFetchingOptions(true);
@@ -3094,7 +3035,7 @@ function LoadingIndicator(props) {
3094
3035
  }
3095
3036
 
3096
3037
  function ControlsLabel(props) {
3097
- const styles = ui.useStyles2(getStyles$8);
3038
+ const styles = ui.useStyles2(getStyles$9);
3098
3039
  const theme = ui.useTheme2();
3099
3040
  const isVertical = props.layout === "vertical";
3100
3041
  const loadingIndicator = Boolean(props.isLoading) ? /* @__PURE__ */ React__default["default"].createElement("div", {
@@ -3157,7 +3098,7 @@ function ControlsLabel(props) {
3157
3098
  }
3158
3099
  return labelElement;
3159
3100
  }
3160
- const getStyles$8 = (theme) => ({
3101
+ const getStyles$9 = (theme) => ({
3161
3102
  horizontalLabel: css.css({
3162
3103
  background: theme.isDark ? theme.colors.background.primary : theme.colors.background.secondary,
3163
3104
  display: `flex`,
@@ -3219,7 +3160,7 @@ function keyLabelToOption(key, label) {
3219
3160
  }
3220
3161
  function AdHocFilterRenderer({ filter, model }) {
3221
3162
  var _a, _b;
3222
- const styles = ui.useStyles2(getStyles$7);
3163
+ const styles = ui.useStyles2(getStyles$8);
3223
3164
  const [state, setState] = React.useState({});
3224
3165
  const keyValue = keyLabelToOption(filter.key, filter.keyLabel);
3225
3166
  const valueValue = keyLabelToOption(filter.value, filter.valueLabel);
@@ -3312,7 +3253,7 @@ function AdHocFilterRenderer({ filter, model }) {
3312
3253
  onClick: () => model._removeFilter(filter)
3313
3254
  }));
3314
3255
  }
3315
- const getStyles$7 = (theme) => ({
3256
+ const getStyles$8 = (theme) => ({
3316
3257
  field: css.css({
3317
3258
  marginBottom: 0
3318
3259
  }),
@@ -3388,7 +3329,7 @@ class AdHocFiltersVariableUrlSyncHandler {
3388
3329
  if (filters.length === 0) {
3389
3330
  return { [this.getKey()]: [""] };
3390
3331
  }
3391
- const value = filters.map((filter) => toArray(filter).map(escapeUrlPipeDelimiters).join("|"));
3332
+ const value = filters.map((filter) => toArray(filter).map(escapePipeDelimiters).join("|"));
3392
3333
  return { [this.getKey()]: value };
3393
3334
  }
3394
3335
  updateFromUrl(values) {
@@ -3408,13 +3349,39 @@ function deserializeUrlToFilters(value) {
3408
3349
  const filter = toFilter(value);
3409
3350
  return filter === null ? [] : [filter];
3410
3351
  }
3352
+ function escapePipeDelimiters(value) {
3353
+ if (value === null || value === void 0) {
3354
+ return "";
3355
+ }
3356
+ return value = /\|/g[Symbol.replace](value, "__gfp__");
3357
+ }
3358
+ function escapeCommaDelimiters(value) {
3359
+ if (value === null || value === void 0) {
3360
+ return "";
3361
+ }
3362
+ return /,/g[Symbol.replace](value, "__gfc__");
3363
+ }
3364
+ function unescapeDelimiters(value) {
3365
+ if (value === null || value === void 0) {
3366
+ return "";
3367
+ }
3368
+ value = /__gfp__/g[Symbol.replace](value, "|");
3369
+ value = /__gfc__/g[Symbol.replace](value, ",");
3370
+ return value;
3371
+ }
3411
3372
  function toArray(filter) {
3412
3373
  return [
3413
- toUrlCommaDelimitedString(filter.key, filter.keyLabel),
3374
+ toCommaDelimitedString(filter.key, filter.keyLabel),
3414
3375
  filter.operator,
3415
- toUrlCommaDelimitedString(filter.value, filter.valueLabel)
3376
+ toCommaDelimitedString(filter.value, filter.valueLabel)
3416
3377
  ];
3417
3378
  }
3379
+ function toCommaDelimitedString(key, label) {
3380
+ if (!label || key === label) {
3381
+ return escapeCommaDelimiters(key);
3382
+ }
3383
+ return [key, label].map(escapeCommaDelimiters).join(",");
3384
+ }
3418
3385
  function toFilter(urlValue) {
3419
3386
  if (typeof urlValue !== "string" || urlValue.length === 0) {
3420
3387
  return null;
@@ -3423,7 +3390,7 @@ function toFilter(urlValue) {
3423
3390
  const [key2, label] = v.split(",");
3424
3391
  acc.push(key2, label != null ? label : key2);
3425
3392
  return acc;
3426
- }, []).map(unescapeUrlDelimiters);
3393
+ }, []).map(unescapeDelimiters);
3427
3394
  return {
3428
3395
  key,
3429
3396
  keyLabel,
@@ -3580,7 +3547,7 @@ function renderExpression(builder, filters) {
3580
3547
  }
3581
3548
  function AdHocFiltersVariableRenderer({ model }) {
3582
3549
  const { filters, readOnly, addFilterButtonText } = model.useState();
3583
- const styles = ui.useStyles2(getStyles$6);
3550
+ const styles = ui.useStyles2(getStyles$7);
3584
3551
  return /* @__PURE__ */ React__default["default"].createElement("div", {
3585
3552
  className: styles.wrapper
3586
3553
  }, filters.map((filter, index) => /* @__PURE__ */ React__default["default"].createElement(React__default["default"].Fragment, {
@@ -3594,7 +3561,7 @@ function AdHocFiltersVariableRenderer({ model }) {
3594
3561
  addFilterButtonText
3595
3562
  }));
3596
3563
  }
3597
- const getStyles$6 = (theme) => ({
3564
+ const getStyles$7 = (theme) => ({
3598
3565
  wrapper: css.css({
3599
3566
  display: "flex",
3600
3567
  gap: theme.spacing(2),
@@ -4133,32 +4100,6 @@ function filterOutInactiveRunnerDuplicates(runners) {
4133
4100
  return activeItems;
4134
4101
  });
4135
4102
  }
4136
- function escapeUrlPipeDelimiters(value) {
4137
- if (value === null || value === void 0) {
4138
- return "";
4139
- }
4140
- return value = /\|/g[Symbol.replace](value, "__gfp__");
4141
- }
4142
- function escapeUrlCommaDelimiters(value) {
4143
- if (value === null || value === void 0) {
4144
- return "";
4145
- }
4146
- return /,/g[Symbol.replace](value, "__gfc__");
4147
- }
4148
- function unescapeUrlDelimiters(value) {
4149
- if (value === null || value === void 0) {
4150
- return "";
4151
- }
4152
- value = /__gfp__/g[Symbol.replace](value, "|");
4153
- value = /__gfc__/g[Symbol.replace](value, ",");
4154
- return value;
4155
- }
4156
- function toUrlCommaDelimitedString(key, label) {
4157
- if (!label || key === label) {
4158
- return escapeUrlCommaDelimiters(key);
4159
- }
4160
- return [key, label].map(escapeUrlCommaDelimiters).join(",");
4161
- }
4162
4103
 
4163
4104
  function isAdHocVariable(variable) {
4164
4105
  return variable.state.type === "adhoc";
@@ -6089,22 +6030,12 @@ function VariableValueSelectWrapper({ variable, layout, showAlways }) {
6089
6030
  if (state.hide === data.VariableHide.hideVariable && !showAlways) {
6090
6031
  return null;
6091
6032
  }
6092
- if (layout === "vertical") {
6093
- return /* @__PURE__ */ React__default["default"].createElement("div", {
6094
- className: verticalContainer,
6095
- "data-testid": e2eSelectors.selectors.pages.Dashboard.SubMenu.submenuItem
6096
- }, /* @__PURE__ */ React__default["default"].createElement(VariableLabel, {
6097
- variable,
6098
- layout
6099
- }), /* @__PURE__ */ React__default["default"].createElement(variable.Component, {
6100
- model: variable
6101
- }));
6102
- }
6103
6033
  return /* @__PURE__ */ React__default["default"].createElement("div", {
6104
- className: containerStyle,
6034
+ className: css.cx(containerStyle, { [verticalContainer]: layout === "vertical" }),
6105
6035
  "data-testid": e2eSelectors.selectors.pages.Dashboard.SubMenu.submenuItem
6106
6036
  }, /* @__PURE__ */ React__default["default"].createElement(VariableLabel, {
6107
- variable
6037
+ variable,
6038
+ layout
6108
6039
  }), /* @__PURE__ */ React__default["default"].createElement(variable.Component, {
6109
6040
  model: variable
6110
6041
  }));
@@ -6120,18 +6051,15 @@ function VariableLabel({ variable, layout }) {
6120
6051
  return /* @__PURE__ */ React__default["default"].createElement(ControlsLabel, {
6121
6052
  htmlFor: elementId,
6122
6053
  isLoading: state.loading,
6123
- onCancel: () => {
6124
- var _a2;
6125
- return (_a2 = variable.onCancel) == null ? void 0 : _a2.call(variable);
6126
- },
6054
+ onCancel: variable.onCancel,
6127
6055
  label: labelOrName,
6128
6056
  error: state.error,
6129
6057
  layout,
6130
6058
  description: (_b = state.description) != null ? _b : void 0
6131
6059
  });
6132
6060
  }
6133
- const containerStyle = css.css({ display: "flex" });
6134
- const verticalContainer = css.css({ display: "flex", flexDirection: "column" });
6061
+ const containerStyle = css.css({ display: "flex", overflow: "hidden" });
6062
+ const verticalContainer = css.css({ flexDirection: "column" });
6135
6063
 
6136
6064
  class VariableValueControl extends SceneObjectBase {
6137
6065
  }
@@ -6422,6 +6350,7 @@ class ConstantVariable extends SceneObjectBase {
6422
6350
 
6423
6351
  function VariableValueSelect({ model }) {
6424
6352
  const { value, key } = model.useState();
6353
+ const styles = ui.useStyles2(getStyles$6);
6425
6354
  const onInputChange = model.onSearchChange ? (value2, meta) => {
6426
6355
  if (meta.action === "input-change") {
6427
6356
  model.onSearchChange(value2);
@@ -6440,7 +6369,8 @@ function VariableValueSelect({ model }) {
6440
6369
  "data-testid": e2eSelectors.selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownValueLinkTexts(`${value}`),
6441
6370
  onChange: (newValue) => {
6442
6371
  model.changeValueTo(newValue.value, newValue.label);
6443
- }
6372
+ },
6373
+ className: styles.overflow
6444
6374
  });
6445
6375
  }
6446
6376
  function VariableValueSelectMulti({ model }) {
@@ -6457,6 +6387,7 @@ function VariableValueSelectMulti({ model }) {
6457
6387
  }
6458
6388
  } : void 0;
6459
6389
  const placeholder = options.length > 0 ? "Select value" : "";
6390
+ const styles = ui.useStyles2(getStyles$6);
6460
6391
  return /* @__PURE__ */ React__default["default"].createElement(ui.MultiSelect, {
6461
6392
  id: key,
6462
6393
  placeholder,
@@ -6480,7 +6411,8 @@ function VariableValueSelectMulti({ model }) {
6480
6411
  model.changeValueTo([]);
6481
6412
  }
6482
6413
  setUncommittedValue(newValue.map((x) => x.value));
6483
- }
6414
+ },
6415
+ className: styles.overflow
6484
6416
  });
6485
6417
  }
6486
6418
  function renderSelectForVariable(model) {
@@ -6494,6 +6426,11 @@ function renderSelectForVariable(model) {
6494
6426
  });
6495
6427
  }
6496
6428
  }
6429
+ const getStyles$6 = () => ({
6430
+ overflow: css.css({
6431
+ overflow: "hidden"
6432
+ })
6433
+ });
6497
6434
 
6498
6435
  var __defProp$i = Object.defineProperty;
6499
6436
  var __getOwnPropSymbols$i = Object.getOwnPropertySymbols;