@grafana/scenes 4.11.2--canary.690.8734061653.0 → 4.11.2--canary.648.8738574184.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/dist/index.d.ts CHANGED
@@ -612,17 +612,13 @@ declare class AdHocFiltersVariableUrlSyncHandler implements SceneObjectUrlSyncHa
612
612
  updateFromUrl(values: SceneObjectUrlValues): void;
613
613
  }
614
614
 
615
- interface AdHocFilterWithLabels extends AdHocVariableFilter {
616
- keyLabel?: string;
617
- valueLabel?: string;
618
- }
619
615
  interface AdHocFiltersVariableState extends SceneVariableState {
620
616
  /** Optional text to display on the 'add filter' button */
621
617
  addFilterButtonText?: string;
622
618
  /** The visible filters */
623
- filters: AdHocFilterWithLabels[];
619
+ filters: AdHocVariableFilter[];
624
620
  /** Base filters to always apply when looking up keys*/
625
- baseFilters?: AdHocFilterWithLabels[];
621
+ baseFilters?: AdHocVariableFilter[];
626
622
  /** Datasource to use for getTagKeys and getTagValues and also controls which scene queries the filters should apply to */
627
623
  datasource: DataSourceRef | null;
628
624
  /** Controls if the filters can be changed */
@@ -671,14 +667,14 @@ interface AdHocFiltersVariableState extends SceneVariableState {
671
667
  /**
672
668
  * @internal state of the new filter being added
673
669
  */
674
- _wip?: AdHocFilterWithLabels;
670
+ _wip?: AdHocVariableFilter;
675
671
  }
676
- type AdHocVariableExpressionBuilderFn = (filters: AdHocFilterWithLabels[]) => string;
672
+ type AdHocVariableExpressionBuilderFn = (filters: AdHocVariableFilter[]) => string;
677
673
  type getTagKeysProvider$1 = (variable: AdHocFiltersVariable, currentKey: string | null) => Promise<{
678
674
  replace?: boolean;
679
675
  values: MetricFindValue[];
680
676
  }>;
681
- type getTagValuesProvider = (variable: AdHocFiltersVariable, filter: AdHocFilterWithLabels) => Promise<{
677
+ type getTagValuesProvider = (variable: AdHocFiltersVariable, filter: AdHocVariableFilter) => Promise<{
682
678
  replace?: boolean;
683
679
  values: MetricFindValue[];
684
680
  }>;
@@ -690,8 +686,8 @@ declare class AdHocFiltersVariable extends SceneObjectBase<AdHocFiltersVariableS
690
686
  constructor(state: Partial<AdHocFiltersVariableState>);
691
687
  setState(update: Partial<AdHocFiltersVariableState>): void;
692
688
  getValue(): VariableValue | undefined;
693
- _updateFilter(filter: AdHocFilterWithLabels, prop: keyof AdHocFilterWithLabels, { value, label }: SelectableValue<string | undefined | null>): void;
694
- _removeFilter(filter: AdHocFilterWithLabels): void;
689
+ _updateFilter(filter: AdHocVariableFilter, prop: keyof AdHocVariableFilter, value: string | undefined | null): void;
690
+ _removeFilter(filter: AdHocVariableFilter): void;
695
691
  /**
696
692
  * Get possible keys given current filters. Do not call from plugins directly
697
693
  */
@@ -699,7 +695,7 @@ declare class AdHocFiltersVariable extends SceneObjectBase<AdHocFiltersVariableS
699
695
  /**
700
696
  * Get possible key values for a specific key given current filters. Do not call from plugins directly
701
697
  */
702
- _getValuesFor(filter: AdHocFilterWithLabels): Promise<Array<SelectableValue<string>>>;
698
+ _getValuesFor(filter: AdHocVariableFilter): Promise<Array<SelectableValue<string>>>;
703
699
  _addWip(): void;
704
700
  _getOperators(): SelectableValue<string>[];
705
701
  }
package/dist/index.js CHANGED
@@ -2857,6 +2857,7 @@ function VariableValueSelect({ model }) {
2857
2857
  tabSelectsValue: false,
2858
2858
  onInputChange,
2859
2859
  options: model.getOptionsForSelect(),
2860
+ "data-testid": e2eSelectors.selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownValueLinkTexts(`${value}`),
2860
2861
  onChange: (newValue) => {
2861
2862
  model.changeValueTo(newValue.value, newValue.label);
2862
2863
  }
@@ -2893,6 +2894,7 @@ function VariableValueSelectMulti({ model }) {
2893
2894
  onBlur: () => {
2894
2895
  model.changeValueTo(uncommittedValue);
2895
2896
  },
2897
+ "data-testid": e2eSelectors.selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownValueLinkTexts(`${uncommittedValue}`),
2896
2898
  onChange: (newValue, action) => {
2897
2899
  if (action.action === "clear" && noValueOnClear) {
2898
2900
  model.changeValueTo([]);
@@ -3168,18 +3170,24 @@ var __spreadValues$y = (a, b) => {
3168
3170
  return a;
3169
3171
  };
3170
3172
  var __spreadProps$m = (a, b) => __defProps$m(a, __getOwnPropDescs$m(b));
3171
- function keyLabelToOption(key, label) {
3172
- return key !== "" ? {
3173
- value: key,
3174
- label: label || key
3175
- } : null;
3176
- }
3177
3173
  function AdHocFilterRenderer({ filter, model }) {
3178
3174
  var _a, _b;
3179
3175
  const styles = ui.useStyles2(getStyles$7);
3180
3176
  const [state, setState] = React.useState({});
3181
- const keyValue = keyLabelToOption(filter.key, filter.keyLabel);
3182
- const valueValue = keyLabelToOption(filter.value, filter.valueLabel);
3177
+ const keyValue = React.useMemo(() => {
3178
+ if (filter.key !== "") {
3179
+ if (model.state.defaultKeys) {
3180
+ const matchingDefaultKey = model.state.defaultKeys.find((option) => option.value === filter.key);
3181
+ if (matchingDefaultKey) {
3182
+ return toSelectableValue(matchingDefaultKey);
3183
+ }
3184
+ } else {
3185
+ return data.toOption(filter.key);
3186
+ }
3187
+ }
3188
+ return null;
3189
+ }, [filter.key, model.state.defaultKeys]);
3190
+ const valueValue = filter.value !== "" ? data.toOption(filter.value) : null;
3183
3191
  const valueSelect = /* @__PURE__ */ React__default["default"].createElement(ui.Select, {
3184
3192
  allowCustomValue: true,
3185
3193
  formatCreateLabel: (inputValue) => `Use custom value: ${inputValue}`,
@@ -3189,7 +3197,7 @@ function AdHocFilterRenderer({ filter, model }) {
3189
3197
  value: valueValue,
3190
3198
  placeholder: "Select value",
3191
3199
  options: state.values,
3192
- onChange: (v) => model._updateFilter(filter, "value", v),
3200
+ onChange: (v) => model._updateFilter(filter, "value", v.value),
3193
3201
  isOpen: state.isValuesOpen,
3194
3202
  isLoading: state.isValuesLoading,
3195
3203
  autoFocus: filter.key !== "" && filter.value === "",
@@ -3211,7 +3219,7 @@ function AdHocFilterRenderer({ filter, model }) {
3211
3219
  value: keyValue,
3212
3220
  placeholder: "Select label",
3213
3221
  options: state.keys,
3214
- onChange: (v) => model._updateFilter(filter, "key", v),
3222
+ onChange: (v) => model._updateFilter(filter, "key", v.value),
3215
3223
  autoFocus: filter.key === "",
3216
3224
  isOpen: state.isKeysOpen,
3217
3225
  isLoading: state.isKeysLoading,
@@ -3258,7 +3266,7 @@ function AdHocFilterRenderer({ filter, model }) {
3258
3266
  disabled: model.state.readOnly,
3259
3267
  options: model._getOperators(),
3260
3268
  width: "auto",
3261
- onChange: (v) => model._updateFilter(filter, "operator", v)
3269
+ onChange: (v) => model._updateFilter(filter, "operator", v.value)
3262
3270
  }), valueSelect, /* @__PURE__ */ React__default["default"].createElement(ui.Button, {
3263
3271
  variant: "secondary",
3264
3272
  "aria-label": "Remove filter",
@@ -3345,7 +3353,7 @@ class AdHocFiltersVariableUrlSyncHandler {
3345
3353
  if (filters.length === 0) {
3346
3354
  return { [this.getKey()]: [""] };
3347
3355
  }
3348
- const value = filters.map((filter) => toArray(filter).map(escapePipeDelimiters).join("|"));
3356
+ const value = filters.map((filter) => toArray(filter).map(escapeDelimiter).join("|"));
3349
3357
  return { [this.getKey()]: value };
3350
3358
  }
3351
3359
  updateFromUrl(values) {
@@ -3365,54 +3373,30 @@ function deserializeUrlToFilters(value) {
3365
3373
  const filter = toFilter(value);
3366
3374
  return filter === null ? [] : [filter];
3367
3375
  }
3368
- function escapePipeDelimiters(value) {
3376
+ function escapeDelimiter(value) {
3369
3377
  if (value === null || value === void 0) {
3370
3378
  return "";
3371
3379
  }
3372
- return value = /\|/g[Symbol.replace](value, "__gfp__");
3380
+ return /\|/g[Symbol.replace](value, "__gfp__");
3373
3381
  }
3374
- function escapeCommaDelimiters(value) {
3382
+ function unescapeDelimiter(value) {
3375
3383
  if (value === null || value === void 0) {
3376
3384
  return "";
3377
3385
  }
3378
- return /,/g[Symbol.replace](value, "__gfc__");
3379
- }
3380
- function unescapeDelimiters(value) {
3381
- if (value === null || value === void 0) {
3382
- return "";
3383
- }
3384
- value = /__gfp__/g[Symbol.replace](value, "|");
3385
- value = /__gfc__/g[Symbol.replace](value, ",");
3386
- return value;
3386
+ return /__gfp__/g[Symbol.replace](value, "|");
3387
3387
  }
3388
3388
  function toArray(filter) {
3389
- return [
3390
- toCommaDelimitedString(filter.key, filter.keyLabel),
3391
- filter.operator,
3392
- toCommaDelimitedString(filter.value, filter.valueLabel)
3393
- ];
3394
- }
3395
- function toCommaDelimitedString(key, label) {
3396
- if (!label || key === label) {
3397
- return escapeCommaDelimiters(key);
3398
- }
3399
- return [key, label].map(escapeCommaDelimiters).join(",");
3389
+ return [filter.key, filter.operator, filter.value];
3400
3390
  }
3401
- function toFilter(urlValue) {
3402
- if (typeof urlValue !== "string" || urlValue.length === 0) {
3391
+ function toFilter(value) {
3392
+ if (typeof value !== "string" || value.length === 0) {
3403
3393
  return null;
3404
3394
  }
3405
- const [key, keyLabel, operator, _operatorLabel, value, valueLabel] = urlValue.split("|").reduce((acc, v) => {
3406
- const [key2, label] = v.split(",");
3407
- acc.push(key2, label != null ? label : key2);
3408
- return acc;
3409
- }, []).map(unescapeDelimiters);
3395
+ const parts = value.split("|").map(unescapeDelimiter);
3410
3396
  return {
3411
- key,
3412
- keyLabel,
3413
- operator,
3414
- value,
3415
- valueLabel,
3397
+ key: parts[0],
3398
+ operator: parts[1],
3399
+ value: parts[2],
3416
3400
  condition: ""
3417
3401
  };
3418
3402
  }
@@ -3471,23 +3455,22 @@ class AdHocFiltersVariable extends SceneObjectBase {
3471
3455
  getValue() {
3472
3456
  return this.state.filterExpression;
3473
3457
  }
3474
- _updateFilter(filter, prop, { value, label }) {
3458
+ _updateFilter(filter, prop, value) {
3475
3459
  if (value == null) {
3476
3460
  return;
3477
3461
  }
3478
3462
  const { filters, _wip } = this.state;
3479
- const propLabelKey = `${prop}Label`;
3480
3463
  if (filter === _wip) {
3481
3464
  if (prop === "value") {
3482
- this.setState({ filters: [...filters, __spreadProps$l(__spreadValues$x({}, _wip), { [prop]: value, [propLabelKey]: label })], _wip: void 0 });
3465
+ this.setState({ filters: [...filters, __spreadProps$l(__spreadValues$x({}, _wip), { [prop]: value })], _wip: void 0 });
3483
3466
  } else {
3484
- this.setState({ _wip: __spreadProps$l(__spreadValues$x({}, filter), { [prop]: value, [propLabelKey]: label }) });
3467
+ this.setState({ _wip: __spreadProps$l(__spreadValues$x({}, filter), { [prop]: value }) });
3485
3468
  }
3486
3469
  return;
3487
3470
  }
3488
3471
  const updatedFilters = this.state.filters.map((f) => {
3489
3472
  if (f === filter) {
3490
- return __spreadProps$l(__spreadValues$x({}, f), { [prop]: value, [propLabelKey]: label });
3473
+ return __spreadProps$l(__spreadValues$x({}, f), { [prop]: value });
3491
3474
  }
3492
3475
  return f;
3493
3476
  });
@@ -3546,9 +3529,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
3546
3529
  return values.map(toSelectableValue);
3547
3530
  }
3548
3531
  _addWip() {
3549
- this.setState({
3550
- _wip: { key: "", keyLabel: "", value: "", valueLabel: "", operator: "=", condition: "" }
3551
- });
3532
+ this.setState({ _wip: { key: "", value: "", operator: "=", condition: "" } });
3552
3533
  }
3553
3534
  _getOperators() {
3554
3535
  return ["=", "!=", "<", ">", "=~", "!~"].map((value) => ({
@@ -6009,7 +5990,8 @@ function VariableValueSelectWrapper({ variable, layout, showAlways }) {
6009
5990
  }
6010
5991
  if (layout === "vertical") {
6011
5992
  return /* @__PURE__ */ React__default["default"].createElement("div", {
6012
- className: verticalContainer
5993
+ className: verticalContainer,
5994
+ "data-testid": e2eSelectors.selectors.pages.Dashboard.SubMenu.submenuItem
6013
5995
  }, /* @__PURE__ */ React__default["default"].createElement(VariableLabel, {
6014
5996
  variable,
6015
5997
  layout
@@ -6018,7 +6000,8 @@ function VariableValueSelectWrapper({ variable, layout, showAlways }) {
6018
6000
  }));
6019
6001
  }
6020
6002
  return /* @__PURE__ */ React__default["default"].createElement("div", {
6021
- className: containerStyle
6003
+ className: containerStyle,
6004
+ "data-testid": e2eSelectors.selectors.pages.Dashboard.SubMenu.submenuItem
6022
6005
  }, /* @__PURE__ */ React__default["default"].createElement(VariableLabel, {
6023
6006
  variable
6024
6007
  }), /* @__PURE__ */ React__default["default"].createElement(variable.Component, {
@@ -7518,7 +7501,8 @@ function VizPanelMenuRenderer({ model }) {
7518
7501
  childItems: item.subMenu ? renderItems(item.subMenu) : void 0,
7519
7502
  url: item.href,
7520
7503
  onClick: item.onClick,
7521
- shortcut: item.shortcut
7504
+ shortcut: item.shortcut,
7505
+ testId: e2eSelectors.selectors.components.Panels.Panel.menuItems(item.text)
7522
7506
  })
7523
7507
  );
7524
7508
  };
@@ -8144,7 +8128,8 @@ function SceneGridRowRenderer({ model }) {
8144
8128
  }, /* @__PURE__ */ React__default["default"].createElement("button", {
8145
8129
  onClick: model.onCollapseToggle,
8146
8130
  className: styles.rowTitleButton,
8147
- "aria-label": isCollapsed ? "Expand row" : "Collapse row"
8131
+ "aria-label": isCollapsed ? "Expand row" : "Collapse row",
8132
+ "data-testid": e2eSelectors.selectors.components.DashboardRow.title(sceneGraph.interpolate(model, title, void 0, "text"))
8148
8133
  }, isCollapsible && /* @__PURE__ */ React__default["default"].createElement(ui.Icon, {
8149
8134
  name: isCollapsed ? "angle-right" : "angle-down"
8150
8135
  }), /* @__PURE__ */ React__default["default"].createElement("span", {