IGNITE-843: Implemented "save as". Added confirmation for remove. Minor fixes.


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

Branch: refs/heads/ignite-1121
Commit: f2d07d54bf4ad5c8db297ab6bc3421a0632522b6
Parents: 14d8146
Author: AKuznetsov <akuznet...@gridgain.com>
Authored: Thu Jul 16 01:11:24 2015 +0700
Committer: AKuznetsov <akuznet...@gridgain.com>
Committed: Thu Jul 16 01:11:24 2015 +0700

----------------------------------------------------------------------
 .../nodejs/controllers/caches-controller.js     | 65 ++++++++++++------
 .../nodejs/controllers/clusters-controller.js   | 69 ++++++++++++++------
 .../nodejs/controllers/common-module.js         | 40 ++++++++++--
 .../nodejs/public/stylesheets/style.css         |  2 +-
 .../nodejs/public/stylesheets/style.less        |  2 +-
 .../web-control-center/nodejs/routes/public.js  |  7 +-
 .../web-control-center/nodejs/routes/summary.js |  8 +--
 .../nodejs/views/configuration/caches.jade      |  3 +-
 .../nodejs/views/configuration/clusters.jade    |  3 +-
 .../nodejs/views/configuration/metadata.jade    |  2 +-
 .../nodejs/views/includes/controls.jade         |  2 +-
 .../nodejs/views/settings/profile.jade          |  2 +-
 .../nodejs/views/templates/confirm.jade         |  4 +-
 .../nodejs/views/templates/saveAs.jade          | 31 +++++++++
 14 files changed, 180 insertions(+), 60 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f2d07d54/modules/web-control-center/nodejs/controllers/caches-controller.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/controllers/caches-controller.js 
b/modules/web-control-center/nodejs/controllers/caches-controller.js
index 7d81595..c724db9 100644
--- a/modules/web-control-center/nodejs/controllers/caches-controller.js
+++ b/modules/web-control-center/nodejs/controllers/caches-controller.js
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-controlCenterModule.controller('cachesController', ['$scope', '$http', 
'$confirm', 'commonFunctions', function ($scope, $http, $confirm, 
commonFunctions) {
+controlCenterModule.controller('cachesController', ['$scope', '$http', 
'$saveAs', '$confirm', 'commonFunctions', function ($scope, $http, $saveAs, 
$confirm, commonFunctions) {
         $scope.swapSimpleItems = commonFunctions.swapSimpleItems;
         $scope.joinTip = commonFunctions.joinTip;
         $scope.getModel = commonFunctions.getModel;
@@ -151,34 +151,37 @@ controlCenterModule.controller('cachesController', 
['$scope', '$http', '$confirm
 
         // Add new cache.
         $scope.createItem = function () {
-            $scope.backupItem = {mode: 'PARTITIONED', atomicityMode: 'ATOMIC'};
+            $scope.backupItem = {mode: 'PARTITIONED', atomicityMode: 'ATOMIC', 
readFromBackup: true, copyOnRead: true};
             $scope.backupItem.space = $scope.spaces[0]._id;
         };
 
-        // Save cache in db.
-        $scope.saveItem = function () {
-            var item = $scope.backupItem;
-
+        // Check cache logical consistency.
+        $scope.checkItem = function (item) {
             var cacheStoreFactorySelected = item.cacheStoreFactory && 
item.cacheStoreFactory.kind;
 
             if (cacheStoreFactorySelected && !(item.readThrough || 
item.writeThrough)) {
                 commonFunctions.showError('Store is configured but read/write 
through are not enabled!');
 
-                return;
+                return false;
             }
 
             if ((item.readThrough || item.writeThrough) && 
!cacheStoreFactorySelected) {
                 commonFunctions.showError('Read / write through are enabled 
but store is not configured!');
 
-                return;
+                return false;
             }
 
             if (item.writeBehindEnabled && !cacheStoreFactorySelected) {
                 commonFunctions.showError('Write behind enabled but store is 
not configured!');
 
-                return;
+                return false;
             }
 
+            return true;
+        };
+
+        // Save cache into database.
+        $scope.saveItemToDb = function (item) {
             $http.post('caches/save', item)
                 .success(function (_id) {
                     var idx = _.findIndex($scope.caches, function (cache) {
@@ -202,31 +205,55 @@ controlCenterModule.controller('cachesController', 
['$scope', '$http', '$confirm
                 });
         };
 
-        // Save cache in db with new name.
+        // Save cache.
+        $scope.saveItem = function () {
+            var item = $scope.backupItem;
+
+            if ($scope.checkItem(item))
+                $scope.saveItemToDb(item);
+        };
+
+        // Save cache with new name.
         $scope.saveItemAs = function () {
+            var item = $scope.backupItem;
+
+            if ($scope.checkItem(item))
+                $saveAs.show($scope.backupItem.name).then(function (newName) {
+                    item._id = undefined;
+                    item.name = newName;
 
+                    $scope.saveItemToDb(item);
+                });
         };
 
         // Remove cache from db.
         $scope.removeItem = function () {
-            $confirm.show('Are you sure you want to remove cache: "' + 
$scope.selectedItem.name + '"?').then(
+            var selectedItem = $scope.selectedItem;
+
+            $confirm.show('Are you sure you want to remove cache: "' + 
selectedItem.name + '"?').then(
                 function () {
-                    var _id = $scope.selectedItem._id;
+                    var _id = selectedItem._id;
 
                     $http.post('caches/remove', {_id: _id})
                         .success(function () {
-                            var idx = _.findIndex($scope.caches, function 
(cache) {
+                            commonFunctions.showInfo('Cache has been removed: 
' + selectedItem.name);
+
+                            var caches = $scope.caches;
+
+                            var idx = _.findIndex(caches, function (cache) {
                                 return cache._id == _id;
                             });
 
                             if (idx >= 0) {
-                                $scope.caches.splice(idx, 1);
-
-                                $scope.selectedItem = undefined;
-                                $scope.backupItem = undefined;
+                                caches.splice(idx, 1);
+
+                                if (caches.length > 0)
+                                    $scope.selectItem(caches[0]);
+                                else {
+                                    $scope.selectedItem = undefined;
+                                    $scope.backupItem = undefined;
+                                }
                             }
-
-                            commonFunctions.showInfo('Cache has been removed: 
' + $scope.selectedItem.label);
                         })
                         .error(function (errMsg) {
                             commonFunctions.showError(errMsg);

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f2d07d54/modules/web-control-center/nodejs/controllers/clusters-controller.js
----------------------------------------------------------------------
diff --git 
a/modules/web-control-center/nodejs/controllers/clusters-controller.js 
b/modules/web-control-center/nodejs/controllers/clusters-controller.js
index 0d1948d..94be0ad 100644
--- a/modules/web-control-center/nodejs/controllers/clusters-controller.js
+++ b/modules/web-control-center/nodejs/controllers/clusters-controller.js
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-controlCenterModule.controller('clustersController', ['$scope', '$http', 
'$confirm', 'commonFunctions', function ($scope, $http, $confirm, 
commonFunctions) {
+controlCenterModule.controller('clustersController', ['$scope', '$http', 
'$saveAs', '$confirm', 'commonFunctions', function ($scope, $http, $saveAs, 
$confirm, commonFunctions) {
         $scope.swapSimpleItems = commonFunctions.swapSimpleItems;
         $scope.joinTip = commonFunctions.joinTip;
         $scope.getModel = commonFunctions.getModel;
@@ -145,15 +145,17 @@ controlCenterModule.controller('clustersController', 
['$scope', '$http', '$confi
             $scope.backupItem.space = $scope.spaces[0]._id;
         };
 
-        // Save cluster in db.
-        $scope.saveItem = function () {
-            var item = $scope.backupItem;
+        $scope.indexOfCache = function (cacheId) {
+            return _.findIndex($scope.caches, function (cache) {
+                return cache.value == cacheId;
+            });
+        };
 
+        // Check cluster logical consistency.
+        $scope.checkItem = function (item) {
             if (!item.swapSpaceSpi || !item.swapSpaceSpi.kind) {
-                for (var cacheId in item.caches) {
-                    var idx = _.findIndex($scope.caches, function (cache) {
-                        return cache._id == cacheId.value;
-                    });
+                for (var i = 0; i < item.caches.length; i++) {
+                    var idx = $scope.indexOfCache(item.caches[i]);
 
                     if (idx >= 0) {
                         var cache = $scope.caches[idx];
@@ -161,12 +163,17 @@ controlCenterModule.controller('clustersController', 
['$scope', '$http', '$confi
                         if (cache.swapEnabled) {
                             commonFunctions.showError('Swap space SPI is not 
configured, but cache "' + cache.label + '" configured to use swap!');
 
-                            return;
+                            return false;
                         }
                     }
                 }
             }
 
+            return true;
+        };
+
+        // Save cluster in database.
+        $scope.saveItemToDb = function (item) {
             $http.post('clusters/save', item)
                 .success(function (_id) {
                     var idx = _.findIndex($scope.clusters, function (cluster) {
@@ -190,31 +197,55 @@ controlCenterModule.controller('clustersController', 
['$scope', '$http', '$confi
                 });
         };
 
-        // Save cluster in db with new name.
+        // Save cluster.
+        $scope.saveItem = function () {
+            var item = $scope.backupItem;
+
+            if ($scope.checkItem(item))
+                $scope.saveItemToDb(item);
+        };
+
+        // Save cluster with new name.
         $scope.saveItemAs = function () {
+            var item = $scope.backupItem;
 
+            if ($scope.checkItem(item))
+                $saveAs.show($scope.backupItem.name).then(function (newName) {
+                    item._id = undefined;
+                    item.name = newName;
+
+                    $scope.saveItemToDb(item);
+                });
         };
 
         // Remove cluster from db.
         $scope.removeItem = function () {
-            $confirm.show('Are you sure you want to remove cluster: "' + 
$scope.selectedItem.name + '"?').then(
+            var selectedItem = $scope.selectedItem;
+
+            $confirm.show('Are you sure you want to remove cluster: "' + 
selectedItem.name + '"?').then(
                 function () {
-                    var _id = $scope.selectedItem._id;
+                    var _id = selectedItem._id;
 
                     $http.post('clusters/remove', {_id: _id})
                         .success(function () {
-                            var idx = _.findIndex($scope.clusters, function 
(cluster) {
+                            commonFunctions.showInfo('Cluster has been 
removed: ' + selectedItem.name);
+
+                            var clusters = $scope.clusters;
+
+                            var idx = _.findIndex(clusters, function (cluster) 
{
                                 return cluster._id == _id;
                             });
 
                             if (idx >= 0) {
-                                $scope.clusters.splice(idx, 1);
-
-                                $scope.selectedItem = undefined;
-                                $scope.backupItem = undefined;
+                                clusters.splice(idx, 1);
+
+                                if (clusters.length > 0)
+                                    $scope.selectItem(clusters[0]);
+                                else {
+                                    $scope.selectedItem = undefined;
+                                    $scope.backupItem = undefined;
+                                }
                             }
-
-                            commonFunctions.showInfo('Cluster has been 
removed: ' + $scope.selectedItem.label);
                         })
                         .error(function (errMsg) {
                             commonFunctions.showError(errMsg);

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f2d07d54/modules/web-control-center/nodejs/controllers/common-module.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/controllers/common-module.js 
b/modules/web-control-center/nodejs/controllers/common-module.js
index e1c5e0a..9644e5c 100644
--- a/modules/web-control-center/nodejs/controllers/common-module.js
+++ b/modules/web-control-center/nodejs/controllers/common-module.js
@@ -106,19 +106,17 @@ controlCenterModule.service('$confirm', function($modal, 
$rootScope, $q) {
 
     var deferred;
 
-    scope.title = 'Confirmation';
-
     scope.ok = function() {
         deferred.resolve();
 
-        confirm.hide();
+        confirmModal.hide();
     };
 
-    var confirm = $modal({templateUrl: '/confirm', scope: scope, placement: 
'center', show: false});
+    var confirmModal = $modal({templateUrl: '/confirm', scope: scope, 
placement: 'center', show: false});
 
-    var parentShow = confirm.show;
+    var parentShow = confirmModal.show;
 
-    confirm.show = function(content) {
+    confirmModal.show = function(content) {
         scope.content = content || 'Confirm deletion?';
 
         deferred = $q.defer();
@@ -128,7 +126,35 @@ controlCenterModule.service('$confirm', function($modal, 
$rootScope, $q) {
         return deferred.promise;
     };
 
-    return confirm;
+    return confirmModal;
+});
+
+controlCenterModule.service('$saveAs', function($modal, $rootScope, $q) {
+    var scope = $rootScope.$new();
+
+    var deferred;
+
+    scope.ok = function(newName) {
+        deferred.resolve(newName);
+
+        saveAsModal.hide();
+    };
+
+    var saveAsModal = $modal({templateUrl: '/saveAs', scope: scope, placement: 
'center', show: false});
+
+    var parentShow = saveAsModal.show;
+
+    saveAsModal.show = function(oldName) {
+        scope.newName = oldName + '(1)';
+
+        deferred = $q.defer();
+
+        parentShow();
+
+        return deferred.promise;
+    };
+
+    return saveAsModal;
 });
 
 controlCenterModule.config(function ($tooltipProvider) {

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f2d07d54/modules/web-control-center/nodejs/public/stylesheets/style.css
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/public/stylesheets/style.css 
b/modules/web-control-center/nodejs/public/stylesheets/style.css
index a9f3a0e..89d7498 100644
--- a/modules/web-control-center/nodejs/public/stylesheets/style.css
+++ b/modules/web-control-center/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:50%;left:50%;-webkit-transform:translateX(-50%)
 translateY(-50%);transform:translateX(-50%) 
translateY(-50%)}.border-left{box-shadow:1px 0 0 0 #eee 
inset}.border-right{box-shadow:1px 0 0 0 
#eee}.theme-line{background-color:#f9f9f9}.theme-line 
header{background-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 
.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:22px}.theme-li
 ne .btn-primary{border:0 none;background-color:#ec1c24}.theme-line 
.btn-primary:hover{background-color:#950d12}.theme-line .main-content 
.nav-horizontal a{box-shadow:0 0;border:0 
none;background-color:#fff;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 .navbar-nav 
ul li>a.active,.theme-line .sidebar-nav ul 
li>a.active{cursor:default;pointer-events:none}.theme-line 
.sidebar-nav{color:#474a54;padding-bottom:30px}.theme-line .sidebar-nav 
ul{padding:0;list-style:none;font-size:14px;margin:3px 0 0}.theme-line 
.sidebar-nav ul li{color:#666;line-height:28px}.theme-line .sidebar-nav ul li 
span.fa-stack{margin-right:5px;font-size:12px;height:26px}.theme-line 
.sidebar-nav ul li 
a{font-size:18px;color:#666;position:relative;white-space:nowrap;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis}.t
 heme-line .sidebar-nav ul li a:hover{text-decoration:none}.theme-line .select 
li a,.theme-line .typeahead li 
a{color:#666;background-color:transparent}.theme-line .select li 
a:hover,.theme-line .typeahead li 
a:hover{color:#ec1c24;background-color:transparent}.theme-line .select 
.active,.theme-line .typeahead .active{background-color:#eee}.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:5px 15px 0 0}.header 
h1.navbar-brand a{text-indent:-99999px;background:no-repeat center
  center;display:block;width:100%;height:100%;background-size:contain}.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;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}.theme-line header{border-bottom:8px 
solid}.theme-line header h2{color:#aaa}.theme-line header 
p{color:#666}.theme-line header{border-b
 ottom-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{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:#666}.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 .main-content 
.nav-horizontal a.active{border-color:#ec1c24;color:#ec1c24}.theme-line 
.main-content .nav-horizontal a:hover{color:#950d12}.theme-line .main-conte
 nt .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 header .navbar-nav 
a{font-size:18px}.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}.theme-line 
.section-right{padding-left:30px}.body-overlap 
.main-content{margin-top:30px}.body-box .main-content,.body-overlap 
.main-content{padding:30px;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}.container-footer{margin-top:20px}.modal{display:block;overflow:hidden}.modal
 .close{position:absolute;top:0.65em;right:0.65em;float:none}.modal-header 
.close{margin-right:-2px}.modal .modal-dialog{width:610px}.modal 
.modal-content{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{color:#aaa;font-size:1em;margin:3px 
 0 0}.modal .modal-content .modal-spacer{padding:10px 10px 0 10px}.modal 
.modal-content 
.modal-footer{margin-top:0}.modal-body{padding-top:15px}h1.ignite-logo{background-image:url("https://www.filepicker.io/api/file/QagunjDGRFul2JgNCAli";)}.block-display-image
 
img{max-width:100%;max-height:450px;margin:auto;display:block}.greedy{min-height:200px;height:calc(100vh
 - 290px)}@media 
(min-width:768px){.navbar-nav>li>a{padding-top:18px;padding-bottom:10px}}.details-row{padding:0
 0.65em}.details-row,.settings-row{display:block;margin:0.65em 0}.details-row 
label.table-header,.settings-row 
label.table-header{line-height:28px}.details-row [class*="col-"],.settings-row 
[class*="col-"]{display:inline-block;vertical-align:middle;float:none;padding-left:0
 !important;padding-right:0 !important}.details-row 
input[type="checkbox"],.settings-row 
input[type="checkbox"]{line-height:20px;margin-right:4px}.details-row .checkbox 
label,.settings-row .checkbox label{line-height:20px;vertical-align:middle}butt
 
on{margin-right:4px}h1,h2,h3{user-select:none;font-weight:normal;line-height:1}h3{color:black;font-size:1.2em;margin-top:0;margin-bottom:1.5em}table
 
tr:hover{cursor:pointer}.form-control{display:inline-block;text-align:left;padding:3px
 3px;height:28px}.form-control 
button{text-align:left}.table-form-control{width:auto}button 
.caret{float:right;margin-left:0;margin-top:7px}.theme-line 
.panel-heading{padding:10px 10px;margin:0}.theme-line .panel-heading 
h3{margin-bottom:0}.theme-line .panel-heading h3>a{color:black}.theme-line 
.panel-title a{color:#ec1c24}.theme-line .panel-title 
h3{margin-bottom:1.3em}.theme-line .panel-body{padding:0.65em 1.3em}.theme-line 
.main-content a.customize{margin-left:5px;color:#ec1c24}.theme-line 
.panel-collapse{margin:0}.theme-line .links table,.theme-line 
table.links-edit,.theme-line table.links-edit-details,.theme-line 
table.links-edit-small-padding{display:table;table-layout:fixed;margin-bottom:20px}.theme-line
 .links table td,.theme-line table.links-e
 dit td,.theme-line table.links-edit-details td,.theme-line 
table.links-edit-small-padding td{padding-left:18px}.theme-line .links table 
.active a,.theme-line table.links-edit .active a,.theme-line 
table.links-edit-details .active a,.theme-line table.links-edit-small-padding 
.active a{color:#ec1c24;font-weight:bold}.theme-line .links table 
a:hover,.theme-line table.links-edit a:hover,.theme-line 
table.links-edit-details a:hover,.theme-line table.links-edit-small-padding 
a:hover{color:#950d12}.theme-line .links table a,.theme-line table.links-edit 
a,.theme-line table.links-edit-details a,.theme-line 
table.links-edit-small-padding a{color:#666}.theme-line 
table.links-edit{margin-bottom:10px}.theme-line table.links-edit 
label{line-height:28px;color:#666}.theme-line 
table.links-edit-details{margin-bottom:10px}.theme-line 
table.links-edit-details label{line-height:28px;color:#666}.theme-line 
table.links-edit-details td{padding:0}.theme-line table.links-edit-details td 
.input-tip{padding:0
 }.theme-line table.admin{margin-bottom:10px}.theme-line table.admin 
tr:hover{cursor:default}.theme-line table.admin thead>tr th.header{padding:0 0 
0.65em}.theme-line table.admin thead>tr th.header div{padding:0}.theme-line 
table.admin label{line-height:28px;color:#666}.theme-line table.admin thead>tr 
th,.theme-line table.admin td{padding:0.65em 0.65em}.theme-line table.admin 
thead>tr th .input-tip,.theme-line table.admin td 
.input-tip{padding:0}.btn{padding:3px 6px}.panel-title 
a{font-size:14px}.panel-details{margin-top:0.65em;padding:0;border-radius:4px;border:thin
 dotted lightgrey}.tooltip.right 
.tooltip-arrow{border-right-color:#ec1c24}.tooltip>.tooltip-inner{max-width:400px;text-align:left;background-color:#ec1c24}label{font-weight:normal;margin-bottom:0}.form-horizontal
 
.checkbox{padding-top:0}.input-tip{display:block;overflow:hidden}.labelField{float:left;margin-right:4px}.labelFormField{float:left;line-height:28px}.form-horizontal
 .form-group{margin:0}.form-horizontal .has-fe
 edback 
.form-control-feedback{right:0}.tipField{float:right;line-height:28px;margin-left:5px}.tipLabel{font-size:14px;margin-left:5px}.fieldButton{float:right;margin-left:5px;margin-right:0}.fa-remove{color:#ec1c24;cursor:pointer}label.required:after{color:#ec1c24;content:'
 
*';display:inline}.blank{visibility:hidden}.alert{outline:0}.alert.bottom,.alert.bottom-left,.alert.bottom-right,.alert.top,.alert.top-left,.alert.top-right{position:fixed;z-index:1050;margin:20px}.alert.top,.alert.top-left,.alert.top-right{top:50px}.alert.top{right:0;left:0}.alert.top-right{right:0}.alert.top-right
 .close{padding-left:10px}.alert.top-left{left:0}.alert.top-left 
.close{padding-right:10px}.alert.bottom,.alert.bottom-left,.alert.bottom-right{bottom:0}.alert.bottom{right:0;left:0}.alert.bottom-right{right:0}.alert.bottom-right
 .close{padding-left:10px}.alert.bottom-left{left:0}.alert.bottom-left 
.close{padding-right:10px}#cfgResult 
textarea{font-family:monospace;font-size:12px}input[type="number"]::
 
-webkit-outer-spin-button,input[type="number"]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type="number"]{-moz-appearance:textfield}input.ng-dirty.ng-invalid,button.ng-dirty.ng-invalid{border-color:#ec1c24}input.ng-dirty.ng-invalid
 :focus,button.ng-dirty.ng-invalid 
:focus{border-color:#ec1c24}.form-control-feedback{display:inline-block;color:#ec1c24;right:18px;line-height:28px;pointer-events:initial}.syntaxhighlighter{padding:10px
 5px;border-radius:6px}.theme-line 
table.links-edit-small-padding{margin-top:10px}.theme-line 
table.links-edit-small-padding label{line-height:28px;color:#666}.theme-line 
table.links-edit-small-padding a{line-height:28px}.theme-line 
table.links-edit-small-padding 
input[type="checkbox"]{line-height:20px;margin-right:5px}.theme-line 
table.links-edit-small-padding .checkbox 
label{line-height:20px;vertical-align:middle}.theme-line 
table.links-edit-small-padding th{text-align:center}.theme-line 
table.links-edit-small-padding td{padding-left
 :10px}.configBox .nav>li>a{padding:5px 
5px}.viewedUser{position:absolute;width:100%;left:0;text-align:center;margin-top:-15px;background-color:#f8d5d8}a{cursor:pointer}.st-sort-ascent:after{content:'\25B2'}.st-sort-descent:after{content:'\25BC'}.block-callout{background-color:#f3f8f3;border-left-width:4px;border-left-style:solid;border-color:#50af51;margin-bottom:20px}.block-callout
 p{padding:10px 0 10px 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:50%;left:50%;-webkit-transform:translateX(-50%)
 translateY(-50%);transform:translateX(-50%) 
translateY(-50%)}.border-left{box-shadow:1px 0 0 0 #eee 
inset}.border-right{box-shadow:1px 0 0 0 
#eee}.theme-line{background-color:#f9f9f9}.theme-line 
header{background-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 
.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:22px}.theme-li
 ne .btn-primary{border:0 none;background-color:#ec1c24}.theme-line 
.btn-primary:hover{background-color:#950d12}.theme-line .main-content 
.nav-horizontal a{box-shadow:0 0;border:0 
none;background-color:#fff;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 .navbar-nav 
ul li>a.active,.theme-line .sidebar-nav ul 
li>a.active{cursor:default;pointer-events:none}.theme-line 
.sidebar-nav{color:#474a54;padding-bottom:30px}.theme-line .sidebar-nav 
ul{padding:0;list-style:none;font-size:14px;margin:3px 0 0}.theme-line 
.sidebar-nav ul li{color:#666;line-height:28px}.theme-line .sidebar-nav ul li 
span.fa-stack{margin-right:5px;font-size:12px;height:26px}.theme-line 
.sidebar-nav ul li 
a{font-size:18px;color:#666;position:relative;white-space:nowrap;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis}.t
 heme-line .sidebar-nav ul li a:hover{text-decoration:none}.theme-line .select 
li a,.theme-line .typeahead li 
a{color:#666;background-color:transparent}.theme-line .select li 
a:hover,.theme-line .typeahead li 
a:hover{color:#ec1c24;background-color:transparent}.theme-line .select 
.active,.theme-line .typeahead .active{background-color:#eee}.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:5px 15px 0 0}.header 
h1.navbar-brand a{text-indent:-99999px;background:no-repeat center
  center;display:block;width:100%;height:100%;background-size:contain}.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;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}.theme-line header{border-bottom:8px 
solid}.theme-line header h2{color:#aaa}.theme-line header 
p{color:#666}.theme-line header{border-b
 ottom-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{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:#666}.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 .main-content 
.nav-horizontal a.active{border-color:#ec1c24;color:#ec1c24}.theme-line 
.main-content .nav-horizontal a:hover{color:#950d12}.theme-line .main-conte
 nt .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 header .navbar-nav 
a{font-size:18px}.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}.theme-line 
.section-right{padding-left:30px}.body-overlap 
.main-content{margin-top:30px}.body-box .main-content,.body-overlap 
.main-content{padding:30px;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}.container-footer{margin-top:20px}.modal{display:block;overflow:hidden}.modal
 .close{position:absolute;top:0.65em;right:0.65em;float:none}.modal-header 
.close{margin-right:-2px}.modal .modal-dialog{width:610px}.modal 
.modal-content{border-radius:0;background-color:#f7f7f7}.modal .modal-content 
.modal-header{background-color:#fff;text-align:center;color:#555;padding:15px;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{color:#aaa;font-size:1em;margin:3px 
 0 0}.modal .modal-content .modal-spacer{padding:10px 10px 0 10px}.modal 
.modal-content 
.modal-footer{margin-top:0}.modal-body{padding-top:15px}h1.ignite-logo{background-image:url("https://www.filepicker.io/api/file/QagunjDGRFul2JgNCAli";)}.block-display-image
 
img{max-width:100%;max-height:450px;margin:auto;display:block}.greedy{min-height:200px;height:calc(100vh
 - 290px)}@media 
(min-width:768px){.navbar-nav>li>a{padding-top:18px;padding-bottom:10px}}.details-row{padding:0
 0.65em}.details-row,.settings-row{display:block;margin:0.65em 0}.details-row 
label.table-header,.settings-row 
label.table-header{line-height:28px}.details-row [class*="col-"],.settings-row 
[class*="col-"]{display:inline-block;vertical-align:middle;float:none;padding-left:0
 !important;padding-right:0 !important}.details-row 
input[type="checkbox"],.settings-row 
input[type="checkbox"]{line-height:20px;margin-right:4px}.details-row .checkbox 
label,.settings-row .checkbox label{line-height:20px;vertical-align:middle}butt
 
on{margin-right:4px}h1,h2,h3{user-select:none;font-weight:normal;line-height:1}h3{color:black;font-size:1.2em;margin-top:0;margin-bottom:1.5em}table
 
tr:hover{cursor:pointer}.form-control{display:inline-block;text-align:left;padding:3px
 3px;height:28px}.form-control 
button{text-align:left}.table-form-control{width:auto}button 
.caret{float:right;margin-left:0;margin-top:7px}.theme-line 
.panel-heading{padding:10px 10px;margin:0}.theme-line .panel-heading 
h3{margin-bottom:0}.theme-line .panel-heading h3>a{color:black}.theme-line 
.panel-title a{color:#ec1c24}.theme-line .panel-title 
h3{margin-bottom:1.3em}.theme-line .panel-body{padding:0.65em 1.3em}.theme-line 
.main-content a.customize{margin-left:5px;color:#ec1c24}.theme-line 
.panel-collapse{margin:0}.theme-line .links table,.theme-line 
table.links-edit,.theme-line table.links-edit-details,.theme-line 
table.links-edit-small-padding{display:table;table-layout:fixed;margin-bottom:20px}.theme-line
 .links table td,.theme-line table.links-e
 dit td,.theme-line table.links-edit-details td,.theme-line 
table.links-edit-small-padding td{padding-left:18px}.theme-line .links table 
.active a,.theme-line table.links-edit .active a,.theme-line 
table.links-edit-details .active a,.theme-line table.links-edit-small-padding 
.active a{color:#ec1c24;font-weight:bold}.theme-line .links table 
a:hover,.theme-line table.links-edit a:hover,.theme-line 
table.links-edit-details a:hover,.theme-line table.links-edit-small-padding 
a:hover{color:#950d12}.theme-line .links table a,.theme-line table.links-edit 
a,.theme-line table.links-edit-details a,.theme-line 
table.links-edit-small-padding a{color:#666}.theme-line 
table.links-edit{margin-bottom:10px}.theme-line table.links-edit 
label{line-height:28px;color:#666}.theme-line 
table.links-edit-details{margin-bottom:10px}.theme-line 
table.links-edit-details label{line-height:28px;color:#666}.theme-line 
table.links-edit-details td{padding:0}.theme-line table.links-edit-details td 
.input-tip{padding:0
 }.theme-line table.admin{margin-bottom:10px}.theme-line table.admin 
tr:hover{cursor:default}.theme-line table.admin thead>tr th.header{padding:0 0 
0.65em}.theme-line table.admin thead>tr th.header div{padding:0}.theme-line 
table.admin label{line-height:28px;color:#666}.theme-line table.admin thead>tr 
th,.theme-line table.admin td{padding:0.65em 0.65em}.theme-line table.admin 
thead>tr th .input-tip,.theme-line table.admin td 
.input-tip{padding:0}.btn{padding:3px 6px}.panel-title 
a{font-size:14px}.panel-details{margin-top:0.65em;padding:0;border-radius:4px;border:thin
 dotted lightgrey}.tooltip.right 
.tooltip-arrow{border-right-color:#ec1c24}.tooltip>.tooltip-inner{max-width:400px;text-align:left;background-color:#ec1c24}label{font-weight:normal;margin-bottom:0}.form-horizontal
 
.checkbox{padding-top:0}.input-tip{display:block;overflow:hidden}.labelField{float:left;margin-right:4px}.labelFormField{float:left;line-height:28px}.form-horizontal
 .form-group{margin:0}.form-horizontal .has-fe
 edback 
.form-control-feedback{right:0}.tipField{float:right;line-height:28px;margin-left:5px}.tipLabel{font-size:14px;margin-left:5px}.fieldButton{float:right;margin-left:5px;margin-right:0}.fa-remove{color:#ec1c24;cursor:pointer}label.required:after{color:#ec1c24;content:'
 
*';display:inline}.blank{visibility:hidden}.alert{outline:0}.alert.bottom,.alert.bottom-left,.alert.bottom-right,.alert.top,.alert.top-left,.alert.top-right{position:fixed;z-index:1050;margin:20px}.alert.top,.alert.top-left,.alert.top-right{top:50px}.alert.top{right:0;left:0}.alert.top-right{right:0}.alert.top-right
 .close{padding-left:10px}.alert.top-left{left:0}.alert.top-left 
.close{padding-right:10px}.alert.bottom,.alert.bottom-left,.alert.bottom-right{bottom:0}.alert.bottom{right:0;left:0}.alert.bottom-right{right:0}.alert.bottom-right
 .close{padding-left:10px}.alert.bottom-left{left:0}.alert.bottom-left 
.close{padding-right:10px}#cfgResult 
textarea{font-family:monospace;font-size:12px}input[type="number"]::
 
-webkit-outer-spin-button,input[type="number"]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type="number"]{-moz-appearance:textfield}input.ng-dirty.ng-invalid,button.ng-dirty.ng-invalid{border-color:#ec1c24}input.ng-dirty.ng-invalid
 :focus,button.ng-dirty.ng-invalid 
:focus{border-color:#ec1c24}.form-control-feedback{display:inline-block;color:#ec1c24;right:18px;line-height:28px;pointer-events:initial}.syntaxhighlighter{padding:10px
 5px;border-radius:6px}.theme-line 
table.links-edit-small-padding{margin-top:10px}.theme-line 
table.links-edit-small-padding label{line-height:28px;color:#666}.theme-line 
table.links-edit-small-padding a{line-height:28px}.theme-line 
table.links-edit-small-padding 
input[type="checkbox"]{line-height:20px;margin-right:5px}.theme-line 
table.links-edit-small-padding .checkbox 
label{line-height:20px;vertical-align:middle}.theme-line 
table.links-edit-small-padding th{text-align:center}.theme-line 
table.links-edit-small-padding td{padding-left
 :10px}.configBox .nav>li>a{padding:5px 
5px}.viewedUser{position:absolute;width:100%;left:0;text-align:center;margin-top:-15px;background-color:#f8d5d8}a{cursor:pointer}.st-sort-ascent:after{content:'\25B2'}.st-sort-descent:after{content:'\25BC'}.block-callout{background-color:#f3f8f3;border-left-width:4px;border-left-style:solid;border-color:#50af51;margin-bottom:20px}.block-callout
 p{padding:10px 0 10px 10px}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f2d07d54/modules/web-control-center/nodejs/public/stylesheets/style.less
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/public/stylesheets/style.less 
b/modules/web-control-center/nodejs/public/stylesheets/style.less
index 9da4e57..f81e92c 100644
--- a/modules/web-control-center/nodejs/public/stylesheets/style.less
+++ b/modules/web-control-center/nodejs/public/stylesheets/style.less
@@ -544,7 +544,7 @@ a:hover, .link:hover .title {
   background-color: #fff;
   text-align: center;
   color: #555;
-  padding: 24px;
+  padding: 15px;
   font-family: "myriad-pro", sans-serif;
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f2d07d54/modules/web-control-center/nodejs/routes/public.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/routes/public.js 
b/modules/web-control-center/nodejs/routes/public.js
index fd25aed..fd7c759 100644
--- a/modules/web-control-center/nodejs/routes/public.js
+++ b/modules/web-control-center/nodejs/routes/public.js
@@ -24,11 +24,16 @@ router.get('/select', function (req, res) {
     res.render('templates/select', {});
 });
 
-// GET dropdown-menu template.
+// GET confirmation dialog.
 router.get('/confirm', function (req, res) {
     res.render('templates/confirm', {});
 });
 
+// GET save as dialog.
+router.get('/saveAs', function (req, res) {
+    res.render('templates/saveAs', {});
+});
+
 /* GET login page. */
 router.get('/login', function (req, res) {
     res.render('login');

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f2d07d54/modules/web-control-center/nodejs/routes/summary.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/routes/summary.js 
b/modules/web-control-center/nodejs/routes/summary.js
index 1cb36c0..144184f 100644
--- a/modules/web-control-center/nodejs/routes/summary.js
+++ b/modules/web-control-center/nodejs/routes/summary.js
@@ -67,21 +67,19 @@ router.post('/download', function (req, res) {
 
         var archiver = require('archiver');
 
-        // creating archives
+        // Creating archive.
         var zip = archiver('zip');
 
         zip.on('error', function (err) {
             res.status(500).send({error: err.message});
         });
 
-        //on stream closed we can end the request
+        // On stream closed we can end the request.
         res.on('close', function () {
-            console.log('Archive wrote %d bytes', archive.pointer());
-
             return res.status(200).send('OK').end();
         });
 
-        //set the archive name
+        // Set the archive name.
         res.attachment(cluster.name + (clientCache ? '-client' : '') + 
'-configuration.zip');
 
         var generatorCommon = require('./generator/common');

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f2d07d54/modules/web-control-center/nodejs/views/configuration/caches.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/views/configuration/caches.jade 
b/modules/web-control-center/nodejs/views/configuration/caches.jade
index 678ad7b..8f0fc68 100644
--- a/modules/web-control-center/nodejs/views/configuration/caches.jade
+++ b/modules/web-control-center/nodejs/views/configuration/caches.jade
@@ -65,5 +65,6 @@ block content
                 .panel-title
                     h3
                         a(bs-collapse-toggle='0' ng-click='expanded = 
!expanded;') {{expanded ? 'Hide advanced settings...' : 'Show advanced 
settings...'}}
-            button#save-btn.btn.btn-primary(ng-disabled='inputForm.$invalid' 
ng-click='saveItem()') Save
+            button.btn.btn-primary(ng-disabled='inputForm.$invalid' 
ng-click='saveItem()') Save
+            button.btn.btn-primary(ng-show='backupItem._id' 
ng-disabled='inputForm.$invalid' ng-click='saveItemAs()') Save As
             button.btn.btn-primary.btn-second(ng-show='backupItem._id' 
ng-click='removeItem()') Remove

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f2d07d54/modules/web-control-center/nodejs/views/configuration/clusters.jade
----------------------------------------------------------------------
diff --git 
a/modules/web-control-center/nodejs/views/configuration/clusters.jade 
b/modules/web-control-center/nodejs/views/configuration/clusters.jade
index f5915f1..98d3e17 100644
--- a/modules/web-control-center/nodejs/views/configuration/clusters.jade
+++ b/modules/web-control-center/nodejs/views/configuration/clusters.jade
@@ -68,5 +68,6 @@ block content
                 .panel-title
                     h3
                         a(bs-collapse-toggle='0' ng-click='expanded = 
!expanded;') {{expanded ? 'Hide advanced settings...' : 'Show advanced 
settings...'}}
-            button#save-btn.btn.btn-primary(ng-disabled='inputForm.$invalid' 
ng-click='saveItem()') Save
+            button.btn.btn-primary(ng-disabled='inputForm.$invalid' 
ng-click='saveItem()') Save
+            button.btn.btn-primary(ng-show='backupItem._id' 
ng-disabled='inputForm.$invalid' ng-click='saveItemAs()') Save As
             button.btn.btn-primary(ng-show='backupItem._id' 
ng-click='removeItem()') Remove
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f2d07d54/modules/web-control-center/nodejs/views/configuration/metadata.jade
----------------------------------------------------------------------
diff --git 
a/modules/web-control-center/nodejs/views/configuration/metadata.jade 
b/modules/web-control-center/nodejs/views/configuration/metadata.jade
index 1e4c986..fd5ab03 100644
--- a/modules/web-control-center/nodejs/views/configuration/metadata.jade
+++ b/modules/web-control-center/nodejs/views/configuration/metadata.jade
@@ -50,7 +50,7 @@ block content
                             .panel-body
                                 .settings-row(ng-repeat='field in 
metadataManual')
                                     +form-row
-                            
button#save-btn.btn.btn-primary(ng-disabled='manualForm.$invalid' 
ng-click='saveItem()') Save
+                            
button.btn.btn-primary(ng-disabled='manualForm.$invalid' ng-click='saveItem()') 
Save
                             
button.btn.btn-primary.btn-second(ng-show='backupItem._id' 
ng-click='removeItem()') Remove
             .panel.panel-default
                 .panel-heading

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f2d07d54/modules/web-control-center/nodejs/views/includes/controls.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/views/includes/controls.jade 
b/modules/web-control-center/nodejs/views/includes/controls.jade
index 406d63e..eba1b81 100644
--- a/modules/web-control-center/nodejs/views/includes/controls.jade
+++ b/modules/web-control-center/nodejs/views/includes/controls.jade
@@ -107,7 +107,7 @@ mixin form-row-custom(lblClasses, fieldClasses)
             label {{field.label}}
         div.checkbox.col-sm-6(ng-switch-when='check' ng-hide=fieldHide)
             label
-                input(type='checkbox' 
ng-checked='field.placeholder')&attributes(fieldCommon)
+                input(type='checkbox')&attributes(fieldCommon)
                 | {{field.label}}
                 +tipLabel('field.tip')
         div(ng-switch-when='text' ng-hide=fieldHide)

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f2d07d54/modules/web-control-center/nodejs/views/settings/profile.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/views/settings/profile.jade 
b/modules/web-control-center/nodejs/views/settings/profile.jade
index 14a8bb5..21820ab 100644
--- a/modules/web-control-center/nodejs/views/settings/profile.jade
+++ b/modules/web-control-center/nodejs/views/settings/profile.jade
@@ -54,5 +54,5 @@ block container
                                 .col-sm-4
                                     input.form-control(type='password', 
ng-model='profileUser.confirmPassword' match='profileUser.newPassword' 
placeholder='Confirm new password' ng-required='profileUser.changePassword')
                     .col-sm-12.details-row
-                        
button#save-btn.btn.btn-primary(ng-disabled='profileForm.$invalid' 
ng-click='saveUser()') Save
+                        
button.btn.btn-primary(ng-disabled='profileForm.$invalid' 
ng-click='saveUser()') Save
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f2d07d54/modules/web-control-center/nodejs/views/templates/confirm.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/views/templates/confirm.jade 
b/modules/web-control-center/nodejs/views/templates/confirm.jade
index 7b338ad..bdaf9bf 100644
--- a/modules/web-control-center/nodejs/views/templates/confirm.jade
+++ b/modules/web-control-center/nodejs/views/templates/confirm.jade
@@ -17,9 +17,9 @@
 .modal(tabindex='-1' role='dialog')
     .modal-dialog
         .modal-content
-            .modal-header(ng-show='title')
+            .modal-header
                 button.close(type="button" ng-click="$hide()") &times;
-                h4.modal-title(ng-bind-html='title')
+                h4.modal-title Confirmation
             .modal-body(ng-show='content')
                 p(ng-bind-html='content' style='text-align: center;')
             .modal-footer

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f2d07d54/modules/web-control-center/nodejs/views/templates/saveAs.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/views/templates/saveAs.jade 
b/modules/web-control-center/nodejs/views/templates/saveAs.jade
new file mode 100644
index 0000000..83f93bd
--- /dev/null
+++ b/modules/web-control-center/nodejs/views/templates/saveAs.jade
@@ -0,0 +1,31 @@
+//-
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+.modal(tabindex='-1' role='dialog')
+    .modal-dialog
+        .modal-content
+            .modal-header
+                button.close(type="button" ng-click="$hide()") &times;
+                h4.modal-title Save as
+            form.form-horizontal(name='inputForm' novalidate)
+                .modal-body.row
+                    .col-sm-9.login.col-sm-offset-1
+                        label.required.labelFormField() New name:&nbsp;
+                        .col-sm-9
+                            input.form-control(type="text" ng-model='newName' 
required)
+            .modal-footer
+                button.btn.btn-default(type="button" ng-click="$hide()") Cancel
+                button.btn.btn-primary(type="button" 
ng-disabled='inputForm.$invalid' ng-click="ok(newName)") Confirm
\ No newline at end of file

Reply via email to