IGNITE-843: Validation with popover for cluster screen.

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

Branch: refs/heads/ignite-843
Commit: 3a1c1529d6fe7a8425cd53042e21a0f16fddd8e7
Parents: 14287f6
Author: AKuznetsov <akuznet...@gridgain.com>
Authored: Fri Aug 14 18:30:17 2015 +0700
Committer: AKuznetsov <akuznet...@gridgain.com>
Committed: Fri Aug 14 18:30:17 2015 +0700

----------------------------------------------------------------------
 .../main/js/controllers/clusters-controller.js  | 68 +++++++++++++++-----
 .../src/main/js/controllers/common-module.js    | 16 +++--
 .../src/main/js/public/stylesheets/style.scss   |  1 +
 .../js/views/configuration/metadata-load.jade   |  2 +-
 .../src/main/js/views/includes/controls.jade    |  6 +-
 5 files changed, 68 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/3a1c1529/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 6c2ead5..98f8c90 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', '$common', '$focus', '$confirm', '$copy', '$table',
-    function ($scope, $http, $popover, $common, $focus, $confirm, $copy, 
$table) {
+controlCenterModule.controller('clustersController', ['$scope', '$http', 
'$popover', '$timeout', '$common', '$focus', '$confirm', '$copy', '$table',
+    function ($scope, $http, $popover, $timeout, $common, $focus, $confirm, 
$copy, $table) {
         $scope.joinTip = $common.joinTip;
         $scope.getModel = $common.getModel;
 
@@ -222,30 +222,64 @@ controlCenterModule.controller('clustersController', 
['$scope', '$http', '$popov
             });
         };
 
-        $scope.popover = {
-            "title": "Title",
-            "content": "Hello Popover<br />This is a multiline message!"
-        };
+        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) {
-            if ($common.isEmptyString(item.name)) {
-                $common.ensureActivePanel($scope.panels, 0);
+            if ($common.isEmptyString(item.name))
+                return showPopoverMessage(0, 'clusterName', 'Name should not 
be empty');
 
-                var el = $('body').find('#clusterName');
+            if (item.discovery.kind == 'Vm' && 
item.discovery.Vm.addresses.length == 0)
+                return showPopoverMessage(0, 'addresses', 'Addresses are not 
specified');
 
-                var myPopover = $popover(el, {content: 'Name should not be 
empty'});
+            if (item.discovery.kind == 'S3' && 
$common.isEmptyString(item.discovery.S3.bucketName))
+                return showPopoverMessage(0, 'bucketName', 'Bucket name should 
not be empty');
 
-                myPopover.$promise.then(function () {
-                    myPopover.show();
+            if (item.discovery.kind == 'Cloud') {
+                if ($common.isEmptyString(item.discovery.Cloud.identity))
+                    return showPopoverMessage(0, 'identity', 'Identity should 
not be empty');
 
-                    $focus('clusterName');
-                });
+                if ($common.isEmptyString(item.discovery.Cloud.provider))
+                    return showPopoverMessage(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');
+
+                if 
($common.isEmptyString(item.discovery.GoogleStorage.bucketName))
+                    return showPopoverMessage(0, 'bucketName', 'Bucket name 
should not be empty');
 
-                //window.setInterval(function() { myPopover.hide() }, 3000)
+                if 
($common.isEmptyString(item.discovery.GoogleStorage.serviceAccountP12FilePath))
+                    return showPopoverMessage(0, 'serviceAccountP12FilePath', 
'Private key path should not be empty');
 
-                //return $common.showError('Name should not be empty!', 'zzz', 
'#div_to_show');
-                return false;
+                if 
($common.isEmptyString(item.discovery.GoogleStorage.accountId))
+                    return showPopoverMessage(0, 'accountId', 'Account ID 
should not be empty');
             }
 
             if (!item.swapSpaceSpi || !item.swapSpaceSpi.kind && item.caches) {

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/3a1c1529/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 2ead841..7c15038 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
@@ -943,16 +943,24 @@ controlCenterModule.directive('retainSelection', function 
($timeout) {
 });
 
 // Factory function to focus element.
-controlCenterModule.factory('$focus', function ($timeout, $window) {
+controlCenterModule.factory('$focus', function ($timeout) {
     return function (id) {
         // Timeout makes sure that is invoked after any other event has been 
triggered.
         // E.g. click events that need to run before the focus or inputs 
elements that are
         // in a disabled state but are enabled when those events are triggered.
         $timeout(function () {
-            var elem = $window.document.getElementById(id);
+            var elem = $('#' + id);
 
-            if (elem)
-                elem.focus();
+            if (elem.length > 0) {
+                var offset = elem.offset();
+
+                if(offset.top < window.pageYOffset)
+                    $('html, body').animate({
+                        scrollTop: offset.top - 20
+                    }, 10);
+
+                elem[0].focus();
+            }
         });
     };
 });

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/3a1c1529/modules/control-center-web/src/main/js/public/stylesheets/style.scss
----------------------------------------------------------------------
diff --git 
a/modules/control-center-web/src/main/js/public/stylesheets/style.scss 
b/modules/control-center-web/src/main/js/public/stylesheets/style.scss
index 5debf53..28a3de7 100644
--- a/modules/control-center-web/src/main/js/public/stylesheets/style.scss
+++ b/modules/control-center-web/src/main/js/public/stylesheets/style.scss
@@ -919,6 +919,7 @@ button .caret, .btn .caret {
 
 .popover {
     color: $ignite-red;
+    max-width: 400px;
 }
 
 .popover-content {

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/3a1c1529/modules/control-center-web/src/main/js/views/configuration/metadata-load.jade
----------------------------------------------------------------------
diff --git 
a/modules/control-center-web/src/main/js/views/configuration/metadata-load.jade 
b/modules/control-center-web/src/main/js/views/configuration/metadata-load.jade
index 5768a7d..05ae0e4 100644
--- 
a/modules/control-center-web/src/main/js/views/configuration/metadata-load.jade
+++ 
b/modules/control-center-web/src/main/js/views/configuration/metadata-load.jade
@@ -24,7 +24,7 @@ include ../includes/controls
                 h4.modal-title Load metadata from database
             .metadata-download(ng-show='loadMeta.action == "download"')
                 |Connection to Web Agent is not established!<br/><br/>
-                |How to extract metadata from database:
+                |How to load metadata from database:
                 ul
                     li Download Web Agent.
                     li Unzip Web Agent to some folder.

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/3a1c1529/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 e57e085..74f11a0 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
@@ -128,7 +128,7 @@ mixin details-row
             .col-sm-8
                 +tipField('detail.tip')
                 .input-tip
-                    input.form-control(type='text' 
placeholder='{{::detail.placeholder}}')&attributes(detailCommon)
+                    input.form-control(id='{{::detail.model}}' type='text' 
placeholder='{{::detail.placeholder}}')&attributes(detailCommon)
         div(ng-switch-when='number')
             label(class=lblDetailClasses ng-class='{required: 
detail.required}') {{::detail.label}}:
             .col-sm-8
@@ -151,7 +151,7 @@ mixin details-row
                 .input-tip
                     button.form-control(bs-select data-multiple='1' 
data-placeholder='{{::detail.placeholder}}' bs-options='item.value as 
item.label for item in {{detail.items}}')&attributes(detailCommon)
         .section(ng-switch-when='table-simple')&attributes(detailCommon)
-            .col-sm-12.group
+            .col-sm-12.group(id='{{::detail.model}}')
                 .group-legend
                     label {{::detail.label}}:
                     +group-tip('detail.tableTip')
@@ -435,7 +435,7 @@ mixin group(title, fields, dataSource)
                     +form-row(dataSource)
 
 mixin groups(groups, dataSource)
-    .panel.panel-default(ng-repeat='group in #{groups}')
+    .panel.panel-default(ng-repeat='group in #{groups}' 
ng-click='triggerDigest=true')
         .panel-heading
             h3
                 a(bs-collapse-toggle) {{::group.label}}

Reply via email to