6239b81a7033f90749f836e73703c65eabd0de9c
jcasper
  Fri Apr 10 15:56:31 2026 -0700
Moved js and css includes for faceted composites into hgTrackUi for better detection
of file changes.  Dynamically change the track visibility based on selected subtracks (hiding
it if everything is deselected, making it visible when something is selected).  refs #36320

diff --git src/hg/hgTrackUi/hgTrackUi.c src/hg/hgTrackUi/hgTrackUi.c
index 0068e030ba2..46eb5b6070e 100644
--- src/hg/hgTrackUi/hgTrackUi.c
+++ src/hg/hgTrackUi/hgTrackUi.c
@@ -3042,32 +3042,30 @@
  */
 
 const int token_size = 1024;
 
 // html elements for the controls page (from singleCellMerged)
 const char pageStyle[] =
     "<style>body.cgi { background: #F0F0F0; }"
     "table.hgInside { background: #FFFFFF; }</style>";
 const char placeholderDiv[] = "<div id='metadata-placeholder'></div>\n";
 const char openJSON[] = "<script id=\"app-data\" type=\"application/json\">{";
 const char closeJSON[] = "}</script>\n";
 const char openDataTypesJSON[] = "\"dataTypes\":{";
 const char closeDataTypesJSON[] = "}";  // closing a dict
 const char openDataElementsJSON[] = "\"dataElements\":[";
 const char closeDataElementsJSON[] = "]";  // closing an array
-const char metadataTableScriptElement[] =
-    "<script type='text/javascript' src='/js/facetedComposite.js'></script>\n";
 
 // --- Get data from 'settings' field in 'trackDb' entry ---
 // required
 const char *metaDataUrl = trackDbSetting(tdb, "metaDataUrl");
 const char *primaryKey = trackDbSetting(tdb, "primaryKey");
 
 struct slPair *dataTypes = parseDataTypes(tdb);
 boolean hasDataTypes = (dataTypes != NULL);
 
 // 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;
@@ -3226,31 +3224,38 @@
     }
 printf(closeDataElementsJSON);
 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\"", cgiEncode((char*) colorSettingsUrl));
 printf(",\"metadataUrl\": \"%s\"", cgiEncode((char*) metaDataUrl));
 printf(",\"track\": \"%s\"", tdb->track);
 if (isNotEmpty(cartOptionalString(cart, "udcTimeout")))
     printf(",\"udcTimeout\": true");
 printf(closeJSON);
 /* --- END embedded JSON data --- */
 
-printf(metadataTableScriptElement);
+jsIncludeFile("dataTables-2.2.2.min.js", NULL);
+jsIncludeFile("dataTables.select-3.0.0.min.js", NULL);
+jsIncludeFile("facetedComposite.js", NULL);
+
+webIncludeResourceFile("dataTables-2.2.2.min.css");
+webIncludeResourceFile("dataTables.select-3.0.0.min.css");
+webIncludeResourceFile("facetedComposite.css");
+
 
 // cleanup
 slPairFreeValsAndList(&dataTypes);
 hashFree(&defaultOn);
 }
 
 void specificUi(struct trackDb *tdb, struct trackDb *tdbList, struct customTrack *ct, boolean ajax)
 /* Draw track specific parts of UI. */
 {
 char *track = tdb->track;
 char *db = database;
 char *liftDb = cloneString(trackDbSetting(tdb, "quickLiftDb"));
 if (liftDb != NULL) 
     db = liftDb;
 // Ideally check cfgTypeFromTdb()/cfgByCfgType() first, but with all these special cases already in