jbrowse-plugin-msaview 2.6.8 → 2.7.0

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.
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const version = "2.6.8";
1
+ export declare const version = "2.7.0";
package/dist/version.js CHANGED
@@ -1 +1 @@
1
- export const version = '2.6.8';
1
+ export const version = '2.7.0';
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2.6.8",
2
+ "version": "2.7.0",
3
3
  "license": "MIT",
4
4
  "name": "jbrowse-plugin-msaview",
5
5
  "repository": {
@@ -20,7 +20,7 @@
20
20
  "@gmod/bgzf-filehandle": "^6.2.0",
21
21
  "g2p_mapper": "^2.1.5",
22
22
  "idb": "^8.0.3",
23
- "react-msaview": "^5.5.0",
23
+ "react-msaview": "^5.6.1",
24
24
  "swr": "^2.4.2"
25
25
  },
26
26
  "devDependencies": {
@@ -28,39 +28,37 @@
28
28
  "@eslint/js": "^10.0.1",
29
29
  "@fal-works/esbuild-plugin-global-externals": "^2.1.2",
30
30
  "@jbrowse/core": "^4.3.0",
31
- "@jbrowse/mobx-state-tree": "^5.11.1",
31
+ "@jbrowse/mobx-state-tree": "^5.13.0",
32
32
  "@jbrowse/plugin-linear-genome-view": "^4.3.0",
33
- "@mui/icons-material": "^7.3.11",
34
- "@mui/material": "^7.3.11",
35
- "@mui/system": "^7.3.11",
36
- "@mui/x-data-grid": "^8.29.1",
37
- "@types/node": "^25.9.4",
33
+ "@mui/icons-material": "^9.2.0",
34
+ "@mui/material": "^9.2.0",
35
+ "@mui/system": "^9.2.0",
36
+ "@mui/x-data-grid": "^9.10.0",
37
+ "@types/node": "^26.1.1",
38
38
  "@types/react": "^19.2.17",
39
- "@typescript-eslint/eslint-plugin": "^8.62.0",
40
- "@typescript-eslint/parser": "^8.62.0",
41
39
  "esbuild": "^0.28.1",
42
- "eslint": "^10.5.0",
43
- "eslint-plugin-import-x": "^4.17.0",
40
+ "eslint": "^10.7.0",
41
+ "eslint-plugin-import-x": "^4.17.1",
44
42
  "eslint-plugin-react": "^7.37.5",
45
43
  "eslint-plugin-react-hooks": "^7.1.1",
46
- "eslint-plugin-unicorn": "^64.0.0",
44
+ "eslint-plugin-unicorn": "^72.0.0",
47
45
  "mobx": "^6.16.1",
48
46
  "mobx-react": "^9.2.2",
49
- "msa-parsers": "^5.5.0",
47
+ "msa-parsers": "^5.6.1",
50
48
  "pixelmatch": "^7.2.0",
51
49
  "pngjs": "^7.0.0",
52
- "prettier": "^3.8.4",
53
- "pretty-bytes": "^7.1.0",
54
- "puppeteer": "^25.2.1",
55
- "react": "^19.2.7",
56
- "react-dom": "^19.2.7",
50
+ "prettier": "^3.9.6",
51
+ "pretty-bytes": "^7.1.1",
52
+ "puppeteer": "^25.3.0",
53
+ "react": "^19.2.8",
54
+ "react-dom": "^19.2.8",
57
55
  "rimraf": "^6.1.3",
58
56
  "rxjs": "^7.8.2",
59
57
  "serve": "^14.2.6",
60
58
  "tss-react": "^4.9.21",
61
- "typescript": "^6.0.3",
62
- "typescript-eslint": "^8.62.0",
63
- "vitest": "^4.1.9"
59
+ "typescript": "^6.0.2",
60
+ "typescript-eslint": "^8.65.0",
61
+ "vitest": "^4.1.10"
64
62
  },
65
63
  "scripts": {
66
64
  "clean": "rimraf dist",
@@ -14,45 +14,70 @@ function isDisplay(elt: { name: string }): elt is DisplayType {
14
14
  return elt.name === 'LinearBasicDisplay'
15
15
  }
16
16
 
17
+ // The canvas LinearBasicDisplay (JBrowse >=4.3) exposes the right-clicked
18
+ // feature via contextMenuInfo + async fetchFullFeature rather than a synchronous
19
+ // feature object.
20
+ interface ContextMenuInfo {
21
+ item: { featureId: string; type?: string }
22
+ displayedRegionIndex: number
23
+ }
24
+
25
+ interface DisplayModel {
26
+ contextMenuItems: () => MenuItem[]
27
+ contextMenuInfo?: ContextMenuInfo
28
+ isGeneLike: boolean
29
+ fetchFullFeature: (
30
+ featureId: string,
31
+ displayedRegionIndex: number,
32
+ ) => Promise<Feature | undefined>
33
+ }
34
+
17
35
  function extendStateModel(stateModel: IAnyModelType) {
18
- return stateModel.views(
19
- (self: {
20
- contextMenuItems: () => MenuItem[]
21
- contextMenuFeature?: Feature
22
- }) => {
23
- const superContextMenuItems = self.contextMenuItems
24
- return {
25
- contextMenuItems() {
26
- const feature = self.contextMenuFeature
27
- const track = getContainingTrack(self)
28
- const featureType = feature?.get('type')
29
- const showMsaMenuItem =
30
- feature && ['gene', 'mRNA', 'transcript'].includes(featureType)
31
- return [
32
- ...superContextMenuItems(),
33
- ...(showMsaMenuItem
34
- ? [
35
- {
36
- label: 'Launch MSA view',
37
- icon: AddIcon,
38
- onClick: () => {
39
- getSession(track).queueDialog(handleClose => [
40
- LaunchMsaViewDialog,
41
- {
42
- model: track,
43
- handleClose,
44
- feature,
45
- },
46
- ])
47
- },
36
+ return stateModel.views((self: DisplayModel) => {
37
+ const superContextMenuItems = self.contextMenuItems
38
+ return {
39
+ contextMenuItems() {
40
+ const track = getContainingTrack(self)
41
+ const session = getSession(track)
42
+ const info = self.contextMenuInfo
43
+ const showMsaMenuItem = info && self.isGeneLike
44
+ return [
45
+ ...superContextMenuItems(),
46
+ ...(showMsaMenuItem
47
+ ? [
48
+ {
49
+ label: 'Launch MSA view',
50
+ icon: AddIcon,
51
+ onClick: () => {
52
+ self
53
+ .fetchFullFeature(
54
+ info.item.featureId,
55
+ info.displayedRegionIndex,
56
+ )
57
+ .then(feature => {
58
+ if (feature) {
59
+ session.queueDialog(handleClose => [
60
+ LaunchMsaViewDialog,
61
+ { model: track, handleClose, feature },
62
+ ])
63
+ } else {
64
+ session.notify(
65
+ 'Could not load feature for MSA view',
66
+ 'warning',
67
+ )
68
+ }
69
+ })
70
+ .catch((e: unknown) => {
71
+ session.notifyError(`${e}`, e)
72
+ })
48
73
  },
49
- ]
50
- : []),
51
- ]
52
- },
53
- }
54
- },
55
- )
74
+ },
75
+ ]
76
+ : []),
77
+ ]
78
+ },
79
+ }
80
+ })
56
81
  }
57
82
 
58
83
  export default function LaunchMsaViewF(pluginManager: PluginManager) {
@@ -77,7 +77,7 @@ export default function stateModelFactory() {
77
77
  /**
78
78
  * #property
79
79
  */
80
- querySeqName: 'QUERY',
80
+ querySeqName: types.stripDefault(types.string, 'QUERY'),
81
81
 
82
82
  /**
83
83
  * #property
@@ -87,7 +87,7 @@ export default function stateModelFactory() {
87
87
  /**
88
88
  * #property
89
89
  */
90
- zoomToBaseLevel: false,
90
+ zoomToBaseLevel: types.stripDefault(types.boolean, false),
91
91
 
92
92
  /**
93
93
  * #property
@@ -207,9 +207,10 @@ export default function stateModelFactory() {
207
207
  * #getter
208
208
  */
209
209
  get connectedHighlights(): IRegion[] {
210
- return [this.connectedHoverHighlight, this.connectedClickHighlight].filter(
211
- (r): r is IRegion => r !== undefined,
212
- )
210
+ return [
211
+ this.connectedHoverHighlight,
212
+ this.connectedClickHighlight,
213
+ ].filter((r): r is IRegion => r !== undefined)
213
214
  },
214
215
  }))
215
216
 
@@ -312,7 +313,6 @@ export default function stateModelFactory() {
312
313
  connectedView.centerAt(r2.start, r2.refName)
313
314
  }
314
315
  },
315
-
316
316
  }))
317
317
  .actions(self => {
318
318
  const superSetMouseClickPos = self.setMouseClickPos.bind(self)
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = '2.6.8'
1
+ export const version = '2.7.0'