kibanaPanel.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. define([
  2. 'angular'
  3. ],
  4. function (angular) {
  5. 'use strict';
  6. angular
  7. .module('kibana.directives')
  8. .directive('kibanaPanel', function($compile) {
  9. var container = '<div class="panelCont"></div>';
  10. var editorTemplate =
  11. '<div class="row-fluid panel-extra"><div class="panel-extra-container">' +
  12. '<span class="extra row-button" ng-show="panel.editable != false">' +
  13. '<span ng-click="remove_panel_from_row(row,panel)" class="pointer">'+
  14. '<i class="icon-remove pointer" bs-tooltip="\'Remove\'"></i></span>'+
  15. '</span>' +
  16. '<span class="extra row-button" ng-hide="panel.draggable == false">' +
  17. '<span class="pointer" bs-tooltip="\'Drag here to move\'"' +
  18. 'data-drag=true data-jqyoui-options="{revert: \'invalid\',helper:\'clone\'}"'+
  19. ' jqyoui-draggable="'+
  20. '{'+
  21. 'animate:false,'+
  22. 'mutate:false,'+
  23. 'index:{{$index}},'+
  24. 'onStart:\'panelMoveStart\','+
  25. 'onStop:\'panelMoveStop\''+
  26. '}" ng-model="row.panels"><i class="icon-move"></i></span>'+
  27. '</span>' +
  28. '<span class="row-button extra" ng-show="panel.editable != false">' +
  29. '<span config-modal class="pointer">'+
  30. '<i class="icon-cog pointer" bs-tooltip="\'Configure\'"></i></span>'+
  31. '</span>' +
  32. '<span ng-repeat="task in panelMeta.modals" class="row-button extra" ng-show="task.show">' +
  33. '<span bs-modal="task.partial" class="pointer"><i ' +
  34. 'bs-tooltip="task.description" ng-class="task.icon" class="pointer"></i></span>'+
  35. '</span>' +
  36. '<span class="row-button extra" ng-show="panelMeta.loading == true">' +
  37. '<span>'+
  38. '<i class="icon-spinner icon-spin icon-large"></i>' +
  39. '</span>'+
  40. '</span>' +
  41. '<span ng-if="panelMeta.menuItems" class="dropdown" ng-show="panel.title">' +
  42. '<span class="dropdown-toggle panel-text panel-title pointer" data-toggle="dropdown" tabindex="1">' +
  43. '{{panel.title}}' +
  44. '</span>' +
  45. '<ul class="dropdown-menu" role="menu">' +
  46. '<li ng-repeat="item in panelMeta.menuItems"><a ng-click="item.action();">{{item.text}}</a></li>' +
  47. '</ul>' +
  48. '</span>'+
  49. '<span ng-if="!panelMeta.menuItems" class="panel-text panel-title" ng-show="panel.title">' +
  50. '{{panel.title}}' +
  51. '</span>'+
  52. '</div></div>';
  53. return {
  54. restrict: 'E',
  55. link: function($scope, elem, attr) {
  56. // once we have the template, scan it for controllers and
  57. // load the module.js if we have any
  58. var newScope = $scope.$new();
  59. // compile the module and uncloack. We're done
  60. function loadModule($module) {
  61. $module.appendTo(elem);
  62. elem.wrap(container);
  63. /* jshint indent:false */
  64. $compile(elem.contents())(newScope);
  65. elem.removeClass("ng-cloak");
  66. }
  67. newScope.$on('$destroy',function(){
  68. elem.unbind();
  69. elem.remove();
  70. });
  71. $scope.$watch(attr.type, function (name) {
  72. elem.addClass("ng-cloak");
  73. // load the panels module file, then render it in the dom.
  74. var nameAsPath = name.replace(".", "/");
  75. $scope.require([
  76. 'jquery',
  77. 'text!panels/'+nameAsPath+'/module.html',
  78. 'text!panels/'+nameAsPath+'/editor.html'
  79. ], function ($, moduleTemplate) {
  80. var $module = $(moduleTemplate);
  81. // top level controllers
  82. var $controllers = $module.filter('ngcontroller, [ng-controller], .ng-controller');
  83. // add child controllers
  84. $controllers = $controllers.add($module.find('ngcontroller, [ng-controller], .ng-controller'));
  85. if ($controllers.length) {
  86. $controllers.first().prepend(editorTemplate);
  87. $scope.require([
  88. 'panels/'+nameAsPath+'/module'
  89. ], function() {
  90. loadModule($module);
  91. });
  92. } else {
  93. loadModule($module);
  94. }
  95. });
  96. });
  97. }
  98. };
  99. });
  100. });