b4ac25c5138fbad826427cdade2bdd627dc10745 tdreszer Wed Sep 28 15:07:50 2011 -0700 A few nice bug catches due to walking through code in firebug. diff --git src/hg/js/hui.js src/hg/js/hui.js index 742a5b2..6edfb15 100644 --- src/hg/js/hui.js +++ src/hg/js/hui.js @@ -49,31 +49,31 @@ var classList = $( this ).attr("class").split(" "); classesAbcChecked.push( aryRemove(classList,["matCB","disabled","abc"]) ); }); // Walk through checked non-ABC matCBs and sheck related subCBs var subCBs = $("input.subCB").filter("."+view).not(":checked"); matCBs.not(".abc").each( function (i) { var classList = $( this ).attr("class").split(" "); classList = aryRemove(classList,["matCB","disabled"]); var subCBsMatching = objsFilterByClasses(subCBs,"and",classList); if (classesAbcChecked.length>0) subCBsMatching = objsFilterByClasses(subCBsMatching,"or",classesAbcChecked); // Check the subCBs that belong to this view and checked matCBs subCBsMatching.each( function (i) { this.checked = true; - matSubCBsetShadow(this); // will update "subCfg" if needed + matSubCBsetShadow(this,true); // will update "subCfg" if needed hideOrShowSubtrack(this); }); }); } // If no matrix, then enabling is all that was needed. // fix 3-way which may need to go from unchecked to .disabled var matCBs = $("input.matCB").not(".abc").not(".disabled").not(":checked"); if(matCBs.length > 0) { $( matCBs ).each( function (i) { matChkBoxNormalize( this, classesHidden ); }); } } } // fix 3-way matCBs which may need to go from disabled to checked or unchecked depending var matCBs = $("input.matCB").not(":checked").not(".disabled"); var matCBs = matCBsWhichAreComplete(false); @@ -104,31 +104,31 @@ } } } function matSubCbClick(subCB) { // subCB:onclick When a subtrack checkbox is clicked, it may result in // Clicking/unclicking the corresponding matrix CB. Also the // subtrack may be hidden as a result. // NOTE: if "subCfg" then 'change' event will update it if (isFauxDisabled(subCB,false)) { // disabled subCB is still clickable when "subCfg" subCB.checked = true; fauxDisable(subCB,false,""); // enable and get rid of message } - matSubCBsetShadow(subCB); + matSubCBsetShadow(subCB,false); hideOrShowSubtrack(subCB); // When subCBs are clicked, 3-state matCBs may need to be set var classes = matViewClasses('hidden'); classes = classes.concat( matAbcCBclasses(false) ); var matCB = matCbFindFromSubCb( subCB ); if( matCB != undefined ) { matChkBoxNormalize( matCB, classes ); } //var abcCB = matAbcCbFindFromSubCb( subCB ); //if( abcCB != undefined ) { // matChkBoxNormalize( abcCB, classes ); //} if(subCB.checked) exposeAll(); // Unhide composite vis? @@ -187,32 +187,32 @@ $( matCBs ).each( function (i) { this.checked = state; matCbComplete(this,true); }); var subCbs = $("input.subCB"); for(var vIx=1;vIx<arguments.length;vIx++) { subCbs = $( subCbs ).filter("."+arguments[vIx]); // Successively limit list by additional classes. } if(state) { // If clicking [+], further limit to only checked ABCs var classes = matAbcCBclasses(false); subCbs = objsFilterByClasses(subCbs,"not",classes); // remove unchecked abcCB classes } $( subCbs ).each( function (i) { if (this.checked != state) { this.checked = state; - $(this).change() // NOTE: if "subCfg" then 'change' event will update it - matSubCBsetShadow(this); + matSubCBsetShadow(this,false); + $(this).change(); // NOTE: if "subCfg" then 'change' event will update it } }); if(state) exposeAll(); // Unhide composite vis? showOrHideSelectedSubtracks(); matSubCBsSelected(); //jQuery(this).css('cursor', ''); var tbody = $( subCbs[0] ).parents('tbody.sorting'); if (tbody != undefined) $(tbody).removeClass('sorting'); return true; } function matSetMatrixCheckBoxes(state) { // Called exclusively by matrix [+][-] buttons on click @@ -280,73 +280,74 @@ { // Enables/Disables subtracks checkboxes. If additional arguments are passed in, the list of CBs will be narrowed by the classes var subCBs = $("input.subCB"); for(var vIx=1;vIx<arguments.length;vIx++) { if(arguments[vIx].length > 0) subCBs = subCBs.filter("."+arguments[vIx]); // Successively limit list by additional classes. } subCBs.each( function (i) { if(state) { fauxDisable(this,false,''); $(this).parent().attr('cursor',''); } else { fauxDisable(this,true, 'view is hidden'); $(this).parent().attr('cursor','pointer'); } - matSubCBsetShadow(this); // will update "subCfg" if needed + matSubCBsetShadow(this,true); // will update "subCfg" if needed hideOrShowSubtrack(this); }); return true; } function matSubCBcheckOne(subCB,state) { // setting a single subCB may cause it to appear/disappear if (subCB.checked != state) { subCB.checked = state; + matSubCBsetShadow(subCB,false); $(subCB).change(); // NOTE: if "subCfg" then 'change' event will update it - matSubCBsetShadow(subCB); hideOrShowSubtrack(subCB); } } -function matSubCBsetShadow(subCB) +function matSubCBsetShadow(subCB,triggerChange) { // Since CBs only get into cart when enabled/checked, the shadow control enables cart to know other states // will update "subCfg" if needed var shadowState = 0; if(subCB.checked) shadowState = 1; //if(subCB.disabled) if (isFauxDisabled(subCB,true)) shadowState -= 2; - var fourWay = normed($("input.fourWay[name='boolshad\\."+subCB.name+"']")); + var fourWay = normed($("input.cbShadow[name='boolshad\\."+subCB.name+"']")); if (fourWay == undefined && subCB.name != undefined) { fourWay = normed($("input.cbShadow#boolshad_-"+subCB.id)); // subCfg noname version specific if (fourWay == undefined) fourWay = normed($("#"+subCB.name+"_4way")); // FIXME: obsolete as soon as subCfg is working } if (fourWay == undefined) { warn("DEBUG: Failed to find fourWay shadow for '#"+subCB.id+"' ["+subCB.name+"]"); return; } if ($(fourWay).val() != shadowState.toString()) { $(fourWay).val(shadowState); if (typeof(subCfg) !== "undefined") { subCfg.enableCfg(subCB,null,(shadowState == 1)); - /////$(subCB).change(); // 'change' event will update "subCfg" // FIXME: Is this needed?? + if (triggerChange) + $(subCB).change(); // 'change' event will update "subCfg" // FIXME: Is this needed? YES. But not on direct cb click } } } function matChkBoxNormalize(matCB) { // Makes sure matCBs are in one of 3 states (checked,unchecked,indeterminate) based on matching set of subCBs var classList = $( matCB ).attr("class").split(" "); var isABC = (aryFind(classList,"abc") != -1); if(isABC) alert("ASSERT: matChkBoxNormalize() called for dim ABC!"); classList = aryRemove(classList,["matCB","disabled"]); var classes = '.' + classList.join(".");// created string filter of classes converting "matCB K562 H3K4me1" as ".K562.H3K4me1" var subCBs = $("input.subCB").filter(classes); // All subtrack CBs that match matrix CB