You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by an...@apache.org on 2015/07/07 08:39:15 UTC
incubator-ignite git commit: # ignite-843 Add requered for details
fields.
Repository: incubator-ignite
Updated Branches:
refs/heads/ignite-843 7dbb9b3e8 -> 9ae8a1300
# ignite-843 Add requered for details fields.
Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/9ae8a130
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/9ae8a130
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/9ae8a130
Branch: refs/heads/ignite-843
Commit: 9ae8a13003f9e551a97575868608c9dc2a00ee32
Parents: 7dbb9b3
Author: Andrey <an...@gridgain.com>
Authored: Tue Jul 7 13:35:35 2015 +0700
Committer: Andrey <an...@gridgain.com>
Committed: Tue Jul 7 13:39:24 2015 +0700
----------------------------------------------------------------------
modules/web-control-center/nodejs/app.js | 6 +--
modules/web-control-center/nodejs/db.js | 4 +-
.../nodejs/public/form-models/caches.json | 11 +++--
.../nodejs/public/form-models/clusters.json | 49 ++++++++++++++++++--
.../public/javascripts/controllers/clusters.js | 4 +-
.../web-control-center/nodejs/routes/pages.js | 10 ++--
.../nodejs/utils/generatorJava.js | 4 +-
.../nodejs/utils/generatorXml.js | 2 +
.../nodejs/views/includes/controls.jade | 37 ++++++++-------
.../nodejs/views/includes/header.jade | 2 +-
.../nodejs/views/layout-sidebar.jade | 6 +--
.../nodejs/views/summary.jade | 6 +--
12 files changed, 96 insertions(+), 45 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/9ae8a130/modules/web-control-center/nodejs/app.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/app.js b/modules/web-control-center/nodejs/app.js
index 6f7c6b8..81ff42b 100644
--- a/modules/web-control-center/nodejs/app.js
+++ b/modules/web-control-center/nodejs/app.js
@@ -83,9 +83,9 @@ var mustAuthenticated = function (req, res, next) {
req.isAuthenticated() ? next() : res.redirect('/');
};
-app.all('/clusters', mustAuthenticated);
-app.all('/caches', mustAuthenticated);
-app.all('/summary', mustAuthenticated);
+app.all('/configuration/clusters', mustAuthenticated);
+app.all('/configuration/caches', mustAuthenticated);
+app.all('/configuration/summary', mustAuthenticated);
app.use('/', pageRoutes);
app.use('/rest/clusters', clustersRouter);
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/9ae8a130/modules/web-control-center/nodejs/db.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/db.js b/modules/web-control-center/nodejs/db.js
index 4039ba0..2dc2be2 100644
--- a/modules/web-control-center/nodejs/db.js
+++ b/modules/web-control-center/nodejs/db.js
@@ -190,7 +190,9 @@ var ClusterSchema = new Schema({
credential: String,
credentialPath: String,
identity: String,
- provider: String
+ provider: String,
+ regions: [String],
+ zones: [String]
},
GoogleStorage: {
projectName: String,
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/9ae8a130/modules/web-control-center/nodejs/public/form-models/caches.json
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/public/form-models/caches.json b/modules/web-control-center/nodejs/public/form-models/caches.json
index 16c3a47..eda9a89 100644
--- a/modules/web-control-center/nodejs/public/form-models/caches.json
+++ b/modules/web-control-center/nodejs/public/form-models/caches.json
@@ -467,14 +467,16 @@
]
},
{
- "tableLabel": "SQL functions",
- "label": "SQL function",
+ "label": "SQL functions",
"type": "table-simple",
"model": "sqlFunctionClasses",
"editIdx": -1,
"placeholder": "SQL function full class name",
+ "tableTip": [
+ "Collections of classes with user-defined functions for SQL queries."
+ ],
"tip": [
- "Classes with user-defined functions for SQL queries."
+ "Class with user-defined functions for SQL queries."
]
}
]
@@ -729,8 +731,7 @@
"expanded": true,
"fields": [
{
- "tableLabel": "Hibernate properties",
- "label": "Hibernate property",
+ "label": "Hibernate properties",
"type": "table-simple",
"path": "cacheStoreFactory.CacheHibernateBlobStoreFactory",
"model": "hibernateProperties",
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/9ae8a130/modules/web-control-center/nodejs/public/form-models/clusters.json
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/public/form-models/clusters.json b/modules/web-control-center/nodejs/public/form-models/clusters.json
index 14c1d82..e6be772 100644
--- a/modules/web-control-center/nodejs/public/form-models/clusters.json
+++ b/modules/web-control-center/nodejs/public/form-models/clusters.json
@@ -45,8 +45,6 @@
"expanded": true,
"fields": [
{
- "tableLabel": "Addresses",
- "label": "address",
"type": "table-simple",
"path": "discovery.Vm",
"model": "addresses",
@@ -138,9 +136,13 @@
{
"label": "Bucket name",
"type": "text",
+ "required": true,
"path": "discovery.S3",
"model": "bucketName",
- "placeholder": ""
+ "placeholder": "",
+ "tip": [
+ "Bucket name for IP finder."
+ ]
}
]
},
@@ -172,6 +174,7 @@
{
"label": "Identity",
"type": "text",
+ "required": true,
"path": "discovery.Cloud",
"model": "identity",
"placeholder": "",
@@ -183,11 +186,45 @@
{
"label": "Provider",
"type": "text",
- "model": "discovery.Cloud.provider",
+ "required": true,
+ "path": "discovery.Cloud",
+ "model": "provider",
"placeholder": "",
"tip": [
"Cloud provider to use."
]
+ },
+ {
+ "label": "Regions",
+ "type": "table-simple",
+ "path": "discovery.Cloud",
+ "model": "regions",
+ "editIdx": -1,
+ "placeholder": "",
+ "tableTip": [
+ "List of regions where VMs are located.",
+ "If the regions are not set then every region, that a cloud provider has, will be investigated. This could lead to significant performance degradation.",
+ "Note, that some cloud providers, like Google Compute Engine, doesn't have a notion of a region. For such providers a call to this method is redundant."
+ ],
+ "tip": [
+ "Region where VMs are located."
+ ]
+ },
+ {
+ "label": "Zones",
+ "type": "table-simple",
+ "path": "discovery.Cloud",
+ "model": "zones",
+ "editIdx": -1,
+ "placeholder": "",
+ "tableTip": [
+ "List of zones where VMs are located.",
+ "If the zones are not set then every zone from regions, set by {@link #setRegions(Collection)}}, will be taken into account.",
+ "Note, that some cloud providers, like Rackspace, doesn't have a notion of a zone. For such providers a call to this method is redundant."
+ ],
+ "tip": [
+ "Zone where VMs are located."
+ ]
}
]
},
@@ -197,6 +234,7 @@
{
"label": "Project name",
"type": "text",
+ "required": true,
"path": "discovery.GoogleStorage",
"model": "projectName",
"placeholder": "",
@@ -208,6 +246,7 @@
{
"label": "Bucket name",
"type": "text",
+ "required": true,
"path": "discovery.GoogleStorage",
"model": "bucketName",
"placeholder": "",
@@ -220,6 +259,7 @@
{
"label": "Private key path",
"type": "text",
+ "required": true,
"path": "discovery.GoogleStorage",
"model": "serviceAccountP12FilePath",
"placeholder": "",
@@ -230,6 +270,7 @@
{
"label": "Account id",
"type": "text",
+ "required": true,
"path": "discovery.GoogleStorage",
"model": "accountId",
"placeholder": "",
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/9ae8a130/modules/web-control-center/nodejs/public/javascripts/controllers/clusters.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/public/javascripts/controllers/clusters.js b/modules/web-control-center/nodejs/public/javascripts/controllers/clusters.js
index 24a3a7c..38fd6ef 100644
--- a/modules/web-control-center/nodejs/public/javascripts/controllers/clusters.js
+++ b/modules/web-control-center/nodejs/public/javascripts/controllers/clusters.js
@@ -23,9 +23,9 @@ configuratorModule.controller('clustersController', ['$scope', '$alert', '$http'
$scope.console = console;
$scope.templates = [
- {value: {}, label: 'none'},
+ {value: {discovery: {Vm: {addresses: ['127.0.0.1:47500..47510']}}}, label: 'none'},
{value: {discovery: {kind: 'Vm', Vm: {addresses: ['127.0.0.1:47500..47510']}}}, label: 'local'},
- {value: {discovery: {kind: 'Multicast', Multicast: {}}}, label: 'multicast'}
+ {value: {discovery: {kind: 'Multicast', Vm: {addresses: ['127.0.0.1:47500..47510']}, Multicast: {}}}, label: 'multicast'}
];
$scope.discoveries = [
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/9ae8a130/modules/web-control-center/nodejs/routes/pages.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/routes/pages.js b/modules/web-control-center/nodejs/routes/pages.js
index 7b6c24e..a8cde5a 100644
--- a/modules/web-control-center/nodejs/routes/pages.js
+++ b/modules/web-control-center/nodejs/routes/pages.js
@@ -30,23 +30,23 @@ router.get('/login', function(req, res) {
/* GET home page. */
router.get('/', function(req, res) {
if (req.isAuthenticated())
- res.redirect('/clusters');
+ res.redirect('/configuration/clusters');
else
res.render('index', { user: req.user });
});
/* GET clusters page. */
-router.get('/clusters', function(req, res) {
+router.get('/configuration/clusters', function(req, res) {
res.render('clusters', { user: req.user });
});
/* GET caches page. */
-router.get('/caches', function(req, res) {
+router.get('/configuration/caches', function(req, res) {
res.render('caches', { user: req.user });
});
/* GET persistence page. */
-router.get('/persistence', function(req, res) {
+router.get('/configuration/persistence', function(req, res) {
res.render('persistence', { user: req.user });
});
@@ -61,7 +61,7 @@ router.get('/clients', function(req, res) {
});
/* GET summary page. */
-router.get('/summary', function(req, res) {
+router.get('/configuration/summary', function(req, res) {
res.render('summary', { user: req.user });
});
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/9ae8a130/modules/web-control-center/nodejs/utils/generatorJava.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/utils/generatorJava.js b/modules/web-control-center/nodejs/utils/generatorJava.js
index ae676d8..e0569bc 100644
--- a/modules/web-control-center/nodejs/utils/generatorJava.js
+++ b/modules/web-control-center/nodejs/utils/generatorJava.js
@@ -82,7 +82,9 @@ exports.generateClusterConfiguration = function(cluster, generateJavaClass) {
credential: null,
credentialPath: null,
identity: null,
- provider: null
+ provider: null,
+ regions: {type: 'list'},
+ zones: {type: 'list'}
}, true);
break;
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/9ae8a130/modules/web-control-center/nodejs/utils/generatorXml.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/utils/generatorXml.js b/modules/web-control-center/nodejs/utils/generatorXml.js
index 599aa5f..6cfd401 100644
--- a/modules/web-control-center/nodejs/utils/generatorXml.js
+++ b/modules/web-control-center/nodejs/utils/generatorXml.js
@@ -88,6 +88,8 @@ exports.generateClusterConfiguration = function(cluster) {
addProperty(res, d.Cloud, 'credentialPath');
addProperty(res, d.Cloud, 'identity');
addProperty(res, d.Cloud, 'provider');
+ addListProperty(res, d.Cloud, 'regions');
+ addListProperty(res, d.Cloud, 'zones');
res.endBlock('</bean>');
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/9ae8a130/modules/web-control-center/nodejs/views/includes/controls.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/views/includes/controls.jade b/modules/web-control-center/nodejs/views/includes/controls.jade
index 6ff19b4..55a7fcd 100644
--- a/modules/web-control-center/nodejs/views/includes/controls.jade
+++ b/modules/web-control-center/nodejs/views/includes/controls.jade
@@ -29,7 +29,7 @@ mixin details-row
- var lblDetailClasses = ['col-sm-4', 'details-label']
- var detailMdl = 'getModel(backupItem, detail.path)[detail.model]';
- - var detailCommon = {'ng-model': detailMdl};
+ - var detailCommon = {'ng-model': detailMdl, 'ng-required': 'detail.required'};
- var customValidators = {'ng-attr-ipaddress': '{{detail.ipaddress}}'}
@@ -40,13 +40,13 @@ mixin details-row
|{{detail.label}}
+tipLabel('detail.tip')
div(ng-switch-when='text')
- label(class=lblDetailClasses) {{detail.label}}:
+ label(class=lblDetailClasses ng-class='{required: detail.required}') {{detail.label}}:
.col-sm-8
+tipField('detail.tip')
.input-tip
input.form-control(type='text' placeholder='{{detail.placeholder}}')&attributes(detailCommon)
div(ng-switch-when='number' )
- label(class=lblDetailClasses) {{detail.label}}:
+ label(class=lblDetailClasses ng-class='{required: detail.required}') {{detail.label}}:
.col-sm-8
+tipField('detail.tip')
.input-tip
@@ -55,25 +55,28 @@ mixin details-row
+exclamation('{{detail.model}}', 'max', 'Value is more than allowable maximum.')
+exclamation('{{detail.model}}', 'number', 'Invalid value. Only numbers allowed.')
div(ng-switch-when='dropdown')
- label(class=lblDetailClasses) {{detail.label}}:
+ label(class=lblDetailClasses ng-class='{required: detail.required}') {{detail.label}}:
.col-sm-8
+tipField('detail.tip')
.input-tip
button.form-control(bs-select data-placeholder='{{detail.placeholder}}' bs-options='item.value as item.label for item in {{detail.items}}')&attributes(detailCommon)
div(ng-switch-when='dropdown-multiple')
- label(class=lblDetailClasses) {{detail.label}}:
+ label(class=lblDetailClasses ng-class='{required: detail.required}') {{detail.label}}:
.col-sm-8
button.form-control(bs-select data-multiple='1' data-placeholder='{{detail.placeholder}}' bs-options='item.value as item.label for item in {{detail.items}}')&attributes(detailCommon)
+tipField('detail.tip')
div(ng-switch-when='table-simple')&attributes(detailCommon)
+ div(ng-if="detail.label")
+ label {{detail.label}}:
+ +tipLabel('detail.tableTip')
table.col-sm-12.links-edit-details(st-table='#{detailMdl}' ng-show='#{detailMdl}.length > 0')
tbody
tr(ng-repeat='item in #{detailMdl} track by $index')
td
div(ng-show='detail.editIdx != {{$index}}')
i.stackTipField.fa.fa-remove(ng-click='detail.editIdx = -1; #{detailMdl}.splice($index, 1)')
- i.stackTipField.fa.fa-arrow-down(ng-show='$index < #{detailMdl}.length - 1' ng-click='swapSimpleItems(#{detailMdl}, $index, $index + 1); detail.editIdx = -1;')
- i.stackTipField.fa.fa-arrow-up(ng-show='$index > 0' ng-click='swapSimpleItems(#{detailMdl}, $index, $index - 1); detail.editIdx = -1;')
+ i.stackTipField.fa.fa-arrow-down(ng-if='detail.reordering' ng-show='$index < #{detailMdl}.length - 1' ng-click='swapSimpleItems(#{detailMdl}, $index, $index + 1); detail.editIdx = -1;')
+ i.stackTipField.fa.fa-arrow-up(ng-if='detail.reordering' ng-show='$index > 0' ng-click='swapSimpleItems(#{detailMdl}, $index, $index - 1); detail.editIdx = -1;')
.input-tip
a(ng-click='detail.editIdx = $index; curValue = #{detailMdl}[$index]') {{$index + 1}}) {{item}}
div(ng-show='detail.editIdx == {{$index}}')
@@ -92,7 +95,7 @@ mixin form-row
- var lblClasses = ['col-sm-2']
- var fieldMdl = 'getModel(backupItem, field.path)[field.model]';
- - var fieldCommon = {'ng-model': fieldMdl};
+ - var fieldCommon = {'ng-model': fieldMdl, 'ng-required': 'field.required'};
div(ng-switch='field.type')
div.checkbox.col-sm-6(ng-switch-when='check')
@@ -105,19 +108,19 @@ mixin form-row
.col-sm-4
+tipField('field.tip')
.input-tip
- input.form-control(type='text' placeholder='{{field.placeholder}}' ng-required='field.required')&attributes(fieldCommon)
+ input.form-control(type='text' placeholder='{{field.placeholder}}')&attributes(fieldCommon)
div(ng-switch-when='password')
label(class=lblClasses ng-class='{required: field.required}') {{field.label}}:
.col-sm-4
+tipField('field.tip')
.input-tip
- input.form-control(type='password' placeholder='{{field.placeholder}}' ng-required='field.required')&attributes(fieldCommon)
+ input.form-control(type='password' placeholder='{{field.placeholder}}')&attributes(fieldCommon)
div(ng-switch-when='number' ng-hide='{{field.hide}}')
label(class=lblClasses ng-class='{required: field.required}') {{field.label}}:
.col-sm-4
+tipField('field.tip')
.input-tip
- input.form-control(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')&attributes(fieldCommon)
+ input.form-control(name='{{field.model}}' type='number' placeholder='{{field.placeholder}}' min='{{field.min ? field.min : 0}}' max='{{field.max ? field.max : Number.MAX_VALUE}}')&attributes(fieldCommon)
+exclamation('{{field.model}}', 'min', 'Value is less than allowable minimum.')
+exclamation('{{field.model}}', 'max', 'Value is more than allowable maximum.')
+exclamation('{{field.model}}', 'number', 'Invalid value. Only numbers allowed.')
@@ -126,7 +129,7 @@ mixin form-row
.col-sm-4
+tipField('field.tip')
.input-tip
- button.form-control(bs-select ng-required='field.required' data-placeholder='{{field.placeholder}}' bs-options='item.value as item.label for item in {{field.items}}')&attributes(fieldCommon)
+ button.form-control(bs-select data-placeholder='{{field.placeholder}}' bs-options='item.value as item.label for item in {{field.items}}')&attributes(fieldCommon)
div(ng-switch-when='dropdown-multiple')
label(class=lblClasses ng-class='{required: field.required}') {{field.label}}:
.col-sm-4
@@ -141,15 +144,15 @@ mixin form-row
.col-sm-4
+tipField('field.tip')
.input-tip
- button.form-control(bs-select ng-required='field.required' data-placeholder='{{field.placeholder}}' bs-options='item.value as item.label for item in {{field.items}}')&attributes(fieldCommon)
+ button.form-control(bs-select data-placeholder='{{field.placeholder}}' bs-options='item.value as item.label for item in {{field.items}}')&attributes(fieldCommon)
a.customize(ng-show='#{fieldMdl} && field.details[#{fieldMdl}].fields' ng-click='#{expanded} = !#{expanded}') {{#{expanded} ? "Hide settings" : "Show settings"}}
.col-sm-6.panel-details(ng-show='#{expanded} && #{fieldMdl}')
.details-row(ng-repeat='detail in field.details[#{fieldMdl}].fields')
+details-row
div(ng-switch-when='table-simple')&attributes(fieldCommon)
div
- label {{field.tableLabel}}
- +tipLabel('field.tip')
+ label {{field.label}}:
+ +tipLabel('field.tableTip')
table.links-edit.col-sm-12(st-table='#{fieldMdl}' ng-show='#{fieldMdl}.length > 0')
tbody
tr.col-sm-12(ng-repeat='item in #{fieldMdl} track by $index')
@@ -172,8 +175,8 @@ mixin form-row
input.form-control(type='text' ng-model='newValue' ng-focus='field.editIdx = -1' placeholder='{{field.placeholder}}')
div(ng-switch-when='indexedTypes')
- var tblMdl = 'backupItem.indexedTypes'
- div
- label Indexed types
+ div(ng-if="field.label")
+ label Indexed types:
+tipLabel('field.tip')
table.links-edit.col-sm-12(st-table=tblMdl ng-show='#{tblMdl}.length > 0')
tbody
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/9ae8a130/modules/web-control-center/nodejs/views/includes/header.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/views/includes/header.jade b/modules/web-control-center/nodejs/views/includes/header.jade
index e304114..4176ffd 100644
--- a/modules/web-control-center/nodejs/views/includes/header.jade
+++ b/modules/web-control-center/nodejs/views/includes/header.jade
@@ -21,7 +21,7 @@ header.header(id='header')
.navbar-collapse.collapse(ng-controller='auth' ng-init='user = #{JSON.stringify(user)}')
ul.nav.navbar-nav(ng-controller='activeLink' ng-show='user')
li
- a(ng-class="{active: isActive('/clusters')}" href='/clusters') Configuration
+ a(ng-class="{active: isActive('/configuration')}" href='/configuration/clusters') Configuration
//li
// a(ng-class="{active: isActive('/sql')}" href='/sql') SQL
ul.nav.navbar-nav.pull-right
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/9ae8a130/modules/web-control-center/nodejs/views/layout-sidebar.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/views/layout-sidebar.jade b/modules/web-control-center/nodejs/views/layout-sidebar.jade
index 9335493..36c778b 100644
--- a/modules/web-control-center/nodejs/views/layout-sidebar.jade
+++ b/modules/web-control-center/nodejs/views/layout-sidebar.jade
@@ -22,16 +22,16 @@ block container
.sidebar-nav
ul.menu(ng-controller='activeLink')
li
- a(ng-class="{active: isActive('/clusters')}" href='/clusters') Clusters
+ a(ng-class="{active: isActive('/configuration/clusters')}" href='/configuration/clusters') Clusters
li
- a(ng-class="{active: isActive('/caches')}" href='/caches') Caches
+ a(ng-class="{active: isActive('/configuration/caches')}" href='/configuration/caches') Caches
//li
// a(ng-class="{active: isActive('/persistence')}" href='/persistence') Persistence
//li
// a(ng-class="{active: isActive('/clients')}" href='/clients') Clients
li
p
- a(ng-class="{active: isActive('/summary')}" href='/summary') Summary
+ a(ng-class="{active: isActive('/configuration/summary')}" href='/configuration/summary') Summary
.col-sm-10.border-left.section-right
.docs-content
block content
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/9ae8a130/modules/web-control-center/nodejs/views/summary.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/views/summary.jade b/modules/web-control-center/nodejs/views/summary.jade
index 0588137..8e52ea1 100644
--- a/modules/web-control-center/nodejs/views/summary.jade
+++ b/modules/web-control-center/nodejs/views/summary.jade
@@ -51,15 +51,15 @@ block content
ul.nav.nav-tabs
li(ng-class='{active: cfgLang == "xml"}')
a(href, ng-click='cfgLang = "xml"')
- img(src='images/xml.png', width='16px' height='16px')
+ img(src='/images/xml.png', width='16px' height='16px')
| XML
li(ng-class='{active: cfgLang=="java"}')
a(href, ng-click='cfgLang = "java"')
- img(src='images/java.png', width='16px' height='16px')
+ img(src='/images/java.png', width='16px' height='16px')
| Java
li(ng-class="{active: cfgLang=='docker'}")
a(href, ng-click='cfgLang = "docker"')
- img(src='images/docker.png', width='16px' height='16px')
+ img(src='/images/docker.png', width='16px' height='16px')
| Dockerfile
.settings-row
#xmlResult(ng-show="cfgLang == 'xml'")