You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ak...@apache.org on 2016/06/27 03:22:53 UTC

[09/22] ignite git commit: Ignite Web Console beta2.

http://git-wip-us.apache.org/repos/asf/ignite/blob/541e17d0/modules/web-console/src/main/js/serve/routes/public.js
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/serve/routes/public.js b/modules/web-console/src/main/js/serve/routes/public.js
index 0009e6a..207289a 100644
--- a/modules/web-console/src/main/js/serve/routes/public.js
+++ b/modules/web-console/src/main/js/serve/routes/public.js
@@ -112,12 +112,16 @@ module.exports.factory = function(express, passport, nodemailer, settings, mail,
                     account.resetPasswordToken = _randomString();
 
                     return account.save()
-                        .then(() => mail.send(account, `Thanks for signing up for ${settings.smtp.username}.`,
-                            `Hello ${account.firstName} ${account.lastName}!<br><br>` +
-                            `You are receiving this email because you have signed up to use <a href="http://${req.headers.host}">${settings.smtp.username}</a>.<br><br>` +
-                            'If you have not done the sign up and do not know what this email is about, please ignore it.<br>' +
-                            'You may reset the password by clicking on the following link, or paste this into your browser:<br><br>' +
-                            `http://${req.headers.host}/password/reset?token=${account.resetPasswordToken}`));
+                        .then(() => {
+                            const resetLink = `http://${req.headers.host}/password/reset?token=${account.resetPasswordToken}`;
+
+                            mail.send(account, `Thanks for signing up for ${settings.smtp.username}.`,
+                                `Hello ${account.firstName} ${account.lastName}!<br><br>` +
+                                `You are receiving this email because you have signed up to use <a href="http://${req.headers.host}">${settings.smtp.username}</a>.<br><br>` +
+                                'If you have not done the sign up and do not know what this email is about, please ignore it.<br>' +
+                                'You may reset the password by clicking on the following link, or paste this into your browser:<br><br>' +
+                                `<a href="${resetLink}">${resetLink}</a>`);
+                        });
                 })
                 .catch((err) => {
                     res.status(401).send(err.message);
@@ -166,14 +170,17 @@ module.exports.factory = function(express, passport, nodemailer, settings, mail,
 
                     return user.save();
                 })
-                .then((user) => mail.send(user, 'Password Reset',
-                    `Hello ${user.firstName} ${user.lastName}!<br><br>` +
-                    'You are receiving this because you (or someone else) have requested the reset of the password for your account.<br><br>' +
-                    'Please click on the following link, or paste this into your browser to complete the process:<br><br>' +
-                    'http://' + req.headers.host + '/password/reset?token=' + user.resetPasswordToken + '<br><br>' +
-                    'If you did not request this, please ignore this email and your password will remain unchanged.',
-                    'Failed to send email with reset link!')
-                )
+                .then((user) => {
+                    const resetLink = `http://${req.headers.host}/password/reset?token=${user.resetPasswordToken}`;
+
+                    mail.send(user, 'Password Reset',
+                        `Hello ${user.firstName} ${user.lastName}!<br><br>` +
+                        'You are receiving this because you (or someone else) have requested the reset of the password for your account.<br><br>' +
+                        'Please click on the following link, or paste this into your browser to complete the process:<br><br>' +
+                        `<a href="${resetLink}">${resetLink}</a><br><br>` +
+                        'If you did not request this, please ignore this email and your password will remain unchanged.',
+                        'Failed to send email with reset link!');
+                })
                 .then(() => res.status(200).send('An email has been sent with further instructions.'))
                 .catch((err) => {
                     // TODO IGNITE-843 Send email to admin

http://git-wip-us.apache.org/repos/asf/ignite/blob/541e17d0/modules/web-console/src/main/js/views/configuration/clusters.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/views/configuration/clusters.jade b/modules/web-console/src/main/js/views/configuration/clusters.jade
index 6e29d86..6450163 100644
--- a/modules/web-console/src/main/js/views/configuration/clusters.jade
+++ b/modules/web-console/src/main/js/views/configuration/clusters.jade
@@ -43,12 +43,15 @@ include ../../app/helpers/jade/mixins.jade
                         div(ng-show='ui.expanded')
                             ignite-configuration-clusters-atomic
                             ignite-configuration-clusters-binary
+                            ignite-configuration-clusters-collision
                             ignite-configuration-clusters-communication
                             ignite-configuration-clusters-connector
                             ignite-configuration-clusters-deployment
                             ignite-configuration-clusters-discovery
                             ignite-configuration-clusters-events
+                            ignite-configuration-clusters-failover
                             ignite-configuration-clusters-igfs
+                            ignite-configuration-clusters-logger
                             ignite-configuration-clusters-marshaller
                             ignite-configuration-clusters-metrics
                             ignite-configuration-clusters-ssl
@@ -56,5 +59,6 @@ include ../../app/helpers/jade/mixins.jade
                             ignite-configuration-clusters-thread
                             ignite-configuration-clusters-time
                             ignite-configuration-clusters-transactions
+                            ignite-configuration-user-attributes
 
                             +advanced-options-toggle-default

http://git-wip-us.apache.org/repos/asf/ignite/blob/541e17d0/modules/web-console/src/main/js/views/configuration/domains-import.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/views/configuration/domains-import.jade b/modules/web-console/src/main/js/views/configuration/domains-import.jade
index 46385f9..23b9434 100644
--- a/modules/web-console/src/main/js/views/configuration/domains-import.jade
+++ b/modules/web-console/src/main/js/views/configuration/domains-import.jade
@@ -14,6 +14,8 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 
+include ../../app/helpers/jade/mixins.jade
+
 mixin chk(mdl, change, tip)
     input(type='checkbox' ng-model=mdl ng-change=change bs-tooltip='' data-title=tip data-trigger='hover' data-placement='top')
 
@@ -22,174 +24,187 @@ mixin td-ellipses-lbl(w, lbl)
         label #{lbl}
 
 .modal.modal-domain-import.center(role='dialog')
-    .modal-dialog
+    .modal-dialog.domains-import-dialog
         .modal-content(ignite-loading='importDomainFromDb' ignite-loading-text='{{importDomain.loadingOptions.text}}')
             #errors-container.modal-header.header
                 button.close(ng-click='$hide()' aria-hidden='true') &times;
                 h4.modal-title(ng-if='!importDomain.demo') Import domain models from database
                 h4.modal-title(ng-if='importDomain.demo') Import domain models from demo database
-            .import-domain-model-wizard-page(ng-if='importDomain.action == "drivers" && !importDomain.jdbcDriversNotFound' style='margin-bottom: 321px')
-            .import-domain-model-wizard-page(ng-if='importDomain.action == "drivers" && importDomain.jdbcDriversNotFound' style='margin-bottom: 220px')
-                | Domain model could not be imported
-                ul
-                    li Agent failed to find JDBC drivers
-                    li Copy required JDBC drivers into agent '\jdbc-drivers' folder and try again
-                    li Refer to agent README.txt for more information
-            .import-domain-model-wizard-page(ng-show='importDomain.action == "connect" && importDomain.demo' style='margin-bottom: 211px')
-                div(ng-if='demoConnection.db == "H2"')
-                    label Demo description:
+            .modal-body
+                .import-domain-model-wizard-page(ng-if='importDomain.action == "drivers" && !importDomain.jdbcDriversNotFound')
+                .import-domain-model-wizard-page(ng-if='importDomain.action == "drivers" && importDomain.jdbcDriversNotFound')
+                    | Domain model could not be imported
                     ul
-                        li In-memory H2 database server will be started inside agent
-                        li Database will be populated with sample tables
-                        li You could test domain model generation with this demo database
-                        li Click "Next" to continue
-                div(ng-if='demoConnection.db != "H2"')
-                    label Demo could not be started
+                        li Agent failed to find JDBC drivers
+                        li Copy required JDBC drivers into agent 'jdbc-drivers' folder and try again
+                        li Refer to agent README.txt for more information
+                .import-domain-model-wizard-page(ng-show='importDomain.action == "connect" && importDomain.demo')
+                    div(ng-if='demoConnection.db == "H2"')
+                        label Demo description:
                         ul
-                            li Agent failed to resolve H2 database jar
-                            li Copy h2-x.x.x.jar into agent '\jdbc-drivers' folder and try again
-                            li Refer to agent README.txt for more information
-            .import-domain-model-wizard-page(ng-show='importDomain.action == "connect" && !importDomain.demo' style='margin-bottom: 90px')
-                form.form-horizontal(name='connectForm' novalidate)
-                    .settings-row
-                        label.col-xs-4.col-sm-2.col-md-2 Driver JAR:
-                        .col-xs-8.col-sm-10.col-md-10
-                            i.tipField.fa.fa-question-circle(bs-tooltip='' data-title='Select appropriate JAR with JDBC driver<br> To add another driver you need to place it into "/jdbc-drivers" folder of Ignite Web Agent<br> Refer to Ignite Web Agent README.txt for for more information')
-                            .input-tip
-                                button.select-toggle.form-control(id='jdbcDriverJar' bs-select data-container='.modal-domain-import' ng-model='ui.selectedJdbcDriverJar' ng-class='{placeholder: !(jdbcDriverJars && jdbcDriverJars.length > 0)}' placeholder='Choose JDBC driver' bs-options='item.value as item.label for item in jdbcDriverJars')
-                    .settings-row
-                        label.col-xs-4.col-sm-2.col-md-2 JDBC Driver:
-                        .col-xs-8.col-sm-10.col-md-10
-                            i.tipField.fa.fa-question-circle(bs-tooltip='' data-title='Fully qualified class name of JDBC driver that will be used to connect to database')
-                            .input-tip
-                                input.form-control(id='jdbcDriverClass' type='text' ng-model='selectedPreset.jdbcDriverClass' placeholder='JDBC driver fully qualified class name' required=true)
-                    .settings-row
-                        label.col-xs-4.col-sm-2.col-md-2 JDBC URL:
-                        .col-xs-8.col-sm-10.col-md-10
-                            i.tipField.fa.fa-question-circle(bs-tooltip='' data-title='JDBC URL for connecting to database<br>Refer to your database documentation for details')
-                            .input-tip
-                                input.form-control(id='jdbcUrl' type='text' ng-model='selectedPreset.jdbcUrl' placeholder='JDBC URL' required=true)
-                    .settings-row
-                        label.col-xs-4.col-sm-2.col-md-2 User:
-                        .col-xs-8.col-sm-10.col-md-10
-                            i.tipField.fa.fa-question-circle(bs-tooltip='' data-title='User name for connecting to database')
-                            .input-tip
-                                input.form-control(id='user' type='text' ng-model='selectedPreset.user')
-                    .settings-row
-                        label.col-xs-4.col-sm-2.col-md-2 Password:
-                        .col-xs-8.col-sm-10.col-md-10
-                            i.tipField.fa.fa-question-circle(bs-tooltip='' data-title='Password for connecting to database<br>Note, password would not be saved in preferences for security reasons')
-                            .input-tip
-                                input.form-control(id='password' type='password' ng-model='selectedPreset.password' on-enter='importDomainNext()')
-                    .settings-row
-                        .checkbox
-                            label
-                                input(id='tablesOnly' type='checkbox' ng-model='selectedPreset.tablesOnly')
-                                | Tables only
-                            i.tipLabel.fa.fa-question-circle(bs-tooltip='' data-title='If selected, then only tables metadata will be parsed<br>Otherwise table and view metadata will be parsed')
-            .import-domain-model-wizard-page(ng-show='importDomain.action == "schemas"')
-                table.table.metadata(st-table='importDomain.displayedSchemas' st-safe-src='importDomain.schemas')
-                    thead
-                        tr
-                            th.header(colspan='2')
-                                .col-sm-4.pull-right(style='margin-bottom: 5px')
-                                    input.form-control(type='text' st-search='name' placeholder='Filter schemas...' ng-model='importDomain.displayedSchemasFilter' ng-change='selectSchema()')
-                        tr
-                            th(width='30px')
-                                +chk('importDomain.allSchemasSelected',  'selectAllSchemas()', 'Select all schemas')
-                            th
-                                label Schema
+                            li In-memory H2 database server will be started inside agent
+                            li Database will be populated with sample tables
+                            li You could test domain model generation with this demo database
+                            li Click "Next" to continue
+                    div(ng-if='demoConnection.db != "H2"')
+                        label Demo could not be started
+                            ul
+                                li Agent failed to resolve H2 database jar
+                                li Copy h2-x.x.x.jar into agent 'jdbc-drivers' folder and try again
+                                li Refer to agent README.txt for more information
+                .import-domain-model-wizard-page(ng-show='importDomain.action == "connect" && !importDomain.demo')
+                    form.form-horizontal(name='connectForm' novalidate)
+                        .settings-row
+                            label.col-xs-4.col-sm-2.col-md-2 Driver JAR:
+                            .col-xs-8.col-sm-10.col-md-10
+                                i.tipField.fa.fa-question-circle(bs-tooltip='' data-title='Select appropriate JAR with JDBC driver<br> To add another driver you need to place it into "/jdbc-drivers" folder of Ignite Web Agent<br> Refer to Ignite Web Agent README.txt for for more information')
+                                .input-tip
+                                    button.select-toggle.form-control(id='jdbcDriverJar' bs-select data-container='.modal-domain-import' ng-model='ui.selectedJdbcDriverJar' ng-class='{placeholder: !(jdbcDriverJars && jdbcDriverJars.length > 0)}' placeholder='Choose JDBC driver' bs-options='item.value as item.label for item in jdbcDriverJars')
+                        .settings-row
+                            label.col-xs-4.col-sm-2.col-md-2 JDBC Driver:
+                            .col-xs-8.col-sm-10.col-md-10
+                                i.tipField.fa.fa-question-circle(bs-tooltip='' data-title='Fully qualified class name of JDBC driver that will be used to connect to database')
+                                .input-tip
+                                    input.form-control(id='jdbcDriverClass' type='text' ng-model='selectedPreset.jdbcDriverClass' placeholder='JDBC driver fully qualified class name' required=true)
+                        .settings-row
+                            label.col-xs-4.col-sm-2.col-md-2 JDBC URL:
+                            .col-xs-8.col-sm-10.col-md-10
+                                i.tipField.fa.fa-question-circle(bs-tooltip='' data-title='JDBC URL for connecting to database<br>Refer to your database documentation for details')
+                                .input-tip
+                                    input.form-control(id='jdbcUrl' type='text' ng-model='selectedPreset.jdbcUrl' placeholder='JDBC URL' required=true)
+                        .settings-row
+                            label.col-xs-4.col-sm-2.col-md-2 User:
+                            .col-xs-8.col-sm-10.col-md-10
+                                i.tipField.fa.fa-question-circle(bs-tooltip='' data-title='User name for connecting to database')
+                                .input-tip
+                                    input.form-control(id='user' type='text' ng-model='selectedPreset.user')
+                        .settings-row
+                            label.col-xs-4.col-sm-2.col-md-2 Password:
+                            .col-xs-8.col-sm-10.col-md-10
+                                i.tipField.fa.fa-question-circle(bs-tooltip='' data-title='Password for connecting to database<br>Note, password would not be saved in preferences for security reasons')
+                                .input-tip
+                                    input.form-control(id='password' type='password' ng-model='selectedPreset.password' on-enter='importDomainNext()')
+                        .settings-row
+                            .checkbox
+                                label
+                                    input(id='tablesOnly' type='checkbox' ng-model='selectedPreset.tablesOnly')
+                                    | Tables only
+                                i.tipLabel.fa.fa-question-circle(bs-tooltip='' data-title='If selected, then only tables metadata will be parsed<br>Otherwise table and view metadata will be parsed')
+                .import-domain-model-wizard-page(ng-show='importDomain.action == "schemas"')
+                    table.table.metadata(st-table='importDomain.displayedSchemas' st-safe-src='importDomain.schemas')
+                        thead
+                            tr
+                                th.header(colspan='2')
+                                    .col-sm-4.pull-right(style='margin-bottom: 5px')
+                                        input.form-control(type='text' st-search='name' placeholder='Filter schemas...' ng-model='importDomain.displayedSchemasFilter' ng-change='selectSchema()')
+                            tr
+                                th(width='30px')
+                                    +chk('importDomain.allSchemasSelected',  'selectAllSchemas()', 'Select all schemas')
+                                th
+                                    label Schema
+                            tbody
+                                tr
+                                    td(colspan='2')
+                                        .scrollable-y(style='height: 213px')
+                                            table.table-modal-striped(id='importSchemasData')
+                                                tbody
+                                                    tr(ng-repeat='schema in importDomain.displayedSchemas')
+                                                        td(width='30px')
+                                                            input(type='checkbox' ng-model='schema.use' ng-change='selectSchema()')
+                                                        td
+                                                            label {{schema.name}}
+                .import-domain-model-wizard-page(ng-show='importDomain.action == "tables"')
+                    table.table.metadata(st-table='importDomain.displayedTables' st-safe-src='importDomain.tables')
+                        thead
+                            tr
+                                th.header(colspan='6')
+                                    .col-sm-4.pull-right(style='margin-bottom: 8px')
+                                        input.form-control(type='text' st-search='label' placeholder='Filter tables...' ng-model='importDomain.displayedTablesFilter' ng-change='selectTable()')
+                            tr
+                                th(width='30px')
+                                    +chk('importDomain.allTablesSelected',  'selectAllTables()', 'Select all tables')
+                                th(width='130px')
+                                    label Schema
+                                th(width='160px')
+                                    label Table name
+                                th(colspan=2 width='288px')
+                                    label Cache
+                                th
                         tbody
                             tr
-                                td(colspan='2')
-                                    .scrollable-y(style='height: 213px')
-                                        table.table-modal-striped(id='importSchemasData')
+                                td(colspan='6')
+                                    .scrollable-y(style='height: 143px')
+                                        table.table-modal-striped(id='importTableData')
                                             tbody
-                                                tr(ng-repeat='schema in importDomain.displayedSchemas')
-                                                    td(width='30px')
-                                                        input(type='checkbox' ng-model='schema.use' ng-change='selectSchema()')
+                                                tr(ng-repeat='table in importDomain.displayedTables track by $index')
+                                                    td(width='30px' style='min-width: 30px; max-width: 30px')
+                                                        input(type='checkbox' ng-model='table.use' ng-change='selectTable()')
+                                                    +td-ellipses-lbl('130px', '{{table.schema}}')
+                                                    +td-ellipses-lbl('160px', '{{table.tbl}}')
+                                                    td(colspan='2' width='288px' style='min-width: 160px; max-width: 160px')
+                                                        div.td-ellipsis
+                                                            a(ng-if='!table.edit' ng-click='startEditDbTableCache(table)') {{tableActionView(table)}}
+                                                            div(style='display: flex' ng-if='table.edit')
+                                                                button.select-toggle.form-control(style='width: 35%; margin-right: 5px' bs-select ng-model='table.action' data-container='.modal-domain-import' bs-options='item.value as item.shortLabel for item in importActions')
+                                                                button.select-toggle.form-control(style='width: 65%; margin-right: 0' bs-select ng-model='table.cacheOrTemplate' data-container='.modal-domain-import' bs-options='item.value as item.label for item in table.cachesOrTemplates')
                                                     td
-                                                        label {{schema.name}}
-            .import-domain-model-wizard-page(ng-show='importDomain.action == "tables"')
-                table.table.metadata(st-table='importDomain.displayedTables' st-safe-src='importDomain.tables')
-                    thead
-                        tr
-                            th.header(colspan='6')
-                                .col-sm-4.pull-right(style='margin-bottom: 8px')
-                                    input.form-control(type='text' st-search='label' placeholder='Filter tables...' ng-model='importDomain.displayedTablesFilter' ng-change='selectTable()')
-                        tr
-                            th(width='30px')
-                                +chk('importDomain.allTablesSelected',  'selectAllTables()', 'Select all tables')
-                            th(width='130px')
-                                label Schema
-                            th(width='160px')
-                                label Table name
-                            th(colspan=2 width='288px')
-                                label Cache
-                            th
-                    tbody
-                        tr
-                            td(colspan='6')
-                                .scrollable-y(style='height: 143px')
-                                    table.table-modal-striped(id='importTableData')
-                                        tbody
-                                            tr(ng-repeat='table in importDomain.displayedTables track by $index')
-                                                td(width='30px' style='min-width: 30px; max-width: 30px')
-                                                    input(type='checkbox' ng-model='table.use' ng-change='selectTable()')
-                                                +td-ellipses-lbl('130px', '{{table.schema}}')
-                                                +td-ellipses-lbl('160px', '{{table.tbl}}')
-                                                td(colspan='2' width='288px' style='min-width: 160px; max-width: 160px')
-                                                    div.td-ellipsis
-                                                        a(ng-if='!table.edit' ng-click='startEditDbTableCache(table)') {{tableActionView(table)}}
-                                                        div(style='display: flex' ng-if='table.edit')
-                                                            button.select-toggle.form-control(style='width: 35%; margin-right: 5px' bs-select ng-model='table.action' data-container='.modal-domain-import' bs-options='item.value as item.shortLabel for item in importActions')
-                                                            button.select-toggle.form-control(style='width: 65%; margin-right: 0' bs-select ng-model='table.cacheOrTemplate' data-container='.modal-domain-import' bs-options='item.value as item.label for item in table.cachesOrTemplates')
-                                                td
-                .settings-row
-                    label Defaults to be applied for filtered tables
-                    i.tipLabel.fa.fa-question-circle(bs-tooltip='' data-title='Select and apply options for caches generation')
-                .settings-row
-                    .col-sm-11
-                        .col-sm-6(style='padding-right: 5px')
-                            button.select-toggle.form-control(bs-select ng-model='importCommon.action' data-container='.modal-domain-import' bs-options='item.value as item.label for item in importActions')
-                        .col-sm-6(style='padding-left: 5px; padding-right: 5px')
-                            button.select-toggle.form-control(bs-select ng-model='importCommon.cacheOrTemplate' data-container='.modal-domain-import' bs-options='item.value as item.label for item in importCommon.cachesOrTemplates')
-                    .col-sm-1(style='padding-left: 5px')
-                        button.btn.btn-primary(ng-click='applyDefaults()') Apply
-            .import-domain-model-wizard-page(ng-show='importDomain.action == "options"' style='margin-bottom: 176px')
-                form.form-horizontal(name='optionsForm' novalidate)
-                    .settings-row
-                        .col-xs-3.col-sm-2.col-md-2.required
-                            label.required Package:
-                        .col-xs-9.col-sm-10.col-md-10
-                            i.tipField.fa.fa-question-circle(bs-tooltip='' data-title='Package that will be used for POJOs generation')
-                            .input-tip
-                                input.form-control(id='domainPackageName' type='text' ng-model='ui.packageName' placeholder='Package for POJOs generation')
-                    .settings-row
-                        .checkbox
-                            label
-                                input(id='domainBuiltinKeys' type='checkbox' ng-model='ui.builtinKeys')
-                                | Use Java built-in types for keys
-                                i.tipLabel.fa.fa-question-circle(bs-tooltip='' data-title='Use Java built-in types like "Integer", "Long", "String" instead of POJO generation in case when table primary key contains only one field')
-                    .settings-row
-                        .checkbox
-                            label
-                                input(id='domainUsePrimitives' type='checkbox' ng-model='ui.usePrimitives')
-                                | Use primitive types for NOT NULL table columns
-                                i.tipLabel.fa.fa-question-circle(bs-tooltip='' data-title='Use primitive types like "int", "long", "double" for POJOs fields generation in case of NOT NULL columns')
                     .settings-row
-                        .checkbox
-                            label
-                                input(id='domainGenerateAliases' type='checkbox' ng-model='ui.generateAliases')
-                                | Generate aliases for query fields
-                                i.tipLabel.fa.fa-question-circle(bs-tooltip='' data-title='Generate aliases for query fields with names from database fields')
+                        label Defaults to be applied for filtered tables
+                        i.tipLabel.fa.fa-question-circle(bs-tooltip='' data-title='Select and apply options for caches generation')
                     .settings-row
-                        .col-xs-3.col-sm-2.col-md-2.required
-                            label Clusters:
-                        .col-xs-9.col-sm-10.col-md-10
-                            i.tipField.fa.fa-question-circle(bs-tooltip='' data-title='Choose clusters that will be associated with generated caches')
-                            .input-tip
-                                button.select-toggle.form-control(id='generatedCachesClusters' bs-select ng-model='ui.generatedCachesClusters' ng-class='{placeholder: !(ui.generatedCachesClusters && ui.generatedCachesClusters.length > 0)}' data-container='.modal-domain-import' data-multiple='1' placeholder='Choose clusters for generated caches' bs-options='item.value as item.label for item in clusters')
+                        .col-sm-11
+                            .col-sm-6(style='padding-right: 5px')
+                                button.select-toggle.form-control(bs-select ng-model='importCommon.action' data-container='.modal-domain-import' bs-options='item.value as item.label for item in importActions')
+                            .col-sm-6(style='padding-left: 5px; padding-right: 5px')
+                                button.select-toggle.form-control(bs-select ng-model='importCommon.cacheOrTemplate' data-container='.modal-domain-import' bs-options='item.value as item.label for item in importCommon.cachesOrTemplates')
+                        .col-sm-1(style='padding-left: 5px')
+                            button.btn.btn-primary(ng-click='applyDefaults()') Apply
+                .import-domain-model-wizard-page(ng-show='importDomain.action == "options"')
+                    form.form-horizontal(name='optionsForm' novalidate)
+                        .settings-row
+                            .col-xs-3.col-sm-2.col-md-2.required
+                                label.required Package:
+                            .col-xs-9.col-sm-10.col-md-10
+                                i.tipField.fa.fa-question-circle(bs-tooltip='' data-title='Package that will be used for POJOs generation')
+                                .input-tip
+                                    ignite-form-field-input-text(
+                                        data-id='domainPackageName'
+                                        data-name='domainPackageName'
+                                        data-ng-model='ui.packageName'
+                                        data-ignite-label-name='Package'
+                                        data-ng-required='true'
+                                        data-placeholder='Enter package name'
+                                        data-java-keywords='true'
+                                        data-java-package-name='package-only'
+                                        ng-model-options='{allowInvalid: true}'
+                                    )
+                                        +error-feedback('optionsForm.$error.javaPackageName', 'javaPackageName', 'Package name is invalid')
+                                        +error-feedback('optionsForm.$error.javaKeywords', 'javaKeywords', 'Package name could not contains reserved java keyword')
+                        .settings-row
+                            .checkbox
+                                label
+                                    input(id='domainBuiltinKeys' type='checkbox' ng-model='ui.builtinKeys')
+                                    | Use Java built-in types for keys
+                                    i.tipLabel.fa.fa-question-circle(bs-tooltip='' data-title='Use Java built-in types like "Integer", "Long", "String" instead of POJO generation in case when table primary key contains only one field')
+                        .settings-row
+                            .checkbox
+                                label
+                                    input(id='domainUsePrimitives' type='checkbox' ng-model='ui.usePrimitives')
+                                    | Use primitive types for NOT NULL table columns
+                                    i.tipLabel.fa.fa-question-circle(bs-tooltip='' data-title='Use primitive types like "int", "long", "double" for POJOs fields generation in case of NOT NULL columns')
+                        .settings-row
+                            .checkbox
+                                label
+                                    input(id='domainGenerateAliases' type='checkbox' ng-model='ui.generateAliases')
+                                    | Generate aliases for query fields
+                                    i.tipLabel.fa.fa-question-circle(bs-tooltip='' data-title='Generate aliases for query fields with names from database fields')
+                        .settings-row
+                            .col-xs-3.col-sm-2.col-md-2.required
+                                label Clusters:
+                            .col-xs-9.col-sm-10.col-md-10
+                                i.tipField.fa.fa-question-circle(bs-tooltip='' data-title='Choose clusters that will be associated with generated caches')
+                                .input-tip
+                                    button.select-toggle.form-control(id='generatedCachesClusters' bs-select ng-model='ui.generatedCachesClusters' ng-class='{placeholder: !(ui.generatedCachesClusters && ui.generatedCachesClusters.length > 0)}' data-container='.modal-domain-import' data-multiple='1' placeholder='Choose clusters for generated caches' bs-options='item.value as item.label for item in clusters')
             .modal-footer
                 label(ng-hide='importDomain.action == "drivers" || (importDomain.action == "connect" && importDomain.demo)').labelField {{importDomain.info}}
                 a.btn.btn-primary(ng-hide='importDomain.action == "drivers" || importDomain.action == "connect"' ng-click='importDomainPrev()' bs-tooltip='' data-title='{{prevTooltipText()}}' data-placement='bottom') Prev

http://git-wip-us.apache.org/repos/asf/ignite/blob/541e17d0/modules/web-console/src/main/js/views/settings/profile.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/views/settings/profile.jade b/modules/web-console/src/main/js/views/settings/profile.jade
index 355d232..53991b3 100644
--- a/modules/web-console/src/main/js/views/settings/profile.jade
+++ b/modules/web-console/src/main/js/views/settings/profile.jade
@@ -48,29 +48,29 @@ mixin lbl(txt)
                     .details-row
                         .advanced-options
                             i.fa(
-                            ng-click='expandedToken = !expandedToken'
+                            ng-click='toggleToken()'
                             ng-class='expandedToken ? "fa-chevron-circle-down" : "fa-chevron-circle-right"')
-                            a(ng-click='expandedToken = !expandedToken') {{expandedToken ? 'Cancel security token changing...' : 'Show security token...'}}
+                            a(ng-click='toggleToken()') {{expandedToken ? 'Cancel security token changing...' : 'Show security token...'}}
                         div(ng-if='expandedToken')
                             +lbl('Security token:')
-                            label(ng-init='user.token = $root.user.token') {{user.token || 'No security token. Regenerate please.'}}
+                            label {{user.token || 'No security token. Regenerate please.'}}
                             i.tipLabel.fa.fa-refresh(ng-click='generateToken()' bs-tooltip='' data-title='Generate random security token')
                             i.tipLabel.fa.fa-clipboard(ng-click-copy='{{user.token}}' bs-tooltip='' data-title='Copy security token to clipboard')
                             i.tipLabel.fa.fa-question-circle(ng-if=lines bs-tooltip='' data-title='The security token is used for authorization of web agent')
                     .details-row
                         .advanced-options
                             i.fa(
-                            ng-click='expandedPassword = !expandedPassword'
+                            ng-click='togglePassword()'
                             ng-class='expandedPassword ? "fa-chevron-circle-down" : "fa-chevron-circle-right"')
-                            a(ng-click='expandedPassword = !expandedPassword') {{expandedPassword ? 'Cancel password changing...' : 'Change password...'}}
+                            a(ng-click='togglePassword()') {{expandedPassword ? 'Cancel password changing...' : 'Change password...'}}
                         div(ng-if='expandedPassword')
                             .details-row
                                 +lbl('New password:')
                                 .col-xs-5.col-sm-4
-                                    input.form-control(ng-init='user.password=null' type='password' ng-model='user.password' placeholder='New password')
+                                    input.form-control(type='password' ng-model='user.password' placeholder='New password')
                             .details-row
                                 +lbl('Confirm:')
                                 .col-xs-5.col-sm-4
-                                    input.form-control(ng-init='user.confirm=null' type='password' ng-model='user.confirm' match='user.password' placeholder='Confirm new password')
+                                    input.form-control(type='password' ng-model='user.confirm' match='user.password' placeholder='Confirm new password')
                 .col-xs-12.col-sm-12.details-row
                     a.btn.btn-primary(ng-disabled='!profileCouldBeSaved()' ng-click='profileCouldBeSaved() && saveUser()' bs-tooltip='' data-title='{{saveBtnTipText()}}' data-placement='bottom' data-trigger='hover') Save

http://git-wip-us.apache.org/repos/asf/ignite/blob/541e17d0/modules/web-console/src/main/js/views/signin.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/views/signin.jade b/modules/web-console/src/main/js/views/signin.jade
index 7c25a5a..73a07e7 100644
--- a/modules/web-console/src/main/js/views/signin.jade
+++ b/modules/web-console/src/main/js/views/signin.jade
@@ -48,11 +48,15 @@ header#header.header
                             .settings-row(ng-show='action == "signup"')
                                 +lblRequired('Last Name:')
                                 .col-xs-9.col-md-8
-                                    input#last_name.form-control(enter-focus-next='email' type='text' ng-model='ui.lastName' placeholder='Input last name' ng-required='action=="signup"')
-                            .settings-row(ng-show='action != "signup"')
+                                    input#last_name.form-control(enter-focus-next='signup_email' type='text' ng-model='ui.lastName' placeholder='Input last name' ng-required='action=="signup"')
+                            .settings-row(ng-show='action == "password/forgot"')
                                 +lblRequired('Email:')
                                 .col-xs-9.col-md-8
-                                    input#signin_email.form-control(enter-focus-next='company' type='email' ng-model='ui.email' placeholder='Input email' required)
+                                    input#forgot_email.form-control(on-enter='form.$valid && forgotPassword(ui)' type='email' ng-model='ui.email' placeholder='Input email' required)
+                            .settings-row(ng-show='action == "signin"')
+                                +lblRequired('Email:')
+                                .col-xs-9.col-md-8
+                                    input#signin_email.form-control(enter-focus-next='user_password' type='email' ng-model='ui.email' placeholder='Input email' required)
                             .settings-row(ng-show='action == "signup"')
                                 +lblRequired('Email:')
                                 .col-xs-9.col-md-8
@@ -80,17 +84,17 @@ header#header.header
                                         | I agree to the #[a(ui-sref='{{::terms.termsState}}' target='_blank') terms and conditions]
                         .col-xs-12.col-md-11
                             .login-footer(ng-show='action == "signup"')
-                                a.labelField(ng-click='action = "password/forgot"' on-click-focus='email') Forgot password?
-                                a.labelLogin(ng-click='action = "signin"' on-click-focus='email') Sign In
+                                a.labelField(ng-click='action = "password/forgot"' on-click-focus='signin_email') Forgot password?
+                                a.labelLogin(ng-click='action = "signin"' on-click-focus='signin_email') Sign In
                                 button#signup.btn.btn-primary(ng-click='auth(action, ui)' ng-disabled='form.$invalid') Sign Up
                         .col-xs-12.col-md-11
                             .login-footer(ng-show='action == "password/forgot"')
-                                a.labelField(ng-click='action = "signin"' on-click-focus='email') Sign In
-                                button#forgot.btn.btn-primary(ng-click='auth(action, ui)' ng-disabled='form.$invalid') Send it to me
+                                a.labelField(ng-click='action = "signin"' on-click-focus='signin_email') Sign In
+                                button#forgot.btn.btn-primary(ng-click='forgotPassword(ui)' ng-disabled='form.$invalid') Send it to me
                         .col-xs-12.col-md-11
                             .login-footer(ng-show='action == "signin"')
-                                a.labelField(ng-click='action = "password/forgot"' on-click-focus='email') Forgot password?
-                                a.labelLogin(ng-click='action = "signup"' on-click-focus='user_name') Sign Up
+                                a.labelField(ng-click='action = "password/forgot"' on-click-focus='signin_email') Forgot password?
+                                a.labelLogin(ng-click='action = "signup"' on-click-focus='first_name') Sign Up
                                 button#login.btn.btn-primary(ng-click='auth(action, ui)' ng-disabled='form.$invalid') Sign In
 
                     .col-xs-12.col-md-11.home-panel
@@ -144,10 +148,10 @@ header#header.header
                                     h3 Query chart
                                     p View data in tabular form and as charts
                         // Controls
-                        a.left.carousel-control(href='#carousel', role='button', data-slide='prev')
+                        a.left.carousel-control(href='#carousel', ng-click='$event.preventDefault()', role='button', data-slide='prev')
                             span.fa.fa-chevron-left(aria-hidden='true')
                             span.sr-only Previous
-                        a.right.carousel-control(href='#carousel', role='button', data-slide='next')
+                        a.right.carousel-control(href='#carousel', ng-click='$event.preventDefault()', role='button', data-slide='next')
                             span.fa.fa-chevron-right(aria-hidden='true')
                             span.sr-only Next
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/541e17d0/modules/web-console/src/main/js/views/sql/cache-metadata.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/views/sql/cache-metadata.jade b/modules/web-console/src/main/js/views/sql/cache-metadata.jade
index 40b7a6b..450c178 100644
--- a/modules/web-console/src/main/js/views/sql/cache-metadata.jade
+++ b/modules/web-console/src/main/js/views/sql/cache-metadata.jade
@@ -24,7 +24,7 @@
             span(ng-switch='' on='node.type')
                 span(ng-switch-when='type' ng-dblclick='dblclickMetadata(paragraph, node)')
                     i.fa.fa-table
-                    label.clickable(ng-bind-html='node.displayMame')
+                    label.clickable(ng-bind='node.displayName')
                 span(ng-switch-when='plain')
                     label {{node.name}}
                 span(ng-switch-when='field' ng-dblclick='dblclickMetadata(paragraph, node)')

http://git-wip-us.apache.org/repos/asf/ignite/blob/541e17d0/modules/web-console/src/main/js/views/sql/sql.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/src/main/js/views/sql/sql.jade b/modules/web-console/src/main/js/views/sql/sql.jade
index 5eade69..be6d85e 100644
--- a/modules/web-console/src/main/js/views/sql/sql.jade
+++ b/modules/web-console/src/main/js/views/sql/sql.jade
@@ -42,24 +42,105 @@ mixin chart-settings(mdl)
         .col-xs-4
             +result-toolbar
 
+mixin notebook-rename
+    .docs-header.notebook-header
+        h1.col-sm-6(ng-hide='notebook.edit')
+            label(style='max-width: calc(100% - 60px)') {{notebook.name}}
+            .btn-group(ng-if='!demo')
+                +btn-toolbar('fa-pencil', 'notebook.edit = true;notebook.editName = notebook.name', 'Rename notebook')
+                +btn-toolbar('fa-trash', 'removeNotebook()', 'Remove notebook')
+        h1.col-sm-6(ng-show='notebook.edit')
+            i.btn.fa.fa-floppy-o(ng-show='notebook.editName' ng-click='renameNotebook(notebook.editName)' bs-tooltip data-title='Save notebook name' data-trigger='hover')
+            .input-tip
+                input.form-control(ng-model='notebook.editName' required on-enter='renameNotebook(notebook.editName)' on-escape='notebook.edit = false;')
+        h1.pull-right
+            a.dropdown-toggle(data-toggle='dropdown' bs-dropdown='scrollParagraphs' data-placement='bottom-right') Scroll to query
+                span.caret
+            .btn-group(style='margin-top: 2px')
+                +btn-toolbar('fa-plus', 'addParagraph()', 'Add new query')
+
+mixin notebook-error
+    h2 Failed to load notebook
+    label.col-sm-12 Notebook not accessible any more. Go back to configuration or open to another notebook.
+    button.h3.btn.btn-primary(ui-sref='base.configuration.clusters') Back to configuration
+
+mixin paragraph-rename
+    .col-sm-6(ng-hide='paragraph.edit')
+        i.tipLabel.fa(ng-class='paragraphExpanded(paragraph) ? "fa-chevron-circle-down" : "fa-chevron-circle-right"')
+        label {{paragraph.name}}
+
+        .btn-group(ng-hide='notebook.paragraphs.length > 1')
+            +btn-toolbar('fa-pencil', 'paragraph.edit = true; paragraph.editName = paragraph.name; $event.stopPropagation();', 'Rename query', 'paragraph-name-{{paragraph.id}}')
+
+        .btn-group(ng-show='notebook.paragraphs.length > 1' ng-click='$event.stopPropagation();')
+            +btn-toolbar('fa-pencil', 'paragraph.edit = true; paragraph.editName = paragraph.name;', 'Rename query', 'paragraph-name-{{paragraph.id}}')
+            +btn-toolbar('fa-remove', 'removeParagraph(paragraph)', 'Remove query')
+
+    .col-sm-6(ng-show='paragraph.edit')
+        i.tipLabel.fa(style='float: left;' ng-class='paragraphExpanded(paragraph) ? "fa-chevron-circle-down" : "fa-chevron-circle-right"')
+        i.tipLabel.fa.fa-floppy-o(style='float: right;' ng-show='paragraph.editName' ng-click='renameParagraph(paragraph, paragraph.editName); $event.stopPropagation();' bs-tooltip data-title='Save query name' data-trigger='hover')
+        .input-tip
+            input.form-control(id='paragraph-name-{{paragraph.id}}' ng-model='paragraph.editName' required ng-click='$event.stopPropagation();' on-enter='renameParagraph(paragraph, paragraph.editName)' on-escape='paragraph.edit = false')
+
+mixin query-controls
+    .sql-controls
+        a.btn.btn-primary(ng-disabled='!actionAvailable(paragraph, true)' ng-click='actionAvailable(paragraph, true) && execute(paragraph)' data-placement='bottom' bs-tooltip data-title='{{actionTooltip(paragraph, "execute", true)}}') Execute
+        a.btn.btn-primary(ng-disabled='!actionAvailable(paragraph, true)' ng-click='actionAvailable(paragraph, true) && explain(paragraph)' data-placement='bottom' bs-tooltip data-title='{{actionTooltip(paragraph, "explain", true)}}') Explain
+        a.btn.btn-primary(ng-disabled='!actionAvailable(paragraph, false)' ng-click='actionAvailable(paragraph, false) && scan(paragraph)' data-placement='bottom' bs-tooltip data-title='{{actionTooltip(paragraph, "execute scan", false)}}') Scan
+        .pull-right
+            labelHide System columns:
+            a.btn.btn-default.fa.fa-bars.tipLabel(ng-class='{"btn-info": paragraph.systemColumns}' ng-click='toggleSystemColumns(paragraph)' ng-disabled='paragraph.disabledSystemColumns' bs-tooltip data-title='Show "_KEY", "_VAL" columns')
+            label.tipLabel Refresh rate:
+            button.btn.btn-default.fa.fa-clock-o.tipLabel(title='Click to show refresh rate dialog' ng-class='{"btn-info": paragraph.rate && paragraph.rate.installed}' bs-popover data-template-url='/sql/paragraph-rate.html' data-placement='left' data-auto-close='1' data-trigger='click') {{rateAsString(paragraph)}}
+            label.tipLabel Page size:
+            button.select-toggle.fieldButton.btn.btn-default(ng-model='paragraph.pageSize' bs-options='item for item in pageSizes' bs-select bs-tooltip data-placement='bottom-right' data-title='Max number of rows to show in query result as one page')
+
+mixin table-result
+    .sql-table-total.row
+        .col-xs-4
+            label(style='margin-right: 10px;') Page: #[b {{paragraph.page}}]
+            label Results so far: #[b {{paragraph.rows.length + paragraph.total}}]
+        .col-xs-4
+            +result-toolbar
+        .col-xs-4
+            .btn-group.pull-right(ng-disabled='paragraph.loading')
+                button.btn.btn-primary.fieldButton(ng-click='exportCsv(paragraph)' bs-tooltip data-title='{{actionTooltip(paragraph, "export", false)}}') Export
+                button.btn.btn-primary(id='export-item-dropdown' data-toggle='dropdown' data-container='body' bs-dropdown='exportDropdown' data-placement='bottom-right')
+                    span.caret
+    .grid(ui-grid='paragraph.gridOptions' ui-grid-resize-columns ui-grid-exporter)
+
+mixin chart-result
+    div(ng-show='paragraph.queryExecuted()')
+        +chart-settings
+        div(ng-show='paragraph.chartColumns.length > 0 && !paragraph.chartColumnsConfigured()')
+            .sql-empty-result Cannot display chart. Please configure axis using #[b Chart settings]
+        div(ng-show='paragraph.chartColumns.length == 0')
+            .sql-empty-result Cannot display chart. Result set must contain Java build-in type columns. Please change query and execute it again.
+        div(ng-show='paragraph.chartColumnsConfigured()')
+            div(ng-show='paragraph.timeLineSupported() || !paragraph.chartTimeLineEnabled()')
+                div(ng-repeat='chart in paragraph.charts')
+                    nvd3(options='chart.options' data='chart.data' api='chart.api')
+            .sql-empty-result(ng-show='!paragraph.timeLineSupported() && paragraph.chartTimeLineEnabled()') Pie chart does not support 'TIME_LINE' column for X-axis. Please use another column for X-axis or switch to another chart.
+    .sql-empty-result(ng-hide='paragraph.queryExecuted()')
+        .row
+            .col-xs-4.col-xs-offset-4
+                +result-toolbar
+        label.margin-top-dflt Charts do not support #[b Explain] and #[b Scan] query
+
+mixin footer-controls
+    hr(style='margin-top: 0; margin-bottom: 5px')
+    a(style='float: left; margin-left: 10px; margin-bottom: 5px' ng-click='showResultQuery(paragraph)') Show query
+
+    -var nextVisibleCondition = 'paragraph.queryId && (paragraph.table() || paragraph.chart() && (paragraph.timeLineSupported() || !paragraph.chartTimeLineEnabled()))'
+
+    .sql-next(ng-show=nextVisibleCondition)
+        i.fa.fa-chevron-circle-right(ng-class='{disabled: paragraph.loading}' ng-click='!paragraph.loading && nextPage(paragraph)')
+        a(ng-class='{disabled: paragraph.loading}' ng-click='!paragraph.loading && nextPage(paragraph)') Next
+
 .row(ng-controller='sqlController')
     .docs-content
         .row(ng-if='notebook' bs-affix style='margin-bottom: 20px;')
-            .docs-header.notebook-header
-                h1.col-sm-6(ng-hide='notebook.edit')
-                    label(style='max-width: calc(100% - 60px)') {{notebook.name}}
-                    .btn-group(ng-if='!demo')
-                        +btn-toolbar('fa-pencil', 'notebook.edit = true;notebook.editName = notebook.name', 'Rename notebook')
-                        +btn-toolbar('fa-trash', 'removeNotebook()', 'Remove notebook')
-                h1.col-sm-6(ng-show='notebook.edit')
-                    i.btn.fa.fa-floppy-o(ng-show='notebook.editName' ng-click='renameNotebook(notebook.editName)' bs-tooltip data-title='Save notebook name' data-trigger='hover')
-                    .input-tip
-                        input.form-control(ng-model='notebook.editName' required on-enter='renameNotebook(notebook.editName)' on-escape='notebook.edit = false;')
-                h1.pull-right
-                    a.dropdown-toggle(data-toggle='dropdown' bs-dropdown='scrollParagraphs' data-placement='bottom-right') Scroll to query
-                        span.caret
-                    .btn-group(style='margin-top: 2px')
-                        +btn-toolbar('fa-plus', 'addParagraph()', 'Add new query')
+            +notebook-rename
 
         ignite-information(data-title='With SQL notebook you can' style='margin-top: 0; margin-bottom: 30px')
             ul
@@ -69,31 +150,15 @@ mixin chart-settings(mdl)
                 li View data in tabular form and as charts
 
         div(ng-if='notebookLoadFailed' style='text-align: center')
-            h2 Failed to load notebook
-            label.col-sm-12 Notebook not accessible any more. Go back to configuration or open to another notebook.
-            button.h3.btn.btn-primary(ui-sref='base.configuration.clusters') Back to configuration
+            +notebook-error
+
         div(ng-if='notebook' ignite-loading='sqlLoading' ignite-loading-text='{{ loadingText }}' ignite-loading-position='top')
             .docs-body.paragraphs
                 .panel-group(bs-collapse ng-model='notebook.expandedParagraphs' data-allow-multiple='true' data-start-collapsed='false')
                     .panel.panel-default(ng-repeat='paragraph in notebook.paragraphs')
                         .panel-heading(id='{{paragraph.id}}' bs-collapse-toggle)
                             .row
-                                .col-sm-6(ng-hide='paragraph.edit')
-                                    i.tipLabel.fa(ng-class='paragraphExpanded(paragraph) ? "fa-chevron-circle-down" : "fa-chevron-circle-right"')
-                                    label {{paragraph.name}}
-
-                                    .btn-group(ng-hide='notebook.paragraphs.length > 1')
-                                        +btn-toolbar('fa-pencil', 'paragraph.edit = true; paragraph.editName = paragraph.name; $event.stopPropagation();', 'Rename query', 'paragraph-name-{{paragraph.id}}')
-
-                                    .btn-group(ng-show='notebook.paragraphs.length > 1' ng-click='$event.stopPropagation();')
-                                        +btn-toolbar('fa-pencil', 'paragraph.edit = true; paragraph.editName = paragraph.name;', 'Rename query', 'paragraph-name-{{paragraph.id}}')
-                                        +btn-toolbar('fa-remove', 'removeParagraph(paragraph)', 'Remove query')
-
-                                .col-sm-6(ng-show='paragraph.edit')
-                                    i.tipLabel.fa(style='float: left;' ng-class='paragraphExpanded(paragraph) ? "fa-chevron-circle-down" : "fa-chevron-circle-right"')
-                                    i.tipLabel.fa.fa-floppy-o(style='float: right;' ng-show='paragraph.editName' ng-click='renameParagraph(paragraph, paragraph.editName); $event.stopPropagation();' bs-tooltip data-title='Save query name' data-trigger='hover')
-                                    .input-tip
-                                        input.form-control(id='paragraph-name-{{paragraph.id}}' ng-model='paragraph.editName' required ng-click='$event.stopPropagation();' on-enter='renameParagraph(paragraph, paragraph.editName)' on-escape='paragraph.edit = false')
+                                +paragraph-rename
                         .panel-collapse(role='tabpanel' bs-collapse-target)
                             .col-sm-12
                                 .col-xs-8.col-sm-9(style='border-right: 1px solid #eee')
@@ -105,13 +170,13 @@ mixin chart-settings(mdl)
                                         lable.labelField.labelFormField Caches:
                                         i.fa.fa-database.tipField(title='Click to show cache types metadata dialog' bs-popover data-template-url='/sql/cache-metadata.html', data-placement='bottom', data-trigger='click')
                                         .input-tip
-                                            input.form-control(type='text' st-search='name' placeholder='Filter caches...')
+                                            input.form-control(type='text' st-search='label' placeholder='Filter caches...')
                                         table.links
-                                            tbody.scrollable-y(style='max-height: 15em;display:block;' ng-model='paragraph.cacheName' bs-radio-group)
+                                            tbody.scrollable-y(style='max-height: 15em; display: block;')
                                                 tr(ng-repeat='cache in displayedCaches track by cache.name')
                                                     td(style='width: 100%')
-                                                        input.labelField(type='radio' value='{{cache.name}}')
-                                                        label(ng-bind-html='maskCacheName(cache.name)')
+                                                        input.labelField(id='cache{{$index}}' type='radio' value='{{cache.name}}' ng-model='paragraph.cacheName')
+                                                        label(for='cache{{$index}}' ng-bind='cache.label')
                                     .empty-caches(ng-show='displayedCaches.length == 0 && caches.length != 0')
                                         label Wrong caches filter
                                     .empty-caches(ng-show='caches.length == 0')
@@ -119,62 +184,18 @@ mixin chart-settings(mdl)
                             .col-sm-12
                                 hr(style='margin: 0')
                             .col-sm-12
-                                .sql-controls
-                                    a.btn.btn-primary(ng-disabled='!actionAvailable(paragraph, true)' ng-click='actionAvailable(paragraph, true) && execute(paragraph)' data-placement='bottom' bs-tooltip data-title='{{actionTooltip(paragraph, "execute", true)}}') Execute
-                                    a.btn.btn-primary(ng-disabled='!actionAvailable(paragraph, true)' ng-click='actionAvailable(paragraph, true) && explain(paragraph)' data-placement='bottom' bs-tooltip data-title='{{actionTooltip(paragraph, "explain", true)}}') Explain
-                                    a.btn.btn-primary(ng-disabled='!actionAvailable(paragraph, false)' ng-click='actionAvailable(paragraph, false) && scan(paragraph)' data-placement='bottom' bs-tooltip data-title='{{actionTooltip(paragraph, "execute scan", false)}}') Scan
-                                    .pull-right
-                                        labelHide System columns:
-                                        a.btn.btn-default.fa.fa-bars.tipLabel(ng-class='{"btn-info": paragraph.systemColumns}' ng-click='toggleSystemColumns(paragraph)' ng-disabled='paragraph.disabledSystemColumns' bs-tooltip data-title='Show "_KEY", "_VAL" columns')
-                                        label.tipLabel Refresh rate:
-                                        button.btn.btn-default.fa.fa-clock-o.tipLabel(title='Click to show refresh rate dialog' ng-class='{"btn-info": paragraph.rate && paragraph.rate.installed}' bs-popover data-template-url='/sql/paragraph-rate.html' data-placement='left' data-auto-close='1' data-trigger='click') {{rateAsString(paragraph)}}
-                                        label.tipLabel Page size:
-                                        button.select-toggle.fieldButton.btn.btn-default(ng-model='paragraph.pageSize' bs-options='item for item in pageSizes' bs-select bs-tooltip data-title='Max number of rows to show in query result as one page')
+                                +query-controls
                             .col-sm-12.sql-error-result(ng-show='paragraph.errMsg') Error: {{paragraph.errMsg}}
-                            .col-sm-12(ng-show='!paragraph.errMsg && paragraph.result != "none"')
+                            .col-sm-12(ng-show='!paragraph.errMsg && paragraph.queryArgs')
                                 hr(style='margin-top: 0; margin-bottom: 10px')
+
                                 .sql-empty-result(ng-show='!paragraph.nonEmpty()') Result set is empty
+
                                 div(ng-show='paragraph.table() && paragraph.nonEmpty()')
-                                    .sql-table-total.row
-                                        .col-xs-4
-                                            label Page #&nbsp;
-                                            b {{paragraph.page}}&nbsp;&nbsp;&nbsp;
-                                            label Results so far:&nbsp;
-                                            b {{paragraph.rows.length + paragraph.total}}
-                                        .col-xs-4
-                                            +result-toolbar
-                                        .col-xs-4
-                                            .btn-group.pull-right(ng-disabled='paragraph.loading')
-                                                button.btn.btn-primary.fieldButton(ng-click='exportCsv(paragraph)' bs-tooltip data-title='{{actionTooltip(paragraph, "export", false)}}') Export
-                                                button.btn.btn-primary(id='export-item-dropdown' data-toggle='dropdown' data-container='body' bs-dropdown='exportDropdown' data-placement='bottom-right')
-                                                    span.caret
-                                    .grid(ui-grid='paragraph.gridOptions' ui-grid-auto-resize ui-grid-exporter ng-style='{ height: paragraph.gridOptions.height }')
+                                    +table-result
+
                                 div(ng-show='paragraph.chart() && paragraph.nonEmpty()')
-                                    div(ng-show='paragraph.queryExecuted()')
-                                        +chart-settings
-                                        div(ng-show='paragraph.chartColumns.length > 0 && !paragraph.chartColumnsConfigured()')
-                                            .sql-empty-result Cannot display chart. Please configure axis using #[b Chart settings]
-                                        div(ng-show='paragraph.chartColumns.length == 0')
-                                            .sql-empty-result Cannot display chart. Result set must contain Java build-in type columns. Please change query and execute it again.
-                                        div(ng-show='paragraph.chartColumnsConfigured()')
-                                            div(ng-show='paragraph.timeLineSupported() || !paragraph.chartTimeLineEnabled()')
-                                                div(ng-repeat='chart in paragraph.charts')
-                                                    nvd3(options='chart.options' data='chart.data' api='chart.api')
-                                            .sql-empty-result(ng-show='!paragraph.timeLineSupported() && paragraph.chartTimeLineEnabled()') Pie chart does not support 'TIME_LINE' column for X-axis. Please use another column for X-axis or switch to another chart.
-                                    .sql-empty-result(ng-hide='paragraph.queryExecuted()')
-                                        .row
-                                            .col-xs-4.col-xs-offset-4
-                                                +result-toolbar
-                                        label.margin-top-dflt Charts do not support&nbsp
-                                            b Explain
-                                            | &nbsp;and&nbsp;
-                                            b Scan
-                                            | &nbsp;query
-                                div(ng-show='paragraph.queryArgs && !paragraph.refreshExecuting()')
-                                    -var nextVisibleCondition = 'paragraph.queryId && (paragraph.table() || paragraph.chart() && paragraph.queryExecute() && (paragraph.timeLineSupported() || !paragraph.chartTimeLineEnabled()))'
-
-                                    hr(style='margin-top: 0; margin-bottom: 5px')
-                                    a(style='float: left; margin-left: 10px; margin-bottom: 5px' ng-click='showResultQuery(paragraph)') Show query
-                                    .sql-next(ng-show=nextVisibleCondition )
-                                        i.fa.fa-chevron-circle-right(ng-class='{disabled: paragraph.loading}' ng-click='!paragraph.loading && nextPage(paragraph)')
-                                        a(ng-class='{disabled: paragraph.loading}' ng-click='!paragraph.loading && nextPage(paragraph)') Next
+                                    +chart-result
+
+                                div(ng-show='!paragraph.refreshExecuting()')
+                                    +footer-controls