/** * Create edit table from javascript array. * * This function creates a html edit table. * *
*
*
*
*
*
*
* Context
* Context
* Room
* Room
* Enabled
*
*
*
*
*
*
*
*
* @param {string} divId name of the html element (or empty).
* @param {string} values data array
* @param {object} options settings
*
* {
* onChange: this function will be called if something changed. function (attr, index) {}
* onReady: called, when the table is ready (may be to modify some elements of it),
* maxRaw: maximal number of rows
* }
*
* @return {object} array with values
*/
function values2table(divId, values, options) {
if (typeof divId === 'object') {
options = values;
values = divId;
divId = '';
}
var maxRaw = (options && options.maxRaw) || null;
var onChange = (options && options.onChange) || null;
var onReady = (options && options.onReady) || null;
values = values || [];
var names = [];
var $div;
if (!divId) {
$div = $('body');
} else {
$div = $('#' + divId);
}
var $add = $div.find('.table-button-add');
$add.data('raw', values.length);
if (maxRaw) {
$add.data('maxRaw', maxRaw);
}
if (!$add.data('inited')) {
$add.data('inited', true);
// var addText = $add.text();
$add.on('click', function () {
if (!$add.data('maxRaw') || ($add.data('raw') < $add.data('maxRaw'))) {
var $table = $div.find('.table-values');
var values = $table.data('values');
var names = $table.data('names');
var maxRaw = $table.data('maxRaw');
var obj = {};
for (var i = 0; i < names.length; i++) {
if (!names[i]) continue;
obj[names[i].name] = names[i].def;
}
values.push(obj);
onChange && onChange();
setTimeout(function () {
values2table(divId, values, onChange, onReady, maxRaw);
}, 100);
$add.data('raw', $add.data('raw') + 1);
} else {
confirmMessage(_('maxTableRaw') + ': ' + $add.data('maxRaw'), _('maxTableRawInfo'), 'alert', ['Ok']);
}
});
}
if (values) {
var buttons = [];
var $table = $div.find('.table-values');
$table.data('values', values);
// load rooms
if (!$table.data('rooms') && $table.find('th[data-name="room"]').length) {
getEnums('rooms', function (err, list) {
var result = {};
var trRooms = _('nonerooms');
if (trRooms !== 'nonerooms') {
result[_('none')] = trRooms;
} else {
result[_('none')] = '';
}
var nnames = [];
for (var n in list) {
if (list.hasOwnProperty(n)) {
nnames.push(n);
}
}
nnames.sort(function (a, b) {
a = a.toLowerCase();
b = b.toLowerCase();
if (a > b) return 1;
if (a < b) return -1;
return 0;
});
for (var l = 0; l < nnames.length; l++) {
result[nnames[l]] = list[nnames[l]].common.name || l;
}
$table.data('rooms', result);
values2table(divId, values, onChange, onReady, maxRaw);
});
return;
}
// load functions
if (!$table.data('functions') && $table.find('th[data-name="func"]').length) {
getEnums('functions', function (err, list) {
var result = {};
var trFuncs = _('nonefunctions');
if (trFuncs !== 'nonefunctions') {
result[_('none')] = trFuncs;
} else {
result[_('none')] = '';
}
var nnames = [];
for (var n in list) {
if (list.hasOwnProperty(n)) {
nnames.push(n);
}
}
nnames.sort(function (a, b) {
a = a.toLowerCase();
b = b.toLowerCase();
if (a > b) return 1;
if (a < b) return -1;
return 0;
});
for (var l = 0; l < nnames.length; l++) {
result[nnames[l]] = list[nnames[l]].common.name || l;
}
$table.data('functions', result);
values2table(divId, values, onChange, onReady, maxRaw);
});
return;
}
$table.find('th').each(function () {
var name = $(this).data('name');
if (name) {
var obj = {
name: name,
type: $(this).data('type') || 'text',
def: $(this).data('default'),
'class': ($(this).attr('class') || '').replace('translate', ''),
style: $(this).data('style'),
readOnly: $(this).data('readOnly'),
tdstyle: $(this).data('tdstyle')
};
if (obj.type === 'checkbox') {
if (obj.def === 'false') obj.def = false;
if (obj.def === 'true') obj.def = true;
obj.def = !!obj.def;
} else if (obj.type === 'select' || obj.type === 'select multiple') {
var vals = ($(this).data('options') || '').split(';');
obj.options = {};
for (var v = 0; v < vals.length; v++) {
var parts = vals[v].split('/');
obj.options[parts[0]] = _(parts[1] || parts[0]);
if (v === 0) obj.def = (obj.def === undefined) ? parts[0] : obj.def;
}
} else {
obj.def = obj.def || '';
}
names.push(obj);
} else {
names.push(null);
}
name = $(this).data('buttons');
if (name) {
buttons.push({
btn: name.split(' '),
'class': ($(this).attr('class') || '').replace('translate', ''),
style: $(this).data('style'),
tdstyle: $(this).data('tdstyle')
});
} else {
buttons.push(null);
}
});
$table.data('names', names);
var text = '';
for (var v = 0; v < values.length; v++) {
var idName = values[v] && values[v].id;
if (!idName && values[v]) {
if (names[0] === '_index') {
idName = values[v][names[1]];
} else {
idName = values[v][names[0]];
}
}
text += '