-
Notifications
You must be signed in to change notification settings - Fork 50
Expand file tree
/
Copy pathDrilldownDependenciesManager.ts
More file actions
105 lines (88 loc) · 3.3 KB
/
DrilldownDependenciesManager.ts
File metadata and controls
105 lines (88 loc) · 3.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import {
findClosestAdHocFilterInHierarchy,
findGlobalAdHocFilterVariableByUid,
} from '../variables/adhoc/patchGetAdhocFilters';
import {
findClosestGroupByInHierarchy,
findGlobalGroupByVariableByUid,
} from '../variables/groupby/findActiveGroupByVariablesByUid';
import { GroupByVariable } from '../variables/groupby/GroupByVariable';
import {
AdHocFilterWithLabels,
AdHocFiltersVariable,
isFilterApplicable,
isFilterComplete,
} from '../variables/adhoc/AdHocFiltersVariable';
import { VariableDependencyConfig } from '../variables/VariableDependencyConfig';
import { SceneObject, SceneObjectState } from '../core/types';
/**
* Manages ad-hoc filters and group-by variables for data providers
*/
export class DrilldownDependenciesManager<TState extends SceneObjectState> {
private _adhocFiltersVar?: AdHocFiltersVariable;
private _groupByVar?: GroupByVariable;
private _variableDependency: VariableDependencyConfig<TState>;
public constructor(variableDependency: VariableDependencyConfig<TState>) {
this._variableDependency = variableDependency;
}
/**
* Find drilldown variables matching the given datasource UID.
* When sceneObject is provided, walks up the hierarchy to find the closest match.
* Otherwise falls back to searching the global active variable sets.
*/
public findAndSubscribeToDrilldowns(interpolatedUid: string | undefined, sceneObject?: SceneObject) {
const filtersVar = sceneObject
? findClosestAdHocFilterInHierarchy(interpolatedUid, sceneObject)
: findGlobalAdHocFilterVariableByUid(interpolatedUid);
const groupByVar = sceneObject
? findClosestGroupByInHierarchy(interpolatedUid, sceneObject)
: findGlobalGroupByVariableByUid(interpolatedUid);
let hasChanges = false;
if (this._adhocFiltersVar !== filtersVar) {
this._adhocFiltersVar = filtersVar;
hasChanges = true;
}
if (this._groupByVar !== groupByVar) {
this._groupByVar = groupByVar;
hasChanges = true;
}
if (hasChanges) {
this._updateExplicitDrilldownVariableDependencies();
}
}
private _updateExplicitDrilldownVariableDependencies(): void {
const explicitDependencies: string[] = [];
if (this._adhocFiltersVar) {
explicitDependencies.push(this._adhocFiltersVar.state.name);
}
if (this._groupByVar) {
explicitDependencies.push(this._groupByVar.state.name);
}
this._variableDependency.setVariableNames(explicitDependencies);
}
public get adHocFiltersVar(): AdHocFiltersVariable | undefined {
return this._adhocFiltersVar;
}
public get groupByVar(): GroupByVariable | undefined {
return this._groupByVar;
}
public getFilters(): AdHocFilterWithLabels[] | undefined {
if (!this._adhocFiltersVar) {
return undefined;
}
const stateFilters = this._adhocFiltersVar.state.filters;
const originFilters = this._adhocFiltersVar.state.originFilters ?? [];
const allFilters = [...originFilters, ...stateFilters];
return allFilters.filter((f) => isFilterComplete(f) && isFilterApplicable(f));
}
public getGroupByKeys(): string[] | undefined {
if (!this._groupByVar) {
return undefined;
}
return this._groupByVar.getApplicableKeys();
}
public cleanup(): void {
this._adhocFiltersVar = undefined;
this._groupByVar = undefined;
}
}