@grafana/scenes 6.9.1 → 6.10.0--canary.1095.14616202286.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
@@ -3783,13 +3783,8 @@ class AdHocFiltersVariableUrlSyncHandler {
3783
3783
  }
3784
3784
  if (baseFilters == null ? void 0 : baseFilters.length) {
3785
3785
  value.push(
3786
- ...baseFilters == null ? void 0 : baseFilters.filter(isFilterComplete).filter((filter) => !filter.hidden && filter.origin && filter.originalValue).map(
3787
- (filter) => {
3788
- var _a, _b;
3789
- return toArray(filter).map(escapeInjectedFilterUrlDelimiters).join("|").concat(
3790
- `#${(_b = (_a = filter.originalValue) == null ? void 0 : _a.map(escapeInjectedFilterUrlDelimiters).join("|")) != null ? _b : ""}#${filter.origin}`
3791
- );
3792
- }
3786
+ ...baseFilters == null ? void 0 : baseFilters.filter(isFilterComplete).filter((filter) => !filter.hidden && filter.origin && filter.restorable).map(
3787
+ (filter) => toArray(filter).map(escapeInjectedFilterUrlDelimiters).join("|").concat(`#${filter.origin}#restorable`)
3793
3788
  )
3794
3789
  );
3795
3790
  }
@@ -3802,13 +3797,30 @@ class AdHocFiltersVariableUrlSyncHandler {
3802
3797
  if (urlValue == null) {
3803
3798
  return;
3804
3799
  }
3805
- if (urlValue) {
3806
- const filters = deserializeUrlToFilters(urlValue);
3807
- this._variable.setState({
3808
- filters: filters.filter((f) => !f.origin),
3809
- baseFilters: filters.filter((f) => f.origin)
3810
- });
3811
- }
3800
+ const filters = deserializeUrlToFilters(urlValue);
3801
+ const baseFilters = [...this._variable.state.baseFilters || []];
3802
+ for (let i = 0; i < filters.length; i++) {
3803
+ const foundBaseFilterIndex = baseFilters.findIndex((f) => f.key === filters[i].key);
3804
+ if (foundBaseFilterIndex > -1) {
3805
+ if (!filters[i].origin && baseFilters[foundBaseFilterIndex].origin === "dashboard") {
3806
+ filters[i].origin = "dashboard";
3807
+ filters[i].restorable = true;
3808
+ }
3809
+ if (isMatchAllFilter(filters[i])) {
3810
+ filters[i].matchAllFilter = true;
3811
+ }
3812
+ baseFilters[foundBaseFilterIndex] = filters[i];
3813
+ } else if (filters[i].origin === "dashboard") {
3814
+ delete filters[i].origin;
3815
+ delete filters[i].restorable;
3816
+ } else if (foundBaseFilterIndex === -1 && filters[i].origin === "scope" && filters[i].restorable) {
3817
+ baseFilters.push(filters[i]);
3818
+ }
3819
+ }
3820
+ this._variable.setState({
3821
+ filters: filters.filter((f) => !f.origin),
3822
+ baseFilters
3823
+ });
3812
3824
  }
3813
3825
  }
3814
3826
  function deserializeUrlToFilters(value) {
@@ -3833,11 +3845,10 @@ function toArray(filter) {
3833
3845
  return result;
3834
3846
  }
3835
3847
  function toFilter(urlValue) {
3836
- var _a;
3837
3848
  if (typeof urlValue !== "string" || urlValue.length === 0) {
3838
3849
  return null;
3839
3850
  }
3840
- const [filter, originalValues, origin] = urlValue.split("#");
3851
+ const [filter, origin, restorable] = urlValue.split("#");
3841
3852
  const [key, keyLabel, operator, _operatorLabel, ...values] = filter.split("|").reduce((acc, v) => {
3842
3853
  const [key2, label] = v.split(",");
3843
3854
  acc.push(key2, label != null ? label : key2);
@@ -3851,12 +3862,12 @@ function toFilter(urlValue) {
3851
3862
  values: isMultiValueOperator(operator) ? values.filter((_, index) => index % 2 === 0) : void 0,
3852
3863
  valueLabels: values.filter((_, index) => index % 2 === 1),
3853
3864
  condition: "",
3854
- origin: isFilterOrigin(origin) ? origin : void 0,
3855
- originalValue: originalValues && originalValues.length ? (_a = originalValues.split("|")) != null ? _a : [originalValues] : void 0
3865
+ ...isFilterOrigin(origin) && { origin },
3866
+ ...!!restorable && { restorable: true }
3856
3867
  };
3857
3868
  }
3858
3869
  function isFilterOrigin(value) {
3859
- return value === FilterOrigin.Scopes || value === FilterOrigin.Dashboards;
3870
+ return value === "scope" || value === "dashboard";
3860
3871
  }
3861
3872
  function isFilter(filter) {
3862
3873
  return filter !== null && typeof filter.key === "string" && typeof filter.value === "string";
@@ -4947,7 +4958,11 @@ function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }) {
4947
4958
  return /* @__PURE__ */ React__default.default.createElement(
4948
4959
  "div",
4949
4960
  {
4950
- className: css.cx(styles.combinedFilterPill, readOnly && styles.readOnlyCombinedFilter),
4961
+ className: css.cx(
4962
+ styles.combinedFilterPill,
4963
+ readOnly && styles.readOnlyCombinedFilter,
4964
+ isMatchAllFilter(filter) && styles.matchAllPill
4965
+ ),
4951
4966
  onClick: (e) => {
4952
4967
  e.stopPropagation();
4953
4968
  setPopulateInputOnEdit(true);
@@ -4965,19 +4980,27 @@ function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }) {
4965
4980
  ref: pillWrapperRef
4966
4981
  },
4967
4982
  valueLabel.length < LABEL_MAX_VISIBLE_LENGTH ? pillText : /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content: /* @__PURE__ */ React__default.default.createElement("div", { className: styles.tooltipText }, valueLabel), placement: "top" }, pillText),
4968
- !readOnly && !filter.origin ? /* @__PURE__ */ React__default.default.createElement(
4983
+ !readOnly && !filter.matchAllFilter && (!filter.origin || filter.origin === "dashboard") ? /* @__PURE__ */ React__default.default.createElement(
4969
4984
  ui.IconButton,
4970
4985
  {
4971
4986
  onClick: (e) => {
4972
4987
  e.stopPropagation();
4973
- model._removeFilter(filter);
4988
+ if (filter.origin && filter.origin === "dashboard") {
4989
+ model.updateToMatchAll(filter);
4990
+ } else {
4991
+ model._removeFilter(filter);
4992
+ }
4974
4993
  setTimeout(() => focusOnWipInputRef == null ? void 0 : focusOnWipInputRef());
4975
4994
  },
4976
4995
  onKeyDownCapture: (e) => {
4977
4996
  if (e.key === "Enter") {
4978
4997
  e.preventDefault();
4979
4998
  e.stopPropagation();
4980
- model._removeFilter(filter);
4999
+ if (filter.origin && filter.origin === "dashboard") {
5000
+ model.updateToMatchAll(filter);
5001
+ } else {
5002
+ model._removeFilter(filter);
5003
+ }
4981
5004
  setTimeout(() => focusOnWipInputRef == null ? void 0 : focusOnWipInputRef());
4982
5005
  }
4983
5006
  },
@@ -4987,16 +5010,8 @@ function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }) {
4987
5010
  tooltip: `Remove filter with key ${keyLabel}`
4988
5011
  }
4989
5012
  ) : null,
4990
- filter.origin && !filter.originalValue && /* @__PURE__ */ React__default.default.createElement(
4991
- ui.IconButton,
4992
- {
4993
- name: "info-circle",
4994
- size: "md",
4995
- className: styles.pillIcon,
4996
- tooltip: `This is a ${filter.origin} injected filter`
4997
- }
4998
- ),
4999
- filter.origin && filter.originalValue && /* @__PURE__ */ React__default.default.createElement(
5013
+ filter.origin && !filter.restorable && /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content: `This is a ${filter.origin} injected filter`, placement: "bottom" }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "info-circle", size: "md", className: styles.infoPillIcon })),
5014
+ filter.origin && filter.restorable && /* @__PURE__ */ React__default.default.createElement(
5000
5015
  ui.IconButton,
5001
5016
  {
5002
5017
  onClick: (e) => {
@@ -5012,7 +5027,7 @@ function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }) {
5012
5027
  },
5013
5028
  name: "history",
5014
5029
  size: "md",
5015
- className: styles.pillIcon,
5030
+ className: isMatchAllFilter(filter) ? styles.matchAllPillIcon : styles.pillIcon,
5016
5031
  tooltip: `Restore filter to its original value`
5017
5032
  }
5018
5033
  )
@@ -5070,6 +5085,23 @@ const getStyles$b = (theme) => ({
5070
5085
  }),
5071
5086
  tooltipText: css.css({
5072
5087
  textAlign: "center"
5088
+ }),
5089
+ infoPillIcon: css.css({
5090
+ marginInline: theme.spacing(0.5),
5091
+ cursor: "pointer"
5092
+ }),
5093
+ matchAllPillIcon: css.css({
5094
+ marginInline: theme.spacing(0.5),
5095
+ cursor: "pointer",
5096
+ color: theme.colors.text.disabled
5097
+ }),
5098
+ matchAllPill: css.css({
5099
+ background: theme.colors.action.selected,
5100
+ color: theme.colors.text.disabled,
5101
+ border: 0,
5102
+ "&:hover": {
5103
+ background: theme.colors.action.selected
5104
+ }
5073
5105
  })
5074
5106
  });
5075
5107
 
@@ -5181,7 +5213,7 @@ function processFilter(formattedFilters, duplicatedFilters, filter) {
5181
5213
  operator: reverseScopeFilterOperatorMap[filter.operator],
5182
5214
  value: filter.value,
5183
5215
  values: (_a = filter.values) != null ? _a : [filter.value],
5184
- origin: FilterOrigin.Scopes
5216
+ origin: "scope"
5185
5217
  });
5186
5218
  } else {
5187
5219
  duplicatedFilters.push({
@@ -5189,7 +5221,7 @@ function processFilter(formattedFilters, duplicatedFilters, filter) {
5189
5221
  operator: reverseScopeFilterOperatorMap[filter.operator],
5190
5222
  value: filter.value,
5191
5223
  values: (_b = filter.values) != null ? _b : [filter.value],
5192
- origin: FilterOrigin.Scopes
5224
+ origin: "scope"
5193
5225
  });
5194
5226
  }
5195
5227
  }
@@ -5221,11 +5253,6 @@ function canValueBeMerged(adHocFilterOperator, filterOperator) {
5221
5253
  return true;
5222
5254
  }
5223
5255
 
5224
- var FilterOrigin = /* @__PURE__ */ ((FilterOrigin2) => {
5225
- FilterOrigin2["Scopes"] = "scopes";
5226
- FilterOrigin2["Dashboards"] = "dashboards";
5227
- return FilterOrigin2;
5228
- })(FilterOrigin || {});
5229
5256
  const OPERATORS = [
5230
5257
  {
5231
5258
  value: "=",
@@ -5266,7 +5293,7 @@ const OPERATORS = [
5266
5293
  ];
5267
5294
  class AdHocFiltersVariable extends SceneObjectBase {
5268
5295
  constructor(state) {
5269
- var _a, _b, _c, _d, _e;
5296
+ var _a, _b, _c, _d, _e, _f;
5270
5297
  super({
5271
5298
  type: "adhoc",
5272
5299
  name: (_a = state.name) != null ? _a : "Filters",
@@ -5281,6 +5308,10 @@ class AdHocFiltersVariable extends SceneObjectBase {
5281
5308
  });
5282
5309
  this._scopedVars = { __sceneObject: wrapInSafeSerializableSceneObject(this) };
5283
5310
  this._dataSourceSrv = runtime.getDataSourceSrv();
5311
+ // holds the originalValues of all baseFilters in a map. The values
5312
+ // are set on construct and used to restore a baseFilter with an origin
5313
+ // to its original value if edited at some point
5314
+ this._originalValues = /* @__PURE__ */ new Map();
5284
5315
  this._urlSync = new AdHocFiltersVariableUrlSyncHandler(this);
5285
5316
  this._activationHandler = () => {
5286
5317
  var _a, _b;
@@ -5290,52 +5321,75 @@ class AdHocFiltersVariable extends SceneObjectBase {
5290
5321
  this._updateScopesFilters(scopes);
5291
5322
  }
5292
5323
  const sub = (_b = this._scopesBridge) == null ? void 0 : _b.subscribeToValue((n, _) => {
5293
- var _a2;
5294
- this._updateScopesFilters(n, (_a2 = this._scopesBridge) == null ? void 0 : _a2.isLoading());
5324
+ this._updateScopesFilters(n);
5295
5325
  });
5296
5326
  return () => {
5327
+ var _a2, _b2;
5297
5328
  sub == null ? void 0 : sub.unsubscribe();
5298
- };
5299
- };
5300
- this._updateScopesFilters = (scopes, areScopesLoading) => {
5301
- var _a, _b;
5302
- if (!scopes.length) {
5303
- this.setState({
5304
- baseFilters: (_a = this.state.baseFilters) == null ? void 0 : _a.filter((filter) => filter.origin !== "scopes" /* Scopes */)
5305
- });
5306
- return;
5307
- }
5308
- const scopeFilters = getAdHocFiltersFromScopes(scopes);
5309
- let finalFilters = scopeFilters;
5310
- const scopeInjectedFilters = [];
5311
- const remainingFilters = [];
5312
- (_b = this.state.baseFilters) == null ? void 0 : _b.forEach((filter) => {
5313
- if (filter.origin === "scopes" /* Scopes */) {
5314
- scopeInjectedFilters.push(filter);
5315
- } else {
5316
- remainingFilters.push(filter);
5329
+ if ((_a2 = this.state.baseFilters) == null ? void 0 : _a2.length) {
5330
+ this.setState({
5331
+ baseFilters: [...this.state.baseFilters.filter((filter) => filter.origin !== "scope")]
5332
+ });
5333
+ (_b2 = this.state.baseFilters) == null ? void 0 : _b2.forEach((filter) => {
5334
+ if (filter.origin === "dashboard" && filter.restorable) {
5335
+ this.restoreOriginalFilter(filter);
5336
+ }
5337
+ });
5317
5338
  }
5318
- });
5319
- if (!scopeFilters.length) {
5320
- return;
5321
- }
5322
- const editedScopeFilters = scopeInjectedFilters.filter((filter) => {
5323
- var _a2;
5324
- return (_a2 = filter.originalValue) == null ? void 0 : _a2.length;
5325
- });
5326
- const editedScopeFilterKeys = editedScopeFilters.map((filter) => filter.key);
5327
- const scopeFilterKeys = scopeFilters.map((filter) => filter.key);
5328
- finalFilters = [
5329
- ...editedScopeFilters.filter((filter) => scopeFilterKeys.includes(filter.key)),
5330
- ...scopeFilters.filter((filter) => !editedScopeFilterKeys.includes(filter.key))
5331
- ];
5332
- this.setState({ baseFilters: [...remainingFilters, ...finalFilters] });
5339
+ };
5333
5340
  };
5334
5341
  if (this.state.applyMode === "auto") {
5335
5342
  patchGetAdhocFilters(this);
5336
5343
  }
5344
+ (_f = this.state.baseFilters) == null ? void 0 : _f.forEach((baseFilter) => {
5345
+ var _a2;
5346
+ if (baseFilter.origin === "dashboard") {
5347
+ this._originalValues.set(baseFilter.key, {
5348
+ operator: baseFilter.operator,
5349
+ value: (_a2 = baseFilter.values) != null ? _a2 : [baseFilter.value]
5350
+ });
5351
+ }
5352
+ });
5337
5353
  this.addActivationHandler(this._activationHandler);
5338
5354
  }
5355
+ _updateScopesFilters(scopes) {
5356
+ var _a, _b;
5357
+ if (!scopes.length) {
5358
+ this.setState({
5359
+ baseFilters: (_a = this.state.baseFilters) == null ? void 0 : _a.filter((filter) => filter.origin !== "scope")
5360
+ });
5361
+ return;
5362
+ }
5363
+ const scopeFilters = getAdHocFiltersFromScopes(scopes);
5364
+ if (!scopeFilters.length) {
5365
+ return;
5366
+ }
5367
+ let finalFilters = scopeFilters;
5368
+ const scopeInjectedFilters = [];
5369
+ const remainingFilters = [];
5370
+ finalFilters.forEach((scopeFilter) => {
5371
+ var _a2;
5372
+ this._originalValues.set(scopeFilter.key, {
5373
+ value: (_a2 = scopeFilter.values) != null ? _a2 : [scopeFilter.value],
5374
+ operator: scopeFilter.operator
5375
+ });
5376
+ });
5377
+ (_b = this.state.baseFilters) == null ? void 0 : _b.forEach((filter) => {
5378
+ if (filter.origin === "scope") {
5379
+ scopeInjectedFilters.push(filter);
5380
+ } else {
5381
+ remainingFilters.push(filter);
5382
+ }
5383
+ });
5384
+ const editedScopeFilters = scopeInjectedFilters.filter((filter) => filter.restorable);
5385
+ const editedScopeFilterKeys = editedScopeFilters.map((filter) => filter.key);
5386
+ const scopeFilterKeys = scopeFilters.map((filter) => filter.key);
5387
+ finalFilters = [
5388
+ ...editedScopeFilters.filter((filter) => scopeFilterKeys.includes(filter.key)),
5389
+ ...scopeFilters.filter((filter) => !editedScopeFilterKeys.includes(filter.key))
5390
+ ];
5391
+ this.setState({ baseFilters: [...finalFilters, ...remainingFilters] });
5392
+ }
5339
5393
  setState(update) {
5340
5394
  var _a, _b, _c;
5341
5395
  let filterExpressionChanged = false;
@@ -5378,14 +5432,16 @@ class AdHocFiltersVariable extends SceneObjectBase {
5378
5432
  }
5379
5433
  }
5380
5434
  restoreOriginalFilter(filter) {
5381
- var _a;
5382
5435
  const original = {
5383
- originalValue: void 0
5436
+ matchAllFilter: false,
5437
+ restorable: false
5384
5438
  };
5385
- if ((_a = filter.originalValue) == null ? void 0 : _a.length) {
5386
- original.value = filter.originalValue[0];
5387
- original.values = filter.originalValue;
5388
- original.valueLabels = filter.originalValue;
5439
+ if (filter.restorable) {
5440
+ const originalFilter = this._originalValues.get(filter.key);
5441
+ original.value = originalFilter == null ? void 0 : originalFilter.value[0];
5442
+ original.values = originalFilter == null ? void 0 : originalFilter.value;
5443
+ original.valueLabels = originalFilter == null ? void 0 : originalFilter.value;
5444
+ original.operator = originalFilter == null ? void 0 : originalFilter.operator;
5389
5445
  }
5390
5446
  this._updateFilter(filter, original);
5391
5447
  }
@@ -5396,14 +5452,13 @@ class AdHocFiltersVariable extends SceneObjectBase {
5396
5452
  var _a;
5397
5453
  const { baseFilters, filters, _wip } = this.state;
5398
5454
  if (filter.origin) {
5399
- const currentValues = filter.values ? filter.values : [filter.value];
5455
+ const originalValues = this._originalValues.get(filter.key);
5400
5456
  const updateValues = update.values || (update.value ? [update.value] : void 0);
5401
- const originalValueOverride = update.hasOwnProperty("originalValue");
5402
- if (!originalValueOverride && updateValues && !filter.originalValue && !lodash.isEqual(currentValues, updateValues)) {
5403
- update.originalValue = currentValues;
5404
- }
5405
- if (!originalValueOverride && lodash.isEqual(updateValues, filter.originalValue)) {
5406
- update.originalValue = void 0;
5457
+ const isRestorableOverride = update.hasOwnProperty("restorable");
5458
+ if (!isRestorableOverride && (updateValues && !lodash.isEqual(updateValues, originalValues == null ? void 0 : originalValues.value) || update.operator && update.operator !== (originalValues == null ? void 0 : originalValues.operator))) {
5459
+ update.restorable = true;
5460
+ } else if (updateValues && lodash.isEqual(updateValues, originalValues == null ? void 0 : originalValues.value)) {
5461
+ update.restorable = false;
5407
5462
  }
5408
5463
  const updatedBaseFilters = (_a = baseFilters == null ? void 0 : baseFilters.map((f) => {
5409
5464
  return f === filter ? { ...f, ...update } : f;
@@ -5424,6 +5479,16 @@ class AdHocFiltersVariable extends SceneObjectBase {
5424
5479
  });
5425
5480
  this.setState({ filters: updatedFilters });
5426
5481
  }
5482
+ updateToMatchAll(filter) {
5483
+ this._updateFilter(filter, {
5484
+ operator: "=~",
5485
+ value: ".*",
5486
+ values: [".*"],
5487
+ valueLabels: ["All"],
5488
+ matchAllFilter: true,
5489
+ restorable: true
5490
+ });
5491
+ }
5427
5492
  _removeFilter(filter) {
5428
5493
  if (filter === this.state._wip) {
5429
5494
  this.setState({ _wip: void 0 });
@@ -5542,7 +5607,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
5542
5607
  const timeRange = sceneGraph.getTimeRange(this).state.value;
5543
5608
  const queries = this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : void 0;
5544
5609
  let scopes = (_e = this._scopesBridge) == null ? void 0 : _e.getValue();
5545
- if (filter.origin === "scopes" /* Scopes */) {
5610
+ if (filter.origin === "scope") {
5546
5611
  scopes = scopes == null ? void 0 : scopes.map((scope) => {
5547
5612
  return {
5548
5613
  ...scope,
@@ -5629,6 +5694,9 @@ function toSelectableValue(input) {
5629
5694
  }
5630
5695
  return result;
5631
5696
  }
5697
+ function isMatchAllFilter(filter) {
5698
+ return filter.operator === "=~" && filter.value === ".*";
5699
+ }
5632
5700
  function isFilterComplete(filter) {
5633
5701
  return filter.key !== "" && filter.operator !== "" && filter.value !== "";
5634
5702
  }
@@ -13896,7 +13964,6 @@ exports.EmbeddedScene = EmbeddedScene;
13896
13964
  exports.FieldConfigBuilder = FieldConfigBuilder;
13897
13965
  exports.FieldConfigBuilders = FieldConfigBuilders;
13898
13966
  exports.FieldConfigOverridesBuilder = FieldConfigOverridesBuilder;
13899
- exports.FilterOrigin = FilterOrigin;
13900
13967
  exports.GroupByVariable = GroupByVariable;
13901
13968
  exports.IntervalVariable = IntervalVariable;
13902
13969
  exports.LazyLoader = LazyLoader;