@grafana/scenes 6.4.0--canary.1062.13918599453.0 → 6.4.1

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
@@ -878,7 +878,6 @@ interface AdHocFilterWithLabels<M extends Record<string, any> = {}> extends AdHo
878
878
  hidden?: boolean;
879
879
  meta?: M;
880
880
  origin?: FilterOrigin;
881
- originalValue?: string[];
882
881
  }
883
882
  type AdHocControlsLayout = ControlsLayout | 'combobox';
884
883
  declare enum FilterOrigin {
@@ -1000,7 +999,6 @@ declare class AdHocFiltersVariable extends SceneObjectBase<AdHocFiltersVariableS
1000
999
  skipPublish?: boolean;
1001
1000
  forcePublish?: boolean;
1002
1001
  }): void;
1003
- restoreOriginalFilter(filter: AdHocFilterWithLabels): void;
1004
1002
  getValue(): VariableValue | undefined;
1005
1003
  _updateFilter(filter: AdHocFilterWithLabels, update: Partial<AdHocFilterWithLabels>): void;
1006
1004
  _removeFilter(filter: AdHocFilterWithLabels): void;
package/dist/index.js CHANGED
@@ -3972,44 +3972,19 @@ class AdHocFiltersVariableUrlSyncHandler {
3972
3972
  }
3973
3973
  getUrlState() {
3974
3974
  const filters = this._variable.state.filters;
3975
- const baseFilters = this._variable.state.baseFilters;
3976
- let value = [];
3977
- if (filters.length === 0 && (baseFilters == null ? void 0 : baseFilters.length) === 0) {
3975
+ if (filters.length === 0) {
3978
3976
  return { [this.getKey()]: [""] };
3979
3977
  }
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
- };
3978
+ const value = filters.filter(isFilterComplete).filter((filter) => !filter.hidden).map((filter) => toArray(filter).map(escapeUrlPipeDelimiters).join("|"));
3979
+ return { [this.getKey()]: value };
4000
3980
  }
4001
3981
  updateFromUrl(values) {
4002
3982
  const urlValue = values[this.getKey()];
4003
3983
  if (urlValue == null) {
4004
3984
  return;
4005
3985
  }
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
- }
3986
+ const filters = deserializeUrlToFilters(urlValue);
3987
+ this._variable.setState({ filters });
4013
3988
  }
4014
3989
  }
4015
3990
  function deserializeUrlToFilters(value) {
@@ -4034,12 +4009,10 @@ function toArray(filter) {
4034
4009
  return result;
4035
4010
  }
4036
4011
  function toFilter(urlValue) {
4037
- var _a;
4038
4012
  if (typeof urlValue !== "string" || urlValue.length === 0) {
4039
4013
  return null;
4040
4014
  }
4041
- const [filter, originalValues, origin] = urlValue.split("#");
4042
- const [key, keyLabel, operator, _operatorLabel, ...values] = filter.split("|").reduce((acc, v) => {
4015
+ const [key, keyLabel, operator, _operatorLabel, ...values] = urlValue.split("|").reduce((acc, v) => {
4043
4016
  const [key2, label] = v.split(",");
4044
4017
  acc.push(key2, label != null ? label : key2);
4045
4018
  return acc;
@@ -4051,14 +4024,9 @@ function toFilter(urlValue) {
4051
4024
  value: values[0],
4052
4025
  values: isMultiValueOperator(operator) ? values.filter((_, index) => index % 2 === 0) : void 0,
4053
4026
  valueLabels: values.filter((_, index) => index % 2 === 1),
4054
- condition: "",
4055
- origin: isFilterOrigin(origin) ? origin : void 0,
4056
- originalValue: originalValues && originalValues.length ? (_a = originalValues.split("|")) != null ? _a : [originalValues] : void 0
4027
+ condition: ""
4057
4028
  };
4058
4029
  }
4059
- function isFilterOrigin(value) {
4060
- return value === FilterOrigin.Scopes || value === FilterOrigin.Dashboards;
4061
- }
4062
4030
  function isFilter(filter) {
4063
4031
  return filter !== null && typeof filter.key === "string" && typeof filter.value === "string";
4064
4032
  }
@@ -4720,9 +4688,6 @@ const AdHocCombobox = React.forwardRef(function AdHocCombobox2({ filter, model,
4720
4688
  return;
4721
4689
  }
4722
4690
  }
4723
- if (filter == null ? void 0 : filter.origin) {
4724
- return;
4725
- }
4726
4691
  setInputType("operator");
4727
4692
  return;
4728
4693
  }
@@ -4909,36 +4874,25 @@ const AdHocCombobox = React.forwardRef(function AdHocCombobox2({ filter, model,
4909
4874
  className: styles.pillWrapper
4910
4875
  }, (filter == null ? void 0 : filter.key) ? /* @__PURE__ */ React__default["default"].createElement("div", {
4911
4876
  className: css.cx(styles.basePill, styles.keyPill)
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({
4877
+ }, keyLabel) : null, (filter == null ? void 0 : filter.key) && (filter == null ? void 0 : filter.operator) && filterInputType !== "operator" ? /* @__PURE__ */ React__default["default"].createElement("div", {
4913
4878
  id: operatorIdentifier,
4914
- className: css.cx(
4915
- styles.basePill,
4916
- !filter.origin && styles.operatorPill,
4917
- filter.origin && styles.keyPill,
4918
- operatorIdentifier
4919
- ),
4879
+ className: css.cx(styles.basePill, styles.operatorPill, operatorIdentifier),
4880
+ role: "button",
4920
4881
  "aria-label": "Edit filter operator",
4921
- tabIndex: filter.origin ? -1 : 0,
4882
+ tabIndex: 0,
4922
4883
  onClick: (event) => {
4923
- if (filter.origin) {
4924
- handleChangeViewMode == null ? void 0 : handleChangeViewMode();
4925
- return;
4926
- }
4927
4884
  event.stopPropagation();
4928
4885
  setInputValue("");
4929
4886
  switchInputType("operator", setInputType, void 0, refs.domReference.current);
4930
4887
  },
4931
4888
  onKeyDown: (event) => {
4932
- if (filter.origin) {
4933
- return;
4934
- }
4935
4889
  handleShiftTabInput(event, hasMultiValueOperator);
4936
4890
  if (event.key === "Enter") {
4937
4891
  setInputValue("");
4938
4892
  switchInputType("operator", setInputType, void 0, refs.domReference.current);
4939
4893
  }
4940
4894
  }
4941
- }, !filter.origin && { role: "button" }), filter.operator) : null, /* @__PURE__ */ React__default["default"].createElement("div", {
4895
+ }, filter.operator) : null, /* @__PURE__ */ React__default["default"].createElement("div", {
4942
4896
  ref: multiValuePillWrapperRef
4943
4897
  }), isMultiValueEdit ? filterMultiValues.map((item, i) => /* @__PURE__ */ React__default["default"].createElement(MultiValuePill, {
4944
4898
  key: `${item.value}-${i}`,
@@ -5185,13 +5139,13 @@ function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }) {
5185
5139
  const handleChangeViewMode = React.useCallback(
5186
5140
  (event, shouldFocusOnPillWrapperOverride) => {
5187
5141
  event == null ? void 0 : event.stopPropagation();
5188
- if (readOnly) {
5142
+ if (readOnly || filter.origin) {
5189
5143
  return;
5190
5144
  }
5191
5145
  setShouldFocusOnPillWrapper(shouldFocusOnPillWrapperOverride != null ? shouldFocusOnPillWrapperOverride : !viewMode);
5192
5146
  setViewMode(!viewMode);
5193
5147
  },
5194
- [readOnly, viewMode]
5148
+ [readOnly, viewMode, filter.origin]
5195
5149
  );
5196
5150
  React.useEffect(() => {
5197
5151
  var _a2;
@@ -5255,20 +5209,11 @@ function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }) {
5255
5209
  size: "md",
5256
5210
  className: styles.pillIcon,
5257
5211
  tooltip: `Remove filter with key ${keyLabel}`
5258
- }) : null, filter.origin && !filter.originalValue && /* @__PURE__ */ React__default["default"].createElement(ui.IconButton, {
5212
+ }) : null, filter.origin && /* @__PURE__ */ React__default["default"].createElement(ui.IconButton, {
5259
5213
  name: "info-circle",
5260
5214
  size: "md",
5261
5215
  className: styles.pillIcon,
5262
5216
  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`
5272
5217
  }));
5273
5218
  }
5274
5219
  return /* @__PURE__ */ React__default["default"].createElement(AdHocCombobox, {
@@ -5533,17 +5478,14 @@ const OPERATORS = [
5533
5478
  ];
5534
5479
  class AdHocFiltersVariable extends SceneObjectBase {
5535
5480
  constructor(state) {
5536
- var _a, _b, _c, _d, _e;
5481
+ var _a, _b;
5537
5482
  super(__spreadValues$z({
5538
5483
  type: "adhoc",
5539
5484
  name: (_a = state.name) != null ? _a : "Filters",
5540
5485
  filters: [],
5541
5486
  datasource: null,
5542
5487
  applyMode: "auto",
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
- ])
5488
+ filterExpression: (_b = state.filterExpression) != null ? _b : renderExpression(state.expressionBuilder, state.filters)
5547
5489
  }, state));
5548
5490
  this._scopedVars = { __sceneObject: wrapInSafeSerializableSceneObject(this) };
5549
5491
  this._dataSourceSrv = runtime.getDataSourceSrv();
@@ -5556,38 +5498,18 @@ class AdHocFiltersVariable extends SceneObjectBase {
5556
5498
  this._updateScopesFilters(scopes);
5557
5499
  }
5558
5500
  const sub = (_b = this._scopesBridge) == null ? void 0 : _b.subscribeToValue((n, _) => {
5559
- this._updateScopesFilters(n, true);
5501
+ this._updateScopesFilters(n);
5560
5502
  });
5561
5503
  return () => {
5562
5504
  sub == null ? void 0 : sub.unsubscribe();
5563
5505
  };
5564
5506
  };
5565
- this._updateScopesFilters = (scopes, overwrite) => {
5566
- var _a;
5567
- const scopeInjectedFilters = [];
5568
- const remainingFilters = [];
5569
- (_a = this.state.baseFilters) == null ? void 0 : _a.forEach((filter) => {
5570
- if (filter.origin === "scopes" /* Scopes */) {
5571
- scopeInjectedFilters.push(filter);
5572
- } else {
5573
- remainingFilters.push(filter);
5574
- }
5575
- });
5576
- const scopeFilters = getAdHocFiltersFromScopes(scopes);
5577
- let finalFilters = scopeFilters;
5578
- if (!overwrite) {
5579
- const editedScopeFilters = scopeInjectedFilters.filter((filter) => {
5580
- var _a2;
5581
- return (_a2 = filter.originalValue) == null ? void 0 : _a2.length;
5582
- });
5583
- const editedScopeFilterKeys = editedScopeFilters.map((filter) => filter.key);
5584
- const scopeFilterKeys = scopeFilters.map((filter) => filter.key);
5585
- finalFilters = [
5586
- ...editedScopeFilters.filter((filter) => scopeFilterKeys.includes(filter.key)),
5587
- ...scopeFilters.filter((filter) => !editedScopeFilterKeys.includes(filter.key))
5588
- ];
5589
- }
5590
- const newFilters = [...remainingFilters, ...finalFilters];
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
+ ];
5591
5513
  this.setState({ baseFilters: newFilters });
5592
5514
  };
5593
5515
  if (this.state.applyMode === "auto") {
@@ -5596,15 +5518,9 @@ class AdHocFiltersVariable extends SceneObjectBase {
5596
5518
  this.addActivationHandler(this._activationHandler);
5597
5519
  }
5598
5520
  setState(update) {
5599
- var _a, _b, _c;
5600
5521
  let filterExpressionChanged = false;
5601
- if ((update.filters && update.filters !== this.state.filters || update.baseFilters && update.baseFilters !== this.state.baseFilters) && !update.filterExpression) {
5602
- const filters = (_a = update.filters) != null ? _a : this.state.filters;
5603
- const baseFilters = (_b = update.baseFilters) != null ? _b : this.state.baseFilters;
5604
- update.filterExpression = renderExpression(this.state.expressionBuilder, [
5605
- ...(_c = baseFilters == null ? void 0 : baseFilters.filter((filter) => filter.origin)) != null ? _c : [],
5606
- ...filters != null ? filters : []
5607
- ]);
5522
+ if (update.filters && update.filters !== this.state.filters && !update.filterExpression) {
5523
+ update.filterExpression = renderExpression(this.state.expressionBuilder, update.filters);
5608
5524
  filterExpressionChanged = update.filterExpression !== this.state.filterExpression;
5609
5525
  }
5610
5526
  super.setState(update);
@@ -5613,14 +5529,10 @@ class AdHocFiltersVariable extends SceneObjectBase {
5613
5529
  }
5614
5530
  }
5615
5531
  updateFilters(filters, options) {
5616
- var _a, _b;
5617
5532
  let filterExpressionChanged = false;
5618
5533
  let filterExpression = void 0;
5619
5534
  if (filters && filters !== this.state.filters) {
5620
- filterExpression = renderExpression(this.state.expressionBuilder, [
5621
- ...(_b = (_a = this.state.baseFilters) == null ? void 0 : _a.filter((filter) => filter.origin)) != null ? _b : [],
5622
- ...filters
5623
- ]);
5535
+ filterExpression = renderExpression(this.state.expressionBuilder, filters);
5624
5536
  filterExpressionChanged = filterExpression !== this.state.filterExpression;
5625
5537
  }
5626
5538
  super.setState({
@@ -5631,40 +5543,11 @@ class AdHocFiltersVariable extends SceneObjectBase {
5631
5543
  this.publishEvent(new SceneVariableValueChangedEvent(this), true);
5632
5544
  }
5633
5545
  }
5634
- restoreOriginalFilter(filter) {
5635
- var _a;
5636
- const original = {
5637
- originalValue: void 0
5638
- };
5639
- if ((_a = filter.originalValue) == null ? void 0 : _a.length) {
5640
- original.value = filter.originalValue[0];
5641
- original.values = filter.originalValue;
5642
- original.valueLabels = filter.originalValue;
5643
- }
5644
- this._updateFilter(filter, original);
5645
- }
5646
5546
  getValue() {
5647
5547
  return this.state.filterExpression;
5648
5548
  }
5649
5549
  _updateFilter(filter, update) {
5650
- var _a;
5651
- const { baseFilters, filters, _wip } = this.state;
5652
- if (filter.origin) {
5653
- const currentValues = filter.values ? filter.values : [filter.value];
5654
- const updateValues = update.values || (update.value ? [update.value] : void 0);
5655
- const originalValueOverride = update.hasOwnProperty("originalValue");
5656
- if (!originalValueOverride && updateValues && !filter.originalValue && !lodash.isEqual(currentValues, updateValues)) {
5657
- update.originalValue = currentValues;
5658
- }
5659
- if (!originalValueOverride && lodash.isEqual(updateValues, filter.originalValue)) {
5660
- update.originalValue = void 0;
5661
- }
5662
- const updatedBaseFilters = (_a = baseFilters == null ? void 0 : baseFilters.map((f) => {
5663
- return f === filter ? __spreadValues$z(__spreadValues$z({}, f), update) : f;
5664
- })) != null ? _a : [];
5665
- this.setState({ baseFilters: updatedBaseFilters });
5666
- return;
5667
- }
5550
+ const { filters, _wip } = this.state;
5668
5551
  if (filter === _wip) {
5669
5552
  if ("value" in update && update["value"] !== "") {
5670
5553
  this.setState({ filters: [...filters, __spreadValues$z(__spreadValues$z({}, _wip), update)], _wip: void 0 });
@@ -5692,7 +5575,6 @@ class AdHocFiltersVariable extends SceneObjectBase {
5692
5575
  }
5693
5576
  }
5694
5577
  _handleComboboxBackspace(filter) {
5695
- var _a;
5696
5578
  if (this.state.filters.length) {
5697
5579
  let filterToForceIndex = this.state.filters.length - 1;
5698
5580
  if (filter !== this.state._wip) {
@@ -5714,27 +5596,6 @@ class AdHocFiltersVariable extends SceneObjectBase {
5714
5596
  return [...acc, f];
5715
5597
  }, [])
5716
5598
  });
5717
- } else if ((_a = this.state.baseFilters) == null ? void 0 : _a.length) {
5718
- let filterToForceIndex = this.state.baseFilters.length - 1;
5719
- if (filter !== this.state._wip) {
5720
- filterToForceIndex = -1;
5721
- }
5722
- this.setState({
5723
- baseFilters: this.state.baseFilters.reduce((acc, f, index) => {
5724
- if (index === filterToForceIndex) {
5725
- return [
5726
- ...acc,
5727
- __spreadProps$n(__spreadValues$z({}, f), {
5728
- forceEdit: true
5729
- })
5730
- ];
5731
- }
5732
- if (f === filter) {
5733
- return acc;
5734
- }
5735
- return [...acc, f];
5736
- }, [])
5737
- });
5738
5599
  }
5739
5600
  }
5740
5601
  async _getKeys(currentKey) {
@@ -5773,7 +5634,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
5773
5634
  return keys.map(toSelectableValue);
5774
5635
  }
5775
5636
  async _getValuesFor(filter) {
5776
- var _a, _b, _c, _d, _e;
5637
+ var _a, _b, _c, _d;
5777
5638
  const override = await ((_b = (_a = this.state).getTagValuesProvider) == null ? void 0 : _b.call(_a, this, filter));
5778
5639
  if (override && override.replace) {
5779
5640
  return dataFromResponse(override.values).map(toSelectableValue);
@@ -5782,26 +5643,15 @@ class AdHocFiltersVariable extends SceneObjectBase {
5782
5643
  if (!ds || !ds.getTagValues) {
5783
5644
  return [];
5784
5645
  }
5785
- const filteredBaseFilters = (_d = (_c = this.state.baseFilters) == null ? void 0 : _c.filter((f) => f.origin && f.key !== filter.key)) != null ? _d : [];
5786
- const otherFilters = this.state.filters.filter((f) => f.key !== filter.key).concat(filteredBaseFilters);
5646
+ const otherFilters = this.state.filters.filter((f) => f.key !== filter.key).concat((_c = this.state.baseFilters) != null ? _c : []);
5787
5647
  const timeRange = sceneGraph.getTimeRange(this).state.value;
5788
5648
  const queries = this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : void 0;
5789
- let scopes = (_e = this._scopesBridge) == null ? void 0 : _e.getValue();
5790
- if (filter.origin === "scopes" /* Scopes */) {
5791
- scopes = scopes == null ? void 0 : scopes.map((scope) => {
5792
- return __spreadProps$n(__spreadValues$z({}, scope), {
5793
- spec: __spreadProps$n(__spreadValues$z({}, scope.spec), {
5794
- filters: scope.spec.filters.filter((f) => f.key !== filter.key)
5795
- })
5796
- });
5797
- });
5798
- }
5799
5649
  const response = await ds.getTagValues(__spreadValues$z({
5800
5650
  key: filter.key,
5801
5651
  filters: otherFilters,
5802
5652
  timeRange,
5803
5653
  queries,
5804
- scopes
5654
+ scopes: (_d = this._scopesBridge) == null ? void 0 : _d.getValue()
5805
5655
  }, getEnrichedFiltersRequest(this)));
5806
5656
  if (responseHasError(response)) {
5807
5657
  this.setState({ error: response.error.message });
@@ -6520,15 +6370,6 @@ function escapeUrlCommaDelimiters(value) {
6520
6370
  }
6521
6371
  return /,/g[Symbol.replace](value, "__gfc__");
6522
6372
  }
6523
- function escapeUrlHashDelimiters(value) {
6524
- if (value === null || value === void 0) {
6525
- return "";
6526
- }
6527
- return /#/g[Symbol.replace](value, "__gfh__");
6528
- }
6529
- function escapeInjectedFilterUrlDelimiters(value) {
6530
- return escapeUrlHashDelimiters(escapeUrlPipeDelimiters(value));
6531
- }
6532
6373
  function escapeURLDelimiters(value) {
6533
6374
  return escapeUrlCommaDelimiters(escapeUrlPipeDelimiters(value));
6534
6375
  }
@@ -6538,7 +6379,6 @@ function unescapeUrlDelimiters(value) {
6538
6379
  }
6539
6380
  value = /__gfp__/g[Symbol.replace](value, "|");
6540
6381
  value = /__gfc__/g[Symbol.replace](value, ",");
6541
- value = /__gfh__/g[Symbol.replace](value, "#");
6542
6382
  return value;
6543
6383
  }
6544
6384
  function toUrlCommaDelimitedString(key, label) {
@@ -10984,7 +10824,11 @@ async function getExploreURL(data, model, timeRange, transform) {
10984
10824
  return (_a2 = transform == null ? void 0 : transform(q)) != null ? _a2 : q;
10985
10825
  });
10986
10826
  const queries = interpolatedQueries != null ? interpolatedQueries : [];
10987
- const datasource = (_d = (_c = queries.find((query) => {
10827
+ const hasMixedDatasources = new Set(queries.map((q) => {
10828
+ var _a2;
10829
+ return (_a2 = q.datasource) == null ? void 0 : _a2.uid;
10830
+ })).size > 1;
10831
+ let datasource = hasMixedDatasources ? "-- Mixed --" : (_d = (_c = queries.find((query) => {
10988
10832
  var _a2;
10989
10833
  return !!((_a2 = query.datasource) == null ? void 0 : _a2.uid);
10990
10834
  })) == null ? void 0 : _c.datasource) == null ? void 0 : _d.uid;
@@ -11014,10 +10858,12 @@ function VizPanelExploreButtonComponent({ model }) {
11014
10858
  const { options } = model.useState();
11015
10859
  const { data } = sceneGraph.getData(model).useState();
11016
10860
  const { from, to } = sceneGraph.getTimeRange(model).useState();
11017
- const { value: exploreLink } = reactUse.useAsync(
11018
- async () => data ? getExploreURL(data, model, { from, to }, options.transform) : "",
11019
- [data, model, from, to]
11020
- );
10861
+ const { value: exploreLink } = reactUse.useAsync(async () => {
10862
+ if (!data) {
10863
+ return "";
10864
+ }
10865
+ return getExploreURL(data, model, { from, to }, options.transform);
10866
+ }, [data, model, from, to]);
11021
10867
  const returnToPrevious = runtime.useReturnToPrevious();
11022
10868
  if (exploreLink) {
11023
10869
  return /* @__PURE__ */ React__default["default"].createElement(ui.LinkButton, {