You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by se...@apache.org on 2015/07/16 22:47:41 UTC

[1/9] incubator-ignite git commit: # ignite-843 Fixed xml generation for client mode

Repository: incubator-ignite
Updated Branches:
  refs/heads/ignite-1121 0dfb521a7 -> 6e8e922fa


# ignite-843 Fixed xml generation for client mode


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

Branch: refs/heads/ignite-1121
Commit: 2ab4d67b648676d4f7967c26d5bd9ec0e6f4a3f4
Parents: 400bc56
Author: Andrey <an...@gridgain.com>
Authored: Thu Jul 16 16:12:20 2015 +0700
Committer: Andrey <an...@gridgain.com>
Committed: Thu Jul 16 16:12:20 2015 +0700

----------------------------------------------------------------------
 .../web-control-center/nodejs/controllers/summary-controller.js   | 2 +-
 modules/web-control-center/nodejs/routes/generator/xml.js         | 3 ---
 2 files changed, 1 insertion(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/2ab4d67b/modules/web-control-center/nodejs/controllers/summary-controller.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/controllers/summary-controller.js b/modules/web-control-center/nodejs/controllers/summary-controller.js
index 8679665..cb21e8b 100644
--- a/modules/web-control-center/nodejs/controllers/summary-controller.js
+++ b/modules/web-control-center/nodejs/controllers/summary-controller.js
@@ -32,7 +32,7 @@ controlCenterModule.controller('summaryController', ['$scope', '$http', 'commonF
         {value: undefined, label: 'Not set'}
     ];
 
-    $scope.backupItem = {nearCacheEnabled: true};
+    $scope.backupItem = {};
 
     $http.get('/models/summary.json')
         .success(function (data) {

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/2ab4d67b/modules/web-control-center/nodejs/routes/generator/xml.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/routes/generator/xml.js b/modules/web-control-center/nodejs/routes/generator/xml.js
index 8004c95..6fc7257 100644
--- a/modules/web-control-center/nodejs/routes/generator/xml.js
+++ b/modules/web-control-center/nodejs/routes/generator/xml.js
@@ -274,9 +274,6 @@ exports.generateClusterConfiguration = function(cluster, clientCache) {
 
             var cache = cluster.caches[i];
 
-            if (clientCache)
-                _.merge(cache, clientCache);
-
             generateCacheConfiguration(cache, res);
         }
 


[3/9] incubator-ignite git commit: Merge remote-tracking branch 'origin/ignite-843' into ignite-843

Posted by se...@apache.org.
Merge remote-tracking branch 'origin/ignite-843' into ignite-843


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

Branch: refs/heads/ignite-1121
Commit: ce98203b953d97a30a419ada16e665c1d5150c24
Parents: 870f8bf 2ab4d67
Author: AKuznetsov <ak...@gridgain.com>
Authored: Thu Jul 16 16:51:01 2015 +0700
Committer: AKuznetsov <ak...@gridgain.com>
Committed: Thu Jul 16 16:51:01 2015 +0700

----------------------------------------------------------------------
 .../web-control-center/nodejs/controllers/summary-controller.js   | 2 +-
 modules/web-control-center/nodejs/routes/generator/xml.js         | 3 ---
 2 files changed, 1 insertion(+), 4 deletions(-)
----------------------------------------------------------------------



[6/9] incubator-ignite git commit: IGNITE-843: Added missing class name.

Posted by se...@apache.org.
IGNITE-843: Added missing class name.


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

Branch: refs/heads/ignite-1121
Commit: 9cc79ae3e338a85b961b2cd72a6bff095a733553
Parents: 949e37c
Author: AKuznetsov <ak...@gridgain.com>
Authored: Thu Jul 16 23:08:55 2015 +0700
Committer: AKuznetsov <ak...@gridgain.com>
Committed: Thu Jul 16 23:08:55 2015 +0700

----------------------------------------------------------------------
 modules/web-control-center/nodejs/db.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/9cc79ae3/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 8629f09..8286674 100644
--- a/modules/web-control-center/nodejs/db.js
+++ b/modules/web-control-center/nodejs/db.js
@@ -77,7 +77,7 @@ var CacheTypeMetadataSchema = new Schema({
     ascendingFields: [{name: String, className: String}],
     descendingFields:  [{name: String, className: String}],
     textFields: [String],
-    groups: [{name: String, fields: [{field: String, direction: String}]}]
+    groups: [{name: String, fields: [{field: String, className: String, direction: String}]}]
 });
 
 exports.CacheTypeMetadata = mongoose.model('CacheTypeMetadata', CacheTypeMetadataSchema);


[4/9] incubator-ignite git commit: IGNITE-843 Implemented fixed side bar on scroll.

Posted by se...@apache.org.
IGNITE-843 Implemented fixed side bar on scroll.


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

Branch: refs/heads/ignite-1121
Commit: 5483c5162168c73eda1c41ea4e8603d2e2ead522
Parents: ce98203
Author: AKuznetsov <ak...@gridgain.com>
Authored: Thu Jul 16 17:58:07 2015 +0700
Committer: AKuznetsov <ak...@gridgain.com>
Committed: Thu Jul 16 17:58:07 2015 +0700

----------------------------------------------------------------------
 modules/web-control-center/nodejs/views/configuration/sidebar.jade | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/5483c516/modules/web-control-center/nodejs/views/configuration/sidebar.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/views/configuration/sidebar.jade b/modules/web-control-center/nodejs/views/configuration/sidebar.jade
index 83362ed..7289f3e 100644
--- a/modules/web-control-center/nodejs/views/configuration/sidebar.jade
+++ b/modules/web-control-center/nodejs/views/configuration/sidebar.jade
@@ -27,7 +27,7 @@ mixin sidebar-item(ref, num, txt)
 block container
     .row
         .col-sm-2.border-right.section-left.greedy
-            .sidebar-nav
+            .sidebar-nav(bs-affix)
                 ul.menu(ng-controller='activeLink')
                     +sidebar-item('/configuration/clusters', 1, 'Clusters')
                     +sidebar-item('/configuration/metadata', 2, 'Metadata')


[9/9] incubator-ignite git commit: Merge remote-tracking branch 'remotes/origin/ignite-843' into ignite-1121

Posted by se...@apache.org.
Merge remote-tracking branch 'remotes/origin/ignite-843' into ignite-1121


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

Branch: refs/heads/ignite-1121
Commit: 6e8e922fa78298ce1f68c5793ac351b0457c77c1
Parents: 0dfb521 9cabdf6
Author: sevdokimov <se...@jetbrains.com>
Authored: Thu Jul 16 23:47:23 2015 +0300
Committer: sevdokimov <se...@jetbrains.com>
Committed: Thu Jul 16 23:47:23 2015 +0300

----------------------------------------------------------------------
 modules/web-control-center/nodejs/app.js        |   2 -
 .../nodejs/controllers/caches-controller.js     |  14 +-
 .../nodejs/controllers/metadata-controller.js   | 192 +++++++++--
 .../nodejs/controllers/models/metadata.json     |  11 +-
 .../nodejs/controllers/models/persistence.json  |  66 ----
 .../controllers/persistence-controller.js       | 213 ------------
 .../nodejs/controllers/summary-controller.js    |   2 +-
 modules/web-control-center/nodejs/db.js         |   2 +-
 .../nodejs/routes/generator/xml.js              |   3 -
 .../nodejs/routes/metadata.js                   |   4 +-
 .../nodejs/routes/persistence.js                | 320 -------------------
 .../nodejs/tests/routes/persistence.js          |  32 --
 .../nodejs/views/configuration/metadata.jade    |  15 +-
 .../nodejs/views/configuration/persistence.jade | 114 -------
 .../nodejs/views/configuration/sidebar.jade     |   2 +-
 .../nodejs/views/configuration/summary.jade     |   9 +-
 .../nodejs/views/includes/controls.jade         | 115 +++----
 17 files changed, 242 insertions(+), 874 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/6e8e922f/modules/web-control-center/nodejs/app.js
----------------------------------------------------------------------


[8/9] incubator-ignite git commit: IGNITE-843: Implemented more compact table-simple and table-pair layout.

Posted by se...@apache.org.
IGNITE-843: Implemented more compact table-simple and table-pair layout.


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

Branch: refs/heads/ignite-1121
Commit: 9cabdf6f24f5e8028cfc04d48f58d8edff28da33
Parents: 95f826f
Author: AKuznetsov <ak...@gridgain.com>
Authored: Fri Jul 17 01:10:09 2015 +0700
Committer: AKuznetsov <ak...@gridgain.com>
Committed: Fri Jul 17 01:10:09 2015 +0700

----------------------------------------------------------------------
 .../nodejs/views/includes/controls.jade         | 52 +++++++-------------
 1 file changed, 17 insertions(+), 35 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/9cabdf6f/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 f99d5dd..302e7a3 100644
--- a/modules/web-control-center/nodejs/views/includes/controls.jade
+++ b/modules/web-control-center/nodejs/views/includes/controls.jade
@@ -26,9 +26,10 @@ mixin exclamation(mdl, err, msg)
     i.fa.fa-exclamation-triangle.form-control-feedback(ng-show='inputForm["#{mdl}"].$error.#{err}' bs-tooltip data-title='#{msg}' type='button')
 
 mixin table-pair(header, tblMdl, keyFld, valFld, keyPlaceholder, valPlaceholder)
-    div
+    .col-sm-6
         label.table-header #{header}:
         +tipLabel('field.tip')
+        button.btn.btn-primary.fieldButton(ng-click='field.editIdx = -2') Add
     table.links-edit.col-sm-12(st-table=tblMdl ng-show='#{tblMdl}.length > 0')
         tbody
             tr.col-sm-12(ng-repeat='item in #{tblMdl}')
@@ -44,11 +45,13 @@ mixin table-pair(header, tblMdl, keyFld, valFld, keyPlaceholder, valPlaceholder)
                                 input.form-control.table-form-control(type='text' ng-model='curKey' placeholder=keyPlaceholder)
                                 label &nbsp;/&nbsp;
                                 input.form-control.table-form-control(type='text' ng-model='curValue' placeholder=valPlaceholder)
-    .col-sm-6
-        input.form-control(type='text' ng-model='newKey' ng-focus='field.editIdx = -1' placeholder=keyPlaceholder)
-        .settings-row
-            input.form-control(type='text' ng-model='newValue' ng-focus='field.editIdx = -1' placeholder=valPlaceholder)
-        button.btn.btn-primary.fieldButton(ng-disabled='!newKey || !newValue' ng-click='field.editIdx = -1; tablePairAdd(field, newKey, newValue)') Add
+    .settings-row(ng-show='field.editIdx < -1')
+        .col-sm-6
+            i.tipField.fa.fa-floppy-o(ng-click='field.editIdx = tablePairAdd(field, newKey, newValue)')
+            .input-tip
+                input.form-control.table-form-control(type='text' ng-model='newKey' ng-focus='field.editIdx = -2' placeholder=keyPlaceholder)
+                label &nbsp;/&nbsp;
+                input.form-control.table-form-control(type='text' ng-model='newValue' ng-focus='field.editIdx = -2' placeholder=valPlaceholder)
 
 
 mixin details-row
@@ -183,9 +186,10 @@ mixin form-row-custom(lblClasses, fieldClasses)
                 .details-row(ng-repeat='detail in field.details[#{fieldMdl}].fields')
                     +details-row
         div(ng-switch-when='table-simple' ng-hide=fieldHide)&attributes(fieldCommon)
-            div
+            .col-sm-6
                 label.table-header {{field.label}}:
                 +tipLabel('field.tableTip')
+                button.btn.btn-primary.fieldButton(ng-click='field.editIdx = -2;') Add
             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')
@@ -201,36 +205,14 @@ mixin form-row-custom(lblClasses, fieldClasses)
                         td.col-sm-1(ng-if='field.reordering')
                             i.fa.fa-arrow-up(ng-show='$index > 0' ng-click='swapSimpleItems(#{fieldMdl}, $index, $index - 1); field.editIdx = -1;')
                             i.fa.fa-arrow-down(ng-show='$index < #{fieldMdl}.length - 1' ng-click='swapSimpleItems(#{fieldMdl}, $index, $index + 1); field.editIdx = -1;')
-            .col-sm-6
-                button.btn.btn-primary.fieldButton(ng-disabled='!newValue || #{fieldMdl}.indexOf(newValue) >= 0' ng-click='field.editIdx = -1; #{fieldMdl} ? #{fieldMdl}.push(newValue) : #{fieldMdl} = [newValue];') Add
-                +tipField('field.tip')
-                .input-tip
-                    input.form-control(type='text' ng-model='newValue' ng-focus='field.editIdx = -1'  placeholder='{{field.placeholder}}')
+            .settings-row(ng-show='field.editIdx < -1')
+                .col-sm-6
+                    i.tipField.fa.fa-floppy-o(ng-click='field.editIdx = -1; #{fieldMdl} ? #{fieldMdl}.push(newValue) : #{fieldMdl} = [newValue];')
+                    .input-tip
+                        input.form-control(type='text' ng-model='newValue' ng-focus='field.editIdx = -2'  placeholder='{{field.placeholder}}')
         div(ng-switch-when='fieldsMetadata' ng-hide=fieldHide)
             +table-pair('{{field.label}}', fieldMdl, 'name', 'className', 'Field name', 'Field class full name')
         div(ng-switch-when='groupsMetadata' ng-hide=fieldHide)&attributes(fieldCommon)
-            div
-                label.table-header {{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')
-                        td.col-sm-6
-                            div(ng-show='field.editIdx != {{$index}}')
-                                a(ng-click='field.editIdx = $index; curValue = #{fieldMdl}[$index]') {{$index + 1}}) {{item | compact}}
-                                i.tipField.fa.fa-remove(ng-click='field.editIdx = -1; #{fieldMdl}.splice($index, 1)')
-                            div(ng-show='field.editIdx == {{$index}}')
-                                label.labelField {{$index + 1}})
-                                i.tipField.fa.fa-floppy-o(ng-click='#{fieldMdl}[$index] = curValue ? curValue : #{fieldMdl}[$index]; field.editIdx = curValue ? -1 : field.editIdx')
-                                .input-tip
-                                    input.form-control(type='text' ng-model='curValue' placeholder='{{field.placeholder}}')
-                        td.col-sm-1(ng-if='field.reordering')
-                            i.fa.fa-arrow-up(ng-show='$index > 0' ng-click='swapSimpleItems(#{fieldMdl}, $index, $index - 1); field.editIdx = -1;')
-                            i.fa.fa-arrow-down(ng-show='$index < #{fieldMdl}.length - 1' ng-click='swapSimpleItems(#{fieldMdl}, $index, $index + 1); field.editIdx = -1;')
-            .col-sm-6
-                button.btn.btn-primary.fieldButton(ng-disabled='!newValue || #{fieldMdl}.indexOf(newValue) >= 0' ng-click='field.editIdx = -1; #{fieldMdl} ? #{fieldMdl}.push(newValue) : #{fieldMdl} = [newValue];') Add
-                +tipField('field.tip')
-                .input-tip
-                    input.form-control(type='text' ng-model='newValue' ng-focus='field.editIdx = -1'  placeholder='{{field.placeholder}}')
+            label.table-header {{field.label}}:
         div(ng-switch-when='indexedTypes')
             +table-pair('Index key-value type pairs', fieldMdl, 'keyClass', 'valueClass', 'Key class full name', 'Value class full name')


[5/9] incubator-ignite git commit: IGNITE-843: Deleted old persistence code.

Posted by se...@apache.org.
IGNITE-843: Deleted old persistence code.


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

Branch: refs/heads/ignite-1121
Commit: 949e37c6df74c5c8f617b46d698cd010bcc3e195
Parents: 5483c51
Author: AKuznetsov <ak...@gridgain.com>
Authored: Thu Jul 16 22:47:43 2015 +0700
Committer: AKuznetsov <ak...@gridgain.com>
Committed: Thu Jul 16 22:47:43 2015 +0700

----------------------------------------------------------------------
 modules/web-control-center/nodejs/app.js        |   2 -
 .../nodejs/controllers/models/persistence.json  |  66 ----
 .../controllers/persistence-controller.js       | 213 ------------
 .../nodejs/routes/persistence.js                | 320 -------------------
 .../nodejs/tests/routes/persistence.js          |  32 --
 .../nodejs/views/configuration/persistence.jade | 114 -------
 6 files changed, 747 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/949e37c6/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 c9b79ab..8c347db 100644
--- a/modules/web-control-center/nodejs/app.js
+++ b/modules/web-control-center/nodejs/app.js
@@ -29,7 +29,6 @@ var publicRoutes = require('./routes/public');
 var clustersRouter = require('./routes/clusters');
 var cachesRouter = require('./routes/caches');
 var metadataRouter = require('./routes/metadata');
-var persistenceRouter = require('./routes/persistence');
 var summary = require('./routes/summary');
 var adminRouter = require('./routes/admin');
 var profileRouter = require('./routes/profile');
@@ -120,7 +119,6 @@ app.use('/profile', mustAuthenticated, profileRouter);
 app.use('/configuration/clusters', clustersRouter);
 app.use('/configuration/caches', cachesRouter);
 app.use('/configuration/metadata', metadataRouter);
-app.use('/configuration/persistence', persistenceRouter);
 app.use('/configuration/summary', summary);
 app.use('/sql', sqlRouter);
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/949e37c6/modules/web-control-center/nodejs/controllers/models/persistence.json
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/controllers/models/persistence.json b/modules/web-control-center/nodejs/controllers/models/persistence.json
deleted file mode 100644
index edf5344..0000000
--- a/modules/web-control-center/nodejs/controllers/models/persistence.json
+++ /dev/null
@@ -1,66 +0,0 @@
-{
-  "connection": [
-    {
-      "label": "Name",
-      "type": "text",
-      "model": "name",
-      "required": true
-    },
-    {
-      "label": "Database type",
-      "type": "dropdown",
-      "model": "dbType",
-      "placeholder": "Choose database",
-      "items": "databases",
-      "tip": [
-        "Select database type to connect for loading tables metadata."
-      ]
-    },
-    {
-      "label": "Database name",
-      "type": "text",
-      "model": "dbName",
-      "tip": [
-        "Database name to connect for loading tables metadata."
-      ]
-    },
-    {
-      "label": "Host",
-      "type": "text",
-      "model": "host",
-      "placeholder": "IP address or host",
-      "tip": [
-        "IP address or host name where database server deployed."
-      ]
-    },
-    {
-      "label": "Port",
-      "type": "number",
-      "model": "port",
-      "max": 65535,
-      "placeholder": "",
-      "tip": [
-        "Port number for connecting to database."
-      ]
-    },
-    {
-      "label": "User",
-      "type": "text",
-      "model": "user",
-      "placeholder": "",
-      "tip": [
-        "User name for connecting to database."
-      ]
-    },
-    {
-      "label": "Password",
-      "type": "password",
-      "model": "password",
-      "placeholder": "",
-      "tip": [
-        "Password for connecting to database.",
-        "Note, password would not be saved."
-      ]
-    }
-  ]
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/949e37c6/modules/web-control-center/nodejs/controllers/persistence-controller.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/controllers/persistence-controller.js b/modules/web-control-center/nodejs/controllers/persistence-controller.js
deleted file mode 100644
index a77c445..0000000
--- a/modules/web-control-center/nodejs/controllers/persistence-controller.js
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-controlCenterModule.controller('persistenceController', ['$scope', '$http', 'commonFunctions', function ($scope, $http, commonFunctions) {
-        $scope.joinTip = commonFunctions.joinTip;
-        $scope.getModel = commonFunctions.getModel;
-
-        $scope.databases = [
-            {value: 'oracle', label: 'Oracle database'},
-            {value: 'db2', label: 'IBM DB2'},
-            {value: 'mssql', label: 'MS SQL Server'},
-            {value: 'postgre', label: 'PostgreSQL'},
-            {value: 'mysql', label: 'MySQL'},
-            {value: 'h2', label: 'H2 database'}
-        ];
-
-        $scope.connection = [];
-
-        $http.get('/models/persistence.json')
-            .success(function (data) {
-                $scope.connection = data.connection;
-            })
-            .error(function (errMsg) {
-                commonFunctions.showError(errMsg);
-            });
-
-        $scope.persistences = [];
-
-        // When landing on the page, get persistences and show them.
-        $http.post('persistence/list')
-            .success(function (data) {
-                $scope.spaces = data.spaces;
-                $scope.persistences = data.persistences;
-
-                var restoredItem = angular.fromJson(sessionStorage.persistenceBackupItem);
-
-                if (restoredItem && restoredItem._id) {
-                    var idx = _.findIndex($scope.persistences, function (persistence) {
-                        return persistence._id == restoredItem._id;
-                    });
-
-                    if (idx >= 0) {
-                        $scope.selectedItem = $scope.persistences[idx];
-
-                        $scope.backupItem = restoredItem;
-                    }
-                    else
-                        sessionStorage.removeItem('persistenceBackupItem');
-                }
-                else
-                    $scope.backupItem = restoredItem;
-
-                $scope.$watch('backupItem', function (val) {
-                    if (val)
-                        sessionStorage.persistenceBackupItem = angular.toJson(val);
-                }, true);
-            })
-            .error(function (errMsg) {
-                commonFunctions.showError(errMsg);
-            });
-
-        $scope.selectItem = function (item) {
-            $scope.selectedItem = item;
-            $scope.backupItem = angular.copy(item);
-        };
-
-        // Add new persistence.
-        $scope.createItem = function () {
-            $scope.backupItem = {database: 'oracle'};
-            $scope.backupItem.space = $scope.spaces[0]._id;
-        };
-
-        // Save persistence in db.
-        $scope.saveItem = function () {
-            var item = $scope.backupItem;
-
-            $http.post('save', item)
-                .success(function (_id) {
-                    var i = _.findIndex($scope.persistences, function (persistence) {
-                        return persistence._id == _id;
-                    });
-
-                    if (i >= 0)
-                        angular.extend($scope.persistences[i], item);
-                    else {
-                        item._id = _id;
-
-                        $scope.persistences.push(item);
-                    }
-
-                    $scope.selectItem(item);
-                })
-                .error(function (errMsg) {
-                    commonFunctions.showError(errMsg);
-                });
-        };
-
-        $scope.removeItem = function () {
-            var _id = $scope.selectedItem._id;
-
-            $http.post('remove', {_id: _id})
-                .success(function () {
-                    var i = _.findIndex($scope.persistences, function (persistence) {
-                        return persistence._id == _id;
-                    });
-
-                    if (i >= 0) {
-                        $scope.persistences.splice(i, 1);
-
-                        $scope.selectedItem = undefined;
-                        $scope.backupItem = undefined;
-                    }
-                })
-                .error(function (errMsg) {
-                    commonFunctions.showError(errMsg);
-                });
-        };
-
-        $scope.data = {
-            curTableIdx: -1,
-            curFieldIdx: -1,
-            curKeyClass: '',
-            curValueClass: '',
-            curJavaName: '',
-            curJavaType: '',
-            tables: [
-                {schemaName: 'Schema1', use: true},
-                {schemaName: 'Schema1', use: true, tableName: 'Table1', keyClass: 'KeyClass1', valueClass: 'ValueClass1',
-                    fields: [
-                        {use: true, key: true, ak: true, dbName: 'name1', dbType: 'dbType1', javaName: 'javaName1', javaType: 'javaType1'},
-                        {use: true, key: false, ak: false, dbName: 'name2', dbType: 'dbType2', javaName: 'javaName2', javaType: 'javaType2'},
-                        {use: false, key: false, ak: false, dbName: 'name3', dbType: 'dbType3', javaName: 'javaName3', javaType: 'javaType3'}
-                    ]
-                },
-                {schemaName: 'Schema2 with very long name', use: false},
-                {schemaName: 'Schema2', use: false, tableName: 'Table2', keyClass: 'KeyClass2', valueClass: 'ValueClass2',
-                    fields: [
-                        {use: true, key: true, ak: true, dbName: 'name4', dbType: 'dbType4', javaName: 'javaName4', javaType: 'javaType4'},
-                        {use: true, key: false, ak: false, dbName: 'name5', dbType: 'dbType5', javaName: 'javaName5', javaType: 'javaType5'},
-                        {use: false, key: false, ak: false, dbName: 'name6', dbType: 'dbType6', javaName: 'javaName6', javaType: 'javaType6'}
-                    ]},
-                {schemaName: 'Schema2', use: false, tableName: 'Table3', keyClass: 'KeyClass3', valueClass: 'ValueClass3',
-                    fields: [
-                        {use: true, key: true, ak: true, dbName: 'name7', dbType: 'dbType7', javaName: 'javaName7', javaType: 'javaType7'},
-                        {use: true, key: false, ak: false, dbName: 'name8', dbType: 'dbType8', javaName: 'javaName8', javaType: 'javaType8'},
-                        {use: false, key: false, ak: false, dbName: 'name9', dbType: 'dbType9', javaName: 'javaName9', javaType: 'javaType9'},
-                        {use: false, key: false, ak: false, dbName: 'name10', dbType: 'dbType10', javaName: 'javaName10', javaType: 'javaType10'},
-                        {use: false, key: false, ak: false, dbName: 'name11', dbType: 'dbType11', javaName: 'javaName11', javaType: 'javaType11'},
-                        {use: false, key: false, ak: false, dbName: 'name12', dbType: 'dbType12', javaName: 'javaName12', javaType: 'javaType12'}
-                    ]}]
-        };
-
-        $scope.selectSchema = function (idx) {
-            var data = $scope.data;
-            var tables = data.tables;
-            var schemaName = tables[idx].schemaName;
-            var use = tables[idx].use;
-
-            for (var i = idx + 1; i < tables.length; i++) {
-                var item = tables[i];
-
-                if (item.schemaName == schemaName && item.tableName)
-                    item.use = use;
-                else
-                    break;
-            }
-
-            data.curTableIdx = -1;
-            data.curFieldIdx = -1;
-        };
-
-        $scope.selectTable = function (idx) {
-            var data = $scope.data;
-
-            data.curTableIdx = idx;
-            data.curFieldIdx = -1;
-
-            if (idx >= 0) {
-                var tbl = data.tables[idx];
-
-                data.curKeyClass = tbl.keyClass;
-                data.curValueClass = tbl.valueClass;
-            }
-        };
-
-        $scope.selectField = function (idx) {
-            var data = $scope.data;
-
-            data.curFieldIdx = idx;
-
-            if (idx >= 0) {
-                var fld = data.tables[data.curTableIdx].fields[idx];
-
-                data.curJavaName = fld.javaName;
-                data.curJavaType = fld.javaType;
-            }
-        };
-    }]
-);

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/949e37c6/modules/web-control-center/nodejs/routes/persistence.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/routes/persistence.js b/modules/web-control-center/nodejs/routes/persistence.js
deleted file mode 100644
index 44d8b69..0000000
--- a/modules/web-control-center/nodejs/routes/persistence.js
+++ /dev/null
@@ -1,320 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var router = require('express').Router();
-var db = require('../db');
-var ds = require('../helpers/data-structures.js'), jdbcTypes = ds.jdbcTypes, javaTypes = ds.javaTypes;
-
-/* GET persistence page. */
-router.get('/', function (req, res) {
-    res.render('configuration/persistence');
-});
-
-/**
- * Get spaces and persistences accessed for user account.
- *
- * @param req Request.
- * @param res Response.
- */
-router.post('/list', function (req, res) {
-    var user_id = req.currentUserId();
-
-    // Get owned space and all accessed space.
-    db.Space.find({$or: [{owner: user_id}, {usedBy: {$elemMatch: {account: user_id}}}]}, function (err, spaces) {
-        if (err)
-            return res.status(500).send(err.message);
-
-        var space_ids = spaces.map(function (value) {
-            return value._id;
-        });
-
-        // Get all persistences for spaces.
-        db.Persistence.find({space: {$in: space_ids}}).sort('name').exec(function (err, persistences) {
-            if (err)
-                return res.status(500).send(err.message);
-
-            res.json({spaces: spaces, persistences: persistences});
-        });
-    });
-});
-
-/**
- * Save persistence.
- */
-router.post('/save', function (req, res) {
-    if (req.body._id)
-        db.Persistence.update({_id: req.body._id}, req.body, {upsert: true}, function (err) {
-            if (err)
-                return res.status(500).send(err.message);
-
-            res.send(req.body._id);
-        });
-    else {
-        db.CacheTypeMetadata.findOne({name: req.body.name}, function (err, persistence) {
-            if (err)
-                return res.status(500).send(err.message);
-
-            if (persistence)
-                return res.status(500).send('Persistence with name: "' + persistence.name + '" already exist.');
-
-            (new db.Persistence(req.body)).save(function (err, persistence) {
-                if (err)
-                    return res.status(500).send(err.message);
-
-                res.send(persistence._id);
-            });
-        });
-    }
-});
-
-/**
- * Remove persistence by ._id.
- */
-router.post('/remove', function (req, res) {
-    db.Persistence.remove(req.body, function (err) {
-        if (err)
-            return res.status(500).send(err.message);
-
-        res.sendStatus(200);
-    })
-});
-
-// simple countdown latch
-function CDL(countdown, completion) {
-    this.countDown = function () {
-        if (--countdown < 1) completion();
-    };
-}
-
-/**
- * @param name Source name.
- * @return String converted to java class name notation.
- */
-function toJavaClassName(name) {
-    var len = name.length;
-
-    var buf = [];
-
-    var capitalizeNext = true;
-
-    for (var i = 0; i < len; i++) {
-        var ch = name.charAt(i);
-
-        if (' ' == ch || '_' == ch)
-            capitalizeNext = true;
-        else if (capitalizeNext) {
-            buf.push(ch.toUpperCase());
-
-            capitalizeNext = false;
-        }
-        else
-            buf.push(ch.toLowerCase());
-    }
-
-    return buf.join("");
-}
-
-/**
- * @param name Source name.
- * @return String converted to java field name notation.
- */
-function toJavaFieldName(name) {
-    var javaName = toJavaClassName(name);
-
-    return javaName.charAt(0).toLowerCase() + javaName.substring(1);
-}
-
-
-//
-router.post('/pg', function (req, res) {
-    var pg = require('pg');
-    var util = require('util');
-
-    var host = req.body.host;
-    var port = req.body.port;
-
-    var username = req.body.username;
-    var password = req.body.password;
-
-    var dbName = req.body.dbName;
-
-    var connectionString = util.format('postgres://%s:%s@%s:%d/%s', username, password, host, port, dbName);
-
-    pg.connect(connectionString, function (err, client, done) {
-        var sendError = function (err) {
-            done();
-
-            res.status(500).send(err.message);
-        };
-
-        if (err)
-            return sendError(err);
-
-        var sendResponse = function () {
-            done();
-
-            console.log(JSON.stringify(tables));
-
-            res.status(200).send(tables);
-        }, jdbcType = function (dataType) {
-            switch (dataType) {
-                case 'smallint':
-                case 'int2':
-                    return jdbcTypes.SMALLINT;
-                case 'integer':
-                case 'int':
-                case 'int4':
-                    return jdbcTypes.INTEGER;
-                case 'oid':
-                case 'bigint':
-                case 'int8':
-                    return jdbcTypes.BIGINT;
-                case 'money':
-                    return jdbcTypes.DOUBLE;
-                case 'decimal':
-                case 'numeric':
-                    return jdbcTypes.NUMERIC;
-                case 'float4':
-                    return jdbcTypes.REAL;
-                case 'float':
-                case 'float8':
-                    return jdbcTypes.DOUBLE;
-                case 'char':
-                case 'bpchar':
-                    return jdbcTypes.CHAR;
-                case 'varchar':
-                case 'text':
-                case 'name':
-                    return jdbcTypes.VARCHAR;
-                case 'bytea':
-                    return jdbcTypes.BINARY;
-                case 'boolean':
-                case 'bool':
-                case 'bit':
-                    return jdbcTypes.BIT;
-                case 'date':
-                    return jdbcTypes.DATE;
-                case 'time':
-                case 'timetz':
-                    return jdbcTypes.TIME;
-                case 'timestamp':
-                case 'timestamptz':
-                    return jdbcTypes.TIMESTAMP;
-            }
-        }, javaType = function (dataType) {
-            switch (dataType) {
-                case jdbcTypes.SMALLINT:
-                case jdbcTypes.INTEGER:
-                    return javaTypes.INTEGER;
-                case jdbcTypes.BIGINT:
-                    return javaTypes.LONG;
-                case jdbcTypes.DOUBLE:
-                    return javaTypes.DOUBLE;
-                case jdbcTypes.NUMERIC:
-                    return javaTypes.BIGDECIMAL;
-                case jdbcTypes.REAL:
-                    return javaTypes.FLOAT;
-                case jdbcTypes.CHAR:
-                case jdbcTypes.VARCHAR:
-                    return javaTypes.STRING;
-                case jdbcTypes.BINARY:
-                    return javaTypes.BYTE_ARRAY;
-                case jdbcTypes.BIT:
-                    return javaTypes.BOOLEAN;
-                case jdbcTypes.DATE:
-                    return javaTypes.DATE;
-                case jdbcTypes.TIME:
-                    return javaTypes.TIME;
-                case jdbcTypes.TIMESTAMP:
-                    return javaTypes.TIMESTAMP;
-            }
-        };
-
-        var tables = [];
-
-        client.query(
-            'SELECT table_schema, table_name ' +
-            'FROM information_schema.tables ' +
-            'WHERE table_schema = ANY (current_schemas(false)) ' +
-            'ORDER BY table_schema, table_name', function (err, result) {
-
-                if (err)
-                    return sendError(err);
-
-                if (result.rows.length > 0) {
-                    // usage
-                    var latch = new CDL(result.rows.length, sendResponse);
-
-                    result.rows.forEach(function (table) {
-
-                        var indisprimary = client.query(
-                            "SELECT a.attname " +
-                            "FROM pg_index i " +
-                            "JOIN pg_attribute a " +
-                            "  ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey) " +
-                            "WHERE  i.indrelid = $1::regclass AND i.indisprimary", [table.table_schema + '.' + table.table_name],
-                            function (err, result) {
-                                if (err)
-                                    return sendError(err);
-
-                                var pks = result.rows.map(function (row) {
-                                    return row.attname;
-                                });
-
-                                client.query(
-                                    'SELECT column_name, udt_name, is_nullable ' +
-                                    'FROM information_schema.columns ' +
-                                    'WHERE table_schema = $1 AND table_name = $2', [table.table_schema, table.table_name],
-                                    function (err, result) {
-                                        if (err)
-                                            return sendError(err);
-
-                                        var cols = [];
-
-                                        result.rows.forEach(function (column) {
-                                            var dataType = jdbcType(column.udt_name);
-
-                                            cols.push({
-                                                pk: pks.indexOf(column.column_name) >= 0,
-                                                use: true,
-                                                notNull: column.is_nullable == 'NO',
-                                                dbName: column.column_name,
-                                                dbType: dataType,
-                                                javaName: toJavaFieldName(column.column_name),
-                                                javaType: javaType(dataType)
-                                            });
-                                        });
-
-                                        var valClsName = toJavaClassName(table.table_name);
-
-                                        tables.push({
-                                            use: pks.length > 0,
-                                            schemaName: table.table_schema, tableName: table.table_name,
-                                            keyClass: valClsName + 'Key', valueClass: valClsName,
-                                            columns: cols
-                                        });
-
-                                        latch.countDown();
-                                    })
-                            });
-                    });
-                }
-            });
-    });
-});
-
-module.exports = router;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/949e37c6/modules/web-control-center/nodejs/tests/routes/persistence.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/tests/routes/persistence.js b/modules/web-control-center/nodejs/tests/routes/persistence.js
deleted file mode 100644
index 4d25950..0000000
--- a/modules/web-control-center/nodejs/tests/routes/persistence.js
+++ /dev/null
@@ -1,32 +0,0 @@
-var request = require('supertest'),
-    should = require('should'),
-    express = require('express'),
-    persistenceRouter = require('../../routes/persistence');
-
-var app = express();
-
-app.use(require('body-parser').json());
-
-app.use('/rest/persistence', persistenceRouter);
-
-describe('request.persistence', function(){
-    var agent = request.agent(app);
-
-    it('should return 200', function(done){
-        agent
-            .post('/rest/persistence/pg')
-            .send({
-                    username: 'nva',
-                    password: 'nva.141',
-                    host: 'localhost',
-                    port: '5432',
-                    dbName: 'ggmonitor'
-                })
-            .end(function(err, res) {
-                if (err)
-                    throw err;
-
-                done();
-            });
-    });
-});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/949e37c6/modules/web-control-center/nodejs/views/configuration/persistence.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/views/configuration/persistence.jade b/modules/web-control-center/nodejs/views/configuration/persistence.jade
deleted file mode 100644
index b8973d7..0000000
--- a/modules/web-control-center/nodejs/views/configuration/persistence.jade
+++ /dev/null
@@ -1,114 +0,0 @@
-//-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
-extends sidebar
-
-append scripts
-    script(src='/persistence-controller.js')
-
-include ../includes/controls
-
-mixin dbcheck(chk)
-    input(type='checkbox' style='margin-left: 5px' ng-checked=chk)
-
-block content
-    .docs-header
-        h1 Create and configure Ignite persistence
-        hr
-    .docs-body(ng-controller='persistenceController')
-        .links(ng-hide='persistences.length == 0')
-            table(st-table='persistences')
-                tbody
-                    tr(ng-repeat='row in persistences track by row._id')
-                        td.col-sm-6(ng-class='{active: row._id == selectedItem._id}')
-                            a(ng-click='selectItem(row)') {{$index + 1}}) {{row.name}}, {{row.database | displayValue:databases:'Database not set'}}
-        button.btn.btn-primary(ng-click='createItem()') Add
-        hr
-        form.form-horizontal(name='inputForm' ng-if='backupItem' novalidate)
-            div(bs-collapse data-start-collapsed='false')
-                .panel.panel-default
-                    .panel-heading
-                        h3
-                            a(bs-collapse-toggle) Connection
-                    .panel-collapse(bs-collapse-target)
-                        .panel-body
-                            .settings-row(ng-repeat='field in connection')
-                                +form-row
-            div(bs-collapse data-start-collapsed='true' ng-hide='data.tables.length == 0')
-                .panel.panel-default
-                    .panel-heading
-                        h3
-                            a(bs-collapse-toggle) Metadata
-                    .panel-collapse(bs-collapse-target)
-                        .panel-body
-                            div(ng-hide='data.tables.length == 0')
-                                table.table-bordered.table-condensed.links-edit-small-padding.col-sm-12(st-table='data.tables')
-                                    thead
-                                        tr
-                                            th.col-sm-3 Schema/Table
-                                            th Key class
-                                            th Value class
-                                    tbody
-                                        tr(ng-repeat='row in data.tables')
-                                            td(colspan='{{row.tableName ? 1 : 3}}')
-                                                div.checkbox(ng-if='!row.tableName')
-                                                    label(ng-click='selectSchema($index)')
-                                                        input(type='checkbox' ng-checked='row.use')
-                                                        | {{row.schemaName}}
-                                                div.checkbox(ng-if='row.tableName')
-                                                    label(style='padding-left: 30px' ng-click='selectTable($index)')
-                                                        input(type='checkbox' ng-checked = 'row.use')
-                                                        | {{row.tableName}}
-                                            td(ng-if='row.tableName')
-                                                a(ng-show='data.curTableIdx != $index' ng-click='selectTable($index)') {{row.keyClass}}
-                                                input.form-control(type='text' ng-show='data.curTableIdx == $index' ng-model='data.curKeyClass' placeholder='Key class full name')
-                                            td(ng-if='row.tableName')
-                                                a(ng-show='data.curTableIdx != $index' ng-click='selectTable($index)') {{row.valueClass}}
-                                                input.form-control(type='text' ng-show='data.curTableIdx == $index' ng-model='data.curValueClass' placeholder='Value class full name')
-                            div(ng-hide='data.curTableIdx < 0')
-                                table.table-bordered.table-condensed.links-edit-small-padding.col-sm-12(st-table='data.tables[data.curTableIdx].fields')
-                                    thead
-                                        tr
-                                            th(style='width:45px') Use
-                                            th(style='width:45px') Key
-                                            th(style='width:45px') Ak
-                                            th DB Name
-                                            th DB Type
-                                            th Java Name
-                                            th Java Type
-                                    tbody
-                                        tr(ng-repeat='row in data.tables[data.curTableIdx].fields')
-                                            td
-                                                +dbcheck('row.use')
-                                            td
-                                                +dbcheck('row.key')
-                                            td
-                                                +dbcheck('row.ak')
-                                            td
-                                                label {{row.dbName}}
-                                            td
-                                                label {{row.dbType}}
-                                            td
-                                                a(ng-show='data.curFieldIdx != $index' ng-click='selectField($index)') {{row.javaName}}
-                                                input.form-control(type='text' ng-show='data.curFieldIdx == $index' ng-model='data.curJavaName' placeholder='Field Java name')
-                                            td
-                                                a(ng-show='data.curFieldIdx != $index' ng-click='selectField($index)') {{row.javaType}}
-                                                input.form-control(type='text' ng-show='data.curFieldIdx == $index' ng-model='data.curJavaType' placeholder='Field Java type')
-        button.btn.btn-primary(ng-disabled='inputForm.$invalid' ng-click='saveItem()') Save
-        button.btn.btn-primary.btn-second(ng-show='backupItem._id' ng-click='removeItem()') Remove
-        button.btn.btn-primary.btn-second(ng-click='reloadMetadata()') Reload
-
-


[7/9] incubator-ignite git commit: IGNITE-843: Minor refactoring to mixin.

Posted by se...@apache.org.
IGNITE-843: Minor refactoring to mixin.


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

Branch: refs/heads/ignite-1121
Commit: 95f826f2f642ae4ef5c0ab49ec18e2e70ec96f81
Parents: 9cc79ae
Author: AKuznetsov <ak...@gridgain.com>
Authored: Thu Jul 16 23:09:23 2015 +0700
Committer: AKuznetsov <ak...@gridgain.com>
Committed: Thu Jul 16 23:09:23 2015 +0700

----------------------------------------------------------------------
 .../nodejs/views/configuration/summary.jade                 | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/95f826f2/modules/web-control-center/nodejs/views/configuration/summary.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/views/configuration/summary.jade b/modules/web-control-center/nodejs/views/configuration/summary.jade
index 93f27a8..848e710 100644
--- a/modules/web-control-center/nodejs/views/configuration/summary.jade
+++ b/modules/web-control-center/nodejs/views/configuration/summary.jade
@@ -32,6 +32,9 @@ append css
 
 include ../includes/controls
 
+mixin hard-link(ref, txt)
+    a(style='color:#ec1c24' href=ref target="_blank") #{txt}
+
 block content
     .docs-header
         h1 Configurations summary
@@ -89,13 +92,13 @@ block content
                                         #javaServer
                                     div(ng-show="cfgLangServer == 'docker'")
                                         p
-                                            a(style='color:#ec1c24' href='https://docs.docker.com/reference/builder' target="_blank") Docker
+                                            +hard-link('https://docs.docker.com/reference/builder', 'Docker')
                                             | &nbsp;file is a text file with instructions to create Docker image.<br/>
                                             | To build image you have to store following Docker file with your Ignite XML configuration to the same directory.<br>
                                             | Also you could use predefined&nbsp;
-                                            a(style='color:#ec1c24' href='https://ignite.incubator.apache.org/download.html#docker' target="_blank") Apache Ignite docker image
+                                            +hard-link('https://ignite.incubator.apache.org/download.html#docker', 'Apache Ignite docker image')
                                             | . For more information about using Ignite with Docker please read&nbsp;
-                                            a(style='color:#ec1c24' href='http://apacheignite.readme.io/docs/docker-deployment' target="_blank") documentation
+                                            +hard-link('http://apacheignite.readme.io/docs/docker-deployment', 'documentation')
                                             |.
                                         .col-sm-2
                                             label(for='os') Operation System:


[2/9] incubator-ignite git commit: IGNITE-843 WIP metadata: implemented fields metadata controls.

Posted by se...@apache.org.
IGNITE-843 WIP metadata: implemented fields metadata controls.


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

Branch: refs/heads/ignite-1121
Commit: 870f8bfa0c562b6d77712a4dd55d4b871a388633
Parents: 400bc56
Author: AKuznetsov <ak...@gridgain.com>
Authored: Thu Jul 16 16:50:41 2015 +0700
Committer: AKuznetsov <ak...@gridgain.com>
Committed: Thu Jul 16 16:50:41 2015 +0700

----------------------------------------------------------------------
 .../nodejs/controllers/caches-controller.js     |  14 +-
 .../nodejs/controllers/metadata-controller.js   | 192 +++++++++++++++++--
 .../nodejs/controllers/models/metadata.json     |  11 +-
 .../nodejs/routes/metadata.js                   |   4 +-
 .../nodejs/views/configuration/metadata.jade    |  15 +-
 .../nodejs/views/includes/controls.jade         |  77 +++-----
 6 files changed, 223 insertions(+), 90 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/870f8bfa/modules/web-control-center/nodejs/controllers/caches-controller.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/controllers/caches-controller.js b/modules/web-control-center/nodejs/controllers/caches-controller.js
index b6cadcf..7af388f 100644
--- a/modules/web-control-center/nodejs/controllers/caches-controller.js
+++ b/modules/web-control-center/nodejs/controllers/caches-controller.js
@@ -215,7 +215,7 @@ controlCenterModule.controller('cachesController', ['$scope', '$http', '$saveAs'
 
         // Save cache with new name.
         $scope.saveItemAs = function () {
-           if (validate($scope.backupItem))
+            if (validate($scope.backupItem))
                 $saveAs.show($scope.backupItem.name).then(function (newName) {
                     var item = angular.copy($scope.backupItem);
 
@@ -262,7 +262,7 @@ controlCenterModule.controller('cachesController', ['$scope', '$http', '$saveAs'
             );
         };
 
-        $scope.checkIndexedTypes = function (keyCls, valCls) {
+        function tablePairValid(keyCls, valCls) {
             if (!keyCls) {
                 commonFunctions.showError('Key class name should be non empty!');
 
@@ -276,10 +276,10 @@ controlCenterModule.controller('cachesController', ['$scope', '$http', '$saveAs'
             }
 
             return true;
-        };
+        }
 
-        $scope.addIndexedTypes = function (keyCls, valCls) {
-            if (!$scope.checkIndexedTypes(keyCls, valCls))
+        $scope.tablePairAdd = function (fld, keyCls, valCls) {
+            if (!tablePairValid(keyCls, valCls))
                 return;
 
             var idxTypes = $scope.backupItem.indexedTypes;
@@ -292,8 +292,8 @@ controlCenterModule.controller('cachesController', ['$scope', '$http', '$saveAs'
                 $scope.backupItem.indexedTypes = [newItem];
         };
 
-        $scope.saveIndexedType = function (idx, keyCls, valCls) {
-            if (!$scope.checkIndexedTypes(keyCls, valCls))
+        $scope.tablePairSave = function (idx, fld, keyCls, valCls) {
+            if (!tablePairValid(keyCls, valCls))
                 return idx;
 
             var idxType = $scope.backupItem.indexedTypes[idx];

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/870f8bfa/modules/web-control-center/nodejs/controllers/metadata-controller.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/controllers/metadata-controller.js b/modules/web-control-center/nodejs/controllers/metadata-controller.js
index a4b54cc..c23da07 100644
--- a/modules/web-control-center/nodejs/controllers/metadata-controller.js
+++ b/modules/web-control-center/nodejs/controllers/metadata-controller.js
@@ -52,29 +52,142 @@ controlCenterModule.controller('metadataController', ['$scope', '$http', 'common
             curJavaType: '',
             tables: [
                 {schemaName: 'Schema1', use: true},
-                {schemaName: 'Schema1', use: true, tableName: 'Table1', keyClass: 'KeyClass1', valueClass: 'ValueClass1',
+                {
+                    schemaName: 'Schema1',
+                    use: true,
+                    tableName: 'Table1',
+                    keyClass: 'KeyClass1',
+                    valueClass: 'ValueClass1',
                     fields: [
-                        {use: true, key: true, ak: true, dbName: 'name1', dbType: 'dbType1', javaName: 'javaName1', javaType: 'javaType1'},
-                        {use: true, key: false, ak: false, dbName: 'name2', dbType: 'dbType2', javaName: 'javaName2', javaType: 'javaType2'},
-                        {use: false, key: false, ak: false, dbName: 'name3', dbType: 'dbType3', javaName: 'javaName3', javaType: 'javaType3'}
+                        {
+                            use: true,
+                            key: true,
+                            ak: true,
+                            dbName: 'name1',
+                            dbType: 'dbType1',
+                            javaName: 'javaName1',
+                            javaType: 'javaType1'
+                        },
+                        {
+                            use: true,
+                            key: false,
+                            ak: false,
+                            dbName: 'name2',
+                            dbType: 'dbType2',
+                            javaName: 'javaName2',
+                            javaType: 'javaType2'
+                        },
+                        {
+                            use: false,
+                            key: false,
+                            ak: false,
+                            dbName: 'name3',
+                            dbType: 'dbType3',
+                            javaName: 'javaName3',
+                            javaType: 'javaType3'
+                        }
                     ]
                 },
                 {schemaName: 'Schema2 with very long name', use: false},
-                {schemaName: 'Schema2', use: false, tableName: 'Table2', keyClass: 'KeyClass2', valueClass: 'ValueClass2',
+                {
+                    schemaName: 'Schema2',
+                    use: false,
+                    tableName: 'Table2',
+                    keyClass: 'KeyClass2',
+                    valueClass: 'ValueClass2',
                     fields: [
-                        {use: true, key: true, ak: true, dbName: 'name4', dbType: 'dbType4', javaName: 'javaName4', javaType: 'javaType4'},
-                        {use: true, key: false, ak: false, dbName: 'name5', dbType: 'dbType5', javaName: 'javaName5', javaType: 'javaType5'},
-                        {use: false, key: false, ak: false, dbName: 'name6', dbType: 'dbType6', javaName: 'javaName6', javaType: 'javaType6'}
-                    ]},
-                {schemaName: 'Schema2', use: false, tableName: 'Table3', keyClass: 'KeyClass3', valueClass: 'ValueClass3',
+                        {
+                            use: true,
+                            key: true,
+                            ak: true,
+                            dbName: 'name4',
+                            dbType: 'dbType4',
+                            javaName: 'javaName4',
+                            javaType: 'javaType4'
+                        },
+                        {
+                            use: true,
+                            key: false,
+                            ak: false,
+                            dbName: 'name5',
+                            dbType: 'dbType5',
+                            javaName: 'javaName5',
+                            javaType: 'javaType5'
+                        },
+                        {
+                            use: false,
+                            key: false,
+                            ak: false,
+                            dbName: 'name6',
+                            dbType: 'dbType6',
+                            javaName: 'javaName6',
+                            javaType: 'javaType6'
+                        }
+                    ]
+                },
+                {
+                    schemaName: 'Schema2',
+                    use: false,
+                    tableName: 'Table3',
+                    keyClass: 'KeyClass3',
+                    valueClass: 'ValueClass3',
                     fields: [
-                        {use: true, key: true, ak: true, dbName: 'name7', dbType: 'dbType7', javaName: 'javaName7', javaType: 'javaType7'},
-                        {use: true, key: false, ak: false, dbName: 'name8', dbType: 'dbType8', javaName: 'javaName8', javaType: 'javaType8'},
-                        {use: false, key: false, ak: false, dbName: 'name9', dbType: 'dbType9', javaName: 'javaName9', javaType: 'javaType9'},
-                        {use: false, key: false, ak: false, dbName: 'name10', dbType: 'dbType10', javaName: 'javaName10', javaType: 'javaType10'},
-                        {use: false, key: false, ak: false, dbName: 'name11', dbType: 'dbType11', javaName: 'javaName11', javaType: 'javaType11'},
-                        {use: false, key: false, ak: false, dbName: 'name12', dbType: 'dbType12', javaName: 'javaName12', javaType: 'javaType12'}
-                    ]}]
+                        {
+                            use: true,
+                            key: true,
+                            ak: true,
+                            dbName: 'name7',
+                            dbType: 'dbType7',
+                            javaName: 'javaName7',
+                            javaType: 'javaType7'
+                        },
+                        {
+                            use: true,
+                            key: false,
+                            ak: false,
+                            dbName: 'name8',
+                            dbType: 'dbType8',
+                            javaName: 'javaName8',
+                            javaType: 'javaType8'
+                        },
+                        {
+                            use: false,
+                            key: false,
+                            ak: false,
+                            dbName: 'name9',
+                            dbType: 'dbType9',
+                            javaName: 'javaName9',
+                            javaType: 'javaType9'
+                        },
+                        {
+                            use: false,
+                            key: false,
+                            ak: false,
+                            dbName: 'name10',
+                            dbType: 'dbType10',
+                            javaName: 'javaName10',
+                            javaType: 'javaType10'
+                        },
+                        {
+                            use: false,
+                            key: false,
+                            ak: false,
+                            dbName: 'name11',
+                            dbType: 'dbType11',
+                            javaName: 'javaName11',
+                            javaType: 'javaType11'
+                        },
+                        {
+                            use: false,
+                            key: false,
+                            ak: false,
+                            dbName: 'name12',
+                            dbType: 'dbType12',
+                            javaName: 'javaName12',
+                            javaType: 'javaType12'
+                        }
+                    ]
+                }]
         };
 
         $scope.metadata = [];
@@ -140,6 +253,8 @@ controlCenterModule.controller('metadataController', ['$scope', '$http', 'common
 
             $http.post('metadata/save', item)
                 .success(function (_id) {
+                    commonFunctions.showInfo('Metadata "' + item.name + '" saved.');
+
                     var idx = _.findIndex($scope.metadatas, function (metadata) {
                         return metadata._id == _id;
                     });
@@ -154,7 +269,6 @@ controlCenterModule.controller('metadataController', ['$scope', '$http', 'common
 
                     $scope.selectItem(item);
 
-                    commonFunctions.showInfo('metadata "' + item.name + '" saved.');
                 })
                 .error(function (errMsg) {
                     commonFunctions.showError(errMsg);
@@ -182,6 +296,48 @@ controlCenterModule.controller('metadataController', ['$scope', '$http', 'common
                 });
         };
 
+        function fieldValid(fld, cls) {
+            if (!fld) {
+                commonFunctions.showError('Field name should be non empty!');
+
+                return false;
+            }
+
+            if (!cls) {
+                commonFunctions.showError('Field class name should be non empty!');
+
+                return false;
+            }
+
+            return true;
+        }
+
+        $scope.tablePairAdd = function (mdl, fld, cls) {
+            if (!fieldValid(fld, cls))
+                return;
+
+            var fields = $scope.backupItem[mdl.model];
+
+            var newItem = {name: fld, className: cls};
+
+            if (fields)
+                fields.push(newItem);
+            else
+                $scope.backupItem[mdl.model] = [newItem];
+        };
+
+        $scope.tablePairSave = function (idx, mdl, fld, cls) {
+            if (!fieldValid(fld, cls))
+                return idx;
+
+            var field = $scope.backupItem[mdl.model][idx];
+
+            field.name = fld;
+            field.className = cls;
+
+            return -1;
+        };
+
         $scope.selectSchema = function (idx) {
             var data = $scope.data;
             var tables = data.tables;

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/870f8bfa/modules/web-control-center/nodejs/controllers/models/metadata.json
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/controllers/models/metadata.json b/modules/web-control-center/nodejs/controllers/models/metadata.json
index 753f643..63710e0 100644
--- a/modules/web-control-center/nodejs/controllers/models/metadata.json
+++ b/modules/web-control-center/nodejs/controllers/models/metadata.json
@@ -31,7 +31,6 @@
       "label": "Database schema",
       "type": "text",
       "model": "databaseSchema",
-      "required": true,
       "hide": "backupItem.kind == 'query'",
       "placeholder": "Input DB schema name",
       "tip": ["TODO."]
@@ -40,7 +39,6 @@
       "label": "Database table",
       "type": "text",
       "model": "databaseTable",
-      "required": true,
       "hide": "backupItem.kind == 'query'",
       "placeholder": "Input DB table name",
       "tip": ["TODO."]
@@ -77,21 +75,21 @@
     },
     {
       "label": "Query fields",
-      "type": "text",
+      "type": "fieldsMetadata",
       "model": "queryFields",
       "hide": "backupItem.kind != 'query'",
       "tip": ["TODO."]
     },
     {
       "label": "Ascending fields",
-      "type": "text",
+      "type": "fieldsMetadata",
       "model": "ascendingFields",
       "hide": "backupItem.kind != 'query'",
       "tip": ["TODO."]
     },
     {
       "label": "Descending fields",
-      "type": "text",
+      "type": "fieldsMetadata",
       "model": "descendingFields",
       "hide": "backupItem.kind != 'query'",
       "tip": ["TODO."]
@@ -115,8 +113,7 @@
     {
       "label": "Name",
       "type": "text",
-      "model": "name",
-      "required": true
+      "model": "name"
     },
     {
       "label": "Database type",

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/870f8bfa/modules/web-control-center/nodejs/routes/metadata.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/routes/metadata.js b/modules/web-control-center/nodejs/routes/metadata.js
index 283f85e..64b8763 100644
--- a/modules/web-control-center/nodejs/routes/metadata.js
+++ b/modules/web-control-center/nodejs/routes/metadata.js
@@ -42,11 +42,11 @@ router.post('/list', function (req, res) {
         });
 
         // Get all metadata for spaces.
-        db.CacheTypeMetadata.find({space: {$in: space_ids}}).sort('name').exec(function (err, metadata) {
+        db.CacheTypeMetadata.find({space: {$in: space_ids}}).sort('name').exec(function (err, metadatas) {
             if (err)
                 return res.status(500).send(err.message);
 
-            res.json({spaces: spaces, metadata: metadata});
+            res.json({spaces: spaces, metadatas: metadatas});
         });
     });
 });

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/870f8bfa/modules/web-control-center/nodejs/views/configuration/metadata.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/nodejs/views/configuration/metadata.jade b/modules/web-control-center/nodejs/views/configuration/metadata.jade
index fd5ab03..7eec682 100644
--- a/modules/web-control-center/nodejs/views/configuration/metadata.jade
+++ b/modules/web-control-center/nodejs/views/configuration/metadata.jade
@@ -28,12 +28,13 @@ block content
     .docs-body(ng-controller='metadataController')
         .block-callout
             p(ng-bind-html='joinTip(screenTip)')
-        .links(ng-hide='metadata.length == 0')
-            table(st-table='metadata')
+        .links(ng-hide='metadatas.length == 0')
+            table(st-table='metadatas')
                 tbody
-                    tr(ng-repeat='row in metadata track by row._id')
+                    tr(ng-repeat='row in metadatas track by row._id')
                         td.col-sm-6(ng-class='{active: row._id == selectedItem._id}')
                             a(ng-click='selectItem(row)') {{$index + 1}}) {{row.name}}
+                hr
         panel-group(bs-collapse data-allow-multiple="false")
             .panel.panel-default
                 .panel-heading
@@ -42,14 +43,12 @@ block content
                 .panel-collapse(role="tabpanel" bs-collapse-target)
                     .panel-body
                         button.btn.btn-primary(ng-click='createItem()') &nbspAdd metadata
-                        label(style='margin-left: 15px; margin-right: 10px') for:
+                        label(style='margin-left: 6px; margin-right: 10px') for:
                         button.btn.btn-default(ng-model='template' data-template='/select' data-placeholder='Choose metadata type' bs-options='item.value as item.label for item in templates' bs-select)
                         i.tiplabel.fa.fa-question-circle(bs-tooltip data-title='{{joinTip(templateTip)}}' type='button')
-                        hr
                         form.form-horizontal(name='manualForm' ng-if='backupItem' novalidate)
-                            .panel-body
-                                .settings-row(ng-repeat='field in metadataManual')
-                                    +form-row
+                            .settings-row(ng-repeat='field in metadataManual')
+                                +form-row
                             button.btn.btn-primary(ng-disabled='manualForm.$invalid' ng-click='saveItem()') Save
                             button.btn.btn-primary.btn-second(ng-show='backupItem._id' ng-click='removeItem()') Remove
             .panel.panel-default

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/870f8bfa/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 74481e8..f99d5dd 100644
--- a/modules/web-control-center/nodejs/views/includes/controls.jade
+++ b/modules/web-control-center/nodejs/views/includes/controls.jade
@@ -25,6 +25,32 @@ mixin tipLabel(lines)
 mixin exclamation(mdl, err, msg)
     i.fa.fa-exclamation-triangle.form-control-feedback(ng-show='inputForm["#{mdl}"].$error.#{err}' bs-tooltip data-title='#{msg}' type='button')
 
+mixin table-pair(header, tblMdl, keyFld, valFld, keyPlaceholder, valPlaceholder)
+    div
+        label.table-header #{header}:
+        +tipLabel('field.tip')
+    table.links-edit.col-sm-12(st-table=tblMdl ng-show='#{tblMdl}.length > 0')
+        tbody
+            tr.col-sm-12(ng-repeat='item in #{tblMdl}')
+                td.col-sm-6
+                    div(ng-show='field.editIdx != {{$index}}')
+                        a(ng-click='field.editIdx = $index; curKey = #{tblMdl}[$index].#{keyFld}; curValue = #{tblMdl}[$index].#{valFld}') {{$index + 1}}) {{item.#{keyFld}}} / {{item.#{valFld}}}
+                        i.tipField.fa.fa-remove(ng-click='field.editIdx = -1; #{tblMdl}.splice($index, 1)')
+                    div(ng-show='field.editIdx == {{$index}}')
+                        label.labelField {{$index + 1}})
+                        i.tipField.fa.fa-floppy-o(ng-click='field.editIdx = tablePairSave($index, field, curKey, curValue)')
+                        .input-tip
+                            .col-sm-12
+                                input.form-control.table-form-control(type='text' ng-model='curKey' placeholder=keyPlaceholder)
+                                label &nbsp;/&nbsp;
+                                input.form-control.table-form-control(type='text' ng-model='curValue' placeholder=valPlaceholder)
+    .col-sm-6
+        input.form-control(type='text' ng-model='newKey' ng-focus='field.editIdx = -1' placeholder=keyPlaceholder)
+        .settings-row
+            input.form-control(type='text' ng-model='newValue' ng-focus='field.editIdx = -1' placeholder=valPlaceholder)
+        button.btn.btn-primary.fieldButton(ng-disabled='!newKey || !newValue' ng-click='field.editIdx = -1; tablePairAdd(field, newKey, newValue)') Add
+
+
 mixin details-row
     - var lblDetailClasses = ['col-sm-4', 'details-label']
 
@@ -180,30 +206,8 @@ mixin form-row-custom(lblClasses, fieldClasses)
                 +tipField('field.tip')
                 .input-tip
                     input.form-control(type='text' ng-model='newValue' ng-focus='field.editIdx = -1'  placeholder='{{field.placeholder}}')
-        div(ng-switch-when='fieldsMetadata' ng-hide=fieldHide)&attributes(fieldCommon)
-            div
-                label.table-header {{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')
-                        td.col-sm-6
-                            div(ng-show='field.editIdx != {{$index}}')
-                                a(ng-click='field.editIdx = $index; curValue = #{fieldMdl}[$index]') {{$index + 1}}) {{item | compact}}
-                                i.tipField.fa.fa-remove(ng-click='field.editIdx = -1; #{fieldMdl}.splice($index, 1)')
-                            div(ng-show='field.editIdx == {{$index}}')
-                                label.labelField {{$index + 1}})
-                                i.tipField.fa.fa-floppy-o(ng-click='#{fieldMdl}[$index] = curValue ? curValue : #{fieldMdl}[$index]; field.editIdx = curValue ? -1 : field.editIdx')
-                                .input-tip
-                                    input.form-control(type='text' ng-model='curValue' placeholder='{{field.placeholder}}')
-                        td.col-sm-1(ng-if='field.reordering')
-                            i.fa.fa-arrow-up(ng-show='$index > 0' ng-click='swapSimpleItems(#{fieldMdl}, $index, $index - 1); field.editIdx = -1;')
-                            i.fa.fa-arrow-down(ng-show='$index < #{fieldMdl}.length - 1' ng-click='swapSimpleItems(#{fieldMdl}, $index, $index + 1); field.editIdx = -1;')
-            .col-sm-6
-                button.btn.btn-primary.fieldButton(ng-disabled='!newValue || #{fieldMdl}.indexOf(newValue) >= 0' ng-click='field.editIdx = -1; #{fieldMdl} ? #{fieldMdl}.push(newValue) : #{fieldMdl} = [newValue];') Add
-                +tipField('field.tip')
-                .input-tip
-                    input.form-control(type='text' ng-model='newValue' ng-focus='field.editIdx = -1'  placeholder='{{field.placeholder}}')
+        div(ng-switch-when='fieldsMetadata' ng-hide=fieldHide)
+            +table-pair('{{field.label}}', fieldMdl, 'name', 'className', 'Field name', 'Field class full name')
         div(ng-switch-when='groupsMetadata' ng-hide=fieldHide)&attributes(fieldCommon)
             div
                 label.table-header {{field.label}}:
@@ -229,27 +233,4 @@ mixin form-row-custom(lblClasses, fieldClasses)
                 .input-tip
                     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.table-header Index key-value type pairs:
-                +tipLabel('field.tip')
-            table.links-edit.col-sm-12(st-table=tblMdl ng-show='#{tblMdl}.length > 0')
-                tbody
-                    tr.col-sm-12(ng-repeat='item in #{tblMdl}')
-                        td.col-sm-6
-                            div(ng-show='field.editIdx != {{$index}}')
-                                a(ng-click='field.editIdx = $index; curKeyClass = #{tblMdl}[$index].keyClass; curValueClass = #{tblMdl}[$index].valueClass') {{$index + 1}}) {{item.keyClass}} / {{item.valueClass}}
-                                i.tipField.fa.fa-remove(ng-click='field.editIdx = -1; #{tblMdl}.splice($index, 1)')
-                            div(ng-show='field.editIdx == {{$index}}')
-                                label.labelField {{$index + 1}})
-                                i.tipField.fa.fa-floppy-o(ng-click='field.editIdx = saveIndexedType($index, curKeyClass, curValueClass)')
-                                .input-tip
-                                    .col-sm-12
-                                        input.form-control.table-form-control(type='text' ng-model='curKeyClass' placeholder='Key class full name')
-                                        label &nbsp;/&nbsp;
-                                        input.form-control.table-form-control(type='text' ng-model='curValueClass' placeholder='Value class full name')
-            .col-sm-6
-                input.form-control(type='text' ng-model='newKeyClass' ng-focus='field.editIdx = -1' placeholder='Key class full name')
-                .settings-row
-                    input.form-control(type='text' ng-model='newValueClass' ng-focus='field.editIdx = -1' placeholder='Value class full name')
-                button.btn.btn-primary.fieldButton(ng-disabled='!newKeyClass || !newValueClass' ng-click='field.editIdx = -1; addIndexedTypes(newKeyClass, newValueClass)') Add
+            +table-pair('Index key-value type pairs', fieldMdl, 'keyClass', 'valueClass', 'Key class full name', 'Value class full name')