diff options
Diffstat (limited to 'srcs/phpmyadmin/js/database')
| -rw-r--r-- | srcs/phpmyadmin/js/database/central_columns.js | 241 | ||||
| -rw-r--r-- | srcs/phpmyadmin/js/database/multi_table_query.js | 222 | ||||
| -rw-r--r-- | srcs/phpmyadmin/js/database/operations.js | 167 | ||||
| -rw-r--r-- | srcs/phpmyadmin/js/database/qbe.js | 87 | ||||
| -rw-r--r-- | srcs/phpmyadmin/js/database/query_generator.js | 131 | ||||
| -rw-r--r-- | srcs/phpmyadmin/js/database/search.js | 248 | ||||
| -rw-r--r-- | srcs/phpmyadmin/js/database/structure.js | 429 | ||||
| -rw-r--r-- | srcs/phpmyadmin/js/database/tracking.js | 93 |
8 files changed, 1618 insertions, 0 deletions
diff --git a/srcs/phpmyadmin/js/database/central_columns.js b/srcs/phpmyadmin/js/database/central_columns.js new file mode 100644 index 0000000..15f95de --- /dev/null +++ b/srcs/phpmyadmin/js/database/central_columns.js @@ -0,0 +1,241 @@ +/* vim: set expandtab sw=4 ts=4 sts=4: */ +/** + * @fileoverview events handling from central columns page + * @name Central columns + * + * @requires jQuery + */ + +/** + * AJAX scripts for db_central_columns.php + * + * Actions ajaxified here: + * Inline Edit and save of a result row + * Delete a row + * Multiple edit and delete option + * + */ + +AJAX.registerTeardown('database/central_columns.js', function () { + $('.edit').off('click'); + $('.edit_save_form').off('click'); + $('.edit_cancel_form').off('click'); + $('.del_row').off('click'); + $(document).off('keyup', '.filter_rows'); + $('.edit_cancel_form').off('click'); + $('#table-select').off('change'); + $('#column-select').off('change'); + $('#add_col_div').find('>a').off('click'); + $('#add_new').off('submit'); + $('#multi_edit_central_columns').off('submit'); + $('select.default_type').off('change'); + $('button[name=\'delete_central_columns\']').off('click'); + $('button[name=\'edit_central_columns\']').off('click'); +}); + +AJAX.registerOnload('database/central_columns.js', function () { + $('#tableslistcontainer input,#tableslistcontainer select,#tableslistcontainer .default_value,#tableslistcontainer .open_enum_editor').hide(); + $('#tableslistcontainer').find('.checkall').show(); + $('#tableslistcontainer').find('.checkall_box').show(); + if ($('#table_columns').find('tbody tr').length > 0) { + $('#table_columns').tablesorter({ + headers: { + 0: { sorter: false }, + 1: { sorter: false }, // hidden column + 4: { sorter: 'integer' } + } + }); + } + $('#tableslistcontainer').find('button[name="delete_central_columns"]').on('click', function (event) { + event.preventDefault(); + var multiDeleteColumns = $('.checkall:checkbox:checked').serialize(); + if (multiDeleteColumns === '') { + Functions.ajaxShowMessage(Messages.strRadioUnchecked); + return false; + } + Functions.ajaxShowMessage(); + $('#del_col_name').val(multiDeleteColumns); + $('#del_form').trigger('submit'); + }); + $('#tableslistcontainer').find('button[name="edit_central_columns"]').on('click', function (event) { + event.preventDefault(); + var editColumnList = $('.checkall:checkbox:checked').serialize(); + if (editColumnList === '') { + Functions.ajaxShowMessage(Messages.strRadioUnchecked); + return false; + } + var argsep = CommonParams.get('arg_separator'); + var editColumnData = editColumnList + '' + argsep + 'edit_central_columns_page=true' + argsep + 'ajax_request=true' + argsep + 'ajax_page_request=true' + argsep + 'db=' + encodeURIComponent(CommonParams.get('db')); + Functions.ajaxShowMessage(); + AJAX.source = $(this); + $.post('db_central_columns.php', editColumnData, AJAX.responseHandler); + }); + $('#multi_edit_central_columns').submit(function (event) { + event.preventDefault(); + event.stopPropagation(); + var argsep = CommonParams.get('arg_separator'); + var multiColumnEditData = $('#multi_edit_central_columns').serialize() + argsep + 'multi_edit_central_column_save=true' + argsep + 'ajax_request=true' + argsep + 'ajax_page_request=true' + argsep + 'db=' + encodeURIComponent(CommonParams.get('db')); + Functions.ajaxShowMessage(); + AJAX.source = $(this); + $.post('db_central_columns.php', multiColumnEditData, AJAX.responseHandler); + }); + $('#add_new').find('td').each(function () { + if ($(this).attr('name') !== 'undefined') { + $(this).find('input,select:first').attr('name', $(this).attr('name')); + } + }); + $('#field_0_0').attr('required','required'); + $('#add_new input[type="text"], #add_new input[type="number"], #add_new select') + .css({ + 'width' : '10em', + '-moz-box-sizing' : 'border-box' + }); + window.scrollTo(0, 0); + $(document).on('keyup', '.filter_rows', function () { + // get the column names + var cols = $('th.column_heading').map(function () { + return $.trim($(this).text()); + }).get(); + $.uiTableFilter($('#table_columns'), $(this).val(), cols, null, 'td span'); + }); + $('.edit').on('click', function () { + var rownum = $(this).parent().data('rownum'); + $('#save_' + rownum).show(); + $(this).hide(); + $('#f_' + rownum + ' td span').hide(); + $('#f_' + rownum + ' input, #f_' + rownum + ' select, #f_' + rownum + ' .open_enum_editor').show(); + var attributeVal = $('#f_' + rownum + ' td[name=col_attribute] span').html(); + $('#f_' + rownum + ' select[name=field_attribute\\[' + rownum + '\\] ] option[value="' + attributeVal + '"]').attr('selected','selected'); + if ($('#f_' + rownum + ' .default_type').val() === 'USER_DEFINED') { + $('#f_' + rownum + ' .default_type').siblings('.default_value').show(); + } else { + $('#f_' + rownum + ' .default_type').siblings('.default_value').hide(); + } + }); + $('.del_row').on('click', function (event) { + event.preventDefault(); + event.stopPropagation(); + var $td = $(this); + var question = Messages.strDeleteCentralColumnWarning; + $td.confirm(question, null, function () { + var rownum = $td.data('rownum'); + $('#del_col_name').val('selected_fld%5B%5D=' + $('#checkbox_row_' + rownum).val()); + $('#del_form').trigger('submit'); + }); + }); + $('.edit_cancel_form').on('click', function (event) { + event.preventDefault(); + event.stopPropagation(); + var rownum = $(this).data('rownum'); + $('#save_' + rownum).hide(); + $('#edit_' + rownum).show(); + $('#f_' + rownum + ' td span').show(); + $('#f_' + rownum + ' input, #f_' + rownum + ' select,#f_' + rownum + ' .default_value, #f_' + rownum + ' .open_enum_editor').hide(); + $('#tableslistcontainer').find('.checkall').show(); + }); + $('.edit_save_form').on('click', function (event) { + event.preventDefault(); + event.stopPropagation(); + var rownum = $(this).data('rownum'); + $('#f_' + rownum + ' td').each(function () { + if ($(this).attr('name') !== 'undefined') { + $(this).find(':input[type!="hidden"],select:first') + .attr('name', $(this).attr('name')); + } + }); + + if ($('#f_' + rownum + ' .default_type').val() === 'USER_DEFINED') { + $('#f_' + rownum + ' .default_type').attr('name','col_default_sel'); + } else { + $('#f_' + rownum + ' .default_value').attr('name','col_default_val'); + } + + var datastring = $('#f_' + rownum + ' :input').serialize(); + $.ajax({ + type: 'POST', + url: 'db_central_columns.php', + data: datastring + CommonParams.get('arg_separator') + 'ajax_request=true', + dataType: 'json', + success: function (data) { + if (data.message !== '1') { + Functions.ajaxShowMessage( + '<div class="error">' + + data.message + + '</div>', + false + ); + } else { + $('#f_' + rownum + ' td input[id=checkbox_row_' + rownum + ']').val($('#f_' + rownum + ' input[name=col_name]').val()).html(); + $('#f_' + rownum + ' td[name=col_name] span').text($('#f_' + rownum + ' input[name=col_name]').val()).html(); + $('#f_' + rownum + ' td[name=col_type] span').text($('#f_' + rownum + ' select[name=col_type]').val()).html(); + $('#f_' + rownum + ' td[name=col_length] span').text($('#f_' + rownum + ' input[name=col_length]').val()).html(); + $('#f_' + rownum + ' td[name=collation] span').text($('#f_' + rownum + ' select[name=collation]').val()).html(); + $('#f_' + rownum + ' td[name=col_attribute] span').text($('#f_' + rownum + ' select[name=col_attribute]').val()).html(); + $('#f_' + rownum + ' td[name=col_isNull] span').text($('#f_' + rownum + ' input[name=col_isNull]').is(':checked') ? 'Yes' : 'No').html(); + $('#f_' + rownum + ' td[name=col_extra] span').text($('#f_' + rownum + ' input[name=col_extra]').is(':checked') ? 'auto_increment' : '').html(); + $('#f_' + rownum + ' td[name=col_default] span').text($('#f_' + rownum + ' :input[name=col_default]').val()).html(); + } + $('#save_' + rownum).hide(); + $('#edit_' + rownum).show(); + $('#f_' + rownum + ' td span').show(); + $('#f_' + rownum + ' input, #f_' + rownum + ' select,#f_' + rownum + ' .default_value, #f_' + rownum + ' .open_enum_editor').hide(); + $('#tableslistcontainer').find('.checkall').show(); + }, + error: function () { + Functions.ajaxShowMessage( + '<div class="error">' + + Messages.strErrorProcessingRequest + + '</div>', + false + ); + } + }); + }); + $('#table-select').on('change', function () { + var selectValue = $(this).val(); + var defaultColumnSelect = $('#column-select').find('option:first'); + var href = 'db_central_columns.php'; + var params = { + 'ajax_request' : true, + 'server' : CommonParams.get('server'), + 'db' : CommonParams.get('db'), + 'selectedTable' : selectValue, + 'populateColumns' : true + }; + $('#column-select').html('<option value="">' + Messages.strLoading + '</option>'); + if (selectValue !== '') { + $.post(href, params, function (data) { + $('#column-select').empty().append(defaultColumnSelect); + $('#column-select').append(data.message); + }); + } + }); + $('#add_column').submit(function (e) { + var selectvalue = $('#column-select').val(); + if (selectvalue === '') { + e.preventDefault(); + e.stopPropagation(); + } + }); + $('#add_col_div').find('>a').on('click', function () { + $('#add_new').slideToggle('slow'); + var $addColDivLinkSpan = $('#add_col_div').find('>a span'); + if ($addColDivLinkSpan.html() === '+') { + $addColDivLinkSpan.html('-'); + } else { + $addColDivLinkSpan.html('+'); + } + }); + $('#add_new').submit(function () { + $('#add_new').toggle(); + }); + $('#tableslistcontainer').find('select.default_type').on('change', function () { + if ($(this).val() === 'USER_DEFINED') { + $(this).siblings('.default_value').attr('name','col_default'); + $(this).attr('name','col_default_sel'); + } else { + $(this).attr('name','col_default'); + $(this).siblings('.default_value').attr('name','col_default_val'); + } + }); +}); diff --git a/srcs/phpmyadmin/js/database/multi_table_query.js b/srcs/phpmyadmin/js/database/multi_table_query.js new file mode 100644 index 0000000..34b793c --- /dev/null +++ b/srcs/phpmyadmin/js/database/multi_table_query.js @@ -0,0 +1,222 @@ +/* vim: set expandtab sw=4 ts=4 sts=4: */ +/** + * @fileoverview function used in QBE for DB + * @name Database Operations + * + * @requires jQuery + * @requires jQueryUI + * @requires js/functions.js + * @requires js/database/query_generator.js + * + */ + +/* global generateFromBlock, generateWhereBlock */ // js/database/query_generator.js + +/** + * js file for handling AJAX and other events in db_multi_table_query.php + */ + +/** + * Unbind all event handlers before tearing down a page + */ +AJAX.registerTeardown('database/multi_table_query.js', function () { + $('.tableNameSelect').each(function () { + $(this).off('change'); + }); + $('#update_query_button').off('click'); + $('#add_column_button').off('click'); +}); + +AJAX.registerOnload('database/multi_table_query.js', function () { + var editor = Functions.getSqlEditor($('#MultiSqlquery'), {}, 'both'); + $('.CodeMirror-line').css('text-align', 'left'); + editor.setSize(-1, 50); + + var columnCount = 3; + Functions.initSlider(); + addNewColumnCallbacks(); + + $('#update_query_button').on('click', function () { + var columns = []; + var tableAliases = {}; + $('.tableNameSelect').each(function () { + var $show = $(this).siblings('.show_col').first(); + if ($(this).val() !== '' && $show.prop('checked')) { + var tableAlias = $(this).siblings('.table_alias').first().val(); + var 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() in tableAliases) { + if (!(tableAliases[$(this).val()].includes(tableAlias))) { + tableAliases[$(this).val()].push(tableAlias); + } + } else { + tableAliases[$(this).val()] = [tableAlias]; + } + } + }); + if (Object.keys(tableAliases).length === 0) { + Functions.ajaxShowMessage('Nothing selected', false, 'error'); + return; + } + + var foreignKeys; + $.ajax({ + type: 'GET', + async: false, + url: 'db_multi_table_query.php', + 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; + } + }); + + var query = 'SELECT ' + '`' + Functions.escapeBacktick(columns[0][0]) + '`.'; + if (columns[0][1] === '*') { + query += '*'; + } else { + query += '`' + Functions.escapeBacktick(columns[0][1]) + '`'; + } + if (columns[0][2] !== '') { + query += ' AS ' + columns[0][2]; + } + for (var i = 1; i < columns.length; i++) { + query += ', `' + Functions.escapeBacktick(columns[i][0]) + '`.'; + if (columns[i][1] === '*') { + query += '*'; + } else { + query += '`' + Functions.escapeBacktick(columns[i][1]) + '`'; + } + if (columns[i][2] !== '') { + query += ' AS `' + Functions.escapeBacktick(columns[0][2]) + '`'; + } + } + query += '\nFROM '; + + query += generateFromBlock(tableAliases, foreignKeys); + + var $criteriaColCount = $('.criteria_col:checked').length; + if ($criteriaColCount > 0) { + query += '\nWHERE '; + query += generateWhereBlock(); + } + + query += ';'; + editor.getDoc().setValue(query); + }); + + $('#submit_query').on('click', function () { + var query = editor.getDoc().getValue(); + // Verifying that the query is not empty + if (query === '') { + Functions.ajaxShowMessage(Messages.strEmptyQuery, false, 'error'); + return; + } + var data = { + 'db': $('#db_name').val(), + 'sql_query': query, + 'ajax_request': '1', + 'token': CommonParams.get('token') + }; + $.ajax({ + type: 'POST', + url: 'db_multi_table_query.php', + data: data, + success: function (data) { + var $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(); + }); + }); + $('#sql_results').html($resultsDom); + $('#page_content').find('a').first().trigger('click'); + } + }); + }); + + $('#add_column_button').on('click', function () { + columnCount++; + var $newColumnDom = $($('#new_column_layout').html()).clone(); + $newColumnDom.find('div').first().find('div').first().attr('id', columnCount.toString()); + $newColumnDom.find('a').first().remove(); + $newColumnDom.find('.pma_auto_slider').first().unwrap(); + $newColumnDom.find('.pma_auto_slider').first().attr('title', 'criteria'); + $('#add_column_button').parent().before($newColumnDom); + Functions.initSlider(); + addNewColumnCallbacks(); + }); + + function addNewColumnCallbacks () { + $('.tableNameSelect').each(function () { + $(this).on('change', function () { + var $sibs = $(this).siblings('.columnNameSelect'); + if ($sibs.length === 0) { + $sibs = $(this).parent().parent().find('.columnNameSelect'); + } + $sibs.first().html($('#' + $.md5($(this).val())).html()); + }); + }); + + $('.removeColumn').each(function () { + $(this).on('click', function () { + $(this).parent().remove(); + }); + }); + + $('a.ajax').each(function () { + $(this).on('click', function (event, from) { + if (from === null) { + var $checkbox = $(this).siblings('.criteria_col').first(); + $checkbox.prop('checked', !$checkbox.prop('checked')); + } + var $criteriaColCount = $('.criteria_col:checked').length; + if ($criteriaColCount > 1) { + $(this).siblings('.slide-wrapper').first().find('.logical_operator').first().css('display','table-row'); + } + }); + }); + + $('.criteria_col').each(function () { + $(this).on('change', function () { + var $anchor = $(this).siblings('a.ajax').first(); + $anchor.trigger('click', ['Trigger']); + }); + }); + + $('.criteria_rhs').each(function () { + $(this).on('change', function () { + var $rhsCol = $(this).parent().parent().siblings('.rhs_table').first(); + var $rhsText = $(this).parent().parent().siblings('.rhs_text').first(); + if ($(this).val() === 'text') { + $rhsCol.css('display', 'none'); + $rhsText.css('display', 'table-row'); + } else if ($(this).val() === 'anotherColumn') { + $rhsText.css('display', 'none'); + $rhsCol.css('display', 'table-row'); + } else { + $rhsText.css('display', 'none'); + $rhsCol.css('display', 'none'); + } + }); + }); + } +}); diff --git a/srcs/phpmyadmin/js/database/operations.js b/srcs/phpmyadmin/js/database/operations.js new file mode 100644 index 0000000..e8f927c --- /dev/null +++ b/srcs/phpmyadmin/js/database/operations.js @@ -0,0 +1,167 @@ +/* vim: set expandtab sw=4 ts=4 sts=4: */ +/** + * @fileoverview function used in server privilege pages + * @name Database Operations + * + * @requires jQuery + * @requires jQueryUI + * @requires js/functions.js + * + */ + +/** + * Ajax event handlers here for db_operations.php + * + * Actions Ajaxified here: + * Rename Database + * Copy Database + * Change Charset + * Drop Database + */ + +/** + * Unbind all event handlers before tearing down a page + */ +AJAX.registerTeardown('database/operations.js', function () { + $(document).off('submit', '#rename_db_form.ajax'); + $(document).off('submit', '#copy_db_form.ajax'); + $(document).off('submit', '#change_db_charset_form.ajax'); + $(document).off('click', '#drop_db_anchor.ajax'); +}); + +AJAX.registerOnload('database/operations.js', function () { + /** + * Ajax event handlers for 'Rename Database' + */ + $(document).on('submit', '#rename_db_form.ajax', function (event) { + event.preventDefault(); + + var oldDbName = CommonParams.get('db'); + var newDbName = $('#new_db_name').val(); + + if (newDbName === oldDbName) { + Functions.ajaxShowMessage(Messages.strDatabaseRenameToSameName, false, 'error'); + return false; + } + + var $form = $(this); + + var question = Functions.escapeHtml('CREATE DATABASE ' + newDbName + ' / DROP DATABASE ' + oldDbName); + + Functions.prepareForAjaxRequest($form); + + $form.confirm(question, $form.attr('action'), function (url) { + Functions.ajaxShowMessage(Messages.strRenamingDatabases, false); + $.post(url, $('#rename_db_form').serialize() + CommonParams.get('arg_separator') + 'is_js_confirmed=1', function (data) { + if (typeof data !== 'undefined' && data.success === true) { + Functions.ajaxShowMessage(data.message); + CommonParams.set('db', data.newname); + + Navigation.reload(function () { + $('#pma_navigation_tree') + .find('a:not(\'.expander\')') + .each(function () { + var $thisAnchor = $(this); + if ($thisAnchor.text() === data.newname) { + // simulate a click on the new db name + // in navigation + $thisAnchor.trigger('click'); + } + }); + }); + } else { + Functions.ajaxShowMessage(data.error, false); + } + }); // end $.post() + }); + }); // end Rename Database + + /** + * Ajax Event Handler for 'Copy Database' + */ + $(document).on('submit', '#copy_db_form.ajax', function (event) { + event.preventDefault(); + Functions.ajaxShowMessage(Messages.strCopyingDatabase, false); + var $form = $(this); + Functions.prepareForAjaxRequest($form); + $.post($form.attr('action'), $form.serialize(), function (data) { + // use messages that stay on screen + $('div.success, div.error').fadeOut(); + if (typeof data !== 'undefined' && data.success === true) { + if ($('#checkbox_switch').is(':checked')) { + CommonParams.set('db', data.newname); + CommonActions.refreshMain(false, function () { + Functions.ajaxShowMessage(data.message); + }); + } else { + CommonParams.set('db', data.db); + Functions.ajaxShowMessage(data.message); + } + Navigation.reload(); + } else { + Functions.ajaxShowMessage(data.error, false); + } + }); // end $.post() + }); // end copy database + + /** + * Change tables columns visible only if change tables is checked + */ + $('#span_change_all_tables_columns_collations').hide(); + $('#checkbox_change_all_tables_collations').on('click', function () { + $('#span_change_all_tables_columns_collations').toggle(); + }); + + /** + * Ajax Event handler for 'Change Charset' of the database + */ + $(document).on('submit', '#change_db_charset_form.ajax', function (event) { + event.preventDefault(); + var $form = $(this); + Functions.prepareForAjaxRequest($form); + Functions.ajaxShowMessage(Messages.strChangingCharset); + $.post($form.attr('action'), $form.serialize() + CommonParams.get('arg_separator') + 'submitcollation=1', function (data) { + if (typeof data !== 'undefined' && data.success === true) { + Functions.ajaxShowMessage(data.message); + } else { + Functions.ajaxShowMessage(data.error, false); + } + }); // end $.post() + }); // end change charset + + /** + * Ajax event handlers for Drop Database + */ + $(document).on('click', '#drop_db_anchor.ajax', function (event) { + event.preventDefault(); + var $link = $(this); + /** + * @var question String containing the question to be asked for confirmation + */ + var question = Messages.strDropDatabaseStrongWarning + ' '; + question += Functions.sprintf( + Messages.strDoYouReally, + 'DROP DATABASE `' + Functions.escapeHtml(CommonParams.get('db') + '`') + ); + var params = Functions.getJsConfirmCommonParam(this, $link.getPostData()); + + $(this).confirm(question, $(this).attr('href'), function (url) { + Functions.ajaxShowMessage(Messages.strProcessingRequest); + $.post(url, params, function (data) { + if (typeof data !== 'undefined' && data.success) { + // Database deleted successfully, refresh both the frames + Navigation.reload(); + CommonParams.set('db', ''); + CommonActions.refreshMain( + 'server_databases.php', + function () { + Functions.ajaxShowMessage(data.message); + } + ); + } else { + Functions.ajaxShowMessage(data.error, false); + } + }); + }); + }); +}); diff --git a/srcs/phpmyadmin/js/database/qbe.js b/srcs/phpmyadmin/js/database/qbe.js new file mode 100644 index 0000000..358c67c --- /dev/null +++ b/srcs/phpmyadmin/js/database/qbe.js @@ -0,0 +1,87 @@ +/* vim: set expandtab sw=4 ts=4 sts=4: */ +/** + * @fileoverview function used in QBE for DB + * @name Database Operations + * + * @requires jQuery + * @requires jQueryUI + * @requires js/functions.js + * + */ + +/** + * Ajax event handlers here for db_qbe.php + * + * Actions Ajaxified here: + * Select saved search + */ + +/** + * Unbind all event handlers before tearing down a page + */ +AJAX.registerTeardown('database/qbe.js', function () { + $(document).off('change', 'select[name^=criteriaColumn]'); + $(document).off('change', '#searchId'); + $(document).off('click', '#saveSearch'); + $(document).off('click', '#updateSearch'); + $(document).off('click', '#deleteSearch'); +}); + +AJAX.registerOnload('database/qbe.js', function () { + Functions.getSqlEditor($('#textSqlquery'), {}, 'none'); + + $('#tblQbe').width($('#tblQbe').parent().width()); + $('#tblQbeFooters').width($('#tblQbeFooters').parent().width()); + $('#tblQbe').resize(function () { + var newWidthTblQbe = $('#textSqlquery').next().width(); + $('#tblQbe').width(newWidthTblQbe); + $('#tblQbeFooters').width(newWidthTblQbe); + }); + + /** + * Ajax handler to check the corresponding 'show' checkbox when column is selected + */ + $(document).on('change', 'select[name^=criteriaColumn]', function () { + if ($(this).val()) { + var index = (/\d+/).exec($(this).attr('name')); + $('input[name=criteriaShow\\[' + index + '\\]]').prop('checked', true); + } + }); + + /** + * Ajax event handlers for 'Select saved search' + */ + $(document).on('change', '#searchId', function () { + $('#action').val('load'); + $('#formQBE').trigger('submit'); + }); + + /** + * Ajax event handlers for 'Create bookmark' + */ + $(document).on('click', '#saveSearch', function () { + $('#action').val('create'); + }); + + /** + * Ajax event handlers for 'Update bookmark' + */ + $(document).on('click', '#updateSearch', function () { + $('#action').val('update'); + }); + + /** + * Ajax event handlers for 'Delete bookmark' + */ + $(document).on('click', '#deleteSearch', function () { + var question = Functions.sprintf(Messages.strConfirmDeleteQBESearch, $('#searchId').find('option:selected').text()); + if (!confirm(question)) { + return false; + } + + $('#action').val('delete'); + }); + + var windowwidth = $(window).width(); + $('.jsresponsive').css('max-width', (windowwidth - 35) + 'px'); +}); diff --git a/srcs/phpmyadmin/js/database/query_generator.js b/srcs/phpmyadmin/js/database/query_generator.js new file mode 100644 index 0000000..854686c --- /dev/null +++ b/srcs/phpmyadmin/js/database/query_generator.js @@ -0,0 +1,131 @@ +/* vim: set expandtab sw=4 ts=4 sts=4: */ +/** + * @fileoverview function used in QBE for DB + * @name Database Operations + * + * @requires jQuery + * @requires jQueryUI + * @requires js/functions.js + * + */ + +/* global sprintf */ // js/vendor/sprintf.js + +function getFormatsText () { + return { + '=': ' = \'%s\'', + '>': ' > \'%s\'', + '>=': ' >= \'%s\'', + '<': ' < \'%s\'', + '<=': ' <= \'%s\'', + '!=': ' != \'%s\'', + 'LIKE': ' LIKE \'%s\'', + 'LIKE %...%': ' LIKE \'%%%s%%\'', + 'NOT LIKE': ' NOT LIKE \'%s\'', + 'BETWEEN': ' BETWEEN \'%s\'', + 'NOT BETWEEN': ' NOT BETWEEN \'%s\'', + 'IS NULL': ' \'%s\' IS NULL', + 'IS NOT NULL': ' \'%s\' IS NOT NULL', + 'REGEXP': ' REGEXP \'%s\'', + 'REGEXP ^...$': ' REGEXP \'^%s$\'', + 'NOT REGEXP': ' NOT REGEXP \'%s\'' + }; +} + +function generateCondition (criteriaDiv, table) { + var query = '`' + Functions.escapeBacktick(table.val()) + '`.'; + query += '`' + Functions.escapeBacktick(table.siblings('.columnNameSelect').first().val()) + '`'; + if (criteriaDiv.find('.criteria_rhs').first().val() === 'text') { + var formatsText = getFormatsText(); + query += sprintf(formatsText[criteriaDiv.find('.criteria_op').first().val()], Functions.escapeSingleQuote(criteriaDiv.find('.rhs_text_val').first().val())); + } else { + query += ' ' + criteriaDiv.find('.criteria_op').first().val(); + query += ' `' + Functions.escapeBacktick(criteriaDiv.find('.tableNameSelect').first().val()) + '`.'; + query += '`' + Functions.escapeBacktick(criteriaDiv.find('.columnNameSelect').first().val()) + '`'; + } + return query; +} + +// eslint-disable-next-line no-unused-vars +function generateWhereBlock () { + var count = 0; + var query = ''; + $('.tableNameSelect').each(function () { + var criteriaDiv = $(this).siblings('.slide-wrapper').first(); + var useCriteria = $(this).siblings('.criteria_col').first(); + if ($(this).val() !== '' && useCriteria.prop('checked')) { + if (count > 0) { + criteriaDiv.find('input.logical_op').each(function () { + if ($(this).prop('checked')) { + query += ' ' + $(this).val() + ' '; + } + }); + } + query += generateCondition(criteriaDiv, $(this)); + count++; + } + }); + return query; +} + +function generateJoin (newTable, tableAliases, fk) { + var query = ''; + query += ' \n\tLEFT JOIN ' + '`' + Functions.escapeBacktick(newTable) + '`'; + if (tableAliases[fk.TABLE_NAME][0] !== '') { + query += ' AS `' + Functions.escapeBacktick(tableAliases[newTable][0]) + '`'; + query += ' ON `' + Functions.escapeBacktick(tableAliases[fk.TABLE_NAME][0]) + '`'; + } else { + query += ' ON `' + Functions.escapeBacktick(fk.TABLE_NAME) + '`'; + } + query += '.`' + fk.COLUMN_NAME + '`'; + if (tableAliases[fk.REFERENCED_TABLE_NAME][0] !== '') { + query += ' = `' + Functions.escapeBacktick(tableAliases[fk.REFERENCED_TABLE_NAME][0]) + '`'; + } else { + query += ' = `' + Functions.escapeBacktick(fk.REFERENCED_TABLE_NAME) + '`'; + } + query += '.`' + fk.REFERENCED_COLUMN_NAME + '`'; + return query; +} + +function existReference (table, fk, usedTables) { + var isReferredBy = fk.TABLE_NAME === table && usedTables.includes(fk.REFERENCED_TABLE_NAME); + var isReferencedBy = fk.REFERENCED_TABLE_NAME === table && usedTables.includes(fk.TABLE_NAME); + return isReferredBy || isReferencedBy; +} + +function tryJoinTable (table, tableAliases, usedTables, foreignKeys) { + for (var i = 0; i < foreignKeys.length; i++) { + var fk = foreignKeys[i]; + if (existReference(table, fk, usedTables)) { + return generateJoin(table, tableAliases, fk); + } + } + return ''; +} + +function appendTable (table, tableAliases, usedTables, foreignKeys) { + var query = tryJoinTable (table, tableAliases, usedTables, foreignKeys); + if (query === '') { + if (usedTables.length > 0) { + query += '\n\t, '; + } + query += '`' + Functions.escapeBacktick(table) + '`'; + if (tableAliases[table][0] !== '') { + query += ' AS `' + Functions.escapeBacktick(tableAliases[table][0]) + '`'; + } + } + usedTables.push(table); + return query; +} + +// eslint-disable-next-line no-unused-vars +function generateFromBlock (tableAliases, foreignKeys) { + var usedTables = []; + var query = ''; + for (var table in tableAliases) { + if (tableAliases.hasOwnProperty(table)) { + query += appendTable(table, tableAliases, usedTables, foreignKeys); + } + } + return query; +} diff --git a/srcs/phpmyadmin/js/database/search.js b/srcs/phpmyadmin/js/database/search.js new file mode 100644 index 0000000..19e64e4 --- /dev/null +++ b/srcs/phpmyadmin/js/database/search.js @@ -0,0 +1,248 @@ +/* vim: set expandtab sw=4 ts=4 sts=4: */ +/** + * JavaScript functions used on Database Search page + * + * @requires jQuery + * @requires js/functions.js + * + * @package PhpMyAdmin + */ + +/* global makeGrid */ // js/makegrid.js + +/** + * AJAX script for the Database Search page. + * + * Actions ajaxified here: + * Retrieve result of SQL query + */ + +/** + * Unbind all event handlers before tear |
