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)