diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6c82ce61a35..aa3114b39af 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,6 +12,7 @@
**Fixes**
- [Issue #1298](https://github.com/grafana/grafana/issues/1298). InfluxDB: Fix handling of empty array in templating variable query
- [Issue #1309](https://github.com/grafana/grafana/issues/1309). Graph: Fixed issue when using zero as a grid threshold
+- [Issue #1345](https://github.com/grafana/grafana/issues/1345). UI: Fixed position of confirm modal when scrolled down
**Tech**
- [Issue #1311](https://github.com/grafana/grafana/issues/1311). Tech: Updated Font-Awesome from 3.2 to 4.2
diff --git a/sample/apache_ldap.conf b/sample/apache_ldap.conf
deleted file mode 100644
index f7df159e335..00000000000
--- a/sample/apache_ldap.conf
+++ /dev/null
@@ -1,61 +0,0 @@
-# Courtesy of https://github.com/sgzijl
-# config.js includes elasticsearch: "https://"+window.location.hostname+":443",
-
-
- ServerName your.domain.tld
- RewriteEngine On
- RewriteCond %{HTTPS} off
- RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
-
-
-
- ServerName your.domain.tld
-
- SSLEngine on
- SSLCertificateFile /path/to/public.crt
- SSLCertificateKeyFile /path/to/private.key
-
- DocumentRoot /path/to/kibana3
-
- Allow from all
- Options -Multiviews
-
-
- LogLevel debug
- ErrorLog /path/to/logs/error_log
- CustomLog /path/to/logs/access_log combined
-
- # Set global proxy timeouts
-
- ProxySet connectiontimeout=5 timeout=90
-
-
- # Proxy for _aliases and .*/_search
-
- ProxyPassMatch http://127.0.0.1:9200/$1
- ProxyPassReverse http://127.0.0.1:9200/$1
-
-
- # Proxy for kibana-int/{dashboard,temp} stuff (if you don't want auth on /, then you will want these to be protected)
-
- ProxyPassMatch http://127.0.0.1:9200/$1$2
- ProxyPassReverse http://127.0.0.1:9200/$1$2
-
-
- # Optional disable auth for a src IP (eg: your monitoring host or subnet)
-
- Allow from 5.6.7.8
- Deny from all
- Satisfy any
-
- AuthLDAPBindDN "CN=_ldapbinduser,OU=Users,DC=example,DC=com"
- AuthLDAPBindPassword "ldapbindpass"
- AuthLDAPURL "ldaps://ldap01.example.com ldap02.example.com/OU=Users,DC=example,DC=com?sAMAccountName?sub?(objectClass=*)"
- AuthType Basic
- AuthBasicProvider ldap
- AuthName "Please authenticate for Example dot com"
- AuthLDAPGroupAttributeIsDN on
- require valid-user
-
-
-
diff --git a/sample/lighttpd_basic.conf b/sample/lighttpd_basic.conf
deleted file mode 100644
index 667a6abe71c..00000000000
--- a/sample/lighttpd_basic.conf
+++ /dev/null
@@ -1,24 +0,0 @@
-$HTTP["host"] =~ "kibana" {
-
- server.document-root = "/var/ww/kibana/src"
- auth.backend = "plain"
- auth.backend.plain.userfile = "/etc/lighttpd/kibanapassword"
-
- index-file.names = ( "index.html", "index.htm" )
-
- auth.require = ( "/" => (
- "method" => "basic",
- "realm" => "Password Protected",
- "require" => "valid-user"
- )
- )
-
- $HTTP["url"] =~ "^/kibana-int/(dashboard/|temp).*$" {
- proxy.balance = "hash"
- proxy.server = ( "" => ( ( "host" => "127.0.0.1", "port" => "9200" ) ) )
- }
- $HTTP["url"] =~ "^.*/_(mapping|search|nodes|aliases)$" {
- proxy.balance = "hash"
- proxy.server = ( "" => ( ( "host" => "127.0.0.1", "port" => "9200" ) ) )
- }
-}
diff --git a/sample/nginx.conf b/sample/nginx.conf
deleted file mode 100644
index b1e2f362e60..00000000000
--- a/sample/nginx.conf
+++ /dev/null
@@ -1,60 +0,0 @@
-#
-# Nginx proxy for Elasticsearch + Kibana
-#
-# In this setup, we are password protecting the saving of dashboards. You may
-# wish to extend the password protection to all paths.
-#
-# Even though these paths are being called as the result of an ajax request, the
-# browser will prompt for a username/password on the first request
-#
-# If you use this, you'll want to point config.js at http://FQDN:80/ instead of
-# http://FQDN:9200
-#
-server {
- listen *:80 ;
-
- server_name kibana.myhost.org;
- access_log /var/log/nginx/kibana.myhost.org.access.log;
-
- location / {
- root /usr/share/kibana3;
- index index.html index.htm;
- }
-
- location ~ ^/_aliases$ {
- proxy_pass http://127.0.0.1:9200;
- proxy_read_timeout 90;
- }
- location ~ ^/_nodes$ {
- proxy_pass http://127.0.0.1:9200;
- proxy_read_timeout 90;
- }
- location ~ ^/.*/_search$ {
- proxy_pass http://127.0.0.1:9200;
- proxy_read_timeout 90;
- }
- location ~ ^/.*/_mapping$ {
- proxy_pass http://127.0.0.1:9200;
- proxy_read_timeout 90;
- }
-
- # Password protected end points
- location ~ ^/kibana-int/dashboard/.*$ {
- proxy_pass http://127.0.0.1:9200;
- proxy_read_timeout 90;
- limit_except GET {
- proxy_pass http://127.0.0.1:9200;
- auth_basic "Restricted";
- auth_basic_user_file /etc/nginx/conf.d/kibana.myhost.org.htpasswd;
- }
- }
- location ~ ^/kibana-int/temp.*$ {
- proxy_pass http://127.0.0.1:9200;
- proxy_read_timeout 90;
- limit_except GET {
- proxy_pass http://127.0.0.1:9200;
- auth_basic "Restricted";
- auth_basic_user_file /etc/nginx/conf.d/kibana.myhost.org.htpasswd;
- }
- }
-}
diff --git a/sample/server.js b/sample/server.js
deleted file mode 100644
index d976a48b22a..00000000000
--- a/sample/server.js
+++ /dev/null
@@ -1,244 +0,0 @@
-#!/usr/bin/env node
-
-var util = require('util'),
- http = require('http'),
- fs = require('fs'),
- url = require('url'),
- events = require('events');
-
-var DEFAULT_PORT = 8000;
-
-function main(argv) {
- new HttpServer({
- 'GET': createServlet(StaticServlet),
- 'HEAD': createServlet(StaticServlet)
- }).start(Number(argv[2]) || DEFAULT_PORT);
-}
-
-function escapeHtml(value) {
- return value.toString().
- replace('<', '<').
- replace('>', '>').
- replace('"', '"');
-}
-
-function createServlet(Class) {
- var servlet = new Class();
- return servlet.handleRequest.bind(servlet);
-}
-
-/**
- * An Http server implementation that uses a map of methods to decide
- * action routing.
- *
- * @param {Object} Map of method => Handler function
- */
-function HttpServer(handlers) {
- this.handlers = handlers;
- this.server = http.createServer(this.handleRequest_.bind(this));
-}
-
-HttpServer.prototype.start = function(port) {
- this.port = port;
- this.server.listen(port);
- util.puts('Http Server running at http://localhost:' + port + '/');
-};
-
-HttpServer.prototype.parseUrl_ = function(urlString) {
- var parsed = url.parse(urlString);
- parsed.pathname = url.resolve('/', parsed.pathname);
- return url.parse(url.format(parsed), true);
-};
-
-HttpServer.prototype.handleRequest_ = function(req, res) {
- var logEntry = req.method + ' ' + req.url;
- if (req.headers['user-agent']) {
- logEntry += ' ' + req.headers['user-agent'];
- }
- util.puts(logEntry);
- req.url = this.parseUrl_(req.url);
- var handler = this.handlers[req.method];
- if (!handler) {
- res.writeHead(501);
- res.end();
- } else {
- handler.call(this, req, res);
- }
-};
-
-/**
- * Handles static content.
- */
-function StaticServlet() {}
-
-StaticServlet.MimeMap = {
- 'txt': 'text/plain',
- 'html': 'text/html',
- 'css': 'text/css',
- 'xml': 'application/xml',
- 'json': 'application/json',
- 'js': 'application/javascript',
- 'jpg': 'image/jpeg',
- 'jpeg': 'image/jpeg',
- 'gif': 'image/gif',
- 'png': 'image/png',
- 'svg': 'image/svg+xml'
-};
-
-StaticServlet.prototype.handleRequest = function(req, res) {
- var self = this;
- var path = ('../src/' + req.url.pathname).replace('//','/').replace(/%(..)/g, function(match, hex){
- return String.fromCharCode(parseInt(hex, 16));
- });
- var parts = path.split('/');
- if (parts[parts.length-1].charAt(0) === '.')
- return self.sendForbidden_(req, res, path);
- fs.stat(path, function(err, stat) {
- if (err)
- return self.sendMissing_(req, res, path);
- if (stat.isDirectory())
- return self.sendDirectory_(req, res, path);
- return self.sendFile_(req, res, path);
- });
-}
-
-StaticServlet.prototype.sendError_ = function(req, res, error) {
- res.writeHead(500, {
- 'Content-Type': 'text/html'
- });
- res.write('\n');
- res.write('
Internal Server Error\n');
- res.write('Internal Server Error
');
- res.write('' + escapeHtml(util.inspect(error)) + '
');
- util.puts('500 Internal Server Error');
- util.puts(util.inspect(error));
-};
-
-StaticServlet.prototype.sendMissing_ = function(req, res, path) {
- path = path.substring(1);
- res.writeHead(404, {
- 'Content-Type': 'text/html'
- });
- res.write('\n');
- res.write('404 Not Found\n');
- res.write('Not Found
');
- res.write(
- 'The requested URL ' +
- escapeHtml(path) +
- ' was not found on this server.
'
- );
- res.end();
- util.puts('404 Not Found: ' + path);
-};
-
-StaticServlet.prototype.sendForbidden_ = function(req, res, path) {
- path = path.substring(1);
- res.writeHead(403, {
- 'Content-Type': 'text/html'
- });
- res.write('\n');
- res.write('403 Forbidden\n');
- res.write('Forbidden
');
- res.write(
- 'You do not have permission to access ' +
- escapeHtml(path) + ' on this server.
'
- );
- res.end();
- util.puts('403 Forbidden: ' + path);
-};
-
-StaticServlet.prototype.sendRedirect_ = function(req, res, redirectUrl) {
- res.writeHead(301, {
- 'Content-Type': 'text/html',
- 'Location': redirectUrl
- });
- res.write('\n');
- res.write('301 Moved Permanently\n');
- res.write('Moved Permanently
');
- res.write(
- 'The document has moved here.
'
- );
- res.end();
- util.puts('301 Moved Permanently: ' + redirectUrl);
-};
-
-StaticServlet.prototype.sendFile_ = function(req, res, path) {
- var self = this;
- var file = fs.createReadStream(path);
- res.writeHead(200, {
- 'Content-Type': StaticServlet.
- MimeMap[path.split('.').pop()] || 'text/plain'
- });
- if (req.method === 'HEAD') {
- res.end();
- } else {
- file.on('data', res.write.bind(res));
- file.on('close', function() {
- res.end();
- });
- file.on('error', function(error) {
- self.sendError_(req, res, error);
- });
- }
-};
-
-StaticServlet.prototype.sendDirectory_ = function(req, res, path) {
- var self = this;
- if (path.match(/[^\/]$/)) {
- req.url.pathname += '/';
- var redirectUrl = url.format(url.parse(url.format(req.url)));
- return self.sendRedirect_(req, res, redirectUrl);
- }
- fs.readdir(path, function(err, files) {
- if (err)
- return self.sendError_(req, res, error);
-
- if (!files.length)
- return self.writeDirectoryIndex_(req, res, path, []);
-
- var remaining = files.length;
- files.forEach(function(fileName, index) {
- fs.stat(path + '/' + fileName, function(err, stat) {
- if (err)
- return self.sendError_(req, res, err);
- if (stat.isDirectory()) {
- files[index] = fileName + '/';
- }
- if (!(--remaining))
- return self.writeDirectoryIndex_(req, res, path, files);
- });
- });
- });
-};
-
-StaticServlet.prototype.writeDirectoryIndex_ = function(req, res, path, files) {
- path = path.substring(1);
- res.writeHead(200, {
- 'Content-Type': 'text/html'
- });
- if (req.method === 'HEAD') {
- res.end();
- return;
- }
- res.write('\n');
- res.write('' + escapeHtml(path) + '\n');
- res.write('\n');
- res.write('Directory: ' + escapeHtml(path) + '
');
- res.write('');
- files.forEach(function(fileName) {
- if (fileName.charAt(0) !== '.') {
- res.write('- ' +
- escapeHtml(fileName) + '
');
- }
- });
- res.write('
');
- res.end();
-};
-
-// Must be last,
-main(process.argv);
diff --git a/sample/start_dashboard_html.html b/sample/start_dashboard_html.html
deleted file mode 100644
index 89af4f66c75..00000000000
--- a/sample/start_dashboard_html.html
+++ /dev/null
@@ -1,55 +0,0 @@
-
-
-
-
-
-
-
-
-
- - Ctrl+S saves the current dashboard
- - Ctrl+F Opens the dashboard finder
- - Ctrl+H Hide/show row controls
- - Click and drag graph title to move panel
- - Hit Escape to exit graph when in fullscreen or edit mode
- - Click the colored icon in the legend to change series color
- - Ctrl or Shift + Click legend name to hide other series
-
-
-
diff --git a/src/app/directives/dropdown.typeahead.js b/src/app/directives/dropdown.typeahead.js
index 56203ee3c6f..0ab2d0045fb 100644
--- a/src/app/directives/dropdown.typeahead.js
+++ b/src/app/directives/dropdown.typeahead.js
@@ -12,10 +12,10 @@ function (angular, app, _, $) {
.directive('dropdownTypeahead', function($compile) {
var inputTemplate = '';
- var buttonTemplate = '';
diff --git a/src/app/directives/graphiteSegment.js b/src/app/directives/graphiteSegment.js
index f0116bc8847..577bbf5d6b7 100644
--- a/src/app/directives/graphiteSegment.js
+++ b/src/app/directives/graphiteSegment.js
@@ -11,10 +11,10 @@ function (angular, app, _, $) {
.module('grafana.directives')
.directive('graphiteSegment', function($compile, $sce) {
var inputTemplate = '';
- var buttonTemplate = '';
+ var buttonTemplate = '';
return {
link: function($scope, elem) {
diff --git a/src/app/directives/templateParamSelector.js b/src/app/directives/templateParamSelector.js
index 194dfbdcb40..5ff6eaa0038 100644
--- a/src/app/directives/templateParamSelector.js
+++ b/src/app/directives/templateParamSelector.js
@@ -11,10 +11,10 @@ function (angular, app, _, $) {
.module('grafana.directives')
.directive('templateParamSelector', function($compile) {
var inputTemplate = '';
- var buttonTemplate = '{{variable.current.text}}';
+ var buttonTemplate = '{{variable.current.text}}';
return {
link: function($scope, elem) {
diff --git a/src/app/features/graphite/addGraphiteFunc.js b/src/app/features/graphite/addGraphiteFunc.js
index 47fe8206c92..89ce9e79ca4 100644
--- a/src/app/features/graphite/addGraphiteFunc.js
+++ b/src/app/features/graphite/addGraphiteFunc.js
@@ -12,10 +12,10 @@ function (angular, app, _, $, gfunc) {
.module('grafana.directives')
.directive('graphiteAddFunc', function($compile) {
var inputTemplate = '';
- var buttonTemplate = '';
diff --git a/src/app/features/graphite/funcEditor.js b/src/app/features/graphite/funcEditor.js
index 62352aea389..63ee4b3f7cf 100644
--- a/src/app/features/graphite/funcEditor.js
+++ b/src/app/features/graphite/funcEditor.js
@@ -12,10 +12,10 @@ function (angular, _, $) {
var funcSpanTemplate = '{{func.def.name}}(';
var paramTemplate = '';
+ ' class="input-mini tight-form-func-param">';
var funcControlsTemplate =
- '