You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by an...@apache.org on 2015/07/10 13:10:33 UTC

[1/2] incubator-ignite git commit: # ignite-843 Refactor.

Repository: incubator-ignite
Updated Branches:
  refs/heads/ignite-843 3c2cfe555 -> 181fd9858


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/181fd985/modules/web-control-center/nodejs/views/settings/admin.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/views/settings/admin.jade b/modules/web-control-center/nodejs/views/settings/admin.jade
new file mode 100644
index 0000000..1986ca2
--- /dev/null
+++ b/modules/web-control-center/nodejs/views/settings/admin.jade
@@ -0,0 +1,52 @@
+//-
+    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.
+extends ../templates/layout
+
+append scripts
+    script(src='/admin-controller.js')
+
+block container
+    .greedy.row(ng-controller='adminController')
+        .docs-content
+            .docs-header
+                h1 List of registered users
+                hr
+            .docs-body
+                table.table.table-striped(st-table='userListDisplay' st-safe-src='userList')
+                    thead
+                        tr
+                            th(colspan='5')
+                                input.form-control(type='text' st-search='' class='' placeholder='Search ...')
+                        tr
+                            th(st-sort='username') User name
+                            th(st-sort='email') Email
+                            th(st-sort='lastLogin') Last login
+                            th(st-sort='lastLogin') Admin
+                            th(colspan='2') Actions
+                    tbody
+                        tr(ng-repeat='user in userListDisplay')
+                            td {{user.username}}
+                            td
+                                a(ng-href='mailto:{{user.email}}') {{user.email}}
+                            td
+                                span.small {{user.lastLogin | date:'medium'}}
+                            td
+                                input(type='checkbox' ng-disabled='user.adminChanging || user._id == loggedInUser._id'
+                                ng-model='user.admin' ng-change='toggleAdmin(user)')
+                            td(width='1%')
+                                a(ng-click='removeUser(user)' ng-show='user._id != loggedInUser._id' title='Remove user')
+                                    span.glyphicon.glyphicon-remove(style='color: red')
+                            td(width='1%')
+                                a(ng-href='admin/become?viewedUserId={{user._id}}' ng-show='user._id != loggedInUser._id' title='View user\'s configurations')
+                                    span.glyphicon.glyphicon-eye-open

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/181fd985/modules/web-control-center/nodejs/views/settings/profile.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/views/settings/profile.jade b/modules/web-control-center/nodejs/views/settings/profile.jade
new file mode 100644
index 0000000..14a8bb5
--- /dev/null
+++ b/modules/web-control-center/nodejs/views/settings/profile.jade
@@ -0,0 +1,58 @@
+//-
+    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.
+
+extends ../templates/layout
+
+mixin lbl(txt)
+    label.col-sm-2.required.labelFormField #{txt}
+
+append scripts
+    script(src='/profile-controller.js')
+
+block container
+    .row.greedy(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-sm-4
+                                input.form-control(type='text' ng-model='profileUser.username' placeholder='Input name' required)
+                        .details-row
+                            +lbl('Email:')
+                            .col-sm-4
+                                input.form-control(type='email' ng-model='profileUser.email' placeholder='you@domain.com' required)
+                        .details-row
+                            .checkbox
+                                label
+                                    input(type="checkbox" ng-model='profileUser.changePassword')
+                                    | Change password
+                        div(ng-show='profileUser.changePassword')
+                            .details-row
+                                +lbl('New password:')
+                                .col-sm-4
+                                    input.form-control(type='password', ng-model='profileUser.newPassword' placeholder='New password' ng-required='profileUser.changePassword')
+                            .details-row
+                                +lbl('Confirm:')
+                                .col-sm-4
+                                    input.form-control(type='password', ng-model='profileUser.confirmPassword' match='profileUser.newPassword' placeholder='Confirm new password' ng-required='profileUser.changePassword')
+                    .col-sm-12.details-row
+                        button#save-btn.btn.btn-primary(ng-disabled='profileForm.$invalid' ng-click='saveUser()') Save
+

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/181fd985/modules/web-control-center/nodejs/views/sql.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/views/sql.jade b/modules/web-control-center/nodejs/views/sql.jade
deleted file mode 100644
index 93e2893..0000000
--- a/modules/web-control-center/nodejs/views/sql.jade
+++ /dev/null
@@ -1,23 +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.
-
-extends templates/layout
-
-block container
-    .docs-header
-        h1 SQL
-        p Connect to Zeppelin and execute SQL queries.
-        hr

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/181fd985/modules/web-control-center/nodejs/views/sql/sql.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/views/sql/sql.jade b/modules/web-control-center/nodejs/views/sql/sql.jade
index e575676..ea989e0 100644
--- a/modules/web-control-center/nodejs/views/sql/sql.jade
+++ b/modules/web-control-center/nodejs/views/sql/sql.jade
@@ -12,7 +12,7 @@
     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.
-extends ../templates/layout-fluid
+extends ../templates/layout-sidebar
 
 append scripts
     script(src='/cache-viewer-controller.js')
@@ -22,6 +22,9 @@ append css
     link(rel='stylesheet', href='/stylesheets/sql-console.css')
 
 block container
+    .docs-header
+        h1 Connect to Ignite and execute SQL queries
+        hr
     div.greedy(ng-controller='cacheViewerController')
         h4 Sql console
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/181fd985/modules/web-control-center/nodejs/views/summary.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/views/summary.jade b/modules/web-control-center/nodejs/views/summary.jade
deleted file mode 100644
index 12c98ec..0000000
--- a/modules/web-control-center/nodejs/views/summary.jade
+++ /dev/null
@@ -1,95 +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.
-
-extends templates/layout-sidebar
-
-append scripts
-    script(src='/summary-controller.js')
-
-    script(src='//cdnjs.cloudflare.com/ajax/libs/SyntaxHighlighter/3.0.83/scripts/shCore.min.js')
-    script(src='//cdnjs.cloudflare.com/ajax/libs/SyntaxHighlighter/3.0.83/scripts/shBrushXml.js')
-    script(src='//cdnjs.cloudflare.com/ajax/libs/SyntaxHighlighter/3.0.83/scripts/shBrushJava.js')
-    script(src='//cdnjs.cloudflare.com/ajax/libs/SyntaxHighlighter/3.0.83/scripts/shBrushPlain.js')
-    script(src="//cdn.jsdelivr.net/angularjs/1.3.15/angular-animate.min.js")
-    script(src="//cdn.jsdelivr.net/angularjs/1.3.15/angular-sanitize.min.js")
-
-append css
-    link(rel='stylesheet', href='//cdnjs.cloudflare.com/ajax/libs/SyntaxHighlighter/3.0.83/styles/shCore.css')
-    link(rel='stylesheet', href='//cdnjs.cloudflare.com/ajax/libs/SyntaxHighlighter/3.0.83/styles/shThemeDefault.css')
-
-block content
-    .docs-header
-        h1 Configurations summary
-        hr
-    .docs-body(ng-controller='summaryController')
-        div(ng-show='clusters.length == 0')
-            | No cluster configured. You can 
-            a(href='clusters') configure
-            |  it.
-        div(ng-show='clusters.length > 0')
-            p Following cluster configurations were created, you can download them as XML, java code or as docker file.
-            .links
-                table.col-sm-12(st-table='clusters')
-                    tbody
-                        tr(ng-repeat='row in clusters track by row._id')
-                            td.col-sm-6(ng-class='{active: row._id == selectedItem._id}')
-                                a(ng-click='generate(row)') {{$index + 1}}) {{row.name}}
-            #cfgResult.configBox(ng-show='selectedItem && !generateError && !loading', style='margin-top: 20px')
-                ul.nav.nav-tabs
-                    li(ng-class='{active: cfgLang == "xml"}')
-                        a(href, ng-click='cfgLang = "xml"')
-                            img(src='/images/xml.png', width='16px' height='16px')
-                            |  XML
-                    li(ng-class='{active: cfgLang=="java"}')
-                        a(href, ng-click='cfgLang = "java"')
-                            img(src='/images/java.png', width='16px' height='16px')
-                            |  Java
-                    li(ng-class="{active: cfgLang=='docker'}")
-                        a(href, ng-click='cfgLang = "docker"')
-                            img(src='/images/docker.png', width='16px' height='16px')
-                            |  Dockerfile
-                form.settings-row(method='post' action='summary/download')
-                    input(type="hidden" name="_id" value="{{selectedItem._id}}")
-                    input(type="hidden" name="javaClass" value="{{javaClass}}")
-                    input(type="hidden" name="os" value="{{os}}")
-
-                    #xmlResult(ng-show="cfgLang == 'xml'")
-                        button.btn.btn-primary.pull-right(style='margin-right: 0px;margin-top: -45px' type='submit') Download
-                        #xmlResultDiv
-                    #javaResult(ng-show="cfgLang == 'java'")
-                        .col-sm-1
-                            label Generate:
-                        .col-sm-3
-                            button.form-control(type='button' ng-model='javaClass' bs-select data-placeholder='{{detail.placeholder}}' bs-options='item.value as item.label for item in javaClassItems' data-sort='false')
-                        button.btn.btn-primary.pull-right(style='margin-right: 0px;margin-top: -40px' type='submit') Download
-                        #javaResultDiv
-                    #dockerResult(ng-show="cfgLang == 'docker'")
-                        button.btn.btn-primary.pull-right(style='margin-right: 0px;margin-top: -40px' type='submit') Download
-                        p
-                            a(style='color:#ec1c24' href='https://docs.docker.com/reference/builder' target="_blank") Docker
-                            | &nbsp;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&nbsp;
-                            a(style='color:#ec1c24' href='https://ignite.incubator.apache.org/download.html#docker' target="_blank") Apache Ignite docker image
-                            | . For more information about using Ignite with Docker please read&nbsp;
-                            a(style='color:#ec1c24' href='http://apacheignite.readme.io/docs/docker-deployment' target="_blank") documentation
-                            |.
-                        .col-sm-2
-                            label(for='os') Operation System:
-                        .col-sm-4
-                            input#os.form-control(type='text', ng-model='os' placeholder='debian:8' data-min-length="0" data-html="1" data-auto-select="true" data-animation="am-flip-x" bs-typeahead bs-options='os for os in oss')
-                        .settings-row#dockerResultDiv(style='margin-top: 15px')
-                div(ng-show='generateError') {{generateError}}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/181fd985/modules/web-control-center/nodejs/views/templates/layout-fluid.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/views/templates/layout-fluid.jade b/modules/web-control-center/nodejs/views/templates/layout-fluid.jade
deleted file mode 100644
index 66670cb..0000000
--- a/modules/web-control-center/nodejs/views/templates/layout-fluid.jade
+++ /dev/null
@@ -1,22 +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.
-
-extends headers
-
-block main-container
-    .container-fluid.body-container
-        .main-content
-            block container


[2/2] incubator-ignite git commit: # ignite-843 Refactor.

Posted by an...@apache.org.
# ignite-843 Refactor.


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

Branch: refs/heads/ignite-843
Commit: 181fd98583900ea742eea85066c1ed14e34fae6b
Parents: 3c2cfe5
Author: Andrey <an...@gridgain.com>
Authored: Fri Jul 10 18:10:49 2015 +0700
Committer: Andrey <an...@gridgain.com>
Committed: Fri Jul 10 18:10:49 2015 +0700

----------------------------------------------------------------------
 .../nodejs/public/stylesheets/style.css         |   2 +-
 .../nodejs/public/stylesheets/style.less        |   5 +-
 .../web-control-center/nodejs/routes/admin.js   |   2 +-
 .../web-control-center/nodejs/routes/caches.js  |   2 +-
 .../nodejs/routes/clusters.js                   |   2 +-
 .../nodejs/routes/persistences.js               |   2 +-
 .../web-control-center/nodejs/routes/profile.js |   2 +-
 .../web-control-center/nodejs/routes/summary.js |   2 +-
 .../nodejs/views/admin/userList.jade            |  52 ---------
 .../web-control-center/nodejs/views/caches.jade |  67 -----------
 .../nodejs/views/clients.jade                   |  26 -----
 .../nodejs/views/clusters.jade                  |  70 ------------
 .../nodejs/views/configuration/caches.jade      |  67 +++++++++++
 .../nodejs/views/configuration/clusters.jade    |  70 ++++++++++++
 .../nodejs/views/configuration/persistence.jade | 114 +++++++++++++++++++
 .../nodejs/views/configuration/summary.jade     |  95 ++++++++++++++++
 .../nodejs/views/includes/controls.jade         |   6 +-
 .../nodejs/views/includes/header.jade           |   4 +-
 .../nodejs/views/persistence.jade               | 114 -------------------
 .../nodejs/views/profile.jade                   |  58 ----------
 .../nodejs/views/settings/admin.jade            |  52 +++++++++
 .../nodejs/views/settings/profile.jade          |  58 ++++++++++
 .../web-control-center/nodejs/views/sql.jade    |  23 ----
 .../nodejs/views/sql/sql.jade                   |   5 +-
 .../nodejs/views/summary.jade                   |  95 ----------------
 .../nodejs/views/templates/layout-fluid.jade    |  22 ----
 26 files changed, 476 insertions(+), 541 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/181fd985/modules/web-control-center/nodejs/public/stylesheets/style.css
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/public/stylesheets/style.css b/modules/web-control-center/nodejs/public/stylesheets/style.css
index a7f554f..ce05c3a 100644
--- a/modules/web-control-center/nodejs/public/stylesheets/style.css
+++ b/modules/web-control-center/nodejs/public/stylesheets/style.css
@@ -1 +1 @@
-.main-header .logo{height:auto}.main-sidebar{padding-top:60px}.navbar-default .navbar-brand,.navbar-default .navbar-brand:hover{position:absolute;width:100%;left:0;text-align:center}.modal-backdrop.am-fade{opacity:.5;transition:opacity .15s linear}.modal-backdrop.am-fade.ng-enter{opacity:0}.modal-backdrop.am-fade.ng-enter.ng-enter-active{opacity:.5}.modal-backdrop.am-fade.ng-leave{opacity:.5}.modal-backdrop.am-fade.ng-leave.ng-leave-active{opacity:0}.modal.center .modal-dialog{position:fixed;top:40%;left:50%;min-width:320px;max-width:630px;width:50%;transform:translateX(-50%) translateY(-50%)}.border-left{box-shadow:1px 0 0 0 #eee inset}.border-right{box-shadow:1px 0 0 0 #eee}.theme-line{background-color:#f9f9f9}.theme-line header{background-color:#fff}.theme-line header a.btn{border:0 none;padding:10px 25px;background-color:rgba(0,0,0,0.15)}.theme-line header a.btn:hover{background-color:rgba(0,0,0,0.25)}.theme-line header a.btn.btn-link{background:transparent;color:rgba(255,255,25
 5,0.8)}.theme-line header a.btn.btn-link:hover{color:#fff;text-decoration:none}.theme-line .navbar-nav a{background-color:transparent}.theme-line .navbar-nav a:hover,.theme-line .navbar-nav a:active,.theme-line .navbar-nav a:focus{background-color:transparent}.theme-line .main-links{padding-top:50px}.theme-line .main-links h3{margin-top:0;font-size:17px}.theme-line .main-links .links a{color:#888}.theme-line .main-links .links a:hover{text-decoration:none}.theme-line #category-columns,.theme-solid #category-columns{margin:50px 30px 0}.theme-line #category-columns h4{text-transform:uppercase;font-weight:300;color:#999;font-size:14px}.theme-line #category-columns ul{list-style:none;padding:0;margin-bottom:15px}.theme-line #category-columns ul li a{padding:4px 0;display:block;font-size:16px}.theme-line #category-columns ul .view-all{font-size:0.85em}.theme-line .docs-header{color:#999;overflow:hidden}.theme-line .docs-header h1{color:#444;margin-top:0;font-size:22px}.theme-line .btn-pr
 imary{border:0 none;background-color:#ec1c24}.theme-line .btn-primary:hover{background-color:#950d12}.theme-line .main-content .nav-horizontal a{box-shadow:0 0;border:0 none;background-color:#fff;border-radius:0;color:#aaa;padding:6px;margin:0 14px}.theme-line .main-content .nav-horizontal a:hover{color:#999;border-bottom:4px solid #ddd}.theme-line .main-content .nav-horizontal a.active{border-bottom:4px solid #888}.theme-line ul li>a.active{cursor:default;pointer-events:none}.theme-line .sidebar-nav{color:#474a54;padding-bottom:30px}.theme-line .sidebar-nav ul{padding:0;list-style:none;font-size:14px;margin:3px 0 0}.theme-line .sidebar-nav ul li{color:#666;line-height:28px}.theme-line .sidebar-nav ul li span.fa-stack{margin-right:5px;font-size:12px;height:26px}.theme-line .sidebar-nav ul li a{font-size:18px;color:#666;position:relative;white-space:nowrap;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis}.theme-line .sidebar-nav ul li a:hover{text-decoration:none}.the
 me-line .select li a,.theme-line .typeahead li a{color:#666;background-color:transparent}.theme-line .select li a:hover,.theme-line .typeahead li a:hover{color:#ec1c24;background-color:transparent}.theme-line .select .active,.theme-line .typeahead .active{background-color:#eee}.theme-line .sidebar-nav ul li .subcategory{padding-left:15px}.theme-line .sidebar-nav h4{margin-top:2em;font-weight:normal;text-transform:uppercase;font-size:11px;margin-bottom:10px;color:#bbb}.theme-line .sidebar-nav h4:first-child{margin-top:0}.theme-line .sidebar-nav .ask{width:100%;text-align:center;padding:10px}.theme-line .border-left .sidebar-nav{padding-left:15px}.theme-line .suggest{padding:4px;display:inline-block;font-size:12px}.header{padding:15px}.header .has-github{padding-right:136px}.header h1.navbar-brand{height:40px;width:200px;padding:0;margin:5px 15px 0 0}.header h1.navbar-brand a{text-indent:-99999px;background:no-repeat center center;display:block;width:100%;height:100%;background-size:c
 ontain}.header .nav.navbar-nav.pull-right{position:relative;right:-30px}.header .nav.navbar-nav .not-link{padding:15px;display:inline-block}.header .nav.navbar-nav .stable,.header .nav.navbar-nav .beta,.header .nav.navbar-nav .private{font-size:9px;padding:3px 5px;display:inline-block;line-height:8px;border-radius:3px;margin-left:6px;color:#fff;top:-2px;position:relative;opacity:0.6;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=60)";filter:alpha(opacity=60)}.header .nav.navbar-nav a:hover>.stable,.header .nav.navbar-nav a:hover>.beta,.header .nav.navbar-nav a:hover>.private{opacity:1;-ms-filter:none;filter:none}.header .nav.navbar-nav .beta{background-color:#59c3d1}.header .nav.navbar-nav .stable{background-color:#41b841}.header .nav.navbar-nav .private{background-color:#333}.theme-line header{border-bottom:8px solid}.theme-line header h2{color:#aaa}.theme-line header p{color:#666}.theme-line header{border-bottom-color:#ec1c24}.theme-line .navbar-nav{color:#888}.theme-
 line .navbar-nav a{color:#bbb}.theme-line header a.btn{background-color:#ec1c24}.theme-line header a.btn:hover{background-color:#950d12}.theme-line header .navbar-nav .tt-cursor{background-color:#ec1c24}.theme-line header .navbar-nav a:hover,.theme-line header .navbar-nav .open>a{color:#ec1c24}.theme-line .navbar-nav .active a{color:#ec1c24}.theme-line .navbar-nav .active a:hover{color:#950d12}.theme-line .main-links .links a:hover{color:#ec1c24}.theme-line .main-content a{color:#666}.theme-line .main-content a:hover{color:#950d12}.theme-line .sidebar-nav ul li a.active:before{background-color:#ec1c24}.theme-line .sidebar-nav ul li a.active{color:#ec1c24}.theme-line .sidebar-nav ul li a:hover,.theme-line .sidebar-nav ul li a.active:hover{color:#950d12}.theme-line .main-content .nav-horizontal a.active{border-color:#ec1c24;color:#ec1c24}.theme-line .main-content .nav-horizontal a:hover{color:#950d12}.theme-line .main-content .nav-horizontal a.active:hover{border-color:#950d12}.theme-
 line header .navbar-nav a.active,.theme-line #versions-list li a:hover strong,.theme-line #versions-list li a.active .current,.theme-line #versions-list li a:active .current{color:#ec1c24}.theme-line header .navbar-nav a{font-size:18px}.theme-line.body-threes .section-right .threes-nav .btn-default:hover,.theme-line.page-docs.body-threes .section-right .threes-nav .pull-right a:hover{color:#ec1c24;border-color:#ec1c24}.theme-line .section-right{padding-left:30px}.body-overlap .main-content{margin-top:30px}.body-box .main-content,.body-overlap .main-content{padding:30px;box-shadow:0 0 0 1px rgba(0,0,0,0.1);background-color:#fff}body{font-weight:400;font-family:Roboto Slab, serif}h1,h2,h3,h4,h5,h6{font-weight:700;font-family:Roboto Slab, serif}.submit-vote.submit-vote-parent.voted a.submit-vote-button,.submit-vote.submit-vote-parent a.submit-vote-button:hover{background-color:#ec1c24}div.submit-vote.submit-vote-parent.voted a.submit-vote-button:hover{background-color:#950d12}a,.link .
 title{color:#ec1c24}a:hover,.link:hover .title{color:#950d12}.header h1.navbar-brand a{background-image:url("https://www.filepicker.io/api/file/QagunjDGRFul2JgNCAli")}.header h1.navbar-brand{width:96px}.block-edit-parameters{text-align:right;padding-bottom:5px}.container-footer{margin-top:20px}.modal{display:block;overflow:hidden}.modal .close{position:absolute;top:0.65em;right:0.65em;float:none}.modal-header .close{margin-right:-2px}.modal .modal-dialog{width:610px}.modal .modal-content{border-radius:0;background-color:#f7f7f7}.modal .modal-content .modal-header{background-color:#fff;text-align:center;color:#555;padding:24px;font-family:"myriad-pro",sans-serif}.modal .modal-content .modal-header h4{font-family:"myriad-pro",sans-serif;font-size:22px}.modal .modal-content .modal-header h4 .fa{display:block;font-size:41px;color:#ddd;margin-bottom:5px}.modal .modal-content .modal-header p{color:#aaa;font-size:1em;margin:3px 0 0}.modal .modal-content .modal-spacer{padding:10px 10px 0 10
 px}.modal .modal-content .modal-footer{margin-top:0}.modal-body{padding-top:15px}h1.ignite-logo{background-image:url("https://www.filepicker.io/api/file/QagunjDGRFul2JgNCAli")}.block-display-image img{max-width:100%;max-height:450px;margin:auto;display:block}.greedy{min-height:200px;height:calc(100vh - 230px)}@media (min-width:768px){.navbar-nav>li>a{padding-top:18px;padding-bottom:10px}}.details-row{padding:0 0.65em}.details-row,.settings-row{display:block;margin:0.65em 0;line-height:28px}.details-row [class*="col-"],.settings-row [class*="col-"]{display:inline-block;vertical-align:middle;float:none;padding-left:0 !important;padding-right:0 !important}.details-row input[type="checkbox"],.settings-row input[type="checkbox"]{line-height:20px;margin-right:4px}.details-row .checkbox label,.settings-row .checkbox label{line-height:20px;vertical-align:middle}button{margin-right:4px}h1,h2,h3{user-select:none;font-weight:normal;line-height:1}h3{color:black;font-size:1.2em;margin-top:0;marg
 in-bottom:1.5em}table tr:hover{cursor:pointer}.form-control{display:inline-block;text-align:left;padding:3px 3px;height:28px}.form-control button{text-align:left}.table-form-control{width:auto}button .caret{float:right;margin-left:0;margin-top:7px}.theme-line .panel-heading{padding:10px 10px;margin:0}.theme-line .panel-heading h3{margin-bottom:0}.theme-line .panel-heading h3>a{color:black}.theme-line .panel-title a{color:#ec1c24}.theme-line .panel-title h3{margin-bottom:1.3em}.theme-line .panel-body{padding:0.65em 1.3em}.theme-line .main-content a.customize{margin-left:5px;color:#ec1c24}.theme-line .panel-collapse{margin:0}.theme-line .links table,.theme-line table.links-edit,.theme-line table.links-edit-details,.theme-line table.links-edit-small-padding{display:table;table-layout:fixed;margin-bottom:20px}.theme-line .links table td,.theme-line table.links-edit td,.theme-line table.links-edit-details td,.theme-line table.links-edit-small-padding td{padding-left:18px}.theme-line .lin
 ks table .active a,.theme-line table.links-edit .active a,.theme-line table.links-edit-details .active a,.theme-line table.links-edit-small-padding .active a{color:#ec1c24;font-weight:bold}.theme-line .links table a:hover,.theme-line table.links-edit a:hover,.theme-line table.links-edit-details a:hover,.theme-line table.links-edit-small-padding a:hover{color:#950d12}.theme-line .links table a,.theme-line table.links-edit a,.theme-line table.links-edit-details a,.theme-line table.links-edit-small-padding a{color:#666}.theme-line table.links-edit{margin-bottom:10px}.theme-line table.links-edit label{line-height:28px;color:#666}.theme-line table.links-edit-details{margin-bottom:10px}.theme-line table.links-edit-details label{line-height:28px;color:#666}.theme-line table.links-edit-details td{padding:0}.theme-line table.links-edit-details td .input-tip{padding:0}.btn{padding:3px 6px}.panel-title a{font-size:14px}.panel-details{margin-top:0.65em;padding:0;border-radius:4px;border:thin do
 tted lightgrey}.tooltip.right .tooltip-arrow{border-right-color:#ec1c24}.tooltip>.tooltip-inner{max-width:400px;text-align:left;background-color:#ec1c24}label{font-weight:normal;margin-bottom:0}.form-horizontal .checkbox{padding-top:0}.input-tip{display:block;overflow:hidden}.labelField{float:left;margin-right:4px}.labelFormField{float:left;line-height:28px}.stackTipField{float:right;line-height:28px;margin-left:5px}.form-horizontal .form-group{margin:0}.form-horizontal .has-feedback .form-control-feedback{right:0}.tipField{float:right;line-height:28px;margin-left:5px}.tipLabel{font-size:14px;margin-left:5px}.fieldButton{float:right;margin-left:5px;margin-right:0}.fa-remove{color:#ec1c24;cursor:pointer}label.required:after{color:#ec1c24;content:' *';display:inline}.blank{visibility:hidden}.alert{outline:0}.alert.bottom,.alert.bottom-left,.alert.bottom-right,.alert.top,.alert.top-left,.alert.top-right{position:fixed;z-index:1050;margin:20px}.alert.top,.alert.top-left,.alert.top-right
 {top:50px}.alert.top{right:0;left:0}.alert.top-right{right:0}.alert.top-right .close{padding-left:10px}.alert.top-left{left:0}.alert.top-left .close{padding-right:10px}.alert.bottom,.alert.bottom-left,.alert.bottom-right{bottom:0}.alert.bottom{right:0;left:0}.alert.bottom-right{right:0}.alert.bottom-right .close{padding-left:10px}.alert.bottom-left{left:0}.alert.bottom-left .close{padding-right:10px}#cfgResult textarea{font-family:monospace;font-size:12px}input[type="number"]::-webkit-outer-spin-button,input[type="number"]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type="number"]{-moz-appearance:textfield}input.ng-dirty.ng-invalid,input.ng-pristine.ng-invalid,button.ng-dirty.ng-invalid,button.ng-pristine.ng-invalid{border-color:#ec1c24}input.ng-dirty.ng-invalid :focus,input.ng-pristine.ng-invalid :focus,button.ng-dirty.ng-invalid :focus,button.ng-pristine.ng-invalid :focus{border-color:#ec1c24}.form-control-feedback{display:inline-block;color:#ec1c24;right:18p
 x;line-height:28px;pointer-events:initial}.syntaxhighlighter{padding:10px 5px;border-radius:6px}.theme-line table.links-edit-small-padding{margin-top:10px}.theme-line table.links-edit-small-padding label{line-height:28px;color:#666}.theme-line table.links-edit-small-padding a{line-height:28px}.theme-line table.links-edit-small-padding input[type="checkbox"]{line-height:20px;margin-right:5px}.theme-line table.links-edit-small-padding .checkbox label{line-height:20px;vertical-align:middle}.theme-line table.links-edit-small-padding th{text-align:center}.theme-line table.links-edit-small-padding td{padding-left:10px}.configBox .nav>li>a{padding:5px 5px}.viewedUser{display:inline;padding:6px;margin:7px;border-radius:4px;background-color:#f8d5d8}a{cursor:pointer}
\ No newline at end of file
+.main-header .logo{height:auto}.main-sidebar{padding-top:60px}.navbar-default .navbar-brand,.navbar-default .navbar-brand:hover{position:absolute;width:100%;left:0;text-align:center}.modal-backdrop.am-fade{opacity:.5;transition:opacity .15s linear}.modal-backdrop.am-fade.ng-enter{opacity:0}.modal-backdrop.am-fade.ng-enter.ng-enter-active{opacity:.5}.modal-backdrop.am-fade.ng-leave{opacity:.5}.modal-backdrop.am-fade.ng-leave.ng-leave-active{opacity:0}.modal.center .modal-dialog{position:fixed;top:40%;left:50%;min-width:320px;max-width:630px;width:50%;transform:translateX(-50%) translateY(-50%)}.border-left{box-shadow:1px 0 0 0 #eee inset}.border-right{box-shadow:1px 0 0 0 #eee}.theme-line{background-color:#f9f9f9}.theme-line header{background-color:#fff}.theme-line header a.btn{border:0 none;padding:10px 25px;background-color:rgba(0,0,0,0.15)}.theme-line header a.btn:hover{background-color:rgba(0,0,0,0.25)}.theme-line header a.btn.btn-link{background:transparent;color:rgba(255,255,25
 5,0.8)}.theme-line header a.btn.btn-link:hover{color:#fff;text-decoration:none}.theme-line .navbar-nav a{background-color:transparent}.theme-line .navbar-nav a:hover,.theme-line .navbar-nav a:active,.theme-line .navbar-nav a:focus{background-color:transparent}.theme-line .main-links{padding-top:50px}.theme-line .main-links h3{margin-top:0;font-size:17px}.theme-line .main-links .links a{color:#888}.theme-line .main-links .links a:hover{text-decoration:none}.theme-line #category-columns,.theme-solid #category-columns{margin:50px 30px 0}.theme-line #category-columns h4{text-transform:uppercase;font-weight:300;color:#999;font-size:14px}.theme-line #category-columns ul{list-style:none;padding:0;margin-bottom:15px}.theme-line #category-columns ul li a{padding:4px 0;display:block;font-size:16px}.theme-line #category-columns ul .view-all{font-size:0.85em}.theme-line .docs-header{color:#999;overflow:hidden}.theme-line .docs-header h1{color:#444;margin-top:0;font-size:22px}.theme-line .btn-pr
 imary{border:0 none;background-color:#ec1c24}.theme-line .btn-primary:hover{background-color:#950d12}.theme-line .main-content .nav-horizontal a{box-shadow:0 0;border:0 none;background-color:#fff;border-radius:0;color:#aaa;padding:6px;margin:0 14px}.theme-line .main-content .nav-horizontal a:hover{color:#999;border-bottom:4px solid #ddd}.theme-line .main-content .nav-horizontal a.active{border-bottom:4px solid #888}.theme-line ul li>a.active{cursor:default;pointer-events:none}.theme-line .sidebar-nav{color:#474a54;padding-bottom:30px}.theme-line .sidebar-nav ul{padding:0;list-style:none;font-size:14px;margin:3px 0 0}.theme-line .sidebar-nav ul li{color:#666;line-height:28px}.theme-line .sidebar-nav ul li span.fa-stack{margin-right:5px;font-size:12px;height:26px}.theme-line .sidebar-nav ul li a{font-size:18px;color:#666;position:relative;white-space:nowrap;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis}.theme-line .sidebar-nav ul li a:hover{text-decoration:none}.the
 me-line .select li a,.theme-line .typeahead li a{color:#666;background-color:transparent}.theme-line .select li a:hover,.theme-line .typeahead li a:hover{color:#ec1c24;background-color:transparent}.theme-line .select .active,.theme-line .typeahead .active{background-color:#eee}.theme-line .sidebar-nav ul li .subcategory{padding-left:15px}.theme-line .sidebar-nav h4{margin-top:2em;font-weight:normal;text-transform:uppercase;font-size:11px;margin-bottom:10px;color:#bbb}.theme-line .sidebar-nav h4:first-child{margin-top:0}.theme-line .sidebar-nav .ask{width:100%;text-align:center;padding:10px}.theme-line .border-left .sidebar-nav{padding-left:15px}.theme-line .suggest{padding:4px;display:inline-block;font-size:12px}.header{padding:15px}.header .has-github{padding-right:136px}.header h1.navbar-brand{height:40px;width:200px;padding:0;margin:5px 15px 0 0}.header h1.navbar-brand a{text-indent:-99999px;background:no-repeat center center;display:block;width:100%;height:100%;background-size:c
 ontain}.header .nav.navbar-nav.pull-right{position:relative;right:-30px}.header .nav.navbar-nav .not-link{padding:15px;display:inline-block}.header .nav.navbar-nav .stable,.header .nav.navbar-nav .beta,.header .nav.navbar-nav .private{font-size:9px;padding:3px 5px;display:inline-block;line-height:8px;border-radius:3px;margin-left:6px;color:#fff;top:-2px;position:relative;opacity:0.6;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=60)";filter:alpha(opacity=60)}.header .nav.navbar-nav a:hover>.stable,.header .nav.navbar-nav a:hover>.beta,.header .nav.navbar-nav a:hover>.private{opacity:1;-ms-filter:none;filter:none}.header .nav.navbar-nav .beta{background-color:#59c3d1}.header .nav.navbar-nav .stable{background-color:#41b841}.header .nav.navbar-nav .private{background-color:#333}.theme-line header{border-bottom:8px solid}.theme-line header h2{color:#aaa}.theme-line header p{color:#666}.theme-line header{border-bottom-color:#ec1c24}.theme-line .navbar-nav{color:#888}.theme-
 line .navbar-nav a{color:#bbb}.theme-line header a.btn{background-color:#ec1c24}.theme-line header a.btn:hover{background-color:#950d12}.theme-line header .navbar-nav .tt-cursor{background-color:#ec1c24}.theme-line header .navbar-nav a:hover,.theme-line header .navbar-nav .open>a{color:#ec1c24}.theme-line .navbar-nav .active a{color:#ec1c24}.theme-line .navbar-nav .active a:hover{color:#950d12}.theme-line .main-links .links a:hover{color:#ec1c24}.theme-line .main-content a{color:#666}.theme-line .main-content a:hover{color:#950d12}.theme-line .sidebar-nav ul li a.active:before{background-color:#ec1c24}.theme-line .sidebar-nav ul li a.active{color:#ec1c24}.theme-line .sidebar-nav ul li a:hover,.theme-line .sidebar-nav ul li a.active:hover{color:#950d12}.theme-line .main-content .nav-horizontal a.active{border-color:#ec1c24;color:#ec1c24}.theme-line .main-content .nav-horizontal a:hover{color:#950d12}.theme-line .main-content .nav-horizontal a.active:hover{border-color:#950d12}.theme-
 line header .navbar-nav a.active,.theme-line #versions-list li a:hover strong,.theme-line #versions-list li a.active .current,.theme-line #versions-list li a:active .current{color:#ec1c24}.theme-line header .navbar-nav a{font-size:18px}.theme-line.body-threes .section-right .threes-nav .btn-default:hover,.theme-line.page-docs.body-threes .section-right .threes-nav .pull-right a:hover{color:#ec1c24;border-color:#ec1c24}.theme-line .section-right{padding-left:30px}.body-overlap .main-content{margin-top:30px}.body-box .main-content,.body-overlap .main-content{padding:30px;box-shadow:0 0 0 1px rgba(0,0,0,0.1);background-color:#fff}body{font-weight:400;font-family:Roboto Slab, serif}h1,h2,h3,h4,h5,h6{font-weight:700;font-family:Roboto Slab, serif}.submit-vote.submit-vote-parent.voted a.submit-vote-button,.submit-vote.submit-vote-parent a.submit-vote-button:hover{background-color:#ec1c24}div.submit-vote.submit-vote-parent.voted a.submit-vote-button:hover{background-color:#950d12}a,.link .
 title{color:#ec1c24}a:hover,.link:hover .title{color:#950d12}.header h1.navbar-brand a{background-image:url("https://www.filepicker.io/api/file/QagunjDGRFul2JgNCAli")}.header h1.navbar-brand{width:96px}.block-edit-parameters{text-align:right;padding-bottom:5px}.container-footer{margin-top:20px}.modal{display:block;overflow:hidden}.modal .close{position:absolute;top:0.65em;right:0.65em;float:none}.modal-header .close{margin-right:-2px}.modal .modal-dialog{width:610px}.modal .modal-content{border-radius:0;background-color:#f7f7f7}.modal .modal-content .modal-header{background-color:#fff;text-align:center;color:#555;padding:24px;font-family:"myriad-pro",sans-serif}.modal .modal-content .modal-header h4{font-family:"myriad-pro",sans-serif;font-size:22px}.modal .modal-content .modal-header h4 .fa{display:block;font-size:41px;color:#ddd;margin-bottom:5px}.modal .modal-content .modal-header p{color:#aaa;font-size:1em;margin:3px 0 0}.modal .modal-content .modal-spacer{padding:10px 10px 0 10
 px}.modal .modal-content .modal-footer{margin-top:0}.modal-body{padding-top:15px}h1.ignite-logo{background-image:url("https://www.filepicker.io/api/file/QagunjDGRFul2JgNCAli")}.block-display-image img{max-width:100%;max-height:450px;margin:auto;display:block}.greedy{min-height:200px;height:calc(100vh - 230px)}@media (min-width:768px){.navbar-nav>li>a{padding-top:18px;padding-bottom:10px}}.details-row{padding:0 0.65em}.details-row,.settings-row{display:block;margin:0.65em 0}.details-row label.table-header,.settings-row label.table-header{line-height:28px}.details-row [class*="col-"],.settings-row [class*="col-"]{display:inline-block;vertical-align:middle;float:none;padding-left:0 !important;padding-right:0 !important}.details-row input[type="checkbox"],.settings-row input[type="checkbox"]{line-height:20px;margin-right:4px}.details-row .checkbox label,.settings-row .checkbox label{line-height:20px;vertical-align:middle}button{margin-right:4px}h1,h2,h3{user-select:none;font-weight:norm
 al;line-height:1}h3{color:black;font-size:1.2em;margin-top:0;margin-bottom:1.5em}table tr:hover{cursor:pointer}.form-control{display:inline-block;text-align:left;padding:3px 3px;height:28px}.form-control button{text-align:left}.table-form-control{width:auto}button .caret{float:right;margin-left:0;margin-top:7px}.theme-line .panel-heading{padding:10px 10px;margin:0}.theme-line .panel-heading h3{margin-bottom:0}.theme-line .panel-heading h3>a{color:black}.theme-line .panel-title a{color:#ec1c24}.theme-line .panel-title h3{margin-bottom:1.3em}.theme-line .panel-body{padding:0.65em 1.3em}.theme-line .main-content a.customize{margin-left:5px;color:#ec1c24}.theme-line .panel-collapse{margin:0}.theme-line .links table,.theme-line table.links-edit,.theme-line table.links-edit-details,.theme-line table.links-edit-small-padding{display:table;table-layout:fixed;margin-bottom:20px}.theme-line .links table td,.theme-line table.links-edit td,.theme-line table.links-edit-details td,.theme-line tab
 le.links-edit-small-padding td{padding-left:18px}.theme-line .links table .active a,.theme-line table.links-edit .active a,.theme-line table.links-edit-details .active a,.theme-line table.links-edit-small-padding .active a{color:#ec1c24;font-weight:bold}.theme-line .links table a:hover,.theme-line table.links-edit a:hover,.theme-line table.links-edit-details a:hover,.theme-line table.links-edit-small-padding a:hover{color:#950d12}.theme-line .links table a,.theme-line table.links-edit a,.theme-line table.links-edit-details a,.theme-line table.links-edit-small-padding a{color:#666}.theme-line table.links-edit{margin-bottom:10px}.theme-line table.links-edit label{line-height:28px;color:#666}.theme-line table.links-edit-details{margin-bottom:10px}.theme-line table.links-edit-details label{line-height:28px;color:#666}.theme-line table.links-edit-details td{padding:0}.theme-line table.links-edit-details td .input-tip{padding:0}.btn{padding:3px 6px}.panel-title a{font-size:14px}.panel-det
 ails{margin-top:0.65em;padding:0;border-radius:4px;border:thin dotted lightgrey}.tooltip.right .tooltip-arrow{border-right-color:#ec1c24}.tooltip>.tooltip-inner{max-width:400px;text-align:left;background-color:#ec1c24}label{font-weight:normal;margin-bottom:0}.form-horizontal .checkbox{padding-top:0}.input-tip{display:block;overflow:hidden}.labelField{float:left;margin-right:4px}.labelFormField{float:left;line-height:28px}.stackTipField{float:right;line-height:28px;margin-left:5px}.form-horizontal .form-group{margin:0}.form-horizontal .has-feedback .form-control-feedback{right:0}.tipField{float:right;line-height:28px;margin-left:5px}.tipLabel{font-size:14px;margin-left:5px}.fieldButton{float:right;margin-left:5px;margin-right:0}.fa-remove{color:#ec1c24;cursor:pointer}label.required:after{color:#ec1c24;content:' *';display:inline}.blank{visibility:hidden}.alert{outline:0}.alert.bottom,.alert.bottom-left,.alert.bottom-right,.alert.top,.alert.top-left,.alert.top-right{position:fixed;z-i
 ndex:1050;margin:20px}.alert.top,.alert.top-left,.alert.top-right{top:50px}.alert.top{right:0;left:0}.alert.top-right{right:0}.alert.top-right .close{padding-left:10px}.alert.top-left{left:0}.alert.top-left .close{padding-right:10px}.alert.bottom,.alert.bottom-left,.alert.bottom-right{bottom:0}.alert.bottom{right:0;left:0}.alert.bottom-right{right:0}.alert.bottom-right .close{padding-left:10px}.alert.bottom-left{left:0}.alert.bottom-left .close{padding-right:10px}#cfgResult textarea{font-family:monospace;font-size:12px}input[type="number"]::-webkit-outer-spin-button,input[type="number"]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type="number"]{-moz-appearance:textfield}input.ng-dirty.ng-invalid,input.ng-pristine.ng-invalid,button.ng-dirty.ng-invalid,button.ng-pristine.ng-invalid{border-color:#ec1c24}input.ng-dirty.ng-invalid :focus,input.ng-pristine.ng-invalid :focus,button.ng-dirty.ng-invalid :focus,button.ng-pristine.ng-invalid :focus{border-color:#ec1c24}.f
 orm-control-feedback{display:inline-block;color:#ec1c24;right:18px;line-height:28px;pointer-events:initial}.syntaxhighlighter{padding:10px 5px;border-radius:6px}.theme-line table.links-edit-small-padding{margin-top:10px}.theme-line table.links-edit-small-padding label{line-height:28px;color:#666}.theme-line table.links-edit-small-padding a{line-height:28px}.theme-line table.links-edit-small-padding input[type="checkbox"]{line-height:20px;margin-right:5px}.theme-line table.links-edit-small-padding .checkbox label{line-height:20px;vertical-align:middle}.theme-line table.links-edit-small-padding th{text-align:center}.theme-line table.links-edit-small-padding td{padding-left:10px}.configBox .nav>li>a{padding:5px 5px}.viewedUser{display:inline;padding:6px;margin:7px;border-radius:4px;background-color:#f8d5d8}a{cursor:pointer}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/181fd985/modules/web-control-center/nodejs/public/stylesheets/style.less
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/public/stylesheets/style.less b/modules/web-control-center/nodejs/public/stylesheets/style.less
index 619ab6c..9abe5b4 100644
--- a/modules/web-control-center/nodejs/public/stylesheets/style.less
+++ b/modules/web-control-center/nodejs/public/stylesheets/style.less
@@ -605,7 +605,10 @@ h1.ignite-logo {
 .details-row, .settings-row {
   display: block;
   margin: 0.65em 0;
-  line-height: @input-height;
+
+  label.table-header {
+    line-height: @input-height;
+  }
 
   [class*="col-"] {
     display: inline-block;

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/181fd985/modules/web-control-center/nodejs/routes/admin.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/routes/admin.js b/modules/web-control-center/nodejs/routes/admin.js
index e67f306..422f08b 100644
--- a/modules/web-control-center/nodejs/routes/admin.js
+++ b/modules/web-control-center/nodejs/routes/admin.js
@@ -20,7 +20,7 @@ var db = require('../db');
 var uiUtils = require('../helpers/ui-utils');
 
 router.get('/', function(req, res) {
-    res.render('admin/userList');
+    res.render('settings/admin');
 });
 
 /**

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/181fd985/modules/web-control-center/nodejs/routes/caches.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/routes/caches.js b/modules/web-control-center/nodejs/routes/caches.js
index 2545104..6a90ebe 100644
--- a/modules/web-control-center/nodejs/routes/caches.js
+++ b/modules/web-control-center/nodejs/routes/caches.js
@@ -20,7 +20,7 @@ var db = require('../db');
 
 /* GET caches page. */
 router.get('/', function(req, res) {
-    res.render('caches');
+    res.render('configuration/caches');
 });
 
 /**

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/181fd985/modules/web-control-center/nodejs/routes/clusters.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/routes/clusters.js b/modules/web-control-center/nodejs/routes/clusters.js
index 1e56ac7..fa3abf2 100644
--- a/modules/web-control-center/nodejs/routes/clusters.js
+++ b/modules/web-control-center/nodejs/routes/clusters.js
@@ -20,7 +20,7 @@ var db = require('../db');
 
 /* GET clusters page. */
 router.get('/', function(req, res) {
-    res.render('clusters');
+    res.render('configuration/clusters');
 });
 
 /**

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/181fd985/modules/web-control-center/nodejs/routes/persistences.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/routes/persistences.js b/modules/web-control-center/nodejs/routes/persistences.js
index 1f0fc24..5b33f9b 100644
--- a/modules/web-control-center/nodejs/routes/persistences.js
+++ b/modules/web-control-center/nodejs/routes/persistences.js
@@ -21,7 +21,7 @@ var ds = require('../helpers/data-structures.js'), jdbcTypes = ds.jdbcTypes, jav
 
 /* GET persistence page. */
 router.get('/', function(req, res) {
-    res.render('persistence');
+    res.render('configuration/persistence');
 });
 
 /**

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/181fd985/modules/web-control-center/nodejs/routes/profile.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/routes/profile.js b/modules/web-control-center/nodejs/routes/profile.js
index ab9fc9b..015b07c 100644
--- a/modules/web-control-center/nodejs/routes/profile.js
+++ b/modules/web-control-center/nodejs/routes/profile.js
@@ -38,7 +38,7 @@ router.get('/', function (req, res) {
         if (err)
             return res.status(500).send(err.message);
 
-        res.render('profile');
+        res.render('settings/profile');
     });
 });
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/181fd985/modules/web-control-center/nodejs/routes/summary.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/routes/summary.js b/modules/web-control-center/nodejs/routes/summary.js
index 884c78c..0578f45 100644
--- a/modules/web-control-center/nodejs/routes/summary.js
+++ b/modules/web-control-center/nodejs/routes/summary.js
@@ -25,7 +25,7 @@ var generatorDocker = require('./generator/docker');
 
 /* GET summary page. */
 router.get('/', function(req, res) {
-    res.render('summary');
+    res.render('configuration/summary');
 });
 
 router.post('/generator', function(req, res) {

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/181fd985/modules/web-control-center/nodejs/views/admin/userList.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/views/admin/userList.jade b/modules/web-control-center/nodejs/views/admin/userList.jade
deleted file mode 100644
index 1986ca2..0000000
--- a/modules/web-control-center/nodejs/views/admin/userList.jade
+++ /dev/null
@@ -1,52 +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.
-extends ../templates/layout
-
-append scripts
-    script(src='/admin-controller.js')
-
-block container
-    .greedy.row(ng-controller='adminController')
-        .docs-content
-            .docs-header
-                h1 List of registered users
-                hr
-            .docs-body
-                table.table.table-striped(st-table='userListDisplay' st-safe-src='userList')
-                    thead
-                        tr
-                            th(colspan='5')
-                                input.form-control(type='text' st-search='' class='' placeholder='Search ...')
-                        tr
-                            th(st-sort='username') User name
-                            th(st-sort='email') Email
-                            th(st-sort='lastLogin') Last login
-                            th(st-sort='lastLogin') Admin
-                            th(colspan='2') Actions
-                    tbody
-                        tr(ng-repeat='user in userListDisplay')
-                            td {{user.username}}
-                            td
-                                a(ng-href='mailto:{{user.email}}') {{user.email}}
-                            td
-                                span.small {{user.lastLogin | date:'medium'}}
-                            td
-                                input(type='checkbox' ng-disabled='user.adminChanging || user._id == loggedInUser._id'
-                                ng-model='user.admin' ng-change='toggleAdmin(user)')
-                            td(width='1%')
-                                a(ng-click='removeUser(user)' ng-show='user._id != loggedInUser._id' title='Remove user')
-                                    span.glyphicon.glyphicon-remove(style='color: red')
-                            td(width='1%')
-                                a(ng-href='admin/become?viewedUserId={{user._id}}' ng-show='user._id != loggedInUser._id' title='View user\'s configurations')
-                                    span.glyphicon.glyphicon-eye-open

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/181fd985/modules/web-control-center/nodejs/views/caches.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/views/caches.jade b/modules/web-control-center/nodejs/views/caches.jade
deleted file mode 100644
index 2e05ded..0000000
--- a/modules/web-control-center/nodejs/views/caches.jade
+++ /dev/null
@@ -1,67 +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.
-
-extends templates/layout-sidebar
-
-append scripts
-    script(src='/caches-controller.js')
-
-include includes/controls
-
-block content
-    .docs-header
-        h1 Create and configure Ignite caches
-        hr
-    .docs-body(ng-controller='cachesController')
-        .links(ng-hide='caches.length == 0')
-            table.col-sm-12(st-table='caches')
-                tbody
-                    tr(ng-repeat='row in caches track by row._id')
-                        td.col-sm-6(ng-class='{active: row._id == selectedItem._id}')
-                            a(ng-click='selectItem(row)') {{$index + 1}}) {{row.name}}, {{row.mode | displayValue:modes:'Cache mode not set'}}, {{row.atomicityMode | displayValue:atomicities:'Cache atomicity not set'}}
-        button.btn.btn-primary(ng-click='createItem()') Add cache
-        hr
-        form.form-horizontal(name='inputForm' ng-if='backupItem' novalidate)
-            div(bs-collapse data-start-collapsed='false')
-                .panel.panel-default
-                    .panel-heading
-                        h3
-                            a(bs-collapse-toggle) General
-                    .panel-collapse(bs-collapse-target)
-                        .panel-body
-                            .settings-row(ng-repeat='field in general')
-                                +form-row
-            div(bs-collapse data-start-collapsed='true')
-                .panel-title(ng-show='expanded')
-                    h3
-                        a(bs-collapse-toggle='0' ng-click='expanded = !expanded;') {{expanded ? 'Hide advanced settings...' : 'Show advanced settings...'}}
-                .panel-collapse(bs-collapse-target)
-                    .span(bs-collapse data-start-collapsed='true' data-allow-multiple='true')
-                        .panel.panel-default(ng-repeat='group in advanced')
-                            .panel-heading
-                                h3
-                                    a(bs-collapse-toggle) {{group.label}}
-                                    i.tipLabel.fa.fa-question-circle(ng-if='group.tip' bs-tooltip='joinTip(group.tip)' type='button')
-                                    i.tipLabel.fa.fa-question-circle.blank(ng-if='!group.tip')
-                            .panel-collapse(bs-collapse-target)
-                                .panel-body
-                                    .settings-row(ng-repeat='field in group.fields')
-                                        +form-row
-                .panel-title
-                    h3
-                        a(bs-collapse-toggle='0' ng-click='expanded = !expanded;') {{expanded ? 'Hide advanced settings...' : 'Show advanced settings...'}}
-            button#save-btn.btn.btn-primary(ng-disabled='inputForm.$invalid' ng-click='saveItem()') Save
-            button.btn.btn-primary.btn-second(ng-show='backupItem._id' ng-click='removeItem()') Remove

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/181fd985/modules/web-control-center/nodejs/views/clients.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/views/clients.jade b/modules/web-control-center/nodejs/views/clients.jade
deleted file mode 100644
index 87cfc10..0000000
--- a/modules/web-control-center/nodejs/views/clients.jade
+++ /dev/null
@@ -1,26 +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.
-
-extends templates/layout-sidebar
-block head
-block content
-    .docs-header
-        h1 Clients
-        p Create and configure Ignite clients.
-        hr
-    .docs-body(ng-controller='clientsRouter')
-block body
-    script(src='/clients.js')
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/181fd985/modules/web-control-center/nodejs/views/clusters.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/views/clusters.jade b/modules/web-control-center/nodejs/views/clusters.jade
deleted file mode 100644
index 99afd20..0000000
--- a/modules/web-control-center/nodejs/views/clusters.jade
+++ /dev/null
@@ -1,70 +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.
-
-extends templates/layout-sidebar
-
-append scripts
-    script(src='/clusters-controller.js')
-
-include includes/controls
-
-block content
-    .docs-header
-        h1 Create and configure Ignite clusters
-        hr
-    .docs-body(ng-controller='clustersController')
-        .links(ng-hide='clusters.length == 0')
-            table.col-sm-12(st-table='clusters')
-                tbody
-                    tr(ng-repeat='row in clusters track by row._id')
-                        td.col-sm-6(ng-class='{active: row._id == selectedItem._id}')
-                            a(ng-click='selectItem(row)') {{$index + 1}}) {{row.name}}, {{row.discovery.kind | displayValue:discoveries:'Discovery not set'}}
-        button.btn.btn-primary(ng-click='createItem()' ng-disabled='!create.template') &nbspAdd cluster
-        label(style='margin-left: 15px; margin-right: 10px') Use template:
-        button.btn.btn-default(ng-init='create.template = templates[0].value' ng-model='create.template' data-template='/select' data-placeholder='Choose cluster template' bs-options='item.value as item.label for item in templates' bs-select)
-        i.tiplabel.fa.fa-question-circle(bs-tooltip data-title='{{joinTip(templateTip)}}' type='button')
-        hr
-        form.form-horizontal(name='inputForm' ng-if='backupItem' novalidate)
-            div(bs-collapse data-start-collapsed='false')
-                .panel.panel-default
-                    .panel-heading
-                        h3
-                            a(bs-collapse-toggle) General
-                    .panel-collapse(bs-collapse-target)
-                        .panel-body
-                            .settings-row(ng-repeat='field in general')
-                                +form-row
-            div(bs-collapse data-start-collapsed='true')
-                .panel-title(ng-show='expanded')
-                    h3
-                        a(bs-collapse-toggle='0' ng-click='expanded = !expanded;') {{expanded ? 'Hide advanced settings...' : 'Show advanced settings...'}}
-                .panel-collapse(bs-collapse-target)
-                    .span(bs-collapse data-start-collapsed='true' data-allow-multiple='true')
-                        .panel.panel-default(ng-repeat='group in advanced')
-                            .panel-heading
-                                h3
-                                    a(bs-collapse-toggle) {{group.label}}
-                                    i.tipLabel.fa.fa-question-circle(ng-if='group.tip' bs-tooltip='joinTip(group.tip)' type='button')
-                                    i.tipLabel.fa.fa-question-circle.blank(ng-if='!group.tip')
-                            .panel-collapse(bs-collapse-target)
-                                .panel-body
-                                    .settings-row(ng-repeat='field in group.fields')
-                                        +form-row
-                .panel-title
-                    h3
-                        a(bs-collapse-toggle='0' ng-click='expanded = !expanded;') {{expanded ? 'Hide advanced settings...' : 'Show advanced settings...'}}
-            button#save-btn.btn.btn-primary(ng-disabled='inputForm.$invalid' ng-click='saveItem()') Save
-            button.btn.btn-primary(ng-show='backupItem._id' ng-click='removeItem()') Remove
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/181fd985/modules/web-control-center/nodejs/views/configuration/caches.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/views/configuration/caches.jade b/modules/web-control-center/nodejs/views/configuration/caches.jade
new file mode 100644
index 0000000..c430d26
--- /dev/null
+++ b/modules/web-control-center/nodejs/views/configuration/caches.jade
@@ -0,0 +1,67 @@
+//-
+    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.
+
+extends ../templates/layout-sidebar
+
+append scripts
+    script(src='/caches-controller.js')
+
+include ../includes/controls
+
+block content
+    .docs-header
+        h1 Create and configure Ignite caches
+        hr
+    .docs-body(ng-controller='cachesController')
+        .links(ng-hide='caches.length == 0')
+            table.col-sm-12(st-table='caches')
+                tbody
+                    tr(ng-repeat='row in caches track by row._id')
+                        td.col-sm-6(ng-class='{active: row._id == selectedItem._id}')
+                            a(ng-click='selectItem(row)') {{$index + 1}}) {{row.name}}, {{row.mode | displayValue:modes:'Cache mode not set'}}, {{row.atomicityMode | displayValue:atomicities:'Cache atomicity not set'}}
+        button.btn.btn-primary(ng-click='createItem()') Add cache
+        hr
+        form.form-horizontal(name='inputForm' ng-if='backupItem' novalidate)
+            div(bs-collapse data-start-collapsed='false')
+                .panel.panel-default
+                    .panel-heading
+                        h3
+                            a(bs-collapse-toggle) General
+                    .panel-collapse(bs-collapse-target)
+                        .panel-body
+                            .settings-row(ng-repeat='field in general')
+                                +form-row
+            div(bs-collapse data-start-collapsed='true')
+                .panel-title(ng-show='expanded')
+                    h3
+                        a(bs-collapse-toggle='0' ng-click='expanded = !expanded;') {{expanded ? 'Hide advanced settings...' : 'Show advanced settings...'}}
+                .panel-collapse(bs-collapse-target)
+                    .span(bs-collapse data-start-collapsed='true' data-allow-multiple='true')
+                        .panel.panel-default(ng-repeat='group in advanced')
+                            .panel-heading
+                                h3
+                                    a(bs-collapse-toggle) {{group.label}}
+                                    i.tipLabel.fa.fa-question-circle(ng-if='group.tip' bs-tooltip='joinTip(group.tip)' type='button')
+                                    i.tipLabel.fa.fa-question-circle.blank(ng-if='!group.tip')
+                            .panel-collapse(bs-collapse-target)
+                                .panel-body
+                                    .settings-row(ng-repeat='field in group.fields')
+                                        +form-row
+                .panel-title
+                    h3
+                        a(bs-collapse-toggle='0' ng-click='expanded = !expanded;') {{expanded ? 'Hide advanced settings...' : 'Show advanced settings...'}}
+            button#save-btn.btn.btn-primary(ng-disabled='inputForm.$invalid' ng-click='saveItem()') Save
+            button.btn.btn-primary.btn-second(ng-show='backupItem._id' ng-click='removeItem()') Remove

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/181fd985/modules/web-control-center/nodejs/views/configuration/clusters.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/views/configuration/clusters.jade b/modules/web-control-center/nodejs/views/configuration/clusters.jade
new file mode 100644
index 0000000..4f2488a
--- /dev/null
+++ b/modules/web-control-center/nodejs/views/configuration/clusters.jade
@@ -0,0 +1,70 @@
+//-
+    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.
+
+extends ../templates/layout-sidebar
+
+append scripts
+    script(src='/clusters-controller.js')
+
+include ../includes/controls
+
+block content
+    .docs-header
+        h1 Create and configure Ignite clusters
+        hr
+    .docs-body(ng-controller='clustersController')
+        .links(ng-hide='clusters.length == 0')
+            table.col-sm-12(st-table='clusters')
+                tbody
+                    tr(ng-repeat='row in clusters track by row._id')
+                        td.col-sm-6(ng-class='{active: row._id == selectedItem._id}')
+                            a(ng-click='selectItem(row)') {{$index + 1}}) {{row.name}}, {{row.discovery.kind | displayValue:discoveries:'Discovery not set'}}
+        button.btn.btn-primary(ng-click='createItem()' ng-disabled='!create.template') &nbspAdd cluster
+        label(style='margin-left: 15px; margin-right: 10px') Use template:
+        button.btn.btn-default(ng-init='create.template = templates[0].value' ng-model='create.template' data-template='/select' data-placeholder='Choose cluster template' bs-options='item.value as item.label for item in templates' bs-select)
+        i.tiplabel.fa.fa-question-circle(bs-tooltip data-title='{{joinTip(templateTip)}}' type='button')
+        hr
+        form.form-horizontal(name='inputForm' ng-if='backupItem' novalidate)
+            div(bs-collapse data-start-collapsed='false')
+                .panel.panel-default
+                    .panel-heading
+                        h3
+                            a(bs-collapse-toggle) General
+                    .panel-collapse(bs-collapse-target)
+                        .panel-body
+                            .settings-row(ng-repeat='field in general')
+                                +form-row
+            div(bs-collapse data-start-collapsed='true')
+                .panel-title(ng-show='expanded')
+                    h3
+                        a(bs-collapse-toggle='0' ng-click='expanded = !expanded;') {{expanded ? 'Hide advanced settings...' : 'Show advanced settings...'}}
+                .panel-collapse(bs-collapse-target)
+                    .span(bs-collapse data-start-collapsed='true' data-allow-multiple='true')
+                        .panel.panel-default(ng-repeat='group in advanced')
+                            .panel-heading
+                                h3
+                                    a(bs-collapse-toggle) {{group.label}}
+                                    i.tipLabel.fa.fa-question-circle(ng-if='group.tip' bs-tooltip='joinTip(group.tip)' type='button')
+                                    i.tipLabel.fa.fa-question-circle.blank(ng-if='!group.tip')
+                            .panel-collapse(bs-collapse-target)
+                                .panel-body
+                                    .settings-row(ng-repeat='field in group.fields')
+                                        +form-row
+                .panel-title
+                    h3
+                        a(bs-collapse-toggle='0' ng-click='expanded = !expanded;') {{expanded ? 'Hide advanced settings...' : 'Show advanced settings...'}}
+            button#save-btn.btn.btn-primary(ng-disabled='inputForm.$invalid' ng-click='saveItem()') Save
+            button.btn.btn-primary(ng-show='backupItem._id' ng-click='removeItem()') Remove
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/181fd985/modules/web-control-center/nodejs/views/configuration/persistence.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/views/configuration/persistence.jade b/modules/web-control-center/nodejs/views/configuration/persistence.jade
new file mode 100644
index 0000000..b0e23b6
--- /dev/null
+++ b/modules/web-control-center/nodejs/views/configuration/persistence.jade
@@ -0,0 +1,114 @@
+//-
+    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.
+
+extends ../templates/layout-sidebar
+
+append scripts
+    script(src='/persistences-controller.js')
+
+include ../includes/controls
+
+mixin dbcheck(chk)
+    input(type='checkbox' style='margin-left: 5px' ng-checked=chk)
+
+block content
+    .docs-header
+        h1 Create and configure Ignite persistence
+        hr
+    .docs-body(ng-controller='persistenceController')
+        .links(ng-hide='persistences.length == 0')
+            table.col-sm-12(st-table='persistences')
+                tbody
+                    tr(ng-repeat='row in persistences track by row._id')
+                        td.col-sm-6(ng-class='{active: row._id == selectedItem._id}')
+                            a(ng-click='selectItem(row)') {{$index + 1}}) {{row.name}}, {{row.database | displayValue:databases:'Database not set'}}
+        button.btn.btn-primary(ng-click='createItem()') Add
+        hr
+        form.form-horizontal(name='inputForm' ng-if='backupItem' novalidate)
+            div(bs-collapse data-start-collapsed='false')
+                .panel.panel-default
+                    .panel-heading
+                        h3
+                            a(bs-collapse-toggle) Connection
+                    .panel-collapse(bs-collapse-target)
+                        .panel-body
+                            .settings-row(ng-repeat='field in connection')
+                                +form-row
+            div(bs-collapse data-start-collapsed='true' ng-hide='data.tables.length == 0')
+                .panel.panel-default
+                    .panel-heading
+                        h3
+                            a(bs-collapse-toggle) Metadata
+                    .panel-collapse(bs-collapse-target)
+                        .panel-body
+                            div(ng-hide='data.tables.length == 0')
+                                table.table-bordered.table-condensed.links-edit-small-padding.col-sm-12(st-table='data.tables')
+                                    thead
+                                        tr
+                                            th.col-sm-3 Schema/Table
+                                            th Key class
+                                            th Value class
+                                    tbody
+                                        tr(ng-repeat='row in data.tables')
+                                            td(colspan='{{row.tableName ? 1 : 3}}')
+                                                div.checkbox(ng-if='!row.tableName')
+                                                    label(ng-click='selectSchema($index)')
+                                                        input(type='checkbox' ng-checked='row.use')
+                                                        | {{row.schemaName}}
+                                                div.checkbox(ng-if='row.tableName')
+                                                    label(style='padding-left: 30px' ng-click='selectTable($index)')
+                                                        input(type='checkbox' ng-checked = 'row.use')
+                                                        | {{row.tableName}}
+                                            td(ng-if='row.tableName')
+                                                a(ng-show='data.curTableIdx != $index' ng-click='selectTable($index)') {{row.keyClass}}
+                                                input.form-control(type='text' ng-show='data.curTableIdx == $index' ng-model='data.curKeyClass' placeholder='Key class full name')
+                                            td(ng-if='row.tableName')
+                                                a(ng-show='data.curTableIdx != $index' ng-click='selectTable($index)') {{row.valueClass}}
+                                                input.form-control(type='text' ng-show='data.curTableIdx == $index' ng-model='data.curValueClass' placeholder='Value class full name')
+                            div(ng-hide='data.curTableIdx < 0')
+                                table.table-bordered.table-condensed.links-edit-small-padding.col-sm-12(st-table='data.tables[data.curTableIdx].fields')
+                                    thead
+                                        tr
+                                            th(style='width:45px') Use
+                                            th(style='width:45px') Key
+                                            th(style='width:45px') Ak
+                                            th DB Name
+                                            th DB Type
+                                            th Java Name
+                                            th Java Type
+                                    tbody
+                                        tr(ng-repeat='row in data.tables[data.curTableIdx].fields')
+                                            td
+                                                +dbcheck('row.use')
+                                            td
+                                                +dbcheck('row.key')
+                                            td
+                                                +dbcheck('row.ak')
+                                            td
+                                                label {{row.dbName}}
+                                            td
+                                                label {{row.dbType}}
+                                            td
+                                                a(ng-show='data.curFieldIdx != $index' ng-click='selectField($index)') {{row.javaName}}
+                                                input.form-control(type='text' ng-show='data.curFieldIdx == $index' ng-model='data.curJavaName' placeholder='Field Java name')
+                                            td
+                                                a(ng-show='data.curFieldIdx != $index' ng-click='selectField($index)') {{row.javaType}}
+                                                input.form-control(type='text' ng-show='data.curFieldIdx == $index' ng-model='data.curJavaType' placeholder='Field Java type')
+        button.btn.btn-primary(ng-disabled='inputForm.$invalid' ng-click='saveItem()') Save
+        button.btn.btn-primary.btn-second(ng-show='backupItem._id' ng-click='removeItem()') Remove
+        button.btn.btn-primary.btn-second(ng-click='reloadMetadata()') Reload
+
+

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/181fd985/modules/web-control-center/nodejs/views/configuration/summary.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/views/configuration/summary.jade b/modules/web-control-center/nodejs/views/configuration/summary.jade
new file mode 100644
index 0000000..c516b9e
--- /dev/null
+++ b/modules/web-control-center/nodejs/views/configuration/summary.jade
@@ -0,0 +1,95 @@
+//-
+    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.
+
+extends ../templates/layout-sidebar
+
+append scripts
+    script(src='/summary-controller.js')
+
+    script(src='//cdnjs.cloudflare.com/ajax/libs/SyntaxHighlighter/3.0.83/scripts/shCore.min.js')
+    script(src='//cdnjs.cloudflare.com/ajax/libs/SyntaxHighlighter/3.0.83/scripts/shBrushXml.js')
+    script(src='//cdnjs.cloudflare.com/ajax/libs/SyntaxHighlighter/3.0.83/scripts/shBrushJava.js')
+    script(src='//cdnjs.cloudflare.com/ajax/libs/SyntaxHighlighter/3.0.83/scripts/shBrushPlain.js')
+    script(src="//cdn.jsdelivr.net/angularjs/1.3.15/angular-animate.min.js")
+    script(src="//cdn.jsdelivr.net/angularjs/1.3.15/angular-sanitize.min.js")
+
+append css
+    link(rel='stylesheet', href='//cdnjs.cloudflare.com/ajax/libs/SyntaxHighlighter/3.0.83/styles/shCore.css')
+    link(rel='stylesheet', href='//cdnjs.cloudflare.com/ajax/libs/SyntaxHighlighter/3.0.83/styles/shThemeDefault.css')
+
+block content
+    .docs-header
+        h1 Configurations summary
+        hr
+    .docs-body(ng-controller='summaryController')
+        div(ng-show='clusters.length == 0')
+            | No cluster configured. You can&nbsp;
+            a(href='clusters') configure
+            | &nbsp;it.
+        div(ng-show='clusters.length > 0')
+            p Following cluster configurations were created, you can download them as XML, java code or as docker file.
+            .links
+                table.col-sm-12(st-table='clusters')
+                    tbody
+                        tr(ng-repeat='row in clusters track by row._id')
+                            td.col-sm-6(ng-class='{active: row._id == selectedItem._id}')
+                                a(ng-click='generate(row)') {{$index + 1}}) {{row.name}}
+            #cfgResult.configBox(ng-show='selectedItem && !generateError && !loading', style='margin-top: 20px')
+                ul.nav.nav-tabs
+                    li(ng-class='{active: cfgLang == "xml"}')
+                        a(href, ng-click='cfgLang = "xml"')
+                            img(src='/images/xml.png', width='16px' height='16px')
+                            |  XML
+                    li(ng-class='{active: cfgLang=="java"}')
+                        a(href, ng-click='cfgLang = "java"')
+                            img(src='/images/java.png', width='16px' height='16px')
+                            |  Java
+                    li(ng-class="{active: cfgLang=='docker'}")
+                        a(href, ng-click='cfgLang = "docker"')
+                            img(src='/images/docker.png', width='16px' height='16px')
+                            |  Dockerfile
+                form.settings-row(method='post' action='summary/download')
+                    input(type="hidden" name="_id" value="{{selectedItem._id}}")
+                    input(type="hidden" name="javaClass" value="{{javaClass}}")
+                    input(type="hidden" name="os" value="{{os}}")
+
+                    #xmlResult(ng-show="cfgLang == 'xml'")
+                        button.btn.btn-primary.pull-right(style='margin-right: 0px;margin-top: -45px' type='submit') Download
+                        #xmlResultDiv
+                    #javaResult(ng-show="cfgLang == 'java'")
+                        .col-sm-1
+                            label Generate:
+                        .col-sm-3
+                            button.form-control(type='button' ng-model='javaClass' bs-select data-placeholder='{{detail.placeholder}}' bs-options='item.value as item.label for item in javaClassItems' data-sort='false')
+                        button.btn.btn-primary.pull-right(style='margin-right: 0px;margin-top: -40px' type='submit') Download
+                        #javaResultDiv
+                    #dockerResult(ng-show="cfgLang == 'docker'")
+                        button.btn.btn-primary.pull-right(style='margin-right: 0px;margin-top: -40px' type='submit') Download
+                        p
+                            a(style='color:#ec1c24' href='https://docs.docker.com/reference/builder' target="_blank") Docker
+                            | &nbsp;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&nbsp;
+                            a(style='color:#ec1c24' href='https://ignite.incubator.apache.org/download.html#docker' target="_blank") Apache Ignite docker image
+                            | . For more information about using Ignite with Docker please read&nbsp;
+                            a(style='color:#ec1c24' href='http://apacheignite.readme.io/docs/docker-deployment' target="_blank") documentation
+                            |.
+                        .col-sm-2
+                            label(for='os') Operation System:
+                        .col-sm-4
+                            input#os.form-control(type='text', ng-model='os' placeholder='debian:8' data-min-length="0" data-html="1" data-auto-select="true" data-animation="am-flip-x" bs-typeahead bs-options='os for os in oss')
+                        .settings-row#dockerResultDiv(style='margin-top: 15px')
+                div(ng-show='generateError') {{generateError}}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/181fd985/modules/web-control-center/nodejs/views/includes/controls.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/views/includes/controls.jade b/modules/web-control-center/nodejs/views/includes/controls.jade
index 6b92910..ef1a022 100644
--- a/modules/web-control-center/nodejs/views/includes/controls.jade
+++ b/modules/web-control-center/nodejs/views/includes/controls.jade
@@ -67,7 +67,7 @@ mixin details-row
             +tipField('detail.tip')
         div(ng-switch-when='table-simple')&attributes(detailCommon)
             div(ng-if="detail.label")
-                label {{detail.label}}:
+                label.table-header {{detail.label}}:
                 +tipLabel('detail.tableTip')
             table.col-sm-12.links-edit-details(st-table='#{detailMdl}' ng-show='#{detailMdl}.length > 0')
                 tbody
@@ -151,7 +151,7 @@ mixin form-row
                     +details-row
         div(ng-switch-when='table-simple')&attributes(fieldCommon)
             div
-                label {{field.label}}:
+                label.table-header {{field.label}}:
                 +tipLabel('field.tableTip')
             table.links-edit.col-sm-12(st-table='#{fieldMdl}' ng-show='#{fieldMdl}.length > 0')
                 tbody
@@ -176,7 +176,7 @@ mixin form-row
         div(ng-switch-when='indexedTypes')
             - var tblMdl = 'backupItem.indexedTypes'
             div
-                label Index key-value type pairs:
+                label.table-header Index key-value type pairs:
                 +tipLabel('field.tip')
             table.links-edit.col-sm-12(st-table=tblMdl ng-show='#{tblMdl}.length > 0')
                 tbody

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/181fd985/modules/web-control-center/nodejs/views/includes/header.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/views/includes/header.jade b/modules/web-control-center/nodejs/views/includes/header.jade
index 42b8d4f..681b3a2 100644
--- a/modules/web-control-center/nodejs/views/includes/header.jade
+++ b/modules/web-control-center/nodejs/views/includes/header.jade
@@ -22,8 +22,8 @@ header.header(id='header')
             ul.nav.navbar-nav(ng-controller='activeLink' ng-show='loggedInUser')
                 li
                     a(ng-class="{active: isActive('/configuration')}" href='/configuration/clusters') Configuration
-                li
-                    a(ng-class="{active: isActive('/sql')}" href='/sql') SQL
+                //li
+                //    a(ng-class="{active: isActive('/sql')}" href='/sql') SQL
             ul.nav.navbar-nav.pull-right
                 li(ng-show='loggedInUser')
                     a.dropdown-toggle(data-toggle='dropdown' aria-expanded='true' bs-dropdown data-template='user-dropdown' data-placement='bottom-right') {{loggedInUser.username}}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/181fd985/modules/web-control-center/nodejs/views/persistence.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/views/persistence.jade b/modules/web-control-center/nodejs/views/persistence.jade
deleted file mode 100644
index 16ccb4b..0000000
--- a/modules/web-control-center/nodejs/views/persistence.jade
+++ /dev/null
@@ -1,114 +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.
-
-extends templates/layout-sidebar
-
-append scripts
-    script(src='/persistences-controller.js')
-
-include includes/controls
-
-mixin dbcheck(chk)
-    input(type='checkbox' style='margin-left: 5px' ng-checked=chk)
-
-block content
-    .docs-header
-        h1 Create and configure Ignite persistence
-        hr
-    .docs-body(ng-controller='persistenceController')
-        .links(ng-hide='persistences.length == 0')
-            table.col-sm-12(st-table='persistences')
-                tbody
-                    tr(ng-repeat='row in persistences track by row._id')
-                        td.col-sm-6(ng-class='{active: row._id == selectedItem._id}')
-                            a(ng-click='selectItem(row)') {{$index + 1}}) {{row.name}}, {{row.database | displayValue:databases:'Database not set'}}
-        button.btn.btn-primary(ng-click='createItem()') Add
-        hr
-        form.form-horizontal(name='inputForm' ng-if='backupItem' novalidate)
-            div(bs-collapse data-start-collapsed='false')
-                .panel.panel-default
-                    .panel-heading
-                        h3
-                            a(bs-collapse-toggle) Connection
-                    .panel-collapse(bs-collapse-target)
-                        .panel-body
-                            .settings-row(ng-repeat='field in connection')
-                                +form-row
-            div(bs-collapse data-start-collapsed='true' ng-hide='data.tables.length == 0')
-                .panel.panel-default
-                    .panel-heading
-                        h3
-                            a(bs-collapse-toggle) Metadata
-                    .panel-collapse(bs-collapse-target)
-                        .panel-body
-                            div(ng-hide='data.tables.length == 0')
-                                table.table-bordered.table-condensed.links-edit-small-padding.col-sm-12(st-table='data.tables')
-                                    thead
-                                        tr
-                                            th.col-sm-3 Schema/Table
-                                            th Key class
-                                            th Value class
-                                    tbody
-                                        tr(ng-repeat='row in data.tables')
-                                            td(colspan='{{row.tableName ? 1 : 3}}')
-                                                div.checkbox(ng-if='!row.tableName')
-                                                    label(ng-click='selectSchema($index)')
-                                                        input(type='checkbox' ng-checked='row.use')
-                                                        | {{row.schemaName}}
-                                                div.checkbox(ng-if='row.tableName')
-                                                    label(style='padding-left: 30px' ng-click='selectTable($index)')
-                                                        input(type='checkbox' ng-checked = 'row.use')
-                                                        | {{row.tableName}}
-                                            td(ng-if='row.tableName')
-                                                a(ng-show='data.curTableIdx != $index' ng-click='selectTable($index)') {{row.keyClass}}
-                                                input.form-control(type='text' ng-show='data.curTableIdx == $index' ng-model='data.curKeyClass' placeholder='Key class full name')
-                                            td(ng-if='row.tableName')
-                                                a(ng-show='data.curTableIdx != $index' ng-click='selectTable($index)') {{row.valueClass}}
-                                                input.form-control(type='text' ng-show='data.curTableIdx == $index' ng-model='data.curValueClass' placeholder='Value class full name')
-                            div(ng-hide='data.curTableIdx < 0')
-                                table.table-bordered.table-condensed.links-edit-small-padding.col-sm-12(st-table='data.tables[data.curTableIdx].fields')
-                                    thead
-                                        tr
-                                            th(style='width:45px') Use
-                                            th(style='width:45px') Key
-                                            th(style='width:45px') Ak
-                                            th DB Name
-                                            th DB Type
-                                            th Java Name
-                                            th Java Type
-                                    tbody
-                                        tr(ng-repeat='row in data.tables[data.curTableIdx].fields')
-                                            td
-                                                +dbcheck('row.use')
-                                            td
-                                                +dbcheck('row.key')
-                                            td
-                                                +dbcheck('row.ak')
-                                            td
-                                                label {{row.dbName}}
-                                            td
-                                                label {{row.dbType}}
-                                            td
-                                                a(ng-show='data.curFieldIdx != $index' ng-click='selectField($index)') {{row.javaName}}
-                                                input.form-control(type='text' ng-show='data.curFieldIdx == $index' ng-model='data.curJavaName' placeholder='Field Java name')
-                                            td
-                                                a(ng-show='data.curFieldIdx != $index' ng-click='selectField($index)') {{row.javaType}}
-                                                input.form-control(type='text' ng-show='data.curFieldIdx == $index' ng-model='data.curJavaType' placeholder='Field Java type')
-        button.btn.btn-primary(ng-disabled='inputForm.$invalid' ng-click='saveItem()') Save
-        button.btn.btn-primary.btn-second(ng-show='backupItem._id' ng-click='removeItem()') Remove
-        button.btn.btn-primary.btn-second(ng-click='reloadMetadata()') Reload
-
-

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/181fd985/modules/web-control-center/nodejs/views/profile.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/views/profile.jade b/modules/web-control-center/nodejs/views/profile.jade
deleted file mode 100644
index 358d30c..0000000
--- a/modules/web-control-center/nodejs/views/profile.jade
+++ /dev/null
@@ -1,58 +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.
-
-extends templates/layout
-
-mixin lbl(txt)
-    label.col-sm-2.required.labelFormField #{txt}
-
-append scripts
-    script(src='/profile-controller.js')
-
-block container
-    .row.greedy(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-sm-4
-                                input.form-control(type='text' ng-model='profileUser.username' placeholder='Input name' required)
-                        .details-row
-                            +lbl('Email:')
-                            .col-sm-4
-                                input.form-control(type='email' ng-model='profileUser.email' placeholder='you@domain.com' required)
-                        .details-row
-                            .checkbox
-                                label
-                                    input(type="checkbox" ng-model='profileUser.changePassword')
-                                    | Change password
-                        div(ng-show='profileUser.changePassword')
-                            .details-row
-                                +lbl('New password:')
-                                .col-sm-4
-                                    input.form-control(type='password', ng-model='profileUser.newPassword' placeholder='New password' ng-required='profileUser.changePassword')
-                            .details-row
-                                +lbl('Confirm:')
-                                .col-sm-4
-                                    input.form-control(type='password', ng-model='profileUser.confirmPassword' match='profileUser.newPassword' placeholder='Confirm new password' ng-required='profileUser.changePassword')
-                    .col-sm-12.details-row
-                        button#save-btn.btn.btn-primary(ng-disabled='profileForm.$invalid' ng-click='saveUser()') Save
-