Merge branch 'master' of github.com:elastic/kibana into feature/console

This commit is contained in:
spalger 2016-03-23 14:12:44 -07:00
commit 8c4585a72e
752 changed files with 4607 additions and 3067 deletions

1
.gitignore vendored
View file

@ -1,4 +1,5 @@
.aws-config.json
.ackrc
.DS_Store
.node_binaries
node_modules

View file

@ -55,7 +55,7 @@ Please make sure you have signed the [Contributor License Agreement](http://www.
npm run elasticsearch
```
- Start the development server.
- Start the development server. _On Windows, you'll need you use Git Bash, Cygwin, or a similar shell that exposes the `sh` command._
```sh
npm start
@ -128,7 +128,7 @@ Runs both server and browser tests, but skips linting
Run only the server tests
`npm run test:browser`
Run only the browser tests
Run only the browser tests. Coverage reports are available for browser tests by running `npm run test:coverage`. You can find the results under the `coverage/` directory that will be created upon completion.
`npm run test:dev`
Initializes an environment for debugging the browser tests. Includes an dedicated instance of the kibana server for building the test bundle, and a karma server. When running this task the build is optimized for the first time and then a karma-owned instance of the browser is opened. Click the "debug" button to open a new tab that executes the unit tests.
@ -146,7 +146,8 @@ Run the tests for just your particular plugin. Assuming you plugin lives outside
#### Running browser automation tests:
*The Selenium server that is started currently only runs the tests in Firefox*
*The Selenium server that is started currently only runs the tests in a recent version of Firefox.*
*You can use the `PATH` environment variable to specify which version of Firefox to use.*
The following will start Kibana, Elasticsearch and Selenium for you. To run the functional UI tests use the following commands
@ -177,7 +178,7 @@ npm run test:ui:runner
- These tests have been developed and tested with Chrome and Firefox browser. In theory, they should work on all browsers (that's the benefit of Intern using Leadfoot).
- These tests should also work with an external testing service like https://saucelabs.com/ or https://www.browserstack.com/ but that has not been tested.
- https://theintern.github.io/
- https://theintern.github.io/leadfoot/Element.html
- https://theintern.github.io/leadfoot/module-leadfoot_Element.html
#### Building OS packages
@ -218,9 +219,10 @@ So, you've been assigned a pull to review. What's that look like?
Remember, someone is blocked by a pull awaiting review, make it count. Be thorough, the more action items you catch in the first review, the less back and forth will be required, and the better chance the pull has of being successful. Don't you like success?
1. **Understand the issue** that is being fixed, or the feature being added. Check the description on the pull, and check out the related issue. If you don't understand something, ask the person the submitter for clarification.
1. **Understand the issue** that is being fixed, or the feature being added. Check the description on the pull, and check out the related issue. If you don't understand something, ask the submitter for clarification.
1. **Reproduce the bug** (or the lack of feature I guess?) in the destination branch, usually `master`. The referenced issue will help you here. If you're unable to reproduce the issue, contact the issue submitter for clarification
1. **Check out the pull** and test it. Is the issue fixed? Does it have nasty side effects? Try to create suspect inputs. If it operates on the value of a field try things like: strings (including an empty string), null, numbers, dates. Try to think of edge cases that might break the code.
1. **Merge the target branch**. It is possible that tests or the linter have been updated in the target branch since the pull was submitted. Merging the pull could cause core to start failing.
1. **Read the code**. Understanding the changes will help you find additional things to test. Contact the submitter if you don't understand something.
1. **Go line-by-line**. Are there [style guide](https://github.com/elastic/kibana/blob/master/STYLEGUIDE.md) violations? Strangely named variables? Magic numbers? Do the abstractions make sense to you? Are things arranged in a testable way?
1. **Speaking of tests** Are they there? If a new function was added does it have tests? Do the tests, well, TEST anything? Do they just run the function or do they properly check the output?

View file

@ -1,10 +1,11 @@
require('babel/register')(require('./src/optimize/babelOptions').node);
const camelCase = require('lodash').camelCase;
require('babel/register')(require('./src/optimize/babel_options').node);
module.exports = function (grunt) {
// set the config once before calling load-grunt-config
// and once during so that we have access to it via
// grunt.config.get() within the config files
var config = {
const config = {
pkg: grunt.file.readJSON('package.json'),
root: __dirname,
src: __dirname + '/src',
@ -12,7 +13,7 @@ module.exports = function (grunt) {
plugins: __dirname + '/src/plugins',
server: __dirname + '/src/server',
target: __dirname + '/target', // location of the compressed build targets
testUtilsDir: __dirname + '/src/testUtils',
testUtilsDir: __dirname + '/src/test_utils',
configFile: __dirname + '/src/config/kibana.yml',
karmaBrowser: (function () {

View file

@ -19,7 +19,7 @@
# that connects to this Kibana instance.
# elasticsearch.preserveHost: true
# Kibana uses an index in Elasticsearch to store saved searches, visualizations and
# Kibana uses an index in Elasticsearch to store saved searches, visualizations and
# dashboards. Kibana creates a new index if the index doesnt already exist.
# kibana.index: ".kibana"
@ -28,12 +28,12 @@
# If your Elasticsearch is protected with basic authentication, these settings provide
# the username and password that the Kibana server uses to perform maintenance on the Kibana
# index at startup. Your Kibana users still need to authenticate with Elasticsearch, which
# index at startup. Your Kibana users still need to authenticate with Elasticsearch, which
# is proxied through the Kibana server.
# elasticsearch.username: "user"
# elasticsearch.password: "pass"
# Paths to the PEM-format SSL certificate and SSL key files, respectively. These
# Paths to the PEM-format SSL certificate and SSL key files, respectively. These
# files enable SSL for outgoing requests from the Kibana server to the browser.
# server.ssl.cert: /path/to/your/server.crt
# server.ssl.key: /path/to/your/server.key
@ -43,7 +43,7 @@
# elasticsearch.ssl.cert: /path/to/your/client.crt
# elasticsearch.ssl.key: /path/to/your/client.key
# Optional setting that enables you to specify a path to the PEM file for the certificate
# Optional setting that enables you to specify a path to the PEM file for the certificate
# authority for your Elasticsearch instance.
# elasticsearch.ssl.ca: /path/to/your/CA.pem
@ -54,7 +54,7 @@
# the elasticsearch.requestTimeout setting.
# elasticsearch.pingTimeout: 1500
# Time in milliseconds to wait for responses from the back end or Elasticsearch. This value
# Time in milliseconds to wait for responses from the back end or Elasticsearch. This value
# must be a positive integer.
# elasticsearch.requestTimeout: 30000
@ -76,6 +76,10 @@
# Set the value of this setting to true to suppress all logging output other than error messages.
# logging.quiet: false
# Set the value of this setting to true to log all events, including system usage information
# Set the value of this setting to true to log all events, including system usage information
# and all requests.
# logging.verbose: false
# Set the interval in milliseconds to sample system and process performance
# metrics. Minimum is 100ms. Defaults to 10000.
# ops.interval: 10000

View file

@ -1,6 +1,8 @@
[[kibana-settings-reference]]
WARNING: Modifying the following settings can signficantly affect Kibana's performance and cause problems that are difficult to diagnose. Setting a property's value to a blank field will revert to the default behavior, which may not be compatible with other configuration settings. Deleting a custom setting removes it from Kibana permanently.
WARNING: Modifying the following settings can signficantly affect Kibana's performance and cause problems that are
difficult to diagnose. Setting a property's value to a blank field will revert to the default behavior, which may not be
compatible with other configuration settings. Deleting a custom setting removes it from Kibana permanently.
.Kibana Settings Reference
[horizontal]
@ -8,30 +10,43 @@ WARNING: Modifying the following settings can signficantly affect Kibana's perfo
`sort:options`:: Options for the Elasticsearch https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-sort.html[sort] parameter.
`dateFormat`:: The format to use for displaying pretty-formatted dates.
`dateFormat:tz`:: The timezone that Kibana uses. The default value of `Browser` uses the timezone detected by the browser.
`dateFormat:scaled`:: These values define the format used to render ordered time-based data. Formatted timestamps must adapt to the interval between measurements. Keys are http://en.wikipedia.org/wiki/ISO_8601#Time_intervals[ISO8601 intervals].
`dateFormat:scaled`:: These values define the format used to render ordered time-based data. Formatted timestamps must
adapt to the interval between measurements. Keys are http://en.wikipedia.org/wiki/ISO_8601#Time_intervals[ISO8601 intervals].
`defaultIndex`:: Default is `null`. This property specifies the default index.
`metaFields`:: An array of fields outside of `_source`. Kibana merges these fields into the document when displaying the document.
`metaFields`:: An array of fields outside of `_source`. Kibana merges these fields into the document when displaying the
document.
`discover:sampleSize`:: The number of rows to show in the Discover table.
`doc_table:highlight`:: Highlight results in Discover and Saved Searches Dashboard. Highlighing makes request slow when working on big documents. Set this property to `false` to disable highlighting.
`courier:maxSegmentCount`:: Kibana splits requests in the Discover app into segments to limit the size of requests sent to the Elasticsearch cluster. This setting constrains the length of the segment list. Long segment lists can significantly increase request processing time.
`doc_table:highlight`:: Highlight results in Discover and Saved Searches Dashboard. Highlighing makes request slow when
working on big documents. Set this property to `false` to disable highlighting.
`courier:maxSegmentCount`:: Kibana splits requests in the Discover app into segments to limit the size of requests sent to
the Elasticsearch cluster. This setting constrains the length of the segment list. Long segment lists can significantly
increase request processing time.
`fields:popularLimit`:: This setting governs how many of the top most popular fields are shown.
`histogram:barTarget`:: When date histograms use the `auto` interval, Kibana attempts to generate this number of bars.
`histogram:maxBars`:: Date histograms are not generated with more bars than the value of this property, scaling values when necessary.
`visualization:tileMap:maxPrecision`:: The maximum geoHash precision displayed on tile maps: 7 is high, 10 is very high, 12 is the maximum. http://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-geohashgrid-aggregation.html#_cell_dimensions_at_the_equator[Explanation of cell dimensions].
`histogram:maxBars`:: Date histograms are not generated with more bars than the value of this property, scaling values
when necessary.
`visualization:tileMap:maxPrecision`:: The maximum geoHash precision displayed on tile maps: 7 is high, 10 is very high,
12 is the maximum. http://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-geohashgrid-aggregation.html#_cell_dimensions_at_the_equator[Explanation of cell dimensions].
`visualization:tileMap:WMSdefaults`:: Default properties for the WMS map server support in the tile map.
`visualization:colorMapping`:: Maps values to specified colors within visualizations.
`visualization:loadingDelay`:: Time to wait before dimming visualizations during query.
`csv:separator`:: A string that serves as the separator for exported values.
`csv:quoteValues`:: Set this property to `true` to quote exported values.
`history:limit`:: In fields that have history, such as query inputs, the value of this property limits how many recent values are shown.
`shortDots:enable`:: Set this property to `true` to shorten long field names in visualizations. For example, instead of `foo.bar.baz`, show `f.b.baz`.
`truncate:maxHeight`:: This property specifies the maximum height that a cell occupies in a table. A value of 0 disables truncation.
`indexPattern:fieldMapping:lookBack`:: The value of this property sets the number of recent matching patterns to query the field mapping for index patterns with names that contain timestamps.
`format:defaultTypeMap`:: A map of the default format name for each field type. Field types that are not explicitly mentioned use "_default_".
`history:limit`:: In fields that have history, such as query inputs, the value of this property limits how many recent
values are shown.
`shortDots:enable`:: Set this property to `true` to shorten long field names in visualizations. For example, instead of
`foo.bar.baz`, show `f.b.baz`.
`truncate:maxHeight`:: This property specifies the maximum height that a cell occupies in a table. A value of 0 disables
truncation.
`indexPattern:fieldMapping:lookBack`:: The value of this property sets the number of recent matching patterns to query the
field mapping for index patterns with names that contain timestamps.
`format:defaultTypeMap`:: A map of the default format name for each field type. Field types that are not explicitly
mentioned use "_default_".
`format:number:defaultPattern`:: Default numeral format for the "number" format.
`format:bytes:defaultPattern`:: Default numeral format for the "bytes" format.
`format:percent:defaultPattern`:: Default numeral format for the "percent" format.
`format:currency:defaultPattern`:: Default numeral format for the "currency" format.
`savedObjects:perPage`:: The number of objects shown on each page of the list of saved objects. The default value is 5.
`timepicker:timeDefaults`:: The default time filter selection.
`timepicker:refreshIntervalDefaults`:: The time filter's default refresh interval.
`dashboard:defaultDarkTheme`:: Set this property to `true` to make new dashboards use the dark theme by default.
`dashboard:defaultDarkTheme`:: Set this property to `true` to make new dashboards use the dark theme by default.

View file

@ -45,6 +45,8 @@ sub-aggregation from the list of types.
You can use the up or down arrows to the right of the aggregation's type to change the aggregation's priority.
Enter a string in the *Custom Label* field to change the display label.
You can click the *Advanced* link to display more customization options for your metrics or bucket aggregation:
*Exclude Pattern*:: Specify a pattern in this field to exclude from the results.

View file

@ -5,6 +5,8 @@
:shield: https://www.elastic.co/guide/en/shield/current
:k4issue: https://github.com/elastic/kibana/issues/
:k4pull: https://github.com/elastic/kibana/pull/
:version: 5.0 alpha
:esversion: 2.3
include::introduction.asciidoc[]

View file

@ -13,9 +13,10 @@ dashboards that display changes to Elasticsearch queries in real time.
Setting up Kibana is a snap. You can install Kibana and start exploring your
Elasticsearch indices in minutes -- no code, no additional infrastructure required.
NOTE: This guide describes how to use Kibana 4.3. For information about what's new
in Kibana 4.3, see the <<releasenotes, release notes>>.
NOTE: This guide describes how to use Kibana {version}. For information about what's new
in Kibana {version}, see the <<releasenotes, release notes>>.
////
[float]
[[data-discovery]]
=== Data Discovery and Visualization
@ -50,6 +51,7 @@ to correlate related information. For example, we could create a dashboard
that displays several visualizations of the TFL data:
image:images/TFL-Dashboard.jpg[Dashboard]
////
For more information about creating and sharing visualizations and dashboards, see the <<visualize, Visualize>>
and <<dashboard, Dashboard>> topics. A complete <<getting-started,tutorial>> covering several aspects of Kibana's

View file

@ -39,3 +39,4 @@ retrying.
error messages.
`logging.verbose`:: *Default: false* Set the value of this setting to `true` to log all events, including system usage
information and all requests.
`ops.interval`:: *Default: 10000* Set the interval in milliseconds to sample system and process performance metrics. Minimum is 100ms. Defaults to 10 seconds.

View file

@ -4,6 +4,7 @@
A metric visualization displays a single number for each aggregation you select:
include::y-axis-aggs.asciidoc[]
You can click the *Advanced* link to display more customization options:
*JSON Input*:: A text field where you can add specific JSON-formatted properties to merge with the aggregation
@ -17,7 +18,7 @@ NOTE: In Elasticsearch releases 1.4.3 and later, this functionality requires you
The availability of these options varies depending on the aggregation you choose.
Click the *Options* tab to change the font used to display the metrics.
Click the *Options* tab to display the font size slider.
[float]
[[metric-viewing-detailed-information]]

View file

@ -11,6 +11,8 @@ field. Select a field from the drop-down.
*Unique Count*:: The {ref}search-aggregations-metrics-cardinality-aggregation.html[_cardinality_] aggregation returns
the number of unique values in a field. Select a field from the drop-down.
Enter a string in the *Custom Label* field to change the display label.
The _buckets_ aggregations determine what information is being retrieved from your data set.
Before you choose a buckets aggregation, specify if you are splitting slices within a single chart or splitting into
@ -57,6 +59,8 @@ aggregation's type to change the aggregation's priority.
include::color-picker.asciidoc[]
Enter a string in the *Custom Label* field to change the display label.
You can click the *Advanced* link to display more customization options for your metrics or bucket aggregation:
*Exclude Pattern*:: Specify a pattern in this field to exclude from the results.

View file

@ -5,6 +5,8 @@ Add-on functionality for Kibana is implemented with plug-in modules. You can use
command to manage these modules. You can also install a plugin manually by moving the plugin file to the
`installedPlugins` directory and unpacking the plugin files into a new directory.
A list of existing Kibana plugins is available on https://github.com/elastic/kibana/wiki/Known-Plugins[GitHub].
[float]
=== Installing Plugins
@ -65,6 +67,11 @@ bin/kibana plugin --remove marvel
You can also remove a plugin manually by deleting the plugin's subdirectory under the `installedPlugins` directory.
[float]
=== Listing Installed Plugins
Use `--list` or `-l` option to list the currently installed plugins.
[float]
=== Updating Plugins

View file

@ -1,11 +1,7 @@
[[releasenotes]]
== Kibana 4.4 Release Notes
== Kibana {version} Release Notes
The 4.4 release of Kibana requires Elasticsearch 2.2 or later.
Using event times to create index names is no longer supported as of this release. Current versions of Elasticsearch
include sophisticated date parsing APIs that Kibana uses to determine date information, removing the need to specify dates
in the index pattern name.
The {version} release of Kibana requires Elasticsearch {esversion} or later.
[float]
[[enhancements]]

View file

@ -19,6 +19,8 @@ numeric field. Select a field from the drop-down.
*Unique Count*:: The {ref}search-aggregations-metrics-cardinality-aggregation.html[_cardinality_] aggregation returns
the number of unique values in a field. Select a field from the drop-down.
Enter a string in the *Custom Label* field to change the display label.
The _buckets_ aggregations determine what information is being retrieved from your data set.
Before you choose a buckets aggregation, specify if you are splitting the chart or displaying the buckets as *Geo
@ -71,6 +73,8 @@ based on the geohash coordinates.
NOTE: By default, the *Change precision on map zoom* box is checked. Uncheck the box to disable this behavior.
Enter a string in the *Custom Label* field to change the display label.
You can click the *Advanced* link to display more customization options for your metrics or bucket aggregation:
*Exclude Pattern*:: Specify a pattern in this field to exclude from the results.

View file

@ -26,6 +26,8 @@ values field. Click *+Add* to add a values field.
You can add an aggregation by clicking the *+ Add Aggregation* button.
Enter a string in the *Custom Label* field to change the display label.
The _buckets_ aggregations determine what information is being retrieved from your data set.
Before you choose a buckets aggregation, specify if you are splitting slices within a single chart or splitting into
@ -36,6 +38,8 @@ include::x-axis-aggs.asciidoc[]
include::color-picker.asciidoc[]
Enter a string in the *Custom Label* field to change the display label.
You can click the *Advanced* link to display more customization options for your metrics or bucket aggregation:
*Exclude Pattern*:: Specify a pattern in this field to exclude from the results.

View file

@ -28,8 +28,8 @@ remove a range.
or bottom _n_ elements of a given field to display, ordered by count or a custom metric.
*Filters*:: You can specify a set of {ref}/search-aggregations-bucket-filters-aggregation.html[_filters_] for the data.
You can specify a filter as a query string or in JSON format, just as in the Discover search bar. Click *Add Filter* to
add another filter. Click the images:labelbutton.png[] *label* button to open the label field, where you can type in a
name to display on the visualization.
add another filter. Click the image:images/labelbutton.png[Label button icon] *label* button to open the label field, where
you can type in a name to display on the visualization.
*Significant Terms*:: Displays the results of the experimental
{ref}/search-aggregations-bucket-significantterms-aggregation.html[_significant terms_] aggregation.
@ -39,3 +39,5 @@ from the list of types.
When multiple aggregations are defined on a chart's axis, you can use the up or down arrows to the right of the
aggregation's type to change the aggregation's priority.
Enter a string in the *Custom Label* field to change the display label.

View file

@ -22,3 +22,5 @@ from the drop-down, then specify one or more percentile rank values in the *Valu
values field. Click *+Add* to add a values field.
You can add an aggregation by clicking the *+ Add Aggregation* button.
Enter a string in the *Custom Label* field to change the display label.

View file

@ -49,7 +49,7 @@
"test:coverage": "grunt test:coverage",
"build": "grunt build",
"build:ospackages": "grunt build --os-packages",
"start": "./bin/kibana --dev",
"start": "sh ./bin/kibana --dev",
"precommit": "grunt precommit",
"karma": "karma start",
"elasticsearch": "grunt esvm:dev:keepalive",
@ -81,15 +81,15 @@
"ansicolors": "0.3.2",
"autoprefixer": "5.1.1",
"autoprefixer-loader": "2.0.0",
"babel": "5.8.23",
"babel-core": "5.8.23",
"babel": "5.8.38",
"babel-core": "5.8.38",
"babel-loader": "5.3.2",
"babel-runtime": "5.8.20",
"babel-runtime": "5.8.38",
"bluebird": "2.9.34",
"boom": "2.8.0",
"bootstrap": "3.3.5",
"bootstrap": "3.3.6",
"brace": "0.5.1",
"bunyan": "1.4.0",
"bunyan": "1.7.1",
"clipboard": "1.5.5",
"commander": "2.8.1",
"css-loader": "0.17.0",
@ -156,7 +156,7 @@
"grunt-cli": "0.1.13",
"grunt-contrib-clean": "0.6.0",
"grunt-contrib-copy": "0.8.1",
"grunt-esvm": "2.1.1",
"grunt-esvm": "3.0.4",
"grunt-karma": "0.12.0",
"grunt-run": "0.5.0",
"grunt-s3": "0.2.0-alpha.3",
@ -174,12 +174,12 @@
"karma-ie-launcher": "0.2.0",
"karma-mocha": "0.2.0",
"karma-safari-launcher": "0.1.1",
"libesvm": "3.3.0",
"license-checker": "3.1.0",
"load-grunt-config": "0.7.2",
"load-grunt-config": "0.19.1",
"makelogs": "3.0.0-beta3",
"marked-text-renderer": "0.1.0",
"mocha": "2.3.0",
"ncp": "2.0.0",
"nock": "2.10.0",
"npm": "2.11.0",
"portscanner": "1.0.0",

View file

@ -1,7 +1,7 @@
import _ from 'lodash';
import pkg from '../utils/packageJson';
import Command from './Command';
import pkg from '../utils/package_json';
import Command from './command';
let argv = process.env.kbnWorkerArgv ? JSON.parse(process.env.kbnWorkerArgv) : process.argv.slice();
let program = new Command('bin/kibana');

View file

@ -4,7 +4,7 @@ const { format: formatUrl } = require('url');
import Hapi from 'hapi';
const { debounce, compact, get, invoke, bindAll, once, sample, uniq } = require('lodash');
import Log from '../Log';
import Log from '../log';
import Worker from './worker';
import BasePathProxy from './base_path_proxy';
@ -83,7 +83,7 @@ module.exports = class ClusterManager {
setupWatching(extraPaths) {
const chokidar = require('chokidar');
const fromRoot = require('../../utils/fromRoot');
const fromRoot = require('../../utils/from_root');
const watchPaths = uniq(
[

View file

@ -3,7 +3,7 @@ import cluster from 'cluster';
let { resolve } = require('path');
let { EventEmitter } = require('events');
import fromRoot from '../../utils/fromRoot';
import fromRoot from '../../utils/from_root';
let cliPath = fromRoot('src/cli');
let baseArgs = _.difference(process.argv.slice(2), ['--no-watch']);

View file

@ -1,5 +1,5 @@
// load the babel options seperately so that they can modify the process.env
// before calling babel/register
const babelOptions = require('../optimize/babelOptions').node;
const babelOptions = require('../optimize/babel_options').node;
require('babel/register')(babelOptions);
require('./cli');

View file

@ -1,7 +1,7 @@
import path from 'path';
import expect from 'expect.js';
import fromRoot from '../../../utils/fromRoot';
import fromRoot from '../../../utils/from_root';
import settingParser from '../setting_parser';
describe('kibana cli', function () {

View file

@ -1,4 +1,4 @@
import fromRoot from '../../utils/fromRoot';
import fromRoot from '../../utils/from_root';
import settingParser from './setting_parser';
import installer from './plugin_installer';
import remover from './plugin_remover';

View file

@ -1,9 +1,9 @@
import _ from 'lodash';
import fromRoot from '../../utils/fromRoot';
import fromRoot from '../../utils/from_root';
import pluginDownloader from './plugin_downloader';
import pluginCleaner from './plugin_cleaner';
import pluginExtractor from './plugin_extractor';
import KbnServer from '../../server/KbnServer';
import KbnServer from '../../server/kbn_server';
import readYamlConfig from '../serve/read_yaml_config';
import Promise from 'bluebird';
import { sync as rimrafSync } from 'rimraf';

View file

@ -2,7 +2,7 @@ import _ from 'lodash';
import fs from 'fs';
import yaml from 'js-yaml';
import fromRoot from '../../utils/fromRoot';
import fromRoot from '../../utils/from_root';
let legacySettingMap = {
// server
@ -48,7 +48,14 @@ module.exports = function (path) {
_.forOwn(val, function (subVal, subKey) {
apply(config, subVal, key + '.' + subKey);
});
} else {
}
else if (_.isArray(val)) {
config[key] = [];
val.forEach((subVal, i) => {
apply(config, subVal, key + '.' + i);
});
}
else {
_.set(config, key, val);
}
}

View file

@ -3,7 +3,7 @@ const { isWorker } = require('cluster');
const { resolve } = require('path');
const cwd = process.cwd();
import fromRoot from '../../utils/fromRoot';
import fromRoot from '../../utils/from_root';
let canCluster;
try {
@ -126,7 +126,7 @@ module.exports = function (program) {
}
let kbnServer = {};
const KbnServer = require('../../server/KbnServer');
const KbnServer = require('../../server/kbn_server');
try {
kbnServer = new KbnServer(settings);
await kbnServer.ready();

View file

@ -1,4 +1,4 @@
module.exports = {
export default {
"took": 35,
"timed_out": false,
"_shards": {

View file

@ -1,5 +1,5 @@
import _ from 'lodash';
import TestUtilsStubIndexPatternProvider from 'testUtils/stub_index_pattern';
import TestUtilsStubIndexPatternProvider from 'test_utils/stub_index_pattern';
import IndexPatternsFieldTypesProvider from 'ui/index_patterns/_field_types';
import FixturesLogstashFieldsProvider from 'fixtures/logstash_fields';
export default function stubbedLogstashIndexPatternService(Private) {

View file

@ -4,8 +4,8 @@ import DirectoryNameAsMain from 'webpack-directory-name-as-main';
import ExtractTextPlugin from 'extract-text-webpack-plugin';
import CommonsChunkPlugin from 'webpack/lib/optimize/CommonsChunkPlugin';
import fromRoot from '../utils/fromRoot';
import babelOptions from './babelOptions';
import fromRoot from '../utils/from_root';
import babelOptions from './babel_options';
import { inherits } from 'util';
import { defaults, transform } from 'lodash';
import { resolve } from 'path';
@ -63,6 +63,7 @@ class BaseOptimizer {
getConfig() {
let mapQ = this.sourceMaps ? '?sourceMap' : '';
let mapQPre = mapQ ? mapQ + '&' : '?';
return {
context: fromRoot('.'),
@ -101,7 +102,7 @@ class BaseOptimizer {
test: /\.less$/,
loader: ExtractTextPlugin.extract(
'style',
`css${mapQ}!autoprefixer${mapQ ? mapQ + '&' : '?'}{ "browsers": ["last 2 versions","> 5%"] }!less${mapQ}`
`css${mapQ}!autoprefixer${mapQPre}{ "browsers": ["last 2 versions","> 5%"] }!less${mapQPre}dumpLineNumbers=comments`
)
},
{ test: /\.css$/, loader: ExtractTextPlugin.extract('style', `css${mapQ}`) },

View file

@ -1,6 +1,6 @@
import BaseOptimizer from './BaseOptimizer';
import fromRoot from '../utils/fromRoot';
import BaseOptimizer from './base_optimizer';
import fromRoot from '../utils/from_root';
import { fromNode } from 'bluebird';
import { writeFile } from 'fs';

View file

@ -1,4 +1,4 @@
import FsOptimizer from './FsOptimizer';
import FsOptimizer from './fs_optimizer';
module.exports = async (kbnServer, server, config) => {
if (!config.get('optimize.enabled')) return;

View file

@ -21,11 +21,11 @@ module.exports = async (kbnServer, server, config) => {
*/
switch (process.env.kbnWorkerType) {
case 'optmzr':
await kbnServer.mixin(require('./optmzrRole'));
await kbnServer.mixin(require('./optmzr_role'));
break;
case 'server':
await kbnServer.mixin(require('./proxyRole'));
await kbnServer.mixin(require('./proxy_role'));
break;
default:

View file

@ -1,7 +1,7 @@
import Boom from 'boom';
import BaseOptimizer from '../BaseOptimizer';
import WeirdControlFlow from './WeirdControlFlow';
import BaseOptimizer from '../base_optimizer';
import WeirdControlFlow from './weird_control_flow';
import { once, pick, size } from 'lodash';
import { join } from 'path';

View file

@ -1,6 +1,6 @@
import LazyServer from './LazyServer';
import LazyOptimizer from './LazyOptimizer';
import fromRoot from '../../utils/fromRoot';
import LazyServer from './lazy_server';
import LazyOptimizer from './lazy_optimizer';
import fromRoot from '../../utils/from_root';
export default async (kbnServer, kibanaHapiServer, config) => {
let server = new LazyServer(

View file

@ -1,9 +1,9 @@
module.exports = (kibana) => {
export default (kibana) => {
if (!kibana.config.get('env.dev')) return;
return new kibana.Plugin({
uiExports: {
spyModes: [
'plugins/devMode/visDebugSpyPanel'
'plugins/dev_mode/vis_debug_spy_panel'
]
}
});

View file

@ -1,4 +1,4 @@
{
"name": "devMode",
"name": "dev_mode",
"version": "1.0.0"
}

View file

@ -1,4 +1,4 @@
import visDebugSpyPanelTemplate from 'plugins/devMode/visDebugSpyPanel.html';
import visDebugSpyPanelTemplate from 'plugins/dev_mode/vis_debug_spy_panel.html';
// register the spy mode or it won't show up in the spys
require('ui/registry/spy_modes').register(VisDetailsSpyProvider);

View file

@ -33,6 +33,16 @@ module.exports = function ({ Plugin }) {
}).default();
},
uiExports: {
injectDefaultVars(server, options) {
return {
esRequestTimeout: options.requestTimeout,
esShardTimeout: options.shardTimeout,
esApiVersion: options.apiVersion,
};
}
},
init(server, options) {
const kibanaIndex = server.config().get('kibana.index');
@ -54,7 +64,7 @@ module.exports = function ({ Plugin }) {
return reply.continue();
}
function noCreateIndex({ path }, reply) {
function noDirectIndex({ path }, reply) {
const requestPath = trimRight(trim(path), '/');
const matchPath = createPath(kibanaIndex);
@ -75,7 +85,7 @@ module.exports = function ({ Plugin }) {
['PUT', 'POST', 'DELETE'],
`/${kibanaIndex}/{paths*}`,
{
pre: [ noCreateIndex, noBulkCheck ]
pre: [ noDirectIndex, noBulkCheck ]
}
);

View file

@ -1,7 +1,9 @@
import _ from 'lodash';
import Promise from 'bluebird';
import sinon from 'sinon';
import url from 'url';
import serverConfig from '../../../../../test/server_config';
import checkEsVersion from '../check_es_version';
describe('plugins/elasticsearch', function () {
@ -23,7 +25,7 @@ describe('plugins/elasticsearch', function () {
status: {
red: sinon.stub()
},
url: 'http://localhost:9210'
url: url.format(serverConfig.servers.elasticsearch)
}
}
};

View file

@ -1,9 +1,15 @@
import Promise from 'bluebird';
import sinon from 'sinon';
import expect from 'expect.js';
import url from 'url';
const NoConnections = require('elasticsearch').errors.NoConnections;
import healthCheck from '../health_check';
import serverConfig from '../../../../../test/server_config';
const esPort = serverConfig.servers.elasticsearch.port;
const esUrl = url.format(serverConfig.servers.elasticsearch);
describe('plugins/elasticsearch', function () {
describe('lib/health_check', function () {
@ -39,7 +45,7 @@ describe('plugins/elasticsearch', function () {
nodes: {
'node-01': {
version: '1.5.0',
http_address: 'inet[/127.0.0.1:9210]',
http_address: `inet[/127.0.0.1:${esPort}]`,
ip: '127.0.0.1'
}
}
@ -73,7 +79,7 @@ describe('plugins/elasticsearch', function () {
it('should set the cluster red if the ping fails, then to green', function () {
get.withArgs('elasticsearch.url').returns('http://localhost:9210');
get.withArgs('elasticsearch.url').returns(esUrl);
get.withArgs('elasticsearch.engineVersion').returns('^1.4.4');
get.withArgs('kibana.index').returns('.my-kibana');
client.ping.onCall(0).returns(Promise.reject(new NoConnections()));
@ -85,7 +91,7 @@ describe('plugins/elasticsearch', function () {
expect(plugin.status.yellow.args[0][0]).to.be('Waiting for Elasticsearch');
sinon.assert.calledOnce(plugin.status.red);
expect(plugin.status.red.args[0][0]).to.be(
'Unable to connect to Elasticsearch at http://localhost:9210.'
`Unable to connect to Elasticsearch at ${esUrl}.`
);
sinon.assert.calledTwice(client.ping);
sinon.assert.calledOnce(client.nodes.info);
@ -97,7 +103,7 @@ describe('plugins/elasticsearch', function () {
});
it('should set the cluster red if the health check status is red, then to green', function () {
get.withArgs('elasticsearch.url').returns('http://localhost:9210');
get.withArgs('elasticsearch.url').returns(esUrl);
get.withArgs('elasticsearch.engineVersion').returns('^1.4.4');
get.withArgs('kibana.index').returns('.my-kibana');
client.ping.returns(Promise.resolve());
@ -120,7 +126,7 @@ describe('plugins/elasticsearch', function () {
});
it('should set the cluster yellow if the health check timed_out and create index', function () {
get.withArgs('elasticsearch.url').returns('http://localhost:9210');
get.withArgs('elasticsearch.url').returns(esUrl);
get.withArgs('elasticsearch.engineVersion').returns('^1.4.4');
get.withArgs('kibana.index').returns('.my-kibana');
client.ping.returns(Promise.resolve());

View file

@ -3,11 +3,11 @@ import expect from 'expect.js';
import sinon from 'sinon';
import isUpgradeable from '../is_upgradeable';
import pkg from '../../../../utils/packageJson';
import pkg from '../../../../utils/package_json';
let version = pkg.version;
describe('plugins/elasticsearch', function () {
describe('lib/isUpgradeable', function () {
describe('lib/is_upgradeable', function () {
let server = {
config: _.constant({
get: function (key) {

View file

@ -1,9 +1,8 @@
import expect from 'expect.js';
import util from 'util';
import { format } from 'util';
import * as kbnTestServer from '../../../../../test/utils/kbn_server';
const format = util.format;
import fromRoot from '../../../../utils/from_root';
describe('plugins/elasticsearch', function () {
describe('routes', function () {
@ -13,7 +12,13 @@ describe('plugins/elasticsearch', function () {
before(function () {
this.timeout(60000); // sometimes waiting for server takes longer than 10
kbnServer = kbnTestServer.createServer();
kbnServer = kbnTestServer.createServer({
plugins: {
scanDirs: [
fromRoot('src/plugins')
]
}
});
return kbnServer.ready()
.then(() => kbnServer.server.plugins.elasticsearch.waitUntilReady());
});

View file

@ -1,5 +1,7 @@
import SetupError from './setup_error';
import { format } from 'util';
import { mappings } from './kibana_index_mappings';
module.exports = function (server) {
const client = server.plugins.elasticsearch.client;
const index = server.config().get('kibana.index');
@ -16,16 +18,7 @@ module.exports = function (server) {
settings: {
number_of_shards: 1
},
mappings: {
config: {
properties: {
buildNum: {
type: 'string',
index: 'not_analyzed'
}
}
}
}
mappings
}
})
.catch(handleError('Unable to create Kibana index "<%= kibana.index %>"'))

View file

@ -9,6 +9,19 @@ import callWithRequest from './call_with_request';
module.exports = function (server) {
const config = server.config();
class ElasticsearchClientLogging {
error(err) {
server.log(['error', 'elasticsearch'], err);
}
warning(message) {
server.log(['warning', 'elasticsearch'], message);
}
info() {}
debug() {}
trace() {}
close() {}
}
function createClient(options) {
options = _.defaults(options || {}, {
url: config.get('elasticsearch.url'),
@ -52,18 +65,7 @@ module.exports = function (server) {
defer: function () {
return Bluebird.defer();
},
log: function () {
this.error = function (err) {
server.log(['error', 'elasticsearch'], err);
};
this.warning = function (message) {
server.log(['warning', 'elasticsearch'], message);
};
this.info = _.noop;
this.debug = _.noop;
this.trace = _.noop;
this.close = _.noop;
}
log: ElasticsearchClientLogging
});
}
@ -73,6 +75,7 @@ module.exports = function (server) {
const noAuthClient = createClient({ auth: false });
server.on('close', _.bindKey(noAuthClient, 'close'));
server.expose('ElasticsearchClientLogging', ElasticsearchClientLogging);
server.expose('client', client);
server.expose('createClient', createClient);
server.expose('callWithRequestFactory', callWithRequest);

View file

@ -1,4 +1,4 @@
module.exports = function getBasicAuthRealm(message) {
export default function getBasicAuthRealm(message) {
if (!message || typeof message !== 'string') return null;
const parts = message.match(/Basic\ realm=\\"(.*)\\"/);

View file

@ -0,0 +1,10 @@
export const mappings = {
config: {
properties: {
buildNum: {
type: 'string',
index: 'not_analyzed'
}
}
}
};

View file

@ -1,4 +1,5 @@
import upgrade from './upgrade_config';
import { mappings } from './kibana_index_mappings';
module.exports = function (server) {
const config = server.config();
@ -8,11 +9,16 @@ module.exports = function (server) {
type: 'config',
body: {
size: 1000,
sort: [ { buildNum: { order: 'desc', ignore_unmapped: true } } ]
sort: [
{
buildNum: {
order: 'desc',
unmapped_type: mappings.config.properties.buildNum.type
}
}
]
}
};
return client.search(options).then(upgrade(server));
};

View file

@ -1,4 +1,4 @@
module.exports = function (kibana) {
export default function (kibana) {
return new kibana.Plugin({

View file

@ -2,7 +2,7 @@ import angular from 'angular';
import _ from 'lodash';
import sinon from 'auto-release-sinon';
import expect from 'expect.js';
import ngMock from 'ngMock';
import ngMock from 'ng_mock';
import $ from 'jquery';
import 'ui/render_directive';
import 'plugins/kbn_doc_views/views/table';

View file

@ -1,4 +1,4 @@
module.exports = function (kibana) {
export default function (kibana) {
return new kibana.Plugin({

View file

@ -1,5 +1,5 @@
import VislibVisTypeVislibVisTypeProvider from 'ui/vislib_vis_type/VislibVisType';
import VisSchemasProvider from 'ui/Vis/Schemas';
import VislibVisTypeVislibVisTypeProvider from 'ui/vislib_vis_type/vislib_vis_type';
import VisSchemasProvider from 'ui/vis/schemas';
import areaTemplate from 'plugins/kbn_vislib_vis_types/editors/area.html';
export default function HistogramVisType(Private) {

View file

@ -1,5 +1,5 @@
import VislibVisTypeVislibVisTypeProvider from 'ui/vislib_vis_type/VislibVisType';
import VisSchemasProvider from 'ui/Vis/Schemas';
import VislibVisTypeVislibVisTypeProvider from 'ui/vislib_vis_type/vislib_vis_type';
import VisSchemasProvider from 'ui/vis/schemas';
import histogramTemplate from 'plugins/kbn_vislib_vis_types/editors/histogram.html';
export default function HistogramVisType(Private) {

View file

@ -3,4 +3,4 @@ visTypes.register(require('plugins/kbn_vislib_vis_types/histogram'));
visTypes.register(require('plugins/kbn_vislib_vis_types/line'));
visTypes.register(require('plugins/kbn_vislib_vis_types/pie'));
visTypes.register(require('plugins/kbn_vislib_vis_types/area'));
visTypes.register(require('plugins/kbn_vislib_vis_types/tileMap'));
visTypes.register(require('plugins/kbn_vislib_vis_types/tile_map'));

View file

@ -1,5 +1,5 @@
import VislibVisTypeVislibVisTypeProvider from 'ui/vislib_vis_type/VislibVisType';
import VisSchemasProvider from 'ui/Vis/Schemas';
import VislibVisTypeVislibVisTypeProvider from 'ui/vislib_vis_type/vislib_vis_type';
import VisSchemasProvider from 'ui/vis/schemas';
import lineTemplate from 'plugins/kbn_vislib_vis_types/editors/line.html';
export default function HistogramVisType(Private) {

View file

@ -1,5 +1,5 @@
import VislibVisTypeVislibVisTypeProvider from 'ui/vislib_vis_type/VislibVisType';
import VisSchemasProvider from 'ui/Vis/Schemas';
import VislibVisTypeVislibVisTypeProvider from 'ui/vislib_vis_type/vislib_vis_type';
import VisSchemasProvider from 'ui/vis/schemas';
import pieTemplate from 'plugins/kbn_vislib_vis_types/editors/pie.html';
export default function HistogramVisType(Private) {

View file

@ -1,7 +1,7 @@
import _ from 'lodash';
import supports from 'ui/utils/supports';
import VislibVisTypeVislibVisTypeProvider from 'ui/vislib_vis_type/VislibVisType';
import VisSchemasProvider from 'ui/Vis/Schemas';
import VislibVisTypeVislibVisTypeProvider from 'ui/vislib_vis_type/vislib_vis_type';
import VisSchemasProvider from 'ui/vis/schemas';
import AggResponseGeoJsonGeoJsonProvider from 'ui/agg_response/geo_json/geo_json';
import FilterBarPushFilterProvider from 'ui/filter_bar/push_filter';
import tileMapTemplate from 'plugins/kbn_vislib_vis_types/editors/tile_map.html';

View file

@ -1,8 +1,9 @@
import ingest from './server/routes/api/ingest';
import search from './server/routes/api/search';
module.exports = function (kibana) {
return new kibana.Plugin({
id: 'kibana',
config: function (Joi) {
return Joi.object({
enabled: Joi.boolean().default(true),
@ -13,7 +14,9 @@ module.exports = function (kibana) {
uiExports: {
app: {
id: 'kibana',
title: 'Kibana',
listed: false,
description: 'the kibana you know and love',
//icon: 'plugins/kibana/settings/sections/about/barcode.svg',
main: 'plugins/kibana/kibana',
@ -32,12 +35,49 @@ module.exports = function (kibana) {
return {
kbnDefaultAppId: config.get('kibana.defaultAppId')
};
},
},
links: [
{
title: 'Discover',
order: -1003,
url: '/app/kibana#/discover',
description: 'interactively explore your data',
icon: 'plugins/kibana/assets/discover.svg',
},
{
title: 'Visualize',
order: -1002,
url: '/app/kibana#/visualize',
description: 'design data visualizations',
icon: 'plugins/kibana/assets/visualize.svg',
},
{
title: 'Dashboard',
order: -1001,
url: '/app/kibana#/dashboard',
description: 'compose visualizations for much win',
icon: 'plugins/kibana/assets/dashboard.svg',
},
{
title: 'Settings',
order: 1000,
url: '/app/kibana#/settings',
description: 'define index patterns, change config, and more',
icon: 'plugins/kibana/assets/settings.svg',
}
}
],
injectDefaultVars(server, options) {
return {
kbnIndex: options.index
};
},
},
init: function (server, options) {
ingest(server);
search(server);
}
});

View file

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8">
<path d="M4 0c-2.2 0-4 1.8-4 4s1.8 4 4 4 4-1.8 4-4-1.8-4-4-4zm0 1c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 1c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm-1.66 1a.5.5 0 0 0-.19.84l.91.91c-.02.08-.06.16-.06.25 0 .55.45 1 1 1s1-.45 1-1-.45-1-1-1c-.09 0-.17.04-.25.06l-.91-.91a.5.5 0 0 0-.44-.16.5.5 0 0 0-.06 0zm3.16 0c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5z"
/>
</svg>

After

Width:  |  Height:  |  Size: 486 B

View file

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8">
<path d="M4 0c-2.2 0-4 1.8-4 4s1.8 4 4 4 4-1.8 4-4-1.8-4-4-4zm0 1c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm2 1l-3 1-1 3 3-1 1-3zm-2 1.5c.28 0 .5.22.5.5s-.22.5-.5.5-.5-.22-.5-.5.22-.5.5-.5z" />
</svg>

After

Width:  |  Height:  |  Size: 293 B

View file

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8">
<path d="M3 0v1h4v5h-4v1h5v-7h-5zm-1 2l-2 1.5 2 1.5v-1h4v-1h-4v-1z" />
</svg>

After

Width:  |  Height:  |  Size: 159 B

View file

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8">
<path d="M3.5 0c-1.93 0-3.5 1.57-3.5 3.5s1.57 3.5 3.5 3.5c.59 0 1.17-.14 1.66-.41a1 1 0 0 0 .13.13l1 1a1.02 1.02 0 1 0 1.44-1.44l-1-1a1 1 0 0 0-.16-.13c.27-.49.44-1.06.44-1.66 0-1.93-1.57-3.5-3.5-3.5zm0 1c1.39 0 2.5 1.11 2.5 2.5 0 .66-.24 1.27-.66 1.72-.01.01-.02.02-.03.03a1 1 0 0 0-.13.13c-.44.4-1.04.63-1.69.63-1.39 0-2.5-1.11-2.5-2.5s1.11-2.5 2.5-2.5z"
/>
</svg>

After

Width:  |  Height:  |  Size: 450 B

View file

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8">
<path d="M3.5 0l-.5 1.19c-.1.03-.19.08-.28.13l-1.19-.5-.72.72.5 1.19c-.05.1-.09.18-.13.28l-1.19.5v1l1.19.5c.04.1.08.18.13.28l-.5 1.19.72.72 1.19-.5c.09.04.18.09.28.13l.5 1.19h1l.5-1.19c.09-.04.19-.08.28-.13l1.19.5.72-.72-.5-1.19c.04-.09.09-.19.13-.28l1.19-.5v-1l-1.19-.5c-.03-.09-.08-.19-.13-.28l.5-1.19-.72-.72-1.19.5c-.09-.04-.19-.09-.28-.13l-.5-1.19h-1zm.5 2.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5-1.5-.67-1.5-1.5.67-1.5 1.5-1.5z"
/>
</svg>

After

Width:  |  Height:  |  Size: 528 B

View file

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8">
<path d="M0 0v7h8v-1h-7v-6h-1zm5 0v5h2v-5h-2zm-3 2v3h2v-3h-2z" />
</svg>

After

Width:  |  Height:  |  Size: 154 B

View file

@ -1,18 +1,15 @@
<div class="panel panel-default" ng-switch on="panel.type" ng-if="savedObj || error">
<div class="panel-heading">
<span class="panel-title" title="{{::savedObj.title}}">
<i
class="fa"
ng-class="savedObj.vis.type.icon"
aria-label="{{::savedObj.vis.type.title}} Icon"
title="{{::savedObj.vis.type.title}}">
</i>
{{::savedObj.title}}
</span>
<div class="btn-group">
<a aria-label="Edit" ng-show="chrome.getVisible() && editUrl" ng-href="{{::editUrl}}">
<i aria-hidden="true" class="fa fa-pencil"></i>
</a>
<a aria-label="Move" ng-show="chrome.getVisible()" class="panel-move">
<i aria-hidden="true" class="fa fa-arrows"></i>
</a>
<a aria-label="Remove" ng-show="chrome.getVisible()" ng-click="remove()">
<i aria-hidden="true" class="fa fa-times"></i>
</a>

View file

@ -1,6 +1,6 @@
import _ from 'lodash';
import $ from 'jquery';
import Binder from 'ui/Binder';
import Binder from 'ui/binder';
import 'gridster';
import uiModules from 'ui/modules';
@ -27,7 +27,7 @@ app.directive('dashboardGrid', function ($compile, Notifier) {
// number of columns to render
const COLS = 12;
// number of pixed between each column/row
const SPACER = 10;
const SPACER = 0;
// pixels used by all of the spacers (gridster puts have a spacer on the ends)
const spacerSize = SPACER * COLS;
@ -46,7 +46,7 @@ app.directive('dashboardGrid', function ($compile, Notifier) {
stop: readGridsterChangeHandler
},
draggable: {
handle: '.panel-heading, .panel-title',
handle: '.panel-move, .fa-arrows',
stop: readGridsterChangeHandler
}
}).data('gridster');
@ -232,4 +232,3 @@ app.directive('dashboardGrid', function ($compile, Notifier) {
}
};
});

View file

@ -1,7 +1,62 @@
<div dashboard-app class="app-container dashboard-container">
<navbar ng-show="chrome.getVisible()" name="dashboard">
<span class="name" ng-if="dash.id" ng-bind="::dash.title" tooltip="{{::dash.title}}"></span>
<navbar name="dashboard-options" class="kibana-nav-options">
<div class="kibana-nav-info">
<span ng-show="dash.id" class="kibana-nav-info-title">
<span ng-bind="::dash.title"></span>
</span>
</div>
<div class="button-group kibana-nav-actions" role="toolbar">
<button ng-click="newDashboard()"
aria-label="New Dashboard">
<span>New</span>
</button>
<button
aria-label="Save Dashboard"
aria-haspopup="false"
aria-expanded="{{ configTemplate.is('save') }}"
ng-class="{active: configTemplate.is('save')}"
ng-click="configTemplate.toggle('save');">
<span>Save</span>
</button>
<button
aria-label="Load Saved Dashboard"
aria-haspopup="false"
aria-expanded="{{ configTemplate.is('load') }}"
ng-class="{active: configTemplate.is('load')}"
ng-click="configTemplate.toggle('load');">
<span>Open</span>
</button>
<button
aria-label="Share Dashboard"
aria-haspopup="false"
aria-expanded="{{ configTemplate.is('share') }}"
ng-class="{active: configTemplate.is('share')}"
ng-click="configTemplate.toggle('share');">
<span>Share</span>
</button>
<button
aria-label="Add Visualization"
aria-haspopup="false"
aria-expanded="{{ configTemplate.is('pickVis') }}"
ng-class="{active: configTemplate.is('pickVis')}"
ng-click="configTemplate.toggle('pickVis');">
<span>Add visualization</span>
</button>
<button
aria-label="Options"
aria-haspopup="false"
aria-expanded="{{ configTemplate.is('options') }}"
ng-class="{active: configTemplate.is('options')}"
ng-click="configTemplate.toggle('options');">
<span>Options</span>
</button>
<div class="chrome-actions"kbn-chrome-append-nav-controls></div>
</div>
</navbar>
<config config-template="configTemplate" config-object="opts"></config>
<navbar ng-show="chrome.getVisible()" name="dashboard-search">
<form name="queryInput"
class="fill inline-form"
ng-submit="filterResults()"
@ -29,66 +84,9 @@
</div>
</form>
<div class="button-group" role="toolbar">
<kbn-tooltip text="New Dashboard" placement="bottom" append-to-body="1">
<button ng-click="newDashboard()" aria-label="New Dashboard"><i aria-hidden="true" class="fa fa-file-new-o"></i></button>
</kbn-tooltip>
<kbn-tooltip text="Save Dashboard" placement="bottom" append-to-body="1">
<button
aria-label="Save Dashboard"
aria-haspopup="true"
aria-expanded="{{ configTemplate.is('save') }}"
ng-class="{active: configTemplate.is('save')}"
ng-click="configTemplate.toggle('save');">
<i aria-hidden="true" class="fa fa-save"></i>
</button>
</kbn-tooltip>
<kbn-tooltip text="Load Saved Dashboard" placement="bottom" append-to-body="1">
<button
aria-label="Load Saved Dashboard"
aria-haspopup="true"
aria-expanded="{{ configTemplate.is('load') }}"
ng-class="{active: configTemplate.is('load')}"
ng-click="configTemplate.toggle('load');">
<i aria-hidden="true" class="fa fa-folder-open-o"></i>
</button>
</kbn-tooltip>
<kbn-tooltip text="Share" placement="bottom" append-to-body="1">
<button
aria-label="Share Dashboard"
aria-haspopup="true"
aria-expanded="{{ configTemplate.is('share') }}"
ng-class="{active: configTemplate.is('share')}"
ng-click="configTemplate.toggle('share');">
<i aria-hidden="true" class="fa fa-external-link"></i>
</button>
</kbn-tooltip>
<kbn-tooltip text="Add Visualization" placement="bottom" append-to-body="1">
<button
aria-label="Add Visualization"
aria-haspopup="true"
aria-expanded="{{ configTemplate.is('pickVis') }}"
ng-class="{active: configTemplate.is('pickVis')}"
ng-click="configTemplate.toggle('pickVis');">
<i aria-hidden="true" class="fa fa-plus-circle"></i>
</button>
</kbn-tooltip>
<kbn-tooltip text="Options" placement="bottom" append-to-body="1">
<button
aria-label="Options"
aria-haspopup="true"
aria-expanded="{{ configTemplate.is('options') }}"
ng-class="{active: configTemplate.is('options')}"
ng-click="configTemplate.toggle('options');">
<i aria-hidden="true" class="fa fa-gear"></i>
</button>
</kbn-tooltip>
</div>
<div class="button-group"></div>
</navbar>
<config config-template="configTemplate" config-object="opts"></config>
<filter-bar state="state"></filter-bar>
<div ng-show="!state.panels.length" class="text-center start-screen">

View file

@ -1,7 +1,7 @@
import _ from 'lodash';
import $ from 'jquery';
import angular from 'angular';
import ConfigTemplate from 'ui/ConfigTemplate';
import ConfigTemplate from 'ui/config_template';
import chrome from 'ui/chrome';
import 'ui/directives/config';
import 'ui/courier';
@ -105,7 +105,9 @@ app.directive('dashboardApp', function (Notifier, courier, AppState, timefilter,
load: require('plugins/kibana/dashboard/partials/load_dashboard.html'),
share: require('plugins/kibana/dashboard/partials/share.html'),
pickVis: require('plugins/kibana/dashboard/partials/pick_visualization.html'),
options: require('plugins/kibana/dashboard/partials/options.html')
options: require('plugins/kibana/dashboard/partials/options.html'),
filter: require('ui/chrome/config/filter.html'),
interval: require('ui/chrome/config/interval.html')
});
$scope.refresh = _.bindKey(courier, 'fetch');
@ -239,7 +241,8 @@ app.directive('dashboardApp', function (Notifier, courier, AppState, timefilter,
ui: $state.options,
save: $scope.save,
addVis: $scope.addVis,
addSearch: $scope.addSearch
addSearch: $scope.addSearch,
timefilter: $scope.timefilter
};
init();

View file

@ -33,6 +33,24 @@ dashboard-grid {
width: 25px;
}
.gs-w {
border: 2px dashed transparent;
&:hover {
border-color: @kibanaGray4;
dashboard-panel {
.visualize-show-spy {
visibility: visible;
}
.panel .panel-heading .btn-group {
display: block !important;
}
}
}
}
i.remove {
cursor: pointer;
}
@ -55,15 +73,23 @@ dashboard-grid {
display: flex;
flex-direction: column;
justify-content: flex-start;
border: 0 solid transparent;
.panel-heading {
padding: 0px 0px 0px 5px;
flex: 0 0 auto;
white-space: nowrap;
display: flex;
border-top-right-radius: 0;
border-top-left-radius: 0;
background-color: @white;
border: none;
div.btn-group {
.btn-group {
a {
color: inherit;
}
display: none;
white-space: nowrap;
flex: 0 0 auto;
}
@ -85,6 +111,10 @@ dashboard-grid {
}
}
.panel-move:hover {
cursor: move;
}
a {
color: @dashboard-panel-heading-link-color;
border: none;
@ -96,6 +126,10 @@ dashboard-grid {
}
}
.visualize-show-spy {
visibility: hidden;
}
.load-error {
text-align: center;
font-size: 1em;
@ -119,10 +153,6 @@ dashboard-grid {
}
}
.dashboard-panel-picker > li.list-group-item {
border-top: 0px;
}
.dashboard-load {
margin: 10px;
.dashboard-panel-picker > .list-group-item {
border-top: 0;
}

View file

@ -2,7 +2,7 @@
import angular from 'angular';
import _ from 'lodash';
import sinon from 'auto-release-sinon';
import ngMock from 'ngMock';
import ngMock from 'ng_mock';
import expect from 'expect.js';
import $ from 'jquery';
import 'ui/private';

View file

@ -1,6 +1,6 @@
import _ from 'lodash';
import ngMock from 'ngMock';
import ngMock from 'ng_mock';
import fieldCalculator from 'plugins/kibana/discover/components/field_chooser/lib/field_calculator';
import expect from 'expect.js';
import 'ui/private';

View file

@ -1,6 +1,6 @@
import angular from 'angular';
import ngMock from 'ngMock';
import ngMock from 'ng_mock';
import _ from 'lodash';
import sinon from 'auto-release-sinon';
import expect from 'expect.js';

View file

@ -1,6 +1,6 @@
import _ from 'lodash';
import ngMock from 'ngMock';
import ngMock from 'ng_mock';
import expect from 'expect.js';
import PluginsKibanaDiscoverHitSortFnProvider from 'plugins/kibana/discover/_hit_sort_fn';

View file

@ -64,7 +64,6 @@ app.directive('discoverField', function ($compile) {
$scope.toggle(field.name);
if (field.display) $scope.increaseFieldCounter(field);
// we are now displaying the field, kill its details
if (field.details) {
$scope.toggleDetails(field);
}
@ -80,10 +79,11 @@ app.directive('discoverField', function ($compile) {
detailsElem = $(detailsHtml);
$compile(detailsElem)(detailScope);
$elem.append(detailsElem);
$elem.append(detailsElem).addClass('active');
} else {
delete field.details;
detailsElem.remove();
$elem.removeClass('active');
}
};

View file

@ -1,6 +1,7 @@
<div class="sidebar-list">
<div ng-show="indexPatternList.length > 1">
<div class="index-pattern" ng-click="showIndexPatternSelection = !showIndexPatternSelection">
<div class="index-pattern" ng-click="showIndexPatternSelection = !showIndexPatternSelection"
ng-class="{active: showIndexPatternSelection === true}">
<div css-truncate title="{{indexPattern.id}}">{{indexPattern.id}}</div>
<i ng-hide="showIndexPatternSelection" class="fa fa-caret-down"></i>
<i ng-show="showIndexPatternSelection" class="fa fa-caret-up"></i>

View file

@ -3,8 +3,15 @@
<h5 ng-show="!field.details.error">Quick Count <kbn-info info="Top 5 values based on documents in the table" placement="right"></kbn-info>
<span ng-if="!field.details.error" class="small discover-field-details-count">
(
<a ng-show="field.indexed" ng-click="updateFilterInQuery('_exists_', field.name, '+')">{{::field.details.exists}}</a>
<span ng-show="!field.indexed">{{::field.details.exists}}</span>
<a
ng-show="!indexPattern.metaFields.includes(field.name)"
ng-click="updateFilterInQuery('_exists_', field.name, '+')">
{{::field.details.exists}}
</a>
<span
ng-show="indexPattern.metaFields.includes(field.name)">
{{::field.details.exists}}
</span>
/{{::field.details.total}} records
)
</span>

View file

@ -1,14 +1,14 @@
import _ from 'lodash';
import angular from 'angular';
import moment from 'moment';
import ConfigTemplate from 'ui/ConfigTemplate';
import ConfigTemplate from 'ui/config_template';
import getSort from 'ui/doc_table/lib/get_sort';
import rison from 'ui/utils/rison';
import dateMath from 'ui/utils/dateMath';
import dateMath from 'ui/utils/date_math';
import 'ui/doc_table';
import 'ui/visualize';
import 'ui/notify';
import 'ui/fixedScroll';
import 'ui/fixed_scroll';
import 'ui/directives/validate_json';
import 'ui/filters/moment';
import 'ui/courier';
@ -17,7 +17,7 @@ import 'ui/state_management/app_state';
import 'ui/timefilter';
import 'ui/highlight/highlight_tags';
import 'ui/share';
import VisProvider from 'ui/Vis';
import VisProvider from 'ui/vis';
import DocTitleProvider from 'ui/doc_title';
import UtilsBrushEventProvider from 'ui/utils/brush_event';
import PluginsKibanaDiscoverHitSortFnProvider from 'plugins/kibana/discover/_hit_sort_fn';
@ -96,16 +96,17 @@ app.controller('discover', function ($scope, config, courier, $route, $window, N
$scope.toggleInterval = function () {
$scope.showInterval = !$scope.showInterval;
};
// config panel templates
$scope.configTemplate = new ConfigTemplate({
load: require('plugins/kibana/discover/partials/load_search.html'),
save: require('plugins/kibana/discover/partials/save_search.html'),
share: require('plugins/kibana/discover/partials/share_search.html')
share: require('plugins/kibana/discover/partials/share_search.html'),
filter: require('ui/chrome/config/filter.html'),
interval: require('ui/chrome/config/interval.html')
});
$scope.timefilter = timefilter;
// the saved savedSearch
const savedSearch = $route.current.locals.savedSearch;
$scope.$on('$destroy', savedSearch.destroy);
@ -147,7 +148,8 @@ app.controller('discover', function ($scope, config, courier, $route, $window, N
index: $scope.indexPattern.id,
timefield: $scope.indexPattern.timeFieldName,
savedSearch: savedSearch,
indexPatternList: $route.current.locals.ip.list
indexPatternList: $route.current.locals.ip.list,
timefilter: $scope.timefilter
};
const init = _.once(function () {

View file

@ -17,7 +17,7 @@ uiModules
const init = function () {
// This elem should already have a height/width
const myChart = new vislib.Chart(elem[0], {
addLegend: false
});
$scope.$watch('data', function (data) {

View file

@ -1,5 +1,53 @@
<div ng-controller="discover" class="app-container">
<navbar name="discover">
<navbar name="discover-options" class="kibana-nav-options">
<div class="kibana-nav-info">
<span ng-show="opts.savedSearch.id" class="kibana-nav-info-title">
<span ng-bind="::opts.savedSearch.title"></span>
<i aria-label="Reload Saved Search" tooltip="Reload Saved Search" ng-click="resetQuery();" class="fa fa-undo small"></i>
</span>
<strong class="discover-info-hits">{{(hits || 0) | number:0}}</strong>
<ng-pluralize count="hits" when="{'1':'hit', 'other':'hits'}"></ng-pluralize>
</div>
<div class="kibana-nav-actions button-group" role="toolbar">
<button
ng-click="newQuery()"
aria-label="New Search">
<span>New</span>
</button>
<button
ng-click="configTemplate.toggle('save');"
ng-class="{active: configTemplate.is('save')}"
aria-haspopup="false"
aria-expanded="{{ configTemplate.is('save') }}"
aria-label="Save Search">
<span>Save</span>
</button>
<button
aria-haspopup="false"
aria-expanded="{{ configTemplate.is('load') }}"
ng-click="configTemplate.toggle('load');"
ng-class="{active: configTemplate.is('load')}"
aria-label="Load Saved Search">
<span>Open</span>
</button>
<button
aria-label="Share Search"
aria-haspopup="false"
aria-expanded="{{ configTemplate.is('share') }}"
ng-class="{active: configTemplate.is('share')}"
ng-click="configTemplate.toggle('share');">
<span>Share</span>
</button>
<div class="chrome-actions" kbn-chrome-append-nav-controls></div>
</div>
</navbar>
<config
config-template="configTemplate"
config-object="opts"
config-close="configClose"
></config>
<navbar name="discover-search">
<form role="form" class="fill inline-form" ng-submit="fetch()" name="discoverSearch">
<div class="typeahead" kbn-typeahead="discover">
<div class="input-group"
@ -21,49 +69,9 @@
<kbn-typeahead-items></kbn-typeahead-items>
</div>
</form>
<div class="button-group" role="toolbar">
<kbn-tooltip text="New Search" placement="bottom" append-to-body="1">
<button
ng-click="newQuery()"
aria-label="New Search">
<i aria-hidden="true" class="fa fa-file-new-o"></i>
</button>
</kbn-tooltip>
<kbn-tooltip text="Save Search" placement="bottom" append-to-body="1">
<button
ng-click="configTemplate.toggle('save');"
ng-class="{active: configTemplate.is('save')}"
aria-haspopup="true"
aria-expanded="{{ configTemplate.is('save') }}"
aria-label="Save Search">
<i aria-hidden="true" class="fa fa-save"></i>
</button>
</kbn-tooltip>
<kbn-tooltip text="Load Saved Search" placement="bottom" append-to-body="1">
<button
aria-haspopup="true"
aria-expanded="{{ configTemplate.is('load') }}"
ng-click="configTemplate.toggle('load');"
ng-class="{active: configTemplate.is('load')}"
aria-label="Load Saved Search">
<i aria-hidden="true" class="fa fa-folder-open-o"></i>
</button>
</kbn-tooltip>
<kbn-tooltip text="Share" placement="bottom" append-to-body="1">
<button
aria-label="Share Search"
aria-haspopup="true"
aria-expanded="{{ configTemplate.is('share') }}"
ng-class="{active: configTemplate.is('share')}"
ng-click="configTemplate.toggle('share');">
<i aria-hidden="true" class="fa fa-external-link"></i>
</button>
</kbn-tooltip>
</div>
<div class="button-group" role="toolbar"></div>
</navbar>
<config config-template="configTemplate" config-object="opts" config-close="configClose"></config>
<div class="container-fluid" role="main">
<div class="row">
@ -84,17 +92,6 @@
</div>
<div class="discover-wrapper col-md-10">
<div class="discover-info">
<span ng-show="opts.savedSearch.id" class="discover-info-title">
<span ng-bind="::opts.savedSearch.title"></span>
<i aria-label="Reload Saved Search" tooltip="Reload Saved Search" ng-click="resetQuery();" class="fa fa-undo small"></i>
</span>
<strong class="discover-info-hits">{{(hits || 0) | number:0}}</strong>
<ng-pluralize count="hits" when="{'1':'hit', 'other':'hits'}"></ng-pluralize>
</div>
<div class="discover-content">
<!-- no results -->
<div ng-show="resultState === 'none'">
@ -153,7 +150,6 @@
<div ng-show="resultState === 'loading'">
<div class="discover-overlay">
<h2>Searching</h2>
<div class="spinner large"></div>
<div ng-show="fetchStatus">{{fetchStatus.complete}}/{{fetchStatus.total}}</div>
</div>
</div>

View file

@ -29,6 +29,10 @@
height: 200px;
max-height: 600px;
.loading {
opacity: 1 !important;
}
&.only-spy {
height: auto;
@ -71,12 +75,10 @@
}
&-info {
background-color: @discover-info-bg;
float: right;
padding: 5px 10px;
line-height: 30px;
padding: 0px 10px;
border-bottom-left-radius: @border-radius-base;
text-align: right;
&-title {
font-weight: bold;
@ -245,6 +247,10 @@ disc-field-chooser {
}
}
.sidebar-item.active .sidebar-item-title {
background-color: @sidebar-active-bg;
color: @sidebar-active-color;
}
.sidebar-item-title {
position: relative;
}

View file

@ -1,5 +1,5 @@
// Load the kibana app dependencies.
import ngMock from 'ngMock';
import ngMock from 'ng_mock';
import expect from 'expect.js';
import 'plugins/kibana/doc/index';
import FixturesStubbedLogstashIndexPatternProvider from 'fixtures/stubbed_logstash_index_pattern';

View file

@ -28,36 +28,14 @@ routes
chrome
.setBrand({
'logo': 'url(' + kibanaLogoUrl + ') left no-repeat',
'smallLogo': 'url(' + kibanaLogoUrl + ') left no-repeat'
'logo': 'url(' + kibanaLogoUrl + ') 6px 10px / 140px 50px no-repeat #e8488b',
'smallLogo': 'url(' + kibanaLogoUrl + ') 6px 10px / 140px 50px no-repeat #e8488b'
})
.setNavBackground('#222222')
.setTabDefaults({
resetWhenActive: true,
lastUrlStore: window.sessionStore,
lastUrlStore: window.sessionStorage,
activeIndicatorColor: '#656a76'
})
.setTabs([
{
id: 'discover',
title: 'Discover'
},
{
id: 'visualize',
title: 'Visualize',
activeIndicatorColor: function () {
return (String(this.lastUrl).indexOf('/visualize/step/') === 0) ? 'white' : '#656a76';
}
},
{
id: 'dashboard',
title: 'Dashboard'
},
{
id: 'settings',
title: 'Settings'
}
])
.setRootController('kibana', function ($scope, $rootScope, courier, config) {
function setDefaultTimezone() {
moment.tz.setDefault(config.get('dateFormat:tz'));

View file

@ -1,6 +1,7 @@
<div class="app-container">
<nav class="navbar navbar-default navbar-static-top subnav" data-test-subj="settingsNav">
<div class="container-fluid">
<bread-crumbs></bread-crumbs>
<ul class="nav navbar-nav">
<li ng-repeat="section in sections" ng-class="section.class">
<a class="navbar-link" kbn-href="{{section.url}}" data-test-subj="{{section.name}}">{{section.display}}</a>

View file

@ -9,6 +9,7 @@ import 'ui/filters/start_from';
import 'ui/field_editor';
import 'plugins/kibana/settings/sections/indices/_indexed_fields';
import 'plugins/kibana/settings/sections/indices/_scripted_fields';
import 'ui/directives/bread_crumbs';
import registry from 'ui/registry/settings_sections';
import uiRoutes from 'ui/routes';
import uiModules from 'ui/modules';
@ -20,7 +21,7 @@ uiRoutes
redirectTo: '/settings/indices'
});
require('ui/index_patterns/routeSetup/loadDefault')({
require('ui/index_patterns/route_setup/load_default')({
notRequiredRe: /^\/settings\//,
whenMissingRedirectTo: '/settings/indices'
});

View file

@ -11,6 +11,10 @@ kbn-settings-objects-view {
display: block;
}
nav.navbar {
height: 70px;
}
.settings-nav {
text-transform: capitalize;
}
@ -19,6 +23,15 @@ li.kbn-settings-tab:first-letter {
text-transform: capitalize;
}
kbn-settings-app {
div.app-container {
div.container-fluid {
padding-left: 0;
padding-right: 0;
}
}
}
kbn-settings-objects {
form {
margin-bottom: @line-height-computed;
@ -93,6 +106,8 @@ kbn-settings-objects-view {
}
.advanced-settings {
overflow-x: scroll;
table {
width: 100%;

View file

@ -2,7 +2,7 @@
import angular from 'angular';
import _ from 'lodash';
import expect from 'expect.js';
import ngMock from 'ngMock';
import ngMock from 'ng_mock';
import $ from 'jquery';
import 'plugins/kibana/visualize/editor/agg';

View file

@ -6,7 +6,7 @@
aria-label="{{ editorOpen ? 'Close Editor' : 'Open Editor' }}"
ng-click="editorOpen = !editorOpen"
type="button"
class="btn btn-default btn-xs vis-editor-agg-header-toggle">
class="btn btn-primary btn-xs vis-editor-agg-header-toggle">
<i aria-hidden="true" ng-class="{ 'fa-caret-down': editorOpen, 'fa-caret-right': !editorOpen }" class="fa"></i>
</button>
@ -36,7 +36,7 @@
tooltip="Increase Priority"
tooltip-append-to-body="true"
type="button"
class="btn btn-xs btn-default">
class="btn btn-xs btn-primary">
<i aria-hidden="true" class="fa fa-caret-up"></i>
</button>
@ -49,7 +49,7 @@
tooltip="Decrease Priority"
tooltip-append-to-body="true"
type="button"
class="btn btn-xs btn-default">
class="btn btn-xs btn-primary">
<i aria-hidden="true" class="fa fa-caret-down"></i>
</button>

View file

@ -18,14 +18,14 @@
class="vis-editor-agg-wide-btn">
<div ng-if="!add.form">
<div class="vis-editor-agg-wide-btn-add" ng-if="groupName !== 'buckets' || !stats.count">
<i aria-hidden="true" class="fa fa-plus"></i> Add {{ groupName }}
<div class="btn btn-sm btn-primary" ng-if="groupName !== 'buckets' || !stats.count">
Add {{ groupName }}
</div>
<div class="vis-editor-agg-wide-btn-add" ng-if="groupName === 'buckets' && stats.count > 0">
<i aria-hidden="true" class="fa fa-code-fork"></i> Add sub-{{ groupName }}
<div class="btn btn-sm btn-primary" ng-if="groupName === 'buckets' && stats.count > 0">
Add sub-{{ groupName }}
</div>
</div>
<div class="vis-editor-agg-wide-btn-add" ng-if="add.form">
<div class="btn btn-sm btn-primary" ng-if="add.form">
Cancel
</div>
</div>
</div>

View file

@ -1,4 +1,4 @@
import VisAggConfigProvider from 'ui/Vis/AggConfig';
import VisAggConfigProvider from 'ui/vis/agg_config';
import uiModules from 'ui/modules';
import aggAddTemplate from 'plugins/kibana/visualize/editor/agg_add.html';

View file

@ -6,13 +6,6 @@
<div class="vis-editor-agg-group" ng-class="groupName">
<!-- wrapper needed for nesting-indicator -->
<div ng-repeat="agg in group" class="vis-editor-agg-wrapper">
<nesting-indicator
ng-if="groupName === 'buckets'"
item="agg"
index="$index"
list="group">
</nesting-indicator>
<!-- agg.html - controls for aggregation -->
<ng-form vis-editor-agg name="aggForm" class="vis-editor-agg"></ng-form>
</div>

Some files were not shown because too many files have changed in this diff Show more