kibana-sinatra 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/kibana-sinatra.gemspec +1 -0
  4. data/lib/kibana/assets/app/app.js +8 -3
  5. data/lib/kibana/assets/app/components/kbn.js +45 -10
  6. data/lib/kibana/assets/app/components/{underscore.extended.js → lodash.extended.js} +2 -4
  7. data/lib/kibana/assets/app/components/require.config.js +5 -6
  8. data/lib/kibana/assets/app/components/settings.js +1 -1
  9. data/lib/kibana/assets/app/controllers/dash.js +10 -5
  10. data/lib/kibana/assets/app/controllers/dashLoader.js +1 -1
  11. data/lib/kibana/assets/app/controllers/pulldown.js +1 -1
  12. data/lib/kibana/assets/app/controllers/row.js +1 -1
  13. data/lib/kibana/assets/app/dashboards/default.json +1 -1
  14. data/lib/kibana/assets/app/dashboards/logstash.js +4 -4
  15. data/lib/kibana/assets/app/dashboards/logstash.json +1 -1
  16. data/lib/kibana/assets/app/directives/addPanel.js +1 -1
  17. data/lib/kibana/assets/app/directives/arrayJoin.js +1 -1
  18. data/lib/kibana/assets/app/directives/configModal.js +23 -5
  19. data/lib/kibana/assets/app/directives/kibanaPanel.js +70 -50
  20. data/lib/kibana/assets/app/directives/kibanaSimplePanel.js +1 -1
  21. data/lib/kibana/assets/app/factories/store.js +59 -0
  22. data/lib/kibana/assets/app/filters/all.js +6 -13
  23. data/lib/kibana/assets/app/panels/bettermap/module.html +5 -0
  24. data/lib/kibana/assets/app/panels/bettermap/module.js +1 -1
  25. data/lib/kibana/assets/app/panels/column/editor.html +1 -1
  26. data/lib/kibana/assets/app/panels/column/module.js +7 -6
  27. data/lib/kibana/assets/app/panels/dashcontrol/module.js +1 -1
  28. data/lib/kibana/assets/app/panels/derivequeries/module.js +1 -1
  29. data/lib/kibana/assets/app/panels/fields/module.js +1 -1
  30. data/lib/kibana/assets/app/panels/filtering/module.html +10 -17
  31. data/lib/kibana/assets/app/panels/filtering/module.js +19 -1
  32. data/lib/kibana/assets/app/panels/histogram/module.html +4 -4
  33. data/lib/kibana/assets/app/panels/histogram/module.js +62 -12
  34. data/lib/kibana/assets/app/panels/histogram/timeSeries.js +6 -3
  35. data/lib/kibana/assets/app/panels/hits/module.js +1 -1
  36. data/lib/kibana/assets/app/panels/map/module.js +1 -1
  37. data/lib/kibana/assets/app/panels/pie/editor.html +1 -1
  38. data/lib/kibana/assets/app/panels/pie/module.js +1 -1
  39. data/lib/kibana/assets/app/panels/query/meta.html +1 -1
  40. data/lib/kibana/assets/app/panels/query/module.html +1 -1
  41. data/lib/kibana/assets/app/panels/query/module.js +2 -7
  42. data/lib/kibana/assets/app/panels/query/query.css +9 -7
  43. data/lib/kibana/assets/app/panels/sparklines/module.js +2 -2
  44. data/lib/kibana/assets/app/panels/sparklines/timeSeries.js +3 -3
  45. data/lib/kibana/assets/app/panels/stats/editor.html +36 -0
  46. data/lib/kibana/assets/app/panels/stats/module.html +15 -0
  47. data/lib/kibana/assets/app/panels/stats/module.js +199 -0
  48. data/lib/kibana/assets/app/panels/table/editor.html +23 -27
  49. data/lib/kibana/assets/app/panels/table/micropanel.html +3 -1
  50. data/lib/kibana/assets/app/panels/table/module.js +7 -1
  51. data/lib/kibana/assets/app/panels/terms/editor.html +16 -3
  52. data/lib/kibana/assets/app/panels/terms/module.html +14 -5
  53. data/lib/kibana/assets/app/panels/terms/module.js +66 -18
  54. data/lib/kibana/assets/app/panels/text/module.js +1 -1
  55. data/lib/kibana/assets/app/panels/timepicker/editor.html +14 -12
  56. data/lib/kibana/assets/app/panels/timepicker/module.html +3 -8
  57. data/lib/kibana/assets/app/panels/timepicker/module.js +1 -1
  58. data/lib/kibana/assets/app/panels/trends/module.js +1 -1
  59. data/lib/kibana/assets/app/partials/dashLoader.html +10 -10
  60. data/lib/kibana/assets/app/partials/dashboard.html +35 -44
  61. data/lib/kibana/assets/app/partials/dasheditor.html +7 -5
  62. data/lib/kibana/assets/app/partials/paneleditor.html +2 -1
  63. data/lib/kibana/assets/app/partials/panelgeneral.html +1 -1
  64. data/lib/kibana/assets/app/partials/roweditor.html +11 -9
  65. data/lib/kibana/assets/app/services/alertSrv.js +1 -1
  66. data/lib/kibana/assets/app/services/dashboard.js +27 -14
  67. data/lib/kibana/assets/app/services/esVersion.js +70 -31
  68. data/lib/kibana/assets/app/services/fields.js +14 -37
  69. data/lib/kibana/assets/app/services/filterSrv.js +7 -11
  70. data/lib/kibana/assets/app/services/kbnIndex.js +24 -15
  71. data/lib/kibana/assets/app/services/panelMove.js +1 -1
  72. data/lib/kibana/assets/app/services/querySrv.js +20 -6
  73. data/lib/kibana/assets/app/services/timer.js +1 -1
  74. data/lib/kibana/assets/css/bootstrap.dark.min.css +1 -1
  75. data/lib/kibana/assets/css/bootstrap.light.min.css +1 -1
  76. data/lib/kibana/assets/img/cubes.png +0 -0
  77. data/lib/kibana/assets/img/light.png +0 -0
  78. data/lib/kibana/assets/index.html +3 -2
  79. data/lib/kibana/assets/vendor/LICENSE.json +90 -0
  80. data/lib/kibana/assets/vendor/angular/angular-cookies.js +185 -0
  81. data/lib/kibana/assets/vendor/angular/angular-dragdrop.js +33 -4
  82. data/lib/kibana/assets/vendor/blob.js +178 -0
  83. data/lib/kibana/assets/vendor/bootstrap/bootstrap.js +6 -1
  84. data/lib/kibana/assets/vendor/bootstrap/less/bak/bootswatch.dark.less +555 -0
  85. data/lib/kibana/assets/vendor/bootstrap/less/bak/variables.dark.less +304 -0
  86. data/lib/kibana/assets/vendor/bootstrap/less/bootswatch.dark.less +349 -327
  87. data/lib/kibana/assets/vendor/bootstrap/less/bootswatch.light.less +590 -7
  88. data/lib/kibana/assets/vendor/bootstrap/less/modals.less +1 -1
  89. data/lib/kibana/assets/vendor/bootstrap/less/overrides.less +191 -75
  90. data/lib/kibana/assets/vendor/bootstrap/less/variables.dark.less +96 -97
  91. data/lib/kibana/assets/vendor/bootstrap/less/variables.light.less +84 -81
  92. data/lib/kibana/assets/vendor/jquery/jquery.flot.events.js +39 -51
  93. data/lib/kibana/assets/vendor/lodash.js +6785 -0
  94. data/lib/kibana/assets/vendor/numeral.js +565 -0
  95. data/lib/kibana/sinatra/version.rb +1 -1
  96. data/lib/kibana/views/config.erb +1 -0
  97. data/test/sinatra_test.rb +2 -2
  98. metadata +30 -4
  99. data/lib/kibana/assets/vendor/underscore.js +0 -1246
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0ae246456b81df5e196942cf5cc54902c20963cf
4
- data.tar.gz: d8747df503e6a8317618d611d5d19200abecfc60
3
+ metadata.gz: 3b0ab86a8330f137d771fbb28969b03b700f88fa
4
+ data.tar.gz: ebc86b24d4d6bf697114cb8776d37a6ae5a8f3a6
5
5
  SHA512:
6
- metadata.gz: 7cf30e392b4ce6c72bd8f9d8c28b78d3b4d15142003b91669f1009a601bd96cfa2641f3ebbe6336c150c8c1cdb1b1c38d3987fef762e4866af861ceeda65cdac
7
- data.tar.gz: 12b2a2c6aa112dad0b28f9c2012177ebbf3a2c8b2ffef6bd0a48014fc2d218eef27420f5ca3d9a44b69cf55b6bce8f947ae36e4fc0e2be10addcfa06834b1066
6
+ metadata.gz: 72d3a09749d602f4e71f234cb43d62ef619d31e66878a797aac8375de9b252dcd97f8fe70970ed651c9577e19eaff0935e6ecf7b4ef32211e9a1e37a17c94091
7
+ data.tar.gz: e41655af7a3c3220abdfb7b4534d51dc2f2e0611260e29bbf7f3386bbb80d7ebec8d60f737c406ab46d91fcd54b5dc4005cad73f09cc8928b7b227e0674e9187
data/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  This gem provides [Kibana 3](https://github.com/elasticsearch/kibana) inside a [Sinatra](http://www.sinatrarb.com/) app that you can include in any Rack based system, including Rails.
8
8
 
9
- It is currently based on Kibana 3 commit [0f16e1cc6184ed101e63106b4b386cebc3e92652](https://github.com/elasticsearch/kibana/commits/0f16e1cc6184ed101e63106b4b386cebc3e92652)
9
+ It is currently based on Kibana 3 commit [84ed4069f7797a9e364e050063e6897927d2a0d7](https://github.com/elasticsearch/kibana/commits/84ed4069f7797a9e364e050063e6897927d2a0d7)
10
10
 
11
11
  ## Installation
12
12
 
@@ -23,5 +23,6 @@ Gem::Specification.new do |spec|
23
23
  spec.add_development_dependency "uuid"
24
24
  spec.add_development_dependency "rubyzip"
25
25
  spec.add_development_dependency "rack-test"
26
+ spec.add_development_dependency "minitest"
26
27
  spec.add_dependency "sinatra", "~> 1.4"
27
28
  end
@@ -4,13 +4,14 @@
4
4
  define([
5
5
  'angular',
6
6
  'jquery',
7
- 'underscore',
7
+ 'lodash',
8
8
  'require',
9
9
  'elasticjs',
10
10
  'bootstrap',
11
11
  'angular-sanitize',
12
12
  'angular-strap',
13
13
  'angular-dragdrop',
14
+ 'angular-cookies',
14
15
  'extend-jquery',
15
16
  'bindonce',
16
17
  ],
@@ -29,6 +30,9 @@ function (angular, $, _, appLevelRequire) {
29
30
  // This stores the Kibana revision number, @REV@ is replaced by grunt.
30
31
  app.constant('kbnVersion',"@REV@");
31
32
 
33
+ // The minimum version that must be in the cluster
34
+ app.constant('esMinVersion','0.90.9');
35
+
32
36
  // Use this for cache busting partials
33
37
  app.constant('cacheBust',"cache-bust="+Date.now());
34
38
 
@@ -94,6 +98,7 @@ function (angular, $, _, appLevelRequire) {
94
98
  '$strap.directives',
95
99
  'ngSanitize',
96
100
  'ngDragDrop',
101
+ 'ngCookies',
97
102
  'kibana',
98
103
  'pasvaz.bindonce'
99
104
  ];
@@ -124,7 +129,7 @@ function (angular, $, _, appLevelRequire) {
124
129
  angular
125
130
  .element(document)
126
131
  .ready(function() {
127
- $('body').attr('ng-controller', 'DashCtrl');
132
+ $('html').attr('ng-controller', 'DashCtrl');
128
133
  angular.bootstrap(document, apps_deps)
129
134
  .invoke(['$rootScope', function ($rootScope) {
130
135
  _.each(pre_boot_modules, function (module) {
@@ -150,4 +155,4 @@ function (angular, $, _, appLevelRequire) {
150
155
  });
151
156
 
152
157
  return app;
153
- });
158
+ });
@@ -1,4 +1,9 @@
1
- define(['jquery','underscore','moment','chromath'],
1
+ define([
2
+ 'jquery',
3
+ 'lodash',
4
+ 'moment',
5
+ 'chromath'
6
+ ],
2
7
  function($, _, moment) {
3
8
  'use strict';
4
9
 
@@ -218,7 +223,7 @@ function($, _, moment) {
218
223
  kbn.describe_interval = function (string) {
219
224
  var matches = string.match(kbn.interval_regex);
220
225
  if (!matches || !_.has(kbn.intervals_in_seconds, matches[2])) {
221
- throw new Error('Invalid interval string, expexcting a number followed by one of "Mwdhmsy"');
226
+ throw new Error('Invalid interval string, expecting a number followed by one of "Mwdhmsy"');
222
227
  } else {
223
228
  return {
224
229
  sec: kbn.intervals_in_seconds[matches[2]],
@@ -499,18 +504,22 @@ function($, _, moment) {
499
504
  }
500
505
  };
501
506
 
502
- kbn.byteFormat = function(size, decimals) {
507
+ kbn.byteFormat = function (size, decimals, min_resolution) {
503
508
  var ext, steps = 0;
504
509
 
505
- if(_.isUndefined(decimals)) {
510
+ if (_.isUndefined(decimals)) {
506
511
  decimals = 2;
507
- } else if (decimals === 0) {
508
- decimals = undefined;
509
512
  }
510
513
 
514
+ if (_.isUndefined(min_resolution)) {
515
+ min_resolution = 0;
516
+ }
517
+
518
+
511
519
  while (Math.abs(size) >= 1024) {
512
520
  steps++;
513
521
  size /= 1024;
522
+ min_resolution /= 1024;
514
523
  }
515
524
 
516
525
  switch (steps) {
@@ -543,21 +552,35 @@ function($, _, moment) {
543
552
  break;
544
553
  }
545
554
 
555
+ if (min_resolution) {
556
+ min_resolution *= Math.pow(10, decimals);
557
+ while (min_resolution % 1 !== 0) {
558
+ decimals++;
559
+ min_resolution *= 10;
560
+ }
561
+ }
562
+
563
+ if (decimals === 0) {
564
+ decimals = undefined;
565
+ }
566
+
546
567
  return (size.toFixed(decimals) + ext);
547
568
  };
548
569
 
549
- kbn.shortFormat = function(size, decimals) {
570
+ kbn.shortFormat = function (size, decimals, min_resolution) {
550
571
  var ext, steps = 0;
551
572
 
552
- if(_.isUndefined(decimals)) {
573
+ if (_.isUndefined(decimals)) {
553
574
  decimals = 2;
554
- } else if (decimals === 0) {
555
- decimals = undefined;
575
+ }
576
+ if (_.isUndefined(min_resolution)) {
577
+ min_resolution = 0;
556
578
  }
557
579
 
558
580
  while (Math.abs(size) >= 1000) {
559
581
  steps++;
560
582
  size /= 1000;
583
+ min_resolution /= 1000;
561
584
  }
562
585
 
563
586
  switch (steps) {
@@ -590,6 +613,18 @@ function($, _, moment) {
590
613
  break;
591
614
  }
592
615
 
616
+ if (min_resolution) {
617
+ min_resolution *= Math.pow(10, decimals);
618
+ while (min_resolution % 1 !== 0) {
619
+ decimals++;
620
+ min_resolution *= 10;
621
+ }
622
+ }
623
+
624
+ if (decimals === 0) {
625
+ decimals = undefined;
626
+ }
627
+
593
628
  return (size.toFixed(decimals) + ext);
594
629
  };
595
630
 
@@ -1,11 +1,9 @@
1
1
  define([
2
- 'underscore-src'
2
+ 'lodash-src'
3
3
  ],
4
- function () {
4
+ function (_) {
5
5
  'use strict';
6
6
 
7
- var _ = window._;
8
-
9
7
  /*
10
8
  Mixins :)
11
9
  */
@@ -12,9 +12,11 @@ require.config({
12
12
  css: '../vendor/require/css',
13
13
  text: '../vendor/require/text',
14
14
  moment: '../vendor/moment',
15
+ blob: '../vendor/blob',
15
16
  filesaver: '../vendor/filesaver',
16
17
  chromath: '../vendor/chromath',
17
18
  angular: '../vendor/angular/angular',
19
+ 'angular-cookies': '../vendor/angular/angular-cookies',
18
20
  'angular-dragdrop': '../vendor/angular/angular-dragdrop',
19
21
  'angular-strap': '../vendor/angular/angular-strap',
20
22
  'angular-sanitize': '../vendor/angular/angular-sanitize',
@@ -22,8 +24,8 @@ require.config({
22
24
  datepicker: '../vendor/angular/datepicker',
23
25
  bindonce: '../vendor/angular/bindonce',
24
26
 
25
- underscore: 'components/underscore.extended',
26
- 'underscore-src': '../vendor/underscore',
27
+ lodash: 'components/lodash.extended',
28
+ 'lodash-src': '../vendor/lodash',
27
29
  bootstrap: '../vendor/bootstrap/bootstrap',
28
30
 
29
31
  jquery: '../vendor/jquery/jquery-1.8.0',
@@ -42,13 +44,10 @@ require.config({
42
44
 
43
45
 
44
46
  modernizr: '../vendor/modernizr-2.6.1',
47
+ numeral: '../vendor/numeral',
45
48
  elasticjs: '../vendor/elasticjs/elastic-angular-client',
46
49
  },
47
50
  shim: {
48
- underscore: {
49
- exports: '_'
50
- },
51
-
52
51
  angular: {
53
52
  deps: ['jquery','config'],
54
53
  exports: 'angular'
@@ -1,4 +1,4 @@
1
- define(['underscore'],
1
+ define(['lodash'],
2
2
  function (_) {
3
3
  "use strict";
4
4
 
@@ -20,7 +20,7 @@
20
20
  define([
21
21
  'angular',
22
22
  'config',
23
- 'underscore',
23
+ 'lodash',
24
24
  'services/all'
25
25
  ],
26
26
  function (angular, config, _) {
@@ -29,9 +29,7 @@ function (angular, config, _) {
29
29
  var module = angular.module('kibana.controllers');
30
30
 
31
31
  module.controller('DashCtrl', function(
32
- $scope, $route, ejsResource, fields, dashboard, alertSrv, panelMove, esVersion) {
33
-
34
- $scope.requiredElasticSearchVersion = ">=0.90.3";
32
+ $scope, $route, ejsResource, fields, dashboard, alertSrv, panelMove, esVersion, kbnVersion) {
35
33
 
36
34
  $scope.editor = {
37
35
  index: 0
@@ -47,7 +45,8 @@ function (angular, config, _) {
47
45
 
48
46
  $scope.init = function() {
49
47
  $scope.config = config;
50
- // Make stuff, including underscore.js available to views
48
+ $scope.kbnVersion = kbnVersion;
49
+ // Make stuff, including lodash available to views
51
50
  $scope._ = _;
52
51
  $scope.dashboard = dashboard;
53
52
  $scope.dashAlerts = alertSrv;
@@ -104,6 +103,12 @@ function (angular, config, _) {
104
103
  }
105
104
  };
106
105
 
106
+ $scope.pulldownTabStyle = function(i) {
107
+ var classes = ['bgPrimary','bgSuccess','bgWarning','bgDanger','bgInverse','bgInfo'];
108
+ i = i%classes.length;
109
+ return classes[i];
110
+ };
111
+
107
112
  $scope.setEditorTabs = function(panelMeta) {
108
113
  $scope.editorTabs = ['General','Panel'];
109
114
  if(!_.isUndefined(panelMeta.editorTabs)) {
@@ -1,6 +1,6 @@
1
1
  define([
2
2
  'angular',
3
- 'underscore'
3
+ 'lodash'
4
4
  ],
5
5
  function (angular, _) {
6
6
  'use strict';
@@ -1,7 +1,7 @@
1
1
  define([
2
2
  'angular',
3
3
  'app',
4
- 'underscore'
4
+ 'lodash'
5
5
  ],
6
6
  function (angular, app, _) {
7
7
  'use strict';
@@ -1,7 +1,7 @@
1
1
  define([
2
2
  'angular',
3
3
  'app',
4
- 'underscore'
4
+ 'lodash'
5
5
  ],
6
6
  function (angular, app, _) {
7
7
  'use strict';
@@ -52,7 +52,7 @@
52
52
  ],
53
53
  "type": "text",
54
54
  "mode": "markdown",
55
- "content": "### Welcome to Kibana. \nGlad you could make it. Happy to have you here! Lets get started, shall we?\n##### Requirements\n* **A good browser.** \n The latest version of Chrome or Firefox is recommended. Safari (latest version) and Internet Explorer 9 and above are also supported.\n* **A webserver.** \n Just somewhere to host the HTML and Javascript. Basically any webserver will work.\n* **Elasticsearch** \n 0.20.5 or above. Kibana will soon move to requiring Elasticsearch 0.90 or above, so upgrading is recommended.\n\n##### Configuration\nIf Kibana and Elasticsearch are on the same host, and you're using the default Elasticsearch port, then you're all set. Kibana is configured to use that setup by default! \n\nIf not, you need to edit *config.js* and set the *elasticsearch* parameter with the URL (including port, probably 9200) of your Elasticsearch server. The host part should be the entire, fully qualified domain name, or IP, **not localhost**.\n#### Are you a Logstash User?\n+ **YES** - Great! We have a prebuilt dashboard: [(Logstash Dashboard)](index.html#/dashboard/file/logstash.json). See the note to the right about making it your global default \n\n+ **NO** - Hey, no problem, you just have a bit of setup to do. You have a few choices: \n\n 1. [Sample Dashboard](index.html#/dashboard/file/guided.json) *I don't have much data yet, please extract some basics for me* \n 2. [Unconfigured Dashboard](index.html#/dashboard/file/noted.json) *I have a lot of data and I don't want Kibana to query it at once*\n 3. [Blank Dashboard](index.html#/dashboard/file/blank.json) *I'm comfortable figuring it out on my own*",
55
+ "content": "### Welcome to Kibana. \nGlad you could make it. Happy to have you here! Lets get started, shall we?\n##### Requirements\n* **A good browser.** \n The latest version of Chrome or Firefox is recommended. Safari (latest version) and Internet Explorer 9 and above are also supported.\n* **A webserver.** \n Just somewhere to host the HTML and Javascript. Basically any webserver will work.\n* **Elasticsearch** \n 0.90.9 or above. \n\n##### Configuration\nIf Kibana and Elasticsearch are on the same host, and you're using the default Elasticsearch port, then you're all set. Kibana is configured to use that setup by default! \n\nIf not, you need to edit *config.js* and set the *elasticsearch* parameter with the URL (including port, probably 9200) of your Elasticsearch server. The host part should be the entire, fully qualified domain name, or IP, **not localhost**.\n#### Are you a Logstash User?\n+ **YES** - Great! We have a prebuilt dashboard: [(Logstash Dashboard)](index.html#/dashboard/file/logstash.json). See the note to the right about making it your global default \n\n+ **NO** - Hey, no problem, you just have a bit of setup to do. You have a few choices: \n\n 1. [Sample Dashboard](index.html#/dashboard/file/guided.json) *I don't have much data yet, please extract some basics for me* \n 2. [Unconfigured Dashboard](index.html#/dashboard/file/noted.json) *I have a lot of data and I don't want Kibana to query it at once*\n 3. [Blank Dashboard](index.html#/dashboard/file/blank.json) *I'm comfortable figuring it out on my own*",
56
56
  "style": {},
57
57
  "status": "Stable"
58
58
  }
@@ -10,13 +10,13 @@
10
10
  * interval :: Sets the index interval (eg: day,week,month,year), Default: day
11
11
  *
12
12
  * split :: The character to split the queries on Default: ','
13
- * query :: By default, a comma seperated list of queries to run. Default: *
13
+ * query :: By default, a comma separated list of queries to run. Default: *
14
14
  *
15
15
  * from :: Search this amount of time back, eg 15m, 1h, 2d. Default: 15m
16
16
  * timefield :: The field containing the time to filter on, Default: @timestamp
17
17
  *
18
- * fields :: comma seperated list of fields to show in the table
19
- * sort :: comma seperated field to sort on, and direction, eg sort=@timestamp,desc
18
+ * fields :: comma separated list of fields to show in the table
19
+ * sort :: comma separated field to sort on, and direction, eg sort=@timestamp,desc
20
20
  *
21
21
  */
22
22
 
@@ -56,7 +56,7 @@ if(!_.isUndefined(ARGS.index)) {
56
56
  };
57
57
  }
58
58
 
59
- // In this dashboard we let users pass queries as comma seperated list to the query parameter.
59
+ // In this dashboard we let users pass queries as comma separated list to the query parameter.
60
60
  // Or they can specify a split character using the split aparameter
61
61
  // If query is defined, split it into a list of query objects
62
62
  // NOTE: ids must be integers, hence the parseInt()s
@@ -157,7 +157,7 @@
157
157
  "pattern": "[logstash-]YYYY.MM.DD",
158
158
  "default": "NO_TIME_FILTER_OR_INDEX_PATTERN_NOT_MATCHED"
159
159
  },
160
- "style": "dark",
160
+ "style": "{{ARGS.style || 'dark'}}",
161
161
  "panel_hints": true,
162
162
  "pulldowns": [
163
163
  {
@@ -1,7 +1,7 @@
1
1
  define([
2
2
  'angular',
3
3
  'app',
4
- 'underscore'
4
+ 'lodash'
5
5
  ],
6
6
  function (angular, app, _) {
7
7
  'use strict';
@@ -1,7 +1,7 @@
1
1
  define([
2
2
  'angular',
3
3
  'app',
4
- 'underscore'
4
+ 'lodash'
5
5
  ],
6
6
  function (angular, app, _) {
7
7
  'use strict';
@@ -1,8 +1,8 @@
1
1
  define([
2
2
  'angular',
3
- 'app',
3
+ 'lodash'
4
4
  ],
5
- function (angular) {
5
+ function (angular,_) {
6
6
  'use strict';
7
7
 
8
8
  angular
@@ -10,15 +10,33 @@ function (angular) {
10
10
  .directive('configModal', function($modal,$q) {
11
11
  return {
12
12
  restrict: 'A',
13
- link: function(scope, elem) {
13
+ link: function(scope, elem, attrs) {
14
+ var
15
+ model = attrs.kbnModel,
16
+ partial = attrs.configModal;
17
+
18
+
14
19
  // create a new modal. Can't reuse one modal unforunately as the directive will not
15
20
  // re-render on show.
16
21
  elem.bind('click',function(){
22
+
23
+ // Create a temp scope so we can discard changes to it if needed
24
+ var tmpScope = scope.$new();
25
+ tmpScope[model] = angular.copy(scope[model]);
26
+
27
+ tmpScope.editSave = function(panel) {
28
+ // Correctly set the top level properties of the panel object
29
+ _.each(panel,function(v,k) {
30
+ scope[model][k] = panel[k];
31
+ });
32
+ };
33
+
17
34
  var panelModal = $modal({
18
- template: './app/partials/paneleditor.html',
35
+ //template: './app/partials/paneleditor.html',
36
+ template: partial,
19
37
  persist: true,
20
38
  show: false,
21
- scope: scope,
39
+ scope: tmpScope,
22
40
  keyboard: false
23
41
  });
24
42
 
@@ -1,61 +1,70 @@
1
1
  define([
2
- 'angular'
2
+ 'angular',
3
+ 'jquery'
3
4
  ],
4
- function (angular) {
5
+ function (angular,$) {
5
6
  'use strict';
6
7
 
7
8
  angular
8
9
  .module('kibana.directives')
9
10
  .directive('kibanaPanel', function($compile) {
10
- var container = '<div class="panelCont"></div>';
11
-
12
- var editorTemplate =
13
-
14
- '<div class="row-fluid panel-extra"><div class="panel-extra-container">' +
15
-
16
- '<span class="extra row-button" ng-show="panel.editable != false">' +
17
- '<span confirm-click="row.panels = _.without(row.panels,panel)" '+
18
- 'confirmation="Are you sure you want to remove this {{panel.type}} panel?" class="pointer">'+
19
- '<i class="icon-remove pointer" bs-tooltip="\'Remove\'"></i></span>'+
20
- '</span>' +
21
-
22
- '<span class="extra row-button" ng-hide="panel.draggable == false">' +
23
- '<span class="pointer" bs-tooltip="\'Drag here to move\'"' +
24
- 'data-drag=true data-jqyoui-options="{revert: \'invalid\',helper:\'clone\'}"'+
25
- ' jqyoui-draggable="'+
26
- '{'+
27
- 'animate:false,'+
28
- 'mutate:false,'+
29
- 'index:{{$index}},'+
30
- 'onStart:\'panelMoveStart\','+
31
- 'onStop:\'panelMoveStop\''+
32
- '}" ng-model="row.panels"><i class="icon-move"></i></span>'+
33
- '</span>' +
34
- '<span class="extra row-button" ng-show="panel.draggable == false">' +
35
- '<span class="row-text">{{panel.type}}</span>'+
36
- '</span>' +
37
-
38
- '<span class="row-button extra" ng-show="panel.editable != false">' +
39
- '<span config-modal class="pointer">'+
40
- '<i class="icon-cog pointer" bs-tooltip="\'Configure\'"></i></span>'+
41
- '</span>' +
42
-
43
- '<span ng-repeat="task in panelMeta.modals" class="row-button extra" ng-show="task.show">' +
44
- '<span bs-modal="task.partial" class="pointer"><i ' +
45
- 'bs-tooltip="task.description" ng-class="task.icon" class="pointer"></i></span>'+
46
- '</span>' +
47
-
48
- '<span class="row-button extra" ng-show="panelMeta.loading == true">' +
49
- '<span>'+
50
- '<i class="icon-spinner icon-spin icon-large"></i>' +
51
- '</span>'+
52
- '</span>' +
11
+ var container = '<div class="panel-container" ng-style="{\'min-height\':row.height}"></div>';
12
+ var content = '<div class="panel-content"></div>';
13
+
14
+ var panelHeader =
15
+ '<div class="panel-header">'+
16
+ '<div class="row-fluid">' +
17
+ '<div class="span12 alert-error panel-error" ng-hide="!panel.error">' +
18
+ '<a class="close" ng-click="panel.error=false">&times;</a>' +
19
+ '<i class="icon-exclamation-sign"></i> <strong>Oops!</strong> {{panel.error}}' +
20
+ '</div>' +
21
+ '</div>\n' +
22
+
23
+ '<div class="row-fluid panel-extra">' +
24
+ '<div class="panel-extra-container">' +
25
+
26
+ '<span class="extra row-button" ng-show="panel.editable != false && panel.removable != false">' +
27
+ '<span confirm-click="row.panels = _.without(row.panels,panel)" '+
28
+ 'confirmation="Are you sure you want to remove this {{panel.type}} panel?" class="pointer">'+
29
+ '<i class="icon-remove pointer" bs-tooltip="\'Remove\'"></i></span>'+
30
+ '</span>' +
31
+
32
+ '<span class="extra row-button" ng-hide="panel.draggable == false">' +
33
+ '<span class="pointer" bs-tooltip="\'Drag here to move\'"' +
34
+ 'data-drag=true data-jqyoui-options="kbnJqUiDraggableOptions"'+
35
+ ' jqyoui-draggable="'+
36
+ '{'+
37
+ 'animate:false,'+
38
+ 'mutate:false,'+
39
+ 'index:{{$index}},'+
40
+ 'onStart:\'panelMoveStart\','+
41
+ 'onStop:\'panelMoveStop\''+
42
+ '}" ng-model="row.panels"><i class="icon-move"></i></span>'+
43
+ '</span>' +
44
+
45
+ '<span class="row-button extra" ng-show="panel.editable != false">' +
46
+ '<span config-modal="./app/partials/paneleditor.html" kbn-model="panel" class="pointer">'+
47
+ '<i class="icon-cog pointer" bs-tooltip="\'Configure\'"></i></span>'+
48
+ '</span>' +
53
49
 
54
- '<span class="row-button row-text panel-title" ng-show="panel.title">' +
55
- '{{panel.title}}' +
56
- '</span>'+
50
+ '<span ng-repeat="task in panelMeta.modals" class="row-button extra" ng-show="task.show">' +
51
+ '<span bs-modal="task.partial" class="pointer"><i ' +
52
+ 'bs-tooltip="task.description" ng-class="task.icon" class="pointer"></i></span>'+
53
+ '</span>' +
57
54
 
58
- '</div></div>';
55
+ '<span class="row-button extra" ng-show="panelMeta.loading == true">' +
56
+ '<span>'+
57
+ '<i class="icon-spinner icon-spin icon-large"></i>' +
58
+ '</span>'+
59
+ '</span>' +
60
+
61
+ '<span class="panel-text panel-title">' +
62
+ '{{panel.title?panel.title:panel.type}}' +
63
+ '</span>'+
64
+
65
+ '</div>'+
66
+ '</div>\n'+
67
+ '</div>';
59
68
  return {
60
69
  restrict: 'E',
61
70
  link: function($scope, elem, attr) {
@@ -63,6 +72,14 @@ function (angular) {
63
72
  // load the module.js if we have any
64
73
  var newScope = $scope.$new();
65
74
 
75
+ $scope.kbnJqUiDraggableOptions = {
76
+ revert: 'invalid',
77
+ helper: function() {
78
+ return $('<div style="width:200px;height:100px;background: rgba(100,100,100,0.50);"/>');
79
+ },
80
+ placeholder: 'keep'
81
+ };
82
+
66
83
  // compile the module and uncloack. We're done
67
84
  function loadModule($module) {
68
85
  $module.appendTo(elem);
@@ -93,7 +110,10 @@ function (angular) {
93
110
  $controllers = $controllers.add($module.find('ngcontroller, [ng-controller], .ng-controller'));
94
111
 
95
112
  if ($controllers.length) {
96
- $controllers.first().prepend(editorTemplate);
113
+ $controllers.first().prepend(panelHeader);
114
+
115
+ $controllers.first().find('.panel-header').nextAll().wrapAll(content);
116
+
97
117
  $scope.require([
98
118
  'panels/'+nameAsPath+'/module'
99
119
  ], function() {