f04f1b9af06c823602c5e0ecd3b8c2059d7704d3
jcasper
Thu Aug 27 14:42:31 2026 -0700
Faceted composites now have a max display mode setting instead of a full override
of child track visibilities, with accompanying support for the onlyVisibility setting. We also
now include a filter block (applied to appropriate child tracks) when those settings are in place.
refs #37662
diff --git src/hg/js/facetedComposite.js src/hg/js/facetedComposite.js
index f19ff0657bf..7847611df23 100644
--- src/hg/js/facetedComposite.js
+++ src/hg/js/facetedComposite.js
@@ -205,30 +205,35 @@
}
submitBtnEvent.target.form.submit(); // release submit event
});
}
function initDataTypeSelector() {
// Skip if no dataTypes defined or empty object
if (!embeddedData.dataTypes || Object.keys(embeddedData.dataTypes).length === 0) {
return;
}
const selector = document.getElementById("dataTypeSelector");
selector.appendChild(Object.assign(document.createElement("label"), {
innerHTML: "Subtrack types enabled:",
}));
+
+ selector.appendChild(createInfoIcon(
+ "Multiple types of data can be displayed for each of the samples listed below. " +
+ "Check the boxes for the types you wish to view."));
+
Object.keys(embeddedData.dataTypes).forEach(name => {
const label = document.createElement("label");
const dataType = embeddedData.dataTypes[name];
label.innerHTML = `
${dataType.title}`;
selector.appendChild(label);
});
const selectedDataTypes = new Set( // get dataTypes selected initially
Object.entries(embeddedData.dataTypes).filter(([_, val]) => val.active === 1)
.map(([key]) => key)
);
// initialize data type checkboxes (using class instead of 'name')
document.querySelectorAll("input.cbgroup")
.forEach(cb => { cb.checked = selectedDataTypes.has(cb.value); });
@@ -438,32 +443,32 @@
{type: "button", className: "filter-tab"});
const selectedTab = Object.assign(document.createElement("button"),
{type: "button", className: "filter-tab"});
toggleWrapper.appendChild(allTab);
toggleWrapper.appendChild(selectedTab);
lengthDiv.appendChild(toggleWrapper);
// Refresh the tab labels and the active-tab highlight. Counts are grand
// totals (default search:'none'), independent of the facet/search
// filters, so "Selected" never misleadingly reads 0 when tracks are
// selected but currently hidden by a facet. How many rows are actually
// visible is reported by DataTables' bottom info line.
function updateSelectedText() {
const selCount = table.rows({selected: true}).count();
const totalCount = table.rows().count();
- allTab.textContent = `All (${totalCount})`;
- selectedTab.textContent = `Active (${selCount})`;
+ allTab.textContent = `All Tracks (${totalCount})`;
+ selectedTab.textContent = `Active Tracks (${selCount})`;
const showSelected = toggleCheckbox.checked;
allTab.classList.toggle("active", !showSelected);
selectedTab.classList.toggle("active", showSelected);
}
updateSelectedText();
// Clicking a tab switches the selection filter and redraws. "Selected"
// is always clickable; with nothing selected it just shows an empty list.
function setFilterMode(showSelected) {
toggleCheckbox.checked = showSelected;
table.draw();
updateSelectedText();
}
allTab.addEventListener("click", () => setFilterMode(false));
selectedTab.addEventListener("click", () => setFilterMode(true));