Merge branch 'master' into install-plugin

Conflicts:
	package.json
This commit is contained in:
Jim Unger 2015-07-08 17:30:25 -05:00
commit c0b36b2821
21 changed files with 112 additions and 53 deletions

View file

@ -283,7 +283,7 @@ A green oval with the filter definition displays right under the query box:
image::images/tutorial-visualize-map-3.png[]
Hover on the filter to display the controls to toggle, pin, invert, or delete the filter. Save this chart with the name
_Bar Example_.
_Map Example_.
Finally, we're going to define a sample Markdown widget to display on our dashboard. Click on *New Visualization*, then
*Markdown widget*, to display a very simple Markdown entry field:
@ -323,4 +323,4 @@ clicking the *Share* button to display HTML embedding code as well as a direct l
=== Wrapping Up
Now that you've handled the basic aspects of Kibana's functionality, you're ready to explore Kibana in further detail.
Take a look at the rest of the documentation for more details!
Take a look at the rest of the documentation for more details!

View file

@ -9,8 +9,7 @@
the Visualize tab to Discover to a Dashboard.
* {k4pull}2731[Pull Request 2731]: Field formatting options now supported in Settings.
* {k4pull}3154[Pull Request 3154]: New chart: Bubble chart, derived from the basic line chart.
* {k4pull}3212[Pull Request 3212]: You can now install Kibana on Linux with a package manager such as `yum` or
`apt-get`.
* {k4pull}3212[Pull Request 3212]: You can now install Kibana on Linux with a package manager such as `apt-get`.
* {k4pull}3271[Pull Request 3271] and {k4pull}3262[3262]: New aggregations: IPv4 and Date range aggregations enable
you to specify buckets for these qualities.
* {k4pull}3290[Pull Request 3290]: You can select a time interval for the Discover display of time series data.

View file

@ -98,7 +98,7 @@
"istanbul": "^0.3.15",
"jade": "^1.8.2",
"libesvm": "^1.0.1",
"license-checker": "3.0.3",
"license-checker": "^3.1.0",
"load-grunt-config": "^0.7.0",
"marked": "^0.3.3",
"marked-text-renderer": "^0.1.0",

View file

@ -72,7 +72,7 @@ define(function (require) {
if (group) {
table.aggConfig = agg;
table.key = key;
table.title = agg.makeLabel() + ': ' + (table.fieldFormatter()(key));
table.title = (table.fieldFormatter()(key)) + ': ' + agg.makeLabel() ;
}
// link the parent and child

View file

@ -11,10 +11,18 @@ kbn-agg-table-group {
.flex(1, 1, auto);
.flex-direction(column);
&-paginated-table {
&-paginated {
.flex(1, 1, auto);
overflow: auto;
tr:hover td {
background-color: lighten(@gray-lighter, 4%);
}
.cell-hover:hover {
background-color: @gray-lighter;
}
th i.fa-sort {
color: @gray-light;
}
@ -32,4 +40,4 @@ kbn-agg-table-group {
padding: 0;
}
}
}
}

View file

@ -28,7 +28,7 @@ define(function (require) {
title: 'Terms',
makeLabel: function (agg) {
var params = agg.params;
return params.order.display + ' ' + params.size + ' ' + params.field.displayName;
return params.field.displayName + ': ' + params.order.display;
},
createFilter: createFilter,
params: [
@ -53,21 +53,6 @@ define(function (require) {
name: 'size',
default: 5
},
{
name: 'order',
type: 'optioned',
default: 'desc',
editor: require('text!components/agg_types/controls/order_and_size.html'),
options: [
{ display: 'Top', val: 'desc' },
{ display: 'Bottom', val: 'asc' }
],
write: _.noop // prevent default write, it's handled by orderAgg
},
{
name: 'orderBy',
write: _.noop // prevent default write, it's handled by orderAgg
},
{
name: 'orderAgg',
type: AggConfig,
@ -122,6 +107,12 @@ define(function (require) {
// we aren't creating a custom aggConfig
if (!orderBy || orderBy !== 'custom') {
params.orderAgg = null;
if (orderBy === '_term') {
params.orderBy = '_term';
return;
}
// ensure that orderBy is set to a valid agg
if (!_.find($scope.responseValueAggs, { id: orderBy })) {
params.orderBy = null;
@ -146,7 +137,12 @@ define(function (require) {
output.params.valueType = agg.field().type === 'number' ? 'float' : agg.field().type;
}
if (!orderAgg || orderAgg.type.name === 'count') {
if (!orderAgg) {
order[agg.params.orderBy || '_count'] = dir;
return;
}
if (orderAgg.type.name === 'count') {
order._count = dir;
return;
}
@ -159,6 +155,21 @@ define(function (require) {
output.subAggs = (output.subAggs || []).concat(orderAgg);
order[orderAggId] = dir;
}
},
{
name: 'order',
type: 'optioned',
default: 'desc',
editor: require('text!components/agg_types/controls/order_and_size.html'),
options: [
{ display: 'Descending', val: 'desc' },
{ display: 'Ascending', val: 'asc' }
],
write: _.noop // prevent default write, it's handled by orderAgg
},
{
name: 'orderBy',
write: _.noop // prevent default write, it's handled by orderAgg
}
]
});

View file

@ -31,7 +31,7 @@
<div class="hintbox" ng-if="!indexedFields.length">
<p>
<i class="fa fa-danger text-danger"></i>
<strong>No Compatible Fields:</strong> The "{{ vis.indexPattern.id }}" index pattern does not any of the following field types: {{ agg.type.params.byName.field.filterFieldTypes | commaList:false }}
<strong>No Compatible Fields:</strong> The "{{ vis.indexPattern.id }}" index pattern does not contain any of the following field types: {{ agg.type.params.byName.field.filterFieldTypes | commaList:false }}
</p>
</div>

View file

@ -15,6 +15,9 @@
<option value="custom" ng-selected="agg.params.orderBy === 'custom'">
Custom Metric
</option>
<option value="_term" ng-selected="agg.params.orderBy === '_term'">
Term
</option>
</select>
</div>
<div ng-show="agg.params.orderAgg" class="vis-editor-agg-order-agg">

View file

@ -128,6 +128,14 @@ define(function () {
'format:currency:defaultPattern': {
type: 'string',
value: '($0,0.[00])'
},
'timepicker:timeDefaults': {
type: 'json',
value: JSON.stringify({
from: 'now-15m',
to: 'now',
mode: 'quick'
}, null, 2)
}
};
};

View file

@ -170,11 +170,20 @@ define(function (require) {
return;
case 'source':
key = '_source';
/* fall through */
addToBody();
break;
case 'sort':
val = normalizeSortRequest(val, this.get('index'));
/* fall through */
addToBody();
break;
default:
addToBody();
}
/**
* Add the key and val to the body of the resuest
*/
function addToBody() {
state.body = state.body || {};
// ignore if we already have a value
if (state.body[key] == null) {

View file

@ -1,7 +1,7 @@
define(function (require) {
require('modules')
.get('kibana')
.service('timefilter', function (Private, globalState, $rootScope) {
.service('timefilter', function (Private, globalState, $rootScope, config) {
var _ = require('lodash');
var angular = require('angular');
@ -27,11 +27,7 @@
self.enabled = false;
var timeDefaults = {
from: 'now-15m',
to: 'now',
mode: 'quick'
};
var timeDefaults = config.get('timepicker:timeDefaults');
var refreshIntervalDefaults = {
display: 'Off',

View file

@ -27,6 +27,12 @@
</div>
</div>
<form role="form">
<input aria-label="Filter" ng-model="fieldFilter" class="form-control span12" type="text" placeholder="Filter" />
</form>
<br />
<ul class="nav nav-tabs">
<li class="kbn-settings-tab" ng-class="{ active: state.tab === fieldType.index }" ng-repeat="fieldType in fieldTypes">
<a ng-click="changeTab(fieldType)">

View file

@ -3,3 +3,5 @@
rows="rows"
per-page="perPage">
</paginated-table>
<p class="text-center default-message" ng-if="rows.length === 0">No matching fields found.</p>

View file

@ -3,12 +3,13 @@ define(function (require) {
require('components/paginated_table/paginated_table');
require('modules').get('apps/settings')
.directive('indexedFields', function () {
.directive('indexedFields', function ($filter) {
var yesTemplate = '<i class="fa fa-check" aria-label="yes"></i>';
var noTemplate = '';
var nameHtml = require('text!plugins/settings/sections/indices/_field_name.html');
var typeHtml = require('text!plugins/settings/sections/indices/_field_type.html');
var controlsHtml = require('text!plugins/settings/sections/indices/_field_controls.html');
var filter = $filter('filter');
return {
restrict: 'E',
@ -26,11 +27,16 @@ define(function (require) {
{ title: 'controls', sortable: false }
];
$scope.$watchCollection('indexPattern.fields', function () {
$scope.$watchMulti(['[]indexPattern.fields', 'fieldFilter'], refreshRows);
function refreshRows() {
// clear and destroy row scopes
_.invoke(rowScopes.splice(0), '$destroy');
$scope.rows = $scope.indexPattern.getNonScriptedFields().map(function (field) {
var fields = filter($scope.indexPattern.getNonScriptedFields(), $scope.fieldFilter);
_.find($scope.fieldTypes, {index: 'indexedFields'}).count = fields.length; // Update the tab count
$scope.rows = fields.map(function (field) {
var childScope = _.assign($scope.$new(), { field: field });
rowScopes.push(childScope);
@ -60,7 +66,7 @@ define(function (require) {
}
];
});
});
}
}
};
});

View file

@ -17,4 +17,4 @@
per-page="perPage">
</paginated-table>
<div ng-if="rows.length === 0">No scripted fields</div>
<p class="text-center" ng-if="rows.length === 0">No matching scripted fields found.</p>

View file

@ -3,9 +3,11 @@ define(function (require) {
require('components/paginated_table/paginated_table');
require('modules').get('apps/settings')
.directive('scriptedFields', function (kbnUrl, Notifier) {
.directive('scriptedFields', function (kbnUrl, Notifier, $filter) {
var rowScopes = []; // track row scopes, so they can be destroyed as needed
var popularityHtml = require('text!plugins/settings/sections/indices/_field_popularity.html');
var controlsHtml = require('text!plugins/settings/sections/indices/_field_controls.html');
var filter = $filter('filter');
var notify = new Notifier();
@ -27,11 +29,16 @@ define(function (require) {
{ title: 'controls', sortable: false }
];
$scope.$watch('indexPattern.fields', function () {
$scope.$watchMulti(['[]indexPattern.fields', 'fieldFilter'], refreshRows);
function refreshRows() {
_.invoke(rowScopes, '$destroy');
rowScopes.length = 0;
$scope.rows = $scope.indexPattern.getScriptedFields().map(function (field) {
var fields = filter($scope.indexPattern.getScriptedFields(), $scope.fieldFilter);
_.find($scope.fieldTypes, {index: 'scriptedFields'}).count = fields.length; // Update the tab count
$scope.rows = fields.map(function (field) {
var rowScope = $scope.$new();
rowScope.field = field;
rowScopes.push(rowScope);
@ -46,7 +53,7 @@ define(function (require) {
}
];
});
});
}
$scope.addDateScripts = function () {
var conflictFields = [];

View file

@ -42,13 +42,13 @@ define(function (require) {
$scope.services = _.sortBy(data, 'title');
var tab = $scope.services[0];
if ($state.tab) tab = _.find($scope.services, {title: $state.tab});
$scope.changeTab(tab);
$scope.$watch('state.tab', function (tab) {
if (!tab) $scope.changeTab($scope.services[0]);
});
});
};
$scope.$watch('state.tab', function (tab) {
if (!tab) $scope.changeTab($scope.services[0]);
});
$scope.toggleAll = function () {
if ($scope.selectedItems.length === $scope.currentTab.data.length) {

View file

@ -180,6 +180,10 @@ kbn-settings-indices {
margin: 5px 0;
text-align: right;
}
p.text-center {
padding-top: 1em;
}
}

View file

@ -8,9 +8,7 @@ module.exports = function (grunt) {
options: {
directory: directory,
branch: 'master',
plugins: [
'elasticsearch/marvel/latest'
],
fresh: true,
config: {
path: {
data: dataDir

View file

@ -34,7 +34,8 @@ module.exports = function (grunt) {
'FileSaver@undefined': ['MIT'],
'cycle@1.0.3': ['Public-Domain'],
'pkginfo@0.2.3': ['MIT'],
'uglify-js@2.2.5': ['BSD']
'uglify-js@2.2.5': ['BSD'],
'amdefine@0.1.1': ['BSD-3-Clause', 'MIT']
}
}
};

View file

@ -37,11 +37,12 @@ module.exports = function (grunt) {
var invalidLicenses = _.filter(licenseStats, function (pkg) { return !pkg.valid;});
if (grunt.option('only-invalid')) {
console.log(invalidLicenses);
grunt.log.debug(JSON.stringify(invalidLicenses, null, 2));
} else {
console.log(licenseStats);
grunt.log.debug(JSON.stringify(licenseStats, null, 2));
}
if (invalidLicenses.length) {
grunt.fail.warn('Non-confirming licenses: ' + _.pluck(invalidLicenses, 'name').join(', ') +
'. Use --only-invalid for details.', invalidLicenses.length);