[devtools] improve error message when postgresql tools are missing
By default in at least Debian, some pg tools are not present in the
PATH. Or they may not be installed. But the tests tools expects them
to be in the PATH, and give an unhelpful 'No such file or directory'
backtrace if they're not found. To help devs using the pg tests we
improve the error message.
/**
* toggle visibility of an element by its id & set current visibility status in a cookie
*
*/
var prefsValues = {};
function togglePrefVisibility(elemId) {
clearPreviousMessages();
jQuery('#' + elemId).toggleClass('hidden');
}
function closeFieldset(fieldsetid) {
var linklabel = _("open all");
var linkhref = 'javascript:openFieldset("' + fieldsetid + '")';
_toggleFieldset(fieldsetid, 1, linklabel, linkhref);
}
function openFieldset(fieldsetid) {
var linklabel = _("close all");
var linkhref = 'javascript:closeFieldset("' + fieldsetid + '")';
_toggleFieldset(fieldsetid, 0, linklabel, linkhref);
}
function _toggleFieldset(fieldsetid, closeaction, linklabel, linkhref) {
jQuery('#' + fieldsetid).find('div.openlink').each(function() {
var link = A({
'href': "javascript:noop();",
'onclick': linkhref
},
linklabel);
jQuery(this).empty().append(link);
});
jQuery('#' + fieldsetid).find('fieldset[id]').each(function() {
var fieldset = jQuery(this);
if (closeaction) {
fieldset.addClass('hidden');
} else {
fieldset.removeClass('hidden');
linkLabel = (_("open all"));
}
});
}
function validatePrefsForm(formid) {
clearPreviousMessages();
_clearPreviousErrors(formid);
return validateForm(formid, null, submitSucces, submitFailure);
}
function submitFailure(result, formid, cbargs) {
var $form = jQuery('#' + formid);
var dom = DIV({'class': 'critical'}, _("please correct errors below"));
$form.find('div.formsg').empty().append(dom);
unfreezeFormButtons(formid);
var descr = result[1];
_displayValidationerrors(formid, descr[0], descr[1]);
$form.find('span.error').next().focus();
return false; // so handleFormValidationResponse doesn't try to display error
}
function submitSucces(result, formid, cbargs) {
var $form = jQuery('#' + formid);
setCurrentValues($form);
var dom = DIV({'class': 'msg'}, _("changes applied"));
$form.find('div.formsg').empty().append(dom);
$form.find('input').removeClass('changed');
checkValues(form, true);
return;
}
function clearPreviousMessages() {
jQuery('div#appMsg').addClass('hidden');
jQuery('div.formsg').empty();
}
function checkValues(form, success) {
var unfreezeButtons = false;
jQuery(form).find('select').each(function() {
unfreezeButtons = _checkValue(jQuery(this), unfreezeButtons);
});
jQuery(form).find('[type=text]').each(function() {
unfreezeButtons = _checkValue(jQuery(this), unfreezeButtons);
});
jQuery(form).find('input[type=radio]:checked').each(function() {
unfreezeButtons = _checkValue(jQuery(this), unfreezeButtons);
});
if (unfreezeButtons) {
unfreezeFormButtons(form.attr('id'));
} else {
if (!success) {
clearPreviousMessages();
}
_clearPreviousErrors(form.attr('id'));
freezeFormButtons(form.attr('id'));
}
}
function _checkValue(input, unfreezeButtons) {
var currentValue = prefsValues[input.attr('name')];
if (currentValue != input.val()) {
input.addClass('changed');
unfreezeButtons = true;
} else {
input.removeClass('changed');
jQuery('span[id="err-' + input.attr('id') + '"]').remove();
}
input.removeClass('error');
return unfreezeButtons;
}
function setCurrentValues(form) {
jQuery(form).find('[name^=value]').each(function() {
var input = jQuery(this);
var name = input.attr('name');
if (input.attr('type') == 'radio') {
// NOTE: there seems to be a bug with jQuery(input).attr('checked')
// in our case, we can't rely on its value, we use
// the DOM API instead.
if (input[0].checked) {
prefsValues[name] = input.val();
}
} else {
prefsValues[name] = input.val();
}
jQuery(form).find('input[name="edits-' + name + '"]').val(prefsValues[name]);
});
}
function initEvents() {
jQuery('form').each(function() {
var form = jQuery(this);
//freezeFormButtons(form.attr('id'));
form.find('.validateButton').attr('disabled', 'disabled');
form.find('input[type=text]').keyup(function() {
checkValues(form);
});
form.find('input[type=radio]').change(function() {
checkValues(form);
});
form.find('select').change(function() {
checkValues(form);
});
setCurrentValues(form);
});
}
$(document).ready(function() {
initEvents();
});