2017-12-20 05:33:33 -06:00
|
|
|
import _ from 'lodash';
|
2019-06-13 13:04:15 -05:00
|
|
|
import { TimeSrv } from 'app/features/dashboard/services/TimeSrv';
|
2019-06-25 04:38:51 -05:00
|
|
|
import templateSrv, { TemplateSrv } from 'app/features/templating/template_srv';
|
|
|
|
import coreModule from 'app/core/core_module';
|
|
|
|
import { appendQueryToUrl, toUrlParams } from 'app/core/utils/url';
|
2019-08-16 04:10:32 -05:00
|
|
|
import { VariableSuggestion, ScopedVars, VariableOrigin } from '@grafana/ui';
|
|
|
|
import { TimeSeriesValue, DateTime, dateTime, DataLink, KeyValue, deprecationWarning } from '@grafana/data';
|
2019-06-25 04:38:51 -05:00
|
|
|
|
|
|
|
export const DataLinkBuiltInVars = {
|
|
|
|
keepTime: '__url_time_range',
|
|
|
|
includeVars: '__all_variables',
|
|
|
|
seriesName: '__series_name',
|
|
|
|
valueTime: '__value_time',
|
|
|
|
};
|
|
|
|
|
|
|
|
export const getPanelLinksVariableSuggestions = (): VariableSuggestion[] => [
|
|
|
|
...templateSrv.variables.map(variable => ({
|
|
|
|
value: variable.name as string,
|
|
|
|
origin: VariableOrigin.Template,
|
|
|
|
})),
|
|
|
|
{
|
|
|
|
value: `${DataLinkBuiltInVars.includeVars}`,
|
|
|
|
documentation: 'Adds current variables',
|
|
|
|
origin: VariableOrigin.BuiltIn,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
value: `${DataLinkBuiltInVars.keepTime}`,
|
|
|
|
documentation: 'Adds current time range',
|
|
|
|
origin: VariableOrigin.BuiltIn,
|
|
|
|
},
|
|
|
|
];
|
|
|
|
|
|
|
|
export const getDataLinksVariableSuggestions = (): VariableSuggestion[] => [
|
|
|
|
...getPanelLinksVariableSuggestions(),
|
|
|
|
{
|
|
|
|
value: `${DataLinkBuiltInVars.seriesName}`,
|
|
|
|
documentation: 'Adds series name',
|
|
|
|
origin: VariableOrigin.BuiltIn,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
value: `${DataLinkBuiltInVars.valueTime}`,
|
2019-07-22 06:35:12 -05:00
|
|
|
documentation: 'Time value of the clicked datapoint (in ms epoch)',
|
2019-06-25 04:38:51 -05:00
|
|
|
origin: VariableOrigin.BuiltIn,
|
|
|
|
},
|
|
|
|
];
|
|
|
|
|
|
|
|
type LinkTarget = '_blank' | '_self';
|
|
|
|
|
2019-08-12 09:11:06 -05:00
|
|
|
export interface LinkModel {
|
2019-06-25 04:38:51 -05:00
|
|
|
href: string;
|
|
|
|
title: string;
|
|
|
|
target: LinkTarget;
|
|
|
|
}
|
|
|
|
|
|
|
|
interface LinkDataPoint {
|
|
|
|
datapoint: TimeSeriesValue[];
|
|
|
|
seriesName: string;
|
2019-07-18 01:03:04 -05:00
|
|
|
[key: number]: any;
|
2019-06-25 04:38:51 -05:00
|
|
|
}
|
|
|
|
export interface LinkService {
|
|
|
|
getDataLinkUIModel: (link: DataLink, scopedVars: ScopedVars, dataPoint?: LinkDataPoint) => LinkModel;
|
|
|
|
getDataPointVars: (seriesName: string, dataPointTs: DateTime) => ScopedVars;
|
|
|
|
}
|
2017-10-25 08:29:13 -05:00
|
|
|
|
2019-06-25 04:38:51 -05:00
|
|
|
export class LinkSrv implements LinkService {
|
2017-10-25 08:29:13 -05:00
|
|
|
/** @ngInject */
|
2019-06-13 13:04:15 -05:00
|
|
|
constructor(private templateSrv: TemplateSrv, private timeSrv: TimeSrv) {}
|
2017-10-25 08:29:13 -05:00
|
|
|
|
2019-06-13 13:04:15 -05:00
|
|
|
getLinkUrl(link: any) {
|
2018-08-29 07:27:29 -05:00
|
|
|
const url = this.templateSrv.replace(link.url || '');
|
2019-06-13 13:04:15 -05:00
|
|
|
const params: { [key: string]: any } = {};
|
2017-10-25 08:29:13 -05:00
|
|
|
|
|
|
|
if (link.keepTime) {
|
2018-08-29 07:27:29 -05:00
|
|
|
const range = this.timeSrv.timeRangeForUrl();
|
2017-12-20 05:33:33 -06:00
|
|
|
params['from'] = range.from;
|
|
|
|
params['to'] = range.to;
|
2017-10-25 08:29:13 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
if (link.includeVars) {
|
|
|
|
this.templateSrv.fillVariableValuesForUrl(params);
|
|
|
|
}
|
|
|
|
|
2019-06-25 04:38:51 -05:00
|
|
|
return appendQueryToUrl(url, toUrlParams(params));
|
2017-10-25 08:29:13 -05:00
|
|
|
}
|
|
|
|
|
2019-06-13 13:04:15 -05:00
|
|
|
getAnchorInfo(link: any) {
|
2018-08-29 07:27:29 -05:00
|
|
|
const info: any = {};
|
2017-10-26 06:25:47 -05:00
|
|
|
info.href = this.getLinkUrl(link);
|
2017-12-20 05:33:33 -06:00
|
|
|
info.title = this.templateSrv.replace(link.title || '');
|
2017-10-25 08:29:13 -05:00
|
|
|
return info;
|
|
|
|
}
|
|
|
|
|
2019-06-25 04:38:51 -05:00
|
|
|
getDataPointVars = (seriesName: string, valueTime: DateTime) => {
|
|
|
|
return {
|
|
|
|
[DataLinkBuiltInVars.valueTime]: {
|
|
|
|
text: valueTime.valueOf(),
|
|
|
|
value: valueTime.valueOf(),
|
|
|
|
},
|
|
|
|
[DataLinkBuiltInVars.seriesName]: {
|
2019-07-24 13:40:41 -05:00
|
|
|
text: seriesName,
|
|
|
|
value: seriesName,
|
2019-06-25 04:38:51 -05:00
|
|
|
},
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
getDataLinkUIModel = (link: DataLink, scopedVars: ScopedVars, dataPoint?: LinkDataPoint) => {
|
|
|
|
const params: KeyValue = {};
|
|
|
|
const timeRangeUrl = toUrlParams(this.timeSrv.timeRangeForUrl());
|
|
|
|
|
|
|
|
const info: LinkModel = {
|
|
|
|
href: link.url,
|
|
|
|
title: this.templateSrv.replace(link.title || '', scopedVars),
|
|
|
|
target: link.targetBlank ? '_blank' : '_self',
|
|
|
|
};
|
|
|
|
|
|
|
|
this.templateSrv.fillVariableValuesForUrl(params, scopedVars);
|
|
|
|
|
|
|
|
const variablesQuery = toUrlParams(params);
|
|
|
|
|
|
|
|
info.href = this.templateSrv.replace(link.url, {
|
|
|
|
...scopedVars,
|
|
|
|
[DataLinkBuiltInVars.keepTime]: {
|
|
|
|
text: timeRangeUrl,
|
|
|
|
value: timeRangeUrl,
|
|
|
|
},
|
|
|
|
[DataLinkBuiltInVars.includeVars]: {
|
|
|
|
text: variablesQuery,
|
|
|
|
value: variablesQuery,
|
|
|
|
},
|
|
|
|
});
|
2017-10-25 08:29:13 -05:00
|
|
|
|
2019-06-25 04:38:51 -05:00
|
|
|
if (dataPoint) {
|
|
|
|
info.href = this.templateSrv.replace(
|
|
|
|
info.href,
|
2019-08-08 09:30:01 -05:00
|
|
|
this.getDataPointVars(dataPoint.seriesName, dateTime(dataPoint.datapoint[0]))
|
2019-06-25 04:38:51 -05:00
|
|
|
);
|
2017-10-25 08:29:13 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
return info;
|
2019-06-25 04:38:51 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* getPanelLinkAnchorInfo method is left for plugins compatibility reasons
|
|
|
|
*
|
|
|
|
* @deprecated Drilldown links should be generated using getDataLinkUIModel method
|
|
|
|
*/
|
|
|
|
getPanelLinkAnchorInfo(link: DataLink, scopedVars: ScopedVars) {
|
|
|
|
deprecationWarning('link_srv.ts', 'getPanelLinkAnchorInfo', 'getDataLinkUIModel');
|
|
|
|
return this.getDataLinkUIModel(link, scopedVars);
|
2017-10-25 08:29:13 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-06-25 04:38:51 -05:00
|
|
|
let singleton: LinkService;
|
|
|
|
|
|
|
|
export function setLinkSrv(srv: LinkService) {
|
|
|
|
singleton = srv;
|
|
|
|
}
|
|
|
|
|
|
|
|
export function getLinkSrv(): LinkService {
|
|
|
|
return singleton;
|
|
|
|
}
|
|
|
|
|
|
|
|
coreModule.service('linkSrv', LinkSrv);
|