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.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/kibana-sinatra.gemspec +1 -0
- data/lib/kibana/assets/app/app.js +8 -3
- data/lib/kibana/assets/app/components/kbn.js +45 -10
- data/lib/kibana/assets/app/components/{underscore.extended.js → lodash.extended.js} +2 -4
- data/lib/kibana/assets/app/components/require.config.js +5 -6
- data/lib/kibana/assets/app/components/settings.js +1 -1
- data/lib/kibana/assets/app/controllers/dash.js +10 -5
- data/lib/kibana/assets/app/controllers/dashLoader.js +1 -1
- data/lib/kibana/assets/app/controllers/pulldown.js +1 -1
- data/lib/kibana/assets/app/controllers/row.js +1 -1
- data/lib/kibana/assets/app/dashboards/default.json +1 -1
- data/lib/kibana/assets/app/dashboards/logstash.js +4 -4
- data/lib/kibana/assets/app/dashboards/logstash.json +1 -1
- data/lib/kibana/assets/app/directives/addPanel.js +1 -1
- data/lib/kibana/assets/app/directives/arrayJoin.js +1 -1
- data/lib/kibana/assets/app/directives/configModal.js +23 -5
- data/lib/kibana/assets/app/directives/kibanaPanel.js +70 -50
- data/lib/kibana/assets/app/directives/kibanaSimplePanel.js +1 -1
- data/lib/kibana/assets/app/factories/store.js +59 -0
- data/lib/kibana/assets/app/filters/all.js +6 -13
- data/lib/kibana/assets/app/panels/bettermap/module.html +5 -0
- data/lib/kibana/assets/app/panels/bettermap/module.js +1 -1
- data/lib/kibana/assets/app/panels/column/editor.html +1 -1
- data/lib/kibana/assets/app/panels/column/module.js +7 -6
- data/lib/kibana/assets/app/panels/dashcontrol/module.js +1 -1
- data/lib/kibana/assets/app/panels/derivequeries/module.js +1 -1
- data/lib/kibana/assets/app/panels/fields/module.js +1 -1
- data/lib/kibana/assets/app/panels/filtering/module.html +10 -17
- data/lib/kibana/assets/app/panels/filtering/module.js +19 -1
- data/lib/kibana/assets/app/panels/histogram/module.html +4 -4
- data/lib/kibana/assets/app/panels/histogram/module.js +62 -12
- data/lib/kibana/assets/app/panels/histogram/timeSeries.js +6 -3
- data/lib/kibana/assets/app/panels/hits/module.js +1 -1
- data/lib/kibana/assets/app/panels/map/module.js +1 -1
- data/lib/kibana/assets/app/panels/pie/editor.html +1 -1
- data/lib/kibana/assets/app/panels/pie/module.js +1 -1
- data/lib/kibana/assets/app/panels/query/meta.html +1 -1
- data/lib/kibana/assets/app/panels/query/module.html +1 -1
- data/lib/kibana/assets/app/panels/query/module.js +2 -7
- data/lib/kibana/assets/app/panels/query/query.css +9 -7
- data/lib/kibana/assets/app/panels/sparklines/module.js +2 -2
- data/lib/kibana/assets/app/panels/sparklines/timeSeries.js +3 -3
- data/lib/kibana/assets/app/panels/stats/editor.html +36 -0
- data/lib/kibana/assets/app/panels/stats/module.html +15 -0
- data/lib/kibana/assets/app/panels/stats/module.js +199 -0
- data/lib/kibana/assets/app/panels/table/editor.html +23 -27
- data/lib/kibana/assets/app/panels/table/micropanel.html +3 -1
- data/lib/kibana/assets/app/panels/table/module.js +7 -1
- data/lib/kibana/assets/app/panels/terms/editor.html +16 -3
- data/lib/kibana/assets/app/panels/terms/module.html +14 -5
- data/lib/kibana/assets/app/panels/terms/module.js +66 -18
- data/lib/kibana/assets/app/panels/text/module.js +1 -1
- data/lib/kibana/assets/app/panels/timepicker/editor.html +14 -12
- data/lib/kibana/assets/app/panels/timepicker/module.html +3 -8
- data/lib/kibana/assets/app/panels/timepicker/module.js +1 -1
- data/lib/kibana/assets/app/panels/trends/module.js +1 -1
- data/lib/kibana/assets/app/partials/dashLoader.html +10 -10
- data/lib/kibana/assets/app/partials/dashboard.html +35 -44
- data/lib/kibana/assets/app/partials/dasheditor.html +7 -5
- data/lib/kibana/assets/app/partials/paneleditor.html +2 -1
- data/lib/kibana/assets/app/partials/panelgeneral.html +1 -1
- data/lib/kibana/assets/app/partials/roweditor.html +11 -9
- data/lib/kibana/assets/app/services/alertSrv.js +1 -1
- data/lib/kibana/assets/app/services/dashboard.js +27 -14
- data/lib/kibana/assets/app/services/esVersion.js +70 -31
- data/lib/kibana/assets/app/services/fields.js +14 -37
- data/lib/kibana/assets/app/services/filterSrv.js +7 -11
- data/lib/kibana/assets/app/services/kbnIndex.js +24 -15
- data/lib/kibana/assets/app/services/panelMove.js +1 -1
- data/lib/kibana/assets/app/services/querySrv.js +20 -6
- data/lib/kibana/assets/app/services/timer.js +1 -1
- data/lib/kibana/assets/css/bootstrap.dark.min.css +1 -1
- data/lib/kibana/assets/css/bootstrap.light.min.css +1 -1
- data/lib/kibana/assets/img/cubes.png +0 -0
- data/lib/kibana/assets/img/light.png +0 -0
- data/lib/kibana/assets/index.html +3 -2
- data/lib/kibana/assets/vendor/LICENSE.json +90 -0
- data/lib/kibana/assets/vendor/angular/angular-cookies.js +185 -0
- data/lib/kibana/assets/vendor/angular/angular-dragdrop.js +33 -4
- data/lib/kibana/assets/vendor/blob.js +178 -0
- data/lib/kibana/assets/vendor/bootstrap/bootstrap.js +6 -1
- data/lib/kibana/assets/vendor/bootstrap/less/bak/bootswatch.dark.less +555 -0
- data/lib/kibana/assets/vendor/bootstrap/less/bak/variables.dark.less +304 -0
- data/lib/kibana/assets/vendor/bootstrap/less/bootswatch.dark.less +349 -327
- data/lib/kibana/assets/vendor/bootstrap/less/bootswatch.light.less +590 -7
- data/lib/kibana/assets/vendor/bootstrap/less/modals.less +1 -1
- data/lib/kibana/assets/vendor/bootstrap/less/overrides.less +191 -75
- data/lib/kibana/assets/vendor/bootstrap/less/variables.dark.less +96 -97
- data/lib/kibana/assets/vendor/bootstrap/less/variables.light.less +84 -81
- data/lib/kibana/assets/vendor/jquery/jquery.flot.events.js +39 -51
- data/lib/kibana/assets/vendor/lodash.js +6785 -0
- data/lib/kibana/assets/vendor/numeral.js +565 -0
- data/lib/kibana/sinatra/version.rb +1 -1
- data/lib/kibana/views/config.erb +1 -0
- data/test/sinatra_test.rb +2 -2
- metadata +30 -4
- data/lib/kibana/assets/vendor/underscore.js +0 -1246
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3b0ab86a8330f137d771fbb28969b03b700f88fa
|
4
|
+
data.tar.gz: ebc86b24d4d6bf697114cb8776d37a6ae5a8f3a6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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 [
|
9
|
+
It is currently based on Kibana 3 commit [84ed4069f7797a9e364e050063e6897927d2a0d7](https://github.com/elasticsearch/kibana/commits/84ed4069f7797a9e364e050063e6897927d2a0d7)
|
10
10
|
|
11
11
|
## Installation
|
12
12
|
|
data/kibana-sinatra.gemspec
CHANGED
@@ -4,13 +4,14 @@
|
|
4
4
|
define([
|
5
5
|
'angular',
|
6
6
|
'jquery',
|
7
|
-
'
|
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
|
-
$('
|
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([
|
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,
|
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
|
-
}
|
555
|
-
|
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
|
|
@@ -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
|
-
|
26
|
-
'
|
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'
|
@@ -20,7 +20,7 @@
|
|
20
20
|
define([
|
21
21
|
'angular',
|
22
22
|
'config',
|
23
|
-
'
|
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
|
-
|
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)) {
|
@@ -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.
|
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
|
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
|
19
|
-
* sort :: comma
|
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
|
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
|
@@ -1,8 +1,8 @@
|
|
1
1
|
define([
|
2
2
|
'angular',
|
3
|
-
'
|
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:
|
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="
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
'<
|
17
|
-
'<
|
18
|
-
'
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
'
|
26
|
-
|
27
|
-
'
|
28
|
-
'
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
'
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
'<span
|
45
|
-
'
|
46
|
-
|
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">×</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
|
-
|
55
|
-
|
56
|
-
|
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
|
-
|
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(
|
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() {
|