import $ from 'jquery'; import { AJAX } from '../modules/ajax.ts'; import { copyToClipboard, displayCopyNotification, getSqlEditor } from '../modules/functions.ts'; import { CommonParams } from '../modules/common.ts'; import { ajaxShowMessage } from '../modules/ajax-message.ts'; import { escapeBacktick } from '../modules/functions/escape.ts'; /** * @fileoverview function used in QBE for DB * @name Database Operations * * @requires jQueryUI * @requires js/database/query_generator.js */ /** * js file for handling AJAX and other events in /database/multi-table-query */ /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('database/multi_table_query.js', function () { $('.tableNameSelect').each(function () { $(this).off('change'); }); $('.columnNameSelect').each(function () { $(this).off('change'); }); $('.criteria_op').each(function () { $(this).off('change'); }); $('#update_query_button').off('click'); $('#copy_query').off('click'); $('#add_column_button').off('click'); $('body').off('click', 'input.add-option'); $('body').off('click', 'input.remove-option'); }); AJAX.registerOnload('database/multi_table_query.js', function () { const editor = getSqlEditor($('#MultiSqlquery'), {}, 'vertical'); $('.CodeMirror-line').css('text-align', 'left'); editor.setSize(-1, -1); let columnCount = 3; addNewColumnCallbacks(); function opsWithMultipleArgs (): string[] { return ['IN (...)', 'NOT IN (...)']; } function opsWithTwoArgs (): string[] { return ['BETWEEN', 'NOT BETWEEN']; } $('#update_query_button').on('click', function () { const columns = []; const tableAliases = {}; $('.tableNameSelect').each(function () { const $show = $(this).siblings('.show_col').first(); if ($(this).val() !== '' && $show.prop('checked')) { const tableAlias = $(this).siblings('.table_alias').first().val(); const columnAlias = $(this).siblings('.col_alias').first().val(); if (tableAlias !== '') { columns.push([tableAlias, $(this).siblings('.columnNameSelect').first().val()]); } else { columns.push([$(this).val(), $(this).siblings('.columnNameSelect').first().val()]); } columns[columns.length - 1].push(columnAlias); if (($(this).val() as string) in tableAliases) { if (! (tableAliases[($(this).val() as string)].includes(tableAlias))) { tableAliases[($(this).val() as string)].push(tableAlias); } } else { tableAliases[($(this).val() as string)] = [tableAlias]; } } }); if (Object.keys(tableAliases).length === 0) { ajaxShowMessage('Nothing selected', false, 'error'); return; } let foreignKeys; $.ajax({ type: 'GET', async: false, url: 'index.php?route=/database/multi-table-query/tables', data: { 'server': sessionStorage.server, 'db': $('#db_name').val(), 'tables': Object.keys(tableAliases), 'ajax_request': '1', 'token': CommonParams.get('token') }, success: function (response) { foreignKeys = response.foreignKeyConstrains; } }); let query = 'SELECT ' + '`' + escapeBacktick(columns[0][0]) + '`.'; if (columns[0][1] === '*') { query += '*'; } else { query += '`' + escapeBacktick(columns[0][1]) + '`'; } if (columns[0][2] !== '') { query += ' AS `' + escapeBacktick(columns[0][2]) + '`'; } for (let i = 1; i < columns.length; i++) { query += ', `' + escapeBacktick(columns[i][0]) + '`.'; if (columns[i][1] === '*') { query += '*'; } else { query += '`' + escapeBacktick(columns[i][1]) + '`'; } if (columns[i][2] !== '') { query += ' AS `' + escapeBacktick(columns[i][2]) + '`'; } } query += '\nFROM '; query += window.generateFromBlock(tableAliases, foreignKeys); const $criteriaColCount = $('.criteria_col:checked').length; if ($criteriaColCount > 0) { query += '\nWHERE '; query += window.generateWhereBlock(); } query += ';'; editor.getDoc().setValue(query); }); $('#submit_query').on('click', function () { const query = editor.getDoc().getValue(); // Verifying that the query is not empty if (query === '') { ajaxShowMessage(window.Messages.strEmptyQuery, false, 'error'); return; } const data = { 'db': $('#db_name').val(), 'sql_query': query, 'ajax_request': '1', 'server': CommonParams.get('server'), 'token': CommonParams.get('token'), }; $.ajax({ type: 'POST', url: 'index.php?route=/database/multi-table-query/query', data: data, success: function (data) { const $resultsDom = $(data.message); $resultsDom.find('.ajax:not(.pageselector)').each(function () { $(this).on('click', function (event) { event.preventDefault(); }); }); $resultsDom.find('.autosubmit, .pageselector, .showAllRows, .filter_rows').each(function () { $(this).on('change click select focus', function (event) { event.preventDefault(); }); }); // @ts-ignore $('#sql_results').html($resultsDom); $('#slide-handle').trigger('click');// Collapse search criteria area } }); }); editor.getDoc().on('change', function (): void { const query: string = editor.getDoc().getValue(); $('#copy_query').prop('disabled', query === ''); }); $('#copy_query').on('click', function (): void { const query: string = editor.getDoc().getValue(); const copyStatus = copyToClipboard(query, '