diff --git a/plugins/linear-comparative-view/src/LaunchLinearSyntenyView.ts b/plugins/linear-comparative-view/src/LaunchLinearSyntenyView.ts index 99289cbf47d..3fa697a538b 100644 --- a/plugins/linear-comparative-view/src/LaunchLinearSyntenyView.ts +++ b/plugins/linear-comparative-view/src/LaunchLinearSyntenyView.ts @@ -1,8 +1,9 @@ import PluginManager from '@jbrowse/core/PluginManager' import { AbstractSessionModel } from '@jbrowse/core/util' -import { LinearSyntenyViewModel } from './LinearSyntenyView/model' import { when } from 'mobx' +// locals +import { LinearSyntenyViewModel } from './LinearSyntenyView/model' type LSV = LinearSyntenyViewModel export default function LaunchLinearSyntenyView(pluginManager: PluginManager) { @@ -48,8 +49,12 @@ export default function LaunchLinearSyntenyView(pluginManager: PluginManager) { await Promise.all( views.map(async (data, idx) => { const view = model.views[idx] - const { loc, tracks = [] } = data - await view.navToLocString(loc) + const { assembly, loc, tracks = [] } = data + const asm = await assemblyManager.waitForAssembly(assembly) + if (!asm) { + throw new Error(`Assembly ${data.assembly} failed to load`) + } + await view.navToSearch({ input: loc, assembly: asm }) tracks.forEach(track => tryTrack(view, track, idsNotFound)) }), ) diff --git a/plugins/linear-genome-view/src/LinearGenomeView/model.ts b/plugins/linear-genome-view/src/LinearGenomeView/model.ts index dbe604528b3..821c99aa106 100644 --- a/plugins/linear-genome-view/src/LinearGenomeView/model.ts +++ b/plugins/linear-genome-view/src/LinearGenomeView/model.ts @@ -54,6 +54,8 @@ import MenuOpenIcon from '@mui/icons-material/MenuOpen' import MiniControls from './components/MiniControls' import Header from './components/Header' import { generateLocations, parseLocStrings } from './util' +import { Assembly } from '@jbrowse/core/assemblyManager/assembly' +import { handleSelectedRegion } from '../searchUtils' // lazies const ReturnToImportFormDialog = lazy( () => import('@jbrowse/core/ui/ReturnToImportFormDialog'), @@ -1315,6 +1317,26 @@ export function stateModelFactory(pluginManager: PluginManager) { ) }, + /** + * #action + * Performs a text index search, and navigates to it immediately if a + * single result is returned. Will pop up a search dialog if multiple + * results are returned + */ + async navToSearch({ + input, + assembly, + }: { + input: string + assembly: Assembly + }) { + await handleSelectedRegion({ + input, + assembly, + model: self as LinearGenomeViewModel, + }) + }, + /** * #action * Similar to `navToLocString`, but accepts parsed location objects diff --git a/plugins/linear-genome-view/src/searchUtils.ts b/plugins/linear-genome-view/src/searchUtils.ts index 82bdbe8e1c4..72ad3faad2b 100644 --- a/plugins/linear-genome-view/src/searchUtils.ts +++ b/plugins/linear-genome-view/src/searchUtils.ts @@ -41,38 +41,33 @@ export async function handleSelectedRegion({ model: LinearGenomeViewModel assembly: Assembly }) { - try { - const allRefs = assembly?.allRefNamesWithLowerCase || [] - const assemblyName = assembly.name - if (input.split(' ').every(entry => checkRef(entry, allRefs))) { - await model.navToLocString(input, assembly.name) - } else { - const searchScope = model.searchScope(assemblyName) - const { textSearchManager } = getSession(model) - const results = await fetchResults({ - queryString: input, - searchType: 'exact', - searchScope, - rankSearchResults: model.rankSearchResults, - textSearchManager, - assembly, - }) + const allRefs = assembly?.allRefNamesWithLowerCase || [] + const assemblyName = assembly.name + if (input.split(' ').every(entry => checkRef(entry, allRefs))) { + await model.navToLocString(input, assembly.name) + } else { + const searchScope = model.searchScope(assemblyName) + const { textSearchManager } = getSession(model) + const results = await fetchResults({ + queryString: input, + searchType: 'exact', + searchScope, + rankSearchResults: model.rankSearchResults, + textSearchManager, + assembly, + }) - if (results.length > 1) { - model.setSearchResults(results, input.toLowerCase(), assemblyName) - } else if (results.length === 1) { - await navToOption({ - option: results[0], - model, - assemblyName, - }) - } else { - await model.navToLocString(input, assemblyName) - } + if (results.length > 1) { + model.setSearchResults(results, input.toLowerCase(), assemblyName) + } else if (results.length === 1) { + await navToOption({ + option: results[0], + model, + assemblyName, + }) + } else { + await model.navToLocString(input, assemblyName) } - } catch (e) { - console.error(e) - getSession(model).notify(`${e}`, 'warning') } }