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

[45/50] [abbrv] incubator-ignite git commit: Merge branches 'ignite-843' and 'ignite-sprint-7' of https://git-wip-us.apache.org/repos/asf/incubator-ignite into ignite-843

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/92c06985/modules/webconfig/src/main/webapp/clusters.html
----------------------------------------------------------------------
diff --cc modules/webconfig/src/main/webapp/clusters.html
index 0000000,0000000..c9ca499
new file mode 100644
--- /dev/null
+++ b/modules/webconfig/src/main/webapp/clusters.html
@@@ -1,0 -1,0 +1,493 @@@
++<!DOCTYPE html>
++<html ng-app="ignite-web-configurator">
++  <head>
++    <title></title>
++    <!-- Bootstrap-->
++    <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.4/css/bootstrap.css">
++    <!-- Font Awesome Icons-->
++    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.css">
++    <!-- Font-->
++    <link rel="stylesheet" href="//fonts.googleapis.com/css?family=Roboto+Slab:700:serif|Roboto+Slab:400:serif">
++    <link rel="stylesheet" href="/stylesheets/style.css">
++    <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.js"></script>
++    <script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/3.9.3/lodash.min.js"></script>
++    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.js"></script>
++    <script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.15/angular-sanitize.js"></script>
++    <script src="//cdnjs.cloudflare.com/ajax/libs/angular-strap/2.2.2/angular-strap.js"></script>
++    <script src="//cdnjs.cloudflare.com/ajax/libs/angular-strap/2.2.2/angular-strap.tpl.min.js"></script>
++    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-smart-table/2.0.3/smart-table.js"></script>
++    <script src="/javascripts/controllers/common.js"></script>
++    <script src="/javascripts/dataStructures.js"></script>
++    <script src="/javascripts/bundle.js"></script>
++    <script src="/javascripts/controllers/clusters.js"></script>
++  </head>
++  <body class="theme-line body-overlap">
++    <div class="wrapper">
++      <header id="header" class="header">
++        <div class="container">
++          <h1 class="navbar-brand"><a href="/">Apache Ignite Web Configurator</a></h1>
++          <div ng-controller="auth" class="navbar-collapse collapse">
++            <ul ng-controller="activeLink" class="nav navbar-nav">
++              <li><a ng-class="{active: isActive('/clusters')}" href="/clusters">Configuration</a></li>
++              <li><a ng-class="{active: isActive('/sql')}" href="/sql">SQL</a></li>
++            </ul>
++            <ul ng-init="user = undefined" class="nav navbar-nav pull-right">
++              <li ng-show="user"><a data-toggle="dropdown" aria-expanded="true" bs-dropdown data-template="user-dropdown" data-placement="bottom-right" class="dropdown-toggle">{{user.username}}<span class="caret"></span></a>
++                <script id="user-dropdown" type="text/ng-template">
++                  <ul class="dropdown-menu">
++                    <li><a href="/rest/auth/logout">Log Out</a></li>
++                  </ul>
++                </script>
++              </li>
++              <li ng-show="!user" class="nav-login"><a ng-click="login()" href="#">Log In</a></li>
++            </ul>
++          </div>
++        </div>
++      </header>
++      <div class="container body-container">
++        <div class="main-content">
++          <div class="main-head">
++            <div class="row">
++              <div class="col-sm-2 border-right section-left greedy">
++                <div class="sidebar-nav">
++                  <ul ng-controller="activeLink" class="menu">
++                    <li><a ng-class="{active: isActive('/clusters')}" href="/clusters">Clusters</a></li>
++                    <li><a ng-class="{active: isActive('/caches')}" href="/caches">Caches</a></li>
++                    <li><a ng-class="{active: isActive('/persistence')}" href="/persistence">Persistence</a></li>
++                    <li><a ng-class="{active: isActive('/clients')}" href="/clients">Clients</a></li>
++                    <li>
++                      <p></p><a ng-class="{active: isActive('/summary')}" href="/summary">Summary</a>
++                    </li>
++                  </ul>
++                </div>
++              </div>
++              <div class="col-sm-10 border-left section-right">
++                <div class="docs-content">
++                  <div class="docs-header">
++                    <h1>Clusters</h1>
++                    <p>Create and configure Ignite clusters.</p>
++                    <hr>
++                  </div>
++                  <div ng-controller="clustersController" class="docs-body">
++                    <div ng-hide="clusters.length == 0" class="links">
++                      <table st-table="clusters" class="col-sm-12">
++                        <tbody>
++                          <tr ng-repeat="row in clusters track by row._id">
++                            <td ng-class="{active: row._id == selectedItem._id}" class="col-sm-6"><a ng-click="selectItem(row)">{{$index + 1}}. {{row.name}}, {{row.discovery.kind | displayValue:discoveries:'Discovery not set'}}</a></td>
++                          </tr>
++                        </tbody>
++                      </table>
++                    </div>
++                    <button ng-click="createItem()" ng-disabled="!create.template" class="btn btn-primary">&nbspAdd cluster</button>
++                    <label style="margin-left: 15px; margin-right: 10px">Use template:</label>
++                    <button 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 class="btn btn-default"></button><i bs-tooltip data-title="{{joinTip(templateTip)}}" type="button" class="tiplabel fa fa-question-circle"></i>
++                    <hr>
++                    <form name="inputForm" ng-if="backupItem" novalidate class="form-horizontal">
++                      <div bs-collapse data-start-collapsed="false">
++                        <div class="panel panel-default">
++                          <div class="panel-heading">
++                            <h3><a bs-collapse-toggle>General</a></h3>
++                          </div>
++                          <div bs-collapse-target class="panel-collapse">
++                            <div class="panel-body">
++                              <div ng-repeat="field in general" class="settings-row">
++                                <div ng-switch="field.type">
++                                  <div ng-switch-when="check" class="checkbox col-sm-6">
++                                    <label>
++                                      <input type="checkbox" ng-model="getModel(backupItem, field.path)[field.model]"/>{{field.label}}<i ng-if="field.tip" bs-tooltip="joinTip(field.tip)" type="button" class="tipLabel fa fa-question-circle"></i><i ng-if="!field.tip" class="tipLabel fa fa-question-circle blank"></i>
++                                    </label>
++                                  </div>
++                                  <div ng-switch-when="text">
++                                    <label ng-class="{required: field.required}" class="col-sm-2">{{field.label}}:</label>
++                                    <div class="col-sm-4"><i ng-if="field.tip" bs-tooltip="joinTip(field.tip)" type="button" class="tipField fa fa-question-circle"></i><i ng-if="!field.tip" class="tipField fa fa-question-circle blank"></i>
++                                      <div class="input-tip">
++                                        <input type="text" placeholder="{{field.placeholder}}" ng-required="field.required" class="form-control" ng-model="getModel(backupItem, field.path)[field.model]"/>
++                                      </div>
++                                    </div>
++                                  </div>
++                                  <div ng-switch-when="password">
++                                    <label ng-class="{required: field.required}" class="col-sm-2">{{field.label}}:</label>
++                                    <div class="col-sm-4"><i ng-if="field.tip" bs-tooltip="joinTip(field.tip)" type="button" class="tipField fa fa-question-circle"></i><i ng-if="!field.tip" class="tipField fa fa-question-circle blank"></i>
++                                      <div class="input-tip">
++                                        <input type="password" placeholder="{{field.placeholder}}" ng-required="field.required" class="form-control" ng-model="getModel(backupItem, field.path)[field.model]"/>
++                                      </div>
++                                    </div>
++                                  </div>
++                                  <div ng-switch-when="number">
++                                    <label ng-class="{required: field.required}" class="col-sm-2">{{field.label}}:</label>
++                                    <div class="col-sm-4"><i ng-if="field.tip" bs-tooltip="joinTip(field.tip)" type="button" class="tipField fa fa-question-circle"></i><i ng-if="!field.tip" class="tipField fa fa-question-circle blank"></i>
++                                      <div class="input-tip">
++                                        <input name="{{field.model}}" type="number" placeholder="{{field.placeholder}}" min="{{field.min ? field.min : 0}}" max="{{field.max ? field.max : Number.MAX_VALUE}}" ng-required="field.required" class="form-control" ng-model="getModel(backupItem, field.path)[field.model]"/><i ng-show="inputForm[&quot;{{field.model}}&quot;].$error.min" bs-tooltip="bs-tooltip" data-title="Value is less than allowable minimum." type="button" class="fa fa-exclamation-triangle form-control-feedback"></i><i ng-show="inputForm[&quot;{{field.model}}&quot;].$error.max" bs-tooltip="bs-tooltip" data-title="Value is more than allowable maximum." type="button" class="fa fa-exclamation-triangle form-control-feedback"></i><i ng-show="inputForm[&quot;{{field.model}}&quot;].$error.number" bs-tooltip="bs-tooltip" data-title="Invalid value. Only numbers allowed." type="button" class="fa fa-exclamation-triangle form-control-feedback"></i>
++                                      </div>
++                                    </div>
++                                  </div>
++                                  <div ng-switch-when="dropdown">
++                                    <label ng-class="{required: field.required}" class="col-sm-2">{{field.label}}:</label>
++                                    <div class="col-sm-4"><i ng-if="field.tip" bs-tooltip="joinTip(field.tip)" type="button" class="tipField fa fa-question-circle"></i><i ng-if="!field.tip" class="tipField fa fa-question-circle blank"></i>
++                                      <div class="input-tip">
++                                        <button bs-select="bs-select" ng-required="field.required" data-placeholder="{{field.placeholder}}" bs-options="item.value as item.label for item in {{field.items}}" class="form-control" ng-model="getModel(backupItem, field.path)[field.model]"></button>
++                                      </div>
++                                    </div>
++                                  </div>
++                                  <div ng-switch-when="dropdown-multiple">
++                                    <label ng-class="{required: field.required}" class="col-sm-2">{{field.label}}:</label>
++                                    <div class="col-sm-4"><i ng-if="field.tip" bs-tooltip="joinTip(field.tip)" type="button" class="tipField fa fa-question-circle"></i><i ng-if="!field.tip" class="tipField fa fa-question-circle blank"></i>
++                                      <div class="input-tip">
++                                        <button bs-select="bs-select" ng-disabled="{{field.items}}.length == 0" data-multiple="1" data-placeholder="{{field.placeholder}}" bs-options="item.value as item.label for item in {{field.items}}" class="form-control" ng-model="getModel(backupItem, field.path)[field.model]"></button>
++                                      </div>
++                                    </div><a ng-show="field.addLink" ng-href="{{field.addLink.ref}}" class="customize">{{field.addLink.label}}</a>
++                                  </div>
++                                  <div ng-switch-when="dropdown-details">
++                                    <label ng-class="{required: field.required}" class="col-sm-2">{{field.label}}:</label>
++                                    <div class="col-sm-4"><i ng-if="field.tip" bs-tooltip="joinTip(field.tip)" type="button" class="tipField fa fa-question-circle"></i><i ng-if="!field.tip" class="tipField fa fa-question-circle blank"></i>
++                                      <div class="input-tip">
++                                        <button bs-select="bs-select" ng-required="field.required" data-placeholder="{{field.placeholder}}" bs-options="item.value as item.label for item in {{field.items}}" class="form-control" ng-model="getModel(backupItem, field.path)[field.model]"></button>
++                                      </div>
++                                    </div><a ng-show="getModel(backupItem, field.path)[field.model] &amp;&amp; field.details[getModel(backupItem, field.path)[field.model]].fields" ng-click="field.details[getModel(backupItem, field.path)[field.model]].expanded = !field.details[getModel(backupItem, field.path)[field.model]].expanded" class="customize">{{field.details[getModel(backupItem, field.path)[field.model]].expanded ? "Hide settings" : "Show settings"}}</a>
++                                    <div ng-show="field.details[getModel(backupItem, field.path)[field.model]].expanded &amp;&amp; getModel(backupItem, field.path)[field.model]" class="col-sm-6 panel-details">
++                                      <div ng-repeat="detail in field.details[getModel(backupItem, field.path)[field.model]].fields" class="details-row">
++                                        <div ng-switch="detail.type">
++                                          <div ng-switch-when="check" class="checkbox">
++                                            <label>
++                                              <input type="checkbox" ng-model="getModel(backupItem, detail.path)[detail.model]"/>{{detail.label}}<i ng-if="detail.tip" bs-tooltip="joinTip(detail.tip)" type="button" class="tipLabel fa fa-question-circle"></i><i ng-if="!detail.tip" class="tipLabel fa fa-question-circle blank"></i>
++                                            </label>
++                                          </div>
++                                          <div ng-switch-when="text">
++                                            <label class="col-sm-4 details-label">{{detail.label}}:</label>
++                                            <div class="col-sm-8"><i ng-if="detail.tip" bs-tooltip="joinTip(detail.tip)" type="button" class="tipField fa fa-question-circle"></i><i ng-if="!detail.tip" class="tipField fa fa-question-circle blank"></i>
++                                              <div class="input-tip">
++                                                <input type="text" placeholder="{{detail.placeholder}}" class="form-control" ng-model="getModel(backupItem, detail.path)[detail.model]"/>
++                                              </div>
++                                            </div>
++                                          </div>
++                                          <div ng-switch-when="number">
++                                            <label class="col-sm-4 details-label">{{detail.label}}:</label>
++                                            <div class="col-sm-8"><i ng-if="detail.tip" bs-tooltip="joinTip(detail.tip)" type="button" class="tipField fa fa-question-circle"></i><i ng-if="!detail.tip" class="tipField fa fa-question-circle blank"></i>
++                                              <div class="input-tip">
++                                                <input name="{{detail.model}}" type="number" placeholder="{{detail.placeholder}}" min="{{detail.min ? detail.min : 0}}" max="{{detail.max ? detail.max : Number.MAX_VALUE}}" class="form-control" ng-model="getModel(backupItem, detail.path)[detail.model]"/><i ng-show="inputForm[&quot;{{detail.model}}&quot;].$error.min" bs-tooltip="bs-tooltip" data-title="Value is less than allowable minimum." type="button" class="fa fa-exclamation-triangle form-control-feedback"></i><i ng-show="inputForm[&quot;{{detail.model}}&quot;].$error.max" bs-tooltip="bs-tooltip" data-title="Value is more than allowable maximum." type="button" class="fa fa-exclamation-triangle form-control-feedback"></i><i ng-show="inputForm[&quot;{{detail.model}}&quot;].$error.number" bs-tooltip="bs-tooltip" data-title="Invalid value. Only numbers allowed." type="button" class="fa fa-exclamation-triangle form-control-feedback"></i>
++                                              </div>
++                                            </div>
++                                          </div>
++                                          <div ng-switch-when="dropdown">
++                                            <label class="col-sm-4 details-label">{{detail.label}}:</label>
++                                            <div class="col-sm-8"><i ng-if="detail.tip" bs-tooltip="joinTip(detail.tip)" type="button" class="tipField fa fa-question-circle"></i><i ng-if="!detail.tip" class="tipField fa fa-question-circle blank"></i>
++                                              <div class="input-tip">
++                                                <button bs-select="bs-select" data-placeholder="{{detail.placeholder}}" bs-options="item.value as item.label for item in {{detail.items}}" class="form-control" ng-model="getModel(backupItem, detail.path)[detail.model]"></button>
++                                              </div>
++                                            </div>
++                                          </div>
++                                          <div ng-switch-when="dropdown-multiple">
++                                            <label class="col-sm-4 details-label">{{detail.label}}:</label>
++                                            <div class="col-sm-8">
++                                              <button bs-select="bs-select" data-multiple="1" data-placeholder="{{detail.placeholder}}" bs-options="item.value as item.label for item in {{detail.items}}" class="form-control" ng-model="getModel(backupItem, detail.path)[detail.model]"></button>
++                                            </div><i ng-if="detail.tip" bs-tooltip="joinTip(detail.tip)" type="button" class="tipField fa fa-question-circle"></i><i ng-if="!detail.tip" class="tipField fa fa-question-circle blank"></i>
++                                          </div>
++                                          <div ng-switch-when="table-simple" style="margin-right: 5px; margin-top: -0.65em" ng-model="getModel(backupItem, detail.path)[detail.model]">
++                                            <table st-table="getModel(backupItem, detail.path)[detail.model]" ng-show="getModel(backupItem, detail.path)[detail.model].length &gt; 0" class="col-sm-12 links-edit">
++                                              <tbody>
++                                                <tr ng-repeat="item in getModel(backupItem, detail.path)[detail.model] track by $index">
++                                                  <td class="col-sm-11">
++                                                    <div ng-show="detail.editIdx != {{$index}}"><a ng-click="detail.editIdx = $index; curValue = getModel(backupItem, detail.path)[detail.model][$index]">{{$index + 1}}) {{item}}</a><i ng-click="detail.editIdx = -1; getModel(backupItem, detail.path)[detail.model].splice($index, 1)" class="tipField fa fa-remove"></i></div>
++                                                    <div ng-show="detail.editIdx == {{$index}}">
++                                                      <label class="labelField">{{$index + 1}})</label><i ng-click="detail.editIdx = -1; getModel(backupItem, detail.path)[detail.model][$index]=curValue" class="tipField fa fa-floppy-o"></i>
++                                                      <div class="input-tip">
++                                                        <input type="text" ng-model="curValue" placeholder="{{detail.placeholder}}" class="form-control"/>
++                                                      </div>
++                                                    </div>
++                                                  </td>
++                                                  <td ng-if="detail.reordering" class="col-sm-1"><i ng-show="$index &gt; 0" ng-click="swapSimpleItems(detailMdl, $index, $index - 1); detail.editIdx = -1;" class="fa fa-arrow-up"></i><i ng-show="$index &lt; getModel(backupItem, detail.path)[detail.model].length - 1" ng-click="swapSimpleItems(getModel(backupItem, detail.path)[detail.model], $index, $index + 1); detail.editIdx = -1;" class="fa fa-arrow-down"></i></td>
++                                                </tr>
++                                              </tbody>
++                                            </table>
++                                            <button ng-disabled="!newValue || getModel(backupItem, detail.path)[detail.model].indexOf(newValue) &gt;= 0" ng-click="detail.editIdx = -1; getModel(backupItem, detail.path)[detail.model] ? getModel(backupItem, detail.path)[detail.model].push(newValue) : getModel(backupItem, detail.path)[detail.model] = [newValue];" class="btn btn-primary fieldButton">Add</button><i ng-if="detail.tip" bs-tooltip="joinTip(detail.tip)" type="button" class="tipField fa fa-question-circle"></i><i ng-if="!detail.tip" class="tipField fa fa-question-circle blank"></i>
++                                            <div class="input-tip">
++                                              <input type="text" ng-model="newValue" ng-focus="detail.editIdx = -1" placeholder="{{detail.placeholder}}" class="form-control"/>
++                                            </div>
++                                          </div>
++                                        </div>
++                                      </div>
++                                    </div>
++                                  </div>
++                                  <div ng-switch-when="table-simple" ng-model="getModel(backupItem, field.path)[field.model]">
++                                    <div>
++                                      <label>{{field.tableLabel}}: {{getModel(backupItem, field.path)[field.model].length}}</label><i ng-if="field.tip" bs-tooltip="joinTip(field.tip)" type="button" class="tipLabel fa fa-question-circle"></i><i ng-if="!field.tip" class="tipLabel fa fa-question-circle blank"></i>
++                                    </div>
++                                    <table st-table="getModel(backupItem, field.path)[field.model]" ng-show="getModel(backupItem, field.path)[field.model].length &gt; 0" class="links-edit col-sm-12">
++                                      <tbody>
++                                        <tr ng-repeat="item in getModel(backupItem, field.path)[field.model] track by $index" class="col-sm-12">
++                                          <td class="col-sm-6">
++                                            <div ng-show="field.editIdx != {{$index}}"><a ng-click="field.editIdx = $index; curValue = getModel(backupItem, field.path)[field.model][$index]">{{$index + 1}}) {{item | compact}}</a><i ng-click="field.editIdx = -1; getModel(backupItem, field.path)[field.model].splice($index, 1)" class="tipField fa fa-remove"></i></div>
++                                            <div ng-show="field.editIdx == {{$index}}">
++                                              <label class="labelField">{{$index + 1}})</label><i ng-click="field.editIdx = -1; getModel(backupItem, field.path)[field.model][$index]=curValue" class="tipField fa fa-floppy-o"></i>
++                                              <div class="input-tip">
++                                                <input type="text" ng-model="curValue" placeholder="{{field.placeholder}}" class="form-control"/>
++                                              </div>
++                                            </div>
++                                          </td>
++                                          <td ng-if="field.reordering" class="col-sm-1"><i ng-show="$index &gt; 0" ng-click="swapSimpleItems(fieldMdl, $index, $index - 1); field.editIdx = -1;" class="fa fa-arrow-up"></i><i ng-show="$index &lt; getModel(backupItem, field.path)[field.model].length - 1" ng-click="swapSimpleItems(getModel(backupItem, field.path)[field.model], $index, $index + 1); field.editIdx = -1;" class="fa fa-arrow-down"></i></td>
++                                        </tr>
++                                      </tbody>
++                                    </table>
++                                    <div class="col-sm-6">
++                                      <button ng-disabled="!newValue || getModel(backupItem, field.path)[field.model].indexOf(newValue) &gt;= 0" ng-click="field.editIdx = -1; getModel(backupItem, field.path)[field.model] ? getModel(backupItem, field.path)[field.model].push(newValue) : getModel(backupItem, field.path)[field.model] = [newValue];" class="btn btn-primary fieldButton">Add</button><i ng-if="field.tip" bs-tooltip="joinTip(field.tip)" type="button" class="tipField fa fa-question-circle"></i><i ng-if="!field.tip" class="tipField fa fa-question-circle blank"></i>
++                                      <div class="input-tip">
++                                        <input type="text" ng-model="newValue" ng-focus="field.editIdx = -1" placeholder="{{field.placeholder}}" class="form-control"/>
++                                      </div>
++                                    </div>
++                                  </div>
++                                  <div ng-switch-when="indexedTypes">
++                                    <div>
++                                      <label>Indexed types: {{backupItem.indexedTypes.length}}</label><i ng-if="field.tip" bs-tooltip="joinTip(field.tip)" type="button" class="tipLabel fa fa-question-circle"></i><i ng-if="!field.tip" class="tipLabel fa fa-question-circle blank"></i>
++                                    </div>
++                                    <table st-table="backupItem.indexedTypes" ng-show="backupItem.indexedTypes.length &gt; 0" class="links-edit col-sm-12">
++                                      <tbody>
++                                        <tr ng-repeat="item in backupItem.indexedTypes" class="col-sm-12">
++                                          <td class="col-sm-6">
++                                            <div ng-show="field.editIdx != {{$index}}"><a ng-click="field.editIdx = $index; curKeyClass = backupItem.indexedTypes[$index].keyClass; curValueClass = backupItem.indexedTypes[$index].valueClass">{{$index + 1}}) {{item.keyClass}} / {{item.valueClass}}</a><i ng-click="field.editIdx = -1; backupItem.indexedTypes.splice($index, 1)" class="tipField fa fa-remove"></i></div>
++                                            <div ng-show="field.editIdx == {{$index}}">
++                                              <label class="labelField">{{$index + 1}})</label><i ng-click="field.editIdx = -1; backupItem.indexedTypes[$index]={keyClass: curKeyClass, valueClass: curValueClass}" class="tipField fa fa-floppy-o"></i>
++                                              <div class="input-tip">
++                                                <div class="col-sm-12">
++                                                  <input type="text" ng-model="curKeyClass" placeholder="Key class full name" class="form-control table-form-control"/>
++                                                  <label>&nbsp;/&nbsp;</label>
++                                                  <input type="text" ng-model="curValueClass" placeholder="Value class full name" class="form-control table-form-control"/>
++                                                </div>
++                                              </div>
++                                            </div>
++                                          </td>
++                                        </tr>
++                                      </tbody>
++                                    </table>
++                                    <div class="col-sm-6">
++                                      <input type="text" ng-model="newKeyClass" ng-focus="field.editIdx = -1" placeholder="Key class full name" class="form-control"/>
++                                      <div class="settings-row">
++                                        <input type="text" ng-model="newValueClass" ng-focus="field.editIdx = -1" placeholder="Value class full name" class="form-control"/>
++                                      </div>
++                                      <button ng-click="field.editIdx = -1; addIndexedTypes(newKeyClass, newValueClass)" class="btn btn-primary fieldButton">Add</button>
++                                    </div>
++                                  </div>
++                                </div>
++                              </div>
++                            </div>
++                          </div>
++                        </div>
++                      </div>
++                      <div bs-collapse data-start-collapsed="true">
++                        <div ng-show="expanded" class="panel-title">
++                          <h3><a bs-collapse-toggle="0" ng-click="expanded = !expanded;">{{expanded ? 'Hide advanced settings...' : 'Show advanced settings...'}}</a></h3>
++                        </div>
++                        <div bs-collapse-target class="panel-collapse">
++                          <div bs-collapse data-start-collapsed="true" data-allow-multiple="true" class="span">
++                            <div ng-repeat="group in advanced" class="panel panel-default">
++                              <div class="panel-heading">
++                                <h3><a bs-collapse-toggle>{{group.label}}</a><i ng-if="group.tip" bs-tooltip="joinTip(group.tip)" type="button" class="tipLabel fa fa-question-circle"></i><i ng-if="!group.tip" class="tipLabel fa fa-question-circle blank"></i></h3>
++                              </div>
++                              <div bs-collapse-target class="panel-collapse">
++                                <div class="panel-body">
++                                  <div ng-repeat="field in group.fields" class="settings-row">
++                                    <div ng-switch="field.type">
++                                      <div ng-switch-when="check" class="checkbox col-sm-6">
++                                        <label>
++                                          <input type="checkbox" ng-model="getModel(backupItem, field.path)[field.model]"/>{{field.label}}<i ng-if="field.tip" bs-tooltip="joinTip(field.tip)" type="button" class="tipLabel fa fa-question-circle"></i><i ng-if="!field.tip" class="tipLabel fa fa-question-circle blank"></i>
++                                        </label>
++                                      </div>
++                                      <div ng-switch-when="text">
++                                        <label ng-class="{required: field.required}" class="col-sm-2">{{field.label}}:</label>
++                                        <div class="col-sm-4"><i ng-if="field.tip" bs-tooltip="joinTip(field.tip)" type="button" class="tipField fa fa-question-circle"></i><i ng-if="!field.tip" class="tipField fa fa-question-circle blank"></i>
++                                          <div class="input-tip">
++                                            <input type="text" placeholder="{{field.placeholder}}" ng-required="field.required" class="form-control" ng-model="getModel(backupItem, field.path)[field.model]"/>
++                                          </div>
++                                        </div>
++                                      </div>
++                                      <div ng-switch-when="password">
++                                        <label ng-class="{required: field.required}" class="col-sm-2">{{field.label}}:</label>
++                                        <div class="col-sm-4"><i ng-if="field.tip" bs-tooltip="joinTip(field.tip)" type="button" class="tipField fa fa-question-circle"></i><i ng-if="!field.tip" class="tipField fa fa-question-circle blank"></i>
++                                          <div class="input-tip">
++                                            <input type="password" placeholder="{{field.placeholder}}" ng-required="field.required" class="form-control" ng-model="getModel(backupItem, field.path)[field.model]"/>
++                                          </div>
++                                        </div>
++                                      </div>
++                                      <div ng-switch-when="number">
++                                        <label ng-class="{required: field.required}" class="col-sm-2">{{field.label}}:</label>
++                                        <div class="col-sm-4"><i ng-if="field.tip" bs-tooltip="joinTip(field.tip)" type="button" class="tipField fa fa-question-circle"></i><i ng-if="!field.tip" class="tipField fa fa-question-circle blank"></i>
++                                          <div class="input-tip">
++                                            <input name="{{field.model}}" type="number" placeholder="{{field.placeholder}}" min="{{field.min ? field.min : 0}}" max="{{field.max ? field.max : Number.MAX_VALUE}}" ng-required="field.required" class="form-control" ng-model="getModel(backupItem, field.path)[field.model]"/><i ng-show="inputForm[&quot;{{field.model}}&quot;].$error.min" bs-tooltip="bs-tooltip" data-title="Value is less than allowable minimum." type="button" class="fa fa-exclamation-triangle form-control-feedback"></i><i ng-show="inputForm[&quot;{{field.model}}&quot;].$error.max" bs-tooltip="bs-tooltip" data-title="Value is more than allowable maximum." type="button" class="fa fa-exclamation-triangle form-control-feedback"></i><i ng-show="inputForm[&quot;{{field.model}}&quot;].$error.number" bs-tooltip="bs-tooltip" data-title="Invalid value. Only numbers allowed." type="button" class="fa fa-exclamation-triangle form-control-feedback"></i>
++                                          </div>
++                                        </div>
++                                      </div>
++                                      <div ng-switch-when="dropdown">
++                                        <label ng-class="{required: field.required}" class="col-sm-2">{{field.label}}:</label>
++                                        <div class="col-sm-4"><i ng-if="field.tip" bs-tooltip="joinTip(field.tip)" type="button" class="tipField fa fa-question-circle"></i><i ng-if="!field.tip" class="tipField fa fa-question-circle blank"></i>
++                                          <div class="input-tip">
++                                            <button bs-select="bs-select" ng-required="field.required" data-placeholder="{{field.placeholder}}" bs-options="item.value as item.label for item in {{field.items}}" class="form-control" ng-model="getModel(backupItem, field.path)[field.model]"></button>
++                                          </div>
++                                        </div>
++                                      </div>
++                                      <div ng-switch-when="dropdown-multiple">
++                                        <label ng-class="{required: field.required}" class="col-sm-2">{{field.label}}:</label>
++                                        <div class="col-sm-4"><i ng-if="field.tip" bs-tooltip="joinTip(field.tip)" type="button" class="tipField fa fa-question-circle"></i><i ng-if="!field.tip" class="tipField fa fa-question-circle blank"></i>
++                                          <div class="input-tip">
++                                            <button bs-select="bs-select" ng-disabled="{{field.items}}.length == 0" data-multiple="1" data-placeholder="{{field.placeholder}}" bs-options="item.value as item.label for item in {{field.items}}" class="form-control" ng-model="getModel(backupItem, field.path)[field.model]"></button>
++                                          </div>
++                                        </div><a ng-show="field.addLink" ng-href="{{field.addLink.ref}}" class="customize">{{field.addLink.label}}</a>
++                                      </div>
++                                      <div ng-switch-when="dropdown-details">
++                                        <label ng-class="{required: field.required}" class="col-sm-2">{{field.label}}:</label>
++                                        <div class="col-sm-4"><i ng-if="field.tip" bs-tooltip="joinTip(field.tip)" type="button" class="tipField fa fa-question-circle"></i><i ng-if="!field.tip" class="tipField fa fa-question-circle blank"></i>
++                                          <div class="input-tip">
++                                            <button bs-select="bs-select" ng-required="field.required" data-placeholder="{{field.placeholder}}" bs-options="item.value as item.label for item in {{field.items}}" class="form-control" ng-model="getModel(backupItem, field.path)[field.model]"></button>
++                                          </div>
++                                        </div><a ng-show="getModel(backupItem, field.path)[field.model] &amp;&amp; field.details[getModel(backupItem, field.path)[field.model]].fields" ng-click="field.details[getModel(backupItem, field.path)[field.model]].expanded = !field.details[getModel(backupItem, field.path)[field.model]].expanded" class="customize">{{field.details[getModel(backupItem, field.path)[field.model]].expanded ? "Hide settings" : "Show settings"}}</a>
++                                        <div ng-show="field.details[getModel(backupItem, field.path)[field.model]].expanded &amp;&amp; getModel(backupItem, field.path)[field.model]" class="col-sm-6 panel-details">
++                                          <div ng-repeat="detail in field.details[getModel(backupItem, field.path)[field.model]].fields" class="details-row">
++                                            <div ng-switch="detail.type">
++                                              <div ng-switch-when="check" class="checkbox">
++                                                <label>
++                                                  <input type="checkbox" ng-model="getModel(backupItem, detail.path)[detail.model]"/>{{detail.label}}<i ng-if="detail.tip" bs-tooltip="joinTip(detail.tip)" type="button" class="tipLabel fa fa-question-circle"></i><i ng-if="!detail.tip" class="tipLabel fa fa-question-circle blank"></i>
++                                                </label>
++                                              </div>
++                                              <div ng-switch-when="text">
++                                                <label class="col-sm-4 details-label">{{detail.label}}:</label>
++                                                <div class="col-sm-8"><i ng-if="detail.tip" bs-tooltip="joinTip(detail.tip)" type="button" class="tipField fa fa-question-circle"></i><i ng-if="!detail.tip" class="tipField fa fa-question-circle blank"></i>
++                                                  <div class="input-tip">
++                                                    <input type="text" placeholder="{{detail.placeholder}}" class="form-control" ng-model="getModel(backupItem, detail.path)[detail.model]"/>
++                                                  </div>
++                                                </div>
++                                              </div>
++                                              <div ng-switch-when="number">
++                                                <label class="col-sm-4 details-label">{{detail.label}}:</label>
++                                                <div class="col-sm-8"><i ng-if="detail.tip" bs-tooltip="joinTip(detail.tip)" type="button" class="tipField fa fa-question-circle"></i><i ng-if="!detail.tip" class="tipField fa fa-question-circle blank"></i>
++                                                  <div class="input-tip">
++                                                    <input name="{{detail.model}}" type="number" placeholder="{{detail.placeholder}}" min="{{detail.min ? detail.min : 0}}" max="{{detail.max ? detail.max : Number.MAX_VALUE}}" class="form-control" ng-model="getModel(backupItem, detail.path)[detail.model]"/><i ng-show="inputForm[&quot;{{detail.model}}&quot;].$error.min" bs-tooltip="bs-tooltip" data-title="Value is less than allowable minimum." type="button" class="fa fa-exclamation-triangle form-control-feedback"></i><i ng-show="inputForm[&quot;{{detail.model}}&quot;].$error.max" bs-tooltip="bs-tooltip" data-title="Value is more than allowable maximum." type="button" class="fa fa-exclamation-triangle form-control-feedback"></i><i ng-show="inputForm[&quot;{{detail.model}}&quot;].$error.number" bs-tooltip="bs-tooltip" data-title="Invalid value. Only numbers allowed." type="button" class="fa fa-exclamation-triangle form-control-feedback"></i>
++                                                  </div>
++                                                </div>
++                                              </div>
++                                              <div ng-switch-when="dropdown">
++                                                <label class="col-sm-4 details-label">{{detail.label}}:</label>
++                                                <div class="col-sm-8"><i ng-if="detail.tip" bs-tooltip="joinTip(detail.tip)" type="button" class="tipField fa fa-question-circle"></i><i ng-if="!detail.tip" class="tipField fa fa-question-circle blank"></i>
++                                                  <div class="input-tip">
++                                                    <button bs-select="bs-select" data-placeholder="{{detail.placeholder}}" bs-options="item.value as item.label for item in {{detail.items}}" class="form-control" ng-model="getModel(backupItem, detail.path)[detail.model]"></button>
++                                                  </div>
++                                                </div>
++                                              </div>
++                                              <div ng-switch-when="dropdown-multiple">
++                                                <label class="col-sm-4 details-label">{{detail.label}}:</label>
++                                                <div class="col-sm-8">
++                                                  <button bs-select="bs-select" data-multiple="1" data-placeholder="{{detail.placeholder}}" bs-options="item.value as item.label for item in {{detail.items}}" class="form-control" ng-model="getModel(backupItem, detail.path)[detail.model]"></button>
++                                                </div><i ng-if="detail.tip" bs-tooltip="joinTip(detail.tip)" type="button" class="tipField fa fa-question-circle"></i><i ng-if="!detail.tip" class="tipField fa fa-question-circle blank"></i>
++                                              </div>
++                                              <div ng-switch-when="table-simple" style="margin-right: 5px; margin-top: -0.65em" ng-model="getModel(backupItem, detail.path)[detail.model]">
++                                                <table st-table="getModel(backupItem, detail.path)[detail.model]" ng-show="getModel(backupItem, detail.path)[detail.model].length &gt; 0" class="col-sm-12 links-edit">
++                                                  <tbody>
++                                                    <tr ng-repeat="item in getModel(backupItem, detail.path)[detail.model] track by $index">
++                                                      <td class="col-sm-11">
++                                                        <div ng-show="detail.editIdx != {{$index}}"><a ng-click="detail.editIdx = $index; curValue = getModel(backupItem, detail.path)[detail.model][$index]">{{$index + 1}}) {{item}}</a><i ng-click="detail.editIdx = -1; getModel(backupItem, detail.path)[detail.model].splice($index, 1)" class="tipField fa fa-remove"></i></div>
++                                                        <div ng-show="detail.editIdx == {{$index}}">
++                                                          <label class="labelField">{{$index + 1}})</label><i ng-click="detail.editIdx = -1; getModel(backupItem, detail.path)[detail.model][$index]=curValue" class="tipField fa fa-floppy-o"></i>
++                                                          <div class="input-tip">
++                                                            <input type="text" ng-model="curValue" placeholder="{{detail.placeholder}}" class="form-control"/>
++                                                          </div>
++                                                        </div>
++                                                      </td>
++                                                      <td ng-if="detail.reordering" class="col-sm-1"><i ng-show="$index &gt; 0" ng-click="swapSimpleItems(detailMdl, $index, $index - 1); detail.editIdx = -1;" class="fa fa-arrow-up"></i><i ng-show="$index &lt; getModel(backupItem, detail.path)[detail.model].length - 1" ng-click="swapSimpleItems(getModel(backupItem, detail.path)[detail.model], $index, $index + 1); detail.editIdx = -1;" class="fa fa-arrow-down"></i></td>
++                                                    </tr>
++                                                  </tbody>
++                                                </table>
++                                                <button ng-disabled="!newValue || getModel(backupItem, detail.path)[detail.model].indexOf(newValue) &gt;= 0" ng-click="detail.editIdx = -1; getModel(backupItem, detail.path)[detail.model] ? getModel(backupItem, detail.path)[detail.model].push(newValue) : getModel(backupItem, detail.path)[detail.model] = [newValue];" class="btn btn-primary fieldButton">Add</button><i ng-if="detail.tip" bs-tooltip="joinTip(detail.tip)" type="button" class="tipField fa fa-question-circle"></i><i ng-if="!detail.tip" class="tipField fa fa-question-circle blank"></i>
++                                                <div class="input-tip">
++                                                  <input type="text" ng-model="newValue" ng-focus="detail.editIdx = -1" placeholder="{{detail.placeholder}}" class="form-control"/>
++                                                </div>
++                                              </div>
++                                            </div>
++                                          </div>
++                                        </div>
++                                      </div>
++                                      <div ng-switch-when="table-simple" ng-model="getModel(backupItem, field.path)[field.model]">
++                                        <div>
++                                          <label>{{field.tableLabel}}: {{getModel(backupItem, field.path)[field.model].length}}</label><i ng-if="field.tip" bs-tooltip="joinTip(field.tip)" type="button" class="tipLabel fa fa-question-circle"></i><i ng-if="!field.tip" class="tipLabel fa fa-question-circle blank"></i>
++                                        </div>
++                                        <table st-table="getModel(backupItem, field.path)[field.model]" ng-show="getModel(backupItem, field.path)[field.model].length &gt; 0" class="links-edit col-sm-12">
++                                          <tbody>
++                                            <tr ng-repeat="item in getModel(backupItem, field.path)[field.model] track by $index" class="col-sm-12">
++                                              <td class="col-sm-6">
++                                                <div ng-show="field.editIdx != {{$index}}"><a ng-click="field.editIdx = $index; curValue = getModel(backupItem, field.path)[field.model][$index]">{{$index + 1}}) {{item | compact}}</a><i ng-click="field.editIdx = -1; getModel(backupItem, field.path)[field.model].splice($index, 1)" class="tipField fa fa-remove"></i></div>
++                                                <div ng-show="field.editIdx == {{$index}}">
++                                                  <label class="labelField">{{$index + 1}})</label><i ng-click="field.editIdx = -1; getModel(backupItem, field.path)[field.model][$index]=curValue" class="tipField fa fa-floppy-o"></i>
++                                                  <div class="input-tip">
++                                                    <input type="text" ng-model="curValue" placeholder="{{field.placeholder}}" class="form-control"/>
++                                                  </div>
++                                                </div>
++                                              </td>
++                                              <td ng-if="field.reordering" class="col-sm-1"><i ng-show="$index &gt; 0" ng-click="swapSimpleItems(fieldMdl, $index, $index - 1); field.editIdx = -1;" class="fa fa-arrow-up"></i><i ng-show="$index &lt; getModel(backupItem, field.path)[field.model].length - 1" ng-click="swapSimpleItems(getModel(backupItem, field.path)[field.model], $index, $index + 1); field.editIdx = -1;" class="fa fa-arrow-down"></i></td>
++                                            </tr>
++                                          </tbody>
++                                        </table>
++                                        <div class="col-sm-6">
++                                          <button ng-disabled="!newValue || getModel(backupItem, field.path)[field.model].indexOf(newValue) &gt;= 0" ng-click="field.editIdx = -1; getModel(backupItem, field.path)[field.model] ? getModel(backupItem, field.path)[field.model].push(newValue) : getModel(backupItem, field.path)[field.model] = [newValue];" class="btn btn-primary fieldButton">Add</button><i ng-if="field.tip" bs-tooltip="joinTip(field.tip)" type="button" class="tipField fa fa-question-circle"></i><i ng-if="!field.tip" class="tipField fa fa-question-circle blank"></i>
++                                          <div class="input-tip">
++                                            <input type="text" ng-model="newValue" ng-focus="field.editIdx = -1" placeholder="{{field.placeholder}}" class="form-control"/>
++                                          </div>
++                                        </div>
++                                      </div>
++                                      <div ng-switch-when="indexedTypes">
++                                        <div>
++                                          <label>Indexed types: {{backupItem.indexedTypes.length}}</label><i ng-if="field.tip" bs-tooltip="joinTip(field.tip)" type="button" class="tipLabel fa fa-question-circle"></i><i ng-if="!field.tip" class="tipLabel fa fa-question-circle blank"></i>
++                                        </div>
++                                        <table st-table="backupItem.indexedTypes" ng-show="backupItem.indexedTypes.length &gt; 0" class="links-edit col-sm-12">
++                                          <tbody>
++                                            <tr ng-repeat="item in backupItem.indexedTypes" class="col-sm-12">
++                                              <td class="col-sm-6">
++                                                <div ng-show="field.editIdx != {{$index}}"><a ng-click="field.editIdx = $index; curKeyClass = backupItem.indexedTypes[$index].keyClass; curValueClass = backupItem.indexedTypes[$index].valueClass">{{$index + 1}}) {{item.keyClass}} / {{item.valueClass}}</a><i ng-click="field.editIdx = -1; backupItem.indexedTypes.splice($index, 1)" class="tipField fa fa-remove"></i></div>
++                                                <div ng-show="field.editIdx == {{$index}}">
++                                                  <label class="labelField">{{$index + 1}})</label><i ng-click="field.editIdx = -1; backupItem.indexedTypes[$index]={keyClass: curKeyClass, valueClass: curValueClass}" class="tipField fa fa-floppy-o"></i>
++                                                  <div class="input-tip">
++                                                    <div class="col-sm-12">
++                                                      <input type="text" ng-model="curKeyClass" placeholder="Key class full name" class="form-control table-form-control"/>
++                                                      <label>&nbsp;/&nbsp;</label>
++                                                      <input type="text" ng-model="curValueClass" placeholder="Value class full name" class="form-control table-form-control"/>
++                                                    </div>
++                                                  </div>
++                                                </div>
++                                              </td>
++                                            </tr>
++                                          </tbody>
++                                        </table>
++                                        <div class="col-sm-6">
++                                          <input type="text" ng-model="newKeyClass" ng-focus="field.editIdx = -1" placeholder="Key class full name" class="form-control"/>
++                                          <div class="settings-row">
++                                            <input type="text" ng-model="newValueClass" ng-focus="field.editIdx = -1" placeholder="Value class full name" class="form-control"/>
++                                          </div>
++                                          <button ng-click="field.editIdx = -1; addIndexedTypes(newKeyClass, newValueClass)" class="btn btn-primary fieldButton">Add</button>
++                                        </div>
++                                      </div>
++                                    </div>
++                                  </div>
++                                </div>
++                              </div>
++                            </div>
++                          </div>
++                        </div>
++                        <div class="panel-title">
++                          <h3><a bs-collapse-toggle="0" ng-click="expanded = !expanded;">{{expanded ? 'Hide advanced settings...' : 'Show advanced settings...'}}</a></h3>
++                        </div>
++                      </div>
++                      <button id="save-btn" ng-disabled="inputForm.$invalid" ng-click="saveItem()" class="btn btn-primary">Save</button>
++                      <button ng-show="backupItem._id" ng-click="removeItem()" class="btn btn-primary">Remove</button>
++                    </form>
++                  </div>
++                </div>
++              </div>
++            </div>
++          </div>
++        </div>
++      </div>
++      <div class="container container-footer">
++        <footer>
++          <center>
++            <p>Powered by<a href="http://ignite.incubator.apache.org"> Apache Ignite</a>, version 1.1.0</p>
++          </center>
++        </footer>
++      </div>
++    </div>
++  </body>
++</html>

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/92c06985/modules/webconfig/src/main/webapp/images/docker.png
----------------------------------------------------------------------
diff --cc modules/webconfig/src/main/webapp/images/docker.png
index 0000000,0000000..7ec3aef
new file mode 100644
Binary files differ

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/92c06985/modules/webconfig/src/main/webapp/images/java.png
----------------------------------------------------------------------
diff --cc modules/webconfig/src/main/webapp/images/java.png
index 0000000,0000000..ddb3b8e
new file mode 100644
Binary files differ

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/92c06985/modules/webconfig/src/main/webapp/images/logo.png
----------------------------------------------------------------------
diff --cc modules/webconfig/src/main/webapp/images/logo.png
index 0000000,0000000..c3577c5
new file mode 100644
Binary files differ

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/92c06985/modules/webconfig/src/main/webapp/images/xml.png
----------------------------------------------------------------------
diff --cc modules/webconfig/src/main/webapp/images/xml.png
index 0000000,0000000..029065e
new file mode 100644
Binary files differ

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/92c06985/modules/webconfig/src/main/webapp/index.html
----------------------------------------------------------------------
diff --cc modules/webconfig/src/main/webapp/index.html
index 0000000,0000000..e4a70be
new file mode 100644
--- /dev/null
+++ b/modules/webconfig/src/main/webapp/index.html
@@@ -1,0 -1,0 +1,76 @@@
++<!DOCTYPE html>
++<html ng-app="ignite-web-configurator">
++  <head>
++    <title></title>
++    <!-- Bootstrap-->
++    <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.4/css/bootstrap.css">
++    <!-- Font Awesome Icons-->
++    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.css">
++    <!-- Font-->
++    <link rel="stylesheet" href="//fonts.googleapis.com/css?family=Roboto+Slab:700:serif|Roboto+Slab:400:serif">
++    <link rel="stylesheet" href="/stylesheets/style.css">
++    <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.js"></script>
++    <script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/3.9.3/lodash.min.js"></script>
++    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.js"></script>
++    <script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.15/angular-sanitize.js"></script>
++    <script src="//cdnjs.cloudflare.com/ajax/libs/angular-strap/2.2.2/angular-strap.js"></script>
++    <script src="//cdnjs.cloudflare.com/ajax/libs/angular-strap/2.2.2/angular-strap.tpl.min.js"></script>
++    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-smart-table/2.0.3/smart-table.js"></script>
++    <script src="/javascripts/controllers/common.js"></script>
++    <script src="/javascripts/dataStructures.js"></script>
++    <script src="/javascripts/bundle.js"></script>
++  </head>
++  <body class="theme-line body-overlap">
++    <div class="wrapper">
++      <header id="header" class="header">
++        <div class="container">
++          <h1 class="navbar-brand"><a href="/">Apache Ignite Web Configurator</a></h1>
++          <div ng-controller="auth" class="navbar-collapse collapse">
++            <ul ng-controller="activeLink" class="nav navbar-nav">
++              <li><a ng-class="{active: isActive('/clusters')}" href="/clusters">Configuration</a></li>
++              <li><a ng-class="{active: isActive('/sql')}" href="/sql">SQL</a></li>
++            </ul>
++            <ul ng-init="user = undefined" class="nav navbar-nav pull-right">
++              <li ng-show="user"><a data-toggle="dropdown" aria-expanded="true" bs-dropdown data-template="user-dropdown" data-placement="bottom-right" class="dropdown-toggle">{{user.username}}<span class="caret"></span></a>
++                <script id="user-dropdown" type="text/ng-template">
++                  <ul class="dropdown-menu">
++                    <li><a href="/rest/auth/logout">Log Out</a></li>
++                  </ul>
++                </script>
++              </li>
++              <li ng-show="!user" class="nav-login"><a ng-click="login()" href="#">Log In</a></li>
++            </ul>
++          </div>
++        </div>
++      </header>
++      <div class="container body-container">
++        <div class="main-content">
++          <div class="main-head">
++            <div class="row">
++              <div class="docs-content">
++                <div>
++                  <p>
++                    Apache Ignite<sup>tm</sup> In-Memory Data Fabric is a high-performance,
++                    integrated and distributed in-memory platform for computing and transacting on large-scale data
++                    sets in real-time, orders of magnitude faster than possible with traditional disk-based or flash technologies.
++                  </p>
++                </div>
++              </div>
++              <div class="block-image block-display-image"><img ng-src="https://www.filepicker.io/api/file/lydEeGB6Rs9hwbpcQxiw" alt="Apache Ignite stack"></div>
++              <div ng-controller="auth" class="text-center">
++                <button ng-click="login()" href="#" class="btn btn-primary">Configure Now</button>
++              </div>
++            </div>
++          </div>
++        </div>
++      </div>
++      <div class="container container-footer">
++        <footer>
++          <center>
++            <p>Powered by<a href="http://ignite.incubator.apache.org"> Apache Ignite</a>, version 1.1.0</p>
++          </center>
++        </footer>
++      </div>
++    </div>
++  </body>
++</html>

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/92c06985/modules/webconfig/src/main/webapp/layout-sidebar.html
----------------------------------------------------------------------
diff --cc modules/webconfig/src/main/webapp/layout-sidebar.html
index 0000000,0000000..a6735be
new file mode 100644
--- /dev/null
+++ b/modules/webconfig/src/main/webapp/layout-sidebar.html
@@@ -1,0 -1,0 +1,80 @@@
++<!DOCTYPE html>
++<html ng-app="ignite-web-configurator">
++  <head>
++    <title></title>
++    <!-- Bootstrap-->
++    <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.4/css/bootstrap.css">
++    <!-- Font Awesome Icons-->
++    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.css">
++    <!-- Font-->
++    <link rel="stylesheet" href="//fonts.googleapis.com/css?family=Roboto+Slab:700:serif|Roboto+Slab:400:serif">
++    <link rel="stylesheet" href="/stylesheets/style.css">
++    <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.js"></script>
++    <script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/3.9.3/lodash.min.js"></script>
++    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.js"></script>
++    <script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.15/angular-sanitize.js"></script>
++    <script src="//cdnjs.cloudflare.com/ajax/libs/angular-strap/2.2.2/angular-strap.js"></script>
++    <script src="//cdnjs.cloudflare.com/ajax/libs/angular-strap/2.2.2/angular-strap.tpl.min.js"></script>
++    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-smart-table/2.0.3/smart-table.js"></script>
++    <script src="/javascripts/controllers/common.js"></script>
++    <script src="/javascripts/dataStructures.js"></script>
++    <script src="/javascripts/bundle.js"></script>
++  </head>
++  <body class="theme-line body-overlap">
++    <div class="wrapper">
++      <header id="header" class="header">
++        <div class="container">
++          <h1 class="navbar-brand"><a href="/">Apache Ignite Web Configurator</a></h1>
++          <div ng-controller="auth" class="navbar-collapse collapse">
++            <ul ng-controller="activeLink" class="nav navbar-nav">
++              <li><a ng-class="{active: isActive('/clusters')}" href="/clusters">Configuration</a></li>
++              <li><a ng-class="{active: isActive('/sql')}" href="/sql">SQL</a></li>
++            </ul>
++            <ul ng-init="user = undefined" class="nav navbar-nav pull-right">
++              <li ng-show="user"><a data-toggle="dropdown" aria-expanded="true" bs-dropdown data-template="user-dropdown" data-placement="bottom-right" class="dropdown-toggle">{{user.username}}<span class="caret"></span></a>
++                <script id="user-dropdown" type="text/ng-template">
++                  <ul class="dropdown-menu">
++                    <li><a href="/rest/auth/logout">Log Out</a></li>
++                  </ul>
++                </script>
++              </li>
++              <li ng-show="!user" class="nav-login"><a ng-click="login()" href="#">Log In</a></li>
++            </ul>
++          </div>
++        </div>
++      </header>
++      <div class="container body-container">
++        <div class="main-content">
++          <div class="main-head">
++            <div class="row">
++              <div class="col-sm-2 border-right section-left greedy">
++                <div class="sidebar-nav">
++                  <ul ng-controller="activeLink" class="menu">
++                    <li><a ng-class="{active: isActive('/clusters')}" href="/clusters">Clusters</a></li>
++                    <li><a ng-class="{active: isActive('/caches')}" href="/caches">Caches</a></li>
++                    <li><a ng-class="{active: isActive('/persistence')}" href="/persistence">Persistence</a></li>
++                    <li><a ng-class="{active: isActive('/clients')}" href="/clients">Clients</a></li>
++                    <li>
++                      <p></p><a ng-class="{active: isActive('/summary')}" href="/summary">Summary</a>
++                    </li>
++                  </ul>
++                </div>
++              </div>
++              <div class="col-sm-10 border-left section-right">
++                <div class="docs-content">
++                </div>
++              </div>
++            </div>
++          </div>
++        </div>
++      </div>
++      <div class="container container-footer">
++        <footer>
++          <center>
++            <p>Powered by<a href="http://ignite.incubator.apache.org"> Apache Ignite</a>, version 1.1.0</p>
++          </center>
++        </footer>
++      </div>
++    </div>
++  </body>
++</html>

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/92c06985/modules/webconfig/src/main/webapp/layout.html
----------------------------------------------------------------------
diff --cc modules/webconfig/src/main/webapp/layout.html
index 0000000,0000000..82a2957
new file mode 100644
--- /dev/null
+++ b/modules/webconfig/src/main/webapp/layout.html
@@@ -1,0 -1,0 +1,61 @@@
++<!DOCTYPE html>
++<html ng-app="ignite-web-configurator">
++  <head>
++    <title></title>
++    <!-- Bootstrap-->
++    <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.4/css/bootstrap.css">
++    <!-- Font Awesome Icons-->
++    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.css">
++    <!-- Font-->
++    <link rel="stylesheet" href="//fonts.googleapis.com/css?family=Roboto+Slab:700:serif|Roboto+Slab:400:serif">
++    <link rel="stylesheet" href="/stylesheets/style.css">
++    <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.js"></script>
++    <script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/3.9.3/lodash.min.js"></script>
++    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.js"></script>
++    <script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.15/angular-sanitize.js"></script>
++    <script src="//cdnjs.cloudflare.com/ajax/libs/angular-strap/2.2.2/angular-strap.js"></script>
++    <script src="//cdnjs.cloudflare.com/ajax/libs/angular-strap/2.2.2/angular-strap.tpl.min.js"></script>
++    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-smart-table/2.0.3/smart-table.js"></script>
++    <script src="/javascripts/controllers/common.js"></script>
++    <script src="/javascripts/dataStructures.js"></script>
++    <script src="/javascripts/bundle.js"></script>
++  </head>
++  <body class="theme-line body-overlap">
++    <div class="wrapper">
++      <header id="header" class="header">
++        <div class="container">
++          <h1 class="navbar-brand"><a href="/">Apache Ignite Web Configurator</a></h1>
++          <div ng-controller="auth" class="navbar-collapse collapse">
++            <ul ng-controller="activeLink" class="nav navbar-nav">
++              <li><a ng-class="{active: isActive('/clusters')}" href="/clusters">Configuration</a></li>
++              <li><a ng-class="{active: isActive('/sql')}" href="/sql">SQL</a></li>
++            </ul>
++            <ul ng-init="user = undefined" class="nav navbar-nav pull-right">
++              <li ng-show="user"><a data-toggle="dropdown" aria-expanded="true" bs-dropdown data-template="user-dropdown" data-placement="bottom-right" class="dropdown-toggle">{{user.username}}<span class="caret"></span></a>
++                <script id="user-dropdown" type="text/ng-template">
++                  <ul class="dropdown-menu">
++                    <li><a href="/rest/auth/logout">Log Out</a></li>
++                  </ul>
++                </script>
++              </li>
++              <li ng-show="!user" class="nav-login"><a ng-click="login()" href="#">Log In</a></li>
++            </ul>
++          </div>
++        </div>
++      </header>
++      <div class="container body-container">
++        <div class="main-content">
++          <div class="main-head">
++          </div>
++        </div>
++      </div>
++      <div class="container container-footer">
++        <footer>
++          <center>
++            <p>Powered by<a href="http://ignite.incubator.apache.org"> Apache Ignite</a>, version 1.1.0</p>
++          </center>
++        </footer>
++      </div>
++    </div>
++  </body>
++</html>

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/92c06985/modules/webconfig/src/main/webapp/login.html
----------------------------------------------------------------------
diff --cc modules/webconfig/src/main/webapp/login.html
index 732d642,0000000..35335da
mode 100644,000000..100644
--- a/modules/webconfig/src/main/webapp/login.html
+++ b/modules/webconfig/src/main/webapp/login.html
@@@ -1,36 -1,0 +1,42 @@@
- <!DOCTYPE html>
- <html>
- <head>
-     <meta charset="UTF-8">
-     <title>Ignite Configuration Tools</title>
-     <link rel="stylesheet" href="css/login.css">
- </head>
 +
- <body>
- <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <div id="logmsk" style="display: block;">
-     <div id="userbox">
-         <h1 id="signup" style="background-repeat: initial;">
-             Login
-         </h1>
- 
-         <input id="name" placeholder="ID"
-                style="opacity: 1; background-color: rgb(255, 255, 255); background-repeat: initial;">
-         <input id="password" type="password" placeholder="Password"
-                style="opacity: 1; background-color: rgb(255, 255, 255); background-repeat: initial;">
- 
-         <input id="confirmpassword" type="password" placeholder="Confirm Password"
-                style="opacity: 1; background-color: rgb(255, 255, 255); background-repeat: initial; display: none">
- 
-         <p id="err" style="display: none; opacity: 1;">ID:</p>
- 
-         <span id="logint" style="opacity: 1;">Sign up as a new user</span>
-         <button id="signupb" style="opacity: 0.2; cursor: default;">Login</button>
++<div role="dialog" class="modal center">
++  <div class="modal-dialog">
++    <div class="modal-content">
++      <div class="modal-header header">
++        <div id="errors-container"></div>
++        <button type="button" ng-click="$hide()" aria-hidden="true" class="close">&times;</button>
++        <h1 class="navbar-brand pull-left"><a href="/">Apache Ignite Web Configurator</a></h1>
++        <h4 class="modal-title">Authentication</h4>
++        <p>Log in or register in order to collaborate</p>
++      </div>
++      <form name="loginForm" class="form-horizontal">
++        <div class="modal-body row">
++          <div class="col-sm-9 login col-sm-offset-1">
++            <div ng-show="action == &quot;register&quot;" class="form-group">
++              <label class="col-sm-3 control-label">Full Name:</label>
++              <div class="controls col-sm-9">
++                <input type="text" ng-model="user_info.username" placeholder="John Smith" focus-me="action==&quot;register&quot;" ng-required="action==&quot;register&quot;" class="form-control"/>
++              </div>
++            </div>
++            <div class="form-group">
++              <label class="col-sm-3 control-label">Email:</label>
++              <div class="controls col-sm-9">
++                <input type="email" ng-model="user_info.email" placeholder="you@domain.com" focus-me="action==&quot;login&quot;" required="required" class="form-control"/>
++              </div>
++            </div>
++            <div class="form-group">
++              <label class="col-sm-3 control-label">Password:</label>
++              <div class="controls col-sm-9">
++                <input type="password" ng-model="user_info.password" placeholder="Password" required="required" class="form-control"/>
++              </div>
++            </div>
++          </div>
++        </div>
++      </form>
++      <div class="modal-footer"><a ng-show="action != &quot;login&quot;" ng-click="action = &quot;login&quot;;" class="show-signup ng-hide">log in</a><a ng-show="action != 'register'" ng-click="action = &quot;register&quot;;" class="show-signup">sign up</a>&nbsp;or&nbsp;
++        <button ng-click="auth(action, user_info)" ng-show="action == &quot;login&quot;" ng-disabled="loginForm.$invalid" class="btn btn-primary">Log In</button>
++        <button ng-click="auth(action, user_info)" ng-show="action == &quot;register&quot;" ng-disabled="loginForm.$invalid" class="btn btn-primary">Sign Up</button>
++      </div>
 +    </div>
- </div>
- 
- <script src="js/login.js"></script>
- 
- </body>
- 
- </html>
++  </div>
++</div>