formslib disabledif: MDL-18522 make it work if either end of a disabledif relationship is a set of radio buttons.
Backport from HEAD to 1.9 stable.
This commit is contained in:
+88
-31
@@ -82,18 +82,72 @@ function unlockoption(form,item) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the value of the 'virtual form element' with a particular name. That is,
|
||||
* abstracts away the difference between a normal form element, like a select
|
||||
* which is a single HTML element with a .value property, and a set of radio
|
||||
* buttons, which is several HTML elements.
|
||||
*
|
||||
* @param form a HTML form.
|
||||
* @param master the name of an element in that form.
|
||||
* @return the value of that element.
|
||||
*/
|
||||
function get_form_element_value(form, name) {
|
||||
var element = form[name];
|
||||
if (!element) {
|
||||
return null;
|
||||
}
|
||||
if (element.tagName) {
|
||||
// Ordinarly thing like a select box.
|
||||
return element.value;
|
||||
}
|
||||
// Array of things, like radio buttons.
|
||||
for (var j = 0; j < element.length; j++) {
|
||||
var el = element[j];
|
||||
if (el.checked) {
|
||||
return el.value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set the disabled state of the 'virtual form element' with a particular name.
|
||||
* This abstracts away the difference between a normal form element, like a select
|
||||
* which is a single HTML element with a .value property, and a set of radio
|
||||
* buttons, which is several HTML elements.
|
||||
*
|
||||
* @param form a HTML form.
|
||||
* @param master the name of an element in that form.
|
||||
* @param disabled the disabled state to set.
|
||||
*/
|
||||
function set_form_element_disabled(form, name, disabled) {
|
||||
var element = form[name];
|
||||
if (!element) {
|
||||
return;
|
||||
}
|
||||
if (element.tagName) {
|
||||
// Ordinarly thing like a select box.
|
||||
element.disabled = disabled;
|
||||
}
|
||||
// Array of things, like radio buttons.
|
||||
for (var j = 0; j < element.length; j++) {
|
||||
var el = element[j];
|
||||
el.disabled = disabled;
|
||||
}
|
||||
}
|
||||
|
||||
function lockoptionsall(formid) {
|
||||
var form = document.forms[formid];
|
||||
var dependons = eval(formid+'items');
|
||||
var tolock = Array();
|
||||
var dependons = eval(formid + 'items');
|
||||
var tolock = [];
|
||||
for (var dependon in dependons) {
|
||||
// change for MooTools compatibility
|
||||
if (!dependons.propertyIsEnumerable(dependon)) {
|
||||
continue;
|
||||
}
|
||||
var master = form[dependon];
|
||||
if (master === undefined) {
|
||||
if (!form[dependon]) {
|
||||
continue;
|
||||
}
|
||||
for (var condition in dependons[dependon]) {
|
||||
@@ -101,15 +155,15 @@ function lockoptionsall(formid) {
|
||||
var lock;
|
||||
switch (condition) {
|
||||
case 'notchecked':
|
||||
lock = !master.checked; break;
|
||||
lock = !form[dependon].checked; break;
|
||||
case 'checked':
|
||||
lock = master.checked; break;
|
||||
lock = form[dependon].checked; break;
|
||||
case 'noitemselected':
|
||||
lock = master.selectedIndex==-1; break;
|
||||
lock = form[dependon].selectedIndex == -1; break;
|
||||
case 'eq':
|
||||
lock = master.value==value; break;
|
||||
lock = get_form_element_value(form, dependon) == value; break;
|
||||
default:
|
||||
lock = master.value!=value; break;
|
||||
lock = get_form_element_value(form, dependon) != value; break;
|
||||
}
|
||||
for (var ei in dependons[dependon][condition][value]) {
|
||||
// change for MooTools compatibility
|
||||
@@ -117,9 +171,8 @@ function lockoptionsall(formid) {
|
||||
continue;
|
||||
}
|
||||
var eltolock = dependons[dependon][condition][value][ei];
|
||||
if (tolock[eltolock] != null){
|
||||
tolock[eltolock] =
|
||||
lock || tolock[eltolock];
|
||||
if (tolock[eltolock] != null) {
|
||||
tolock[eltolock] = lock || tolock[eltolock];
|
||||
} else {
|
||||
tolock[eltolock] = lock;
|
||||
}
|
||||
@@ -127,16 +180,12 @@ function lockoptionsall(formid) {
|
||||
}
|
||||
}
|
||||
}
|
||||
for (var el in tolock){
|
||||
for (var el in tolock) {
|
||||
// change for MooTools compatibility
|
||||
if (!tolock.propertyIsEnumerable(el)) {
|
||||
continue;
|
||||
}
|
||||
var formelement = form[el];
|
||||
if ((formelement === undefined) || (formelement.disabled === undefined)) {
|
||||
continue;
|
||||
}
|
||||
formelement.disabled = tolock[el];
|
||||
set_form_element_disabled(form, el, tolock[el]);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -149,16 +198,24 @@ function lockoptionsallsetup(formid) {
|
||||
if (!dependons.propertyIsEnumerable(dependon)) {
|
||||
continue;
|
||||
}
|
||||
var master = form[dependon];
|
||||
if (master === undefined) {
|
||||
var masters = form[dependon];
|
||||
if (!masters) {
|
||||
continue;
|
||||
}
|
||||
master.formid = formid;
|
||||
master.onclick = function() {return lockoptionsall(this.formid);};
|
||||
master.onblur = function() {return lockoptionsall(this.formid);};
|
||||
master.onchange = function() {return lockoptionsall(this.formid);};
|
||||
if (!masters[0]) {
|
||||
// If master is radio buttons, we get an array, otherwise we don't.
|
||||
// Convert both cases to an array for convinience.
|
||||
masters = [masters];
|
||||
}
|
||||
for (var j = 0; j < masters.length; j++) {
|
||||
master = masters[j];
|
||||
master.formid = formid;
|
||||
master.onclick = function() {return lockoptionsall(this.formid);};
|
||||
master.onblur = function() {return lockoptionsall(this.formid);};
|
||||
master.onchange = function() {return lockoptionsall(this.formid);};
|
||||
}
|
||||
}
|
||||
for (var i = 0; i < form.elements.length; i++){
|
||||
for (var i = 0; i < form.elements.length; i++) {
|
||||
var formelement = form.elements[i];
|
||||
if (formelement.type=='reset') {
|
||||
formelement.formid = formid;
|
||||
@@ -247,10 +304,10 @@ function findChildNodes(start, tagName, elementClass, elementID, elementName) {
|
||||
var classfound = false;
|
||||
var child = start.childNodes[i];
|
||||
if((child.nodeType == 1) &&//element node type
|
||||
(elementClass && (typeof(child.className)=='string'))){
|
||||
(elementClass && (typeof(child.className)=='string'))) {
|
||||
var childClasses = child.className.split(/\s+/);
|
||||
for (var childClassIndex in childClasses){
|
||||
if (childClasses[childClassIndex]==elementClass){
|
||||
for (var childClassIndex in childClasses) {
|
||||
if (childClasses[childClassIndex]==elementClass) {
|
||||
classfound = true;
|
||||
break;
|
||||
}
|
||||
@@ -276,7 +333,7 @@ function findChildNodes(start, tagName, elementClass, elementID, elementName) {
|
||||
Adds or removes the "hide" class for the specified elements depending on boolean hide.
|
||||
*/
|
||||
function elementShowAdvanced(elements, show) {
|
||||
for (var elementIndex in elements){
|
||||
for (var elementIndex in elements) {
|
||||
element = elements[elementIndex];
|
||||
element.className = element.className.replace(new RegExp(' ?hide'), '')
|
||||
if(!show) {
|
||||
@@ -315,8 +372,8 @@ function showAdvancedOnClick(e) {
|
||||
}
|
||||
var formelements = button.form.elements;
|
||||
// Fixed MDL-10506
|
||||
for (var i = 0; i < formelements.length; i++){
|
||||
if (formelements[i] && formelements[i].name && (formelements[i].name=='mform_showadvanced')){
|
||||
for (var i = 0; i < formelements.length; i++) {
|
||||
if (formelements[i] && formelements[i].name && (formelements[i].name=='mform_showadvanced')) {
|
||||
formelements[i].value = buttontext;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user