@grafana/scenes 6.50.0--canary.1312.20268893264.0 → 6.50.0--canary.1312.20279161238.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/packages/scenes/src/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersComboboxRenderer.js +2 -2
- package/dist/esm/packages/scenes/src/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersComboboxRenderer.js.map +1 -1
- package/dist/esm/packages/scenes/src/variables/adhoc/AdHocFiltersRecommendations.js +75 -72
- package/dist/esm/packages/scenes/src/variables/adhoc/AdHocFiltersRecommendations.js.map +1 -1
- package/dist/esm/packages/scenes/src/variables/adhoc/AdHocFiltersVariable.js +23 -23
- package/dist/esm/packages/scenes/src/variables/adhoc/AdHocFiltersVariable.js.map +1 -1
- package/dist/esm/packages/scenes/src/variables/adhoc/controller/AdHocFiltersVariableController.js +1 -1
- package/dist/esm/packages/scenes/src/variables/adhoc/controller/AdHocFiltersVariableController.js.map +1 -1
- package/dist/esm/packages/scenes/src/variables/groupby/GroupByRecommendations.js +80 -68
- package/dist/esm/packages/scenes/src/variables/groupby/GroupByRecommendations.js.map +1 -1
- package/dist/esm/packages/scenes/src/variables/groupby/GroupByVariable.js +22 -15
- package/dist/esm/packages/scenes/src/variables/groupby/GroupByVariable.js.map +1 -1
- package/dist/index.d.ts +30 -39
- package/dist/index.js +4934 -4919
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -5,7 +5,7 @@ import { AdHocFilterPill } from './AdHocFilterPill.js';
|
|
|
5
5
|
import { AdHocFiltersAlwaysWipCombobox } from './AdHocFiltersAlwaysWipCombobox.js';
|
|
6
6
|
|
|
7
7
|
const AdHocFiltersComboboxRenderer = memo(function AdHocFiltersComboboxRenderer2({ controller }) {
|
|
8
|
-
const { originFilters, filters, readOnly, valueRecommendations
|
|
8
|
+
const { originFilters, filters, readOnly, valueRecommendations } = controller.useState();
|
|
9
9
|
const styles = useStyles2(getStyles);
|
|
10
10
|
const focusOnWipInputRef = useRef();
|
|
11
11
|
return /* @__PURE__ */ React.createElement(
|
|
@@ -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
|
-
|
|
21
|
+
valueRecommendations && /* @__PURE__ */ React.createElement(valueRecommendations.Component, { model: valueRecommendations }),
|
|
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
|
|
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 } = 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 {valueRecommendations && <valueRecommendations.Component model={valueRecommendations} />}\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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"}
|
|
@@ -7,53 +7,61 @@ import { getDataSource } from '../../utils/getDataSource.js';
|
|
|
7
7
|
import { DrilldownRecommendations } from '../components/DrilldownRecommendations.js';
|
|
8
8
|
import { ScopesVariable } from '../variants/ScopesVariable.js';
|
|
9
9
|
import { SCOPES_VARIABLE_NAME } from '../constants.js';
|
|
10
|
+
import { AdHocFiltersVariable } from './AdHocFiltersVariable.js';
|
|
11
|
+
import { SceneObjectBase } from '../../core/SceneObjectBase.js';
|
|
12
|
+
import { wrapInSafeSerializableSceneObject } from '../../utils/wrapInSafeSerializableSceneObject.js';
|
|
10
13
|
|
|
11
14
|
const getRecentFiltersKey = (datasourceUid) => `grafana.filters.recent.${datasourceUid != null ? datasourceUid : "default"}`;
|
|
12
|
-
class AdHocFiltersRecommendations {
|
|
13
|
-
constructor(
|
|
14
|
-
|
|
15
|
-
this.
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
15
|
+
class AdHocFiltersRecommendations extends SceneObjectBase {
|
|
16
|
+
constructor(state = {}) {
|
|
17
|
+
super(state);
|
|
18
|
+
this._activationHandler = () => {
|
|
19
|
+
const json = store.get(this._getStorageKey());
|
|
20
|
+
const storedFilters = json ? JSON.parse(json) : [];
|
|
21
|
+
if (storedFilters.length > 0) {
|
|
22
|
+
this._verifyRecentFiltersApplicability(storedFilters);
|
|
23
|
+
} else {
|
|
24
|
+
this.setState({ recentFilters: [] });
|
|
25
|
+
}
|
|
26
|
+
this._fetchRecommendedDrilldowns();
|
|
27
|
+
const scopesVariable = sceneGraph.lookupVariable(SCOPES_VARIABLE_NAME, this._adHocFilter);
|
|
28
|
+
let scopesSubscription;
|
|
29
|
+
if (scopesVariable instanceof ScopesVariable) {
|
|
30
|
+
this._subs.add(
|
|
31
|
+
scopesSubscription = scopesVariable.subscribeToState((newState, prevState) => {
|
|
32
|
+
if (newState.scopes !== prevState.scopes) {
|
|
33
|
+
const json2 = store.get(this._getStorageKey());
|
|
34
|
+
const storedFilters2 = json2 ? JSON.parse(json2) : [];
|
|
35
|
+
if (storedFilters2.length > 0) {
|
|
36
|
+
this._verifyRecentFiltersApplicability(storedFilters2);
|
|
37
|
+
}
|
|
38
|
+
this._fetchRecommendedDrilldowns();
|
|
39
|
+
}
|
|
40
|
+
})
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
return () => {
|
|
44
|
+
scopesSubscription == null ? void 0 : scopesSubscription.unsubscribe();
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
this.addActivationHandler(this._activationHandler);
|
|
22
48
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
if (storedFilters.length > 0) {
|
|
27
|
-
this._verifyRecentFiltersApplicability(storedFilters);
|
|
28
|
-
} else {
|
|
29
|
-
this._recentFilters = [];
|
|
30
|
-
}
|
|
31
|
-
this._fetchRecommendedDrilldowns();
|
|
32
|
-
const scopesVariable = sceneGraph.lookupVariable(SCOPES_VARIABLE_NAME, this.adHocFilter);
|
|
33
|
-
if (scopesVariable instanceof ScopesVariable) {
|
|
34
|
-
this.scopesSubscription = scopesVariable.subscribeToState((newState, prevState) => {
|
|
35
|
-
if (newState.scopes !== prevState.scopes) {
|
|
36
|
-
const json2 = store.get(this._getStorageKey());
|
|
37
|
-
const storedFilters2 = json2 ? JSON.parse(json2) : [];
|
|
38
|
-
if (storedFilters2.length > 0) {
|
|
39
|
-
this._verifyRecentFiltersApplicability(storedFilters2);
|
|
40
|
-
}
|
|
41
|
-
this._fetchRecommendedDrilldowns();
|
|
42
|
-
}
|
|
43
|
-
});
|
|
49
|
+
get _adHocFilter() {
|
|
50
|
+
if (!(this.parent instanceof AdHocFiltersVariable)) {
|
|
51
|
+
throw new Error("AdHocFiltersRecommendations must be a child of AdHocFiltersVariable");
|
|
44
52
|
}
|
|
53
|
+
return this.parent;
|
|
45
54
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
(_a = this.scopesSubscription) == null ? void 0 : _a.unsubscribe();
|
|
55
|
+
get _scopedVars() {
|
|
56
|
+
return { __sceneObject: wrapInSafeSerializableSceneObject(this._adHocFilter) };
|
|
49
57
|
}
|
|
50
58
|
_getStorageKey() {
|
|
51
59
|
var _a;
|
|
52
|
-
return getRecentFiltersKey((_a = this.
|
|
60
|
+
return getRecentFiltersKey((_a = this._adHocFilter.state.datasource) == null ? void 0 : _a.uid);
|
|
53
61
|
}
|
|
54
62
|
async _fetchRecommendedDrilldowns() {
|
|
55
63
|
var _a;
|
|
56
|
-
const adhoc = this.
|
|
64
|
+
const adhoc = this._adHocFilter;
|
|
57
65
|
const ds = await getDataSource(adhoc.state.datasource, this._scopedVars);
|
|
58
66
|
if (!ds || !ds.getRecommendedDrilldowns) {
|
|
59
67
|
return;
|
|
@@ -73,18 +81,18 @@ class AdHocFiltersRecommendations {
|
|
|
73
81
|
scopes
|
|
74
82
|
});
|
|
75
83
|
if (recommendedDrilldowns == null ? void 0 : recommendedDrilldowns.filters) {
|
|
76
|
-
this.
|
|
84
|
+
this.setState({ recommendedFilters: recommendedDrilldowns.filters });
|
|
77
85
|
}
|
|
78
86
|
} catch (error) {
|
|
79
87
|
console.error("Failed to fetch recommended drilldowns:", error);
|
|
80
88
|
}
|
|
81
89
|
}
|
|
82
90
|
async _verifyRecentFiltersApplicability(storedFilters) {
|
|
83
|
-
const adhoc = this.
|
|
91
|
+
const adhoc = this._adHocFilter;
|
|
84
92
|
const queries = adhoc.state.useQueriesAsFilterForOptions ? getQueriesForVariables(adhoc) : void 0;
|
|
85
93
|
const response = await adhoc.getFiltersApplicabilityForQueries(storedFilters, queries != null ? queries : []);
|
|
86
94
|
if (!response) {
|
|
87
|
-
this.
|
|
95
|
+
this.setState({ recentFilters: storedFilters.slice(-3) });
|
|
88
96
|
return;
|
|
89
97
|
}
|
|
90
98
|
const applicabilityMap = /* @__PURE__ */ new Map();
|
|
@@ -95,7 +103,7 @@ class AdHocFiltersRecommendations {
|
|
|
95
103
|
const isApplicable = applicabilityMap.get(f.key);
|
|
96
104
|
return isApplicable === void 0 || isApplicable === true;
|
|
97
105
|
}).slice(-3);
|
|
98
|
-
this.
|
|
106
|
+
this.setState({ recentFilters: applicableFilters });
|
|
99
107
|
}
|
|
100
108
|
/**
|
|
101
109
|
* Stores a recent filter in localStorage and updates state.
|
|
@@ -107,45 +115,40 @@ class AdHocFiltersRecommendations {
|
|
|
107
115
|
const allRecentFilters = storedFilters ? JSON.parse(storedFilters) : [];
|
|
108
116
|
const updatedStoredFilters = [...allRecentFilters, filter].slice(-10);
|
|
109
117
|
store.set(key, JSON.stringify(updatedStoredFilters));
|
|
110
|
-
const adhoc = this.
|
|
118
|
+
const adhoc = this._adHocFilter;
|
|
111
119
|
const existingFilter = adhoc.state.filters.find((f) => f.key === filter.key && !Boolean(f.nonApplicable));
|
|
112
120
|
if (existingFilter && !Boolean(existingFilter.nonApplicable)) {
|
|
113
|
-
this.
|
|
121
|
+
this.setState({ recentFilters: updatedStoredFilters.slice(-3) });
|
|
114
122
|
}
|
|
115
123
|
}
|
|
116
124
|
addFilterToParent(filter) {
|
|
117
|
-
this.
|
|
118
|
-
}
|
|
119
|
-
render() {
|
|
120
|
-
var _a, _b;
|
|
121
|
-
const { filters } = this.adHocFilter.useState();
|
|
122
|
-
const recentDrilldowns = (_a = this.recentFilters) == null ? void 0 : _a.map((filter) => {
|
|
123
|
-
var _a2;
|
|
124
|
-
return {
|
|
125
|
-
label: `${filter.key} ${filter.operator} ${((_a2 = filter.valueLabels) == null ? void 0 : _a2.length) ? filter.valueLabels.join(", ") : filter.value}`,
|
|
126
|
-
onClick: () => {
|
|
127
|
-
const exists = filters.some((f) => f.key === filter.key && f.value === filter.value);
|
|
128
|
-
if (!exists) {
|
|
129
|
-
this.addFilterToParent(filter);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
};
|
|
133
|
-
});
|
|
134
|
-
const recommendedDrilldowns = (_b = this.recommendedFilters) == null ? void 0 : _b.map((filter) => {
|
|
135
|
-
var _a2;
|
|
136
|
-
return {
|
|
137
|
-
label: `${filter.key} ${filter.operator} ${((_a2 = filter.valueLabels) == null ? void 0 : _a2.length) ? filter.valueLabels.join(", ") : filter.value}`,
|
|
138
|
-
onClick: () => {
|
|
139
|
-
const exists = filters.some((f) => f.key === filter.key && f.value === filter.value);
|
|
140
|
-
if (!exists) {
|
|
141
|
-
this.addFilterToParent(filter);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
};
|
|
145
|
-
});
|
|
146
|
-
return /* @__PURE__ */ React.createElement(DrilldownRecommendations, { recentDrilldowns, recommendedDrilldowns });
|
|
125
|
+
this._adHocFilter.updateFilters([...this._adHocFilter.state.filters, filter]);
|
|
147
126
|
}
|
|
148
127
|
}
|
|
128
|
+
AdHocFiltersRecommendations.Component = AdHocFiltersRecommendationsRenderer;
|
|
129
|
+
function AdHocFiltersRecommendationsRenderer({ model }) {
|
|
130
|
+
const { recentFilters, recommendedFilters } = model.useState();
|
|
131
|
+
const { filters } = model._adHocFilter.useState();
|
|
132
|
+
const recentDrilldowns = recentFilters == null ? void 0 : recentFilters.map((filter) => ({
|
|
133
|
+
label: `${filter.key} ${filter.operator} ${filter.value}`,
|
|
134
|
+
onClick: () => {
|
|
135
|
+
const exists = filters.some((f) => f.key === filter.key && f.value === filter.value);
|
|
136
|
+
if (!exists) {
|
|
137
|
+
model.addFilterToParent(filter);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}));
|
|
141
|
+
const recommendedDrilldowns = recommendedFilters == null ? void 0 : recommendedFilters.map((filter) => ({
|
|
142
|
+
label: `${filter.key} ${filter.operator} ${filter.value}`,
|
|
143
|
+
onClick: () => {
|
|
144
|
+
const exists = filters.some((f) => f.key === filter.key && f.value === filter.value);
|
|
145
|
+
if (!exists) {
|
|
146
|
+
model.addFilterToParent(filter);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}));
|
|
150
|
+
return /* @__PURE__ */ React.createElement(DrilldownRecommendations, { recentDrilldowns, recommendedDrilldowns });
|
|
151
|
+
}
|
|
149
152
|
|
|
150
153
|
export { AdHocFiltersRecommendations, getRecentFiltersKey };
|
|
151
154
|
//# sourceMappingURL=AdHocFiltersRecommendations.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdHocFiltersRecommendations.js","sources":["../../../../../../../src/variables/adhoc/AdHocFiltersRecommendations.tsx"],"sourcesContent":["import React from 'react';\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 this._fetchRecommendedDrilldowns();\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 });\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} ${\n filter.valueLabels?.length ? filter.valueLabels.join(', ') : filter.value\n }`,\n onClick: () => {\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 const recommendedDrilldowns: DrilldownPill[] | undefined = this.recommendedFilters?.map((filter) => ({\n label: `${filter.key} ${filter.operator} ${\n filter.valueLabels?.length ? filter.valueLabels.join(', ') : filter.value\n }`,\n onClick: () => {\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","_a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AdHocFiltersRecommendations.js","sources":["../../../../../../../src/variables/adhoc/AdHocFiltersRecommendations.tsx"],"sourcesContent":["import React from 'react';\nimport {\n // @ts-expect-error (temporary till we update grafana/data)\n DrilldownsApplicability,\n store,\n} from '@grafana/data';\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';\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { SceneComponentProps, SceneObjectState } from '../../core/types';\nimport { wrapInSafeSerializableSceneObject } from '../../utils/wrapInSafeSerializableSceneObject';\nimport { Unsubscribable } from 'rxjs';\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 recentFilters?: AdHocFilterWithLabels[];\n recommendedFilters?: AdHocFilterWithLabels[];\n}\n\nexport class AdHocFiltersRecommendations extends SceneObjectBase<AdHocFiltersRecommendationsState> {\n static Component = AdHocFiltersRecommendationsRenderer;\n\n public constructor(state: Partial<AdHocFiltersRecommendationsState> = {}) {\n super(state);\n\n this.addActivationHandler(this._activationHandler);\n }\n\n public get _adHocFilter(): AdHocFiltersVariable {\n if (!(this.parent instanceof AdHocFiltersVariable)) {\n throw new Error('AdHocFiltersRecommendations must be a child of AdHocFiltersVariable');\n }\n\n return this.parent;\n }\n\n private get _scopedVars() {\n return { __sceneObject: wrapInSafeSerializableSceneObject(this._adHocFilter) };\n }\n\n private _activationHandler = () => {\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.setState({ 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 let scopesSubscription: Unsubscribable | undefined;\n\n if (scopesVariable instanceof ScopesVariable) {\n this._subs.add(\n (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 this._fetchRecommendedDrilldowns();\n }\n }))\n );\n }\n\n return () => {\n scopesSubscription?.unsubscribe();\n };\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 });\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 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.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 /**\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.setState({ 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\nfunction AdHocFiltersRecommendationsRenderer({ model }: SceneComponentProps<AdHocFiltersRecommendations>) {\n const { recentFilters, recommendedFilters } = model.useState();\n const { filters } = model._adHocFilter.useState();\n\n const recentDrilldowns: DrilldownPill[] | undefined = recentFilters?.map((filter) => ({\n label: `${filter.key} ${filter.operator} ${filter.value}`,\n onClick: () => {\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 const recommendedDrilldowns: DrilldownPill[] | undefined = recommendedFilters?.map((filter) => ({\n label: `${filter.key} ${filter.operator} ${filter.value}`,\n onClick: () => {\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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"}
|
|
@@ -70,15 +70,21 @@ const OPERATORS = [
|
|
|
70
70
|
];
|
|
71
71
|
class AdHocFiltersVariable extends SceneObjectBase {
|
|
72
72
|
constructor(state) {
|
|
73
|
-
var _a, _b, _c, _d, _e;
|
|
73
|
+
var _a, _b, _c, _d, _e, _f;
|
|
74
|
+
const behaviors = (_a = state.$behaviors) != null ? _a : [];
|
|
75
|
+
const recommendations = state.drilldownRecommendationsEnabled ? new AdHocFiltersRecommendations() : void 0;
|
|
76
|
+
if (recommendations) {
|
|
77
|
+
behaviors.push(recommendations);
|
|
78
|
+
}
|
|
74
79
|
super({
|
|
75
80
|
type: "adhoc",
|
|
76
|
-
name: (
|
|
81
|
+
name: (_b = state.name) != null ? _b : "Filters",
|
|
77
82
|
filters: [],
|
|
78
83
|
datasource: null,
|
|
79
84
|
applyMode: "auto",
|
|
80
|
-
filterExpression: (
|
|
81
|
-
...state
|
|
85
|
+
filterExpression: (_e = state.filterExpression) != null ? _e : renderExpression(state.expressionBuilder, [...(_c = state.originFilters) != null ? _c : [], ...(_d = state.filters) != null ? _d : []]),
|
|
86
|
+
...state,
|
|
87
|
+
$behaviors: behaviors.length > 0 ? behaviors : void 0
|
|
82
88
|
});
|
|
83
89
|
this._scopedVars = { __sceneObject: wrapInSafeSerializableSceneObject(this) };
|
|
84
90
|
this._dataSourceSrv = getDataSourceSrv();
|
|
@@ -96,26 +102,21 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
|
96
102
|
this._debouncedVerifyApplicability = debounce(this._verifyApplicability, 100);
|
|
97
103
|
this._activationHandler = () => {
|
|
98
104
|
this._debouncedVerifyApplicability();
|
|
99
|
-
if (this.state.drilldownRecommendationsEnabled && !this.state._valueRecommendations) {
|
|
100
|
-
const valueRecommendations = new AdHocFiltersRecommendations(this, this._scopedVars);
|
|
101
|
-
this.setState({ _valueRecommendations: valueRecommendations });
|
|
102
|
-
valueRecommendations.init();
|
|
103
|
-
}
|
|
104
105
|
return () => {
|
|
105
|
-
var _a
|
|
106
|
+
var _a;
|
|
106
107
|
(_a = this.state.originFilters) == null ? void 0 : _a.forEach((filter) => {
|
|
107
108
|
if (filter.restorable) {
|
|
108
109
|
this.restoreOriginalFilter(filter);
|
|
109
110
|
}
|
|
110
111
|
});
|
|
111
112
|
this.setState({ applicabilityEnabled: false });
|
|
112
|
-
(_b = this.state._valueRecommendations) == null ? void 0 : _b.deinit();
|
|
113
113
|
};
|
|
114
114
|
};
|
|
115
|
+
this._recommendations = recommendations;
|
|
115
116
|
if (this.state.applyMode === "auto") {
|
|
116
117
|
patchGetAdhocFilters(this);
|
|
117
118
|
}
|
|
118
|
-
(
|
|
119
|
+
(_f = this.state.originFilters) == null ? void 0 : _f.forEach((filter) => {
|
|
119
120
|
var _a2;
|
|
120
121
|
this._originalValues.set(`${filter.key}-${filter.origin}`, {
|
|
121
122
|
operator: filter.operator,
|
|
@@ -124,6 +125,9 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
|
124
125
|
});
|
|
125
126
|
this.addActivationHandler(this._activationHandler);
|
|
126
127
|
}
|
|
128
|
+
getRecommendations() {
|
|
129
|
+
return this._recommendations;
|
|
130
|
+
}
|
|
127
131
|
_updateScopesFilters() {
|
|
128
132
|
var _a, _b;
|
|
129
133
|
const scopes = sceneGraph.getScopes(this);
|
|
@@ -172,11 +176,9 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
|
172
176
|
this._debouncedVerifyApplicability();
|
|
173
177
|
}
|
|
174
178
|
async verifyApplicabilityAndStoreRecentFilter(update) {
|
|
179
|
+
var _a;
|
|
175
180
|
await this._verifyApplicability();
|
|
176
|
-
|
|
177
|
-
return;
|
|
178
|
-
}
|
|
179
|
-
this.state._valueRecommendations.storeRecentFilter(update);
|
|
181
|
+
(_a = this._recommendations) == null ? void 0 : _a.storeRecentFilter(update);
|
|
180
182
|
}
|
|
181
183
|
setState(update) {
|
|
182
184
|
var _a, _b;
|
|
@@ -251,7 +253,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
|
251
253
|
return this.state.filterExpression;
|
|
252
254
|
}
|
|
253
255
|
_updateFilter(filter, update) {
|
|
254
|
-
var _a;
|
|
256
|
+
var _a, _b;
|
|
255
257
|
const { originFilters, filters, _wip } = this.state;
|
|
256
258
|
if (filter.origin) {
|
|
257
259
|
const originalValues = this._originalValues.get(`${filter.key}-${filter.origin}`);
|
|
@@ -283,12 +285,10 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
|
283
285
|
return f === filter ? { ...f, ...update } : f;
|
|
284
286
|
});
|
|
285
287
|
this.setState({ filters: updatedFilters });
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
});
|
|
291
|
-
}
|
|
288
|
+
(_b = this._recommendations) == null ? void 0 : _b.storeRecentFilter({
|
|
289
|
+
...filter,
|
|
290
|
+
...update
|
|
291
|
+
});
|
|
292
292
|
}
|
|
293
293
|
updateToMatchAll(filter) {
|
|
294
294
|
this._updateFilter(filter, {
|