Repository: incubator-ignite
Updated Branches:
  refs/heads/ignite-843 fe0507955 -> a9fd2676a


IGNITE-843 WIP on tables.


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

Branch: refs/heads/ignite-843
Commit: d81ab79ab4f5d0f84eeef92d2f87ca4a9d8cf416
Parents: fe05079
Author: AKuznetsov <akuznet...@gridgain.com>
Authored: Wed Aug 12 21:28:53 2015 +0700
Committer: AKuznetsov <akuznet...@gridgain.com>
Committed: Wed Aug 12 21:28:53 2015 +0700

----------------------------------------------------------------------
 .../main/js/controllers/caches-controller.js    |   3 +-
 .../src/main/js/controllers/common-module.js    | 322 ++++++++++++-------
 .../main/js/controllers/metadata-controller.js  |   9 +-
 modules/control-center-web/src/main/js/db.js    |   2 +-
 .../control-center-web/src/main/js/package.json |   2 +-
 .../src/main/js/views/includes/controls.jade    |  26 +-
 6 files changed, 233 insertions(+), 131 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d81ab79a/modules/control-center-web/src/main/js/controllers/caches-controller.js
----------------------------------------------------------------------
diff --git 
a/modules/control-center-web/src/main/js/controllers/caches-controller.js 
b/modules/control-center-web/src/main/js/controllers/caches-controller.js
index 6b9f1bf..5c6ee17 100644
--- a/modules/control-center-web/src/main/js/controllers/caches-controller.js
+++ b/modules/control-center-web/src/main/js/controllers/caches-controller.js
@@ -38,7 +38,6 @@ controlCenterModule.controller('cachesController', [
             $scope.tablePairSave = $table.tablePairSave;
             $scope.tablePairSaveVisible = $table.tablePairSaveVisible;
 
-            $scope.availableWidth = $common.availableWidth;
             $scope.compactJavaName = $common.compactJavaName;
 
             $scope.atomicities = $common.mkOptions(['ATOMIC', 
'TRANSACTIONAL']);
@@ -147,7 +146,7 @@ controlCenterModule.controller('cachesController', [
                 return true;
             };
 
-            $scope.tablePairValid = function (item, field, keyCls, valCls, 
index) {
+            $scope.tablePairValid = function (item, field, index) {
                 if (!$common.isValidJavaClass('Indexed type key', keyCls, 
true))
                     return focusInvalidField(index, 'KeyIndexedType');
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d81ab79a/modules/control-center-web/src/main/js/controllers/common-module.js
----------------------------------------------------------------------
diff --git 
a/modules/control-center-web/src/main/js/controllers/common-module.js 
b/modules/control-center-web/src/main/js/controllers/common-module.js
index 3aa17b0..7a22992 100644
--- a/modules/control-center-web/src/main/js/controllers/common-module.js
+++ b/modules/control-center-web/src/main/js/controllers/common-module.js
@@ -173,115 +173,212 @@ controlCenterModule.service('$common', [
         /**
          * Compact java full class name by max number of characters.
          *
-         * @param s Class name to cut.
-         * @param maxLength Max available width in characters.
-         * @returns {*} Compacted class name.
+         * @param names Array of class names to compact.
+         * @param nameLength Max available width in characters for simple name.
+         * @returns {*} Array of compacted class names.
          */
-        function compactByMaxCharts(s, maxLength) {
-            if (s.length <= maxLength)
-                return s;
+        function compactByMaxCharts(names, nameLength) {
+            for (var nameIx = 0; nameIx < names.length; nameIx ++) {
+                var s = names[nameIx];
 
-            var totalLength = s.length;
+                if (s.length > nameLength) {
+                    var totalLength = s.length;
 
-            var packages = s.split('.');
+                    var packages = s.split('.');
 
-            var packageCnt = packages.length - 1;
+                    var packageCnt = packages.length - 1;
 
-            for (var i = 0; i < packageCnt && totalLength > maxLength; i++) {
-                if (packages[i].length > 0) {
-                    totalLength -= packages[i].length - 1;
+                    for (var i = 0; i < packageCnt && totalLength > 
nameLength; i++) {
+                        if (packages[i].length > 0) {
+                            totalLength -= packages[i].length - 1;
 
-                    packages[i] = packages[i][0];
-                }
-            }
+                            packages[i] = packages[i][0];
+                        }
+                    }
 
-            if (totalLength > maxLength) {
-                var className = packages[packageCnt];
+                    if (totalLength > nameLength) {
+                        var className = packages[packageCnt];
 
-                var classNameLen = className.length;
+                        var classNameLen = className.length;
 
-                var remains = Math.min(maxLength - totalLength + classNameLen, 
classNameLen);
+                        var remains = Math.min(nameLength - totalLength + 
classNameLen, classNameLen);
 
-                if (remains < 3)
-                    remains = Math.min(3, classNameLen);
+                        if (remains < 3)
+                            remains = Math.min(3, classNameLen);
 
-                packages[packageCnt] = className.substring(0, remains) + '...';
-            }
+                        packages[packageCnt] = className.substring(0, remains) 
+ '...';
+                    }
 
-            var result = packages[0];
+                    var result = packages[0];
 
-            for (i = 1; i < packages.length; i++)
-                result += '.' + packages[i];
+                    for (i = 1; i < packages.length; i++)
+                        result += '.' + packages[i];
 
-            return result
+                    names[nameIx] = result;
+                }
+            }
+
+            return names
         }
 
         /**
          * Compact java full class name by max number of pixels.
          *
-         * @param s Class name to cut.
-         * @param maxWidth Maximum available width in pixels.
-         * @returns {*} Compacted class name.
+         * @param names Array of class names to compact.
+         * @param nameLength Max available width in characters for simple 
name. Used for calculation optimization.
+         * @param nameWidth Maximum available width in pixels for simple name.
+         * @returns {*} Array of compacted class names.
          */
-        function compactByMaxPixels(s, maxWidth) {
-            var totalLength = measureText(s);
+        function compactByMaxPixels(names, nameLength, nameWidth) {
+            if (nameWidth <= 0)
+                return names;
+
+            var fitted = [];
+
+            var widthByName = [];
 
-            if (totalLength <= maxWidth)
-                return s;
+            var len = names.length;
 
-            var packages = s.split('.');
+            var divideTo = len;
 
-            var packageCnt = packages.length - 1;
+            for (var nameIx = 0; nameIx < len; nameIx ++) {
+                fitted[nameIx] = false;
 
-            for (var i = 0; i < packageCnt && totalLength > maxWidth; i++) {
-                if (packages[i].length > 1) {
-                    totalLength -= measureText(packages[i].substring(2, 
packages[i].length));
+                widthByName[nameIx] = nameWidth;
+            }
+
+            // Try to distribute space from short class names to long class 
names.
+            do {
+                var remains = 0;
+
+                for (nameIx = 0; nameIx < len; nameIx++) {
+                    if (!fitted[nameIx]) {
+                        var curNameWidth = measureText(names[nameIx]);
+
+                        if (widthByName[nameIx] > curNameWidth) {
+                            fitted[nameIx] = true;
+
+                            remains += widthByName[nameIx] - curNameWidth;
 
-                    packages[i] = packages[i][0];
+                            divideTo -= 1;
+
+                            widthByName[nameIx] = curNameWidth;
+                        }
+                    }
+                }
+
+                var remainsByName = remains / divideTo;
+
+                for (nameIx = 0; nameIx < len; nameIx++) {
+                    if (!fitted[nameIx]) {
+                        widthByName[nameIx] += remainsByName;
+                    }
                 }
             }
+            while(remains > 0);
 
-            var shortPackage = '';
+            // Compact class names to available for each space.
+            for (nameIx = 0; nameIx < len; nameIx ++) {
+                var s = names[nameIx];
 
-            for (i = 0; i < packageCnt; i++)
-                shortPackage += packages[i] + '.';
+                if (s.length > (nameLength / 2) | 0) {
+                    var totalWidth = measureText(s);
 
-            var className = packages[packageCnt];
+                    if (totalWidth > widthByName[nameIx]) {
+                        var packages = s.split('.');
 
-            var classLen = className.length;
+                        var packageCnt = packages.length - 1;
 
-            var minLen = Math.min(classLen, 3);
+                        for (var i = 0; i < packageCnt && totalWidth > 
widthByName[nameIx]; i++) {
+                            if (packages[i].length > 1) {
+                                totalWidth -= 
measureText(packages[i].substring(1, packages[i].length));
 
-            totalLength = measureText(shortPackage + className);
+                                packages[i] = packages[i][0];
+                            }
+                        }
 
-            // Compact class name if shorten package path is very long.
-            if (totalLength > maxWidth) {
-                var maxLen = classLen;
+                        var shortPackage = '';
 
-                var middleLen = (minLen + (maxLen - minLen) / 2 ) | 0;
+                        for (i = 0; i < packageCnt; i++)
+                            shortPackage += packages[i] + '.';
 
-                var minLenPx = measureText(shortPackage + className.substr(0, 
minLen) + '...');
-                var maxLenPx = totalLength;
+                        var className = packages[packageCnt];
 
-                while (middleLen != minLen && middleLen != maxLen) {
-                    var middleLenPx = measureText(shortPackage + 
className.substr(0, middleLen) + '...');
+                        var classLen = className.length;
 
-                    if (middleLenPx > maxWidth) {
-                        maxLen = middleLen;
-                        maxLenPx = middleLenPx;
-                    }
-                    else {
-                        minLen = middleLen;
-                        minLenPx = middleLenPx;
-                    }
+                        var minLen = Math.min(classLen, 3);
+
+                        totalWidth = measureText(shortPackage + className);
+
+                        // Compact class name if shorten package path is very 
long.
+                        if (totalWidth > widthByName[nameIx]) {
+                            var maxLen = classLen;
+
+                            var middleLen = (minLen + (maxLen - minLen) / 2 ) 
| 0;
+
+                            var minLenPx = measureText(shortPackage + 
className.substr(0, minLen) + '...');
+                            var maxLenPx = totalWidth;
+
+                            while (middleLen != minLen && middleLen != maxLen) 
{
+                                var middleLenPx = measureText(shortPackage + 
className.substr(0, middleLen) + '...');
+
+                                if (middleLenPx > widthByName[nameIx]) {
+                                    maxLen = middleLen;
+                                    maxLenPx = middleLenPx;
+                                }
+                                else {
+                                    minLen = middleLen;
+                                    minLenPx = middleLenPx;
+                                }
 
-                    middleLen = (minLen + (maxLen - minLen) / 2 ) | 0;
+                                middleLen = (minLen + (maxLen - minLen) / 2 ) 
| 0;
+                            }
+
+                            names[nameIx] = shortPackage + 
className.substring(0, middleLen) + '...';
+                        }
+                        else
+                            names[nameIx] = shortPackage + className;
+                    }
                 }
+            }
+
+            return names;
+        }
+
+        /**
+         * Calculate available width for text in link to edit element.
+         *
+         * @param index Showed index of element for calcuraion maximal width 
in pixel.
+         * @param id Id of contains link table.
+         * @returns {*[]} First element is length of class for single value, 
second element is length for pair vlaue.
+         */
+        function availableWidth(index, id) {
+            var divs = $($('#' + id).find('tr')[index - 1]).find('div');
+
+            var div = null;
+
+            var width = 0;
+
+            for (var divIx = 0; divIx < divs.length; divIx ++)
+                if (divs[divIx].className.length == 0 && (div == null ||  
divs[divIx].childNodes.length > div.childNodes.length))
+                    div = divs[divIx];
+
+            if (div != null) {
+                width = div.clientWidth;
+
+                if (width > 0) {
+                    var children = div.childNodes;
+
+                    for (var i = 1; i < children.length; i++) {
+                        var child = children[i];
 
-                return shortPackage + className.substring(0, middleLen) + 
'...';
+                        if ('offsetWidth' in child)
+                            width -= $(children[i]).outerWidth(true);
+                    }
+                }
             }
 
-            return shortPackage + className;
+            return width | 0;
         }
 
         return {
@@ -373,46 +470,38 @@ controlCenterModule.service('$common', [
                 return true;
             },
             /**
-             * Calculate available width for text in link to edit element.
+             * Cut class name by width in pixel or width in symbol count.
              *
              * @param id Id of contains link table.
-             * @returns {*[]} First element is length of class for single 
value, second element is length for pair vlaue.
+             * @param index Showed index of element.
+             * @param maxLength Maximum length in symbols for all names.
+             * @param names Array of class names to compact.
+             * @returns {*} Array of compacted class names.
              */
-            availableWidth: function (id) {
-                var div = $('#' + id).find('tr')[0];
-                var width = div.clientWidth;
+            compactJavaName: function (id, index, maxLength, names) {
+                var prefix = index + ') ';
 
-                if (width > 0) {
-                    var children = div.childNodes;
+                var nameCnt = names.length;
 
-                    for (var i = 1; i < children.length; i++) {
-                        var child = children[i];
+                var nameLength = ((maxLength - 3 * (nameCnt - 1)) / nameCnt) | 
0;
 
-                        if ('offsetWidth' in child)
-                            width -= children[i].offsetWidth;
-                    }
-
-                    width -= measureText('99) ');
-                }
-
-                return [width | 0, (width > 0 ? (width - measureText(' / ')) / 
2 | 0 : width) | 0];
-            },
-            /**
-             * Cut class name by width in pixel or width in symbol count.
-             *
-             * @param s Class name to cut.
-             * @param maxLength Maximum length in symbols.
-             * @param maxWidth Maximum length in pixels.
-             * @returns Cutted class name.
-             */
-            compactJavaName: function (s, maxLength, maxWidth) {
                 try {
+                    var nameWidth = (availableWidth(index, id) - 
measureText(prefix) - (nameCnt - 1) * measureText(' / ')) /
+                        nameCnt | 0;
+
                     // HTML5 calculation of showed message width.
-                    return compactByMaxPixels(s, maxWidth)
+                    names = compactByMaxPixels(names, nameLength, nameWidth);
                 }
                 catch (err) {
-                    return compactByMaxCharts(s, maxLength)
+                    names = compactByMaxCharts(names, nameLength);
                 }
+
+                var result = prefix + names[0];
+
+                for (var nameIx = 1; nameIx < names.length; nameIx ++)
+                    result += ' / ' + names[nameIx];
+
+                return result;
             },
             ensureActivePanel: function (panels, pnlIdx) {
                 if (panels) {
@@ -526,6 +615,14 @@ controlCenterModule.service('$table', [
             $focus((index < 0 ? 'new' : 'cur') + focusId);
         }
 
+        function _tableSimpleValue(filed, index) {
+            return index < 0 ? filed.newValue : filed.curValue;
+        }
+
+        function _tablePairValue(filed, index) {
+            return index < 0 ? {key: filed.newKey, value: filed.newValue} : 
{key: filed.curKey, value: filed.curValue};
+        }
+
         function _tableStartEdit(item, field, index) {
             _tableState(field.model, index);
 
@@ -596,7 +693,7 @@ controlCenterModule.service('$table', [
                 _model(item, field)[field.model].splice(index, 1);
             },
             tableSimpleSave: function (valueValid, item, field, index) {
-                var simpleValue = index < 0 ? field.newValue : field.curValue;
+                var simpleValue = _tableSimpleValue(field, index);
 
                 if (valueValid(item, field, simpleValue, index)) {
                     _tableReset();
@@ -621,8 +718,8 @@ controlCenterModule.service('$table', [
                     }
                 }
             },
-            tableSimpleSaveVisible: function (newValue) {
-                return !$common.isEmptyString(newValue);
+            tableSimpleSaveVisible: function (field, index) {
+                return !$common.isEmptyString(_tableSimpleValue(field, index));
             },
             tableSimpleUp: function (item, field, index) {
                 _tableReset();
@@ -637,26 +734,29 @@ controlCenterModule.service('$table', [
             tableSimpleDownVisible: function (item, field, index) {
                 return index < _model(item, field)[field.model].length - 1;
             },
-            tablePairSave: function (pairValid, item, field, newKey, newValue, 
index) {
-                if (pairValid(item, field, newKey, newValue, index)) {
-                    var pair = {};
+            tablePairValue: _tablePairValue,
+            tablePairSave: function (pairValid, item, field, index) {
+                if (pairValid(item, field, index)) {
+                    var pairValue = _tablePairValue(field, index);
+
+                    var pairModel = {};
 
                     if (index < 0) {
-                        pair[field.keyName] = newKey;
-                        pair[field.valueName] = newValue;
+                        pairModel[field.keyName] = pairValue.key;
+                        pairModel[field.valueName] = pairValue.value;
 
                         if (item[field.model])
-                            item[field.model].push(pair);
+                            item[field.model].push(pairModel);
                         else
-                            item[field.model] = [pair];
+                            item[field.model] = [pairModel];
 
                         _tableNewItem(field);
                     }
                     else {
-                        pair = item[field.model][index];
+                        pairModel = item[field.model][index];
 
-                        pair[field.keyName] = newKey;
-                        pair[field.valueName] = newValue;
+                        pairModel[field.keyName] = pairValue.key;
+                        pairModel[field.valueName] = pairValue.value;
 
                         if (index < item[field.model].length - 1)
                             _tableStartEdit(item, field, index + 1);
@@ -665,8 +765,10 @@ controlCenterModule.service('$table', [
                     }
                 }
             },
-            tablePairSaveVisible: function (newKey, newValue) {
-                return !$common.isEmptyString(newKey) && 
!$common.isEmptyString(newValue);
+            tablePairSaveVisible: function (field, index) {
+                var pairValue = _tablePairValue(field, index);
+
+                return !$common.isEmptyString(pairValue.key) && 
!$common.isEmptyString(pairValue.value);
             }
         }
     }]);

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d81ab79a/modules/control-center-web/src/main/js/controllers/metadata-controller.js
----------------------------------------------------------------------
diff --git 
a/modules/control-center-web/src/main/js/controllers/metadata-controller.js 
b/modules/control-center-web/src/main/js/controllers/metadata-controller.js
index dcfd5e4..c5a3019 100644
--- a/modules/control-center-web/src/main/js/controllers/metadata-controller.js
+++ b/modules/control-center-web/src/main/js/controllers/metadata-controller.js
@@ -39,7 +39,6 @@ controlCenterModule.controller('metadataController', [
             $scope.tablePairSave = $table.tablePairSave;
             $scope.tablePairSaveVisible = $table.tablePairSaveVisible;
 
-            $scope.availableWidth = $common.availableWidth;
             $scope.compactJavaName = $common.compactJavaName;
 
             $scope.databases = [
@@ -455,18 +454,20 @@ controlCenterModule.controller('metadataController', [
                 descendingFields: {msg: 'Descending field class', id: 
'DescField'}
             };
 
-            $scope.tablePairValid = function (item, field, name, clsName, 
index) {
+            $scope.tablePairValid = function (item, field, index) {
                 var pairField = pairFields[field.model];
 
+                var pairValue = $table.tablePairValue(field, index);
+
                 if (pairField) {
-                    if (!$common.isValidJavaClass(pairField.msg, clsName, 
true))
+                    if (!$common.isValidJavaClass(pairField.msg, 
pairValue.value, true))
                         return focusInvalidField(index, 'Value' + 
pairField.id);
 
                     var model = item[field.model];
 
                     if ($common.isDefined(model)) {
                         var idx = _.findIndex(model, function (pair) {
-                            return pair.name == name
+                            return pair.name == pairValue.name
                         });
 
                         // Found duplicate.

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d81ab79a/modules/control-center-web/src/main/js/db.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/db.js 
b/modules/control-center-web/src/main/js/db.js
index 9aa61ac..0d53028 100644
--- a/modules/control-center-web/src/main/js/db.js
+++ b/modules/control-center-web/src/main/js/db.js
@@ -23,7 +23,7 @@ var mongoose = require('mongoose'),
     ObjectId = mongoose.Schema.Types.ObjectId,
     passportLocalMongoose = require('passport-local-mongoose');
 
-var deepPopulate = require('mongoose-deep-populate');
+var deepPopulate = require('mongoose-deep-populate')( mongoose);
 
 // Connect to mongoDB database.
 mongoose.connect(config.get('mongoDB:url'), {server: {poolSize: 4}});

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d81ab79a/modules/control-center-web/src/main/js/package.json
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/package.json 
b/modules/control-center-web/src/main/js/package.json
index ce74ac9..b230a36 100644
--- a/modules/control-center-web/src/main/js/package.json
+++ b/modules/control-center-web/src/main/js/package.json
@@ -32,7 +32,7 @@
     "jade": "~1.11.0",
     "lodash": "3.10.1",
     "mongoose": "^4.1.2",
-    "mongoose-deep-populate": "1.1.0",
+    "mongoose-deep-populate": "2.0.0",
     "nconf": "^0.7.2",
     "node-sass-middleware": "^0.9.0",
     "passport": "^0.2.1",

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d81ab79a/modules/control-center-web/src/main/js/views/includes/controls.jade
----------------------------------------------------------------------
diff --git 
a/modules/control-center-web/src/main/js/views/includes/controls.jade 
b/modules/control-center-web/src/main/js/views/includes/controls.jade
index 5c97418..72167ba 100644
--- a/modules/control-center-web/src/main/js/views/includes/controls.jade
+++ b/modules/control-center-web/src/main/js/views/includes/controls.jade
@@ -53,10 +53,10 @@ mixin btn-remove(click, tip)
     i.tipField.fa.fa-remove(ng-click=click bs-tooltip=tip data-trigger='hover')
 
 mixin btn-up(show, click)
-    i.tipField.fa.fa-arrow-up(ng-show=show ng-click=click bs-tooltip 
data-title='Move item up')
+    i.tipField.fa.fa-arrow-up(ng-if=show ng-click=click bs-tooltip 
data-title='Move item up')
 
 mixin btn-down(show, click)
-    i.tipField.fa.fa-arrow-down(ng-show=show ng-click=click bs-tooltip 
data-title='Move item down')
+    i.tipField.fa.fa-arrow-down(ng-if=show ng-click=click bs-tooltip 
data-title='Move item down')
 
 mixin table-pair-edit(prefix, keyPlaceholder, valPlaceholder, 
keyJavaBuildInTypes, valueJavaBuildInTypes, focusId, index)
     -var keyModel = 'field.' + prefix + 'Key'
@@ -74,7 +74,7 @@ mixin table-pair-edit(prefix, keyPlaceholder, valPlaceholder, 
keyJavaBuildInType
                 input.form-control(id=keyFocusId enter-focus-next=valFocusId 
type='text' ng-model=keyModel placeholder=keyPlaceholder 
on-escape='tableReset()')
     .col-xs-6.col-sm-6.col-md-6
         -var arg = keyModel + ', ' + valModel
-        -var btnVisible = 'tablePairSaveVisible(field)'
+        -var btnVisible = 'tablePairSaveVisible(field, ' + index + ')'
         -var btnSave = 'tablePairSave(tablePairValid, backupItem, field, ' + 
index + ')'
         -var btnVisibleAndSave = btnVisible + ' && ' + btnSave
 
@@ -98,7 +98,7 @@ mixin table-pair(header, tblMdl, keyFld, valFld, 
keyPlaceholder, valPlaceholder,
                     tr(ng-repeat='item in #{tblMdl}')
                         td.col-sm-12
                             div(ng-show='!tableEditing(field, $index)')
-                                
a.labelFormField(ng-click='tableStartEdit(backupItem, field, $index)') {{$index 
+ 1}}) {{compactJavaName(item.#{keyFld}, 25, availableWidth(field.model)[1])}} 
/ {{compactJavaName(item.#{valFld}, 25, availableWidth(field.model)[1])}}
+                                
a.labelFormField(ng-click='tableStartEdit(backupItem, field, $index)') 
{{compactJavaName(field.model, $index + 1, 55, [item.#{keyFld}, 
item.#{valFld}])}}
                                 +btn-remove('tableRemove(backupItem, field, 
$index)', 'field.removeTip')
                             div(ng-if='tableEditing(field, $index)')
                                 +table-pair-edit('cur', keyPlaceholder, 
valPlaceholder, keyJavaBuildInTypes, valueJavaBuildInTypes, 
'{{::field.focusId}}', '$index')
@@ -165,14 +165,14 @@ mixin details-row
                                 +btn-up('detail.reordering && $index > 0', 
'tableSimpleUp(backupItem, detail, $index)')
                             div(ng-if='tableEditing(detail, $index)')
                                 label.labelField {{$index + 1}})
-                                +btn-save('tableSimpleSaveVisible(curValue)', 
'tableSimpleSave(tableSimpleValid, backupItem, detail, $index)')
+                                +btn-save('tableSimpleSaveVisible(detail, 
index)', 'tableSimpleSave(tableSimpleValid, backupItem, detail, $index)')
                                 .input-tip.form-group.has-feedback
                                     
input.form-control(id='cur{{::detail.focusId}}' type='text' 
ng-model='detail.curValue' placeholder='{{::detail.placeholder}}' 
on-enter='tableSimpleSave(tableSimpleValid, backupItem, detail, $index)' 
on-escape='tableReset()')&attributes(customValidators)
                                     +ico-exclamation('{{detail.model}}.edit', 
'ipaddress', 'Invalid address, see help for format description.')
             button.btn.btn-primary.fieldButton(ng-disabled='!newValue' 
ng-click='tableSimpleSave(tableSimpleValid, backupItem, detail, -1)') Add
             +tipField('detail.tip')
             .input-tip.form-group.has-feedback
-                input.form-control(id='new{{::detail.focusId}}' type='text' 
ng-model='detail.newValue' ng-focus='tableNewItem(detail)' 
placeholder='{{::detail.placeholder}}' 
on-enter='tableSimpleSave(tableSimpleValid, backupItem, newValue, -1)' 
on-escape='tableReset()')&attributes(customValidators)
+                input.form-control(id='new{{::detail.focusId}}' type='text' 
ng-model='detail.newValue' ng-focus='tableNewItem(detail)' 
placeholder='{{::detail.placeholder}}' 
on-enter='tableSimpleSave(tableSimpleValid, backupItem, field, -1)' 
on-escape='tableReset()')&attributes(customValidators)
                 +ico-exclamation('{{detail.model}}', 'ipaddress', 'Invalid 
address, see help for format description.')
         div(ng-switch-when='table-simple-with-border')&attributes(detailCommon)
             .group
@@ -343,23 +343,23 @@ mixin form-row-custom(lblClasses, fieldClasses, 
dataSource)
                     table.col-sm-12.links-edit(id='{{::field.model}}' 
st-table='#{fieldMdl}')
                         tbody
                             tr(ng-repeat='item in #{fieldMdl} track by $index')
-                                td
+                                td.col-sm-12
                                     div(ng-show='!tableEditing(field, $index)')
-                                        
a.labelFormField(ng-click='tableStartEdit(backupItem, field, $index)') {{$index 
+ 1}}) {{compactJavaName(item, 55, availableWidth(field.model)[0])}}
+                                        
a.labelFormField(ng-click='tableStartEdit(backupItem, field, $index)') 
{{compactJavaName(field.model, $index + 1, 55, [item])}}
                                         +btn-remove('tableRemove(backupItem, 
field, $index)', 'field.removeTip')
                                         +btn-down('field.reordering && 
tableSimpleDownVisible(backupItem, field, $index)', 
'tableSimpleDown(backupItem, field, $index)')
                                         +btn-up('field.reordering && $index > 
0', 'tableSimpleUp(backupItem, field, $index)')
                                     div(ng-if='tableEditing(field, $index)')
                                         label.labelField {{$index + 1}})
-                                        
+btn-save('tableSimpleSaveVisible(field.curValue)', 
'tableSimpleSave(tableSimpleValid, backupItem, field, $index)')
+                                        
+btn-save('tableSimpleSaveVisible(field)', 'tableSimpleSave(tableSimpleValid, 
backupItem, field, $index)')
                                         .input-tip
-                                            
input.form-control(id='cur{{::field.focusId}}' type='text' 
ng-model='field.curValue' placeholder='{{::field.placeholder}}' 
on-enter='tableSimpleSaveVisible(field.curValue) && 
tableSimpleSave(tableSimpleValid, backupItem, field, $index)' 
on-escape='tableReset()')
+                                            
input.form-control(id='cur{{::field.focusId}}' type='text' 
ng-model='field.curValue' placeholder='{{::field.placeholder}}' 
on-enter='tableSimpleSaveVisible(field) && tableSimpleSave(tableSimpleValid, 
backupItem, field, $index)' on-escape='tableReset()')
                         tfoot(ng-show='tableNewItemActive(field)')
                             tr
-                                td
-                                    
+btn-save('tableSimpleSaveVisible(field.newValue)', 
'tableSimpleSave(tableSimpleValid, backupItem, field, -1)')
+                                td.col-sm-12
+                                    +btn-save('tableSimpleSaveVisible(field)', 
'tableSimpleSave(tableSimpleValid, backupItem, field, -1)')
                                     .input-tip
-                                        
input.form-control(id='new{{::field.focusId}}' type='text' 
ng-model='field.newValue' placeholder='{{::field.placeholder}}' 
on-enter='tableSimpleSaveVisible(field.newValue) && 
tableSimpleSave(tableSimpleValid, backupItem, field, -1)' 
on-escape='tableReset()')
+                                        
input.form-control(id='new{{::field.focusId}}' type='text' 
ng-model='field.newValue' placeholder='{{::field.placeholder}}' 
on-enter='tableSimpleSaveVisible(field) && tableSimpleSave(tableSimpleValid, 
backupItem, field, -1)' on-escape='tableReset()')
         .section(ng-switch-when='indexedTypes')
             +table-pair('Index key-value type pairs', fieldMdl, 'keyClass', 
'valueClass', 'Key class full name', 'Value class full name', true, true)
         div(ng-switch-when='queryFieldsFirst' ng-hide=fieldHide)

Reply via email to