panelDirective.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. define([
  2. 'angular',
  3. 'jquery',
  4. 'config',
  5. ],
  6. function (angular, $, config) {
  7. 'use strict';
  8. angular
  9. .module('grafana.directives')
  10. .directive('panelLoader', function($compile, $parse) {
  11. return {
  12. restrict: 'E',
  13. link: function(scope, elem, attr) {
  14. var getter = $parse(attr.type), panelType = getter(scope);
  15. var panelPath = config.panels[panelType].path;
  16. scope.require([panelPath + "/module"], function () {
  17. var panelEl = angular.element(document.createElement('grafana-panel-' + panelType));
  18. elem.append(panelEl);
  19. $compile(panelEl)(scope);
  20. });
  21. }
  22. };
  23. })
  24. .directive('grafanaPanel', function() {
  25. return {
  26. restrict: 'E',
  27. templateUrl: 'app/features/panel/partials/panel.html',
  28. transclude: true,
  29. link: function(scope, elem) {
  30. var panelContainer = elem.find('.panel-container');
  31. scope.$watchGroup(['fullscreen', 'height', 'panel.height', 'row.height'], function() {
  32. panelContainer.css({ minHeight: scope.height || scope.panel.height || scope.row.height, display: 'block' });
  33. elem.toggleClass('panel-fullscreen', scope.fullscreen ? true : false);
  34. });
  35. }
  36. };
  37. })
  38. .directive('panelResizer', function($rootScope) {
  39. return {
  40. restrict: 'E',
  41. template: '<span class="resize-panel-handle"></span>',
  42. link: function(scope, elem) {
  43. var resizing = false;
  44. var handleOffset;
  45. var originalHeight;
  46. var originalWidth;
  47. var maxWidth;
  48. function dragStartHandler(e) {
  49. e.preventDefault();
  50. console.log('start');
  51. resizing = true;
  52. handleOffset = $(e.target).offset();
  53. originalHeight = parseInt(scope.row.height);
  54. originalWidth = scope.panel.span;
  55. maxWidth = $(document).width();
  56. $('body').on('mousemove', moveHandler);
  57. $('body').on('mouseup', dragEndHandler);
  58. }
  59. function moveHandler(e) {
  60. scope.row.height = originalHeight + (e.pageY - handleOffset.top);
  61. scope.panel.span = originalWidth + (((e.pageX - handleOffset.left) / maxWidth) * 12);
  62. var rowSpan = scope.dashboard.rowSpan(scope.row);
  63. if (Math.floor(rowSpan) < 14) {
  64. scope.row.panels[scope.row.panels.length - 1].span = scope.row.panels[scope.row.panels.length - 1].span - (rowSpan - 12);
  65. }
  66. scope.$apply(function() {
  67. scope.$broadcast('render');
  68. });
  69. }
  70. function dragEndHandler() {
  71. console.log('end');
  72. scope.$apply(function() {
  73. $rootScope.$broadcast('render');
  74. });
  75. $('body').off('mousemove', moveHandler);
  76. $('body').off('mouseup', dragEndHandler);
  77. }
  78. elem.on('mousedown', dragStartHandler);
  79. scope.$on("$destroy", function() {
  80. elem.off('mousedown', dragStartHandler);
  81. });
  82. }
  83. };
  84. });
  85. });