Merge branch 'master' into feature/vislib_documentation

This commit is contained in:
Shelby Sturgis 2014-10-17 19:02:29 +03:00
commit 8add93b019
10 changed files with 129 additions and 25 deletions

View file

@ -82,7 +82,7 @@ define(function (require) {
var stateDefaults = {
query: initialQuery || '',
columns: ['_source'],
columns: savedSearch.columns || ['_source'],
index: $scope.searchSource.get('index').id || config.get('defaultIndex'),
interval: 'auto',
filters: _.cloneDeep($scope.searchSource.get('filter'))
@ -232,6 +232,7 @@ define(function (require) {
return $scope.updateDataSource()
.then(function () {
savedSearch.id = savedSearch.title;
savedSearch.columns = $scope.state.columns;
return savedSearch.save()
.then(function () {
@ -529,7 +530,7 @@ define(function (require) {
_.each(value, function (clause) {
var previous = _.find(filters, function (item) {
if (item && item.query) {
return item.query.match[field] === { query: clause, type: 'phrase' };
return item.query.match[field].query === clause;
} else if (item && item.exists && field === '_exists_') {
return item.exists.field === clause;
} else if (item && item.missing && field === '_missing_') {

View file

@ -20,12 +20,14 @@ define(function (require) {
mapping: {
title: 'string',
description: 'string',
hits: 'integer'
hits: 'integer',
columns: 'string'
},
defaults: {
title: 'New Saved Search',
description: '',
columns: [],
hits: 0
},

View file

@ -1,15 +1,46 @@
<div class="bar" ng-show="filters.length">
<div class="filter" ng-class="{ negate: filter.negate, disabled: filter.disabled }" ng-repeat="filter in filters">
<div class="filter-description">
<!--<span><i class="fa" ng-class="{'fa-plus': !filter.negate, 'fa-minus': filter.negate}"></i></span>-->
<span>{{ filter.key }}:</span>
<span>"{{ filter.value }}"</span>
</div>
<div class="filter-actions">
<a class="filter-toggle" ng-click="toggleFilter(filter)"><span ng-show="filter.disabled">enable</span><span ng-hide="filter.disabled">disable</span></a>
<a class="filter-remove" ng-click="removeFilter(filter)">remove</a>
<a class="filter-toggle" ng-click="toggleFilter(filter)">
<span ng-show="filter.disabled">enable</span>
<span ng-hide="filter.disabled">disable</span>
</a>
<a class="filter-remove" ng-click="removeFilter(filter)">
remove
</a>
</div>
</div>
<div class="filter-remove-all" ng-click="removeFilters()">
<div class="filter-description"><a ng-click="removeAll()">remove all</a></div>
<div class="filter-link">
<div class="filter-description small">
<a ng-click="showFilterActions = !showFilterActions">
Actions
<i class="fa"
ng-class="{'fa-caret-down': showFilterActions, 'fa-caret-right': !showFilterActions}"></i>
</a>
</div>
</div>
</div>
<div class="bar bar-condensed" ng-show="filters.length && showFilterActions">
<div class="filter-actions-all">
<div class="filter-link">
<div class="filter-description"><strong>All filters:</strong></div>
</div>
<div class="filter-link">
<div class="filter-description"><a ng-click="toggleAll(false)">Enable</a></div>
</div>
<div class="filter-link">
<div class="filter-description"><a ng-click="toggleAll(true)">Disable</a></div>
</div>
<div class="filter-link">
<div class="filter-description"><a ng-click="toggleAll()">Toggle</a></div>
</div>
<div class="filter-link">
<div class="filter-description"><a ng-click="removeAll()">Remove</a></div>
</div>
</div>
</div>

View file

@ -4,10 +4,11 @@ define(function (require) {
var module = require('modules').get('kibana');
var template = require('text!components/filter_bar/filter_bar.html');
var mapFilter = require('./lib/mapFilter');
var toggleFilter = require('./lib/toggleFilter');
var removeFilter = require('./lib/removeFilter');
var removeAll = require('./lib/removeAll');
var mapFilter = require('components/filter_bar/lib/mapFilter');
var toggleFilter = require('components/filter_bar/lib/toggleFilter');
var toggleAll = require('components/filter_bar/lib/toggleAll');
var removeFilter = require('components/filter_bar/lib/removeFilter');
var removeAll = require('components/filter_bar/lib/removeAll');
module.directive('filterBar', function (courier) {
return {
@ -33,6 +34,7 @@ define(function (require) {
$scope.toggleFilter = toggleFilter($scope);
$scope.removeFilter = removeFilter($scope);
$scope.removeAll = removeAll($scope);
$scope.toggleAll = toggleAll($scope);
}
};
});

View file

@ -7,7 +7,13 @@ filter-bar .bar {
background: @gray-lighter;
border-bottom: 1px solid #ccc;
.filter-remove-all {
&-condensed {
padding: 2px 6px 0px 6px !important;
font-size: 0.9em;
background: darken(@gray-lighter, 5%);
}
.filter-link {
position: relative;
display: inline-block;
border: 4px solid transparent;
@ -27,18 +33,14 @@ filter-bar .bar {
min-width: 110px;
font-size: @font-size-small;
background-color: @gray-dark;
background-color: @action-add;
color: #fff;
margin-right: 4px;
margin-bottom: 4px;
max-width: 100%;
// Replace padding with border so absolute controls position correctly
border-color: transparent;
border-style: solid;
border-width: 4px;
border-left-width: 8px;
border-right-width: 8px;
padding: 4px 8px;
border-radius: 12px;
@ -49,12 +51,14 @@ filter-bar .bar {
> .filter-description {
opacity: 0.15;
background: transparent;
overflow: hidden;
}
}
> .filter-actions {
position: absolute;
padding: 4px 8px;
top: 0;
left: 0;
width: 100%;
@ -70,7 +74,7 @@ filter-bar .bar {
}
&.negate {
background-color: #D18282;
background-color: @action-remove;
}
a {
@ -78,7 +82,8 @@ filter-bar .bar {
}
&.disabled {
opacity: 0.7;
opacity: 0.6;
background-image: repeating-linear-gradient(45deg, transparent, transparent 10px, rgba(255,255,255,.3) 10px, rgba(255,255,255,.3) 20px);
}
&.disabled:hover {

View file

@ -0,0 +1,21 @@
define(function (require) {
var _ = require('lodash');
return function ($scope) {
var remapFilters = require('components/filter_bar/lib/remapFilters');
var toggleFilter = require('components/filter_bar/lib/toggleFilter')($scope);
/**
* Disables all filters
* @params {boolean} force disable/enable all filters
* @returns {void}
*/
return function (force) {
$scope.filters.forEach(function (filter) {
toggleFilter(filter, force);
});
$scope.state.filters = _.map($scope.filters, remapFilters);
};
};
});

View file

@ -5,11 +5,12 @@ define(function (require) {
/**
* Toggles the filter between enabled/disabled.
* @param {object} filter The filter to toggle
& @param {boolean} force disabled true/false
* @returns {void}
*/
return function (filter) {
return function (filter, force) {
// Toggle the disabled flag
var disabled = !filter.disabled;
var disabled = _.isUndefined(force) ? !filter.disabled : force;
filter.disabled = disabled;
filter.filter.disabled = disabled;

View file

@ -16,4 +16,7 @@
@sidebar-active-color: @component-active-color;
@sidebar-active-bg: @component-active-bg;
@sidebar-active-hover-bg: @component-active-bg;
@sidebar-active-hover-color: @component-active-color;
@sidebar-active-hover-color: @component-active-color;
@action-add: desaturate(@btn-success-bg, 30%);
@action-remove: desaturate(@btn-danger-bg, 30%);

View file

@ -1,12 +1,15 @@
# Kibana is served by a backend server. This controls which port to use.
port: 5601
# The host to bind the server to
host: "0.0.0.0"
# The Elasticsearch instance to use for all your queries
elasticsearch: "http://localhost:9200"
# Kibana uses an index in Elasticsearch to store saved searches, visualizations
# and dashboards. It will create an new index if it doesn't already exist.
kibanaIndex: "kibana-int"
kibanaIndex: ".kibana"
# Applications loaded and included into Kibana. Use the settings below to
# customize the applications and thier names.

View file

@ -5,6 +5,8 @@ define(function (require) {
var $ = require('jquery');
var toggleFilter = require('components/filter_bar/lib/toggleFilter');
var toggleAll = require('components/filter_bar/lib/toggleAll');
var mapFilter = require('components/filter_bar/lib/mapFilter');
var removeFilter = require('components/filter_bar/lib/removeFilter');
var removeAll = require('components/filter_bar/lib/removeAll');
@ -27,7 +29,7 @@ define(function (require) {
{ query: { match: { '@tags': { query: 'test' } } } },
{ query: { match: { '@tags': { query: 'bar' } } } },
{ exists: { field: '@timestamp' } },
{ missing: { field: 'host' } },
{ missing: { field: 'host' }, disabled: true },
]
};
done();
@ -111,7 +113,40 @@ define(function (require) {
});
});
describe('toggleAll', function () {
var fn;
beforeEach(function () {
// This would normally be done by the directive
$rootScope.filters = _($rootScope.state.filters)
.filter(function (filter) {
return filter;
})
.flatten(true)
.map(mapFilter)
.value();
fn = toggleAll($rootScope);
});
it('should toggle all the filters', function () {
expect(_.filter($rootScope.state.filters, 'disabled')).to.have.length(1);
fn();
expect(_.filter($rootScope.state.filters, 'disabled')).to.have.length(3);
});
it('should disable all the filters', function () {
expect(_.filter($rootScope.state.filters, 'disabled')).to.have.length(1);
fn(true);
expect(_.filter($rootScope.state.filters, 'disabled')).to.have.length(4);
});
it('should enable all the filters', function () {
expect(_.filter($rootScope.state.filters, 'disabled')).to.have.length(1);
fn(false);
expect(_.filter($rootScope.state.filters, 'disabled')).to.have.length(0);
});
});
});
});