fcccdfc15c15096674cea4176724ad95a340b3d4 tdreszer Tue Aug 2 15:48:52 2011 -0700 More incremental work on subCfg diff --git src/hg/js/hui.js src/hg/js/hui.js index 4f274b0..1344e76 100644 --- src/hg/js/hui.js +++ src/hg/js/hui.js @@ -86,57 +86,63 @@ } } matSubCBsSelected(); obj.lastIndex = obj.selectedIndex; } function matSelectViewForSubTracks(obj,view) { waitOnFunction( _matSelectViewForSubTracks, obj,view); } function exposeAll() { // Make main display dropdown show full if currently hide var visDD = $("select.visDD"); // limit to hidden - if ($(visDD).length == 1 && $(visDD).attr('selectedIndex') == 0) // limit to hidden + if ($(visDD).length == 1) { + visDD = visDD[0]; // limit to hidden + if ($(visDD).attr('selectedIndex') == 0) { $(visDD).attr('selectedIndex',$(visDD).children('option').length - 1); + scm.propagateVis(visDD); + } + } } 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. - matSubCBsetShadow(subCB); - hideOrShowSubtrack(subCB); + scm.checkOneSubtrack(subCB,subCB.checked,!subCB.disabled); + //////////matSubCBsetShadow(subCB); + //////////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? - scm.enableCfg(subCB,null,subCB.checked); + ///////////scm.enableCfg(subCB,null,subCB.checked); matSubCBsSelected(); } function matCbClick(matCB) { // matCB:onclick When a matrix CB is clicked, the set of subtracks checked may change // Also called indirectly by matButton:onclick via matSetMatrixCheckBoxes var classList = $( matCB ).attr("class").split(" "); var isABC = (aryFind(classList,"abc") != -1); classList = aryRemove(classList,"matCB","halfVis","abc"); if(classList.length == 0 ) matSubCBsCheck(matCB.checked); else if(classList.length == 1 ) @@ -169,45 +175,47 @@ matSubCBsSelected(); } function _matSetMatrixCheckBoxes(state) { // matButtons:onclick Set all Matrix checkboxes to state. If additional arguments are passed in, the list of CBs will be narrowed by the classes //jQuery(this).css('cursor', 'wait'); var matCBs = $("input.matCB").not(".abc"); for(var vIx=1;vIx<arguments.length;vIx++) { matCBs = $( matCBs ).filter("."+arguments[vIx]); // Successively limit list by additional classes. } $( matCBs ).each( function (i) { this.checked = state; matCbComplete(this,true); }); - subCbs = $("input.subCB"); + 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) { - this.checked = state; - matSubCBsetShadow(this); + scm.checkOneSubtrack(this,state,!(this.disabled)); + /////////this.checked = state; + /////////matSubCBsetShadow(this); + /////////scm.enableCfg(this,null,this.checked); }); if(state) exposeAll(); // Unhide composite vis? - showOrHideSelectedSubtracks(); + ////////showOrHideSelectedSubtracks(); matSubCBsSelected(); //jQuery(this).css('cursor', ''); var tbody = $( subCbs[0] ).parents('tbody.sorting'); if (tbody != undefined) $(tbody).removeClass('sorting'); return true; } function matSetMatrixCheckBoxes(state) { var tbody = $( 'tbody.sortable'); if (tbody != undefined) $(tbody).addClass('sorting'); if (arguments.length >= 5) @@ -235,30 +243,31 @@ // 2) 3 state matCBs for dimX and Y but not for Z (checked,unchecked,indeterminate (incomplete set of subCBs for this matCB)) // 3) cart vars for viewDD, abcCBs and subCBs but matCBs set by the state of those 3 // What is awkward or does not work // A) Awkward: matCB could be 5 state (all,none,subset,superset,excusive non-matching set) function matSubCBsCheck(state) { // Set all subtrack checkboxes to state. If additional arguments are passed in, the list of CBs will be narrowed by the classes // called by matCB clicks (matCbClick()) ! 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 checking subCBs, then make sure up to 3 dimensions of matCBs agree with each other on subCB verdict var classes = matAbcCBclasses(false); + if (classes.length > 0) subCBs = objsFilterByClasses(subCBs,"not",classes); // remove unchecked abcCB classes if(arguments.length == 1 || arguments.length == 3) { // Requested dimX&Y: check dim ABC state $( subCBs ).each( function (i) { matSubCBcheckOne(this,state); }); } else {//if(arguments.length == 2) { // Requested dim ABC (or only 1 dimension so this code is harmless) var matXY = $("input.matCB").not(".abc"); // check X&Y state matXY = $( matXY ).filter(":checked"); for(var mIx=0;mIx<matXY.length;mIx++) { var classes = $(matXY[mIx]).attr("class").split(' '); classes = aryRemove(classes,"matCB","halfVis"); $( subCBs ).filter('.'+classes.join(".")).each( function (i) { matSubCBcheckOne(this,state); }); } } } else // state not checked so no filtering by other matCBs needed subCBs.each( function (i) { matSubCBcheckOne(this,state); }); @@ -571,103 +580,30 @@ return true; } function subtrackCfgHideAll(table) { // hide all the subtrack configuration stuff $("div[id $= '_cfg']").each( function (i) { $( this ).css('display','none'); $( this ).children("input[name$='.childShowCfg']").val("off"); }); // Hide all "..." metadata displayed $("div[id $= '_meta']:visible").toggle(); $("img[src$='../images/upBlue.png']").attr('src','../images/downBlue.png'); } -var popUpTrackName; -var popUpTitle = ""; -var popSaveAllVars = null; -function popUpCfgOk(popObj, trackName) -{ // Kicks off a Modal Dialog for the provided content. - var allVars = getAllVars(popObj, trackName ); // always subtrack cfg - var changedVars = varHashChanges(allVars,popSaveAllVars); - //warn("cfgVars:"+varHashToQueryString(changedVars)); - setVarsFromHash(changedVars); - var newVis = changedVars[trackName]; - if(newVis != null) { - var sel = $('input[name="'+trackName+'_sel"]:checkbox'); - var checked = (newVis != 'hide' && newVis != '[]'); // subtracks do not have "hide", thus '[]' - if( $(sel) != undefined ) { - $(sel).each( function (i) { matSubCBcheckOne(this,checked); }); // Though there is only one, the each works but the direct call does not! - matSubCBsSelected(); - } - } -} - -function popUpCfg(content, status) -{ // Kicks off a Modal Dialog for the provided content. - // Set up the modal dialog - var popit = $('#popit'); - $(popit).html("<div style='font-size:80%'>" + content + "</div>"); - $(popit).dialog({ - ajaxOptions: { cache: true }, // This doesn't work - resizable: false, - height: 'auto', - width: 'auto', - minHeight: 200, - minWidth: 700, - modal: true, - closeOnEscape: true, - autoOpen: false, - buttons: { "OK": function() { - popUpCfgOk(this,popUpTrackName); - $(this).dialog("close"); - }}, - open: function() { popSaveAllVars = getAllVars( this, popUpTrackName ); }, // always subtrack cfg - close: function() { $('#popit').empty(); } - }); - // Apparently the options above to dialog take only once, so we set title explicitly. - if(popUpTitle != undefined && popUpTitle.length > 0) - $(popit).dialog('option' , 'title' , popUpTitle ); - else - $(popit).dialog('option' , 'title' , "Please Respond"); - $(popit).dialog('open'); -} - -function _popUpSubrackCfg(trackName,label) -{ // popup cfg dialog - popUpTrackName = trackName; - popUpTitle = label; - - $.ajax({ - type: "GET", - url: "../cgi-bin/hgTrackUi?ajax=1&g=" + trackName + "&hgsid=" + getHgsid() + "&db=" + getDb(), - dataType: "html", - trueSuccess: popUpCfg, - success: catchErrorOrDispatch, - error: errorHandler, - cmd: "cfg", - cache: false - }); -} - -function popUpSubtrackCfg(trackName,label) -{ - waitOnFunction( _popUpSubrackCfg, trackName, label ); // Launches the popup but shields the ajax with a waitOnFunction - return false; -} - function subtrackCfgShow(tableName) { // Will show subtrack specific configuration controls // Config controls not matching name will be hidden var divit = $("#div_"+tableName+"_cfg"); if(($(divit).css('display') == 'none') && metadataIsVisible(tableName)) metadataShowHide(tableName,"",""); // Could have all inputs commented out, then uncommented when clicked: // But would need to: // 1) be able to find composite view level input // 2) know if subtrack input is non-default (if so then subtrack value overrides composite view level value) // 3) know whether so composite view level value has changed since hgTrackUi displayed (if so composite view level value overrides) $(divit).toggle(); @@ -715,31 +651,31 @@ } }); // Close the cfg controls in the subtracks $("table.subtracks").each( function (i) { subtrackCfgHideAll(this);} ); return true; } function showOrHideSelectedSubtracks(inp) { // Show or Hide subtracks based upon radio toggle var showHide; if(arguments.length > 0) showHide=inp; else { - var onlySelected = $("input[name='displaySubtracks']"); + var onlySelected = $("input.allOrOnly'"); if(onlySelected.length > 0) showHide = onlySelected[0].checked; else return; } showSubTrackCheckBoxes(showHide); var tbody = $("tbody.sortable") $(tbody).each(function (i) { sortedTableAlternateColors(this); }); } ///// Following functions called on page load function matInitializeMatrix() @@ -1508,30 +1444,39 @@ if (isComposite) { return subVis; } else { var classList = $( parentObj ).attr("class").split(" "); classList = aryRemove(classList,"viewDD","normalText"); if (classList.length != 1) { warn("Unexpected view vis class list:"+classList); return []; } return $(subVis).filter('.' + classList[0]); } }, + checkOneSubtrack: function (subCb,check,enable) + { // Handle a single check of a single subCb + subCb.checked = check; + subCb.dsabled = enable; + matSubCBsetShadow(subCb); + hideOrShowSubtrack(subCb); + scm.enableCfg(subCb,null,check); + }, + propagateSetting: function (parentObj) { // propagate composite/view level setting to subtrack children var children = scm.childrenFind(parentObj); if(parentObj.type.indexOf("checkbox") == 0) { var parentChecked = parentObj.checked; $(children).each(function (i) { // Note checkbox and boolshad are children. if (this.type != 'hidden') this.checked = parentObj.checked; scm.clearChange(this); }); // deal with hidden boolshads! //var parentIdSafe = parentObj.id.replace(/\./g,"\\."); //var boolshad = $('input#boolshad\\.'+parentIdSafe); var boolshad = $('input#boolshad_-'+parentObj.id); @@ -1843,47 +1788,50 @@ success: catchErrorOrDispatch, error: errorHandler, cmd: "cfg", cache: false }); }, replaceWithVis: function (obj,subtrack,open) { // Replaces the current fauxVis object with a true visibility selector if ($(obj).hasClass('disabled')) return; var classList = $( obj ).attr("class").split(" "); var view = classList[classList.length - 1]; var classList = $(obj).attr('class').split(' '); // This relies on view being the last class!!! - var selectHtml = "<SELECT id='"+subtrack+"' class='normalText subVisDD "+view+"' style='width: 70px'>"; + var selectHtml = "<SELECT id='"+subtrack+"' class='normalText subVisDD "+view+"' style='width: 70px'"; + if (open) + selectHtml += " size=5"; + selectHtml += ">"; var selected = $(obj).text(); if (selected == 'hide') selectHtml += "<OPTION SELECTED>hide</OPTION><OPTION>dense</OPTION><OPTION>squish</OPTION><OPTION>pack</OPTION><OPTION>full</OPTION>"; else if (selected == 'dense') selectHtml += "<OPTION>hide</OPTION><OPTION SELECTED>dense</OPTION><OPTION>squish</OPTION><OPTION>pack</OPTION><OPTION>full</OPTION>"; else if (selected == 'squish') selectHtml += "<OPTION>hide</OPTION><OPTION>dense</OPTION><OPTION SELECTED>squish</OPTION><OPTION>pack</OPTION><OPTION>full</OPTION>"; else if (selected == 'full') selectHtml += "<OPTION>hide</OPTION><OPTION>dense</OPTION><OPTION>squish</OPTION><OPTION>pack</OPTION><OPTION SELECTED>full</OPTION>"; else selectHtml += "<OPTION>hide</OPTION><OPTION>dense</OPTION><OPTION>squish</OPTION><OPTION>pack</OPTION><OPTION>full</OPTION>"; selectHtml += "</SELECT>"; $(obj).replaceWith(selectHtml); if (open) { var newObj = $('select#'+subtrack); - $(newObj).attr('size',5) + //$(newObj).attr('size',5) $(newObj).one('blur',function (e) { $(this).attr('size',1); $(this).unbind() }); $(newObj).one('change',function (e) { $(this).attr('size',1); }); // Doesn't work! //$(newObj).parents('td').first().attr('valign','top'); $(newObj).focus(); } }, enableCfg: function (subCb,subtrack,setTo) { // Enables or disables subVis and wrench @@ -1954,30 +1902,50 @@ subCb = subCb[0]; if (subCb.disabled == true) // || subCb.checked == false) return false; if(metadataIsVisible(subtrack)) metadataShowHide(subtrack,"",""); if ($(cfg).hasClass('filled')) $(cfg).show(); else waitOnFunction( scm.cfgPopulate, cfg, subtrack ); } else $(cfg).hide(); return false; // called by link! }, + subCbInit: function (subCb) + { // unnames the subCb control and sets up on change envent + scm.unnameIt(subCb,true); + var boolshad = $('input#boolshad_-'+subCb.id); + if (boolshad != undefined && boolshad.length == 1) { + scm.unnameIt(boolshad[0],false); + } + $(subCb).bind('click',function (e) { + // deal with hidden boolshads! + var boolshad = $('input#boolshad_-'+subCb.id); + if (boolshad != undefined && boolshad.length == 1) { + if (subCb.checked == false) + scm.markChange(boolshad[0]); + else + scm.clearChange(boolshad[0]); + } + scm.markChange(subCb); + }); + }, + viewInit: function (viewId) { // unnames all view controls // iterate through all matching controls and unname var tr = $('tr#tr_cfg_'+viewId); if (tr == undefined || tr.length == 0) { warn('Did not find view: ' + viewId); return; } if (tr.length == 1) tr = tr[0]; var viewAllObjs = $(tr).find('input,select') var viewObjs = $(viewAllObjs).not("input[type='hidden']"); if (viewObjs.length > 0) { $(viewObjs).each(function (i) { scm.unnameIt(this,true); @@ -2008,30 +1976,36 @@ initialize: function () { // unnames all composite controls and then all view controls // mySelf = this; // There is no need for a "mySelf" unless this object is being instantiated. scm.compositeId = $('.visDD').first().attr('name'); scm.visIndependent = ($('.subVisDD').length > 0); // Find all appropriate controls and unname // matCBs are easy, they never get named again var matCbs = $('input.matCB'); $(matCbs).each(function (i) { scm.unnameIt(this,false); }); + // SubCBs will get renamed and on change will name them back. + var subCbs = $('input.subCB'); + $(subCbs).each(function (i) { + scm.subCbInit(this); + }); + // Now vis control var visObj = $("select[name='"+scm.compositeId+"']"); if (visObj == undefined || visObj.length == 0) { warn('Did not find visibility control for composite.'); return; } if (visObj.length == 1) visObj = visObj[0]; scm.unnameIt(visObj,true); $(visObj).bind('change',function (e) { scm.propagateVis(visObj,null); }); // iterate through views var viewVis = $('select.viewDD');