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("" + queryMsg + ""); } 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('' + pageID + '/' + pageTotal + ''); $('.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 = ''; 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 += '' + fieldName + ''; } head += ''; var html = '' + head + ''; var body = ''; for(let row of rows) { body += ''; for(let index in row) body += '
' + row[index] + '
'; body += ''; } html += '' + body + ''; $('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($('').attr({name: 'fields', id: 'fields'}).addClass('hidden')); if($('#langs').length == 0) $('#dataform table').before($('').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(); }) });