Merge branch 'master' into functional-testing

This commit is contained in:
Jonathan Budzenski 2015-09-18 09:09:14 -05:00
commit bb85a6c244
130 changed files with 2768 additions and 1013 deletions

View file

@ -10,4 +10,5 @@ trim_trailing_whitespace = true
insert_final_newline = true
[*.md]
trim_trailing_whitespace = false
insert_final_newline = false

View file

@ -1,7 +1,6 @@
language: node_js
node_js: '0.12.7'
install:
- npm install -g npm@3.2
- npm install
script: ./node_modules/.bin/grunt travis
sudo: false

View file

@ -23,12 +23,6 @@ Please make sure you have signed the [Contributor License Agreement](http://www.
nvm install "$(cat .node-version)"
```
- Install npm 3.2
```sh
npm install -g npm@3.2
```
- Install dependencies
```sh
@ -73,6 +67,7 @@ Here are some hints for getting eslint setup in your favorite editor:
| IntelliJ | Settings » Languages & Frameworks » JavaScript » Code Quality Tools » ESLint |
| vi | [scrooloose/syntastic](https://github.com/scrooloose/syntastic) |
Another tool we use for enforcing consistent coding style is Editorconfig, which can be set up by installing a plugin in your editor that dynamically updates its configuration. Take a look at the [Editorconfig](http://editorconfig.org/#download) site to find a plugin for your editor, and browse our [`.editorconfig`](https://github.com/elastic/kibana/blob/master/.editorconfig) file to see what config rules we set up.
### Testing and building

View file

@ -45,7 +45,22 @@ module.exports = function (grunt) {
'<%= root %>/tasks/**/*.js',
'<%= src %>/**/*.js',
'!<%= src %>/fixtures/**/*.js'
]
],
deepModules: {
'caniuse-db': '1.0.30000265',
'chalk': '1.1.0',
'glob': '4.5.3',
'har-validator': '1.8.0',
'json5': '0.4.0',
'loader-utils': '0.2.11',
'micromatch': '2.2.0',
'postcss-normalize-url': '2.1.1',
'postcss-reduce-idents': '1.0.2',
'postcss-unique-selectors': '1.0.0',
'postcss-minify-selectors': '1.4.6',
'postcss-single-charset': '0.3.0',
'regenerator': '0.8.36'
}
};
grunt.config.merge(config);

View file

@ -25,7 +25,11 @@
# elasticsearch.username: user
# elasticsearch.password: pass
# If your Elasticsearch requires client certificate and key
# SSL for outgoing requests from the Kibana Server to the browser (PEM formatted)
# server.ssl.cert: /path/to/your/server.crt
# server.ssl.key: /path/to/your/server.key
# Optional setting to validate that your Elasticsearch backend uses the same key files (PEM formatted)
# elasticsearch.ssl.cert: /path/to/your/client.crt
# elasticsearch.ssl.key: /path/to/your/client.key
@ -52,12 +56,17 @@
# Time in milliseconds to wait for Elasticsearch at Kibana startup before retrying
# elasticsearch.startupTimeout: 5000
# SSL for outgoing requests from the Kibana Server (PEM formatted)
# server.ssl.cert: /path/to/your/server.crt
# server.ssl.key: /path/to/your/server.key
# Set the path to where you would like the process id file to be created.
# pid.file: /var/run/kibana.pid
# If you would like to send the log output to a file you can set the path below.
# logging.dest: stdout
# Set this to true to suppress all logging output.
# logging.silent: false
# Set this to true to suppress all logging output except for error messages.
# logging.quiet: false
# Set this to true to log all events, including system usage information and all requests.
# logging.verbose

View file

@ -107,6 +107,18 @@ heatmap dots appear at full intensity.
* *Show Tooltip*: Check this box to have a tooltip with the values for a given dot when the cursor is on that dot.
*Desaturate map tiles*:: Desaturate the map's color in order to make the markers stand out more clearly.
*WMS compliant map server*:: Check this box to enable the use of a third-party mapping service that complies with the Web
Map Service (WMS) standard. Specify the following elements:
* *WMS url*: The URL for the WMS map service.
* *WMS layers*: A comma-separated list of the layers to use in this visualization. Each map server provides its own list of
layers.
* *WMS version*: The WMS version used by this map service.
* *WMS format*: The image format used by this map service. The two most common formats are `image/png` and `image/jpeg`.
* *WMS attribution*: An optional, user-defined string that identifies the map source. Maps display the attribution string
in the lower right corner.
* *WMS styles*: A comma-separated list of the styles to use in this visualization. Each map server provides its own styling
options.
After changing options, click the green *Apply changes* button to update your visualization, or the grey *Discard
changes* button to keep your visualization in its current state.

View file

@ -138,7 +138,7 @@
"grunt-cli": "0.1.13",
"grunt-contrib-clean": "0.6.0",
"grunt-contrib-copy": "0.8.1",
"grunt-esvm": "1.1.5",
"grunt-esvm": "1.1.6",
"grunt-karma": "0.12.0",
"grunt-run": "0.5.0",
"grunt-s3": "0.2.0-alpha.3",
@ -156,14 +156,14 @@
"karma-ie-launcher": "0.2.0",
"karma-mocha": "0.2.0",
"karma-safari-launcher": "0.1.1",
"libesvm": "1.0.5",
"libesvm": "1.0.7",
"license-checker": "3.1.0",
"load-grunt-config": "0.7.2",
"marked-text-renderer": "0.1.0",
"mocha": "2.3.0",
"nock": "2.10.0",
"Nonsense": "0.1.2",
"npm": "3.2.2",
"npm": "2.11.0",
"portscanner": "1.0.0",
"simple-git": "1.8.0",
"sinon": "1.16.1",
@ -171,7 +171,7 @@
"wreck": "6.2.0"
},
"engines": {
"node": "2.5",
"npm": "3.2"
"node": "0.12",
"npm": "2.14.3"
}
}

View file

@ -31,8 +31,8 @@ ${help(this, ' ')}
};
Command.prototype.unknownArgv = function (argv) {
if (argv) this.__unkownArgv = argv;
return this.__unkownArgv ? this.__unkownArgv.slice(0) : [];
if (argv) this.__unknownArgv = argv;
return this.__unknownArgv ? this.__unknownArgv.slice(0) : [];
};
/**

View file

@ -34,6 +34,11 @@ module.exports = function (program) {
.option('-q, --quiet', 'Disable all process messaging except errors')
.option('-s, --silent', 'Disable all process messaging')
.option('-u, --url <url>', 'Specify download url')
.option(
'-c, --config <path>',
'Path to the config file',
fromRoot('config/kibana.yml')
)
.option(
'-t, --timeout <duration>',
'Length of time before failing; 0 for never fail',

View file

@ -1,5 +1,10 @@
let _ = require('lodash');
var utils = require('requirefrom')('src/utils');
var fromRoot = utils('fromRoot');
var pluginDownloader = require('./pluginDownloader');
var pluginCleaner = require('./pluginCleaner');
var KbnServer = require('../../server/KbnServer');
var readYamlConfig = require('../serve/readYamlConfig');
var fs = require('fs');
module.exports = {
@ -25,7 +30,36 @@ function install(settings, logger) {
.then(function () {
return downloader.download();
})
.then(function (curious) {
.then(async function() {
logger.log('Optimizing and caching browser bundles...');
let serverConfig = _.merge(
readYamlConfig(settings.config),
{
env: 'production',
logging: {
silent: settings.silent,
quiet: !settings.silent,
verbose: false
},
optimize: {
useBundleCache: false
},
server: {
autoListen: false
},
plugins: {
initialize: false,
scanDirs: [settings.pluginDir, fromRoot('src/plugins')],
paths: [settings.workingPath]
}
}
);
let kbnServer = new KbnServer(serverConfig);
await kbnServer.ready();
await kbnServer.close();
})
.then(function () {
fs.renameSync(settings.workingPath, settings.pluginPath);
logger.log('Plugin installation complete');
})

View file

@ -54,6 +54,10 @@ module.exports = function (options) {
settings.urls.push(options.url);
}
if (options.config) {
settings.config = options.config;
}
if (options.install) {
settings.action = 'install';
parts = options.install.split('/');

View file

@ -32,7 +32,10 @@ module.exports = function (program) {
.description('Run the kibana server')
.collectUnknownOptions()
.option('-e, --elasticsearch <uri>', 'Elasticsearch instance')
.option('-c, --config <path>', 'Path to the config file')
.option(
'-c, --config <path>',
'Path to the config file',
fromRoot('config/kibana.yml'))
.option('-p, --port <port>', 'The port to bind to', parseInt)
.option('-q, --quiet', 'Prevent all logging except errors')
.option('-Q, --silent', 'Prevent all logging')
@ -76,7 +79,7 @@ module.exports = function (program) {
let readYamlConfig = require('./readYamlConfig');
let KbnServer = src('server/KbnServer');
let settings = readYamlConfig(opts.config || fromRoot('config/kibana.yml'));
let settings = readYamlConfig(opts.config);
if (opts.dev) {
try { _.merge(settings, readYamlConfig(fromRoot('config/kibana.dev.yml'))); }

View file

@ -19,7 +19,9 @@ module.exports = async (kbnServer, server, config) => {
await bundles.writeEntryFiles();
// in prod, only bundle what looks invalid or missing
if (config.get('env.prod')) bundles = await kbnServer.bundles.getInvalidBundles();
if (config.get('optimize.useBundleCache')) {
bundles = await bundles.getInvalidBundles();
}
// we might not have any work to do
if (!bundles.getIds().length) {

View file

@ -29,7 +29,7 @@ module.exports = async (kbnServer, server, config) => {
break;
default:
throw new Error(`unkown kbnWorkerType "${process.env.kbnWorkerType}"`);
throw new Error(`unknown kbnWorkerType "${process.env.kbnWorkerType}"`);
}
};

View file

@ -1,16 +1,14 @@
<div ng-if="switcher.loading">
<div class="spinner large"></div>
</div>
<div ng-if="!switcher.loading" class="app-links">
<a
ng-repeat="app in switcher.apps"
ng-href="/app/{{app.id}}"
class="app-link">
<span ng-style="{ 'background-image': 'url(' + app.icon + ')' }" class="app-icon"></span>
<span class="app-info">
<h2 class="app-title">{{ app.title }}</h2>
<h3 class="app-description">{{ app.description }}</h3>
</span>
</a>
</li>
<div class="app-link" ng-repeat="app in switcher.apps | orderBy:'title'">
<a ng-href="/app/{{app.id}}">
<div ng-if="app.icon" ng-style="{ 'background-image': 'url(../' + app.icon + ')' }" class="app-icon"></div>
<div ng-if="!app.icon" class="app-icon app-icon-missing">{{app.title[0]}}</div>
<div class="app-title">{{ app.title }}</div>
</a>
</div>
</div>

View file

@ -1,31 +0,0 @@
require('plugins/appSwitcher/appSwitcher.less');
var kibanaLogoUrl = require('ui/images/kibana.png');
require('ui/chrome')
.setBrand({
'logo': 'url(' + kibanaLogoUrl + ') left no-repeat',
'smallLogo': 'url(' + kibanaLogoUrl + ') left no-repeat'
})
.setShowAppsLink(false)
.setTabs([
{
id: '',
title: 'Apps',
activeIndicatorColor: '#ecf0f1'
}
])
.setRootTemplate(require('plugins/appSwitcher/appSwitcher.html'))
.setRootController('switcher', function SwitcherController($http) {
var switcher = {
loading: true
};
$http.get('/api/apps')
.then(function (resp) {
switcher.loading = false;
switcher.apps = resp.data;
});
return switcher;
});

View file

@ -1,43 +1,48 @@
@import (reference) "~ui/styles/variables";
.application {
background-color: @gray-lighter;
}
@app-icon-size: 48px;
.app-links {
width: 700px;
margin: 25px auto;
text-align: justify;
.app-link {
display: inline-block;
vertical-align: top;
width: @app-icon-size;
margin: 0px 10px;
text-align: left;
background: white;
width: 200px;
margin: 0 30px 30px 0;
.app-icon {
display: block;
height: 200px;
background-size: cover;
height: @app-icon-size;
width: @app-icon-size;
background-position: center;
}
background-size: contain;
border-radius: @border-radius-base;
background-color: @gray-light;
width: 100%;
.app-info {
display: block;
padding: 15px;
&-missing {
text-align: center;
font-size: 2.7em;
font-weight: bold;
font-family: @font-family-sans-serif;
color: #fff;
}
}
.app-title {
margin: 0 0 10px;
color: @text-color;
font-size: 0.9em;
width: 100%;
text-align: center;
margin-top: 3px;
}
.app-description {
font-size: 1em;
color: @gray;
margin: 0;
&:hover .app-title {
text-decoration: underline;
}
}
}

View file

@ -1,42 +0,0 @@
var portscanner = require('portscanner');
var path = require('path');
var Promise = require('bluebird');
var libesvm = require('libesvm');
var fromRoot = require('requirefrom')('src/utils')('fromRoot');
function startEs() {
var options = {
branch: 'master',
directory: fromRoot('esvm/test-es'),
purge: true,
config: {
'cluster.name': 'test',
'network.host': '127.0.0.1'
}
};
var cluster = libesvm.createCluster(options);
return cluster.install().then(function () {
return cluster.start();
}).then(function () {
after(function () {
this.timeout(120000);
return cluster.shutdown();
});
return cluster;
});
}
function maybeStartES() {
return new Promise(function (resolve, reject) {
portscanner.checkPortStatus(9200, '127.0.0.1', function (err, status) {
if (err) return reject(err);
if (status === 'closed') return startEs().then(resolve, reject);
resolve();
});
});
}
module.exports = function () {
this.timeout(120000);
return maybeStartES();
};

View file

@ -8,7 +8,6 @@ var fromRoot = src('utils/fromRoot');
describe('plugins/elasticsearch', function () {
describe('routes', function () {
before(require('./_ensure_elasticsearch'));
var kbnServer;

View file

@ -21,8 +21,8 @@
ng-model="vis.params.yAxis.max"
ng-required="vis.params.setYExtents">
</label>
<div ng-show="vis.params.yAxis.min > vis.params.yAxis.max">
<span class="text-danger">Min must not exceed max</span>
<div ng-show="vis.params.yAxis.min >= vis.params.yAxis.max">
<span class="text-danger">Max must be greater than min</span>
</div>
<label>
y-min

View file

@ -13,7 +13,7 @@ module.exports = function (kibana) {
app: {
title: 'Kibana',
description: 'the kibana you know and love',
icon: 'plugins/kibana/settings/sections/about/barcode.svg',
//icon: 'plugins/kibana/settings/sections/about/barcode.svg',
main: 'plugins/kibana/kibana',
uses: [
'visTypes',

View file

@ -73,6 +73,16 @@
<i aria-hidden="true" class="fa fa-plus-circle"></i>
</button>
</kbn-tooltip>
<kbn-tooltip text="Options" placement="bottom" append-to-body="1">
<button
aria-label="Options"
aria-haspopup="true"
aria-expanded="{{ configTemplate.is('options') }}"
ng-class="{active: configTemplate.is('options')}"
ng-click="configTemplate.toggle('options');">
<i aria-hidden="true" class="fa fa-gear"></i>
</button>
</kbn-tooltip>
</div>
</navbar>

View file

@ -3,6 +3,7 @@ define(function (require) {
var $ = require('jquery');
var angular = require('angular');
var ConfigTemplate = require('ui/ConfigTemplate');
var chrome = require('ui/chrome');
require('ui/directives/config');
require('ui/courier');
@ -32,7 +33,7 @@ define(function (require) {
.when('/dashboard', {
template: require('plugins/kibana/dashboard/index.html'),
resolve: {
dash: function (savedDashboards) {
dash: function (savedDashboards, config) {
return savedDashboards.get();
}
}
@ -51,7 +52,7 @@ define(function (require) {
app.directive('dashboardApp', function (Notifier, courier, AppState, timefilter, kbnUrl) {
return {
controller: function ($scope, $route, $routeParams, $location, Private, getAppState) {
controller: function ($scope, $rootScope, $route, $routeParams, $location, Private, getAppState) {
var queryFilter = Private(require('ui/filter_bar/query_filter'));
@ -90,7 +91,8 @@ define(function (require) {
save: require('plugins/kibana/dashboard/partials/save_dashboard.html'),
load: require('plugins/kibana/dashboard/partials/load_dashboard.html'),
share: require('plugins/kibana/dashboard/partials/share.html'),
pickVis: require('plugins/kibana/dashboard/partials/pick_visualization.html')
pickVis: require('plugins/kibana/dashboard/partials/pick_visualization.html'),
options: require('plugins/kibana/dashboard/partials/options.html')
});
$scope.refresh = _.bindKey(courier, 'fetch');
@ -101,6 +103,11 @@ define(function (require) {
courier.setRootSearchSource(dash.searchSource);
setDarkTheme(dash.darkTheme);
$scope.$watch('dash.darkTheme', function (value) {
setDarkTheme(value);
});
function init() {
updateQueryOnRootSource();
@ -123,6 +130,12 @@ define(function (require) {
}
}
function setDarkTheme(enabled) {
var theme = !!enabled ? 'theme-dark' : 'theme-light';
chrome.removeApplicationClass(['theme-dark', 'theme-light']);
chrome.addApplicationClass(theme);
}
// update root source when filters update
$scope.$listen(queryFilter, 'update', function () {
updateQueryOnRootSource();

View file

@ -0,0 +1,10 @@
<form role="form" class="options">
<p>
<div class="input-group">
<label>
<input type="checkbox" ng-model="opts.dashboard.darkTheme" ng-checked="opts.dashboard.darkTheme">
Use dark theme
</label>
</div>
</p>
</form>

View file

@ -4,11 +4,11 @@
<li ng-class="{active: mode == 'search'}"><a ng-click="mode='search'" title="Searches">Searches</a></li>
</ul>
<li class="list-group-item" ng-switch-when="visualization">
<div class="list-group-item" ng-switch-when="visualization">
<saved-object-finder title="Choose a visualization" type="visualizations" on-choose="opts.addVis"></saved-object-finder>
</li>
</div>
<li class="list-group-item" ng-switch-when="search">
<div class="list-group-item" ng-switch-when="search">
<saved-object-finder title="Choose a search" type="searches" on-choose="opts.addSearch"></saved-object-finder>
</li>
</div>
</div>
</div>

View file

@ -4,8 +4,7 @@ define(function (require) {
var moment = require('moment');
// Used only by the savedDashboards service, usually no reason to change this
module.factory('SavedDashboard', function (courier) {
module.factory('SavedDashboard', function (courier, config) {
// SavedDashboard constructor. Usually you'd interact with an instance of this.
// ID is option, without it one will be generated on save.
_.class(SavedDashboard).inherits(courier.SavedObject);
@ -28,7 +27,8 @@ define(function (require) {
version: 1,
timeRestore: false,
timeTo: undefined,
timeFrom: undefined
timeFrom: undefined,
darkTheme: config.get('dashboard:defaultDarkTheme')
},
// if an indexPattern was saved with the searchsource of a SavedDashboard
@ -49,7 +49,8 @@ define(function (require) {
version: 'integer',
timeRestore: 'boolean',
timeTo: 'string',
timeFrom: 'string'
timeFrom: 'string',
darkTheme: 'boolean'
};
SavedDashboard.searchsource = true;

View file

@ -43,7 +43,7 @@ define(function (require) {
};
this.find = function (searchString) {
this.find = function (searchString, size = 100) {
var self = this;
var body;
if (searchString) {
@ -64,7 +64,7 @@ define(function (require) {
index: kbnIndex,
type: 'dashboard',
body: body,
size: 100
size: size
})
.then(function (resp) {
return {

View file

@ -1,9 +1,8 @@
@import (reference) "~ui/styles/variables";
@import (reference) "~ui/styles/mixins";
@dashboard-background: @gray-lighter;
.tab-dashboard {
background-color: @dashboard-background;
background-color: @dashboard-bg;
}
dashboard-grid {
@ -14,14 +13,14 @@ dashboard-grid {
.start-screen {
margin: 20px;
background-color: @gray-lighter;
background-color: @dashboard-bg;
padding: 20px;
}
.gridster {
list-style-type: none;
display: block;
background-color: @dashboard-background;
background-color: @dashboard-bg;
margin: 0;
padding: 0;
@ -41,8 +40,8 @@ dashboard-grid {
dashboard-panel {
display: block;
height: 100%;
background: @panel-bg;
color: @text-color;
background: @dashboard-panel-bg;
color: @dashboard-panel-color;
padding: 0;
overflow: hidden;
position: relative;
@ -61,6 +60,8 @@ dashboard-grid {
flex: 0 0 auto;
white-space: nowrap;
display: flex;
border-top-right-radius: 0;
border-top-left-radius: 0;
div.btn-group {
white-space: nowrap;
@ -85,12 +86,12 @@ dashboard-grid {
}
a {
color: @text-color;
color: @dashboard-panel-heading-link-color;
border: none;
background: none;
padding: 0px 3px;
&:hover {
color: @link-hover-color;
color: @dashboard-panel-heading-link-hover-color;
}
}
}
@ -105,7 +106,7 @@ dashboard-grid {
.fa-exclamation-triangle {
font-size: 2em;
color: @btn-danger-bg;
color: @dashboard-panel-load-error-color;
}
}

View file

@ -46,7 +46,7 @@ define(function (require) {
});
};
this.find = function (searchString) {
this.find = function (searchString, size = 100) {
var self = this;
var body;
if (searchString) {
@ -67,7 +67,7 @@ define(function (require) {
index: kbnIndex,
type: 'search',
body: body,
size: 100
size: size
})
.then(function (resp) {
return {

View file

@ -61,16 +61,16 @@
opacity: 0.75;
text-align: center;
background-color: #ffffff;
background-color: transparent;
// spinner and prorgess counter
// spinner and progress counter
> div {
text-align: center;
}
}
&-info {
background-color: @well-bg;
background-color: @discover-info-bg;
float: right;
padding: 5px 10px;
border-bottom-left-radius: @border-radius-base;
@ -94,7 +94,7 @@
}
&-footer {
background-color: @well-bg;
background-color: @discover-table-footer-bg;
padding: 5px 10px;
}
@ -116,7 +116,7 @@
&-field {
&-filter {
background-color: @well-bg;
background-color: @discover-field-filter-bg;
margin-right: 10px;
.form-group {
@ -126,16 +126,17 @@
}
&-toggle {
color: @btn-success-color;
color: @discover-field-toggle-color;
font-size: 9px;
}
}
}
.shard-failures {
color: @brand-danger;
background-color: lighten(@brand-danger, 40%) !important;
border: 1px solid @brand-danger;
color: @discover-shard-failures-color;
background-color: @discover-shard-failures-bg !important;
border: 1px solid;
border-color: @discover-shard-failures-border;
border-radius: @border-radius-base;
padding: 0 20px 20px;
li {
@ -157,19 +158,21 @@
}
.discover-field-details {
border-top: 1px solid @well-border;
border-top: 1px solid;
border-top-color: @discover-field-details-border;
padding: 5px 10px;
background-color: @body-bg;
color: @text-color;
background-color: @discover-field-details-bg;
color: @discover-field-details-color;
&-close {
text-align: center;
border-top: 1px solid @well-border;
background-color: @well-bg;
border-top: 1px solid;
border-color: @discover-field-details-close-border;
background-color: @discover-field-details-close-bg;
&:hover {
background-color: @sidebar-hover-bg;
color: @sidebar-hover-color;
background-color: @discover-field-details-close-hover-bg;
color: @discover-field-details-close-hover-color;
}
}
@ -190,11 +193,11 @@
}
a {
color: @link-color !important;
color: @discover-link-color !important;
}
a.btn {
color: @text-color !important;
color: @discover-link-btn-color !important;
}
.progress {
@ -208,7 +211,7 @@
border-radius: 4px;
span {
background-color: @gray;
background-color: @discover-field-details-progress-bar-bg;
padding: 3px;
border-radius: 4px;
margin-left: 3px;
@ -225,11 +228,11 @@ field-name,
text-align: center;
display: inline-block;
width: 12px;
color: @text-muted;
color: @field-name-color;
}
&.no-results {
color: @text-muted;
color: @field-name-no-results-color;
}
}

View file

@ -47,10 +47,9 @@ chrome
title: 'Settings'
}
])
.setRootController('kibana', function ($scope, courier) {
.setRootController('kibana', function ($scope, $rootScope, courier, config) {
// wait for the application to finish loading
$scope.$on('application.load', function () {
courier.start();
});
});

View file

@ -13,7 +13,7 @@
height="64"
id="svg5235"
version="1.1"
inkscape:version="0.91+devel+osxmenu r12835"
inkscape:version="0.91 r13725"
viewBox="0 0 64 64"
sodipodi:docname="barcode.svg">
<defs
@ -45,7 +45,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
@ -54,404 +54,401 @@
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<g
id="g6209"
transform="matrix(0.57440105,0,0,0.57440105,-36.987859,-56.970747)">
<rect
y="104.33428"
x="97.825981"
height="100.54836"
width="2.4159346"
id="rect5251-3"
style="opacity:1;fill:#39bdb1;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
y="104.33428"
x="85.735123"
height="100.54836"
width="7.5297971"
id="rect5251-9"
style="opacity:1;fill:#ea458b;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
y="104.33428"
x="75.889793"
height="100.54836"
width="5.0022545"
id="rect5251-8"
style="opacity:1;fill:#f3bb19;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
y="104.33428"
x="72.783882"
height="100.54836"
width="3.2287681"
id="rect5251-2"
style="opacity:1;fill:#2d448e;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
y="104.33428"
x="69.63768"
height="100.54836"
width="3.159905"
id="rect5251"
style="opacity:1;fill:#83cb1c;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
y="104.33428"
x="119.37186"
height="100.54836"
width="6.9419966"
id="rect5251-9-9"
style="opacity:1;fill:#ea458b;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
y="104.33428"
x="131.24544"
height="100.54836"
width="4.9434743"
id="rect5251-5-9"
style="opacity:1;fill:#006555;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
y="104.33428"
x="83.986267"
height="100.54836"
width="1.8869137"
id="rect5251-5-0"
style="opacity:1;fill:#006555;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
y="104.33428"
x="93.214729"
height="100.54836"
width="4.7083545"
id="rect5251-7"
style="opacity:1;fill:#83cb1c;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
y="104.33428"
x="136.24173"
height="100.54836"
width="5.8251753"
id="rect5251-36"
style="opacity:1;fill:#83cb1c;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
y="104.33428"
x="80.870918"
height="100.54836"
width="3.1212945"
id="rect5251-3-7"
style="opacity:1;fill:#39bdb1;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
y="104.33428"
x="100.15076"
height="100.54836"
width="3.5915353"
id="rect5251-9-9-3"
style="opacity:1;fill:#ea458b;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
y="104.33428"
x="166.68982"
height="100.54836"
width="3.9442151"
id="rect5251-9-9-8"
style="opacity:1;fill:#ea458b;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
y="104.33428"
x="110.55486"
height="100.54836"
width="3.3564136"
id="rect5251-3-3"
style="opacity:1;fill:#39bdb1;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
y="104.33429"
x="148.82066"
height="100.54836"
width="4.1793332"
id="rect5251-3-0"
style="opacity:1;fill:#39bdb1;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
y="104.33427"
x="129.07057"
height="100.54838"
width="2.1808138"
id="rect5251-8-3"
style="opacity:1;fill:#f3bb19;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
y="104.33428"
x="142.00218"
height="100.54836"
width="3.0037344"
id="rect5251-8-33"
style="opacity:1;fill:#f3bb19;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
y="104.33428"
x="106.20512"
height="100.54836"
width="4.3556747"
id="rect5251-7-3"
style="opacity:1;fill:#83cb1c;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
y="104.33428"
x="103.73636"
height="100.54836"
width="2.4159336"
id="rect5251-2-0"
style="opacity:1;fill:#2d448e;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
y="104.33428"
x="116.25652"
height="100.54836"
width="3.8266549"
id="rect5251-36-7"
style="opacity:1;fill:#83cb1c;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
y="104.33427"
x="113.9641"
height="100.54838"
width="2.2983737"
id="rect5251-5-3"
style="opacity:1;fill:#006555;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
y="104.33428"
x="126.30791"
height="100.54836"
width="2.8273947"
id="rect5251-3-7-7"
style="opacity:1;fill:#39bdb1;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
y="104.33428"
x="144.8824"
height="100.54836"
width="2.0632553"
id="rect5251-3-7-70"
style="opacity:1;fill:#39bdb1;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
y="104.33428"
x="146.99847"
height="100.54836"
width="1.8869162"
id="rect5251-9-9-8-4"
style="opacity:1;fill:#ea458b;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
y="104.33428"
x="158.32114"
height="100.54836"
width="4.708354"
id="rect5251-3-7-70-2"
style="opacity:1;fill:#39bdb1;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
y="104.33427"
x="152.97215"
height="100.54838"
width="5.413713"
id="rect5251-8-339-2"
style="opacity:1;fill:#f3bb19;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
y="104.33428"
x="162.99417"
height="100.54836"
width="3.8266544"
id="rect5251-36-5"
style="opacity:1;fill:#83cb1c;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
id="g4300"
transform="matrix(1.1002186,0,0,1.1002186,-3.2119331,-3.0092752)">
<g
transform="matrix(0.57440105,0,0,0.57440105,-36.987859,-56.970747)"
id="g6209">
<rect
style="opacity:1;fill:#39bdb1;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5251-3"
width="2.4159346"
height="100.54836"
x="97.825981"
y="104.33428" />
<rect
style="opacity:1;fill:#ea458b;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5251-9"
width="7.5297971"
height="100.54836"
x="85.735123"
y="104.33428" />
<rect
style="opacity:1;fill:#f3bb19;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5251-8"
width="5.0022545"
height="100.54836"
x="75.889793"
y="104.33428" />
<rect
style="opacity:1;fill:#2d448e;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5251-2"
width="3.2287681"
height="100.54836"
x="72.783882"
y="104.33428" />
<rect
style="opacity:1;fill:#83cb1c;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5251"
width="3.159905"
height="100.54836"
x="69.63768"
y="104.33428" />
<rect
style="opacity:1;fill:#ea458b;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5251-9-9"
width="6.9419966"
height="100.54836"
x="119.37186"
y="104.33428" />
<rect
style="opacity:1;fill:#006555;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5251-5-9"
width="4.9434743"
height="100.54836"
x="131.24544"
y="104.33428" />
<rect
style="opacity:1;fill:#006555;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5251-5-0"
width="1.8869137"
height="100.54836"
x="83.986267"
y="104.33428" />
<rect
style="opacity:1;fill:#83cb1c;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5251-7"
width="4.7083545"
height="100.54836"
x="93.214729"
y="104.33428" />
<rect
style="opacity:1;fill:#83cb1c;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5251-36"
width="5.8251753"
height="100.54836"
x="136.24173"
y="104.33428" />
<rect
style="opacity:1;fill:#39bdb1;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5251-3-7"
width="3.1212945"
height="100.54836"
x="80.870918"
y="104.33428" />
<rect
style="opacity:1;fill:#ea458b;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5251-9-9-3"
width="3.5915353"
height="100.54836"
x="100.15076"
y="104.33428" />
<rect
style="opacity:1;fill:#ea458b;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5251-9-9-8"
width="3.9442151"
height="100.54836"
x="166.68982"
y="104.33428" />
<rect
style="opacity:1;fill:#39bdb1;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5251-3-3"
width="3.3564136"
height="100.54836"
x="110.55486"
y="104.33428" />
<rect
style="opacity:1;fill:#39bdb1;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5251-3-0"
width="4.1793332"
height="100.54836"
x="148.82066"
y="104.33429" />
<rect
style="opacity:1;fill:#f3bb19;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5251-8-3"
width="2.1808138"
height="100.54838"
x="129.07057"
y="104.33427" />
<rect
style="opacity:1;fill:#f3bb19;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5251-8-33"
width="3.0037344"
height="100.54836"
x="142.00218"
y="104.33428" />
<rect
style="opacity:1;fill:#83cb1c;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5251-7-3"
width="4.3556747"
height="100.54836"
x="106.20512"
y="104.33428" />
<rect
style="opacity:1;fill:#2d448e;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5251-2-0"
width="2.4159336"
height="100.54836"
x="103.73636"
y="104.33428" />
<rect
style="opacity:1;fill:#83cb1c;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5251-36-7"
width="3.8266549"
height="100.54836"
x="116.25652"
y="104.33428" />
<rect
style="opacity:1;fill:#006555;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5251-5-3"
width="2.2983737"
height="100.54838"
x="113.9641"
y="104.33427" />
<rect
style="opacity:1;fill:#39bdb1;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5251-3-7-7"
width="2.8273947"
height="100.54836"
x="126.30791"
y="104.33428" />
<rect
style="opacity:1;fill:#39bdb1;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5251-3-7-70"
width="2.0632553"
height="100.54836"
x="144.8824"
y="104.33428" />
<rect
style="opacity:1;fill:#ea458b;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5251-9-9-8-4"
width="1.8869162"
height="100.54836"
x="146.99847"
y="104.33428" />
<rect
style="opacity:1;fill:#39bdb1;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5251-3-7-70-2"
width="4.708354"
height="100.54836"
x="158.32114"
y="104.33428" />
<rect
style="opacity:1;fill:#f3bb19;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5251-8-339-2"
width="5.413713"
height="100.54838"
x="152.97215"
y="104.33427" />
<rect
style="opacity:1;fill:#83cb1c;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5251-36-5"
width="3.8266544"
height="100.54836"
x="162.99417"
y="104.33428" />
</g>
<g
transform="matrix(0.57440105,0,0,1.9251702,3.0622581,2.9589583)"
id="g4544">
<line
style="fill:none;stroke:#000000;stroke-width:2"
x1="1"
y1="0"
x2="1"
y2="30"
id="line4450" />
<line
style="fill:none;stroke:#000000;stroke-width:1"
x1="3.5"
y1="0"
x2="3.5"
y2="30"
id="line4452" />
<line
style="fill:none;stroke:#000000;stroke-width:1"
x1="6.5"
y1="0"
x2="6.5"
y2="30"
id="line4454" />
<line
style="fill:none;stroke:#000000;stroke-width:1"
x1="11.5"
y1="0"
x2="11.5"
y2="30"
id="line4456" />
<line
style="fill:none;stroke:#000000;stroke-width:1"
x1="14.5"
y1="0"
x2="14.5"
y2="30"
id="line4458" />
<line
style="fill:none;stroke:#000000;stroke-width:2"
x1="17"
y1="0"
x2="17"
y2="30"
id="line4460" />
<line
style="fill:none;stroke:#000000;stroke-width:2"
x1="23"
y1="0"
x2="23"
y2="30"
id="line4462" />
<line
style="fill:none;stroke:#000000;stroke-width:1"
x1="28.5"
y1="0"
x2="28.5"
y2="30"
id="line4464" />
<line
style="fill:none;stroke:#000000;stroke-width:1"
x1="30.5"
y1="0"
x2="30.5"
y2="30"
id="line4466" />
<line
style="fill:none;stroke:#000000;stroke-width:2"
x1="34"
y1="0"
x2="34"
y2="30"
id="line4468" />
<line
style="fill:none;stroke:#000000;stroke-width:2"
x1="37"
y1="0"
x2="37"
y2="30"
id="line4470" />
<line
style="fill:none;stroke:#000000;stroke-width:2"
x1="41"
y1="0"
x2="41"
y2="30"
id="line4472" />
<line
style="fill:none;stroke:#000000;stroke-width:1"
x1="44.5"
y1="0"
x2="44.5"
y2="30"
id="line4474" />
<line
style="fill:none;stroke:#000000;stroke-width:2"
x1="47"
y1="0"
x2="47"
y2="30"
id="line4476" />
<line
style="fill:none;stroke:#000000;stroke-width:1"
x1="50.5"
y1="0"
x2="50.5"
y2="30"
id="line4478" />
<line
style="fill:none;stroke:#000000;stroke-width:2"
x1="56"
y1="0"
x2="56"
y2="30"
id="line4480" />
<line
style="fill:none;stroke:#000000;stroke-width:1"
x1="59.5"
y1="0"
x2="59.5"
y2="30"
id="line4482" />
<line
style="fill:none;stroke:#000000;stroke-width:1"
x1="61.5"
y1="0"
x2="61.5"
y2="30"
id="line4484" />
<line
style="fill:none;stroke:#000000;stroke-width:2"
x1="67"
y1="0"
x2="67"
y2="30"
id="line4486" />
<line
style="fill:none;stroke:#000000;stroke-width:1"
x1="72.5"
y1="0"
x2="72.5"
y2="30"
id="line4488" />
<line
style="fill:none;stroke:#000000;stroke-width:1"
x1="75.5"
y1="0"
x2="75.5"
y2="30"
id="line4490" />
<line
style="fill:none;stroke:#000000;stroke-width:1"
x1="77.5"
y1="0"
x2="77.5"
y2="30"
id="line4492" />
<line
style="fill:none;stroke:#000000;stroke-width:1"
x1="79.5"
y1="0"
x2="79.5"
y2="30"
id="line4494" />
<line
style="fill:none;stroke:#000000;stroke-width:4"
x1="83"
y1="0"
x2="83"
y2="30"
id="line4496" />
<line
style="fill:none;stroke:#000000;stroke-width:2"
x1="89"
y1="0"
x2="89"
y2="30"
id="line4498" />
<line
style="fill:none;stroke:#000000;stroke-width:3"
x1="94.5"
y1="0"
x2="94.5"
y2="30"
id="line4500" />
<line
style="fill:none;stroke:#000000;stroke-width:1"
x1="97.5"
y1="0"
x2="97.5"
y2="30"
id="line4502" />
<line
style="fill:none;stroke:#000000;stroke-width:2"
x1="100"
y1="0"
x2="100"
y2="30"
id="line4504" />
</g>
</g>
<g
id="g4544"
transform="matrix(0.57440105,0,0,1.9251702,3.0622581,2.9589583)">
<line
id="line4450"
y2="30"
x2="1"
y1="0"
x1="1"
style="fill:none;stroke:#000000;stroke-width:2" />
<line
id="line4452"
y2="30"
x2="3.5"
y1="0"
x1="3.5"
style="fill:none;stroke:#000000;stroke-width:1" />
<line
id="line4454"
y2="30"
x2="6.5"
y1="0"
x1="6.5"
style="fill:none;stroke:#000000;stroke-width:1" />
<line
id="line4456"
y2="30"
x2="11.5"
y1="0"
x1="11.5"
style="fill:none;stroke:#000000;stroke-width:1" />
<line
id="line4458"
y2="30"
x2="14.5"
y1="0"
x1="14.5"
style="fill:none;stroke:#000000;stroke-width:1" />
<line
id="line4460"
y2="30"
x2="17"
y1="0"
x1="17"
style="fill:none;stroke:#000000;stroke-width:2" />
<line
id="line4462"
y2="30"
x2="23"
y1="0"
x1="23"
style="fill:none;stroke:#000000;stroke-width:2" />
<line
id="line4464"
y2="30"
x2="28.5"
y1="0"
x1="28.5"
style="fill:none;stroke:#000000;stroke-width:1" />
<line
id="line4466"
y2="30"
x2="30.5"
y1="0"
x1="30.5"
style="fill:none;stroke:#000000;stroke-width:1" />
<line
id="line4468"
y2="30"
x2="34"
y1="0"
x1="34"
style="fill:none;stroke:#000000;stroke-width:2" />
<line
id="line4470"
y2="30"
x2="37"
y1="0"
x1="37"
style="fill:none;stroke:#000000;stroke-width:2" />
<line
id="line4472"
y2="30"
x2="41"
y1="0"
x1="41"
style="fill:none;stroke:#000000;stroke-width:2" />
<line
id="line4474"
y2="30"
x2="44.5"
y1="0"
x1="44.5"
style="fill:none;stroke:#000000;stroke-width:1" />
<line
id="line4476"
y2="30"
x2="47"
y1="0"
x1="47"
style="fill:none;stroke:#000000;stroke-width:2" />
<line
id="line4478"
y2="30"
x2="50.5"
y1="0"
x1="50.5"
style="fill:none;stroke:#000000;stroke-width:1" />
<line
id="line4480"
y2="30"
x2="56"
y1="0"
x1="56"
style="fill:none;stroke:#000000;stroke-width:2" />
<line
id="line4482"
y2="30"
x2="59.5"
y1="0"
x1="59.5"
style="fill:none;stroke:#000000;stroke-width:1" />
<line
id="line4484"
y2="30"
x2="61.5"
y1="0"
x1="61.5"
style="fill:none;stroke:#000000;stroke-width:1" />
<line
id="line4486"
y2="30"
x2="67"
y1="0"
x1="67"
style="fill:none;stroke:#000000;stroke-width:2" />
<line
id="line4488"
y2="30"
x2="72.5"
y1="0"
x1="72.5"
style="fill:none;stroke:#000000;stroke-width:1" />
<line
id="line4490"
y2="30"
x2="75.5"
y1="0"
x1="75.5"
style="fill:none;stroke:#000000;stroke-width:1" />
<line
id="line4492"
y2="30"
x2="77.5"
y1="0"
x1="77.5"
style="fill:none;stroke:#000000;stroke-width:1" />
<line
id="line4494"
y2="30"
x2="79.5"
y1="0"
x1="79.5"
style="fill:none;stroke:#000000;stroke-width:1" />
<line
id="line4496"
y2="30"
x2="83"
y1="0"
x1="83"
style="fill:none;stroke:#000000;stroke-width:4" />
<line
id="line4498"
y2="30"
x2="89"
y1="0"
x1="89"
style="fill:none;stroke:#000000;stroke-width:2" />
<line
id="line4500"
y2="30"
x2="94.5"
y1="0"
x1="94.5"
style="fill:none;stroke:#000000;stroke-width:3" />
<line
id="line4502"
y2="30"
x2="97.5"
y1="0"
x1="97.5"
style="fill:none;stroke:#000000;stroke-width:1" />
<line
id="line4504"
y2="30"
x2="100"
y1="0"
x1="100"
style="fill:none;stroke:#000000;stroke-width:2" />
</g>
<rect
style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:3.01796293;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect6306"
width="61.028111"
height="60.597305"
x="1.5768572"
y="1.5882187" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Before After
Before After

View file

@ -1,9 +1,12 @@
<tr ng-class="conf.value === undefined ? 'default' : 'custom'">
<td class="name">
<b>{{conf.name}}</b>
<span class="smaller" ng-show="conf.value !== undefined">
<span class="smaller" ng-show="!conf.isCustom && conf.value !== undefined">
(Default: <i>{{conf.defVal == undefined ? 'null' : conf.defVal}}</i>)
</span>
<span class="smaller" ng-show="conf.isCustom">
(Custom setting)
</span>
<br>
<span class="smaller" ng-bind-html="conf.description | trustAsHtml"></span>
</td>

View file

@ -2,9 +2,12 @@
<kbn-settings-advanced class="container">
<div class="bs-callout bs-callout-warning">
<h4>Caution: You can break stuff here</h4>
Be careful in here, these settings are for very advanced users only. Tweaks you make here can break large portions of Kibana.
Some of these settings may be undocumented, unsupported or experimental. Blanking a field will cause Kibana to use its internal
defaults which may be unacceptable given other configuration directives.
Be careful in here, these settings are for very advanced users only.
Tweaks you make here can break large portionsof Kibana. Some of these
settings may be undocumented, unsupported or experimental. If a field has
a default value, blanking the field will reset it to its default which
may be unacceptable given other configuration directives. Deleting a
custom setting will permanently remove it from Kibana's config.
</div>
<form role="form">
<input aria-label="Filter" ng-model="advancedFilter" class="form-control span12" type="text" placeholder="Filter"/>

View file

@ -1,6 +1,6 @@
define(function (require) {
var _ = require('lodash');
var getValType = require('plugins/kibana/settings/sections/advanced/lib/get_val_type');
var toEditableConfig = require('plugins/kibana/settings/sections/advanced/lib/to_editable_config');
require('plugins/kibana/settings/sections/advanced/advanced_row');
@ -20,46 +20,34 @@ define(function (require) {
ESC: 27
};
var NAMED_EDITORS = ['json', 'array', 'boolean', 'select'];
var NORMAL_EDITOR = ['number', 'string', 'null', 'undefined'];
function getEditorType(conf) {
if (_.contains(NAMED_EDITORS, conf.type)) return conf.type;
if (_.contains(NORMAL_EDITOR, conf.type)) return 'normal';
}
function isTypeComplex(conf) {
return !(conf.json || conf.array || conf.bool || conf.normal);
}
function notDefaultConfig(configName) {
return !(configName in configDefaults);
}
function readConfigVals() {
var configVals = config._vals();
$scope.configs = _.map(configDefaults, function (def, name) {
var val = configVals[name];
var conf = {
name: name,
defVal: def.value,
type: getValType(def, val),
description: def.description,
options: def.options,
value: val,
};
var customConfig = Object.keys(configVals)
.filter(notDefaultConfig)
.map(name => toEditableConfig(false, name, configVals[name]));
var editor = getEditorType(conf);
conf.json = editor === 'json';
conf.select = editor === 'select';
conf.bool = editor === 'boolean';
conf.array = editor === 'array';
conf.normal = editor === 'normal';
conf.tooComplex = !editor;
return conf;
});
$scope.configs = _(configDefaults)
.map((def, name) => toEditableConfig(def, name, configVals[name]))
.reject('readonly')
.concat(customConfig)
.value();
}
// react to changes of the config values
var unhook = $rootScope.$on('change:config', readConfigVals);
$scope.$on('$destroy', unhook);
// initial config setup
readConfigVals();
$rootScope.$on('change:config', readConfigVals);
}
};
});

View file

@ -0,0 +1,27 @@
var getEditorType = require('plugins/kibana/settings/sections/advanced/lib/get_editor_type');
var expect = require('expect.js');
describe('Settings', function () {
describe('Advanced', function () {
describe('getEditorType(conf)', function () {
context('when given type has a named editor', function () {
it('returns that named editor', function () {
expect(getEditorType({ type: 'json' })).to.equal('json');
expect(getEditorType({ type: 'array' })).to.equal('array');
expect(getEditorType({ type: 'boolean' })).to.equal('boolean');
expect(getEditorType({ type: 'select' })).to.equal('select');
});
});
context('when given a type of number, string, null, or undefined', function () {
it('returns "normal"', function () {
expect(getEditorType({ type: 'number' })).to.equal('normal');
expect(getEditorType({ type: 'string' })).to.equal('normal');
expect(getEditorType({ type: 'null' })).to.equal('normal');
expect(getEditorType({ type: 'undefined' })).to.equal('normal');
});
});
});
});
});

View file

@ -0,0 +1,86 @@
var toEditableConfig = require('plugins/kibana/settings/sections/advanced/lib/to_editable_config');
var expect = require('expect.js');
describe('Settings', function () {
describe('Advanced', function () {
describe('toEditableConfig(def, name, value)', function () {
it('sets name', function () {
expect(invoke({ name: 'who' }).name).to.equal('who');
});
it('sets value', function () {
expect(invoke({ value: 'what' }).value).to.equal('what');
});
it('sets type', function () {
expect(invoke({ value: 'what' }).type).to.be('string');
expect(invoke({ value: 0 }).type).to.be('number');
expect(invoke({ value: [] }).type).to.be('array');
});
context('when given a setting definition object', function () {
var def;
beforeEach(function () {
def = {
value: 'the original',
description: 'the one and only',
options: 'all the options'
};
});
it('is not marked as custom', function () {
expect(invoke({ def }).isCustom).to.be.false;
});
it('sets a default value', function () {
expect(invoke({ def }).defVal).to.equal(def.value);
});
it('sets a description', function () {
expect(invoke({ def }).description).to.equal(def.description);
});
it('sets options', function () {
expect(invoke({ def }).options).to.equal(def.options);
});
context('that contains a type', function () {
it('sets that type', function () {
def.type = 'something';
expect(invoke({ def }).type).to.equal(def.type);
});
});
context('that contains a value of type array', function () {
it('sets type to array', function () {
def.value = [];
expect(invoke({ def }).type).to.equal('array');
});
});
});
context('when not given a setting definition object', function () {
it('is marked as custom', function () {
expect(invoke().isCustom).to.be.true;
});
it('sets defVal to undefined', function () {
expect(invoke().defVal).to.be.undefined;
});
it('sets description to undefined', function () {
expect(invoke().description).to.be.undefined;
});
it('sets options to undefined', function () {
expect(invoke().options).to.be.undefined;
});
});
});
});
});
function invoke({ def = false, name = 'woah', value = 'forreal' } = {}) {
return toEditableConfig(def, name, value);
}

View file

@ -0,0 +1,17 @@
define(function (require) {
var _ = require('lodash');
var NAMED_EDITORS = ['json', 'array', 'boolean', 'select'];
var NORMAL_EDITOR = ['number', 'string', 'null', 'undefined'];
/**
* @param {object} advanced setting configuration object
* @returns {string} the editor type to use when editing value
*/
function getEditorType(conf) {
if (_.contains(NAMED_EDITORS, conf.type)) return conf.type;
if (_.contains(NORMAL_EDITOR, conf.type)) return 'normal';
}
return getEditorType;
});

View file

@ -0,0 +1,39 @@
define(function (require) {
var _ = require('lodash');
var getValType = require('./get_val_type');
var getEditorType = require('./get_editor_type');
/**
* @param {object} advanced setting definition object
* @param {object} name of setting
* @param {object} current value of setting
* @returns {object} the editable config object
*/
function toEditableConfig(def, name, value) {
var isCustom = !def;
if (isCustom) def = {};
var conf = {
name,
value,
isCustom,
readonly: !!def.readonly,
defVal: def.value,
type: getValType(def, value),
description: def.description,
options: def.options
};
var editor = getEditorType(conf);
conf.json = editor === 'json';
conf.select = editor === 'select';
conf.bool = editor === 'boolean';
conf.array = editor === 'array';
conf.normal = editor === 'normal';
conf.tooComplex = !editor;
return conf;
}
return toEditableConfig;
});

View file

@ -2,7 +2,7 @@
<kbn-settings-objects class="container">
<div class="header">
<h2 class="title">Edit Saved Objects</h2>
<button class="btn btn-default controls" ng-click="exportAll()"><i aria-hidden="true" class="fa fa-download"></i> Export</button>
<button class="btn btn-default controls" ng-click="exportAll()"><i aria-hidden="true" class="fa fa-download"></i> Export Everything</button>
<button file-upload="importAll(fileContents)" class="btn btn-default controls" ng-click><i aria-hidden="true" class="fa fa-upload"></i> Import</button>
</div>
<p>

View file

@ -4,6 +4,7 @@ define(function (require) {
var saveAs = require('@spalger/filesaver').saveAs;
var registry = require('plugins/kibana/settings/saved_object_registry');
var objectIndexHTML = require('plugins/kibana/settings/sections/objects/_objects.html');
const MAX_SIZE = Math.pow(2, 31) - 1;
require('ui/directives/file_upload');
@ -91,11 +92,12 @@ define(function (require) {
retrieveAndExportDocs(objs);
};
$scope.exportAll = function () {
var objs = $scope.services.map(function (service) {
return service.data.map(_.partialRight(_.extend, {type: service.type}));
});
retrieveAndExportDocs(_.flattenDeep(objs));
$scope.exportAll = () => {
Promise.map($scope.services, (service) =>
service.service.find('', MAX_SIZE).then((results) =>
results.hits.map((hit) => _.extend(hit, {type: service.type}))
)
).then((results) => retrieveAndExportDocs(_.flattenDeep(results)));
};
function retrieveAndExportDocs(objs) {

View file

@ -24,20 +24,19 @@ kbn-settings-objects {
margin-bottom: @line-height-computed;
}
.list-unstyled {
// border-top: 1px solid @gray-lighter;
// margin-top: @line-height-computed;
li {
border-bottom: 1px solid @gray-lighter;
border-bottom: 1px solid;
border-bottom-color: @settings-objects-list-border;
padding: 8px;
}
}
.empty {
color: @gray-light;
color: @settings-objects-empty-color;
}
.action-bar {
margin-top: 10px;
background-color: @gray-lighter;
background-color: @settings-objects-action-bar-bg;
padding: 4px 12px;
label {
@ -98,7 +97,7 @@ kbn-settings-objects-view {
width: 100%;
tr.default td.value {
color: @input-color-placeholder;
color: @settings-advanced-table-default-color;
}
td {
@ -127,7 +126,7 @@ kbn-settings-objects-view {
.indices-settings {
i.active {
color: @btn-success-bg;
color: @settings-indices-active-color;
}
tr.field-settings {

View file

@ -126,7 +126,9 @@
<div class="vis-editor-content">
<vis-editor-sidebar class="vis-editor-sidebar" ng-if="chrome.getVisible()"></vis-editor-sidebar>
<div class="collapsible-sidebar">
<vis-editor-sidebar class="vis-editor-sidebar" ng-if="chrome.getVisible()"></vis-editor-sidebar>
</div>
<div class="vis-editor-canvas" ng-class="{ embedded: !chrome.getVisible() }">
<div class="visualize-info" ng-if="savedVis.id">

View file

@ -6,6 +6,7 @@ define(function (require) {
require('ui/visualize');
require('ui/clipboard');
require('ui/collapsible_sidebar');
require('ui/routes')
.when('/visualize/create', {

View file

@ -10,12 +10,12 @@
.navbar-default .navbar-nav {
&> .active > a:before {
border: 7px solid transparent;
border-bottom-color: @gray-lighter;
border-bottom-color: @vis-editor-navbar-current-tab-color;
}
.danger {
color: @btn-danger-color;
background-color: @btn-danger-bg;
color: @vis-editor-navbar-error-state-color;
background-color: @vis-editor-navbar-error-state-bg;
}
}
@ -35,8 +35,8 @@
right: 0px;
bottom: 0px;
z-index: 10;
background: fadeout(@navbar-default-bg, 10%);
color: white;
background: fadeout(@vis-editor-navbar-modal-bg, 10%);
color: @vis-editor-navbar-modal-color;
text-align: center;
padding-top: 6px;
@ -50,7 +50,7 @@
}
a {
color: white;
color: @vis-editor-navbar-modal-link-color;
}
}
}
@ -64,17 +64,18 @@
}
}
&-sidebar {
.collapsible-sidebar {
.flex-parent(0, 0, auto);
}
// overflow: auto;
&-sidebar {
.flex-parent(1, 0, auto);
// overrided for tablet and desktop
@media (min-width: @screen-md-min) {
flex-basis: @vis-editor-sidebar-basis;
min-width: @vis-editor-sidebar-min-width;
max-width: @vis-editor-sidebar-min-width;
// margin-bottom: (@input-height-base * 2) - 3;
}
nav {
@ -87,8 +88,8 @@
.sidebar-container {
.flex-parent(1, 1, auto);
background-color: @body-bg;
border-right-color: @sidebar-bg;
background-color: @vis-editor-sidebar-bg;
border-right-color: @vis-editor-sidebar-border;
form {
.flex-parent(1, 1, auto);
@ -117,14 +118,14 @@
font-size: 20px;
font-weight: bold;
border: inherit !important;
background-color: @gray-lighter;
background-color: @vis-editor-sidebar-title-bg;
margin-bottom: @vis-editor-agg-editor-spacing;
padding: 2px 5px !important;
}
.sidebar-item-title:hover {
color: @text-color !important;
background-color: @gray-lighter !important;
color: @vis-editor-sidebar-title-hover-color !important;
background-color: @vis-editor-sidebar-title-hover-bg !important;
}
.hintbox {
@ -158,7 +159,7 @@
> span {
width: @vis-editor-nesting-width;
background-color: @brand-success;
background-color: @vis-editor-nesting-indicator-bg;
}
}
@ -177,7 +178,7 @@
&-group {
.flex-parent(0, 1, auto);
color: @text-color;
color: @vis-editor-agg-group-color;
}
&-header {
@ -221,8 +222,8 @@
margin: @vis-editor-agg-editor-spacing 0;
padding: @vis-editor-agg-editor-spacing;
text-align: center;
background: @btn-danger-bg;
color: @btn-danger-color;
background: @vis-editor-agg-error-bg;
color: @vis-editor-agg-error-color;
}
&-editor {
@ -241,7 +242,7 @@
}
a {
color: @link-color;
color: @vis-editor-agg-editor-flags-color;
}
}
@ -275,23 +276,26 @@
&-wide-btn {
border-radius: 0;
border-top: 2px solid @gray-lighter;
border-top: 2px solid;
border-top-color: @vis-editor-agg-wide-btn-border;
&-add {
width: 140px;
margin: -2px auto 5px auto;
text-align: center;
border: 2px solid @gray-lighter;
border: 2px solid;
border-color: @vis-editor-agg-wide-btn-border;
border-top: 0px;
padding: 3px;
border-bottom-right-radius: @border-radius-base;
border-bottom-left-radius: @border-radius-base;
background-color: @body-bg;
background-color: @vis-editor-agg-wide-btn-bg;
font-weight: bold;
}
&-add:hover {
background-color: @gray-lighter;
color: @vis-editor-agg-wide-btn-hover-color;
background-color: @vis-editor-agg-wide-btn-hover-bg;
}
}
@ -310,8 +314,10 @@
}
&-order-agg {
border: 2px solid @gray-lighter;
border: 2px solid;
border-color: @vis-editor-agg-editor-order-border;
border-radius: @border-radius-base;
background-color: @vis-editor-agg-editor-order-bg;
margin: @vis-editor-agg-editor-spacing;
padding: @vis-editor-agg-editor-spacing;
}

View file

@ -41,7 +41,7 @@ define(function (require) {
});
};
this.find = function (searchString) {
this.find = function (searchString, size = 100) {
var self = this;
var body;
if (searchString) {
@ -62,7 +62,7 @@ define(function (require) {
index: kbnIndex,
type: 'visualization',
body: body,
size: 100,
size: size
})
.then(function (resp) {
return {

View file

@ -38,7 +38,7 @@
&-description {
flex: 1 1 auto;
color: @brand-primary;
color: @wizard-vis-type-description-color;
}
}
@ -46,7 +46,7 @@
align-self: flex-end;
&-tab {
background-color: @well-bg;
background-color: @visualize-info-bg;
padding: 5px 10px;
margin-left: @padding-base-horizontal;
border-bottom-left-radius: @border-radius-base;

View file

@ -21,6 +21,8 @@ ${pluginSlug}
*/
window.__KBN__ = {
version: '1.2.3',
buildNum: 1234,
vars: {
kbnIndex: '.kibana',
esShardTimeout: 1500,

View file

@ -87,6 +87,7 @@ module.exports = Joi.object({
lazyHost: Joi.string().hostname().default('localhost'),
lazyPrebuild: Joi.boolean().default(false),
lazyProxyTimeout: Joi.number().default(5 * 60000),
useBundleCache: Joi.boolean().default(Joi.ref('$prod')),
unsafeCache: Joi
.alternatives()
.try(

View file

@ -7,5 +7,5 @@ module.exports = _.once(function (kbnServer) {
// redirect to the single app
let apps = kbnServer.uiExports.apps.toArray();
return apps.length === 1 ? `/app/${apps[0].id}` : '/apps';
return '/app/kibana';
});

View file

@ -40,17 +40,6 @@ module.exports = async (kbnServer, server, config) => {
server.setupViews(resolve(__dirname, 'views'));
server.exposeStaticFile('/loading.gif', resolve(__dirname, 'public/loading.gif'));
// serve the app switcher
server.route({
path: '/apps',
method: 'GET',
handler: function (req, reply) {
let switcher = uiExports.getHiddenApp('appSwitcher');
if (!switcher) return reply(Boom.notFound('app switcher not installed'));
return reply.renderApp(switcher);
}
});
// serve the app switcher
server.route({
path: '/api/apps',
@ -66,7 +55,7 @@ module.exports = async (kbnServer, server, config) => {
handler: function (req, reply) {
let id = req.params.id;
let app = uiExports.apps.byId[id];
if (!app) return reply(Boom.notFound('Unkown app ' + id));
if (!app) return reply(Boom.notFound('Unknown app ' + id));
if (kbnServer.status.isGreen()) {
return reply.renderApp(app);

View file

@ -0,0 +1,17 @@
describe('ui/metadata', () => {
const expect = require('expect.js');
const metadata = require('ui/metadata');
it('is same data as window.__KBN__', () => {
expect(metadata.version).to.equal(window.__KBN__.version);
expect(metadata.vars.kbnIndex).to.equal(window.__KBN__.vars.kbnIndex);
});
it('is immutable', () => {
expect(() => metadata.foo = 'something').to.throw;
expect(() => metadata.version = 'something').to.throw;
expect(() => metadata.vars = {}).to.throw;
expect(() => metadata.vars.kbnIndex = 'something').to.throw;
});
});

View file

@ -15,15 +15,11 @@ kbn-agg-table-group {
overflow: auto;
tr:hover td {
background-color: lighten(@gray-lighter, 4%);
background-color: @table-row-hover-bg;
}
.cell-hover:hover {
background-color: @gray-lighter;
}
th i.fa-sort {
color: @gray-light;
background-color: @table-cell-hover-hover-bg;
}
}

View file

@ -60,4 +60,41 @@ module.exports = function (chrome, internals) {
return internals.brand[item];
};
/**
* Adds a class to the application node
* @param {string} - the class name to add
* @return {chrome}
*/
chrome.addApplicationClass = function (val) {
var classes = internals.applicationClasses || [];
classes.push(val);
classes = _.uniq(classes);
internals.applicationClasses = classes;
return chrome;
};
/**
* Removes a class from the application node. Note: this only
* removes classes that were added via the addApplicationClass method
* @param {string|[string]} - class or classes to be removed
* @return {chrome}
*/
chrome.removeApplicationClass = function (val) {
var classesToRemove = [].concat(val || []);
var classes = internals.applicationClasses || [];
_.pull(classes, ...classesToRemove);
internals.applicationClasses = classes;
return chrome;
};
/**
* @return {string} - a space delimited string of the classes added by the
* addApplicationClass method
*/
chrome.getApplicationClasses = function () {
return internals.applicationClasses.join(' ');
};
};

View file

@ -41,15 +41,17 @@
<li ng-if="chrome.getBrand('title')" class="navbar-brand">{{ chrome.getBrand('title') }}</li>
<li ng-if="chrome.getShowAppsLink()">
<a href="/apps"><i class="fa fa-th" alt="Go to app switcher"></i></a>
</li>
<li ng-repeat="tab in chrome.getTabs()" ng-class="{ active: tab.active }">
<a ng-href="{{ tab.href() }}" ng-style="{ 'border-bottom-color': tab.activeIndicatorColor }">
{{ tab.title }}
</a>
</li>
<li class="to-body" ng-class="{active: appTemplate.is('switcher')}" ng-if="chrome.getShowAppsLink()">
<a ng-click="appTemplate.toggle('switcher')">
<i class="fa fa-th" alt="Go to app switcher"></i>
</a>
</li>
</ul>
<ul ng-show="timefilter.enabled" class="nav navbar-nav navbar-right navbar-timepicker">
@ -95,6 +97,12 @@
<!-- /Full navbar -->
</nav>
<config
config-template="appTemplate"
config-object="switcher"
config-close="appTemplate.close">
</config>
<config
ng-show="timefilter.enabled"
config-template="pickerTemplate"
@ -102,5 +110,5 @@
config-close="pickerTemplate.close">
</config>
<div class="application" ng-class="'tab-' + chrome.getActiveTabId('-none-')" ng-view></div>
<div class="application" ng-class="'tab-' + chrome.getActiveTabId('-none-') + ' ' + chrome.getApplicationClasses()" ng-view></div>
</div>

View file

@ -8,6 +8,7 @@ require('ui/timefilter');
require('ui/private');
require('ui/promises');
var metadata = require('ui/metadata');
var TabCollection = require('ui/chrome/TabCollection');
var chrome = {
@ -17,13 +18,14 @@ var chrome = {
};
var internals = _.assign(
_.cloneDeep(window.__KBN__ || {}),
_.cloneDeep(metadata),
{
tabs: new TabCollection(),
rootController: null,
rootTemplate: null,
showAppsLink: null,
brand: null
brand: null,
applicationClasses: []
}
);

View file

@ -1,10 +1,12 @@
define(function (require) {
require('plugins/appSwitcher/appSwitcher.less');
var _ = require('lodash');
var ConfigTemplate = require('ui/ConfigTemplate');
require('ui/modules')
.get('kibana')
.directive('chromeContext', function (timefilter, globalState) {
.directive('chromeContext', function (timefilter, globalState, $http) {
var listenForUpdates = _.once(function ($scope) {
$scope.$listen(timefilter, 'update', function (newVal, oldVal) {
@ -25,6 +27,17 @@ define(function (require) {
interval: require('ui/chrome/config/interval.html')
});
$scope.switcher = {loading: true};
$http.get('/api/apps')
.then(function (resp) {
$scope.switcher.loading = false;
$scope.switcher.apps = resp.data;
});
$scope.appTemplate = new ConfigTemplate({
switcher: require('plugins/appSwitcher/appSwitcher.html')
});
$scope.toggleRefresh = function () {
timefilter.refreshInterval.pause = !timefilter.refreshInterval.pause;
};

View file

@ -1,20 +1,34 @@
.sidebar-container.collapsible-sidebar {
@import (reference) "~ui/styles/variables";
.collapsible-sidebar {
position: relative;
z-index: 1;
.sidebar-collapser {
background-color: #ecf0f1;
background-color: @collapser-bg;
height: 28px;
position: absolute;
top: 0;
right: -20px;
width: 20px;
border: 1px solid #ecf0f1;
border: 1px solid;
border-color: @collapser-border;
border-width: 0 1px 1px 0;
cursor: pointer;
z-index: -1;
border-bottom-right-radius: 4px;
&:hover {
background-color: @collapser-hover-bg;
.chevron-cont{
&:before {
color: @collapser-hover-color;
}
}
}
.chevron-cont{
position: absolute;
left: 4px;
@ -22,7 +36,7 @@
&:before {
font-family: FontAwesome;
color: #333;
color: @collapser-color;
content: "\F053";
}
}
@ -47,7 +61,7 @@
}
@media (max-width: 992px) {
.sidebar-container.collapsible-sidebar {
.collapsible-sidebar {
&.closed {
display: none;
}

View file

@ -3,6 +3,9 @@ define(function () {
// wraped in provider so that a new instance is given to each app/test
return {
'buildNum': {
readonly: true
},
'query:queryString:options': {
value: '{ "analyze_wildcard": true }',
description: 'Options for the lucene query string parser',
@ -89,6 +92,13 @@ define(function () {
type: 'json',
description: 'Default properties for the WMS map server support in the tile map'
},
'visualization:colorMapping': {
type: 'json',
value: JSON.stringify({
'Count': '#57c17b'
}),
description: 'Maps values to specified colors within visualizations'
},
'csv:separator': {
value: ',',
description: 'Separate exported values with this string',
@ -163,6 +173,10 @@ define(function () {
' "value": 0',
'}'
].join('\n')
},
'dashboard:defaultDarkTheme': {
value: false,
description: 'New dashboards use dark theme by default',
}
};
};

View file

@ -21,10 +21,10 @@ define(function (require) {
var storedVersion = this.source._getStoredVersion();
// conditions that equal "fetch This DOC!"
var unkown = !version && !storedVersion;
var unknown = !version && !storedVersion;
var mismatch = version !== storedVersion;
return Boolean(mismatch || (unkown && !this.started));
return Boolean(mismatch || (unknown && !this.started));
};
DocRequest.prototype.handleResponse = function (resp) {

View file

@ -138,7 +138,7 @@ define(function (require) {
case 'desc':
return (this._direction = dir);
default:
throw new TypeError('unkown sort direction "' + dir + '"');
throw new TypeError('unknown sort direction "' + dir + '"');
}
};

View file

@ -2,8 +2,9 @@
filter-bar .confirm {
padding: 8px 10px 4px;
background: @gray-lighter;
border-bottom: 1px solid #ccc;
background: @filter-bar-confirm-bg;
border-bottom: 1px solid;
border-bottom-color: @filter-bar-confirm-border;
ul {
margin-bottom: 0px;
@ -30,8 +31,8 @@ filter-bar .confirm {
min-width: 110px;
font-size: @font-size-small;
background-color: @gray-light;
color: #333;
background-color: @filter-bar-confirm-filter-bg;
color: @filter-bar-confirm-filter-color;
margin-right: 4px;
margin-bottom: 4px;
max-width: 100%;
@ -44,13 +45,14 @@ filter-bar .confirm {
filter-bar .bar {
padding: 6px 6px 4px 6px;
background: @gray-lighter;
border-bottom: 1px solid #ccc;
background: @filter-bar-bar-bg;
border-bottom: 1px solid;
border-bottom-color: @filter-bar-bar-border;
&-condensed {
padding: 2px 6px 0px 6px !important;
font-size: 0.9em;
background: darken(@gray-lighter, 5%);
background: @filter-bar-bar-condensed-bg;
}
.filter-link {
@ -73,8 +75,8 @@ filter-bar .bar {
min-width: 110px;
font-size: @font-size-small;
background-color: @action-add;
color: #fff;
background-color: @filter-bar-bar-filter-bg;
color: @filter-bar-bar-filter-color;
margin-right: 4px;
margin-bottom: 4px;
max-width: 100%;
@ -126,11 +128,11 @@ filter-bar .bar {
}
&.negate {
background-color: @action-remove;
background-color: @filter-bar-bar-filter-negate-bg;
}
a {
color: #FFF;
color: @filter-bar-bar-filter-color;
}
&.disabled {

View file

@ -0,0 +1,51 @@
describe('ui/filter_bar/lib', function () {
describe('mapMatchAll()', function () {
const expect = require('expect.js');
const ngMock = require('ngMock');
let $rootScope;
let mapMatchAll;
let filter;
beforeEach(ngMock.module('kibana'));
beforeEach(ngMock.inject(function (Private, _$rootScope_) {
$rootScope = _$rootScope_;
mapMatchAll = Private(require('ui/filter_bar/lib/mapMatchAll'));
filter = {
match_all: {},
meta: {
field: 'foo',
formattedValue: 'bar'
}
};
}));
describe('when given a filter that is not match_all', function () {
it('filter is rejected', function (done) {
delete filter.match_all;
mapMatchAll(filter).catch(result => {
expect(result).to.be(filter);
done();
});
$rootScope.$apply();
});
});
describe('when given a match_all filter', function () {
let result;
beforeEach(function () {
mapMatchAll(filter).then(r => result = r);
$rootScope.$apply();
});
it('key is set to meta field', function () {
expect(result).to.have.property('key', filter.meta.field);
});
it('value is set to meta formattedValue', function () {
expect(result).to.have.property('value', filter.meta.formattedValue);
});
});
});
});

View file

@ -21,6 +21,7 @@ define(function (require) {
// that either handles the mapping operation or not
// and add it here. ProTip: These are executed in order listed
var mappers = [
Private(require('./mapMatchAll')),
Private(require('./mapTerms')),
Private(require('./mapRange')),
Private(require('./mapExists')),

View file

@ -0,0 +1,12 @@
define(function (require) {
return function mapMatchAllProvider(Promise) {
return function (filter) {
if (filter.match_all) {
const key = filter.meta.field;
const value = filter.meta.formattedValue || 'all';
return Promise.resolve({ key, value });
}
return Promise.reject(filter);
};
};
});

View file

@ -63,5 +63,53 @@ describe('Filter Manager', function () {
});
});
describe('when given params where one side is infinite', function () {
let filter;
beforeEach(function () {
filter = fn(indexPattern.fields.byName['script number'], { gte: 0, lt: Infinity }, indexPattern);
});
describe('returned filter', function () {
it('is a script filter', function () {
expect(filter).to.have.property('script');
});
it('contain a param for the finite side', function () {
expect(filter.script.params).to.have.property('gte', 0);
});
it('does not contain a param for the infinite side', function () {
expect(filter.script.params).not.to.have.property('lt');
});
it('does not contain a script condition for the infinite side', function () {
const script = indexPattern.fields.byName['script number'].script;
expect(filter.script.script).to.equal(`(${script})>=gte`);
});
});
});
describe('when given params where both sides are infinite', function () {
let filter;
beforeEach(function () {
filter = fn(indexPattern.fields.byName['script number'], { gte: -Infinity, lt: Infinity }, indexPattern);
});
describe('returned filter', function () {
it('is a match_all filter', function () {
expect(filter).not.to.have.property('script');
expect(filter).to.have.property('match_all');
});
it('does not contain params', function () {
expect(filter).not.to.have.property('params');
});
it('meta field is set to field name', function () {
expect(filter.meta.field).to.equal('script number');
});
});
});
});
});

View file

@ -1,27 +1,44 @@
define(function (require) {
var _ = require('lodash');
const _ = require('lodash');
const OPERANDS_IN_RANGE = 2;
return function buildRangeFilter(field, params, indexPattern, formattedValue) {
var filter = { meta: { index: indexPattern.id } };
const filter = { meta: { index: indexPattern.id } };
if (formattedValue) filter.meta.formattedValue = formattedValue;
params = _.clone(params);
if (params.gte && params.gt) throw new Error('gte and gt are mutually exclusive');
if (params.lte && params.lt) throw new Error('lte and lt are mutually exclusive');
if ('gte' in params && 'gt' in params) throw new Error('gte and gt are mutually exclusive');
if ('lte' in params && 'lt' in params) throw new Error('lte and lt are mutually exclusive');
if (field.scripted) {
var operators = {
const totalInfinite = ['gt', 'lt'].reduce((totalInfinite, op) => {
const key = op in params ? op : `${op}e`;
const isInfinite = Math.abs(params[key]) === Infinity;
if (isInfinite) {
totalInfinite++;
delete params[key];
}
return totalInfinite;
}, 0);
if (totalInfinite === OPERANDS_IN_RANGE) {
filter.match_all = {};
filter.meta.field = field.name;
} else if (field.scripted) {
const operators = {
gt: '>',
gte: '>=',
lte: '<=',
lt: '<',
};
var script = _.map(params, function (val, key) {
const script = _.map(params, function (val, key) {
return '(' + field.script + ')' + operators[key] + key;
}).join(' && ');
var value = _.map(params, function (val, key) {
const value = _.map(params, function (val, key) {
return operators[key] + field.format.convert(val);
}).join(' ');
@ -32,6 +49,7 @@ define(function (require) {
filter.range = {};
filter.range[field.name] = params;
}
return filter;
};
});

View file

@ -19,11 +19,11 @@ define(function (require) {
spec.type = '_source';
}
// find the type for this field, fallback to unkown type
// find the type for this field, fallback to unknown type
var type = fieldTypes.byName[spec.type];
if (spec.type && !type) {
notify.error(
'Unkown field type "' + spec.type + '"' +
'Unknown field type "' + spec.type + '"' +
' for field "' + spec.name + '"' +
' in indexPattern "' + indexPattern.id + '"'
);

24
src/ui/public/metadata.js Normal file
View file

@ -0,0 +1,24 @@
// singleton for immutable copy of window.__KBN__
define(function (require) {
const _ = require('lodash');
if (!_.has(window, '__KBN__')) {
throw new Error('window.__KBN__ must be set for metadata');
}
const kbn = _.cloneDeep(window.__KBN__ || {});
return deepFreeze(kbn);
function deepFreeze(object) {
// for any properties that reference an object, makes sure that object is
// recursively frozen as well
Object.keys(object).forEach(key => {
const value = object[key];
if (_.isObject(value)) {
deepFreeze(value);
}
});
return Object.freeze(object);
}
});

View file

@ -3,9 +3,13 @@ define(function (require) {
var _ = require('lodash');
var $ = require('jquery');
var metadata = require('ui/metadata');
var notifs = [];
var setTO = setTimeout;
var clearTO = clearTimeout;
var version = metadata.version;
var buildNum = metadata.buildNum;
var consoleGroups = ('group' in window.console) && ('groupCollapsed' in window.console) && ('groupEnd' in window.console);
var fatalSplashScreen = require('ui/notify/partials/fatal_splash_screen.html');
@ -40,6 +44,9 @@ define(function (require) {
}
function add(notif, cb) {
_.set(notif, 'info.version', version);
_.set(notif, 'info.buildNum', buildNum);
if (notif.lifetime !== Infinity) {
notif.timerId = setTO(function () {
closeNotif(cb, 'ignore').call(notif);
@ -85,6 +92,20 @@ define(function (require) {
return rtn;
}
function formatInfo() {
var info = [];
if (!_.isUndefined(version)) {
info.push(`Version: ${version}`);
}
if (!_.isUndefined(buildNum)) {
info.push(`Build: ${buildNum}`);
}
return info.join('\n');
}
// browsers format Error.stack differently; always include message
function formatStack(err) {
if (err.stack && !~err.stack.indexOf(err.message)) {
@ -192,6 +213,7 @@ define(function (require) {
}
var html = fatalToastTemplate({
info: formatInfo(),
msg: formatMsg(err, this.from),
stack: formatStack(err)
});

View file

@ -0,0 +1,164 @@
describe('Notifier', function () {
var _ = require('lodash');
var ngMock = require('ngMock');
var expect = require('expect.js');
var Notifier = require('ui/notify/Notifier');
var message = 'Oh, the humanity!';
var notifier;
var params;
var version = window.__KBN__.version;
var buildNum = window.__KBN__.buildNum;
beforeEach(ngMock.module('kibana'));
beforeEach(function () {
params = { location: 'foo' };
while (Notifier.prototype._notifs.pop()); // clear global notifications
notifier = new Notifier(params);
});
describe('#constructor()', function () {
it('sets #from from given location', function () {
expect(notifier.from).to.equal(params.location);
});
});
describe('#error', function () {
testVersionInfo('error');
it('prepends location to message for content', function () {
expect(notify('error').content).to.equal(params.location + ': ' + message);
});
it('sets type to "danger"', function () {
expect(notify('error').type).to.equal('danger');
});
it('sets icon to "warning"', function () {
expect(notify('error').icon).to.equal('warning');
});
it('sets title to "Error"', function () {
expect(notify('error').title).to.equal('Error');
});
it('sets lifetime to Infinity', function () {
expect(notify('error').lifetime).to.equal(Infinity);
});
it('allows reporting', function () {
var includesReport = _.includes(notify('error').actions, 'report');
expect(includesReport).to.true;
});
it('allows accepting', function () {
var includesAccept = _.includes(notify('error').actions, 'accept');
expect(includesAccept).to.true;
});
it('includes stack', function () {
expect(notify('error').stack).to.be.defined;
});
});
describe('#warning', function () {
testVersionInfo('warning');
it('prepends location to message for content', function () {
expect(notify('warning').content).to.equal(params.location + ': ' + message);
});
it('sets type to "warning"', function () {
expect(notify('warning').type).to.equal('warning');
});
it('sets icon to "warning"', function () {
expect(notify('warning').icon).to.equal('warning');
});
it('sets title to "Warning"', function () {
expect(notify('warning').title).to.equal('Warning');
});
it('sets lifetime to 10000', function () {
expect(notify('warning').lifetime).to.equal(10000);
});
it('does not allow reporting', function () {
var includesReport = _.includes(notify('warning').actions, 'report');
expect(includesReport).to.false;
});
it('allows accepting', function () {
var includesAccept = _.includes(notify('warning').actions, 'accept');
expect(includesAccept).to.true;
});
it('does not include stack', function () {
expect(notify('warning').stack).not.to.be.defined;
});
});
describe('#info', function () {
testVersionInfo('info');
it('prepends location to message for content', function () {
expect(notify('info').content).to.equal(params.location + ': ' + message);
});
it('sets type to "info"', function () {
expect(notify('info').type).to.equal('info');
});
it('sets icon to "info-circle"', function () {
expect(notify('info').icon).to.equal('info-circle');
});
it('sets title to "Debug"', function () {
expect(notify('info').title).to.equal('Debug');
});
it('sets lifetime to 5000', function () {
expect(notify('info').lifetime).to.equal(5000);
});
it('does not allow reporting', function () {
var includesReport = _.includes(notify('info').actions, 'report');
expect(includesReport).to.false;
});
it('allows accepting', function () {
var includesAccept = _.includes(notify('info').actions, 'accept');
expect(includesAccept).to.true;
});
it('does not include stack', function () {
expect(notify('info').stack).not.to.be.defined;
});
});
function notify(fnName) {
notifier[fnName](message);
return latestNotification();
}
function latestNotification() {
return _.last(notifier._notifs);
}
function testVersionInfo(fnName) {
context('when version is configured', function () {
it('adds version to notification', function () {
var notification = notify(fnName);
expect(notification.info.version).to.equal(version);
});
});
context('when build number is configured', function () {
it('adds buildNum to notification', function () {
var notification = notify(fnName);
expect(notification.info.buildNum).to.equal(buildNum);
});
});
}
});

View file

@ -12,6 +12,9 @@
</h1>
</div>
<div class="panel-body fatal-body"><%- msg %></div>
<% if (info) { %>
<div class="panel-footer"><pre><%- info %></pre></div>
<% } %>
<% if (stack) { %>
<div class="panel-footer"><pre><%- stack %></pre></div>
<% } %>

View file

@ -91,7 +91,7 @@ ul.navbar-inline li {
}
.application {
.flex-parent();
.flex-parent(@shrink: 0);
position: relative;
z-index: 0;
}
@ -273,6 +273,14 @@ saved-object-finder {
}
.list-group-item {
a {
i {
color: @saved-object-finder-icon-color !important;
}
color: @saved-object-finder-link-color !important;
}
&:first-child {
.border-top-radius(0) !important;
}
@ -332,7 +340,7 @@ saved-object-finder {
// when rendered within a config dropdown, don't use a bottom margin
.config saved-object-finder .finder-options {
margin-bottom: 0;
background: @body-bg;
background: @config-saved-object-finder-options-bg;
}
//== Generic Media List
@ -377,7 +385,6 @@ button[disabled] {
}
}
input[type="radio"],
input[type="checkbox"],
.radio,
@ -396,7 +403,7 @@ textarea {
}
.field-collapse-toggle {
color: #999;
color: @field-collapse-toggle-color;
margin-left: 10px !important;
}
@ -412,14 +419,14 @@ style-compile {
.cell-hover {
background-color: white;
background-color: @table-cell-hover-bg;
&-show {
// so that the cell doesn't change size on hover
visibility: hidden;
}
}
.cell-hover:hover {
background-color: @gray-lighter;
background-color: @table-cell-hover-hover-bg;
cursor: cell;
.cell-hover-show {
@ -428,7 +435,7 @@ style-compile {
}
mark, .mark {
background-color: rgba(252, 229, 113, 1);
background-color: @mark-bg;
}
fieldset {

View file

@ -4,11 +4,12 @@
.navbar;
.navbar-default();
.navbar-static-top;
border-bottom: 1px solid darken(@body-bg, 10%);
border-bottom: 1px solid;
border-bottom-color: @config-border;
.config-close {
width: 100%;
background-color: @well-bg;
background-color: @config-close-bg;
border-radius: 0;
@shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);
.box-shadow(@shadow);
@ -17,6 +18,6 @@
.container-fluid {
padding: 10px 10px;
background-color: @body-bg;
background-color: @config-bg;
}
}

View file

@ -0,0 +1,539 @@
@import "~ui/styles/dark-variables";
@import "~bootstrap/less/mixins.less";
.tab-dashboard.theme-dark {
color: @text-color;
background-color: @dashboard-bg;
// /node_modules/bootstrap/less/scaffolding.less
a {
color: @link-color;
&:hover,
&:focus {
color: @link-hover-color;
}
}
// /node_modules/bootstrap/less/forms.less
.form-control {
color: @input-color;
background-color: @input-bg;
border-color: @input-border;
&[disabled],
&[readonly],
fieldset[disabled] & {
background-color: @input-bg-disabled;
}
}
// /node_modules/bootstrap/less/panels.less
.panel {
background-color: @panel-bg;
}
// /node_modules/bootstrap/less/tables.less
.table {
// Cells
> thead,
> tbody,
> tfoot {
> tr {
> th,
> td {
border-top-color: @table-border-color;
}
}
}
// Bottom align for column headings
> thead > tr > th {
border-bottom-color: @table-border-color;
}
// Account for multiple tbody instances
> tbody + tbody {
border-top-color: @table-border-color;
}
// Nesting
.table {
background-color: @table-nested-bg;
}
}
table {
th {
i.fa-sort {
color: @table-sort-color;
}
i.fa-sort-asc,
i.fa-sort-down {
color: @table-sort-asc-color;
}
i.fa-sort-desc,
i.fa-sort-up {
color: @table-sort-desc-color;
}
}
}
// /node_modules/bootstrap/less/buttons.less
.btn {
&:hover,
&:focus,
&.focus {
color: @btn-default-color;
}
.findme {
font-weight: bold;
}
}
.btn-default {
.button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);
}
.btn-primary {
.button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);
}
// /node_modules/bootstrap/less/list-group.less
.list-group-item {
background-color: @list-group-bg;
border-color: @list-group-border;
}
a.list-group-item,
button.list-group-item {
color: @list-group-link-color;
.list-group-item-heading {
color: @list-group-link-heading-color;
}
// Hover state
&:hover,
&:focus {
color: @list-group-link-hover-color;
background-color: @list-group-hover-bg;
}
}
.panel {
> .panel-body + .table,
> .panel-body + .table-responsive,
> .table + .panel-body,
> .table-responsive + .panel-body {
border-top-color:@table-border-color;
}
}
.panel-group {
.panel-heading {
+ .panel-collapse > .panel-body,
+ .panel-collapse > .list-group {
border-top-color: @panel-inner-border;
}
}
.panel-footer {
border-top: 0;
+ .panel-collapse .panel-body {
border-bottom-color: @panel-inner-border;
}
}
}
.panel-default {
border-color: @panel-default-border;
& > .panel-heading {
color: @panel-default-text;
background-color: @panel-default-heading-bg;
border-color: @panel-default-border;
+ .panel-collapse > .panel-body {
border-top-color: @panel-default-border;
}
.badge {
color: @panel-default-heading-bg;
background-color: @panel-default-text;
}
}
& > .panel-footer {
+ .panel-collapse > .panel-body {
border-bottom-color: @panel-default-border;
}
}
}
// /node_modules/bootstrap/less/navs.less
.nav {
> li {
> a {
&:hover,
&:focus {
background-color: @nav-link-hover-bg;
}
}
}
}
// /node_modules/bootstrap/less/navs.less
.nav-tabs {
border-bottom: 1px solid @nav-tabs-border-color;
> li {
> a {
&:hover {
border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;
}
}
&.active > a {
&,
&:hover,
&:focus {
color: @nav-tabs-active-link-hover-color;
background-color: @nav-tabs-active-link-hover-bg;
border-color: @nav-tabs-active-link-hover-border-color;
}
}
}
}
// /src/ui/public/styles/navbar.less
navbar {
color: @navbar-default-color;
background-color: @navbar-default-bg;
border-color: @navbar-default-border;
}
// /src/ui/public/styles/base.less
saved-object-finder {
.list-group-item {
a {
i {
color: @saved-object-finder-icon-color !important;
}
color: @saved-object-finder-link-color !important;
}
}
.finder-options {
> li {
&.active {
background-color: @component-active-bg;
color: @component-active-color;
a {
color: @component-active-color;
}
}
}
}
}
.cell-hover {
background-color: @table-cell-hover-bg;
}
.cell-hover:hover {
background-color: @table-cell-hover-hover-bg;
}
// /src/ui/public/styles/spinner.less
.spinner > div {
background-color: @spinner-bg;
}
// /src/ui/public/agg_table/agg_table.less
.agg-table {
&-paginated {
tr:hover td {
background-color: @table-row-hover-bg;
}
.cell-hover:hover {
background-color: @table-cell-hover-hover-bg;
}
}
}
// /src/ui/public/visualize/visualize.less
visualize-spy {
.visualize-show-spy {
border-top-color: @visualize-show-spy-border;
&-tab {
border-color: @visualize-show-spy-border;
background: @visualize-show-spy-bg;
color: @visualize-show-spy-color;
&:hover {
background-color: @visualize-show-spy-hover-bg;
color: @visualize-show-spy-hover-color;
}
}
}
}
// /src/ui/public/vislib/styles/_svg.less
.axis {
line, path {
stroke: @svg-axis-color;
}
}
.tick text {
fill: @svg-tick-text-color;
}
.brush .extent {
stroke: @svg-brush-color;
}
.endzone {
fill: @svg-endzone-bg;
//opacity: 1;
}
// /src/ui/public/vislib/styles/_legend.less
.legend-col-wrapper {
.legend-ul {
li.color {
color: @legend-item-color;
}
}
}
// /src/ui/public/vislib/styles/_layout.less
.y-axis-title text, .x-axis-title text {
fill: @vis-axis-title-color;
}
.chart-title text {
fill: @vis-chart-title-color;
}
// /src/ui/public/vislib/styles/_tilemap.less
.tilemap {
border-color: @tilemap-border;
}
.tilemap-legend {
background: @tilemap-legend-base-bg;
background: @tilemap-legend-bg;
color: @tilemap-color;
}
.tilemap-legend i {
border-color: @tilemap-legend-i-border;
background: @tilemap-legend-i-bg;
}
.tilemap-info {
background: @tilemap-info-base-bg;
background: fade(@tilemap-info-bg, 92%);
}
.tilemap-info h2 {
color: @tilemap-info-header-color;
}
.leaflet-control-fit {
background: @tilemap-leaflet-control-bg;
outline: 1px @tilemap-leaflet-control-outline;
}
.leaflet-container {
background: @tilemap-leaflet-container-bg !important;
}
.leaflet-popup-content-wrapper {
background: @tooltip-bg !important;
color: @tooltip-color !important;
}
.leaflet-popup-content {
table {
thead tr {
border-bottom-color: @tilemap-leaflet-popup-border;
}
tbody tr {
border-top-color: @tilemap-leaflet-popup-border;
}
}
}
img.leaflet-tile {
filter: @tilemap-filter;
}
.leaflet-control-attribution {
background-color: @tilemap-leaflet-footer-bg !important;
color: @tilemap-leaflet-footer-color !important;
}
.leaflet-left {
.leaflet-control {
a,
a:hover {
color: @tilemap-leaflet-control-color;
}
}
.leaflet-draw-actions a {
background-color: @tilemap-leaflet-control-draw-action-bg;
}
}
// /src/ui/public/filter_bar/filter_bar.less
filter-bar .confirm {
background: @filter-bar-confirm-bg;
border-bottom-color: @filter-bar-confirm-border;
.filter {
background-color: @filter-bar-confirm-filter-bg;
color: @filter-bar-confirm-filter-color;
}
}
filter-bar .bar {
background: @filter-bar-bar-bg;
border-bottom-color: @filter-bar-bar-border;
&-condensed {
background: @filter-bar-bar-condensed-bg;
}
.filter {
background-color: @filter-bar-bar-filter-bg;
color: @filter-bar-bar-filter-color;
&.negate {
background-color: @filter-bar-bar-filter-negate-bg;
}
a {
color: @filter-bar-bar-filter-color;
}
}
}
// /src/ui/public/styles/config.less
.config {
border-bottom-color: @config-border;
.config-close {
background-color: @config-close-bg;
}
.container-fluid {
background-color: @config-bg;
}
}
// /src/ui/public/styles/list-group-menu.less
.list-group-menu {
&.select-mode a{
color: @list-group-menu-item-select-color;
}
.list-group-menu-item {
color: @list-group-menu-item-color;
&.active {
background-color: @list-group-menu-item-active-bg;
}
&:hover {
background-color: @list-group-menu-item-hover-bg;
}
li {
color: @list-group-menu-item-color;
}
}
}
// /src/ui/public/styles/input.less
select {
color: @input-color;
background-color: @input-bg;
}
// /src/ui/public/styles/pagination.less
paginate {
paginate-controls {
.pagination-other-pages {
&-list {
> li {
&.active a {
color: @paginate-page-link-active-color;
}
}
}
}
}
}
// /src/plugins/kibana/public/dashboard/styles/main.less
.start-screen {
background-color: @dashboard-bg;
}
.gridster {
background-color: @dashboard-bg;
dashboard-panel {
background: @dashboard-panel-bg;
color: @dashboard-panel-color;
.panel {
.panel-heading {
a {
color: @dashboard-panel-heading-link-color;
&:hover {
color: @dashboard-panel-heading-link-hover-color;
}
}
span.panel-title {
color: @dashboard-panel-heading-link-color;
}
i {
color: @dashboard-panel-heading-link-color;
opacity: 1;
}
}
.load-error {
.fa-exclamation-triangle {
color: @dashboard-panel-load-error-color;
}
}
}
}
}
}

View file

@ -0,0 +1,170 @@
@white: #ffffff;
@black: #000000;
@gray2: #222222;
@gray3: #333333;
@gray4: #444444;
@gray5: #555555;
@gray6: #666666;
@gray7: #777777;
@gray8: #888888;
@gray9: #999999;
@gray10: #aaaaaa;
@gray11: #bbbbbb;
@gray12: #cccccc;
@gray13: #dddddd;
@gray14: #eeeeee;
@brand-primary: @gray14;
@brand-success: #31c471;
@brand-info: #6482e5;
@brand-warning: #f39c12;
@brand-danger: #e74c3c;
@body-bg: @gray3;
@text-color: #cecece;
@link-color: #b7e2ea;
@link-hover-color: lighten(@link-color, 10%);
@btn-default-color: @white;
@btn-default-bg: @gray7;
@btn-default-border: @btn-default-bg;
@btn-primary-color: @white;
@btn-primary-bg: @gray7;
@btn-primary-border: @btn-primary-bg;
@btn-success-bg: @brand-success;
@btn-danger-bg: @brand-danger;
@input-bg: @gray4;
@input-bg-disabled: @gray3;
@input-color: @text-color;
@input-border: @gray6;
@well-bg: @gray4;
@action-add: desaturate(@btn-success-bg, 30%);
@action-remove: desaturate(@btn-danger-bg, 30%);
@table-border-color: #5c5c5c;
@table-cell-hover-bg: transparent;
@table-cell-hover-hover-bg: @gray6;
@table-row-hover-bg: lighten(@gray6, 4%);
@table-nested-bg: transparent;
@table-sort-color: @gray6;
@table-sort-asc-color: @gray11;
@table-sort-desc-color: @gray11;
@nav-link-hover-bg: @gray6;
@nav-tabs-active-link-hover-bg: @gray3;
@nav-tabs-border-color: @gray6;
@nav-tabs-link-hover-border-color: @gray7;
@nav-tabs-active-link-hover-border-color: @gray7;
@nav-tabs-active-link-hover-color: @brand-primary;
@paginate-page-link-active-color: @gray9;
@dashboard-bg: #1e1b1e;
@panel-bg: #343434;
@panel-inner-border: @gray13;
@panel-default-text: @brand-primary;
@panel-default-border: #5c5c5c;
@panel-default-heading-bg: darken(@panel-bg, 5%);
@dashboard-panel-bg: @panel-bg;
@dashboard-panel-color: @text-color;
@dashboard-panel-heading-link-color: #a6a6a6;
@dashboard-panel-heading-link-hover-color: #a6a6a6;
@dashboard-panel-load-error-color: @btn-danger-bg;
@collapser-bg: @panel-bg;
@collapser-border: #5c5c5c;
@collapser-color: @gray8;
@collapser-hover-bg: @gray6;
@collapser-hover-color: @gray3;
@visualize-show-spy-border: @collapser-border;
@visualize-show-spy-bg: @collapser-bg;
@visualize-show-spy-color: @collapser-color;
@visualize-show-spy-hover-bg: @collapser-hover-bg;
@visualize-show-spy-hover-color: @collapser-hover-color;
@svg-axis-color: @gray8;
@svg-tick-text-color: @gray10;
@svg-brush-color: @white;
@svg-endzone-bg: @white;
@vis-axis-title-color: @gray10;
@vis-chart-title-color: @gray10;
@tilemap-border: @gray13;
@tilemap-legend-base-bg: @gray3;
@tilemap-legend-bg: fade(@tilemap-legend-base-bg, 100%);
@tilemap-color: @gray12;
@tilemap-legend-i-border: @gray9;
@tilemap-legend-i-bg: @gray10;
@tilemap-info-base-bg: @white;
@tilemap-info-bg: fade(@tilemap-info-base-bg, 92%);
@tilemap-info-header-color: @gray4;
@tilemap-leaflet-control-bg: @white;
@tilemap-leaflet-control-outline: @black;
@tilemap-leaflet-control-color: @black;
@tilemap-leaflet-control-draw-action-bg: @gray11;
@tilemap-leaflet-container-bg: @body-bg;
@tilemap-leaflet-popup-border: @gray9;
@tilemap-leaflet-footer-bg: fade(@gray3, 80%);
@tilemap-leaflet-footer-color: @gray12;
@tilemap-filter: invert(1) brightness(1.75) grayscale(1) contrast(1);
@tooltip-bg: fadeout(@gray4, 7%);
@tooltip-color: @gray14;
@filter-bar-confirm-bg: @gray3;
@filter-bar-confirm-filter-color: @gray3;
@filter-bar-confirm-border: @black;
@filter-bar-confirm-filter-bg: @gray12;
@filter-bar-bar-bg: @gray3;
@filter-bar-bar-border: @black;
@filter-bar-bar-condensed-bg: darken(@filter-bar-bar-bg, 5%);
@filter-bar-bar-filter-bg: @action-add;
@filter-bar-bar-filter-color: @white;
@filter-bar-bar-filter-negate-bg: @action-remove;
@legend-item-color: @gray10;
@config-border: @gray4;
@config-bg: @body-bg;
@config-close-bg: @well-bg;
@config-saved-object-finder-options-bg: @body-bg;
@saved-object-finder-link-color: @text-color;
@saved-object-finder-icon-color: darken(@saved-object-finder-link-color, 10%);
@list-group-bg: @gray3;
@list-group-border: @gray7;
@list-group-hover-bg: @gray14;
@list-group-link-color: @gray5;
@list-group-link-hover-color: @list-group-link-color;
@list-group-link-heading-color: @gray3;
@list-group-menu-item-color: @text-color;
@list-group-menu-item-select-color: @link-color;
@list-group-menu-item-active-bg: @well-bg;
@list-group-menu-item-hover-bg: @well-bg;
@component-active-color: @gray5;
@component-active-bg: @gray9;
@navbar-default-color: @white;
@navbar-default-bg: @gray3;
@navbar-default-border: darken(@navbar-default-bg, 10%);
@spinner-bg: @white;

View file

@ -1,10 +1,5 @@
@import "~ui/styles/variables";
@hintbox-background-color: @gray-lighter;
@hintbox-spacing-vertical: 10px;
@hintbox-spacing-horizontal: 12px;
@hintbox-table-border-color: #BFC9CA;
.hintbox {
padding: @hintbox-spacing-vertical @hintbox-spacing-horizontal;
border-radius: 5px;
@ -12,15 +7,15 @@
background-color: @hintbox-background-color;
a {
color: @link-color !important;
color: @hintbox-link-color !important;
&:hover {
color: @text-color !important;
color: @hintbox-link-hover-color !important;
}
}
pre {
background-color: white;
background-color: @hintbox-pre-bg;
}
&-label,

View file

@ -3,7 +3,12 @@
i.input-error {
position: absolute;
margin-left: -25px;
color: @brand-danger;
color: @input-error-color;
margin-top: 10px;
z-index: 5;
}
select {
color: @input-color;
background-color: @input-bg;
}

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