mirror of
https://github.com/elastic/kibana.git
synced 2025-04-24 01:38:56 -04:00
Merge branch 'master' into install-plugin
Conflicts: package.json
This commit is contained in:
commit
c0b36b2821
21 changed files with 112 additions and 53 deletions
|
@ -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!
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
]
|
||||
});
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
};
|
||||
};
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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)">
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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) {
|
|||
}
|
||||
];
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
});
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 = [];
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -180,6 +180,10 @@ kbn-settings-indices {
|
|||
margin: 5px 0;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
p.text-center {
|
||||
padding-top: 1em;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -8,9 +8,7 @@ module.exports = function (grunt) {
|
|||
options: {
|
||||
directory: directory,
|
||||
branch: 'master',
|
||||
plugins: [
|
||||
'elasticsearch/marvel/latest'
|
||||
],
|
||||
fresh: true,
|
||||
config: {
|
||||
path: {
|
||||
data: dataDir
|
||||
|
|
|
@ -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']
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue