@grafana/scenes 6.50.0--canary.1312.20243507649.0 → 6.50.0--canary.1312.20266554849.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.
@@ -18,7 +18,7 @@ const AdHocFiltersComboboxRenderer = memo(function AdHocFiltersComboboxRenderer2
18
18
  }
19
19
  },
20
20
  /* @__PURE__ */ React.createElement(Icon, { name: "filter", className: styles.filterIcon, size: "lg" }),
21
- drilldownRecommendationsEnabled && valueRecommendations && /* @__PURE__ */ React.createElement(valueRecommendations.Component, { model: valueRecommendations }),
21
+ drilldownRecommendationsEnabled && valueRecommendations && valueRecommendations.render(),
22
22
  originFilters == null ? void 0 : originFilters.map(
23
23
  (filter, index) => filter.origin ? /* @__PURE__ */ React.createElement(
24
24
  AdHocFilterPill,
@@ -1 +1 @@
1
- {"version":3,"file":"AdHocFiltersComboboxRenderer.js","sources":["../../../../../../../../src/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersComboboxRenderer.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Icon, useStyles2 } from '@grafana/ui';\nimport React, { memo, useRef } from 'react';\nimport { AdHocFiltersController } from '../controller/AdHocFiltersController';\nimport { AdHocFilterPill } from './AdHocFilterPill';\nimport { AdHocFiltersAlwaysWipCombobox } from './AdHocFiltersAlwaysWipCombobox';\n\ninterface Props {\n controller: AdHocFiltersController;\n}\n\nexport const AdHocFiltersComboboxRenderer = memo(function AdHocFiltersComboboxRenderer({ controller }: Props) {\n const { originFilters, filters, readOnly, valueRecommendations, drilldownRecommendationsEnabled } =\n controller.useState();\n const styles = useStyles2(getStyles);\n\n // ref that focuses on the always wip filter input\n // defined in the combobox component via useImperativeHandle\n const focusOnWipInputRef = useRef<() => void>();\n\n return (\n <div\n className={cx(styles.comboboxWrapper, { [styles.comboboxFocusOutline]: !readOnly })}\n onClick={() => {\n focusOnWipInputRef.current?.();\n }}\n >\n <Icon name=\"filter\" className={styles.filterIcon} size=\"lg\" />\n\n {drilldownRecommendationsEnabled && valueRecommendations && (\n <valueRecommendations.Component model={valueRecommendations} />\n )}\n\n {originFilters?.map((filter, index) =>\n filter.origin ? (\n <AdHocFilterPill\n key={`${index}-${filter.key}`}\n filter={filter}\n controller={controller}\n focusOnWipInputRef={focusOnWipInputRef.current}\n />\n ) : null\n )}\n\n {filters\n .filter((filter) => !filter.hidden)\n .map((filter, index) => (\n <AdHocFilterPill\n key={`${index}-${filter.key}`}\n filter={filter}\n controller={controller}\n readOnly={readOnly || filter.readOnly}\n focusOnWipInputRef={focusOnWipInputRef.current}\n />\n ))}\n\n {!readOnly ? <AdHocFiltersAlwaysWipCombobox controller={controller} ref={focusOnWipInputRef} /> : null}\n </div>\n );\n});\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n comboboxWrapper: css({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n columnGap: theme.spacing(1),\n rowGap: theme.spacing(0.5),\n minHeight: theme.spacing(4),\n backgroundColor: theme.components.input.background,\n border: `1px solid ${theme.colors.border.strong}`,\n borderRadius: theme.shape.radius.default,\n paddingInline: theme.spacing(1),\n paddingBlock: theme.spacing(0.5),\n flexGrow: 1,\n }),\n comboboxFocusOutline: css({\n '&:focus-within': {\n outline: '2px dotted transparent',\n outlineOffset: '2px',\n boxShadow: `0 0 0 2px ${theme.colors.background.canvas}, 0 0 0px 4px ${theme.colors.primary.main}`,\n transitionTimingFunction: `cubic-bezier(0.19, 1, 0.22, 1)`,\n transitionDuration: '0.2s',\n transitionProperty: 'outline, outline-offset, box-shadow',\n zIndex: 2,\n },\n }),\n filterIcon: css({\n color: theme.colors.text.secondary,\n alignSelf: 'center',\n }),\n});\n"],"names":["AdHocFiltersComboboxRenderer"],"mappings":";;;;;;AAYO,MAAM,+BAA+B,IAAK,CAAA,SAASA,6BAA6B,CAAA,EAAE,YAAqB,EAAA;AAC5G,EAAM,MAAA,EAAE,eAAe,OAAS,EAAA,QAAA,EAAU,sBAAsB,+BAAgC,EAAA,GAC9F,WAAW,QAAS,EAAA;AACtB,EAAM,MAAA,MAAA,GAAS,WAAW,SAAS,CAAA;AAInC,EAAA,MAAM,qBAAqB,MAAmB,EAAA;AAE9C,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAG,CAAA,MAAA,CAAO,eAAiB,EAAA,EAAE,CAAC,MAAA,CAAO,oBAAoB,GAAG,CAAC,QAAA,EAAU,CAAA;AAAA,MAClF,SAAS,MAAM;AAxBrB,QAAA,IAAA,EAAA;AAyBQ,QAAA,CAAA,EAAA,GAAA,kBAAA,CAAmB,OAAnB,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,kBAAA,CAAA;AAAA;AACF,KAAA;AAAA,oBAEA,KAAA,CAAA,aAAA,CAAC,QAAK,IAAK,EAAA,QAAA,EAAS,WAAW,MAAO,CAAA,UAAA,EAAY,MAAK,IAAK,EAAA,CAAA;AAAA,IAE3D,mCAAmC,oBAClC,oBAAA,KAAA,CAAA,aAAA,CAAC,qBAAqB,SAArB,EAAA,EAA+B,OAAO,oBAAsB,EAAA,CAAA;AAAA,IAG9D,aAAe,IAAA,IAAA,GAAA,MAAA,GAAA,aAAA,CAAA,GAAA;AAAA,MAAI,CAAC,MAAA,EAAQ,KAC3B,KAAA,MAAA,CAAO,MACL,mBAAA,KAAA,CAAA,aAAA;AAAA,QAAC,eAAA;AAAA,QAAA;AAAA,UACC,GAAK,EAAA,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,OAAO,GAAG,CAAA,CAAA;AAAA,UAC3B,MAAA;AAAA,UACA,UAAA;AAAA,UACA,oBAAoB,kBAAmB,CAAA;AAAA;AAAA,OAEvC,GAAA;AAAA,KAAA;AAAA,IAGL,OAAA,CACE,MAAO,CAAA,CAAC,MAAW,KAAA,CAAC,MAAO,CAAA,MAAM,CACjC,CAAA,GAAA,CAAI,CAAC,MAAA,EAAQ,KACZ,qBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,GAAK,EAAA,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,OAAO,GAAG,CAAA,CAAA;AAAA,QAC3B,MAAA;AAAA,QACA,UAAA;AAAA,QACA,QAAA,EAAU,YAAY,MAAO,CAAA,QAAA;AAAA,QAC7B,oBAAoB,kBAAmB,CAAA;AAAA;AAAA,KAE1C,CAAA;AAAA,IAEF,CAAC,QAAW,mBAAA,KAAA,CAAA,aAAA,CAAC,iCAA8B,UAAwB,EAAA,GAAA,EAAK,oBAAoB,CAAK,GAAA;AAAA,GACpG;AAEJ,CAAC;AAED,MAAM,SAAA,GAAY,CAAC,KAA0B,MAAA;AAAA,EAC3C,iBAAiB,GAAI,CAAA;AAAA,IACnB,OAAS,EAAA,MAAA;AAAA,IACT,QAAU,EAAA,MAAA;AAAA,IACV,UAAY,EAAA,QAAA;AAAA,IACZ,SAAA,EAAW,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC1B,MAAA,EAAQ,KAAM,CAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,IACzB,SAAA,EAAW,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC1B,eAAA,EAAiB,KAAM,CAAA,UAAA,CAAW,KAAM,CAAA,UAAA;AAAA,IACxC,MAAQ,EAAA,CAAA,UAAA,EAAa,KAAM,CAAA,MAAA,CAAO,OAAO,MAAM,CAAA,CAAA;AAAA,IAC/C,YAAA,EAAc,KAAM,CAAA,KAAA,CAAM,MAAO,CAAA,OAAA;AAAA,IACjC,aAAA,EAAe,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC9B,YAAA,EAAc,KAAM,CAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,IAC/B,QAAU,EAAA;AAAA,GACX,CAAA;AAAA,EACD,sBAAsB,GAAI,CAAA;AAAA,IACxB,gBAAkB,EAAA;AAAA,MAChB,OAAS,EAAA,wBAAA;AAAA,MACT,aAAe,EAAA,KAAA;AAAA,MACf,SAAA,EAAW,CAAa,UAAA,EAAA,KAAA,CAAM,MAAO,CAAA,UAAA,CAAW,MAAM,CAAiB,cAAA,EAAA,KAAA,CAAM,MAAO,CAAA,OAAA,CAAQ,IAAI,CAAA,CAAA;AAAA,MAChG,wBAA0B,EAAA,CAAA,8BAAA,CAAA;AAAA,MAC1B,kBAAoB,EAAA,MAAA;AAAA,MACpB,kBAAoB,EAAA,qCAAA;AAAA,MACpB,MAAQ,EAAA;AAAA;AACV,GACD,CAAA;AAAA,EACD,YAAY,GAAI,CAAA;AAAA,IACd,KAAA,EAAO,KAAM,CAAA,MAAA,CAAO,IAAK,CAAA,SAAA;AAAA,IACzB,SAAW,EAAA;AAAA,GACZ;AACH,CAAA,CAAA;;;;"}
1
+ {"version":3,"file":"AdHocFiltersComboboxRenderer.js","sources":["../../../../../../../../src/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersComboboxRenderer.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Icon, useStyles2 } from '@grafana/ui';\nimport React, { memo, useRef } from 'react';\nimport { AdHocFiltersController } from '../controller/AdHocFiltersController';\nimport { AdHocFilterPill } from './AdHocFilterPill';\nimport { AdHocFiltersAlwaysWipCombobox } from './AdHocFiltersAlwaysWipCombobox';\n\ninterface Props {\n controller: AdHocFiltersController;\n}\n\nexport const AdHocFiltersComboboxRenderer = memo(function AdHocFiltersComboboxRenderer({ controller }: Props) {\n const { originFilters, filters, readOnly, valueRecommendations, drilldownRecommendationsEnabled } =\n controller.useState();\n const styles = useStyles2(getStyles);\n\n // ref that focuses on the always wip filter input\n // defined in the combobox component via useImperativeHandle\n const focusOnWipInputRef = useRef<() => void>();\n\n return (\n <div\n className={cx(styles.comboboxWrapper, { [styles.comboboxFocusOutline]: !readOnly })}\n onClick={() => {\n focusOnWipInputRef.current?.();\n }}\n >\n <Icon name=\"filter\" className={styles.filterIcon} size=\"lg\" />\n\n {drilldownRecommendationsEnabled && valueRecommendations && valueRecommendations.render()}\n\n {originFilters?.map((filter, index) =>\n filter.origin ? (\n <AdHocFilterPill\n key={`${index}-${filter.key}`}\n filter={filter}\n controller={controller}\n focusOnWipInputRef={focusOnWipInputRef.current}\n />\n ) : null\n )}\n\n {filters\n .filter((filter) => !filter.hidden)\n .map((filter, index) => (\n <AdHocFilterPill\n key={`${index}-${filter.key}`}\n filter={filter}\n controller={controller}\n readOnly={readOnly || filter.readOnly}\n focusOnWipInputRef={focusOnWipInputRef.current}\n />\n ))}\n\n {!readOnly ? <AdHocFiltersAlwaysWipCombobox controller={controller} ref={focusOnWipInputRef} /> : null}\n </div>\n );\n});\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n comboboxWrapper: css({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n columnGap: theme.spacing(1),\n rowGap: theme.spacing(0.5),\n minHeight: theme.spacing(4),\n backgroundColor: theme.components.input.background,\n border: `1px solid ${theme.colors.border.strong}`,\n borderRadius: theme.shape.radius.default,\n paddingInline: theme.spacing(1),\n paddingBlock: theme.spacing(0.5),\n flexGrow: 1,\n }),\n comboboxFocusOutline: css({\n '&:focus-within': {\n outline: '2px dotted transparent',\n outlineOffset: '2px',\n boxShadow: `0 0 0 2px ${theme.colors.background.canvas}, 0 0 0px 4px ${theme.colors.primary.main}`,\n transitionTimingFunction: `cubic-bezier(0.19, 1, 0.22, 1)`,\n transitionDuration: '0.2s',\n transitionProperty: 'outline, outline-offset, box-shadow',\n zIndex: 2,\n },\n }),\n filterIcon: css({\n color: theme.colors.text.secondary,\n alignSelf: 'center',\n }),\n});\n"],"names":["AdHocFiltersComboboxRenderer"],"mappings":"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"}
@@ -1,73 +1,68 @@
1
1
  import React from 'react';
2
2
  import { config } from '@grafana/runtime';
3
3
  import { store } from '@grafana/data';
4
- import { SceneObjectBase } from '../../core/SceneObjectBase.js';
5
4
  import { sceneGraph } from '../../core/sceneGraph/index.js';
6
5
  import { getEnrichedDataRequest } from '../../querying/getEnrichedDataRequest.js';
7
6
  import { getQueriesForVariables } from '../utils.js';
8
- import { wrapInSafeSerializableSceneObject } from '../../utils/wrapInSafeSerializableSceneObject.js';
9
7
  import { getDataSource } from '../../utils/getDataSource.js';
10
- import { getEnrichedFiltersRequest } from '../getEnrichedFiltersRequest.js';
11
8
  import { DrilldownRecommendations } from '../components/DrilldownRecommendations.js';
12
9
  import { ScopesVariable } from '../variants/ScopesVariable.js';
13
10
  import { SCOPES_VARIABLE_NAME } from '../constants.js';
14
11
 
15
12
  const getRecentFiltersKey = (datasourceUid) => `grafana.filters.recent.${datasourceUid != null ? datasourceUid : "default"}`;
16
- class AdHocFiltersRecommendations extends SceneObjectBase {
17
- constructor(parent) {
18
- super({});
19
- this._scopedVars = { __sceneObject: wrapInSafeSerializableSceneObject(this) };
20
- this._activationHandler = () => {
21
- const json = store.get(this._getStorageKey());
22
- const storedFilters = json ? JSON.parse(json) : [];
23
- if (storedFilters.length > 0) {
24
- this._verifyRecentFiltersApplicability(storedFilters);
25
- } else {
26
- this.setState({ recentFilters: [] });
27
- }
28
- this._fetchRecommendedDrilldowns();
29
- const scopesVariable = sceneGraph.lookupVariable(SCOPES_VARIABLE_NAME, this);
30
- let scopesSubscription;
31
- if (scopesVariable instanceof ScopesVariable) {
32
- scopesSubscription = scopesVariable.subscribeToState((newState, prevState) => {
33
- if (newState.scopes !== prevState.scopes) {
34
- const json2 = store.get(this._getStorageKey());
35
- const storedFilters2 = json2 ? JSON.parse(json2) : [];
36
- if (storedFilters2.length > 0) {
37
- this._verifyRecentFiltersApplicability(storedFilters2);
38
- }
13
+ class AdHocFiltersRecommendations {
14
+ constructor(adHocFilter, scopedVars) {
15
+ this.adHocFilter = adHocFilter;
16
+ this._scopedVars = scopedVars;
17
+ }
18
+ get recentFilters() {
19
+ return this._recentFilters;
20
+ }
21
+ get recommendedFilters() {
22
+ return this._recommendedFilters;
23
+ }
24
+ init() {
25
+ const json = store.get(this._getStorageKey());
26
+ const storedFilters = json ? JSON.parse(json) : [];
27
+ if (storedFilters.length > 0) {
28
+ this._verifyRecentFiltersApplicability(storedFilters);
29
+ } else {
30
+ this._recentFilters = [];
31
+ }
32
+ this._fetchRecommendedDrilldowns();
33
+ const scopesVariable = sceneGraph.lookupVariable(SCOPES_VARIABLE_NAME, this.adHocFilter);
34
+ if (scopesVariable instanceof ScopesVariable) {
35
+ this.scopesSubscription = scopesVariable.subscribeToState((newState, prevState) => {
36
+ if (newState.scopes !== prevState.scopes) {
37
+ const json2 = store.get(this._getStorageKey());
38
+ const storedFilters2 = json2 ? JSON.parse(json2) : [];
39
+ if (storedFilters2.length > 0) {
40
+ this._verifyRecentFiltersApplicability(storedFilters2);
39
41
  }
40
- });
41
- }
42
- return () => {
43
- scopesSubscription == null ? void 0 : scopesSubscription.unsubscribe();
44
- };
45
- };
46
- this._parentVariable = parent;
47
- this.addActivationHandler(this._activationHandler);
42
+ }
43
+ });
44
+ }
48
45
  }
49
- /**
50
- * Get the parent variable
51
- */
52
- get parent() {
53
- return this._parentVariable;
46
+ deinit() {
47
+ var _a;
48
+ (_a = this.scopesSubscription) == null ? void 0 : _a.unsubscribe();
54
49
  }
55
50
  _getStorageKey() {
56
51
  var _a;
57
- return getRecentFiltersKey((_a = this._parentVariable.state.datasource) == null ? void 0 : _a.uid);
52
+ return getRecentFiltersKey((_a = this.adHocFilter.state.datasource) == null ? void 0 : _a.uid);
58
53
  }
59
54
  async _fetchRecommendedDrilldowns() {
60
55
  var _a;
61
- const parent = this._parentVariable;
62
- const ds = await getDataSource(parent.state.datasource, this._scopedVars);
56
+ const adhoc = this.adHocFilter;
57
+ const ds = await getDataSource(adhoc.state.datasource, this._scopedVars);
63
58
  if (!ds || !ds.getRecommendedDrilldowns) {
64
59
  return;
65
60
  }
66
- const queries = parent.state.useQueriesAsFilterForOptions ? getQueriesForVariables(parent) : void 0;
67
- const timeRange = sceneGraph.getTimeRange(this).state.value;
68
- const scopes = sceneGraph.getScopes(this);
69
- const filters = [...(_a = parent.state.originFilters) != null ? _a : [], ...parent.state.filters];
70
- const enrichedRequest = getEnrichedDataRequest(this);
61
+ const queries = adhoc.state.useQueriesAsFilterForOptions ? getQueriesForVariables(adhoc) : void 0;
62
+ const timeRange = sceneGraph.getTimeRange(adhoc).state.value;
63
+ const scopes = sceneGraph.getScopes(adhoc);
64
+ const filters = [...(_a = adhoc.state.originFilters) != null ? _a : [], ...adhoc.state.filters];
65
+ const enrichedRequest = getEnrichedDataRequest(adhoc);
71
66
  const dashboardUid = enrichedRequest == null ? void 0 : enrichedRequest.dashboardUID;
72
67
  try {
73
68
  const recommendedDrilldowns = await ds.getRecommendedDrilldowns({
@@ -79,18 +74,18 @@ class AdHocFiltersRecommendations extends SceneObjectBase {
79
74
  userId: config.bootData.user.id
80
75
  });
81
76
  if (recommendedDrilldowns == null ? void 0 : recommendedDrilldowns.filters) {
82
- this.setState({ recommendedFilters: recommendedDrilldowns.filters });
77
+ this._recommendedFilters = recommendedDrilldowns.filters;
83
78
  }
84
79
  } catch (error) {
85
80
  console.error("Failed to fetch recommended drilldowns:", error);
86
81
  }
87
82
  }
88
83
  async _verifyRecentFiltersApplicability(storedFilters) {
89
- const parent = this._parentVariable;
90
- const queries = parent.state.useQueriesAsFilterForOptions ? getQueriesForVariables(parent) : void 0;
91
- const response = await this._getFiltersApplicabilityForQueries(storedFilters, queries != null ? queries : []);
84
+ const adhoc = this.adHocFilter;
85
+ const queries = adhoc.state.useQueriesAsFilterForOptions ? getQueriesForVariables(adhoc) : void 0;
86
+ const response = await adhoc.getFiltersApplicabilityForQueries(storedFilters, queries != null ? queries : []);
92
87
  if (!response) {
93
- this.setState({ recentFilters: storedFilters.slice(-3) });
88
+ this._recentFilters = storedFilters.slice(-3);
94
89
  return;
95
90
  }
96
91
  const applicabilityMap = /* @__PURE__ */ new Map();
@@ -101,22 +96,7 @@ class AdHocFiltersRecommendations extends SceneObjectBase {
101
96
  const isApplicable = applicabilityMap.get(f.key);
102
97
  return isApplicable === void 0 || isApplicable === true;
103
98
  }).slice(-3);
104
- this.setState({ recentFilters: applicableFilters });
105
- }
106
- async _getFiltersApplicabilityForQueries(filters, queries) {
107
- const parent = this._parentVariable;
108
- const ds = await getDataSource(parent.state.datasource, this._scopedVars);
109
- if (!ds || !ds.getDrilldownsApplicability) {
110
- return;
111
- }
112
- const timeRange = sceneGraph.getTimeRange(this).state.value;
113
- return await ds.getDrilldownsApplicability({
114
- filters,
115
- queries,
116
- timeRange,
117
- scopes: sceneGraph.getScopes(this),
118
- ...getEnrichedFiltersRequest(this)
119
- });
99
+ this._recentFilters = applicableFilters;
120
100
  }
121
101
  /**
122
102
  * Stores a recent filter in localStorage and updates state.
@@ -128,46 +108,35 @@ class AdHocFiltersRecommendations extends SceneObjectBase {
128
108
  const allRecentFilters = storedFilters ? JSON.parse(storedFilters) : [];
129
109
  const updatedStoredFilters = [...allRecentFilters, filter].slice(-10);
130
110
  store.set(key, JSON.stringify(updatedStoredFilters));
131
- const parent = this._parentVariable;
132
- const existingFilter = parent.state.filters.find((f) => f.key === filter.key && !Boolean(f.nonApplicable));
111
+ const adhoc = this.adHocFilter;
112
+ const existingFilter = adhoc.state.filters.find((f) => f.key === filter.key && !Boolean(f.nonApplicable));
133
113
  if (existingFilter && !Boolean(existingFilter.nonApplicable)) {
134
- this.setState({ recentFilters: updatedStoredFilters.slice(-3) });
114
+ this._recentFilters = updatedStoredFilters.slice(-3);
135
115
  }
136
116
  }
137
- /**
138
- * Get the current filters from the parent variable
139
- */
140
- getParentFilters() {
141
- return this._parentVariable.state.filters;
142
- }
143
- /**
144
- * Add a filter to the parent variable
145
- */
146
117
  addFilterToParent(filter) {
147
- const parent = this._parentVariable;
148
- parent.updateFilters([...parent.state.filters, filter]);
118
+ this.adHocFilter.updateFilters([...this.adHocFilter.state.filters, filter]);
149
119
  }
150
- }
151
- AdHocFiltersRecommendations.Component = AdHocFiltersRecommendationsRenderer;
152
- function AdHocFiltersRecommendationsRenderer({ model }) {
153
- const { recentFilters, recommendedFilters } = model.useState();
154
- const { filters } = model.parent.useState();
155
- const recentDrilldowns = recentFilters == null ? void 0 : recentFilters.map((filter) => ({
156
- label: `${filter.key} ${filter.operator} ${filter.value}`,
157
- onClick: () => {
158
- model.addFilterToParent(filter);
159
- }
160
- }));
161
- const recommendedDrilldowns = recommendedFilters == null ? void 0 : recommendedFilters.map((filter) => ({
162
- label: `${filter.key} ${filter.operator} ${filter.value}`,
163
- onClick: () => {
164
- const exists = filters.some((f) => f.key === filter.key && f.value === filter.value);
165
- if (!exists) {
166
- model.addFilterToParent(filter);
120
+ render() {
121
+ var _a, _b;
122
+ const { filters } = this.adHocFilter.useState();
123
+ const recentDrilldowns = (_a = this.recentFilters) == null ? void 0 : _a.map((filter) => ({
124
+ label: `${filter.key} ${filter.operator} ${filter.value}`,
125
+ onClick: () => {
126
+ this.addFilterToParent(filter);
167
127
  }
168
- }
169
- }));
170
- return /* @__PURE__ */ React.createElement(DrilldownRecommendations, { recentDrilldowns, recommendedDrilldowns });
128
+ }));
129
+ const recommendedDrilldowns = (_b = this.recommendedFilters) == null ? void 0 : _b.map((filter) => ({
130
+ label: `${filter.key} ${filter.operator} ${filter.value}`,
131
+ onClick: () => {
132
+ const exists = filters.some((f) => f.key === filter.key && f.value === filter.value);
133
+ if (!exists) {
134
+ this.addFilterToParent(filter);
135
+ }
136
+ }
137
+ }));
138
+ return /* @__PURE__ */ React.createElement(DrilldownRecommendations, { recentDrilldowns, recommendedDrilldowns });
139
+ }
171
140
  }
172
141
 
173
142
  export { AdHocFiltersRecommendations, getRecentFiltersKey };
@@ -1 +1 @@
1
- {"version":3,"file":"AdHocFiltersRecommendations.js","sources":["../../../../../../../src/variables/adhoc/AdHocFiltersRecommendations.tsx"],"sourcesContent":["import React from 'react';\nimport { config } from '@grafana/runtime';\nimport {\n // @ts-expect-error (temporary till we update grafana/data)\n DrilldownsApplicability,\n store,\n} from '@grafana/data';\nimport { Unsubscribable } from 'rxjs';\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { SceneComponentProps, SceneDataQuery, SceneObjectState } from '../../core/types';\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { getEnrichedDataRequest } from '../../querying/getEnrichedDataRequest';\nimport { getQueriesForVariables } from '../utils';\nimport { wrapInSafeSerializableSceneObject } from '../../utils/wrapInSafeSerializableSceneObject';\nimport { getDataSource } from '../../utils/getDataSource';\nimport { getEnrichedFiltersRequest } from '../getEnrichedFiltersRequest';\nimport { DrilldownRecommendations, DrilldownPill } from '../components/DrilldownRecommendations';\nimport { ScopesVariable } from '../variants/ScopesVariable';\nimport { SCOPES_VARIABLE_NAME } from '../constants';\nimport { AdHocFilterWithLabels, AdHocFiltersVariable } from './AdHocFiltersVariable';\n\nexport const MAX_RECENT_DRILLDOWNS = 3;\nexport const MAX_STORED_RECENT_DRILLDOWNS = 10;\n\nexport const getRecentFiltersKey = (datasourceUid: string | undefined) =>\n `grafana.filters.recent.${datasourceUid ?? 'default'}`;\n\nexport interface AdHocFiltersRecommendationsState extends SceneObjectState {\n /** Recent filters */\n recentFilters?: AdHocFilterWithLabels[];\n /** Recommended filters */\n recommendedFilters?: AdHocFilterWithLabels[];\n}\n\n/**\n * Scene object component that manages recommendations for AdHocFiltersVariable.\n * It handles fetching recommended drilldowns, verifying applicability of recent filters,\n * and storing/displaying recent filters.\n */\nexport class AdHocFiltersRecommendations extends SceneObjectBase<AdHocFiltersRecommendationsState> {\n static Component = AdHocFiltersRecommendationsRenderer;\n\n private _scopedVars = { __sceneObject: wrapInSafeSerializableSceneObject(this) };\n\n // Store parent as a class property, not in state, to avoid circular parent references\n private _parentVariable: AdHocFiltersVariable;\n\n public constructor(parent: AdHocFiltersVariable) {\n super({});\n this._parentVariable = parent;\n this.addActivationHandler(this._activationHandler);\n }\n\n /**\n * Get the parent variable\n */\n public get parent(): AdHocFiltersVariable {\n return this._parentVariable;\n }\n\n private _activationHandler = () => {\n const json = store.get(this._getStorageKey());\n const storedFilters = json ? JSON.parse(json) : [];\n\n // Verify applicability of stored recent filters\n if (storedFilters.length > 0) {\n this._verifyRecentFiltersApplicability(storedFilters);\n } else {\n this.setState({ recentFilters: [] });\n }\n\n this._fetchRecommendedDrilldowns();\n\n // Subscribe to scopes variable changes\n const scopesVariable = sceneGraph.lookupVariable(SCOPES_VARIABLE_NAME, this);\n let scopesSubscription: Unsubscribable | undefined;\n\n if (scopesVariable instanceof ScopesVariable) {\n scopesSubscription = scopesVariable.subscribeToState((newState, prevState) => {\n // Check if scopes have changed\n if (newState.scopes !== prevState.scopes) {\n const json = store.get(this._getStorageKey());\n const storedFilters = json ? JSON.parse(json) : [];\n\n if (storedFilters.length > 0) {\n this._verifyRecentFiltersApplicability(storedFilters);\n }\n }\n });\n }\n\n return () => {\n scopesSubscription?.unsubscribe();\n };\n };\n\n private _getStorageKey(): string {\n return getRecentFiltersKey(this._parentVariable.state.datasource?.uid);\n }\n\n private async _fetchRecommendedDrilldowns() {\n const parent = this._parentVariable;\n const ds = await getDataSource(parent.state.datasource, this._scopedVars);\n\n // @ts-expect-error (temporary till we update grafana/data)\n if (!ds || !ds.getRecommendedDrilldowns) {\n return;\n }\n\n const queries = parent.state.useQueriesAsFilterForOptions ? getQueriesForVariables(parent) : undefined;\n const timeRange = sceneGraph.getTimeRange(this).state.value;\n const scopes = sceneGraph.getScopes(this);\n const filters = [...(parent.state.originFilters ?? []), ...parent.state.filters];\n\n const enrichedRequest = getEnrichedDataRequest(this);\n const dashboardUid = enrichedRequest?.dashboardUID;\n\n try {\n // @ts-expect-error (temporary till we update grafana/data)\n const recommendedDrilldowns = await ds.getRecommendedDrilldowns({\n timeRange,\n dashboardUid,\n queries: queries ?? [],\n filters,\n scopes,\n userId: config.bootData.user.id,\n });\n\n if (recommendedDrilldowns?.filters) {\n this.setState({ recommendedFilters: recommendedDrilldowns.filters });\n }\n } catch (error) {\n console.error('Failed to fetch recommended drilldowns:', error);\n }\n }\n\n private async _verifyRecentFiltersApplicability(storedFilters: AdHocFilterWithLabels[]) {\n const parent = this._parentVariable;\n const queries = parent.state.useQueriesAsFilterForOptions ? getQueriesForVariables(parent) : undefined;\n const response = await this._getFiltersApplicabilityForQueries(storedFilters, queries ?? []);\n\n if (!response) {\n this.setState({ recentFilters: storedFilters.slice(-MAX_RECENT_DRILLDOWNS) });\n return;\n }\n\n const applicabilityMap = new Map<string, boolean>();\n response.forEach((item: DrilldownsApplicability) => {\n applicabilityMap.set(item.key, item.applicable !== false);\n });\n\n const applicableFilters = storedFilters\n .filter((f) => {\n const isApplicable = applicabilityMap.get(f.key);\n return isApplicable === undefined || isApplicable === true;\n })\n .slice(-MAX_RECENT_DRILLDOWNS);\n\n this.setState({ recentFilters: applicableFilters });\n }\n\n private async _getFiltersApplicabilityForQueries(\n filters: AdHocFilterWithLabels[],\n queries: SceneDataQuery[]\n ): Promise<DrilldownsApplicability[] | undefined> {\n const parent = this._parentVariable;\n const ds = await getDataSource(parent.state.datasource, this._scopedVars);\n // @ts-expect-error (temporary till we update grafana/data)\n if (!ds || !ds.getDrilldownsApplicability) {\n return;\n }\n\n const timeRange = sceneGraph.getTimeRange(this).state.value;\n\n // @ts-expect-error (temporary till we update grafana/data)\n return await ds.getDrilldownsApplicability({\n filters,\n queries,\n timeRange,\n scopes: sceneGraph.getScopes(this),\n ...getEnrichedFiltersRequest(this),\n });\n }\n\n /**\n * Stores a recent filter in localStorage and updates state.\n * Should be called by the parent variable when a filter is added/updated.\n */\n public storeRecentFilter(filter: AdHocFilterWithLabels) {\n const key = this._getStorageKey();\n const storedFilters = store.get(key);\n const allRecentFilters = storedFilters ? JSON.parse(storedFilters) : [];\n\n const updatedStoredFilters = [...allRecentFilters, filter].slice(-MAX_STORED_RECENT_DRILLDOWNS);\n store.set(key, JSON.stringify(updatedStoredFilters));\n\n const parent = this._parentVariable;\n const existingFilter = parent.state.filters.find((f) => f.key === filter.key && !Boolean(f.nonApplicable));\n if (existingFilter && !Boolean(existingFilter.nonApplicable)) {\n this.setState({ recentFilters: updatedStoredFilters.slice(-MAX_RECENT_DRILLDOWNS) });\n }\n }\n\n /**\n * Get the current filters from the parent variable\n */\n public getParentFilters(): AdHocFilterWithLabels[] {\n return this._parentVariable.state.filters;\n }\n\n /**\n * Add a filter to the parent variable\n */\n public addFilterToParent(filter: AdHocFilterWithLabels) {\n const parent = this._parentVariable;\n parent.updateFilters([...parent.state.filters, filter]);\n }\n}\n\nfunction AdHocFiltersRecommendationsRenderer({ model }: SceneComponentProps<AdHocFiltersRecommendations>) {\n const { recentFilters, recommendedFilters } = model.useState();\n const { filters } = model.parent.useState();\n\n const recentDrilldowns: DrilldownPill[] | undefined = recentFilters?.map((filter) => ({\n label: `${filter.key} ${filter.operator} ${filter.value}`,\n onClick: () => {\n model.addFilterToParent(filter);\n },\n }));\n\n const recommendedDrilldowns: DrilldownPill[] | undefined = recommendedFilters?.map((filter) => ({\n label: `${filter.key} ${filter.operator} ${filter.value}`,\n onClick: () => {\n // Check if filter already exists\n const exists = filters.some((f) => f.key === filter.key && f.value === filter.value);\n if (!exists) {\n model.addFilterToParent(filter);\n }\n },\n }));\n\n return <DrilldownRecommendations recentDrilldowns={recentDrilldowns} recommendedDrilldowns={recommendedDrilldowns} />;\n}\n"],"names":["json","storedFilters"],"mappings":"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"}
1
+ {"version":3,"file":"AdHocFiltersRecommendations.js","sources":["../../../../../../../src/variables/adhoc/AdHocFiltersRecommendations.tsx"],"sourcesContent":["import React from 'react';\nimport { config } from '@grafana/runtime';\nimport {\n // @ts-expect-error (temporary till we update grafana/data)\n DrilldownsApplicability,\n ScopedVar,\n store,\n} from '@grafana/data';\nimport { Unsubscribable } from 'rxjs';\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { getEnrichedDataRequest } from '../../querying/getEnrichedDataRequest';\nimport { getQueriesForVariables } from '../utils';\nimport { getDataSource } from '../../utils/getDataSource';\nimport { DrilldownRecommendations, DrilldownPill } from '../components/DrilldownRecommendations';\nimport { ScopesVariable } from '../variants/ScopesVariable';\nimport { SCOPES_VARIABLE_NAME } from '../constants';\nimport { AdHocFilterWithLabels, AdHocFiltersVariable } from './AdHocFiltersVariable';\n\nexport const MAX_RECENT_DRILLDOWNS = 3;\nexport const MAX_STORED_RECENT_DRILLDOWNS = 10;\n\nexport const getRecentFiltersKey = (datasourceUid: string | undefined) =>\n `grafana.filters.recent.${datasourceUid ?? 'default'}`;\n\nexport class AdHocFiltersRecommendations {\n private _recentFilters?: AdHocFilterWithLabels[];\n private _recommendedFilters?: AdHocFilterWithLabels[];\n\n private adHocFilter: AdHocFiltersVariable;\n private scopesSubscription: Unsubscribable | undefined;\n\n private _scopedVars: { __sceneObject: ScopedVar };\n\n public constructor(adHocFilter: AdHocFiltersVariable, scopedVars: { __sceneObject: ScopedVar }) {\n this.adHocFilter = adHocFilter;\n this._scopedVars = scopedVars;\n }\n\n public get recentFilters(): AdHocFilterWithLabels[] | undefined {\n return this._recentFilters;\n }\n\n public get recommendedFilters(): AdHocFilterWithLabels[] | undefined {\n return this._recommendedFilters;\n }\n\n public init() {\n const json = store.get(this._getStorageKey());\n const storedFilters = json ? JSON.parse(json) : [];\n\n if (storedFilters.length > 0) {\n this._verifyRecentFiltersApplicability(storedFilters);\n } else {\n this._recentFilters = [];\n }\n\n this._fetchRecommendedDrilldowns();\n\n // Set up subscription to scopes variable\n const scopesVariable = sceneGraph.lookupVariable(SCOPES_VARIABLE_NAME, this.adHocFilter);\n\n if (scopesVariable instanceof ScopesVariable) {\n this.scopesSubscription = scopesVariable.subscribeToState((newState, prevState) => {\n if (newState.scopes !== prevState.scopes) {\n const json = store.get(this._getStorageKey());\n const storedFilters = json ? JSON.parse(json) : [];\n\n if (storedFilters.length > 0) {\n this._verifyRecentFiltersApplicability(storedFilters);\n }\n }\n });\n }\n }\n\n public deinit() {\n this.scopesSubscription?.unsubscribe();\n }\n\n private _getStorageKey(): string {\n return getRecentFiltersKey(this.adHocFilter.state.datasource?.uid);\n }\n\n private async _fetchRecommendedDrilldowns() {\n const adhoc = this.adHocFilter;\n const ds = await getDataSource(adhoc.state.datasource, this._scopedVars);\n\n // @ts-expect-error (temporary till we update grafana/data)\n if (!ds || !ds.getRecommendedDrilldowns) {\n return;\n }\n\n const queries = adhoc.state.useQueriesAsFilterForOptions ? getQueriesForVariables(adhoc) : undefined;\n const timeRange = sceneGraph.getTimeRange(adhoc).state.value;\n const scopes = sceneGraph.getScopes(adhoc);\n const filters = [...(adhoc.state.originFilters ?? []), ...adhoc.state.filters];\n\n const enrichedRequest = getEnrichedDataRequest(adhoc);\n const dashboardUid = enrichedRequest?.dashboardUID;\n\n try {\n // @ts-expect-error (temporary till we update grafana/data)\n const recommendedDrilldowns = await ds.getRecommendedDrilldowns({\n timeRange,\n dashboardUid,\n queries: queries ?? [],\n filters,\n scopes,\n userId: config.bootData.user.id,\n });\n\n if (recommendedDrilldowns?.filters) {\n this._recommendedFilters = recommendedDrilldowns.filters;\n }\n } catch (error) {\n console.error('Failed to fetch recommended drilldowns:', error);\n }\n }\n\n private async _verifyRecentFiltersApplicability(storedFilters: AdHocFilterWithLabels[]) {\n const adhoc = this.adHocFilter;\n const queries = adhoc.state.useQueriesAsFilterForOptions ? getQueriesForVariables(adhoc) : undefined;\n const response = await adhoc.getFiltersApplicabilityForQueries(storedFilters, queries ?? []);\n\n if (!response) {\n this._recentFilters = storedFilters.slice(-MAX_RECENT_DRILLDOWNS);\n return;\n }\n\n const applicabilityMap = new Map<string, boolean>();\n response.forEach((item: DrilldownsApplicability) => {\n applicabilityMap.set(item.key, item.applicable !== false);\n });\n\n const applicableFilters = storedFilters\n .filter((f) => {\n const isApplicable = applicabilityMap.get(f.key);\n return isApplicable === undefined || isApplicable === true;\n })\n .slice(-MAX_RECENT_DRILLDOWNS);\n\n this._recentFilters = applicableFilters;\n }\n\n /**\n * Stores a recent filter in localStorage and updates state.\n * Should be called by the parent variable when a filter is added/updated.\n */\n public storeRecentFilter(filter: AdHocFilterWithLabels) {\n const key = this._getStorageKey();\n const storedFilters = store.get(key);\n const allRecentFilters = storedFilters ? JSON.parse(storedFilters) : [];\n\n const updatedStoredFilters = [...allRecentFilters, filter].slice(-MAX_STORED_RECENT_DRILLDOWNS);\n store.set(key, JSON.stringify(updatedStoredFilters));\n\n const adhoc = this.adHocFilter;\n const existingFilter = adhoc.state.filters.find((f) => f.key === filter.key && !Boolean(f.nonApplicable));\n if (existingFilter && !Boolean(existingFilter.nonApplicable)) {\n this._recentFilters = updatedStoredFilters.slice(-MAX_RECENT_DRILLDOWNS);\n }\n }\n\n public addFilterToParent(filter: AdHocFilterWithLabels) {\n this.adHocFilter.updateFilters([...this.adHocFilter.state.filters, filter]);\n }\n\n public render() {\n const { filters } = this.adHocFilter.useState();\n\n const recentDrilldowns: DrilldownPill[] | undefined = this.recentFilters?.map((filter) => ({\n label: `${filter.key} ${filter.operator} ${filter.value}`,\n onClick: () => {\n this.addFilterToParent(filter);\n },\n }));\n\n const recommendedDrilldowns: DrilldownPill[] | undefined = this.recommendedFilters?.map((filter) => ({\n label: `${filter.key} ${filter.operator} ${filter.value}`,\n onClick: () => {\n // Check if filter already exists\n const exists = filters.some((f) => f.key === filter.key && f.value === filter.value);\n if (!exists) {\n this.addFilterToParent(filter);\n }\n },\n }));\n\n return (\n <DrilldownRecommendations recentDrilldowns={recentDrilldowns} recommendedDrilldowns={recommendedDrilldowns} />\n );\n }\n}\n"],"names":["json","storedFilters"],"mappings":"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"}
@@ -97,18 +97,19 @@ class AdHocFiltersVariable extends SceneObjectBase {
97
97
  this._activationHandler = () => {
98
98
  this._debouncedVerifyApplicability();
99
99
  if (this.state.drilldownRecommendationsEnabled && !this.state._valueRecommendations) {
100
- const valueRecommendations = new AdHocFiltersRecommendations(this);
100
+ const valueRecommendations = new AdHocFiltersRecommendations(this, this._scopedVars);
101
101
  this.setState({ _valueRecommendations: valueRecommendations });
102
- valueRecommendations.activate();
102
+ valueRecommendations.init();
103
103
  }
104
104
  return () => {
105
- var _a;
105
+ var _a, _b;
106
106
  (_a = this.state.originFilters) == null ? void 0 : _a.forEach((filter) => {
107
107
  if (filter.restorable) {
108
108
  this.restoreOriginalFilter(filter);
109
109
  }
110
110
  });
111
111
  this.setState({ applicabilityEnabled: false });
112
+ (_b = this.state._valueRecommendations) == null ? void 0 : _b.deinit();
112
113
  };
113
114
  };
114
115
  if (this.state.applyMode === "auto") {