532 lines
16 KiB
JavaScript
532 lines
16 KiB
JavaScript
var modal;
|
|
|
|
/**
|
|
* Query sql.
|
|
*
|
|
* @param function callback
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
function query(callback) {
|
|
DataStorage.isInsert = false;
|
|
var pivot = DataStorage.pivot;
|
|
var filters = '';
|
|
if(pivot)
|
|
{
|
|
if(!setVarFrom()) return false;
|
|
|
|
filters = DataStorage.pivot.filters;
|
|
|
|
filters.forEach(function(filter, index)
|
|
{
|
|
if(filter.from == 'query')
|
|
{
|
|
var find = $('#queryFilters').find('.filter-item-' + index + ' .form-' + filter.type);
|
|
if(find.length != 0) filter.default = find.val();
|
|
}
|
|
});
|
|
}
|
|
|
|
DataStorage.fields = {};
|
|
DataStorage.columns = {};
|
|
DataStorage.rows = [];
|
|
|
|
$('.query').addClass('disabled');
|
|
$('#querying').removeClass('hidden');
|
|
var sql = $('#sql').val();
|
|
sql = latin1ToBase64(sql);
|
|
$.post(createLink('dataview', 'ajaxQuery'), {sql: sql, driver: DataStorage.driver, filters: filters, recPerPage: DataStorage.recPerPage, pageID: DataStorage.pageID}, function(resp)
|
|
{
|
|
resp = JSON.parse(resp);
|
|
$('.query').removeClass('disabled');
|
|
$('#querying').addClass('hidden');
|
|
if(resp.result !== 'success')
|
|
{
|
|
$('#exportDataview').addClass('hidden');
|
|
var message = resp.message;
|
|
$('.error').removeClass('hidden');
|
|
$('.error td').html(message);
|
|
drawTable([], []);
|
|
}
|
|
else
|
|
{
|
|
$('#exportDataview').removeClass('hidden');
|
|
DataStorage.fields = resp.fields;
|
|
DataStorage.columns = resp.columns;
|
|
DataStorage.rows = resp.rows;
|
|
vars = resp.vars;
|
|
DataStorage.relatedObject = resp.relatedObject;
|
|
|
|
if(resp.filters.length)
|
|
{
|
|
pivot.filters = resp.filters;
|
|
DataStorage.pivot = pivot;
|
|
|
|
resp.filters.forEach(function(filter, index)
|
|
{
|
|
if(filter.from != 'query') return;
|
|
if(filter.type != 'date' && filter.type != 'datetime') return;
|
|
|
|
var find = $('#queryFilters').find('.filter-item-' + index + ' .form-' + filter.type);
|
|
find.val(filter.default);
|
|
});
|
|
}
|
|
|
|
drawTable(resp.fields, resp.rows);
|
|
getFieldSettings();
|
|
addResult(resp);
|
|
initPager(resp);
|
|
if(typeof callback == 'function') callback();
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Add query result.
|
|
*
|
|
* @access public
|
|
*/
|
|
function addResult(resp)
|
|
{
|
|
$('#queryResult').remove();
|
|
|
|
var lineCount = resp.lineCount;
|
|
var columnCount = resp.columnCount;
|
|
var queryMsg = queryResult;
|
|
|
|
queryMsg = queryMsg.replace('%s', lineCount);
|
|
queryMsg = queryMsg.replace('%s', columnCount);
|
|
|
|
$('#queryTable .table-footer').append("<span style='float:left;line-height:28px' id='queryResult'>" + queryMsg + "</span>");
|
|
}
|
|
|
|
function initPager(resp)
|
|
{
|
|
var pageID = parseInt(resp.pageID);
|
|
var recPerPage = parseInt(resp.recPerPage);
|
|
var recTotal = parseInt(resp.lineCount);
|
|
var pageTotal = parseInt(Math.ceil(recTotal / recPerPage));
|
|
|
|
$('.recTotal').html(recTotalTip.replace('%s', recTotal));
|
|
$('.recPerPage').html(recPerPageTip.replace('%s', recPerPage));
|
|
|
|
$('.dropup li').removeClass('active');
|
|
$('.dropup li a').each(function()
|
|
{
|
|
if($(this).data('size') == resp.recPerPage)
|
|
{
|
|
$(this).parent().addClass('active');
|
|
return;
|
|
}
|
|
});
|
|
|
|
$('.page-number').html('<strong>' + pageID + '</strong>/<strong>' + pageTotal + '</strong>');
|
|
|
|
$('.left-page').data('page', pageID - 1);
|
|
$('.right-page').data('page', pageID + 1);
|
|
$('.last-page').data('page', pageTotal);
|
|
|
|
$('.first-page,.left-page,.last-page,.right-page').removeClass('disabled');
|
|
if(pageID == 1) $('.first-page,.left-page').addClass('disabled');
|
|
if(pageID == pageTotal) $('.last-page,.right-page').addClass('disabled');
|
|
$('.table-footer').toggle(!!recTotal);
|
|
}
|
|
|
|
/**
|
|
* Save field settings.
|
|
*
|
|
* @access public
|
|
* @return bool
|
|
*/
|
|
function saveSettings()
|
|
{
|
|
var fieldSettings = DataStorage.clone('fieldSettings');
|
|
var relatedObject = DataStorage.relatedObject;
|
|
var objectFields = DataStorage.objectFields;
|
|
for(let index in DataStorage.fields)
|
|
{
|
|
var relatedTable = $('#relatedTable' + index).val();
|
|
var relatedField = $('#relatedField' + index).val();
|
|
fieldSettings[index].object = relatedTable;
|
|
fieldSettings[index].field = relatedField;
|
|
|
|
if(relatedTable != relatedObject[index])
|
|
{
|
|
fieldSettings[index].type = 'object';
|
|
if(typeof(objectFields) != 'undefined' && typeof(objectFields[relatedTable]) != 'undefined' && typeof(objectFields[relatedTable][index]) != 'undefined') fieldSettings[index].type = objectFields[relatedTable][index].type == 'object' ? 'string' : objectFields[relatedTable][index].type;
|
|
}
|
|
if(relatedTable == relatedObject[index] && fieldSettings[index].type == 'object') fieldSettings[index].type = 'string';
|
|
}
|
|
|
|
DataStorage.fieldSettings = fieldSettings;
|
|
|
|
var langs = DataStorage.clone('langs');
|
|
$("input[name^='langs']").each(function()
|
|
{
|
|
var field = $(this).data('field');
|
|
var lang = $(this).data('lang');
|
|
var value = $(this).val();
|
|
|
|
if(typeof(langs[field]) == 'undefined') langs[field] = {};
|
|
langs[field][lang] = value;
|
|
})
|
|
DataStorage.langs = langs;
|
|
|
|
$('#addModal').modal('hide');
|
|
this.drawTable(DataStorage.fields, DataStorage.rows);
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Draw table content for sql result.
|
|
*
|
|
* @param object fields
|
|
* @param array rows
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
function drawTable(fields, rows)
|
|
{
|
|
$.post(createLink('dataview', 'ajaxGetFieldName'), {fields: fields, fieldSettings: DataStorage.fieldSettings}, function(resp)
|
|
{
|
|
resp = JSON.parse(resp);
|
|
if(resp.result == 'success') fields = resp.fields ? resp.fields : fields;
|
|
|
|
$('.table-empty-tip').addClass('hidden');
|
|
if(rows.length == 0)
|
|
{
|
|
$('.table-empty-tip').removeClass('hidden');
|
|
$('table.result').empty();
|
|
return;
|
|
}
|
|
var head = '<tr>';
|
|
var langs = DataStorage.langs;
|
|
for(let field in fields)
|
|
{
|
|
var fieldName = fields[field];
|
|
if(!$.isEmptyObject(langs) && typeof(langs[field]) !== 'undefined') fieldName = langs[field][clientLang] ? langs[field][clientLang] : fieldName;
|
|
head += '<th>' + fieldName + '</th>';
|
|
}
|
|
head += '</tr>';
|
|
|
|
var html = '<thead>' + head + '</thead>';
|
|
|
|
var body = '';
|
|
for(let row of rows)
|
|
{
|
|
body += '<tr>';
|
|
for(let index in row) body += '<td><div class="ellipsis-multi" title="' + row[index] + '">' + row[index] + '</div></td>';
|
|
body += '</tr>';
|
|
}
|
|
|
|
html += '<tbody>' + body + '</tbody>';
|
|
|
|
$('table.result').html(html);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Get text width.
|
|
*
|
|
* @param string text
|
|
* @access public
|
|
* @return float
|
|
*/
|
|
function getTextWidth(text)
|
|
{
|
|
var font = "bold 12pt arial"
|
|
var canvas = document.createElement("canvas");
|
|
var context = canvas.getContext("2d");
|
|
context.font = font;
|
|
var measure = context.measureText(text);
|
|
|
|
return measure.width;
|
|
}
|
|
|
|
/**
|
|
* Get field settings.
|
|
*
|
|
* @access public
|
|
* @return float
|
|
*/
|
|
function getFieldSettings()
|
|
{
|
|
var fieldSettings = DataStorage.clone('fieldSettings');
|
|
var fields = DataStorage.fields;
|
|
var columns = DataStorage.columns;
|
|
var relatedObject = DataStorage.relatedObject;
|
|
var objectFields = DataStorage.objectFields;
|
|
|
|
var fieldSettingsNew = {};
|
|
|
|
for(let index in fields)
|
|
{
|
|
var field = fields[index];
|
|
var defaultType = columns[index];
|
|
var defaultObject = relatedObject[index];
|
|
|
|
if(typeof(objectFields) != 'undefined' && typeof(objectFields[defaultObject]) != 'undefined' && typeof(objectFields[defaultObject][index]) != 'undefined') defaultType = objectFields[defaultObject][index].type == 'object' ? 'string' : objectFields[defaultObject][index].type;
|
|
|
|
if(!fieldSettings[index])
|
|
{
|
|
fieldSettingsNew[index] = {
|
|
name: field,
|
|
object: defaultObject,
|
|
field: index,
|
|
type: defaultType
|
|
};
|
|
}
|
|
else
|
|
{
|
|
var object = fieldSettings[index].object;
|
|
if(!object || object.length == 0) object = defaultObject;
|
|
fieldSettings[index].object = object;
|
|
|
|
var field = fieldSettings[index].field;
|
|
if(!field || field.length == 0)
|
|
{
|
|
fieldSettings[index].field = index;
|
|
fieldSettings[index].object = defaultObject;
|
|
fieldSettings[index].type = 'string';
|
|
}
|
|
|
|
if(!fieldSettings[index].name) fieldSettings[index].name = fields[index];
|
|
|
|
var type = fieldSettings[index].type;
|
|
if(object == defaultObject && type != defaultType) fieldSettings[index].type = defaultType;
|
|
|
|
fieldSettingsNew[index] = fieldSettings[index];
|
|
}
|
|
}
|
|
|
|
DataStorage.fieldSettings = fieldSettingsNew;
|
|
}
|
|
|
|
function submitForm()
|
|
{
|
|
if($('#fields').length == 0) $('#dataform table').before($('<input>').attr({name: 'fields', id: 'fields'}).addClass('hidden'));
|
|
if($('#langs').length == 0) $('#dataform table').before($('<input>').attr({name: 'langs', id: 'langs'}).addClass('hidden'));
|
|
|
|
getFieldSettings();
|
|
|
|
/* Fix bug #26716. */
|
|
var fieldSettings = DataStorage.clone('fieldSettings');
|
|
var fields = DataStorage.fields;
|
|
for(let index in fieldSettings)
|
|
{
|
|
if(!Object.keys(fields).includes(index)) delete fieldSettings[index];
|
|
}
|
|
DataStorage.fieldSettings = fieldSettings;
|
|
|
|
$('#fields').val(JSON.stringify(DataStorage.fieldSettings));
|
|
$('#langs').val(JSON.stringify(DataStorage.langs));
|
|
$('#dataform').submit();
|
|
}
|
|
|
|
/**
|
|
* Set related field.
|
|
*
|
|
* @param obj $obj
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
function setRelatedField(obj)
|
|
{
|
|
var selectedTable = $(obj).val();
|
|
var relatedFields = [];
|
|
var objectFields = DataStorage.objectFields;
|
|
for(let index in objectFields[selectedTable]) relatedFields[index] = objectFields[selectedTable][index].name;
|
|
var relatedFieldOptions = Object.keys(relatedFields).map(function(key)
|
|
{
|
|
return {text: relatedFields[key], value: key};
|
|
});
|
|
|
|
var $relatedField = $(obj).closest('tr').find("select[name^='relatedField']");
|
|
var picker = $relatedField.data('zui.picker');
|
|
|
|
if(picker) picker.destroy();
|
|
$relatedField.picker({list: relatedFieldOptions, autoselectfirst: true});
|
|
}
|
|
|
|
/**
|
|
* handle click table item in data dictionary
|
|
*
|
|
* @param obj $event
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
function handleClickDictTable(event)
|
|
{
|
|
if(!$(event.target).hasClass('list-toggle') && !$(event.target).closest('li').hasClass('field-item'))
|
|
{
|
|
const table = $(event.target).closest('li').data('dict');
|
|
appendTextToSqlForm(table);
|
|
event.stopPropagation();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* handle click field item in data dictionary
|
|
*
|
|
* @param obj $event
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
function handleClickDictField(event)
|
|
{
|
|
const field = $(event.target).closest('li').data('dict');
|
|
appendTextToSqlForm(field);
|
|
}
|
|
|
|
/**
|
|
* append text to sql form.
|
|
*
|
|
* @param string $text
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
function appendTextToSqlForm(text)
|
|
{
|
|
const sqlForm = $('textarea[name="sql"]');
|
|
sqlForm.val(sqlForm.val() + text);
|
|
}
|
|
|
|
/**
|
|
* Active field.
|
|
*
|
|
* @param obj $obj
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
function activeField(obj)
|
|
{
|
|
if(currentTheme == 'default')
|
|
{
|
|
$(obj).closest('tr').find('#' + $(obj).data('field')).css('color', '#2e7fff');
|
|
}
|
|
else
|
|
{
|
|
$(obj).closest('tr').find('#' + $(obj).data('field')).addClass('text-primary');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Remove field active.
|
|
*
|
|
* @param obj $obj
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
function removeActive(obj)
|
|
{
|
|
if(currentTheme == 'default')
|
|
{
|
|
$(obj).closest('tr').find('#' + $(obj).data('field')).css('color', '#0b0f18');
|
|
}
|
|
else
|
|
{
|
|
$(obj).closest('tr').find('#' + $(obj).data('field')).removeClass('text-primary');
|
|
}
|
|
}
|
|
|
|
$(document).ready(function()
|
|
{
|
|
$('#sql').on('input', function()
|
|
{
|
|
$('.error').addClass('hidden');
|
|
// fieldSettings = {};
|
|
})
|
|
|
|
$('#sql').on('change', function()
|
|
{
|
|
DataStorage.fieldSettings = {};
|
|
DataStorage.langs = {};
|
|
})
|
|
|
|
if($('#sql').val()) setTimeout(query, 500);
|
|
$('.query').click(function()
|
|
{
|
|
DataStorage.pageID = 1;
|
|
query();
|
|
});
|
|
|
|
$('.fieldSettings').click(function() {
|
|
query(function() {
|
|
|
|
var formTpl = $('#fieldSettingTpl').html();
|
|
var formHtml = $(formTpl);
|
|
|
|
var tbodyTpl = $('#tbodyTpl').html();
|
|
|
|
var fieldTypeOptions = Object.keys(lang.objects).map(function(key)
|
|
{
|
|
return {text: lang.objects[key], value: key};
|
|
});
|
|
|
|
var fieldSettings = DataStorage.fieldSettings;
|
|
var objectFields = DataStorage.objectFields;
|
|
var langs = DataStorage.langs;
|
|
var tbodyHtmls = Object.keys(fieldSettings).map(function(field)
|
|
{
|
|
var relatedFields = [];
|
|
var relatedObjectFields = objectFields[fieldSettings[field].object];
|
|
for(let index in relatedObjectFields) relatedFields[index] = relatedObjectFields[index].name;
|
|
var relatedFieldOptions = Object.keys(relatedFields).map(function(key)
|
|
{
|
|
return {text: relatedFields[key], value: key};
|
|
});
|
|
|
|
var html = $($.zui.formatString(tbodyTpl, {field: field, name: fieldSettings[field].name}));
|
|
html.find('select#relatedTable' + field).picker({list: fieldTypeOptions, defaultValue: fieldSettings[field].object});
|
|
html.find('select#relatedField' + field).picker({list: relatedFieldOptions, defaultValue: fieldSettings[field].field});
|
|
html.find("input[name^='langs']").each(function()
|
|
{
|
|
var field = $(this).data('field');
|
|
var lang = $(this).data('lang');
|
|
|
|
var fieldName = '';
|
|
if(lang == clientLang)
|
|
{
|
|
var relatedFieldName = $(this).closest('tr').find('select#relatedField' + field + '~ div.picker').find('span.picker-selection-text').text();
|
|
fieldName = relatedFieldName ? relatedFieldName : DataStorage.fields[field];
|
|
}
|
|
fieldName = !$.isEmptyObject(langs) && typeof(langs[field]) != 'undefined' && typeof(langs[field][lang]) != 'undefined' && langs[field][lang] ? langs[field][lang] : fieldName;
|
|
$(this).val(fieldName);
|
|
});
|
|
return html;
|
|
});
|
|
|
|
formHtml.find('tbody').append(tbodyHtmls);
|
|
|
|
var modal = $('#addModal');
|
|
modal.find('.modal-body').html(formHtml);
|
|
modal.modal({width: 500});
|
|
})
|
|
});
|
|
|
|
$('#save').click(function()
|
|
{
|
|
if(typeof dataview !== 'undefined' && dataview.used)
|
|
{
|
|
bootbox.confirm(warningDesign, function(res) { if(res) query(submitForm); });
|
|
}
|
|
else
|
|
{
|
|
query(submitForm);
|
|
}
|
|
});
|
|
|
|
$('.first-page,.left-page,.last-page,.right-page').click(function()
|
|
{
|
|
DataStorage.pageID = $(this).data('page');
|
|
query();
|
|
});
|
|
|
|
$('.dropup li a').click(function()
|
|
{
|
|
DataStorage.pageID = 1;
|
|
DataStorage.recPerPage = $(this).data('size');
|
|
query();
|
|
})
|
|
});
|