grafanaPanel.js 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. define([
  2. 'angular',
  3. 'jquery',
  4. './panelMenu',
  5. ],
  6. function (angular, $) {
  7. 'use strict';
  8. angular
  9. .module('grafana.directives')
  10. .directive('grafanaPanel', function($compile, $parse) {
  11. var container = '<div class="panel-container"></div>';
  12. var content = '<div class="panel-content"></div>';
  13. var panelHeader =
  14. '<div class="panel-header">'+
  15. '<span class="alert-error panel-error small pointer"' +
  16. 'config-modal="app/partials/inspector.html" ng-if="panelMeta.error">' +
  17. '<span data-placement="right" bs-tooltip="panelMeta.error">' +
  18. '<i class="icon-exclamation-sign"></i><span class="panel-error-arrow"></span>' +
  19. '</span>' +
  20. '</span>' +
  21. '<span class="panel-loading" ng-show="panelMeta.loading">' +
  22. '<i class="icon-spinner icon-spin icon-large"></i>' +
  23. '</span>' +
  24. '<div class="panel-title-container" panel-menu></div>' +
  25. '</div>'+
  26. '</div>';
  27. return {
  28. restrict: 'E',
  29. link: function($scope, elem, attr) {
  30. var getter = $parse(attr.type), panelType = getter($scope);
  31. var newScope = $scope.$new();
  32. $scope.kbnJqUiDraggableOptions = {
  33. revert: 'invalid',
  34. helper: function() {
  35. return $('<div style="width:200px;height:100px;background: rgba(100,100,100,0.50);"/>');
  36. },
  37. placeholder: 'keep'
  38. };
  39. // compile the module and uncloack. We're done
  40. function loadModule($module) {
  41. $module.appendTo(elem);
  42. elem.wrap(container);
  43. /* jshint indent:false */
  44. $compile(elem.contents())(newScope);
  45. elem.removeClass("ng-cloak");
  46. var panelCtrlElem = $(elem.children()[0]);
  47. var panelCtrlScope = panelCtrlElem.data().$scope;
  48. panelCtrlScope.$watchGroup(['fullscreen', 'panel.height', 'row.height'], function() {
  49. panelCtrlElem.css({ minHeight: panelCtrlScope.panel.height || panelCtrlScope.row.height });
  50. panelCtrlElem.toggleClass('panel-fullscreen', panelCtrlScope.fullscreen ? true : false);
  51. });
  52. }
  53. newScope.$on('$destroy',function() {
  54. elem.unbind();
  55. elem.remove();
  56. });
  57. elem.addClass('ng-cloak');
  58. $scope.require([
  59. 'jquery',
  60. 'text!panels/'+panelType+'/module.html',
  61. 'panels/' + panelType + "/module",
  62. ], function ($, moduleTemplate) {
  63. var $module = $(moduleTemplate);
  64. $module.prepend(panelHeader);
  65. $module.first().find('.panel-header').nextAll().wrapAll(content);
  66. loadModule($module);
  67. });
  68. }
  69. };
  70. });
  71. });