Repository: incubator-ignite
Updated Branches:
  refs/heads/ignite-843 d58bae6b4 -> f8be27395


# 843 WIP Clusters page.


Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/f8be2739
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/f8be2739
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/f8be2739

Branch: refs/heads/ignite-843
Commit: f8be27395826e03bbfc3be7fb08964be258efa69
Parents: d58bae6
Author: Andrey <anovi...@gridgain.com>
Authored: Wed May 20 14:08:03 2015 +0700
Committer: Andrey <anovi...@gridgain.com>
Committed: Wed May 20 14:08:03 2015 +0700

----------------------------------------------------------------------
 modules/webconfig/nodejs/app.js                 |   4 +-
 modules/webconfig/nodejs/db.js                  |   2 +-
 .../nodejs/public/javascripts/bundle.js         |   0
 .../public/javascripts/controllers/clusters.js  | 108 ++-
 .../public/javascripts/controllers/sidebar.js   |   6 +
 .../nodejs/public/stylesheets/style.css         |   2 +-
 .../nodejs/public/stylesheets/style.less        | 669 +++++++++++++++++++
 modules/webconfig/nodejs/routes/pages.js        |  28 +-
 modules/webconfig/nodejs/views/caches.jade      |  10 +
 modules/webconfig/nodejs/views/clients.jade     |  10 +
 modules/webconfig/nodejs/views/cluster.jade     |  30 -
 modules/webconfig/nodejs/views/clusters.jade    |  47 ++
 .../webconfig/nodejs/views/includes/footer.jade |  15 +-
 .../webconfig/nodejs/views/includes/header.jade |  38 +-
 modules/webconfig/nodejs/views/index.jade       |   3 -
 modules/webconfig/nodejs/views/layout.jade      |  82 ++-
 modules/webconfig/nodejs/views/persistence.jade |  10 +
 modules/webconfig/nodejs/views/sql.jade         |  10 +
 18 files changed, 922 insertions(+), 152 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f8be2739/modules/webconfig/nodejs/app.js
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/app.js b/modules/webconfig/nodejs/app.js
index 666dbff..344ec96 100644
--- a/modules/webconfig/nodejs/app.js
+++ b/modules/webconfig/nodejs/app.js
@@ -7,7 +7,7 @@ var bodyParser = require('body-parser');
 var session = require('express-session')
 
 var pageRoutes = require('./routes/pages');
-var clusterRouter = require('./routes/clusters');
+var clustersRouter = require('./routes/clusters');
 
 var passport = require('passport');
 var LocalStrategy = require('passport-local').Strategy;
@@ -33,7 +33,7 @@ app.use(passport.initialize());
 app.use(passport.session());
 
 app.use('/', pageRoutes);
-app.use('/rest', clusterRouter);
+app.use('/rest', clustersRouter);
 
 // catch 404 and forward to error handler
 app.use(function (req, res, next) {

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f8be2739/modules/webconfig/nodejs/db.js
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/db.js b/modules/webconfig/nodejs/db.js
index 33764b7..59534f5 100644
--- a/modules/webconfig/nodejs/db.js
+++ b/modules/webconfig/nodejs/db.js
@@ -24,6 +24,6 @@ exports.Cache =  mongoose.model('Cache', new mongoose.Schema({
 exports.Cluster =  mongoose.model('Cluster', new mongoose.Schema({
     name : String,
     caches : [String],
-    discovery : { type: String, enum: ['VM', 'Multicast'] },
+    discovery : { type: String, enum: ['TcpDiscoveryVmIpFinder', 
'TcpDiscoveryMulticastIpFinder'] },
     addresses : [String]
 }));
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f8be2739/modules/webconfig/nodejs/public/javascripts/bundle.js
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/public/javascripts/bundle.js 
b/modules/webconfig/nodejs/public/javascripts/bundle.js
new file mode 100644
index 0000000..e69de29

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f8be2739/modules/webconfig/nodejs/public/javascripts/controllers/clusters.js
----------------------------------------------------------------------
diff --git 
a/modules/webconfig/nodejs/public/javascripts/controllers/clusters.js 
b/modules/webconfig/nodejs/public/javascripts/controllers/clusters.js
index 9be3f8d..ff144ae 100644
--- a/modules/webconfig/nodejs/public/javascripts/controllers/clusters.js
+++ b/modules/webconfig/nodejs/public/javascripts/controllers/clusters.js
@@ -1,23 +1,43 @@
-angular.module('ignite-web-configurator', ['ngTable', 'mgcrea.ngStrap', 
'ngSanitize'])
-    .controller('clusterRouter', ['$scope', '$modal', '$http', '$filter', 
'ngTableParams', function($scope, $modal, $http, $filter, ngTableParams) {
+angular.module('ignite-web-configurator', ['ngTable', 'mgcrea.ngStrap'])
+    .controller('activeLink', ['$scope', function($scope) {
+        $scope.isActive = function(path) {
+            return window.location.pathname.substr(0, path.length) == path;
+        };
+    }])
+    .controller('clustersController', ['$scope', '$modal', '$http', '$filter', 
'ngTableParams', function($scope, $modal, $http, $filter, ngTableParams) {
+        $scope.edit = { };
+
+        $scope.editRow = {};
+        $scope.editIdx = false;
+
         $scope.discoveries = [
-            {value: 'VM', label: 'VM'},
-            {value: 'Multicast', label: 'Multicast'}
+            {value: 'TcpDiscoveryVmIpFinder', label: 'Static IPs'},
+            {value: 'TcpDiscoveryMulticastIpFinder', label: 'Multicast'}
         ];
 
+        $scope.discoveryAsString = function(value) {
+            for (var i in $scope.discoveries) {
+                if ($scope.discoveries[i].value == value)
+                    return $scope.discoveries[i].label;
+            }
+
+            return 'Wrong discovery';
+        };
+
         // when landing on the page, get all settings and show them
         $http.get('/rest/cluster')
             .success(function(data) {
                 $scope.clusters = data;
 
                 $scope.clustersTable = new ngTableParams({
-                    page: 1,            // show first page
-                    count: 10,          // count per page
+                    page: 1,                    // show first page
+                    count: Number.MAX_VALUE,        // count per page
                     sorting: {
-                        name: 'asc'     // initial sorting
+                        name: 'asc'             // initial sorting
                     }
                 }, {
                     total: $scope.clusters.length, // length of data
+                    counts: [],
                     getData: function($defer, params) {
                         // use build-in angular filter
                         var orderedData = params.sorting() ?
@@ -36,39 +56,62 @@ angular.module('ignite-web-configurator', ['ngTable', 
'mgcrea.ngStrap', 'ngSanit
         var myOtherModal = $modal({scope: $scope, template: '/cluster/edit', 
show: false});
 
         $scope.submit = function() {
-            var data = {
-                _id: $scope.cluster._id,
-                name: $scope.cluster.name,
-                caches: ['cache1', 'cache2', 'cache2'],
-                discovery: $scope.cluster.discovery,
-                addresses: ['127.0.0.1', '192.168.1.1']
-            };
-
-            $http.post('/rest/cluster/save', data)
-                .success(function(data) {
-                    myOtherModal.hide();
+            if ($scope.editIdx !== false) {
+                var cluster = $scope.clusters[$scope.editIdx];
 
-                    $scope.clusters = data;
+                var data = {
+                    _id: cluster._id,
+                    name: cluster.name,
+                    caches: ['cache1', 'cache2', 'cache2'],
+                    discovery: cluster.discovery,
+                    addresses: ['127.0.0.1', '192.168.1.1']
+                };
 
-                    $scope.clustersTable.reload();
-                })
-                .error(function(data) {
-                    console.log('Error: ' + data);
-                });
+                $scope.editIdx = false;
+
+                $http.post('/rest/cluster/save', data)
+                    .success(function (data) {
+                        myOtherModal.hide();
+
+                        $scope.clusters = data;
+
+                        $scope.clustersTable.reload();
+                    })
+                    .error(function (data) {
+                        console.log('Error: ' + data);
+                    });
+            }
         };
 
-        $scope.create = function () {
-            $scope.cluster = {};
+        $scope.add = function () {
+            $scope.clusters.push({});
+
+            $scope.clustersTable.reload();
 
             // Show when some event occurs (use $promise property to ensure 
the template has been loaded)
-            myOtherModal.$promise.then(myOtherModal.show);
+            //myOtherModal.$promise.then(myOtherModal.show);
         };
 
-        $scope.edit = function (cluster) {
-            $scope.cluster = JSON.parse(JSON.stringify(cluster));
+        $scope.beginEdit = function (cluster) {
+            $scope.editIdx = $scope.clusters.indexOf(cluster);
 
-            // Show when some event occurs (use $promise property to ensure 
the template has been loaded)
-            myOtherModal.$promise.then(myOtherModal.show);
+            $scope.editRow = angular.copy(cluster);
+
+            //// Show when some event occurs (use $promise property to ensure 
the template has been loaded)
+            //myOtherModal.$promise.then(myOtherModal.show);
+        };
+
+        $scope.revert = function () {
+            if ($scope.editIdx !== false) {
+                $scope.clusters[$scope.editIdx] = $scope.editRow;
+
+                $scope.editIdx = false;
+
+                $scope.clustersTable.reload();
+            }
+
+            //// Show when some event occurs (use $promise property to ensure 
the template has been loaded)
+            //myOtherModal.$promise.then(myOtherModal.show);
         };
 
         $scope.delete = function (cluster) {
@@ -82,4 +125,5 @@ angular.module('ignite-web-configurator', ['ngTable', 
'mgcrea.ngStrap', 'ngSanit
                     console.log('Error: ' + data);
                 });
         };
-    }]);
\ No newline at end of file
+    }])
+;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f8be2739/modules/webconfig/nodejs/public/javascripts/controllers/sidebar.js
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/public/javascripts/controllers/sidebar.js 
b/modules/webconfig/nodejs/public/javascripts/controllers/sidebar.js
new file mode 100644
index 0000000..c05f393
--- /dev/null
+++ b/modules/webconfig/nodejs/public/javascripts/controllers/sidebar.js
@@ -0,0 +1,6 @@
+angular.module('ignite-web-configurator', [])
+    .controller('activeLink', ['$scope', function($scope) {
+        $scope.isActive = function(path) {
+            return window.location.pathname.substr(0, path.length) == path;
+        };
+    }]);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f8be2739/modules/webconfig/nodejs/public/stylesheets/style.css
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/public/stylesheets/style.css 
b/modules/webconfig/nodejs/public/stylesheets/style.css
index 14091e2..3c2a159 100644
--- a/modules/webconfig/nodejs/public/stylesheets/style.css
+++ b/modules/webconfig/nodejs/public/stylesheets/style.css
@@ -1 +1 @@
-.main-header .logo{height:auto}.main-sidebar{padding-top:60px}.navbar-default 
.navbar-brand,.navbar-default 
.navbar-brand:hover{position:absolute;width:100%;left:0;text-align:center}.modal-backdrop.am-fade{opacity:.5;transition:opacity
 .15s 
linear}.modal-backdrop.am-fade.ng-enter{opacity:0}.modal-backdrop.am-fade.ng-enter.ng-enter-active{opacity:.5}.modal-backdrop.am-fade.ng-leave{opacity:.5}.modal-backdrop.am-fade.ng-leave.ng-leave-active{opacity:0}.modal.center
 
.modal-dialog{position:fixed;top:40%;left:50%;min-width:320px;max-width:630px;width:50%;-webkit-transform:translateX(-50%)
 translateY(-50%);transform:translateX(-50%) translateY(-50%)}.ng-table 
th.text-right{text-align:right}.ng-table th.text-left{text-align:left}.ng-table 
th.text-center{text-align:center}
\ No newline at end of file
+.main-header .logo{height:auto}.main-sidebar{padding-top:60px}.navbar-default 
.navbar-brand,.navbar-default 
.navbar-brand:hover{position:absolute;width:100%;left:0;text-align:center}.modal-backdrop.am-fade{opacity:.5;transition:opacity
 .15s 
linear}.modal-backdrop.am-fade.ng-enter{opacity:0}.modal-backdrop.am-fade.ng-enter.ng-enter-active{opacity:.5}.modal-backdrop.am-fade.ng-leave{opacity:.5}.modal-backdrop.am-fade.ng-leave.ng-leave-active{opacity:0}.modal.center
 
.modal-dialog{position:fixed;top:40%;left:50%;min-width:320px;max-width:630px;width:50%;-webkit-transform:translateX(-50%)
 translateY(-50%);transform:translateX(-50%) translateY(-50%)}.ng-table 
th.text-right{text-align:right}.ng-table th.text-left{text-align:left}.ng-table 
th.text-center{text-align:center}.fa.fa-remove{color:red}.border-left{-webkit-box-shadow:1px
 0 0px 0px #eee inset;box-shadow:1px 0 0px 0px #eee 
inset}.border-right{-webkit-box-shadow:1px 0 0px 0px #eee;box-shadow:1px 0 0px 
0px #eee}.theme-line{background-
 color:#f9f9f9}.theme-line header{background-color:#fff}.theme-line header 
.search-bar{width:90%;margin:30px auto 
0;-webkit-border-radius:5px;border-radius:5px;-webkit-box-shadow:0 0 0 5px 
rgba(0,0,0,0.1),0 0 0 1px rgba(0,0,0,0.1);box-shadow:0 0 0 5px 
rgba(0,0,0,0.1),0 0 0 1px rgba(0,0,0,0.1);position:relative}.theme-line header 
.search-bar.focus{-webkit-box-shadow:0 0 0 5px rgba(0,0,0,0.2),0 0 0 1px 
rgba(0,0,0,0.1);box-shadow:0 0 0 5px rgba(0,0,0,0.2),0 0 0 1px 
rgba(0,0,0,0.1)}.theme-line header .search-bar 
.fa{position:absolute;top:10px;left:14px;font-size:21px;color:#ccc;z-index:10}.theme-line
 header .search-bar .twitter-typeahead{width:100%}.theme-line header 
.search-bar 
input{-webkit-border-radius:5px;border-radius:5px;height:100%;border:0 
none;-webkit-box-shadow:0 2px 2px rgba(0,0,0,0.1) inset;box-shadow:0 2px 2px 
rgba(0,0,0,0.1) inset;color:#444;width:100%;padding:13px 13px 13px 
50px;font-size:14px}.theme-line header .search-bar 
input.tt-hint{color:#bbb}.theme-line header .sea
 rch-bar input:active .theme-line header .search-bar input:focus{outline:0 
none;-webkit-box-shadow:0 2px 2px rgba(0,0,0,0.2) inset;box-shadow:0 2px 2px 
rgba(0,0,0,0.2) inset}.theme-line header .search-bar 
.tt-dropdown-menu,.theme-solid header .search-bar 
.tt-dropdown-menu{width:100%;text-align:left}.theme-line header .search-bar 
.tt-dropdown-menu h3{padding:0 
45px;color:#ccc;font-weight:bold;font-size:12px;margin:10px 0 
4px;text-transform:uppercase}.theme-line header .search-bar .tt-dropdown-menu 
.tt-suggestions{display:block}.theme-line header .search-bar .tt-dropdown-menu 
.tt-suggestions .tt-suggestion{cursor:pointer;font-size:14px;padding:4px 
45px}.theme-line header .search-bar .tt-dropdown-menu .tt-suggestions 
.tt-suggestion 
p{color:#333;white-space:nowrap;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis}.theme-line
 header .search-bar .tt-cursor{background-color:#eee}.theme-line header 
.search-bar .tt-cursor p{color:#fff}.theme-line header a.btn{border:0 none;padd
 ing:10px 25px;background-color:rgba(0,0,0,0.15)}.theme-line header 
a.btn:hover{background-color:rgba(0,0,0,0.25)}.theme-line header 
a.btn.btn-link{background:transparent;color:rgba(255,255,255,0.8)}.theme-line 
header a.btn.btn-link:hover{color:#fff;text-decoration:none}.theme-line 
.navbar-nav a{background-color:transparent}.theme-line .navbar-nav 
a:hover,.theme-line .navbar-nav a:active,.theme-line .navbar-nav 
a:focus{background-color:transparent}.theme-line .navbar-nav .active 
a{font-weight:bold}.theme-line .main-links{padding-top:50px}.theme-line 
.main-links h3{margin-top:0;font-size:17px}.theme-line .main-links .links 
a{color:#888}.theme-line .main-links .links 
a:hover{text-decoration:none}.theme-line #category-columns,.theme-solid 
#category-columns{margin:50px 30px 0}.theme-line #category-columns 
h4{text-transform:uppercase;font-weight:300;color:#999;font-size:14px}.theme-line
 #category-columns ul{list-style:none;padding:0;margin-bottom:15px}.theme-line 
#category-columns ul li a
 {padding:4px 0;display:block;font-size:16px}.theme-line #category-columns ul 
.view-all{font-size:0.85em}.theme-line 
.docs-header{color:#999;overflow:hidden}.theme-line .docs-header 
h1{color:#444;margin-top:0;font-size:25px}.theme-line .btn-primary{border:0 
none}.theme-line .main-content .nav-horizontal a{-webkit-box-shadow:0 
0;box-shadow:0 0;border:0 
none;background-color:#fff;-webkit-border-radius:0;border-radius:0;color:#aaa;padding:6px;margin:0
 14px}.theme-line .main-content .nav-horizontal 
a:hover{color:#999;border-bottom:4px solid #ddd}.theme-line .main-content 
.nav-horizontal a.active{border-bottom:4px solid #888}.theme-line 
.sidebar-nav{color:#474a54;padding-bottom:30px}.theme-line .sidebar-nav 
ul{padding:0;list-style:none;font-size:13px;margin:3px 0 0}.theme-line 
.sidebar-nav ul li a{padding:3px 
0;display:block;color:#666;position:relative;white-space:nowrap;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis}.theme-line
 .sidebar-nav ul li a:before{top:0;content
 :" 
";display:block;width:6px;height:100%;position:absolute;left:-30px}.theme-line 
.sidebar-nav ul li a:hover{text-decoration:none}.theme-line .sidebar-nav ul li 
a.active{font-weight:bold}.theme-line .sidebar-nav ul li 
.subcategory{padding-left:15px}.theme-line .sidebar-nav 
h4{margin-top:2em;font-weight:normal;text-transform:uppercase;font-size:11px;margin-bottom:10px;color:#bbb}.theme-line
 .sidebar-nav h4:first-child{margin-top:0em}.theme-line .sidebar-nav 
.ask{width:100%;text-align:center;padding:10px}.theme-line .border-left 
.sidebar-nav{padding-left:15px}.theme-line 
.suggest{padding:4px;display:inline-block;font-size:12px}.header{padding:15px}.header
 .has-github{padding-right:136px}.header 
h1.navbar-brand{height:40px;width:200px;padding:0;margin:0;margin-top:5px;margin-right:15px}.header
 h1.navbar-brand a{text-indent:-99999px;background-position:center 
center;display:block;width:100%;height:100%;-webkit-background-size:contain;-moz-background-size:contain;background-size:contain;
 background-repeat:no-repeat}.header 
.nav.navbar-nav.pull-right{position:relative;right:-30px}.header 
.nav.navbar-nav .not-link{padding:15px;display:inline-block}.header 
.nav.navbar-nav .stable,.header .nav.navbar-nav .beta,.header .nav.navbar-nav 
.private{font-size:9px;padding:3px 
5px;display:inline-block;line-height:8px;-webkit-border-radius:3px;border-radius:3px;margin-left:6px;color:#fff;top:-2px;position:relative;opacity:0.6;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=60)";filter:alpha(opacity=60)}.header
 .nav.navbar-nav a:hover>.stable,.header .nav.navbar-nav a:hover>.beta,.header 
.nav.navbar-nav a:hover>.private{opacity:1;-ms-filter:none;filter:none}.header 
.nav.navbar-nav .beta{background-color:#59c3d1}.header .nav.navbar-nav 
.stable{background-color:#41b841}.header .nav.navbar-nav 
.private{background-color:#333}.header #jumbotron{margin:55px 70px 
50px;text-align:center}.header #jumbotron 
h2{margin-top:0;margin-bottom:20px}.header #jumbotron p{margin-bottom:0;
 line-height:1.6em;font-size:16px}.header #jumbotron 
.btn{margin-top:20px}.header 
.searchbox{position:relative;margin-right:15px;top:9px}.header .searchbox 
.fa-search{position:absolute;top:8px;right:10px;color:#777;pointer-events:none}.header
 .searchbox .typeahead{line-height:1.25em;-webkit-transition:.3s 
ease-out;-moz-transition:.3s ease-out;-o-transition:.3s 
ease-out;-ms-transition:.3s ease-out;transition:.3s 
ease-out;background-color:rgba(0,0,0,0.05);-webkit-border-radius:5px;border-radius:5px;width:95px}.header
 .searchbox .typeahead:focus,.header .searchbox .typeahead:active{outline:0 
none}.header .searchbox 
.tt-dropdown-menu{max-width:350px;margin-left:-100px}.header .searchbox 
.tt-dropdown-menu h3{width:100px;float:left;margin:0;padding:8px 0 6px 
15px;font-size:13px;color:#bbb}.header .searchbox .tt-dropdown-menu 
.tt-suggestions{display:block;float:left;width:250px}.header .searchbox 
.tt-dropdown-menu .tt-suggestions .tt-suggestion{font-size:14px}.header 
.searchbox .tt-dropdown
 -menu .tt-suggestions .tt-suggestion 
p{white-space:nowrap;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis}.header
 .searchbox .tt-cursor{background-color:#eee}.header .searchbox .tt-cursor 
p{color:#fff}.header .searchbox input{border:0 
none;display:inline-block;font-size:14px;padding:6px 32px 6px 
12px;margin:0}.header .searchbox input.tt-hint{height:auto}.header 
.searchbox.focus input{width:250px}.theme-line header{border-bottom:8px 
solid}.theme-line header h2{color:#aaa}.theme-line header 
p{color:#666}.theme-line .navbar-nav{color:#888}.theme-line .navbar-nav 
a{color:#bbb}.theme-line.lumosity-light .searchbox .tt-cursor 
p{color:rgba(0,0,0,0.7)}.theme-line 
header{border-bottom-color:#ec1c24}.theme-line header 
a.btn{background-color:#ec1c24}.theme-line header 
a.btn:hover{background-color:#950d12}.theme-line header .navbar-nav 
a:hover,.theme-line header .navbar-nav .open>a{color:#ec1c24}.theme-line header 
.navbar-nav .tt-cursor{background-color:#ec1c24}.theme-line .nav
 bar-nav .active a{font-weight:bold;color:#ec1c24}.theme-line .navbar-nav 
.active a:hover{color:#950d12}.theme-line .main-links .links 
a:hover{color:#ec1c24}.theme-line .main-content a{color:#ec1c24}.theme-line 
.main-content a:hover{color:#950d12}.theme-line .sidebar-nav ul li 
a.active:before{background-color:#ec1c24}.theme-line .sidebar-nav ul li 
a.active{color:#ec1c24}.theme-line .sidebar-nav ul li a:hover,.theme-line 
.sidebar-nav ul li a.active:hover{color:#950d12}.theme-line 
.btn-primary{background-color:#ec1c24}.theme-line 
.btn-primary:hover{background-color:#950d12}.theme-line .main-content 
.nav-horizontal a.active{border-color:#ec1c24;color:#ec1c24}.theme-line 
.main-content .nav-horizontal a:hover{color:#950d12}.theme-line .main-content 
.nav-horizontal a.active:hover{border-color:#950d12}.theme-line header 
.navbar-nav a.active,.theme-line #versions-list li a:hover strong,.theme-line 
#versions-list li a.active .current,.theme-line #versions-list li a:active 
.current{color:#ec1c
 24}.theme-line.body-threes .section-right .threes-nav 
.btn-default:hover,.theme-line.page-docs.body-threes .section-right .threes-nav 
.pull-right a:hover{color:#ec1c24;border-color:#ec1c24}.body-overlap 
.main-content{margin-top:30px}.body-box .main-content,.body-overlap 
.main-content{padding:30px;-webkit-box-shadow:0 0 0 1px 
rgba(0,0,0,0.1);box-shadow:0 0 0 1px 
rgba(0,0,0,0.1);background-color:#fff}body{font-weight:400;font-family:Roboto 
Slab, serif}h1,h2,h3,h4,h5,h6{font-weight:700;font-family:Roboto Slab, 
serif}.submit-vote.submit-vote-parent.voted 
a.submit-vote-button,.submit-vote.submit-vote-parent 
a.submit-vote-button:hover{background-color:#ec1c24}div.submit-vote.submit-vote-parent.voted
 a.submit-vote-button:hover{background-color:#950d12}a,.link 
.title{color:#ec1c24}a:hover,.link:hover .title{color:#950d12}.header 
h1.navbar-brand 
a{background-image:url(https://www.filepicker.io/api/file/QagunjDGRFul2JgNCAli)}.header
 h1.navbar-brand{width:96px}.block-edit-parameters{text-align
 
:right;padding-bottom:5px}.ng-table-pager{display:none}.container-footer{margin-top:20px}.vcenter{vertical-align:middle}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f8be2739/modules/webconfig/nodejs/public/stylesheets/style.less
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/public/stylesheets/style.less 
b/modules/webconfig/nodejs/public/stylesheets/style.less
index d18775f..7b488ab 100644
--- a/modules/webconfig/nodejs/public/stylesheets/style.less
+++ b/modules/webconfig/nodejs/public/stylesheets/style.less
@@ -69,6 +69,7 @@ body {
 .ng-table th.text-right {
   text-align: right;
 }
+
 .ng-table th.text-left {
   text-align: left;
 }
@@ -77,3 +78,671 @@ body {
   text-align: center;
 }
 
+.fa.fa-remove {
+  color: red;
+}
+
+.border-left {
+  -webkit-box-shadow: 1px 0 0px 0px #eee inset;
+  box-shadow: 1px 0 0px 0px #eee inset;
+}
+
+.border-right {
+  -webkit-box-shadow: 1px 0 0px 0px #eee;
+  box-shadow: 1px 0 0px 0px #eee;
+}
+
+.theme-line {
+  background-color: #f9f9f9;
+}
+
+.theme-line header {
+  background-color: #fff;
+}
+
+.theme-line header .search-bar {
+  width: 90%;
+  margin: 30px auto 0;
+  -webkit-border-radius: 5px;
+  border-radius: 5px;
+  -webkit-box-shadow: 0 0 0 5px rgba(0, 0, 0, 0.1), 0 0 0 1px rgba(0, 0, 0, 
0.1);
+  box-shadow: 0 0 0 5px rgba(0, 0, 0, 0.1), 0 0 0 1px rgba(0, 0, 0, 0.1);
+  position: relative;
+}
+
+.theme-line header .search-bar.focus {
+  -webkit-box-shadow: 0 0 0 5px rgba(0, 0, 0, 0.2), 0 0 0 1px rgba(0, 0, 0, 
0.1);
+  box-shadow: 0 0 0 5px rgba(0, 0, 0, 0.2), 0 0 0 1px rgba(0, 0, 0, 0.1);
+}
+
+.theme-line header .search-bar .fa {
+  position: absolute;
+  top: 10px;
+  left: 14px;
+  font-size: 21px;
+  color: #ccc;
+  z-index: 10;
+}
+
+.theme-line header .search-bar .twitter-typeahead {
+  width: 100%;
+}
+
+.theme-line header .search-bar input {
+  -webkit-border-radius: 5px;
+  border-radius: 5px;
+  height: 100%;
+  border: 0 none;
+  -webkit-box-shadow: 0 2px 2px rgba(0, 0, 0, 0.1) inset;
+  box-shadow: 0 2px 2px rgba(0, 0, 0, 0.1) inset;
+  color: #444;
+  width: 100%;
+  padding: 13px 13px 13px 50px;
+  font-size: 14px;
+}
+
+.theme-line header .search-bar input.tt-hint {
+  color: #bbb;
+}
+
+.theme-line header .search-bar input:active
+.theme-line header .search-bar input:focus {
+  outline: 0 none;
+  -webkit-box-shadow: 0 2px 2px rgba(0, 0, 0, 0.2) inset;
+  box-shadow: 0 2px 2px rgba(0, 0, 0, 0.2) inset;
+}
+
+.theme-line header .search-bar .tt-dropdown-menu,
+.theme-solid header .search-bar .tt-dropdown-menu {
+  width: 100%;
+  text-align: left;
+}
+
+.theme-line header .search-bar .tt-dropdown-menu h3 {
+  padding: 0 45px;
+  color: #ccc;
+  font-weight: bold;
+  font-size: 12px;
+  margin: 10px 0 4px;
+  text-transform: uppercase;
+}
+
+.theme-line header .search-bar .tt-dropdown-menu .tt-suggestions {
+  display: block;
+}
+
+.theme-line header .search-bar .tt-dropdown-menu .tt-suggestions 
.tt-suggestion {
+  cursor: pointer;
+  font-size: 14px;
+  padding: 4px 45px;
+}
+
+.theme-line header .search-bar .tt-dropdown-menu .tt-suggestions 
.tt-suggestion p{
+  color: #333;
+  white-space: nowrap;
+  overflow: hidden;
+  -o-text-overflow: ellipsis;
+  text-overflow: ellipsis;
+}
+
+.theme-line header .search-bar .tt-cursor {
+  background-color: #eee;
+}
+
+.theme-line header .search-bar .tt-cursor p {
+  color: #fff;
+}
+
+.theme-line header a.btn {
+  border: 0 none;
+  padding: 10px 25px;
+  background-color: rgba(0, 0, 0, 0.15);
+}
+
+.theme-line header a.btn:hover {
+  background-color: rgba(0, 0, 0, 0.25);
+}
+
+.theme-line header a.btn.btn-link {
+  background: transparent;
+  color: rgba(255, 255, 255, 0.8);
+}
+
+.theme-line header a.btn.btn-link:hover {
+  color: #fff;
+  text-decoration: none;
+}
+
+.theme-line .navbar-nav a {
+  background-color: transparent;
+}
+
+.theme-line .navbar-nav a:hover,
+.theme-line .navbar-nav a:active,
+.theme-line .navbar-nav a:focus {
+  background-color: transparent;
+}
+
+.theme-line .navbar-nav .active a {
+  font-weight: bold;
+}
+
+.theme-line .main-links {
+  padding-top: 50px;
+}
+
+.theme-line .main-links h3 {
+  margin-top: 0;
+  font-size: 17px;
+}
+
+.theme-line .main-links .links a {
+  color: #888;
+}
+
+.theme-line .main-links .links a:hover {
+  text-decoration: none;
+}
+
+.theme-line #category-columns,
+.theme-solid #category-columns {
+  margin: 50px 30px 0;
+}
+
+.theme-line #category-columns h4 {
+  text-transform: uppercase;
+  font-weight: 300;
+  color: #999;
+  font-size: 14px;
+}
+
+.theme-line #category-columns ul {
+  list-style: none;
+  padding: 0;
+  margin-bottom: 15px;
+}
+
+.theme-line #category-columns ul li a {
+  padding: 4px 0;
+  display: block;
+  font-size: 16px;
+}
+
+.theme-line #category-columns ul .view-all {
+  font-size: 0.85em;
+}
+
+.theme-line .docs-header {
+  color: #999;
+  overflow: hidden;
+}
+
+.theme-line .docs-header h1{
+  color: #444;
+  margin-top: 0;
+  font-size: 25px;
+}
+
+.theme-line .btn-primary {
+  border: 0 none;
+}
+
+.theme-line .main-content .nav-horizontal a {
+  -webkit-box-shadow: 0 0;
+  box-shadow: 0 0;
+  border: 0 none;
+  background-color: #fff;
+  -webkit-border-radius: 0;
+  border-radius: 0;
+  color: #aaa;
+  padding: 6px;
+  margin: 0 14px;
+}
+
+.theme-line .main-content .nav-horizontal a:hover {
+  color: #999;
+  border-bottom: 4px solid #ddd;
+}
+
+.theme-line .main-content .nav-horizontal a.active {
+  border-bottom: 4px solid #888;
+}
+
+.theme-line .sidebar-nav {
+  color: #474a54;
+  padding-bottom: 30px;
+}
+
+.theme-line .sidebar-nav ul {
+  padding: 0;
+  list-style: none;
+  font-size: 13px;
+  margin: 3px 0 0;
+}
+
+.theme-line .sidebar-nav ul li a {
+  padding: 3px 0;
+  display: block;
+  color: #666;
+  position: relative;
+  white-space: nowrap;
+  overflow: hidden;
+  -o-text-overflow: ellipsis;
+  text-overflow: ellipsis;
+}
+
+.theme-line .sidebar-nav ul li a:before {
+  top: 0;
+  content: " ";
+  display: block;
+  width: 6px;
+  height: 100%;
+  position: absolute;
+  left: -30px;
+}
+
+.theme-line .sidebar-nav ul li a:hover {
+  text-decoration: none;
+}
+
+//.theme-line .sidebar-nav ul li a:hover:before,
+//.theme-solid .sidebar-nav ul li a:hover:before {
+//  background-color: #eee;
+//}
+
+.theme-line .sidebar-nav ul li a.active {
+  font-weight: bold;
+}
+
+.theme-line .sidebar-nav ul li .subcategory {
+  padding-left: 15px;
+}
+
+.theme-line .sidebar-nav h4 {
+  margin-top: 2em;
+  font-weight: normal;
+  text-transform: uppercase;
+  font-size: 11px;
+  margin-bottom: 10px;
+  color: #bbb;
+}
+
+.theme-line .sidebar-nav h4:first-child {
+  margin-top: 0em;
+}
+
+.theme-line .sidebar-nav .ask {
+  width: 100%;
+  text-align: center;
+  padding: 10px;
+}
+
+.theme-line .border-left .sidebar-nav {
+  padding-left: 15px;
+}
+
+.theme-line .suggest {
+  padding: 4px;
+  display: inline-block;
+  font-size: 12px;
+}
+
+.header {
+  padding: 15px;
+}
+
+.header .has-github {
+  padding-right: 136px;
+}
+
+.header h1.navbar-brand {
+  height: 40px;
+  width: 200px;
+  padding: 0;
+  margin: 0;
+  margin-top: 5px;
+  margin-right: 15px;
+}
+
+.header h1.navbar-brand a {
+  text-indent: -99999px;
+  background-position: center center;
+  display: block;
+  width: 100%;
+  height: 100%;
+  -webkit-background-size: contain;
+  -moz-background-size: contain;
+  background-size: contain;
+  background-repeat: no-repeat;
+}
+
+.header .nav.navbar-nav.pull-right {
+  position: relative;
+  right: -30px;
+}
+
+.header .nav.navbar-nav .not-link {
+  padding: 15px;
+  display: inline-block;
+}
+
+.header .nav.navbar-nav .stable,
+.header .nav.navbar-nav .beta,
+.header .nav.navbar-nav .private {
+  font-size: 9px;
+  padding: 3px 5px;
+  display: inline-block;
+  line-height: 8px;
+  -webkit-border-radius: 3px;
+  border-radius: 3px;
+  margin-left: 6px;
+  color: #fff;
+  top: -2px;
+  position: relative;
+  opacity: 0.6;
+  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)";
+  filter: alpha(opacity=60);
+}
+
+.header .nav.navbar-nav a:hover > .stable,
+.header .nav.navbar-nav a:hover > .beta,
+.header .nav.navbar-nav a:hover > .private {
+  opacity: 1;
+  -ms-filter: none;
+  filter: none;
+}
+
+.header .nav.navbar-nav .beta {
+  background-color: #59c3d1;
+}
+
+.header .nav.navbar-nav .stable {
+  background-color: #41b841;
+}
+
+.header .nav.navbar-nav .private {
+  background-color: #333;
+}
+
+.header #jumbotron {
+  margin: 55px 70px 50px;
+  text-align: center;
+}
+
+.header #jumbotron h2 {
+  margin-top: 0;
+  margin-bottom: 20px;
+}
+
+.header #jumbotron p {
+  margin-bottom: 0;
+  line-height: 1.6em;
+  font-size: 16px;
+}
+
+.header #jumbotron .btn {
+  margin-top: 20px;
+}
+
+.header .searchbox {
+  position: relative;
+  margin-right: 15px;
+  top: 9px;
+}
+
+.header .searchbox .fa-search {
+  position: absolute;
+  top: 8px;
+  right: 10px;
+  color: #777;
+  pointer-events: none;
+}
+
+.header .searchbox .typeahead {
+  line-height: 1.25em;
+  -webkit-transition: 0.3s ease-out;
+  -moz-transition: 0.3s ease-out;
+  -o-transition: 0.3s ease-out;
+  -ms-transition: 0.3s ease-out;
+  transition: 0.3s ease-out;
+  background-color: rgba(0, 0, 0, 0.05);
+  -webkit-border-radius: 5px;
+  border-radius: 5px;
+  width: 95px;
+}
+
+.header .searchbox .typeahead:focus,
+.header .searchbox .typeahead:active {
+  outline: 0 none;
+}
+
+.header .searchbox .tt-dropdown-menu {
+  max-width: 350px;
+  margin-left: -100px;
+}
+
+.header .searchbox .tt-dropdown-menu h3 {
+  width: 100px;
+  float: left;
+  margin: 0;
+  padding: 8px 0 6px 15px;
+  font-size: 13px;
+  color: #bbb;
+}
+
+.header .searchbox .tt-dropdown-menu .tt-suggestions {
+  display: block;
+  float: left;
+  width: 250px;
+}
+
+.header .searchbox .tt-dropdown-menu .tt-suggestions .tt-suggestion {
+  font-size: 14px;
+}
+
+.header .searchbox .tt-dropdown-menu .tt-suggestions .tt-suggestion p {
+  white-space: nowrap;
+  overflow: hidden;
+  -o-text-overflow: ellipsis;
+  text-overflow: ellipsis;
+}
+
+.header .searchbox .tt-cursor {
+  background-color: #eee;
+}
+
+.header .searchbox .tt-cursor p {
+  color: #fff;
+}
+
+.header .searchbox input {
+  border: 0 none;
+  display: inline-block;
+  font-size: 14px;
+  padding: 6px 32px 6px 12px;
+  margin: 0;
+}
+
+.header .searchbox input.tt-hint {
+  height: auto;
+}
+
+.header .searchbox.focus input {
+  width: 250px;
+}
+
+.theme-line header {
+  border-bottom: 8px solid;
+}
+
+.theme-line header h2 {
+  color: #aaa;
+}
+
+.theme-line header p {
+  color: #666;
+}
+
+.theme-line .navbar-nav {
+  color: #888;
+}
+
+.theme-line .navbar-nav a {
+  color: #bbb;
+}
+
+.theme-line.lumosity-light .searchbox .tt-cursor p {
+  color: rgba(0, 0, 0, 0.7);
+}
+
+.theme-line header {
+  border-bottom-color: #ec1c24;
+}
+
+.theme-line header a.btn {
+  background-color: #ec1c24;
+}
+
+.theme-line header a.btn:hover {
+  background-color: #950d12;
+}
+
+.theme-line header .navbar-nav a:hover, .theme-line header .navbar-nav .open > 
a {
+  color: #ec1c24;
+}
+
+.theme-line header .navbar-nav .tt-cursor {
+  background-color: #ec1c24;
+}
+
+.theme-line .navbar-nav .active a {
+  font-weight: bold;
+  color: #ec1c24;
+}
+
+.theme-line .navbar-nav .active a:hover {
+  color: #950d12;
+}
+
+.theme-line .main-links .links a:hover {
+  color: #ec1c24;
+}
+
+.theme-line .main-content a {
+  color: #ec1c24;
+}
+
+.theme-line .main-content a:hover {
+  color: #950d12;
+}
+
+.theme-line .sidebar-nav ul li a.active:before {
+  background-color: #ec1c24;
+}
+
+.theme-line .sidebar-nav ul li a.active {
+  color: #ec1c24;
+}
+
+.theme-line .sidebar-nav ul li a:hover, .theme-line .sidebar-nav ul li 
a.active:hover {
+  color: #950d12;
+}
+
+.theme-line .btn-primary {
+  background-color: #ec1c24;
+}
+
+.theme-line .btn-primary:hover {
+  background-color: #950d12;
+}
+
+.theme-line .main-content .nav-horizontal a.active {
+  border-color: #ec1c24;
+  color: #ec1c24;
+}
+
+.theme-line .main-content .nav-horizontal a:hover {
+  color: #950d12;
+}
+
+.theme-line .main-content .nav-horizontal a.active:hover {
+  border-color: #950d12;
+}
+
+.theme-line header .navbar-nav a.active, .theme-line #versions-list li a:hover 
strong, .theme-line #versions-list li a.active .current, .theme-line 
#versions-list li a:active .current {
+  color: #ec1c24;
+}
+
+.theme-line.body-threes .section-right .threes-nav .btn-default:hover, 
.theme-line.page-docs.body-threes .section-right .threes-nav .pull-right 
a:hover {
+  color: #ec1c24;
+  border-color: #ec1c24;
+}
+
+.body-overlap .main-content {
+  margin-top: 30px;
+}
+
+.body-box .main-content,
+.body-overlap .main-content {
+  padding: 30px;
+  -webkit-box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);
+  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);
+  background-color: #fff;
+}
+
+body {
+  font-weight: 400;
+  font-family: Roboto Slab, serif;;
+}
+
+h1, h2, h3, h4, h5, h6 {
+  font-weight: 700;
+  font-family: Roboto Slab, serif;;
+}
+
+.submit-vote.submit-vote-parent.voted a.submit-vote-button, 
.submit-vote.submit-vote-parent a.submit-vote-button:hover {
+  background-color: #ec1c24;
+}
+
+div.submit-vote.submit-vote-parent.voted a.submit-vote-button:hover {
+  background-color: #950d12;
+}
+
+a, .link .title {
+  color: #ec1c24;
+}
+
+a:hover, .link:hover .title {
+  color: #950d12;
+}
+
+.header h1.navbar-brand a {
+  background-image: 
url(https://www.filepicker.io/api/file/QagunjDGRFul2JgNCAli)
+}
+
+.header h1.navbar-brand {
+  width: 96px;
+}
+
+.block-edit-parameters {
+  text-align: right;
+  padding-bottom: 5px;
+}
+
+.ng-table-pager {
+  display: none;
+}
+
+.container-footer {
+  margin-top: 20px;
+}
+
+.vcenter {
+  //display: inline-block;
+  vertical-align: middle;
+  //float: none;
+}
+
+.border-right-remove {
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f8be2739/modules/webconfig/nodejs/routes/pages.js
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/routes/pages.js 
b/modules/webconfig/nodejs/routes/pages.js
index 99cf993..8f1e702 100644
--- a/modules/webconfig/nodejs/routes/pages.js
+++ b/modules/webconfig/nodejs/routes/pages.js
@@ -4,12 +4,12 @@ var router = express.Router();
 
 /* GET home page. */
 router.get('/', function(req, res) {
-  res.render('index', { title: 'Dashboard' });
+  res.redirect('clusters');
 });
 
-/* GET cluster page. */
-router.get('/cluster', function(req, res) {
-    res.render('cluster', { });
+/* GET clusters page. */
+router.get('/clusters', function(req, res) {
+    res.render('clusters', { });
 });
 
 /* GET cluster edit popup. */
@@ -17,6 +17,26 @@ router.get('/cluster/edit', function(req, res) {
     res.render('clusterEdit', {});
 });
 
+/* GET caches page. */
+router.get('/caches', function(req, res) {
+    res.render('caches', { });
+});
+
+/* GET persistence page. */
+router.get('/persistence', function(req, res) {
+    res.render('persistence', { });
+});
+
+/* GET sql page. */
+router.get('/sql', function(req, res) {
+    res.render('sql', { });
+});
+
+/* GET clients page. */
+router.get('/clients', function(req, res) {
+    res.render('clients', { });
+});
+
 // GET dropdown-menu template.
 router.get('/select', function(req, res) {
     res.render('templates/select', { });

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f8be2739/modules/webconfig/nodejs/views/caches.jade
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/views/caches.jade 
b/modules/webconfig/nodejs/views/caches.jade
new file mode 100644
index 0000000..60f5890
--- /dev/null
+++ b/modules/webconfig/nodejs/views/caches.jade
@@ -0,0 +1,10 @@
+extends layout
+block head
+block content
+    div.docs-header
+        h1 Caches
+        p Create and configure Ignite caches.
+        hr
+    div.docs-body(ng-controller='cachesRouter')
+block body
+    script(src='/javascripts/controllers/caches.js')
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f8be2739/modules/webconfig/nodejs/views/clients.jade
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/views/clients.jade 
b/modules/webconfig/nodejs/views/clients.jade
new file mode 100644
index 0000000..6a33b9a
--- /dev/null
+++ b/modules/webconfig/nodejs/views/clients.jade
@@ -0,0 +1,10 @@
+extends layout
+block head
+block content
+    div.docs-header
+        h1 Clients
+        p Create and configure Ignite clients.
+        hr
+    div.docs-body(ng-controller='clientsRouter')
+block body
+    script(src='/javascripts/controllers/clients.js')
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f8be2739/modules/webconfig/nodejs/views/cluster.jade
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/views/cluster.jade 
b/modules/webconfig/nodejs/views/cluster.jade
deleted file mode 100644
index 167be3b..0000000
--- a/modules/webconfig/nodejs/views/cluster.jade
+++ /dev/null
@@ -1,30 +0,0 @@
-extends layout
-block head
-    script(src='//ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.js')
-    
script(src='//ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular-sanitize.js')
-    
script(src='//cdnjs.cloudflare.com/ajax/libs/angular-strap/2.2.2/angular-strap.js')
-        
script(src='//cdnjs.cloudflare.com/ajax/libs/angular-strap/2.2.2/angular-strap.tpl.min.js')
-
-    link(rel='stylesheet', href='/stylesheets/ng-table.css')
-block content
-    div.container(ng-controller='clusterRouter')
-        div.box
-            div.box-header
-                h3.box-title Clusters Table
-                div.pull-right
-                    button.btn(ng-click='create()' 
data-animation="am-fade-and-scale") Create
-            div.box-body
-                table(ng-table="clustersTable" class=['table', 
'table-bordered', 'table-hover'])
-                    tr(ng-repeat="cluster in $data")
-                        td.text-center(data-title="'#'" sortable="'index'") 
{{$index + 1}}
-                        td.text-center(data-title="'Name'" sortable="'name'") 
{{cluster.name}}
-                        td.text-center(data-title="'Caches'" 
sortable="'caches'") {{cluster.caches}}
-                        td.text-center(data-title="'Discovery'" 
sortable="'discovery'") {{cluster.discovery}}
-                        td.pull-right(data-title="'Actions'" 
sortable="'actions'")
-                            button(class=['btn'] type='button' 
ng-click='edit(cluster)' data-animation="am-fade-and-scale")
-                                i(class=['fa', 'fa-edit'])
-                            button(class=['btn', 'btn-danger'] type='button' 
ng-click='delete(cluster)')
-                                i(class=['fa', 'fa-remove'])
-block body
-    script(src='/javascripts/ng-table.js')
-    script(src='/javascripts/controllers/clusters.js')
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f8be2739/modules/webconfig/nodejs/views/clusters.jade
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/views/clusters.jade 
b/modules/webconfig/nodejs/views/clusters.jade
new file mode 100644
index 0000000..c6c72f8
--- /dev/null
+++ b/modules/webconfig/nodejs/views/clusters.jade
@@ -0,0 +1,47 @@
+extends layout
+block head
+    
script(src='//ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular-sanitize.js')
+    
script(src='//cdnjs.cloudflare.com/ajax/libs/angular-strap/2.2.2/angular-strap.js')
+    
script(src='//cdnjs.cloudflare.com/ajax/libs/angular-strap/2.2.2/angular-strap.tpl.min.js')
+
+    link(rel='stylesheet', href='/stylesheets/ng-table.css')
+block content
+    div.docs-header
+        h1 Clusters
+        p Create and configure Ignite clusters.
+        hr
+    div.docs-body(ng-controller='clustersController')
+        div.block-edit-parameters
+            div(class=['btn-group'])
+                button(ng-click='add()' class=['btn', 'btn-default', 'fa', 
'fa-plus'] ) &nbspAdd
+        table(ng-table="clustersTable" class=['table', 'table-bordered', 
'table-hover'])
+            tr(ng-repeat="cluster in $data")
+                td(data-title="'#'" class=['text-center', 'vcenter'] 
style='width: 50px') {{$index + 1}}
+                td(data-title="'Name'" sortable="'name'" class=['text-center', 
'col-sm-4'])
+                    div(ng-if='!(edit.name && editIdx == $index)')
+                        span(ng-if='cluster.name') {{cluster.name}}
+                        span.pull-right(type='button' 
ng-click='beginEdit(cluster); edit.name = true' 
data-animation="am-fade-and-scale")
+                            i(class=['fa', 'fa-pencil'])
+                    div.input-group(ng-if='edit.name && editIdx == $index')
+                        input.form-control(type='text' ng-model='cluster.name')
+                        span.input-group-addon
+                            i(class=['fa', 'fa-repeat'] ng-click='revert(); 
edit.name = false')
+                            i(class=['fa', 'fa-save'] ng-click='submit(); 
edit.name = false' style='margin-left: 10px;')
+                td.text-center(data-title="'Discovery'" sortable="'discovery'")
+                    div(ng-if='!(edit.discovery && editIdx == $index)')
+                        span(ng-if='cluster.discovery') 
{{discoveryAsString(cluster.discovery)}}
+                        span.pull-right(type='button' 
ng-click='beginEdit(cluster); edit.discovery = true' 
data-animation="am-fade-and-scale")
+                            i(class=['fa', 'fa-pencil'])
+                    div.input-group(ng-if='edit.discovery && editIdx == 
$index')
+                        button(class=['btn', 'btn-default', 'form-control', 
'pull-right'] style='width: 85%' data-placement='bottom-center' 
ng-model='cluster.discovery' data-template='/select' data-placeholder='Choose 
discovery' bs-options='discovery.value as discovery.label for discovery in 
discoveries' bs-select)
+                            span.caret
+                        span.input-group-addon
+                            i(class=['fa', 'fa-repeat'] ng-click='revert(); 
edit.discovery = false')
+                            i(class=['fa', 'fa-save'] ng-click='submit(); 
edit.discovery = false' style='margin-left: 10px;')
+                td(data-title="'Delete'" class=['col-sm-1'])
+                    center
+                        span(type='button' ng-click='delete(cluster)')
+                            i(class=['fa', 'fa-remove'])
+block body
+    script(src='/javascripts/ng-table.js')
+    script(src='/javascripts/controllers/clusters.js')
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f8be2739/modules/webconfig/nodejs/views/includes/footer.jade
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/views/includes/footer.jade 
b/modules/webconfig/nodejs/views/includes/footer.jade
index 66d83c8..5816240 100644
--- a/modules/webconfig/nodejs/views/includes/footer.jade
+++ b/modules/webconfig/nodejs/views/includes/footer.jade
@@ -1,8 +1,7 @@
-footer.main-footer
-    .pull-right.hidden-xs
-        b Version
-        |  1.1.0
-    strong
-        | Powered by
-        a(href='http://ignite.incubator.apache.org')  Apache Ignite
-        | .
\ No newline at end of file
+div(class=['container', 'container-footer'])
+    footer
+        center
+            p
+                | Powered by
+                a(href='http://ignite.incubator.apache.org')  Apache Ignite
+                | , version 1.1.0
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f8be2739/modules/webconfig/nodejs/views/includes/header.jade
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/views/includes/header.jade 
b/modules/webconfig/nodejs/views/includes/header.jade
index f1597b7..689f7cc 100644
--- a/modules/webconfig/nodejs/views/includes/header.jade
+++ b/modules/webconfig/nodejs/views/includes/header.jade
@@ -1,28 +1,10 @@
-header.main-header
-    <!-- Logo -->
-    a(href='/' class='logo')
-        <!-- logo for regular state and mobile devices -->
-        span.logo-lg(style='vertical-align: middle')
-            img.pull-left(src='images/logo.png' alt='Apache Ignite 
Web-Configurator')
-    <!-- Sidebar toggle button-->
-    //a.sidebar-toggle(href='#' data-toggle='offcanvas' role='button')
-    //    span.sr-only Toggle navigation
-    //    span.icon-bar
-    //    span.icon-bar
-    //    span.icon-bar
-    nav(class=['navbar', 'navbar-static-top'] role='navigation')
-        div.navbar-custom-menu
-//nav(class=['navbar', 'navbar-default', 'navbar-fixed-top', 'navbar-style'])
-//    div.container
-//        div.navbar-header
-//            a(href='#')
-//                img(src='images/logo.png' alt='ApacheIgnite')
-//        div(class=[ 'navbar-collapse', 'collapse'])
-//            ul(class=['nav', 'navbar-nav', 'navbar-right'], 
style='margin-top: 5px')
-//                li
-//                    a(href='#') Settings
-//                li
-//                    a(href='#') Profile
-//                li
-//                    a(href='#') Log In
-
+header.header(id='header')
+    div.container
+        h1.navbar-brand
+            a(href='/') Apache Ignite Web Configurator
+        div(class=['navbar-collapse', 'collapse'])
+            ul(class=['nav', 'navbar-nav', 'pull-right'])
+                li(ng-show='user')
+                    // TODO
+                li(ng-show='!user' class=['nav-login'])
+                    a(ng-click='login()' href='#') Log In
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f8be2739/modules/webconfig/nodejs/views/index.jade
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/views/index.jade 
b/modules/webconfig/nodejs/views/index.jade
deleted file mode 100644
index 4d99d2a..0000000
--- a/modules/webconfig/nodejs/views/index.jade
+++ /dev/null
@@ -1,3 +0,0 @@
-extends layout
-
-block content

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f8be2739/modules/webconfig/nodejs/views/layout.jade
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/views/layout.jade 
b/modules/webconfig/nodejs/views/layout.jade
index d93ff43..2281679 100644
--- a/modules/webconfig/nodejs/views/layout.jade
+++ b/modules/webconfig/nodejs/views/layout.jade
@@ -1,60 +1,56 @@
 doctype html
 html(ng-app='ignite-web-configurator')
-    head
+   head
         title= title
-
         //add bootstrap dependencies from CDNjs. Using a CDN to distribute 
these files puts less pressure
         //on our web server and will be delivered faster to the client than 
our own server.
         link(rel='stylesheet', 
href='//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.4/css/bootstrap.css')
 
         // Font Awesome Icons
         link(rel='stylesheet', 
href='//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.css')
+        link(rel='stylesheet', 
href='//fonts.googleapis.com/css?family=Roboto+Slab:700:serif|Roboto+Slab:400:serif')
 
         // AdminLTE
-        link(rel='stylesheet', href='/stylesheets/AdminLTE.css')
+        //link(rel='stylesheet', href='/stylesheets/AdminLTE.css')
         script(src='//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.js')
-        script(src='/javascripts/AdminLTE.js')
+        //script(src='/javascripts/AdminLTE.js')
+
+        
script(src='//ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.js')
+
+        script(src='/javascripts/bundle.js')
 
         // Site style
-        link(rel='stylesheet', href='/stylesheets/skin-ignite.css')
+        //link(rel='stylesheet', href='/stylesheets/skin-ignite.css')
         link(rel='stylesheet', href='/stylesheets/style.css')
 
         block head
-    body.skin-ignite
-        div.wrapper
-            include includes/header
-
-            <!-- Sidebar -->
-            aside.main-sidebar
-                section.sidebar
-                    ul.sidebar-menu
-                        li.acitve
-                            a(href="/cluster") Cluster
-                        li.treeview
-                            a(href="#")
-                                span Caches
-                                i(class=['fa', 'fa-angle-right', 'pull-left'])
-                            ul.treeview-menu
-                                li
-                                    a(href="/caches") Caches level 2
-                                li
-                                    a(href="/caches") Caches level 2
-                        li
-                            a(href="/persistence") Persistence
-                        li
-                            a(href="/sql") SQL
-                        li
-                            a(href="/clients") Clients
-
-            div.content-wrapper
-                <!-- Content Header (Page header) -->
-                section.content-header
-                    block content-header
-                <!-- Content (Page content) -->
-                section.content
-                    block content
-
-            include includes/footer
-
-        <!-- Custom script load -->
-        block body
\ No newline at end of file
+   body(class=['theme-line', 'body-overlap'])
+       div.wrapper
+           include includes/header
+
+           div(class=['container', 'body-container'])
+               div.main-content
+                   div.main-head
+                       div.row
+                           div(class=['col-sm-2', 'border-right', 
'section-left'])
+                               div.sidebar-nav
+                                   ul(ng-controller='activeLink' class="menu")
+                                       li
+                                           a(ng-class="{active: 
isActive('/clusters')}" href='/clusters') Clusters
+                                       li
+                                           a(ng-class="{active: 
isActive('/caches')}" href='/caches') Caches
+                                       li
+                                           a(ng-class="{active: 
isActive('/persistence')}" href='/persistence') Persistence
+                                       li
+                                           a(ng-class="{active: 
isActive('/sql')}" href='/sql') SQL
+                                       li
+                                           a(ng-class="{active: 
isActive('/clients')}" href='/clients') Clients
+                           div(class=['col-sm-10', 'border-left', 
'section-right'])
+                               div.docs-content
+                                   block content
+
+           include includes/footer
+       <!-- Custom script load -->
+       script(src='/javascripts/controllers/sidebar.js')
+
+       block body
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f8be2739/modules/webconfig/nodejs/views/persistence.jade
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/views/persistence.jade 
b/modules/webconfig/nodejs/views/persistence.jade
new file mode 100644
index 0000000..95086d6
--- /dev/null
+++ b/modules/webconfig/nodejs/views/persistence.jade
@@ -0,0 +1,10 @@
+extends layout
+block head
+block content
+    div.docs-header
+        h1 Persistence
+        p Create and configure Ignite persistence.
+        hr
+    div.docs-body(ng-controller='persistentRouter')
+block body
+    script(src='/javascripts/controllers/persistent.js')
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f8be2739/modules/webconfig/nodejs/views/sql.jade
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/views/sql.jade 
b/modules/webconfig/nodejs/views/sql.jade
new file mode 100644
index 0000000..fc680ef
--- /dev/null
+++ b/modules/webconfig/nodejs/views/sql.jade
@@ -0,0 +1,10 @@
+extends layout
+block head
+block content
+    div.docs-header
+        h1 SQL
+        p Create and configure Ignite SQL settings.
+        hr
+    div.docs-body(ng-controller='sqlRouter')
+block body
+    script(src='/javascripts/controllers/sql.js')
\ No newline at end of file

Reply via email to