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') × 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 # - 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-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  - b Explain - | and - b Scan - | 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
