mirror of
https://github.com/elastic/kibana.git
synced 2025-04-24 01:38:56 -04:00
[settings/fieldFilters] list filter matches, remove excluded fields from fieldata_fields
This commit is contained in:
parent
d75a63fa34
commit
08f8fd7e0d
5 changed files with 120 additions and 63 deletions
|
@ -5,66 +5,93 @@
|
|||
</p>
|
||||
|
||||
<div ng-class="{ saving: fieldFilters.saving }" class="field-filters-container">
|
||||
<form
|
||||
ng-repeat="filter in fieldFilters.all()"
|
||||
ng-submit="fieldFilters.save(filter)"
|
||||
class="field-filter"
|
||||
name="form">
|
||||
|
||||
<div class="value">
|
||||
<span ng-if="fieldFilters.editting !== filter">{{ filter.value }}</span>
|
||||
<table class="table table-hover">
|
||||
<tbody>
|
||||
<tr ng-repeat="filter in fieldFilters.all()">
|
||||
<td>
|
||||
<form
|
||||
ng-submit="fieldFilters.save(filter)"
|
||||
class="field-filter"
|
||||
name="form">
|
||||
|
||||
<input
|
||||
ng-model="filter.value"
|
||||
ng-if="fieldFilters.editting === filter"
|
||||
placeholder="field name filter, accepts wildcards (i.e. `user:*`)"
|
||||
type="text"
|
||||
required
|
||||
class="form-control">
|
||||
</div>
|
||||
<div class="value">
|
||||
<span ng-if="fieldFilters.editting !== filter">{{ filter.value }}</span>
|
||||
|
||||
<div class="controls">
|
||||
<button
|
||||
aria-label="Edit field filter"
|
||||
ng-if="fieldFilters.editting !== filter"
|
||||
ng-click="fieldFilters.editting = filter"
|
||||
type="button"
|
||||
class="btn btn-default">
|
||||
<i aria-hidden="true" class="fa fa-pencil"></i>
|
||||
</button>
|
||||
<button
|
||||
aria-label="Save field filter"
|
||||
ng-if="fieldFilters.editting === filter"
|
||||
type="submit"
|
||||
class="btn btn-primary">
|
||||
<i aria-hidden="true" class="fa fa-save"></i>
|
||||
</button>
|
||||
<button
|
||||
aria-label="Delete field filter"
|
||||
ng-click="fieldFilters.delete(filter)"
|
||||
type="button"
|
||||
class="btn btn-danger">
|
||||
<i aria-hidden="true" class="fa fa-trash"></i>
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
<input
|
||||
ng-model="filter.value"
|
||||
input-focus
|
||||
ng-if="fieldFilters.editting === filter"
|
||||
placeholder="field name filter, accepts wildcards (i.e. `user:*`)"
|
||||
type="text"
|
||||
required
|
||||
class="form-control">
|
||||
</div>
|
||||
|
||||
<form name="form" ng-submit="fieldFilters.create()">
|
||||
<div class="input-group">
|
||||
<input
|
||||
ng-model="fieldFilters.newValue"
|
||||
placeholder="field name filter, accepts wildcards (i.e. `user:*`)"
|
||||
type="text"
|
||||
class="form-control">
|
||||
<div class="controls">
|
||||
<button
|
||||
aria-label="Edit field filter"
|
||||
ng-if="fieldFilters.editting !== filter"
|
||||
ng-click="fieldFilters.editting = filter"
|
||||
type="button"
|
||||
class="btn btn-default">
|
||||
<i aria-hidden="true" class="fa fa-pencil"></i>
|
||||
</button>
|
||||
<button
|
||||
aria-label="Save field filter"
|
||||
ng-if="fieldFilters.editting === filter"
|
||||
type="submit"
|
||||
class="btn btn-primary">
|
||||
<i aria-hidden="true" class="fa fa-save"></i>
|
||||
</button>
|
||||
<button
|
||||
aria-label="Delete field filter"
|
||||
ng-click="fieldFilters.delete(filter)"
|
||||
type="button"
|
||||
class="btn btn-danger">
|
||||
<i aria-hidden="true" class="fa fa-trash"></i>
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td>
|
||||
<form name="form" ng-submit="fieldFilters.create()">
|
||||
<div class="input-group">
|
||||
<input
|
||||
ng-model="fieldFilters.newValue"
|
||||
placeholder="field name filter, accepts wildcards (i.e. `user:*`)"
|
||||
type="text"
|
||||
class="form-control">
|
||||
|
||||
<div class="input-group-btn" role="group" aria-label="Field Filter Editor Controls">
|
||||
<button
|
||||
type="submit"
|
||||
class="btn btn-primary"
|
||||
ng-disabled="!fieldFilters.newValue">
|
||||
Add
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div class="input-group-btn" role="group" aria-label="Field Filter Editor Controls">
|
||||
<button
|
||||
type="submit"
|
||||
class="btn btn-primary"
|
||||
ng-disabled="!fieldFilters.newValue">
|
||||
Add
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
|
||||
<div ng-if="fieldFilters.all().length" class="known-matches">
|
||||
<h4>Known Matches</h4>
|
||||
<p ng-if="!fieldFilters.sampleMatches">
|
||||
<em>The selected field filters don't match any known fields.</em>
|
||||
</p>
|
||||
<p ng-if="fieldFilters.sampleMatches">
|
||||
Based on the choosen field filters, these are the known fields that would be excluded from document sources.
|
||||
</p>
|
||||
<ul>
|
||||
<li ng-repeat="match in fieldFilters.sampleMatches">{{match}}</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
import { without } from 'lodash';
|
||||
import { size, without } from 'lodash';
|
||||
|
||||
import uiModules from 'ui/modules';
|
||||
import Notifier from 'ui/notify/notifier';
|
||||
import { fieldWildcardMatcher } from 'ui/field_wildcard';
|
||||
|
||||
import template from './field_filters.html';
|
||||
import './field_filters.less';
|
||||
|
@ -27,10 +28,17 @@ uiModules.get('kibana')
|
|||
this.saving = false;
|
||||
this.editting = null;
|
||||
this.newValue = null;
|
||||
|
||||
$scope.$watch('indexPattern.fieldFilters', (filters) => {
|
||||
const values = filters.map(f => f.value);
|
||||
const filter = fieldWildcardMatcher(values);
|
||||
const matches = $scope.indexPattern.fields.map(f => f.name).filter(filter).sort();
|
||||
this.sampleMatches = size(matches) ? matches : null;
|
||||
});
|
||||
}
|
||||
|
||||
all() {
|
||||
return this.$scope.indexPattern.fieldFilters || [];
|
||||
return this.$scope.indexPattern.fieldFilters;
|
||||
}
|
||||
|
||||
delete(filter) {
|
||||
|
|
|
@ -15,7 +15,8 @@ settings-indices-field-filters {
|
|||
align-items: center;
|
||||
margin: 10px 0;
|
||||
|
||||
> .value {
|
||||
.value {
|
||||
text-align: left;
|
||||
flex: 1 1 auto;
|
||||
padding-right: 5px;
|
||||
font-family: @font-family-monospace;
|
||||
|
@ -26,4 +27,12 @@ settings-indices-field-filters {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
.known-matches {
|
||||
ul li {
|
||||
font-family: @font-family-monospace;
|
||||
font-size: @font-size-base;
|
||||
padding: @table-cell-padding;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@ import RequestQueueProvider from '../_request_queue';
|
|||
import ErrorHandlersProvider from '../_error_handlers';
|
||||
import FetchProvider from '../fetch';
|
||||
import DecorateQueryProvider from './_decorate_query';
|
||||
import { fieldWildcardFilter } from '../../field_wildcard';
|
||||
|
||||
export default function SourceAbstractFactory(Private, Promise, PromiseEmitter) {
|
||||
let requestQueue = Private(RequestQueueProvider);
|
||||
|
@ -381,6 +382,11 @@ export default function SourceAbstractFactory(Private, Promise, PromiseEmitter)
|
|||
recurse(agg.aggs || agg.aggregations);
|
||||
});
|
||||
}(flatState.body.aggs || flatState.body.aggregations));
|
||||
|
||||
if (flatState.body._source && flatState.body.fielddata_fields) {
|
||||
const filter = fieldWildcardFilter(flatState.body._source.exclude);
|
||||
flatState.body.fielddata_fields = flatState.body.fielddata_fields.filter(filter);
|
||||
}
|
||||
}
|
||||
|
||||
return flatState;
|
||||
|
|
|
@ -4,8 +4,15 @@ export const makeRegEx = memoize(function makeRegEx(glob) {
|
|||
return new RegExp(glob.replace(/\*/g, '.*'));
|
||||
});
|
||||
|
||||
export function fieldWildcardFilter(globs) {
|
||||
return function filter(val) {
|
||||
return !globs.some(p => makeRegEx(p).test(val));
|
||||
export function fieldWildcardMatcher(globs) {
|
||||
return function matcher(val) {
|
||||
return globs.some(p => makeRegEx(p).test(val));
|
||||
};
|
||||
}
|
||||
|
||||
export function fieldWildcardFilter(globs) {
|
||||
const matcher = fieldWildcardMatcher(globs);
|
||||
return function filter(val) {
|
||||
return !matcher(val);
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue