ignite-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From anovi...@apache.org
Subject incubator-ignite git commit: # ignite-843 WIP.
Date Tue, 02 Jun 2015 08:20:14 GMT
Repository: incubator-ignite
Updated Branches:
  refs/heads/ignite-843 f85ed7532 -> 14490724f


# ignite-843 WIP.


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

Branch: refs/heads/ignite-843
Commit: 14490724ffcd40a1d36439ec5e3ec38bca94eb37
Parents: f85ed75
Author: Andrey <anovikov@gridgain.com>
Authored: Tue Jun 2 15:20:25 2015 +0700
Committer: Andrey <anovikov@gridgain.com>
Committed: Tue Jun 2 15:20:25 2015 +0700

----------------------------------------------------------------------
 modules/webconfig/nodejs/db.js                  |  50 +++++-
 .../public/javascripts/controllers/clusters.js  |  76 ++++----
 .../public/javascripts/controllers/common.js    |  21 +++
 .../nodejs/public/stylesheets/style.css         |   2 +-
 .../nodejs/public/stylesheets/style.less        | 174 +++++++++++++------
 modules/webconfig/nodejs/routes/clusters.js     |  23 ++-
 modules/webconfig/nodejs/views/clusters.jade    |  83 ++++-----
 7 files changed, 285 insertions(+), 144 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/14490724/modules/webconfig/nodejs/db.js
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/db.js b/modules/webconfig/nodejs/db.js
index 70b9bac..36b7151 100644
--- a/modules/webconfig/nodejs/db.js
+++ b/modules/webconfig/nodejs/db.js
@@ -45,17 +45,55 @@ exports.Space =  mongoose.model('Space', new Schema({
     }]
 }));
 
-// Define cluster model.
-exports.Cluster =  mongoose.model('Cluster', new Schema({
+var DiscoveryObj = {
+    className: String, enum: ['TcpDiscoveryVmIpFinder', 'TcpDiscoveryMulticastIpFinder', 'TcpDiscoveryS3IpFinder',
+        'TcpDiscoveryCloudIpFinder', 'TcpDiscoveryGoogleStorageIpFinder', 'TcpDiscoveryJdbcIpFinder',
+        'TcpDiscoverySharedFsIpFinder'],
+    addresses: [String]
+};
+
+// Define discovery model.
+exports.Discovery =  mongoose.model('Discovery', new Schema(DiscoveryObj));
+
+var ClusterSchema = new Schema({
     space: { type: ObjectId, ref: 'Space' },
     name: String,
-    discovery: { type: String, enum: ['TcpDiscoveryVmIpFinder', 'TcpDiscoveryMulticastIpFinder'] },
-    addresses: [String],
+    discovery: {
+        kind: { type: String, enum: ['Vm', 'Multicast', 'S3', 'Cloud', 'GoogleStorage', 'Jdbc', 'SharedFs'] },
+        addresses: [String]
+    },
     pubPoolSize: Number,
     sysPoolSize: Number,
     mgmtPoolSize: Number,
     p2pPoolSize: Number
-}));
+});
+
+// Define cluster model.
+exports.Cluster =  mongoose.model('Cluster', ClusterSchema);
+
+//ClusterSchema.pre('save', function(next) {
+//    // swap account model for the id
+//    var id = this._doc.discovery._id;
+//    //save the account model, which fires it's own middleware
+//    this._doc.discovery.save();
+//    // reset the account to the id before it is saved
+//    this._doc.discovery = id;
+//
+//    next();
+//});
+
+ClusterSchema.pre('remove', function(next) {
+    var discovery = false;
+
+    if (this._doc && this._doc.discovery) discovery = {_id:this._doc.discovery._id};
+
+    Discovery.remove(discovery, function(err) {
+        if (err)
+            next(err);
+
+        next();
+    });
+});
 
 // Define cache model.
 exports.Cache =  mongoose.model('Cache', new Schema({
@@ -76,7 +114,7 @@ exports.upsert = function(model, data, cb){
         model.findOneAndUpdate({_id: id}, data, cb);
     }
     else
-        model.create(data, cb);
+        new model(data).save(cb);
 };
 
 exports.mongoose = mongoose;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/14490724/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 b65c689..51b9fe9 100644
--- a/modules/webconfig/nodejs/public/javascripts/controllers/clusters.js
+++ b/modules/webconfig/nodejs/public/javascripts/controllers/clusters.js
@@ -15,32 +15,30 @@
  * limitations under the License.
  */
 
-configuratorModule.controller('clustersController', ['$scope', '$modal', '$http',
-    function($scope, $modal, $http) {
+configuratorModule.controller('clustersController', ['$scope', '$modal', '$http', function($scope, $modal, $http) {
         $scope.templates = [
-            {value: {discovery: 'TcpDiscoveryVmIpFinder', addresses: ['127.0.0.1:47500..47510']}, label: 'Local'},
-            {value: {discovery: 'TcpDiscoveryMulticastIpFinder'}, label: 'Basic'}
+            {value: {discovery: {kind: 'Vm', addresses: ['127.0.0.1:47500..47510']}}, label: 'Local'},
+            {value: {discovery: {kind: 'Multicast'}}, label: 'Basic'}
         ];
 
         $scope.discoveries = [
-            {value: 'TcpDiscoveryVmIpFinder', label: 'Static IPs'},
-            {value: 'TcpDiscoveryMulticastIpFinder', label: 'Multicast'},
-            {value: 'TcpDiscoveryS3IpFinder', label: 'AWS S3'},
-            {value: 'TcpDiscoveryCloudIpFinder', label: 'Apache jclouds'},
-            {value: 'TcpDiscoveryGoogleStorageIpFinder', label: 'Google Cloud Storage'},
-            {value: 'TcpDiscoveryJdbcIpFinder', label: 'JDBC'},
-            {value: 'TcpDiscoverySharedFsIpFinder', label: 'Shared Filesystem'}
+            {value: 'Vm', label: 'Static IPs'},
+            {value: 'Multicast', label: 'Multicast'},
+            {value: 'S3', label: 'AWS S3'},
+            {value: 'Cloud', label: 'Apache jclouds'},
+            {value: 'GoogleStorage', label: 'Google Cloud Storage'},
+            {value: 'Jdbc', label: 'JDBC'},
+            {value: 'SharedFs', label: 'Shared Filesystem'}
         ];
 
-        $scope.discoveryAsString = function(value) {
-            for (var i = 0; i < $scope.discoveries.length; i++) {
-                var discovery = $scope.discoveries[i];
+        $scope.clusters = [];
 
-                if (discovery.value == value)
-                    return discovery.label;
-            }
+        $scope.discoveryAsString = function(value) {
+            var discovery = $scope.discoveries.find(function(discovery) {
+                return discovery.value == value;
+            });
 
-            return 'Wrong discovery';
+            return discovery ? discovery.label : 'Wrong discovery';
         };
 
         // Create popup for discovery advanced settings.
@@ -58,27 +56,41 @@ configuratorModule.controller('clustersController', ['$scope', '$modal', '$http'
             });
 
         $scope.selectItem = function(item) {
-            $scope.backupItem = item.isSelected ? angular.copy(item) : undefined;
+            $scope.selectedCluster = item;
+
+            $scope.backupItem = angular.copy(item);
         };
 
         // Add new cluster.
         $scope.createItem = function() {
             var item = angular.copy($scope.create.template);
 
-            item.name = $scope.create.name;
+            item.name = 'Cluster ' + ($scope.clusters.length + 1);
             item.space = $scope.spaces[0]._id;
 
-            $scope.create = {};
+            $http.post('/rest/clusters/save', item)
+                .success(function(_id) {
+                    item._id = _id;
 
-            $scope.saveCluster(item);
+                    $scope.clusters.push(item);
+                })
+                .error(function(errorMessage) {
+                    console.log('Error: ' + errorMessage);
+                });
         };
 
         // Remove new cluster.
         $scope.removeItem = function(_id) {
             $http.post('/rest/clusters/remove', {_id: _id})
                 .success(function(data) {
-                    $scope.spaces = data.spaces;
-                    $scope.clusters = data.clusters;
+                    for (var i = 0; i < $scope.clusters.length; i++) {
+                        if ($scope.clusters[i]._id == _id) {
+                            $scope.clusters.slice(i, 1);
+
+                            break;
+                        }
+                    }
+
                 })
                 .error(function(errorMessage) {
                     console.log('Error: ' + errorMessage);
@@ -87,17 +99,23 @@ configuratorModule.controller('clustersController', ['$scope', '$modal', '$http'
 
         // Save cluster in db.
         $scope.saveCluster = function (cluster) {
+            //console.log(cluster);
+
             $http.post('/rest/clusters/save', cluster)
-                .success(function(data) {
-                    $scope.spaces = data.spaces;
+                .success(function() {
+                    for (var i = 0; i < $scope.clusters.length; i++) {
+                        if ($scope.clusters[i]._id == cluster._id) {
+                            console.log($scope.clusters[i]);
 
-                    $scope.clusters = data.clusters;
+                            $scope.clusters[i] = angular.copy(cluster);
 
-                    $scope.backupItem = undefined;
+                            break;
+                        }
+                    }
                 })
                 .error(function(errorMessage) {
                     console.log('Error: ' + errorMessage);
                 });
-        }
+        };
     }]
 );
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/14490724/modules/webconfig/nodejs/public/javascripts/controllers/common.js
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/public/javascripts/controllers/common.js b/modules/webconfig/nodejs/public/javascripts/controllers/common.js
index e75be82..6e82bf1 100644
--- a/modules/webconfig/nodejs/public/javascripts/controllers/common.js
+++ b/modules/webconfig/nodejs/public/javascripts/controllers/common.js
@@ -17,6 +17,27 @@
 
 var configuratorModule =  angular.module('ignite-web-configurator', ['smart-table', 'mgcrea.ngStrap']);
 
+configuratorModule.directive('st-custom-action', function() {
+        var directiveConfig = {
+            restrict: "AE",
+            require: '^stTable',
+            link: function(scope, element, attrs, ctrl) {
+                var table = ctrl.tableState();
+                element.on('click', function(ev) {
+                    scope.callback.call().then(function(result) {
+                        if (result) {
+                            ctrl.pipe();
+                        }
+                    });
+                });
+            },
+            scope: {
+                callback: "&"
+            }
+        };
+        return directiveConfig;
+    });
+
 configuratorModule.controller('activeLink', ['$scope', function($scope) {
     $scope.isActive = function(path) {
         return window.location.pathname.substr(0, path.length) == path;

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/14490724/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 c6448b5..dc3b6dd 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}.fa.fa-remove{color:red}.border-left{-webkit-box-shadow:1px 0 0 0 #eee inset;box-shadow:1px 0 0 0 #eee inset}.border-right{-webkit-box-shadow:1px 0 0 0 #eee;box-shadow:1px 0 0 0 #eee}.theme-line{background-color:#f9f9f9}.t
 heme-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:ac
 tive .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;ba
 ckground-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;d
 isplay: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:blo
 ck;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:0}.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-suggesti
 ons .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.bod
 y-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-b
 ottom:5px}.ng-table-pager{display:none}.container-footer{margin-top:20px}.vcenter{vertical-align:middle}.modal{display:block;overflow:hidden}.modal .close{position:absolute;top:24px;right:24px;float:none}.modal .modal-dialog{width:610px}.modal .modal-content{-webkit-border-radius:0;border-radius:0;background-color:#f7f7f7}.modal .modal-content .modal-header{background-color:#fff;text-align:center;color:#555;padding:24px;font-family:"myriad-pro",sans-serif}.modal .modal-content .modal-header h4{font-family:"myriad-pro",sans-serif;font-size:22px}.modal .modal-content .modal-header h4 .fa{display:block;font-size:41px;color:#ddd;margin-bottom:5px}.modal .modal-content .modal-header p{margin:0;color:#aaa;font-size:1em;margin-top:3px}.modal .modal-content .modal-spacer{padding:10px 10px 0 10px}.modal .modal-content .modal-footer{margin-top:0}.modal-body{padding-top:30px}h1.ignite-logo{background-image:url("https://www.filepicker.io/api/file/QagunjDGRFul2JgNCAli")}.st-sort-ascent:after{fon
 t-family:FontAwesome, serif;content:'\f077'}.st-sort-descent:after{font-family:FontAwesome, serif;content:'\f078'}.st-selected{background:#216eff;color:white}.docs-content table{width:100%;border-top:1px solid #ccc;border-left:1px solid #ccc;margin-bottom:30px}.docs-content th{text-align:center;border-right:1px solid #ccc;border-bottom:1px solid #ccc;background-color:#f7f7f7;padding:5px}.docs-content td{text-align:center;border-right:1px solid #ccc;border-bottom:1px solid #ccc;vertical-align:middle;padding:5px}.docs-content td>.input-group{display:block}.docs-content td>.input-group input{width:50%}.docs-content td>.input-group button{width:50%;border-left:0}.block-display-image img{max-width:100%;max-height:450px;margin:auto;display:block}.greedy{min-height:200px;height:calc(100vh - 230px)}.advanced{border-width:0 0 1px 0}@media (min-width:768px){.navbar-nav>li>a{padding-top:20px;padding-bottom:10px}}
\ 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 0 0 #eee inset;box-shadow:1px 0 0 0 #eee inset}.border-right{-webkit-box-shadow:1px 0 0 0 #eee;box-shadow:1px 0 0 0 #eee}.theme-line{background-color:#f9f9f9}.t
 heme-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:ac
 tive .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;ba
 ckground-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;d
 isplay: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:blo
 ck;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:0}.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-suggesti
 ons .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 header{border-bottom-color:#ec1c24}.theme-line .navbar-nav{color:#888}.theme-line .navbar-nav a{color:#bbb}.theme-line header a.btn{background-color:#ec1c24}.theme-line header a.btn:hover{background-color:#950d12}.theme-line header .navbar-nav .tt-cursor{background-color:#ec1c24}.theme-line header .navbar-nav a:hover,.theme-line header .navbar-nav .open>a{color:#ec1c24}.theme-line .navbar-nav .active a{font-weight:bold;color:#ec1c24}.theme-line .navbar-nav .active a:hover{co
 lor:#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-d
 ocs.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}.modal{display:block;overflow:hidden}.modal .close{position:absolute;top:24px;right:24px;float:none}.modal .modal-dialog{width:610px}.modal .modal-content{-webkit-border-radius:0;border-radius:0;background-color:#f7f7f7}.modal .modal-content .modal-header{background-color:#fff;text-align:center;color:#555;padding:24px;font-family:"myriad-pro",sans-serif}.modal .modal-content .modal-header h4{font-family:"myriad-pro",sans-serif;font-size:22px}.modal .modal-content .modal-header h4 .fa{display:block;font-size:41px;color:#ddd;margin-bottom:5px}.modal .modal-content .modal-header p{margin:0;color:#aaa;font-size:1em;margin-top:3px}.modal .modal-content .modal-spacer{padding:10px 10px 0 10px}.modal .modal-content .modal-footer{margin-top:0}.modal-body{padding-top:30px}h1.ignite-logo{background-image:url("https://www.filepicker.io/api/file/QagunjDGRFul2JgNCAli")}.st-sort-ascent:after{font-family:FontAwesome, serif;content:'\f07
 7'}.st-sort-descent:after{font-family:FontAwesome, serif;content:'\f078'}.block-display-image img{max-width:100%;max-height:450px;margin:auto;display:block}.greedy{min-height:200px;height:calc(100vh - 230px)}@media (min-width:768px){.navbar-nav>li>a{padding-top:20px;padding-bottom:10px}}.settings-row{display:block;margin:0.65em 0;padding-left:18px}.settings-row [class*="col-"]{display:inline-block;vertical-align:middle;float:none;padding-left:0 !important;padding-right:0 !important}button{margin-right:4px}h1,h2,h3{-webkit-user-select:none;font-weight:normal;line-height:1}h3{color:black;font-size:1.2em;margin-bottom:0.8em}table tr:hover{cursor:pointer}.input-group{display:inline-block}.input-group .form-control{width:auto;margin-left:0;margin-right:0}.form-control{display:inline-block}.panel-heading .panel-title{margin-left:-18px}.theme-line .links table a{color:#666}.theme-line .links table a:hover{color:#ec1c24}.theme-line .links table .active a{font-weight:bold;color:#ec1c24}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/14490724/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 4da5ea8..5cc2dc6 100644
--- a/modules/webconfig/nodejs/public/stylesheets/style.less
+++ b/modules/webconfig/nodejs/public/stylesheets/style.less
@@ -577,6 +577,10 @@
   color: #666;
 }
 
+.theme-line header {
+  border-bottom-color: #ec1c24;
+}
+
 .theme-line .navbar-nav {
   color: #888;
 }
@@ -585,14 +589,6 @@
   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;
 }
@@ -601,14 +597,14 @@
   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 header .navbar-nav a:hover, .theme-line header .navbar-nav .open > a {
+  color: #ec1c24;
+}
+
 .theme-line .navbar-nav .active a {
   font-weight: bold;
   color: #ec1c24;
@@ -691,7 +687,7 @@ body {
 
 h1, h2, h3, h4, h5, h6 {
   font-weight: 700;
-  font-family: Roboto Slab, serif;;
+  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 {
@@ -732,9 +728,9 @@ a:hover, .link:hover .title {
 }
 
 .vcenter {
-  //display: inline-block;
+  display: inline-block;
   vertical-align: middle;
-  //float: none;
+  float: none;
 }
 
 .border-right-remove {
@@ -817,46 +813,46 @@ h1.ignite-logo {
   content: '\f078';
 }
 
-.st-selected {
-  background: #216eff;
-  color: white;
-}
-
-.docs-content table {
-  width: 100%;
-  border-top: 1px solid #ccc;
-  border-left: 1px solid #ccc;
-  margin-bottom: 30px;
-}
-
-.docs-content th {
-  text-align: center;
-  border-right: 1px solid #ccc;
-  border-bottom: 1px solid #ccc;
-  background-color: #f7f7f7;
-  padding: 5px;
-}
-
-.docs-content td {
-  text-align: center;
-  border-right: 1px solid #ccc;
-  border-bottom: 1px solid #ccc;
-  vertical-align: middle;
-  padding: 5px;
-}
-
-.docs-content td > .input-group {
-  input {
-    width: 50%;
-  }
+//.st-selected {
+//  background: #216eff;
+//  color: white;
+//}
 
-  button {
-    width: 50%;
-    border-left: 0;
-  }
+//.docs-content table {
+//  width: 100%;
+//  border-top: 1px solid #ccc;
+//  border-left: 1px solid #ccc;
+//  margin-bottom: 30px;
+//}
+//
+//.docs-content th {
+//  text-align: center;
+//  border-right: 1px solid #ccc;
+//  border-bottom: 1px solid #ccc;
+//  background-color: #f7f7f7;
+//  padding: 5px;
+//}
+//
+//.docs-content td {
+//  text-align: center;
+//  border-right: 1px solid #ccc;
+//  border-bottom: 1px solid #ccc;
+//  vertical-align: middle;
+//  padding: 5px;
+//}
 
-  display: block;
-}
+//.docs-content td > .input-group {
+//  input {
+//    width: 50%;
+//  }
+//
+//  button {
+//    width: 50%;
+//    border-left: 0;
+//  }
+//
+//  display: block;
+//}
 
 .block-display-image img {
   max-width: 100%;
@@ -870,13 +866,77 @@ h1.ignite-logo {
   height: ~"calc(100vh - 230px)";
 }
 
-.advanced {
-  border-width: 0 0 1px 0;
-}
-
 @media (min-width: 768px) {
   .navbar-nav > li > a {
     padding-top: 20px;
     padding-bottom: 10px;
   }
+}
+
+
+.settings-row {
+  display: block;
+  margin: 0.65em 0;
+  padding-left: 18px;
+
+  [class*="col-"] {
+    display: inline-block;
+    vertical-align: middle;
+    float: none;
+
+    padding-left: 0 !important;
+    padding-right: 0 !important;
+  }
+}
+
+button {
+  margin-right: 4px;
+}
+
+h1,
+h2,
+h3 {
+  -webkit-user-select: none;
+  font-weight: normal;
+  /* Makes the vertical size of the text the same for all fonts. */
+  line-height: 1;
+}
+
+h3 {
+  color: black;
+  font-size: 1.2em;
+  margin-bottom: 0.8em;
+}
+
+table tr:hover{ cursor:pointer; }
+
+.input-group {
+  display: inline-block;
+}
+
+.input-group .form-control {
+  width: auto;
+  margin-left: 0;
+  margin-right: 0;
+}
+
+.form-control {
+  display: inline-block;
+}
+
+.panel-heading .panel-title {
+  margin-left: -18px;
+}
+
+.theme-line .links table a {
+  color: #666;
+}
+
+.theme-line .links table a:hover {
+  color: #ec1c24;
+}
+
+.theme-line .links table .active a {
+  font-weight: bold;
+  color: #ec1c24;
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/14490724/modules/webconfig/nodejs/routes/clusters.js
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/routes/clusters.js b/modules/webconfig/nodejs/routes/clusters.js
index 4d947a6..cd33d5e 100644
--- a/modules/webconfig/nodejs/routes/clusters.js
+++ b/modules/webconfig/nodejs/routes/clusters.js
@@ -57,12 +57,23 @@ router.get('/', function(req, res) {
  * Save cluster.
  */
 router.post('/save', function(req, res) {
-    db.upsert(db.Cluster, req.body, function(err) {
-        if (err)
-            return res.status(500).send(err);
+    if (req.body._id)
+        db.Cluster.update({_id: req.body._id}, req.body, {upsert: true}, function(err) {
+            if (err)
+                return res.send(err);
 
-        selectAll(req, res);
-    });
+            res.sendStatus(200);
+        });
+    else {
+        var cluster = new db.Cluster(req.body);
+
+        cluster.save(function(err, cluster) {
+            if (err)
+                return res.send(err.message);
+
+            res.send(cluster._id);
+        });
+    }
 });
 
 /**
@@ -73,7 +84,7 @@ router.post('/remove', function(req, res) {
         if (err)
             return res.send(err);
 
-        selectAll(req, res);
+        res.sendStatus(200);
     })
 });
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/14490724/modules/webconfig/nodejs/views/clusters.jade
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/views/clusters.jade b/modules/webconfig/nodejs/views/clusters.jade
index 1c474e0..4dceaa7 100644
--- a/modules/webconfig/nodejs/views/clusters.jade
+++ b/modules/webconfig/nodejs/views/clusters.jade
@@ -25,63 +25,56 @@ block content
         p Create and configure Ignite clusters.
         hr
     .docs-body(ng-controller='clustersController')
-        table(st-table='rowCollection' st-safe-src='clusters')
-            thead
-                tr
-                    th(style='width: 50px') #
-                    th(st-sort='name') Name
-                    th.col-sm-1 Action
-            tbody
-                tr(st-select-row='row' ng-click='selectItem(row)' st-select-mode='single' ng-repeat='row in rowCollection')
-                    td {{$index + 1}}
-                    td {{row.name}}
-                    td
-                        span(type='button' ng-click='removeItem(row._id)')
-                            i(class=['fa', 'fa-remove'])
-            tfoot
-                tr
-                    td
-                    td
-                        .input-group
-                            input.form-control(type='text' name='name' ng-model='create.name' placeholder='Enter cluster name')
-                            button(class=['form-control'] ng-model='create.template' data-placement='bottom-center' data-template='/select' data-placeholder='Choose cluster template' bs-options='item.value as item.label for item in templates' bs-select)
-                    td
-                        button(ng-click='createItem()' class=['btn', 'btn-success', 'fa', 'fa-plus'] ng-disabled='!(create.name && create.template)') &nbspCreate
+        h3 Clusters
+        .settings-row.links
+            table(st-table='rowCollection' st-safe-src='clusters')
+                tbody
+                    tr.col-xs-12(ng-repeat='row in rowCollection')
+                        td.col-xs-12(ng-class="{active: row == selectedCluster}")
+                            a(ng-click='selectItem(row)') Name: {{row.name}}, Discovery: {{discoveryAsString(row.discovery.kind)}}
+                            span.pull-right(type='button' st-custom-action callback='removeItem(row._id)')
+                                i(class=['fa', 'fa-remove'])
+        .settings-row
+            button(ng-click='createItem()' class=['btn', 'btn-default'] ng-disabled='!create.template') &nbspAdd cluster...
+                span.input-group-btn
+                    button(class=['btn', 'btn-default'] ng-model='create.template' data-placement='bottom-center' data-template='/select' data-placeholder='Choose cluster template' bs-options='item.value as item.label for item in templates' bs-select)
         form.form-horizontal(name='editForm' ng-if='backupItem')
-            .form-group
-                label.control-label.col-sm-4 Name:
-                .col-sm-8
+            h3 General
+            .settings-row
+                span.col-xs-2 Name:
+                .col-xs-4
                     input.form-control(type='text' ng-model='backupItem.name')
-            .form-group
-                label.control-label.col-sm-4 Discovery:
+            .settings-row
+                span.col-xs-2 Discovery:
                 .col-sm-8
                     .input-group
-                        button.form-control(ng-model='backupItem.discovery' data-placement='bottom-center' data-template='/select' data-placeholder='Choose discovery' bs-options='item.value as item.label for item in discoveries' bs-select)
+                        button.form-control(ng-model='backupItem.discovery.kind' data-placement='bottom-center' data-template='/select' data-placeholder='Choose discovery' bs-options='item.value as item.label for item in discoveries' bs-select)
                         span.input-group-btn
                             button(class=['btn', 'btn-default'] ng-click='editDiscovery(cluster)')
                                 i(class=['fa', 'fa-bars'])
-            .panel.advanced(bs-collapse data-start-collapsed='true')
+            .panel(bs-collapse data-start-collapsed='true')
                 .panel-collapse(bs-collapse-target)
-                    .form-group
-                        label.control-label.col-sm-4 Public thread pool size:
-                        .col-sm-8
-                            input.form-control(type='text' ng-model='backupItem.pubPoolSize')
-                    .form-group
-                        label.control-label.col-sm-4 System thread pool size:
-                        .col-sm-8
-                            input.form-control(type='text' ng-model='backupItem.sysPoolSize')
-                    .form-group
-                        label.control-label.col-sm-4 Management thread pool size:
-                        .col-sm-8
+                    h3 Thread pool size
+                    .settings-row
+                        span.col-xs-2 Public:
+                        .col-xs-4
+                            input.form-control(type='text' ng-model='backupItem.pubPoolSize' placeholder='max(8, availableProcessors) * 2')
+                    .settings-row
+                        span.col-xs-2 System:
+                        .col-xs-4
+                            input.form-control(type='text' ng-model='backupItem.sysPoolSize' placeholder='max(8, availableProcessors) * 2')
+                    .settings-row
+                        span.col-xs-2 Management:
+                        .col-xs-4
                             input.form-control(type='text' ng-model='backupItem.mgmtPoolSize' placeholder='4')
-                    .form-group
-                        label.control-label.col-sm-4 Peer class loading thread pool size:
-                        .col-sm-8
+                    .settings-row
+                        span.col-xs-2 Peer class loading:
+                        .col-xs-4
                             input.form-control(type='text' ng-model='backupItem.p2pPoolSize' placeholder='2')
                 .panel-heading
                     .panel-title
                         span(bs-collapse-toggle)
-                            a(ng-click='expanded = true' ng-hide='expanded') Show advanced settings
-                            a(ng-click='expanded = false' ng-show='expanded') Hide advanced settings
+                            a(ng-click='expanded = true' ng-hide='expanded') Show advanced settings...
+                            a(ng-click='expanded = false' ng-show='expanded') Hide advanced settings...
             center
                 button.btn.btn-primary(ng-click='saveCluster(backupItem)' ng-disabled='editForm.$invalid') Apply
\ No newline at end of file


Mime
View raw message