Repository: incubator-ignite
Updated Branches:
  refs/heads/ignite-843 83e0457f1 -> 8eeb439a5


IGNITE-843: Cluster validation.


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

Branch: refs/heads/ignite-843
Commit: 8eeb439a50e5730654e7ba297a203291e2da7ed8
Parents: 83e0457
Author: AKuznetsov <akuznet...@gridgain.com>
Authored: Mon Aug 17 14:00:16 2015 +0700
Committer: AKuznetsov <akuznet...@gridgain.com>
Committed: Mon Aug 17 14:00:16 2015 +0700

----------------------------------------------------------------------
 .../main/js/controllers/clusters-controller.js  | 61 +++++++------------
 .../src/main/js/controllers/common-module.js    | 64 ++++++++++++++++----
 .../main/js/controllers/models/clusters.json    |  1 +
 .../src/main/js/views/includes/controls.jade    |  2 +-
 .../src/main/js/views/templates/popover.jade    | 10 ++-
 5 files changed, 81 insertions(+), 57 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8eeb439a/modules/control-center-web/src/main/js/controllers/clusters-controller.js
----------------------------------------------------------------------
diff --git 
a/modules/control-center-web/src/main/js/controllers/clusters-controller.js 
b/modules/control-center-web/src/main/js/controllers/clusters-controller.js
index ecfa699..e45d79c 100644
--- a/modules/control-center-web/src/main/js/controllers/clusters-controller.js
+++ b/modules/control-center-web/src/main/js/controllers/clusters-controller.js
@@ -15,8 +15,8 @@
  * limitations under the License.
  */
 
-controlCenterModule.controller('clustersController', ['$scope', '$http', 
'$popover', '$timeout', '$common', '$focus', '$confirm', '$copy', '$table',
-    function ($scope, $http, $popover, $timeout, $common, $focus, $confirm, 
$copy, $table) {
+controlCenterModule.controller('clustersController', ['$scope', '$http', 
'$common', '$focus', '$confirm', '$copy', '$table',
+    function ($scope, $http, $common, $focus, $confirm, $copy, $table) {
         $scope.joinTip = $common.joinTip;
         $scope.getModel = $common.getModel;
 
@@ -102,6 +102,8 @@ controlCenterModule.controller('clustersController', 
['$scope', '$http', '$popov
 
         $scope.toggleExpanded = function () {
             $scope.ui.expanded = !$scope.ui.expanded;
+
+            $common.hidePopover();
         };
 
         $scope.panels = {activePanels: [0]};
@@ -222,64 +224,39 @@ controlCenterModule.controller('clustersController', 
['$scope', '$http', '$popov
             });
         };
 
-        var popover = null;
-
-        function showPopoverMessage(panelIndex, id, message) {
-            $common.ensureActivePanel($scope.panels, panelIndex);
-
-            var el = $('body').find('#' + id);
-
-            if (popover)
-                popover.hide();
-
-            var newPopover = $popover(el, {content: message});
-
-            $timeout(function () {
-                $focus(id);
-            }, 50);
-
-            $timeout(function () {
-                newPopover.show();
-
-                popover = newPopover;
-            }, 100);
-
-            $timeout(function () { newPopover.hide() }, 3000);
-
-            return false;
-        }
-
         // Check cluster logical consistency.
         function validate(item) {
+            var pnls = $scope.panels;
+
             if ($common.isEmptyString(item.name))
-                return showPopoverMessage(0, 'clusterName', 'Name should not 
be empty');
+                return $common.showPopoverMessage(pnls, 0, 'clusterName', 
'Name should not be empty');
 
             if (item.discovery.kind == 'Vm' && 
item.discovery.Vm.addresses.length == 0)
-                return showPopoverMessage(0, 'addresses', 'Addresses are not 
specified');
+                return $common.showPopoverMessage(pnls, 0, 'addresses', 
'Addresses are not specified');
 
             if (item.discovery.kind == 'S3' && 
$common.isEmptyString(item.discovery.S3.bucketName))
-                return showPopoverMessage(0, 'bucketName', 'Bucket name should 
not be empty');
+                return $common.showPopoverMessage(pnls, 0, 'bucketName', 
'Bucket name should not be empty');
 
             if (item.discovery.kind == 'Cloud') {
                 if ($common.isEmptyString(item.discovery.Cloud.identity))
-                    return showPopoverMessage(0, 'identity', 'Identity should 
not be empty');
+                    return $common.showPopoverMessage(pnls, 0, 'identity', 
'Identity should not be empty');
 
                 if ($common.isEmptyString(item.discovery.Cloud.provider))
-                    return showPopoverMessage(0, 'provider', 'Provider should 
not be empty');
+                    return $common.showPopoverMessage(pnls, 0, 'provider', 
'Provider should not be empty');
             }
 
             if (item.discovery.kind == 'GoogleStorage') {
                 if 
($common.isEmptyString(item.discovery.GoogleStorage.projectName))
-                    return showPopoverMessage(0, 'projectName', 'Project name 
should not be empty');
+                    return $common.showPopoverMessage(pnls, 0, 'projectName', 
'Project name should not be empty');
 
                 if 
($common.isEmptyString(item.discovery.GoogleStorage.bucketName))
-                    return showPopoverMessage(0, 'bucketName', 'Bucket name 
should not be empty');
+                    return $common.showPopoverMessage(pnls, 0, 'bucketName', 
'Bucket name should not be empty');
 
                 if 
($common.isEmptyString(item.discovery.GoogleStorage.serviceAccountP12FilePath))
-                    return showPopoverMessage(0, 'serviceAccountP12FilePath', 
'Private key path should not be empty');
+                    return $common.showPopoverMessage(pnls, 0, 
'serviceAccountP12FilePath', 'Private key path should not be empty');
 
                 if 
($common.isEmptyString(item.discovery.GoogleStorage.serviceAccountId))
-                    return showPopoverMessage(0, 'serviceAccountId', 'Account 
ID should not be empty');
+                    return $common.showPopoverMessage(pnls, 0, 
'serviceAccountId', 'Account ID should not be empty');
             }
 
             if (!item.swapSpaceSpi || !item.swapSpaceSpi.kind && item.caches) {
@@ -289,8 +266,12 @@ controlCenterModule.controller('clustersController', 
['$scope', '$http', '$popov
                     if (idx >= 0) {
                         var cache = $scope.caches[idx];
 
-                        if (cache.swapEnabled)
-                            return $common.showError('Swap space SPI is not 
configured, but cache "' + cache.label + '" configured to use swap!');
+                        if (cache.swapEnabled) {
+                            $scope.ui.expanded = true;
+
+                            return $common.showPopoverMessage(pnls, 8, 
'swapSpaceSpi',
+                                'Swap space SPI is not configured, but cache 
"' + cache.label + '" configured to use swap!');
+                        }
                     }
                 }
             }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8eeb439a/modules/control-center-web/src/main/js/controllers/common-module.js
----------------------------------------------------------------------
diff --git 
a/modules/control-center-web/src/main/js/controllers/common-module.js 
b/modules/control-center-web/src/main/js/controllers/common-module.js
index 7c15038..68e6d97 100644
--- a/modules/control-center-web/src/main/js/controllers/common-module.js
+++ b/modules/control-center-web/src/main/js/controllers/common-module.js
@@ -68,7 +68,7 @@ controlCenterModule.config(function ($alertProvider) {
 
 // Common functions to be used in controllers.
 controlCenterModule.service('$common', [
-    '$alert', function ($alert) {
+    '$alert', '$popover', '$timeout', '$focus', function ($alert, $popover, 
$timeout, $focus) {
         function isDefined(v) {
             return !(v === undefined || v === null);
         }
@@ -391,6 +391,24 @@ controlCenterModule.service('$common', [
             return width | 0;
         }
 
+        var popover = null;
+
+        function ensureActivePanel(panels, pnlIdx) {
+            if (panels) {
+                var activePanels = panels.activePanels;
+
+                if (!activePanels || activePanels.length < 1)
+                    panels.activePanels = [pnlIdx];
+                else if (!_.contains(activePanels, pnlIdx)) {
+                    var newActivePanels = activePanels.slice();
+
+                    newActivePanels.push(pnlIdx);
+
+                    panels.activePanels = newActivePanels;
+                }
+            }
+        }
+
         return {
             getModel: function (obj, field) {
                 var path = field.path;
@@ -514,19 +532,35 @@ controlCenterModule.service('$common', [
                 return result;
             },
             ensureActivePanel: function (panels, pnlIdx) {
-                if (panels) {
-                    var activePanels = panels.activePanels;
+                ensureActivePanel(panels, pnlIdx);
+            },
+            showPopoverMessage: function (panels, panelIndex, id, message) {
+                ensureActivePanel(panels, panelIndex);
 
-                    if (!activePanels || activePanels.length < 1)
-                        panels.activePanels = [pnlIdx];
-                    else if (!_.contains(activePanels, pnlIdx)) {
-                        var newActivePanels = activePanels.slice();
+                var el = $('body').find('#' + id);
 
-                        newActivePanels.push(pnlIdx);
+                if (popover)
+                    popover.hide();
 
-                        panels.activePanels = newActivePanels;
-                    }
-                }
+                var newPopover = $popover(el, {content: message});
+
+                $timeout(function () {
+                    $focus(id);
+                }, 50);
+
+                $timeout(function () {
+                    newPopover.show();
+
+                    popover = newPopover;
+                }, 100);
+
+                $timeout(function () { newPopover.hide() }, 3000);
+
+                return false;
+            },
+            hidePopover: function () {
+                if (popover)
+                    popover.hide();
             }
         }
     }]);
@@ -954,9 +988,13 @@ controlCenterModule.factory('$focus', function ($timeout) {
             if (elem.length > 0) {
                 var offset = elem.offset();
 
-                if(offset.top < window.pageYOffset)
+                var elemOffset = offset.top;
+
+                var winOffset = window.pageYOffset;
+
+                if(elemOffset - 20 < winOffset || elemOffset + 
elem.outerHeight(true) + 20 > winOffset + window.innerHeight)
                     $('html, body').animate({
-                        scrollTop: offset.top - 20
+                        scrollTop: elemOffset - 20
                     }, 10);
 
                 elem[0].focus();

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8eeb439a/modules/control-center-web/src/main/js/controllers/models/clusters.json
----------------------------------------------------------------------
diff --git 
a/modules/control-center-web/src/main/js/controllers/models/clusters.json 
b/modules/control-center-web/src/main/js/controllers/models/clusters.json
index 1233f91..288800d 100644
--- a/modules/control-center-web/src/main/js/controllers/models/clusters.json
+++ b/modules/control-center-web/src/main/js/controllers/models/clusters.json
@@ -671,6 +671,7 @@
             "Provides a mechanism in grid for storing data on disk.",
             "Ignite cache uses swap space to overflow data to disk if it 
cannot fit in memory."
           ],
+          "id": "swapSpaceSpi",
           "details": {
             "FileSwapSpaceSpi": {
               "fields": [

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8eeb439a/modules/control-center-web/src/main/js/views/includes/controls.jade
----------------------------------------------------------------------
diff --git 
a/modules/control-center-web/src/main/js/views/includes/controls.jade 
b/modules/control-center-web/src/main/js/views/includes/controls.jade
index 74f11a0..b989a53 100644
--- a/modules/control-center-web/src/main/js/views/includes/controls.jade
+++ b/modules/control-center-web/src/main/js/views/includes/controls.jade
@@ -311,7 +311,7 @@ mixin form-row-custom(lblClasses, fieldClasses, dataSource)
             - var expanded = 'field.details[' + fieldMdl + '].expanded'
 
             label(class=lblClasses ng-class=fieldRequiredClass) 
{{::field.label}}:
-            div(class=fieldClasses)
+            div(class=fieldClasses id='{{::field.id}}')
                 +tipField('field.tip')
                 .input-tip
                     button.form-control(bs-select 
data-placeholder='{{::field.placeholder}}' bs-options='item.value as item.label 
for item in {{field.items}}')&attributes(fieldCommon)

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8eeb439a/modules/control-center-web/src/main/js/views/templates/popover.jade
----------------------------------------------------------------------
diff --git 
a/modules/control-center-web/src/main/js/views/templates/popover.jade 
b/modules/control-center-web/src/main/js/views/templates/popover.jade
index 3770482..5c8f1d0 100644
--- a/modules/control-center-web/src/main/js/views/templates/popover.jade
+++ b/modules/control-center-web/src/main/js/views/templates/popover.jade
@@ -15,6 +15,10 @@
     limitations under the License.
 
 .popover-arrow.popover
-        .popover-content
-            label {{content}}
-            button.close(type='button' ng-click='$hide()') &times;
+    table
+        tr
+            td
+                .popover-content
+                    label {{content}}
+            td
+                button.close(type='button' ng-click='$hide()') &times;

Reply via email to