d806d4e2ec73a0e53f8b65443bb5a403cc54364d
braney
  Mon Jun 29 12:11:00 2026 -0700
Enable Sort by Magnitude/Similarity on wiggle-only composites, refs #37816

The right-click "Sort by Magnitude/Similarity" menu items were previously
offered only on custom composites. Extend them to any composite whose
subtracks are all wiggle types (parentIsAllWiggle in utils.js).

diff --git src/hg/js/utils.js src/hg/js/utils.js
index 1dd4f526b3f..5668209cd37 100644
--- src/hg/js/utils.js
+++ src/hg/js/utils.js
@@ -483,30 +483,46 @@
 // json help routines
 function tdbGetJsonRecord(trackName)  { return hgTracks.trackDb[trackName]; }
 // NOTE: These must jive with tdbKindOfParent() and tdbKindOfChild() in trackDb.h
 function tdbIsFolder(tdb)             { return (tdb.kindOfParent === 1); } 
 function tdbIsComposite(tdb)          { return (tdb.kindOfParent === 2); }
 function tdbIsMultiTrack(tdb)         { return (tdb.kindOfParent === 3); }
 function tdbIsView(tdb)               { return (tdb.kindOfParent === 4); } // Don't expect to use
 function tdbIsContainer(tdb)          { return (tdb.kindOfParent === 2 || tdb.kindOfParent === 3); }
 function tdbIsLeaf(tdb)               { return (tdb.kindOfParent === 0); }
 function tdbIsFolderContent(tdb)      { return (tdb.kindOfChild  === 1); }
 function tdbIsCompositeSubtrack(tdb)  { return (tdb.kindOfChild  === 2); }
 function tdbIsMultiTrackSubtrack(tdb) { return (tdb.kindOfChild  === 3); }
 function tdbIsSubtrack(tdb)           { return (tdb.kindOfChild  === 2 || tdb.kindOfChild === 3); }
 function tdbHasParent(tdb)            { return (tdb.kindOfChild  !== 0 && tdb.parentTrack); }
 
+function parentIsAllWiggle(tdb)
+{   // True if every subtrack of tdb's parent composite is a wiggle type.
+    if (!tdb.parentTrack)
+        return false;
+    var parentName = tdb.parentTrack, found = false;
+    for (var name in hgTracks.trackDb) {
+        var t = hgTracks.trackDb[name];
+        if (t.parentTrack === parentName) {
+            found = true;
+            if (/^wigMaf/.test(t.type) || !/^(wig|bigWig|bedGraph)/.test(t.type))
+                return false;
+        }
+    }
+    return found;
+}
+
 function cartHideAnyTrack (id, cartVars, cartVals) {
     /* set the right cart variables to hide a track, changes cartVars and cartVals */
     var rec = hgTracks.trackDb[id];
     if (tdbIsSubtrack(rec)) {
         cartVars.push(id);
         cartVals.push('[]');
 
         cartVars.push(id+"_sel");
         cartVals.push(0);
     } else if (tdbIsFolderContent(rec)) {
         // supertrack children need to have _sel set to trigger superttrack reshaping
         cartVars.push(id);
         cartVals.push('hide');
 
         cartVars.push(id+"_sel");