1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036 |
- /* vim: set expandtab sw=4 ts=4 sts=4: */
- /**
- * @fileoverview functions used wherever an sql query form is used
- *
- * @requires jQuery
- * @requires js/functions.js
- *
- */
- var $data_a;
- var prevScrollX = 0;
- /**
- * decode a string URL_encoded
- *
- * @param string str
- * @return string the URL-decoded string
- */
- function PMA_urldecode (str) {
- if (typeof str !== 'undefined') {
- return decodeURIComponent(str.replace(/\+/g, '%20'));
- }
- }
- /**
- * endecode a string URL_decoded
- *
- * @param string str
- * @return string the URL-encoded string
- */
- function PMA_urlencode (str) {
- if (typeof str !== 'undefined') {
- return encodeURIComponent(str).replace(/\%20/g, '+');
- }
- }
- /**
- * Saves SQL query in local storage or cookie
- *
- * @param string SQL query
- * @return void
- */
- function PMA_autosaveSQL (query) {
- if (query) {
- if (isStorageSupported('localStorage')) {
- window.localStorage.auto_saved_sql = query;
- } else {
- Cookies.set('auto_saved_sql', query);
- }
- }
- }
- /**
- * Saves SQL query with sort in local storage or cookie
- *
- * @param string SQL query
- * @return void
- */
- function PMA_autosaveSQLSort (query) {
- if (query) {
- if (isStorageSupported('localStorage')) {
- window.localStorage.auto_saved_sql_sort = query;
- } else {
- Cookies.set('auto_saved_sql_sort', query);
- }
- }
- }
- /**
- * Clear saved SQL query with sort in local storage or cookie
- *
- * @return void
- */
- function PMA_clearAutoSavedSQLSort () {
- if (isStorageSupported('localStorage')) {
- window.localStorage.removeItem('auto_saved_sql_sort');
- } else {
- Cookies.set('auto_saved_sql_sort', '');
- }
- }
- /**
- * Get the field name for the current field. Required to construct the query
- * for grid editing
- *
- * @param $table_results enclosing results table
- * @param $this_field jQuery object that points to the current field's tr
- */
- function getFieldName ($table_results, $this_field) {
- var this_field_index = $this_field.index();
- // ltr or rtl direction does not impact how the DOM was generated
- // check if the action column in the left exist
- var left_action_exist = !$table_results.find('th:first').hasClass('draggable');
- // number of column span for checkbox and Actions
- var left_action_skip = left_action_exist ? $table_results.find('th:first').attr('colspan') - 1 : 0;
- // If this column was sorted, the text of the a element contains something
- // like <small>1</small> that is useful to indicate the order in case
- // of a sort on multiple columns; however, we dont want this as part
- // of the column name so we strip it ( .clone() to .end() )
- var field_name = $table_results
- .find('thead')
- .find('th:eq(' + (this_field_index - left_action_skip) + ') a')
- .clone() // clone the element
- .children() // select all the children
- .remove() // remove all of them
- .end() // go back to the selected element
- .text(); // grab the text
- // happens when just one row (headings contain no a)
- if (field_name === '') {
- var $heading = $table_results.find('thead').find('th:eq(' + (this_field_index - left_action_skip) + ')').children('span');
- // may contain column comment enclosed in a span - detach it temporarily to read the column name
- var $tempColComment = $heading.children().detach();
- field_name = $heading.text();
- // re-attach the column comment
- $heading.append($tempColComment);
- }
- field_name = $.trim(field_name);
- return field_name;
- }
- /**
- * Unbind all event handlers before tearing down a page
- */
- AJAX.registerTeardown('sql.js', function () {
- $(document).off('click', 'a.delete_row.ajax');
- $(document).off('submit', '.bookmarkQueryForm');
- $('input#bkm_label').off('input');
- $(document).off('makegrid', '.sqlqueryresults');
- $(document).off('stickycolumns', '.sqlqueryresults');
- $('#togglequerybox').off('click');
- $(document).off('click', '#button_submit_query');
- $(document).off('change', '#id_bookmark');
- $('input[name=\'bookmark_variable\']').off('keypress');
- $(document).off('submit', '#sqlqueryform.ajax');
- $(document).off('click', 'input[name=navig].ajax');
- $(document).off('submit', 'form[name=\'displayOptionsForm\'].ajax');
- $(document).off('mouseenter', 'th.column_heading.pointer');
- $(document).off('mouseleave', 'th.column_heading.pointer');
- $(document).off('click', 'th.column_heading.marker');
- $(window).off('scroll');
- $(document).off('keyup', '.filter_rows');
- $(document).off('click', '#printView');
- if (codemirror_editor) {
- codemirror_editor.off('change');
- } else {
- $('#sqlquery').off('input propertychange');
- }
- $('body').off('click', '.navigation .showAllRows');
- $('body').off('click', 'a.browse_foreign');
- $('body').off('click', '#simulate_dml');
- $('body').off('keyup', '#sqlqueryform');
- $('body').off('click', 'form[name="resultsForm"].ajax button[name="submit_mult"], form[name="resultsForm"].ajax input[name="submit_mult"]');
- });
- /**
- * @description <p>Ajax scripts for sql and browse pages</p>
- *
- * Actions ajaxified here:
- * <ul>
- * <li>Retrieve results of an SQL query</li>
- * <li>Paginate the results table</li>
- * <li>Sort the results table</li>
- * <li>Change table according to display options</li>
- * <li>Grid editing of data</li>
- * <li>Saving a bookmark</li>
- * </ul>
- *
- * @name document.ready
- * @memberOf jQuery
- */
- AJAX.registerOnload('sql.js', function () {
- $(function () {
- if (codemirror_editor) {
- codemirror_editor.on('change', function () {
- PMA_autosaveSQL(codemirror_editor.getValue());
- });
- } else {
- $('#sqlquery').on('input propertychange', function () {
- PMA_autosaveSQL($('#sqlquery').val());
- });
- var useLocalStorageValue = isStorageSupported('localStorage') && typeof window.localStorage.auto_saved_sql_sort !== 'undefined';
- // Save sql query with sort
- if ($('#RememberSorting') !== undefined && $('#RememberSorting').is(':checked')) {
- $('select[name="sql_query"]').on('change', function () {
- PMA_autosaveSQLSort($(this).val());
- });
- $('.sortlink').on('click', function () {
- PMA_clearAutoSavedSQLSort();
- });
- } else {
- PMA_clearAutoSavedSQLSort();
- }
- // If sql query with sort for current table is stored, change sort by key select value
- var sortStoredQuery = useLocalStorageValue ? window.localStorage.auto_saved_sql_sort : Cookies.get('auto_saved_sql_sort');
- if (typeof sortStoredQuery !== 'undefined' && sortStoredQuery !== $('select[name="sql_query"]').val() && $('select[name="sql_query"] option[value="' + sortStoredQuery + '"]').length !== 0) {
- $('select[name="sql_query"]').val(sortStoredQuery).change();
- }
- }
- });
- // Delete row from SQL results
- $(document).on('click', 'a.delete_row.ajax', function (e) {
- e.preventDefault();
- var question = PMA_sprintf(PMA_messages.strDoYouReally, escapeHtml($(this).closest('td').find('div').text()));
- var $link = $(this);
- $link.PMA_confirm(question, $link.attr('href'), function (url) {
- $msgbox = PMA_ajaxShowMessage();
- var argsep = PMA_commonParams.get('arg_separator');
- var params = 'ajax_request=1' + argsep + 'is_js_confirmed=1';
- var postData = $link.getPostData();
- if (postData) {
- params += argsep + postData;
- }
- $.post(url, params, function (data) {
- if (data.success) {
- PMA_ajaxShowMessage(data.message);
- $link.closest('tr').remove();
- } else {
- PMA_ajaxShowMessage(data.error, false);
- }
- });
- });
- });
- // Ajaxification for 'Bookmark this SQL query'
- $(document).on('submit', '.bookmarkQueryForm', function (e) {
- e.preventDefault();
- PMA_ajaxShowMessage();
- var argsep = PMA_commonParams.get('arg_separator');
- $.post($(this).attr('action'), 'ajax_request=1' + argsep + $(this).serialize(), function (data) {
- if (data.success) {
- PMA_ajaxShowMessage(data.message);
- } else {
- PMA_ajaxShowMessage(data.error, false);
- }
- });
- });
- /* Hides the bookmarkoptions checkboxes when the bookmark label is empty */
- $('input#bkm_label').on('input', function () {
- $('input#id_bkm_all_users, input#id_bkm_replace')
- .parent()
- .toggle($(this).val().length > 0);
- }).trigger('input');
- /**
- * Attach Event Handler for 'Copy to clipbpard
- */
- $(document).on('click', '#copyToClipBoard', function (event) {
- event.preventDefault();
- var textArea = document.createElement('textarea');
- //
- // *** This styling is an extra step which is likely not required. ***
- //
- // Why is it here? To ensure:
- // 1. the element is able to have focus and selection.
- // 2. if element was to flash render it has minimal visual impact.
- // 3. less flakyness with selection and copying which **might** occur if
- // the textarea element is not visible.
- //
- // The likelihood is the element won't even render, not even a flash,
- // so some of these are just precautions. However in IE the element
- // is visible whilst the popup box asking the user for permission for
- // the web page to copy to the clipboard.
- //
- // Place in top-left corner of screen regardless of scroll position.
- textArea.style.position = 'fixed';
- textArea.style.top = 0;
- textArea.style.left = 0;
- // Ensure it has a small width and height. Setting to 1px / 1em
- // doesn't work as this gives a negative w/h on some browsers.
- textArea.style.width = '2em';
- textArea.style.height = '2em';
- // We don't need padding, reducing the size if it does flash render.
- textArea.style.padding = 0;
- // Clean up any borders.
- textArea.style.border = 'none';
- textArea.style.outline = 'none';
- textArea.style.boxShadow = 'none';
- // Avoid flash of white box if rendered for any reason.
- textArea.style.background = 'transparent';
- textArea.value = '';
- $('#serverinfo a').each(function () {
- textArea.value += $(this).text().split(':')[1].trim() + '/';
- });
- textArea.value += '\t\t' + window.location.href;
- textArea.value += '\n';
- $('.success').each(function () {
- textArea.value += $(this).text() + '\n\n';
- });
- $('.sql pre').each(function () {
- textArea.value += $(this).text() + '\n\n';
- });
- $('.table_results .column_heading a').each(function () {
- // Don't copy ordering number text within <small> tag
- textArea.value += $(this).clone().find('small').remove().end().text() + '\t';
- });
- textArea.value += '\n';
- $('.table_results tbody tr').each(function () {
- $(this).find('.data span').each(function () {
- textArea.value += $(this).text() + '\t';
- });
- textArea.value += '\n';
- });
- document.body.appendChild(textArea);
- textArea.select();
- try {
- document.execCommand('copy');
- } catch (err) {
- alert('Sorry! Unable to copy');
- }
- document.body.removeChild(textArea);
- }); // end of Copy to Clipboard action
- /**
- * Attach Event Handler for 'Print' link
- */
- $(document).on('click', '#printView', function (event) {
- event.preventDefault();
- // Take to preview mode
- printPreview();
- }); // end of 'Print' action
- /**
- * Attach the {@link makegrid} function to a custom event, which will be
- * triggered manually everytime the table of results is reloaded
- * @memberOf jQuery
- */
- $(document).on('makegrid', '.sqlqueryresults', function () {
- $('.table_results').each(function () {
- PMA_makegrid(this);
- });
- });
- /*
- * Attach a custom event for sticky column headings which will be
- * triggered manually everytime the table of results is reloaded
- * @memberOf jQuery
- */
- $(document).on('stickycolumns', '.sqlqueryresults', function () {
- $('.sticky_columns').remove();
- $('.table_results').each(function () {
- var $table_results = $(this);
- // add sticky columns div
- var $stick_columns = initStickyColumns($table_results);
- rearrangeStickyColumns($stick_columns, $table_results);
- // adjust sticky columns on scroll
- $(window).on('scroll', function () {
- handleStickyColumns($stick_columns, $table_results);
- });
- });
- });
- /**
- * Append the "Show/Hide query box" message to the query input form
- *
- * @memberOf jQuery
- * @name appendToggleSpan
- */
- // do not add this link more than once
- if (! $('#sqlqueryform').find('a').is('#togglequerybox')) {
- $('<a id="togglequerybox"></a>')
- .html(PMA_messages.strHideQueryBox)
- .appendTo('#sqlqueryform')
- // initially hidden because at this point, nothing else
- // appears under the link
- .hide();
- // Attach the toggling of the query box visibility to a click
- $('#togglequerybox').bind('click', function () {
- var $link = $(this);
- $link.siblings().slideToggle('fast');
- if ($link.text() === PMA_messages.strHideQueryBox) {
- $link.text(PMA_messages.strShowQueryBox);
- // cheap trick to add a spacer between the menu tabs
- // and "Show query box"; feel free to improve!
- $('#togglequerybox_spacer').remove();
- $link.before('<br id="togglequerybox_spacer" />');
- } else {
- $link.text(PMA_messages.strHideQueryBox);
- }
- // avoid default click action
- return false;
- });
- }
- /**
- * Event handler for sqlqueryform.ajax button_submit_query
- *
- * @memberOf jQuery
- */
- $(document).on('click', '#button_submit_query', function (event) {
- $('.success,.error').hide();
- // hide already existing error or success message
- var $form = $(this).closest('form');
- // the Go button related to query submission was clicked,
- // instead of the one related to Bookmarks, so empty the
- // id_bookmark selector to avoid misinterpretation in
- // import.php about what needs to be done
- $form.find('select[name=id_bookmark]').val('');
- // let normal event propagation happen
- });
- /**
- * Event handler to show appropiate number of variable boxes
- * based on the bookmarked query
- */
- $(document).on('change', '#id_bookmark', function (event) {
- var varCount = $(this).find('option:selected').data('varcount');
- if (typeof varCount === 'undefined') {
- varCount = 0;
- }
- var $varDiv = $('#bookmark_variables');
- $varDiv.empty();
- for (var i = 1; i <= varCount; i++) {
- $varDiv.append($('<label for="bookmark_variable_' + i + '">' + PMA_sprintf(PMA_messages.strBookmarkVariable, i) + '</label>'));
- $varDiv.append($('<input type="text" size="10" name="bookmark_variable[' + i + ']" id="bookmark_variable_' + i + '"/>'));
- }
- if (varCount === 0) {
- $varDiv.parent('.formelement').hide();
- } else {
- $varDiv.parent('.formelement').show();
- }
- });
- /**
- * Event handler for hitting enter on sqlqueryform bookmark_variable
- * (the Variable textfield in Bookmarked SQL query section)
- *
- * @memberOf jQuery
- */
- $('input[name=bookmark_variable]').on('keypress', function (event) {
- // force the 'Enter Key' to implicitly click the #button_submit_bookmark
- var keycode = (event.keyCode ? event.keyCode : (event.which ? event.which : event.charCode));
- if (keycode === 13) { // keycode for enter key
- // When you press enter in the sqlqueryform, which
- // has 2 submit buttons, the default is to run the
- // #button_submit_query, because of the tabindex
- // attribute.
- // This submits #button_submit_bookmark instead,
- // because when you are in the Bookmarked SQL query
- // section and hit enter, you expect it to do the
- // same action as the Go button in that section.
- $('#button_submit_bookmark').click();
- return false;
- } else {
- return true;
- }
- });
- /**
- * Ajax Event handler for 'SQL Query Submit'
- *
- * @see PMA_ajaxShowMessage()
- * @memberOf jQuery
- * @name sqlqueryform_submit
- */
- $(document).on('submit', '#sqlqueryform.ajax', function (event) {
- event.preventDefault();
- var $form = $(this);
- if (codemirror_editor) {
- $form[0].elements.sql_query.value = codemirror_editor.getValue();
- }
- if (! checkSqlQuery($form[0])) {
- return false;
- }
- // remove any div containing a previous error message
- $('div.error').remove();
- var $msgbox = PMA_ajaxShowMessage();
- var $sqlqueryresultsouter = $('#sqlqueryresultsouter');
- PMA_prepareForAjaxRequest($form);
- var argsep = PMA_commonParams.get('arg_separator');
- $.post($form.attr('action'), $form.serialize() + argsep + 'ajax_page_request=true', function (data) {
- if (typeof data !== 'undefined' && data.success === true) {
- // success happens if the query returns rows or not
- // show a message that stays on screen
- if (typeof data.action_bookmark !== 'undefined') {
- // view only
- if ('1' === data.action_bookmark) {
- $('#sqlquery').text(data.sql_query);
- // send to codemirror if possible
- setQuery(data.sql_query);
- }
- // delete
- if ('2' === data.action_bookmark) {
- $('#id_bookmark option[value=\'' + data.id_bookmark + '\']').remove();
- // if there are no bookmarked queries now (only the empty option),
- // remove the bookmark section
- if ($('#id_bookmark option').length === 1) {
- $('#fieldsetBookmarkOptions').hide();
- $('#fieldsetBookmarkOptionsFooter').hide();
- }
- }
- }
- $sqlqueryresultsouter
- .show()
- .html(data.message);
- PMA_highlightSQL($sqlqueryresultsouter);
- if (data._menu) {
- if (history && history.pushState) {
- history.replaceState({
- menu : data._menu
- },
- null
- );
- AJAX.handleMenu.replace(data._menu);
- } else {
- PMA_MicroHistory.menus.replace(data._menu);
- PMA_MicroHistory.menus.add(data._menuHash, data._menu);
- }
- } else if (data._menuHash) {
- if (! (history && history.pushState)) {
- PMA_MicroHistory.menus.replace(PMA_MicroHistory.menus.get(data._menuHash));
- }
- }
- if (data._params) {
- PMA_commonParams.setAll(data._params);
- }
- if (typeof data.ajax_reload !== 'undefined') {
- if (data.ajax_reload.reload) {
- if (data.ajax_reload.table_name) {
- PMA_commonParams.set('table', data.ajax_reload.table_name);
- PMA_commonActions.refreshMain();
- } else {
- PMA_reloadNavigation();
- }
- }
- } else if (typeof data.reload !== 'undefined') {
- // this happens if a USE or DROP command was typed
- PMA_commonActions.setDb(data.db);
- var url;
- if (data.db) {
- if (data.table) {
- url = 'table_sql.php';
- } else {
- url = 'db_sql.php';
- }
- } else {
- url = 'server_sql.php';
- }
- PMA_commonActions.refreshMain(url, function () {
- $('#sqlqueryresultsouter')
- .show()
- .html(data.message);
- PMA_highlightSQL($('#sqlqueryresultsouter'));
- });
- }
- $('.sqlqueryresults').trigger('makegrid').trigger('stickycolumns');
- $('#togglequerybox').show();
- PMA_init_slider();
- if (typeof data.action_bookmark === 'undefined') {
- if ($('#sqlqueryform input[name="retain_query_box"]').is(':checked') !== true) {
- if ($('#togglequerybox').siblings(':visible').length > 0) {
- $('#togglequerybox').trigger('click');
- }
- }
- }
- } else if (typeof data !== 'undefined' && data.success === false) {
- // show an error message that stays on screen
- $sqlqueryresultsouter
- .show()
- .html(data.error);
- }
- PMA_ajaxRemoveMessage($msgbox);
- }); // end $.post()
- }); // end SQL Query submit
- /**
- * Ajax Event handler for the display options
- * @memberOf jQuery
- * @name displayOptionsForm_submit
- */
- $(document).on('submit', 'form[name=\'displayOptionsForm\'].ajax', function (event) {
- event.preventDefault();
- $form = $(this);
- var $msgbox = PMA_ajaxShowMessage();
- var argsep = PMA_commonParams.get('arg_separator');
- $.post($form.attr('action'), $form.serialize() + argsep + 'ajax_request=true', function (data) {
- PMA_ajaxRemoveMessage($msgbox);
- var $sqlqueryresults = $form.parents('.sqlqueryresults');
- $sqlqueryresults
- .html(data.message)
- .trigger('makegrid')
- .trigger('stickycolumns');
- PMA_init_slider();
- PMA_highlightSQL($sqlqueryresults);
- }); // end $.post()
- }); // end displayOptionsForm handler
- // Filter row handling. --STARTS--
- $(document).on('keyup', '.filter_rows', function () {
- var unique_id = $(this).data('for');
- var $target_table = $('.table_results[data-uniqueId=\'' + unique_id + '\']');
- var $header_cells = $target_table.find('th[data-column]');
- var target_columns = Array();
- // To handle colspan=4, in case of edit,copy etc options.
- var dummy_th = ($('.edit_row_anchor').length !== 0 ?
- '<th class="hide dummy_th"></th><th class="hide dummy_th"></th><th class="hide dummy_th"></th>'
- : '');
- // Selecting columns that will be considered for filtering and searching.
- $header_cells.each(function () {
- target_columns.push($.trim($(this).text()));
- });
- var phrase = $(this).val();
- // Set same value to both Filter rows fields.
- $('.filter_rows[data-for=\'' + unique_id + '\']').not(this).val(phrase);
- // Handle colspan.
- $target_table.find('thead > tr').prepend(dummy_th);
- $.uiTableFilter($target_table, phrase, target_columns);
- $target_table.find('th.dummy_th').remove();
- });
- // Filter row handling. --ENDS--
- // Prompt to confirm on Show All
- $('body').on('click', '.navigation .showAllRows', function (e) {
- e.preventDefault();
- var $form = $(this).parents('form');
- if (! $(this).is(':checked')) { // already showing all rows
- submitShowAllForm();
- } else {
- $form.PMA_confirm(PMA_messages.strShowAllRowsWarning, $form.attr('action'), function (url) {
- submitShowAllForm();
- });
- }
- function submitShowAllForm () {
- var argsep = PMA_commonParams.get('arg_separator');
- var submitData = $form.serialize() + argsep + 'ajax_request=true' + argsep + 'ajax_page_request=true';
- PMA_ajaxShowMessage();
- AJAX.source = $form;
- $.post($form.attr('action'), submitData, AJAX.responseHandler);
- }
- });
- $('body').on('keyup', '#sqlqueryform', function () {
- PMA_handleSimulateQueryButton();
- });
- /**
- * Ajax event handler for 'Simulate DML'.
- */
- $('body').on('click', '#simulate_dml', function () {
- var $form = $('#sqlqueryform');
- var query = '';
- var delimiter = $('#id_sql_delimiter').val();
- var db_name = $form.find('input[name="db"]').val();
- if (codemirror_editor) {
- query = codemirror_editor.getValue();
- } else {
- query = $('#sqlquery').val();
- }
- if (query.length === 0) {
- alert(PMA_messages.strFormEmpty);
- $('#sqlquery').focus();
- return false;
- }
- var $msgbox = PMA_ajaxShowMessage();
- $.ajax({
- type: 'POST',
- url: $form.attr('action'),
- data: {
- server: PMA_commonParams.get('server'),
- db: db_name,
- ajax_request: '1',
- simulate_dml: '1',
- sql_query: query,
- sql_delimiter: delimiter
- },
- success: function (response) {
- PMA_ajaxRemoveMessage($msgbox);
- if (response.success) {
- var dialog_content = '<div class="preview_sql">';
- if (response.sql_data) {
- var len = response.sql_data.length;
- for (var i = 0; i < len; i++) {
- dialog_content += '<strong>' + PMA_messages.strSQLQuery +
- '</strong>' + response.sql_data[i].sql_query +
- PMA_messages.strMatchedRows +
- ' <a href="' + response.sql_data[i].matched_rows_url +
- '">' + response.sql_data[i].matched_rows + '</a><br>';
- if (i < len - 1) {
- dialog_content += '<hr>';
- }
- }
- } else {
- dialog_content += response.message;
- }
- dialog_content += '</div>';
- var $dialog_content = $(dialog_content);
- var button_options = {};
- button_options[PMA_messages.strClose] = function () {
- $(this).dialog('close');
- };
- var $response_dialog = $('<div />').append($dialog_content).dialog({
- minWidth: 540,
- maxHeight: 400,
- modal: true,
- buttons: button_options,
- title: PMA_messages.strSimulateDML,
- open: function () {
- PMA_highlightSQL($(this));
- },
- close: function () {
- $(this).remove();
- }
- });
- } else {
- PMA_ajaxShowMessage(response.error);
- }
- },
- error: function (response) {
- PMA_ajaxShowMessage(PMA_messages.strErrorProcessingRequest);
- }
- });
- });
- /**
- * Handles multi submits of results browsing page such as edit, delete and export
- */
- $('body').on('click', 'form[name="resultsForm"].ajax button[name="submit_mult"], form[name="resultsForm"].ajax input[name="submit_mult"]', function (e) {
- e.preventDefault();
- var $button = $(this);
- var $form = $button.closest('form');
- var argsep = PMA_commonParams.get('arg_separator');
- var submitData = $form.serialize() + argsep + 'ajax_request=true' + argsep + 'ajax_page_request=true' + argsep + 'submit_mult=' + $button.val();
- PMA_ajaxShowMessage();
- AJAX.source = $form;
- $.post($form.attr('action'), submitData, AJAX.responseHandler);
- });
- }); // end $()
- /**
- * Starting from some th, change the class of all td under it.
- * If isAddClass is specified, it will be used to determine whether to add or remove the class.
- */
- function PMA_changeClassForColumn ($this_th, newclass, isAddClass) {
- // index 0 is the th containing the big T
- var th_index = $this_th.index();
- var has_big_t = $this_th.closest('tr').children(':first').hasClass('column_action');
- // .eq() is zero-based
- if (has_big_t) {
- th_index--;
- }
- var $table = $this_th.parents('.table_results');
- if (! $table.length) {
- $table = $this_th.parents('table').siblings('.table_results');
- }
- var $tds = $table.find('tbody tr').find('td.data:eq(' + th_index + ')');
- if (isAddClass === undefined) {
- $tds.toggleClass(newclass);
- } else {
- $tds.toggleClass(newclass, isAddClass);
- }
- }
- /**
- * Handles browse foreign values modal dialog
- *
- * @param object $this_a reference to the browse foreign value link
- */
- function browseForeignDialog ($this_a) {
- var formId = '#browse_foreign_form';
- var showAllId = '#foreign_showAll';
- var tableId = '#browse_foreign_table';
- var filterId = '#input_foreign_filter';
- var $dialog = null;
- var argSep = PMA_commonParams.get('arg_separator');
- var params = $this_a.getPostData();
- params += argSep + 'ajax_request=true';
- $.post($this_a.attr('href'), params, function (data) {
- // Creates browse foreign value dialog
- $dialog = $('<div>').append(data.message).dialog({
- title: PMA_messages.strBrowseForeignValues,
- width: Math.min($(window).width() - 100, 700),
- maxHeight: $(window).height() - 100,
- dialogClass: 'browse_foreign_modal',
- close: function (ev, ui) {
- // remove event handlers attached to elements related to dialog
- $(tableId).off('click', 'td a.foreign_value');
- $(formId).off('click', showAllId);
- $(formId).off('submit');
- // remove dialog itself
- $(this).remove();
- },
- modal: true
- });
- }).done(function () {
- var showAll = false;
- $(tableId).on('click', 'td a.foreign_value', function (e) {
- e.preventDefault();
- var $input = $this_a.prev('input[type=text]');
- // Check if input exists or get CEdit edit_box
- if ($input.length === 0) {
- $input = $this_a.closest('.edit_area').prev('.edit_box');
- }
- // Set selected value as input value
- $input.val($(this).data('key'));
- $dialog.dialog('close');
- });
- $(formId).on('click', showAllId, function () {
- showAll = true;
- });
- $(formId).on('submit', function (e) {
- e.preventDefault();
- // if filter value is not equal to old value
- // then reset page number to 1
- if ($(filterId).val() !== $(filterId).data('old')) {
- $(formId).find('select[name=pos]').val('0');
- }
- var postParams = $(this).serializeArray();
- // if showAll button was clicked to submit form then
- // add showAll button parameter to form
- if (showAll) {
- postParams.push({
- name: $(showAllId).attr('name'),
- value: $(showAllId).val()
- });
- }
- // updates values in dialog
- $.post($(this).attr('action') + '?ajax_request=1', postParams, function (data) {
- var $obj = $('<div>').html(data.message);
- $(formId).html($obj.find(formId).html());
- $(tableId).html($obj.find(tableId).html());
- });
- showAll = false;
- });
- });
- }
- AJAX.registerOnload('sql.js', function () {
- $('body').on('click', 'a.browse_foreign', function (e) {
- e.preventDefault();
- browseForeignDialog($(this));
- });
- /**
- * vertical column highlighting in horizontal mode when hovering over the column header
- */
- $(document).on('mouseenter', 'th.column_heading.pointer', function (e) {
- PMA_changeClassForColumn($(this), 'hover', true);
- });
- $(document).on('mouseleave', 'th.column_heading.pointer', function (e) {
- PMA_changeClassForColumn($(this), 'hover', false);
- });
- /**
- * vertical column marking in horizontal mode when clicking the column header
- */
- $(document).on('click', 'th.column_heading.marker', function () {
- PMA_changeClassForColumn($(this), 'marked');
- });
- /**
- * create resizable table
- */
- $('.sqlqueryresults').trigger('makegrid').trigger('stickycolumns');
- });
- /*
- * Profiling Chart
- */
- function makeProfilingChart () {
- if ($('#profilingchart').length === 0 ||
- $('#profilingchart').html().length !== 0 ||
- !$.jqplot || !$.jqplot.Highlighter || !$.jqplot.PieRenderer
- ) {
- return;
- }
- var data = [];
- $.each(JSON.parse($('#profilingChartData').html()), function (key, value) {
- data.push([key, parseFloat(value)]);
- });
- // Remove chart and data divs contents
- $('#profilingchart').html('').show();
- $('#profilingChartData').html('');
- PMA_createProfilingChart('profilingchart', data);
- }
- /*
- * initialize profiling data tables
- */
- function initProfilingTables () {
- if (!$.tablesorter) {
- return;
- }
- $('#profiletable').tablesorter({
- widgets: ['zebra'],
- sortList: [[0, 0]],
- textExtraction: function (node) {
- if (node.children.length > 0) {
- return node.children[0].innerHTML;
- } else {
- return node.innerHTML;
- }
- }
- });
- $('#profilesummarytable').tablesorter({
- widgets: ['zebra'],
- sortList: [[1, 1]],
- textExtraction: function (node) {
- if (node.children.length > 0) {
- return node.children[0].innerHTML;
- } else {
- return node.innerHTML;
- }
- }
- });
- }
- /*
- * Set position, left, top, width of sticky_columns div
- */
- function setStickyColumnsPosition ($sticky_columns, $table_results, position, top, left, margin_left) {
- $sticky_columns
- .css('position', position)
- .css('top', top)
- .css('left', left ? left : 'auto')
- .css('margin-left', margin_left ? margin_left : '0px')
- .css('width', $table_results.width());
- }
- /*
- * Initialize sticky columns
- */
- function initStickyColumns ($table_results) {
- return $('<table class="sticky_columns"></table>')
- .insertBefore($table_results)
- .css('position', 'fixed')
- .css('z-index', '98')
- .css('width', $table_results.width())
- .css('margin-left', $('#page_content').css('margin-left'))
- .css('top', $('#floating_menubar').height())
- .css('display', 'none');
- }
- /*
- * Arrange/Rearrange columns in sticky header
- */
- function rearrangeStickyColumns ($sticky_columns, $table_results) {
- var $originalHeader = $table_results.find('thead');
- var $originalColumns = $originalHeader.find('tr:first').children();
- var $clonedHeader = $originalHeader.clone();
- // clone width per cell
- $clonedHeader.find('tr:first').children().width(function (i,val) {
- var width = $originalColumns.eq(i).width();
- var is_firefox = navigator.userAgent.indexOf('Firefox') > -1;
- if (! is_firefox) {
- width += 1;
- }
- return width;
- });
- $sticky_columns.empty().append($clonedHeader);
- }
- /*
- * Adjust sticky columns on horizontal/vertical scroll for all tables
- */
- function handleAllStickyColumns () {
- $('.sticky_columns').each(function () {
- handleStickyColumns($(this), $(this).next('.table_results'));
- });
- }
- /*
- * Adjust sticky columns on horizontal/vertical scroll
- */
- function handleStickyColumns ($sticky_columns, $table_results) {
- var currentScrollX = $(window).scrollLeft();
- var windowOffset = $(window).scrollTop();
- var tableStartOffset = $table_results.offset().top;
- var tableEndOffset = tableStartOffset + $table_results.height();
- if (windowOffset >= tableStartOffset && windowOffset <= tableEndOffset) {
- // for horizontal scrolling
- if (prevScrollX !== currentScrollX) {
- prevScrollX = currentScrollX;
- setStickyColumnsPosition($sticky_columns, $table_results, 'absolute', $('#floating_menubar').height() + windowOffset - tableStartOffset);
- // for vertical scrolling
- } else {
- setStickyColumnsPosition($sticky_columns, $table_results, 'fixed', $('#floating_menubar').height(), $('#pma_navigation').width() - currentScrollX, $('#page_content').css('margin-left'));
- }
- $sticky_columns.show();
- } else {
- $sticky_columns.hide();
- }
- }
- AJAX.registerOnload('sql.js', function () {
- makeProfilingChart();
- initProfilingTables();
- });
|