Merge branch 'master' into check-plugin-version-on-startup
17
README.md
|
@ -14,13 +14,28 @@ Kibana is an open source ([Apache Licensed](https://github.com/elastic/kibana/bl
|
||||||
* Run `bin/kibana` on unix, or `bin\kibana.bat` on Windows.
|
* Run `bin/kibana` on unix, or `bin\kibana.bat` on Windows.
|
||||||
* Visit [http://localhost:5601](http://localhost:5601)
|
* Visit [http://localhost:5601](http://localhost:5601)
|
||||||
|
|
||||||
|
|
||||||
## Upgrade from previous version
|
## Upgrade from previous version
|
||||||
|
|
||||||
* Move any custom configurations in your old kibana.yml to your new one
|
* Move any custom configurations in your old kibana.yml to your new one
|
||||||
* Reinstall plugins
|
* Reinstall plugins
|
||||||
* Start or restart Kibana
|
* Start or restart Kibana
|
||||||
|
|
||||||
|
## Version compatibility with Elasticsearch
|
||||||
|
|
||||||
|
Ideally, you should be running Elasticsearch and Kibana with matching version numbers. If your Elasticsearch has an older version number or a newer _major_ number than Kibana, then Kibana will fail to run. If Elasticsearch has a newer minor or patch number than Kibana, then the Kibana Server will log a warning.
|
||||||
|
|
||||||
|
_Note: The version numbers below are only examples, meant to illustrate the relationships between different types of version numbers._
|
||||||
|
|
||||||
|
| Situation | Example Kibana version | Example ES version | Outcome |
|
||||||
|
| ------------------------- | -------------------------- |------------------- | ------- |
|
||||||
|
| Versions are the same. | 5.1.2 | 5.1.2 | 💚 OK |
|
||||||
|
| ES patch number is newer. | 5.1.__2__ | 5.1.__5__ | ⚠️ Logged warning |
|
||||||
|
| ES minor number is newer. | 5.__1__.2 | 5.__5__.0 | ⚠️ Logged warning |
|
||||||
|
| ES major number is newer. | __5__.1.2 | __6__.0.0 | 🚫 Fatal error |
|
||||||
|
| ES patch number is older. | 5.1.__2__ | 5.1.__0__ | 🚫 Fatal error |
|
||||||
|
| ES minor number is older. | 5.__1__.2 | 5.__0__.0 | 🚫 Fatal error |
|
||||||
|
| ES major number is older. | __5__.1.2 | __4__.0.0 | 🚫 Fatal error |
|
||||||
|
|
||||||
## Quick Start
|
## Quick Start
|
||||||
|
|
||||||
You're up and running! Fantastic! Kibana is now running on port 5601, so point your browser at http://YOURDOMAIN.com:5601.
|
You're up and running! Fantastic! Kibana is now running on port 5601, so point your browser at http://YOURDOMAIN.com:5601.
|
||||||
|
|
Before Width: | Height: | Size: 554 B After Width: | Height: | Size: 4.8 KiB |
Before Width: | Height: | Size: 589 B After Width: | Height: | Size: 4.9 KiB |
Before Width: | Height: | Size: 507 B After Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 125 KiB |
|
@ -14,6 +14,7 @@ to this Kibana instance.
|
||||||
`kibana.index:`:: *Default: ".kibana"* Kibana uses an index in Elasticsearch to store saved searches, visualizations and
|
`kibana.index:`:: *Default: ".kibana"* Kibana uses an index in Elasticsearch to store saved searches, visualizations and
|
||||||
dashboards. Kibana creates a new index if the index doesn’t already exist.
|
dashboards. Kibana creates a new index if the index doesn’t already exist.
|
||||||
`kibana.defaultAppId:`:: *Default: "discover"* The default application to load.
|
`kibana.defaultAppId:`:: *Default: "discover"* The default application to load.
|
||||||
|
`kibana.addDataMaxBytes:`:: *Default: 1073741824* The maximum upload size in bytes for the CSV Upload wizard
|
||||||
[[tilemap-settings]]`tilemap.url:`:: *Default: `"https://tiles.elastic.co/v1/default/{z}/{x}/{y}.png?elastic_tile_service_tos=agree&my_app_name=kibana"`* The URL to the tile
|
[[tilemap-settings]]`tilemap.url:`:: *Default: `"https://tiles.elastic.co/v1/default/{z}/{x}/{y}.png?elastic_tile_service_tos=agree&my_app_name=kibana"`* The URL to the tile
|
||||||
service that Kibana uses to display map tiles in tilemap visualizations.
|
service that Kibana uses to display map tiles in tilemap visualizations.
|
||||||
`tilemap.options.minZoom:`:: *Default: 1* The minimum zoom level.
|
`tilemap.options.minZoom:`:: *Default: 1* The minimum zoom level.
|
||||||
|
|
|
@ -95,7 +95,6 @@
|
||||||
"boom": "2.8.0",
|
"boom": "2.8.0",
|
||||||
"brace": "0.5.1",
|
"brace": "0.5.1",
|
||||||
"bunyan": "1.7.1",
|
"bunyan": "1.7.1",
|
||||||
"clipboard": "1.5.5",
|
|
||||||
"commander": "2.8.1",
|
"commander": "2.8.1",
|
||||||
"css-loader": "0.17.0",
|
"css-loader": "0.17.0",
|
||||||
"csv-parse": "1.1.0",
|
"csv-parse": "1.1.0",
|
||||||
|
@ -181,7 +180,7 @@
|
||||||
"grunt-cli": "0.1.13",
|
"grunt-cli": "0.1.13",
|
||||||
"grunt-contrib-clean": "1.0.0",
|
"grunt-contrib-clean": "1.0.0",
|
||||||
"grunt-contrib-copy": "0.8.1",
|
"grunt-contrib-copy": "0.8.1",
|
||||||
"grunt-esvm": "3.2.4",
|
"grunt-esvm": "3.2.6",
|
||||||
"grunt-karma": "2.0.0",
|
"grunt-karma": "2.0.0",
|
||||||
"grunt-run": "0.6.0",
|
"grunt-run": "0.6.0",
|
||||||
"grunt-simple-mocha": "0.4.0",
|
"grunt-simple-mocha": "0.4.0",
|
||||||
|
|
|
@ -45,7 +45,7 @@ describe('kibana cli', function () {
|
||||||
tempArchiveFile: tempArchiveFilePath,
|
tempArchiveFile: tempArchiveFilePath,
|
||||||
plugin: 'test-plugin',
|
plugin: 'test-plugin',
|
||||||
version: '5.0.0-SNAPSHOT',
|
version: '5.0.0-SNAPSHOT',
|
||||||
plugins: [ { name: 'foo', path: join(testWorkingPath, 'foo'), version: '5.0.0-SNAPSHOT' } ]
|
plugins: [ { name: 'foo', path: join(testWorkingPath, 'foo'), kibanaVersion: '5.0.0-SNAPSHOT' } ]
|
||||||
};
|
};
|
||||||
const errorStub = sinon.stub();
|
const errorStub = sinon.stub();
|
||||||
|
|
||||||
|
@ -59,7 +59,7 @@ describe('kibana cli', function () {
|
||||||
expect(errorStub.called).to.be(false);
|
expect(errorStub.called).to.be(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should throw an error if plugin does contain a version.', function () {
|
it('should throw an error if plugin is missing a kibana version.', function () {
|
||||||
const errorStub = sinon.stub();
|
const errorStub = sinon.stub();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -69,12 +69,12 @@ describe('kibana cli', function () {
|
||||||
errorStub(err);
|
errorStub(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
expect(errorStub.firstCall.args[0]).to.match(/plugin version not found/i);
|
expect(errorStub.firstCall.args[0]).to.match(/plugin package\.json is missing both a version property/i);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should throw an error if plugin version does does not match kibana version', function () {
|
it('should throw an error if plugin kibanaVersion does not match kibana version', function () {
|
||||||
const errorStub = sinon.stub();
|
const errorStub = sinon.stub();
|
||||||
settings.plugins[0].version = '1.2.3.4';
|
settings.plugins[0].kibanaVersion = '1.2.3.4';
|
||||||
|
|
||||||
try {
|
try {
|
||||||
assertVersion(settings);
|
assertVersion(settings);
|
||||||
|
@ -83,12 +83,12 @@ describe('kibana cli', function () {
|
||||||
errorStub(err);
|
errorStub(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
expect(errorStub.firstCall.args[0]).to.match(/incorrect version/i);
|
expect(errorStub.firstCall.args[0]).to.match(/incorrect kibana version/i);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should not throw an error if plugin version matches kibana version', function () {
|
it('should not throw an error if plugin kibanaVersion matches kibana version', function () {
|
||||||
const errorStub = sinon.stub();
|
const errorStub = sinon.stub();
|
||||||
settings.plugins[0].version = '1.0.0';
|
settings.plugins[0].kibanaVersion = '1.0.0';
|
||||||
|
|
||||||
try {
|
try {
|
||||||
assertVersion(settings);
|
assertVersion(settings);
|
||||||
|
@ -102,7 +102,7 @@ describe('kibana cli', function () {
|
||||||
|
|
||||||
it('should ignore version info after the dash in checks on valid version', function () {
|
it('should ignore version info after the dash in checks on valid version', function () {
|
||||||
const errorStub = sinon.stub();
|
const errorStub = sinon.stub();
|
||||||
settings.plugins[0].version = '1.0.0-foo-bar-version-1.2.3';
|
settings.plugins[0].kibanaVersion = '1.0.0-foo-bar-version-1.2.3';
|
||||||
|
|
||||||
try {
|
try {
|
||||||
assertVersion(settings);
|
assertVersion(settings);
|
||||||
|
@ -116,7 +116,7 @@ describe('kibana cli', function () {
|
||||||
|
|
||||||
it('should ignore version info after the dash in checks on invalid version', function () {
|
it('should ignore version info after the dash in checks on invalid version', function () {
|
||||||
const errorStub = sinon.stub();
|
const errorStub = sinon.stub();
|
||||||
settings.plugins[0].version = '2.0.0-foo-bar-version-1.2.3';
|
settings.plugins[0].kibanaVersion = '2.0.0-foo-bar-version-1.2.3';
|
||||||
|
|
||||||
try {
|
try {
|
||||||
assertVersion(settings);
|
assertVersion(settings);
|
||||||
|
@ -125,7 +125,7 @@ describe('kibana cli', function () {
|
||||||
errorStub(err);
|
errorStub(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
expect(errorStub.firstCall.args[0]).to.match(/incorrect version/i);
|
expect(errorStub.firstCall.args[0]).to.match(/incorrect kibana version/i);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -12,30 +12,41 @@ describe('kibana cli', function () {
|
||||||
|
|
||||||
describe('pack', function () {
|
describe('pack', function () {
|
||||||
|
|
||||||
const testWorkingPath = join(__dirname, '.test.data');
|
let testNum = 0;
|
||||||
const tempArchiveFilePath = join(testWorkingPath, 'archive.part');
|
const workingPathRoot = join(__dirname, '.test.data');
|
||||||
const testPluginPath = join(testWorkingPath, '.installedPlugins');
|
let testWorkingPath;
|
||||||
|
let tempArchiveFilePath;
|
||||||
|
let testPluginPath;
|
||||||
let logger;
|
let logger;
|
||||||
|
let settings;
|
||||||
const settings = {
|
|
||||||
workingPath: testWorkingPath,
|
|
||||||
tempArchiveFile: tempArchiveFilePath,
|
|
||||||
pluginDir: testPluginPath,
|
|
||||||
plugin: 'test-plugin'
|
|
||||||
};
|
|
||||||
|
|
||||||
beforeEach(function () {
|
beforeEach(function () {
|
||||||
|
//These tests are dependent on the file system, and I had some inconsistent
|
||||||
|
//behavior with rimraf.sync show up. Until these tests are re-written to not
|
||||||
|
//depend on the file system, I make sure that each test uses a different
|
||||||
|
//working directory.
|
||||||
|
testNum += 1;
|
||||||
|
testWorkingPath = join(workingPathRoot, testNum + '');
|
||||||
|
tempArchiveFilePath = join(testWorkingPath, 'archive.part');
|
||||||
|
testPluginPath = join(testWorkingPath, '.installedPlugins');
|
||||||
|
|
||||||
|
settings = {
|
||||||
|
workingPath: testWorkingPath,
|
||||||
|
tempArchiveFile: tempArchiveFilePath,
|
||||||
|
pluginDir: testPluginPath,
|
||||||
|
plugin: 'test-plugin'
|
||||||
|
};
|
||||||
|
|
||||||
logger = new Logger(settings);
|
logger = new Logger(settings);
|
||||||
sinon.stub(logger, 'log');
|
sinon.stub(logger, 'log');
|
||||||
sinon.stub(logger, 'error');
|
sinon.stub(logger, 'error');
|
||||||
rimraf.sync(testWorkingPath);
|
|
||||||
mkdirp.sync(testWorkingPath);
|
mkdirp.sync(testWorkingPath);
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(function () {
|
afterEach(function () {
|
||||||
logger.log.restore();
|
logger.log.restore();
|
||||||
logger.error.restore();
|
logger.error.restore();
|
||||||
rimraf.sync(testWorkingPath);
|
rimraf.sync(workingPathRoot);
|
||||||
});
|
});
|
||||||
|
|
||||||
function copyReplyFile(filename) {
|
function copyReplyFile(filename) {
|
||||||
|
@ -89,10 +100,33 @@ describe('kibana cli', function () {
|
||||||
expect(settings.plugins[0].name).to.be('test-plugin');
|
expect(settings.plugins[0].name).to.be('test-plugin');
|
||||||
expect(settings.plugins[0].folder).to.be('test-plugin');
|
expect(settings.plugins[0].folder).to.be('test-plugin');
|
||||||
expect(settings.plugins[0].version).to.be('1.0.0');
|
expect(settings.plugins[0].version).to.be('1.0.0');
|
||||||
|
expect(settings.plugins[0].kibanaVersion).to.be('1.0.0');
|
||||||
expect(settings.plugins[0].platform).to.be(undefined);
|
expect(settings.plugins[0].platform).to.be(undefined);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('populate settings.plugin.kibanaVersion', function () {
|
||||||
|
//kibana.version is defined in this package.json and is different than plugin version
|
||||||
|
return copyReplyFile('test_plugin_different_version.zip')
|
||||||
|
.then(() => {
|
||||||
|
return getPackData(settings, logger);
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
expect(settings.plugins[0].kibanaVersion).to.be('5.0.1');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('populate settings.plugin.kibanaVersion (default to plugin version)', function () {
|
||||||
|
//kibana.version is not defined in this package.json, defaults to plugin version
|
||||||
|
return copyReplyFile('test_plugin.zip')
|
||||||
|
.then(() => {
|
||||||
|
return getPackData(settings, logger);
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
expect(settings.plugins[0].kibanaVersion).to.be('1.0.0');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
it('populate settings.plugins with multiple plugins', function () {
|
it('populate settings.plugins with multiple plugins', function () {
|
||||||
return copyReplyFile('test_plugin_many.zip')
|
return copyReplyFile('test_plugin_many.zip')
|
||||||
.then(() => {
|
.then(() => {
|
||||||
|
|
|
@ -46,14 +46,14 @@ export async function rebuildCache(settings, logger) {
|
||||||
}
|
}
|
||||||
|
|
||||||
export function assertVersion(settings) {
|
export function assertVersion(settings) {
|
||||||
if (!settings.plugins[0].version) {
|
if (!settings.plugins[0].kibanaVersion) {
|
||||||
throw new Error (`Plugin version not found. Check package.json in archive`);
|
throw new Error (`Plugin package.json is missing both a version property (required) and a kibana.version property (optional).`);
|
||||||
}
|
}
|
||||||
|
|
||||||
const actual = cleanVersion(settings.plugins[0].version);
|
const actual = cleanVersion(settings.plugins[0].kibanaVersion);
|
||||||
const expected = cleanVersion(settings.version);
|
const expected = cleanVersion(settings.version);
|
||||||
if (!versionSatisfies(actual, expected)) {
|
if (!versionSatisfies(actual, expected)) {
|
||||||
throw new Error (`Incorrect version in plugin [${settings.plugins[0].name}]. ` +
|
throw new Error (`Incorrect Kibana version in plugin [${settings.plugins[0].name}]. ` +
|
||||||
`Expected [${expected}]; found [${actual}]`);
|
`Expected [${expected}]; found [${actual}]`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,10 +55,10 @@ function assertValidPackageName(plugin) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Examine each package.json file to determine the plugin name,
|
* Examine each package.json file to determine the plugin name,
|
||||||
* version, and platform. Mutates the package objects in the packages array
|
* version, kibanaVersion, and platform. Mutates the package objects
|
||||||
|
* in the packages array
|
||||||
* @param {object} settings - a plugin installer settings object
|
* @param {object} settings - a plugin installer settings object
|
||||||
* @param {array} packages - array of package objects from listPackages()
|
* @param {array} packages - array of package objects from listPackages()
|
||||||
*/
|
*/
|
||||||
|
@ -71,6 +71,12 @@ async function mergePackageData(settings, packages) {
|
||||||
pkg.name = _.get(packageInfo, 'name');
|
pkg.name = _.get(packageInfo, 'name');
|
||||||
pkg.path = resolve(settings.pluginDir, pkg.name);
|
pkg.path = resolve(settings.pluginDir, pkg.name);
|
||||||
|
|
||||||
|
// Plugins must specify their version, and by default that version should match
|
||||||
|
// the version of kibana down to the patch level. If these two versions need
|
||||||
|
// to diverge, they can specify a kibana.version to indicate the version of
|
||||||
|
// kibana the plugin is intended to work with.
|
||||||
|
pkg.kibanaVersion = _.get(packageInfo, 'kibana.version', pkg.version);
|
||||||
|
|
||||||
const regExp = new RegExp(`${pkg.name}-(.+)`, 'i');
|
const regExp = new RegExp(`${pkg.name}-(.+)`, 'i');
|
||||||
const matches = pkg.folder.match(regExp);
|
const matches = pkg.folder.match(regExp);
|
||||||
pkg.platform = (matches) ? matches[1] : undefined;
|
pkg.platform = (matches) ? matches[1] : undefined;
|
||||||
|
|
|
@ -9,19 +9,7 @@ module.exports = function (kibana) {
|
||||||
let { existsSync } = require('fs');
|
let { existsSync } = require('fs');
|
||||||
const { startsWith, endsWith } = require('lodash');
|
const { startsWith, endsWith } = require('lodash');
|
||||||
|
|
||||||
const apps = [
|
const apps = [];
|
||||||
{
|
|
||||||
title: 'Console',
|
|
||||||
description: 'JSON aware developer\'s interface to ElasticSearch',
|
|
||||||
main: 'plugins/console/console',
|
|
||||||
icon: 'plugins/console/logo.svg',
|
|
||||||
injectVars: function (server, options) {
|
|
||||||
const varsToInject = options;
|
|
||||||
varsToInject.elasticsearchUrl = server.config().get('elasticsearch.url');
|
|
||||||
return varsToInject;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
if (existsSync(resolve(__dirname, 'public/tests'))) {
|
if (existsSync(resolve(__dirname, 'public/tests'))) {
|
||||||
apps.push({
|
apps.push({
|
||||||
|
@ -146,7 +134,7 @@ module.exports = function (kibana) {
|
||||||
payload: {
|
payload: {
|
||||||
output: 'stream',
|
output: 'stream',
|
||||||
parse: false
|
parse: false
|
||||||
},
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -156,7 +144,7 @@ module.exports = function (kibana) {
|
||||||
config: {
|
config: {
|
||||||
...proxyRouteConfig
|
...proxyRouteConfig
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
|
|
||||||
server.route({
|
server.route({
|
||||||
path: '/api/console/api_server',
|
path: '/api/console/api_server',
|
||||||
|
@ -188,6 +176,14 @@ module.exports = function (kibana) {
|
||||||
uiExports: {
|
uiExports: {
|
||||||
apps: apps,
|
apps: apps,
|
||||||
|
|
||||||
|
devTools: ['plugins/console/console'],
|
||||||
|
|
||||||
|
injectDefaultVars(server, options) {
|
||||||
|
const varsToInject = options;
|
||||||
|
varsToInject.elasticsearchUrl = server.config().get('elasticsearch.url');
|
||||||
|
return varsToInject;
|
||||||
|
},
|
||||||
|
|
||||||
noParse: [
|
noParse: [
|
||||||
join(modules, 'ace' + sep),
|
join(modules, 'ace' + sep),
|
||||||
join(modules, 'moment_src/moment' + sep),
|
join(modules, 'moment_src/moment' + sep),
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
import devTools from 'ui/registry/dev_tools';
|
||||||
|
import uiRoutes from 'ui/routes';
|
||||||
|
import template from './index.html';
|
||||||
|
|
||||||
require('ace');
|
require('ace');
|
||||||
require('ui-bootstrap-custom');
|
require('ui-bootstrap-custom');
|
||||||
|
|
||||||
|
@ -13,6 +17,14 @@ require('./src/directives/sense_help');
|
||||||
require('./src/directives/sense_welcome');
|
require('./src/directives/sense_welcome');
|
||||||
require('./src/directives/sense_navbar');
|
require('./src/directives/sense_navbar');
|
||||||
|
|
||||||
require('ui/chrome')
|
devTools.register(() => ({
|
||||||
.setRootTemplate(require('./index.html'))
|
order: 1,
|
||||||
.setRootController('sense', 'SenseController');
|
name: 'console',
|
||||||
|
display: 'Console',
|
||||||
|
url: '#/dev_tools/console'
|
||||||
|
}));
|
||||||
|
|
||||||
|
uiRoutes.when('/dev_tools/console', {
|
||||||
|
controller: 'SenseController',
|
||||||
|
template
|
||||||
|
});
|
||||||
|
|
|
@ -1,38 +1,43 @@
|
||||||
<sense-navbar></sense-navbar>
|
<kbn-dev-tools-app data-test-subj="console">
|
||||||
|
<sense-navbar></sense-navbar>
|
||||||
|
|
||||||
<div id="editor_output_container">
|
<div id="editor_output_container">
|
||||||
<div id="editor_container">
|
<div id="editor_container">
|
||||||
<ul id="autocomplete"></ul>
|
<ul id="autocomplete"></ul>
|
||||||
<div id="editor_actions">
|
<div id="editor_actions">
|
||||||
<kbn-tooltip text="click to send request">
|
<kbn-tooltip text="click to send request">
|
||||||
<a class="editor_action" ng-click="sense.sendSelected()">
|
<a
|
||||||
<i class="fa fa-play"></i>
|
class="editor_action"
|
||||||
</a>
|
ng-click="sendSelected()"
|
||||||
</kbn-tooltip>
|
data-test-subj="send-request-button">
|
||||||
<span dropdown>
|
<i class="fa fa-play"></i>
|
||||||
<a class="editor_action" dropdown-toggle href="#">
|
</a>
|
||||||
<i class="fa fa-wrench"></i>
|
</kbn-tooltip>
|
||||||
</a>
|
<span dropdown>
|
||||||
|
<a class="editor_action" dropdown-toggle href="#">
|
||||||
|
<i class="fa fa-wrench"></i>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<ul class="dropdown-menu" role="menu" aria-labelledby="split-button">
|
||||||
|
<li role="menuitem">
|
||||||
|
<a href="#" id="copy_as_curl">Copy as cURL</a>
|
||||||
|
</li>
|
||||||
|
<li role="menuitem">
|
||||||
|
<a ng-click="autoIndent($event)">Auto indent</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="editor" data-test-subj="request-editor">GET _search
|
||||||
|
{
|
||||||
|
"query": { "match_all": {} }
|
||||||
|
}</div>
|
||||||
|
|
||||||
<ul class="dropdown-menu" role="menu" aria-labelledby="split-button">
|
|
||||||
<li role="menuitem">
|
|
||||||
<a href="#" id="copy_as_curl">Copy as cURL</a>
|
|
||||||
</li>
|
|
||||||
<li role="menuitem">
|
|
||||||
<a ng-click="sense.autoIndent($event)">Auto indent</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</span>
|
|
||||||
</div>
|
</div>
|
||||||
|
<div id="editor_resizer">︙</div>
|
||||||
<div id="editor">GET _search
|
<div id="output_container" data-test-subj="response-editor">
|
||||||
{
|
<div id="output">{}</div>
|
||||||
"query": { "match_all": {} }
|
</div>
|
||||||
}</div>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div id="editor_resizer">︙</div>
|
</kbn-dev-tools-app>
|
||||||
<div id="output_container">
|
|
||||||
<div id="output">{}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8">
|
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8" fill="white">
|
||||||
<path d="M5 0l-3 6h1l3-6h-1zm-4 1l-1 2 1 2h1l-1-2 1-2h-1zm5 0l1 2-1 2h1l1-2-1-2h-1z" transform="translate(0 1)" />
|
<path d="M5 0l-3 6h1l3-6h-1zm-4 1l-1 2 1 2h1l-1-2 1-2h-1zm5 0l1 2-1 2h1l1-2-1-2h-1z" transform="translate(0 1)" />
|
||||||
</svg>
|
</svg>
|
||||||
|
|
Before Width: | Height: | Size: 203 B After Width: | Height: | Size: 217 B |
|
@ -2,114 +2,113 @@ var $ = require('jquery');
|
||||||
|
|
||||||
let curl = require('./curl');
|
let curl = require('./curl');
|
||||||
let history = require('./history');
|
let history = require('./history');
|
||||||
let input = require('./input');
|
|
||||||
let mappings = require('./mappings');
|
let mappings = require('./mappings');
|
||||||
let output = require('./output');
|
|
||||||
let es = require('./es');
|
let es = require('./es');
|
||||||
let utils = require('./utils');
|
let utils = require('./utils');
|
||||||
let _ = require('lodash');
|
let _ = require('lodash');
|
||||||
const chrome = require('ui/chrome');
|
|
||||||
|
|
||||||
$(document.body).removeClass('fouc');
|
export default function init(input, output) {
|
||||||
|
$(document.body).removeClass('fouc');
|
||||||
|
|
||||||
// set the value of the input and clear the output
|
// set the value of the input and clear the output
|
||||||
function resetToValues(content) {
|
function resetToValues(content) {
|
||||||
if (content != null) {
|
if (content != null) {
|
||||||
input.update(content);
|
input.update(content);
|
||||||
|
}
|
||||||
|
output.update("");
|
||||||
}
|
}
|
||||||
output.update("");
|
|
||||||
}
|
|
||||||
|
|
||||||
function loadSavedState() {
|
function loadSavedState() {
|
||||||
var sourceLocation = utils.getUrlParam('load_from') || "stored";
|
var sourceLocation = utils.getUrlParam('load_from') || "stored";
|
||||||
var previousSaveState = history.getSavedEditorState();
|
var previousSaveState = history.getSavedEditorState();
|
||||||
|
|
||||||
if (sourceLocation == "stored") {
|
if (sourceLocation == "stored") {
|
||||||
if (previousSaveState) {
|
if (previousSaveState) {
|
||||||
resetToValues(previousSaveState.content);
|
resetToValues(previousSaveState.content);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
resetToValues();
|
||||||
|
input.autoIndent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (/^https?:\/\//.test(sourceLocation)) {
|
||||||
|
var loadFrom = {url: sourceLocation, dataType: "text", kbnXsrfToken: false};
|
||||||
|
if (/https?:\/\/api.github.com/.test(sourceLocation)) {
|
||||||
|
loadFrom.headers = {Accept: "application/vnd.github.v3.raw"};
|
||||||
|
}
|
||||||
|
$.ajax(loadFrom).done(function (data) {
|
||||||
|
resetToValues(data);
|
||||||
|
input.moveToNextRequestEdge(true);
|
||||||
|
input.highlightCurrentRequestsAndUpdateActionBar();
|
||||||
|
input.updateActionsBar();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
resetToValues();
|
resetToValues();
|
||||||
input.autoIndent();
|
|
||||||
}
|
}
|
||||||
|
input.moveToNextRequestEdge(true);
|
||||||
}
|
}
|
||||||
else if (/^https?:\/\//.test(sourceLocation)) {
|
|
||||||
var loadFrom = {url: sourceLocation, dataType: "text", kbnXsrfToken: false};
|
function setupAutosave() {
|
||||||
if (/https?:\/\/api.github.com/.test(sourceLocation)) {
|
var timer;
|
||||||
loadFrom.headers = {Accept: "application/vnd.github.v3.raw"};
|
var saveDelay = 500;
|
||||||
}
|
|
||||||
$.ajax(loadFrom).done(function (data) {
|
input.getSession().on("change", function onChange(e) {
|
||||||
resetToValues(data);
|
if (timer) {
|
||||||
input.moveToNextRequestEdge(true);
|
timer = clearTimeout(timer);
|
||||||
input.highlightCurrentRequestsAndUpdateActionBar();
|
}
|
||||||
input.updateActionsBar();
|
timer = setTimeout(saveCurrentState, saveDelay);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
resetToValues();
|
|
||||||
}
|
|
||||||
input.moveToNextRequestEdge(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
function setupAutosave() {
|
function saveCurrentState() {
|
||||||
var timer;
|
try {
|
||||||
var saveDelay = 500;
|
var content = input.getValue();
|
||||||
|
history.updateCurrentState(content);
|
||||||
input.getSession().on("change", function onChange(e) {
|
}
|
||||||
if (timer) {
|
catch (e) {
|
||||||
timer = clearTimeout(timer);
|
console.log("Ignoring saving error: " + e);
|
||||||
}
|
}
|
||||||
timer = setTimeout(saveCurrentState, saveDelay);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function saveCurrentState() {
|
|
||||||
try {
|
|
||||||
var content = input.getValue();
|
|
||||||
history.updateCurrentState(content);
|
|
||||||
}
|
|
||||||
catch (e) {
|
|
||||||
console.log("Ignoring saving error: " + e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// stupid simple restore function, called when the user
|
|
||||||
// chooses to restore a request from the history
|
|
||||||
// PREVENTS history from needing to know about the input
|
|
||||||
history.restoreFromHistory = function applyHistoryElem(req) {
|
|
||||||
var session = input.getSession();
|
|
||||||
var pos = input.getCursorPosition();
|
|
||||||
var prefix = "";
|
|
||||||
var suffix = "\n";
|
|
||||||
if (input.parser.isStartRequestRow(pos.row)) {
|
|
||||||
pos.column = 0;
|
|
||||||
suffix += "\n";
|
|
||||||
}
|
|
||||||
else if (input.parser.isEndRequestRow(pos.row)) {
|
|
||||||
var line = session.getLine(pos.row);
|
|
||||||
pos.column = line.length;
|
|
||||||
prefix = "\n\n";
|
|
||||||
}
|
|
||||||
else if (input.parser.isInBetweenRequestsRow(pos.row)) {
|
|
||||||
pos.column = 0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
pos = input.nextRequestEnd(pos);
|
|
||||||
prefix = "\n\n";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var s = prefix + req.method + " " + req.endpoint;
|
// stupid simple restore function, called when the user
|
||||||
if (req.data) {
|
// chooses to restore a request from the history
|
||||||
s += "\n" + req.data;
|
// PREVENTS history from needing to know about the input
|
||||||
}
|
history.restoreFromHistory = function applyHistoryElem(req) {
|
||||||
|
var session = input.getSession();
|
||||||
|
var pos = input.getCursorPosition();
|
||||||
|
var prefix = "";
|
||||||
|
var suffix = "\n";
|
||||||
|
if (input.parser.isStartRequestRow(pos.row)) {
|
||||||
|
pos.column = 0;
|
||||||
|
suffix += "\n";
|
||||||
|
}
|
||||||
|
else if (input.parser.isEndRequestRow(pos.row)) {
|
||||||
|
var line = session.getLine(pos.row);
|
||||||
|
pos.column = line.length;
|
||||||
|
prefix = "\n\n";
|
||||||
|
}
|
||||||
|
else if (input.parser.isInBetweenRequestsRow(pos.row)) {
|
||||||
|
pos.column = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pos = input.nextRequestEnd(pos);
|
||||||
|
prefix = "\n\n";
|
||||||
|
}
|
||||||
|
|
||||||
s += suffix;
|
var s = prefix + req.method + " " + req.endpoint;
|
||||||
|
if (req.data) {
|
||||||
|
s += "\n" + req.data;
|
||||||
|
}
|
||||||
|
|
||||||
session.insert(pos, s);
|
s += suffix;
|
||||||
input.clearSelection();
|
|
||||||
input.moveCursorTo(pos.row + prefix.length, 0);
|
session.insert(pos, s);
|
||||||
input.focus();
|
input.clearSelection();
|
||||||
|
input.moveCursorTo(pos.row + prefix.length, 0);
|
||||||
|
input.focus();
|
||||||
|
};
|
||||||
|
|
||||||
|
loadSavedState();
|
||||||
|
setupAutosave();
|
||||||
};
|
};
|
||||||
|
|
||||||
loadSavedState();
|
|
||||||
setupAutosave();
|
|
||||||
|
|
|
@ -6,7 +6,6 @@ let utils = require('./utils');
|
||||||
let autocomplete_engine = require('./autocomplete/engine');
|
let autocomplete_engine = require('./autocomplete/engine');
|
||||||
let url_pattern_matcher = require('./autocomplete/url_pattern_matcher');
|
let url_pattern_matcher = require('./autocomplete/url_pattern_matcher');
|
||||||
let _ = require('lodash');
|
let _ = require('lodash');
|
||||||
let $ = require('jquery');
|
|
||||||
let ext_lang_tools = require('ace/ext-language_tools');
|
let ext_lang_tools = require('ace/ext-language_tools');
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,10 @@
|
||||||
import 'ui/doc_title';
|
import 'ui/doc_title';
|
||||||
import { useResizeCheckerProvider } from '../sense_editor_resize';
|
import { useResizeCheckerProvider } from '../sense_editor_resize';
|
||||||
|
import $ from 'jquery';
|
||||||
|
import { initializeInput } from '../input';
|
||||||
|
import { initializeOutput } from '../output';
|
||||||
|
import es from '../es';
|
||||||
|
import init from '../app';
|
||||||
|
|
||||||
const module = require('ui/modules').get('app/sense');
|
const module = require('ui/modules').get('app/sense');
|
||||||
|
|
||||||
|
@ -11,23 +16,27 @@ module.run(function (Private, $rootScope) {
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
module.controller('SenseController', function SenseController($scope, docTitle) {
|
module.controller('SenseController', function SenseController($scope, $timeout, docTitle) {
|
||||||
|
|
||||||
docTitle.change('Console');
|
docTitle.change('Console');
|
||||||
|
|
||||||
// require the root app code, which expects to execute once the dom is loaded up
|
let input, output;
|
||||||
require('../app');
|
|
||||||
|
|
||||||
const input = require('../input');
|
// We need to wait for these elements to be rendered before we can select them with jQuery
|
||||||
const es = require('../es');
|
// and then initialize this app
|
||||||
|
$timeout(() => {
|
||||||
|
output = initializeOutput($('#output'));
|
||||||
|
input = initializeInput($('#editor'), $('#editor_actions'), $('#copy_as_curl'), output);
|
||||||
|
init(input, output);
|
||||||
|
});
|
||||||
|
|
||||||
this.sendSelected = () => {
|
$scope.sendSelected = () => {
|
||||||
input.focus();
|
input.focus();
|
||||||
input.sendCurrentRequestToES();
|
input.sendCurrentRequestToES();
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
this.autoIndent = (event) => {
|
$scope.autoIndent = (event) => {
|
||||||
input.autoIndent();
|
input.autoIndent();
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
input.focus();
|
input.focus();
|
||||||
|
|
|
@ -1,9 +1 @@
|
||||||
<kbn-top-nav name="timelion" ng-if="sense" config="navbar.menu">
|
<kbn-top-nav name="console" ng-if="sense" config="navbar.menu" data-test-subj="top-nav"></kbn-top-nav>
|
||||||
<div class="kibana-nav-info">
|
|
||||||
<span class="kibana-nav-info-title">
|
|
||||||
<span>
|
|
||||||
Elasticsearch Console
|
|
||||||
</span>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</kbn-top-nav>
|
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
const $ = require('jquery');
|
const $ = require('jquery');
|
||||||
const { uniq } = require('lodash');
|
const { uniq } = require('lodash');
|
||||||
const storage = require('./storage');
|
const storage = require('./storage');
|
||||||
const chrome = require('ui/chrome');
|
|
||||||
|
|
||||||
const history = module.exports = {
|
const history = module.exports = {
|
||||||
restoreFromHistory() {
|
restoreFromHistory() {
|
||||||
|
|
|
@ -4,7 +4,6 @@ let ZeroClipboard = require('zeroclip');
|
||||||
let ext_searchbox = require('ace/ext-searchbox');
|
let ext_searchbox = require('ace/ext-searchbox');
|
||||||
let Autocomplete = require('./autocomplete');
|
let Autocomplete = require('./autocomplete');
|
||||||
let mappings = require('./mappings');
|
let mappings = require('./mappings');
|
||||||
let output = require('./output');
|
|
||||||
let SenseEditor = require('./sense_editor/editor');
|
let SenseEditor = require('./sense_editor/editor');
|
||||||
let settings = require('./settings');
|
let settings = require('./settings');
|
||||||
let storage = require('./storage');
|
let storage = require('./storage');
|
||||||
|
@ -13,232 +12,238 @@ let es = require('./es');
|
||||||
let history = require('./history');
|
let history = require('./history');
|
||||||
import uiModules from 'ui/modules';
|
import uiModules from 'ui/modules';
|
||||||
|
|
||||||
var $el = $('#editor');
|
let input;
|
||||||
var input = new SenseEditor($el);
|
export function initializeInput($el, $actionsEl, $copyAsCurlEl, output) {
|
||||||
uiModules.get('app/sense').setupResizeCheckerForRootEditors($el, input, output);
|
input = new SenseEditor($el);
|
||||||
|
|
||||||
input.autocomplete = new Autocomplete(input);
|
uiModules.get('app/sense').setupResizeCheckerForRootEditors($el, input, output);
|
||||||
|
|
||||||
input.$actions = $("#editor_actions");
|
input.autocomplete = new Autocomplete(input);
|
||||||
|
|
||||||
input.commands.addCommand({
|
input.$actions = $actionsEl;
|
||||||
name: 'auto indent request',
|
|
||||||
bindKey: {win: 'Ctrl-I', mac: 'Command-I'},
|
|
||||||
exec: function () {
|
|
||||||
input.autoIndent();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
input.commands.addCommand({
|
|
||||||
name: 'move to previous request start or end',
|
|
||||||
bindKey: {win: 'Ctrl-Up', mac: 'Command-Up'},
|
|
||||||
exec: function () {
|
|
||||||
input.moveToPreviousRequestEdge()
|
|
||||||
}
|
|
||||||
});
|
|
||||||
input.commands.addCommand({
|
|
||||||
name: 'move to next request start or end',
|
|
||||||
bindKey: {win: 'Ctrl-Down', mac: 'Command-Down'},
|
|
||||||
exec: function () {
|
|
||||||
input.moveToNextRequestEdge()
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
input.commands.addCommand({
|
||||||
/**
|
name: 'auto indent request',
|
||||||
* COPY AS CURL
|
bindKey: {win: 'Ctrl-I', mac: 'Command-I'},
|
||||||
*
|
exec: function () {
|
||||||
* Since the copy functionality is powered by a flash movie (via ZeroClipboard)
|
input.autoIndent();
|
||||||
* the only way to trigger the copy is with a litteral mouseclick from the user.
|
}
|
||||||
*
|
});
|
||||||
* The original shortcut will now just open the menu and highlight the
|
input.commands.addCommand({
|
||||||
*
|
name: 'move to previous request start or end',
|
||||||
*/
|
bindKey: {win: 'Ctrl-Up', mac: 'Command-Up'},
|
||||||
var $copyAsCURL = $('#copy_as_curl');
|
exec: function () {
|
||||||
var zc = (function setupZeroClipboard() {
|
input.moveToPreviousRequestEdge()
|
||||||
var zc = new ZeroClipboard($copyAsCURL); // the ZeroClipboard instance
|
}
|
||||||
|
});
|
||||||
zc.on('wrongflash noflash', function () {
|
input.commands.addCommand({
|
||||||
if (!storage.get('flash_warning_shown')) {
|
name: 'move to next request start or end',
|
||||||
alert('Console needs flash version 10.0 or greater in order to provide "Copy as cURL" functionality');
|
bindKey: {win: 'Ctrl-Down', mac: 'Command-Down'},
|
||||||
storage.set('flash_warning_shown', 'true');
|
exec: function () {
|
||||||
|
input.moveToNextRequestEdge()
|
||||||
}
|
}
|
||||||
$copyAsCURL.hide();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
zc.on('ready', function () {
|
|
||||||
function setupCopyButton(cb) {
|
|
||||||
cb = typeof cb === 'function' ? cb : $.noop;
|
|
||||||
$copyAsCURL.css('visibility', 'hidden');
|
|
||||||
input.getRequestsAsCURL(function (curl) {
|
|
||||||
$copyAsCURL.attr('data-clipboard-text', curl);
|
|
||||||
$copyAsCURL.css('visibility', 'visible');
|
|
||||||
cb();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
input.$actions.on('mouseenter', function () {
|
/**
|
||||||
if (!$(this).hasClass('open')) {
|
* COPY AS CURL
|
||||||
setupCopyButton();
|
*
|
||||||
|
* Since the copy functionality is powered by a flash movie (via ZeroClipboard)
|
||||||
|
* the only way to trigger the copy is with a litteral mouseclick from the user.
|
||||||
|
*
|
||||||
|
* The original shortcut will now just open the menu and highlight the
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
var zc = (function setupZeroClipboard() {
|
||||||
|
var zc = new ZeroClipboard($copyAsCurlEl); // the ZeroClipboard instance
|
||||||
|
|
||||||
|
zc.on('wrongflash noflash', function () {
|
||||||
|
if (!storage.get('flash_warning_shown')) {
|
||||||
|
alert('Console needs flash version 10.0 or greater in order to provide "Copy as cURL" functionality');
|
||||||
|
storage.set('flash_warning_shown', 'true');
|
||||||
}
|
}
|
||||||
|
$copyAsCurlEl.hide();
|
||||||
});
|
});
|
||||||
});
|
|
||||||
|
|
||||||
zc.on('complete', function () {
|
zc.on('ready', function () {
|
||||||
$copyAsCURL.click();
|
function setupCopyButton(cb) {
|
||||||
input.focus();
|
cb = typeof cb === 'function' ? cb : $.noop;
|
||||||
});
|
$copyAsCurlEl.css('visibility', 'hidden');
|
||||||
|
input.getRequestsAsCURL(function (curl) {
|
||||||
|
$copyAsCurlEl.attr('data-clipboard-text', curl);
|
||||||
|
$copyAsCurlEl.css('visibility', 'visible');
|
||||||
|
cb();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
return zc;
|
input.$actions.on('mouseenter', function () {
|
||||||
}());
|
if (!$(this).hasClass('open')) {
|
||||||
|
setupCopyButton();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
/**
|
zc.on('complete', function () {
|
||||||
* Setup the "send" shortcut
|
$copyAsCurlEl.click();
|
||||||
*/
|
input.focus();
|
||||||
|
});
|
||||||
|
|
||||||
var CURRENT_REQ_ID = 0;
|
return zc;
|
||||||
|
}());
|
||||||
|
|
||||||
function sendCurrentRequestToES() {
|
/**
|
||||||
|
* Setup the "send" shortcut
|
||||||
|
*/
|
||||||
|
|
||||||
var req_id = ++CURRENT_REQ_ID;
|
var CURRENT_REQ_ID = 0;
|
||||||
|
|
||||||
input.getRequestsInRange(function (requests) {
|
function sendCurrentRequestToES() {
|
||||||
if (req_id != CURRENT_REQ_ID) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
output.update('');
|
|
||||||
|
|
||||||
if (requests.length == 0) {
|
var req_id = ++CURRENT_REQ_ID;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var isMultiRequest = requests.length > 1;
|
input.getRequestsInRange(function (requests) {
|
||||||
var finishChain = function () { /* noop */ };
|
|
||||||
|
|
||||||
var isFirstRequest = true;
|
|
||||||
|
|
||||||
var sendNextRequest = function () {
|
|
||||||
if (req_id != CURRENT_REQ_ID) {
|
if (req_id != CURRENT_REQ_ID) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
output.update('');
|
||||||
|
|
||||||
if (requests.length == 0) {
|
if (requests.length == 0) {
|
||||||
finishChain();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var req = requests.shift();
|
|
||||||
var es_path = req.url;
|
|
||||||
var es_method = req.method;
|
|
||||||
var es_data = req.data.join("\n");
|
|
||||||
if (es_data) {
|
|
||||||
es_data += "\n";
|
|
||||||
} //append a new line for bulk requests.
|
|
||||||
|
|
||||||
es.send(es_method, es_path, es_data).always(function (dataOrjqXHR, textStatus, jqXhrORerrorThrown) {
|
var isMultiRequest = requests.length > 1;
|
||||||
|
var finishChain = function () { /* noop */ };
|
||||||
|
|
||||||
|
var isFirstRequest = true;
|
||||||
|
|
||||||
|
var sendNextRequest = function () {
|
||||||
if (req_id != CURRENT_REQ_ID) {
|
if (req_id != CURRENT_REQ_ID) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var xhr;
|
if (requests.length == 0) {
|
||||||
if (dataOrjqXHR.promise) {
|
finishChain();
|
||||||
xhr = dataOrjqXHR;
|
return;
|
||||||
}
|
}
|
||||||
else {
|
var req = requests.shift();
|
||||||
xhr = jqXhrORerrorThrown;
|
var es_path = req.url;
|
||||||
}
|
var es_method = req.method;
|
||||||
function modeForContentType(contentType) {
|
var es_data = req.data.join("\n");
|
||||||
if (contentType.indexOf("text/plain") >= 0) {
|
if (es_data) {
|
||||||
return "ace/mode/text";
|
es_data += "\n";
|
||||||
|
} //append a new line for bulk requests.
|
||||||
|
|
||||||
|
es.send(es_method, es_path, es_data).always(function (dataOrjqXHR, textStatus, jqXhrORerrorThrown) {
|
||||||
|
if (req_id != CURRENT_REQ_ID) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
else if (contentType.indexOf("application/yaml") >= 0) {
|
var xhr;
|
||||||
return "ace/mode/yaml";
|
if (dataOrjqXHR.promise) {
|
||||||
}
|
xhr = dataOrjqXHR;
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof xhr.status == "number" &&
|
|
||||||
// things like DELETE index where the index is not there are OK.
|
|
||||||
((xhr.status >= 200 && xhr.status < 300) || xhr.status == 404)
|
|
||||||
) {
|
|
||||||
// we have someone on the other side. Add to history
|
|
||||||
history.addToHistory(es_path, es_method, es_data);
|
|
||||||
|
|
||||||
|
|
||||||
let value = xhr.responseText;
|
|
||||||
let mode = modeForContentType(xhr.getAllResponseHeaders("Content-Type") || "");
|
|
||||||
|
|
||||||
if (mode === null || mode === "application/json") {
|
|
||||||
// assume json - auto pretty
|
|
||||||
try {
|
|
||||||
value = JSON.stringify(JSON.parse(value), null, 2);
|
|
||||||
}
|
|
||||||
catch (e) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isMultiRequest) {
|
|
||||||
value = "# " + req.method + " " + req.url + "\n" + value;
|
|
||||||
}
|
|
||||||
if (isFirstRequest) {
|
|
||||||
output.update(value, mode);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
output.append("\n" + value);
|
xhr = jqXhrORerrorThrown;
|
||||||
}
|
}
|
||||||
isFirstRequest = false;
|
function modeForContentType(contentType) {
|
||||||
// single request terminate via sendNextRequest as well
|
if (contentType.indexOf("text/plain") >= 0) {
|
||||||
sendNextRequest();
|
return "ace/mode/text";
|
||||||
}
|
}
|
||||||
else {
|
else if (contentType.indexOf("application/yaml") >= 0) {
|
||||||
let value, mode;
|
return "ace/mode/yaml";
|
||||||
if (xhr.responseText) {
|
}
|
||||||
value = xhr.responseText; // ES error should be shown
|
return null;
|
||||||
mode = modeForContentType(xhr.getAllResponseHeaders("Content-Type") || "");
|
}
|
||||||
if (value[0] == "{") {
|
|
||||||
|
if (typeof xhr.status == "number" &&
|
||||||
|
// things like DELETE index where the index is not there are OK.
|
||||||
|
((xhr.status >= 200 && xhr.status < 300) || xhr.status == 404)
|
||||||
|
) {
|
||||||
|
// we have someone on the other side. Add to history
|
||||||
|
history.addToHistory(es_path, es_method, es_data);
|
||||||
|
|
||||||
|
|
||||||
|
let value = xhr.responseText;
|
||||||
|
let mode = modeForContentType(xhr.getAllResponseHeaders("Content-Type") || "");
|
||||||
|
|
||||||
|
if (mode === null || mode === "application/json") {
|
||||||
|
// assume json - auto pretty
|
||||||
try {
|
try {
|
||||||
value = JSON.stringify(JSON.parse(value), null, 2);
|
value = JSON.stringify(JSON.parse(value), null, 2);
|
||||||
}
|
}
|
||||||
catch (e) {
|
catch (e) {
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
value = "Request failed to get to the server (status code: " + xhr.status + ")";
|
if (isMultiRequest) {
|
||||||
mode = 'ace/mode/text';
|
value = "# " + req.method + " " + req.url + "\n" + value;
|
||||||
}
|
}
|
||||||
if (isMultiRequest) {
|
if (isFirstRequest) {
|
||||||
value = "# " + req.method + " " + req.url + "\n" + value;
|
output.update(value, mode);
|
||||||
}
|
}
|
||||||
if (isFirstRequest) {
|
else {
|
||||||
output.update(value, mode);
|
output.append("\n" + value);
|
||||||
|
}
|
||||||
|
isFirstRequest = false;
|
||||||
|
// single request terminate via sendNextRequest as well
|
||||||
|
sendNextRequest();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
output.append("\n" + value);
|
let value, mode;
|
||||||
|
if (xhr.responseText) {
|
||||||
|
value = xhr.responseText; // ES error should be shown
|
||||||
|
mode = modeForContentType(xhr.getAllResponseHeaders("Content-Type") || "");
|
||||||
|
if (value[0] == "{") {
|
||||||
|
try {
|
||||||
|
value = JSON.stringify(JSON.parse(value), null, 2);
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
value = "Request failed to get to the server (status code: " + xhr.status + ")";
|
||||||
|
mode = 'ace/mode/text';
|
||||||
|
}
|
||||||
|
if (isMultiRequest) {
|
||||||
|
value = "# " + req.method + " " + req.url + "\n" + value;
|
||||||
|
}
|
||||||
|
if (isFirstRequest) {
|
||||||
|
output.update(value, mode);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
output.append("\n" + value);
|
||||||
|
}
|
||||||
|
finishChain();
|
||||||
}
|
}
|
||||||
finishChain();
|
});
|
||||||
}
|
};
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
sendNextRequest();
|
sendNextRequest();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
input.commands.addCommand({
|
||||||
|
name: 'send to elasticsearch',
|
||||||
|
bindKey: {win: 'Ctrl-Enter', mac: 'Command-Enter'},
|
||||||
|
exec: sendCurrentRequestToES
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
input.commands.addCommand({
|
/**
|
||||||
name: 'send to elasticsearch',
|
* Init the editor
|
||||||
bindKey: {win: 'Ctrl-Enter', mac: 'Command-Enter'},
|
*/
|
||||||
exec: sendCurrentRequestToES
|
if (settings) {
|
||||||
});
|
settings.applyCurrentSettings(input);
|
||||||
|
}
|
||||||
|
input.focus();
|
||||||
|
input.highlightCurrentRequestsAndUpdateActionBar();
|
||||||
|
|
||||||
|
input.sendCurrentRequestToES = sendCurrentRequestToES;
|
||||||
|
require('./input_resize')(input, output);
|
||||||
|
|
||||||
/**
|
return input;
|
||||||
* Init the editor
|
};
|
||||||
*/
|
|
||||||
if (settings) {
|
|
||||||
settings.applyCurrentSettings(input);
|
|
||||||
}
|
|
||||||
input.focus();
|
|
||||||
input.highlightCurrentRequestsAndUpdateActionBar();
|
|
||||||
|
|
||||||
input.sendCurrentRequestToES = sendCurrentRequestToES;
|
export default function getInput() {
|
||||||
require('./input_resize')(input, output);
|
return input;
|
||||||
|
};
|
||||||
module.exports = input;
|
|
||||||
|
|
|
@ -4,63 +4,69 @@ let settings = require('./settings');
|
||||||
let OutputMode = require('./sense_editor/mode/output');
|
let OutputMode = require('./sense_editor/mode/output');
|
||||||
const smartResize = require('./smart_resize');
|
const smartResize = require('./smart_resize');
|
||||||
|
|
||||||
var $el = $("#output");
|
let output;
|
||||||
var output = ace.require('ace/ace').edit($el[0]);
|
export function initializeOutput($el) {
|
||||||
|
output = ace.require('ace/ace').edit($el[0]);
|
||||||
|
|
||||||
var outputMode = new OutputMode.Mode();
|
var outputMode = new OutputMode.Mode();
|
||||||
|
|
||||||
output.resize = smartResize(output);
|
output.resize = smartResize(output);
|
||||||
output.update = function (val, mode, cb) {
|
output.update = function (val, mode, cb) {
|
||||||
if (typeof mode === 'function') {
|
if (typeof mode === 'function') {
|
||||||
cb = mode;
|
cb = mode;
|
||||||
mode = void 0;
|
mode = void 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
var session = output.getSession();
|
||||||
|
|
||||||
|
session.setMode(val ? (mode || outputMode) : 'ace/mode/text');
|
||||||
|
session.setValue(val);
|
||||||
|
if (typeof cb === 'function') {
|
||||||
|
setTimeout(cb);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
output.append = function (val, fold_previous, cb) {
|
||||||
|
if (typeof fold_previous === 'function') {
|
||||||
|
cb = fold_previous;
|
||||||
|
fold_previous = true;
|
||||||
|
}
|
||||||
|
if (_.isUndefined(fold_previous)) {
|
||||||
|
fold_previous = true;
|
||||||
|
}
|
||||||
|
var session = output.getSession();
|
||||||
|
var lastLine = session.getLength();
|
||||||
|
if (fold_previous) {
|
||||||
|
output.moveCursorTo(Math.max(0, lastLine - 1), 0);
|
||||||
|
session.toggleFold(false);
|
||||||
|
|
||||||
|
}
|
||||||
|
session.insert({row: lastLine, column: 0}, "\n" + val);
|
||||||
|
output.moveCursorTo(lastLine + 1, 0);
|
||||||
|
if (typeof cb === 'function') {
|
||||||
|
setTimeout(cb);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
output.$el = $el;
|
||||||
|
|
||||||
|
(function (session) {
|
||||||
|
session.setMode("ace/mode/text");
|
||||||
|
session.setFoldStyle('markbeginend');
|
||||||
|
session.setTabSize(2);
|
||||||
|
session.setUseWrapMode(true);
|
||||||
|
}(output.getSession()));
|
||||||
|
|
||||||
|
output.setShowPrintMargin(false);
|
||||||
|
output.setReadOnly(true);
|
||||||
|
|
||||||
|
if (settings) {
|
||||||
|
settings.applyCurrentSettings(output);
|
||||||
}
|
}
|
||||||
|
|
||||||
var session = output.getSession();
|
return output;
|
||||||
|
|
||||||
session.setMode(val ? (mode || outputMode) : 'ace/mode/text');
|
|
||||||
session.setValue(val);
|
|
||||||
if (typeof cb === 'function') {
|
|
||||||
setTimeout(cb);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
output.append = function (val, fold_previous, cb) {
|
export default function getOutput() {
|
||||||
if (typeof fold_previous === 'function') {
|
return output;
|
||||||
cb = fold_previous;
|
|
||||||
fold_previous = true;
|
|
||||||
}
|
|
||||||
if (_.isUndefined(fold_previous)) {
|
|
||||||
fold_previous = true;
|
|
||||||
}
|
|
||||||
var session = output.getSession();
|
|
||||||
var lastLine = session.getLength();
|
|
||||||
if (fold_previous) {
|
|
||||||
output.moveCursorTo(Math.max(0, lastLine - 1), 0);
|
|
||||||
session.toggleFold(false);
|
|
||||||
|
|
||||||
}
|
|
||||||
session.insert({row: lastLine, column: 0}, "\n" + val);
|
|
||||||
output.moveCursorTo(lastLine + 1, 0);
|
|
||||||
if (typeof cb === 'function') {
|
|
||||||
setTimeout(cb);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
output.$el = $el;
|
|
||||||
|
|
||||||
(function (session) {
|
|
||||||
session.setMode("ace/mode/text");
|
|
||||||
session.setFoldStyle('markbeginend');
|
|
||||||
session.setTabSize(2);
|
|
||||||
session.setUseWrapMode(true);
|
|
||||||
}(output.getSession()));
|
|
||||||
|
|
||||||
output.setShowPrintMargin(false);
|
|
||||||
output.setReadOnly(true);
|
|
||||||
|
|
||||||
if (settings) {
|
|
||||||
settings.applyCurrentSettings(output);
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = output;
|
|
||||||
|
|
|
@ -39,8 +39,8 @@ function setAutocomplete(settings) {
|
||||||
|
|
||||||
function applyCurrentSettings(editor) {
|
function applyCurrentSettings(editor) {
|
||||||
if (typeof editor === 'undefined') {
|
if (typeof editor === 'undefined') {
|
||||||
applyCurrentSettings(require('./input'));
|
applyCurrentSettings(require('./input')());
|
||||||
applyCurrentSettings(require('./output'));
|
applyCurrentSettings(require('./output')());
|
||||||
}
|
}
|
||||||
if (editor) {
|
if (editor) {
|
||||||
editor.getSession().setUseWrapMode(getWrapMode());
|
editor.getSession().setUseWrapMode(getWrapMode());
|
||||||
|
@ -60,7 +60,7 @@ function updateSettings({ fontSize, wrapMode, autocomplete}) {
|
||||||
setFontSize(fontSize);
|
setFontSize(fontSize);
|
||||||
setWrapMode(wrapMode);
|
setWrapMode(wrapMode);
|
||||||
setAutocomplete(autocomplete);
|
setAutocomplete(autocomplete);
|
||||||
require('./input').focus();
|
require('./input')().focus();
|
||||||
return getCurrentSettings();
|
return getCurrentSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
require('ace/ace.js');
|
require('ace/ace.js');
|
||||||
module.exports = window.ace;
|
module.exports = window.consoleAce;
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
|
|
||||||
(function() {
|
(function() {
|
||||||
|
|
||||||
var ACE_NAMESPACE = "ace";
|
var ACE_NAMESPACE = "consoleAce";
|
||||||
|
|
||||||
var global = (function() {
|
var global = (function() {
|
||||||
return this;
|
return this;
|
||||||
|
@ -169,7 +169,7 @@ exportAce(ACE_NAMESPACE);
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
|
||||||
ace.define('ace/ace', ['require', 'exports', 'module' , 'ace/lib/fixoldbrowsers', 'ace/lib/dom', 'ace/lib/event', 'ace/editor', 'ace/edit_session', 'ace/undomanager', 'ace/virtual_renderer', 'ace/multi_select', 'ace/worker/worker_client', 'ace/keyboard/hash_handler', 'ace/placeholder', 'ace/mode/folding/fold_mode', 'ace/theme/textmate', 'ace/ext/error_marker', 'ace/config'], function(require, exports, module) {
|
consoleAce.define('ace/ace', ['require', 'exports', 'module' , 'ace/lib/fixoldbrowsers', 'ace/lib/dom', 'ace/lib/event', 'ace/editor', 'ace/edit_session', 'ace/undomanager', 'ace/virtual_renderer', 'ace/multi_select', 'ace/worker/worker_client', 'ace/keyboard/hash_handler', 'ace/placeholder', 'ace/mode/folding/fold_mode', 'ace/theme/textmate', 'ace/ext/error_marker', 'ace/config'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
require("./lib/fixoldbrowsers");
|
require("./lib/fixoldbrowsers");
|
||||||
|
@ -230,7 +230,7 @@ exports.EditSession = EditSession;
|
||||||
exports.UndoManager = UndoManager;
|
exports.UndoManager = UndoManager;
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/lib/fixoldbrowsers', ['require', 'exports', 'module' , 'ace/lib/regexp', 'ace/lib/es5-shim'], function(require, exports, module) {
|
consoleAce.define('ace/lib/fixoldbrowsers', ['require', 'exports', 'module' , 'ace/lib/regexp', 'ace/lib/es5-shim'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
require("./regexp");
|
require("./regexp");
|
||||||
|
@ -238,7 +238,7 @@ require("./es5-shim");
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/lib/regexp', ['require', 'exports', 'module' ], function(require, exports, module) {
|
consoleAce.define('ace/lib/regexp', ['require', 'exports', 'module' ], function(require, exports, module) {
|
||||||
|
|
||||||
var real = {
|
var real = {
|
||||||
exec: RegExp.prototype.exec,
|
exec: RegExp.prototype.exec,
|
||||||
|
@ -310,7 +310,7 @@ ace.define('ace/lib/regexp', ['require', 'exports', 'module' ], function(require
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/lib/es5-shim', ['require', 'exports', 'module' ], function(require, exports, module) {
|
consoleAce.define('ace/lib/es5-shim', ['require', 'exports', 'module' ], function(require, exports, module) {
|
||||||
|
|
||||||
function Empty() {}
|
function Empty() {}
|
||||||
|
|
||||||
|
@ -1007,7 +1007,7 @@ var toObject = function (o) {
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/lib/dom', ['require', 'exports', 'module' ], function(require, exports, module) {
|
consoleAce.define('ace/lib/dom', ['require', 'exports', 'module' ], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
if (typeof document == "undefined")
|
if (typeof document == "undefined")
|
||||||
|
@ -1240,7 +1240,7 @@ exports.getParentWindow = function(document) {
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/lib/event', ['require', 'exports', 'module' , 'ace/lib/keys', 'ace/lib/useragent', 'ace/lib/dom'], function(require, exports, module) {
|
consoleAce.define('ace/lib/event', ['require', 'exports', 'module' , 'ace/lib/keys', 'ace/lib/useragent', 'ace/lib/dom'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var keys = require("./keys");
|
var keys = require("./keys");
|
||||||
|
@ -1555,7 +1555,7 @@ else
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/lib/keys', ['require', 'exports', 'module' , 'ace/lib/oop'], function(require, exports, module) {
|
consoleAce.define('ace/lib/keys', ['require', 'exports', 'module' , 'ace/lib/oop'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var oop = require("./oop");
|
var oop = require("./oop");
|
||||||
|
@ -1648,7 +1648,7 @@ exports.keyCodeToString = function(keyCode) {
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/lib/oop', ['require', 'exports', 'module' ], function(require, exports, module) {
|
consoleAce.define('ace/lib/oop', ['require', 'exports', 'module' ], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
exports.inherits = function(ctor, superCtor) {
|
exports.inherits = function(ctor, superCtor) {
|
||||||
|
@ -1676,7 +1676,7 @@ exports.implement = function(proto, mixin) {
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/lib/useragent', ['require', 'exports', 'module' ], function(require, exports, module) {
|
consoleAce.define('ace/lib/useragent', ['require', 'exports', 'module' ], function(require, exports, module) {
|
||||||
exports.OS = {
|
exports.OS = {
|
||||||
LINUX: "LINUX",
|
LINUX: "LINUX",
|
||||||
MAC: "MAC",
|
MAC: "MAC",
|
||||||
|
@ -1719,7 +1719,7 @@ exports.isTouchPad = ua.indexOf("TouchPad") >= 0;
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/editor', ['require', 'exports', 'module' , 'ace/lib/fixoldbrowsers', 'ace/lib/oop', 'ace/lib/dom', 'ace/lib/lang', 'ace/lib/useragent', 'ace/keyboard/textinput', 'ace/mouse/mouse_handler', 'ace/mouse/fold_handler', 'ace/keyboard/keybinding', 'ace/edit_session', 'ace/search', 'ace/range', 'ace/lib/event_emitter', 'ace/commands/command_manager', 'ace/commands/default_commands', 'ace/config'], function(require, exports, module) {
|
consoleAce.define('ace/editor', ['require', 'exports', 'module' , 'ace/lib/fixoldbrowsers', 'ace/lib/oop', 'ace/lib/dom', 'ace/lib/lang', 'ace/lib/useragent', 'ace/keyboard/textinput', 'ace/mouse/mouse_handler', 'ace/mouse/fold_handler', 'ace/keyboard/keybinding', 'ace/edit_session', 'ace/search', 'ace/range', 'ace/lib/event_emitter', 'ace/commands/command_manager', 'ace/commands/default_commands', 'ace/config'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
require("./lib/fixoldbrowsers");
|
require("./lib/fixoldbrowsers");
|
||||||
|
@ -3338,7 +3338,7 @@ config.defineOptions(Editor.prototype, "editor", {
|
||||||
exports.Editor = Editor;
|
exports.Editor = Editor;
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/lib/lang', ['require', 'exports', 'module' ], function(require, exports, module) {
|
consoleAce.define('ace/lib/lang', ['require', 'exports', 'module' ], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
exports.stringReverse = function(string) {
|
exports.stringReverse = function(string) {
|
||||||
|
@ -3521,7 +3521,7 @@ exports.delayedCall = function(fcn, defaultTimeout) {
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/keyboard/textinput', ['require', 'exports', 'module' , 'ace/lib/event', 'ace/lib/useragent', 'ace/lib/dom', 'ace/lib/lang'], function(require, exports, module) {
|
consoleAce.define('ace/keyboard/textinput', ['require', 'exports', 'module' , 'ace/lib/event', 'ace/lib/useragent', 'ace/lib/dom', 'ace/lib/lang'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var event = require("../lib/event");
|
var event = require("../lib/event");
|
||||||
|
@ -3966,7 +3966,7 @@ var TextInput = function(parentNode, host) {
|
||||||
exports.TextInput = TextInput;
|
exports.TextInput = TextInput;
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/mouse/mouse_handler', ['require', 'exports', 'module' , 'ace/lib/event', 'ace/lib/useragent', 'ace/mouse/default_handlers', 'ace/mouse/default_gutter_handler', 'ace/mouse/mouse_event', 'ace/mouse/dragdrop_handler', 'ace/config'], function(require, exports, module) {
|
consoleAce.define('ace/mouse/mouse_handler', ['require', 'exports', 'module' , 'ace/lib/event', 'ace/lib/useragent', 'ace/mouse/default_handlers', 'ace/mouse/default_gutter_handler', 'ace/mouse/mouse_event', 'ace/mouse/dragdrop_handler', 'ace/config'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var event = require("../lib/event");
|
var event = require("../lib/event");
|
||||||
|
@ -4095,7 +4095,7 @@ config.defineOptions(MouseHandler.prototype, "mouseHandler", {
|
||||||
exports.MouseHandler = MouseHandler;
|
exports.MouseHandler = MouseHandler;
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/mouse/default_handlers', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/event', 'ace/lib/useragent'], function(require, exports, module) {
|
consoleAce.define('ace/mouse/default_handlers', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/event', 'ace/lib/useragent'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var dom = require("../lib/dom");
|
var dom = require("../lib/dom");
|
||||||
|
@ -4332,7 +4332,7 @@ function calcRangeOrientation(range, cursor) {
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/mouse/default_gutter_handler', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/event'], function(require, exports, module) {
|
consoleAce.define('ace/mouse/default_gutter_handler', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/event'], function(require, exports, module) {
|
||||||
|
|
||||||
var dom = require("../lib/dom");
|
var dom = require("../lib/dom");
|
||||||
var event = require("../lib/event");
|
var event = require("../lib/event");
|
||||||
|
@ -4464,7 +4464,7 @@ exports.GutterHandler = GutterHandler;
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/mouse/mouse_event', ['require', 'exports', 'module' , 'ace/lib/event', 'ace/lib/useragent'], function(require, exports, module) {
|
consoleAce.define('ace/mouse/mouse_event', ['require', 'exports', 'module' , 'ace/lib/event', 'ace/lib/useragent'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var event = require("../lib/event");
|
var event = require("../lib/event");
|
||||||
|
@ -4538,7 +4538,7 @@ var MouseEvent = exports.MouseEvent = function(domEvent, editor) {
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/mouse/dragdrop_handler', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/event', 'ace/lib/useragent'], function(require, exports, module) {
|
consoleAce.define('ace/mouse/dragdrop_handler', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/event', 'ace/lib/useragent'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var dom = require("../lib/dom");
|
var dom = require("../lib/dom");
|
||||||
|
@ -4911,7 +4911,7 @@ exports.DragdropHandler = DragdropHandler;
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/config', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/lib/oop', 'ace/lib/net', 'ace/lib/event_emitter'], function(require, exports, module) {
|
consoleAce.define('ace/config', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/lib/oop', 'ace/lib/net', 'ace/lib/event_emitter'], function(require, exports, module) {
|
||||||
"no use strict";
|
"no use strict";
|
||||||
|
|
||||||
var lang = require("./lib/lang");
|
var lang = require("./lib/lang");
|
||||||
|
@ -5163,7 +5163,7 @@ exports.setDefaultValues = function(path, optionHash) {
|
||||||
};
|
};
|
||||||
|
|
||||||
});
|
});
|
||||||
ace.define('ace/lib/net', ['require', 'exports', 'module' , 'ace/lib/dom'], function(require, exports, module) {
|
consoleAce.define('ace/lib/net', ['require', 'exports', 'module' , 'ace/lib/dom'], function(require, exports, module) {
|
||||||
|
|
||||||
var dom = require("./dom");
|
var dom = require("./dom");
|
||||||
|
|
||||||
|
@ -5196,7 +5196,7 @@ exports.loadScript = function(path, callback) {
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/lib/event_emitter', ['require', 'exports', 'module' ], function(require, exports, module) {
|
consoleAce.define('ace/lib/event_emitter', ['require', 'exports', 'module' ], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var EventEmitter = {};
|
var EventEmitter = {};
|
||||||
|
@ -5322,7 +5322,7 @@ exports.EventEmitter = EventEmitter;
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/mouse/fold_handler', ['require', 'exports', 'module' ], function(require, exports, module) {
|
consoleAce.define('ace/mouse/fold_handler', ['require', 'exports', 'module' ], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
function FoldHandler(editor) {
|
function FoldHandler(editor) {
|
||||||
|
@ -5384,7 +5384,7 @@ exports.FoldHandler = FoldHandler;
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/keyboard/keybinding', ['require', 'exports', 'module' , 'ace/lib/keys', 'ace/lib/event'], function(require, exports, module) {
|
consoleAce.define('ace/keyboard/keybinding', ['require', 'exports', 'module' , 'ace/lib/keys', 'ace/lib/event'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var keyUtil = require("../lib/keys");
|
var keyUtil = require("../lib/keys");
|
||||||
|
@ -5488,7 +5488,7 @@ var KeyBinding = function(editor) {
|
||||||
exports.KeyBinding = KeyBinding;
|
exports.KeyBinding = KeyBinding;
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/edit_session', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/config', 'ace/lib/event_emitter', 'ace/selection', 'ace/mode/text', 'ace/range', 'ace/document', 'ace/background_tokenizer', 'ace/search_highlight', 'ace/edit_session/folding', 'ace/edit_session/bracket_match'], function(require, exports, module) {
|
consoleAce.define('ace/edit_session', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/config', 'ace/lib/event_emitter', 'ace/selection', 'ace/mode/text', 'ace/range', 'ace/document', 'ace/background_tokenizer', 'ace/search_highlight', 'ace/edit_session/folding', 'ace/edit_session/bracket_match'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var oop = require("./lib/oop");
|
var oop = require("./lib/oop");
|
||||||
|
@ -7181,7 +7181,7 @@ config.defineOptions(EditSession.prototype, "session", {
|
||||||
exports.EditSession = EditSession;
|
exports.EditSession = EditSession;
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/selection', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/lib/event_emitter', 'ace/range'], function(require, exports, module) {
|
consoleAce.define('ace/selection', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/lib/event_emitter', 'ace/range'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var oop = require("./lib/oop");
|
var oop = require("./lib/oop");
|
||||||
|
@ -7769,7 +7769,7 @@ var Selection = function(session) {
|
||||||
exports.Selection = Selection;
|
exports.Selection = Selection;
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/range', ['require', 'exports', 'module' ], function(require, exports, module) {
|
consoleAce.define('ace/range', ['require', 'exports', 'module' ], function(require, exports, module) {
|
||||||
|
|
||||||
var comparePoints = function(p1, p2) {
|
var comparePoints = function(p1, p2) {
|
||||||
return p1.row - p2.row || p1.column - p2.column;
|
return p1.row - p2.row || p1.column - p2.column;
|
||||||
|
@ -8008,7 +8008,7 @@ Range.comparePoints = function(p1, p2) {
|
||||||
exports.Range = Range;
|
exports.Range = Range;
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/mode/text', ['require', 'exports', 'module' , 'ace/tokenizer', 'ace/mode/text_highlight_rules', 'ace/mode/behaviour', 'ace/unicode', 'ace/lib/lang', 'ace/token_iterator', 'ace/range'], function(require, exports, module) {
|
consoleAce.define('ace/mode/text', ['require', 'exports', 'module' , 'ace/tokenizer', 'ace/mode/text_highlight_rules', 'ace/mode/behaviour', 'ace/unicode', 'ace/lib/lang', 'ace/token_iterator', 'ace/range'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var Tokenizer = require("../tokenizer").Tokenizer;
|
var Tokenizer = require("../tokenizer").Tokenizer;
|
||||||
|
@ -8360,7 +8360,7 @@ var Mode = function() {
|
||||||
exports.Mode = Mode;
|
exports.Mode = Mode;
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/tokenizer', ['require', 'exports', 'module' ], function(require, exports, module) {
|
consoleAce.define('ace/tokenizer', ['require', 'exports', 'module' ], function(require, exports, module) {
|
||||||
var MAX_TOKEN_COUNT = 1000;
|
var MAX_TOKEN_COUNT = 1000;
|
||||||
var Tokenizer = function(rules) {
|
var Tokenizer = function(rules) {
|
||||||
this.states = rules;
|
this.states = rules;
|
||||||
|
@ -8644,7 +8644,7 @@ var Tokenizer = function(rules) {
|
||||||
exports.Tokenizer = Tokenizer;
|
exports.Tokenizer = Tokenizer;
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/mode/text_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/lang'], function(require, exports, module) {
|
consoleAce.define('ace/mode/text_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/lang'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var lang = require("../lib/lang");
|
var lang = require("../lib/lang");
|
||||||
|
@ -8842,7 +8842,7 @@ var TextHighlightRules = function() {
|
||||||
exports.TextHighlightRules = TextHighlightRules;
|
exports.TextHighlightRules = TextHighlightRules;
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/mode/behaviour', ['require', 'exports', 'module' ], function(require, exports, module) {
|
consoleAce.define('ace/mode/behaviour', ['require', 'exports', 'module' ], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var Behaviour = function() {
|
var Behaviour = function() {
|
||||||
|
@ -8902,7 +8902,7 @@ var Behaviour = function() {
|
||||||
|
|
||||||
exports.Behaviour = Behaviour;
|
exports.Behaviour = Behaviour;
|
||||||
});
|
});
|
||||||
ace.define('ace/unicode', ['require', 'exports', 'module' ], function(require, exports, module) {
|
consoleAce.define('ace/unicode', ['require', 'exports', 'module' ], function(require, exports, module) {
|
||||||
exports.packages = {};
|
exports.packages = {};
|
||||||
|
|
||||||
addUnicodePackage({
|
addUnicodePackage({
|
||||||
|
@ -8953,7 +8953,7 @@ function addUnicodePackage (pack) {
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/token_iterator', ['require', 'exports', 'module' ], function(require, exports, module) {
|
consoleAce.define('ace/token_iterator', ['require', 'exports', 'module' ], function(require, exports, module) {
|
||||||
var TokenIterator = function(session, initialRow, initialColumn) {
|
var TokenIterator = function(session, initialRow, initialColumn) {
|
||||||
this.$session = session;
|
this.$session = session;
|
||||||
this.$row = initialRow;
|
this.$row = initialRow;
|
||||||
|
@ -9025,7 +9025,7 @@ var TokenIterator = function(session, initialRow, initialColumn) {
|
||||||
exports.TokenIterator = TokenIterator;
|
exports.TokenIterator = TokenIterator;
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/document', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter', 'ace/range', 'ace/anchor'], function(require, exports, module) {
|
consoleAce.define('ace/document', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter', 'ace/range', 'ace/anchor'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var oop = require("./lib/oop");
|
var oop = require("./lib/oop");
|
||||||
|
@ -9381,7 +9381,7 @@ var Document = function(text) {
|
||||||
exports.Document = Document;
|
exports.Document = Document;
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/anchor', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter'], function(require, exports, module) {
|
consoleAce.define('ace/anchor', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var oop = require("./lib/oop");
|
var oop = require("./lib/oop");
|
||||||
|
@ -9528,7 +9528,7 @@ var Anchor = exports.Anchor = function(doc, row, column) {
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/background_tokenizer', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter'], function(require, exports, module) {
|
consoleAce.define('ace/background_tokenizer', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var oop = require("./lib/oop");
|
var oop = require("./lib/oop");
|
||||||
|
@ -9675,7 +9675,7 @@ var BackgroundTokenizer = function(tokenizer, editor) {
|
||||||
exports.BackgroundTokenizer = BackgroundTokenizer;
|
exports.BackgroundTokenizer = BackgroundTokenizer;
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/search_highlight', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/lib/oop', 'ace/range'], function(require, exports, module) {
|
consoleAce.define('ace/search_highlight', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/lib/oop', 'ace/range'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var lang = require("./lib/lang");
|
var lang = require("./lib/lang");
|
||||||
|
@ -9727,7 +9727,7 @@ var SearchHighlight = function(regExp, clazz, type) {
|
||||||
exports.SearchHighlight = SearchHighlight;
|
exports.SearchHighlight = SearchHighlight;
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/edit_session/folding', ['require', 'exports', 'module' , 'ace/range', 'ace/edit_session/fold_line', 'ace/edit_session/fold', 'ace/token_iterator'], function(require, exports, module) {
|
consoleAce.define('ace/edit_session/folding', ['require', 'exports', 'module' , 'ace/range', 'ace/edit_session/fold_line', 'ace/edit_session/fold', 'ace/token_iterator'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var Range = require("../range").Range;
|
var Range = require("../range").Range;
|
||||||
|
@ -10459,7 +10459,7 @@ exports.Folding = Folding;
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/edit_session/fold_line', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {
|
consoleAce.define('ace/edit_session/fold_line', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var Range = require("../range").Range;
|
var Range = require("../range").Range;
|
||||||
|
@ -10677,7 +10677,7 @@ function FoldLine(foldData, folds) {
|
||||||
exports.FoldLine = FoldLine;
|
exports.FoldLine = FoldLine;
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/edit_session/fold', ['require', 'exports', 'module' , 'ace/range', 'ace/range_list', 'ace/lib/oop'], function(require, exports, module) {
|
consoleAce.define('ace/edit_session/fold', ['require', 'exports', 'module' , 'ace/range', 'ace/range_list', 'ace/lib/oop'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var Range = require("../range").Range;
|
var Range = require("../range").Range;
|
||||||
|
@ -10781,7 +10781,7 @@ function restoreRange(range, anchor) {
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/range_list', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {
|
consoleAce.define('ace/range_list', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {
|
||||||
|
|
||||||
var Range = require("./range").Range;
|
var Range = require("./range").Range;
|
||||||
var comparePoints = Range.comparePoints;
|
var comparePoints = Range.comparePoints;
|
||||||
|
@ -10988,7 +10988,7 @@ var RangeList = function() {
|
||||||
exports.RangeList = RangeList;
|
exports.RangeList = RangeList;
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/edit_session/bracket_match', ['require', 'exports', 'module' , 'ace/token_iterator', 'ace/range'], function(require, exports, module) {
|
consoleAce.define('ace/edit_session/bracket_match', ['require', 'exports', 'module' , 'ace/token_iterator', 'ace/range'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var TokenIterator = require("../token_iterator").TokenIterator;
|
var TokenIterator = require("../token_iterator").TokenIterator;
|
||||||
|
@ -11168,7 +11168,7 @@ exports.BracketMatch = BracketMatch;
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/search', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/lib/oop', 'ace/range'], function(require, exports, module) {
|
consoleAce.define('ace/search', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/lib/oop', 'ace/range'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var lang = require("./lib/lang");
|
var lang = require("./lib/lang");
|
||||||
|
@ -11457,7 +11457,7 @@ var Search = function() {
|
||||||
|
|
||||||
exports.Search = Search;
|
exports.Search = Search;
|
||||||
});
|
});
|
||||||
ace.define('ace/commands/command_manager', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/keyboard/hash_handler', 'ace/lib/event_emitter'], function(require, exports, module) {
|
consoleAce.define('ace/commands/command_manager', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/keyboard/hash_handler', 'ace/lib/event_emitter'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var oop = require("../lib/oop");
|
var oop = require("../lib/oop");
|
||||||
|
@ -11557,7 +11557,7 @@ exports.CommandManager = CommandManager;
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/keyboard/hash_handler', ['require', 'exports', 'module' , 'ace/lib/keys', 'ace/lib/useragent'], function(require, exports, module) {
|
consoleAce.define('ace/keyboard/hash_handler', ['require', 'exports', 'module' , 'ace/lib/keys', 'ace/lib/useragent'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var keyUtil = require("../lib/keys");
|
var keyUtil = require("../lib/keys");
|
||||||
|
@ -11717,7 +11717,7 @@ function HashHandler(config, platform) {
|
||||||
exports.HashHandler = HashHandler;
|
exports.HashHandler = HashHandler;
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/commands/default_commands', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/config'], function(require, exports, module) {
|
consoleAce.define('ace/commands/default_commands', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/config'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var lang = require("../lib/lang");
|
var lang = require("../lib/lang");
|
||||||
|
@ -12261,7 +12261,7 @@ exports.commands = [{
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/undomanager', ['require', 'exports', 'module' ], function(require, exports, module) {
|
consoleAce.define('ace/undomanager', ['require', 'exports', 'module' ], function(require, exports, module) {
|
||||||
var UndoManager = function() {
|
var UndoManager = function() {
|
||||||
this.reset();
|
this.reset();
|
||||||
};
|
};
|
||||||
|
@ -12328,7 +12328,7 @@ var UndoManager = function() {
|
||||||
exports.UndoManager = UndoManager;
|
exports.UndoManager = UndoManager;
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/virtual_renderer', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/dom', 'ace/lib/useragent', 'ace/config', 'ace/layer/gutter', 'ace/layer/marker', 'ace/layer/text', 'ace/layer/cursor', 'ace/scrollbar', 'ace/renderloop', 'ace/lib/event_emitter'], function(require, exports, module) {
|
consoleAce.define('ace/virtual_renderer', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/dom', 'ace/lib/useragent', 'ace/config', 'ace/layer/gutter', 'ace/layer/marker', 'ace/layer/text', 'ace/layer/cursor', 'ace/scrollbar', 'ace/renderloop', 'ace/lib/event_emitter'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var oop = require("./lib/oop");
|
var oop = require("./lib/oop");
|
||||||
|
@ -13930,7 +13930,7 @@ config.defineOptions(VirtualRenderer.prototype, "renderer", {
|
||||||
exports.VirtualRenderer = VirtualRenderer;
|
exports.VirtualRenderer = VirtualRenderer;
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/layer/gutter', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/oop', 'ace/lib/lang', 'ace/lib/event_emitter'], function(require, exports, module) {
|
consoleAce.define('ace/layer/gutter', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/oop', 'ace/lib/lang', 'ace/lib/event_emitter'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var dom = require("../lib/dom");
|
var dom = require("../lib/dom");
|
||||||
|
@ -14170,7 +14170,7 @@ exports.Gutter = Gutter;
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/layer/marker', ['require', 'exports', 'module' , 'ace/range', 'ace/lib/dom'], function(require, exports, module) {
|
consoleAce.define('ace/layer/marker', ['require', 'exports', 'module' , 'ace/range', 'ace/lib/dom'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var Range = require("../range").Range;
|
var Range = require("../range").Range;
|
||||||
|
@ -14345,7 +14345,7 @@ exports.Marker = Marker;
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/layer/text', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/dom', 'ace/lib/lang', 'ace/lib/useragent', 'ace/lib/event_emitter'], function(require, exports, module) {
|
consoleAce.define('ace/layer/text', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/dom', 'ace/lib/lang', 'ace/lib/useragent', 'ace/lib/event_emitter'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var oop = require("../lib/oop");
|
var oop = require("../lib/oop");
|
||||||
|
@ -14953,7 +14953,7 @@ exports.Text = Text;
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/layer/cursor', ['require', 'exports', 'module' , 'ace/lib/dom'], function(require, exports, module) {
|
consoleAce.define('ace/layer/cursor', ['require', 'exports', 'module' , 'ace/lib/dom'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var dom = require("../lib/dom");
|
var dom = require("../lib/dom");
|
||||||
|
@ -15139,7 +15139,7 @@ exports.Cursor = Cursor;
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/scrollbar', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/dom', 'ace/lib/event', 'ace/lib/event_emitter'], function(require, exports, module) {
|
consoleAce.define('ace/scrollbar', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/dom', 'ace/lib/event', 'ace/lib/event_emitter'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var oop = require("./lib/oop");
|
var oop = require("./lib/oop");
|
||||||
|
@ -15262,7 +15262,7 @@ exports.VScrollBar = VScrollBar;
|
||||||
exports.HScrollBar = HScrollBar;
|
exports.HScrollBar = HScrollBar;
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/renderloop', ['require', 'exports', 'module' , 'ace/lib/event'], function(require, exports, module) {
|
consoleAce.define('ace/renderloop', ['require', 'exports', 'module' , 'ace/lib/event'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var event = require("./lib/event");
|
var event = require("./lib/event");
|
||||||
|
@ -15299,7 +15299,7 @@ var RenderLoop = function(onRender, win) {
|
||||||
exports.RenderLoop = RenderLoop;
|
exports.RenderLoop = RenderLoop;
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/multi_select', ['require', 'exports', 'module' , 'ace/range_list', 'ace/range', 'ace/selection', 'ace/mouse/multi_select_handler', 'ace/lib/event', 'ace/lib/lang', 'ace/commands/multi_select_commands', 'ace/search', 'ace/edit_session', 'ace/editor', 'ace/config'], function(require, exports, module) {
|
consoleAce.define('ace/multi_select', ['require', 'exports', 'module' , 'ace/range_list', 'ace/range', 'ace/selection', 'ace/mouse/multi_select_handler', 'ace/lib/event', 'ace/lib/lang', 'ace/commands/multi_select_commands', 'ace/search', 'ace/edit_session', 'ace/editor', 'ace/config'], function(require, exports, module) {
|
||||||
|
|
||||||
var RangeList = require("./range_list").RangeList;
|
var RangeList = require("./range_list").RangeList;
|
||||||
var Range = require("./range").Range;
|
var Range = require("./range").Range;
|
||||||
|
@ -16080,7 +16080,7 @@ require("./config").defineOptions(Editor.prototype, "editor", {
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/mouse/multi_select_handler', ['require', 'exports', 'module' , 'ace/lib/event'], function(require, exports, module) {
|
consoleAce.define('ace/mouse/multi_select_handler', ['require', 'exports', 'module' , 'ace/lib/event'], function(require, exports, module) {
|
||||||
|
|
||||||
var event = require("../lib/event");
|
var event = require("../lib/event");
|
||||||
function isSamePoint(p1, p2) {
|
function isSamePoint(p1, p2) {
|
||||||
|
@ -16210,7 +16210,7 @@ exports.onMouseDown = onMouseDown;
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/commands/multi_select_commands', ['require', 'exports', 'module' , 'ace/keyboard/hash_handler'], function(require, exports, module) {
|
consoleAce.define('ace/commands/multi_select_commands', ['require', 'exports', 'module' , 'ace/keyboard/hash_handler'], function(require, exports, module) {
|
||||||
exports.defaultCommands = [{
|
exports.defaultCommands = [{
|
||||||
name: "addCursorAbove",
|
name: "addCursorAbove",
|
||||||
exec: function(editor) { editor.selectMoreLines(-1); },
|
exec: function(editor) { editor.selectMoreLines(-1); },
|
||||||
|
@ -16274,7 +16274,7 @@ exports.keyboardHandler = new HashHandler(exports.multiSelectCommands);
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/worker/worker_client', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter', 'ace/config'], function(require, exports, module) {
|
consoleAce.define('ace/worker/worker_client', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter', 'ace/config'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var oop = require("../lib/oop");
|
var oop = require("../lib/oop");
|
||||||
|
@ -16458,7 +16458,7 @@ exports.UIWorkerClient = UIWorkerClient;
|
||||||
exports.WorkerClient = WorkerClient;
|
exports.WorkerClient = WorkerClient;
|
||||||
|
|
||||||
});
|
});
|
||||||
ace.define('ace/placeholder', ['require', 'exports', 'module' , 'ace/range', 'ace/lib/event_emitter', 'ace/lib/oop'], function(require, exports, module) {
|
consoleAce.define('ace/placeholder', ['require', 'exports', 'module' , 'ace/range', 'ace/lib/event_emitter', 'ace/lib/oop'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var Range = require("./range").Range;
|
var Range = require("./range").Range;
|
||||||
|
@ -16630,7 +16630,7 @@ var PlaceHolder = function(session, length, pos, others, mainClass, othersClass)
|
||||||
exports.PlaceHolder = PlaceHolder;
|
exports.PlaceHolder = PlaceHolder;
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {
|
consoleAce.define('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var Range = require("../../range").Range;
|
var Range = require("../../range").Range;
|
||||||
|
@ -16719,7 +16719,7 @@ var FoldMode = exports.FoldMode = function() {};
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/theme/textmate', ['require', 'exports', 'module' , 'ace/lib/dom'], function(require, exports, module) {
|
consoleAce.define('ace/theme/textmate', ['require', 'exports', 'module' , 'ace/lib/dom'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
exports.isDark = false;
|
exports.isDark = false;
|
||||||
|
@ -16849,7 +16849,7 @@ var dom = require("../lib/dom");
|
||||||
dom.importCssString(exports.cssText, exports.cssClass);
|
dom.importCssString(exports.cssText, exports.cssClass);
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/ext/error_marker', ['require', 'exports', 'module' , 'ace/line_widgets', 'ace/lib/dom', 'ace/range'], function(require, exports, module) {
|
consoleAce.define('ace/ext/error_marker', ['require', 'exports', 'module' , 'ace/line_widgets', 'ace/lib/dom', 'ace/range'], function(require, exports, module) {
|
||||||
|
|
||||||
var LineWidgets = require("ace/line_widgets").LineWidgets;
|
var LineWidgets = require("ace/line_widgets").LineWidgets;
|
||||||
var dom = require("ace/lib/dom");
|
var dom = require("ace/lib/dom");
|
||||||
|
@ -17030,7 +17030,7 @@ dom.importCssString("\
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/line_widgets', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/dom', 'ace/range'], function(require, exports, module) {
|
consoleAce.define('ace/line_widgets', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/dom', 'ace/range'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var oop = require("./lib/oop");
|
var oop = require("./lib/oop");
|
||||||
|
@ -17299,12 +17299,11 @@ exports.LineWidgets = LineWidgets;
|
||||||
|
|
||||||
;
|
;
|
||||||
(function() {
|
(function() {
|
||||||
ace.require(["ace/ace"], function(a) {
|
consoleAce.require(["ace/ace"], function(a) {
|
||||||
a && a.config.init();
|
a && a.config.init();
|
||||||
if (!window.ace)
|
if (!window.consoleAce)
|
||||||
window.ace = {};
|
window.consoleAce = {};
|
||||||
for (var key in a) if (a.hasOwnProperty(key))
|
for (var key in a) if (a.hasOwnProperty(key))
|
||||||
ace[key] = a[key];
|
consoleAce[key] = a[key];
|
||||||
});
|
});
|
||||||
})();
|
})();
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
*
|
*
|
||||||
* ***** END LICENSE BLOCK ***** */
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
ace.define('ace/ext/language_tools', ['require', 'exports', 'module' , 'ace/snippets', 'ace/autocomplete', 'ace/config', 'ace/autocomplete/text_completer', 'ace/editor'], function(require, exports, module) {
|
consoleAce.define('ace/ext/language_tools', ['require', 'exports', 'module' , 'ace/snippets', 'ace/autocomplete', 'ace/config', 'ace/autocomplete/text_completer', 'ace/editor'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var snippetManager = require("../snippets").snippetManager;
|
var snippetManager = require("../snippets").snippetManager;
|
||||||
|
@ -144,7 +144,7 @@ require("../config").defineOptions(Editor.prototype, "editor", {
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/snippets', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/range', 'ace/keyboard/hash_handler', 'ace/tokenizer', 'ace/lib/dom'], function(require, exports, module) {
|
consoleAce.define('ace/snippets', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/range', 'ace/keyboard/hash_handler', 'ace/tokenizer', 'ace/lib/dom'], function(require, exports, module) {
|
||||||
|
|
||||||
var lang = require("./lib/lang")
|
var lang = require("./lib/lang")
|
||||||
var Range = require("./range").Range
|
var Range = require("./range").Range
|
||||||
|
@ -959,7 +959,7 @@ exports.snippetManager = new SnippetManager();
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/autocomplete', ['require', 'exports', 'module' , 'ace/keyboard/hash_handler', 'ace/autocomplete/popup', 'ace/autocomplete/util', 'ace/lib/event', 'ace/lib/lang', 'ace/snippets'], function(require, exports, module) {
|
consoleAce.define('ace/autocomplete', ['require', 'exports', 'module' , 'ace/keyboard/hash_handler', 'ace/autocomplete/popup', 'ace/autocomplete/util', 'ace/lib/event', 'ace/lib/lang', 'ace/snippets'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var HashHandler = require("./keyboard/hash_handler").HashHandler;
|
var HashHandler = require("./keyboard/hash_handler").HashHandler;
|
||||||
|
@ -1276,7 +1276,7 @@ exports.FilteredList = FilteredList;
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/autocomplete/popup', ['require', 'exports', 'module' , 'ace/edit_session', 'ace/virtual_renderer', 'ace/editor', 'ace/range', 'ace/lib/event', 'ace/lib/lang', 'ace/lib/dom'], function(require, exports, module) {
|
consoleAce.define('ace/autocomplete/popup', ['require', 'exports', 'module' , 'ace/edit_session', 'ace/virtual_renderer', 'ace/editor', 'ace/range', 'ace/lib/event', 'ace/lib/lang', 'ace/lib/dom'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var EditSession = require("../edit_session").EditSession;
|
var EditSession = require("../edit_session").EditSession;
|
||||||
|
@ -1575,7 +1575,7 @@ exports.AcePopup = AcePopup;
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/autocomplete/util', ['require', 'exports', 'module' ], function(require, exports, module) {
|
consoleAce.define('ace/autocomplete/util', ['require', 'exports', 'module' ], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
exports.parForEach = function(array, fn, callback) {
|
exports.parForEach = function(array, fn, callback) {
|
||||||
|
@ -1620,7 +1620,7 @@ exports.retrieveFollowingIdentifier = function(text, pos, regex) {
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/autocomplete/text_completer', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {
|
consoleAce.define('ace/autocomplete/text_completer', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {
|
||||||
var Range = require("ace/range").Range;
|
var Range = require("ace/range").Range;
|
||||||
|
|
||||||
var splitRegex = /[^a-zA-Z_0-9\$\-]+/;
|
var splitRegex = /[^a-zA-Z_0-9\$\-]+/;
|
||||||
|
@ -1662,4 +1662,4 @@ ace.define('ace/autocomplete/text_completer', ['require', 'exports', 'module' ,
|
||||||
};
|
};
|
||||||
}));
|
}));
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
*
|
*
|
||||||
* ***** END LICENSE BLOCK ***** */
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
ace.define('ace/ext/searchbox', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/lang', 'ace/lib/event', 'ace/keyboard/hash_handler', 'ace/lib/keys'], function(require, exports, module) {
|
consoleAce.define('ace/ext/searchbox', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/lang', 'ace/lib/event', 'ace/keyboard/hash_handler', 'ace/lib/keys'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var dom = require("../lib/dom");
|
var dom = require("../lib/dom");
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
*
|
*
|
||||||
* ***** END LICENSE BLOCK ***** */
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
ace.define('ace/mode/json', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/json_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle', 'ace/worker/worker_client'], function(require, exports, module) {
|
consoleAce.define('ace/mode/json', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/json_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle', 'ace/worker/worker_client'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var oop = require("../lib/oop");
|
var oop = require("../lib/oop");
|
||||||
|
@ -93,7 +93,7 @@ oop.inherits(Mode, TextMode);
|
||||||
exports.Mode = Mode;
|
exports.Mode = Mode;
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/mode/json_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
|
consoleAce.define('ace/mode/json_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var oop = require("../lib/oop");
|
var oop = require("../lib/oop");
|
||||||
|
@ -161,7 +161,7 @@ oop.inherits(JsonHighlightRules, TextHighlightRules);
|
||||||
exports.JsonHighlightRules = JsonHighlightRules;
|
exports.JsonHighlightRules = JsonHighlightRules;
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {
|
consoleAce.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var Range = require("../range").Range;
|
var Range = require("../range").Range;
|
||||||
|
@ -201,7 +201,7 @@ var MatchingBraceOutdent = function() {};
|
||||||
exports.MatchingBraceOutdent = MatchingBraceOutdent;
|
exports.MatchingBraceOutdent = MatchingBraceOutdent;
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) {
|
consoleAce.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var oop = require("../../lib/oop");
|
var oop = require("../../lib/oop");
|
||||||
|
@ -529,7 +529,7 @@ oop.inherits(CstyleBehaviour, Behaviour);
|
||||||
exports.CstyleBehaviour = CstyleBehaviour;
|
exports.CstyleBehaviour = CstyleBehaviour;
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {
|
consoleAce.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var oop = require("../../lib/oop");
|
var oop = require("../../lib/oop");
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
*
|
*
|
||||||
* ***** END LICENSE BLOCK ***** */
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
ace.define('ace/mode/yaml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/yaml_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/mode/folding/coffee'], function(require, exports, module) {
|
consoleAce.define('ace/mode/yaml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/yaml_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/mode/folding/coffee'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var oop = require("../lib/oop");
|
var oop = require("../lib/oop");
|
||||||
|
@ -78,7 +78,7 @@ exports.Mode = Mode;
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/mode/yaml_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
|
consoleAce.define('ace/mode/yaml_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var oop = require("../lib/oop");
|
var oop = require("../lib/oop");
|
||||||
|
@ -162,7 +162,7 @@ oop.inherits(YamlHighlightRules, TextHighlightRules);
|
||||||
exports.YamlHighlightRules = YamlHighlightRules;
|
exports.YamlHighlightRules = YamlHighlightRules;
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {
|
consoleAce.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var Range = require("../range").Range;
|
var Range = require("../range").Range;
|
||||||
|
@ -202,7 +202,7 @@ var MatchingBraceOutdent = function() {};
|
||||||
exports.MatchingBraceOutdent = MatchingBraceOutdent;
|
exports.MatchingBraceOutdent = MatchingBraceOutdent;
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/mode/folding/coffee', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range'], function(require, exports, module) {
|
consoleAce.define('ace/mode/folding/coffee', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var oop = require("../../lib/oop");
|
var oop = require("../../lib/oop");
|
||||||
|
|
|
@ -173,7 +173,7 @@ window.onmessage = function(e) {
|
||||||
};
|
};
|
||||||
})(this);// https://github.com/kriskowal/es5-shim
|
})(this);// https://github.com/kriskowal/es5-shim
|
||||||
|
|
||||||
ace.define('ace/lib/es5-shim', ['require', 'exports', 'module' ], function(require, exports, module) {
|
consoleAce.define('ace/lib/es5-shim', ['require', 'exports', 'module' ], function(require, exports, module) {
|
||||||
|
|
||||||
function Empty() {}
|
function Empty() {}
|
||||||
|
|
||||||
|
@ -870,7 +870,7 @@ var toObject = function (o) {
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/mode/json_worker', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/worker/mirror', 'ace/mode/json/json_parse'], function(require, exports, module) {
|
consoleAce.define('ace/mode/json_worker', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/worker/mirror', 'ace/mode/json/json_parse'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var oop = require("../lib/oop");
|
var oop = require("../lib/oop");
|
||||||
|
@ -908,7 +908,7 @@ oop.inherits(JsonWorker, Mirror);
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/lib/oop', ['require', 'exports', 'module' ], function(require, exports, module) {
|
consoleAce.define('ace/lib/oop', ['require', 'exports', 'module' ], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
exports.inherits = function(ctor, superCtor) {
|
exports.inherits = function(ctor, superCtor) {
|
||||||
|
@ -935,7 +935,7 @@ exports.implement = function(proto, mixin) {
|
||||||
};
|
};
|
||||||
|
|
||||||
});
|
});
|
||||||
ace.define('ace/worker/mirror', ['require', 'exports', 'module' , 'ace/document', 'ace/lib/lang'], function(require, exports, module) {
|
consoleAce.define('ace/worker/mirror', ['require', 'exports', 'module' , 'ace/document', 'ace/lib/lang'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var Document = require("../document").Document;
|
var Document = require("../document").Document;
|
||||||
|
@ -984,7 +984,7 @@ var Mirror = exports.Mirror = function(sender) {
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/document', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter', 'ace/range', 'ace/anchor'], function(require, exports, module) {
|
consoleAce.define('ace/document', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter', 'ace/range', 'ace/anchor'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var oop = require("./lib/oop");
|
var oop = require("./lib/oop");
|
||||||
|
@ -1340,7 +1340,7 @@ var Document = function(text) {
|
||||||
exports.Document = Document;
|
exports.Document = Document;
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/lib/event_emitter', ['require', 'exports', 'module' ], function(require, exports, module) {
|
consoleAce.define('ace/lib/event_emitter', ['require', 'exports', 'module' ], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var EventEmitter = {};
|
var EventEmitter = {};
|
||||||
|
@ -1466,7 +1466,7 @@ exports.EventEmitter = EventEmitter;
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/range', ['require', 'exports', 'module' ], function(require, exports, module) {
|
consoleAce.define('ace/range', ['require', 'exports', 'module' ], function(require, exports, module) {
|
||||||
|
|
||||||
var comparePoints = function(p1, p2) {
|
var comparePoints = function(p1, p2) {
|
||||||
return p1.row - p2.row || p1.column - p2.column;
|
return p1.row - p2.row || p1.column - p2.column;
|
||||||
|
@ -1705,7 +1705,7 @@ Range.comparePoints = function(p1, p2) {
|
||||||
exports.Range = Range;
|
exports.Range = Range;
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/anchor', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter'], function(require, exports, module) {
|
consoleAce.define('ace/anchor', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter'], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
var oop = require("./lib/oop");
|
var oop = require("./lib/oop");
|
||||||
|
@ -1852,7 +1852,7 @@ var Anchor = exports.Anchor = function(doc, row, column) {
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/lib/lang', ['require', 'exports', 'module' ], function(require, exports, module) {
|
consoleAce.define('ace/lib/lang', ['require', 'exports', 'module' ], function(require, exports, module) {
|
||||||
|
|
||||||
|
|
||||||
exports.stringReverse = function(string) {
|
exports.stringReverse = function(string) {
|
||||||
|
@ -2035,7 +2035,7 @@ exports.delayedCall = function(fcn, defaultTimeout) {
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
ace.define('ace/mode/json/json_parse', ['require', 'exports', 'module' ], function(require, exports, module) {
|
consoleAce.define('ace/mode/json/json_parse', ['require', 'exports', 'module' ], function(require, exports, module) {
|
||||||
|
|
||||||
var at, // The index of the current character
|
var at, // The index of the current character
|
||||||
ch, // The current character
|
ch, // The current character
|
||||||
|
|
|
@ -33,7 +33,6 @@ module.exports = function ({ Plugin }) {
|
||||||
key: string()
|
key: string()
|
||||||
}).default(),
|
}).default(),
|
||||||
apiVersion: Joi.string().default('master'),
|
apiVersion: Joi.string().default('master'),
|
||||||
engineVersion: Joi.string().valid('^5.0.0').default('^5.0.0')
|
|
||||||
}).default();
|
}).default();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -8,17 +8,20 @@ import SetupError from '../setup_error';
|
||||||
import serverConfig from '../../../../../test/server_config';
|
import serverConfig from '../../../../../test/server_config';
|
||||||
import checkEsVersion from '../check_es_version';
|
import checkEsVersion from '../check_es_version';
|
||||||
|
|
||||||
describe('plugins/elasticsearch', function () {
|
describe('plugins/elasticsearch', () => {
|
||||||
describe('lib/check_es_version', function () {
|
describe('lib/check_es_version', () => {
|
||||||
|
const KIBANA_VERSION = '5.1.0';
|
||||||
|
|
||||||
let server;
|
let server;
|
||||||
let plugin;
|
let plugin;
|
||||||
|
|
||||||
beforeEach(function () {
|
beforeEach(function () {
|
||||||
const get = sinon.stub().withArgs('elasticsearch.engineVersion').returns('^1.4.3');
|
|
||||||
const config = function () { return { get: get }; };
|
|
||||||
server = {
|
server = {
|
||||||
log: _.noop,
|
log: _.noop,
|
||||||
config: config,
|
// This is required or else we get a SetupError.
|
||||||
|
config: () => ({
|
||||||
|
get: sinon.stub(),
|
||||||
|
}),
|
||||||
plugins: {
|
plugins: {
|
||||||
elasticsearch: {
|
elasticsearch: {
|
||||||
client: {
|
client: {
|
||||||
|
@ -44,7 +47,9 @@ describe('plugins/elasticsearch', function () {
|
||||||
|
|
||||||
const node = {
|
const node = {
|
||||||
version: version,
|
version: version,
|
||||||
http_address: 'http_address',
|
http: {
|
||||||
|
publish_address: 'http_address',
|
||||||
|
},
|
||||||
ip: 'ip'
|
ip: 'ip'
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -54,40 +59,41 @@ describe('plugins/elasticsearch', function () {
|
||||||
|
|
||||||
const client = server.plugins.elasticsearch.client;
|
const client = server.plugins.elasticsearch.client;
|
||||||
client.nodes.info = sinon.stub().returns(Promise.resolve({ nodes: nodes }));
|
client.nodes.info = sinon.stub().returns(Promise.resolve({ nodes: nodes }));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
it('passes with single a node that matches', function () {
|
it('returns true with single a node that matches', async () => {
|
||||||
setNodes('1.4.3');
|
setNodes('5.1.0');
|
||||||
return checkEsVersion(server);
|
const result = await checkEsVersion(server, KIBANA_VERSION);
|
||||||
|
expect(result).to.be(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('passes with multiple nodes that satisfy', function () {
|
it('returns true with multiple nodes that satisfy', async () => {
|
||||||
setNodes('1.4.3', '1.4.4', '1.4.3-Beta1');
|
setNodes('5.1.0', '5.2.0', '5.1.1-Beta1');
|
||||||
return checkEsVersion(server);
|
const result = await checkEsVersion(server, KIBANA_VERSION);
|
||||||
|
expect(result).to.be(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('fails with a single node that is out of date', function () {
|
it('throws an error with a single node that is out of date', async () => {
|
||||||
setNodes('1.4.4', '1.4.2', '1.4.5');
|
// 5.0.0 ES is too old to work with a 5.1.0 version of Kibana.
|
||||||
|
setNodes('5.1.0', '5.2.0', '5.0.0');
|
||||||
checkEsVersion(server)
|
try {
|
||||||
.catch(function (e) {
|
await checkEsVersion(server, KIBANA_VERSION);
|
||||||
|
} catch (e) {
|
||||||
expect(e).to.be.a(SetupError);
|
expect(e).to.be.a(SetupError);
|
||||||
});
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
it('fails if that single node is a client node', function () {
|
it('fails if that single node is a client node', async () => {
|
||||||
setNodes(
|
setNodes(
|
||||||
'1.4.4',
|
'5.1.0',
|
||||||
{ version: '1.4.2', attributes: { client: 'true' } },
|
'5.2.0',
|
||||||
'1.4.5'
|
{ version: '5.0.0', attributes: { client: 'true' } },
|
||||||
);
|
);
|
||||||
|
try {
|
||||||
checkEsVersion(server)
|
await checkEsVersion(server, KIBANA_VERSION);
|
||||||
.catch(function (e) {
|
} catch (e) {
|
||||||
expect(e).to.be.a(SetupError);
|
expect(e).to.be.a(SetupError);
|
||||||
});
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -6,22 +6,24 @@ import url from 'url';
|
||||||
const NoConnections = require('elasticsearch').errors.NoConnections;
|
const NoConnections = require('elasticsearch').errors.NoConnections;
|
||||||
|
|
||||||
import healthCheck from '../health_check';
|
import healthCheck from '../health_check';
|
||||||
|
import kibanaVersion from '../kibana_version';
|
||||||
import serverConfig from '../../../../../test/server_config';
|
import serverConfig from '../../../../../test/server_config';
|
||||||
|
|
||||||
const esPort = serverConfig.servers.elasticsearch.port;
|
const esPort = serverConfig.servers.elasticsearch.port;
|
||||||
const esUrl = url.format(serverConfig.servers.elasticsearch);
|
const esUrl = url.format(serverConfig.servers.elasticsearch);
|
||||||
|
|
||||||
describe('plugins/elasticsearch', function () {
|
describe('plugins/elasticsearch', () => {
|
||||||
describe('lib/health_check', function () {
|
describe('lib/health_check', () => {
|
||||||
|
|
||||||
let health;
|
let health;
|
||||||
let plugin;
|
let plugin;
|
||||||
let server;
|
|
||||||
let get;
|
|
||||||
let set;
|
|
||||||
let client;
|
let client;
|
||||||
|
|
||||||
beforeEach(function () {
|
beforeEach(() => {
|
||||||
|
const COMPATIBLE_VERSION_NUMBER = '5.0.0';
|
||||||
|
|
||||||
|
// Stub the Kibana version instead of drawing from package.json.
|
||||||
|
sinon.stub(kibanaVersion, 'get').returns(COMPATIBLE_VERSION_NUMBER);
|
||||||
|
|
||||||
// setup the plugin stub
|
// setup the plugin stub
|
||||||
plugin = {
|
plugin = {
|
||||||
name: 'elasticsearch',
|
name: 'elasticsearch',
|
||||||
|
@ -31,9 +33,7 @@ describe('plugins/elasticsearch', function () {
|
||||||
yellow: sinon.stub()
|
yellow: sinon.stub()
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
// setup the config().get()/.set() stubs
|
|
||||||
get = sinon.stub();
|
|
||||||
set = sinon.stub();
|
|
||||||
// set up the elasticsearch client stub
|
// set up the elasticsearch client stub
|
||||||
client = {
|
client = {
|
||||||
cluster: { health: sinon.stub() },
|
cluster: { health: sinon.stub() },
|
||||||
|
@ -45,17 +45,26 @@ describe('plugins/elasticsearch', function () {
|
||||||
get: sinon.stub().returns(Promise.resolve({ found: false })),
|
get: sinon.stub().returns(Promise.resolve({ found: false })),
|
||||||
search: sinon.stub().returns(Promise.resolve({ hits: { hits: [] } })),
|
search: sinon.stub().returns(Promise.resolve({ hits: { hits: [] } })),
|
||||||
};
|
};
|
||||||
|
|
||||||
client.nodes.info.returns(Promise.resolve({
|
client.nodes.info.returns(Promise.resolve({
|
||||||
nodes: {
|
nodes: {
|
||||||
'node-01': {
|
'node-01': {
|
||||||
version: '1.5.0',
|
version: COMPATIBLE_VERSION_NUMBER,
|
||||||
http_address: `inet[/127.0.0.1:${esPort}]`,
|
http_address: `inet[/127.0.0.1:${esPort}]`,
|
||||||
ip: '127.0.0.1'
|
ip: '127.0.0.1'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
// setup the config().get()/.set() stubs
|
||||||
|
const get = sinon.stub();
|
||||||
|
get.withArgs('elasticsearch.url').returns(esUrl);
|
||||||
|
get.withArgs('kibana.index').returns('.my-kibana');
|
||||||
|
|
||||||
|
const set = sinon.stub();
|
||||||
|
|
||||||
// Setup the server mock
|
// Setup the server mock
|
||||||
server = {
|
const server = {
|
||||||
log: sinon.stub(),
|
log: sinon.stub(),
|
||||||
info: { port: 5601 },
|
info: { port: 5601 },
|
||||||
config: function () { return { get, set }; },
|
config: function () { return { get, set }; },
|
||||||
|
@ -65,9 +74,11 @@ describe('plugins/elasticsearch', function () {
|
||||||
health = healthCheck(plugin, server);
|
health = healthCheck(plugin, server);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
kibanaVersion.get.restore();
|
||||||
|
});
|
||||||
|
|
||||||
it('should set the cluster green if everything is ready', function () {
|
it('should set the cluster green if everything is ready', function () {
|
||||||
get.withArgs('elasticsearch.engineVersion').returns('^1.4.4');
|
|
||||||
get.withArgs('kibana.index').returns('.my-kibana');
|
|
||||||
client.ping.returns(Promise.resolve());
|
client.ping.returns(Promise.resolve());
|
||||||
client.cluster.health.returns(Promise.resolve({ timed_out: false, status: 'green' }));
|
client.cluster.health.returns(Promise.resolve({ timed_out: false, status: 'green' }));
|
||||||
return health.run()
|
return health.run()
|
||||||
|
@ -83,10 +94,6 @@ describe('plugins/elasticsearch', function () {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should set the cluster red if the ping fails, then to green', function () {
|
it('should set the cluster red if the ping fails, then to green', function () {
|
||||||
|
|
||||||
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()));
|
client.ping.onCall(0).returns(Promise.reject(new NoConnections()));
|
||||||
client.ping.onCall(1).returns(Promise.resolve());
|
client.ping.onCall(1).returns(Promise.resolve());
|
||||||
client.cluster.health.returns(Promise.resolve({ timed_out: false, status: 'green' }));
|
client.cluster.health.returns(Promise.resolve({ timed_out: false, status: 'green' }));
|
||||||
|
@ -104,13 +111,9 @@ describe('plugins/elasticsearch', function () {
|
||||||
sinon.assert.calledOnce(plugin.status.green);
|
sinon.assert.calledOnce(plugin.status.green);
|
||||||
expect(plugin.status.green.args[0][0]).to.be('Kibana index ready');
|
expect(plugin.status.green.args[0][0]).to.be('Kibana index ready');
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should set the cluster red if the health check status is red, then to green', function () {
|
it('should set the cluster red if the health check status is red, then to green', function () {
|
||||||
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());
|
client.ping.returns(Promise.resolve());
|
||||||
client.cluster.health.onCall(0).returns(Promise.resolve({ timed_out: false, status: 'red' }));
|
client.cluster.health.onCall(0).returns(Promise.resolve({ timed_out: false, status: 'red' }));
|
||||||
client.cluster.health.onCall(1).returns(Promise.resolve({ timed_out: false, status: 'green' }));
|
client.cluster.health.onCall(1).returns(Promise.resolve({ timed_out: false, status: 'green' }));
|
||||||
|
@ -131,9 +134,6 @@ describe('plugins/elasticsearch', function () {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should set the cluster yellow if the health check timed_out and create index', function () {
|
it('should set the cluster yellow if the health check timed_out and create index', function () {
|
||||||
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());
|
client.ping.returns(Promise.resolve());
|
||||||
client.cluster.health.onCall(0).returns(Promise.resolve({ timed_out: true, status: 'red' }));
|
client.cluster.health.onCall(0).returns(Promise.resolve({ timed_out: true, status: 'red' }));
|
||||||
client.cluster.health.onCall(1).returns(Promise.resolve({ timed_out: false, status: 'green' }));
|
client.cluster.health.onCall(1).returns(Promise.resolve({ timed_out: false, status: 'green' }));
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
import expect from 'expect.js';
|
||||||
|
import sinon from 'sinon';
|
||||||
|
|
||||||
|
import isEsCompatibleWithKibana from '../is_es_compatible_with_kibana';
|
||||||
|
|
||||||
|
describe('plugins/elasticsearch', () => {
|
||||||
|
describe('lib/is_es_compatible_with_kibana', () => {
|
||||||
|
describe('returns false', () => {
|
||||||
|
it('when ES major is greater than Kibana major', () => {
|
||||||
|
expect(isEsCompatibleWithKibana('1.0.0', '0.0.0')).to.be(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('when ES major is less than Kibana major', () => {
|
||||||
|
expect(isEsCompatibleWithKibana('0.0.0', '1.0.0')).to.be(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('when majors are equal, but ES minor is less than Kibana minor', () => {
|
||||||
|
expect(isEsCompatibleWithKibana('1.0.0', '1.1.0')).to.be(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('when majors and minors are equal, but ES patch is less than Kibana patch', () => {
|
||||||
|
expect(isEsCompatibleWithKibana('1.1.0', '1.1.1')).to.be(false);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('returns true', () => {
|
||||||
|
it('when version numbers are the same', () => {
|
||||||
|
expect(isEsCompatibleWithKibana('1.1.1', '1.1.1')).to.be(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('when majors are equal, and ES minor is greater than Kibana minor', () => {
|
||||||
|
expect(isEsCompatibleWithKibana('1.1.0', '1.0.0')).to.be(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('when majors and minors are equal, and ES patch is greater than Kibana patch', () => {
|
||||||
|
expect(isEsCompatibleWithKibana('1.1.1', '1.1.0')).to.be(true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
|
@ -6,29 +6,30 @@ import fromRoot from '../../../../utils/from_root';
|
||||||
|
|
||||||
describe('plugins/elasticsearch', function () {
|
describe('plugins/elasticsearch', function () {
|
||||||
describe('routes', function () {
|
describe('routes', function () {
|
||||||
|
|
||||||
let kbnServer;
|
let kbnServer;
|
||||||
|
|
||||||
before(function () {
|
before(async function () {
|
||||||
this.timeout(60000); // sometimes waiting for server takes longer than 10
|
// Sometimes waiting for server takes longer than 10s.
|
||||||
|
// NOTE: This can't be a fat-arrow function because `this` needs to refer to the execution
|
||||||
|
// context, not to the parent context.
|
||||||
|
this.timeout(60000);
|
||||||
|
|
||||||
kbnServer = kbnTestServer.createServer({
|
kbnServer = kbnTestServer.createServer({
|
||||||
plugins: {
|
plugins: {
|
||||||
scanDirs: [
|
scanDirs: [
|
||||||
fromRoot('src/core_plugins')
|
fromRoot('src/core_plugins')
|
||||||
]
|
]
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
return kbnServer.ready()
|
|
||||||
.then(() => kbnServer.server.plugins.elasticsearch.waitUntilReady());
|
|
||||||
});
|
|
||||||
|
|
||||||
|
await kbnServer.ready();
|
||||||
|
await kbnServer.server.plugins.elasticsearch.waitUntilReady();
|
||||||
|
});
|
||||||
|
|
||||||
after(function () {
|
after(function () {
|
||||||
return kbnServer.close();
|
return kbnServer.close();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
function testRoute(options) {
|
function testRoute(options) {
|
||||||
if (typeof options.payload === 'object') {
|
if (typeof options.payload === 'object') {
|
||||||
options.payload = JSON.stringify(options.payload);
|
options.payload = JSON.stringify(options.payload);
|
||||||
|
@ -49,7 +50,6 @@ describe('plugins/elasticsearch', function () {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
testRoute({
|
testRoute({
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
url: '/elasticsearch/_nodes'
|
url: '/elasticsearch/_nodes'
|
||||||
|
|
|
@ -1,45 +0,0 @@
|
||||||
import versionSatisfies from '../version_satisfies';
|
|
||||||
import expect from 'expect.js';
|
|
||||||
|
|
||||||
const versionChecks = [
|
|
||||||
// order is: ['actual version', 'match expression', satisfied (true/false)]
|
|
||||||
['0.90.0', '>=0.90.0', true],
|
|
||||||
['1.2.0', '>=1.2.1 <2.0.0', false],
|
|
||||||
['1.2.1', '>=1.2.1 <2.0.0', true],
|
|
||||||
['1.4.4', '>=1.2.1 <2.0.0', true],
|
|
||||||
['1.7.4', '>=1.3.1 <2.0.0', true],
|
|
||||||
['2.0.0', '>=1.3.1 <2.0.0', false],
|
|
||||||
['1.4.3', '^1.4.3', true],
|
|
||||||
['1.4.3-Beta1', '^1.4.3', true],
|
|
||||||
['1.4.4', '^1.4.3', true],
|
|
||||||
['1.1.12', '^1.0.0', true],
|
|
||||||
['1.1.12', '~1.0.0', false],
|
|
||||||
['1.6.1-SNAPSHOT', '1.6.1', true],
|
|
||||||
['1.6.1-SNAPSHOT', '1.6.2', false],
|
|
||||||
['1.7.1-SNAPSHOT', '^1.3.1', true],
|
|
||||||
['1.3.4', '^1.4.0', false],
|
|
||||||
['2.0.1', '^2.0.0', true],
|
|
||||||
['2.1.1', '^2.1.0', true],
|
|
||||||
['2.2.0', '^2.1.0', true],
|
|
||||||
['3.0.0-SNAPSHOT', '^2.1.0', false],
|
|
||||||
['3.0.0', '^2.1.0', false],
|
|
||||||
['2.10.20-SNAPSHOT', '^2.10.20', true],
|
|
||||||
['2.10.999', '^2.10.20', true],
|
|
||||||
];
|
|
||||||
|
|
||||||
describe('plugins/elasticsearch', function () {
|
|
||||||
describe('lib/version_satisfies', function () {
|
|
||||||
versionChecks.forEach(function (spec) {
|
|
||||||
const actual = spec[0];
|
|
||||||
const match = spec[1];
|
|
||||||
const satisfied = spec[2];
|
|
||||||
const desc = actual + ' satisfies ' + match;
|
|
||||||
|
|
||||||
describe(desc, function () {
|
|
||||||
it('should be ' + satisfied, function () {
|
|
||||||
expect(versionSatisfies(actual, match)).to.be(satisfied);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,31 +1,78 @@
|
||||||
|
/**
|
||||||
|
* ES and Kibana versions are locked, so Kibana should require that ES has the same version as
|
||||||
|
* that defined in Kibana's package.json.
|
||||||
|
*/
|
||||||
|
|
||||||
import _ from 'lodash';
|
import _ from 'lodash';
|
||||||
import esBool from './es_bool';
|
import esBool from './es_bool';
|
||||||
import versionSatisfies from './version_satisfies';
|
import semver from 'semver';
|
||||||
|
import isEsCompatibleWithKibana from './is_es_compatible_with_kibana';
|
||||||
import SetupError from './setup_error';
|
import SetupError from './setup_error';
|
||||||
|
|
||||||
module.exports = function (server) {
|
module.exports = function checkEsVersion(server, kibanaVersion) {
|
||||||
server.log(['plugin', 'debug'], 'Checking Elasticsearch version');
|
server.log(['plugin', 'debug'], 'Checking Elasticsearch version');
|
||||||
|
|
||||||
const client = server.plugins.elasticsearch.client;
|
const client = server.plugins.elasticsearch.client;
|
||||||
const engineVersion = server.config().get('elasticsearch.engineVersion');
|
|
||||||
|
|
||||||
return client.nodes.info()
|
return client.nodes.info()
|
||||||
.then(function (info) {
|
.then(function (info) {
|
||||||
const badNodes = _.filter(info.nodes, function (node) {
|
// Aggregate incompatible ES nodes.
|
||||||
// remove nodes that satify required engine version
|
const incompatibleNodes = [];
|
||||||
return !versionSatisfies(node.version, engineVersion);
|
|
||||||
|
// Aggregate ES nodes which should prompt a Kibana upgrade.
|
||||||
|
const warningNodes = [];
|
||||||
|
|
||||||
|
_.forEach(info.nodes, esNode => {
|
||||||
|
if (!isEsCompatibleWithKibana(esNode.version, kibanaVersion)) {
|
||||||
|
// Exit early to avoid collecting ES nodes with newer major versions in the `warningNodes`.
|
||||||
|
return incompatibleNodes.push(esNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
// It's acceptable if ES is ahead of Kibana, but we want to prompt users to upgrade Kibana
|
||||||
|
// to match it.
|
||||||
|
if (semver.gt(esNode.version, kibanaVersion)) {
|
||||||
|
warningNodes.push(esNode);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!badNodes.length) return true;
|
function getHumanizedNodeNames(nodes) {
|
||||||
|
return nodes.map(node => {
|
||||||
|
return 'v' + node.version + ' @ ' + node.http.publish_address + ' (' + node.ip + ')';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const badNodeNames = badNodes.map(function (node) {
|
if (warningNodes.length) {
|
||||||
return 'Elasticsearch v' + node.version + ' @ ' + node.http_address + ' (' + node.ip + ')';
|
const simplifiedNodes = warningNodes.map(node => ({
|
||||||
});
|
version: node.version,
|
||||||
|
http: {
|
||||||
|
publish_address: node.http.publish_address,
|
||||||
|
},
|
||||||
|
ip: node.ip,
|
||||||
|
}));
|
||||||
|
|
||||||
const message = `This version of Kibana requires Elasticsearch ` +
|
server.log(['warning'], {
|
||||||
`${engineVersion} on all nodes. I found ` +
|
tmpl: (
|
||||||
`the following incompatible nodes in your cluster: ${badNodeNames.join(',')}`;
|
'You\'re running Kibana <%= kibanaVersion %> with some newer versions of ' +
|
||||||
|
'Elasticsearch. Update Kibana to the latest version to prevent compatibility issues: ' +
|
||||||
|
'<%= getHumanizedNodeNames(nodes).join(", ") %>'
|
||||||
|
),
|
||||||
|
kibanaVersion,
|
||||||
|
getHumanizedNodeNames,
|
||||||
|
nodes: simplifiedNodes,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
throw new SetupError(server, message);
|
if (incompatibleNodes.length) {
|
||||||
|
const incompatibleNodeNames = getHumanizedNodeNames(incompatibleNodes);
|
||||||
|
|
||||||
|
const errorMessage =
|
||||||
|
`This version of Kibana requires Elasticsearch v` +
|
||||||
|
`${kibanaVersion} on all nodes. I found ` +
|
||||||
|
`the following incompatible nodes in your cluster: ${incompatibleNodeNames.join(',')}`;
|
||||||
|
|
||||||
|
throw new SetupError(server, errorMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
|
@ -5,6 +5,8 @@ import exposeClient from './expose_client';
|
||||||
import migrateConfig from './migrate_config';
|
import migrateConfig from './migrate_config';
|
||||||
import createKibanaIndex from './create_kibana_index';
|
import createKibanaIndex from './create_kibana_index';
|
||||||
import checkEsVersion from './check_es_version';
|
import checkEsVersion from './check_es_version';
|
||||||
|
import kibanaVersion from './kibana_version';
|
||||||
|
|
||||||
const NoConnections = elasticsearch.errors.NoConnections;
|
const NoConnections = elasticsearch.errors.NoConnections;
|
||||||
import util from 'util';
|
import util from 'util';
|
||||||
const format = util.format;
|
const format = util.format;
|
||||||
|
@ -85,7 +87,7 @@ module.exports = function (plugin, server) {
|
||||||
|
|
||||||
function check() {
|
function check() {
|
||||||
return waitForPong()
|
return waitForPong()
|
||||||
.then(_.partial(checkEsVersion, server))
|
.then(() => checkEsVersion(server, kibanaVersion.get()))
|
||||||
.then(waitForShards)
|
.then(waitForShards)
|
||||||
.then(setGreenStatus)
|
.then(setGreenStatus)
|
||||||
.then(_.partial(migrateConfig, server))
|
.then(_.partial(migrateConfig, server))
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
/**
|
||||||
|
* Let's weed out the ES versions that won't work with a given Kibana version.
|
||||||
|
* 1. Major version differences will never work together.
|
||||||
|
* 2. Older versions of ES won't work with newer versions of Kibana.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import semver from 'semver';
|
||||||
|
|
||||||
|
export default function isEsCompatibleWithKibana(esVersion, kibanaVersion) {
|
||||||
|
const esVersionNumbers = {
|
||||||
|
major: semver.major(esVersion),
|
||||||
|
minor: semver.minor(esVersion),
|
||||||
|
patch: semver.patch(esVersion),
|
||||||
|
};
|
||||||
|
|
||||||
|
const kibanaVersionNumbers = {
|
||||||
|
major: semver.major(kibanaVersion),
|
||||||
|
minor: semver.minor(kibanaVersion),
|
||||||
|
patch: semver.patch(kibanaVersion),
|
||||||
|
};
|
||||||
|
|
||||||
|
// Reject mismatching major version numbers.
|
||||||
|
if (esVersionNumbers.major !== kibanaVersionNumbers.major) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reject older minor versions of ES.
|
||||||
|
if (esVersionNumbers.minor < kibanaVersionNumbers.minor) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reject older patch versions of ES.
|
||||||
|
if (esVersionNumbers.patch < kibanaVersionNumbers.patch) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
10
src/core_plugins/elasticsearch/lib/kibana_version.js
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
import {
|
||||||
|
version as kibanaVersion,
|
||||||
|
} from '../../../../package.json';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
// Make the version stubbable to improve testability.
|
||||||
|
get() {
|
||||||
|
return kibanaVersion;
|
||||||
|
},
|
||||||
|
};
|
|
@ -1,16 +0,0 @@
|
||||||
import semver from 'semver';
|
|
||||||
|
|
||||||
module.exports = function (actual, expected) {
|
|
||||||
try {
|
|
||||||
const ver = cleanVersion(actual);
|
|
||||||
return semver.satisfies(ver, expected);
|
|
||||||
} catch (err) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
function cleanVersion(version) {
|
|
||||||
const match = version.match(/\d+\.\d+\.\d+/);
|
|
||||||
if (!match) return version;
|
|
||||||
return match[0];
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -14,10 +14,13 @@ module.exports = function (kibana) {
|
||||||
return new kibana.Plugin({
|
return new kibana.Plugin({
|
||||||
id: 'kibana',
|
id: 'kibana',
|
||||||
config: function (Joi) {
|
config: function (Joi) {
|
||||||
|
const ONE_GIGABYTE = 1024 * 1024 * 1024;
|
||||||
|
|
||||||
return Joi.object({
|
return Joi.object({
|
||||||
enabled: Joi.boolean().default(true),
|
enabled: Joi.boolean().default(true),
|
||||||
defaultAppId: Joi.string().default('discover'),
|
defaultAppId: Joi.string().default('discover'),
|
||||||
index: Joi.string().default('.kibana')
|
index: Joi.string().default('.kibana'),
|
||||||
|
addDataMaxBytes: Joi.number().default(ONE_GIGABYTE)
|
||||||
}).default();
|
}).default();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -34,6 +37,7 @@ module.exports = function (kibana) {
|
||||||
'fieldFormats',
|
'fieldFormats',
|
||||||
'navbarExtensions',
|
'navbarExtensions',
|
||||||
'managementSections',
|
'managementSections',
|
||||||
|
'devTools',
|
||||||
'docViews'
|
'docViews'
|
||||||
],
|
],
|
||||||
|
|
||||||
|
@ -41,7 +45,8 @@ module.exports = function (kibana) {
|
||||||
let config = server.config();
|
let config = server.config();
|
||||||
return {
|
return {
|
||||||
kbnDefaultAppId: config.get('kibana.defaultAppId'),
|
kbnDefaultAppId: config.get('kibana.defaultAppId'),
|
||||||
tilemap: config.get('tilemap')
|
tilemap: config.get('tilemap'),
|
||||||
|
addDataMaxBytes: config.get('kibana.addDataMaxBytes')
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -79,6 +84,13 @@ module.exports = function (kibana) {
|
||||||
description: 'define index patterns, change config, and more',
|
description: 'define index patterns, change config, and more',
|
||||||
icon: 'plugins/kibana/assets/settings.svg',
|
icon: 'plugins/kibana/assets/settings.svg',
|
||||||
linkToLastSubUrl: false
|
linkToLastSubUrl: false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'Dev Tools',
|
||||||
|
order: 1010,
|
||||||
|
url: '/app/kibana#/dev_tools',
|
||||||
|
description: 'development tools',
|
||||||
|
icon: 'plugins/kibana/assets/wrench.svg'
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
injectDefaultVars(server, options) {
|
injectDefaultVars(server, options) {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8">
|
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8" fill="white">
|
||||||
<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"
|
<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>
|
</svg>
|
||||||
|
|
Before Width: | Height: | Size: 486 B After Width: | Height: | Size: 500 B |
|
@ -1,3 +1,3 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8">
|
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8" fill="white">
|
||||||
<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" />
|
<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>
|
</svg>
|
||||||
|
|
Before Width: | Height: | Size: 293 B After Width: | Height: | Size: 307 B |
|
@ -1,3 +1,3 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8">
|
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8" fill="white">
|
||||||
<path d="M3 0v1h4v5h-4v1h5v-7h-5zm-1 2l-2 1.5 2 1.5v-1h4v-1h-4v-1z" />
|
<path d="M3 0v1h4v5h-4v1h5v-7h-5zm-1 2l-2 1.5 2 1.5v-1h4v-1h-4v-1z" />
|
||||||
</svg>
|
</svg>
|
||||||
|
|
Before Width: | Height: | Size: 159 B After Width: | Height: | Size: 173 B |
|
@ -1,3 +1,3 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8">
|
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8" fill="white">
|
||||||
<path d="M4 0c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm-1 2l3 2-3 2v-4z" />
|
<path d="M4 0c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm-1 2l3 2-3 2v-4z" />
|
||||||
</svg>
|
</svg>
|
||||||
|
|
Before Width: | Height: | Size: 176 B After Width: | Height: | Size: 190 B |
|
@ -1,4 +1,4 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8">
|
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8" fill="white">
|
||||||
<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"
|
<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>
|
</svg>
|
||||||
|
|
Before Width: | Height: | Size: 450 B After Width: | Height: | Size: 464 B |
|
@ -1,4 +1,4 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8">
|
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8" fill="white">
|
||||||
<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"
|
<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>
|
</svg>
|
||||||
|
|
Before Width: | Height: | Size: 528 B After Width: | Height: | Size: 542 B |
|
@ -1,3 +1,3 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8">
|
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8" fill="white">
|
||||||
<path d="M0 0v7h8v-1h-7v-6h-1zm5 0v5h2v-5h-2zm-3 2v3h2v-3h-2z" />
|
<path d="M0 0v7h8v-1h-7v-6h-1zm5 0v5h2v-5h-2zm-3 2v3h2v-3h-2z" />
|
||||||
</svg>
|
</svg>
|
||||||
|
|
Before Width: | Height: | Size: 154 B After Width: | Height: | Size: 168 B |
4
src/core_plugins/kibana/public/assets/wrench.svg
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8" fill="white">
|
||||||
|
<path d="M5.5 0c-1.38 0-2.5 1.12-2.5 2.5 0 .32.08.62.19.91l-2.91 2.88c-.39.39-.39 1.05 0 1.44.2.2.46.28.72.28.26 0 .52-.09.72-.28l2.88-2.91c.28.11.58.19.91.19 1.38 0 2.5-1.12 2.5-2.5 0-.16 0-.32-.03-.47l-.97.97h-2v-2l.97-.97c-.15-.03-.31-.03-.47-.03zm-4.5 6.5c.28 0 .5.22.5.5s-.22.5-.5.5-.5-.22-.5-.5.22-.5.5-.5z"
|
||||||
|
/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 421 B |
|
@ -0,0 +1,19 @@
|
||||||
|
import uiModules from 'ui/modules';
|
||||||
|
import devTools from 'ui/registry/dev_tools';
|
||||||
|
import template from 'plugins/kibana/dev_tools/partials/dev_tools_app.html';
|
||||||
|
import 'plugins/kibana/dev_tools/styles/dev_tools_app.less';
|
||||||
|
|
||||||
|
uiModules
|
||||||
|
.get('apps/dev_tools')
|
||||||
|
.directive('kbnDevToolsApp', function (Private, $location) {
|
||||||
|
return {
|
||||||
|
restrict: 'E',
|
||||||
|
replace: true,
|
||||||
|
template,
|
||||||
|
transclude: true,
|
||||||
|
link: function ($scope) {
|
||||||
|
$scope.devTools = Private(devTools).inOrder;
|
||||||
|
$scope.currentPath = `#${$location.path()}`;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
});
|
13
src/core_plugins/kibana/public/dev_tools/index.js
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
import uiRoutes from 'ui/routes';
|
||||||
|
import devTools from 'ui/registry/dev_tools';
|
||||||
|
import 'plugins/kibana/dev_tools/directives/dev_tools_app';
|
||||||
|
|
||||||
|
uiRoutes
|
||||||
|
.when('/dev_tools', {
|
||||||
|
resolve: {
|
||||||
|
redirect(Private, kbnUrl) {
|
||||||
|
const items = Private(devTools).inOrder;
|
||||||
|
kbnUrl.redirect(items[0].url.substring(1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
|
@ -0,0 +1,15 @@
|
||||||
|
<div class="dev-tools-app-container app-container">
|
||||||
|
<nav class="navbar navbar-default navbar-static-top subnav">
|
||||||
|
<bread-crumbs omit-current-page="true"></bread-crumbs>
|
||||||
|
|
||||||
|
<ul class="nav navbar-nav">
|
||||||
|
<li ng-repeat="item in devTools" ng-class="{active: currentPath === item.url}">
|
||||||
|
<a class="navbar-link" kbn-href="{{::item.url}}">
|
||||||
|
{{::item.display}}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<div role="main" class="dev-tools-container" ng-transclude></div>
|
||||||
|
</div>
|
|
@ -0,0 +1,9 @@
|
||||||
|
@import (reference) "~ui/styles/mixins.less";
|
||||||
|
|
||||||
|
.dev-tools-app-container {
|
||||||
|
.flex-parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dev-tools-container {
|
||||||
|
.flex-parent;
|
||||||
|
}
|
|
@ -13,6 +13,7 @@ import 'plugins/kibana/visualize/index';
|
||||||
import 'plugins/kibana/dashboard/index';
|
import 'plugins/kibana/dashboard/index';
|
||||||
import 'plugins/kibana/management/index';
|
import 'plugins/kibana/management/index';
|
||||||
import 'plugins/kibana/doc';
|
import 'plugins/kibana/doc';
|
||||||
|
import 'plugins/kibana/dev_tools';
|
||||||
import 'ui/vislib';
|
import 'ui/vislib';
|
||||||
import 'ui/agg_response';
|
import 'ui/agg_response';
|
||||||
import 'ui/agg_types';
|
import 'ui/agg_types';
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
<button class="btn btn-primary btn-lg controls upload" ng-click>
|
<button class="btn btn-primary btn-lg controls upload" ng-click>
|
||||||
Select File
|
Select File
|
||||||
</button>
|
</button>
|
||||||
<div>Maximum upload file size: 1 GB</div>
|
<div>Maximum upload file size: {{ wizard.maxBytesFormatted }}</div>
|
||||||
</div>
|
</div>
|
||||||
</file-upload>
|
</file-upload>
|
||||||
|
|
||||||
|
|
|
@ -4,9 +4,10 @@ import modules from 'ui/modules';
|
||||||
import validateHeaders from './lib/validate_headers';
|
import validateHeaders from './lib/validate_headers';
|
||||||
import template from './parse_csv_step.html';
|
import template from './parse_csv_step.html';
|
||||||
import './styles/_add_data_parse_csv_step.less';
|
import './styles/_add_data_parse_csv_step.less';
|
||||||
|
import numeral from '@spalger/numeral';
|
||||||
|
|
||||||
modules.get('apps/management')
|
modules.get('apps/management')
|
||||||
.directive('parseCsvStep', function () {
|
.directive('parseCsvStep', function (addDataMaxBytes) {
|
||||||
return {
|
return {
|
||||||
restrict: 'E',
|
restrict: 'E',
|
||||||
template: template,
|
template: template,
|
||||||
|
@ -21,6 +22,8 @@ modules.get('apps/management')
|
||||||
const maxSampleRows = 10;
|
const maxSampleRows = 10;
|
||||||
const maxSampleColumns = 20;
|
const maxSampleColumns = 20;
|
||||||
|
|
||||||
|
this.maxBytesFormatted = numeral(addDataMaxBytes).format('0 b');
|
||||||
|
|
||||||
this.delimiterOptions = [
|
this.delimiterOptions = [
|
||||||
{
|
{
|
||||||
label: 'comma',
|
label: 'comma',
|
||||||
|
@ -55,6 +58,13 @@ modules.get('apps/management')
|
||||||
this.formattedErrors = [];
|
this.formattedErrors = [];
|
||||||
this.formattedWarnings = [];
|
this.formattedWarnings = [];
|
||||||
|
|
||||||
|
if (this.file.size > addDataMaxBytes) {
|
||||||
|
this.formattedErrors.push(
|
||||||
|
`File size (${this.file.size} bytes) is greater than the configured limit of ${addDataMaxBytes} bytes`
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const config = _.assign(
|
const config = _.assign(
|
||||||
{
|
{
|
||||||
header: true,
|
header: true,
|
||||||
|
|
|
@ -386,9 +386,3 @@ vis-editor-vis-options > * {
|
||||||
background-color: darken(@vis-editor-navbar-error-state-bg, 12%) !important; /* 1 */
|
background-color: darken(@vis-editor-navbar-error-state-bg, 12%) !important; /* 1 */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
form.vis-share {
|
|
||||||
div.form-control {
|
|
||||||
height: inherit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -6,16 +6,16 @@ import { patternToIngest } from '../../../../common/lib/convert_pattern_and_inge
|
||||||
import { PassThrough } from 'stream';
|
import { PassThrough } from 'stream';
|
||||||
import JSONStream from 'JSONStream';
|
import JSONStream from 'JSONStream';
|
||||||
|
|
||||||
const ONE_GIGABYTE = 1024 * 1024 * 1024;
|
|
||||||
|
|
||||||
export function registerData(server) {
|
export function registerData(server) {
|
||||||
|
const maxBytes = server.config().get('kibana.addDataMaxBytes');
|
||||||
|
|
||||||
server.route({
|
server.route({
|
||||||
path: '/api/kibana/{id}/_data',
|
path: '/api/kibana/{id}/_data',
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
config: {
|
config: {
|
||||||
payload: {
|
payload: {
|
||||||
output: 'stream',
|
output: 'stream',
|
||||||
maxBytes: ONE_GIGABYTE
|
maxBytes
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
handler: function (req, reply) {
|
handler: function (req, reply) {
|
||||||
|
|
|
@ -87,9 +87,9 @@
|
||||||
inkscape:groupmode="layer"
|
inkscape:groupmode="layer"
|
||||||
id="Template"
|
id="Template"
|
||||||
inkscape:label="Layer 1"
|
inkscape:label="Layer 1"
|
||||||
style="fill:none;stroke:#000000;stroke-width:0.35433071px">
|
style="fill:none;stroke:#ffffff;stroke-width:0.35433071px">
|
||||||
<path
|
<path
|
||||||
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.40064034px"
|
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.40064034px"
|
||||||
d="m 212.51556,43.816204 c -9.94498,-0.10448 -19.76629,0.48399 -29.2095,1.7876 -20.46985,2.82579 -44.80699,10.19267 -63.24889,19.14519 l -4.40117,2.1364 -6.10156,-1.45334 c -9.20676,-2.19337 -20.126509,-3.40347 -34.109639,-3.78106 -24.50715,-0.66175 -46.57065,2.51896 -60.56992,8.73208 l -5.9513901,2.64021 -1.93292,6.24447 c -1.06277,3.43372 -2.4151,8.63049 -3.00598,11.54913 -1.53125,7.56139 -2.05401,22.687276 -1.0682,30.902626 1.65858,13.82185 6.7527,29.78901 13.1066101,41.06865 l 3.20218,5.68496 -2.17516,6.27838 c -6.02018,17.37428 -8.0762301,29.39951 -8.0684001,47.17021 0,15.17828 1.2843301,23.63498 5.5904801,36.97997 12.82745,39.75098 49.84408,72.52427 101.466619,89.83514 5.80702,1.94729 6.68198,2.47716 11.54186,7.0099 6.66504,6.21636 14.39167,11.3493 23.05222,15.31566 9.78729,4.48231 16.27558,6.2191 29.79809,7.9691 20.28599,2.62519 35.75405,3.02196 53.96213,1.38551 10.00303,-0.89906 22.3711,-2.84396 27.60841,-4.34061 12.30523,-3.51643 24.69915,-10.50496 34.98405,-19.72652 7.02577,-6.29943 7.51497,-6.60945 14.28867,-9.0155 47.51848,-16.87912 81.2963,-46.48266 95.69689,-83.87405 6.04823,-15.70401 8.67135,-34.47172 7.17944,-51.3631 -1.01092,-11.44237 -3.54478,-23.93594 -6.7943,-33.49439 -1.35294,-3.97957 -2.45855,-7.52644 -2.45855,-7.88189 0,-0.35549 1.88245,-4.08107 4.18315,-8.27913 14.6159,-26.67106 17.6998,-57.67627 8.47534,-85.211126 l -1.51872,-4.53195 -4.69426,-2.10492 c -21.65103,-9.70728 -66.27117,-12.03073 -96.50835,-5.02609 l -6.55693,1.51872 -12.08444,-5.25862 c -6.64658,-2.89168 -15.19046,-6.27668 -18.98775,-7.5234 -20.33766,-6.6772 -42.81112,-10.25834 -64.69011,-10.48821 z M 114.9584,120.1596 c 0.89827,0 32.56973,11.89177 33.22312,12.4744 1.08465,0.96712 -1.52492,5.9751 -4.57314,8.7757 -1.55336,1.42707 -4.13505,3.09699 -5.73581,3.70841 -15.64828,5.97722 -31.56691,-8.02023 -24.881,-21.87746 0.8177,-1.69469 1.70241,-3.08105 1.96683,-3.08105 z m 184.42024,0.62977 c 0.10351,0.009 0.1807,0.0276 0.22527,0.0606 1.25451,0.92826 3.06168,6.41925 3.06168,9.30132 0,5.85906 -4.47397,11.95187 -10.69651,14.56961 -7.49256,3.15191 -14.37348,2.33937 -20.76566,-2.45612 -2.33787,-1.75398 -5.64618,-6.93055 -5.64618,-8.81687 0.005,-1.53511 30.61194,-12.90841 33.8214,-12.6585 z m -88.55862,28.93337 c 14.37063,-0.027 28.75317,2.4358 36.61178,7.55488 10.61987,6.91764 7.19471,20.25668 -8.13622,31.68501 -5.51941,4.11429 -15.42291,8.75917 -21.67882,10.16846 -7.75654,1.74733 -13.53947,0.90038 -23.13459,-3.38625 -14.44842,-6.45479 -25.26854,-17.48329 -26.11875,-26.625 -0.46187,-4.96531 0.28073,-7.30805 3.1513,-9.94318 6.7457,-6.19289 23.01858,-9.42333 39.3053,-9.45392 z m -0.46507,83.43806 c 8.82994,1e-5 21.90971,3.55346 32.18398,8.74421 15.77369,7.9691 30.57783,21.1565 35.90208,31.98051 3.68786,7.4971 4.18188,16.00812 1.26924,21.86534 -5.22267,10.50284 -25.03716,18.03508 -53.7199,20.42411 -18.1235,1.50956 -40.77834,-0.15131 -56.23658,-4.12259 -16.44895,-4.22581 -26.40281,-10.46652 -28.75897,-18.03341 -4.53633,-14.56882 8.41138,-34.36087 31.45973,-48.0931 12.762,-7.60349 28.08632,-12.76507 37.90042,-12.76507 z"
|
d="m 212.51556,43.816204 c -9.94498,-0.10448 -19.76629,0.48399 -29.2095,1.7876 -20.46985,2.82579 -44.80699,10.19267 -63.24889,19.14519 l -4.40117,2.1364 -6.10156,-1.45334 c -9.20676,-2.19337 -20.126509,-3.40347 -34.109639,-3.78106 -24.50715,-0.66175 -46.57065,2.51896 -60.56992,8.73208 l -5.9513901,2.64021 -1.93292,6.24447 c -1.06277,3.43372 -2.4151,8.63049 -3.00598,11.54913 -1.53125,7.56139 -2.05401,22.687276 -1.0682,30.902626 1.65858,13.82185 6.7527,29.78901 13.1066101,41.06865 l 3.20218,5.68496 -2.17516,6.27838 c -6.02018,17.37428 -8.0762301,29.39951 -8.0684001,47.17021 0,15.17828 1.2843301,23.63498 5.5904801,36.97997 12.82745,39.75098 49.84408,72.52427 101.466619,89.83514 5.80702,1.94729 6.68198,2.47716 11.54186,7.0099 6.66504,6.21636 14.39167,11.3493 23.05222,15.31566 9.78729,4.48231 16.27558,6.2191 29.79809,7.9691 20.28599,2.62519 35.75405,3.02196 53.96213,1.38551 10.00303,-0.89906 22.3711,-2.84396 27.60841,-4.34061 12.30523,-3.51643 24.69915,-10.50496 34.98405,-19.72652 7.02577,-6.29943 7.51497,-6.60945 14.28867,-9.0155 47.51848,-16.87912 81.2963,-46.48266 95.69689,-83.87405 6.04823,-15.70401 8.67135,-34.47172 7.17944,-51.3631 -1.01092,-11.44237 -3.54478,-23.93594 -6.7943,-33.49439 -1.35294,-3.97957 -2.45855,-7.52644 -2.45855,-7.88189 0,-0.35549 1.88245,-4.08107 4.18315,-8.27913 14.6159,-26.67106 17.6998,-57.67627 8.47534,-85.211126 l -1.51872,-4.53195 -4.69426,-2.10492 c -21.65103,-9.70728 -66.27117,-12.03073 -96.50835,-5.02609 l -6.55693,1.51872 -12.08444,-5.25862 c -6.64658,-2.89168 -15.19046,-6.27668 -18.98775,-7.5234 -20.33766,-6.6772 -42.81112,-10.25834 -64.69011,-10.48821 z M 114.9584,120.1596 c 0.89827,0 32.56973,11.89177 33.22312,12.4744 1.08465,0.96712 -1.52492,5.9751 -4.57314,8.7757 -1.55336,1.42707 -4.13505,3.09699 -5.73581,3.70841 -15.64828,5.97722 -31.56691,-8.02023 -24.881,-21.87746 0.8177,-1.69469 1.70241,-3.08105 1.96683,-3.08105 z m 184.42024,0.62977 c 0.10351,0.009 0.1807,0.0276 0.22527,0.0606 1.25451,0.92826 3.06168,6.41925 3.06168,9.30132 0,5.85906 -4.47397,11.95187 -10.69651,14.56961 -7.49256,3.15191 -14.37348,2.33937 -20.76566,-2.45612 -2.33787,-1.75398 -5.64618,-6.93055 -5.64618,-8.81687 0.005,-1.53511 30.61194,-12.90841 33.8214,-12.6585 z m -88.55862,28.93337 c 14.37063,-0.027 28.75317,2.4358 36.61178,7.55488 10.61987,6.91764 7.19471,20.25668 -8.13622,31.68501 -5.51941,4.11429 -15.42291,8.75917 -21.67882,10.16846 -7.75654,1.74733 -13.53947,0.90038 -23.13459,-3.38625 -14.44842,-6.45479 -25.26854,-17.48329 -26.11875,-26.625 -0.46187,-4.96531 0.28073,-7.30805 3.1513,-9.94318 6.7457,-6.19289 23.01858,-9.42333 39.3053,-9.45392 z m -0.46507,83.43806 c 8.82994,1e-5 21.90971,3.55346 32.18398,8.74421 15.77369,7.9691 30.57783,21.1565 35.90208,31.98051 3.68786,7.4971 4.18188,16.00812 1.26924,21.86534 -5.22267,10.50284 -25.03716,18.03508 -53.7199,20.42411 -18.1235,1.50956 -40.77834,-0.15131 -56.23658,-4.12259 -16.44895,-4.22581 -26.40281,-10.46652 -28.75897,-18.03341 -4.53633,-14.56882 8.41138,-34.36087 31.45973,-48.0931 12.762,-7.60349 28.08632,-12.76507 37.90042,-12.76507 z"
|
||||||
id="path4206"
|
id="path4206"
|
||||||
inkscape:connector-curvature="0" />
|
inkscape:connector-curvature="0" />
|
||||||
|
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 5.7 KiB |
4
src/ui/public/chrome/api/angular.js
vendored
|
@ -47,7 +47,9 @@ module.exports = function (chrome, internals) {
|
||||||
length--;
|
length--;
|
||||||
}
|
}
|
||||||
|
|
||||||
return path.substr(1, length).split('/');
|
return path.substr(1, length)
|
||||||
|
.replace(/_/g, ' ') // Present snake-cased breadcrumb names as individual words
|
||||||
|
.split('/');
|
||||||
};
|
};
|
||||||
|
|
||||||
const notify = new Notifier();
|
const notify = new Notifier();
|
||||||
|
|
|
@ -56,7 +56,6 @@
|
||||||
.global-nav-link__icon-image {
|
.global-nav-link__icon-image {
|
||||||
height: 18px;
|
height: 18px;
|
||||||
margin-top: 8px;
|
margin-top: 8px;
|
||||||
filter: invert(100%);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
</navbar>
|
</navbar>
|
||||||
<div class="config" ng-show="kbnTopNav.rendered">
|
<div class="config" ng-show="kbnTopNav.rendered">
|
||||||
<div id="template_wrapper" class="container-fluid"></div>
|
<div id="template_wrapper" class="container-fluid"></div>
|
||||||
<div class="config-close remove">
|
<div class="config-close remove" ng-click="kbnTopNav.close()" data-test-subj="config-close-button">
|
||||||
<i class="fa fa-chevron-circle-up" ng-click="kbnTopNav.close()"></i>
|
<i class="fa fa-chevron-circle-up"></i>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
6
src/ui/public/registry/dev_tools.js
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
import uiRegistry from 'ui/registry/_registry';
|
||||||
|
export default uiRegistry({
|
||||||
|
name: 'devTools',
|
||||||
|
index: ['name'],
|
||||||
|
order: ['order']
|
||||||
|
});
|
|
@ -1,18 +1,169 @@
|
||||||
|
import {
|
||||||
|
parse as parseUrl,
|
||||||
|
format as formatUrl,
|
||||||
|
} from 'url';
|
||||||
|
|
||||||
|
import {
|
||||||
|
getUnhashableStatesProvider,
|
||||||
|
unhashUrl,
|
||||||
|
} from 'ui/state_management/state_hashing';
|
||||||
|
import Notifier from 'ui/notify/notifier';
|
||||||
|
|
||||||
|
import urlShortenerProvider from '../lib/url_shortener';
|
||||||
|
|
||||||
import uiModules from 'ui/modules';
|
import uiModules from 'ui/modules';
|
||||||
import shareTemplate from 'ui/share/views/share.html';
|
import shareTemplate from 'ui/share/views/share.html';
|
||||||
const app = uiModules.get('kibana');
|
const app = uiModules.get('kibana');
|
||||||
|
|
||||||
app.directive('share', function () {
|
app.directive('share', function (Private) {
|
||||||
|
const getUnhashableStates = Private(getUnhashableStatesProvider);
|
||||||
|
const urlShortener = Private(urlShortenerProvider);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
restrict: 'E',
|
restrict: 'E',
|
||||||
scope: {
|
scope: {
|
||||||
objectType: '@',
|
objectType: '@',
|
||||||
objectId: '@',
|
objectId: '@',
|
||||||
setAllowEmbed: '&?allowEmbed'
|
allowEmbed: '@',
|
||||||
},
|
},
|
||||||
template: shareTemplate,
|
template: shareTemplate,
|
||||||
controller: function ($scope) {
|
controllerAs: 'share',
|
||||||
$scope.allowEmbed = $scope.setAllowEmbed ? $scope.setAllowEmbed() : true;
|
controller: function ($scope, $document, $location, globalState) {
|
||||||
|
if ($scope.allowEmbed !== 'false' && $scope.allowEmbed !== undefined) {
|
||||||
|
throw new Error('allowEmbed must be "false" or undefined');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Default to allowing an embedded IFRAME, unless it's explicitly set to false.
|
||||||
|
this.allowEmbed = $scope.allowEmbed === 'false' ? false : true;
|
||||||
|
this.objectType = $scope.objectType;
|
||||||
|
|
||||||
|
function getOriginalUrl() {
|
||||||
|
// If there is no objectId, then it isn't saved, so it has no original URL.
|
||||||
|
if ($scope.objectId === undefined || $scope.objectId === '') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const url = $location.absUrl();
|
||||||
|
// Replace hashes with original RISON values.
|
||||||
|
const unhashedUrl = unhashUrl(url, getUnhashableStates());
|
||||||
|
|
||||||
|
const parsedUrl = parseUrl(unhashedUrl);
|
||||||
|
// Get the Angular route, after the hash, and remove the #.
|
||||||
|
const parsedAppUrl = parseUrl(parsedUrl.hash.slice(1), true);
|
||||||
|
|
||||||
|
return formatUrl({
|
||||||
|
protocol: parsedUrl.protocol,
|
||||||
|
auth: parsedUrl.auth,
|
||||||
|
host: parsedUrl.host,
|
||||||
|
pathname: parsedUrl.pathname,
|
||||||
|
hash: formatUrl({
|
||||||
|
pathname: parsedAppUrl.pathname,
|
||||||
|
query: {
|
||||||
|
// Add global state to the URL so that the iframe doesn't just show the time range
|
||||||
|
// default.
|
||||||
|
_g: parsedAppUrl.query._g,
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
function getSnapshotUrl() {
|
||||||
|
const url = $location.absUrl();
|
||||||
|
// Replace hashes with original RISON values.
|
||||||
|
return unhashUrl(url, getUnhashableStates());
|
||||||
|
}
|
||||||
|
|
||||||
|
this.makeUrlEmbeddable = url => {
|
||||||
|
const embedQueryParam = '?embed=true';
|
||||||
|
const urlHasQueryString = url.indexOf('?') !== -1;
|
||||||
|
if (urlHasQueryString) {
|
||||||
|
return url.replace('?', `${embedQueryParam}&`);
|
||||||
|
}
|
||||||
|
return `${url}${embedQueryParam}`;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.makeIframeTag = url => {
|
||||||
|
if (!url) return;
|
||||||
|
|
||||||
|
const embeddableUrl = this.makeUrlEmbeddable(url);
|
||||||
|
return `<iframe src="${embeddableUrl}" height="600" width="800"></iframe>`;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.urls = {
|
||||||
|
original: undefined,
|
||||||
|
snapshot: undefined,
|
||||||
|
shortSnapshot: undefined,
|
||||||
|
shortSnapshotIframe: undefined,
|
||||||
|
};
|
||||||
|
|
||||||
|
this.urlFlags = {
|
||||||
|
shortSnapshot: false,
|
||||||
|
shortSnapshotIframe: false,
|
||||||
|
};
|
||||||
|
|
||||||
|
const updateUrls = () => {
|
||||||
|
this.urls = {
|
||||||
|
original: getOriginalUrl(),
|
||||||
|
snapshot: getSnapshotUrl(),
|
||||||
|
shortSnapshot: undefined,
|
||||||
|
shortSnapshotIframe: undefined,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Whenever the URL changes, reset the Short URLs to regular URLs.
|
||||||
|
this.urlFlags = {
|
||||||
|
shortSnapshot: false,
|
||||||
|
shortSnapshotIframe: false,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
// When the URL changes, update the links in the UI.
|
||||||
|
$scope.$watch(() => $location.absUrl(), () => {
|
||||||
|
updateUrls();
|
||||||
|
});
|
||||||
|
|
||||||
|
this.toggleShortSnapshotUrl = () => {
|
||||||
|
this.urlFlags.shortSnapshot = !this.urlFlags.shortSnapshot;
|
||||||
|
|
||||||
|
if (this.urlFlags.shortSnapshot) {
|
||||||
|
urlShortener.shortenUrl(this.urls.snapshot)
|
||||||
|
.then(shortUrl => {
|
||||||
|
this.urls.shortSnapshot = shortUrl;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.toggleShortSnapshotIframeUrl = () => {
|
||||||
|
this.urlFlags.shortSnapshotIframe = !this.urlFlags.shortSnapshotIframe;
|
||||||
|
|
||||||
|
if (this.urlFlags.shortSnapshotIframe) {
|
||||||
|
const snapshotIframe = this.makeUrlEmbeddable(this.urls.snapshot);
|
||||||
|
urlShortener.shortenUrl(snapshotIframe)
|
||||||
|
.then(shortUrl => {
|
||||||
|
this.urls.shortSnapshotIframe = shortUrl;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.copyToClipboard = selector => {
|
||||||
|
const notify = new Notifier({
|
||||||
|
location: `Share ${$scope.objectType}`,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Select the text to be copied. If the copy fails, the user can easily copy it manually.
|
||||||
|
const copyTextarea = $document.find(selector)[0];
|
||||||
|
copyTextarea.select();
|
||||||
|
|
||||||
|
try {
|
||||||
|
const isCopied = document.execCommand('copy');
|
||||||
|
if (isCopied) {
|
||||||
|
notify.info('URL copied to clipboard.');
|
||||||
|
} else {
|
||||||
|
notify.info('URL selected. Press Ctrl+C to copy.');
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
notify.info('URL selected. Press Ctrl+C to copy.');
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,91 +0,0 @@
|
||||||
const app = uiModules.get('kibana');
|
|
||||||
import Clipboard from 'clipboard';
|
|
||||||
import '../styles/index.less';
|
|
||||||
import LibUrlShortenerProvider from '../lib/url_shortener';
|
|
||||||
import uiModules from 'ui/modules';
|
|
||||||
import shareObjectUrlTemplate from 'ui/share/views/share_object_url.html';
|
|
||||||
import {
|
|
||||||
getUnhashableStatesProvider,
|
|
||||||
unhashUrl,
|
|
||||||
} from 'ui/state_management/state_hashing';
|
|
||||||
import { memoize } from 'lodash';
|
|
||||||
|
|
||||||
app.directive('shareObjectUrl', function (Private, Notifier) {
|
|
||||||
const urlShortener = Private(LibUrlShortenerProvider);
|
|
||||||
const getUnhashableStates = Private(getUnhashableStatesProvider);
|
|
||||||
|
|
||||||
return {
|
|
||||||
restrict: 'E',
|
|
||||||
scope: {
|
|
||||||
getShareAsEmbed: '&shareAsEmbed'
|
|
||||||
},
|
|
||||||
template: shareObjectUrlTemplate,
|
|
||||||
link: function ($scope, $el) {
|
|
||||||
const notify = new Notifier({
|
|
||||||
location: `Share ${$scope.$parent.objectType}`
|
|
||||||
});
|
|
||||||
|
|
||||||
$scope.textbox = $el.find('input.url')[0];
|
|
||||||
$scope.clipboardButton = $el.find('button.clipboard-button')[0];
|
|
||||||
|
|
||||||
const clipboard = new Clipboard($scope.clipboardButton, {
|
|
||||||
target(trigger) {
|
|
||||||
return $scope.textbox;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
clipboard.on('success', e => {
|
|
||||||
notify.info('URL copied to clipboard.');
|
|
||||||
e.clearSelection();
|
|
||||||
});
|
|
||||||
|
|
||||||
clipboard.on('error', () => {
|
|
||||||
notify.info('URL selected. Press Ctrl+C to copy.');
|
|
||||||
});
|
|
||||||
|
|
||||||
$scope.$on('$destroy', () => {
|
|
||||||
clipboard.destroy();
|
|
||||||
});
|
|
||||||
|
|
||||||
$scope.clipboard = clipboard;
|
|
||||||
},
|
|
||||||
controller: function ($scope, $location) {
|
|
||||||
function updateUrl(url) {
|
|
||||||
$scope.url = url;
|
|
||||||
|
|
||||||
if ($scope.shareAsEmbed) {
|
|
||||||
$scope.formattedUrl = `<iframe src="${$scope.url}" height="600" width="800"></iframe>`;
|
|
||||||
} else {
|
|
||||||
$scope.formattedUrl = $scope.url;
|
|
||||||
}
|
|
||||||
|
|
||||||
$scope.shortGenerated = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$scope.shareAsEmbed = $scope.getShareAsEmbed();
|
|
||||||
|
|
||||||
$scope.generateShortUrl = function () {
|
|
||||||
if ($scope.shortGenerated) return;
|
|
||||||
|
|
||||||
urlShortener.shortenUrl($scope.url)
|
|
||||||
.then(shortUrl => {
|
|
||||||
updateUrl(shortUrl);
|
|
||||||
$scope.shortGenerated = true;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
$scope.getUrl = function () {
|
|
||||||
const urlWithHashes = $location.absUrl();
|
|
||||||
const urlWithStates = unhashUrl(urlWithHashes, getUnhashableStates());
|
|
||||||
|
|
||||||
if ($scope.shareAsEmbed) {
|
|
||||||
return urlWithStates.replace('?', '?embed=true&');
|
|
||||||
}
|
|
||||||
|
|
||||||
return urlWithStates;
|
|
||||||
};
|
|
||||||
|
|
||||||
$scope.$watch('getUrl()', updateUrl);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
});
|
|
|
@ -1,2 +1,2 @@
|
||||||
|
import './styles/index.less';
|
||||||
import './directives/share';
|
import './directives/share';
|
||||||
import './directives/share_object_url';
|
|
||||||
|
|
|
@ -1,21 +1,79 @@
|
||||||
share-object-url {
|
.share-dropdown {
|
||||||
.input-group {
|
display: flex;
|
||||||
|
padding: 5px 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.share-panel {
|
||||||
|
flex: 1 1 0%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.share-panel--left {
|
||||||
|
margin-right: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.share-panel--right {
|
||||||
|
margin-left: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.share-panel__title {
|
||||||
|
margin-bottom: 12px;
|
||||||
|
padding-bottom: 4px;
|
||||||
|
font-size: 18px;
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.share-panel-section {
|
||||||
|
margin-bottom: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.share-panel-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
margin-bottom: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.share-panel-header__label {
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 700;
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.share-panel-header__actions {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
.clipboard-button {
|
.share-panel-header__action {
|
||||||
border-top-left-radius: 0;
|
font-size: 12px;
|
||||||
border-bottom-left-radius: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.shorten-button {
|
& + & {
|
||||||
border-top-right-radius: 0;
|
margin-left: 10px;
|
||||||
border-top-left-radius: 0;
|
|
||||||
border-bottom-right-radius: 0;
|
|
||||||
border-bottom-left-radius: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.form-control.url {
|
|
||||||
cursor: text;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.share-panel-input {
|
||||||
|
width: 100%;
|
||||||
|
padding: 4px 10px;
|
||||||
|
margin-bottom: 6px;
|
||||||
|
border: 0;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.share-panel-form-note {
|
||||||
|
font-size: 14px;
|
||||||
|
color: #5A5A5A;
|
||||||
|
}
|
||||||
|
|
||||||
|
.share-panel-help-text {
|
||||||
|
margin-bottom: 16px;
|
||||||
|
font-size: 14px;
|
||||||
|
color: #2D2D2D;
|
||||||
|
}
|
||||||
|
|
||||||
|
.share-panel-warning {
|
||||||
|
margin-bottom: 16px;
|
||||||
|
padding: 6px 10px;
|
||||||
|
font-size: 14px;
|
||||||
|
color: #2D2D2D;
|
||||||
|
background-color: #e4e4e4;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,15 +1,194 @@
|
||||||
<form role="form" class="vis-share">
|
<div class="share-dropdown">
|
||||||
<div class="form-group" ng-if="allowEmbed">
|
<!-- Left panel -->
|
||||||
<label>
|
<div class="share-panel share-panel--left">
|
||||||
Embed this {{objectType}}
|
<!-- Title -->
|
||||||
<small>Add to your html source. Note all clients must still be able to access kibana</small>
|
<div
|
||||||
</label>
|
data-test-subj="shareUiTitle"
|
||||||
<share-object-url share-as-embed="true"></share-object-url>
|
class="share-panel__title"
|
||||||
|
>
|
||||||
|
Share saved {{share.objectType}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Help text -->
|
||||||
|
<div ng-if="share.urls.original" class="share-panel-help-text">
|
||||||
|
You can share this URL with people to let them load the most recent saved version of this {{share.objectType}}.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div ng-if="!share.urls.original" class="share-panel-warning">
|
||||||
|
Please save this {{share.objectType}} to enable this sharing option.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div ng-if="share.urls.original">
|
||||||
|
<!-- iframe -->
|
||||||
|
<div class="share-panel-section" ng-if="share.allowEmbed">
|
||||||
|
<!-- Header -->
|
||||||
|
<div class="share-panel-header">
|
||||||
|
<div class="share-panel-header__label">
|
||||||
|
Embedded iframe
|
||||||
|
</div>
|
||||||
|
<div class="share-panel-header__actions">
|
||||||
|
<a
|
||||||
|
class="share-panel-header__action"
|
||||||
|
ng-click="share.copyToClipboard('#originalIframeUrl')"
|
||||||
|
>
|
||||||
|
Copy
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Input -->
|
||||||
|
<input
|
||||||
|
id="originalIframeUrl"
|
||||||
|
class="share-panel-input"
|
||||||
|
type="text"
|
||||||
|
readonly
|
||||||
|
value="{{share.makeIframeTag(share.urls.original)}}"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<!-- Notes -->
|
||||||
|
<div class="share-panel-form-note">
|
||||||
|
Add to your HTML source. Note that all clients must be able to access Kibana.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Link -->
|
||||||
|
<div class="share-panel-section">
|
||||||
|
<!-- Header -->
|
||||||
|
<div class="share-panel-header">
|
||||||
|
<div class="share-panel-header__label">
|
||||||
|
Link
|
||||||
|
</div>
|
||||||
|
<div class="share-panel-header__actions">
|
||||||
|
<a
|
||||||
|
class="share-panel-header__action"
|
||||||
|
ng-click="share.copyToClipboard('#originalUrl')"
|
||||||
|
>
|
||||||
|
Copy
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Input -->
|
||||||
|
<input
|
||||||
|
id="originalUrl"
|
||||||
|
class="share-panel-input"
|
||||||
|
type="text"
|
||||||
|
readonly
|
||||||
|
value="{{share.urls.original}}"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
|
||||||
<label>
|
<!-- Right panel -->
|
||||||
Share a link
|
<div class="share-panel share-panel--right">
|
||||||
</label>
|
<!-- Title -->
|
||||||
<share-object-url share-as-embed="false"></share-object-url>
|
<div class="share-panel__title">
|
||||||
|
Share Snapshot
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Help text -->
|
||||||
|
<div class="share-panel-help-text">
|
||||||
|
Snapshot URLs encode the current state of the {{share.objectType}} in the URL itself. Edits to the saved {{share.objectType}} won't be visible via this URL.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- iframe -->
|
||||||
|
<div class="share-panel-section" ng-if="share.allowEmbed">
|
||||||
|
<!-- Header -->
|
||||||
|
<div class="share-panel-header">
|
||||||
|
<div class="share-panel-header__label">
|
||||||
|
Embedded iframe
|
||||||
|
</div>
|
||||||
|
<div class="share-panel-header__actions">
|
||||||
|
<a
|
||||||
|
class="share-panel-header__action"
|
||||||
|
ng-if="!share.urlFlags.shortSnapshotIframe"
|
||||||
|
ng-click="share.toggleShortSnapshotIframeUrl()"
|
||||||
|
>
|
||||||
|
Short URL
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<a
|
||||||
|
class="share-panel-header__action"
|
||||||
|
ng-if="share.urlFlags.shortSnapshotIframe"
|
||||||
|
ng-click="share.toggleShortSnapshotIframeUrl()"
|
||||||
|
>
|
||||||
|
Long URL
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<a
|
||||||
|
class="share-panel-header__action"
|
||||||
|
ng-click="share.copyToClipboard('#snapshotIframeUrl')"
|
||||||
|
>
|
||||||
|
Copy
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Input -->
|
||||||
|
<input
|
||||||
|
id="snapshotIframeUrl"
|
||||||
|
class="share-panel-input"
|
||||||
|
type="text"
|
||||||
|
readonly
|
||||||
|
value="{{share.urlFlags.shortSnapshotIframe ? share.makeIframeTag(share.urls.shortSnapshotIframe) : share.makeIframeTag(share.urls.snapshot)}}"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<!-- Notes -->
|
||||||
|
<div class="share-panel-form-note">
|
||||||
|
Add to your HTML source. Note that all clients must be able to access Kibana.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Link -->
|
||||||
|
<div class="share-panel-section">
|
||||||
|
<!-- Header -->
|
||||||
|
<div class="share-panel-header">
|
||||||
|
<div class="share-panel-header__label">
|
||||||
|
Link
|
||||||
|
</div>
|
||||||
|
<div class="share-panel-header__actions">
|
||||||
|
<a
|
||||||
|
data-test-subj="sharedSnapshotShortUrlButton"
|
||||||
|
class="share-panel-header__action"
|
||||||
|
ng-if="!share.urlFlags.shortSnapshot"
|
||||||
|
ng-click="share.toggleShortSnapshotUrl()"
|
||||||
|
>
|
||||||
|
Short URL
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<a
|
||||||
|
class="share-panel-header__action"
|
||||||
|
ng-if="share.urlFlags.shortSnapshot"
|
||||||
|
ng-click="share.toggleShortSnapshotUrl()"
|
||||||
|
>
|
||||||
|
Long URL
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<a
|
||||||
|
data-test-subj="sharedSnapshotCopyButton"
|
||||||
|
class="share-panel-header__action"
|
||||||
|
ng-click="share.copyToClipboard('#snapshotUrl')"
|
||||||
|
>
|
||||||
|
Copy
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Input -->
|
||||||
|
<input
|
||||||
|
data-test-subj="sharedSnapshotUrl"
|
||||||
|
id="snapshotUrl"
|
||||||
|
class="share-panel-input"
|
||||||
|
type="text"
|
||||||
|
readonly
|
||||||
|
value="{{share.urlFlags.shortSnapshot ? share.urls.shortSnapshot : share.urls.snapshot}}"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<!-- Notes -->
|
||||||
|
<div class="share-panel-form-note">
|
||||||
|
We recommend sharing shortened snapshot URLs for maximum compatibility. Internet Explorer has URL length restrictions, and some wiki and markup parsers don't do well with the full-length version of the snapshot URL, but the short URL should work great.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</div>
|
||||||
|
|
|
@ -1,21 +0,0 @@
|
||||||
<div class="input-group">
|
|
||||||
<input
|
|
||||||
ng-model="formattedUrl"
|
|
||||||
type="text"
|
|
||||||
readonly=""
|
|
||||||
class="form-control url">
|
|
||||||
</input>
|
|
||||||
<button
|
|
||||||
class="shorten-button btn btn-default"
|
|
||||||
tooltip="Generate Short URL"
|
|
||||||
ng-click="generateShortUrl()"
|
|
||||||
ng-disabled="shortGenerated">
|
|
||||||
<span aria-hidden="true" class="fa fa-compress"></span>
|
|
||||||
</button>
|
|
||||||
<button
|
|
||||||
class="clipboard-button btn btn-default"
|
|
||||||
tooltip="Copy to Clipboard"
|
|
||||||
ng-click="copyToClipboard()">
|
|
||||||
<span aria-hidden="true" class="fa fa-clipboard"></span>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
|
@ -53,10 +53,6 @@ export default function ColumnLayoutFactory(Private) {
|
||||||
splits: chartTitleSplit
|
splits: chartTitleSplit
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
|
||||||
{
|
|
||||||
type: 'div',
|
|
||||||
class: 'legend-col-wrapper'
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,6 +80,7 @@ visualize-legend {
|
||||||
.vis-container--legend-top &,
|
.vis-container--legend-top &,
|
||||||
.vis-container--legend-bottom & {
|
.vis-container--legend-bottom & {
|
||||||
width: auto;
|
width: auto;
|
||||||
|
overflow-y: hidden;
|
||||||
|
|
||||||
.legend-value {
|
.legend-value {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
|
|
|
@ -82,6 +82,7 @@ class UiExports {
|
||||||
case 'chromeNavControls':
|
case 'chromeNavControls':
|
||||||
case 'navbarExtensions':
|
case 'navbarExtensions':
|
||||||
case 'managementSections':
|
case 'managementSections':
|
||||||
|
case 'devTools':
|
||||||
case 'docViews':
|
case 'docViews':
|
||||||
case 'hacks':
|
case 'hacks':
|
||||||
return (plugin, spec) => {
|
return (plugin, spec) => {
|
||||||
|
|
|
@ -1,12 +1,22 @@
|
||||||
|
|
||||||
import expect from 'expect.js';
|
import expect from 'expect.js';
|
||||||
|
|
||||||
|
import PageObjects from '../../../support/page_objects';
|
||||||
import {
|
import {
|
||||||
bdd,
|
bdd,
|
||||||
scenarioManager
|
scenarioManager
|
||||||
} from '../../../support';
|
} from '../../../support';
|
||||||
|
|
||||||
import PageObjects from '../../../support/page_objects';
|
const DEFAULT_REQUEST = `
|
||||||
|
|
||||||
|
GET _search
|
||||||
|
{
|
||||||
|
"query": {
|
||||||
|
"match_all": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
`.trim();
|
||||||
|
|
||||||
bdd.describe('console app', function describeIndexTests() {
|
bdd.describe('console app', function describeIndexTests() {
|
||||||
bdd.before(function () {
|
bdd.before(function () {
|
||||||
|
@ -15,15 +25,6 @@ bdd.describe('console app', function describeIndexTests() {
|
||||||
});
|
});
|
||||||
|
|
||||||
bdd.it('should show the default request', function () {
|
bdd.it('should show the default request', function () {
|
||||||
var expectedRequest = [
|
|
||||||
'GET _search',
|
|
||||||
'{',
|
|
||||||
' "query": {',
|
|
||||||
' "match_all": {}',
|
|
||||||
' }',
|
|
||||||
'}',
|
|
||||||
''
|
|
||||||
];
|
|
||||||
PageObjects.common.saveScreenshot('Console-help-expanded');
|
PageObjects.common.saveScreenshot('Console-help-expanded');
|
||||||
// collapse the help pane because we only get the VISIBLE TEXT, not the part that is scrolled
|
// collapse the help pane because we only get the VISIBLE TEXT, not the part that is scrolled
|
||||||
return PageObjects.console.collapseHelp()
|
return PageObjects.console.collapseHelp()
|
||||||
|
@ -32,14 +33,15 @@ bdd.describe('console app', function describeIndexTests() {
|
||||||
return PageObjects.common.try(function () {
|
return PageObjects.common.try(function () {
|
||||||
return PageObjects.console.getRequest()
|
return PageObjects.console.getRequest()
|
||||||
.then(function (actualRequest) {
|
.then(function (actualRequest) {
|
||||||
expect(actualRequest).to.eql(expectedRequest);
|
expect(actualRequest.trim()).to.eql(DEFAULT_REQUEST);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
bdd.it('default request response should contain .kibana' , function () {
|
bdd.it('default request response should contain .kibana' , function () {
|
||||||
var expectedResponseContains = '"_index": ".kibana",';
|
const expectedResponseContains = '"_index": ".kibana",';
|
||||||
|
|
||||||
return PageObjects.console.clickPlay()
|
return PageObjects.console.clickPlay()
|
||||||
.then(function () {
|
.then(function () {
|
||||||
PageObjects.common.saveScreenshot('Console-default-request');
|
PageObjects.common.saveScreenshot('Console-default-request');
|
||||||
|
|
|
@ -52,14 +52,14 @@ bdd.describe('shared links', function describeIndexTests() {
|
||||||
|
|
||||||
bdd.describe('shared link', function () {
|
bdd.describe('shared link', function () {
|
||||||
bdd.it('should show "Share a link" caption', function () {
|
bdd.it('should show "Share a link" caption', function () {
|
||||||
var expectedCaption = 'Share a link';
|
var expectedCaption = 'Share saved';
|
||||||
return PageObjects.discover.clickShare()
|
return PageObjects.discover.clickShare()
|
||||||
.then(function () {
|
.then(function () {
|
||||||
PageObjects.common.saveScreenshot('Discover-share-link');
|
PageObjects.common.saveScreenshot('Discover-share-link');
|
||||||
return PageObjects.discover.getShareCaption();
|
return PageObjects.discover.getShareCaption();
|
||||||
})
|
})
|
||||||
.then(function (actualCaption) {
|
.then(function (actualCaption) {
|
||||||
expect(actualCaption).to.be(expectedCaption);
|
expect(actualCaption).to.contain(expectedCaption);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -100,7 +100,7 @@ bdd.describe('shared links', function describeIndexTests() {
|
||||||
.then(function () {
|
.then(function () {
|
||||||
return PageObjects.common.try(function tryingForTime() {
|
return PageObjects.common.try(function tryingForTime() {
|
||||||
PageObjects.common.saveScreenshot('Discover-shorten-url-button');
|
PageObjects.common.saveScreenshot('Discover-shorten-url-button');
|
||||||
return PageObjects.discover.getShortenedUrl()
|
return PageObjects.discover.getSharedUrl()
|
||||||
.then(function (actualUrl) {
|
.then(function (actualUrl) {
|
||||||
expect(actualUrl).to.match(re);
|
expect(actualUrl).to.match(re);
|
||||||
});
|
});
|
||||||
|
|
|
@ -43,7 +43,8 @@ module.exports = {
|
||||||
hash: '/management'
|
hash: '/management'
|
||||||
},
|
},
|
||||||
console: {
|
console: {
|
||||||
pathname: 'app/console',
|
pathname: kibanaURL,
|
||||||
|
hash: '/dev_tools/console',
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,59 +1,38 @@
|
||||||
|
import Bluebird from 'bluebird';
|
||||||
|
|
||||||
|
import PageObjects from './';
|
||||||
import {
|
import {
|
||||||
defaultFindTimeout,
|
defaultFindTimeout,
|
||||||
} from '../';
|
} from '../';
|
||||||
|
|
||||||
export default class ConsolePage {
|
async function getVisibleTextFromAceEditor(editor) {
|
||||||
|
const lines = await editor.findAllByClassName('ace_line_group');
|
||||||
init(remote) {
|
const linesText = await Bluebird.map(lines, l => l.getVisibleText());
|
||||||
this.remote = remote;
|
return linesText.join('\n');
|
||||||
this.findTimeout = this.remote.setFindTimeout(defaultFindTimeout);
|
}
|
||||||
}
|
|
||||||
|
export default class ConsolePage {
|
||||||
getServer() {
|
init() {
|
||||||
return this.findTimeout
|
|
||||||
.findByCssSelector('#kibana-body > div.content > div > div')
|
}
|
||||||
.getVisibleText();
|
|
||||||
}
|
async getRequest() {
|
||||||
|
const requestEditor = await PageObjects.common.findTestSubject('console request-editor');
|
||||||
setServer(server) {
|
return await getVisibleTextFromAceEditor(requestEditor);
|
||||||
return this.findTimeout
|
}
|
||||||
.findByCssSelector('input[aria-label="Server Name"]')
|
|
||||||
.clearValue()
|
async getResponse() {
|
||||||
.type(server);
|
const responseEditor = await PageObjects.common.findTestSubject('console response-editor');
|
||||||
}
|
return await getVisibleTextFromAceEditor(responseEditor);
|
||||||
|
}
|
||||||
getRequest() {
|
|
||||||
return this.findTimeout
|
async clickPlay() {
|
||||||
.findAllByCssSelector('div.ace_line_group')
|
const sendRequestButton = await PageObjects.common.findTestSubject('console send-request-button');
|
||||||
.then(function (editorData) {
|
await sendRequestButton.click();
|
||||||
|
}
|
||||||
function getEditorData(line) {
|
|
||||||
return line.getVisibleText();
|
async collapseHelp() {
|
||||||
}
|
const closeButton = await PageObjects.common.findTestSubject('console top-nav config-close-button');
|
||||||
|
await closeButton.click();
|
||||||
var getEditorDataPromises = editorData.map(getEditorData);
|
}
|
||||||
return Promise.all(getEditorDataPromises);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
getResponse() {
|
|
||||||
return this.findTimeout
|
|
||||||
.findByCssSelector('#output > div.ace_scroller > div')
|
|
||||||
.getVisibleText();
|
|
||||||
}
|
|
||||||
|
|
||||||
clickPlay() {
|
|
||||||
return this.findTimeout
|
|
||||||
.findByCssSelector('#editor_actions > span.ng-scope > a > i')
|
|
||||||
.click();
|
|
||||||
}
|
|
||||||
|
|
||||||
collapseHelp() {
|
|
||||||
return this.findTimeout
|
|
||||||
.findByCssSelector('div.config-close.remove > i')
|
|
||||||
.click();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -202,31 +202,25 @@ export default class DiscoverPage {
|
||||||
|
|
||||||
clickShortenUrl() {
|
clickShortenUrl() {
|
||||||
return this.findTimeout
|
return this.findTimeout
|
||||||
.findByCssSelector('button.shorten-button')
|
.findByCssSelector('[data-test-subj="sharedSnapshotShortUrlButton"]')
|
||||||
.click();
|
.click();
|
||||||
}
|
}
|
||||||
|
|
||||||
clickCopyToClipboard() {
|
clickCopyToClipboard() {
|
||||||
return this.findTimeout
|
return this.findTimeout
|
||||||
.findDisplayedByCssSelector('button.clipboard-button')
|
.findByCssSelector('[data-test-subj="sharedSnapshotCopyButton"]')
|
||||||
.click();
|
.click();
|
||||||
}
|
}
|
||||||
|
|
||||||
getShareCaption() {
|
getShareCaption() {
|
||||||
return this.findTimeout
|
return this.findTimeout
|
||||||
.findByCssSelector('.vis-share label')
|
.findByCssSelector('[data-test-subj="shareUiTitle"]')
|
||||||
.getVisibleText();
|
.getVisibleText();
|
||||||
}
|
}
|
||||||
|
|
||||||
getSharedUrl() {
|
getSharedUrl() {
|
||||||
return this.findTimeout
|
return this.findTimeout
|
||||||
.findByCssSelector('.url')
|
.findByCssSelector('[data-test-subj="sharedSnapshotUrl"]')
|
||||||
.getProperty('value');
|
|
||||||
}
|
|
||||||
|
|
||||||
getShortenedUrl() {
|
|
||||||
return this.findTimeout
|
|
||||||
.findByCssSelector('.url')
|
|
||||||
.getProperty('value');
|
.getProperty('value');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|