| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- import angular from "angular";
- import _ from "lodash";
- import { iconMap } from "./editor";
- function dashLinksContainer() {
- return {
- scope: {
- links: "="
- },
- restrict: "E",
- controller: "DashLinksContainerCtrl",
- template:
- '<dash-link ng-repeat="link in generatedLinks" link="link"></dash-link>',
- link: function() {}
- };
- }
- /** @ngInject */
- function dashLink($compile, linkSrv) {
- return {
- restrict: "E",
- link: function(scope, elem) {
- var link = scope.link;
- var template =
- '<div class="gf-form">' +
- '<a class="pointer gf-form-label" data-placement="bottom"' +
- (link.asDropdown
- ? ' ng-click="fillDropdown(link)" data-toggle="dropdown"'
- : "") +
- ">" +
- "<i></i> <span></span></a>";
- if (link.asDropdown) {
- template +=
- '<ul class="dropdown-menu" role="menu">' +
- '<li ng-repeat="dash in link.searchHits"><a href="{{dash.url}}">{{dash.title}}</a></li>' +
- "</ul>";
- }
- template += "</div>";
- elem.html(template);
- $compile(elem.contents())(scope);
- var anchor = elem.find("a");
- var icon = elem.find("i");
- var span = elem.find("span");
- function update() {
- var linkInfo = linkSrv.getAnchorInfo(link);
- span.text(linkInfo.title);
- anchor.attr("href", linkInfo.href);
- }
- // tooltip
- elem
- .find("a")
- .tooltip({ title: scope.link.tooltip, html: true, container: "body" });
- icon.attr("class", "fa fa-fw " + scope.link.icon);
- anchor.attr("target", scope.link.target);
- // fix for menus on the far right
- if (link.asDropdown && scope.$last) {
- elem.find(".dropdown-menu").addClass("pull-right");
- }
- update();
- scope.$on("refresh", update);
- }
- };
- }
- export class DashLinksContainerCtrl {
- /** @ngInject */
- constructor($scope, $rootScope, $q, backendSrv, dashboardSrv, linkSrv) {
- var currentDashId = dashboardSrv.getCurrent().id;
- function buildLinks(linkDef) {
- if (linkDef.type === "dashboards") {
- if (!linkDef.tags) {
- console.log("Dashboard link missing tag");
- return $q.when([]);
- }
- if (linkDef.asDropdown) {
- return $q.when([
- {
- title: linkDef.title,
- tags: linkDef.tags,
- keepTime: linkDef.keepTime,
- includeVars: linkDef.includeVars,
- icon: "fa fa-bars",
- asDropdown: true
- }
- ]);
- }
- return $scope.searchDashboards(linkDef, 7);
- }
- if (linkDef.type === "link") {
- return $q.when([
- {
- url: linkDef.url,
- title: linkDef.title,
- icon: iconMap[linkDef.icon],
- tooltip: linkDef.tooltip,
- target: linkDef.targetBlank ? "_blank" : "_self",
- keepTime: linkDef.keepTime,
- includeVars: linkDef.includeVars
- }
- ]);
- }
- return $q.when([]);
- }
- function updateDashLinks() {
- var promises = _.map($scope.links, buildLinks);
- $q.all(promises).then(function(results) {
- $scope.generatedLinks = _.flatten(results);
- });
- }
- $scope.searchDashboards = function(link, limit) {
- return backendSrv
- .search({ tag: link.tags, limit: limit })
- .then(function(results) {
- return _.reduce(
- results,
- function(memo, dash) {
- // do not add current dashboard
- if (dash.id !== currentDashId) {
- memo.push({
- title: dash.title,
- url: "dashboard/" + dash.uri,
- icon: "fa fa-th-large",
- keepTime: link.keepTime,
- includeVars: link.includeVars
- });
- }
- return memo;
- },
- []
- );
- });
- };
- $scope.fillDropdown = function(link) {
- $scope.searchDashboards(link, 100).then(function(results) {
- _.each(results, function(hit) {
- hit.url = linkSrv.getLinkUrl(hit);
- });
- link.searchHits = results;
- });
- };
- updateDashLinks();
- $rootScope.onAppEvent("dash-links-updated", updateDashLinks, $scope);
- }
- }
- angular
- .module("grafana.directives")
- .directive("dashLinksContainer", dashLinksContainer);
- angular.module("grafana.directives").directive("dashLink", dashLink);
- angular
- .module("grafana.directives")
- .controller("DashLinksContainerCtrl", DashLinksContainerCtrl);
|