/** * for table relation */ 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 * @param $dropdown * @param values * @param selectedValue * @return {void} */ 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 += ''; }); $dropdown.append($(optionsAsString)); }; /** * Retrieves and populates dropdowns to the left based on the selected value * * @param $dropdown the dropdown whose value got changed * @return {void} */ 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: 'index.php?route=/table/relation', 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($newRow.find('select[name^="foreign_key_fields_name"]').first()).find('select[name^="destination_foreign_column"]').not($newRow.find('select[name^="foreign_key_fields_name"]').not($newRow.find('select[name^="foreign_key_fields_name"]').first()).find('select[name^="destination_foreign_column"]').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'); });