ignite-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From voze...@apache.org
Subject [28/50] [abbrv] ignite git commit: Web console beta-5.
Date Wed, 09 Nov 2016 08:38:42 GMT
http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint.jade b/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint.jade
new file mode 100644
index 0000000..d2552a8
--- /dev/null
+++ b/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint.jade
@@ -0,0 +1,85 @@
+//-
+    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.
+
+include ../../../../../app/helpers/jade/mixins.jade
+
+-var form = 'checkpoint'
+-var model = 'backupItem.checkpointSpi'
+-var CustomCheckpoint = 'model.kind === "Custom"'
+
+.panel.panel-default(ng-form=form novalidate)
+    .panel-heading(bs-collapse-toggle ng-click='ui.loadPanel("#{form}")')
+        ignite-form-panel-chevron
+        label Checkpointing
+        ignite-form-field-tooltip.tipLabel
+            | Checkpointing provides an ability to save an intermediate job state#[br]
+            | #[a(href="http://apacheignite.gridgain.org/docs/checkpointing" target="_blank") More info]
+        ignite-form-revert
+    .panel-collapse(role='tabpanel' bs-collapse-target id=form)
+        .panel-body(ng-if='ui.isPanelLoaded("#{form}")')
+            .col-sm-6
+                .settings-row(ng-init='checkpointSpiTbl={type: "checkpointSpi", model: "checkpointSpi", focusId: "kind", ui: "checkpoint-table"}')
+                    +ignite-form-group()
+                        ignite-form-field-label
+                            | Checkpoint SPI configurations
+                        ignite-form-group-tooltip
+                            | Checkpoint SPI configurations
+                        ignite-form-group-add(ng-click='tableNewItem(checkpointSpiTbl)')
+                            | Add checkpoint SPI
+                        .group-content-empty(ng-if='!(#{model} && #{model}.length > 0)')
+                            | Not defined
+                        .group-content(ng-show='#{model} && #{model}.length > 0' ng-repeat='model in #{model} track by $index')
+                            hr(ng-if='$index != 0')
+                            .settings-row
+                                +dropdown-required('Checkpoint SPI:', 'model.kind', '"checkpointKind" + $index', 'true', 'true', 'Choose checkpoint configuration variant', '[\
+                                        {value: "FS", label: "File System"},\
+                                        {value: "Cache", label: "Cache"},\
+                                        {value: "S3", label: "Amazon S3"},\
+                                        {value: "JDBC", label: "Database"},\
+                                        {value: "Custom", label: "Custom"}\
+                                    ]',
+                                    'Provides an ability to save an intermediate job state\
+                                    <ul>\
+                                        <li>File System - Uses a shared file system to store checkpoints</li>\
+                                        <li>Cache - Uses a cache to store checkpoints</li>\
+                                        <li>Amazon S3 - Uses Amazon S3 to store checkpoints</li>\
+                                        <li>Database - Uses a database to store checkpoints</li>\
+                                        <li>Custom - Custom checkpoint SPI implementation</li>\
+                                    </ul>')
+                                    +table-remove-button(model, 'Remove Checkpoint SPI')
+
+                            div(ng-if='model.kind === "FS"')
+                                include ./checkpoint/fs.jade
+
+                            div(ng-if='model.kind === "Cache"')
+                                .settings-row
+                                    +dropdown-required-empty('Cache:', 'model.Cache.cache', '"checkpointCacheCache"+ $index', 'true', 'true',
+                                        'Choose cache', 'No caches configured for current cluster', 'clusterCaches', 'Cache to use for storing checkpoints')
+                                .settings-row
+                                    +java-class('Listener:', 'model.Cache.checkpointListener', '"checkpointCacheListener" + $index', 'true', 'false',
+                                        'Checkpoint listener implementation class name')
+
+                            div(ng-show='model.kind === "S3"')
+                                include ./checkpoint/s3.jade
+
+                            div(ng-show='model.kind === "JDBC"')
+                                include ./checkpoint/jdbc.jade
+
+                            .settings-row(ng-show=CustomCheckpoint)
+                                +java-class('Class name:', 'model.Custom.className', '"checkpointCustomClassName" + $index', 'true', CustomCheckpoint,
+                                'Custom CheckpointSpi implementation class')
+            .col-sm-6
+                +preview-xml-java('backupItem', 'clusterCheckpoint', 'caches')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint/fs.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint/fs.jade b/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint/fs.jade
new file mode 100644
index 0000000..01f14f4
--- /dev/null
+++ b/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint/fs.jade
@@ -0,0 +1,66 @@
+//-
+    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.
+
+include ../../../../../../app/helpers/jade/mixins.jade
+
+-var form = 'checkpointFsPaths'
+-var dirPaths = 'model.FS.directoryPaths'
+
+.details-row
+    +ignite-form-group(ng-form=form ng-model=dirPaths)
+        -var uniqueTip = 'Such path already exists!'
+
+        ignite-form-field-label
+            | Paths
+        ignite-form-group-tooltip
+            | Paths to a shared directory where checkpoints will be stored
+        ignite-form-group-add(ng-click='(group.add = [{}])')
+            | Add new path
+
+        .group-content(ng-if='#{dirPaths}.length')
+            -var model = 'obj.model';
+            -var name = '"edit" + $index'
+            -var valid = form + '[' + name + '].$valid'
+            -var save = dirPaths + '[$index] = ' + model
+
+            div(ng-repeat='model in #{dirPaths} track by $index' ng-init='obj = {}')
+                label.col-xs-12.col-sm-12.col-md-12
+                    .indexField
+                        | {{ $index+1 }})
+                    +table-remove-conditional-button(dirPaths, 'true', 'Remove path')
+                    span(ng-hide='field.edit')
+                        a.labelFormField(ng-click='(field.edit = true) && (#{model} = model)') {{ model }}
+                    span(ng-if='field.edit')
+                        +table-text-field(name, model, dirPaths, valid, save, 'Input directory path', false)
+                            +table-save-button(valid, save, false)
+                            +unique-feedback(name, uniqueTip)
+        .group-content(ng-repeat='field in group.add')
+            -var model = 'new';
+            -var name = '"new"'
+            -var valid = form + '[' + name + '].$valid'
+            -var save = dirPaths + '.push(' + model + ')'
+
+            div
+                label.col-xs-12.col-sm-12.col-md-12
+                    +table-text-field(name, model, dirPaths, valid, save, 'Input directory path', true)
+                        +table-save-button(valid, save, true)
+                        +unique-feedback(name, uniqueTip)
+        .group-content-empty(ng-if='!(#{dirPaths}.length) && !group.add.length')
+            | Not defined
+
+.settings-row
+    +java-class('Listener:', 'model.FS.checkpointListener', '"checkpointFsListener" + $index', 'true', 'false',
+        'Checkpoint listener implementation class name')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint/jdbc.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint/jdbc.jade b/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint/jdbc.jade
new file mode 100644
index 0000000..a7b217f
--- /dev/null
+++ b/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint/jdbc.jade
@@ -0,0 +1,45 @@
+//-
+    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.
+
+include ../../../../../../app/helpers/jade/mixins.jade
+
+.settings-row
+    +text('Data source bean name:', 'model.JDBC.dataSourceBean', '"checkpointJdbcDataSourceBean" + $index', 'model.kind === "JDBC"', 'Input bean name',
+    'Name of the data source bean in Spring context')
+.settings-row
+    +dialect('Dialect:', 'model.JDBC.dialect', '"checkpointJdbcDialect" + $index', 'model.kind === "JDBC"',
+    'Dialect of SQL implemented by a particular RDBMS:', 'Generic JDBC dialect', 'Choose JDBC dialect')
+.settings-row
+    +text('User:', 'model.JDBC.user', '"checkpointJdbcUser" + $index', 'false', 'Input user name', 'Checkpoint jdbc user name')
+.settings-row
+    +text('Table name:', 'model.JDBC.checkpointTableName', '"checkpointJdbcCheckpointTableName" + $index', 'false', 'CHECKPOINTS', 'Checkpoint table name')
+.settings-row
+    +text('Key field name:', 'model.JDBC.keyFieldName', '"checkpointJdbcKeyFieldName" + $index', 'false', 'NAME', 'Checkpoint key field name')
+.settings-row
+    +dropdown('Key field type:', 'model.JDBC.keyFieldType', '"checkpointJdbcKeyFieldType" + $index', 'true', 'VARCHAR', 'supportedJdbcTypes', 'Checkpoint key field type')
+.settings-row
+    +text('Value field name:', 'model.JDBC.valueFieldName', '"checkpointJdbcValueFieldName" + $index', 'false', 'VALUE', 'Checkpoint value field name')
+.settings-row
+    +dropdown('Value field type:', 'model.JDBC.valueFieldType', '"checkpointJdbcValueFieldType" + $index', 'true', 'BLOB', 'supportedJdbcTypes', 'Checkpoint value field type')
+.settings-row
+    +text('Expire date field name:', 'model.JDBC.expireDateFieldName', '"checkpointJdbcExpireDateFieldName" + $index', 'false', 'EXPIRE_DATE', 'Checkpoint expire date field name')
+.settings-row
+    +dropdown('Expire date field type:', 'model.JDBC.expireDateFieldType', '"checkpointJdbcExpireDateFieldType"', 'true', 'DATETIME', 'supportedJdbcTypes', 'Checkpoint expire date field type')
+.settings-row
+    +number('Number of retries:', 'model.JDBC.numberOfRetries', '"checkpointJdbcNumberOfRetries"', 'true', '2', '0', 'Number of retries in case of DB failure')
+.settings-row
+    +java-class('Listener:', 'model.JDBC.checkpointListener', '"checkpointJdbcListener" + $index', 'true', 'false',
+    'Checkpoint listener implementation class name')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint/s3.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint/s3.jade b/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint/s3.jade
new file mode 100644
index 0000000..8373b03
--- /dev/null
+++ b/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint/s3.jade
@@ -0,0 +1,174 @@
+//-
+    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.
+
+include ../../../../../../app/helpers/jade/mixins.jade
+
+-var credentialsModel = 'model.S3.awsCredentials'
+-var clientCfgModel = 'model.S3.clientConfiguration'
+-var checkpointS3Path = 'model.S3.awsCredentials.kind === "Properties"'
+-var checkpointS3Custom = 'model.S3.awsCredentials.kind === "Custom"'
+
+-var clientRetryModel = clientCfgModel + '.retryPolicy'
+-var checkpointS3DefaultMaxRetry = clientRetryModel + '.kind === "DefaultMaxRetries"'
+-var checkpointS3DynamoDbMaxRetry = clientRetryModel + '.kind === "DynamoDBMaxRetries"'
+-var checkpointS3CustomRetry = clientRetryModel + '.kind === "Custom"'
+
+.settings-row
+    +dropdown-required('AWS credentials:', 'model.S3.awsCredentials.kind', '"checkpointS3AwsCredentials"', 'true', 'model.kind === "S3"', 'Custom', '[\
+        {value: "Basic", label: "Basic"},\
+        {value: "Properties", label: "Properties"},\
+        {value: "Anonymous", label: "Anonymous"},\
+        {value: "BasicSession", label: "Basic with session"},\
+        {value: "Custom", label: "Custom"}\
+    ]',
+    'AWS credentials\
+    <ul>\
+        <li>Basic - Allows callers to pass in the AWS access key and secret access in the constructor</li>\
+        <li>Properties - Reads in AWS access keys from a properties file</li>\
+        <li>Anonymous - Allows use of "anonymous" credentials</li>\
+        <li>Database - Session credentials with keys and session token</li>\
+        <li>Custom - Custom AWS credentials provider</li>\
+    </ul>')
+.panel-details(ng-show=checkpointS3Path)
+    .details-row
+        +text('Path:', credentialsModel + '.Properties.path', '"checkpointS3PropertiesPath"', checkpointS3Path, 'Input properties file path',
+        'The file from which to read the AWS credentials properties')
+.panel-details(ng-show=checkpointS3Custom)
+    .details-row
+        +java-class('Class name:', credentialsModel + '.Custom.className', '"checkpointS3CustomClassName" + $index', 'true', checkpointS3Custom,
+        'Custom AWS credentials provider implementation class')
+.settings-row
+    +text('Bucket name suffix:', 'model.S3.bucketNameSuffix', '"checkpointS3BucketNameSuffix"', 'false', 'default-bucket', 'Bucket name suffix')
+.settings-row
+    +dropdown('Protocol:', clientCfgModel + '.protocol', '"checkpointS3Protocol"', 'true', 'HTTPS', '[\
+                                            {value: "HTTP", label: "HTTP"},\
+                                            {value: "HTTPS", label: "HTTPS"}\
+                                        ]',
+    'Provides an ability to save an intermediate job state\
+    <ul>\
+        <li>HTTP - Using the HTTP protocol is less secure than HTTPS, but can slightly reduce\
+            the system resources used when communicating with AWS</li>\
+        <li>HTTPS - Using the HTTPS protocol is more secure than using the HTTP protocol, but\
+            may use slightly more system resources. AWS recommends using HTTPS for maximize security</li>\
+    </ul>')
+.settings-row
+    +number('Maximum connections:', clientCfgModel + '.maxConnections', '"checkpointS3MaxConnections"',
+    'true', '50', '1', 'Maximum number of allowed open HTTP connections')
+.settings-row
+    +text('User agent:', clientCfgModel + '.userAgent', '"checkpointS3UserAgent"', 'false', 'System specific header',
+    'HTTP user agent header to send with all requests')
+.settings-row
+    +text-ip-address('Local address:', clientCfgModel + '.localAddress', '"checkpointS3LocalAddress"', 'true', 'Not specified',
+    'Optionally specifies the local address to bind to')
+.settings-row
+    +text('Proxy host:', clientCfgModel + '.proxyHost', '"checkpointS3ProxyHost"', 'false', 'Not specified',
+    'Optional proxy host the client will connect through')
+.settings-row
+    +number('Proxy port:', clientCfgModel + '.proxyPort', '"checkpointS3ProxyPort"', 'true', 'Not specified', '0',
+    'Optional proxy port the client will connect through')
+.settings-row
+    +text('Proxy user:', clientCfgModel + '.proxyUsername', '"checkpointS3ProxyUsername"', 'false', 'Not specified',
+    'Optional proxy user name to use if connecting through a proxy')
+.settings-row
+    +text('Proxy domain:', clientCfgModel + '.proxyDomain', '"checkpointS3ProxyDomain"', 'false', 'Not specified',
+    'Optional Windows domain name for configuring an NTLM proxy')
+.settings-row
+    +text('Proxy workstation:', clientCfgModel + '.proxyWorkstation', '"checkpointS3ProxyWorkstation"', 'false', 'Not specified',
+    'Optional Windows workstation name for configuring NTLM proxy support')
+.settings-row
+    +dropdown('Retry policy:', clientRetryModel + '.kind', '"checkpointS3RetryPolicy"', 'true', 'Default', '[\
+                                        {value: "Default", label: "Default SDK retry policy"},\
+                                        {value: "DefaultMaxRetries", label: "Default with the specified max retry count"},\
+                                        {value: "DynamoDB", label: "Default for DynamoDB client"},\
+                                        {value: "DynamoDBMaxRetries", label: "DynamoDB with the specified max retry count"},\
+                                        {value: "Custom", label: "Custom configured"}\
+                                    ]',
+    'Provides an ability to save an intermediate job state\
+    <ul>\
+        <li>SDK default retry policy - This policy will honor the maxErrorRetry set in ClientConfiguration</li>\
+        <li>Default with the specified max retry count - Default SDK retry policy with the specified max retry count</li>\
+        <li>Default for DynamoDB client - This policy will honor the maxErrorRetry set in ClientConfiguration</li>\
+        <li>DynamoDB with the specified max retry count - This policy will honor the maxErrorRetry set in ClientConfiguration with the specified max retry count</li>\
+        <li>Custom configured - Custom configured SDK retry policy</li>\
+    </ul>')
+.panel-details(ng-show=checkpointS3DefaultMaxRetry)
+    .details-row
+        +number-required('Maximum retry attempts:', clientRetryModel + '.DefaultMaxRetries.maxErrorRetry', '"checkpointS3DefaultMaxErrorRetry"', 'true', checkpointS3DefaultMaxRetry, '-1', '1',
+        'Maximum number of retry attempts for failed requests')
+.panel-details(ng-show=checkpointS3DynamoDbMaxRetry)
+    .details-row
+        +number-required('Maximum retry attempts:', clientRetryModel + '.DynamoDBMaxRetries.maxErrorRetry', '"checkpointS3DynamoDBMaxErrorRetry"', 'true', checkpointS3DynamoDbMaxRetry, '-1', '1',
+        'Maximum number of retry attempts for failed requests')
+.panel-details(ng-show=checkpointS3CustomRetry)
+    .details-row
+        +java-class('Retry condition:', clientRetryModel + '.Custom.retryCondition', '"checkpointS3CustomRetryPolicy" + $index', 'true', checkpointS3CustomRetry,
+        'Retry condition on whether a specific request and exception should be retried')
+    .details-row
+        +java-class('Backoff strategy:', clientRetryModel + '.Custom.backoffStrategy', '"checkpointS3CustomBackoffStrategy" + $index', 'true', checkpointS3CustomRetry,
+        'Back-off strategy for controlling how long the next retry should wait')
+    .details-row
+        +number-required('Maximum retry attempts:', clientRetryModel + '.Custom.maxErrorRetry', '"checkpointS3CustomMaxErrorRetry"', 'true', checkpointS3CustomRetry, '-1', '1',
+        'Maximum number of retry attempts for failed requests')
+    .details-row
+        +checkbox('Honor the max error retry set', clientRetryModel + '.Custom.honorMaxErrorRetryInClientConfig', '"checkpointS3CustomHonorMaxErrorRetryInClientConfig"',
+        'Whether this retry policy should honor the max error retry set by ClientConfiguration#setMaxErrorRetry(int)')
+.settings-row
+    +number('Maximum retry attempts:', clientCfgModel + '.maxErrorRetry', '"checkpointS3MaxErrorRetry"', 'true', '-1', '0',
+    'Maximum number of retry attempts for failed retryable requests<br/>\
+    If -1 the configured RetryPolicy will be used to control the retry count')
+.settings-row
+    +number('Socket timeout:', clientCfgModel + '.socketTimeout', '"checkpointS3SocketTimeout"', 'true', '50000', '0',
+    'Amount of time in milliseconds to wait for data to be transfered over an established, open connection before the connection times out and is closed<br/>\
+    A value of <b>0</b> means infinity')
+.settings-row
+    +number('Connection timeout:', clientCfgModel + '.connectionTimeout', '"checkpointS3ConnectionTimeout"', 'true', '50000', '0',
+    'Amount of time in milliseconds to wait when initially establishing a connection before giving up and timing out<br/>\
+    A value of <b>0</b> means infinity')
+.settings-row
+    +number('Request timeout:', clientCfgModel + '.requestTimeout', '"checkpointS3RequestTimeout"', 'true', '0', '-1',
+    'Amount of time in milliseconds to wait for the request to complete before giving up and timing out<br/>\
+    A non - positive value means infinity')
+.settings-row
+    +text('Signature algorithm:', clientCfgModel + '.signerOverride', '"checkpointS3SignerOverride"', 'false', 'Not specified',
+    'Name of the signature algorithm to use for signing requests made by this client')
+.settings-row
+    +number('Connection TTL:', clientCfgModel + '.connectionTTL', '"checkpointS3ConnectionTTL"', 'true', '-1', '-1',
+    'Expiration time in milliseconds for a connection in the connection pool<br/>\
+    By default, it is set to <b>-1</b>, i.e. connections do not expire')
+.settings-row
+    +number('Idle timeout:', clientCfgModel + '.connectionMaxIdleMillis', '"checkpointS3ConnectionMaxIdleMillis"', 'true', '60000', '0',
+    'Maximum amount of time that an idle connection may sit in the connection pool and still be eligible for reuse')
+.settings-row
+    +java-class('DNS resolver:', clientCfgModel + '.dnsResolver', '"checkpointS3DnsResolver" + $index', 'true', 'false',
+    'DNS Resolver that should be used to for resolving AWS IP addresses')
+.settings-row
+    +number('Response metadata cache size:', clientCfgModel + '.responseMetadataCacheSize', '"checkpointS3ResponseMetadataCacheSize"', 'true', '50', '0',
+    'Response metadata cache size')
+.settings-row
+    +java-class('SecureRandom class name:', clientCfgModel + '.secureRandom', '"checkpointS3SecureRandom" + $index', 'true', 'false',
+    'SecureRandom to be used by the SDK class name')
+.settings-row
+    +checkbox('Use reaper', clientCfgModel + '.useReaper', '"checkpointS3UseReaper"', 'Checks if the IdleConnectionReaper is to be started')
+.settings-row
+    +checkbox('Use GZIP', clientCfgModel + '.useGzip', '"checkpointS3UseGzip"', 'Checks if gzip compression is used')
+.settings-row
+    +checkbox('Preemptively basic authentication', clientCfgModel + '.preemptiveBasicProxyAuth', '"checkpointS3PreemptiveBasicProxyAuth"',
+    'Attempt to authenticate preemptively against proxy servers using basic authentication')
+.settings-row
+    +checkbox('TCP KeepAlive', clientCfgModel + '.useTcpKeepAlive', '"checkpointS3UseTcpKeepAlive"', 'TCP KeepAlive support is enabled')
+.settings-row
+    +java-class('Listener:', 'model.S3.checkpointListener', '"checkpointS3Listener" + $index', 'true', 'false',
+    'Checkpoint listener implementation class name')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/collision.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/clusters/collision.jade b/modules/web-console/frontend/app/modules/states/configuration/clusters/collision.jade
index 491e4f1..1a5d6d6 100644
--- a/modules/web-console/frontend/app/modules/states/configuration/clusters/collision.jade
+++ b/modules/web-console/frontend/app/modules/states/configuration/clusters/collision.jade
@@ -25,7 +25,8 @@ include ../../../../../app/helpers/jade/mixins.jade
         ignite-form-panel-chevron
         label Collision configuration
         ignite-form-field-tooltip.tipLabel
-            | Configuration Collision SPI allows to regulate how grid jobs get executed when they arrive on a destination node for execution
+            | Configuration Collision SPI allows to regulate how grid jobs get executed when they arrive on a destination node for execution#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/job-scheduling" target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id=form)
         .panel-body(ng-if='ui.isPanelLoaded("#{form}")')
@@ -47,15 +48,15 @@ include ../../../../../app/helpers/jade/mixins.jade
                             <li>Custom - custom CollisionSpi implementation</li>\
                             <li>Default - jobs are activated immediately on arrival to mapped node</li>\
                         </ul>')
-                .settings-row(ng-show='#{modelCollisionKind} !== "Noop"')
+                .settings-row(ng-if='#{modelCollisionKind} !== "Noop"')
                     .panel-details
-                        div(ng-show='#{modelCollisionKind} === "JobStealing"')
+                        div(ng-if='#{modelCollisionKind} === "JobStealing"')
                             include ./collision/job-stealing.jade
-                        div(ng-show='#{modelCollisionKind} === "FifoQueue"')
+                        div(ng-if='#{modelCollisionKind} === "FifoQueue"')
                             include ./collision/fifo-queue.jade
-                        div(ng-show='#{modelCollisionKind} === "PriorityQueue"')
+                        div(ng-if='#{modelCollisionKind} === "PriorityQueue"')
                             include ./collision/priority-queue.jade
-                        div(ng-show='#{modelCollisionKind} === "Custom"')
+                        div(ng-if='#{modelCollisionKind} === "Custom"')
                             include ./collision/custom.jade
             .col-sm-6
                 -var model = 'backupItem.collision'

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/collision/job-stealing.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/clusters/collision/job-stealing.jade b/modules/web-console/frontend/app/modules/states/configuration/clusters/collision/job-stealing.jade
index 3e6d428..3659115 100644
--- a/modules/web-console/frontend/app/modules/states/configuration/clusters/collision/job-stealing.jade
+++ b/modules/web-console/frontend/app/modules/states/configuration/clusters/collision/job-stealing.jade
@@ -39,7 +39,7 @@ div
         +java-class('External listener:', model + '.externalCollisionListener', '"jsExternalCollisionListener"', 'true', 'false',
             'Listener to be set for notification of external collision events')
     .details-row
-        +ignite-form-group(ng-model='#{stealingAttributes}' ng-form='#{form}')
+        +ignite-form-group
             ignite-form-field-label
                 | Stealing attributes
             ignite-form-group-tooltip

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/communication.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/clusters/communication.jade b/modules/web-console/frontend/app/modules/states/configuration/clusters/communication.jade
index 2c60478..55bf909 100644
--- a/modules/web-console/frontend/app/modules/states/configuration/clusters/communication.jade
+++ b/modules/web-console/frontend/app/modules/states/configuration/clusters/communication.jade
@@ -26,7 +26,8 @@ include ../../../../../app/helpers/jade/mixins.jade
         label Communication
         ignite-form-field-tooltip.tipLabel
             | Configuration of communication with other nodes by TCP/IP
-            | Provide basic plumbing to send and receive grid messages and is utilized for all distributed grid operations
+            | Provide basic plumbing to send and receive grid messages and is utilized for all distributed grid operations#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/network-config" target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id=form)
         .panel-body(ng-if='ui.isPanelLoaded("#{form}")')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/connector.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/clusters/connector.jade b/modules/web-console/frontend/app/modules/states/configuration/clusters/connector.jade
index baec54f..6e75283 100644
--- a/modules/web-console/frontend/app/modules/states/configuration/clusters/connector.jade
+++ b/modules/web-console/frontend/app/modules/states/configuration/clusters/connector.jade
@@ -26,7 +26,8 @@ include ../../../../../app/helpers/jade/mixins.jade
         ignite-form-panel-chevron
         label Connector configuration
         ignite-form-field-tooltip.tipLabel
-            | Configure HTTP REST configuration to enable HTTP server features
+            | Configure HTTP REST configuration to enable HTTP server features#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/configuration" target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id=form)
         .panel-body(ng-if='ui.isPanelLoaded("#{form}")')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/deployment.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/clusters/deployment.jade b/modules/web-console/frontend/app/modules/states/configuration/clusters/deployment.jade
index 6cfa82d..67b6b4f 100644
--- a/modules/web-console/frontend/app/modules/states/configuration/clusters/deployment.jade
+++ b/modules/web-console/frontend/app/modules/states/configuration/clusters/deployment.jade
@@ -26,7 +26,8 @@ include ../../../../../app/helpers/jade/mixins.jade
         ignite-form-panel-chevron
         label Class deployment
         ignite-form-field-tooltip.tipLabel
-            | Task and resources deployment in cluster
+            | Task and resources deployment in cluster#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/deployment-modes" target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id='deployment')
         .panel-body(ng-if='ui.isPanelLoaded("#{form}")')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/discovery.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/clusters/discovery.jade b/modules/web-console/frontend/app/modules/states/configuration/clusters/discovery.jade
index 1fdcbec..c9a2be3 100644
--- a/modules/web-console/frontend/app/modules/states/configuration/clusters/discovery.jade
+++ b/modules/web-console/frontend/app/modules/states/configuration/clusters/discovery.jade
@@ -24,7 +24,8 @@ include ../../../../../app/helpers/jade/mixins.jade
         ignite-form-panel-chevron
         label Discovery
         ignite-form-field-tooltip.tipLabel
-            | TCP/IP discovery configuration
+            | TCP/IP discovery configuration#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/cluster-config" target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id=form)
         .panel-body(ng-if='ui.isPanelLoaded("#{form}")')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/events.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/clusters/events.jade b/modules/web-console/frontend/app/modules/states/configuration/clusters/events.jade
index 412714c..42c319c 100644
--- a/modules/web-console/frontend/app/modules/states/configuration/clusters/events.jade
+++ b/modules/web-console/frontend/app/modules/states/configuration/clusters/events.jade
@@ -18,20 +18,51 @@ include ../../../../../app/helpers/jade/mixins.jade
 
 -var form = 'events'
 -var model = 'backupItem'
+-var modelEventStorage = model + '.eventStorage'
+-var modelEventStorageKind = modelEventStorage + '.kind'
+-var eventStorageMemory = modelEventStorageKind + ' === "Memory"'
+-var eventStorageCustom = modelEventStorageKind + ' === "Custom"'
 
 .panel.panel-default(ng-form=form novalidate)
     .panel-heading(bs-collapse-toggle ng-click='ui.loadPanel("#{form}")')
         ignite-form-panel-chevron
         label Events
         ignite-form-field-tooltip.tipLabel
-            | Grid events are used for notification about what happens within the grid
+            | Grid events are used for notification about what happens within the grid#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/events" target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id=form)
         .panel-body(ng-if='ui.isPanelLoaded("#{form}")')
             .col-sm-6
                 .settings-row
                     +dropdown-multiple('Include type:', model + '.includeEventTypes', '"includeEventTypes"', true, 'Choose recorded event types', '', 'eventGroups',
-                        'Array of event types, which will be recorded by GridEventStorageManager#record(Event)<br/>\
-                        Note, that either the include event types or the exclude event types can be established')
+                    'Array of event types, which will be recorded by GridEventStorageManager#record(Event)<br/>\
+                    Note, that either the include event types or the exclude event types can be established')
+
+                .settings-row
+                    +dropdown('Event storage:', modelEventStorageKind, '"eventStorageKind"', 'true', '',
+                    '[\
+                        {value: "Memory", label: "Memory"},\
+                        {value: "Custom", label: "Custom"}\
+                    ]',
+                    'Regulate how grid store events locally on node\
+                    <ul>\
+                        <li>Memory - All events are kept in the FIFO queue in-memory</li>\
+                        <li>Custom - Custom implementation of event storage SPI</li>\
+                    </ul>')
+
+                div(ng-show=eventStorageMemory)
+                    .settings-row
+                        +number('Events expiration time:', modelEventStorage + '.Memory.expireAgeMs', '"EventStorageExpireAgeMs"', 'true', 'Long.MAX_VALUE', '1', 'All events that exceed this value will be removed from the queue when next event comes')
+                    .settings-row
+                        +number('Events queue size:', modelEventStorage + '.Memory.expireCount', '"EventStorageExpireCount"', 'true', '10000', '1', 'Events will be filtered out when new request comes')
+                    .settings-row
+                        +java-class('Filter:', modelEventStorage + '.Memory.filter', '"EventStorageFilter"', 'true', 'false',
+                        'Filter for events to be recorded<br/>\
+                        Should be implementation of o.a.i.lang.IgnitePredicate&lt;o.a.i.events.Event&gt;')
+
+                .settings-row(ng-show=eventStorageCustom)
+                    +java-class('Class:', modelEventStorage + '.Custom.className', '"EventStorageCustom"', 'true', eventStorageCustom, 'Event storage implementation class name')
+
             .col-sm-6
                 +preview-xml-java(model, 'clusterEvents')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/failover.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/clusters/failover.jade b/modules/web-console/frontend/app/modules/states/configuration/clusters/failover.jade
index 85f0f54..b29701d 100644
--- a/modules/web-console/frontend/app/modules/states/configuration/clusters/failover.jade
+++ b/modules/web-console/frontend/app/modules/states/configuration/clusters/failover.jade
@@ -19,14 +19,15 @@ include ../../../../../app/helpers/jade/mixins.jade
 -var model = 'backupItem'
 -var form = 'failoverSpi'
 -var failoverSpi = model + '.failoverSpi'
--var failoverCustom = 'failover.kind === "Custom"'
+-var failoverCustom = 'model.kind === "Custom"'
 
 .panel.panel-default(ng-form=form novalidate)
     .panel-heading(bs-collapse-toggle ng-click='ui.loadPanel("#{form}")')
         ignite-form-panel-chevron
         label Failover configuration
         ignite-form-field-tooltip.tipLabel
-            | Failover SPI provides ability to supply custom logic for handling failed execution of a grid job
+            | Failover SPI provides ability to supply custom logic for handling failed execution of a grid job#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/fault-tolerance" target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id=form)
         .panel-body(ng-if='ui.isPanelLoaded("#{form}")')
@@ -41,10 +42,10 @@ include ../../../../../app/helpers/jade/mixins.jade
                             | Add failover SPI
                         .group-content-empty(ng-if='!(#{failoverSpi} && #{failoverSpi}.length > 0)')
                             | Not defined
-                        .group-content(ng-show='#{failoverSpi} && #{failoverSpi}.length > 0' ng-repeat='failover in #{failoverSpi} track by $index')
+                        .group-content(ng-show='#{failoverSpi} && #{failoverSpi}.length > 0' ng-repeat='model in #{failoverSpi} track by $index')
                             hr(ng-if='$index != 0')
                             .settings-row
-                                +dropdown('Failover SPI:', 'failover.kind', '"failoverKind" + $index', 'true', 'Choose Failover SPI', '[\
+                                +dropdown-required('Failover SPI:', 'model.kind', '"failoverKind" + $index', 'true', 'true', 'Choose Failover SPI', '[\
                                         {value: "JobStealing", label: "Job stealing"},\
                                         {value: "Never", label: "Never"},\
                                         {value: "Always", label: "Always"},\
@@ -59,14 +60,14 @@ include ../../../../../app/helpers/jade/mixins.jade
                                     </ul>')
 
                                     +table-remove-button(failoverSpi, 'Remove Failover SPI')
-                            .settings-row(ng-show='failover.kind === "JobStealing"')
-                                +number('Maximum failover attempts:', 'failover.JobStealing.maximumFailoverAttempts', '"jsMaximumFailoverAttempts" + $index', 'true', '5', '0',
+                            .settings-row(ng-show='model.kind === "JobStealing"')
+                                +number('Maximum failover attempts:', 'model.JobStealing.maximumFailoverAttempts', '"jsMaximumFailoverAttempts" + $index', 'true', '5', '0',
                                     'Maximum number of attempts to execute a failed job on another node')
-                            .settings-row(ng-show='failover.kind === "Always"')
-                                +number('Maximum failover attempts:', 'failover.Always.maximumFailoverAttempts', '"alwaysMaximumFailoverAttempts" + $index', 'true', '5', '0',
+                            .settings-row(ng-show='model.kind === "Always"')
+                                +number('Maximum failover attempts:', 'model.Always.maximumFailoverAttempts', '"alwaysMaximumFailoverAttempts" + $index', 'true', '5', '0',
                                     'Maximum number of attempts to execute a failed job on another node')
                             .settings-row(ng-show=failoverCustom)
-                                +java-class('SPI implementation', 'failover.Custom.class', '"failoverSpiClass" + $index', 'true', failoverCustom,
+                                +java-class('SPI implementation', 'model.Custom.class', '"failoverSpiClass" + $index', 'true', failoverCustom,
                                     'Custom FailoverSpi implementation class name.')
             .col-sm-6
                 +preview-xml-java(model, 'clusterFailover')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/general.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/clusters/general.jade b/modules/web-console/frontend/app/modules/states/configuration/clusters/general.jade
index d0d390f..8ec9b13 100644
--- a/modules/web-console/frontend/app/modules/states/configuration/clusters/general.jade
+++ b/modules/web-console/frontend/app/modules/states/configuration/clusters/general.jade
@@ -24,6 +24,9 @@ include ../../../../../app/helpers/jade/mixins.jade
     .panel-heading(bs-collapse-toggle)
         ignite-form-panel-chevron
         label General
+        ignite-form-field-tooltip.tipLabel
+            | Common cluster configuration#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/clustering" target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id=form)
         .panel-body

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/general/discovery/zookeeper.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/clusters/general/discovery/zookeeper.jade b/modules/web-console/frontend/app/modules/states/configuration/clusters/general/discovery/zookeeper.jade
index afd3ecd..da36993 100644
--- a/modules/web-console/frontend/app/modules/states/configuration/clusters/general/discovery/zookeeper.jade
+++ b/modules/web-console/frontend/app/modules/states/configuration/clusters/general/discovery/zookeeper.jade
@@ -71,6 +71,8 @@ div
                 div(ng-show='#{modelRetryPolicyKind} === "Custom"')
                     include ./zookeeper/retrypolicy/custom.jade
     .details-row
+        -var model = 'backupItem.discovery.ZooKeeper'
+
         +text('Base path:', model + '.basePath', '"basePath"', 'false', '/services', 'Base path for service registration')
     .details-row
         +text('Service name:', model + '.serviceName', '"serviceName"', 'false', 'ignite',

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/igfs.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/clusters/igfs.jade b/modules/web-console/frontend/app/modules/states/configuration/clusters/igfs.jade
index 181b44f..7eb1505 100644
--- a/modules/web-console/frontend/app/modules/states/configuration/clusters/igfs.jade
+++ b/modules/web-console/frontend/app/modules/states/configuration/clusters/igfs.jade
@@ -24,7 +24,8 @@ include ../../../../../app/helpers/jade/mixins.jade
         ignite-form-panel-chevron
         label IGFS
         ignite-form-field-tooltip.tipLabel
-            | IGFS (Ignite In-Memory File System) configurations assigned to cluster
+            | IGFS (Ignite In-Memory File System) configurations assigned to cluster#[br]
+            | #[a(href="https://apacheignite-fs.readme.io/docs/in-memory-file-system" target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id=form)
         .panel-body(ng-if='ui.isPanelLoaded("#{form}")')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/load-balancing.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/clusters/load-balancing.jade b/modules/web-console/frontend/app/modules/states/configuration/clusters/load-balancing.jade
new file mode 100644
index 0000000..916504b
--- /dev/null
+++ b/modules/web-console/frontend/app/modules/states/configuration/clusters/load-balancing.jade
@@ -0,0 +1,104 @@
+//-
+    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.
+
+include ../../../../../app/helpers/jade/mixins.jade
+
+-var model = 'backupItem'
+-var form = 'loadBalancing'
+-var loadBalancingSpi = model + '.loadBalancingSpi'
+-var loadBalancingCustom = 'model.kind === "Custom"'
+-var loadProbeCustom = 'model.kind === "Adaptive" && model.Adaptive.loadProbe.kind === "Custom"'
+
+.panel.panel-default(ng-form=form novalidate)
+    .panel-heading(bs-collapse-toggle ng-click='ui.loadPanel("#{form}")')
+        ignite-form-panel-chevron
+        label Load balancing configuration
+        ignite-form-field-tooltip.tipLabel
+            | Load balancing component balances job distribution among cluster nodes#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/load-balancing" target="_blank") More info]
+        ignite-form-revert
+    .panel-collapse(role='tabpanel' bs-collapse-target id=form)
+        .panel-body(ng-if='ui.isPanelLoaded("#{form}")')
+            .col-sm-6
+                .settings-row(ng-init='loadBalancingSpiTbl={type: "loadBalancingSpi", model: "loadBalancingSpi", focusId: "kind", ui: "load-balancing-table"}')
+                    +ignite-form-group()
+                        ignite-form-field-label
+                            | Load balancing configurations
+                        ignite-form-group-tooltip
+                            | Load balancing component balances job distribution among cluster nodes
+                        ignite-form-group-add(ng-click='tableNewItem(loadBalancingSpiTbl)')
+                            | Add load balancing configuration
+                        .group-content-empty(ng-if='!(#{loadBalancingSpi} && #{loadBalancingSpi}.length > 0)')
+                            | Not defined
+                        .group-content(ng-show='#{loadBalancingSpi} && #{loadBalancingSpi}.length > 0' ng-repeat='model in #{loadBalancingSpi} track by $index')
+                            hr(ng-if='$index != 0')
+                            .settings-row
+                                +dropdown-required('Load balancing:', 'model.kind', '"loadBalancingKind" + $index', 'true', 'true', 'Choose load balancing SPI', '[\
+                                        {value: "RoundRobin", label: "Round-robin"},\
+                                        {value: "Adaptive", label: "Adaptive"},\
+                                        {value: "WeightedRandom", label: "Random"},\
+                                        {value: "Custom", label: "Custom"}\
+                                    ]', 'Provides the next best balanced node for job execution\
+                                    <ul>\
+                                        <li>Round-robin - Iterates through nodes in round-robin fashion and pick the next sequential node</li>\
+                                        <li>Adaptive - Adapts to overall node performance</li>\
+                                        <li>Random - Picks a random node for job execution</li>\
+                                        <li>Custom - Custom load balancing implementation</li>\
+                                    </ul>')
+
+                                    +table-remove-button(loadBalancingSpi, 'Remove load balancing SPI')
+                            .settings-row(ng-show='model.kind === "RoundRobin"')
+                                +checkbox('Per task', 'model.RoundRobin.perTask', '"loadBalancingRRPerTask" + $index', 'A new round robin order should be created for every task flag')
+                            .settings-row(ng-show='model.kind === "Adaptive"')
+                                +dropdown('Load probe:', 'model.Adaptive.loadProbe.kind', '"loadBalancingAdaptiveLoadProbeKind" + $index', 'true', 'Default', '[\
+                                        {value: "Job", label: "Job count"},\
+                                        {value: "CPU", label: "CPU load"},\
+                                        {value: "ProcessingTime", label: "Processing time"},\
+                                        {value: "Custom", label: "Custom"},\
+                                        {value: undefined, label: "Default"}\
+                                    ]', 'Implementation of node load probing\
+                                    <ul>\
+                                        <li>Job count - Based on active and waiting job count</li>\
+                                        <li>CPU load - Based on CPU load</li>\
+                                        <li>Processing time - Based on total job processing time</li>\
+                                        <li>Custom - Custom load probing implementation</li>\
+                                        <li>Default - Default load probing implementation</li>\
+                                    </ul>')
+                            .settings-row(ng-show='model.kind === "Adaptive" && model.Adaptive.loadProbe.kind')
+                                .panel-details
+                                    .details-row(ng-show='model.Adaptive.loadProbe.kind === "Job"')
+                                        +checkbox('Use average', 'model.Adaptive.loadProbe.Job.useAverage', '"loadBalancingAdaptiveJobUseAverage" + $index', 'Use average CPU load vs. current')
+                                    .details-row(ng-show='model.Adaptive.loadProbe.kind === "CPU"')
+                                        +checkbox('Use average', 'model.Adaptive.loadProbe.CPU.useAverage', '"loadBalancingAdaptiveCPUUseAverage" + $index', 'Use average CPU load vs. current')
+                                    .details-row(ng-show='model.Adaptive.loadProbe.kind === "CPU"')
+                                        +checkbox('Use processors', 'model.Adaptive.loadProbe.CPU.useProcessors', '"loadBalancingAdaptiveCPUUseProcessors" + $index', "divide each node's CPU load by the number of processors on that node")
+                                    .details-row(ng-show='model.Adaptive.loadProbe.kind === "CPU"')
+                                        +number-min-max-step('Processor coefficient:', 'model.Adaptive.loadProbe.CPU.processorCoefficient',
+                                            '"loadBalancingAdaptiveCPUProcessorCoefficient" + $index', 'true', '1', '0.001', '1', '0.05', 'Coefficient of every CPU')
+                                    .details-row(ng-show='model.Adaptive.loadProbe.kind === "ProcessingTime"')
+                                        +checkbox('Use average', 'model.Adaptive.loadProbe.ProcessingTime.useAverage', '"loadBalancingAdaptiveJobUseAverage" + $index', 'Use average execution time vs. current')
+                                    .details-row(ng-show=loadProbeCustom)
+                                        +java-class('Load brobe implementation:', 'model.Adaptive.loadProbe.Custom.className', '"loadBalancingAdaptiveJobUseClass" + $index', 'true', loadProbeCustom,
+                                            'Custom load balancing SPI implementation class name.')
+                            .settings-row(ng-show='model.kind === "WeightedRandom"')
+                                +number('Node weight:', 'model.WeightedRandom.nodeWeight', '"loadBalancingWRNodeWeight" + $index', 'true', 10, '1', 'Weight of node')
+                            .settings-row(ng-show='model.kind === "WeightedRandom"')
+                                +checkbox('Use weights', 'model.WeightedRandom.useWeights', '"loadBalancingWRUseWeights" + $index', 'Node weights should be checked when doing random load balancing')
+                            .settings-row(ng-show=loadBalancingCustom)
+                                +java-class('Load balancing SPI implementation:', 'model.Custom.className', '"loadBalancingClass" + $index', 'true', loadBalancingCustom,
+                                    'Custom load balancing SPI implementation class name.')
+            .col-sm-6
+                +preview-xml-java(model, 'clusterLoadBalancing')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/marshaller.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/clusters/marshaller.jade b/modules/web-console/frontend/app/modules/states/configuration/clusters/marshaller.jade
index 1fc3ce7..3f3661c 100644
--- a/modules/web-console/frontend/app/modules/states/configuration/clusters/marshaller.jade
+++ b/modules/web-console/frontend/app/modules/states/configuration/clusters/marshaller.jade
@@ -28,7 +28,8 @@ include ../../../../../app/helpers/jade/mixins.jade
         ignite-form-field-tooltip.tipLabel
             | Marshaller allows to marshal or unmarshal objects in grid#[br]
             | It provides serialization/deserialization mechanism for all instances that are sent across networks or are otherwise serialized
-            | By default BinaryMarshaller will be used
+            | By default BinaryMarshaller will be used#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/binary-marshaller" target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id=form)
         .panel-body(ng-if='ui.isPanelLoaded("#{form}")')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/odbc.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/clusters/odbc.jade b/modules/web-console/frontend/app/modules/states/configuration/clusters/odbc.jade
index c267891..dd46d2a 100644
--- a/modules/web-console/frontend/app/modules/states/configuration/clusters/odbc.jade
+++ b/modules/web-console/frontend/app/modules/states/configuration/clusters/odbc.jade
@@ -25,7 +25,8 @@ include ../../../../../app/helpers/jade/mixins.jade
         ignite-form-panel-chevron
         label ODBC configuration
         ignite-form-field-tooltip.tipLabel
-            | ODBC server configuration
+            | ODBC server configuration#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/odbc-driver" target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id=form)
         .panel-body(ng-if='ui.isPanelLoaded("#{form}")')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/ssl.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/clusters/ssl.jade b/modules/web-console/frontend/app/modules/states/configuration/clusters/ssl.jade
index 7264386..0a51cf7 100644
--- a/modules/web-console/frontend/app/modules/states/configuration/clusters/ssl.jade
+++ b/modules/web-console/frontend/app/modules/states/configuration/clusters/ssl.jade
@@ -27,7 +27,8 @@ include ../../../../../app/helpers/jade/mixins.jade
         ignite-form-panel-chevron
         label(id='sslConfiguration-title') SSL configuration
         ignite-form-field-tooltip.tipLabel
-            | Settings for SSL configuration for creating a secure socket layer
+            | Settings for SSL configuration for creating a secure socket layer#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/ssltls" target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id=form)
         .panel-body(ng-if='ui.isPanelLoaded("#{form}")')
@@ -58,7 +59,7 @@ include ../../../../../app/helpers/jade/mixins.jade
                         ignite-form-group-tooltip
                             | Pre-configured trust managers
                         ignite-form-group-add(ng-show='#{enabled}' ng-click='(group.add = [{}])')
-                            | Add new trust manager.
+                            | Add new trust manager
 
                         .group-content(ng-if='#{trust}.length')
                             -var model = 'obj.model';
@@ -75,7 +76,7 @@ include ../../../../../app/helpers/jade/mixins.jade
                                         span(ng-hide='field.edit')
                                             a.labelFormField(ng-click='#{enabled} && (field.edit = true) && (#{model} = model)') {{ model }}
                                         span(ng-if='field.edit')
-                                            +table-java-class-field('Trust manager:', name, model, trust, valid, save, false)
+                                            +table-java-class-field('Trust manager', name, model, trust, valid, save, false)
                                                 +table-save-button(valid, save, false)
                                                 +unique-feedback(name, uniqueTip)
                             div(ng-hide=enabled)

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/swap.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/clusters/swap.jade b/modules/web-console/frontend/app/modules/states/configuration/clusters/swap.jade
index 1c75c4f..c76391c 100644
--- a/modules/web-console/frontend/app/modules/states/configuration/clusters/swap.jade
+++ b/modules/web-console/frontend/app/modules/states/configuration/clusters/swap.jade
@@ -26,7 +26,8 @@ include ../../../../../app/helpers/jade/mixins.jade
         ignite-form-panel-chevron
         label Swap
         ignite-form-field-tooltip.tipLabel
-            | Settings for overflow data to disk if it cannot fit in memory
+            | Settings for overflow data to disk if it cannot fit in memory#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/off-heap-memory#swap-space" target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id=form)
         .panel-body(ng-if='ui.isPanelLoaded("#{form}")')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/transactions.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/clusters/transactions.jade b/modules/web-console/frontend/app/modules/states/configuration/clusters/transactions.jade
index d9611a5..2946158 100644
--- a/modules/web-console/frontend/app/modules/states/configuration/clusters/transactions.jade
+++ b/modules/web-console/frontend/app/modules/states/configuration/clusters/transactions.jade
@@ -24,7 +24,8 @@ include ../../../../../app/helpers/jade/mixins.jade
         ignite-form-panel-chevron
         label Transactions
         ignite-form-field-tooltip.tipLabel
-            | Settings for transactions
+            | Settings for transactions#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/transactions" target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id=form)
         .panel-body(ng-if='ui.isPanelLoaded("#{form}")')
@@ -39,8 +40,7 @@ include ../../../../../app/helpers/jade/mixins.jade
                         <ul>\
                             <li>OPTIMISTIC - All cache operations are not distributed to other nodes until commit is called</li>\
                             <li>PESSIMISTIC - A lock is acquired on all cache operations with exception of read operations in READ_COMMITTED mode</li>\
-                        </ul>\
-                        ')
+                        </ul>')
                 .settings-row
                     +dropdown('Isolation:', model + '.defaultTxIsolation', '"defaultTxIsolation"', 'true', 'REPEATABLE_READ',
                         '[\

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/domains/general.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/domains/general.jade b/modules/web-console/frontend/app/modules/states/configuration/domains/general.jade
index 74895f5..bf21ee1 100644
--- a/modules/web-console/frontend/app/modules/states/configuration/domains/general.jade
+++ b/modules/web-console/frontend/app/modules/states/configuration/domains/general.jade
@@ -24,12 +24,16 @@ include ../../../../../app/helpers/jade/mixins.jade
         ignite-form-panel-chevron
         label General
         ignite-form-field-tooltip.tipLabel
-            | Domain model properties common for Query and Store
+            | Domain model properties common for Query and Store#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/cache-queries" target="_blank") More info about query configuration]#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/persistent-store" target="_blank") More info about store]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id=form)
         .panel-body
             .col-sm-6
                 .settings-row
+                    +checkbox('Generate POJO classes', model + '.generatePojo', '"generatePojo"', 'If selected then POJO classes will be generated from database tables')
+                .settings-row
                     +caches(model, 'Select caches to associate domain model with cache')
                 .settings-row
                     +dropdown-required('Query metadata:', model + '.queryMetadata', '"queryMetadata"', 'true', 'true', '', 'queryMetadataVariants',
@@ -38,9 +42,11 @@ include ../../../../../app/helpers/jade/mixins.jade
                             <li>Java annotations like @QuerySqlField</li>\
                             <li>Configuration via QueryEntity class</li>\
                         </ul>')
+                -var generatePojo = model + '.generatePojo'
                 .settings-row
-                    +java-class-typeahead('Key type:', model + '.keyType', '"keyType"', 'javaBuiltInClasses', 'true', 'true', 'Full class name for Key', 'Key class used to store key in cache')
+                    +java-class-typeahead('Key type:', model + '.keyType', '"keyType"', 'javaBuiltInClasses', 'true', 'true', '{{ ' + generatePojo + ' ? "Full class name for Key" : "Key type name" }}', 'Key class used to store key in cache', generatePojo)
                 .settings-row
-                    +java-class('Value type:', model + '.valueType', '"valueType"', 'true', 'true', 'Value class used to store value in cache')
+                    +java-class-autofocus-placholder('Value type:', model + '.valueType', '"valueType"', 'true', 'true', 'false', '{{ ' + generatePojo +' ? "Enter fully qualified class name" : "Value type name" }}', 'Value class used to store value in cache', generatePojo)
+
             .col-sm-6
                 +preview-xml-java(model, 'domainModelGeneral')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/domains/query.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/domains/query.jade b/modules/web-console/frontend/app/modules/states/configuration/domains/query.jade
index 0cf21f5..45051b2 100644
--- a/modules/web-console/frontend/app/modules/states/configuration/domains/query.jade
+++ b/modules/web-console/frontend/app/modules/states/configuration/domains/query.jade
@@ -37,25 +37,27 @@ mixin table-index-item-edit(prefix, index, sortAvailable, idAddition)
     -var btnSave = 'tableIndexItemSave(indexesTbl, itemIndex, ' + index + ')'
     -var btnVisibleAndSave = btnVisible + ' && ' + btnSave
 
-    .col-xs-8.col-sm-8.col-md-8(ng-show=sortAvailable)
-        label.fieldSep /
-        .input-tip
-            input.form-control(id='{{::"#{fieldName}S" + #{idAddition}}}' ignite-on-enter-focus-move='{{::"#{direction}S" + #{idAddition}}}' type='text' ng-model=fieldNameModel placeholder='Field name' ignite-on-escape='tableReset()')
-    .col-xs-4.col-sm-4.col-md-4(ng-show=sortAvailable)
-        +btn-save(btnVisible, btnSave)
-        .input-tip
-            button.select-toggle.form-control(id='{{::"#{direction}S" + #{idAddition}}}' ng-model=directionModel bs-select bs-options='item.value as item.label for item in {{sortDirections}}' ignite-on-enter=btnVisibleAndSave ignite-on-escape='tableReset()' tabindex='0')
-    .col-xs-12(ng-show='!(#{sortAvailable})')
+    div(ng-if=sortAvailable)
+        .col-xs-8.col-sm-8.col-md-8
+            label.fieldSep /
+            .input-tip
+                button.select-toggle.form-control(id='{{::"#{fieldName}" + #{idAddition}}}' ignite-on-enter-focus-move='{{::"#{direction}S" + #{idAddition}}}' ng-model=fieldNameModel placeholder='{{fields("#{prefix}", #{fieldNameModel}).length > 0 ? "Choose field" : "No fields configured"}}' bs-select bs-options='item.value as item.label for item in fields("#{prefix}", #{fieldNameModel})' ng-disabled='fields("#{prefix}", #{fieldNameModel}).length === 0' ignite-on-escape='tableReset()' tabindex='0')
+        .col-xs-4.col-sm-4.col-md-4
+            +btn-save(btnVisible, btnSave)
+            .input-tip
+                button.select-toggle.form-control(id='{{::"#{direction}" + #{idAddition}}}' ng-model=directionModel bs-select bs-options='item.value as item.label for item in {{sortDirections}}' ignite-on-enter=btnVisibleAndSave ignite-on-escape='tableReset()' tabindex='0')
+    .col-xs-12(ng-if='!(#{sortAvailable})')
         +btn-save(btnVisible, btnSave)
         .input-tip
-            input.form-control(id='{{::"#{fieldName}" + #{idAddition}}}' type='text' ng-model=fieldNameModel placeholder='Field name' ignite-on-enter=btnVisibleAndSave ignite-on-escape='tableReset()')
+            button.select-toggle.form-control(id='{{::"#{fieldName}" + #{idAddition}}}' ng-model=fieldNameModel placeholder='{{fields("#{prefix}", #{fieldNameModel}).length > 0 ? "Choose index field" : "No fields configured"}}' bs-select bs-options='item.value as item.label for item in fields("#{prefix}", #{fieldNameModel})' ng-disabled='fields("#{prefix}", #{fieldNameModel}).length === 0' ignite-on-escape='tableReset()' tabindex='0')
 
 .panel.panel-default(ng-form=form novalidate)
     .panel-heading(bs-collapse-toggle)
         ignite-form-panel-chevron
         label(id='query-title') Domain model for SQL query
         ignite-form-field-tooltip.tipLabel
-            | Domain model properties for fields queries
+            | Domain model properties for fields queries#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/cache-queries" target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id='query')
         .panel-body
@@ -76,8 +78,8 @@ mixin table-index-item-edit(prefix, index, sortAvailable, idAddition)
                             .group-content(ng-show='(#{queryFields} && #{queryFields}.length > 0) || tableNewItemActive(queryFieldsTbl)')
                                 table.links-edit(id='fields' st-table=queryFields)
                                     tbody
-                                        tr(ng-repeat='item in #{queryFields}')
-                                            td.col-sm-12(ng-show='!tableEditing(queryFieldsTbl, $index)')
+                                        tr(ng-repeat='item in #{queryFields} track by $index')
+                                            td.col-sm-12(ng-hide='tableEditing(queryFieldsTbl, $index)')
                                                 a.labelFormField(ng-click='tableStartEdit(backupItem, queryFieldsTbl, $index)') {{item.name}}  / {{item.className}}
                                                 +btn-remove('tableRemove(backupItem, queryFieldsTbl, $index)', '"Remove path"')
                                             td.col-sm-12(ng-show='tableEditing(queryFieldsTbl, $index)')
@@ -100,8 +102,8 @@ mixin table-index-item-edit(prefix, index, sortAvailable, idAddition)
                             .group-content(ng-show='(#{queryAliases} && #{queryAliases}.length > 0) || tableNewItemActive(aliasesTbl)')
                                 table.links-edit(id='aliases' st-table=queryAliases)
                                     tbody
-                                        tr(ng-repeat='item in #{queryAliases}')
-                                            td.col-sm-12(ng-show='!tableEditing(aliasesTbl, $index)')
+                                        tr(ng-repeat='item in #{queryAliases} track by $index')
+                                            td.col-sm-12(ng-hide='tableEditing(aliasesTbl, $index)')
                                                 a.labelFormField(ng-click='tableStartEdit(backupItem, aliasesTbl, $index)') {{item.field}} &rarr; {{item.alias}}
                                                 +btn-remove('tableRemove(backupItem, aliasesTbl, $index)', '"Remove alias"')
                                             td.col-sm-12(ng-show='tableEditing(aliasesTbl, $index)')
@@ -125,9 +127,9 @@ mixin table-index-item-edit(prefix, index, sortAvailable, idAddition)
 
                                 table.links-edit(st-table=queryIndexes ng-init='newDirection = false')
                                     tbody
-                                        tr(ng-repeat='item in #{queryIndexes}')
+                                        tr(ng-repeat='item in #{queryIndexes} track by $index')
                                             td
-                                                .col-sm-12(ng-show='!tableEditing(indexesTbl, $index)')
+                                                .col-sm-12(ng-hide='tableEditing(indexesTbl, $index)')
                                                     a.labelFormField(id='indexes{{$index}}' ng-click='tableStartEdit(backupItem, indexesTbl, $index)') {{$index + 1}}) {{item.name}} [{{item.indexType}}]
                                                     +btn-remove('tableRemove(backupItem, indexesTbl, $index)', '"Remove index"')
                                                     +btn-add('tableIndexNewItem(indexesTbl, $index)', '"Add new field to index"')
@@ -143,9 +145,9 @@ mixin table-index-item-edit(prefix, index, sortAvailable, idAddition)
                                                 .margin-left-dflt
                                                     table.links-edit-sub(st-table='item.fields' ng-init='itemIndex = $index')
                                                         tbody
-                                                            tr(ng-repeat='itemItem in item.fields')
+                                                            tr(ng-repeat='itemItem in item.fields track by $index')
                                                                 td
-                                                                    div(ng-show='!tableIndexItemEditing(indexesTbl, itemIndex, $index)')
+                                                                    div(ng-hide='tableIndexItemEditing(indexesTbl, itemIndex, $index)')
                                                                         a.labelFormField(ng-if='item.indexType == "SORTED"' ng-click='tableIndexItemStartEdit(indexesTbl, itemIndex, $index)') {{$index + 1}}) {{itemItem.name}} / {{itemItem.direction ? "ASC" : "DESC"}}
                                                                         a.labelFormField(ng-if='item.indexType != "SORTED"' ng-click='tableIndexItemStartEdit(indexesTbl, itemIndex, $index)') {{$index + 1}}) {{itemItem.name}}
                                                                         +btn-remove('tableRemoveIndexItem(item, $index)', '"Remove field from index"')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/domains/store.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/domains/store.jade b/modules/web-console/frontend/app/modules/states/configuration/domains/store.jade
index 96913bb..ab569e7 100644
--- a/modules/web-console/frontend/app/modules/states/configuration/domains/store.jade
+++ b/modules/web-console/frontend/app/modules/states/configuration/domains/store.jade
@@ -66,7 +66,8 @@ mixin table-db-field-edit(tbl, prefix, focusId, index)
         ignite-form-panel-chevron
         label Domain model for cache store
         ignite-form-field-tooltip.tipLabel
-            | Domain model properties for binding database with cache via POJO cache store
+            | Domain model properties for binding database with cache via POJO cache store#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/persistent-store" target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id=form)
         .panel-body(ng-if='ui.isPanelLoaded("#{form}")')
@@ -87,12 +88,12 @@ mixin table-db-field-edit(tbl, prefix, focusId, index)
                         .group-content(ng-show='(#{keyFields} && #{keyFields}.length > 0) || tableNewItemActive(keysTbl)')
                             table.links-edit(st-table=keyFields)
                                 tbody
-                                    tr(ng-repeat='item in #{keyFields}')
+                                    tr(ng-repeat='item in #{keyFields} track by $index')
                                         td
-                                            div(ng-show='!tableEditing(keysTbl, $index)')
+                                            div(ng-hide='tableEditing(keysTbl, $index)')
                                                 a.labelFormField(ng-click='tableStartEdit(backupItem, keysTbl, $index)') {{$index + 1}}) {{item.databaseFieldName}} / {{item.databaseFieldType}} / {{item.javaFieldName}} / {{item.javaFieldType}}
                                                 +btn-remove('tableRemove(backupItem, keysTbl, $index)', '"Remove key field"')
-                                            div(ng-show='tableEditing(keysTbl, $index)')
+                                            div(ng-if='tableEditing(keysTbl, $index)')
                                                 +table-db-field-edit('keysTbl', 'cur', '{{::keysTbl.focusId + $index}}', '$index')
                                 tfoot(ng-show='tableNewItemActive(keysTbl)')
                                     tr
@@ -110,12 +111,12 @@ mixin table-db-field-edit(tbl, prefix, focusId, index)
                         .group-content(ng-show='(#{valueFields} && #{valueFields}.length > 0) || tableNewItemActive(valuesTbl)')
                             table.links-edit(st-table=valueFields)
                                 tbody
-                                    tr(ng-repeat='item in #{valueFields}')
+                                    tr(ng-repeat='item in #{valueFields} track by $index')
                                         td
-                                            div(ng-show='!tableEditing(valuesTbl, $index)')
+                                            div(ng-hide='tableEditing(valuesTbl, $index)')
                                                 a.labelFormField(ng-click='tableStartEdit(backupItem, valuesTbl, $index)') {{$index + 1}}) {{item.databaseFieldName}} / {{item.databaseFieldType}} / {{item.javaFieldName}} / {{item.javaFieldType}}
                                                 +btn-remove('tableRemove(backupItem, valuesTbl, $index)', '"Remove key field"')
-                                            div(ng-show='tableEditing(valuesTbl, $index)')
+                                            div(ng-if='tableEditing(valuesTbl, $index)')
                                                 +table-db-field-edit('valuesTbl', 'cur', '{{::valuesTbl.focusId + $index}}', '$index')
                                 tfoot(ng-show='tableNewItemActive(valuesTbl)')
                                     tr

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/igfs/general.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/igfs/general.jade b/modules/web-console/frontend/app/modules/states/configuration/igfs/general.jade
index b087120..d12a6e8 100644
--- a/modules/web-console/frontend/app/modules/states/configuration/igfs/general.jade
+++ b/modules/web-console/frontend/app/modules/states/configuration/igfs/general.jade
@@ -23,6 +23,9 @@ include ../../../../../app/helpers/jade/mixins.jade
     .panel-heading(bs-collapse-toggle)
         ignite-form-panel-chevron
         label General
+        ignite-form-field-tooltip.tipLabel
+            | General IGFS configuration#[br]
+            | #[a(href="https://apacheignite-fs.readme.io/docs/in-memory-file-system" target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id='general')
         .panel-body

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/igfs/ipc.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/igfs/ipc.jade b/modules/web-console/frontend/app/modules/states/configuration/igfs/ipc.jade
index bb5e00b..f8da2f9 100644
--- a/modules/web-console/frontend/app/modules/states/configuration/igfs/ipc.jade
+++ b/modules/web-console/frontend/app/modules/states/configuration/igfs/ipc.jade
@@ -54,7 +54,7 @@ include ../../../../../app/helpers/jade/mixins.jade
                 .settings-row
                     +text-enabled('Token directory:', ipcEndpointConfiguration + '.tokenDirectoryPath', '"ipcEndpointConfigurationTokenDirectoryPath"', enabled, 'false', 'ipc/shmem', 'Directory where shared memory tokens are stored')
                 .settings-row
-                    +number('Thread count:', ipcEndpointConfiguration + '.threadCount', 'ipcEndpointConfigurationThreadCount', enabled, 'availableProcessors', '1',
+                    +number('Thread count:', ipcEndpointConfiguration + '.threadCount', '"ipcEndpointConfigurationThreadCount"', enabled, 'availableProcessors', '1',
                         'Number of threads used by this endpoint to process incoming requests')
             .col-sm-6
                 +preview-xml-java(model, 'igfsIPC')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/igfs/misc.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/igfs/misc.jade b/modules/web-console/frontend/app/modules/states/configuration/igfs/misc.jade
index cb4687a..ca22dc5 100644
--- a/modules/web-console/frontend/app/modules/states/configuration/igfs/misc.jade
+++ b/modules/web-console/frontend/app/modules/states/configuration/igfs/misc.jade
@@ -93,8 +93,8 @@ mixin table-igfs-path-mode-edit(prefix, focusId, index)
                         .group-content(ng-show='(#{pathModes} && #{pathModes}.length > 0) || tableNewItemActive(tblPathModes)')
                             table.links-edit(id='pathModes' st-table=pathModes)
                                 tbody
-                                    tr(ng-repeat='item in #{pathModes}')
-                                        td.col-sm-12(ng-show='!tableEditing(tblPathModes, $index)')
+                                    tr(ng-repeat='item in #{pathModes} track by $index')
+                                        td.col-sm-12(ng-hide='tableEditing(tblPathModes, $index)')
                                             a.labelFormField(ng-click='tableStartEdit(backupItem, tblPathModes, $index)') {{item.path + " [" + item.mode + "]"}}
                                             +btn-remove('tableRemove(backupItem, tblPathModes, $index)', '"Remove path"')
                                         td.col-sm-12(ng-show='tableEditing(tblPathModes, $index)')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/igfs/secondary.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/igfs/secondary.jade b/modules/web-console/frontend/app/modules/states/configuration/igfs/secondary.jade
index 0649527..1143662 100644
--- a/modules/web-console/frontend/app/modules/states/configuration/igfs/secondary.jade
+++ b/modules/web-console/frontend/app/modules/states/configuration/igfs/secondary.jade
@@ -24,7 +24,8 @@ include ../../../../../app/helpers/jade/mixins.jade
         ignite-form-panel-chevron
         label(id="secondaryFileSystem-title") Secondary file system
         ignite-form-field-tooltip.tipLabel
-            | Secondary file system is provided for pass-through, write-through, and read-through purposes
+            | Secondary file system is provided for pass-through, write-through, and read-through purposes#[br]
+            | #[a(href="https://apacheignite-fs.readme.io/docs/secondary-file-system" target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id=form)
         .panel-body(ng-if='ui.isPanelLoaded("#{form}")')


Mime
View raw message