@grafana/scenes 6.3.2--canary.1073.13788678829.0 → 6.4.0--canary.1062.13788998678.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.js CHANGED
@@ -3972,19 +3972,44 @@ class AdHocFiltersVariableUrlSyncHandler {
3972
3972
  }
3973
3973
  getUrlState() {
3974
3974
  const filters = this._variable.state.filters;
3975
- if (filters.length === 0) {
3975
+ const baseFilters = this._variable.state.baseFilters;
3976
+ let value = [];
3977
+ if (filters.length === 0 && (baseFilters == null ? void 0 : baseFilters.length) === 0) {
3976
3978
  return { [this.getKey()]: [""] };
3977
3979
  }
3978
- const value = filters.filter(isFilterComplete).filter((filter) => !filter.hidden).map((filter) => toArray(filter).map(escapeUrlPipeDelimiters).join("|"));
3979
- return { [this.getKey()]: value };
3980
+ if (filters.length) {
3981
+ value.push(
3982
+ ...filters.filter(isFilterComplete).filter((filter) => !filter.hidden).map((filter) => toArray(filter).map(escapeUrlPipeDelimiters).join("|"))
3983
+ );
3984
+ }
3985
+ if (baseFilters == null ? void 0 : baseFilters.length) {
3986
+ value.push(
3987
+ ...baseFilters == null ? void 0 : baseFilters.filter(isFilterComplete).filter((filter) => !filter.hidden && filter.origin && filter.originalValue).map(
3988
+ (filter) => {
3989
+ var _a, _b;
3990
+ return toArray(filter).map(escapeInjectedFilterUrlDelimiters).join("|").concat(
3991
+ `#${(_b = (_a = filter.originalValue) == null ? void 0 : _a.map(escapeInjectedFilterUrlDelimiters).join("|")) != null ? _b : ""}#${filter.origin}`
3992
+ );
3993
+ }
3994
+ )
3995
+ );
3996
+ }
3997
+ return {
3998
+ [this.getKey()]: value.length ? value : [""]
3999
+ };
3980
4000
  }
3981
4001
  updateFromUrl(values) {
3982
4002
  const urlValue = values[this.getKey()];
3983
4003
  if (urlValue == null) {
3984
4004
  return;
3985
4005
  }
3986
- const filters = deserializeUrlToFilters(urlValue);
3987
- this._variable.setState({ filters });
4006
+ if (urlValue) {
4007
+ const filters = deserializeUrlToFilters(urlValue);
4008
+ this._variable.setState({
4009
+ filters: filters.filter((f) => !f.origin),
4010
+ baseFilters: filters.filter((f) => f.origin)
4011
+ });
4012
+ }
3988
4013
  }
3989
4014
  }
3990
4015
  function deserializeUrlToFilters(value) {
@@ -4009,10 +4034,12 @@ function toArray(filter) {
4009
4034
  return result;
4010
4035
  }
4011
4036
  function toFilter(urlValue) {
4037
+ var _a;
4012
4038
  if (typeof urlValue !== "string" || urlValue.length === 0) {
4013
4039
  return null;
4014
4040
  }
4015
- const [key, keyLabel, operator, _operatorLabel, ...values] = urlValue.split("|").reduce((acc, v) => {
4041
+ const [filter, originalValues, origin] = urlValue.split("#");
4042
+ const [key, keyLabel, operator, _operatorLabel, ...values] = filter.split("|").reduce((acc, v) => {
4016
4043
  const [key2, label] = v.split(",");
4017
4044
  acc.push(key2, label != null ? label : key2);
4018
4045
  return acc;
@@ -4024,9 +4051,14 @@ function toFilter(urlValue) {
4024
4051
  value: values[0],
4025
4052
  values: isMultiValueOperator(operator) ? values.filter((_, index) => index % 2 === 0) : void 0,
4026
4053
  valueLabels: values.filter((_, index) => index % 2 === 1),
4027
- condition: ""
4054
+ condition: "",
4055
+ origin: isFilterOrigin(origin) ? origin : void 0,
4056
+ originalValue: originalValues && originalValues.length ? (_a = originalValues.split("|")) != null ? _a : [originalValues] : void 0
4028
4057
  };
4029
4058
  }
4059
+ function isFilterOrigin(value) {
4060
+ return value === FilterOrigin.Scopes || value === FilterOrigin.Dashboards;
4061
+ }
4030
4062
  function isFilter(filter) {
4031
4063
  return filter !== null && typeof filter.key === "string" && typeof filter.value === "string";
4032
4064
  }
@@ -4874,13 +4906,20 @@ const AdHocCombobox = React.forwardRef(function AdHocCombobox2({ filter, model,
4874
4906
  className: styles.pillWrapper
4875
4907
  }, (filter == null ? void 0 : filter.key) ? /* @__PURE__ */ React__default["default"].createElement("div", {
4876
4908
  className: css.cx(styles.basePill, styles.keyPill)
4877
- }, keyLabel) : null, (filter == null ? void 0 : filter.key) && (filter == null ? void 0 : filter.operator) && filterInputType !== "operator" ? /* @__PURE__ */ React__default["default"].createElement("div", {
4909
+ }, keyLabel) : null, (filter == null ? void 0 : filter.key) && (filter == null ? void 0 : filter.operator) && filterInputType !== "operator" ? /* @__PURE__ */ React__default["default"].createElement("div", __spreadValues$B({
4878
4910
  id: operatorIdentifier,
4879
- className: css.cx(styles.basePill, styles.operatorPill, operatorIdentifier),
4880
- role: "button",
4911
+ className: css.cx(
4912
+ styles.basePill,
4913
+ !filter.origin && styles.operatorPill,
4914
+ filter.origin && styles.keyPill,
4915
+ operatorIdentifier
4916
+ ),
4881
4917
  "aria-label": "Edit filter operator",
4882
4918
  tabIndex: 0,
4883
4919
  onClick: (event) => {
4920
+ if (filter.origin) {
4921
+ return;
4922
+ }
4884
4923
  event.stopPropagation();
4885
4924
  setInputValue("");
4886
4925
  switchInputType("operator", setInputType, void 0, refs.domReference.current);
@@ -4892,7 +4931,7 @@ const AdHocCombobox = React.forwardRef(function AdHocCombobox2({ filter, model,
4892
4931
  switchInputType("operator", setInputType, void 0, refs.domReference.current);
4893
4932
  }
4894
4933
  }
4895
- }, filter.operator) : null, /* @__PURE__ */ React__default["default"].createElement("div", {
4934
+ }, !filter.origin && { role: "button" }), filter.operator) : null, /* @__PURE__ */ React__default["default"].createElement("div", {
4896
4935
  ref: multiValuePillWrapperRef
4897
4936
  }), isMultiValueEdit ? filterMultiValues.map((item, i) => /* @__PURE__ */ React__default["default"].createElement(MultiValuePill, {
4898
4937
  key: `${item.value}-${i}`,
@@ -5139,13 +5178,13 @@ function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }) {
5139
5178
  const handleChangeViewMode = React.useCallback(
5140
5179
  (event, shouldFocusOnPillWrapperOverride) => {
5141
5180
  event == null ? void 0 : event.stopPropagation();
5142
- if (readOnly || filter.origin) {
5181
+ if (readOnly) {
5143
5182
  return;
5144
5183
  }
5145
5184
  setShouldFocusOnPillWrapper(shouldFocusOnPillWrapperOverride != null ? shouldFocusOnPillWrapperOverride : !viewMode);
5146
5185
  setViewMode(!viewMode);
5147
5186
  },
5148
- [readOnly, viewMode, filter.origin]
5187
+ [readOnly, viewMode]
5149
5188
  );
5150
5189
  React.useEffect(() => {
5151
5190
  var _a2;
@@ -5209,11 +5248,20 @@ function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }) {
5209
5248
  size: "md",
5210
5249
  className: styles.pillIcon,
5211
5250
  tooltip: `Remove filter with key ${keyLabel}`
5212
- }) : null, filter.origin && /* @__PURE__ */ React__default["default"].createElement(ui.IconButton, {
5251
+ }) : null, filter.origin && !filter.originalValue && /* @__PURE__ */ React__default["default"].createElement(ui.IconButton, {
5213
5252
  name: "info-circle",
5214
5253
  size: "md",
5215
5254
  className: styles.pillIcon,
5216
5255
  tooltip: `This is a ${filter.origin} injected filter`
5256
+ }), filter.origin && filter.originalValue && /* @__PURE__ */ React__default["default"].createElement(ui.IconButton, {
5257
+ onClick: (e) => {
5258
+ e.stopPropagation();
5259
+ model.restoreOriginalFilter(filter);
5260
+ },
5261
+ name: "history",
5262
+ size: "md",
5263
+ className: styles.pillIcon,
5264
+ tooltip: `Restore filter to its original value`
5217
5265
  }));
5218
5266
  }
5219
5267
  return /* @__PURE__ */ React__default["default"].createElement(AdHocCombobox, {
@@ -5347,73 +5395,6 @@ const getStyles$a = (theme) => ({
5347
5395
  })
5348
5396
  });
5349
5397
 
5350
- const reverseScopeFilterOperatorMap = Object.fromEntries(
5351
- Object.entries(data.scopeFilterOperatorMap).map(([symbol, operator]) => [operator, symbol])
5352
- );
5353
- function isEqualityOrMultiOperator(value) {
5354
- const operators = /* @__PURE__ */ new Set(["equals", "not-equals", "one-of", "not-one-of"]);
5355
- return operators.has(value);
5356
- }
5357
- function getAdHocFiltersFromScopes(scopes) {
5358
- const formattedFilters = /* @__PURE__ */ new Map();
5359
- const duplicatedFilters = [];
5360
- const allFilters = scopes.flatMap((scope) => scope.spec.filters);
5361
- for (const filter of allFilters) {
5362
- processFilter(formattedFilters, duplicatedFilters, filter);
5363
- }
5364
- return [...formattedFilters.values(), ...duplicatedFilters];
5365
- }
5366
- function processFilter(formattedFilters, duplicatedFilters, filter) {
5367
- var _a, _b;
5368
- const existingFilter = formattedFilters.get(filter.key);
5369
- if (existingFilter && canValueBeMerged(existingFilter.operator, filter.operator)) {
5370
- mergeFilterValues(existingFilter, filter);
5371
- } else if (!existingFilter) {
5372
- formattedFilters.set(filter.key, {
5373
- key: filter.key,
5374
- operator: reverseScopeFilterOperatorMap[filter.operator],
5375
- value: filter.value,
5376
- values: (_a = filter.values) != null ? _a : [filter.value],
5377
- origin: FilterOrigin.Scopes
5378
- });
5379
- } else {
5380
- duplicatedFilters.push({
5381
- key: filter.key,
5382
- operator: reverseScopeFilterOperatorMap[filter.operator],
5383
- value: filter.value,
5384
- values: (_b = filter.values) != null ? _b : [filter.value],
5385
- origin: FilterOrigin.Scopes
5386
- });
5387
- }
5388
- }
5389
- function mergeFilterValues(adHocFilter, filter) {
5390
- var _a, _b, _c, _d;
5391
- const values = (_a = filter.values) != null ? _a : [filter.value];
5392
- for (const value of values) {
5393
- if (!((_b = adHocFilter.values) == null ? void 0 : _b.includes(value))) {
5394
- (_c = adHocFilter.values) == null ? void 0 : _c.push(value);
5395
- }
5396
- }
5397
- if (((_d = adHocFilter.values) == null ? void 0 : _d.length) === 1) {
5398
- return;
5399
- }
5400
- if (filter.operator === "equals" && adHocFilter.operator === reverseScopeFilterOperatorMap["equals"]) {
5401
- adHocFilter.operator = reverseScopeFilterOperatorMap["one-of"];
5402
- } else if (filter.operator === "not-equals" && adHocFilter.operator === reverseScopeFilterOperatorMap["not-equals"]) {
5403
- adHocFilter.operator = reverseScopeFilterOperatorMap["not-one-of"];
5404
- }
5405
- }
5406
- function canValueBeMerged(adHocFilterOperator, filterOperator) {
5407
- const scopeConvertedOperator = data.scopeFilterOperatorMap[adHocFilterOperator];
5408
- if (!isEqualityOrMultiOperator(scopeConvertedOperator) || !isEqualityOrMultiOperator(filterOperator)) {
5409
- return false;
5410
- }
5411
- if (scopeConvertedOperator.includes("not") && !filterOperator.includes("not") || !scopeConvertedOperator.includes("not") && filterOperator.includes("not")) {
5412
- return false;
5413
- }
5414
- return true;
5415
- }
5416
-
5417
5398
  var __defProp$z = Object.defineProperty;
5418
5399
  var __defProps$n = Object.defineProperties;
5419
5400
  var __getOwnPropDescs$n = Object.getOwnPropertyDescriptors;
@@ -5478,39 +5459,23 @@ const OPERATORS = [
5478
5459
  ];
5479
5460
  class AdHocFiltersVariable extends SceneObjectBase {
5480
5461
  constructor(state) {
5481
- var _a, _b;
5462
+ var _a, _b, _c, _d, _e;
5482
5463
  super(__spreadValues$z({
5483
5464
  type: "adhoc",
5484
5465
  name: (_a = state.name) != null ? _a : "Filters",
5485
5466
  filters: [],
5486
5467
  datasource: null,
5487
5468
  applyMode: "auto",
5488
- filterExpression: (_b = state.filterExpression) != null ? _b : renderExpression(state.expressionBuilder, state.filters)
5469
+ filterExpression: (_e = state.filterExpression) != null ? _e : renderExpression(state.expressionBuilder, [
5470
+ ...(_c = (_b = state.baseFilters) == null ? void 0 : _b.filter((filter) => filter.origin)) != null ? _c : [],
5471
+ ...(_d = state.filters) != null ? _d : []
5472
+ ])
5489
5473
  }, state));
5490
5474
  this._scopedVars = { __sceneObject: wrapInSafeSerializableSceneObject(this) };
5491
5475
  this._dataSourceSrv = runtime.getDataSourceSrv();
5492
5476
  this._urlSync = new AdHocFiltersVariableUrlSyncHandler(this);
5493
5477
  this._activationHandler = () => {
5494
- var _a, _b;
5495
5478
  this._scopesBridge = sceneGraph.getScopesBridge(this);
5496
- const scopes = (_a = this._scopesBridge) == null ? void 0 : _a.getValue();
5497
- if (scopes) {
5498
- this._updateScopesFilters(scopes);
5499
- }
5500
- const sub = (_b = this._scopesBridge) == null ? void 0 : _b.subscribeToValue((n, _) => {
5501
- this._updateScopesFilters(n);
5502
- });
5503
- return () => {
5504
- sub == null ? void 0 : sub.unsubscribe();
5505
- };
5506
- };
5507
- this._updateScopesFilters = (scopes) => {
5508
- var _a, _b;
5509
- const newFilters = [
5510
- ...(_b = (_a = this.state.baseFilters) == null ? void 0 : _a.filter((f) => f.origin && f.origin !== "scopes" /* Scopes */)) != null ? _b : [],
5511
- ...getAdHocFiltersFromScopes(scopes)
5512
- ];
5513
- this.setState({ baseFilters: newFilters });
5514
5479
  };
5515
5480
  if (this.state.applyMode === "auto") {
5516
5481
  patchGetAdhocFilters(this);
@@ -5518,9 +5483,15 @@ class AdHocFiltersVariable extends SceneObjectBase {
5518
5483
  this.addActivationHandler(this._activationHandler);
5519
5484
  }
5520
5485
  setState(update) {
5486
+ var _a, _b, _c;
5521
5487
  let filterExpressionChanged = false;
5522
- if (update.filters && update.filters !== this.state.filters && !update.filterExpression) {
5523
- update.filterExpression = renderExpression(this.state.expressionBuilder, update.filters);
5488
+ if ((update.filters && update.filters !== this.state.filters || update.baseFilters && update.baseFilters !== this.state.baseFilters) && !update.filterExpression) {
5489
+ const filters = (_a = update.filters) != null ? _a : this.state.filters;
5490
+ const baseFilters = (_b = update.baseFilters) != null ? _b : this.state.baseFilters;
5491
+ update.filterExpression = renderExpression(this.state.expressionBuilder, [
5492
+ ...(_c = baseFilters == null ? void 0 : baseFilters.filter((filter) => filter.origin)) != null ? _c : [],
5493
+ ...filters != null ? filters : []
5494
+ ]);
5524
5495
  filterExpressionChanged = update.filterExpression !== this.state.filterExpression;
5525
5496
  }
5526
5497
  super.setState(update);
@@ -5529,10 +5500,14 @@ class AdHocFiltersVariable extends SceneObjectBase {
5529
5500
  }
5530
5501
  }
5531
5502
  updateFilters(filters, options) {
5503
+ var _a, _b;
5532
5504
  let filterExpressionChanged = false;
5533
5505
  let filterExpression = void 0;
5534
5506
  if (filters && filters !== this.state.filters) {
5535
- filterExpression = renderExpression(this.state.expressionBuilder, filters);
5507
+ filterExpression = renderExpression(this.state.expressionBuilder, [
5508
+ ...(_b = (_a = this.state.baseFilters) == null ? void 0 : _a.filter((filter) => filter.origin)) != null ? _b : [],
5509
+ ...filters
5510
+ ]);
5536
5511
  filterExpressionChanged = filterExpression !== this.state.filterExpression;
5537
5512
  }
5538
5513
  super.setState({
@@ -5543,11 +5518,40 @@ class AdHocFiltersVariable extends SceneObjectBase {
5543
5518
  this.publishEvent(new SceneVariableValueChangedEvent(this), true);
5544
5519
  }
5545
5520
  }
5521
+ restoreOriginalFilter(filter) {
5522
+ var _a;
5523
+ const original = {
5524
+ originalValue: void 0
5525
+ };
5526
+ if ((_a = filter.originalValue) == null ? void 0 : _a.length) {
5527
+ original.value = filter.originalValue[0];
5528
+ original.values = filter.originalValue;
5529
+ original.valueLabels = filter.originalValue;
5530
+ }
5531
+ this._updateFilter(filter, original);
5532
+ }
5546
5533
  getValue() {
5547
5534
  return this.state.filterExpression;
5548
5535
  }
5549
5536
  _updateFilter(filter, update) {
5550
- const { filters, _wip } = this.state;
5537
+ var _a;
5538
+ const { baseFilters, filters, _wip } = this.state;
5539
+ if (filter.origin) {
5540
+ const currentValues = filter.values ? filter.values : [filter.value];
5541
+ const updateValues = update.values || (update.value ? [update.value] : void 0);
5542
+ const originalValueOverride = update.hasOwnProperty("originalValue");
5543
+ if (!originalValueOverride && updateValues && !filter.originalValue && !lodash.isEqual(currentValues, updateValues)) {
5544
+ update.originalValue = currentValues;
5545
+ }
5546
+ if (!originalValueOverride && lodash.isEqual(updateValues, filter.originalValue)) {
5547
+ update.originalValue = void 0;
5548
+ }
5549
+ const updatedBaseFilters = (_a = baseFilters == null ? void 0 : baseFilters.map((f) => {
5550
+ return f === filter ? __spreadValues$z(__spreadValues$z({}, f), update) : f;
5551
+ })) != null ? _a : [];
5552
+ this.setState({ baseFilters: updatedBaseFilters });
5553
+ return;
5554
+ }
5551
5555
  if (filter === _wip) {
5552
5556
  if ("value" in update && update["value"] !== "") {
5553
5557
  this.setState({ filters: [...filters, __spreadValues$z(__spreadValues$z({}, _wip), update)], _wip: void 0 });
@@ -5634,7 +5638,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
5634
5638
  return keys.map(toSelectableValue);
5635
5639
  }
5636
5640
  async _getValuesFor(filter) {
5637
- var _a, _b, _c, _d;
5641
+ var _a, _b, _c, _d, _e;
5638
5642
  const override = await ((_b = (_a = this.state).getTagValuesProvider) == null ? void 0 : _b.call(_a, this, filter));
5639
5643
  if (override && override.replace) {
5640
5644
  return dataFromResponse(override.values).map(toSelectableValue);
@@ -5643,15 +5647,28 @@ class AdHocFiltersVariable extends SceneObjectBase {
5643
5647
  if (!ds || !ds.getTagValues) {
5644
5648
  return [];
5645
5649
  }
5646
- const otherFilters = this.state.filters.filter((f) => f.key !== filter.key).concat((_c = this.state.baseFilters) != null ? _c : []);
5650
+ const filteredBaseFilters = (_d = (_c = this.state.baseFilters) == null ? void 0 : _c.filter((f) => f.origin && f.key !== filter.key)) != null ? _d : [];
5651
+ const otherFilters = this.state.filters.filter((f) => f.key !== filter.key).concat(filteredBaseFilters);
5647
5652
  const timeRange = sceneGraph.getTimeRange(this).state.value;
5648
5653
  const queries = this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : void 0;
5654
+ const scopes = (_e = this._scopesBridge) == null ? void 0 : _e.getValue().map((scope) => {
5655
+ return __spreadProps$n(__spreadValues$z({}, scope), {
5656
+ spec: __spreadProps$n(__spreadValues$z({}, scope.spec), {
5657
+ filters: scope.spec.filters.filter(
5658
+ (f) => {
5659
+ var _a2;
5660
+ return !((_a2 = this.state.baseFilters) == null ? void 0 : _a2.find((bf) => bf.key === f.key && "scopes" /* Scopes */));
5661
+ }
5662
+ )
5663
+ })
5664
+ });
5665
+ });
5649
5666
  const response = await ds.getTagValues(__spreadValues$z({
5650
5667
  key: filter.key,
5651
5668
  filters: otherFilters,
5652
5669
  timeRange,
5653
5670
  queries,
5654
- scopes: (_d = this._scopesBridge) == null ? void 0 : _d.getValue()
5671
+ scopes
5655
5672
  }, getEnrichedFiltersRequest(this)));
5656
5673
  if (responseHasError(response)) {
5657
5674
  this.setState({ error: response.error.message });
@@ -6370,6 +6387,15 @@ function escapeUrlCommaDelimiters(value) {
6370
6387
  }
6371
6388
  return /,/g[Symbol.replace](value, "__gfc__");
6372
6389
  }
6390
+ function escapeUrlHashDelimiters(value) {
6391
+ if (value === null || value === void 0) {
6392
+ return "";
6393
+ }
6394
+ return /#/g[Symbol.replace](value, "__gfh__");
6395
+ }
6396
+ function escapeInjectedFilterUrlDelimiters(value) {
6397
+ return escapeUrlHashDelimiters(escapeUrlPipeDelimiters(value));
6398
+ }
6373
6399
  function escapeURLDelimiters(value) {
6374
6400
  return escapeUrlCommaDelimiters(escapeUrlPipeDelimiters(value));
6375
6401
  }
@@ -6379,6 +6405,7 @@ function unescapeUrlDelimiters(value) {
6379
6405
  }
6380
6406
  value = /__gfp__/g[Symbol.replace](value, "|");
6381
6407
  value = /__gfc__/g[Symbol.replace](value, ",");
6408
+ value = /__gfh__/g[Symbol.replace](value, "#");
6382
6409
  return value;
6383
6410
  }
6384
6411
  function toUrlCommaDelimitedString(key, label) {