Commit 14090650 by Torkel Ödegaard

Merge branch 'master' into mavimo-feature/influxdb-filters

parents 5bed5b98 623019ee
...@@ -3,10 +3,12 @@ vNext ...@@ -3,10 +3,12 @@ vNext
- Allow special characters in serie names (influxdb datasource), PR #390 - thx @majst01 - Allow special characters in serie names (influxdb datasource), PR #390 - thx @majst01
- Refactoring of filterSrv (Issue #428), thx @Tetha - Refactoring of filterSrv (Issue #428), thx @Tetha
- New config for playlist feature. Set playlist_timespan to set default playlist interval (Issue #445) - thx @rmca - New config for playlist feature. Set playlist_timespan to set default playlist interval (Issue #445) - thx @rmca
- New graphite function definition added isNonNull (PR #461), - thx @tmonk42
- New InfluxDB function difference add to function dropdown (PR #455) - New InfluxDB function difference add to function dropdown (PR #455)
- Added parameter to keepLastValue graphite function definition (default 100), Closes #459 - Added parameter to keepLastValue graphite function definition (default 100), Closes #459
- improved asset (css/js) build pipeline, added revision to css and js. Will remove issues related - improved asset (css/js) build pipeline, added revision to css and js. Will remove issues related
to the browser cache when upgrading grafana and improve load performance (Fixes #418) to the browser cache when upgrading grafana and improve load performance (Fixes #418)
- Partial support for url encoded metrics when using Graphite datasource (PR #327) - thx @axe-felix
# Fixes # Fixes
- Filter option loading when having muliple nested filters now works better. - Filter option loading when having muliple nested filters now works better.
...@@ -14,6 +16,8 @@ vNext ...@@ -14,6 +16,8 @@ vNext
After an option is changed and a nested template param is also reloaded, if the current value After an option is changed and a nested template param is also reloaded, if the current value
exists after the options are reloaded the current selected value is kept (Closes #447, Closes #412) exists after the options are reloaded the current selected value is kept (Closes #447, Closes #412)
- Legend Current value did not display when value was zero, Fixes #460 - Legend Current value did not display when value was zero, Fixes #460
- Fix to series toggling bug that caused annotations to be hidden when toggling (hiding) series. Fixes #328
- Fix for graphite function selection menu that some times draws outside screen. It now displays upward (Fixes #293)
# 1.5.4 (2014-05-13) # 1.5.4 (2014-05-13)
### New features and improvements ### New features and improvements
......
...@@ -18,7 +18,7 @@ function (angular, app, _, $, gfunc) { ...@@ -18,7 +18,7 @@ function (angular, app, _, $, gfunc) {
var buttonTemplate = '<a class="grafana-target-segment grafana-target-function dropdown-toggle"' + var buttonTemplate = '<a class="grafana-target-segment grafana-target-function dropdown-toggle"' +
' tabindex="1" gf-dropdown="functionMenu" data-toggle="dropdown"' + ' tabindex="1" gf-dropdown="functionMenu" data-toggle="dropdown"' +
' data-placement="bottom"><i class="icon-plus"></i></a>'; ' data-placement="top"><i class="icon-plus"></i></a>';
return { return {
link: function($scope, elem) { link: function($scope, elem) {
......
...@@ -87,13 +87,12 @@ function (angular, $) { ...@@ -87,13 +87,12 @@ function (angular, $) {
.module('kibana.directives') .module('kibana.directives')
.directive('gfDropdown', function ($parse, $compile, $timeout) { .directive('gfDropdown', function ($parse, $compile, $timeout) {
function buildTemplate(items, ul) { function buildTemplate(items, placement) {
if (!ul) { var upclass = placement === 'top' ? 'dropup' : '';
ul = [ var ul = [
'<ul class="dropdown-menu" role="menu" aria-labelledby="drop1">', '<ul class="dropdown-menu ' + upclass + '" role="menu" aria-labelledby="drop1">',
'</ul>' '</ul>'
]; ];
}
angular.forEach(items, function (item, index) { angular.forEach(items, function (item, index) {
if (item.divider) { if (item.divider) {
...@@ -122,10 +121,12 @@ function (angular, $) { ...@@ -122,10 +121,12 @@ function (angular, $) {
link: function postLink(scope, iElement, iAttrs) { link: function postLink(scope, iElement, iAttrs) {
var getter = $parse(iAttrs.gfDropdown), items = getter(scope); var getter = $parse(iAttrs.gfDropdown), items = getter(scope);
$timeout(function () { $timeout(function () {
var dropdown = angular.element(buildTemplate(items).join('')); var placement = iElement.data('placement');
var dropdown = angular.element(buildTemplate(items, placement).join(''));
dropdown.insertAfter(iElement); dropdown.insertAfter(iElement);
$compile(iElement.next('ul.dropdown-menu'))(scope); $compile(iElement.next('ul.dropdown-menu'))(scope);
}); });
iElement.addClass('dropdown-toggle').attr('data-toggle', 'dropdown'); iElement.addClass('dropdown-toggle').attr('data-toggle', 'dropdown');
} }
}; };
......
...@@ -15,7 +15,7 @@ function (angular, $, kbn, moment, _) { ...@@ -15,7 +15,7 @@ function (angular, $, kbn, moment, _) {
restrict: 'A', restrict: 'A',
template: '<div> </div>', template: '<div> </div>',
link: function(scope, elem) { link: function(scope, elem) {
var data, plot; var data, plot, annotations;
var hiddenData = {}; var hiddenData = {};
scope.$on('refresh',function() { scope.$on('refresh',function() {
...@@ -35,8 +35,9 @@ function (angular, $, kbn, moment, _) { ...@@ -35,8 +35,9 @@ function (angular, $, kbn, moment, _) {
}); });
// Receive render events // Receive render events
scope.$on('render',function(event, d) { scope.$on('render',function(event, renderData) {
data = d || data; data = renderData || data;
annotations = data.annotations;
render_panel(); render_panel();
}); });
...@@ -206,13 +207,13 @@ function (angular, $, kbn, moment, _) { ...@@ -206,13 +207,13 @@ function (angular, $, kbn, moment, _) {
} }
function addAnnotations(options) { function addAnnotations(options) {
if(!data.annotations || data.annotations.length === 0) { if(!annotations || annotations.length === 0) {
return; return;
} }
var types = {}; var types = {};
_.each(data.annotations, function(event) { _.each(annotations, function(event) {
if (!types[event.annotation.name]) { if (!types[event.annotation.name]) {
types[event.annotation.name] = { types[event.annotation.name] = {
level: _.keys(types).length + 1, level: _.keys(types).length + 1,
...@@ -235,7 +236,7 @@ function (angular, $, kbn, moment, _) { ...@@ -235,7 +236,7 @@ function (angular, $, kbn, moment, _) {
options.events = { options.events = {
levels: _.keys(types).length + 1, levels: _.keys(types).length + 1,
data: data.annotations, data: annotations,
types: types types: types
}; };
} }
...@@ -313,7 +314,7 @@ function (angular, $, kbn, moment, _) { ...@@ -313,7 +314,7 @@ function (angular, $, kbn, moment, _) {
if (seriesInfo.alias) { if (seriesInfo.alias) {
group = '<small style="font-size:0.9em;">' + group = '<small style="font-size:0.9em;">' +
'<i class="icon-circle" style="color:'+item.series.color+';"></i>' + ' ' + '<i class="icon-circle" style="color:'+item.series.color+';"></i>' + ' ' +
(seriesInfo.alias || seriesInfo.query)+ (decodeURIComponent(seriesInfo.alias)) +
'</small><br>'; '</small><br>';
} else { } else {
group = kbn.query_color_dot(item.series.color, 15) + ' '; group = kbn.query_color_dot(item.series.color, 15) + ' ';
......
...@@ -114,4 +114,10 @@ define(['angular', 'jquery', 'underscore', 'moment'], function (angular, $, _, m ...@@ -114,4 +114,10 @@ define(['angular', 'jquery', 'underscore', 'moment'], function (angular, $, _, m
}; };
}); });
module.filter('urlDecode', function() {
return function(input) {
return decodeURIComponent(input);
};
});
}); });
\ No newline at end of file
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
</a> </a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li ng-repeat="option in filter.options"> <li ng-repeat="option in filter.options">
<a ng-click="filterOptionSelected(filter, option)">{{option.text}}</a> <a ng-click="filterOptionSelected(filter, option)">{{option.text | urlDecode}}</a>
</li> </li>
</ul> </ul>
</li> </li>
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
</i> </i>
<span class='small histogram-legend-item'> <span class='small histogram-legend-item'>
<a ng-click="toggleSeries(series, $event)" data-unique="1" data-placement="{{series.yaxis === 2 ? 'bottomRight' : 'bottomLeft'}}"> <a ng-click="toggleSeries(series, $event)" data-unique="1" data-placement="{{series.yaxis === 2 ? 'bottomRight' : 'bottomLeft'}}">
{{series.alias}} {{series.alias | urlDecode}}
</a> </a>
<span ng-if="panel.legend.values"> <span ng-if="panel.legend.values">
<span ng-show="panel.legend.current"> <span ng-show="panel.legend.current">
......
File mode changed from 100644 to 100755
...@@ -70,6 +70,11 @@ function (_) { ...@@ -70,6 +70,11 @@ function (_) {
}); });
addFuncDef({ addFuncDef({
name: 'isNonNull',
category: categories.Combine,
});
addFuncDef({
name: 'rangeOfSeries', name: 'rangeOfSeries',
category: categories.Combine category: categories.Combine
}); });
......
...@@ -118,7 +118,7 @@ function (angular, _, $, config, kbn, moment) { ...@@ -118,7 +118,7 @@ function (angular, _, $, config, kbn, moment) {
GraphiteDatasource.prototype.metricFindQuery = function(filterSrv, query) { GraphiteDatasource.prototype.metricFindQuery = function(filterSrv, query) {
var interpolated; var interpolated;
try { try {
interpolated = filterSrv.applyTemplateToTarget(query); interpolated = encodeURIComponent(filterSrv.applyTemplateToTarget(query));
} }
catch(err) { catch(err) {
return $q.reject(err); return $q.reject(err);
......
...@@ -124,6 +124,7 @@ define([ ...@@ -124,6 +124,7 @@ define([
i === 45 || // - i === 45 || // -
i === 42 || // * i === 42 || // *
i === 58 || // : i === 58 || // :
i === 37 || // %
i >= 97 && i <= 122; // a-z i >= 97 && i <= 122; // a-z
} }
......
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -271,7 +271,7 @@ ...@@ -271,7 +271,7 @@
} }
.grafana-target-segment { .grafana-target-segment {
padding: 5px 7px; padding: 8px 7px;
display: inline-block; display: inline-block;
font-weight: normal; font-weight: normal;
border-right: 1px solid @grafanaTargetSegmentBorder; border-right: 1px solid @grafanaTargetSegmentBorder;
...@@ -337,10 +337,11 @@ input[type=text].grafana-function-param-input { ...@@ -337,10 +337,11 @@ input[type=text].grafana-function-param-input {
} }
a { a {
padding: 5px 7px; padding: 8px 7px;
position: relative; position: relative;
top: 5px; top: 8px;
color: @grafanaTargetColor; color: @grafanaTargetColor;
font-size: 16px;
.grafana-target-hidden & { .grafana-target-hidden & {
color: @grafanaTargetColorHide; color: @grafanaTargetColorHide;
...@@ -353,7 +354,7 @@ input[type=text].grafana-function-param-input { ...@@ -353,7 +354,7 @@ input[type=text].grafana-function-param-input {
} }
input[type=text].grafana-target-text-input { input[type=text].grafana-target-text-input {
padding: 5px 7px; padding: 8px 7px;
border: none; border: none;
margin: 0px; margin: 0px;
background: transparent; background: transparent;
...@@ -367,8 +368,7 @@ input[type=text].grafana-target-segment-input { ...@@ -367,8 +368,7 @@ input[type=text].grafana-target-segment-input {
border-right: 1px solid @grafanaTargetSegmentBorder; border-right: 1px solid @grafanaTargetSegmentBorder;
margin: 0px; margin: 0px;
border-radius: 0; border-radius: 0;
height: 22px; padding: 8px 4px;
line-height: 22px;
} }
select.grafana-target-segment-input { select.grafana-target-segment-input {
...@@ -376,8 +376,8 @@ select.grafana-target-segment-input { ...@@ -376,8 +376,8 @@ select.grafana-target-segment-input {
border-right: 1px solid @grafanaTargetSegmentBorder; border-right: 1px solid @grafanaTargetSegmentBorder;
margin: 0px; margin: 0px;
border-radius: 0; border-radius: 0;
height: 30px; height: 36px;
line-height: 30px; padding: 8px 5px;
} }
.grafana-target .dropdown { .grafana-target .dropdown {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment