5f99b76015eefbb14a2ac75ddcb56f8c1e17ca65
jcasper
  Wed Jan 21 00:01:19 2026 -0800
Changes provided by Andrew Smith to tidy up the new composite UI, refs #36320

diff --git src/hg/hgTrackUi/hgTrackUi.c src/hg/hgTrackUi/hgTrackUi.c
index c1c21d0ac0e..e40cd0e0547 100644
--- src/hg/hgTrackUi/hgTrackUi.c
+++ src/hg/hgTrackUi/hgTrackUi.c
@@ -2983,30 +2983,31 @@
 
 // --- Get data from 'settings' field in 'trackDb' entry ---
 // required
 const char *metaDataUrl = trackDbSetting(tdb, "metaDataUrl");
 const char *primaryKey = trackDbSetting(tdb, "primaryKey");
 
 struct slName *dataTypes = parseDataTypes(tdb);
 if (!dataTypes)
     errAbort("Failed to parse data types from faceted composite settings for: %s", tdb->track);
 // optional
 const char *colorSettingsUrl = (const char *)hashFindVal(tdb->settingsHash, "colorSettingsUrl");
 const char *maxCheckboxes = (const char *)hashFindVal(tdb->settingsHash, "maxCheckboxes");
 // --- done parsing values from trackDb.settings ---
 
 const char *metaDataId = tdb->track;
+const int metaDataIdLen = strlen(metaDataId);
 
 char queryFmt[] = "SELECT contents FROM sessionDb WHERE id='%d' AND sessionKey='%s';";
 char query[query_buff_size];
 sqlSafef(query, query_buff_size, queryFmt, id, sessionKey);
 
 struct sqlConnection *conn = hConnectCentral();
 const char *contents = sqlQuickString(conn, query);
 struct cgiParsedVars *varList = cgiParsedVarsNew((char *)contents);
 
 printf(pageStyle);       // css
 printf(placeholderDiv);  // placholder
 
 /* --- START embedded JSON data --- */
 printf(openJSON);
 printf(openDataTypesJSON);
@@ -3024,45 +3025,41 @@
     printf("%s\"%s\": %d", COMMA_IF(not_first), thisType->name, dataTypeSel ? 1 : 0);
     anySelDataType = dataTypeSel ? thisType : anySelDataType;
     }
 printf(closeDataTypesJSON);
 printf(",");  // add separator
 // find selected data sets
 printf(openDataElementsJSON);
 not_first = 0;
 if (anySelDataType != NULL)
     {
     char suffix[token_size];
     safef(suffix, token_size, "_%s_sel", anySelDataType->name);
     for (struct cgiVar *le = varList->list; le; le = le->next)
         if (startsWith(metaDataId, le->name) && endsWith(le->name, suffix))
             {
-            const char *nameStart = strchr(le->name+strlen(metaDataId), '_');
-            if (nameStart)
-                {
-                ++nameStart;  // move past '_'
+            const char *nameStart = le->name + metaDataIdLen + 1;
             const char *nameEnd = strchr(nameStart, '_');
             if (nameEnd && nameEnd > nameStart)
                 {
                 const int nameLen = nameEnd - nameStart;
                 printf("%s\"%.*s\"", COMMA_IF(not_first), nameLen, nameStart);
                 }
             }
     }
-    }
 printf(closeDataElementsJSON);
-printf(",\"mdid\": \"%s\"", tdb->track);  // metadata id is track name
+printf(",\"mdid\": \"%s\"", metaDataId);
 printf(",\"primaryKey\": \"%s\"", primaryKey);  // must exist
 if (maxCheckboxes) // only if present in trackDb.settings entry
     printf(",\"maxCheckboxes\": \"%s\"", maxCheckboxes);
 if (colorSettingsUrl) // only if present in trackDb.settings entry
     printf(",\"colorSettingsUrl\": \"%s\"", colorSettingsUrl);
 printf(",\"metadataUrl\": \"%s\"", metaDataUrl);
 printf(closeJSON);
 /* --- END embedded JSON data --- */
 
 printf(metadataTableScriptElement);
 
 // cleanup
 slFreeList(&dataTypes);
 cgiParsedVarsFreeList(&varList);
 hDisconnectCentral(&conn);