From 43fa5ba50310425af0c34bb48e67735aeaa79f89 Mon Sep 17 00:00:00 2001 From: Sebastian Benjamin Date: Mon, 24 Mar 2025 10:28:12 -0700 Subject: [PATCH 1/5] WIP --- .../components/VariantTableWidget.tsx | 39 ++++++++++++-- .../org/labkey/jbrowse/JBrowseController.java | 54 +++++++++++++++++++ .../labkey/jbrowse/JBrowseLuceneSearch.java | 2 + 3 files changed, 90 insertions(+), 5 deletions(-) diff --git a/jbrowse/src/client/JBrowse/VariantSearch/components/VariantTableWidget.tsx b/jbrowse/src/client/JBrowse/VariantSearch/components/VariantTableWidget.tsx index 9a186e493..3468f239d 100644 --- a/jbrowse/src/client/JBrowse/VariantSearch/components/VariantTableWidget.tsx +++ b/jbrowse/src/client/JBrowse/VariantSearch/components/VariantTableWidget.tsx @@ -14,6 +14,8 @@ import { } from '@mui/x-data-grid'; import SearchIcon from '@mui/icons-material/Search'; import LinkIcon from '@mui/icons-material/Link'; +import DownloadIcon from '@mui/icons-material/Download' +import { ActionURL } from '@labkey/api'; import React, { useEffect, useState } from 'react'; import { getConf } from '@jbrowse/core/configuration'; import { AppBar, Box, Button, Dialog, Paper, Popover, Toolbar, Tooltip, Typography } from '@mui/material'; @@ -91,6 +93,25 @@ const VariantTableWidget = observer(props => { fetchLuceneQuery(passedFilters, sessionId, trackGUID, page, pageSize, field, sort, (json)=>{handleSearch(json)}, (error) => {setDataLoaded(true); setError(error)}); } + const handleExport = () => { + const currentUrl = new URL(window.location.href); + + const searchString = createEncodedFilterString(filters, false); + const sortField = sortModel[0]?.field ?? 'genomicPosition'; + const sortDirection = sortModel[0]?.sort ?? false; + + const sortReverse = (sortDirection === 'desc'); + + const exportUrl = new URL(ActionURL.buildURL('jbrowse', 'csvExport.api')); + exportUrl.searchParams.set('sessionId', sessionId); + exportUrl.searchParams.set('trackId', trackGUID); + exportUrl.searchParams.set('searchString', searchString); + exportUrl.searchParams.set('sortField', sortField); + exportUrl.searchParams.set('sortReverse', sortReverse.toString()); + + window.location.href = exportUrl.toString(); + }; + const TableCellWithPopover = (props: { value: any }) => { const { value } = props; const fullDisplayValue = value ? (Array.isArray(value) ? value.join(', ') : value) : '' @@ -183,7 +204,7 @@ const VariantTableWidget = observer(props => { ); } - function CustomToolbar({ setFilterModalOpen }) { + function CustomToolbar({ setFilterModalOpen, handleExport }) { return ( @@ -196,9 +217,14 @@ const VariantTableWidget = observer(props => { Search - + +