You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
211 lines
8.2 KiB
211 lines
8.2 KiB
/** |
|
* 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 += '<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 |
|
* @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'); |
|
}); |