jbrowse-plugin-msaview 2.6.7 → 2.6.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. package/dist/LaunchMsaView/components/ManualMSALoader/ManualMSALoader.js +0 -3
  2. package/dist/LaunchMsaView/components/ManualMSALoader/launchView.d.ts +2 -3
  3. package/dist/LaunchMsaView/components/ManualMSALoader/launchView.js +3 -2
  4. package/dist/LaunchMsaView/components/NCBIBlastQuery/CachedBlastResults.js +10 -1
  5. package/dist/LaunchMsaView/components/NCBIBlastQuery/blastLaunchView.d.ts +2 -1
  6. package/dist/LaunchMsaView/components/NCBIBlastQuery/blastLaunchView.js +2 -1
  7. package/dist/LaunchMsaView/components/PreLoadedMSA/PreLoadedMSADataPanel.js +0 -1
  8. package/dist/LaunchMsaView/components/PreLoadedMSA/preCalculatedLaunchView.d.ts +2 -3
  9. package/dist/LaunchMsaView/components/PreLoadedMSA/preCalculatedLaunchView.js +3 -2
  10. package/dist/LaunchMsaView/components/useTranscriptSelection.js +14 -11
  11. package/dist/jbrowse-plugin-msaview.umd.production.min.js +25 -25
  12. package/dist/jbrowse-plugin-msaview.umd.production.min.js.map +3 -3
  13. package/dist/version.d.ts +1 -1
  14. package/dist/version.js +1 -1
  15. package/package.json +1 -1
  16. package/src/LaunchMsaView/components/ManualMSALoader/ManualMSALoader.tsx +0 -3
  17. package/src/LaunchMsaView/components/ManualMSALoader/launchView.ts +4 -8
  18. package/src/LaunchMsaView/components/NCBIBlastQuery/CachedBlastResults.tsx +17 -1
  19. package/src/LaunchMsaView/components/NCBIBlastQuery/blastLaunchView.ts +3 -0
  20. package/src/LaunchMsaView/components/PreLoadedMSA/PreLoadedMSADataPanel.tsx +0 -1
  21. package/src/LaunchMsaView/components/PreLoadedMSA/preCalculatedLaunchView.ts +4 -4
  22. package/src/LaunchMsaView/components/useTranscriptSelection.ts +16 -16
  23. package/src/version.ts +1 -1
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const version = "2.6.7";
1
+ export declare const version = "2.6.8";
package/dist/version.js CHANGED
@@ -1 +1 @@
1
- export const version = '2.6.7';
1
+ export const version = '2.6.8';
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2.6.7",
2
+ "version": "2.6.8",
3
3
  "license": "MIT",
4
4
  "name": "jbrowse-plugin-msaview",
5
5
  "repository": {
@@ -1,7 +1,6 @@
1
1
  import React, { useState } from 'react'
2
2
 
3
3
  import { FileSelector } from '@jbrowse/core/ui'
4
- import { getSession } from '@jbrowse/core/util'
5
4
  import {
6
5
  Alert,
7
6
  FormControl,
@@ -56,7 +55,6 @@ const ManualMSALoader = observer(function PreLoadedMSA2({
56
55
  feature: Feature
57
56
  handleClose: () => void
58
57
  }) {
59
- const session = getSession(model)
60
58
  const view = getLinearGenomeView(model)
61
59
  const { classes } = useStyles()
62
60
  const [launchViewError, setLaunchViewError] = useState<unknown>()
@@ -179,7 +177,6 @@ const ManualMSALoader = observer(function PreLoadedMSA2({
179
177
  if (selectedTranscript) {
180
178
  setLaunchViewError(undefined)
181
179
  launchView({
182
- session,
183
180
  newViewTitle: getGeneDisplayName(selectedTranscript),
184
181
  view,
185
182
  feature: selectedTranscript,
@@ -1,12 +1,9 @@
1
- import type {
2
- AbstractSessionModel,
3
- Feature,
4
- FileLocation,
5
- } from '@jbrowse/core/util'
1
+ import { getSession } from '@jbrowse/core/util'
2
+
3
+ import type { Feature, FileLocation } from '@jbrowse/core/util'
6
4
  import type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'
7
5
 
8
6
  export function launchView({
9
- session,
10
7
  newViewTitle,
11
8
  view,
12
9
  feature,
@@ -15,7 +12,6 @@ export function launchView({
15
12
  querySeqName,
16
13
  data,
17
14
  }: {
18
- session: AbstractSessionModel
19
15
  newViewTitle: string
20
16
  view: LinearGenomeViewModel
21
17
  feature: Feature
@@ -27,7 +23,7 @@ export function launchView({
27
23
  tree?: string
28
24
  }
29
25
  }) {
30
- session.addView('MsaView', {
26
+ getSession(view).addView('MsaView', {
31
27
  type: 'MsaView',
32
28
  displayName: newViewTitle,
33
29
  connectedViewId: view.id,
@@ -16,7 +16,12 @@ import { makeStyles } from 'tss-react/mui'
16
16
 
17
17
  import { blastLaunchViewFromCache } from './blastLaunchView'
18
18
  import { useCachedBlastResults } from './useCachedBlastResults'
19
- import { getGeneIdentifiers, getLinearGenomeView } from '../../util'
19
+ import {
20
+ featureMatchesId,
21
+ getGeneIdentifiers,
22
+ getLinearGenomeView,
23
+ getSortedTranscriptFeatures,
24
+ } from '../../util'
20
25
 
21
26
  import type { CachedBlastResult } from '../../../utils/blastCache'
22
27
  import type { AbstractTrackModel, Feature } from '@jbrowse/core/util'
@@ -65,10 +70,21 @@ const CachedBlastResults = observer(function ({
65
70
  useCachedBlastResults(geneIds)
66
71
 
67
72
  const handleUseCached = (cached: CachedBlastResult) => {
73
+ // reconnect the cached MSA to the genome: the cached query row is named
74
+ // 'QUERY' (react-msaview's default querySeqName) and corresponds to the
75
+ // transcript stored as transcriptId. Resolving it here restores the
76
+ // MSA<->genome navigation and hover-sync a fresh BLAST gets.
77
+ const { transcriptId } = cached
78
+ const transcript = transcriptId
79
+ ? getSortedTranscriptFeatures(feature).find(t =>
80
+ featureMatchesId(t, transcriptId),
81
+ )
82
+ : undefined
68
83
  blastLaunchViewFromCache({
69
84
  view,
70
85
  cached,
71
86
  newViewTitle: `BLAST - ${getResultDisplayName(cached)}`,
87
+ connectedFeature: transcript?.toJSON(),
72
88
  })
73
89
  handleClose()
74
90
  }
@@ -32,15 +32,18 @@ export function blastLaunchViewFromCache({
32
32
  newViewTitle,
33
33
  view,
34
34
  cached,
35
+ connectedFeature,
35
36
  }: {
36
37
  newViewTitle: string
37
38
  view: LinearGenomeViewModel
38
39
  cached: CachedBlastResult
40
+ connectedFeature?: ReturnType<Feature['toJSON']>
39
41
  }) {
40
42
  getSession(view).addView('MsaView', {
41
43
  type: 'MsaView',
42
44
  displayName: newViewTitle,
43
45
  connectedViewId: view.id,
46
+ connectedFeature,
44
47
  drawNodeBubbles: true,
45
48
  colWidth: 10,
46
49
  rowHeight: 12,
@@ -139,7 +139,6 @@ const PreLoadedMSA = observer(function ({
139
139
  if (selectedTranscript && msaData) {
140
140
  const querySeqName = `${selectedId}_${assemblyNames[0]}`
141
141
  preCalculatedLaunchView({
142
- session,
143
142
  newViewTitle: getGeneDisplayName(selectedTranscript),
144
143
  view,
145
144
  querySeqName,
@@ -1,8 +1,9 @@
1
- import type { AbstractSessionModel, Feature } from '@jbrowse/core/util'
1
+ import { getSession } from '@jbrowse/core/util'
2
+
3
+ import type { Feature } from '@jbrowse/core/util'
2
4
  import type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'
3
5
 
4
6
  export function preCalculatedLaunchView({
5
- session,
6
7
  newViewTitle,
7
8
  view,
8
9
  feature,
@@ -10,13 +11,12 @@ export function preCalculatedLaunchView({
10
11
  querySeqName,
11
12
  }: {
12
13
  data: { msa: string }
13
- session: AbstractSessionModel
14
14
  newViewTitle: string
15
15
  view: LinearGenomeViewModel
16
16
  feature: Feature
17
17
  querySeqName: string
18
18
  }) {
19
- session.addView('MsaView', {
19
+ getSession(view).addView('MsaView', {
20
20
  type: 'MsaView',
21
21
  displayName: newViewTitle,
22
22
  treeAreaWidth: 200,
@@ -5,24 +5,25 @@ import { useFeatureSequence } from './useFeatureSequence'
5
5
 
6
6
  import type { Feature } from '@jbrowse/core/util'
7
7
 
8
- function findValidSelection(
8
+ // Keep the current selection if it's valid for the given validIds, otherwise
9
+ // fall back to the first valid option (or the current id if none qualify). With
10
+ // no validIds constraint the current selection always stands.
11
+ function pickSelectedId(
9
12
  currentId: string,
10
13
  options: Feature[],
11
14
  validIds: string[] | undefined,
12
- ): string | undefined {
13
- if (validIds && validIds.length > 0) {
14
- const currentFeature = options.find(opt => getId(opt) === currentId)
15
- const currentIsValid =
16
- currentFeature &&
17
- validIds.some(id => featureMatchesId(currentFeature, id))
18
- if (currentFeature && !currentIsValid) {
19
- const validOption = options.find(opt =>
20
- validIds.some(id => featureMatchesId(opt, id)),
21
- )
22
- return validOption ? getId(validOption) : undefined
23
- }
15
+ ): string {
16
+ if (!validIds?.length) {
17
+ return currentId
24
18
  }
25
- return undefined
19
+ const isValid = (opt: Feature) =>
20
+ validIds.some(id => featureMatchesId(opt, id))
21
+ const current = options.find(opt => getId(opt) === currentId)
22
+ if (current && isValid(current)) {
23
+ return currentId
24
+ }
25
+ const firstValid = options.find(isValid)
26
+ return firstValid ? getId(firstValid) : currentId
26
27
  }
27
28
 
28
29
  export function useTranscriptSelection({
@@ -36,8 +37,7 @@ export function useTranscriptSelection({
36
37
  }) {
37
38
  const options = useMemo(() => getSortedTranscriptFeatures(feature), [feature])
38
39
  const [selectedId, setSelectedId] = useState(() => getId(options[0]))
39
- const validatedSelectedId =
40
- findValidSelection(selectedId, options, validIds) ?? selectedId
40
+ const validatedSelectedId = pickSelectedId(selectedId, options, validIds)
41
41
  const selectedTranscript = options.find(
42
42
  val => getId(val) === validatedSelectedId,
43
43
  )
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = '2.6.7'
1
+ export const version = '2.6.8'