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"> Add 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["{{field.model}}"].$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["{{field.model}}"].$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["{{field.model}}"].$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] && 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 && 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["{{detail.model}}"].$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["{{detail.model}}"].$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["{{detail.model}}"].$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 > 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 > 0" ng-click="swapSimpleItems(detailMdl, $index, $index - 1); detail.editIdx = -1;" class="fa fa-arrow-up"></i><i ng-show="$index < 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) >= 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 > 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 > 0" ng-click="swapSimpleItems(fieldMdl, $index, $index - 1); field.editIdx = -1;" class="fa fa-arrow-up"></i><i ng-show="$index < 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) >= 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 > 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> / </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["{{field.model}}"].$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["{{field.model}}"].$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["{{field.model}}"].$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] && 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 && 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["{{detail.model}}"].$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["{{detail.model}}"].$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["{{detail.model}}"].$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 > 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 > 0" ng-click="swapSimpleItems(detailMdl, $index, $index - 1); detail.editIdx = -1;" class="fa fa-arrow-up"></i><i ng-show="$index < 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) >= 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 > 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 > 0" ng-click="swapSimpleItems(fieldMdl, $index, $index - 1); field.editIdx = -1;" class="fa fa-arrow-up"></i><i ng-show="$index < 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) >= 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 > 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> / </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">×</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 == "register"" 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=="register"" ng-required="action=="register"" 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=="login"" 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 != "login"" ng-click="action = "login";" class="show-signup ng-hide">log in</a><a ng-show="action != 'register'" ng-click="action = "register";" class="show-signup">sign up</a> or
++ <button ng-click="auth(action, user_info)" ng-show="action == "login"" ng-disabled="loginForm.$invalid" class="btn btn-primary">Log In</button>
++ <button ng-click="auth(action, user_info)" ng-show="action == "register"" ng-disabled="loginForm.$invalid" class="btn btn-primary">Sign Up</button>
++ </div>
+ </div>
- </div>
-
- <script src="js/login.js"></script>
-
- </body>
-
- </html>
++ </div>
++</div>