Commit 5d9cb85c authored by Spencer Alger's avatar Spencer Alger
Browse files

Merged Pull Request #484

parent 0f551acc
File mode changed from 100644 to 100755
node_modules/*
dist/*
sample/*
src/vendor/*
src/app/panels/*/{lib,leaflet}/*
\ No newline at end of file
{
"jquery": true,
"browser": true,
"browser": true,
"bitwise":false,
"curly": true,
"eqnull": true,
"globalstrict": true,
"devel": true,
"eqeqeq": true,
"forin": false,
"immed": true,
"supernew": true,
"expr": true,
"indent": 2,
"latedef": true,
"newcap": true,
"noarg": true,
"noempty": true,
"undef": true,
"boss": true,
"trailing": false,
"laxbreak": true,
"laxcomma": true,
"sub": true,
"bitwise":false,
"curly": true,
"eqnull": true,
"globalstrict": true,
"devel": true,
"eqeqeq": true,
"forin": false,
"immed": true,
"supernew": true,
"expr": true,
"indent": 2,
"latedef": true,
"newcap": true,
"noarg": true,
"noempty": true,
"undef": true,
"boss": true,
"trailing": false,
"laxbreak": true,
"laxcomma": true,
"sub": true,
"unused": true,
"maxlen": 140,
"maxlen": 140,
"globals": {
"$LAB": false,
"_": false,
"$": false,
"kbn" : false,
"angular" : false,
"exports": true,
"module": false,
"config": false,
"moment": false
}
"globals": {
"define": true,
"require": true
}
}
\ No newline at end of file
From a428f9e5deb100e0d7a1c6b210cb41127dfd24c8 Mon Sep 17 00:00:00 2001
From: Rashid Khan <rashidkpc@gmail.com>
Date: Fri, 6 Sep 2013 14:38:01 -0700
Subject: [PATCH 1/5] Fix nginx.conf after switching dashboard load to GET
---
sample/nginx.conf | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/sample/nginx.conf b/sample/nginx.conf
index 50a365a..3af4ea2 100644
--- a/sample/nginx.conf
+++ b/sample/nginx.conf
@@ -38,13 +38,19 @@ server {
location ~ ^/kibana-int/dashboard/.*$ {
proxy_pass http://127.0.0.1:9200;
proxy_read_timeout 90;
- auth_basic "Restricted";
- auth_basic_user_file /etc/nginx/conf.d/kibana.myhost.org.htpasswd;
+ limit_except GET {
+ proxy_pass http://127.0.0.1:9200;
+ auth_basic "Restricted";
+ auth_basic_user_file /etc/nginx/conf.d/kibana.myhost.org.htpasswd;
+ }
}
location ~ ^/kibana-int/temp.*$ {
proxy_pass http://127.0.0.1:9200;
proxy_read_timeout 90;
- auth_basic "Restricted";
- auth_basic_user_file /etc/nginx/conf.d/kibana.myhost.org.htpasswd;
+ limit_except GET {
+ proxy_pass http://127.0.0.1:9200;
+ auth_basic "Restricted";
+ auth_basic_user_file /etc/nginx/conf.d/kibana.myhost.org.htpasswd;
+ }
}
-}
\ No newline at end of file
+}
--
1.8.4
From 6a9a2b95b13346c523351175bc5fac5d43b3a674 Mon Sep 17 00:00:00 2001
From: Stephen Wood <stephen@moz.com>
Date: Fri, 6 Sep 2013 16:23:33 -0700
Subject: [PATCH 2/5] Clarify error message.
Elasticsearch will throw a 404 if there is no indexes added yet, resulting in
this unclear message -- even for people that are not using any sort of proxy.
This message update should make it easier to quickly troubleshoot why the
the dialogue is popping up.
---
js/services.js | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/js/services.js b/js/services.js
index 1d309f5..d694062 100644
--- a/js/services.js
+++ b/js/services.js
@@ -89,9 +89,10 @@ angular.module('kibana.services', [])
if(status === 0) {
alertSrv.set('Error',"Could not contact Elasticsearch at "+config.elasticsearch+
". Please ensure that Elasticsearch is reachable from your system." ,'error');
- } else {
- alertSrv.set('Error',"Could not find "+config.elasticsearch+"/"+indices.join(',')+"/_mapping. If you"+
- " are using a proxy, ensure it is configured correctly",'error');
+ } else {
+ alertSrv.set('Error',"No index found at "+config.elasticsearch+"/" +
+ indices.join(',')+"/_mapping. Please create at least one index." +
+ "If you're using a proxy ensure it is configured correctly.",'error');
}
});
@@ -963,4 +964,4 @@ angular.module('kibana.services', [])
return false;
});
};
-});
\ No newline at end of file
+});
--
1.8.4
From e071366bbf9139fce45781a503f0f922d4db263d Mon Sep 17 00:00:00 2001
From: Rashid Khan <rashidkpc@gmail.com>
Date: Tue, 10 Sep 2013 14:34:45 -0700
Subject: [PATCH 3/5] fixed unlinted line
---
js/services.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/js/services.js b/js/services.js
index d694062..f2c6add 100644
--- a/js/services.js
+++ b/js/services.js
@@ -89,7 +89,7 @@ angular.module('kibana.services', [])
if(status === 0) {
alertSrv.set('Error',"Could not contact Elasticsearch at "+config.elasticsearch+
". Please ensure that Elasticsearch is reachable from your system." ,'error');
- } else {
+ } else {
alertSrv.set('Error',"No index found at "+config.elasticsearch+"/" +
indices.join(',')+"/_mapping. Please create at least one index." +
"If you're using a proxy ensure it is configured correctly.",'error');
--
1.8.4
From d72c72b3dfea036cc2238f63a38625f0ac1b40ac Mon Sep 17 00:00:00 2001
From: Spencer Alger <spencer@spenceralger.com>
Date: Tue, 10 Sep 2013 23:25:09 -0700
Subject: [PATCH 4/5] fixing indent issue
---
js/services.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/js/services.js b/js/services.js
index d694062..f2c6add 100644
--- a/js/services.js
+++ b/js/services.js
@@ -89,7 +89,7 @@ angular.module('kibana.services', [])
if(status === 0) {
alertSrv.set('Error',"Could not contact Elasticsearch at "+config.elasticsearch+
". Please ensure that Elasticsearch is reachable from your system." ,'error');
- } else {
+ } else {
alertSrv.set('Error',"No index found at "+config.elasticsearch+"/" +
indices.join(',')+"/_mapping. Please create at least one index." +
"If you're using a proxy ensure it is configured correctly.",'error');
--
1.8.4
From 7ab2a5349a52a15695d2f8fca541f880f474f4a0 Mon Sep 17 00:00:00 2001
From: Rashid Khan <rashidkpc@gmail.com>
Date: Wed, 11 Sep 2013 11:14:05 -0700
Subject: [PATCH 5/5] Closes #477, closes #464. Also fixes urlLink and noXml
filters on array fields
---
js/filters.js | 56 ++++++++++++++++++++++++++++++++----------------
panels/table/module.html | 2 +-
panels/table/module.js | 1 +
3 files changed, 40 insertions(+), 19 deletions(-)
diff --git a/js/filters.js b/js/filters.js
index fb60c24..7f25a12 100644
--- a/js/filters.js
+++ b/js/filters.js
@@ -32,18 +32,23 @@ angular.module('kibana.filters', [])
return arr.toString();
}
};
-
}).filter('noXml', function() {
- return function(text) {
- if(!_.isString(text)) {
- return text;
- }
- return text.
+ var noXml = function(text) {
+ return _.isString(text) ?
+ text.
replace(/&/g, '&amp;').
replace(/</g, '&lt;').
replace(/>/g, '&gt;').
replace(/'/g, '&#39;').
- replace(/"/g, '&quot;');
+ replace(/"/g, '&quot;') :
+ text;
+ };
+ return function(text) {
+ return _.isArray(text) ?
+ _.map(text,function(t) {
+ return noXml(t);
+ }) :
+ noXml(text);
};
}).filter('urlLink', function() {
var //URLs starting with http://, https://, or ftp://
@@ -53,20 +58,35 @@ angular.module('kibana.filters', [])
//Change email addresses to mailto:: links.
r3 = /(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6})/gim;
- return function(text, target, otherProp) {
+ var urlLink = function(text) {
+ var t1,t2,t3;
if(!_.isString(text)) {
return text;
+ } else {
+ var i=1;
+ _.each(text.match(r1), function(url) {
+ t1 = text.replace(r1, "<a href=\"$1\" target=\"_blank\">$1</a>");
+ });
+ text = t1 || text;
+ _.each(text.match(r2), function(url) {
+ t2 = text.replace(r2, "$1<a href=\"http://$2\" target=\"_blank\">$2</a>");
+ });
+ text = t2 || text;
+ _.each(text.match(r3), function(url) {
+ t3 = text.replace(r3, "<a href=\"mailto:$1\">$1</a>");
+ });
+ text = t3 || text;
+ return text;
}
- _.each(text.match(r1), function(url) {
- text = text.replace(r1, "<a href=\"$1\" target=\"_blank\">$1</a>");
- });
- _.each(text.match(r2), function(url) {
- text = text.replace(r2, "$1<a href=\"http://$2\" target=\"_blank\">$2</a>");
- });
- _.each(text.match(r3), function(url) {
- text = text.replace(r3, "<a href=\"mailto:$1\">$1</a>");
- });
- return text;
+ };
+
+ return function(text, target, otherProp) {
+
+ return _.isArray(text) ?
+ _.map(text,function(t) {
+ return urlLink(t);
+ }) :
+ urlLink(text);
};
}).filter('gistid', function() {
var gist_pattern = /(\d{5,})|([a-z0-9]{10,})|(gist.github.com(\/*.*)\/[a-z0-9]{5,}\/*$)/;
diff --git a/panels/table/module.html b/panels/table/module.html
index c872549..92f3bdc 100644
--- a/panels/table/module.html
+++ b/panels/table/module.html
@@ -75,7 +75,7 @@
<i class='icon-ban-circle pointer' ng-click="build_search(key,value,true)"></i>
</td>
<!-- At some point we need to create a more efficient way of applying the filter pipeline -->
- <td style="white-space:pre-wrap" ng-bind-html-unsafe="value|noXml|urlLink"></td>
+ <td style="white-space:pre-wrap" ng-bind-html-unsafe="value|noXml|urlLink|stringify"></td>
</tr>
</table>
</td>
diff --git a/panels/table/module.js b/panels/table/module.js
index 52c7367..0b2f62b 100644
--- a/panels/table/module.js
+++ b/panels/table/module.js
@@ -267,6 +267,7 @@ angular.module('kibana.table', [])
})
+// This also escapes some xml sequences
.filter('tableHighlight', function() {
return function(text) {
if (!_.isUndefined(text) && !_.isNull(text) && text.toString().length > 0) {
--
1.8.4
From ea62d4aea330fc6cd547b17438755e0f7b571b33 Mon Sep 17 00:00:00 2001
From: Rashid Khan <rashidkpc@gmail.com>
Date: Wed, 11 Sep 2013 15:42:03 -0700
Subject: [PATCH 1/5] Added pointer to chart hovers
---
panels/histogram/module.html | 10 +++++-----
panels/pie/module.html | 4 ++--
panels/terms/module.html | 12 ++++++------
3 files changed, 13 insertions(+), 13 deletions(-)
diff --git a/panels/histogram/module.html b/panels/histogram/module.html
index 5d76715..4ce6b6a 100644
--- a/panels/histogram/module.html
+++ b/panels/histogram/module.html
@@ -8,10 +8,10 @@
display:inline-block;
height:10px;
width:10px;
- border-radius:5px;
+ border-radius:5px;
}
.histogram-legend-item {
- display:inline-block;
+ display:inline-block;
}
.histogram-chart {
position:relative;
@@ -23,7 +23,7 @@
<div>
<span ng-show='panel.zoomlinks && data'>
<!--<a class='small' ng-click='zoom(0.5)'><i class='icon-zoom-in'></i> Zoom In</a>-->
- <a class='small' ng-click='zoom(2)'><i class='icon-zoom-out'></i> Zoom Out</a> |
+ <a class='small' ng-click='zoom(2)'><i class='icon-zoom-out'></i> Zoom Out</a> |
</span>
<span ng-show="panel.legend" ng-repeat='series in data' class="histogram-legend">
<i class='icon-circle' ng-style="{color: series.info.color}"></i>
@@ -32,5 +32,5 @@
<span ng-show="panel.legend" class="small"><span ng-show="panel.value_field && panel.mode != 'count'">{{panel.value_field}}</span> {{panel.mode}} per <strong>{{panel.interval}}</strong> | (<strong>{{hits}}</strong> hits)</span>
</div>
<center><img ng-show='panel.loading && _.isUndefined(data)' src="common/img/load_big.gif"></center>
- <div histogram-chart class="histogram-chart" params="{{panel}}"></div>
-</kibana-panel>
\ No newline at end of file
+ <div histogram-chart class="pointer histogram-chart" params="{{panel}}"></div>
+</kibana-panel>
\ No newline at end of file
diff --git a/panels/pie/module.html b/panels/pie/module.html
index a36cf2c..f089586 100644
--- a/panels/pie/module.html
+++ b/panels/pie/module.html
@@ -8,9 +8,9 @@
</div><br>
<div style="clear:both"></div>
- <div pie params="{{panel}}" style="position:relative"></div>
+ <div pie class="pointer" params="{{panel}}" style="position:relative"></div>
<div ng-show="panel.legend == 'below'" ng-repeat="query in legend" style="float:left;padding-left: 10px;">
<span ng-show='panel.chart != "none"'><i class="icon-circle" ng-style="{color:query.color}"></i></span><span class="small"> {{query.label}} ({{query.data[0][1]}}) </span></span>
</div>
-</kibana-panel>
\ No newline at end of file
+</kibana-panel>
\ No newline at end of file
diff --git a/panels/terms/module.html b/panels/terms/module.html
index 814729c..70b870b 100644
--- a/panels/terms/module.html
+++ b/panels/terms/module.html
@@ -5,7 +5,7 @@
<!-- START Pie or bar chart -->
<div ng-show="panel.counter_pos == 'above' && (panel.chart == 'bar' || panel.chart == 'pie')" id='{{$id}}-legend'>
<!-- vertical legend above -->
- <table class="small" ng-show="panel.arrangement == 'vertical'">
+ <table class="small" ng-show="panel.arrangement == 'vertical'">
<tr ng-repeat="term in legend">
<td><i class="icon-circle" ng-style="{color:term.color}"></i></td> <td style="padding-right:10px;padding-left:10px;">{{term.label}}</td><td>{{term.data[0][1]}}</td>
</tr>
@@ -21,11 +21,11 @@
<!-- keep legend from over lapping -->
<div style="clear:both"></div>
- <div ng-show="panel.chart == 'pie' || panel.chart == 'bar'" terms-chart params="{{panel}}" style="position:relative"></div>
+ <div ng-show="panel.chart == 'pie' || panel.chart == 'bar'" terms-chart params="{{panel}}" style="position:relative" class="pointer"></div>
<div ng-show="panel.counter_pos == 'below' && (panel.chart == 'bar' || panel.chart == 'pie')" id='{{$id}}-legend'>
<!-- vertical legend below -->
- <table class="small" ng-show="panel.arrangement == 'vertical'">
+ <table class="small" ng-show="panel.arrangement == 'vertical'">
<tr ng-repeat="term in legend">
<td><i class="icon-circle" ng-style="{color:term.color}"></i></i></td> <td style="padding-right:10px;padding-left:10px;">{{term.label}}</td><td>{{term.data[0][1]}}</td>
</tr>
@@ -39,7 +39,7 @@
</div>
<!-- END Pie or Bar chart -->
- <table ng-style="panel.style" class="table table-striped table-condensed" ng-show="panel.chart == 'table'">
+ <table ng-style="panel.style" class="table table-striped table-condensed" ng-show="panel.chart == 'table'">
<thead>
<th>Term</th> <th>Count</th> <th>Action</th>
</thead>
@@ -48,11 +48,11 @@
<td>{{term.data[0][1]}}</td>
<td>
<span ng-hide="term.meta == 'other'">
- <i class='icon-search pointer' ng-click="build_search(term)"></i>
+ <i class='icon-search pointer' ng-click="build_search(term)"></i>
<i class='icon-ban-circle pointer' ng-click="build_search(term,true)"></i>
</span>
</td>
</tr>
</table>
-</kibana-panel>
\ No newline at end of file
+</kibana-panel>
\ No newline at end of file
--
1.8.4
From b63af822c75342a39362e4aef3693ed50cdebe44 Mon Sep 17 00:00:00 2001
From: Rashid Khan <rashidkpc@gmail.com>
Date: Wed, 11 Sep 2013 15:58:53 -0700
Subject: [PATCH 2/5] Cleaned up timepicker layout
---
panels/timepicker/module.html | 43 ++++++++++++++++++++++++-------------------
1 file changed, 24 insertions(+), 19 deletions(-)
diff --git a/panels/timepicker/module.html b/panels/timepicker/module.html
index 2c89289..c327b42 100644
--- a/panels/timepicker/module.html
+++ b/panels/timepicker/module.html
@@ -1,36 +1,41 @@
<kibana-panel ng-controller='timepicker' ng-init="init()">
- <div class="row-fluid" ng-switch="panel.mode" ng-show="filterSrv.idsByType('time').length > 0">
- <div ng-switch-when="absolute">
- <div class="span5">
+ <style>
+ .timepicker-block {
+ display: inline-block;
+ }
+ </style>
+
+ <div class="row-fluid form-horizontal" ng-switch="panel.mode" ng-show="filterSrv.idsByType('time').length > 0">
+ <div ng-switch-when="absolute" >
+ <div class="timepicker-block">
<form class="nomargin">
<label><small>From</small></label>
- <input type="text" class="input-smaller" ng-change="time_check()" ng-model="timepicker.from.date" data-date-format="mm/dd/yyyy" bs-datepicker>
+ <input type="text" class="input-smaller" ng-change="time_check()" ng-model="timepicker.from.date" data-date-format="mm/dd/yyyy" bs-datepicker>
<input type="text" class="input-mini" ng-change="time_check()" data-show-meridian="false" data-show-seconds="true" ng-model="timepicker.from.time" bs-timepicker>
</form>
</div>
- <div class="span5" style="margin-left:10px">
+ <div class="timepicker-block" style="margin-left:10px">
<form class="nomargin">
<label style="margin-left:5px"><small>To (<a ng-click="to_now()">now</a>)</small></label>
- <input type="text" class="input-smaller" ng-change="time_check()" ng-model="timepicker.to.date" data-date-format="mm/dd/yyyy" bs-datepicker>
+ <input type="text" class="input-smaller" ng-change="time_check()" ng-model="timepicker.to.date" data-date-format="mm/dd/yyyy" bs-datepicker>
<input type="text" class="input-mini" ng-change="time_check()" data-show-meridian="false" data-show-seconds="true" ng-model="timepicker.to.time" bs-timepicker>
</form>
</div>
- <div class="span1">
+ <div class="timepicker-block">
<form class="nomargin">
- <label><small><br></small></label>
- <button class="btn" ng-click="time_apply()" ><i class="icon-ok"></i></button>
+ <button class="btn" ng-click="time_apply()"><i class="icon-ok"></i></button>
</form>
</div>
</div>
<div ng-switch-when="since">
- <div class="span5">
+ <div class="timepicker-block">
<form class="nomargin">
<label><small>Since</small></label>
- <input type="text" class="input-smaller" ng-change="time_check()" ng-model="timepicker.from.date" data-date-format="mm/dd/yyyy" bs-datepicker>
+ <input type="text" class="input-smaller" ng-change="time_check()" ng-model="timepicker.from.date" data-date-format="mm/dd/yyyy" bs-datepicker>
<input type="text" class="input-mini" ng-change="time_check()" data-show-meridian="false" data-show-seconds="true" ng-model="timepicker.from.time" bs-timepicker>
</form>
</div>
- <div class="span1" style="margin-left:10px">
+ <div class="timepicker-block" style="margin-left:10px">
<form class="nomargin">
<label><small><br></small></label>
<button class="btn" ng-click="time_apply()" ><i class="icon-ok"></i></button>
@@ -38,7 +43,7 @@
</div>
</div>
<div ng-switch-when="relative">
- <div class="span11">
+ <div class="timepicker-block">
<form class="nomargin input-append">
<label><small>The last</small></label>
<button class="btn btn" ng-repeat='timespan in panel.time_options' ng-class="{'btn-success': (panel.timespan == timespan)}" ng-click="set_timespan(timespan)">{{timespan}}</button>
@@ -56,18 +61,18 @@
</div>
<div class="row-fluid nomargin">
<div class="span12 small" ng-show="filterSrv.idsByType('time').length > 0">
- <a ng-click="set_mode('relative')" ng-class="{'strong': (panel.mode == 'relative')}">Relative</a> |
- <a ng-click="set_mode('absolute')" ng-class="{'strong': (panel.mode == 'absolute')}">Absolute</a> |
- <a ng-click="set_mode('since')" ng-class="{'strong': (panel.mode == 'since')}">Since</a>
- <span ng-hide="panel.mode == 'absolute' || panel.mode == 'none'"> |
- <input type="checkbox" ng-model="panel.refresh.enable" ng-change='refresh();'> Auto-refresh
+ <a class="link" ng-click="set_mode('relative')" ng-class="{'strong': (panel.mode == 'relative')}">Relative</a> |
+ <a class="link" ng-click="set_mode('absolute')" ng-class="{'strong': (panel.mode == 'absolute')}">Absolute</a> |
+ <a class="link" ng-click="set_mode('since')" ng-class="{'strong': (panel.mode == 'since')}">Since</a>
+ <span ng-hide="panel.mode == 'absolute' || panel.mode == 'none'"> |
+ <input type="checkbox" ng-model="panel.refresh.enable" ng-change='refresh();'> Auto-refresh
<span ng-class="{'ng-cloak': !panel.refresh.enable}">
every <a data-title="<small>Auto-refresh Settings</small>" data-placement="bottom" bs-popover="'panels/timepicker/refreshctrl.html'">{{panel.refresh.interval}}s</a>.
</span>
</span>
</div>
<div class="span12 small" ng-show="filterSrv.idsByType('time').length < 1">
- <a class='btn btn-small' ng-click="time_apply()">Create a time filter</a>
+ <a class='btn btn-small' ng-click="time_apply()">Create a time filter</a>
</div>
</div>
</kibana-panel>
\ No newline at end of file
--
1.8.4
From 14d525da34e80ed9523fdca87fa12bc63b98733b Mon Sep 17 00:00:00 2001
From: Rashid Khan <rashidkpc@gmail.com>
Date: Wed, 11 Sep 2013 16:39:17 -0700
Subject: [PATCH 3/5] added JSONifying of objects
---
js/filters.js | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/js/filters.js b/js/filters.js
index 7f25a12..c21fa0b 100644
--- a/js/filters.js
+++ b/js/filters.js
@@ -29,7 +29,11 @@ angular.module('kibana.filters', [])
}).filter('stringify', function() {
return function(arr, start, end) {
if(!_.isUndefined(arr)) {
- return arr.toString();
+ if(_.isObject(arr) && !_.isArray(arr)) {
+ return angular.toJson(arr);
+ } else {
+ return arr.toString();
+ }
}
};
}).filter('noXml', function() {
--
1.8.4
From 8b5ac5e56eaf23111116fb4544bf4ad8a679cfdc Mon Sep 17 00:00:00 2001
From: Rashid Khan <rashidkpc@gmail.com>
Date: Wed, 11 Sep 2013 16:41:53 -0700
Subject: [PATCH 4/5] Show _source by default, sort by _score by default
---
panels/table/module.html | 14 +++++++++-----
panels/table/module.js | 4 ++--
2 files changed, 11 insertions(+), 7 deletions(-)
diff --git a/panels/table/module.html b/panels/table/module.html
index 92f3bdc..b59af11 100644
--- a/panels/table/module.html
+++ b/panels/table/module.html
@@ -39,10 +39,12 @@
<i ng-click="panel.offset = (panel.offset + panel.size)" ng-show="data.length > panel.offset+panel.size" class='icon-arrow-right pointer'></i>
</div>
</div>
- <div class="small" ng-show="panel.fields.length == 0"><center>No columns configured. You may want to select some from the list on the left.</center></div>
+
<table class="table-hover table table-condensed" ng-style="panel.style">
<thead ng-show="panel.header">
+ <th ng-show="panel.fields.length<1">_source (select columns from the list to the left)</th>
+
<th style="white-space:nowrap" ng-repeat="field in panel.fields">
<i ng-show="!$first" class="pointer link icon-caret-left" ng-click="_.move(panel.fields,$index,$index-1)"></i>
@@ -58,7 +60,8 @@
<tbody ng-repeat="event in data | slice:panel.offset:panel.offset+panel.size" ng-class-odd="'odd'">
<tr ng-click="toggle_details(event)" class="pointer">
<!--<td ng-repeat="field in panel.fields" ng-bind-html-unsafe="(event.highlight[field]||event._source[field]) | tableFieldFormat:field:event:this |tableHighlight | tableTruncate:panel.trimFactor:panel.fields.length"></td>-->
- <td ng-repeat="field in panel.fields" ng-bind-html-unsafe="(event.highlight[field]||event._source[field]) |tableHighlight | tableTruncate:panel.trimFactor:panel.fields.length"></td>
+ <td ng-show="panel.fields.length<1">{{event._source|stringify|tableTruncate:panel.trimFactor:1}}</td>
+ <td ng-show="panel.fields.length>0" ng-repeat="field in panel.fields" ng-bind-html-unsafe="(event.highlight[field]||event._source[field]) |tableHighlight | tableTruncate:panel.trimFactor:panel.fields.length"></td>
</tr>
<tr ng-show="event.kibana.details">
<td colspan=1000>
@@ -70,9 +73,10 @@
</thead>
<tr ng-repeat="(key,value) in event.kibana.details._source" ng-class-odd="'odd'">
<td>{{key}}</td>
- <td>
- <i class='icon-search pointer' ng-click="build_search(key,value)"></i>
- <i class='icon-ban-circle pointer' ng-click="build_search(key,value,true)"></i>
+ <td style="white-space:nowrap">
+ <i class='icon-search pointer' ng-click="build_search(key,value)" bs-tooltip="'Add filter to match this value'"></i>
+ <i class='icon-ban-circle pointer' ng-click="build_search(key,value,true)" bs-tooltip="'Add filter to NOT match this value'"></i>
+ <i class="pointer icon-th" ng-click="toggle_field(key)" bs-tooltip="'Toggle table column'"></i>
</td>
<!-- At some point we need to create a more efficient way of applying the filter pipeline -->