Skip to content

Commit 5cdc941

Browse files
hextrazaSebastian Benjamin
andauthored
Add column URL serialization (#261)
* Serialize column visibility model to the URL * URL serialization tests + don't serialize full object --------- Co-authored-by: Sebastian Benjamin <sebastiancbenjamin@gmail.com>
1 parent d7df3ca commit 5cdc941

File tree

2 files changed

+106
-5
lines changed

2 files changed

+106
-5
lines changed

jbrowse/src/client/JBrowse/VariantSearch/components/VariantTableWidget.tsx

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -226,8 +226,6 @@ const VariantTableWidget = observer(props => {
226226
const [fieldTypeInfo, setFieldTypeInfo] = useState<FieldModel[]>([]);
227227
const [allowedGroupNames, setAllowedGroupNames] = useState<string[]>([]);
228228
const [promotedFilters, setPromotedFilters] = useState<Map<string, Filter[]>>(null);
229-
const [columnVisibilityModel, setColumnVisibilityModel] = useState<GridColumnVisibilityModel>({});
230-
231229
const [adapter, setAdapter] = useState<BaseFeatureDataAdapter>(null)
232230

233231
// Active widget ID list to force rerender when a JBrowseUIButton is clicked
@@ -241,6 +239,10 @@ const VariantTableWidget = observer(props => {
241239
const pageSize = parseInt(urlParams.get('pageSize') || '50');
242240
const [pageSizeModel, setPageSizeModel] = React.useState<GridPaginationModel>({ page, pageSize });
243241

242+
const colVisURLComponent = urlParams.get("colVisModel") || "{}"
243+
const colVisModel = JSON.parse(decodeURIComponent(colVisURLComponent))
244+
const [columnVisibilityModel, setColumnVisibilityModel] = useState<GridColumnVisibilityModel>(colVisModel);
245+
244246
// API call to retrieve the requested features.
245247
useEffect(() => {
246248
const handlePopState = () => {
@@ -261,9 +263,19 @@ const VariantTableWidget = observer(props => {
261263

262264
setColumns(columns)
263265

264-
const columnVisibilityModel = {}
265-
fields.filter((x) => !x.isHidden).forEach((x) => columnVisibilityModel[x.name] = !!x.isInDefaultColumns)
266-
setColumnVisibilityModel(columnVisibilityModel)
266+
if(JSON.stringify(columnVisibilityModel) === '{}') {
267+
const defaultModel = {};
268+
fields.filter((x) => !x.isHidden).forEach((x) => {
269+
defaultModel[x.name] = !!x.isInDefaultColumns;
270+
});
271+
setColumnVisibilityModel(defaultModel);
272+
} else {
273+
const updatedModel = fields.reduce((acc, field) => {
274+
acc[field.name] = columnVisibilityModel[field.name] === true;
275+
return acc;
276+
}, {});
277+
setColumnVisibilityModel(updatedModel);
278+
}
267279

268280
setFieldTypeInfo(fields)
269281
setAllowedGroupNames(groups)
@@ -395,6 +407,17 @@ const VariantTableWidget = observer(props => {
395407
}}
396408
onColumnVisibilityModelChange={(model) => {
397409
setColumnVisibilityModel(model)
410+
411+
const trueValuesModel = Object.keys(model).reduce((acc, key) => {
412+
if (model[key] === true) {
413+
acc[key] = true;
414+
}
415+
return acc;
416+
}, {});
417+
418+
const currentUrl = new URL(window.location.href);
419+
currentUrl.searchParams.set("colVisModel", encodeURIComponent(JSON.stringify(trueValuesModel)));
420+
window.history.pushState(null, "", currentUrl.toString());
398421
}}
399422
/>
400423
)

jbrowse/test/src/org/labkey/test/tests/external/labModules/JBrowseTest.java

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1813,5 +1813,83 @@ private void testLuceneSearchUI(String sessionId)
18131813
waitForElement(Locator.tagWithText("span", "0.029"));
18141814

18151815
clearFilterDialog("IMPACT equals HIGH,MODERATE");
1816+
1817+
testLuceneColumnSerialization(sessionId);
1818+
}
1819+
1820+
private void testLuceneColumnSerializationFirstRow() {
1821+
WebElement locator = TOP_ROW.findElement(getDriver());
1822+
1823+
for (WebElement elem : locator.findElements(By.xpath("./child::*"))) {
1824+
String value = elem.getText();
1825+
if (StringUtils.trimToNull(value) == null)
1826+
{
1827+
value = "";
1828+
}
1829+
1830+
if (StringUtils.isEmpty(elem.getText())) {
1831+
return;
1832+
}
1833+
1834+
switch(elem.getAttribute("aria-colindex"))
1835+
{
1836+
case "1":
1837+
Assert.assertEquals(value, "1");
1838+
break;
1839+
case "2":
1840+
Assert.assertEquals(value, "2");
1841+
break;
1842+
case "3":
1843+
Assert.assertEquals(value, "A");
1844+
break;
1845+
case "4":
1846+
Assert.assertEquals(value, "T");
1847+
break;
1848+
case "6":
1849+
Assert.assertEquals(value, "0.029");
1850+
break;
1851+
case "7":
1852+
Assert.assertEquals(value, "7.292");
1853+
break;
1854+
case "8":
1855+
Assert.assertEquals(value, "HIGH");
1856+
break;
1857+
}
1858+
}
1859+
}
1860+
1861+
private void testLuceneColumnSerialization(String sessionId) {
1862+
beginAt("/" + getProjectName() + "/jbrowse-jbrowse.view?session=" + sessionId);
1863+
waitAndClick(Locator.tagContainingText("button", "Show all regions in assembly").withClass("MuiButtonBase-root"));
1864+
waitAndClick(Locator.tagWithText("p", "No tracks active."));
1865+
waitAndClick(Locator.tagWithText("button", "Open track selector"));
1866+
1867+
Locator l = Locator.tagWithText("span", "TestVCF").withClass("MuiFormControlLabel-label");
1868+
waitAndClick(l);
1869+
getDriver().findElement(Locator.tag("body")).sendKeys(Keys.ESCAPE); //close modal
1870+
1871+
openTrackMenuItem("Variant Search", true);
1872+
waitAndClick(Locator.tagWithAttribute("button", "aria-label", "Select columns"));
1873+
1874+
Locator caddScoreToggle = Locator.tagWithAttribute("input", "name", "CADD_PH");
1875+
waitForElement(caddScoreToggle);
1876+
WebElement parentOfCaddScoreToggle = caddScoreToggle.findElement(getDriver()).findElement(By.xpath("./.."));
1877+
parentOfCaddScoreToggle.click();
1878+
1879+
String colVisModelString = "%257B%2522contig%2522%253Atrue%252C%2522start%2522%253Atrue%252C%2522ref%2522%253Atrue%252C%2522alt%2522%253Atrue%252C%2522variableSamples%2522%253Atrue%252C%2522AF%2522%253Atrue%252C%2522CADD_PH%2522%253Atrue%252C%2522IMPACT%2522%253Atrue%257D";
1880+
Assert.assertEquals(getUrlParam("colVisModel"), colVisModelString);
1881+
1882+
getDriver().navigate().refresh();
1883+
1884+
waitForElement(TOP_ROW);
1885+
Assert.assertEquals(getUrlParam("colVisModel"), colVisModelString);
1886+
testLuceneColumnSerializationFirstRow();
1887+
1888+
waitAndClick(Locator.tagWithText("button", "Search"));
1889+
waitAndClick(Locator.tagWithClass("button", "filter-form-select-button"));
1890+
1891+
waitForElement(TOP_ROW);
1892+
Assert.assertEquals(getUrlParam("colVisModel"), colVisModelString);
1893+
testLuceneColumnSerializationFirstRow();
18161894
}
18171895
}

0 commit comments

Comments
 (0)