dc9e2d26233a14b14771430de665ff684978fbb9 tdreszer Thu Jul 22 12:58:06 2010 -0700 Fixed redmine 385 where Changing view affected unchecked ABC dimensions. diff --git src/hg/js/hui.js src/hg/js/hui.js index d3ba791..64d0321 100644 --- src/hg/js/hui.js +++ src/hg/js/hui.js @@ -14,60 +14,83 @@ // The 'mat*' functions are especially designed to support subtrack configuration by 2D matrix of controls -function matSelectViewForSubTracks(obj,view) +function _matSelectViewForSubTracks(obj,view) { // viewDD:onchange Handle any necessary changes to subtrack checkboxes when the view changes // views are "select" drop downs on a subtrack configuration page + var classesHidden = ""; // Needed for later + if( obj.selectedIndex == 0) { // hide matSubCBsEnable(false,view); hideConfigControls(view); - // fix 3-way matCBs if necessary - var matCBs = matCBsWhichAreComplete(false); - if(matCBs.length > 0) { - if($("select.viewDD[selectedIndex]").length == 0) {// No views visible so nothing is inconsistent - $( matCBs ).each( function (i) { matCbComplete( this, true ); }); - } else { - var classes = matViewClasses('hidden'); - classes = classes.concat( matAbcCBclasses('unchecked') ); - $( matCBs ).each( function (i) { matChkBoxNormalize( this, classes ); }); - } - } + // Needed for later + classesHidden = matViewClasses('hidden'); + classesHidden = classesHidden.concat( matAbcCBclasses('unchecked') ); } else { // Make main display dropdown show full if currently hide compositeName = obj.name.substring(0,obj.name.indexOf(".")); // {trackName}.{view}.vis exposeComposite(compositeName); - // if matrix used then: essentially reclick all 'checked' matrix checkboxes - var CBs = $("input.matCB").filter(":checked"); - if(CBs.length > 0) { - var classSets = new Array(); - CBs.each( function (i) { classSets.push( $(this).attr("class") ); } ); - if(classSets.length > 0) { - // Now it would be good to create a list of all subtrack CBs that match view,unchecked, and a class set (pair or triplet!) - CBs = $("input.subCB").filter("."+view).not(":checked"); - if(CBs.length > 0) { - while(classSets.length > 0) { - var OneOrMoreClasses = classSets.pop(); - var JustTheseCBs = CBs; - if(OneOrMoreClasses.length > 0) { - OneOrMoreClasses = OneOrMoreClasses.replace("matCB ",""); // "matCB K562 CTCF" to "K562 CTCF" - var classes = OneOrMoreClasses.split(" "); - while(classes.length > 0) { - JustTheseCBs = JustTheseCBs.filter("."+classes.pop()); - } - JustTheseCBs.each( function (i) { + matSubCBsEnable(true,view); + + // Needed for later + classesHidden = matViewClasses('hidden'); + classesHidden = classesHidden.concat( matAbcCBclasses('unchecked') ); + + // If hide => show then check all subCBs matching view and matCBs + // If show => show than just enable subCBs for the view. + if (obj.lastIndex == 0) { // From hide to show + // If there are matCBs then we will check some subCBs if we just went from hide to show + var matCBs = $("input.matCB:checked"); + if (matCBs.length > 0) { + // Get list of all checked abc classes first + var classesAbcChecked = new Array(); + matCBs.filter(".abc").each( function (i) { + var classList = $( this ).attr("class").split(" "); + classesAbcChecked.push( aryRemove(classList,"matCB","halfVis","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","halfVis"); + 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); hideOrShowSubtrack(this); }); + }); + } // If no matrix, then enabling is all that was needed. + + // fix 3-way which may need to go from unchecked to .halfVis + var matCBs = $("input.matCB").not(".abc").not(".halfVis").not(":checked"); + if(matCBs.length > 0) { + $( matCBs ).each( function (i) { matChkBoxNormalize( this, classesHidden ); }); } } } + // fix 3-way matCBs which may need to go from halfVis to checked or unchecked depending + var matCBs = $("input.matCB").not(":checked").not(".halfVis"); + var matCBs = matCBsWhichAreComplete(false); + if(matCBs.length > 0) { + if($("select.viewDD").not("[selectedIndex=0]").length = 0) { // No views visible so nothing is inconsistent + $( matCBs ).each( function (i) { matCbComplete( this, true ); }); + } else { + $( matCBs ).each( function (i) { matChkBoxNormalize( this, classesHidden ); }); } } - matSubCBsEnable(true,view); - } matSubCBsSelected(); + obj.lastIndex = obj.selectedIndex; +} + +function matSelectViewForSubTracks(obj,view) +{ + waitOnFunction( _matSelectViewForSubTracks, obj,view); } function exposeComposite(compositeName) @@ -116,7 +139,7 @@ else if(classList.length == 2 ) matSubCBsCheck(matCB.checked,classList[0],classList[1]); // dimX and dimY else - alert("ASSERT in matCbClick(): There should be no more than 2 entries in list:"+classList) + warn("ASSERT in matCbClick(): There should be no more than 2 entries in list:"+classList) if(!isABC) matCbComplete(matCB,true); // No longer partially checked @@ -431,9 +454,9 @@ var classes = new Array; var viewDDs = $("select.viewDD");//.filter("[selectedIndex='0']"); if(limitTo == 'hidden') { - viewDDs = $(viewDDs).not("[selectedIndex]"); + viewDDs = $(viewDDs).filter("[selectedIndex=0]"); } else if(limitTo == 'visible') { - viewDDs = $(viewDDs).filter("[selectedIndex]"); + viewDDs = $(viewDDs).not("[selectedIndex=0]"); } $(viewDDs).each( function (i) { var classList = $( this ).attr("class").split(" ");