83858083785a6b2b1f3c05f93e818e5a89318692 max Tue Aug 25 01:42:34 2026 -0700 hgSession: show cytoBand and gene/locus annotations for each saved session; date-only Created/Last used columns with full timestamp on hover. Factor locusName lookup into reusable hLocusName/hLocusNameExpand in hdb.c and reuse from hgBlat. refs #38157 The Assembly column now shows band, gene/locus name and Mbp position (separated by whitespace, normal text size). hLocusNameExpand centralizes the ex:/in:/ig: and | to - expansion that hgBlat's results page did inline. diff --git src/hg/hgBlat/hgBlat.c src/hg/hgBlat/hgBlat.c index 82d35e0a512..591e2aae91b 100644 --- src/hg/hgBlat/hgBlat.c +++ src/hg/hgBlat/hgBlat.c @@ -748,31 +748,31 @@ hgcUrl, psl->tStart, pslName, cgiEncode(faName), cgiEncode(psl->qName), psl->tName, psl->tStart, psl->tEnd, database, uiState); else /* Shared-link reopen: there is no trash .pslx, but the durable bigPsl custom track (now in * this cart) lets hgc's htcBlatAlign rebuild the base alignment from the stored query seq. * chrom/start/qName select the hit; db and the browser window come from the loaded cart. */ jsonWriteStringf(jw, "detailsUrl", "%s?g=htcBlatAlign&db=%s&c=%s&o=%d&i=%s&%s", hgcUrl, database, psl->tName, psl->tStart, cgiEncode(psl->qName), uiState); if (locusConn) { struct sqlResult *sr = hRangeQuery(locusConn, "locusName", psl->tName, psl->tStart, psl->tEnd, NULL, 0); char **row = sqlNextRow(sr); if (row != NULL) { char *raw = row[4]; - char *full = subTextString(subList, raw); + char *full = hLocusNameExpand(raw); // shared with hgSession, see hdb.c jsonWriteString(jw, "locusText", full); freeMem(full); char *type = NULL, *genes = raw; if (startsWith("ig:", raw)) { type = "intergenic"; genes = raw + 3; } else if (startsWith("ex:", raw)) { type = "exon"; genes = raw + 3; } else if (startsWith("in:", raw)) { type = "intron"; genes = raw + 3; } if (type != NULL) { jsonWriteString(jw, "locusType", type); jsonWriteListStart(jw, "locusGenes"); char *dupe = cloneString(genes); char *words[128];