IGNITE-843 Merge ignite_modules.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/6699b1e9 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/6699b1e9 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/6699b1e9 Branch: refs/heads/ignite-843-rc2 Commit: 6699b1e9edfc99c855bb67a3573c7db903251b24 Parents: a8c8ebf Author: Andrey <[email protected]> Authored: Tue Dec 1 15:52:43 2015 +0700 Committer: Andrey <[email protected]> Committed: Tue Dec 1 15:52:43 2015 +0700 ---------------------------------------------------------------------- .../control-center-web/src/main/js/app/index.js | 4 +- .../app/modules/configuration-sidebar/main.js | 56 ---- .../app/modules/configuration/sidebar/main.js | 56 ++++ .../src/main/js/gulpfile.js/tasks/concat.js | 4 +- .../src/main/js/gulpfile.js/tasks/copy.js | 3 +- .../main/js/gulpfile.js/tasks/inject-plugins.js | 7 +- .../src/main/js/views/configuration/caches.jade | 41 ++- .../main/js/views/configuration/clusters.jade | 41 ++- .../src/main/js/views/configuration/igfs.jade | 41 ++- .../main/js/views/configuration/metadata.jade | 83 +++--- .../main/js/views/configuration/sidebar.jade | 38 +-- .../main/js/views/configuration/summary.jade | 125 ++++---- .../src/main/js/views/index.jade | 24 +- .../src/main/js/views/login.jade | 1 + .../src/main/js/views/reset.jade | 1 + .../src/main/js/views/settings/admin.jade | 74 +++-- .../src/main/js/views/settings/profile.jade | 79 +++-- .../src/main/js/views/sql/sql.jade | 294 +++++++++---------- .../main/js/views/templates/batch-confirm.jade | 2 +- .../src/main/js/views/templates/layout.jade | 50 ---- 20 files changed, 478 insertions(+), 546 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/6699b1e9/modules/control-center-web/src/main/js/app/index.js ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/app/index.js b/modules/control-center-web/src/main/js/app/index.js index 07d790d..8c68968 100644 --- a/modules/control-center-web/src/main/js/app/index.js +++ b/modules/control-center-web/src/main/js/app/index.js @@ -65,7 +65,7 @@ import './modules/states/admin/index' // ignite:modules import './modules/navbar/main' import './modules/userbar/main' -import './modules/configuration-sidebar/main' +import './modules/configuration/sidebar/main' // endignite angular @@ -85,7 +85,7 @@ angular // 'ignite-console.navbar', 'ignite-console.userbar', - 'ignite-console.configuration-sidebar' + 'ignite-console.configuration.sidebar' ]) .config(['$stateProvider', '$locationProvider', '$urlRouterProvider', function($stateProvider, $locationProvider, $urlRouterProvider) { // set up the states http://git-wip-us.apache.org/repos/asf/ignite/blob/6699b1e9/modules/control-center-web/src/main/js/app/modules/configuration-sidebar/main.js ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/app/modules/configuration-sidebar/main.js b/modules/control-center-web/src/main/js/app/modules/configuration-sidebar/main.js deleted file mode 100644 index 8d34064..0000000 --- a/modules/control-center-web/src/main/js/app/modules/configuration-sidebar/main.js +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import angular from 'angular' - -angular -.module('ignite-console.configuration.sidebar', [ - -]) -.provider('igniteConfigurationSidebar', function() { - var items = [ - { label: 'Clusters', href: '/configuration/clusters' }, - { label: 'Caches', href: '/configuration/caches' }, - { label: 'Metadata', href: '/configuration/metadata' }, - { label: 'IGFS', href: '/configuration/igfs' } - ]; - - this.push = function(data) { - items.push(data); - }; - - this.$get = [function() { - var r = angular.copy(items); - - r.push({ label: 'Summary', href: '/configuration/summary' }); - - return r; - }] -}) -.directive('igniteConfigurationSidebar', ['igniteConfigurationSidebar', function(igniteConfigurationSidebar) { - function controller() { - var ctrl = this; - - ctrl.items = igniteConfigurationSidebar; - } - - return { - restrict: 'A', - controller: controller, - controllerAs: 'sidebar' - } -}]); http://git-wip-us.apache.org/repos/asf/ignite/blob/6699b1e9/modules/control-center-web/src/main/js/app/modules/configuration/sidebar/main.js ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/app/modules/configuration/sidebar/main.js b/modules/control-center-web/src/main/js/app/modules/configuration/sidebar/main.js new file mode 100644 index 0000000..8d34064 --- /dev/null +++ b/modules/control-center-web/src/main/js/app/modules/configuration/sidebar/main.js @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import angular from 'angular' + +angular +.module('ignite-console.configuration.sidebar', [ + +]) +.provider('igniteConfigurationSidebar', function() { + var items = [ + { label: 'Clusters', href: '/configuration/clusters' }, + { label: 'Caches', href: '/configuration/caches' }, + { label: 'Metadata', href: '/configuration/metadata' }, + { label: 'IGFS', href: '/configuration/igfs' } + ]; + + this.push = function(data) { + items.push(data); + }; + + this.$get = [function() { + var r = angular.copy(items); + + r.push({ label: 'Summary', href: '/configuration/summary' }); + + return r; + }] +}) +.directive('igniteConfigurationSidebar', ['igniteConfigurationSidebar', function(igniteConfigurationSidebar) { + function controller() { + var ctrl = this; + + ctrl.items = igniteConfigurationSidebar; + } + + return { + restrict: 'A', + controller: controller, + controllerAs: 'sidebar' + } +}]); http://git-wip-us.apache.org/repos/asf/ignite/blob/6699b1e9/modules/control-center-web/src/main/js/gulpfile.js/tasks/concat.js ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/gulpfile.js/tasks/concat.js b/modules/control-center-web/src/main/js/gulpfile.js/tasks/concat.js index dfb2115..dcd8779 100644 --- a/modules/control-center-web/src/main/js/gulpfile.js/tasks/concat.js +++ b/modules/control-center-web/src/main/js/gulpfile.js/tasks/concat.js @@ -21,7 +21,9 @@ var concat = require('gulp-concat'); paths = [ '!./controllers/common-module.js', './controllers/*.js', - './controllers/**/*.js' + './controllers/**/*.js', + './helpers/generator/*.js', + './helpers/generator/**/*.js' ]; gulp.task('concat', function() { http://git-wip-us.apache.org/repos/asf/ignite/blob/6699b1e9/modules/control-center-web/src/main/js/gulpfile.js/tasks/copy.js ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/gulpfile.js/tasks/copy.js b/modules/control-center-web/src/main/js/gulpfile.js/tasks/copy.js index 8956587..07a4cd4 100644 --- a/modules/control-center-web/src/main/js/gulpfile.js/tasks/copy.js +++ b/modules/control-center-web/src/main/js/gulpfile.js/tasks/copy.js @@ -45,8 +45,9 @@ var legacyPaths = [ var igniteModulePaths = [ igniteModules + '/**/main.js', + igniteModules + '/**/app/modules/*.js', + igniteModules + '/**/app/modules/**/*.js', igniteModules + '/**/controllers/*.js', - igniteModules + '/**/generator/*.js', igniteModules + '/**/controllers/models/*.json' ]; http://git-wip-us.apache.org/repos/asf/ignite/blob/6699b1e9/modules/control-center-web/src/main/js/gulpfile.js/tasks/inject-plugins.js ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/gulpfile.js/tasks/inject-plugins.js b/modules/control-center-web/src/main/js/gulpfile.js/tasks/inject-plugins.js index 6a05231..6dad3c3 100644 --- a/modules/control-center-web/src/main/js/gulpfile.js/tasks/inject-plugins.js +++ b/modules/control-center-web/src/main/js/gulpfile.js/tasks/inject-plugins.js @@ -32,7 +32,10 @@ var js_targets = [ ]; var js_sources = [ - './build/ignite_modules/**/main.js' + './build/ignite_modules/**/main.js', + './build/ignite_modules/**/app/modules/*.js', + './build/ignite_modules/**/app/modules/*.js', + './build/ignite_modules/**/app/modules/**/*.js' ]; gulp.task('inject:plugins:html', function() { @@ -55,7 +58,7 @@ gulp.task('inject:plugins:js', function() { endtag: ' /* endignite */', transform: function (filePath, file, i, length) { // return file contents as string - return ", 'ignite-web-console." + filePath.replace(/.*ignite_modules\/([^\/]+).*/mgi, '$1') + "'"; + return ", 'ignite-console." + filePath.replace(/.*ignite_modules\/([^\/]+).*/mgi, '$1') + "'"; } })) .pipe(gulp.dest('./build')); http://git-wip-us.apache.org/repos/asf/ignite/blob/6699b1e9/modules/control-center-web/src/main/js/views/configuration/caches.jade ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/views/configuration/caches.jade b/modules/control-center-web/src/main/js/views/configuration/caches.jade index 42ba4a1..e933f2a 100644 --- a/modules/control-center-web/src/main/js/views/configuration/caches.jade +++ b/modules/control-center-web/src/main/js/views/configuration/caches.jade @@ -16,26 +16,25 @@ include ../includes/controls -block content - .docs-header - h1 Create and Configure Ignite Caches - .docs-body(ng-controller='cachesController') - div(dw-loading='loadingCachesScreen' dw-loading-options='{text: "Loading caches screen...", className: "page-loading-overlay"}') - div(ng-show='ui.ready') - +block-callout('{{screenTip.workflowTitle}}', 'screenTip.workflowContent', '{{screenTip.whatsNextTitle}}', 'screenTip.whatsNextContent') +.docs-header + h1 Create and Configure Ignite Caches +.docs-body(ng-controller='cachesController') + div(dw-loading='loadingCachesScreen' dw-loading-options='{text: "Loading caches screen...", className: "page-loading-overlay"}') + div(ng-show='ui.ready') + +block-callout('{{screenTip.workflowTitle}}', 'screenTip.workflowContent', '{{screenTip.whatsNextTitle}}', 'screenTip.whatsNextContent') + hr + +main-table('Caches:', 'caches', 'cacheName', 'selectItem(row)', '{{$index + 1}}) {{row.name}}, {{row.cacheMode | displayValue:cacheModes:"Cache mode not set"}}, {{row.atomicityMode | displayValue:atomicities:"Cache atomicity not set"}}') + .padding-top-dflt(bs-affix) + .panel-tip-container(data-placement='bottom' bs-tooltip data-title='Create new cache') + button.btn.btn-primary(id='new-item' ng-click='createItem()') Add cache + +save-remove-buttons('cache') hr - +main-table('Caches:', 'caches', 'cacheName', 'selectItem(row)', '{{$index + 1}}) {{row.name}}, {{row.cacheMode | displayValue:cacheModes:"Cache mode not set"}}, {{row.atomicityMode | displayValue:atomicities:"Cache atomicity not set"}}') - .padding-top-dflt(bs-affix) - .panel-tip-container(data-placement='bottom' bs-tooltip data-title='Create new cache') - button.btn.btn-primary(id='new-item' ng-click='createItem()') Add cache + form.form-horizontal(name='ui.inputForm' ng-show='backupItem && tableVisibleRow(displayedRows, selectedItem)' novalidate unsaved-warning-form) + .panel-group(bs-collapse ng-model='panels.activePanels' data-allow-multiple='true') + +groups('general', 'backupItem') + div(ng-show='ui.expanded') + +advanced-options + +groups('advanced', 'backupItem') + +advanced-options + .section(ng-if='ui.expanded') +save-remove-buttons('cache') - hr - form.form-horizontal(name='ui.inputForm' ng-show='backupItem && tableVisibleRow(displayedRows, selectedItem)' novalidate unsaved-warning-form) - .panel-group(bs-collapse ng-model='panels.activePanels' data-allow-multiple='true') - +groups('general', 'backupItem') - div(ng-show='ui.expanded') - +advanced-options - +groups('advanced', 'backupItem') - +advanced-options - .section(ng-if='ui.expanded') - +save-remove-buttons('cache') http://git-wip-us.apache.org/repos/asf/ignite/blob/6699b1e9/modules/control-center-web/src/main/js/views/configuration/clusters.jade ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/views/configuration/clusters.jade b/modules/control-center-web/src/main/js/views/configuration/clusters.jade index 33d0f75..ecb0d4e 100644 --- a/modules/control-center-web/src/main/js/views/configuration/clusters.jade +++ b/modules/control-center-web/src/main/js/views/configuration/clusters.jade @@ -16,26 +16,25 @@ include ../includes/controls -block content - .docs-header - h1 Create and Configure Ignite Clusters - .docs-body(ng-controller='clustersController') - div(dw-loading='loadingClustersScreen' dw-loading-options='{text: "Loading clusters screen...", className: "page-loading-overlay"}') - div(ng-show='ui.ready') - +block-callout('{{screenTip.workflowTitle}}', 'screenTip.workflowContent', '{{screenTip.whatsNextTitle}}', 'screenTip.whatsNextContent') +.docs-header + h1 Create and Configure Ignite Clusters +.docs-body(ng-controller='clustersController') + div(dw-loading='loadingClustersScreen' dw-loading-options='{text: "Loading clusters screen...", className: "page-loading-overlay"}') + div(ng-show='ui.ready') + +block-callout('{{screenTip.workflowTitle}}', 'screenTip.workflowContent', '{{screenTip.whatsNextTitle}}', 'screenTip.whatsNextContent') + hr + +main-table('Clusters:', 'clusters', 'clusterName', 'selectItem(row)', '{{$index + 1}}) {{row.name}}, {{row.discovery.kind | displayValue:discoveries:"Discovery not set"}}') + .padding-top-dflt(bs-affix) + .panel-tip-container(data-placement='bottom' bs-tooltip data-title='Create new cluster') + button.btn.btn-primary(id='new-item' ng-click='createItem()') Add cluster + +save-remove-buttons('cluster') hr - +main-table('Clusters:', 'clusters', 'clusterName', 'selectItem(row)', '{{$index + 1}}) {{row.name}}, {{row.discovery.kind | displayValue:discoveries:"Discovery not set"}}') - .padding-top-dflt(bs-affix) - .panel-tip-container(data-placement='bottom' bs-tooltip data-title='Create new cluster') - button.btn.btn-primary(id='new-item' ng-click='createItem()') Add cluster + form.form-horizontal(name='ui.inputForm' ng-show='backupItem && tableVisibleRow(displayedRows, selectedItem)' novalidate unsaved-warning-form) + .panel-group(bs-collapse ng-model='panels.activePanels' data-allow-multiple='true' ng-click='triggerDigest = true') + +groups('general', 'backupItem') + div(ng-show='ui.expanded') + +advanced-options + +groups('advanced', 'backupItem') + +advanced-options + .section(ng-show='ui.expanded') +save-remove-buttons('cluster') - hr - form.form-horizontal(name='ui.inputForm' ng-show='backupItem && tableVisibleRow(displayedRows, selectedItem)' novalidate unsaved-warning-form) - .panel-group(bs-collapse ng-model='panels.activePanels' data-allow-multiple='true' ng-click='triggerDigest = true') - +groups('general', 'backupItem') - div(ng-show='ui.expanded') - +advanced-options - +groups('advanced', 'backupItem') - +advanced-options - .section(ng-show='ui.expanded') - +save-remove-buttons('cluster') http://git-wip-us.apache.org/repos/asf/ignite/blob/6699b1e9/modules/control-center-web/src/main/js/views/configuration/igfs.jade ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/views/configuration/igfs.jade b/modules/control-center-web/src/main/js/views/configuration/igfs.jade index ef090c2..ec2ed78 100644 --- a/modules/control-center-web/src/main/js/views/configuration/igfs.jade +++ b/modules/control-center-web/src/main/js/views/configuration/igfs.jade @@ -16,26 +16,25 @@ include ../includes/controls -block content - .docs-header - h1 Create and Configure IGFS - .docs-body(ng-controller='igfsController') - div(dw-loading='loadingIgfsScreen' dw-loading-options='{text: "Loading IGFS screen...", className: "page-loading-overlay"}') - div(ng-show='ui.ready') - +block-callout('{{screenTip.workflowTitle}}', 'screenTip.workflowContent', '{{screenTip.whatsNextTitle}}', 'screenTip.whatsNextContent') +.docs-header + h1 Create and Configure IGFS +.docs-body(ng-controller='igfsController') + div(dw-loading='loadingIgfsScreen' dw-loading-options='{text: "Loading IGFS screen...", className: "page-loading-overlay"}') + div(ng-show='ui.ready') + +block-callout('{{screenTip.workflowTitle}}', 'screenTip.workflowContent', '{{screenTip.whatsNextTitle}}', 'screenTip.whatsNextContent') + hr + +main-table('IGFS:', 'igfss', 'igfsName', 'selectItem(row)', '{{$index + 1}}) {{row.name}}') + .padding-top-dflt(bs-affix) + .panel-tip-container(data-placement='bottom' bs-tooltip data-title='Create new IGFS') + button.btn.btn-primary(id='new-item' ng-click='createItem()') Add IGFS + +save-remove-buttons('IGFS') hr - +main-table('IGFS:', 'igfss', 'igfsName', 'selectItem(row)', '{{$index + 1}}) {{row.name}}') - .padding-top-dflt(bs-affix) - .panel-tip-container(data-placement='bottom' bs-tooltip data-title='Create new IGFS') - button.btn.btn-primary(id='new-item' ng-click='createItem()') Add IGFS + form.form-horizontal(name='ui.inputForm' ng-show='backupItem && tableVisibleRow(displayedRows, selectedItem)' novalidate unsaved-warning-form) + .panel-group(bs-collapse ng-model='panels.activePanels' data-allow-multiple='true' ng-click='triggerDigest = true') + +groups('general', 'backupItem') + div(ng-show='ui.expanded') + +advanced-options + +groups('advanced', 'backupItem') + +advanced-options + .section(ng-show='ui.expanded') +save-remove-buttons('IGFS') - hr - form.form-horizontal(name='ui.inputForm' ng-show='backupItem && tableVisibleRow(displayedRows, selectedItem)' novalidate unsaved-warning-form) - .panel-group(bs-collapse ng-model='panels.activePanels' data-allow-multiple='true' ng-click='triggerDigest = true') - +groups('general', 'backupItem') - div(ng-show='ui.expanded') - +advanced-options - +groups('advanced', 'backupItem') - +advanced-options - .section(ng-show='ui.expanded') - +save-remove-buttons('IGFS') http://git-wip-us.apache.org/repos/asf/ignite/blob/6699b1e9/modules/control-center-web/src/main/js/views/configuration/metadata.jade ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/views/configuration/metadata.jade b/modules/control-center-web/src/main/js/views/configuration/metadata.jade index 7f50c9e..e8c114f 100644 --- a/modules/control-center-web/src/main/js/views/configuration/metadata.jade +++ b/modules/control-center-web/src/main/js/views/configuration/metadata.jade @@ -16,47 +16,46 @@ include ../includes/controls -block content - .docs-header - h1 Create and Configure Cache Type Metadata - .docs-body(ng-controller='metadataController') - div(dw-loading='loadingMetadataScreen' dw-loading-options='{text: "Loading metadata screen...", className: "page-loading-overlay"}') - div(ng-show='ui.ready') - +block-callout('{{screenTip.workflowTitle}}', 'screenTip.workflowContent', '{{screenTip.whatsNextTitle}}', 'screenTip.whatsNextContent') - hr - .padding-bottom-dflt(ng-show='metadatas && metadatas.length > 0') - table.links(st-set-filter='metadatasSearch' st-table='displayedRows' st-safe-src='metadatas') - thead +.docs-header + h1 Create and Configure Cache Type Metadata +.docs-body(ng-controller='metadataController') + div(dw-loading='loadingMetadataScreen' dw-loading-options='{text: "Loading metadata screen...", className: "page-loading-overlay"}') + div(ng-show='ui.ready') + +block-callout('{{screenTip.workflowTitle}}', 'screenTip.workflowContent', '{{screenTip.whatsNextTitle}}', 'screenTip.whatsNextContent') + hr + .padding-bottom-dflt(ng-show='metadatas && metadatas.length > 0') + table.links(st-set-filter='metadatasSearch' st-table='displayedRows' st-safe-src='metadatas') + thead + tr + th + .col-sm-8 + .col-sm-5 + lable.labelHeader.labelFormField {{metadataTitle()}} + .col-sm-7 + .pull-right.labelLogin.additional-filter(ng-if='(metadatas | metadatasValidation:false:true).length > 0') + a.labelFormField(ng-if='ui.showValid' ng-click='toggleValid()') Key fields should be configured: {{(displayedRows | metadatasValidation:false:true).length}}  + a.labelFormField(ng-if='!ui.showValid' ng-click='toggleValid()') Show all metadata: {{displayedRows.length}}  + .col-sm-4 + input.form-control.pull-right(type='text' st-search='' placeholder='Filter metadatas...') + tbody tr - th - .col-sm-8 - .col-sm-5 - lable.labelHeader.labelFormField {{metadataTitle()}} - .col-sm-7 - .pull-right.labelLogin.additional-filter(ng-if='(metadatas | metadatasValidation:false:true).length > 0') - a.labelFormField(ng-if='ui.showValid' ng-click='toggleValid()') Key fields should be configured: {{(displayedRows | metadatasValidation:false:true).length}}  - a.labelFormField(ng-if='!ui.showValid' ng-click='toggleValid()') Show all metadata: {{displayedRows.length}}  - .col-sm-4 - input.form-control.pull-right(type='text' st-search='' placeholder='Filter metadatas...') - tbody - tr - td - .scrollable-y(ng-show='(displayedRows | metadatasValidation:ui.showValid:true).length > 0' style='max-height: 200px') - table - tbody - tr(ng-repeat='row in (displayedRows | metadatasValidation:ui.showValid:true) track by row._id') - td - a(ng-class='{active: row._id == selectedItem._id}' ng-click='selectItem(row)') {{$index + 1}}) {{row.valueType}} - label.placeholder(ng-show='(displayedRows | metadatasValidation:ui.showValid:true).length == 0') No metadata found - .padding-top-dflt(bs-affix) - .panel-tip-container(data-placement='bottom' bs-tooltip data-title='Create new metadata') - button.btn.btn-primary(id='new-item' ng-click='createItem()') Add metadata - .panel-tip-container(bs-tooltip data-title='Load new metadata from database' data-placement='bottom') - button.btn.btn-primary(ng-click='showLoadMetadataModal()') Load from database + td + .scrollable-y(ng-show='(displayedRows | metadatasValidation:ui.showValid:true).length > 0' style='max-height: 200px') + table + tbody + tr(ng-repeat='row in (displayedRows | metadatasValidation:ui.showValid:true) track by row._id') + td + a(ng-class='{active: row._id == selectedItem._id}' ng-click='selectItem(row)') {{$index + 1}}) {{row.valueType}} + label.placeholder(ng-show='(displayedRows | metadatasValidation:ui.showValid:true).length == 0') No metadata found + .padding-top-dflt(bs-affix) + .panel-tip-container(data-placement='bottom' bs-tooltip data-title='Create new metadata') + button.btn.btn-primary(id='new-item' ng-click='createItem()') Add metadata + .panel-tip-container(bs-tooltip data-title='Load new metadata from database' data-placement='bottom') + button.btn.btn-primary(ng-click='showLoadMetadataModal()') Load from database + +save-remove-buttons('metadata') + hr + form.form-horizontal(name='ui.inputForm' ng-show='backupItem && tableVisibleRow((displayedRows | metadatasValidation:ui.showValid:true), selectedItem)' novalidate unsaved-warning-form) + .panel-group(bs-collapse ng-model='panels.activePanels' data-allow-multiple='true') + +groups('metadata', 'backupItem') + .section +save-remove-buttons('metadata') - hr - form.form-horizontal(name='ui.inputForm' ng-show='backupItem && tableVisibleRow((displayedRows | metadatasValidation:ui.showValid:true), selectedItem)' novalidate unsaved-warning-form) - .panel-group(bs-collapse ng-model='panels.activePanels' data-allow-multiple='true') - +groups('metadata', 'backupItem') - .section - +save-remove-buttons('metadata') http://git-wip-us.apache.org/repos/asf/ignite/blob/6699b1e9/modules/control-center-web/src/main/js/views/configuration/sidebar.jade ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/views/configuration/sidebar.jade b/modules/control-center-web/src/main/js/views/configuration/sidebar.jade index a8e7129..f20be95 100644 --- a/modules/control-center-web/src/main/js/views/configuration/sidebar.jade +++ b/modules/control-center-web/src/main/js/views/configuration/sidebar.jade @@ -14,27 +14,19 @@ See the License for the specific language governing permissions and limitations under the License. -append scripts - script(src='/data-structures.js') - script(src='/generator/generator-common.js') - script(src='/generator/generator-xml.js') - script(src='/generator/generator-java.js') +.row + .col-xs-3.col-sm-3.col-md-2.border-right.section-left.greedy + .sidebar-nav(bs-affix) + ul.menu(ignite-configuration-sidebar ng-controller='activeLink') + li(ng-repeat='item in sidebar.items') + a(ng-class='{active: isActive("{{::item.href}}$")}' href='{{::item.href}}') + span.fa-stack + i.fa.fa-circle-thin.fa-stack-2x + i.fa.fa-stack-1x {{::$index + 1}} + | {{::item.label}} + ul(ng-if='item.subItems' style='margin-left:30px') + li(ng-repeat='subItem in item.subItems') + a(ng-class='{active: isActive("{{::subItem.href}}")}' href='{{::subItem.href}}') {{::subItem.label}} -block container - .row - .col-xs-3.col-sm-3.col-md-2.border-right.section-left.greedy - .sidebar-nav(bs-affix) - ul.menu(ignite-configuration-sidebar ng-controller='activeLink') - li(ng-repeat='item in sidebar.items') - a(ng-class='{active: isActive("{{::item.href}}$")}' href='{{::item.href}}') - span.fa-stack - i.fa.fa-circle-thin.fa-stack-2x - i.fa.fa-stack-1x {{::$index + 1}} - | {{::item.label}} - ul(ng-if='item.subItems' style='margin-left:30px') - li(ng-repeat='subItem in item.subItems') - a(ng-class='{active: isActive("{{::subItem.href}}")}' href='{{::subItem.href}}') {{::subItem.label}} - - .col-xs-9.col-sm-9.col-md-10.border-left.section-right - .docs-content(ui-view='') - block content + .col-xs-9.col-sm-9.col-md-10.border-left.section-right + .docs-content(ui-view='') http://git-wip-us.apache.org/repos/asf/ignite/blob/6699b1e9/modules/control-center-web/src/main/js/views/configuration/summary.jade ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/views/configuration/summary.jade b/modules/control-center-web/src/main/js/views/configuration/summary.jade index 79c31ed..8efa785 100644 --- a/modules/control-center-web/src/main/js/views/configuration/summary.jade +++ b/modules/control-center-web/src/main/js/views/configuration/summary.jade @@ -14,12 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. -append scripts - script(src='/generator/generator-docker.js') - script(src='/generator/generator-properties.js') - script(src='/generator/generator-pom.js') - script(src='/generator/generator-readme.js') - include ../includes/controls mixin hard-link(ref, txt) @@ -44,72 +38,71 @@ mixin pojos(side) | Include key fields div(ui-ace='{onLoad: aceInit, mode: "java"}' ng-model='config#{side}.pojoClassBody') -block content - .docs-header - h1 Configurations Summary - .docs-body(ng-controller='summaryController' dw-loading='loadingSummaryScreen' dw-loading-options='{text: "Loading summary screen...", className: "page-loading-overlay"}' method='post' action='summary/download') - +block-callout('{{screenTip.workflowTitle}}', 'screenTip.workflowContent', '{{screenTip.whatsNextTitle}}', 'screenTip.whatsNextContent') +.docs-header + h1 Configurations Summary +.docs-body(ng-controller='summaryController' dw-loading='loadingSummaryScreen' dw-loading-options='{text: "Loading summary screen...", className: "page-loading-overlay"}' method='post' action='summary/download') + +block-callout('{{screenTip.workflowTitle}}', 'screenTip.workflowContent', '{{screenTip.whatsNextTitle}}', 'screenTip.whatsNextContent') + hr + .padding-dflt(ng-if='clusters.length == 0') + | You have no clusters configured. Please configure them + a(href='/configuration/clusters') here. + +main-table('Clusters:', 'clusters', 'clusterName', 'selectItem(row)', '{{$index + 1}}) {{row.name}}') + .padding-top-dflt(ng-if='clusters.length > 0' bs-affix) + button.btn.btn-primary(id='download' ng-click='downloadConfiguration()' bs-tooltip data-title='Download configuration' data-placement='bottom') Download hr - .padding-dflt(ng-if='clusters.length == 0') - | You have no clusters configured. Please configure them - a(href='/configuration/clusters') here. - +main-table('Clusters:', 'clusters', 'clusterName', 'selectItem(row)', '{{$index + 1}}) {{row.name}}') - .padding-top-dflt(ng-if='clusters.length > 0' bs-affix) - button.btn.btn-primary(id='download' ng-click='downloadConfiguration()' bs-tooltip data-title='Download configuration' data-placement='bottom') Download - hr - div(ng-show='selectedItem && tableVisibleRow(displayedRows, selectedItem)' role='tab') - .panel-group(bs-collapse ng-init='panels.activePanels=[0,1]' ng-model='panels.activePanels' data-allow-multiple='true') - .panel.panel-default - .panel-heading(role='tab' bs-collapse-toggle) - i.fa(ng-class='panelExpanded(panels, "server") ? "fa-chevron-circle-up" : "fa-chevron-circle-down"') - label Server - .panel-collapse(id='server' role='tabpanel' bs-collapse-target) - .summary-tabs(bs-tabs data-bs-active-pane="tabsServer.activeTab" ng-show='selectedItem' template='configuration/summary-tabs.html') + div(ng-show='selectedItem && tableVisibleRow(displayedRows, selectedItem)' role='tab') + .panel-group(bs-collapse ng-init='panels.activePanels=[0,1]' ng-model='panels.activePanels' data-allow-multiple='true') + .panel.panel-default + .panel-heading(role='tab' bs-collapse-toggle) + i.fa(ng-class='panelExpanded(panels, "server") ? "fa-chevron-circle-up" : "fa-chevron-circle-down"') + label Server + .panel-collapse(id='server' role='tabpanel' bs-collapse-target) + .summary-tabs(bs-tabs data-bs-active-pane="tabsServer.activeTab" ng-show='selectedItem' template='configuration/summary-tabs.html') + div(bs-pane title='XML') + div(ui-ace='{onLoad: aceInit, mode: "xml"}' ng-model='xmlServer') + div(bs-pane title='Java') + .details-row + .col-xs-2.col-sm-2.col-md-1 + label Generate: + .col-xs-4.col-sm-3.col-md-3 + button.select-toggle.form-control(ng-model='configServer.javaClassServer' bs-select bs-options='item.value as item.label for item in javaClassItems' data-sort='false') + div(ui-ace='{onLoad: aceInit, mode: "java"}' ng-model='javaServer') + div(bs-pane title='POM') + div(ui-ace='{onLoad: aceInit, mode: "xml"}' ng-model='pom') + div(bs-pane title='Dockerfile') + .details-row + p + +hard-link('https://docs.docker.com/reference/builder', 'Docker') + | file is a text file with instructions to create Docker image.<br/> + | To build image you have to store following Docker file with your Ignite XML configuration to the same directory.<br> + | Also you could use predefined + +hard-link('https://ignite.apache.org/download.html#docker', 'Apache Ignite docker image') + | . For more information about using Ignite with Docker please read + +hard-link('http://apacheignite.readme.io/docs/docker-deployment', 'documentation') + |. + .col-xs-3.col-sm-2 + label(for='os') Operation System: + .col-xs-5.col-sm-4 + input#os.form-control(type='text' ng-model='configServer.os' placeholder='debian:8' data-min-length='0' data-html='1' data-auto-select='true' bs-typeahead retain-selection bs-options='os for os in oss') + div(ui-ace='{onLoad: aceInit, mode: "dockerfile"}' ng-model='dockerServer') + .panel.panel-default + .panel-heading(role='tab' bs-collapse-toggle) + i.fa(ng-class='panelExpanded(panels, "client") ? "fa-chevron-circle-up" : "fa-chevron-circle-down"') + label Client + .panel-collapse(id='client' role='tabpanel' bs-collapse-target) + div(ng-show='selectedItem') + .details-row(ng-repeat='field in clientFields') + +form-row-custom(['col-xs-4 col-sm-4 col-md-3'], ['col-xs-4 col-sm-4 col-md-3'], 'backupItem') + .summary-tabs(bs-tabs data-bs-active-pane="tabsClient.activeTab" template='configuration/summary-tabs.html') div(bs-pane title='XML') - div(ui-ace='{onLoad: aceInit, mode: "xml"}' ng-model='xmlServer') + div(ui-ace='{onLoad: aceInit, mode: "xml"}' ng-model='xmlClient') div(bs-pane title='Java') .details-row .col-xs-2.col-sm-2.col-md-1 label Generate: .col-xs-4.col-sm-3.col-md-3 - button.select-toggle.form-control(ng-model='configServer.javaClassServer' bs-select bs-options='item.value as item.label for item in javaClassItems' data-sort='false') - div(ui-ace='{onLoad: aceInit, mode: "java"}' ng-model='javaServer') + button.select-toggle.form-control(ng-model='backupItem.javaClassClient' bs-select bs-options='item.value as item.label for item in javaClassItems' data-sort='false') + div(ui-ace='{onLoad: aceInit, mode: "java"}' ng-model='javaClient') div(bs-pane title='POM') div(ui-ace='{onLoad: aceInit, mode: "xml"}' ng-model='pom') - div(bs-pane title='Dockerfile') - .details-row - p - +hard-link('https://docs.docker.com/reference/builder', 'Docker') - | file is a text file with instructions to create Docker image.<br/> - | To build image you have to store following Docker file with your Ignite XML configuration to the same directory.<br> - | Also you could use predefined - +hard-link('https://ignite.apache.org/download.html#docker', 'Apache Ignite docker image') - | . For more information about using Ignite with Docker please read - +hard-link('http://apacheignite.readme.io/docs/docker-deployment', 'documentation') - |. - .col-xs-3.col-sm-2 - label(for='os') Operation System: - .col-xs-5.col-sm-4 - input#os.form-control(type='text' ng-model='configServer.os' placeholder='debian:8' data-min-length='0' data-html='1' data-auto-select='true' bs-typeahead retain-selection bs-options='os for os in oss') - div(ui-ace='{onLoad: aceInit, mode: "dockerfile"}' ng-model='dockerServer') - .panel.panel-default - .panel-heading(role='tab' bs-collapse-toggle) - i.fa(ng-class='panelExpanded(panels, "client") ? "fa-chevron-circle-up" : "fa-chevron-circle-down"') - label Client - .panel-collapse(id='client' role='tabpanel' bs-collapse-target) - div(ng-show='selectedItem') - .details-row(ng-repeat='field in clientFields') - +form-row-custom(['col-xs-4 col-sm-4 col-md-3'], ['col-xs-4 col-sm-4 col-md-3'], 'backupItem') - .summary-tabs(bs-tabs data-bs-active-pane="tabsClient.activeTab" template='configuration/summary-tabs.html') - div(bs-pane title='XML') - div(ui-ace='{onLoad: aceInit, mode: "xml"}' ng-model='xmlClient') - div(bs-pane title='Java') - .details-row - .col-xs-2.col-sm-2.col-md-1 - label Generate: - .col-xs-4.col-sm-3.col-md-3 - button.select-toggle.form-control(ng-model='backupItem.javaClassClient' bs-select bs-options='item.value as item.label for item in javaClassItems' data-sort='false') - div(ui-ace='{onLoad: aceInit, mode: "java"}' ng-model='javaClient') - div(bs-pane title='POM') - div(ui-ace='{onLoad: aceInit, mode: "xml"}' ng-model='pom') - +pojos('Client') + +pojos('Client') http://git-wip-us.apache.org/repos/asf/ignite/blob/6699b1e9/modules/control-center-web/src/main/js/views/index.jade ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/views/index.jade b/modules/control-center-web/src/main/js/views/index.jade index 97f46e2..d6bedca 100644 --- a/modules/control-center-web/src/main/js/views/index.jade +++ b/modules/control-center-web/src/main/js/views/index.jade @@ -22,19 +22,17 @@ html(ng-app='ignite-web-console') meta(http-equiv='content-type' content='text/html; charset=UTF8') title=title - block css - link(rel='stylesheet', href='/app.min.css') - - block scripts - script(src='/common-utils.js') - script(src='/app.min.js') - - // ignite:plugins - // endignite - - script(src='/common-module.js') - script(src='/data-structures.js') - script(src='/all.js') + link(rel='stylesheet', href='/app.min.css') + + script(src='/common-utils.js') + script(src='/app.min.js') + + script(src='/common-module.js') + script(src='/data-structures.js') + script(src='/all.js') + + // ignite:plugins + // endignite body.theme-line.body-overlap.greedy .wrapper(ui-view='') http://git-wip-us.apache.org/repos/asf/ignite/blob/6699b1e9/modules/control-center-web/src/main/js/views/login.jade ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/views/login.jade b/modules/control-center-web/src/main/js/views/login.jade index b33e37b..9af6ab2 100644 --- a/modules/control-center-web/src/main/js/views/login.jade +++ b/modules/control-center-web/src/main/js/views/login.jade @@ -130,6 +130,7 @@ header#header.header a.right.carousel-control(href='#carousel', role='button', data-slide='next') span.fa.fa-chevron-right(aria-hidden='true') span.sr-only Next + include includes/footer http://git-wip-us.apache.org/repos/asf/ignite/blob/6699b1e9/modules/control-center-web/src/main/js/views/reset.jade ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/views/reset.jade b/modules/control-center-web/src/main/js/views/reset.jade index 5f77c81..7f5a98d 100644 --- a/modules/control-center-web/src/main/js/views/reset.jade +++ b/modules/control-center-web/src/main/js/views/reset.jade @@ -41,4 +41,5 @@ header#header.header .col-sm-3 input#user_confirm.form-control(type='password' ng-model='reset_info.confirm' match='reset_info.password' placeholder='Confirm new password' required on-enter='resetForm.$valid && resetPassword(user_info)') button.btn.btn-primary(ng-disabled='resetForm.$invalid' ng-click='resetPassword(reset_info)') Reset Password + include includes/footer http://git-wip-us.apache.org/repos/asf/ignite/blob/6699b1e9/modules/control-center-web/src/main/js/views/settings/admin.jade ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/views/settings/admin.jade b/modules/control-center-web/src/main/js/views/settings/admin.jade index b9c2860..84286a8 100644 --- a/modules/control-center-web/src/main/js/views/settings/admin.jade +++ b/modules/control-center-web/src/main/js/views/settings/admin.jade @@ -12,41 +12,39 @@ See the License for the specific language governing permissions and limitations under the License. -block container - .row(ng-controller='adminController') - .docs-content - .docs-header - h1 List of registered users - hr - .docs-body - table.table.table-striped.admin(st-table='displayedUsers' st-safe-src='users') - thead - tr - th.header(colspan='5') - .col-sm-2.pull-right - input.form-control(type='text' st-search='' placeholder='Filter users...') - tr - th(st-sort='username') User name - th(st-sort='email') Email - th.col-sm-2(st-sort='lastLogin') Last login - th(width='1%' st-sort='admin') Admin - th(width='1%') Actions - tbody - tr(ng-repeat='row in displayedUsers') - td {{row.username}} - td - a(ng-href='mailto:{{row.email}}') {{row.email}} - td - span {{row.lastLogin | date:'medium'}} - td(style='text-align: center;') - input(type='checkbox' ng-disabled='row.adminChanging || row._id == user._id' - ng-model='row.admin' ng-change='toggleAdmin(row)') - td(style='text-align: center;') - div(ng-show='row._id != user._id') - i.fa.fa-remove(ng-click='removeUser(row)' bs-tooltip data-title='Remove user') - i.fa.fa-eye(ng-click='becomeUser(row)' style='margin-left: 5px' bs-tooltip data-title='Become this user') - tfoot - tr - td.text-right(colspan='5') - div(st-pagination st-items-by-page='15' st-displayed-pages='5') - +.row(ng-controller='adminController') + .docs-content + .docs-header + h1 List of registered users + hr + .docs-body + table.table.table-striped.admin(st-table='displayedUsers' st-safe-src='users') + thead + tr + th.header(colspan='5') + .col-sm-2.pull-right + input.form-control(type='text' st-search='' placeholder='Filter users...') + tr + th(st-sort='username') User name + th(st-sort='email') Email + th.col-sm-2(st-sort='lastLogin') Last login + th(width='1%' st-sort='admin') Admin + th(width='1%') Actions + tbody + tr(ng-repeat='row in displayedUsers') + td {{row.username}} + td + a(ng-href='mailto:{{row.email}}') {{row.email}} + td + span {{row.lastLogin | date:'medium'}} + td(style='text-align: center;') + input(type='checkbox' ng-disabled='row.adminChanging || row._id == user._id' + ng-model='row.admin' ng-change='toggleAdmin(row)') + td(style='text-align: center;') + div(ng-show='row._id != user._id') + i.fa.fa-remove(ng-click='removeUser(row)' bs-tooltip data-title='Remove user') + i.fa.fa-eye(ng-click='becomeUser(row)' style='margin-left: 5px' bs-tooltip data-title='Become this user') + tfoot + tr + td.text-right(colspan='5') + div(st-pagination st-items-by-page='15' st-displayed-pages='5') http://git-wip-us.apache.org/repos/asf/ignite/blob/6699b1e9/modules/control-center-web/src/main/js/views/settings/profile.jade ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/views/settings/profile.jade b/modules/control-center-web/src/main/js/views/settings/profile.jade index 7f76ed7..dffb333 100644 --- a/modules/control-center-web/src/main/js/views/settings/profile.jade +++ b/modules/control-center-web/src/main/js/views/settings/profile.jade @@ -17,47 +17,46 @@ mixin lbl(txt) label.col-sm-2.required.labelFormField #{txt} -block container - .row(ng-controller='profileController') - .docs-content - .docs-header - h1 User profile - hr - .docs-body - form.form-horizontal(name='profileForm' novalidate) - .col-sm-10(style='padding: 0') +.row(ng-controller='profileController') + .docs-content + .docs-header + h1 User profile + hr + .docs-body + form.form-horizontal(name='profileForm' novalidate) + .col-sm-10(style='padding: 0') + .details-row + +lbl('User name:') + .col-xs-5.col-sm-4 + input.form-control(id='profile-username' type='text' ng-model='profileUser.username' placeholder='Input name' required auto-focus) + .details-row + +lbl('Email:') + .col-xs-5.col-sm-4 + input.form-control(id='profile-email' type='email' ng-model='profileUser.email' placeholder='[email protected]' required) + .details-row + .advanced-options + i.fa.fa-chevron-circle-up(ng-show='profileUser.showToken' ng-click='profileUser.showToken = ! profileUser.showToken') + i.fa.fa-chevron-circle-down(ng-show='!profileUser.showToken' ng-click='profileUser.showToken = ! profileUser.showToken') + a(ng-click='profileUser.showToken = ! profileUser.showToken') {{profileUser.showToken ? 'Hide security token...' : 'Show security token...'}} + .details-row(ng-show='profileUser.showToken') + +lbl('Security token:') + label {{profileUser.token}} + i.tipLabel.fa.fa-refresh(ng-click='generateToken()' bs-tooltip data-title='Generate random security token') + i.tipLabel.fa.fa-clipboard(ng-click-copy='{{profileUser.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.fa-chevron-circle-up(ng-show='profileUser.changePassword' ng-click='profileUser.changePassword = ! profileUser.changePassword') + i.fa.fa-chevron-circle-down(ng-show='!profileUser.changePassword' ng-click='profileUser.changePassword = ! profileUser.changePassword') + a(ng-click='profileUser.changePassword = ! profileUser.changePassword') {{profileUser.changePassword ? 'Cancel password changing...' : 'Change password...'}} + div(ng-if='profileUser.changePassword') .details-row - +lbl('User name:') + +lbl('New password:') .col-xs-5.col-sm-4 - input.form-control(id='profile-username' type='text' ng-model='profileUser.username' placeholder='Input name' required auto-focus) + input.form-control(type='password' ng-model='profileUser.newPassword' placeholder='New password' ng-required='profileUser.changePassword') .details-row - +lbl('Email:') + +lbl('Confirm:') .col-xs-5.col-sm-4 - input.form-control(id='profile-email' type='email' ng-model='profileUser.email' placeholder='[email protected]' required) - .details-row - .advanced-options - i.fa.fa-chevron-circle-up(ng-show='profileUser.showToken' ng-click='profileUser.showToken = ! profileUser.showToken') - i.fa.fa-chevron-circle-down(ng-show='!profileUser.showToken' ng-click='profileUser.showToken = ! profileUser.showToken') - a(ng-click='profileUser.showToken = ! profileUser.showToken') {{profileUser.showToken ? 'Hide security token...' : 'Show security token...'}} - .details-row(ng-show='profileUser.showToken') - +lbl('Security token:') - label {{profileUser.token}} - i.tipLabel.fa.fa-refresh(ng-click='generateToken()' bs-tooltip data-title='Generate random security token') - i.tipLabel.fa.fa-clipboard(ng-click-copy='{{profileUser.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.fa-chevron-circle-up(ng-show='profileUser.changePassword' ng-click='profileUser.changePassword = ! profileUser.changePassword') - i.fa.fa-chevron-circle-down(ng-show='!profileUser.changePassword' ng-click='profileUser.changePassword = ! profileUser.changePassword') - a(ng-click='profileUser.changePassword = ! profileUser.changePassword') {{profileUser.changePassword ? 'Cancel password changing...' : 'Change password...'}} - div(ng-if='profileUser.changePassword') - .details-row - +lbl('New password:') - .col-xs-5.col-sm-4 - input.form-control(type='password' ng-model='profileUser.newPassword' placeholder='New password' ng-required='profileUser.changePassword') - .details-row - +lbl('Confirm:') - .col-xs-5.col-sm-4 - input.form-control(type='password' ng-model='profileUser.confirmPassword' match='profileUser.newPassword' placeholder='Confirm new password' ng-required='profileUser.changePassword') - .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 + input.form-control(type='password' ng-model='profileUser.confirmPassword' match='profileUser.newPassword' placeholder='Confirm new password' ng-required='profileUser.changePassword') + .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
