diff options
| author | Charles <sircharlesaze@gmail.com> | 2020-01-09 10:55:03 +0100 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2020-01-09 13:09:38 +0100 |
| commit | 04d6d5ca99ebfd1cebb8ce06618fb3811fc1a8aa (patch) | |
| tree | 5c691241355c943a3c68ddb06b8cf8c60aa11319 /srcs/phpmyadmin/js/database | |
| parent | 7e0d85db834d6351ed85d01e5126ac31dc510b86 (diff) | |
| download | ft_server-04d6d5ca99ebfd1cebb8ce06618fb3811fc1a8aa.tar.gz ft_server-04d6d5ca99ebfd1cebb8ce06618fb3811fc1a8aa.tar.bz2 ft_server-04d6d5ca99ebfd1cebb8ce06618fb3811fc1a8aa.zip | |
phpmyadmin working
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 tearing down a page + */ +AJAX.registerTeardown('database/search.js', function () { + $('a.browse_results').off('click'); + $('a.delete_results').off('click'); + $('#buttonGo').off('click'); + $('#togglesearchresultlink').off('click'); + $('#togglequerybox').off('click'); + $('#togglesearchformlink').off('click'); + $(document).off('submit', '#db_search_form.ajax'); +}); + +AJAX.registerOnload('database/search.js', function () { + /** Hide the table link in the initial search result */ + var icon = Functions.getImage('s_tbl', '', { 'id': 'table-image' }).toString(); + $('#table-info').prepend(icon).hide(); + + /** Hide the browse and deleted results in the new search criteria */ + $('#buttonGo').on('click', function () { + $('#table-info').hide(); + $('#browse-results').hide(); + $('#sqlqueryform').hide(); + $('#togglequerybox').hide(); + }); + /** + * Prepare a div containing a link for toggle the search results + */ + $('#togglesearchresultsdiv') + /** don't show it until we have results on-screen */ + .hide(); + + /** + * Changing the displayed text according to + * the hide/show criteria in search result forms + */ + $('#togglesearchresultlink') + .html(Messages.strHideSearchResults) + .on('click', function () { + var $link = $(this); + $('#searchresults').slideToggle(); + if ($link.text() === Messages.strHideSearchResults) { + $link.text(Messages.strShowSearchResults); + } else { + $link.text(Messages.strHideSearchResults); + } + /** avoid default click action */ + return false; + }); + + /** + * Prepare a div containing a link for toggle the search form, + * otherwise it's incorrectly displayed after a couple of clicks + */ + $('#togglesearchformdiv') + .hide(); // don't show it until we have results on-screen + + /** + * Changing the displayed text according to + * the hide/show criteria in search form + */ + $('#togglequerybox') + .hide() + .on('click', function () { + var $link = $(this); + $('#sqlqueryform').slideToggle('medium'); + if ($link.text() === Messages.strHideQueryBox) { + $link.text(Messages.strShowQueryBox); + } else { + $link.text(Messages.strHideQueryBox); + } + /** avoid default click action */ + return false; + }); + + /** don't show it until we have results on-screen */ + + /** + * Changing the displayed text according to + * the hide/show criteria in search criteria form + */ + $('#togglesearchformlink') + .html(Messages.strShowSearchCriteria) + .on('click', function () { + var $link = $(this); + $('#db_search_form').slideToggle(); + if ($link.text() === Messages.strHideSearchCriteria) { + $link.text(Messages.strShowSearchCriteria); + } else { + $link.text(Messages.strHideSearchCriteria); + } + /** avoid default click action */ + return false; + }); + + /* + * Ajax Event handler for retrieving the results from a table + */ + $(document).on('click', 'a.browse_results', function (e) { + e.preventDefault(); + /** Hides the results shown by the delete criteria */ + var $msg = Functions.ajaxShowMessage(Messages.strBrowsing, false); + $('#sqlqueryform').hide(); + $('#togglequerybox').hide(); + /** Load the browse results to the page */ + $('#table-info').show(); + var tableName = $(this).data('table-name'); + $('#table-link').attr({ 'href' : $(this).attr('href') }).text(tableName); + + var url = $(this).attr('href') + '#searchresults'; + var browseSql = $(this).data('browse-sql'); + var params = { + 'ajax_request': true, + 'is_js_confirmed': true, + 'sql_query' : browseSql + }; + $.post(url, params, function (data) { + if (typeof data !== 'undefined' && data.success) { + $('#browse-results').html(data.message); + Functions.ajaxRemoveMessage($msg); + $('.table_results').each(function () { + makeGrid(this, true, true, true, true); + }); + $('#browse-results').show(); + Functions.highlightSql($('#browse-results')); + $('html, body') + .animate({ + scrollTop: $('#browse-results').offset().top + }, 1000); + } else { + Functions.ajaxShowMessage(data.error, false); + } + }); + }); + + /* + * Ajax Event handler for deleting the results from a table + */ + $(document).on('click', 'a.delete_results', function (e) { + e.preventDefault(); + /** Hides the results shown by the browse criteria */ + $('#table-info').hide(); + $('#sqlqueryform').hide(); + $('#togglequerybox').hide(); + /** Conformation message for deletion */ + var msg = Functions.sprintf( + Messages.strConfirmDeleteResults, + $(this).data('table-name') + ); + if (confirm(msg)) { + var $msg = Functions.ajaxShowMessage(Messages.strDeleting, false); + /** Load the deleted option to the page*/ + $('#sqlqueryform').html(''); + var params = { + 'ajax_request': true, + 'is_js_confirmed': true, + 'sql_query': $(this).data('delete-sql') + }; + var url = $(this).attr('href'); + + $.post(url, params, function (data) { + if (typeof data === 'undefined' || !data.success) { + Functions.ajaxShowMessage(data.error, false); + return; + } + + $('#sqlqueryform').html(data.sql_query); + /** Refresh the search results after the deletion */ + document.getElementById('buttonGo').trigger('click'); + $('#togglequerybox').html(Messages.strHideQueryBox); + /** Show the results of the deletion option */ + $('#browse-results').hide(); + $('#sqlqueryform').show(); + $('#togglequerybox').show(); + $('html, body') + .animate({ + scrollTop: $('#browse-results').offset().top + }, 1000); + Functions.ajaxRemoveMessage($msg); + }); + } + }); + + /** + * Ajax Event handler for retrieving the result of an SQL Query + */ + $(document).on('submit', '#db_search_form.ajax', function (event) { + event.preventDefault(); + + var $msgbox = Functions.ajaxShowMessage(Messages.strSearching, false); + // jQuery object to reuse + var $form = $(this); + + Functions.prepareForAjaxRequest($form); + + var url = $form.serialize() + CommonParams.get('arg_separator') + 'submit_search=' + $('#buttonGo').val(); + $.post($form.attr('action'), url, function (data) { + if (typeof data !== 'undefined' && data.success === true) { + // found results + $('#searchresults').html(data.message); + + $('#togglesearchresultlink') + // always start with the Show message + .text(Messages.strHideSearchResults); + $('#togglesearchresultsdiv') + // now it's time to show the div containing the link + .show(); + $('#searchresults').show(); + + + $('#db_search_form') + // workaround for Chrome problem (bug #3168569) + .slideToggle() + .hide(); + $('#togglesearchformlink') + // always start with the Show message + .text(Messages.strShowSearchCriteria); + $('#togglesearchformdiv') + // now it's time to show the div containing the link + .show(); + } else { + // error message (zero rows) + $('#searchresults').html(data.error).show(); + } + + Functions.ajaxRemoveMessage($msgbox); + }); + }); +}); // end $() diff --git a/srcs/phpmyadmin/js/database/structure.js b/srcs/phpmyadmin/js/database/structure.js new file mode 100644 index 0000000..bc4c808 --- /dev/null +++ b/srcs/phpmyadmin/js/database/structure.js @@ -0,0 +1,429 @@ +/* vim: set expandtab sw=4 ts=4 sts=4: */ +/** + * @fileoverview functions used on the database structure page + * @name Database Structure + * + * @requires jQuery + * @requires jQueryUI + * @required js/functions.js + */ + +var DatabaseStructure = {}; + +/** + * AJAX scripts for db_structure.php + * + * Actions ajaxified here: + * Drop Database + * Truncate Table + * Drop Table + * + */ + +/** + * Unbind all event handlers before tearing down a page + */ +AJAX.registerTeardown('database/structure.js', function () { + $(document).off('click', 'a.truncate_table_anchor.ajax'); + $(document).off('click', 'a.drop_table_anchor.ajax'); + $(document).off('click', '#real_end_input'); + $(document).off('click', 'a.favorite_table_anchor.ajax'); + $(document).off('click', '#printView'); + $('a.real_row_count').off('click'); + $('a.row_count_sum').off('click'); + $('select[name=submit_mult]').off('change'); +}); + +/** + * Adjust number of rows and total size in the summary + * when truncating, creating, dropping or inserting into a table + */ +DatabaseStructure.adjustTotals = function () { + var byteUnits = [ + Messages.strB, + Messages.strKiB, + Messages.strMiB, + Messages.strGiB, + Messages.strTiB, + Messages.strPiB, + Messages.strEiB + ]; + /** + * @var $allTr jQuery object that references all the rows in the list of tables + */ + var $allTr = $('#tablesForm').find('table.data tbody:first tr'); + // New summary values for the table + var tableSum = $allTr.length; + var rowsSum = 0; + var sizeSum = 0; + var overheadSum = 0; + var rowSumApproximated = false; + + $allTr.each(function () { + var $this = $(this); + var i; + var tmpVal; + // Get the number of rows for this SQL table + var strRows = $this.find('.tbl_rows').text(); + // If the value is approximated + if (strRows.indexOf('~') === 0) { + rowSumApproximated = true; + // The approximated value contains a preceding ~ (Eg 100 --> ~100) + strRows = strRows.substring(1, strRows.length); + } + strRows = strRows.replace(/[,.]/g, ''); + var intRow = parseInt(strRows, 10); + if (! isNaN(intRow)) { + rowsSum += intRow; + } + // Extract the size and overhead + var valSize = 0; + var valOverhead = 0; + var strSize = $.trim($this.find('.tbl_size span:not(.unit)').text()); + var strSizeUnit = $.trim($this.find('.tbl_size span.unit').text()); + var strOverhead = $.trim($this.find('.tbl_overhead span:not(.unit)').text()); + var strOverheadUnit = $.trim($this.find('.tbl_overhead span.unit').text()); + // Given a value and a unit, such as 100 and KiB, for the table size + // and overhead calculate their numeric values in bytes, such as 102400 + for (i = 0; i < byteUnits.length; i++) { + if (strSizeUnit === byteUnits[i]) { + tmpVal = parseFloat(strSize); + valSize = tmpVal * Math.pow(1024, i); + break; + } + } + for (i = 0; i < byteUnits.length; i++) { + if (strOverheadUnit === byteUnits[i]) { + tmpVal = parseFloat(strOverhead); + valOverhead = tmpVal * Math.pow(1024, i); + break; + } + } + sizeSum += valSize; + overheadSum += valOverhead; + }); + // Add some commas for readability: + // 1000000 becomes 1,000,000 + var strRowSum = rowsSum + ''; + var regex = /(\d+)(\d{3})/; + while (regex.test(strRowSum)) { + strRowSum = strRowSum.replace(regex, '$1' + ',' + '$2'); + } + // If approximated total value add ~ in front + if (rowSumApproximated) { + strRowSum = '~' + strRowSum; + } + // Calculate the magnitude for the size and overhead values + var sizeMagnitude = 0; + var overheadMagnitude = 0; + while (sizeSum >= 1024) { + sizeSum /= 1024; + sizeMagnitude++; + } + while (overheadSum >= 1024) { + overheadSum /= 1024; + overheadMagnitude++; + } + + sizeSum = Math.round(sizeSum * 10) / 10; + overheadSum = Math.round(overheadSum * 10) / 10; + + // Update summary with new data + var $summary = $('#tbl_summary_row'); + $summary.find('.tbl_num').text(Functions.sprintf(Messages.strNTables, tableSum)); + if (rowSumApproximated) { + $summary.find('.row_count_sum').text(strRowSum); + } else { + $summary.find('.tbl_rows').text(strRowSum); + } + $summary.find('.tbl_size').text(sizeSum + ' ' + byteUnits[sizeMagnitude]); + $summary.find('.tbl_overhead').text(overheadSum + ' ' + byteUnits[overheadMagnitude]); +}; + +/** + * Gets the real row count for a table or DB. + * @param object $target Target for appending the real count value. + */ +DatabaseStructure.fetchRealRowCount = function ($target) { + var $throbber = $('#pma_navigation').find('.throbber') + .first() + .clone() + .css({ visibility: 'visible', display: 'inline-block' }) + .on('click', false); + $target.html($throbber); + $.ajax({ + type: 'GET', + url: $target.attr('href'), + cache: false, + dataType: 'json', + success: function (response) { + if (response.success) { + // If to update all row counts for a DB. + if (response.real_row_count_all) { + $.each(JSON.parse(response.real_row_count_all), + function (index, table) { + // Update each table row count. + $('table.data td[data-table*="' + table.table + '"]') + .text(table.row_count); + } + ); + } + // If to update a particular table's row count. + if (response.real_row_count) { + // Append the parent cell with real row count. + $target.parent().text(response.real_row_count); + } + // Adjust the 'Sum' displayed at the bottom. + DatabaseStructure.adjustTotals(); + } else { + Functions.ajaxShowMessage(Messages.strErrorRealRowCount); + } + }, + error: function () { + Functions.ajaxShowMessage(Messages.strErrorRealRowCount); + } + }); +}; + +AJAX.registerOnload('database/structure.js', function () { +/** + * function to open the confirmation dialog for making table consistent with central list + * + * @param string msg message text to be displayed to user + * @param function success function to be called on success + * + */ + var jqConfirm = function (msg, success) { + var dialogObj = $('<div class=\'hide\'>' + msg + '</div>'); + $('body').append(dialogObj); + var buttonOptions = {}; + buttonOptions[Messages.strContinue] = function () { + success(); + $(this).dialog('close'); + }; + buttonOptions[Messages.strCancel] = function () { + $(this).dialog('close'); + $('#tablesForm')[0].reset(); + }; + $(dialogObj).dialog({ + resizable: false, + modal: true, + title: Messages.confirmTitle, + buttons: buttonOptions + }); + }; + + /** + * Event handler on select of "Make consistent with central list" + */ + $('select[name=submit_mult]').on('change', function (event) { + if ($(this).val() === 'make_consistent_with_central_list') { + event.preventDefault(); + event.stopPropagation(); + jqConfirm( + Messages.makeConsistentMessage, function () { + $('#tablesForm').trigger('submit'); + } + ); + return false; + } else if ($(this).val() === 'copy_tbl' || $(this).val() === 'add_prefix_tbl' || $(this).val() === 'replace_prefix_tbl' || $(this).val() === 'copy_tbl_change_prefix') { + event.preventDefault(); + event.stopPropagation(); + if ($('input[name="selected_tbl[]"]:checked').length === 0) { + return false; + } + var formData = $('#tablesForm').serialize(); + var modalTitle = ''; + if ($(this).val() === 'copy_tbl') { + modalTitle = Messages.strCopyTablesTo; + } else if ($(this).val() === 'add_prefix_tbl') { + modalTitle = Messages.strAddPrefix; + } else if ($(this).val() === 'replace_prefix_tbl') { + modalTitle = Messages.strReplacePrefix; + } else if ($(this).val() === 'copy_tbl_change_prefix') { + modalTitle = Messages.strCopyPrefix; + } + $.ajax({ + type: 'POST', + url: 'db_structure.php', + dataType: 'html', + data: formData + + }).done(function (data) { + var dialogObj = $('<div class=\'hide\'>' + data + '</div>'); + $('body').append(dialogObj); + var buttonOptions = {}; + buttonOptions[Messages.strContinue] = function () { + $('#ajax_form').trigger('submit'); + $(this).dialog('close'); + }; + buttonOptions[Messages.strCancel] = function () { + $(this).dialog('close'); + $('#tablesForm')[0].reset(); + }; + $(dialogObj).dialog({ + minWidth: 500, + resizable: false, + modal: true, + title: modalTitle, + buttons: buttonOptions + }); + }); + } else { + $('#tablesForm').trigger('submit'); + } + }); + + /** + * Ajax Event handler for 'Truncate Table' + */ + $(document).on('click', 'a.truncate_table_anchor.ajax', function (event) { + event.preventDefault(); + + /** + * @var $this_anchor Object referring to the anchor clicked + */ + var $thisAnchor = $(this); + + // extract current table name and build the question string + /** + * @var curr_table_name String containing the name of the table to be truncated + */ + var currTableName = $thisAnchor.parents('tr').children('th').children('a').text(); + /** + * @var question String containing the question to be asked for confirmation + */ + var question = Messages.strTruncateTableStrongWarning + ' ' + + Functions.sprintf(Messages.strDoYouReally, 'TRUNCATE `' + Functions.escapeHtml(currTableName) + '`') + + Functions.getForeignKeyCheckboxLoader(); + + $thisAnchor.confirm(question, $thisAnchor.attr('href'), function (url) { + Functions.ajaxShowMessage(Messages.strProcessingRequest); + + var params = Functions.getJsConfirmCommonParam(this, $thisAnchor.getPostData()); + + $.post(url, params, function (data) { + if (typeof data !== 'undefined' && data.success === true) { + Functions.ajaxShowMessage(data.message); + // Adjust table statistics + var $tr = $thisAnchor.closest('tr'); + $tr.find('.tbl_rows').text('0'); + $tr.find('.tbl_size, .tbl_overhead').text('-'); + // Fetch inner span of this anchor + // and replace the icon with its disabled version + var span = $thisAnchor.html().replace(/b_empty/, 'bd_empty'); + // To disable further attempts to truncate the table, + // replace the a element with its inner span (modified) + $thisAnchor + .replaceWith(span) + .removeClass('truncate_table_anchor'); + DatabaseStructure.adjustTotals(); + } else { + Functions.ajaxShowMessage(Messages.strErrorProcessingRequest + ' : ' + data.error, false); + } + }); // end $.post() + }, Functions.loadForeignKeyCheckbox); + }); // end of Truncate Table Ajax action + + /** + * Ajax Event handler for 'Drop Table' or 'Drop View' + */ + $(document).on('click', 'a.drop_table_anchor.ajax', function (event) { + event.preventDefault(); + + var $thisAnchor = $(this); + + // extract current table name and build the question string + /** + * @var $curr_row Object containing reference to the current row + */ + var $currRow = $thisAnchor.parents('tr'); + /** + * @var curr_table_name String containing the name of the table to be truncated + */ + var currTableName = $currRow.children('th').children('a').text(); + /** + * @var is_view Boolean telling if we have a view + */ + var isView = $currRow.hasClass('is_view') || $thisAnchor.hasClass('view'); + /** + * @var question String containing the question to be asked for confirmation + */ + var question; + if (! isView) { + question = Messages.strDropTableStrongWarning + ' ' + + Functions.sprintf(Messages.strDoYouReally, 'DROP TABLE `' + Functions.escapeHtml(currTableName) + '`'); + } else { + question = + Functions.sprintf(Messages.strDoYouReally, 'DROP VIEW `' + Functions.escapeHtml(currTableName) + '`'); + } + question += Functions.getForeignKeyCheckboxLoader(); + + $thisAnchor.confirm(question, $thisAnchor.attr('href'), function (url) { + var $msg = Functions.ajaxShowMessage(Messages.strProcessingRequest); + + var params = Functions.getJsConfirmCommonParam(this, $thisAnchor.getPostData()); + + $.post(url, params, function (data) { + if (typeof data !== 'undefined' && data.success === true) { + Functions.ajaxShowMessage(data.message); + $currRow.hide('medium').remove(); + DatabaseStructure.adjustTotals(); + Navigation.reload(); + Functions.ajaxRemoveMessage($msg); + } else { + Functions.ajaxShowMessage(Messages.strErrorProcessingRequest + ' : ' + data.error, false); + } + }); // end $.post() + }, Functions.loadForeignKeyCheckbox); + }); // end of Drop Table Ajax action + + /** + * Attach Event Handler for 'Print' link + */ + $(document).on('click', '#printView', function (event) { + event.preventDefault(); + + // Take to preview mode + Functions.printPreview(); + }); // end of Print View action + + // Calculate Real End for InnoDB + /** + * Ajax Event handler for calculating the real end for a InnoDB table + * + */ + $(document).on('click', '#real_end_input', function (event) { + event.preventDefault(); + + /** + * @var question String containing the question to be asked for confirmation + */ + var question = Messages.strOperationTakesLongTime; + + $(this).confirm(question, '', function () { + return true; + }); + return false; + }); // end Calculate Real End for InnoDB + + // Add tooltip to favorite icons. + $('.favorite_table_anchor').each(function () { + Functions.tooltip( + $(this), + 'a', + $(this).attr('title') + ); + }); + + // Get real row count via Ajax. + $('a.real_row_count').on('click', function (event) { + event.preventDefault(); + DatabaseStructure.fetchRealRowCount($(this)); + }); + // Get all real row count. + $('a.row_count_sum').on('click', function (event) { + event.preventDefault(); + DatabaseStructure.fetchRealRowCount($(this)); + }); +}); diff --git a/srcs/phpmyadmin/js/database/tracking.js b/srcs/phpmyadmin/js/database/tracking.js new file mode 100644 index 0000000..2976323 --- /dev/null +++ b/srcs/phpmyadmin/js/database/tracking.js @@ -0,0 +1,93 @@ +/** + * Unbind all event handlers before tearing down the page + */ +AJAX.registerTeardown('database/tracking.js', function () { + $('body').off('click', '#trackedForm.ajax button[name="submit_mult"], #trackedForm.ajax input[name="submit_mult"]'); + $('body').off('click', '#untrackedForm.ajax button[name="submit_mult"], #untrackedForm.ajax input[name="submit_mult"]'); + $('body').off('click', 'a.delete_tracking_anchor.ajax'); +}); + +/** + * Bind event handlers + */ +AJAX.registerOnload('database/tracking.js', function () { + var $versions = $('#versions'); + $versions.find('tr:first th').append($('<div class="sorticon"></div>')); + $versions.tablesorter({ + sortList: [[1, 0]], + headers: { + 0: { sorter: false }, + 2: { sorter: 'integer' }, + 5: { sorter: false }, + 6: { sorter: false }, + 7: { sorter: false } + } + }); + + var $noVersions = $('#noversions'); + $noVersions.find('tr:first th').append($('<div class="sorticon"></div>')); + $noVersions.tablesorter({ + sortList: [[1, 0]], + headers: { + 0: { sorter: false }, + 2: { sorter: false } + } + }); + + var $body = $('body'); + + /** + * Handles multi submit for tracked tables + */ + $body.on('click', '#trackedForm.ajax button[name="submit_mult"], #trackedForm.ajax input[name="submit_mult"]', function (e) { + e.preventDefault(); + var $button = $(this); + var $form = $button.parent('form'); + var argsep = CommonParams.get('arg_separator'); + var submitData = $form.serialize() + argsep + 'ajax_request=true' + argsep + 'ajax_page_request=true' + argsep + 'submit_mult=' + $button.val(); + + if ($button.val() === 'delete_tracking') { + var question = Messages.strDeleteTrackingDataMultiple; + $button.confirm(question, $form.attr('action'), function (url) { + Functions.ajaxShowMessage(Messages.strDeletingTrackingData); + AJAX.source = $form; + $.post(url, submitData, AJAX.responseHandler); + }); + } else { + Functions.ajaxShowMessage(); + AJAX.source = $form; + $.post($form.attr('action'), submitData, AJAX.responseHandler); + } + }); + + /** + * Handles multi submit for untracked tables + */ + $body.on('click', '#untrackedForm.ajax button[name="submit_mult"], #untrackedForm.ajax input[name="submit_mult"]', function (e) { + e.preventDefault(); + var $button = $(this); + var $form = $button.parent('form'); + var argsep = CommonParams.get('arg_separator'); + var submitData = $form.serialize() + argsep + 'ajax_request=true' + argsep + 'ajax_page_request=true' + argsep + 'submit_mult=' + $button.val(); + Functions.ajaxShowMessage(); + AJAX.source = $form; + $.post($form.attr('action'), submitData, AJAX.responseHandler); + }); + + /** + * Ajax Event handler for 'Delete tracking' + */ + $body.on('click', 'a.delete_tracking_anchor.ajax', function (e) { + e.preventDefault(); + var $anchor = $(this); + var question = Messages.strDeleteTrackingData; + $anchor.confirm(question, $anchor.attr('href'), function (url) { + Functions.ajaxShowMessage(Messages.strDeletingTrackingData); + AJAX.source = $anchor; + var argSep = CommonParams.get('arg_separator'); + var params = Functions.getJsConfirmCommonParam(this, $anchor.getPostData()); + params += argSep + 'ajax_page_request=1'; + $.post(url, params, AJAX.responseHandler); + }); + }); +}); |
