You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by an...@apache.org on 2016/02/03 11:57:00 UTC

[35/50] ignite git commit: IGNITE-843 Refactoring and fixing cluster form validation.

IGNITE-843 Refactoring and fixing cluster form validation.


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

Branch: refs/heads/ignite-843-rc3
Commit: b755b63373a14cb7dfbe8c4811515e852048339e
Parents: 47522d2
Author: Dmitriyff <dm...@gmail.com>
Authored: Tue Feb 2 18:00:57 2016 +0700
Committer: Andrey <an...@gridgain.com>
Committed: Tue Feb 2 18:00:57 2016 +0700

----------------------------------------------------------------------
 .../control-center-web/src/main/js/app/index.js |  2 +
 .../configuration/clusters/deployment.jade      | 34 +++++-----
 .../clusters/general/discovery/cloud.jade       | 68 ++++++++++----------
 .../clusters/general/discovery/multicast.jade   | 38 +++++------
 .../clusters/general/discovery/vm.jade          | 38 +++++------
 .../states/configuration/clusters/ssl.jade      | 34 +++++-----
 .../js/app/services/cleanup/cleanup.service.js  | 61 ++++++++++++++++++
 .../main/js/controllers/clusters-controller.js  |  6 +-
 .../src/main/js/views/settings/admin.jade       |  2 +-
 9 files changed, 173 insertions(+), 110 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/b755b633/modules/control-center-web/src/main/js/app/index.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/index.js b/modules/control-center-web/src/main/js/app/index.js
index 7ce2fb0..2e25044 100644
--- a/modules/control-center-web/src/main/js/app/index.js
+++ b/modules/control-center-web/src/main/js/app/index.js
@@ -92,6 +92,7 @@ import igniteUiAcePojos from './directives/ui-ace-pojos/ui-ace-pojos.directive';
 import igniteFormFieldJavaClass from './directives/form-field-java-class/form-field-java-class.directive';
 
 // Services.
+import cleanup from './services/cleanup/cleanup.service';
 import IgniteUiAceOnLoad from './services/UiAceOnLoad/service';
 
 // Providers
@@ -139,6 +140,7 @@ angular
 .directive(...igniteUiAcePojos)
 .directive(...igniteFormFieldJavaClass)
 // Services.
+.service(...cleanup)
 .service(...IgniteUiAceOnLoad)
 // Providers.
 .provider(...igniteCountries)

http://git-wip-us.apache.org/repos/asf/ignite/blob/b755b633/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/deployment.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/deployment.jade b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/deployment.jade
index 74fdc32..2949f16 100644
--- a/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/deployment.jade
+++ b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/deployment.jade
@@ -98,13 +98,13 @@ form.panel.panel-default(name='#{form}' novalidate)
                             data-ng-disabled='!#{enabled}'
                         )
                 .settings-row
-                    ignite-form-group(ng-init='__ = {};' ng-model='#{exclude}' ng-form='#{form}' )
+                    ignite-form-group(ng-model='#{exclude}' ng-form='#{form}' )
                         ignite-form-field-label
                             | Local class path exclude
                         ignite-form-group-tooltip
                             | List of packages from the system classpath that need to be peer-to-peer loaded from task originating node#[br]
                             | '*' is supported at the end of the package name which means that all sub-packages and their classes are included like in Java package import clause
-                        ignite-form-group-add(ng-show='#{enabled}' ng-click='(__.add = [{}])')
+                        ignite-form-group-add(ng-show='#{enabled}' ng-click='(group.add = [{}])')
                             | Add package name.
 
                         - var field = 'edit'
@@ -112,17 +112,17 @@ form.panel.panel-default(name='#{form}' novalidate)
                         - var save = exclude + '[$index] = ' + field
 
                         .group-content(ng-if='#{exclude}.length')
-                            ignite-form-field(ng-repeat='model in #{exclude} track by $index' type='internal' ng-init='___ = {}')
+                            ignite-form-field(ng-repeat='model in #{exclude} track by $index' type='internal')
                                 .indexField
                                     | {{ $index+1 }}) 
                                 i.tipField.fa.fa-remove(
-                                    ng-hide='___.edit'
+                                    ng-hide='field.edit'
                                     bs-tooltip='"Remove package name"'
                                     ng-click='#{exclude}.splice(#{exclude}.indexOf(model), 1)'
                                 )
-                                span(ng-hide='___.edit')
-                                    a.labelFormField(ng-click='#{enabled} && (___.edit = true)') {{ model }}
-                                span(ng-if='___.edit' ng-init='#{field} = model')
+                                span(ng-hide='field.edit')
+                                    a.labelFormField(ng-click='#{enabled} && (field.edit = true)') {{ model }}
+                                span(ng-if='field.edit' ng-init='#{field} = model')
                                     ignite-form-field-input-text(
                                         data-name='#{field}'
                                         data-ng-model='#{field}'
@@ -132,13 +132,13 @@ form.panel.panel-default(name='#{form}' novalidate)
                                         data-java-package-name='true'
                                         data-ignite-unique='#{exclude}'
                                         data-ignite-form-field-input-autofocus='true'
-                                        on-enter='#{valid} && (#{save}); #{valid} && (___.edit = false);'
-                                        on-escape='___.edit = false'
-                                        ng-blur='#{valid} && (#{save}); (___.edit = false)'
+                                        on-enter='#{valid} && (#{save}); #{valid} && (field.edit = false);'
+                                        on-escape='field.edit = false'
+                                        ng-blur='#{valid} && (#{save}); (field.edit = false)'
                                     )
                                         i.fa.fa-floppy-o(
                                             ng-show='#{valid}'
-                                            ng-click='#{valid} && (#{save}); #{valid} && (___.edit = false);'
+                                            ng-click='#{valid} && (#{save}); #{valid} && (field.edit = false);'
                                             bs-tooltip 
                                             data-title='Click icon or press [Enter] to save item' 
                                         )
@@ -152,7 +152,7 @@ form.panel.panel-default(name='#{form}' novalidate)
                         - var valid = form + '.' + field + '.$valid'
                         - var push = exclude + '.push(' + field + ')'
 
-                        .group-content(ng-repeat='field in __.add')
+                        .group-content(ng-repeat='field in group.add')
                             ignite-form-field(type='internal')
                                 ignite-form-field-input-text(
                                     data-name='#{field}'
@@ -163,13 +163,13 @@ form.panel.panel-default(name='#{form}' novalidate)
                                     data-java-package-name='true'
                                     data-ignite-unique='#{exclude}'
                                     data-ignite-form-field-input-autofocus='true'
-                                    on-enter='#{valid} && #{push}; #{valid} && (stopblur = true) && (__.add = [{}])'
-                                    on-escape='__.add = []'
-                                    ng-blur='#{valid} && #{push}; !stopblur && (__.add = [])'
+                                    on-enter='#{valid} && #{push}; #{valid} && (stopblur = true) && (group.add = [{}])'
+                                    on-escape='group.add = []'
+                                    ng-blur='#{valid} && #{push}; !stopblur && (group.add = [])'
                                 )
                                     i.fa.fa-floppy-o(
                                         ng-show='#{valid}'
-                                        ng-click='#{valid} && #{push}; #{valid} && (__.add = [])'
+                                        ng-click='#{valid} && #{push}; #{valid} && (group.add = [])'
                                         bs-tooltip 
                                         data-title='Click icon or press [Enter] to save item' 
                                     )
@@ -179,7 +179,7 @@ form.panel.panel-default(name='#{form}' novalidate)
                                     +feedback(field, 'javaKeywords', 'Package name could not contains reserved java keyword: ""!')
                                     +feedback(field, 'igniteUnique', 'Such package already exists!')
             
-                        .group-content-empty(ng-if='!(#{exclude}.length) && !__.add.length')
+                        .group-content-empty(ng-if='!(#{exclude}.length) && !group.add.length')
                             | Not defined
             .col-sm-6
                 .preview-panel(ng-init='mode = false')

http://git-wip-us.apache.org/repos/asf/ignite/blob/b755b633/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/cloud.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/cloud.jade b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/cloud.jade
index 283f72a..addd5d3 100644
--- a/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/cloud.jade
+++ b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/cloud.jade
@@ -70,14 +70,14 @@ div
                 data-ng-required='true'
             )
     .details-row(ng-if='true')
-        ignite-form-group(ng-init='__ = {};' ng-model='#{regions}' ng-form='generalDiscoveryCloudRegions')
+        ignite-form-group(ng-model='#{regions}' ng-form='generalDiscoveryCloudRegions')
             ignite-form-field-label
                 | Regions
             ignite-form-group-tooltip
                 | List of regions where VMs are located#[br]
                 | If the regions are not set then every region, that a cloud provider has, will be investigated. This could lead to significant performance degradation#[br]
                 | Note, that some cloud providers, like Google Compute Engine, doesn't have a notion of a region. For such providers regions are redundant
-            ignite-form-group-add(ng-click='__.add = [{}]')
+            ignite-form-group-add(ng-click='group.add = [{}]')
                 | Add new address
 
             - var field = 'edit'
@@ -85,17 +85,17 @@ div
             - var save = addresses + '[$index] = ' + field
 
             .group-content(ng-if='#{regions}.length')
-                ignite-form-field(ng-repeat='model in #{regions} track by $index' type='internal' ng-init='___ = {}')
+                ignite-form-field(ng-repeat='model in #{regions} track by $index' type='internal')
                     .indexField
                         | {{ $index+1 }}) 
                     i.tipField.fa.fa-remove(
-                        ng-hide='___.edit'
+                        ng-hide='field.edit'
                         bs-tooltip='"Remove region"'
                         ng-click='#{regions}.splice(#{regions}.indexOf(model), 1)'
                     )
-                    span(ng-hide='___.edit')
-                        a.labelFormField(ng-click='___.edit = true') {{ model }}
-                    span(ng-if='___.edit' ng-init='#{field} = model')
+                    span(ng-hide='field.edit')
+                        a.labelFormField(ng-click='field.edit = true') {{ model }}
+                    span(ng-if='field.edit' ng-init='#{field} = model')
                         ignite-form-field-input-text(
                             data-name='#{field}'
                             data-ng-model='#{field}'
@@ -103,13 +103,13 @@ div
                             data-placeholder='Region name'
                             data-ignite-unique='#{regions}'
                             data-ignite-form-field-input-autofocus='true'
-                            on-enter='#{valid} && (#{save}); #{valid} && (___.edit = false);'
-                            on-escape='___.edit = false'
-                            ng-blur='#{valid} && (#{save}); (___.edit = false)'
+                            on-enter='#{valid} && (#{save}); #{valid} && (field.edit = false);'
+                            on-escape='field.edit = false'
+                            ng-blur='#{valid} && (#{save}); (field.edit = false)'
                         )
                             i.fa.fa-floppy-o(
                                 ng-show='#{valid}'
-                                ng-click='#{valid} && (#{save}); #{valid} && (___.edit = false);'
+                                ng-click='#{valid} && (#{save}); #{valid} && (field.edit = false);'
                                 bs-tooltip 
                                 data-title='Click icon or press [Enter] to save item' 
                             )
@@ -124,7 +124,7 @@ div
             - var valid = form + '.' + field + '.$valid'
             - var push = regions + '.push(' + field + ')'
 
-            .group-content(ng-repeat='field in __.add')
+            .group-content(ng-repeat='field in group.add')
                 ignite-form-field(type='internal')
                     ignite-form-field-input-text(
                         data-name='#{field}'
@@ -133,13 +133,13 @@ div
                         data-placeholder='Region name'
                         data-ignite-unique='#{regions}'
                         data-ignite-form-field-input-autofocus='true'
-                        on-enter='#{valid} && #{push}; #{valid} && (stopblur = true) && (__.add = [{}])'
-                        on-escape='__.add = []'
-                        ng-blur='#{valid} && #{push}; !stopblur && (__.add = [])'
+                        on-enter='#{valid} && #{push}; #{valid} && (stopblur = true) && (group.add = [{}])'
+                        on-escape='group.add = []'
+                        ng-blur='#{valid} && #{push}; !stopblur && (group.add = [])'
                     )
                         i.fa.fa-floppy-o(
                             ng-show='#{valid}'
-                            ng-click='#{valid} && #{push}; #{valid} && (__.add = [])'
+                            ng-click='#{valid} && #{push}; #{valid} && (group.add = [])'
                             bs-tooltip 
                             data-title='Click icon or press [Enter] to save item' 
                         )
@@ -150,17 +150,17 @@ div
                             data-title='Such region already exists!'
                         )
             
-            .group-content-empty(ng-if='!(#{regions}.length) && !__.add.length')
+            .group-content-empty(ng-if='!(#{regions}.length) && !group.add.length')
                 | Not defined
     .details-row(ng-if='true')
-         ignite-form-group(ng-init='__ = {};' ng-model='#{zones}' ng-form='generalDiscoveryCloudZones')
+         ignite-form-group(ng-model='#{zones}' ng-form='generalDiscoveryCloudZones')
             ignite-form-field-label
                 | Zones
             ignite-form-group-tooltip
                 | List of zones where VMs are located#[br]
                 | If the zones are not set then every zone from specified regions, will be taken into account#[br]
                 | Note, that some cloud providers, like Rackspace, doesn't have a notion of a zone. For such providers zones are redundant
-            ignite-form-group-add(ng-click='__.add = [{}]')
+            ignite-form-group-add(ng-click='group.add = [{}]')
                 | Add new address
 
             - var field = 'edit'
@@ -168,17 +168,17 @@ div
             - var save = addresses + '[$index] = ' + field
 
             .group-content(ng-if='#{zones}.length')
-                ignite-form-field(ng-repeat='model in #{zones} track by $index' type='internal' ng-init='___ = {}')
+                ignite-form-field(ng-repeat='model in #{zones} track by $index' type='internal')
                     .indexField
                         | {{ $index+1 }}) 
                     i.tipField.fa.fa-remove(
-                        ng-hide='___.edit'
+                        ng-hide='field.edit'
                         bs-tooltip='"Remove zone"'
                         ng-click='#{zones}.splice(#{zones}.indexOf(model), 1)'
                     )
-                    span(ng-hide='___.edit')
-                        a.labelFormField(ng-click='___.edit = true') {{ model }}
-                    span(ng-if='___.edit' ng-init='#{field} = model')
+                    span(ng-hide='field.edit')
+                        a.labelFormField(ng-click='field.edit = true') {{ model }}
+                    span(ng-if='field.edit' ng-init='#{field} = model')
                         ignite-form-field-input-text(
                             data-name='#{field}'
                             data-ng-model='#{field}'
@@ -186,13 +186,13 @@ div
                             data-placeholder='Zone name'
                             data-ignite-unique='#{zones}'
                             data-ignite-form-field-input-autofocus='true'
-                            on-enter='#{valid} && (#{save}); #{valid} && (___.edit = false);'
-                            on-escape='___.edit = false'
-                            ng-blur='#{valid} && (#{save}); (___.edit = false)'
+                            on-enter='#{valid} && (#{save}); #{valid} && (field.edit = false);'
+                            on-escape='field.edit = false'
+                            ng-blur='#{valid} && (#{save}); (field.edit = false)'
                         )
                             i.fa.fa-floppy-o(
                                 ng-show='#{valid}'
-                                ng-click='#{valid} && (#{save}); #{valid} && (___.edit = false);'
+                                ng-click='#{valid} && (#{save}); #{valid} && (field.edit = false);'
                                 bs-tooltip 
                                 data-title='Click icon or press [Enter] to save item' 
                             )
@@ -207,7 +207,7 @@ div
             - var valid = form + '.' + field + '.$valid'
             - var push = zones + '.push(' + field + ')'
 
-            .group-content(ng-repeat='field in __.add')
+            .group-content(ng-repeat='field in group.add')
                 ignite-form-field(type='internal')
                     ignite-form-field-input-text(
                         data-name='#{field}'
@@ -216,13 +216,13 @@ div
                         data-placeholder='Zone name'
                         data-ignite-unique='#{zones}'
                         data-ignite-form-field-input-autofocus='true'
-                        on-enter='#{valid} && #{push}; #{valid} && (stopblur = true) && (__.add = [{}])'
-                        on-escape='__.add = []'
-                        ng-blur='#{valid} && #{push}; !stopblur && (__.add = [])'
+                        on-enter='#{valid} && #{push}; #{valid} && (stopblur = true) && (group.add = [{}])'
+                        on-escape='group.add = []'
+                        ng-blur='#{valid} && #{push}; !stopblur && (group.add = [])'
                     )
                         i.fa.fa-floppy-o(
                             ng-show='#{valid}'
-                            ng-click='#{valid} && #{push}; #{valid} && (__.add = [])'
+                            ng-click='#{valid} && #{push}; #{valid} && (group.add = [])'
                             bs-tooltip 
                             data-title='Click icon or press [Enter] to save item' 
                         )
@@ -233,5 +233,5 @@ div
                             data-title='Such zone already exists!'
                         )
             
-            .group-content-empty(ng-if='!(#{zones}.length) && !__.add.length')
+            .group-content-empty(ng-if='!(#{zones}.length) && !group.add.length')
                 | Not defined

http://git-wip-us.apache.org/repos/asf/ignite/blob/b755b633/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/multicast.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/multicast.jade b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/multicast.jade
index 44b0944..6d774d4 100644
--- a/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/multicast.jade
+++ b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/multicast.jade
@@ -83,7 +83,7 @@ div
                 data-ng-model='#{model}.localAddress'
             )
     .details-row
-        ignite-form-group(ng-init='__ = {};' ng-model='#{addresses}' ng-form='discoveryMulticastAddresses')
+        ignite-form-group(ng-model='#{addresses}' ng-form='discoveryMulticastAddresses')
             ignite-form-field-label
                 | Addresses
             ignite-form-group-tooltip
@@ -98,7 +98,7 @@ div
                 | If port range is provided (e.g. host:port1..port2) the following should be considered:#[br]
                 ul: li port1 < port2 should be true
                     li Both port1 and port2 should be greater than 0
-            ignite-form-group-add(ng-click='__.add = [{}]')
+            ignite-form-group-add(ng-click='group.add = [{}]')
                 | Add new address
 
             - var field = 'edit'
@@ -106,21 +106,21 @@ div
             - var save = addresses + '[$index] = ' + field
 
             .group-content(ng-if='#{addresses}.length')
-                ignite-form-field(ng-repeat='model in #{addresses} track by $index' type='internal' ng-init=' ___ = {}')
+                ignite-form-field(ng-repeat='model in #{addresses} track by $index' type='internal')
                     .indexField
                         | {{ $index+1 }}) 
                     i.tipField.fa.fa-remove(
-                        ng-hide='___.edit'
+                        ng-hide='field.edit'
                         bs-tooltip='"Remove address"'
                         ng-click='#{addresses}.splice(#{addresses}.indexOf(model), 1)'
                     )
 
-                    ignite-form-field-down(ng-if='!$last' ng-hide='___.edit' data-ng-model='model' data-models='#{addresses}')
-                    ignite-form-field-up(ng-if='!$first' ng-hide='___.edit' data-ng-model='model' data-models='#{addresses}')
+                    ignite-form-field-down(ng-if='!$last' ng-hide='field.edit' data-ng-model='model' data-models='#{addresses}')
+                    ignite-form-field-up(ng-if='!$first' ng-hide='field.edit' data-ng-model='model' data-models='#{addresses}')
 
-                    span(ng-hide='___.edit')
-                        a.labelFormField(ng-click='___.edit = true') {{ model }}
-                    span(ng-if='___.edit' ng-init='#{field} = model')
+                    span(ng-hide='field.edit')
+                        a.labelFormField(ng-click='field.edit = true') {{ model }}
+                    span(ng-if='field.edit' ng-init='#{field} = model')
                         ignite-form-field-input-text(
                             data-name='#{field}'
                             data-ng-model='#{field}'
@@ -128,13 +128,13 @@ div
                             data-placeholder='IP address:port'
                             data-ignite-unique='#{addresses}'
                             data-ignite-form-field-input-autofocus='true'
-                            on-enter='#{valid} && (#{save}); #{valid} && (___.edit = false);'
-                            on-escape='___.edit = false'
-                            ng-blur='#{valid} && (#{save}); (___.edit = false)'
+                            on-enter='#{valid} && (#{save}); #{valid} && (field.edit = false);'
+                            on-escape='field.edit = false'
+                            ng-blur='#{valid} && (#{save}); (field.edit = false)'
                         )
                             i.fa.fa-floppy-o(
                                 ng-show='#{valid}'
-                                ng-click='#{valid} && (#{save}); #{valid} && (___.edit = false);'
+                                ng-click='#{valid} && (#{save}); #{valid} && (field.edit = false);'
                                 bs-tooltip 
                                 data-title='Click icon or press [Enter] to save item' 
                             )
@@ -149,7 +149,7 @@ div
             - var valid = form + '.' + field + '.$valid'
             - var push = addresses + '.push(' + field + ')'
 
-            .group-content(ng-repeat='field in __.add')
+            .group-content(ng-repeat='field in group.add')
                 ignite-form-field(type='internal')
                     ignite-form-field-input-text(
                         data-name='#{field}'
@@ -158,13 +158,13 @@ div
                         data-placeholder='IP address:port'
                         data-ignite-unique='#{addresses}'
                         data-ignite-form-field-input-autofocus='true'
-                        on-enter='#{valid} && #{push}; #{valid} && (stopblur = true) && (__.add = [{}])'
-                        on-escape='__.add = []'
-                        ng-blur='#{valid} && #{push}; !stopblur && (__.add = [])'
+                        on-enter='#{valid} && #{push}; #{valid} && (stopblur = true) && (group.add = [{}])'
+                        on-escape='group.add = []'
+                        ng-blur='#{valid} && #{push}; !stopblur && (group.add = [])'
                     )
                         i.fa.fa-floppy-o(
                             ng-show='#{valid}'
-                            ng-click='#{valid} && #{push}; #{valid} && (__.add = [])'
+                            ng-click='#{valid} && #{push}; #{valid} && (group.add = [])'
                             bs-tooltip 
                             data-title='Click icon or press [Enter] to save item' 
                         )
@@ -175,5 +175,5 @@ div
                             data-title='Such IP address already exists!'
                         )
             
-            .group-content-empty(ng-if='!(#{addresses}.length) && !__.add.length')
+            .group-content-empty(ng-if='!(#{addresses}.length) && !group.add.length')
                 | Not defined

http://git-wip-us.apache.org/repos/asf/ignite/blob/b755b633/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/vm.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/vm.jade b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/vm.jade
index ca3fee1..fa693d2 100644
--- a/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/vm.jade
+++ b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/vm.jade
@@ -19,7 +19,7 @@
 - var form = 'discoveryVmAddresses';
 
 div
-    ignite-form-group(ng-init='__ = {};' ng-model='#{addresses}' ng-form='discoveryVmAddresses')
+    ignite-form-group(ng-model='#{addresses}' ng-form='discoveryVmAddresses')
         ignite-form-field-label
             | Addresses
         ignite-form-group-tooltip
@@ -34,7 +34,7 @@ div
             | If port range is provided (e.g. host:port1..port2) the following should be considered:#[br]
             ul: li port1 < port2 should be true
                 li Both port1 and port2 should be greater than 0
-        ignite-form-group-add(ng-click='__.add = [{}]')
+        ignite-form-group-add(ng-click='group.add = [{}]')
             | Add new address
 
         - var field = 'edit'
@@ -42,21 +42,21 @@ div
         - var save = addresses + '[$index] = ' + field
 
         .group-content(ng-if='#{addresses}.length')
-            ignite-form-field(ng-repeat='model in #{addresses} track by $index' type='internal' ng-init='___ = {}')
+            ignite-form-field(ng-repeat='model in #{addresses} track by $index' type='internal')
                 .indexField
                     | {{ $index+1 }}) 
                 i.tipField.fa.fa-remove(
-                    ng-hide='___.edit'
+                    ng-hide='field.edit'
                     bs-tooltip='"Remove address"'
                     ng-click='#{addresses}.splice(#{addresses}.indexOf(model), 1)'
                 )
 
-                ignite-form-field-down(ng-if='!$last' ng-hide='___.edit' data-ng-model='model' data-models='#{addresses}')
-                ignite-form-field-up(ng-if='!$first' ng-hide='___.edit' data-ng-model='model' data-models='#{addresses}')
+                ignite-form-field-down(ng-if='!$last' ng-hide='field.edit' data-ng-model='model' data-models='#{addresses}')
+                ignite-form-field-up(ng-if='!$first' ng-hide='field.edit' data-ng-model='model' data-models='#{addresses}')
                 
-                span(ng-hide='___.edit')
-                    a.labelFormField(ng-click='___.edit = true') {{ model }}
-                span(ng-if='___.edit' ng-init='#{field} = model')
+                span(ng-hide='field.edit')
+                    a.labelFormField(ng-click='field.edit = true') {{ model }}
+                span(ng-if='field.edit' ng-init='#{field} = model')
                     ignite-form-field-input-text(
                         data-name='#{field}'
                         data-ng-model='#{field}'
@@ -64,13 +64,13 @@ div
                         data-placeholder='IP address:port'
                         data-ignite-unique='#{addresses}'
                         data-ignite-form-field-input-autofocus='true'
-                        on-enter='#{valid} && (#{save}); #{valid} && (___.edit = false);'
-                        on-escape='___.edit = false'
-                        ng-blur='#{valid} && (#{save}); (___.edit = false)'
+                        on-enter='#{valid} && (#{save}); #{valid} && (field.edit = false);'
+                        on-escape='field.edit = false'
+                        ng-blur='#{valid} && (#{save}); (field.edit = false)'
                     )
                         i.fa.fa-floppy-o(
                             ng-show='#{valid}'
-                            ng-click='#{valid} && (#{save}); #{valid} && (___.edit = false);'
+                            ng-click='#{valid} && (#{save}); #{valid} && (field.edit = false);'
                             bs-tooltip 
                             data-title='Click icon or press [Enter] to save item' 
                         )
@@ -85,7 +85,7 @@ div
         - var valid = form + '.' + field + '.$valid'
         - var push = addresses + '.push(' + field + ')'
 
-        .group-content(ng-repeat='field in __.add')
+        .group-content(ng-repeat='field in group.add')
             ignite-form-field(type='internal')
                 ignite-form-field-input-text(
                     data-name='#{field}'
@@ -94,13 +94,13 @@ div
                     data-placeholder='IP address:port'
                     data-ignite-unique='#{addresses}'
                     data-ignite-form-field-input-autofocus='true'
-                    on-enter='#{valid} && #{push}; #{valid} && (stopblur = true) && (__.add = [{}])'
-                    on-escape='__.add = []'
-                    ng-blur='#{valid} && #{push}; !stopblur && (__.add = [])'
+                    on-enter='#{valid} && #{push}; #{valid} && (stopblur = true) && (group.add = [{}])'
+                    on-escape='group.add = []'
+                    ng-blur='#{valid} && #{push}; !stopblur && (group.add = [])'
                 )
                     i.fa.fa-floppy-o(
                         ng-show='#{valid}'
-                        ng-click='#{valid} && #{push}; #{valid} && (__.add = [])'
+                        ng-click='#{valid} && #{push}; #{valid} && (group.add = [])'
                         bs-tooltip 
                         data-title='Click icon or press [Enter] to save item' 
                     )
@@ -111,5 +111,5 @@ div
                         data-title='Such IP address already exists!'
                     )
         
-        .group-content-empty(id='addresses' ng-if='!(#{addresses}.length) && !__.add.length')
+        .group-content-empty(id='addresses' ng-if='!(#{addresses}.length) && !group.add.length')
                 | Not defined

http://git-wip-us.apache.org/repos/asf/ignite/blob/b755b633/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/ssl.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/ssl.jade b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/ssl.jade
index 4ae5aeb..4c428ee 100644
--- a/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/ssl.jade
+++ b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/ssl.jade
@@ -111,12 +111,12 @@ form.panel.panel-default(name='#{form}' novalidate)
                         )
 
                 .settings-row
-                    ignite-form-group(ng-init='__ = {};' ng-form='trustManagers' ng-model='#{trust}')
+                    ignite-form-group(ng-form='trustManagers' ng-model='#{trust}')
                         ignite-form-field-label
                             | Trust managers
                         ignite-form-group-tooltip
                             | Pre-configured trust managers
-                        ignite-form-group-add(ng-show='#{enabled}' ng-click='(__.add = [{}])')
+                        ignite-form-group-add(ng-show='#{enabled}' ng-click='(group.add = [{}])')
                             | Add new trust manager.
 
                         - var field = 'edit'
@@ -124,31 +124,31 @@ form.panel.panel-default(name='#{form}' novalidate)
                         - var save = trust + '[$index] = ' + field
 
                         .group-content(ng-if='#{trust}.length')
-                            ignite-form-field(ng-repeat='model in #{trust} track by $index' type='internal' ng-init='___ = {}')
+                            ignite-form-field(ng-repeat='model in #{trust} track by $index' type='internal')
                                 .indexField
                                     | {{ $index+1 }}) 
                                 i.tipField.fa.fa-remove(
                                     ng-show='#{enabled}'
-                                    ng-hide='___.edit'
+                                    ng-hide='field.edit'
                                     bs-tooltip='"Remove trust manager"'
                                     ng-click='#{enabled} && (#{trust}.splice(#{trust}.indexOf(model), 1))'
                                 )
-                                span(ng-hide='___.edit')
-                                    a.labelFormField(ng-click='#{enabled} && (___.edit = true)') {{ model }}
-                                span(ng-if='___.edit' ng-init='#{field} = model')
+                                span(ng-hide='field.edit')
+                                    a.labelFormField(ng-click='#{enabled} && (field.edit = true)') {{ model }}
+                                span(ng-if='field.edit' ng-init='#{field} = model')
                                     ignite-form-field-java-class(
                                         data-name='#{field}'
                                         data-ng-model='#{field}'
                                         data-ng-required='true'
                                         data-ignite-unique='#{trust}'
                                         data-ignite-form-field-input-autofocus='true'
-                                        on-enter='#{valid} && (#{save}); #{valid} && (___.edit = false);'
-                                        on-escape='___.edit = false'
-                                        ng-blur='#{valid} && (#{save}); (___.edit = false)'
+                                        on-enter='#{valid} && (#{save}); #{valid} && (field.edit = false);'
+                                        on-escape='field.edit = false'
+                                        ng-blur='#{valid} && (#{save}); (field.edit = false)'
                                     )
                                         i.fa.fa-floppy-o(
                                             ng-show='#{valid}'
-                                            ng-click='#{valid} && (#{save}); #{valid} && (___.edit = false);'
+                                            ng-click='#{valid} && (#{save}); #{valid} && (field.edit = false);'
                                             bs-tooltip 
                                             data-title='Click icon or press [Enter] to save item' 
                                         )
@@ -163,7 +163,7 @@ form.panel.panel-default(name='#{form}' novalidate)
                         - var valid = form + '.' + field + '.$valid'
                         - var push = trust + '.push(' + field + ')'
 
-                        .group-content(ng-repeat='field in __.add')
+                        .group-content(ng-repeat='field in group.add')
                             ignite-form-field(type='internal')
                                 ignite-form-field-java-class(
                                     data-name='#{field}'
@@ -171,13 +171,13 @@ form.panel.panel-default(name='#{form}' novalidate)
                                     data-ng-required='true'
                                     data-ignite-unique='#{trust}'
                                     data-ignite-form-field-input-autofocus='true'
-                                    on-enter='#{valid} && #{push}; #{valid} && (stopblur = true) && (__.add = [{}])'
-                                    on-escape='__.add = []'
-                                    ng-blur='#{valid} && #{push}; !stopblur && (__.add = [])'
+                                    on-enter='#{valid} && #{push}; #{valid} && (stopblur = true) && (group.add = [{}])'
+                                    on-escape='group.add = []'
+                                    ng-blur='#{valid} && #{push}; !stopblur && (group.add = [])'
                                 )
                                     i.fa.fa-floppy-o(
                                         ng-show='#{valid}'
-                                        ng-click='#{valid} && #{push}; #{valid} && (__.add = [])'
+                                        ng-click='#{valid} && #{push}; #{valid} && (group.add = [])'
                                         bs-tooltip 
                                         data-title='Click icon or press [Enter] to save item' 
                                     )
@@ -188,7 +188,7 @@ form.panel.panel-default(name='#{form}' novalidate)
                                         data-title='Such trust manager already exists!'
                                     )
 
-                        .group-content-empty(ng-if='!(#{trust}.length) && !__.add.length')
+                        .group-content-empty(ng-if='!(#{trust}.length) && !group.add.length')
                             | Not defined
 
                 .settings-row(ng-if='!#{trust}.length')

http://git-wip-us.apache.org/repos/asf/ignite/blob/b755b633/modules/control-center-web/src/main/js/app/services/cleanup/cleanup.service.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/services/cleanup/cleanup.service.js b/modules/control-center-web/src/main/js/app/services/cleanup/cleanup.service.js
new file mode 100644
index 0000000..e3a1716
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/services/cleanup/cleanup.service.js
@@ -0,0 +1,61 @@
+/*
+ * 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.
+ */
+
+import angular from 'angular';
+
+const isArray = angular.isArray;
+const isDefined = angular.isDefined;
+const isNumber = angular.isNumber;
+const isObject = angular.isObject;
+const isString = angular.isString;
+const isUndefined = angular.isUndefined;
+
+export default ['$cleanup', () => {
+    const cleanup = (original, dist) => {
+        if (isUndefined(original))
+            return dist;
+
+        if (isObject(original)) {
+            let key;
+
+            for (key in original) {
+                if (original.hasOwnProperty(key)) {
+                    const attr = cleanup(original[key]);
+
+                    if (isDefined(attr)) {
+                        dist = dist || {};
+                        dist[key] = attr;
+                    }
+                }
+            }
+        } else if ((isString(original) && original.length) || isNumber(original))
+            dist = original;
+        else if (isArray(original) && original.length) {
+            dist = [];
+
+            let i = 0;
+            const l = original.length;
+
+            for (; i < l; i++)
+                dist[i] = cleanup(original[i], {});
+        }
+
+        return dist;
+    };
+
+    return cleanup;
+}];

http://git-wip-us.apache.org/repos/asf/ignite/blob/b755b633/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 56a86d8..ef61cfd 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
@@ -17,7 +17,7 @@
 
 // Controller for Clusters screen.
 consoleModule.controller('clustersController', function ($http, $timeout, $scope, $state, $controller,
-    $common, $focus, $confirm, $clone, $preview, $loading, $unsavedChangesGuard, igniteIncludeEventGroups) {
+    $common, $focus, $confirm, $clone, $preview, $loading, $unsavedChangesGuard, $cleanup, igniteIncludeEventGroups) {
         $unsavedChangesGuard.install($scope);
 
         var __original_value;
@@ -175,7 +175,7 @@ consoleModule.controller('clustersController', function ($http, $timeout, $scope
                 $scope.$watch('backupItem', function (val) {
                     var form = $scope.ui.inputForm;
 
-                    if (form.$pristine || (form.$valid && __original_value === JSON.stringify(val)))
+                    if (form.$pristine || (form.$valid && __original_value === JSON.stringify($cleanup(val))))
                         form.$setPristine();
                     else
                         form.$setDirty();
@@ -299,7 +299,7 @@ consoleModule.controller('clustersController', function ($http, $timeout, $scope
 
                 $scope.backupItem = angular.extend({}, blank, $scope.backupItem);
 
-                __original_value = JSON.stringify($scope.backupItem);
+                __original_value = JSON.stringify($cleanup($scope.backupItem));
 
                 if ($common.getQueryVariable('new'))
                     $state.go('base.configuration.clusters');

http://git-wip-us.apache.org/repos/asf/ignite/blob/b755b633/modules/control-center-web/src/main/js/views/settings/admin.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/views/settings/admin.jade b/modules/control-center-web/src/main/js/views/settings/admin.jade
index d06a0b1..0a021d3 100644
--- a/modules/control-center-web/src/main/js/views/settings/admin.jade
+++ b/modules/control-center-web/src/main/js/views/settings/admin.jade
@@ -52,5 +52,5 @@
                                 i.fa.fa-eye(ng-click='becomeUser(row)' style='margin-left: 5px'  bs-tooltip='' data-title='Become this user')
                 tfoot
                     tr
-                        td.text-right(colspan='5')
+                        td.text-right(colspan='7')
                             div(st-pagination st-items-by-page='15' st-displayed-pages='5')