@grafana/scenes 6.3.0 → 6.4.0--canary.1062.13769817941.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
@@ -3971,19 +3971,44 @@ class AdHocFiltersVariableUrlSyncHandler {
3971
3971
  }
3972
3972
  getUrlState() {
3973
3973
  const filters = this._variable.state.filters;
3974
- if (filters.length === 0) {
3974
+ const baseFilters = this._variable.state.baseFilters;
3975
+ let value = [];
3976
+ if (filters.length === 0 && (baseFilters == null ? void 0 : baseFilters.length) === 0) {
3975
3977
  return { [this.getKey()]: [""] };
3976
3978
  }
3977
- const value = filters.filter(isFilterComplete).filter((filter) => !filter.hidden).map((filter) => toArray(filter).map(escapeUrlPipeDelimiters).join("|"));
3978
- return { [this.getKey()]: value };
3979
+ if (filters.length) {
3980
+ value.push(
3981
+ ...filters.filter(isFilterComplete).filter((filter) => !filter.hidden).map((filter) => toArray(filter).map(escapeUrlPipeDelimiters).join("|"))
3982
+ );
3983
+ }
3984
+ if (baseFilters == null ? void 0 : baseFilters.length) {
3985
+ value.push(
3986
+ ...baseFilters == null ? void 0 : baseFilters.filter(isFilterComplete).filter((filter) => !filter.hidden && filter.origin && filter.originalValue).map(
3987
+ (filter) => {
3988
+ var _a, _b;
3989
+ return toArray(filter).map(escapeInjectedFilterUrlDelimiters).join("|").concat(
3990
+ `#${(_b = (_a = filter.originalValue) == null ? void 0 : _a.map(escapeInjectedFilterUrlDelimiters).join("|")) != null ? _b : ""}#${filter.origin}`
3991
+ );
3992
+ }
3993
+ )
3994
+ );
3995
+ }
3996
+ return {
3997
+ [this.getKey()]: value.length ? value : [""]
3998
+ };
3979
3999
  }
3980
4000
  updateFromUrl(values) {
3981
4001
  const urlValue = values[this.getKey()];
3982
4002
  if (urlValue == null) {
3983
4003
  return;
3984
4004
  }
3985
- const filters = deserializeUrlToFilters(urlValue);
3986
- this._variable.setState({ filters });
4005
+ if (urlValue) {
4006
+ const filters = deserializeUrlToFilters(urlValue);
4007
+ this._variable.setState({
4008
+ filters: filters.filter((f) => !f.origin),
4009
+ baseFilters: filters.filter((f) => f.origin)
4010
+ });
4011
+ }
3987
4012
  }
3988
4013
  }
3989
4014
  function deserializeUrlToFilters(value) {
@@ -4008,10 +4033,12 @@ function toArray(filter) {
4008
4033
  return result;
4009
4034
  }
4010
4035
  function toFilter(urlValue) {
4036
+ var _a;
4011
4037
  if (typeof urlValue !== "string" || urlValue.length === 0) {
4012
4038
  return null;
4013
4039
  }
4014
- const [key, keyLabel, operator, _operatorLabel, ...values] = urlValue.split("|").reduce((acc, v) => {
4040
+ const [filter, originalValues, origin] = urlValue.split("#");
4041
+ const [key, keyLabel, operator, _operatorLabel, ...values] = filter.split("|").reduce((acc, v) => {
4015
4042
  const [key2, label] = v.split(",");
4016
4043
  acc.push(key2, label != null ? label : key2);
4017
4044
  return acc;
@@ -4023,9 +4050,14 @@ function toFilter(urlValue) {
4023
4050
  value: values[0],
4024
4051
  values: isMultiValueOperator(operator) ? values.filter((_, index) => index % 2 === 0) : void 0,
4025
4052
  valueLabels: values.filter((_, index) => index % 2 === 1),
4026
- condition: ""
4053
+ condition: "",
4054
+ origin: isFilterOrigin(origin) ? origin : void 0,
4055
+ originalValue: originalValues && originalValues.length ? (_a = originalValues.split("|")) != null ? _a : [originalValues] : void 0
4027
4056
  };
4028
4057
  }
4058
+ function isFilterOrigin(value) {
4059
+ return value === FilterOrigin.Scopes || value === FilterOrigin.Dashboards;
4060
+ }
4029
4061
  function isFilter(filter) {
4030
4062
  return filter !== null && typeof filter.key === "string" && typeof filter.value === "string";
4031
4063
  }
@@ -4873,13 +4905,20 @@ const AdHocCombobox = React.forwardRef(function AdHocCombobox2({ filter, model,
4873
4905
  className: styles.pillWrapper
4874
4906
  }, (filter == null ? void 0 : filter.key) ? /* @__PURE__ */ React__default["default"].createElement("div", {
4875
4907
  className: css.cx(styles.basePill, styles.keyPill)
4876
- }, keyLabel) : null, (filter == null ? void 0 : filter.key) && (filter == null ? void 0 : filter.operator) && filterInputType !== "operator" ? /* @__PURE__ */ React__default["default"].createElement("div", {
4908
+ }, keyLabel) : null, (filter == null ? void 0 : filter.key) && (filter == null ? void 0 : filter.operator) && filterInputType !== "operator" ? /* @__PURE__ */ React__default["default"].createElement("div", __spreadValues$B({
4877
4909
  id: operatorIdentifier,
4878
- className: css.cx(styles.basePill, styles.operatorPill, operatorIdentifier),
4879
- role: "button",
4910
+ className: css.cx(
4911
+ styles.basePill,
4912
+ !filter.origin && styles.operatorPill,
4913
+ filter.origin && styles.keyPill,
4914
+ operatorIdentifier
4915
+ ),
4880
4916
  "aria-label": "Edit filter operator",
4881
4917
  tabIndex: 0,
4882
4918
  onClick: (event) => {
4919
+ if (filter.origin) {
4920
+ return;
4921
+ }
4883
4922
  event.stopPropagation();
4884
4923
  setInputValue("");
4885
4924
  switchInputType("operator", setInputType, void 0, refs.domReference.current);
@@ -4891,7 +4930,7 @@ const AdHocCombobox = React.forwardRef(function AdHocCombobox2({ filter, model,
4891
4930
  switchInputType("operator", setInputType, void 0, refs.domReference.current);
4892
4931
  }
4893
4932
  }
4894
- }, filter.operator) : null, /* @__PURE__ */ React__default["default"].createElement("div", {
4933
+ }, !filter.origin && { role: "button" }), filter.operator) : null, /* @__PURE__ */ React__default["default"].createElement("div", {
4895
4934
  ref: multiValuePillWrapperRef
4896
4935
  }), isMultiValueEdit ? filterMultiValues.map((item, i) => /* @__PURE__ */ React__default["default"].createElement(MultiValuePill, {
4897
4936
  key: `${item.value}-${i}`,
@@ -5138,13 +5177,13 @@ function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }) {
5138
5177
  const handleChangeViewMode = React.useCallback(
5139
5178
  (event, shouldFocusOnPillWrapperOverride) => {
5140
5179
  event == null ? void 0 : event.stopPropagation();
5141
- if (readOnly || filter.origin) {
5180
+ if (readOnly) {
5142
5181
  return;
5143
5182
  }
5144
5183
  setShouldFocusOnPillWrapper(shouldFocusOnPillWrapperOverride != null ? shouldFocusOnPillWrapperOverride : !viewMode);
5145
5184
  setViewMode(!viewMode);
5146
5185
  },
5147
- [readOnly, viewMode, filter.origin]
5186
+ [readOnly, viewMode]
5148
5187
  );
5149
5188
  React.useEffect(() => {
5150
5189
  var _a2;
@@ -5208,11 +5247,20 @@ function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }) {
5208
5247
  size: "md",
5209
5248
  className: styles.pillIcon,
5210
5249
  tooltip: `Remove filter with key ${keyLabel}`
5211
- }) : null, filter.origin && /* @__PURE__ */ React__default["default"].createElement(ui.IconButton, {
5250
+ }) : null, filter.origin && !filter.originalValue && /* @__PURE__ */ React__default["default"].createElement(ui.IconButton, {
5212
5251
  name: "info-circle",
5213
5252
  size: "md",
5214
5253
  className: styles.pillIcon,
5215
5254
  tooltip: `This is a ${filter.origin} injected filter`
5255
+ }), filter.origin && filter.originalValue && /* @__PURE__ */ React__default["default"].createElement(ui.IconButton, {
5256
+ onClick: (e) => {
5257
+ e.stopPropagation();
5258
+ model.restoreOriginalFilter(filter);
5259
+ },
5260
+ name: "history",
5261
+ size: "md",
5262
+ className: styles.pillIcon,
5263
+ tooltip: `Restore filter to its original value`
5216
5264
  }));
5217
5265
  }
5218
5266
  return /* @__PURE__ */ React__default["default"].createElement(AdHocCombobox, {
@@ -5410,14 +5458,17 @@ const OPERATORS = [
5410
5458
  ];
5411
5459
  class AdHocFiltersVariable extends SceneObjectBase {
5412
5460
  constructor(state) {
5413
- var _a, _b;
5461
+ var _a, _b, _c, _d, _e;
5414
5462
  super(__spreadValues$z({
5415
5463
  type: "adhoc",
5416
5464
  name: (_a = state.name) != null ? _a : "Filters",
5417
5465
  filters: [],
5418
5466
  datasource: null,
5419
5467
  applyMode: "auto",
5420
- filterExpression: (_b = state.filterExpression) != null ? _b : renderExpression(state.expressionBuilder, state.filters)
5468
+ filterExpression: (_e = state.filterExpression) != null ? _e : renderExpression(state.expressionBuilder, [
5469
+ ...(_c = (_b = state.baseFilters) == null ? void 0 : _b.filter((filter) => filter.origin)) != null ? _c : [],
5470
+ ...(_d = state.filters) != null ? _d : []
5471
+ ])
5421
5472
  }, state));
5422
5473
  this._scopedVars = { __sceneObject: wrapInSafeSerializableSceneObject(this) };
5423
5474
  this._dataSourceSrv = runtime.getDataSourceSrv();
@@ -5427,9 +5478,15 @@ class AdHocFiltersVariable extends SceneObjectBase {
5427
5478
  }
5428
5479
  }
5429
5480
  setState(update) {
5481
+ var _a, _b, _c;
5430
5482
  let filterExpressionChanged = false;
5431
- if (update.filters && update.filters !== this.state.filters && !update.filterExpression) {
5432
- update.filterExpression = renderExpression(this.state.expressionBuilder, update.filters);
5483
+ if ((update.filters && update.filters !== this.state.filters || update.baseFilters && update.baseFilters !== this.state.baseFilters) && !update.filterExpression) {
5484
+ const filters = (_a = update.filters) != null ? _a : this.state.filters;
5485
+ const baseFilters = (_b = update.baseFilters) != null ? _b : this.state.baseFilters;
5486
+ update.filterExpression = renderExpression(this.state.expressionBuilder, [
5487
+ ...(_c = baseFilters == null ? void 0 : baseFilters.filter((filter) => filter.origin)) != null ? _c : [],
5488
+ ...filters != null ? filters : []
5489
+ ]);
5433
5490
  filterExpressionChanged = update.filterExpression !== this.state.filterExpression;
5434
5491
  }
5435
5492
  super.setState(update);
@@ -5438,10 +5495,14 @@ class AdHocFiltersVariable extends SceneObjectBase {
5438
5495
  }
5439
5496
  }
5440
5497
  updateFilters(filters, options) {
5498
+ var _a, _b;
5441
5499
  let filterExpressionChanged = false;
5442
5500
  let filterExpression = void 0;
5443
5501
  if (filters && filters !== this.state.filters) {
5444
- filterExpression = renderExpression(this.state.expressionBuilder, filters);
5502
+ filterExpression = renderExpression(this.state.expressionBuilder, [
5503
+ ...(_b = (_a = this.state.baseFilters) == null ? void 0 : _a.filter((filter) => filter.origin)) != null ? _b : [],
5504
+ ...filters
5505
+ ]);
5445
5506
  filterExpressionChanged = filterExpression !== this.state.filterExpression;
5446
5507
  }
5447
5508
  super.setState({
@@ -5452,11 +5513,40 @@ class AdHocFiltersVariable extends SceneObjectBase {
5452
5513
  this.publishEvent(new SceneVariableValueChangedEvent(this), true);
5453
5514
  }
5454
5515
  }
5516
+ restoreOriginalFilter(filter) {
5517
+ var _a;
5518
+ const original = {
5519
+ originalValue: void 0
5520
+ };
5521
+ if ((_a = filter.originalValue) == null ? void 0 : _a.length) {
5522
+ original.value = filter.originalValue[0];
5523
+ original.values = filter.originalValue;
5524
+ original.valueLabels = filter.originalValue;
5525
+ }
5526
+ this._updateFilter(filter, original);
5527
+ }
5455
5528
  getValue() {
5456
5529
  return this.state.filterExpression;
5457
5530
  }
5458
5531
  _updateFilter(filter, update) {
5459
- const { filters, _wip } = this.state;
5532
+ var _a;
5533
+ const { baseFilters, filters, _wip } = this.state;
5534
+ if (filter.origin) {
5535
+ const currentValues = filter.values ? filter.values : [filter.value];
5536
+ const updateValues = update.values || (update.value ? [update.value] : void 0);
5537
+ const originalValueOverride = update.hasOwnProperty("originalValue");
5538
+ if (!originalValueOverride && updateValues && !filter.originalValue && !lodash.isEqual(currentValues, updateValues)) {
5539
+ update.originalValue = currentValues;
5540
+ }
5541
+ if (!originalValueOverride && lodash.isEqual(updateValues, filter.originalValue)) {
5542
+ update.originalValue = void 0;
5543
+ }
5544
+ const updatedBaseFilters = (_a = baseFilters == null ? void 0 : baseFilters.map((f) => {
5545
+ return f === filter ? __spreadValues$z(__spreadValues$z({}, f), update) : f;
5546
+ })) != null ? _a : [];
5547
+ this.setState({ baseFilters: updatedBaseFilters });
5548
+ return;
5549
+ }
5460
5550
  if (filter === _wip) {
5461
5551
  if ("value" in update && update["value"] !== "") {
5462
5552
  this.setState({ filters: [...filters, __spreadValues$z(__spreadValues$z({}, _wip), update)], _wip: void 0 });
@@ -5542,7 +5632,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
5542
5632
  return keys.map(toSelectableValue);
5543
5633
  }
5544
5634
  async _getValuesFor(filter) {
5545
- var _a, _b, _c;
5635
+ var _a, _b, _c, _d, _e, _f;
5546
5636
  const override = await ((_b = (_a = this.state).getTagValuesProvider) == null ? void 0 : _b.call(_a, this, filter));
5547
5637
  if (override && override.replace) {
5548
5638
  return dataFromResponse(override.values).map(toSelectableValue);
@@ -5551,15 +5641,33 @@ class AdHocFiltersVariable extends SceneObjectBase {
5551
5641
  if (!ds || !ds.getTagValues) {
5552
5642
  return [];
5553
5643
  }
5554
- const otherFilters = this.state.filters.filter((f) => f.key !== filter.key).concat((_c = this.state.baseFilters) != null ? _c : []);
5644
+ const filteredBaseFilters = (_d = (_c = this.state.baseFilters) == null ? void 0 : _c.filter((f) => f.origin && f.key !== filter.key)) != null ? _d : [];
5645
+ const otherFilters = this.state.filters.filter((f) => f.key !== filter.key).concat(filteredBaseFilters);
5555
5646
  const timeRange = sceneGraph.getTimeRange(this).state.value;
5556
5647
  const queries = this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : void 0;
5648
+ const injectedScopes = (_f = (_e = getEnrichedFiltersRequest(this)) == null ? void 0 : _e.scopes) == null ? void 0 : _f.map((scope) => {
5649
+ return __spreadProps$n(__spreadValues$z({}, scope), {
5650
+ spec: __spreadProps$n(__spreadValues$z({}, scope.spec), {
5651
+ filters: scope.spec.filters.filter(
5652
+ (f) => {
5653
+ var _a2;
5654
+ return !((_a2 = this.state.baseFilters) == null ? void 0 : _a2.find((bf) => bf.key === f.key && "scopes" /* Scopes */));
5655
+ }
5656
+ )
5657
+ })
5658
+ });
5659
+ });
5660
+ const scopeProps = {};
5661
+ if (injectedScopes) {
5662
+ scopeProps.scopes = injectedScopes;
5663
+ scopeProps.scopesInjected = true;
5664
+ }
5557
5665
  const response = await ds.getTagValues(__spreadValues$z({
5558
5666
  key: filter.key,
5559
5667
  filters: otherFilters,
5560
5668
  timeRange,
5561
5669
  queries
5562
- }, getEnrichedFiltersRequest(this)));
5670
+ }, scopeProps));
5563
5671
  if (responseHasError(response)) {
5564
5672
  this.setState({ error: response.error.message });
5565
5673
  }
@@ -6252,6 +6360,15 @@ function escapeUrlCommaDelimiters(value) {
6252
6360
  }
6253
6361
  return /,/g[Symbol.replace](value, "__gfc__");
6254
6362
  }
6363
+ function escapeUrlHashDelimiters(value) {
6364
+ if (value === null || value === void 0) {
6365
+ return "";
6366
+ }
6367
+ return /#/g[Symbol.replace](value, "__gfh__");
6368
+ }
6369
+ function escapeInjectedFilterUrlDelimiters(value) {
6370
+ return escapeUrlHashDelimiters(escapeUrlPipeDelimiters(value));
6371
+ }
6255
6372
  function escapeURLDelimiters(value) {
6256
6373
  return escapeUrlCommaDelimiters(escapeUrlPipeDelimiters(value));
6257
6374
  }
@@ -6261,6 +6378,7 @@ function unescapeUrlDelimiters(value) {
6261
6378
  }
6262
6379
  value = /__gfp__/g[Symbol.replace](value, "|");
6263
6380
  value = /__gfc__/g[Symbol.replace](value, ",");
6381
+ value = /__gfh__/g[Symbol.replace](value, "#");
6264
6382
  return value;
6265
6383
  }
6266
6384
  function toUrlCommaDelimitedString(key, label) {