From 1ece1244bc373a4e80245a31151fea6992a02765 Mon Sep 17 00:00:00 2001 From: tanghucheng Date: Tue, 6 Jun 2023 08:24:41 +0000 Subject: [PATCH] * Remove dataview to open. --- module/dataview/css/browse.css | 29 ++ module/dataview/css/browse.zh-cn.css | 2 + module/dataview/css/common.css | 6 + module/dataview/css/create.css | 4 + module/dataview/css/edit.css | 4 + module/dataview/css/query.css | 1 + module/dataview/css/querybase.css | 22 ++ module/dataview/js/browse.js | 35 ++ module/dataview/js/common.js | 1 + module/dataview/js/create.js | 25 ++ module/dataview/js/datastorage.js | 73 ++++ module/dataview/js/edit.js | 0 module/dataview/js/query.js | 38 ++ module/dataview/js/querybase.js | 477 ++++++++++++++++++++++++ module/dataview/view/browse.html.php | 180 +++++++++ module/dataview/view/create.html.php | 37 ++ module/dataview/view/edit.html.php | 39 ++ module/dataview/view/query.html.php | 46 +++ module/dataview/view/querybase.html.php | 171 +++++++++ 19 files changed, 1190 insertions(+) create mode 100644 module/dataview/css/browse.css create mode 100644 module/dataview/css/browse.zh-cn.css create mode 100644 module/dataview/css/common.css create mode 100644 module/dataview/css/create.css create mode 100644 module/dataview/css/edit.css create mode 100644 module/dataview/css/query.css create mode 100644 module/dataview/css/querybase.css create mode 100644 module/dataview/js/browse.js create mode 100644 module/dataview/js/common.js create mode 100644 module/dataview/js/create.js create mode 100644 module/dataview/js/datastorage.js create mode 100644 module/dataview/js/edit.js create mode 100644 module/dataview/js/query.js create mode 100644 module/dataview/js/querybase.js create mode 100644 module/dataview/view/browse.html.php create mode 100644 module/dataview/view/create.html.php create mode 100644 module/dataview/view/edit.html.php create mode 100644 module/dataview/view/query.html.php create mode 100644 module/dataview/view/querybase.html.php diff --git a/module/dataview/css/browse.css b/module/dataview/css/browse.css new file mode 100644 index 0000000000..42eb36a121 --- /dev/null +++ b/module/dataview/css/browse.css @@ -0,0 +1,29 @@ +#sidebar .modulegroup {font-weight:bold; padding-top: 8px; border-top: 1px solid #ddd;} +#sidebar .active {background-color: #e9f2fb; color: #006af1;} + +.side-col {width: 240px;} +#sidebar> .cell {width: 220px;} + +#data {overflow: scroll;} +#data th, #data td, #schema td, #modules li > strong {overflow: hidden; text-overflow: unset; white-space: nowrap;} +#dataContent {margin: 0px; padding: 0px;} +#dataContent .detail {margin: 0px; padding: 0px;} +#dataContent .detail .detail-title {padding: 16px; border-bottom: 1px solid #f4f5f7; line-height: 16px;} +#dataContent .detail .detail-title .dataview-title {overflow: hidden; white-space: nowrap; max-width: calc(100% - 120px); display: inline-block;} +#dataContent .detail .detail-title .create-action {display: inline-block;} +#dataContent .detail .detail-content {margin-top: 0px;} +#dataContent .detail .detail-content .tab-content {padding: 16px;} +#dataContent .tabs .nav-tabs .actions {padding: 8px 15px;} +#dataContent .tabs .nav-tabs .actions a {padding-left: 5px;} +#dataContent .tabs table {margin-bottom: 0px;} +#dataContent .tabs table .dataview-sql {white-space: unset;} + +.nav-tabs {padding:16px 16px 0px 16px;} +.nav-tabs>li>a {padding: 5px 10px;} +.nav-tabs>li.active>a, .nav-tabs>li.active>a:focus, .nav-tabs>li.active>a:hover {color: #2e7fff!important; background-color: #e6f0ff; padding: 5px 10px;} +.nav-tabs>li.active>a:before {background: unset;} +.nav-tabs {border: unset;} + +.cell> .panel> .panel-heading {padding: 5px 0px 10px;} +.detail-title>.pull-right {position: unset;} +.detail-title>.pull-right>a {margin: 0px 10px; font-weight: normal; font-size: 13px;} diff --git a/module/dataview/css/browse.zh-cn.css b/module/dataview/css/browse.zh-cn.css new file mode 100644 index 0000000000..d3f7b11190 --- /dev/null +++ b/module/dataview/css/browse.zh-cn.css @@ -0,0 +1,2 @@ +.side-col {width: 200px;} +#sidebar> .cell {width: 180px;} diff --git a/module/dataview/css/common.css b/module/dataview/css/common.css new file mode 100644 index 0000000000..470d28b7b3 --- /dev/null +++ b/module/dataview/css/common.css @@ -0,0 +1,6 @@ +.form-actions .btn {margin-right: 5px;} +.td-row {display: flex;} +.td-row>div {flex: 1;} +.error td {color: red;} +.datatable{width: auto;} +.table-panel {overflow: auto;} diff --git a/module/dataview/css/create.css b/module/dataview/css/create.css new file mode 100644 index 0000000000..1c13f67e0b --- /dev/null +++ b/module/dataview/css/create.css @@ -0,0 +1,4 @@ +#main>.container {height: auto; min-height: 340px;} + +#dataform .table-form>tbody>tr>th {width: 70px;} +#dataform .table-form td.form-actions.text-center {padding-top: 20px;} diff --git a/module/dataview/css/edit.css b/module/dataview/css/edit.css new file mode 100644 index 0000000000..4eda8ef47c --- /dev/null +++ b/module/dataview/css/edit.css @@ -0,0 +1,4 @@ +#main>.container {height: auto; min-height: 280px;} +#dataform tr > th {width: 70px;} + +#dataform #group_chosen .chosen-drop .chosen-results {max-height: 140px;} diff --git a/module/dataview/css/query.css b/module/dataview/css/query.css new file mode 100644 index 0000000000..1d57043ff5 --- /dev/null +++ b/module/dataview/css/query.css @@ -0,0 +1 @@ +.main-content>.center-block {border: none;} diff --git a/module/dataview/css/querybase.css b/module/dataview/css/querybase.css new file mode 100644 index 0000000000..d3a994f5f5 --- /dev/null +++ b/module/dataview/css/querybase.css @@ -0,0 +1,22 @@ +.form-actions .btn {margin-right: 5px;} +.td-row {display: flex;} +.td-row>div {flex: 1;} +.error td {color: red;} +.datatable{width: auto;} +.table-panel {overflow: auto;} +.ellipsis-multi {overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 1;} +.query-padding {padding-left: 15px;} + +#mainContent {padding: 0px; background: none; box-shadow: none;} +#mainContent .panel {padding: 0px 10px 10px 10px; border: 0px;} +#mainContent .panel-heading {padding: 20px 20px 10px 20px;} +#dataform {padding: 0px 10px;} +#dataform textarea.form-control {padding: 20px 10px; box-shadow: inset 0 0px 0px rgb(0 0 0 / 10%), 0 0 15px rgb(0 0 0 / 10%); border: 0px;} +#mainContent .panel.table-panel .datatable.table tr>th, #mainContent .table-panel .datatable.table tr>td {padding: 5px 20px;} + +#queryTable .titleResult {padding:20px 0px 10px 20px;} +.fieldSettings {margin: -8px 10px; border: none;} +#edit select[name^='relatedTable'] + div .picker-selections:first-child {border-right: none;} +#edit select[name^='relatedTable'] + div.picker-focus .picker-selections {border-right: 1px solid #2e7fff;} + +#queryFilters .radio-inline input[type=radio] {margin-top: 0px;} diff --git a/module/dataview/js/browse.js b/module/dataview/js/browse.js new file mode 100644 index 0000000000..0939e5da92 --- /dev/null +++ b/module/dataview/js/browse.js @@ -0,0 +1,35 @@ +$(function() +{ + if(table) + { + $('.dataview-' + table).addClass('active'); + + var $tree = $('#modules').tree({name:'tree-group'}); + var tree = $tree.data('zui.tree'); + tree.expand($('.dataview-' + table).parents('li')); + } + + $(document).on('click','.query-view', function() + { + var url = createLink('dataview', 'query', 'id=' + table); + var result = true; + + if(dataview.used) result = confirm(warningDesign); + if(result) window.location.href = url; + }); +}); + +/** + * Locate page. + * + * @param string module + * @param string method + * @param string params + * @access public + * @return void + */ +function locate(module, method, params) +{ + var link = createLink(module, method, params); + window.location.href = link; +} diff --git a/module/dataview/js/common.js b/module/dataview/js/common.js new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/module/dataview/js/common.js @@ -0,0 +1 @@ + diff --git a/module/dataview/js/create.js b/module/dataview/js/create.js new file mode 100644 index 0000000000..28f62d63a3 --- /dev/null +++ b/module/dataview/js/create.js @@ -0,0 +1,25 @@ +$(function() +{ + var dataviewSql = JSON.parse(sessionStorage.getItem('dataviewSql')); + var fieldSettings = sessionStorage.getItem('fieldSettings'); + var langs = sessionStorage.getItem('langs'); + + $.each(dataviewSql, function(index, value) + { + if(value.name == 'sql') + { + dataviewSql = value.value; + return; + } + }); + + $('#sql').val(dataviewSql); + $('#fields').val(fieldSettings); + $('#langs').val(langs); +}); + +function locate(method, params) +{ + var link = createLink('dataview', method, params); + window.location.href = link; +} diff --git a/module/dataview/js/datastorage.js b/module/dataview/js/datastorage.js new file mode 100644 index 0000000000..13f5507687 --- /dev/null +++ b/module/dataview/js/datastorage.js @@ -0,0 +1,73 @@ +function initStorage(obj, debug = false) +{ + var dataStorage = + { + clone: function(key) + { + if(typeof this['_' + key] != 'object') return this['_' + key] + return JSON.parse(JSON.stringify(this['_' + key])); + }, + addProperty: function(key, value) + { + this[key] = + { + get: function() + { + if(debug) + { + console.groupCollapsed('Get %c' + key, 'color: #3785ff'); + console.log(this['_' + key]); + console.trace(); + console.groupEnd(); + } + return this['_' + key]; + }, + set: function(value) + { + if(debug) + { + console.groupCollapsed('Set %c' + key, 'color: #ff6970'); + console.log('Before', this['_' + key]); + console.log('Value', value); + console.trace(); + console.groupEnd(); + } + this['_' + key] = value; + } + } + } + }; + for(let key in obj) + { + dataStorage['_' + key] = obj[key]; + + Object.defineProperty(dataStorage, key, + { + get: function() + { + if(debug) + { + console.groupCollapsed('Get %c' + key, 'color: #3785ff'); + console.log(this.clone(key)); + console.trace(); + console.groupEnd(); + } + return this.clone(key); + }, + set: function(value) + { + if(debug) + { + console.groupCollapsed('Set %c' + key, 'color: #ff6970'); + console.log('Before', this.clone(key)); + console.log('Value', value); + console.trace(); + console.groupEnd(); + } + this['_' + key] = value; + } + }); + } + + return dataStorage; +} diff --git a/module/dataview/js/edit.js b/module/dataview/js/edit.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/module/dataview/js/query.js b/module/dataview/js/query.js new file mode 100644 index 0000000000..3e598dc06a --- /dev/null +++ b/module/dataview/js/query.js @@ -0,0 +1,38 @@ +$(function() +{ + if(rawMethod !== 'create') return; + var createModal = new $.zui.ModalTrigger({url: createLink('dataview', 'create', 'step=create', '', true), type: 'iframe', width: 480}); + document.getElementById('saveButton').addEventListener('click', function(e) + { + $.ajaxSettings.async = false; + query(); + $.ajaxSettings.async = true; + e.preventDefault(); + if($('#dataform .error').length == $('#dataform .error.hidden').length) + { + var params = $('#dataform').serializeArray(); + + getFieldSettings(); + + /* Fix bug #26716. */ + var fieldSettings = DataStorage.clone('fieldSettings'); + for(let index in fieldSettings) + { + if(!Object.keys(DataStorage.fields).includes(index)) delete fieldSettings[index]; + } + DataStorage.fieldSettings = fieldSettings; + + sessionStorage.setItem('dataviewSql', JSON.stringify(params)); + sessionStorage.setItem('fieldSettings', JSON.stringify(fieldSettings)); + sessionStorage.setItem('langs', JSON.stringify(DataStorage.langs)); + + createModal.show(); + } + }); +}); + +function locate(method, params) +{ + var link = createLink('dataview', method, params); + window.location.href = link; +} diff --git a/module/dataview/js/querybase.js b/module/dataview/js/querybase.js new file mode 100644 index 0000000000..c4a844d172 --- /dev/null +++ b/module/dataview/js/querybase.js @@ -0,0 +1,477 @@ +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'); + $.post(createLink('dataview', 'ajaxQuery'), {sql: $('#sql').val(), filters: filters, recPerPage: DataStorage.recPerPage, pageID: DataStorage.pageID}, function(resp) + { + resp = JSON.parse(resp); + $('.query').removeClass('disabled'); + $('#querying').addClass('hidden'); + if(resp.result !== 'success') + { + var message = resp.message.errorInfo ? resp.message.errorInfo[2] : resp.message; + $('.error').removeClass('hidden'); + $('.error td').html(message); + drawTable([], []); + } + else + { + 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; + 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(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'; + } + + 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}); +} + +/** + * 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(); + }) +}); diff --git a/module/dataview/view/browse.html.php b/module/dataview/view/browse.html.php new file mode 100644 index 0000000000..35cc5ef28d --- /dev/null +++ b/module/dataview/view/browse.html.php @@ -0,0 +1,180 @@ + + * @package dataview + * @version $Id: browse.html.php 4129 2022-11-14 14:42:12 $ + * @link http://www.zentao.net + */ +?> +getModuleRoot() . 'common/view/header.html.php';?> + + +dataview->error->warningDesign);?> + + + +
+ +
+
+
+
+
+ + dataview->design; + $editTitle = $lang->dataview->edit; + $deleteTitle = $lang->dataview->delete; + if(common::hasPriv('dataview', 'query') and $type == 'view') echo html::a('#', " {$lang->dataview->design}", '', "class='query-view' title='{$designTitle}'"); + if(common::hasPriv('dataview', 'edit') and $type == 'view') echo html::a($this->createLink('dataview', 'edit', "id=$selectedTable", '', true), " {$lang->dataview->edit}", '', "class='iframe' title='{$editTitle}' data-width='480'"); + if(common::hasPriv('dataview', 'delete') and $type == 'view') echo html::a($this->createLink('dataview', 'delete', "id=$selectedTable"), " {$lang->dataview->delete}", 'hiddenwin', "class='query-delete' title='{$deleteTitle}'"); + ?> + +
+
+ +
+
+ +
+
+ + + + + $field):?> + fieldSettings->$key->name) ? $dataview->fieldSettings->$key->name : $key; + if(!empty($dataview->langs)) + { + $langs = json_decode($dataview->langs, true); + if(!empty($langs)) $fieldName = $langs[$key][$clientLang] ? $langs[$key][$clientLang] : $fieldName; + } + ?> + + + + + + + ';?> + $field):?> + + + ';?> + + +
'>$key) ? $value->$key : 'null';?>
+ +
+
+ + + + + + + config->db->prefix) !== false) echo ""?> + + + + + + + + $field):?> + + + + config->db->prefix) !== false) echo ""?> + + + + + + +
dev->fields['id']?>dev->fields['name']?>{$lang->dev->fields['desc']}dev->fields['type']?>dev->fields['length']?>dev->fields['null']?>
{$field['name']}'>'>
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
dataview->name;?>name;?>
dataview->code;?>code;?>
dataview->view;?>sql) ? '' : $dataview->view;?>
dataview->group;?>group);?>
dataview->sql;?>sql;?>
+
+ +
+
+
+ +
+
+

dataview->notSelect;?>

+
+
+ +
+
+
+app->getModuleRoot() . 'common/view/footer.html.php';?> diff --git a/module/dataview/view/create.html.php b/module/dataview/view/create.html.php new file mode 100644 index 0000000000..cc14005ba7 --- /dev/null +++ b/module/dataview/view/create.html.php @@ -0,0 +1,37 @@ +getModuleRoot() . 'common/view/header.html.php';?> + +
+
+
+ + + + + + + + + + + + + + + + + +
dataview->group;?>
dataview->name;?> + +
dataview->code;?>
+ +
+
+
+
+getModuleRoot() . 'common/view/footer.html.php';?> diff --git a/module/dataview/view/edit.html.php b/module/dataview/view/edit.html.php new file mode 100644 index 0000000000..dba9cbb2fb --- /dev/null +++ b/module/dataview/view/edit.html.php @@ -0,0 +1,39 @@ +getModuleRoot() . 'common/view/header.html.php';?> +dataview);?> + + +
+
+
+ + + + + + + + + + + + + + + + + +
dataview->group;?>group, "class='form-control chosen' data-drop_direction='down'");?>
dataview->name;?> + name, 'class="form-control"');?> +
+ +
+
+
+
+getModuleRoot() . 'common/view/footer.html.php';?> diff --git a/module/dataview/view/query.html.php b/module/dataview/view/query.html.php new file mode 100644 index 0000000000..eaeee460d5 --- /dev/null +++ b/module/dataview/view/query.html.php @@ -0,0 +1,46 @@ +getModuleRoot() . 'common/view/header.html.php';?> +rawMethod);?> + +dataview->error->warningDesign);?> +langs) ? $data->langs : '')?> + + + + + + +
+
+ + + +
+
+getModuleRoot() . 'common/view/footer.html.php';?> diff --git a/module/dataview/view/querybase.html.php b/module/dataview/view/querybase.html.php new file mode 100644 index 0000000000..e72aa37b64 --- /dev/null +++ b/module/dataview/view/querybase.html.php @@ -0,0 +1,171 @@ +dataview);?> +dataview->queryResult);?> +app->getClientLang());?> +app->cookie->theme);?> +dataview->recTotalTip);?> +dataview->recPerPageTip);?> +
+
+
dataview->sqlQuery;?>
+
+
+ + + + + + + + + + +
+ sql : '', "placeholder='" . $lang->dataview->sqlPlaceholder . "' class='form-control' rows=6");?> +
+ + +
+
+
+
+
+
+ dataview->result;?> + +
+
+
+

dataview->noQueryData;?>

+
+
+ +
+
+ +
+ + + + + +