Fix constraint sync during migration
- restore constraints lost during merge in test schema.
- use constraint_by_eid in BeforeDeleteCWConstraintHook as done in
3.17.14 for BeforeDeleteConstrainedByHook. Fixes handling of multiple
constraints of the same type.
- make sync_schema_props_perms() delete the CWConstraint entity instead
of the constrained_by relation. In 3.19, the latter doesn't
automatically result in the former just because the relation is
composite. Simplify the constraint migration to delete all removed
constraints and recreate new ones even if they share the same type; that
optimization made the code more complicated for (AFAICT) no significant
reason.
/**
* 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();
});