diff options
Diffstat (limited to 'srcs/phpmyadmin/js/table/relation.js')
| -rw-r--r-- | srcs/phpmyadmin/js/table/relation.js | 248 |
1 files changed, 248 insertions, 0 deletions
diff --git a/srcs/phpmyadmin/js/table/relation.js b/srcs/phpmyadmin/js/table/relation.js new file mode 100644 index 0000000..600dfc1 --- /dev/null +++ b/srcs/phpmyadmin/js/table/relation.js @@ -0,0 +1,248 @@ +/* vim: set expandtab sw=4 ts=4 sts=4: */ +/** + * for tbl_relation.php + * + */ + +var TableRelation = {}; + +TableRelation.showHideClauses = function ($thisDropdown) { + if ($thisDropdown.val() === '') { + $thisDropdown.parent().nextAll('span').hide(); + } else { + if ($thisDropdown.is('select[name^="destination_foreign_column"]')) { + $thisDropdown.parent().nextAll('span').show(); + } + } +}; + +/** + * Sets dropdown options to values + */ +TableRelation.setDropdownValues = function ($dropdown, values, selectedValue) { + $dropdown.empty(); + var optionsAsString = ''; + // add an empty string to the beginning for empty selection + values.unshift(''); + $.each(values, function () { + optionsAsString += '<option value=\'' + Functions.escapeHtml(this) + '\'' + (selectedValue === Functions.escapeHtml(this) ? ' selected=\'selected\'' : '') + '>' + Functions.escapeHtml(this) + '</option>'; + }); + $dropdown.append($(optionsAsString)); +}; + +/** + * Retrieves and populates dropdowns to the left based on the selected value + * + * @param $dropdown the dropdown whose value got changed + */ +TableRelation.getDropdownValues = function ($dropdown) { + var foreignDb = null; + var foreignTable = null; + var $databaseDd; + var $tableDd; + var $columnDd; + var foreign = ''; + // if the changed dropdown is for foreign key constraints + if ($dropdown.is('select[name^="destination_foreign"]')) { + $databaseDd = $dropdown.parent().parent().parent().find('select[name^="destination_foreign_db"]'); + $tableDd = $dropdown.parent().parent().parent().find('select[name^="destination_foreign_table"]'); + $columnDd = $dropdown.parent().parent().parent().find('select[name^="destination_foreign_column"]'); + foreign = '_foreign'; + } else { // internal relations + $databaseDd = $dropdown.parent().find('select[name^="destination_db"]'); + $tableDd = $dropdown.parent().find('select[name^="destination_table"]'); + $columnDd = $dropdown.parent().find('select[name^="destination_column"]'); + } + + // if the changed dropdown is a database selector + if ($dropdown.is('select[name^="destination' + foreign + '_db"]')) { + foreignDb = $dropdown.val(); + // if no database is selected empty table and column dropdowns + if (foreignDb === '') { + TableRelation.setDropdownValues($tableDd, []); + TableRelation.setDropdownValues($columnDd, []); + return; + } + } else { // if a table selector + foreignDb = $databaseDd.val(); + foreignTable = $dropdown.val(); + // if no table is selected empty the column dropdown + if (foreignTable === '') { + TableRelation.setDropdownValues($columnDd, []); + return; + } + } + var $msgbox = Functions.ajaxShowMessage(); + var $form = $dropdown.parents('form'); + var $db = $form.find('input[name="db"]').val(); + var $table = $form.find('input[name="table"]').val(); + var argsep = CommonParams.get('arg_separator'); + var params = 'getDropdownValues=true' + argsep + 'ajax_request=true' + + argsep + 'db=' + encodeURIComponent($db) + + argsep + 'table=' + encodeURIComponent($table) + + argsep + 'foreign=' + (foreign !== '') + + argsep + 'foreignDb=' + encodeURIComponent(foreignDb) + + (foreignTable !== null ? + argsep + 'foreignTable=' + encodeURIComponent(foreignTable) : '' + ); + var $server = $form.find('input[name="server"]'); + if ($server.length > 0) { + params += argsep + 'server=' + $form.find('input[name="server"]').val(); + } + $.ajax({ + type: 'POST', + url: 'tbl_relation.php', + data: params, + dataType: 'json', + success: function (data) { + Functions.ajaxRemoveMessage($msgbox); + if (typeof data !== 'undefined' && data.success) { + // if the changed dropdown is a database selector + if (foreignTable === null) { + // set values for table and column dropdowns + TableRelation.setDropdownValues($tableDd, data.tables); + TableRelation.setDropdownValues($columnDd, []); + } else { // if a table selector + // set values for the column dropdown + var primary = null; + if (typeof data.primary !== 'undefined' + && 1 === data.primary.length + ) { + primary = data.primary[0]; + } + TableRelation.setDropdownValues($columnDd.first(), data.columns, primary); + TableRelation.setDropdownValues($columnDd.slice(1), data.columns); + } + } else { + Functions.ajaxShowMessage(data.error, false); + } + } + }); +}; + +/** + * Unbind all event handlers before tearing down a page + */ +AJAX.registerTeardown('table/relation.js', function () { + $('body').off('change', + 'select[name^="destination_db"], ' + + 'select[name^="destination_table"], ' + + 'select[name^="destination_foreign_db"], ' + + 'select[name^="destination_foreign_table"]' + ); + $('body').off('click', 'a.add_foreign_key_field'); + $('body').off('click', 'a.add_foreign_key'); + $('a.drop_foreign_key_anchor.ajax').off('click'); +}); + +AJAX.registerOnload('table/relation.js', function () { + /** + * Ajax event handler to fetch table/column dropdown values. + */ + $('body').on('change', + 'select[name^="destination_db"], ' + + 'select[name^="destination_table"], ' + + 'select[name^="destination_foreign_db"], ' + + 'select[name^="destination_foreign_table"]', + function () { + TableRelation.getDropdownValues($(this)); + } + ); + + /** + * Ajax event handler to add a column to a foreign key constraint. + */ + $('body').on('click', 'a.add_foreign_key_field', function (event) { + event.preventDefault(); + event.stopPropagation(); + + // Add field. + $(this) + .prev('span') + .clone(true, true) + .insertBefore($(this)) + .find('select') + .val(''); + + // Add foreign field. + var $sourceElem = $('select[name^="destination_foreign_column[' + + $(this).attr('data-index') + ']"]:last').parent(); + $sourceElem + .clone(true, true) + .insertAfter($sourceElem) + .find('select') + .val(''); + }); + + /** + * Ajax event handler to add a foreign key constraint. + */ + $('body').on('click', 'a.add_foreign_key', function (event) { + event.preventDefault(); + event.stopPropagation(); + + var $prevRow = $(this).closest('tr').prev('tr'); + var $newRow = $prevRow.clone(true, true); + + // Update serial number. + var currIndex = $newRow + .find('a.add_foreign_key_field') + .attr('data-index'); + var newIndex = parseInt(currIndex) + 1; + $newRow.find('a.add_foreign_key_field').attr('data-index', newIndex); + + // Update form parameter names. + $newRow.find('select[name^="foreign_key_fields_name"]:not(:first), ' + + 'select[name^="destination_foreign_column"]:not(:first)' + ).each(function () { + $(this).parent().remove(); + }); + $newRow.find('input, select').each(function () { + $(this).attr('name', + $(this).attr('name').replace(/\d/, newIndex) + ); + }); + $newRow.find('input[type="text"]').each(function () { + $(this).val(''); + }); + // Finally add the row. + $newRow.insertAfter($prevRow); + }); + + /** + * Ajax Event handler for 'Drop Foreign key' + */ + $('a.drop_foreign_key_anchor.ajax').on('click', function (event) { + event.preventDefault(); + var $anchor = $(this); + + // Object containing reference to the current field's row + var $currRow = $anchor.parents('tr'); + + var dropQuery = Functions.escapeHtml( + $currRow.children('td') + .children('.drop_foreign_key_msg') + .val() + ); + + var question = Functions.sprintf(Messages.strDoYouReally, dropQuery); + + $anchor.confirm(question, $anchor.attr('href'), function (url) { + var $msg = Functions.ajaxShowMessage(Messages.strDroppingForeignKey, false); + var params = Functions.getJsConfirmCommonParam(this, $anchor.getPostData()); + $.post(url, params, function (data) { + if (data.success === true) { + Functions.ajaxRemoveMessage($msg); + CommonActions.refreshMain(false, function () { + // Do nothing + }); + } else { + Functions.ajaxShowMessage(Messages.strErrorProcessingRequest + ' : ' + data.error, false); + } + }); // end $.post() + }); + }); // end Drop Foreign key + + var windowWidth = $(window).width(); + $('.jsresponsive').css('max-width', (windowWidth - 35) + 'px'); +}); |
