ignite-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From sboi...@apache.org
Subject [05/45] ignite git commit: Ignite Web Console speed up bundle rebuild and watch. Minor fixes.
Date Wed, 20 Jul 2016 09:29:16 GMT
http://git-wip-us.apache.org/repos/asf/ignite/blob/c38b3ba2/modules/web-console/src/main/js/gulpfile.babel.js/tasks/eslint.js
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/gulpfile.babel.js/tasks/eslint.js b/modules/web-console/src/main/js/gulpfile.babel.js/tasks/eslint.js
deleted file mode 100644
index 2d60037..0000000
--- a/modules/web-console/src/main/js/gulpfile.babel.js/tasks/eslint.js
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import gulp from 'gulp';
-import cache from 'gulp-cached';
-import eslint from 'gulp-eslint';
-import sequence from 'gulp-sequence';
-
-const paths = [
-    './app/**/*.js',
-    './controllers/**/*.js',
-    './generator/**/*.js',
-    './ignite_modules_temp/**/*.js',
-    './gulpfile.babel.js/**/*.js',
-    './gulpfile.babel.js/*.js'
-];
-
-gulp.task('eslint:node', () =>
-	gulp.src('./serve/**/*.js')
-        .pipe(cache('eslint:node'))
-		.pipe(eslint({envs: ['node']}))
-		.pipe(eslint.format())
-);
-
-gulp.task('eslint:browser', () =>
-	gulp.src(paths)
-        .pipe(cache('eslint:browser'))
-		.pipe(eslint({envs: ['browser']}))
-		.pipe(eslint.format())
-);
-
-gulp.task('eslint', (cb) => sequence('eslint:browser', 'eslint:node', cb));

http://git-wip-us.apache.org/repos/asf/ignite/blob/c38b3ba2/modules/web-console/src/main/js/gulpfile.babel.js/tasks/ignite-modules.js
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/gulpfile.babel.js/tasks/ignite-modules.js b/modules/web-console/src/main/js/gulpfile.babel.js/tasks/ignite-modules.js
index b1b1190..b97de7c 100644
--- a/modules/web-console/src/main/js/gulpfile.babel.js/tasks/ignite-modules.js
+++ b/modules/web-console/src/main/js/gulpfile.babel.js/tasks/ignite-modules.js
@@ -19,8 +19,7 @@ import gulp from 'gulp';
 import inject from 'gulp-inject';
 import clean from 'gulp-rimraf';
 import sequence from 'gulp-sequence';
-
-import { appModulePaths, igniteModulesTemp } from '../paths';
+import {appModulePaths, igniteModulesTemp} from '../paths';
 
 gulp.task('ignite:modules', (cb) => sequence('ignite:modules:copy', 'ignite:modules:inject', cb));
 
@@ -37,7 +36,7 @@ gulp.task('ignite:modules:inject', () =>
             transform: (filePath) => {
                 const igniteModuleName = filePath.replace(/.*ignite_modules_temp\/([^\/]+).*/mgi, '$1');
 
-                // return file contents as string
+                // Return file contents as string.
                 return `import './${igniteModuleName}/main';`;
             }
         }))
@@ -47,10 +46,10 @@ gulp.task('ignite:modules:inject', () =>
             transform: (filePath, file, i) => {
                 const igniteModuleName = filePath.replace(/.*ignite_modules_temp\/([^\/]+).*/mgi, '$1');
 
-                // return file contents as string
+                // Return file contents as string.
                 return (i ? ',' : '') + `'ignite-console.${igniteModuleName}'`;
             }
         }))
-        .pipe(clean({ force: true }))
+        .pipe(clean({force: true}))
         .pipe(gulp.dest(igniteModulesTemp))
 );

http://git-wip-us.apache.org/repos/asf/ignite/blob/c38b3ba2/modules/web-console/src/main/js/gulpfile.babel.js/tasks/sass.js
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/gulpfile.babel.js/tasks/sass.js b/modules/web-console/src/main/js/gulpfile.babel.js/tasks/sass.js
deleted file mode 100644
index 13dc502..0000000
--- a/modules/web-console/src/main/js/gulpfile.babel.js/tasks/sass.js
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import gulp from 'gulp';
-import sass from 'gulp-sass';
-
-gulp.task('sass', () =>
-    gulp.src('./public/stylesheets/style.scss')
-        .pipe(sass({ outputStyle: 'nested' }).on('error', sass.logError))
-        .pipe(gulp.dest('./public/stylesheets'))
-);

http://git-wip-us.apache.org/repos/asf/ignite/blob/c38b3ba2/modules/web-console/src/main/js/gulpfile.babel.js/tasks/watch.js
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/gulpfile.babel.js/tasks/watch.js b/modules/web-console/src/main/js/gulpfile.babel.js/tasks/watch.js
index 8666999..c179f9c 100644
--- a/modules/web-console/src/main/js/gulpfile.babel.js/tasks/watch.js
+++ b/modules/web-console/src/main/js/gulpfile.babel.js/tasks/watch.js
@@ -18,22 +18,14 @@
 import gulp from 'gulp';
 import sequence from 'gulp-sequence';
 
-import { sassPaths, jadePaths, jadeModulePaths, resourcePaths, resourceModulePaths, appPaths, appModulePaths } from '../paths';
+import { jadePaths, jadeModulePaths, resourcePaths, resourceModulePaths, appModulePaths } from '../paths';
 
-gulp.task('watch:sass', (cb) => sequence('sass', 'bundle:ignite:app', cb));
-
-gulp.task('watch:ignite-modules', (cb) => sequence('clean:ignite-modules-temp', 'ignite:modules', ['eslint:browser', 'copy:ignite_modules:js', 'bundle:ignite:app'], cb));
-
-// Build + connect + watch task.
-gulp.task('watch', ['build', 'connect'], () => {
-    gulp.watch(sassPaths, ['watch:sass']);
+gulp.task('watch:ignite-modules', (cb) => sequence('clean:ignite-modules-temp', 'ignite:modules', cb));
 
+// Build + watch task.
+gulp.task('watch', ['build'], () => {
     gulp.watch(jadePaths.concat(jadeModulePaths), ['jade']);
-
-    gulp.watch(resourcePaths, ['copy:resource']);
-    gulp.watch(resourceModulePaths, ['copy:ignite_modules:resource']);
-
-    gulp.watch(appPaths, ['eslint:browser', 'copy:js', 'bundle:ignite:app']);
+    gulp.watch(resourcePaths, ['copy:resource:app']);
+    gulp.watch(resourceModulePaths, ['copy:resource:ignite_modules']);
     gulp.watch(appModulePaths, ['watch:ignite-modules']);
 });
-

http://git-wip-us.apache.org/repos/asf/ignite/blob/c38b3ba2/modules/web-console/src/main/js/gulpfile.babel.js/webpack/common.js
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/gulpfile.babel.js/webpack/common.js b/modules/web-console/src/main/js/gulpfile.babel.js/webpack/common.js
new file mode 100644
index 0000000..237f2e7
--- /dev/null
+++ b/modules/web-console/src/main/js/gulpfile.babel.js/webpack/common.js
@@ -0,0 +1,192 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import path from 'path';
+import fs from 'fs';
+import webpack from 'webpack';
+import autoprefixer from 'autoprefixer-core';
+import jade from 'jade';
+import progressPlugin from './plugins/progress';
+import eslintFormatter from 'eslint-friendly-formatter';
+
+import ExtractTextPlugin from 'extract-text-webpack-plugin';
+import HtmlWebpackPlugin from 'html-webpack-plugin';
+
+import {srcDir, destDir, rootDir} from '../paths';
+
+const NODE_ENV = process.env.NODE_ENV || 'production';
+const development = NODE_ENV === 'development';
+const node_modules_path = path.resolve('node_modules');
+const cssLoader = 'css-loader?sourceMap!postcss-loader';
+const stylesLoader = cssLoader + '!sass-loader?outputStyle=expanded&sourceMap=true&sourceMapContents=true';
+
+let favicon;
+
+try {
+    fs.accessSync('build/ignite_modules/favicon.ico', fs.F_OK);
+
+    favicon = 'build/ignite_modules/favicon.ico';
+} catch (ignore) {
+    favicon = 'build/favicon.ico';
+}
+
+export default () => {
+    return {
+        node: {
+            fs: 'empty'
+        },
+
+        // Entry points.
+        entry: {
+            polyfill: 'babel-polyfill',
+            app: path.join(srcDir, 'app.js'),
+            vendor: path.join(srcDir, 'vendor.js')
+        },
+
+        // Output system.
+        output: {
+            path: destDir,
+            publicPath: './',
+            filename: '[name].js'
+        },
+
+        // Resolves modules.
+        resolve: {
+            extensions: [
+                '',
+                '.js'
+            ],
+            root: [rootDir],
+            modulesDirectories: [
+                node_modules_path,
+                './'
+            ]
+        },
+
+        // Modules resolvers.
+        /* global require */
+        module: {
+            noParse: [],
+            preLoaders: [
+                {
+                    test: /\.js$/,
+                    exclude: [node_modules_path],
+                    loader: 'eslint-loader'
+                }
+            ],
+            loaders: [
+                {
+                    test: /\.json$/,
+                    loader: 'json-loader'
+                },
+                {
+                    test: /\.jade$/,
+                    loaders: [
+                        `ngtemplate-loader?relativeTo=${rootDir}`,
+                        'html-loader?attrs[]=img:src&attrs[]=img:data-src',
+                        'jade-html-loader'
+                    ]
+                },
+                {
+                    test: /\.js$/,
+                    exclude: [node_modules_path],
+                    loaders: ['ng-annotate-loader']
+                },
+                {
+                    test: /\.js$/,
+                    exclude: [node_modules_path],
+                    loader: 'babel-loader',
+                    query: {
+                        cacheDirectory: true,
+                        plugins: ['transform-runtime',
+                            'add-module-exports'],
+                        presets: ['angular']
+
+                    }
+                },
+                {
+                    test: /\.css$/,
+                    loader: development ? `style-loader!${cssLoader}` : ExtractTextPlugin.extract('style-loader', cssLoader)
+                },
+                {
+                    test: /\.(scss|sass)$/,
+                    loader: development ? `style-loader!${stylesLoader}` : ExtractTextPlugin.extract('style-loader', stylesLoader)
+                },
+                {
+                    test: /\.(woff2|woff|ttf|eot|svg)?(\?v=[0-9]\.[0-9]\.[0-9])?$/,
+                    loaders: [
+                        'file-loader?name=assets/fonts/[name].[ext]'
+                    ]
+                },
+                {
+                    test: /\.(jpe?g|png|gif)$/i,
+                    loaders: ['file-loader?name=assets/images/[name]_[hash].[ext]']
+                },
+                {
+                    test: require.resolve('jquery'),
+                    loaders: [
+                        'expose-loader?$',
+                        'expose-loader?jQuery'
+                    ]
+                },
+                {
+                    test: require.resolve('nvd3'),
+                    loaders: [
+                        'expose-loader?nv'
+                    ]
+                }
+            ]
+        },
+
+        // Postcss configuration.
+        postcss: [autoprefixer({browsers: ['last 2 versions']})],
+
+        // ESLint loader configuration.
+        eslint: {
+            failOnWarning: false,
+            failOnError: false,
+            formatter: eslintFormatter
+        },
+
+        // Load plugins.
+        plugins: [
+            new webpack.ProvidePlugin({
+                $: 'jquery',
+                jQuery: 'jquery',
+                _: 'lodash',
+                nv: 'nvd3'
+            }),
+            new webpack.DefinePlugin({NODE_ENV: JSON.stringify(NODE_ENV)}),
+            // new webpack.NoErrorsPlugin(),
+            new webpack.optimize.DedupePlugin(),
+            new webpack.optimize.CommonsChunkPlugin({
+                name: 'common',
+                chunks: ['vendor', 'app']
+            }),
+            new webpack.optimize.AggressiveMergingPlugin({moveToParents: true}),
+            new ExtractTextPlugin('assets/css/[name]' + (development ? '' : '.[chunkhash]') + '.css', {allChunks: true}),
+            new HtmlWebpackPlugin({
+                filename: 'index.html',
+                templateContent: () => {
+                    return jade.renderFile(path.join(rootDir, 'views', 'index.jade'));
+                },
+                favicon
+            }),
+            progressPlugin
+        ]
+    };
+};

http://git-wip-us.apache.org/repos/asf/ignite/blob/c38b3ba2/modules/web-console/src/main/js/gulpfile.babel.js/webpack/environments/development.js
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/gulpfile.babel.js/webpack/environments/development.js b/modules/web-console/src/main/js/gulpfile.babel.js/webpack/environments/development.js
new file mode 100644
index 0000000..aad4b37
--- /dev/null
+++ b/modules/web-console/src/main/js/gulpfile.babel.js/webpack/environments/development.js
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import webpack from 'webpack';
+import {destDir, rootDir} from '../../paths';
+
+export default () => {
+    const plugins = [
+        new webpack.HotModuleReplacementPlugin()
+    ];
+
+    return {
+        context: rootDir,
+        debug: true,
+        devtool: 'source-map',
+        watch: true,
+        devServer: {
+            historyApiFallback: true,
+            publicPath: '/',
+            contentBase: destDir,
+            info: true,
+            hot: true,
+            inline: true,
+            proxy: {
+                '/socket.io': {
+                    target: 'http://localhost:3000',
+                    changeOrigin: true,
+                    ws: true
+                },
+                '/api/v1/*': {
+                    target: 'http://localhost:3000',
+                    changeOrigin: true,
+                    rewrite: (req) => {
+                        req.url = req.url.replace(/^\/api\/v1/, '');
+
+                        return req;
+                    }
+                }
+            },
+            watchOptions: {
+                aggregateTimeout: 1000,
+                poll: 1000
+            },
+            stats: {colors: true},
+            port: 9000
+        },
+        stats: {colors: true},
+        plugins
+    };
+};

http://git-wip-us.apache.org/repos/asf/ignite/blob/c38b3ba2/modules/web-console/src/main/js/gulpfile.babel.js/webpack/environments/production.js
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/gulpfile.babel.js/webpack/environments/production.js b/modules/web-console/src/main/js/gulpfile.babel.js/webpack/environments/production.js
new file mode 100644
index 0000000..db66720
--- /dev/null
+++ b/modules/web-console/src/main/js/gulpfile.babel.js/webpack/environments/production.js
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import webpack from 'webpack';
+
+import {destDir, rootDir} from '../../paths';
+
+export default () => {
+    const plugins = [
+        new webpack.optimize.UglifyJsPlugin({
+            path: destDir,
+            minimize: true,
+            warnings: false,
+            sourceMap: false,
+            mangle: true
+        })
+    ];
+
+    return {
+        context: rootDir,
+        bail: true, // Cancel build on error.
+        debug: false,
+        devtool: 'cheap-source-map',
+        output: {
+            publicPath: '/',
+            filename: '[name].[chunkhash].js',
+            path: destDir
+        },
+        plugins
+    };
+};

http://git-wip-us.apache.org/repos/asf/ignite/blob/c38b3ba2/modules/web-console/src/main/js/gulpfile.babel.js/webpack/index.js
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/gulpfile.babel.js/webpack/index.js b/modules/web-console/src/main/js/gulpfile.babel.js/webpack/index.js
new file mode 100644
index 0000000..6682f9c
--- /dev/null
+++ b/modules/web-console/src/main/js/gulpfile.babel.js/webpack/index.js
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import _ from 'lodash';
+import commonConfig from './common';
+import devConfig from './environments/development';
+import prodConfig from './environments/production';
+
+const env = process.env.NODE_ENV || 'production';
+
+// Config by environments.
+const configs = {
+    production: prodConfig,
+    development: devConfig
+};
+
+// Load config file by environment
+export default _.merge(commonConfig(), configs[env]());

http://git-wip-us.apache.org/repos/asf/ignite/blob/c38b3ba2/modules/web-console/src/main/js/gulpfile.babel.js/webpack/plugins/progress.js
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/gulpfile.babel.js/webpack/plugins/progress.js b/modules/web-console/src/main/js/gulpfile.babel.js/webpack/plugins/progress.js
new file mode 100644
index 0000000..5f753c7
--- /dev/null
+++ b/modules/web-console/src/main/js/gulpfile.babel.js/webpack/plugins/progress.js
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import ProgressPlugin from 'webpack/lib/ProgressPlugin';
+
+let chars = 0;
+let lastState = 0;
+let lastStateTime = 0;
+
+const outputStream = process.stdout;
+
+const _goToLineStart = (nextMessage) => {
+    let str = '';
+
+    for (; chars > nextMessage.length; chars--)
+        str += '\b \b';
+
+    chars = nextMessage.length;
+
+    for (let i = 0; i < chars; i++)
+        str += '\b';
+
+    if (str)
+        outputStream.write(str);
+};
+
+export default new ProgressPlugin((percentage, msg) => {
+    let state = msg;
+
+    if (percentage < 1) {
+        percentage = Math.floor(percentage * 100);
+
+        msg = percentage + '% ' + msg;
+
+        if (percentage < 100)
+            msg = ' ' + msg;
+
+        if (percentage < 10)
+            msg = ' ' + msg;
+    }
+
+    state = state.replace(/^\d+\/\d+\s+/, '');
+
+    if (percentage === 0) {
+        lastState = null;
+        lastStateTime = (new Date()).getTime();
+    }
+    else if (state !== lastState || percentage === 1) {
+        const now = (new Date()).getTime();
+
+        if (lastState) {
+            const stateMsg = (now - lastStateTime) + 'ms ' + lastState;
+
+            _goToLineStart(stateMsg);
+
+            outputStream.write(stateMsg + '\n');
+
+            chars = 0;
+        }
+
+        lastState = state;
+        lastStateTime = now;
+    }
+
+    _goToLineStart(msg);
+
+    outputStream.write(msg);
+});

http://git-wip-us.apache.org/repos/asf/ignite/blob/c38b3ba2/modules/web-console/src/main/js/package.json
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/package.json b/modules/web-console/src/main/js/package.json
index 776ebdc..b2c648d 100644
--- a/modules/web-console/src/main/js/package.json
+++ b/modules/web-console/src/main/js/package.json
@@ -4,8 +4,9 @@
   "description": "Interactive Web console for configuration, executing SQL queries and monitoring of Apache Ignite Cluster",
   "private": true,
   "scripts": {
-    "start": "jspm i && gulp build --debug && node serve",
-    "eslint": "node_modules/.bin/gulp eslint"
+    "dev": "cross-env NODE_ENV=development gulp watch",
+    "build": "cross-env NODE_ENV=production gulp build",
+    "eslint": "eslint --env node --format node_modules/eslint-friendly-formatter gulpfile.babel.js/ serve/ app/ controllers/ generator/ ignite_modules/ ignite_modules_temp/"
   },
   "author": "",
   "contributors": [
@@ -18,254 +19,110 @@
   "keywords": "grid",
   "homepage": "https://ignite.apache.org/",
   "engines": {
-    "node": ">=0.12.4"
+    "npm": "^3.x.x",
+    "node": "^4.x.x"
   },
+  "os": [
+    "darwin",
+    "linux",
+    "win32"
+  ],
   "dependencies": {
-    "async": "1.5.2",
+    "angular": "^1.5.5",
+    "angular-animate": "^1.5.5",
+    "angular-aria": "^1.5.5",
+    "angular-cookies": "^1.5.5",
+    "angular-drag-and-drop-lists": "^1.4.0",
+    "angular-gridster": "^0.13.3",
+    "angular-motion": "^0.4.4",
+    "angular-nvd3": "^1.0.7",
+    "angular-retina": "^0.3.13",
+    "angular-sanitize": "^1.5.5",
+    "angular-smart-table": "^2.1.8",
+    "angular-socket-io": "^0.7.0",
+    "angular-strap": "^2.3.8",
+    "angular-touch": "^1.5.5",
+    "angular-tree-control": "^0.2.26",
+    "angular-ui-grid": "^3.1.1",
+    "angular-ui-router": "^0.3.1",
     "body-parser": "^1.15.0",
     "bootstrap-sass": "^3.3.6",
+    "brace": "^0.8.0",
     "connect-mongo": "^1.1.0",
     "cookie-parser": "~1.4.0",
-    "debug": "~2.2.0",
-    "express": "~4.13.3",
+    "es6-promise": "^3.0.2",
+    "express": "^4.14.0",
     "express-session": "^1.12.0",
+    "file-saver": "^1.3.2",
     "fire-up": "^1.0.0",
-    "jade": "~1.11.0",
-    "jszip": "^2.6.0",
+    "font-awesome": "^4.6.3",
+    "glob": "^7.0.3",
+    "jquery": "^3.0.0",
+    "jszip": "^3.0.0",
     "lodash": "^4.8.2",
     "mongoose": "^4.4.11",
     "mongoose-deep-populate": "^3.0.0",
     "nconf": "^0.8.2",
     "nodemailer": "^2.3.0",
+    "nvd3": "^1.8.3",
     "passport": "^0.3.2",
     "passport-local": "^1.0.0",
     "passport-local-mongoose": "^4.0.0",
     "passport.socketio": "^3.6.1",
+    "query-command-supported": "^1.0.0",
     "require-dir": "^0.3.0",
     "socket.io": "^1.4.5",
+    "socket.io-client": "^1.4.6",
+    "ui-router-metatags": "^1.0.3",
     "ws": "^0.8.0"
   },
   "devDependencies": {
-    "babel-core": "^6.7.2",
-    "babel-eslint": "^6.0.2",
-    "babel-preset-es2015": "^6.6.0",
-    "babel-register": "^6.7.2",
-    "gulp": "^3.9.0",
-    "gulp-cached": "^1.1.0",
-    "gulp-connect": "^3.2.2",
-    "gulp-environments": "^0.1.1",
+    "assets-webpack-plugin": "^3.2.0",
+    "autoprefixer-core": "^6.0.1",
+    "babel-core": "^6.7.6",
+    "babel-eslint": "^6.0.4",
+    "babel-loader": "^6.2.4",
+    "babel-plugin-add-module-exports": "^0.2.1",
+    "babel-plugin-transform-runtime": "^6.7.5",
+    "babel-polyfill": "^6.7.4",
+    "babel-preset-angular": "^6.0.15",
+    "babel-runtime": "^6.6.1",
+    "bootstrap-loader": "^1.0.10",
+    "cross-env": "^1.0.7",
+    "css-loader": "^0.23.0",
+    "eslint": "^2.9.0",
+    "eslint-friendly-formatter": "^2.0.5",
+    "eslint-loader": "^1.0.0",
+    "expose-loader": "^0.7.1",
+    "extract-text-webpack-plugin": "^1.0.1",
+    "file-loader": "^0.9.0",
+    "gulp": "^3.9.1",
     "gulp-eslint": "^2.0.0",
-    "gulp-html-replace": "^1.5.5",
-    "gulp-ignore": "^2.0.1",
     "gulp-inject": "^4.0.0",
     "gulp-jade": "^1.1.0",
     "gulp-rimraf": "^0.2.0",
-    "gulp-sass": "^2.1.0",
     "gulp-sequence": "^0.4.1",
     "gulp-util": "^3.0.7",
-    "http-proxy-middleware": "^0.13.0",
-    "jspm": "^0.16.32",
-    "mocha": "~2.4.5",
+    "html-loader": "^0.4.3",
+    "html-webpack-plugin": "^2.21.0",
+    "imagemin-pngquant": "^5.0.0",
+    "jade": "^1.11.0",
+    "jade-html-loader": "0.0.3",
+    "json-loader": "^0.5.4",
+    "mocha": "~2.5.3",
     "morgan": "^1.7.0",
-    "should": "^8.3.0",
-    "supertest": "^1.1.0"
-  },
-  "jspm": {
-    "directories": {
-      "packages": "build/jspm_packages"
-    },
-    "configFile": "build/system.config.js",
-    "dependencies": {
-      "ace": "github:ajaxorg/ace-builds@1.2.3",
-      "angular": "github:angular/bower-angular@^1.5.0",
-      "angular-animate": "github:angular/bower-angular-animate@^1.5.0",
-      "angular-drag-and-drop-lists": "github:marceljuenemann/angular-drag-and-drop-lists@^1.3.0",
-      "angular-gridster": "github:ManifestWebDesign/angular-gridster@^0.13.5",
-      "angular-motion": "github:mgcrea/angular-motion@^0.4.3",
-      "angular-nvd3": "github:krispo/angular-nvd3@^1.0.4",
-      "angular-retina": "github:jrief/angular-retina@0.3.8",
-      "angular-sanitize": "github:angular/bower-angular-sanitize@^1.5.0",
-      "angular-smart-table": "github:lorenzofox3/Smart-Table@^2.1.4",
-      "angular-socket-io": "github:btford/angular-socket-io@^0.7.0",
-      "angular-strap": "github:mgcrea/angular-strap@2.3.8",
-      "angular-tree-control": "github:wix/angular-tree-control@^0.2.23",
-      "angular-ui-grid": "github:angular-ui/bower-ui-grid@^3.0.7",
-      "angular-ui-router": "github:angular-ui/ui-router@^0.2.15",
-      "angular-ui-router-metatags": "github:tinusn/ui-router-metatags@^1.0.3",
-      "blob": "github:eligrey/Blob.js@master",
-      "bootstrap-carousel": "github:twbs/bootstrap@^3.3.6",
-      "css": "github:systemjs/plugin-css@^0.1.20",
-      "file-saver": "github:eligrey/FileSaver.js@master",
-      "font-awesome": "npm:font-awesome@4.5.0",
-      "jade": "github:johnsoftek/plugin-jade@^0.6.0",
-      "jquery": "github:components/jquery@^2.1.4",
-      "json": "github:systemjs/plugin-json@^0.1.0",
-      "jszip": "github:Stuk/jszip@^2.5.0",
-      "lodash": "github:lodash/lodash@^4.2.6",
-      "pdfmake": "github:bpampuch/pdfmake@^0.1.20",
-      "query-command-supported": "github:zenorocha/document.queryCommandSupported@^1.0.0",
-      "socket.io-client": "github:socketio/socket.io-client@1.4.5",
-      "text": "github:systemjs/plugin-text@^0.0.7"
-    },
-    "devDependencies": {
-      "babel": "npm:babel-core@^5.8.24",
-      "babel-runtime": "npm:babel-runtime@^5.8.24",
-      "clean-css": "npm:clean-css@^3.4.8",
-      "core-js": "npm:core-js@^1.1.4"
-    },
-    "overrides": {
-      "github:angular/bower-angular@1.5.0": {
-        "format": "global",
-        "dependencies": {
-          "jquery": "github:components/jquery@^2.1.4"
-        },
-        "shim": {
-          "angular": {
-            "deps": [
-              "jquery"
-            ]
-          }
-        }
-      },
-      "github:btford/angular-socket-io@0.7.0": {
-        "dependencies": {
-          "socket.io-client": "github:socketio/socket.io-client@1.4.5"
-        }
-      },
-      "github:socketio/socket.io-client@1.4.5": {
-        "format": "global",
-        "main": "socket.io",
-        "shim": {
-          "socket.io": {
-            "exports": "io"
-          }
-        }
-      },
-      "github:Stuk/jszip@2.5.0": {
-        "format": "global",
-        "main": "./dist/jszip"
-      },
-      "github:bpampuch/pdfmake@0.1.20": {
-        "format": "global",
-        "main": "vfs_fonts",
-        "shim": {
-          "vfs_fonts": {
-            "deps": [
-              "./pdfmake"
-            ],
-            "exports": "pdfMake"
-          }
-        }
-      },
-      "github:zenorocha/document.queryCommandSupported@1.0.0": {
-        "format": "global"
-      },
-      "github:krispo/angular-nvd3@1.0.4": {
-        "main": "dist/angular-nvd3",
-        "dependencies": {
-          "nvd3": "npm:nvd3@1.8.1",
-          "d3": "npm:d3@3.5.14"
-        },
-        "shim": {
-          "dist/angular-nvd3": {
-            "deps": [
-              "d3",
-              "nvd3",
-              "nvd3/build/nv.d3.css!"
-            ]
-          }
-        }
-      },
-      "github:components/jquery@2.1.4": {
-        "format": "global"
-      },
-      "github:ajaxorg/ace-builds@1.2.3": {
-        "format": "global",
-        "main": "theme-chrome",
-        "shim": {
-          "theme-chrome": {
-            "exports": "ace",
-            "deps": [
-              "./ace",
-              "./mode-xml",
-              "./mode-java",
-              "./mode-sql",
-              "./ext-language_tools",
-              "./mode-dockerfile"
-            ]
-          },
-          "ace": {
-            "exports": "ace"
-          },
-          "mode-xml": {
-            "deps": [
-              "./ace"
-            ]
-          },
-          "mode-java": {
-            "deps": [
-              "./ace"
-            ]
-          },
-          "mode-sql": {
-            "deps": [
-              "./ace"
-            ]
-          },
-          "ext-language_tools": {
-            "deps": [
-              "./ace"
-            ]
-          },
-          "worker-xml": {
-            "deps": [
-              "./ace"
-            ]
-          },
-          "mode-dockerfile": {
-            "deps": [
-              "./ace"
-            ]
-          }
-        }
-      },
-      "github:angular-ui/bower-ui-grid@3.0.7": {
-        "dependencies": {
-          "pdfmake": "github:bpampuch/pdfmake@^0.1.20"
-        }
-      },
-      "github:mgcrea/angular-strap@2.3.8": {
-        "directories": {
-          "lib": "dist"
-        },
-        "main": "angular-strap.tpl",
-        "dependencies": {
-          "angular": "^1",
-          "angular-animate": "github:angular/bower-angular-animate@^1.5.0",
-          "angular-motion": "github:mgcrea/angular-motion@^0.4.3",
-          "angular-sanitize": "github:angular/bower-angular-sanitize@^1.5.0"
-        },
-        "shim": {
-          "angular-strap.tpl": {
-            "deps": [
-              "./angular-strap",
-              "angular"
-            ]
-          }
-        }
-      },
-      "github:eligrey/FileSaver.js@master": {
-        "format": "global",
-        "dependencies": {
-          "blob": "github:eligrey/Blob.js@master"
-        }
-      },
-      "github:eligrey/Blob.js@master": {
-        "format": "global"
-      },
-      "github:jrief/angular-retina@0.3.8": {
-        "main": "build/angular-retina.min"
-      }
-    }
+    "ng-annotate-loader": "0.1.0",
+    "ngtemplate-loader": "^1.3.1",
+    "node-sass": "^3.4.2",
+    "postcss-loader": "^0.9.1",
+    "resolve-url-loader": "^1.4.3",
+    "sass-loader": "^3.1.1",
+    "should": "^9.0.2",
+    "style-loader": "^0.13.1",
+    "supertest": "^1.1.0",
+    "url": "^0.11.0",
+    "url-loader": "^0.5.6",
+    "webpack": "^1.13.1",
+    "webpack-dev-server": "^1.14.1"
   }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/c38b3ba2/modules/web-console/src/main/js/public/stylesheets/_font-awesome-custom.scss
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/public/stylesheets/_font-awesome-custom.scss b/modules/web-console/src/main/js/public/stylesheets/_font-awesome-custom.scss
index 6ce9550..514acc2 100644
--- a/modules/web-console/src/main/js/public/stylesheets/_font-awesome-custom.scss
+++ b/modules/web-console/src/main/js/public/stylesheets/_font-awesome-custom.scss
@@ -15,17 +15,18 @@
  * limitations under the License.
  */
 
-@import "../../build/jspm_packages/npm/font-awesome@4.5.0/scss/variables";
-$fa-font-path: "/jspm_packages/npm/font-awesome@4.5.0/fonts";
+@import '~font-awesome/scss/variables';
 
-@import "../../build/jspm_packages/npm/font-awesome@4.5.0/scss/mixins";
-@import "../../build/jspm_packages/npm/font-awesome@4.5.0/scss/path";
-@import "../../build/jspm_packages/npm/font-awesome@4.5.0/scss/core";
-@import "../../build/jspm_packages/npm/font-awesome@4.5.0/scss/larger";
-@import "../../build/jspm_packages/npm/font-awesome@4.5.0/scss/fixed-width";
-@import "../../build/jspm_packages/npm/font-awesome@4.5.0/scss/list";
-@import "../../build/jspm_packages/npm/font-awesome@4.5.0/scss/bordered-pulled";
-@import "../../build/jspm_packages/npm/font-awesome@4.5.0/scss/animated";
-@import "../../build/jspm_packages/npm/font-awesome@4.5.0/scss/rotated-flipped";
-@import "../../build/jspm_packages/npm/font-awesome@4.5.0/scss/stacked";
-@import "../../build/jspm_packages/npm/font-awesome@4.5.0/scss/icons";
+$fa-font-path: 'https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/fonts';
+
+@import '~font-awesome/scss/mixins';
+@import '~font-awesome/scss/path';
+@import '~font-awesome/scss/core';
+@import '~font-awesome/scss/larger';
+@import '~font-awesome/scss/fixed-width';
+@import '~font-awesome/scss/list';
+@import '~font-awesome/scss/bordered-pulled';
+@import '~font-awesome/scss/animated';
+@import '~font-awesome/scss/rotated-flipped';
+@import '~font-awesome/scss/stacked';
+@import '~font-awesome/scss/icons';

http://git-wip-us.apache.org/repos/asf/ignite/blob/c38b3ba2/modules/web-console/src/main/js/public/stylesheets/style.scss
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/public/stylesheets/style.scss b/modules/web-console/src/main/js/public/stylesheets/style.scss
index 2c047ac..9f35637 100644
--- a/modules/web-console/src/main/js/public/stylesheets/style.scss
+++ b/modules/web-console/src/main/js/public/stylesheets/style.scss
@@ -15,9 +15,8 @@
  * limitations under the License.
  */
 
-@import "font-awesome-custom";
-@import "bootstrap-custom";
-
+@import "./font-awesome-custom";
+@import "./bootstrap-custom";
 @import "./variables";
 
 @import "./../../app/directives/information/information.scss";
@@ -26,14 +25,14 @@
     font-family: 'Roboto Slab';
     font-style: normal;
     font-weight: 400;
-    src: local('Roboto Slab Regular'), local('RobotoSlab-Regular'), url(//fonts.gstatic.com/s/robotoslab/v6/y7lebkjgREBJK96VQi37ZiwlidHJgAgmTjOEEzwu1L8.ttf) format('truetype');
+    src: local('Roboto Slab Regular'), local('RobotoSlab-Regular'), url(https://fonts.gstatic.com/s/robotoslab/v6/y7lebkjgREBJK96VQi37ZiwlidHJgAgmTjOEEzwu1L8.ttf) format('truetype');
 }
 
 @font-face {
     font-family: 'Roboto Slab';
     font-style: normal;
     font-weight: 700;
-    src: local('Roboto Slab Bold'), local('RobotoSlab-Bold'), url(//fonts.gstatic.com/s/robotoslab/v6/dazS1PrQQuCxC3iOAJFEJTdGNerWpg2Hn6A-BxWgZ_I.ttf) format('truetype');
+    src: local('Roboto Slab Bold'), local('RobotoSlab-Bold'), url(https://fonts.gstatic.com/s/robotoslab/v6/dazS1PrQQuCxC3iOAJFEJTdGNerWpg2Hn6A-BxWgZ_I.ttf) format('truetype');
 }
 
 hr {
@@ -1927,6 +1926,7 @@ treecontrol.tree-classic {
 
     .ui-grid-cell .ui-grid-cell-contents {
         text-align: center;
+        white-space: pre;
 
         > i.fa {
             cursor: default;

http://git-wip-us.apache.org/repos/asf/ignite/blob/c38b3ba2/modules/web-console/src/main/js/serve/agent.js
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/serve/agent.js b/modules/web-console/src/main/js/serve/agent.js
index 77da925..a529e94 100644
--- a/modules/web-console/src/main/js/serve/agent.js
+++ b/modules/web-console/src/main/js/serve/agent.js
@@ -481,56 +481,57 @@ module.exports.factory = function(_, ws, fs, path, JSZip, socketio, settings, mo
 
             const jarFilter = (file) => path.extname(file) === '.jar';
 
-            for (const archive of agentArchives) {
-                const filePath = path.join(settings.agent.dists, archive);
-
-                const zip = new JSZip(fs.readFileSync(filePath));
-
-                const jarPath = _.find(_.keys(zip.files), jarFilter);
-
-                const jar = new JSZip(zip.files[jarPath].asNodeBuffer());
-
-                const manifest = jar.files['META-INF/MANIFEST.MF']
-                    .asText()
-                    .trim()
-                    .split(/\s*\n+\s*/)
-                    .map((line, r) => {
-                        r = line.split(/\s*:\s*/);
-
-                        this[r[0]] = r[1];
-
-                        return this;
-                    }, {})[0];
+            const agentsPromises = _.map(agentArchives, (fileName) => {
+                const filePath = path.join(settings.agent.dists, fileName);
+
+                return JSZip.loadAsync(fs.readFileSync(filePath))
+                    .then((zip) => {
+                        const jarPath = _.find(_.keys(zip.files), jarFilter);
+
+                        return JSZip.loadAsync(zip.files[jarPath].async('nodebuffer'))
+                            .then((jar) => jar.files['META-INF/MANIFEST.MF'].async('string'))
+                            .then((lines) => lines.trim()
+                                .split(/\s*\n+\s*/)
+                                .map((line, r) => {
+                                    r = line.split(/\s*:\s*/);
+
+                                    this[r[0]] = r[1];
+
+                                    return this;
+                                }, {})[0])
+                            .then((manifest) => {
+                                const ver = manifest['Implementation-Version'];
+                                const buildTime = manifest['Build-Time'];
+
+                                if (ver && buildTime)
+                                    return { fileName, filePath, ver, buildTime };
+                            });
+                    });
+            });
 
-                const ver = manifest['Implementation-Version'];
+            Promise.all(agentsPromises)
+                .then((agents) => {
+                    this.supportedAgents = _.keyBy(_.remove(agents, null), 'ver');
 
-                if (ver) {
-                    this.supportedAgents[ver] = {
-                        fileName: archive,
-                        filePath,
-                        buildTime: manifest['Build-Time']
-                    };
-                }
-            }
+                    const latest = _.head(Object.keys(this.supportedAgents).sort((a, b) => {
+                        const aParts = a.split('.');
+                        const bParts = b.split('.');
 
-            const latest = _.head(Object.keys(this.supportedAgents).sort((a, b) => {
-                const aParts = a.split('.');
-                const bParts = b.split('.');
+                        for (let i = 0; i < aParts.length; ++i) {
+                            if (bParts.length === i)
+                                return 1;
 
-                for (let i = 0; i < aParts.length; ++i) {
-                    if (bParts.length === i)
-                        return 1;
+                            if (aParts[i] === aParts[i])
+                                continue;
 
-                    if (aParts[i] === aParts[i])
-                        continue;
+                            return aParts[i] > bParts[i] ? 1 : -1;
+                        }
+                    }));
 
-                    return aParts[i] > bParts[i] ? 1 : -1;
-                }
-            }));
-
-            // Latest version of agent distribution.
-            if (latest)
-                this.supportedAgents.latest = this.supportedAgents[latest];
+                    // Latest version of agent distribution.
+                    if (latest)
+                        this.supportedAgents.latest = this.supportedAgents[latest];
+                });
         }
 
         attachLegacy(server) {

http://git-wip-us.apache.org/repos/asf/ignite/blob/c38b3ba2/modules/web-console/src/main/js/serve/keys/test.crt
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/serve/keys/test.crt b/modules/web-console/src/main/js/serve/keys/test.crt
deleted file mode 100644
index 50c6d5c..0000000
--- a/modules/web-console/src/main/js/serve/keys/test.crt
+++ /dev/null
@@ -1,13 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIB6zCCAVQCCQDcAphbU6UcLjANBgkqhkiG9w0BAQsFADA6MRIwEAYDVQQDDAls
-b2NhbGhvc3QxJDAiBgkqhkiG9w0BCQEWFXNldmRva2ltb3ZAYXBhY2hlLm9yZzAe
-Fw0xNTA3MTQxMzAyNTNaFw0xODA2MjMxMzAyNTNaMDoxEjAQBgNVBAMMCWxvY2Fs
-aG9zdDEkMCIGCSqGSIb3DQEJARYVc2V2ZG9raW1vdkBhcGFjaGUub3JnMIGfMA0G
-CSqGSIb3DQEBAQUAA4GNADCBiQKBgQDP/zpJrdHqCj6lPpeFF6LQtzKef6UiyBBo
-rbuOtCCgW8KMJJciluBWk2126qLt9smBN4jBpSNU3pq0r9gBMUTd/LSe7aY4D5ED
-Pjp7XsypNVKeHaHbFi7KhfHy0LYxsWiNPmmHJv4dtYOp+pGK25rkXNfyJxxjgxN6
-wo34+MnZIQIDAQABMA0GCSqGSIb3DQEBCwUAA4GBAFk9XEjcdyihws+fVmdGGUFo
-bVxI9YGH6agiNbU3WNF4B4VRzcPPW8z2mEo7eF9kgYmq/YzH4T8tgi/qkL/u8eZV
-Wmi9bg6RThLN6/hj3wVoOFKykbDQ05FFdhIJXN5UOjPmxYM97EKqg6J0W2HAb8SG
-+UekPnmAo/2HTKsLykH8
------END CERTIFICATE-----

http://git-wip-us.apache.org/repos/asf/ignite/blob/c38b3ba2/modules/web-console/src/main/js/serve/keys/test.key
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/serve/keys/test.key b/modules/web-console/src/main/js/serve/keys/test.key
deleted file mode 100644
index 1b395c0..0000000
--- a/modules/web-console/src/main/js/serve/keys/test.key
+++ /dev/null
@@ -1,18 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-Proc-Type: 4,ENCRYPTED
-DEK-Info: DES-EDE3-CBC,6798185330CE2EE2
-
-sOwkmD8rvjx11l09V26dJhLhl+SyPIhyeZ3TqHXrYCATKoXlzidT+uPu1jVYtrwr
-nBLA6TrIDYRrBNlEsqGZ0cSvWTIczzVW1xZKHEJo5q2vUT/W8u/Q1QQtS3P3GeKF
-dEzx496rpZqwwVw59GNbuIwyYoVvQf3iEXzfhplGmLPELYIplDFOLgNuXQyXSGx6
-rwKsCxXMLsDyrA6DCz0Odf08p2HvWk/s5Ne3DFcQlqRNtIrBVGD2O0/Fp8ZZ2I4E
-Yn2OIIWJff3HanOjLOWKdN8YAn5UleNmlEUdIHeS5qaQ68mabOxLkSef9qglV+sd
-FHTtUq0cG6t6nhxZBziexha6v1yl/xABAHHhNPOfak+HthWxRD4N9f1yFYAeTmkn
-4kwBWoSUe12XRf2pGNqhEUKN/KhDmWk85wI55i/Cu2XmNoiBFlS9BXrRYU8uVCJw
-KlxjKTDWl1opCyvxTDxJnMkt44ZT445LRePKVueGIIKSUIXNQypOE+C1I0CL0N2W
-Ts3m9nthquvLeMx92k7b8yW69BER5uac3SIlGCOJObQXsHgyk8wYiyd/zLKfjctG
-PXieaW81UKjp+GqWpvWPz3VqnKwoyUWeVOOTviurli6kYOrHuySTMqMb6hxJctw9
-grAQTT0UPiAKWcM7InLzZnRjco+v9QLLEokjVngXPba16K/CItFY16xuGlaFLW7Y
-XTc67AkL8b76HBZelMjmCsqjvSoULhuMFwTOvUMm/mSM8rMoi9asrJRLQHRMWCST
-/6RENPLzPlOMnNLBujpBbn8V3/aYzEZsHMI+6S3d27WYlTJIqpabSA==
------END RSA PRIVATE KEY-----

http://git-wip-us.apache.org/repos/asf/ignite/blob/c38b3ba2/modules/web-console/src/main/js/serve/routes/agent.js
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/serve/routes/agent.js b/modules/web-console/src/main/js/serve/routes/agent.js
index 020b692..48ec131 100644
--- a/modules/web-console/src/main/js/serve/routes/agent.js
+++ b/modules/web-console/src/main/js/serve/routes/agent.js
@@ -53,26 +53,26 @@ module.exports.factory = function(_, express, fs, JSZip, settings, agentMgr) {
                 if (errFs)
                     return res.download(agentPathZip, agentZip);
 
-                const zip = new JSZip(data);
-
-                const prop = [];
-
-                const host = req.hostname.match(/:/g) ? req.hostname.slice(0, req.hostname.indexOf(':')) : req.hostname;
+                // Set the archive name.
+                res.attachment(agentZip);
 
-                prop.push('tokens=' + req.user.token);
-                prop.push('server-uri=' + (settings.agent.SSLOptions ? 'https' : 'http') + '://' + host + ':' + settings.agent.port);
-                prop.push('#Uncomment following options if needed:');
-                prop.push('#node-uri=http://localhost:8080');
-                prop.push('#driver-folder=./jdbc-drivers');
+                JSZip.loadAsync(data)
+                    .then((zip) => {
+                        const prop = [];
 
-                zip.file(agentFld + '/default.properties', prop.join('\n'));
+                        const host = req.hostname.match(/:/g) ? req.hostname.slice(0, req.hostname.indexOf(':')) : req.hostname;
 
-                const buffer = zip.generate({type: 'nodebuffer', platform: 'UNIX'});
+                        prop.push('tokens=' + req.user.token);
+                        prop.push('server-uri=' + (settings.agent.SSLOptions ? 'https' : 'http') + '://' + host + ':' + settings.agent.port);
+                        prop.push('#Uncomment following options if needed:');
+                        prop.push('#node-uri=http://localhost:8080');
+                        prop.push('#driver-folder=./jdbc-drivers');
 
-                // Set the archive name.
-                res.attachment(agentZip);
+                        zip.file(agentFld + '/default.properties', prop.join('\n'));
 
-                res.send(buffer);
+                        zip.generateAsync({type: 'nodebuffer', platform: 'UNIX'})
+                            .then((buffer) => res.send(buffer));
+                    });
             });
         });
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/c38b3ba2/modules/web-console/src/main/js/views/configuration/domains-import.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/views/configuration/domains-import.jade b/modules/web-console/src/main/js/views/configuration/domains-import.jade
index 23b9434..ccaeb27 100644
--- a/modules/web-console/src/main/js/views/configuration/domains-import.jade
+++ b/modules/web-console/src/main/js/views/configuration/domains-import.jade
@@ -83,7 +83,7 @@ mixin td-ellipses-lbl(w, lbl)
                             .col-xs-8.col-sm-10.col-md-10
                                 i.tipField.fa.fa-question-circle(bs-tooltip='' data-title='Password for connecting to database<br>Note, password would not be saved in preferences for security reasons')
                                 .input-tip
-                                    input.form-control(id='password' type='password' ng-model='selectedPreset.password' on-enter='importDomainNext()')
+                                    input.form-control(id='password' type='password' ng-model='selectedPreset.password' ignite-on-enter='importDomainNext()')
                         .settings-row
                             .checkbox
                                 label

http://git-wip-us.apache.org/repos/asf/ignite/blob/c38b3ba2/modules/web-console/src/main/js/views/configuration/domains.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/views/configuration/domains.jade b/modules/web-console/src/main/js/views/configuration/domains.jade
index 9975df9..7f3253e 100644
--- a/modules/web-console/src/main/js/views/configuration/domains.jade
+++ b/modules/web-console/src/main/js/views/configuration/domains.jade
@@ -30,14 +30,14 @@ include ../../app/helpers/jade/mixins.jade
                     thead
                         tr
                             th
-                                .col-sm-8
-                                    .col-sm-5
+                                .col-sm-9
+                                    .col-sm-6
                                         lable.labelHeader.labelFormField {{domainModelTitle()}}
-                                    .col-sm-7
+                                    .col-sm-6
                                         .pull-right.labelLogin.additional-filter(ng-if='(domains | domainsValidation:false:true).length > 0')
                                             a.labelFormField(ng-if='ui.showValid' ng-click='toggleValid()' bs-tooltip='' data-title='{{::ui.invalidKeyFieldsTooltip}}') Key fields should be configured: {{(displayedRows | domainsValidation:false:true).length}}&nbsp
                                             a.labelFormField(ng-if='!ui.showValid' ng-click='toggleValid()') Show all domain models: {{displayedRows.length}}&nbsp
-                                .col-sm-4
+                                .col-sm-3
                                     input.form-control.pull-right(type='text' st-search='valueType' placeholder='Filter domain models...')
                         tbody
                             tr

http://git-wip-us.apache.org/repos/asf/ignite/blob/c38b3ba2/modules/web-console/src/main/js/views/configuration/summary.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/views/configuration/summary.jade b/modules/web-console/src/main/js/views/configuration/summary.jade
index 830adc1..f367e67 100644
--- a/modules/web-console/src/main/js/views/configuration/summary.jade
+++ b/modules/web-console/src/main/js/views/configuration/summary.jade
@@ -88,7 +88,7 @@ mixin hard-link(ref, txt)
                                 .settings-row
                                     ignite-form-field.col-xs-8.col-sm-8.col-md-7(data-label='Near cache eviction policy')
                                         ignite-form-field-tooltip
-                                            | Cache expiration policy
+                                            | Near cache eviction policy
                                         ignite-form-field-dropdown(
                                             data-id='evictionPolicies'
                                             data-name='evictionPolicies'

http://git-wip-us.apache.org/repos/asf/ignite/blob/c38b3ba2/modules/web-console/src/main/js/views/includes/header.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/views/includes/header.jade b/modules/web-console/src/main/js/views/includes/header.jade
index 2b66d82..e224f64 100644
--- a/modules/web-console/src/main/js/views/includes/header.jade
+++ b/modules/web-console/src/main/js/views/includes/header.jade
@@ -23,16 +23,19 @@ header#header.header
                 ignite-header-logo
             td(ng-if='$root.user' style='padding-top: 20px')
                 ul.nav.navbar-nav(ignite-sidebar ignite-navbar)
-                    li(ng-class='{active: $state.includes("base.configuration")}')
-                        a.dropdown-toggle(data-toggle='dropdown' bs-dropdown='sidebar.items' data-placement='bottom-right') Configuration
+                    li(ng-class='{active: $state.includes("base.configuration")}' bs-dropdown='sidebar.items' data-placement='bottom-right' data-trigger='hover focus' data-container='self' data-animation='' ng-click='$event.stopPropagation()')
+                        a.dropdown-toggle Configuration
                             span.caret
 
-                    li.sql-notebooks(ng-class='{active: $state.includes("base.sql")}' ng-controller='notebooks')
-                        a(ng-if='IgniteDemoMode' ui-sref='base.sql.demo') SQL
+                ul.nav.navbar-nav(ng-controller='notebooks')
+                    li.sql-notebooks(ng-if='IgniteDemoMode' ng-class='{active: $state.includes("base.sql")}')
+                        a(ui-sref='base.sql.demo') SQL
 
-                        a(ng-if='!IgniteDemoMode && !notebooks.length' ng-click='inputNotebookName()') SQL
+                    li.sql-notebooks(ng-if='!IgniteDemoMode && !notebooks.length' ng-class='{active: $state.includes("base.sql")}')
+                        a(ng-click='inputNotebookName()') SQL
 
-                        a.dropdown-toggle(ng-if='!IgniteDemoMode && notebooks.length' data-toggle='dropdown' bs-dropdown='notebookDropdown' data-placement='bottom-left') SQL
+                    li.sql-notebooks(ng-if='!IgniteDemoMode && notebooks.length' ng-class='{active: $state.includes("base.sql")}' bs-dropdown='notebookDropdown' data-placement='bottom-left' data-trigger='hover focus' data-container='self' data-animation='' ng-click='$event.stopPropagation()')
+                        a.dropdown-toggle SQL
                             span.caret
 
                     li(ui-sref-active='active'  ng-repeat='item in navbar.items')
@@ -43,6 +46,6 @@ header#header.header
                     button.btn.btn-info(ng-if='!IgniteDemoMode' ng-click='startDemo()') Start demo
 
                 ul.nav.navbar-nav.pull-right(ignite-userbar)
-                    li(ng-class='{active: $state.includes("settings")}')
-                        a.dropdown-toggle(data-toggle='dropdown' bs-dropdown='userbar.items' data-placement='bottom-right') {{user.firstName}} {{user.lastName}}
+                    li(bs-dropdown='userbar.items' data-placement='bottom-right' data-trigger='hover focus' data-container='self' data-animation='' ng-class='{active: $state.includes("settings")}' ng-click='$event.stopPropagation()')
+                        a.dropdown-toggle {{user.firstName}} {{user.lastName}}
                             span.caret

http://git-wip-us.apache.org/repos/asf/ignite/blob/c38b3ba2/modules/web-console/src/main/js/views/index.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/views/index.jade b/modules/web-console/src/main/js/views/index.jade
index 8514533..707bfac 100644
--- a/modules/web-console/src/main/js/views/index.jade
+++ b/modules/web-console/src/main/js/views/index.jade
@@ -18,7 +18,6 @@ doctype html
 html(ng-app='ignite-console' id='app' ng-strict-di)
     head
         base(href='/')
-        link(rel='shortcut icon' href='favicon.ico')
 
         meta(http-equiv='content-type' content='text/html; charset=UTF8')
         meta(http-equiv='content-language' content='en')
@@ -30,11 +29,6 @@ html(ng-app='ignite-console' id='app' ng-strict-di)
         meta(name='keywords' content='{{$meta.keywords}}')
         meta(ng-repeat='(key, value) in $meta.properties' name='{{::key}}' content='{{::value}}')
 
-        // build:css
-        link(rel='stylesheet', href='/vendors.css')
-        link(rel='stylesheet', href='/app.css')
-        // endbuild
-
     body.theme-line.body-overlap.greedy
 
         .splash.splash-max-foreground(hide-on-state-change)
@@ -52,15 +46,3 @@ html(ng-app='ignite-console' id='app' ng-strict-di)
                 label {{IgniteDemoMode ? "Demo" : "Beta" }}
 
         .wrapper(ui-view='')
-
-
-        // build:js
-        script(src='jspm_packages/system.js')
-        script(src='system.config.js')
-        script(src='vendors.js')
-        script(src='app.js')
-        script System.import('app/index');
-        // endbuild
-
-        // ignite:plugins
-        // endignite
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/c38b3ba2/modules/web-console/src/main/js/views/reset.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/views/reset.jade b/modules/web-console/src/main/js/views/reset.jade
index e5b8f12..9098105 100644
--- a/modules/web-console/src/main/js/views/reset.jade
+++ b/modules/web-console/src/main/js/views/reset.jade
@@ -37,11 +37,11 @@ header#header.header
                     .settings-row
                         label.col-sm-1.required Password:
                         .col-sm-3
-                            input#user_password.form-control(enter-focus-next='user_confirm' type='password' ng-model='reset_info.password' placeholder='New password' required)
+                            input#user_password.form-control(ignite-on-enter-focus-move='user_confirm' type='password' ng-model='reset_info.password' placeholder='New password' required)
                     .settings-row
                         label.col-sm-1.required Confirm:
                         .col-sm-3
-                            input#user_confirm.form-control(type='password' ng-model='reset_info.confirm' match='reset_info.password' placeholder='Confirm new password' required on-enter='resetForm.$valid && resetPassword(user_info)')
+                            input#user_confirm.form-control(type='password' ng-model='reset_info.confirm' ignite-match='reset_info.password' placeholder='Confirm new password' required ignite-on-enter='resetForm.$valid && resetPassword(user_info)')
                     .settings-row
                         button.btn.btn-primary(ng-disabled='resetForm.$invalid' ng-click='resetPassword(reset_info)') Reset Password
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/c38b3ba2/modules/web-console/src/main/js/views/settings/profile.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/views/settings/profile.jade b/modules/web-console/src/main/js/views/settings/profile.jade
index 53991b3..bc4965a 100644
--- a/modules/web-console/src/main/js/views/settings/profile.jade
+++ b/modules/web-console/src/main/js/views/settings/profile.jade
@@ -28,23 +28,23 @@ mixin lbl(txt)
                     .details-row
                         +lbl('First name:')
                         .col-xs-5.col-sm-4
-                            input#profile-firstname.form-control(type='text' ng-model='user.firstName' placeholder='Input first name' required auto-focus)
+                            input#profile-firstname.form-control(ignite-on-enter-focus-move='profile-lastname' type='text' ng-model='user.firstName' placeholder='Input first name' required ignite-auto-focus)
                     .details-row
                         +lbl('Last name:')
                         .col-xs-5.col-sm-4
-                            input#profile-lastname.form-control(type='text' ng-model='user.lastName' placeholder='Input last name' required)
+                            input#profile-lastname.form-control(ignite-on-enter-focus-move='profile-email' type='text' ng-model='user.lastName' placeholder='Input last name' required)
                     .details-row
                         +lbl('Email:')
                         .col-xs-5.col-sm-4
-                            input#profile-email.form-control(type='email' ng-model='user.email' placeholder='Input email' required)
+                            input#profile-email.form-control(ignite-on-enter-focus-move='profile-company' type='email' ng-model='user.email' placeholder='Input email' required)
                     .details-row
                         +lbl('Company:')
                         .col-xs-5.col-sm-4
-                            input#profile-company.form-control(type='text' ng-model='user.company' placeholder='Input company name' required)
+                            input#profile-company.form-control(ignite-on-enter-focus-move='profile-country' type='text' ng-model='user.company' placeholder='Input company name' required)
                     .details-row
                         +lbl('Country:')
                         .col-xs-5.col-sm-4
-                            button#profile-country.select-toggle.form-control(bs-select bs-options='item.name as item.name for item in countries' type='text' ng-model='user.country' placeholder='Choose your country' required)
+                            button#profile-country.select-toggle.form-control(bs-select bs-options='item.name as item.name for item in countries' type='text' ng-model='user.country' placeholder='Choose your country' ng-required='true')
                     .details-row
                         .advanced-options
                             i.fa(
@@ -55,7 +55,7 @@ mixin lbl(txt)
                             +lbl('Security token:')
                             label {{user.token || 'No security token. Regenerate please.'}}
                             i.tipLabel.fa.fa-refresh(ng-click='generateToken()' bs-tooltip='' data-title='Generate random security token')
-                            i.tipLabel.fa.fa-clipboard(ng-click-copy='{{user.token}}' bs-tooltip='' data-title='Copy security token to clipboard')
+                            i.tipLabel.fa.fa-clipboard(ignite-copy-to-clipboard='{{user.token}}' bs-tooltip='' data-title='Copy security token to clipboard')
                             i.tipLabel.fa.fa-question-circle(ng-if=lines bs-tooltip='' data-title='The security token is used for authorization of web agent')
                     .details-row
                         .advanced-options
@@ -67,10 +67,10 @@ mixin lbl(txt)
                             .details-row
                                 +lbl('New password:')
                                 .col-xs-5.col-sm-4
-                                    input.form-control(type='password' ng-model='user.password' placeholder='New password')
+                                    input#profile_password.form-control(ignite-on-enter-focus-move='profile_confirm' type='password' ng-model='user.password' placeholder='New password')
                             .details-row
                                 +lbl('Confirm:')
                                 .col-xs-5.col-sm-4
-                                    input.form-control(type='password' ng-model='user.confirm' match='user.password' placeholder='Confirm new password')
+                                    input#profile_confirm.form-control(type='password' ng-model='user.confirm' ignite-match='user.password' placeholder='Confirm new password')
                 .col-xs-12.col-sm-12.details-row
                     a.btn.btn-primary(ng-disabled='!profileCouldBeSaved()' ng-click='profileCouldBeSaved() && saveUser()' bs-tooltip='' data-title='{{saveBtnTipText()}}' data-placement='bottom' data-trigger='hover') Save

http://git-wip-us.apache.org/repos/asf/ignite/blob/c38b3ba2/modules/web-console/src/main/js/views/signin.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/views/signin.jade b/modules/web-console/src/main/js/views/signin.jade
index 73a07e7..a6c64a8 100644
--- a/modules/web-console/src/main/js/views/signin.jade
+++ b/modules/web-console/src/main/js/views/signin.jade
@@ -41,42 +41,42 @@ header#header.header
                             .settings-row
                                 p.col-xs-12.col-md-11(ng-show='action == "password/forgot"')
                                     | That's ok! Simply enter your email below and a reset password link will be sent to you via email. You can then follow that link and select a new password.
+                            .settings-row(ng-show='action == "signin"')
+                                +lblRequired('Email:')
+                                .col-xs-9.col-md-8
+                                    input#signin_email.form-control(ignite-on-enter-focus-move='user_password' type='email' ng-model='ui.email' placeholder='Input email' required)
+                            .settings-row(ng-show='action == "signup"')
+                                +lblRequired('Email:')
+                                .col-xs-9.col-md-8
+                                    input#signup_email.form-control(ignite-on-enter-focus-move='user_password' type='email' ng-model='ui.email' placeholder='Input email' required)
+                            .settings-row(ng-show='action != "password/forgot"')
+                                +lblRequired('Password:')
+                                .col-xs-9.col-md-8
+                                    input#user_password.form-control(ignite-on-enter-focus-move='user_confirm' type='password' ng-model='ui.password' placeholder='Password' ng-required='action != "password/forgot"' ignite-on-enter='action == "signin" && form.$valid && auth(action, ui)')
+                            .settings-row(ng-if='action == "signup"')
+                                +lblRequired('Confirm:')
+                                .col-xs-9.col-md-8
+                                    input#user_confirm.form-control(ignite-on-enter-focus-move='first_name' type='password' ng-model='ui_exclude.confirm' ignite-match='ui.password' placeholder='Confirm password' ng-required='action == "signup"')
                             .settings-row(ng-show='action == "signup"')
                                 +lblRequired('First Name:')
                                 .col-xs-9.col-md-8
-                                    input#first_name.form-control(enter-focus-next='last_name' type='text' ng-model='ui.firstName' placeholder='Input first name' ng-required='action=="signup"')
+                                    input#first_name.form-control(ignite-on-enter-focus-move='last_name' type='text' ng-model='ui.firstName' placeholder='Input first name' ng-required='action=="signup"')
                             .settings-row(ng-show='action == "signup"')
                                 +lblRequired('Last Name:')
                                 .col-xs-9.col-md-8
-                                    input#last_name.form-control(enter-focus-next='signup_email' type='text' ng-model='ui.lastName' placeholder='Input last name' ng-required='action=="signup"')
+                                    input#last_name.form-control(ignite-on-enter-focus-move='company' type='text' ng-model='ui.lastName' placeholder='Input last name' ng-required='action=="signup"')
                             .settings-row(ng-show='action == "password/forgot"')
                                 +lblRequired('Email:')
                                 .col-xs-9.col-md-8
-                                    input#forgot_email.form-control(on-enter='form.$valid && forgotPassword(ui)' type='email' ng-model='ui.email' placeholder='Input email' required)
-                            .settings-row(ng-show='action == "signin"')
-                                +lblRequired('Email:')
-                                .col-xs-9.col-md-8
-                                    input#signin_email.form-control(enter-focus-next='user_password' type='email' ng-model='ui.email' placeholder='Input email' required)
-                            .settings-row(ng-show='action == "signup"')
-                                +lblRequired('Email:')
-                                .col-xs-9.col-md-8
-                                    input#signup_email.form-control(enter-focus-next='company' type='email' ng-model='ui.email' placeholder='Input email' required)
+                                    input#forgot_email.form-control(ignite-on-enter='form.$valid && forgotPassword(ui)' type='email' ng-model='ui.email' placeholder='Input email' required)
                             .settings-row(ng-show='action == "signup"')
                                 +lblRequired('Company:')
                                 .col-xs-9.col-md-8
-                                    input#company.form-control(enter-focus-next='country' type='search' ng-model='ui.company' placeholder='Input company name' ng-required='action=="signup"')
+                                    input#company.form-control(ignite-on-enter-focus-move='country' type='text' ng-model='ui.company' placeholder='Input company name' ng-required='action=="signup"')
                             .settings-row(ng-show='action == "signup"')
                                 +lblRequired('Country:')
                                 .col-xs-9.col-md-8
-                                    button#country.select-toggle.form-control(bs-select bs-options='item.name as item.name for item in countries' enter-focus-next='user_password' type='search' ng-model='ui.country' placeholder='Choose your country' ng-required='action=="signup"')
-                            .settings-row(ng-show='action != "password/forgot"')
-                                +lblRequired('Password:')
-                                .col-xs-9.col-md-8
-                                    input#user_password.form-control(enter-focus-next='user_confirm' type='password' ng-model='ui.password' placeholder='Password' ng-required='action != "password/forgot"' on-enter='action == "signin" && form.$valid && auth(action, ui)')
-                            .settings-row(ng-if='action == "signup"')
-                                +lblRequired('Confirm:')
-                                .col-xs-9.col-md-8
-                                    input#user_confirm.form-control(type='password' ng-model='ui_exclude.confirm' match='ui.password' placeholder='Confirm password' ng-required='action == "signup"' on-enter='form.$valid && auth(action, ui)')
+                                    button#country.select-toggle.form-control(ignite-on-enter-focus-move='signup' bs-select bs-options='item.name as item.name for item in countries' type='text' ng-model='ui.country' placeholder='Choose your country' ng-required='action=="signup"')
                             .settings-row(ignite-terms)
                                 .col-md-offset-3(ng-if='action == "signup" && terms.termsState')
                                     label
@@ -84,17 +84,17 @@ header#header.header
                                         | I agree to the #[a(ui-sref='{{::terms.termsState}}' target='_blank') terms and conditions]
                         .col-xs-12.col-md-11
                             .login-footer(ng-show='action == "signup"')
-                                a.labelField(ng-click='action = "password/forgot"' on-click-focus='signin_email') Forgot password?
-                                a.labelLogin(ng-click='action = "signin"' on-click-focus='signin_email') Sign In
+                                a.labelField(ng-click='action = "password/forgot"' ignite-on-click-focus='signin_email') Forgot password?
+                                a.labelLogin(ng-click='action = "signin"' ignite-on-click-focus='signin_email') Sign In
                                 button#signup.btn.btn-primary(ng-click='auth(action, ui)' ng-disabled='form.$invalid') Sign Up
                         .col-xs-12.col-md-11
                             .login-footer(ng-show='action == "password/forgot"')
-                                a.labelField(ng-click='action = "signin"' on-click-focus='signin_email') Sign In
+                                a.labelField(ng-click='action = "signin"' ignite-on-click-focus='signin_email') Sign In
                                 button#forgot.btn.btn-primary(ng-click='forgotPassword(ui)' ng-disabled='form.$invalid') Send it to me
                         .col-xs-12.col-md-11
                             .login-footer(ng-show='action == "signin"')
-                                a.labelField(ng-click='action = "password/forgot"' on-click-focus='signin_email') Forgot password?
-                                a.labelLogin(ng-click='action = "signup"' on-click-focus='first_name') Sign Up
+                                a.labelField(ng-click='action = "password/forgot"' ignite-on-click-focus='signin_email') Forgot password?
+                                a.labelLogin(ng-click='action = "signup"' ignite-on-click-focus='first_name') Sign Up
                                 button#login.btn.btn-primary(ng-click='auth(action, ui)' ng-disabled='form.$invalid') Sign In
 
                     .col-xs-12.col-md-11.home-panel

http://git-wip-us.apache.org/repos/asf/ignite/blob/c38b3ba2/modules/web-console/src/main/js/views/sql/notebook-new.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/views/sql/notebook-new.jade b/modules/web-console/src/main/js/views/sql/notebook-new.jade
index 2a50137..51200e8 100644
--- a/modules/web-console/src/main/js/views/sql/notebook-new.jade
+++ b/modules/web-console/src/main/js/views/sql/notebook-new.jade
@@ -25,7 +25,7 @@
                     .col-sm-2
                         label.required.labelFormField Name:&nbsp;
                     .col-sm-10
-                        input.form-control(id='create-notebook' type='text' ng-model='name' required on-enter='ui.inputForm.$valid && createNewNotebook(name)' auto-focus)
+                        input.form-control(id='create-notebook' type='text' ng-model='name' required ignite-on-enter='ui.inputForm.$valid && createNewNotebook(name)' ignite-auto-focus)
             .modal-footer
                 button.btn.btn-default(id='copy-btn-cancel' ng-click='$hide()') Cancel
                 button.btn.btn-primary(id='copy-btn-confirm' ng-disabled='ui.inputForm.$invalid' ng-click='createNewNotebook(name)') Create

http://git-wip-us.apache.org/repos/asf/ignite/blob/c38b3ba2/modules/web-console/src/main/js/views/sql/paragraph-rate.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/views/sql/paragraph-rate.jade b/modules/web-console/src/main/js/views/sql/paragraph-rate.jade
index f6f105f..03c6497 100644
--- a/modules/web-console/src/main/js/views/sql/paragraph-rate.jade
+++ b/modules/web-console/src/main/js/views/sql/paragraph-rate.jade
@@ -22,7 +22,7 @@
         form(name='popoverForm' novalidate)
             .form-group(style='padding: 5px')
                 .col-sm-4
-                    input.form-control(id='paragraph-rate' ng-init='value = paragraph.rate.value' ng-model='value' type='number' min='1' required auto-focus)
+                    input.form-control(id='paragraph-rate' ng-init='value = paragraph.rate.value' ng-model='value' type='number' min='1' required ignite-auto-focus)
                 .col-sm-8(style='padding-left: 5px')
                     button.form-control.select-toggle(id='paragraph-unit' ng-init='unit = paragraph.rate.unit' ng-model='unit' required placeholder='Time unit' bs-select bs-options='item.value as item.label for item in timeUnit' data-container='false' tabindex='0')
             .form-actions(style='margin-top: 30px; padding: 5px')

http://git-wip-us.apache.org/repos/asf/ignite/blob/c38b3ba2/modules/web-console/src/main/js/views/sql/sql.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/views/sql/sql.jade b/modules/web-console/src/main/js/views/sql/sql.jade
index be6d85e..a5e7fae 100644
--- a/modules/web-console/src/main/js/views/sql/sql.jade
+++ b/modules/web-console/src/main/js/views/sql/sql.jade
@@ -15,7 +15,7 @@
     limitations under the License.
 
 mixin btn-toolbar(btn, click, tip, focusId)
-    i.btn.btn-default.fa(class=btn ng-click=click bs-tooltip='' data-title=tip on-click-focus=focusId data-trigger='hover' data-placement='bottom')
+    i.btn.btn-default.fa(class=btn ng-click=click bs-tooltip='' data-title=tip ignite-on-click-focus=focusId data-trigger='hover' data-placement='bottom')
 
 mixin btn-toolbar-data(btn, kind, tip)
     i.btn.btn-default.fa(class=btn ng-click='setResult(paragraph, "#{kind}")' ng-class='{active: resultEq(paragraph, "#{kind}")}' bs-tooltip='' data-title=tip data-trigger='hover' data-placement='bottom')
@@ -52,7 +52,7 @@ mixin notebook-rename
         h1.col-sm-6(ng-show='notebook.edit')
             i.btn.fa.fa-floppy-o(ng-show='notebook.editName' ng-click='renameNotebook(notebook.editName)' bs-tooltip data-title='Save notebook name' data-trigger='hover')
             .input-tip
-                input.form-control(ng-model='notebook.editName' required on-enter='renameNotebook(notebook.editName)' on-escape='notebook.edit = false;')
+                input.form-control(ng-model='notebook.editName' required ignite-on-enter='renameNotebook(notebook.editName)' ignite-on-escape='notebook.edit = false;')
         h1.pull-right
             a.dropdown-toggle(data-toggle='dropdown' bs-dropdown='scrollParagraphs' data-placement='bottom-right') Scroll to query
                 span.caret
@@ -80,7 +80,7 @@ mixin paragraph-rename
         i.tipLabel.fa(style='float: left;' ng-class='paragraphExpanded(paragraph) ? "fa-chevron-circle-down" : "fa-chevron-circle-right"')
         i.tipLabel.fa.fa-floppy-o(style='float: right;' ng-show='paragraph.editName' ng-click='renameParagraph(paragraph, paragraph.editName); $event.stopPropagation();' bs-tooltip data-title='Save query name' data-trigger='hover')
         .input-tip
-            input.form-control(id='paragraph-name-{{paragraph.id}}' ng-model='paragraph.editName' required ng-click='$event.stopPropagation();' on-enter='renameParagraph(paragraph, paragraph.editName)' on-escape='paragraph.edit = false')
+            input.form-control(id='paragraph-name-{{paragraph.id}}' ng-model='paragraph.editName' required ng-click='$event.stopPropagation();' ignite-on-enter='renameParagraph(paragraph, paragraph.editName)' ignite-on-escape='paragraph.edit = false')
 
 mixin query-controls
     .sql-controls

http://git-wip-us.apache.org/repos/asf/ignite/blob/c38b3ba2/modules/web-console/src/main/js/views/templates/agent-download.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/views/templates/agent-download.jade b/modules/web-console/src/main/js/views/templates/agent-download.jade
index f17dac8..864694b 100644
--- a/modules/web-console/src/main/js/views/templates/agent-download.jade
+++ b/modules/web-console/src/main/js/views/templates/agent-download.jade
@@ -33,7 +33,7 @@
                     a(ng-click='agentLoad.showToken = ! agentLoad.showToken') {{agentLoad.showToken ? 'Hide security token...' : 'Show security token...'}}
                 .details-row(ng-show='agentLoad.showToken')
                     label.labelField Security token: {{user.token}}
-                    i.tipLabel.fa.fa-clipboard(ng-click-copy='{{user.token}}' bs-tooltip='' data-title='Copy security token to clipboard')
+                    i.tipLabel.fa.fa-clipboard(ignite-copy-to-clipboard='{{user.token}}' bs-tooltip='' data-title='Copy security token to clipboard')
                     i.tipLabel.fa.fa-question-circle(ng-if=lines bs-tooltip='' data-title='The security token is used for authorization of web agent')
             .agent-download(ng-if='hasAgents')
                 p Connection to Ignite Web Agent is established, but agent failed to connect to Ignite Node

http://git-wip-us.apache.org/repos/asf/ignite/blob/c38b3ba2/modules/web-console/src/main/js/views/templates/clone.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/views/templates/clone.jade b/modules/web-console/src/main/js/views/templates/clone.jade
index c94c534..25e99e7 100644
--- a/modules/web-console/src/main/js/views/templates/clone.jade
+++ b/modules/web-console/src/main/js/views/templates/clone.jade
@@ -25,7 +25,7 @@
                     .col-sm-2
                         label.required.labelFormField New name:&nbsp;
                     .col-sm-10
-                        input.form-control(id='copy-new-name' type='text' ng-model='newName' on-enter='form.$valid && ok(newName)' required auto-focus)
+                        input.form-control(id='copy-new-name' type='text' ng-model='newName' ignite-on-enter='form.$valid && ok(newName)' required ignite-auto-focus)
             .modal-footer
                 button.btn.btn-default(id='copy-btn-cancel' ng-click='$hide()') Cancel
                 button.btn.btn-primary(id='copy-btn-confirm' ng-disabled='ui.inputForm.$invalid' ng-click='ok(newName)') Confirm

http://git-wip-us.apache.org/repos/asf/ignite/blob/c38b3ba2/parent/pom.xml
----------------------------------------------------------------------
diff --git a/parent/pom.xml b/parent/pom.xml
index 9fbc78d..e4a6f84 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -874,13 +874,13 @@
                                         <exclude>**/*.ps1</exclude>
                                         <exclude>**/*.json</exclude>
                                         <!--web console-->
-                                        <exclude>**/src/main/js/*.babelrc</exclude>
-                                        <exclude>**/src/main/js/*.eslintrc</exclude>
-                                        <exclude>**/src/main/js/*.npmrc</exclude>
+                                        <exclude>**/src/main/js/.babelrc</exclude>
+                                        <exclude>**/src/main/js/.eslintrc</exclude>
                                         <exclude>**/src/main/js/build/**</exclude>
                                         <exclude>**/src/main/js/node_modules/**</exclude>
+                                        <exclude>**/src/main/js/ignite_modules/**</exclude>
+                                        <exclude>**/src/main/js/ignite_modules_temp/**</exclude>
                                         <exclude>**/src/main/js/serve/config/settings.json.sample</exclude>
-                                        <exclude>**/src/main/js/serve/keys/test.*</exclude>
                                     </excludes>
                                 </configuration>
                             </execution>


Mime
View raw message