@grafana/scenes 6.50.0--canary.1312.20242044820.0 → 6.50.0--canary.1316.20252812955.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.
Files changed (31) hide show
  1. package/dist/esm/packages/scenes/src/index.js +1 -1
  2. package/dist/esm/packages/scenes/src/index.js.map +1 -1
  3. package/dist/esm/packages/scenes/src/locales/en-US/grafana-scenes.json.js +6 -7
  4. package/dist/esm/packages/scenes/src/locales/en-US/grafana-scenes.json.js.map +1 -1
  5. package/dist/esm/packages/scenes/src/variables/DrilldownDependenciesManager.js.map +1 -1
  6. package/dist/esm/packages/scenes/src/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersAlwaysWipCombobox.js +2 -2
  7. package/dist/esm/packages/scenes/src/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersAlwaysWipCombobox.js.map +1 -1
  8. package/dist/esm/packages/scenes/src/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.js +3 -1
  9. package/dist/esm/packages/scenes/src/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.js.map +1 -1
  10. package/dist/esm/packages/scenes/src/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersComboboxRenderer.js +110 -23
  11. package/dist/esm/packages/scenes/src/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersComboboxRenderer.js.map +1 -1
  12. package/dist/esm/packages/scenes/src/variables/adhoc/AdHocFiltersCombobox/utils.js +3 -0
  13. package/dist/esm/packages/scenes/src/variables/adhoc/AdHocFiltersCombobox/utils.js.map +1 -1
  14. package/dist/esm/packages/scenes/src/variables/adhoc/AdHocFiltersVariable.js +16 -28
  15. package/dist/esm/packages/scenes/src/variables/adhoc/AdHocFiltersVariable.js.map +1 -1
  16. package/dist/esm/packages/scenes/src/variables/adhoc/controller/AdHocFiltersVariableController.js +4 -5
  17. package/dist/esm/packages/scenes/src/variables/adhoc/controller/AdHocFiltersVariableController.js.map +1 -1
  18. package/dist/esm/packages/scenes/src/variables/groupby/GroupByVariable.js +8 -61
  19. package/dist/esm/packages/scenes/src/variables/groupby/GroupByVariable.js.map +1 -1
  20. package/dist/{grafana-scenes-C9F_2hih.js → grafana-scenes-CwGWCTcQ.js} +7 -8
  21. package/dist/{grafana-scenes-C9F_2hih.js.map → grafana-scenes-CwGWCTcQ.js.map} +1 -1
  22. package/dist/index.d.ts +18 -127
  23. package/dist/index.js +4740 -5139
  24. package/dist/index.js.map +1 -1
  25. package/package.json +2 -2
  26. package/dist/esm/packages/scenes/src/variables/adhoc/AdHocFiltersRecommendations.js +0 -174
  27. package/dist/esm/packages/scenes/src/variables/adhoc/AdHocFiltersRecommendations.js.map +0 -1
  28. package/dist/esm/packages/scenes/src/variables/components/DrilldownRecommendations.js +0 -102
  29. package/dist/esm/packages/scenes/src/variables/components/DrilldownRecommendations.js.map +0 -1
  30. package/dist/esm/packages/scenes/src/variables/groupby/GroupByRecommendations.js +0 -192
  31. package/dist/esm/packages/scenes/src/variables/groupby/GroupByRecommendations.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@grafana/scenes",
3
- "version": "6.50.0--canary.1312.20242044820.0",
3
+ "version": "6.50.0--canary.1316.20252812955.0",
4
4
  "description": "Grafana framework for building dynamic dashboards",
5
5
  "author": "Grafana Labs",
6
6
  "license": "Apache-2.0",
@@ -125,5 +125,5 @@
125
125
  "prettier --write"
126
126
  ]
127
127
  },
128
- "gitHead": "e6f155ee0a2a2f4a42e97468039dabd373362883"
128
+ "gitHead": "0203ec8d6e57053efa7b197f0746eb1b53ea8fb0"
129
129
  }
@@ -1,174 +0,0 @@
1
- import React from 'react';
2
- import { config } from '@grafana/runtime';
3
- import { store } from '@grafana/data';
4
- import { SceneObjectBase } from '../../core/SceneObjectBase.js';
5
- import { sceneGraph } from '../../core/sceneGraph/index.js';
6
- import { getEnrichedDataRequest } from '../../querying/getEnrichedDataRequest.js';
7
- import { getQueriesForVariables } from '../utils.js';
8
- import { wrapInSafeSerializableSceneObject } from '../../utils/wrapInSafeSerializableSceneObject.js';
9
- import { getDataSource } from '../../utils/getDataSource.js';
10
- import { getEnrichedFiltersRequest } from '../getEnrichedFiltersRequest.js';
11
- import { DrilldownRecommendations } from '../components/DrilldownRecommendations.js';
12
- import { ScopesVariable } from '../variants/ScopesVariable.js';
13
- import { SCOPES_VARIABLE_NAME } from '../constants.js';
14
- import { getRecentFiltersKey } from './AdHocFiltersVariable.js';
15
-
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
- }
39
- }
40
- });
41
- }
42
- return () => {
43
- scopesSubscription == null ? void 0 : scopesSubscription.unsubscribe();
44
- };
45
- };
46
- this._parentVariable = parent;
47
- this.addActivationHandler(this._activationHandler);
48
- }
49
- /**
50
- * Get the parent variable
51
- */
52
- get parent() {
53
- return this._parentVariable;
54
- }
55
- _getStorageKey() {
56
- var _a;
57
- return getRecentFiltersKey((_a = this._parentVariable.state.datasource) == null ? void 0 : _a.uid);
58
- }
59
- async _fetchRecommendedDrilldowns() {
60
- var _a;
61
- const parent = this._parentVariable;
62
- const ds = await getDataSource(parent.state.datasource, this._scopedVars);
63
- if (!ds || !ds.getRecommendedDrilldowns) {
64
- return;
65
- }
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);
71
- const dashboardUid = enrichedRequest == null ? void 0 : enrichedRequest.dashboardUID;
72
- try {
73
- const recommendedDrilldowns = await ds.getRecommendedDrilldowns({
74
- timeRange,
75
- dashboardUid,
76
- queries: queries != null ? queries : [],
77
- filters,
78
- scopes,
79
- userId: config.bootData.user.id
80
- });
81
- if (recommendedDrilldowns == null ? void 0 : recommendedDrilldowns.filters) {
82
- this.setState({ recommendedFilters: recommendedDrilldowns.filters });
83
- }
84
- } catch (error) {
85
- console.error("Failed to fetch recommended drilldowns:", error);
86
- }
87
- }
88
- 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 : []);
92
- if (!response) {
93
- this.setState({ recentFilters: storedFilters.slice(-3) });
94
- return;
95
- }
96
- const applicabilityMap = /* @__PURE__ */ new Map();
97
- response.forEach((item) => {
98
- applicabilityMap.set(item.key, item.applicable !== false);
99
- });
100
- const applicableFilters = storedFilters.filter((f) => {
101
- const isApplicable = applicabilityMap.get(f.key);
102
- return isApplicable === void 0 || isApplicable === true;
103
- }).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
- });
120
- }
121
- /**
122
- * Stores a recent filter in localStorage and updates state.
123
- * Should be called by the parent variable when a filter is added/updated.
124
- */
125
- storeRecentFilter(filter) {
126
- const key = this._getStorageKey();
127
- const storedFilters = store.get(key);
128
- const allRecentFilters = storedFilters ? JSON.parse(storedFilters) : [];
129
- const updatedStoredFilters = [...allRecentFilters, filter].slice(-10);
130
- 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));
133
- if (existingFilter && !Boolean(existingFilter.nonApplicable)) {
134
- this.setState({ recentFilters: updatedStoredFilters.slice(-3) });
135
- }
136
- }
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
- addFilterToParent(filter) {
147
- const parent = this._parentVariable;
148
- parent.updateFilters([...parent.state.filters, filter]);
149
- }
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);
167
- }
168
- }
169
- }));
170
- return /* @__PURE__ */ React.createElement(DrilldownRecommendations, { recentDrilldowns, recommendedDrilldowns });
171
- }
172
-
173
- export { AdHocFiltersRecommendations };
174
- //# sourceMappingURL=AdHocFiltersRecommendations.js.map
@@ -1 +0,0 @@
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 {\n AdHocFilterWithLabels,\n AdHocFiltersVariable,\n getRecentFiltersKey,\n MAX_RECENT_DRILLDOWNS,\n MAX_STORED_RECENT_DRILLDOWNS,\n} from './AdHocFiltersVariable';\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,102 +0,0 @@
1
- import { useStyles2, ClickOutsideWrapper, Stack, Text, IconButton, Popover } from '@grafana/ui';
2
- import React, { useState, useRef } from 'react';
3
- import { css, cx } from '@emotion/css';
4
- import { Trans, t } from '@grafana/i18n';
5
-
6
- function DrilldownRecommendations({ recentDrilldowns, recommendedDrilldowns }) {
7
- const styles = useStyles2(getStyles);
8
- const [isPopoverVisible, setPopoverVisible] = useState(false);
9
- const ref = useRef(null);
10
- const openPopover = () => {
11
- setPopoverVisible(true);
12
- };
13
- const onClickAction = (action) => {
14
- action();
15
- setPopoverVisible(false);
16
- };
17
- const content = /* @__PURE__ */ React.createElement(ClickOutsideWrapper, { onClick: () => setPopoverVisible(false), useCapture: true }, /* @__PURE__ */ React.createElement("div", { className: styles.menuContainer, onClick: (ev) => ev.stopPropagation() }, /* @__PURE__ */ React.createElement(Stack, { direction: "column" }, /* @__PURE__ */ React.createElement(Text, { weight: "bold", variant: "bodySmall", color: "secondary" }, /* @__PURE__ */ React.createElement(Trans, { i18nKey: "grafana-scenes.components.drilldown-recommendations.recent" }, "Recent")), recentDrilldowns && recentDrilldowns.length > 0 ? recentDrilldowns.map((drilldown) => /* @__PURE__ */ React.createElement(
18
- "div",
19
- {
20
- key: drilldown.label,
21
- className: cx(styles.combinedFilterPill),
22
- onClick: () => onClickAction(drilldown.onClick)
23
- },
24
- drilldown.label
25
- )) : /* @__PURE__ */ React.createElement("div", { className: styles.emptyMessage }, /* @__PURE__ */ React.createElement(Trans, { i18nKey: "grafana-scenes.components.drilldown-recommendations.recent-empty" }, "No recent values")), /* @__PURE__ */ React.createElement(Text, { weight: "bold", variant: "bodySmall", color: "secondary" }, /* @__PURE__ */ React.createElement(Trans, { i18nKey: "grafana-scenes.components.drilldown-recommendations.recommended" }, "Recommended")), recommendedDrilldowns && recommendedDrilldowns.length > 0 ? recommendedDrilldowns.map((drilldown) => /* @__PURE__ */ React.createElement(
26
- "div",
27
- {
28
- key: drilldown.label,
29
- className: cx(styles.combinedFilterPill),
30
- onClick: () => onClickAction(drilldown.onClick)
31
- },
32
- drilldown.label
33
- )) : /* @__PURE__ */ React.createElement("div", { className: styles.emptyMessage }, /* @__PURE__ */ React.createElement(Trans, { i18nKey: "grafana-scenes.components.drilldown-recommendations.recommended-empty" }, "No recommended values")))));
34
- return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(
35
- IconButton,
36
- {
37
- name: "plus",
38
- tooltip: t("grafana-scenes.components.drilldown-recommendations.tooltip", "Show recommendations"),
39
- ref,
40
- className: cx(isPopoverVisible && styles.iconActive),
41
- onClick: (ev) => {
42
- openPopover();
43
- ev.stopPropagation();
44
- }
45
- }
46
- ), isPopoverVisible && ref.current && /* @__PURE__ */ React.createElement(
47
- Popover,
48
- {
49
- content,
50
- onKeyDown: (event) => {
51
- if (event.key === " ") {
52
- event.stopPropagation();
53
- }
54
- },
55
- placement: "bottom-start",
56
- referenceElement: ref.current,
57
- show: true
58
- }
59
- ));
60
- }
61
- const getStyles = (theme) => ({
62
- menuContainer: css({
63
- display: "flex",
64
- flexDirection: "column",
65
- background: theme.colors.background.elevated,
66
- border: `1px solid ${theme.colors.border.weak}`,
67
- borderRadius: theme.shape.radius.default,
68
- boxShadow: theme.shadows.z3,
69
- padding: theme.spacing(2)
70
- }),
71
- combinedFilterPill: css({
72
- alignItems: "center",
73
- background: theme.colors.action.selected,
74
- borderRadius: theme.shape.radius.default,
75
- border: `1px solid ${theme.colors.border.weak}`,
76
- padding: theme.spacing(0.2, 1),
77
- color: theme.colors.text.primary,
78
- overflow: "hidden",
79
- whiteSpace: "nowrap",
80
- minHeight: theme.spacing(2.75),
81
- ...theme.typography.bodySmall,
82
- fontWeight: theme.typography.fontWeightBold,
83
- cursor: "pointer",
84
- "&:hover": {
85
- background: theme.colors.action.hover
86
- }
87
- }),
88
- iconActive: css({
89
- "&:before": {
90
- backgroundColor: theme.colors.action.hover,
91
- opacity: 1
92
- }
93
- }),
94
- emptyMessage: css({
95
- padding: theme.spacing(0.5, 0),
96
- color: theme.colors.text.secondary,
97
- ...theme.typography.bodySmall
98
- })
99
- });
100
-
101
- export { DrilldownRecommendations };
102
- //# sourceMappingURL=DrilldownRecommendations.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DrilldownRecommendations.js","sources":["../../../../../../../src/variables/components/DrilldownRecommendations.tsx"],"sourcesContent":["import { ClickOutsideWrapper, IconButton, Popover, Stack, Text, useStyles2 } from '@grafana/ui';\nimport React, { useRef, useState } from 'react';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { css, cx } from '@emotion/css';\nimport { Trans, t } from '@grafana/i18n';\n\nexport interface DrilldownPill {\n label: string;\n onClick: () => void;\n}\n\ninterface Props {\n recentDrilldowns?: DrilldownPill[];\n recommendedDrilldowns?: DrilldownPill[];\n}\n\nexport function DrilldownRecommendations({ recentDrilldowns, recommendedDrilldowns }: Props) {\n const styles = useStyles2(getStyles);\n\n const [isPopoverVisible, setPopoverVisible] = useState<boolean>(false);\n const ref = useRef<HTMLButtonElement>(null);\n\n const openPopover = () => {\n setPopoverVisible(true);\n };\n\n const onClickAction = (action: () => void) => {\n action();\n setPopoverVisible(false);\n };\n\n const content = (\n <ClickOutsideWrapper onClick={() => setPopoverVisible(false)} useCapture={true}>\n <div className={styles.menuContainer} onClick={(ev) => ev.stopPropagation()}>\n <Stack direction=\"column\">\n <Text weight=\"bold\" variant=\"bodySmall\" color=\"secondary\">\n <Trans i18nKey=\"grafana-scenes.components.drilldown-recommendations.recent\">Recent</Trans>\n </Text>\n {recentDrilldowns && recentDrilldowns.length > 0 ? (\n recentDrilldowns.map((drilldown) => (\n <div\n key={drilldown.label}\n className={cx(styles.combinedFilterPill)}\n onClick={() => onClickAction(drilldown.onClick)}\n >\n {drilldown.label}\n </div>\n ))\n ) : (\n <div className={styles.emptyMessage}>\n <Trans i18nKey=\"grafana-scenes.components.drilldown-recommendations.recent-empty\">No recent values</Trans>\n </div>\n )}\n <Text weight=\"bold\" variant=\"bodySmall\" color=\"secondary\">\n <Trans i18nKey=\"grafana-scenes.components.drilldown-recommendations.recommended\">Recommended</Trans>\n </Text>\n {recommendedDrilldowns && recommendedDrilldowns.length > 0 ? (\n recommendedDrilldowns.map((drilldown) => (\n <div\n key={drilldown.label}\n className={cx(styles.combinedFilterPill)}\n onClick={() => onClickAction(drilldown.onClick)}\n >\n {drilldown.label}\n </div>\n ))\n ) : (\n <div className={styles.emptyMessage}>\n <Trans i18nKey=\"grafana-scenes.components.drilldown-recommendations.recommended-empty\">\n No recommended values\n </Trans>\n </div>\n )}\n </Stack>\n </div>\n </ClickOutsideWrapper>\n );\n\n return (\n <>\n <IconButton\n name=\"plus\"\n tooltip={t('grafana-scenes.components.drilldown-recommendations.tooltip', 'Show recommendations')}\n ref={ref}\n className={cx(isPopoverVisible && styles.iconActive)}\n onClick={(ev) => {\n openPopover();\n ev.stopPropagation();\n }}\n />\n\n {isPopoverVisible && ref.current && (\n <Popover\n content={content}\n onKeyDown={(event) => {\n if (event.key === ' ') {\n event.stopPropagation();\n }\n }}\n placement=\"bottom-start\"\n referenceElement={ref.current}\n show\n />\n )}\n </>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n menuContainer: css({\n display: 'flex',\n flexDirection: 'column',\n background: theme.colors.background.elevated,\n border: `1px solid ${theme.colors.border.weak}`,\n borderRadius: theme.shape.radius.default,\n boxShadow: theme.shadows.z3,\n padding: theme.spacing(2),\n }),\n combinedFilterPill: css({\n alignItems: 'center',\n background: theme.colors.action.selected,\n borderRadius: theme.shape.radius.default,\n border: `1px solid ${theme.colors.border.weak}`,\n padding: theme.spacing(0.2, 1),\n color: theme.colors.text.primary,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n minHeight: theme.spacing(2.75),\n ...theme.typography.bodySmall,\n fontWeight: theme.typography.fontWeightBold,\n cursor: 'pointer',\n\n '&:hover': {\n background: theme.colors.action.hover,\n },\n }),\n iconActive: css({\n '&:before': {\n backgroundColor: theme.colors.action.hover,\n opacity: 1,\n },\n }),\n emptyMessage: css({\n padding: theme.spacing(0.5, 0),\n color: theme.colors.text.secondary,\n ...theme.typography.bodySmall,\n }),\n});\n"],"names":[],"mappings":"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"}
@@ -1,192 +0,0 @@
1
- import React from 'react';
2
- import { config } from '@grafana/runtime';
3
- import { store } from '@grafana/data';
4
- import { SceneObjectBase } from '../../core/SceneObjectBase.js';
5
- import { sceneGraph } from '../../core/sceneGraph/index.js';
6
- import { getEnrichedDataRequest } from '../../querying/getEnrichedDataRequest.js';
7
- import { getQueriesForVariables } from '../utils.js';
8
- import { wrapInSafeSerializableSceneObject } from '../../utils/wrapInSafeSerializableSceneObject.js';
9
- import { getDataSource } from '../../utils/getDataSource.js';
10
- import { getEnrichedFiltersRequest } from '../getEnrichedFiltersRequest.js';
11
- import { DrilldownRecommendations } from '../components/DrilldownRecommendations.js';
12
- import { ScopesVariable } from '../variants/ScopesVariable.js';
13
- import { SCOPES_VARIABLE_NAME } from '../constants.js';
14
- import { getRecentGroupingKey } from './GroupByVariable.js';
15
- import '../adhoc/AdHocFiltersVariable.js';
16
- import { isArray } from 'lodash';
17
-
18
- class GroupByRecommendations extends SceneObjectBase {
19
- constructor(parent) {
20
- super({});
21
- this._scopedVars = { __sceneObject: wrapInSafeSerializableSceneObject(this) };
22
- this._activationHandler = () => {
23
- const json = store.get(this._getStorageKey());
24
- const storedGroupings = json ? JSON.parse(json) : [];
25
- if (storedGroupings.length > 0) {
26
- this._verifyRecentGroupingsApplicability(storedGroupings);
27
- } else {
28
- this.setState({ recentGrouping: [] });
29
- }
30
- this._fetchRecommendedDrilldowns();
31
- const scopesVariable = sceneGraph.lookupVariable(SCOPES_VARIABLE_NAME, this);
32
- let scopesSubscription;
33
- if (scopesVariable instanceof ScopesVariable) {
34
- scopesSubscription = scopesVariable.subscribeToState((newState, prevState) => {
35
- if (newState.scopes !== prevState.scopes) {
36
- const json2 = store.get(this._getStorageKey());
37
- const storedGroupings2 = json2 ? JSON.parse(json2) : [];
38
- if (storedGroupings2.length > 0) {
39
- this._verifyRecentGroupingsApplicability(storedGroupings2);
40
- }
41
- }
42
- });
43
- }
44
- return () => {
45
- scopesSubscription == null ? void 0 : scopesSubscription.unsubscribe();
46
- };
47
- };
48
- this._parentVariable = parent;
49
- this.addActivationHandler(this._activationHandler);
50
- }
51
- /**
52
- * Get the parent variable
53
- */
54
- get parent() {
55
- return this._parentVariable;
56
- }
57
- _getStorageKey() {
58
- var _a;
59
- return getRecentGroupingKey((_a = this._parentVariable.state.datasource) == null ? void 0 : _a.uid);
60
- }
61
- async _fetchRecommendedDrilldowns() {
62
- const parent = this._parentVariable;
63
- const ds = await getDataSource(parent.state.datasource, this._scopedVars);
64
- if (!ds || !ds.getRecommendedDrilldowns) {
65
- return;
66
- }
67
- const queries = getQueriesForVariables(parent);
68
- const timeRange = sceneGraph.getTimeRange(this).state.value;
69
- const scopes = sceneGraph.getScopes(this);
70
- const groupByKeys = Array.isArray(parent.state.value) ? parent.state.value.map((v) => String(v)) : parent.state.value ? [String(parent.state.value)] : [];
71
- const enrichedRequest = getEnrichedDataRequest(this);
72
- const dashboardUid = enrichedRequest == null ? void 0 : enrichedRequest.dashboardUID;
73
- try {
74
- const recommendedDrilldowns = await ds.getRecommendedDrilldowns({
75
- timeRange,
76
- dashboardUid,
77
- queries,
78
- groupByKeys,
79
- scopes,
80
- userId: config.bootData.user.id
81
- });
82
- if (recommendedDrilldowns == null ? void 0 : recommendedDrilldowns.groupByKeys) {
83
- this.setState({
84
- recommendedGrouping: recommendedDrilldowns.groupByKeys.map((key) => ({ value: key, text: key }))
85
- });
86
- }
87
- } catch (error) {
88
- console.error("Failed to fetch recommended drilldowns:", error);
89
- }
90
- }
91
- async _verifyRecentGroupingsApplicability(storedGroupings) {
92
- const queries = getQueriesForVariables(this._parentVariable);
93
- const keys = storedGroupings.map((g) => String(g.value));
94
- const response = await this._getGroupByApplicabilityForQueries(keys, queries);
95
- if (!response) {
96
- this.setState({ recentGrouping: storedGroupings.slice(-3) });
97
- return;
98
- }
99
- const applicabilityMap = /* @__PURE__ */ new Map();
100
- response.forEach((item) => {
101
- applicabilityMap.set(item.key, item.applicable !== false);
102
- });
103
- const applicableGroupings = storedGroupings.filter((g) => {
104
- const isApplicable = applicabilityMap.get(String(g.value));
105
- return isApplicable === void 0 || isApplicable === true;
106
- }).slice(-3);
107
- this.setState({ recentGrouping: applicableGroupings });
108
- }
109
- async _getGroupByApplicabilityForQueries(value, queries) {
110
- const parent = this._parentVariable;
111
- const ds = await getDataSource(parent.state.datasource, this._scopedVars);
112
- if (!ds || !ds.getDrilldownsApplicability) {
113
- return;
114
- }
115
- const timeRange = sceneGraph.getTimeRange(this).state.value;
116
- return await ds.getDrilldownsApplicability({
117
- groupByKeys: Array.isArray(value) ? value.map((v) => String(v)) : value ? [String(value)] : [],
118
- queries,
119
- timeRange,
120
- scopes: sceneGraph.getScopes(this),
121
- ...getEnrichedFiltersRequest(this)
122
- });
123
- }
124
- /**
125
- * Stores recent groupings in localStorage and updates state.
126
- * Should be called by the parent variable when a grouping is added/updated.
127
- */
128
- storeRecentGrouping(applicableValues) {
129
- if (applicableValues.length === 0) {
130
- return;
131
- }
132
- const key = this._getStorageKey();
133
- const storedGroupings = store.get(key);
134
- const allRecentGroupings = storedGroupings ? JSON.parse(storedGroupings) : [];
135
- const existingWithoutApplicableValues = allRecentGroupings.filter(
136
- (grouping) => !applicableValues.includes(String(grouping.value))
137
- );
138
- const updatedStoredGroupings = [
139
- ...existingWithoutApplicableValues,
140
- ...applicableValues.map((value) => ({ value, text: value }))
141
- ];
142
- const limitedStoredGroupings = updatedStoredGroupings.slice(-10);
143
- store.set(key, JSON.stringify(limitedStoredGroupings));
144
- this.setState({ recentGrouping: limitedStoredGroupings.slice(-3) });
145
- }
146
- /**
147
- * Get the current values from the parent variable
148
- */
149
- getParentValues() {
150
- const parent = this._parentVariable;
151
- const value = isArray(parent.state.value) ? parent.state.value : [parent.state.value];
152
- const text = isArray(parent.state.text) ? parent.state.text.map(String) : [String(parent.state.text)];
153
- return { value, text };
154
- }
155
- /**
156
- * Add a grouping value to the parent variable
157
- */
158
- addValueToParent(newValue, newText) {
159
- const parent = this._parentVariable;
160
- const { value, text } = this.getParentValues();
161
- if (value.includes(newValue)) {
162
- return;
163
- }
164
- parent.changeValueTo(
165
- [...value.filter((v) => v !== ""), newValue],
166
- [...text.filter((t) => t !== ""), newText != null ? newText : String(newValue)],
167
- true
168
- );
169
- }
170
- }
171
- GroupByRecommendations.Component = GroupByRecommendationsRenderer;
172
- function GroupByRecommendationsRenderer({ model }) {
173
- const { recentGrouping, recommendedGrouping } = model.useState();
174
- const recentDrilldowns = recentGrouping == null ? void 0 : recentGrouping.map((groupBy) => ({
175
- label: `${groupBy.value}`,
176
- onClick: () => {
177
- var _a;
178
- model.addValueToParent(groupBy.value, (_a = groupBy.text) != null ? _a : String(groupBy.value));
179
- }
180
- }));
181
- const recommendedDrilldowns = recommendedGrouping == null ? void 0 : recommendedGrouping.map((groupBy) => ({
182
- label: `${groupBy.value}`,
183
- onClick: () => {
184
- var _a;
185
- model.addValueToParent(groupBy.value, (_a = groupBy.text) != null ? _a : String(groupBy.value));
186
- }
187
- }));
188
- return /* @__PURE__ */ React.createElement(DrilldownRecommendations, { recentDrilldowns, recommendedDrilldowns });
189
- }
190
-
191
- export { GroupByRecommendations };
192
- //# sourceMappingURL=GroupByRecommendations.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"GroupByRecommendations.js","sources":["../../../../../../../src/variables/groupby/GroupByRecommendations.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 SelectableValue,\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 { GroupByVariable, getRecentGroupingKey } from './GroupByVariable';\nimport { MAX_RECENT_DRILLDOWNS, MAX_STORED_RECENT_DRILLDOWNS } from '../adhoc/AdHocFiltersVariable';\nimport { VariableValue, VariableValueSingle } from '../types';\nimport { isArray } from 'lodash';\n\nexport interface GroupByRecommendationsState extends SceneObjectState {\n /** Recent groupings */\n recentGrouping?: Array<SelectableValue<VariableValueSingle>>;\n /** Recommended groupings */\n recommendedGrouping?: Array<SelectableValue<VariableValueSingle>>;\n}\n\n/**\n * Scene object component that manages recommendations for GroupByVariable.\n * It handles fetching recommended drilldowns, verifying applicability of recent groupings,\n * and storing/displaying recent groupings.\n */\nexport class GroupByRecommendations extends SceneObjectBase<GroupByRecommendationsState> {\n static Component = GroupByRecommendationsRenderer;\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: GroupByVariable;\n\n public constructor(parent: GroupByVariable) {\n super({});\n this._parentVariable = parent;\n this.addActivationHandler(this._activationHandler);\n }\n\n /**\n * Get the parent variable\n */\n public get parent(): GroupByVariable {\n return this._parentVariable;\n }\n\n private _activationHandler = () => {\n const json = store.get(this._getStorageKey());\n const storedGroupings = json ? JSON.parse(json) : [];\n\n // Verify applicability of stored recent groupings\n if (storedGroupings.length > 0) {\n this._verifyRecentGroupingsApplicability(storedGroupings);\n } else {\n this.setState({ recentGrouping: [] });\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 storedGroupings = json ? JSON.parse(json) : [];\n\n if (storedGroupings.length > 0) {\n this._verifyRecentGroupingsApplicability(storedGroupings);\n }\n }\n });\n }\n\n return () => {\n scopesSubscription?.unsubscribe();\n };\n };\n\n private _getStorageKey(): string {\n return getRecentGroupingKey(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 = getQueriesForVariables(parent);\n const timeRange = sceneGraph.getTimeRange(this).state.value;\n const scopes = sceneGraph.getScopes(this);\n const groupByKeys = Array.isArray(parent.state.value)\n ? parent.state.value.map((v) => String(v))\n : parent.state.value\n ? [String(parent.state.value)]\n : [];\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,\n groupByKeys,\n scopes,\n userId: config.bootData.user.id,\n });\n\n if (recommendedDrilldowns?.groupByKeys) {\n this.setState({\n recommendedGrouping: recommendedDrilldowns.groupByKeys.map((key: string) => ({ value: key, text: key })),\n });\n }\n } catch (error) {\n console.error('Failed to fetch recommended drilldowns:', error);\n }\n }\n\n private async _verifyRecentGroupingsApplicability(storedGroupings: Array<SelectableValue<VariableValueSingle>>) {\n const queries = getQueriesForVariables(this._parentVariable);\n const keys = storedGroupings.map((g) => String(g.value));\n const response = await this._getGroupByApplicabilityForQueries(keys, queries);\n\n if (!response) {\n this.setState({ recentGrouping: storedGroupings.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 applicableGroupings = storedGroupings\n .filter((g) => {\n const isApplicable = applicabilityMap.get(String(g.value));\n return isApplicable === undefined || isApplicable === true;\n })\n .slice(-MAX_RECENT_DRILLDOWNS);\n\n this.setState({ recentGrouping: applicableGroupings });\n }\n\n private async _getGroupByApplicabilityForQueries(\n value: VariableValue,\n queries: SceneDataQuery[]\n ): Promise<DrilldownsApplicability[] | undefined> {\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.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 groupByKeys: Array.isArray(value) ? value.map((v) => String(v)) : value ? [String(value)] : [],\n queries,\n timeRange,\n scopes: sceneGraph.getScopes(this),\n ...getEnrichedFiltersRequest(this),\n });\n }\n\n /**\n * Stores recent groupings in localStorage and updates state.\n * Should be called by the parent variable when a grouping is added/updated.\n */\n public storeRecentGrouping(applicableValues: string[]) {\n if (applicableValues.length === 0) {\n return;\n }\n\n const key = this._getStorageKey();\n const storedGroupings = store.get(key);\n const allRecentGroupings: Array<SelectableValue<VariableValueSingle>> = storedGroupings\n ? JSON.parse(storedGroupings)\n : [];\n\n const existingWithoutApplicableValues = allRecentGroupings.filter(\n (grouping) => !applicableValues.includes(String(grouping.value))\n );\n const updatedStoredGroupings = [\n ...existingWithoutApplicableValues,\n ...applicableValues.map((value) => ({ value, text: value })),\n ];\n\n const limitedStoredGroupings = updatedStoredGroupings.slice(-MAX_STORED_RECENT_DRILLDOWNS);\n\n store.set(key, JSON.stringify(limitedStoredGroupings));\n\n this.setState({ recentGrouping: limitedStoredGroupings.slice(-MAX_RECENT_DRILLDOWNS) });\n }\n\n /**\n * Get the current values from the parent variable\n */\n public getParentValues(): { value: VariableValueSingle[]; text: string[] } {\n const parent = this._parentVariable;\n const value = isArray(parent.state.value) ? parent.state.value : [parent.state.value];\n const text = isArray(parent.state.text) ? parent.state.text.map(String) : [String(parent.state.text)];\n return { value, text };\n }\n\n /**\n * Add a grouping value to the parent variable\n */\n public addValueToParent(newValue: VariableValueSingle, newText?: string) {\n const parent = this._parentVariable;\n const { value, text } = this.getParentValues();\n\n // Check if value already exists\n if (value.includes(newValue)) {\n return;\n }\n\n parent.changeValueTo(\n [...value.filter((v) => v !== ''), newValue],\n [...text.filter((t) => t !== ''), newText ?? String(newValue)],\n true\n );\n }\n}\n\nfunction GroupByRecommendationsRenderer({ model }: SceneComponentProps<GroupByRecommendations>) {\n const { recentGrouping, recommendedGrouping } = model.useState();\n\n const recentDrilldowns: DrilldownPill[] | undefined = recentGrouping?.map((groupBy) => ({\n label: `${groupBy.value}`,\n onClick: () => {\n model.addValueToParent(groupBy.value!, groupBy.text ?? String(groupBy.value));\n },\n }));\n\n const recommendedDrilldowns: DrilldownPill[] | undefined = recommendedGrouping?.map((groupBy) => ({\n label: `${groupBy.value}`,\n onClick: () => {\n model.addValueToParent(groupBy.value!, groupBy.text ?? String(groupBy.value));\n },\n }));\n\n return <DrilldownRecommendations recentDrilldowns={recentDrilldowns} recommendedDrilldowns={recommendedDrilldowns} />;\n}\n"],"names":["json","storedGroupings"],"mappings":"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"}