5247d2f093c036439e46930a40607d2a47a05f25 chmalee Thu Mar 5 11:34:12 2026 -0800 For hgConvert only, filter the popular genomes list in the toDb section by what liftover chains we have available for the fromDb, refs #36232 diff --git src/hg/hgConvert/hgConvert.c src/hg/hgConvert/hgConvert.c index 9d3bfd6b5e0..2b3f701ba0c 100644 --- src/hg/hgConvert/hgConvert.c +++ src/hg/hgConvert/hgConvert.c @@ -152,30 +152,37 @@ puts("
\n"); cgiMakeButton(HGLFT_DO_CONVERT, "Submit"); puts("
\n"); /* JavaScript initialization for autocomplete with liftOver filtering */ jsInlineF( "let validTargets = new Set();\n" "\n" "fetch('../cgi-bin/hubApi/liftOver/listExisting?fromGenome=%s')\n" " .then(response => response.json())\n" " .then(data => {\n" " if (data.existingLiftOvers) {\n" " data.existingLiftOvers.forEach(chain => validTargets.add(chain.toDb));\n" " }\n" "\n" + " // Filter popular genomes to only those with a liftOver from source\n" + " let dataEl = document.getElementById('%sPopularData');\n" + " if (dataEl) {\n" + " let popular = JSON.parse(dataEl.textContent);\n" + " dataEl.textContent = JSON.stringify(popular.filter(p => validTargets.has(p.db)));\n" + " }\n" + "\n" " // Custom onServerReply that processes results and filters to valid targets\n" " function processAndFilterResults(result, term) {\n" " let processed = processFindGenome(result, term);\n" " let filtered = processed.filter(item => validTargets.has(item.genome));\n" " if (filtered.length === 0 && processed.length > 0) {\n" " // Found genomes but none have liftOver from source\n" " return [{label: 'No liftOver available for matching genomes', value: '', genome: '', disabled: true}];\n" " } else if (filtered.length === 0) {\n" " // No genomes matched the search at all\n" " return [{label: 'No genomes found', value: '', genome: '', disabled: true}];\n" " }\n" " return filtered;\n" " }\n" "\n" " // Error handler for API failures (e.g. HTTP 400)\n" @@ -214,30 +221,31 @@ " wasOpen = $input.autocompleteCat('widget').is(':visible');\n" " });\n" " toggle.addEventListener('click', () => {\n" " let $input = $('[id=\\x27%s\\x27]');\n" " if (wasOpen) {\n" " $input.autocompleteCat('close');\n" " } else {\n" " $input.val('');\n" " $input.autocompleteCat('search', '');\n" " $input.focus();\n" " }\n" " });\n" " }\n" "});\n" , liftOver->fromDb + , searchBarId , HGLFT_TOORG_VAR , HGLFT_TODB_VAR , searchBarId, searchBarId, searchBarId, searchBarId , searchBarId, searchBarId, searchBarId ); puts("\n"); cartWebEnd(); } static double scoreLiftOverChain(struct liftOverChain *chain, char *fromOrg, char *fromDb, char *toOrg, char *toDb, struct hash *dbRank ) /* Score the chain in terms of best match for cart settings */ {