@grafana/scenes 6.4.1 → 6.5.0--canary.1062.13950464645.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
  }
@@ -4688,6 +4720,9 @@ const AdHocCombobox = React.forwardRef(function AdHocCombobox2({ filter, model,
4688
4720
  return;
4689
4721
  }
4690
4722
  }
4723
+ if (filter == null ? void 0 : filter.origin) {
4724
+ return;
4725
+ }
4691
4726
  setInputType("operator");
4692
4727
  return;
4693
4728
  }
@@ -4874,25 +4909,36 @@ const AdHocCombobox = React.forwardRef(function AdHocCombobox2({ filter, model,
4874
4909
  className: styles.pillWrapper
4875
4910
  }, (filter == null ? void 0 : filter.key) ? /* @__PURE__ */ React__default["default"].createElement("div", {
4876
4911
  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", {
4912
+ }, 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
4913
  id: operatorIdentifier,
4879
- className: css.cx(styles.basePill, styles.operatorPill, operatorIdentifier),
4880
- role: "button",
4914
+ className: css.cx(
4915
+ styles.basePill,
4916
+ !filter.origin && styles.operatorPill,
4917
+ filter.origin && styles.keyPill,
4918
+ operatorIdentifier
4919
+ ),
4881
4920
  "aria-label": "Edit filter operator",
4882
- tabIndex: 0,
4921
+ tabIndex: filter.origin ? -1 : 0,
4883
4922
  onClick: (event) => {
4923
+ if (filter.origin) {
4924
+ handleChangeViewMode == null ? void 0 : handleChangeViewMode();
4925
+ return;
4926
+ }
4884
4927
  event.stopPropagation();
4885
4928
  setInputValue("");
4886
4929
  switchInputType("operator", setInputType, void 0, refs.domReference.current);
4887
4930
  },
4888
4931
  onKeyDown: (event) => {
4932
+ if (filter.origin) {
4933
+ return;
4934
+ }
4889
4935
  handleShiftTabInput(event, hasMultiValueOperator);
4890
4936
  if (event.key === "Enter") {
4891
4937
  setInputValue("");
4892
4938
  switchInputType("operator", setInputType, void 0, refs.domReference.current);
4893
4939
  }
4894
4940
  }
4895
- }, filter.operator) : null, /* @__PURE__ */ React__default["default"].createElement("div", {
4941
+ }, !filter.origin && { role: "button" }), filter.operator) : null, /* @__PURE__ */ React__default["default"].createElement("div", {
4896
4942
  ref: multiValuePillWrapperRef
4897
4943
  }), isMultiValueEdit ? filterMultiValues.map((item, i) => /* @__PURE__ */ React__default["default"].createElement(MultiValuePill, {
4898
4944
  key: `${item.value}-${i}`,
@@ -5139,13 +5185,13 @@ function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }) {
5139
5185
  const handleChangeViewMode = React.useCallback(
5140
5186
  (event, shouldFocusOnPillWrapperOverride) => {
5141
5187
  event == null ? void 0 : event.stopPropagation();
5142
- if (readOnly || filter.origin) {
5188
+ if (readOnly) {
5143
5189
  return;
5144
5190
  }
5145
5191
  setShouldFocusOnPillWrapper(shouldFocusOnPillWrapperOverride != null ? shouldFocusOnPillWrapperOverride : !viewMode);
5146
5192
  setViewMode(!viewMode);
5147
5193
  },
5148
- [readOnly, viewMode, filter.origin]
5194
+ [readOnly, viewMode]
5149
5195
  );
5150
5196
  React.useEffect(() => {
5151
5197
  var _a2;
@@ -5209,11 +5255,20 @@ function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }) {
5209
5255
  size: "md",
5210
5256
  className: styles.pillIcon,
5211
5257
  tooltip: `Remove filter with key ${keyLabel}`
5212
- }) : null, filter.origin && /* @__PURE__ */ React__default["default"].createElement(ui.IconButton, {
5258
+ }) : null, filter.origin && !filter.originalValue && /* @__PURE__ */ React__default["default"].createElement(ui.IconButton, {
5213
5259
  name: "info-circle",
5214
5260
  size: "md",
5215
5261
  className: styles.pillIcon,
5216
5262
  tooltip: `This is a ${filter.origin} injected filter`
5263
+ }), filter.origin && filter.originalValue && /* @__PURE__ */ React__default["default"].createElement(ui.IconButton, {
5264
+ onClick: (e) => {
5265
+ e.stopPropagation();
5266
+ model.restoreOriginalFilter(filter);
5267
+ },
5268
+ name: "history",
5269
+ size: "md",
5270
+ className: styles.pillIcon,
5271
+ tooltip: `Restore filter to its original value`
5217
5272
  }));
5218
5273
  }
5219
5274
  return /* @__PURE__ */ React__default["default"].createElement(AdHocCombobox, {
@@ -5478,14 +5533,17 @@ const OPERATORS = [
5478
5533
  ];
5479
5534
  class AdHocFiltersVariable extends SceneObjectBase {
5480
5535
  constructor(state) {
5481
- var _a, _b;
5536
+ var _a, _b, _c, _d, _e;
5482
5537
  super(__spreadValues$z({
5483
5538
  type: "adhoc",
5484
5539
  name: (_a = state.name) != null ? _a : "Filters",
5485
5540
  filters: [],
5486
5541
  datasource: null,
5487
5542
  applyMode: "auto",
5488
- filterExpression: (_b = state.filterExpression) != null ? _b : renderExpression(state.expressionBuilder, state.filters)
5543
+ filterExpression: (_e = state.filterExpression) != null ? _e : renderExpression(state.expressionBuilder, [
5544
+ ...(_c = (_b = state.baseFilters) == null ? void 0 : _b.filter((filter) => filter.origin)) != null ? _c : [],
5545
+ ...(_d = state.filters) != null ? _d : []
5546
+ ])
5489
5547
  }, state));
5490
5548
  this._scopedVars = { __sceneObject: wrapInSafeSerializableSceneObject(this) };
5491
5549
  this._dataSourceSrv = runtime.getDataSourceSrv();
@@ -5498,18 +5556,44 @@ class AdHocFiltersVariable extends SceneObjectBase {
5498
5556
  this._updateScopesFilters(scopes);
5499
5557
  }
5500
5558
  const sub = (_b = this._scopesBridge) == null ? void 0 : _b.subscribeToValue((n, _) => {
5501
- this._updateScopesFilters(n);
5559
+ var _a2;
5560
+ this._updateScopesFilters(n, (_a2 = this._scopesBridge) == null ? void 0 : _a2.isLoading());
5502
5561
  });
5503
5562
  return () => {
5504
5563
  sub == null ? void 0 : sub.unsubscribe();
5505
5564
  };
5506
5565
  };
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
- ];
5566
+ this._updateScopesFilters = (scopes, areScopesLoading) => {
5567
+ var _a;
5568
+ const scopeFilters = getAdHocFiltersFromScopes(scopes);
5569
+ if (!scopeFilters.length) {
5570
+ this._overwriteScopes = areScopesLoading;
5571
+ return;
5572
+ }
5573
+ let finalFilters = scopeFilters;
5574
+ const scopeInjectedFilters = [];
5575
+ const remainingFilters = [];
5576
+ (_a = this.state.baseFilters) == null ? void 0 : _a.forEach((filter) => {
5577
+ if (filter.origin === "scopes" /* Scopes */) {
5578
+ scopeInjectedFilters.push(filter);
5579
+ } else {
5580
+ remainingFilters.push(filter);
5581
+ }
5582
+ });
5583
+ if (!this._overwriteScopes) {
5584
+ const editedScopeFilters = scopeInjectedFilters.filter((filter) => {
5585
+ var _a2;
5586
+ return (_a2 = filter.originalValue) == null ? void 0 : _a2.length;
5587
+ });
5588
+ const editedScopeFilterKeys = editedScopeFilters.map((filter) => filter.key);
5589
+ const scopeFilterKeys = scopeFilters.map((filter) => filter.key);
5590
+ finalFilters = [
5591
+ ...editedScopeFilters.filter((filter) => scopeFilterKeys.includes(filter.key)),
5592
+ ...scopeFilters.filter((filter) => !editedScopeFilterKeys.includes(filter.key))
5593
+ ];
5594
+ this._overwriteScopes = false;
5595
+ }
5596
+ const newFilters = [...remainingFilters, ...finalFilters];
5513
5597
  this.setState({ baseFilters: newFilters });
5514
5598
  };
5515
5599
  if (this.state.applyMode === "auto") {
@@ -5518,9 +5602,15 @@ class AdHocFiltersVariable extends SceneObjectBase {
5518
5602
  this.addActivationHandler(this._activationHandler);
5519
5603
  }
5520
5604
  setState(update) {
5605
+ var _a, _b, _c;
5521
5606
  let filterExpressionChanged = false;
5522
- if (update.filters && update.filters !== this.state.filters && !update.filterExpression) {
5523
- update.filterExpression = renderExpression(this.state.expressionBuilder, update.filters);
5607
+ if ((update.filters && update.filters !== this.state.filters || update.baseFilters && update.baseFilters !== this.state.baseFilters) && !update.filterExpression) {
5608
+ const filters = (_a = update.filters) != null ? _a : this.state.filters;
5609
+ const baseFilters = (_b = update.baseFilters) != null ? _b : this.state.baseFilters;
5610
+ update.filterExpression = renderExpression(this.state.expressionBuilder, [
5611
+ ...(_c = baseFilters == null ? void 0 : baseFilters.filter((filter) => filter.origin)) != null ? _c : [],
5612
+ ...filters != null ? filters : []
5613
+ ]);
5524
5614
  filterExpressionChanged = update.filterExpression !== this.state.filterExpression;
5525
5615
  }
5526
5616
  super.setState(update);
@@ -5529,10 +5619,14 @@ class AdHocFiltersVariable extends SceneObjectBase {
5529
5619
  }
5530
5620
  }
5531
5621
  updateFilters(filters, options) {
5622
+ var _a, _b;
5532
5623
  let filterExpressionChanged = false;
5533
5624
  let filterExpression = void 0;
5534
5625
  if (filters && filters !== this.state.filters) {
5535
- filterExpression = renderExpression(this.state.expressionBuilder, filters);
5626
+ filterExpression = renderExpression(this.state.expressionBuilder, [
5627
+ ...(_b = (_a = this.state.baseFilters) == null ? void 0 : _a.filter((filter) => filter.origin)) != null ? _b : [],
5628
+ ...filters
5629
+ ]);
5536
5630
  filterExpressionChanged = filterExpression !== this.state.filterExpression;
5537
5631
  }
5538
5632
  super.setState({
@@ -5543,11 +5637,40 @@ class AdHocFiltersVariable extends SceneObjectBase {
5543
5637
  this.publishEvent(new SceneVariableValueChangedEvent(this), true);
5544
5638
  }
5545
5639
  }
5640
+ restoreOriginalFilter(filter) {
5641
+ var _a;
5642
+ const original = {
5643
+ originalValue: void 0
5644
+ };
5645
+ if ((_a = filter.originalValue) == null ? void 0 : _a.length) {
5646
+ original.value = filter.originalValue[0];
5647
+ original.values = filter.originalValue;
5648
+ original.valueLabels = filter.originalValue;
5649
+ }
5650
+ this._updateFilter(filter, original);
5651
+ }
5546
5652
  getValue() {
5547
5653
  return this.state.filterExpression;
5548
5654
  }
5549
5655
  _updateFilter(filter, update) {
5550
- const { filters, _wip } = this.state;
5656
+ var _a;
5657
+ const { baseFilters, filters, _wip } = this.state;
5658
+ if (filter.origin) {
5659
+ const currentValues = filter.values ? filter.values : [filter.value];
5660
+ const updateValues = update.values || (update.value ? [update.value] : void 0);
5661
+ const originalValueOverride = update.hasOwnProperty("originalValue");
5662
+ if (!originalValueOverride && updateValues && !filter.originalValue && !lodash.isEqual(currentValues, updateValues)) {
5663
+ update.originalValue = currentValues;
5664
+ }
5665
+ if (!originalValueOverride && lodash.isEqual(updateValues, filter.originalValue)) {
5666
+ update.originalValue = void 0;
5667
+ }
5668
+ const updatedBaseFilters = (_a = baseFilters == null ? void 0 : baseFilters.map((f) => {
5669
+ return f === filter ? __spreadValues$z(__spreadValues$z({}, f), update) : f;
5670
+ })) != null ? _a : [];
5671
+ this.setState({ baseFilters: updatedBaseFilters });
5672
+ return;
5673
+ }
5551
5674
  if (filter === _wip) {
5552
5675
  if ("value" in update && update["value"] !== "") {
5553
5676
  this.setState({ filters: [...filters, __spreadValues$z(__spreadValues$z({}, _wip), update)], _wip: void 0 });
@@ -5575,6 +5698,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
5575
5698
  }
5576
5699
  }
5577
5700
  _handleComboboxBackspace(filter) {
5701
+ var _a;
5578
5702
  if (this.state.filters.length) {
5579
5703
  let filterToForceIndex = this.state.filters.length - 1;
5580
5704
  if (filter !== this.state._wip) {
@@ -5596,6 +5720,27 @@ class AdHocFiltersVariable extends SceneObjectBase {
5596
5720
  return [...acc, f];
5597
5721
  }, [])
5598
5722
  });
5723
+ } else if ((_a = this.state.baseFilters) == null ? void 0 : _a.length) {
5724
+ let filterToForceIndex = this.state.baseFilters.length - 1;
5725
+ if (filter !== this.state._wip) {
5726
+ filterToForceIndex = -1;
5727
+ }
5728
+ this.setState({
5729
+ baseFilters: this.state.baseFilters.reduce((acc, f, index) => {
5730
+ if (index === filterToForceIndex) {
5731
+ return [
5732
+ ...acc,
5733
+ __spreadProps$n(__spreadValues$z({}, f), {
5734
+ forceEdit: true
5735
+ })
5736
+ ];
5737
+ }
5738
+ if (f === filter) {
5739
+ return acc;
5740
+ }
5741
+ return [...acc, f];
5742
+ }, [])
5743
+ });
5599
5744
  }
5600
5745
  }
5601
5746
  async _getKeys(currentKey) {
@@ -5634,7 +5779,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
5634
5779
  return keys.map(toSelectableValue);
5635
5780
  }
5636
5781
  async _getValuesFor(filter) {
5637
- var _a, _b, _c, _d;
5782
+ var _a, _b, _c, _d, _e;
5638
5783
  const override = await ((_b = (_a = this.state).getTagValuesProvider) == null ? void 0 : _b.call(_a, this, filter));
5639
5784
  if (override && override.replace) {
5640
5785
  return dataFromResponse(override.values).map(toSelectableValue);
@@ -5643,15 +5788,26 @@ class AdHocFiltersVariable extends SceneObjectBase {
5643
5788
  if (!ds || !ds.getTagValues) {
5644
5789
  return [];
5645
5790
  }
5646
- const otherFilters = this.state.filters.filter((f) => f.key !== filter.key).concat((_c = this.state.baseFilters) != null ? _c : []);
5791
+ const filteredBaseFilters = (_d = (_c = this.state.baseFilters) == null ? void 0 : _c.filter((f) => f.origin && f.key !== filter.key)) != null ? _d : [];
5792
+ const otherFilters = this.state.filters.filter((f) => f.key !== filter.key).concat(filteredBaseFilters);
5647
5793
  const timeRange = sceneGraph.getTimeRange(this).state.value;
5648
5794
  const queries = this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : void 0;
5795
+ let scopes = (_e = this._scopesBridge) == null ? void 0 : _e.getValue();
5796
+ if (filter.origin === "scopes" /* Scopes */) {
5797
+ scopes = scopes == null ? void 0 : scopes.map((scope) => {
5798
+ return __spreadProps$n(__spreadValues$z({}, scope), {
5799
+ spec: __spreadProps$n(__spreadValues$z({}, scope.spec), {
5800
+ filters: scope.spec.filters.filter((f) => f.key !== filter.key)
5801
+ })
5802
+ });
5803
+ });
5804
+ }
5649
5805
  const response = await ds.getTagValues(__spreadValues$z({
5650
5806
  key: filter.key,
5651
5807
  filters: otherFilters,
5652
5808
  timeRange,
5653
5809
  queries,
5654
- scopes: (_d = this._scopesBridge) == null ? void 0 : _d.getValue()
5810
+ scopes
5655
5811
  }, getEnrichedFiltersRequest(this)));
5656
5812
  if (responseHasError(response)) {
5657
5813
  this.setState({ error: response.error.message });
@@ -6370,6 +6526,15 @@ function escapeUrlCommaDelimiters(value) {
6370
6526
  }
6371
6527
  return /,/g[Symbol.replace](value, "__gfc__");
6372
6528
  }
6529
+ function escapeUrlHashDelimiters(value) {
6530
+ if (value === null || value === void 0) {
6531
+ return "";
6532
+ }
6533
+ return /#/g[Symbol.replace](value, "__gfh__");
6534
+ }
6535
+ function escapeInjectedFilterUrlDelimiters(value) {
6536
+ return escapeUrlHashDelimiters(escapeUrlPipeDelimiters(value));
6537
+ }
6373
6538
  function escapeURLDelimiters(value) {
6374
6539
  return escapeUrlCommaDelimiters(escapeUrlPipeDelimiters(value));
6375
6540
  }
@@ -6379,6 +6544,7 @@ function unescapeUrlDelimiters(value) {
6379
6544
  }
6380
6545
  value = /__gfp__/g[Symbol.replace](value, "|");
6381
6546
  value = /__gfc__/g[Symbol.replace](value, ",");
6547
+ value = /__gfh__/g[Symbol.replace](value, "#");
6382
6548
  return value;
6383
6549
  }
6384
6550
  function toUrlCommaDelimitedString(key, label) {