panel_loader.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. ///<reference path="../../headers/common.d.ts" />
  2. import angular from 'angular';
  3. import config from 'app/core/config';
  4. import {UnknownPanel} from '../../plugins/panel/unknown/module';
  5. var directiveModule = angular.module('grafana.directives');
  6. /** @ngInject */
  7. function panelLoader($compile, dynamicDirectiveSrv, $http, $q, $injector, $templateCache) {
  8. return {
  9. restrict: 'E',
  10. scope: {
  11. dashboard: "=",
  12. row: "=",
  13. panel: "="
  14. },
  15. link: function(scope, elem, attrs) {
  16. function getTemplate(directive) {
  17. if (directive.template) {
  18. return $q.when(directive.template);
  19. }
  20. var cached = $templateCache.get(directive.templateUrl);
  21. if (cached) {
  22. return $q.when(cached);
  23. }
  24. return $http.get(directive.templateUrl).then(res => {
  25. return res.data;
  26. });
  27. }
  28. function addPanelAndCompile(name) {
  29. var child = angular.element(document.createElement(name));
  30. child.attr('dashboard', 'dashboard');
  31. child.attr('panel', 'panel');
  32. child.attr('row', 'row');
  33. $compile(child)(scope);
  34. elem.empty();
  35. elem.append(child);
  36. }
  37. function addPanel(name, Panel) {
  38. if (Panel.registered) {
  39. addPanelAndCompile(name);
  40. return;
  41. }
  42. if (Panel.promise) {
  43. Panel.promise.then(() => {
  44. addPanelAndCompile(name);
  45. });
  46. return;
  47. }
  48. var panelInstance = $injector.instantiate(Panel);
  49. var directive = panelInstance.getDirective();
  50. Panel.promise = getTemplate(directive).then(template => {
  51. directive.templateUrl = null;
  52. directive.template = `<grafana-panel ctrl="ctrl">${template}</grafana-panel>`;
  53. directiveModule.directive(attrs.$normalize(name), function() {
  54. return directive;
  55. });
  56. Panel.registered = true;
  57. addPanelAndCompile(name);
  58. });
  59. }
  60. var panelElemName = 'panel-directive-' + scope.panel.type;
  61. let panelInfo = config.panels[scope.panel.type];
  62. if (!panelInfo) {
  63. addPanel(panelElemName, UnknownPanel);
  64. return;
  65. }
  66. System.import(panelInfo.module).then(function(panelModule) {
  67. addPanel(panelElemName, panelModule.Panel);
  68. }).catch(err => {
  69. console.log('Panel err: ', err);
  70. });
  71. }
  72. };
  73. }
  74. directiveModule.directive('panelLoader', panelLoader);