react-msaview 3.1.12 → 3.2.1
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/bundle/index.js +32 -31
- package/dist/colorSchemes.d.ts +2 -2
- package/dist/colorSchemes.js +5 -6
- package/dist/colorSchemes.js.map +1 -1
- package/dist/components/Loading.d.ts +1 -1
- package/dist/components/Loading.js +7 -5
- package/dist/components/Loading.js.map +1 -1
- package/dist/components/MSAView.d.ts +1 -1
- package/dist/components/MSAView.js +13 -9
- package/dist/components/MSAView.js.map +1 -1
- package/dist/components/ResizeHandles.d.ts +1 -1
- package/dist/components/ResizeHandles.js +8 -4
- package/dist/components/ResizeHandles.js.map +1 -1
- package/dist/components/SequenceTextArea.js +9 -3
- package/dist/components/SequenceTextArea.js.map +1 -1
- package/dist/components/TextTrack.d.ts +1 -1
- package/dist/components/TextTrack.js +1 -1
- package/dist/components/TextTrack.js.map +1 -1
- package/dist/components/Track.d.ts +1 -1
- package/dist/components/Track.js +6 -2
- package/dist/components/Track.js.map +1 -1
- package/dist/components/VerticalScrollbar.d.ts +6 -0
- package/dist/components/VerticalScrollbar.js +69 -0
- package/dist/components/VerticalScrollbar.js.map +1 -0
- package/dist/components/dialogs/AboutDialog.js +3 -1
- package/dist/components/dialogs/AboutDialog.js.map +1 -1
- package/dist/components/dialogs/AddTrackDialog.d.ts +3 -3
- package/dist/components/dialogs/AddTrackDialog.js +8 -3
- package/dist/components/dialogs/AddTrackDialog.js.map +1 -1
- package/dist/components/dialogs/DomainDialog.d.ts +1 -1
- package/dist/components/dialogs/DomainDialog.js +8 -4
- package/dist/components/dialogs/DomainDialog.js.map +1 -1
- package/dist/components/dialogs/ExportSVGDialog.d.ts +1 -1
- package/dist/components/dialogs/ExportSVGDialog.js +29 -17
- package/dist/components/dialogs/ExportSVGDialog.js.map +1 -1
- package/dist/components/dialogs/FeatureDialog.d.ts +1 -1
- package/dist/components/dialogs/FeatureDialog.js +8 -4
- package/dist/components/dialogs/FeatureDialog.js.map +1 -1
- package/dist/components/dialogs/{InterProScanPanel.d.ts → InterProScanDialog.d.ts} +1 -1
- package/dist/components/dialogs/{InterProScanPanel.js → InterProScanDialog.js} +26 -11
- package/dist/components/dialogs/InterProScanDialog.js.map +1 -0
- package/dist/components/dialogs/MetadataDialog.d.ts +1 -1
- package/dist/components/dialogs/MetadataDialog.js +3 -1
- package/dist/components/dialogs/MetadataDialog.js.map +1 -1
- package/dist/components/dialogs/SettingsDialog.d.ts +1 -1
- package/dist/components/dialogs/SettingsDialog.js +62 -15
- package/dist/components/dialogs/SettingsDialog.js.map +1 -1
- package/dist/components/dialogs/TracklistDialog.d.ts +3 -3
- package/dist/components/dialogs/TracklistDialog.js +8 -3
- package/dist/components/dialogs/TracklistDialog.js.map +1 -1
- package/dist/components/dialogs/UserProvidedDomainsDialog.d.ts +7 -0
- package/dist/components/dialogs/UserProvidedDomainsDialog.js +64 -0
- package/dist/components/dialogs/UserProvidedDomainsDialog.js.map +1 -0
- package/dist/components/header/Header.d.ts +1 -1
- package/dist/components/header/Header.js +11 -4
- package/dist/components/header/Header.js.map +1 -1
- package/dist/components/header/HeaderInfoArea.d.ts +1 -1
- package/dist/components/header/HeaderInfoArea.js +5 -2
- package/dist/components/header/HeaderInfoArea.js.map +1 -1
- package/dist/components/header/HeaderMenu.d.ts +1 -1
- package/dist/components/header/HeaderMenu.js +12 -4
- package/dist/components/header/HeaderMenu.js.map +1 -1
- package/dist/components/header/HeaderMenuExtra.d.ts +1 -1
- package/dist/components/header/HeaderMenuExtra.js +55 -35
- package/dist/components/header/HeaderMenuExtra.js.map +1 -1
- package/dist/components/header/HeaderStatusArea.d.ts +2 -2
- package/dist/components/header/HeaderStatusArea.js +1 -1
- package/dist/components/header/HeaderStatusArea.js.map +1 -1
- package/dist/components/header/MultiAlignmentSelector.d.ts +1 -1
- package/dist/components/header/ZoomControls.js +45 -3
- package/dist/components/header/ZoomControls.js.map +1 -1
- package/dist/components/import/ImportForm.d.ts +3 -3
- package/dist/components/import/ImportForm.js +15 -2
- package/dist/components/import/ImportForm.js.map +1 -1
- package/dist/components/import/ImportFormExamples.d.ts +1 -1
- package/dist/components/import/ImportFormExamples.js +53 -38
- package/dist/components/import/ImportFormExamples.js.map +1 -1
- package/dist/components/import/util.d.ts +2 -2
- package/dist/components/minimap/Minimap.d.ts +1 -1
- package/dist/components/minimap/Minimap.js +24 -17
- package/dist/components/minimap/Minimap.js.map +1 -1
- package/dist/components/minimap/MinimapSVG.d.ts +1 -1
- package/dist/components/minimap/MinimapSVG.js +1 -1
- package/dist/components/minimap/MinimapSVG.js.map +1 -1
- package/dist/components/msa/MSACanvas.d.ts +1 -1
- package/dist/components/msa/MSACanvas.js +3 -3
- package/dist/components/msa/MSACanvas.js.map +1 -1
- package/dist/components/msa/MSACanvasBlock.d.ts +3 -3
- package/dist/components/msa/MSACanvasBlock.js +9 -6
- package/dist/components/msa/MSACanvasBlock.js.map +1 -1
- package/dist/components/msa/MSAMouseoverCanvas.d.ts +1 -1
- package/dist/components/msa/MSAPanel.d.ts +1 -1
- package/dist/components/msa/renderBoxFeatureCanvasBlock.d.ts +1 -1
- package/dist/components/msa/renderBoxFeatureCanvasBlock.js +3 -4
- package/dist/components/msa/renderBoxFeatureCanvasBlock.js.map +1 -1
- package/dist/components/msa/renderMSABlock.d.ts +2 -2
- package/dist/components/msa/renderMSABlock.js +16 -16
- package/dist/components/msa/renderMSABlock.js.map +1 -1
- package/dist/components/msa/renderMSAMouseover.d.ts +1 -1
- package/dist/components/msa/renderMSAMouseover.js +3 -3
- package/dist/components/msa/renderMSAMouseover.js.map +1 -1
- package/dist/components/tree/TreeBranchMenu.d.ts +1 -1
- package/dist/components/tree/TreeBranchMenu.js +6 -3
- package/dist/components/tree/TreeBranchMenu.js.map +1 -1
- package/dist/components/tree/TreeCanvas.d.ts +1 -1
- package/dist/components/tree/TreeCanvas.js +13 -12
- package/dist/components/tree/TreeCanvas.js.map +1 -1
- package/dist/components/tree/TreeCanvasBlock.d.ts +1 -1
- package/dist/components/tree/TreeCanvasBlock.js +13 -5
- package/dist/components/tree/TreeCanvasBlock.js.map +1 -1
- package/dist/components/tree/TreeNodeMenu.d.ts +1 -1
- package/dist/components/tree/TreeNodeMenu.js +3 -3
- package/dist/components/tree/TreeNodeMenu.js.map +1 -1
- package/dist/components/tree/TreePanel.d.ts +1 -1
- package/dist/components/tree/TreeRuler.d.ts +1 -1
- package/dist/components/tree/dialogs/TreeNodeInfoDialog.d.ts +3 -3
- package/dist/components/tree/dialogs/TreeNodeInfoDialog.js +5 -2
- package/dist/components/tree/dialogs/TreeNodeInfoDialog.js.map +1 -1
- package/dist/components/tree/renderTreeCanvas.d.ts +3 -3
- package/dist/components/tree/renderTreeCanvas.js +25 -9
- package/dist/components/tree/renderTreeCanvas.js.map +1 -1
- package/dist/components/util.js +1 -4
- package/dist/components/util.js.map +1 -1
- package/dist/ggplotPalettes.js.map +1 -1
- package/dist/launchInterProScan.d.ts +1 -1
- package/dist/launchInterProScan.js +11 -13
- package/dist/launchInterProScan.js.map +1 -1
- package/dist/model/DataModel.d.ts +5 -1
- package/dist/model/DataModel.js +10 -1
- package/dist/model/DataModel.js.map +1 -1
- package/dist/model/DialogQueue.d.ts +1 -1
- package/dist/model/DialogQueue.js +0 -1
- package/dist/model/DialogQueue.js.map +1 -1
- package/dist/model.d.ts +187 -35
- package/dist/model.js +317 -94
- package/dist/model.js.map +1 -1
- package/dist/parseGFF.js +8 -6
- package/dist/parseGFF.js.map +1 -1
- package/dist/parseNewick.js +1 -2
- package/dist/parseNewick.js.map +1 -1
- package/dist/parsers/ClustalMSA.d.ts +2 -2
- package/dist/parsers/ClustalMSA.js.map +1 -1
- package/dist/parsers/FastaMSA.d.ts +1 -1
- package/dist/parsers/FastaMSA.js +3 -3
- package/dist/parsers/FastaMSA.js.map +1 -1
- package/dist/parsers/StockholmMSA.d.ts +7 -7
- package/dist/parsers/StockholmMSA.js +4 -4
- package/dist/parsers/StockholmMSA.js.map +1 -1
- package/dist/renderToSvg.d.ts +2 -2
- package/dist/renderToSvg.js +6 -11
- package/dist/renderToSvg.js.map +1 -1
- package/dist/reparseTree.d.ts +1 -1
- package/dist/rowCoordinateCalculations.d.ts +2 -0
- package/dist/rowCoordinateCalculations.js +26 -0
- package/dist/rowCoordinateCalculations.js.map +1 -0
- package/dist/rowCoordinateCalculations.test.d.ts +1 -0
- package/dist/rowCoordinateCalculations.test.js +18 -0
- package/dist/rowCoordinateCalculations.test.js.map +1 -0
- package/dist/util.d.ts +2 -2
- package/dist/util.js +0 -2
- package/dist/util.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +10 -3
- package/src/colorSchemes.ts +7 -6
- package/src/components/Checkbox2.tsx +1 -1
- package/src/components/Loading.tsx +18 -6
- package/src/components/MSAView.tsx +27 -18
- package/src/components/ResizeHandles.tsx +9 -5
- package/src/components/SequenceTextArea.tsx +10 -4
- package/src/components/TextTrack.tsx +3 -3
- package/src/components/Track.tsx +9 -5
- package/src/components/VerticalScrollbar.tsx +89 -0
- package/src/components/dialogs/AboutDialog.tsx +7 -1
- package/src/components/dialogs/AddTrackDialog.tsx +15 -5
- package/src/components/dialogs/DomainDialog.tsx +12 -5
- package/src/components/dialogs/ExportSVGDialog.tsx +37 -18
- package/src/components/dialogs/FeatureDialog.tsx +10 -8
- package/src/components/dialogs/{InterProScanPanel.tsx → InterProScanDialog.tsx} +30 -13
- package/src/components/dialogs/MetadataDialog.tsx +9 -2
- package/src/components/dialogs/SettingsDialog.tsx +98 -19
- package/src/components/dialogs/TracklistDialog.tsx +18 -4
- package/src/components/dialogs/UserProvidedDomainsDialog.tsx +139 -0
- package/src/components/header/Header.tsx +12 -5
- package/src/components/header/HeaderInfoArea.tsx +4 -3
- package/src/components/header/HeaderMenu.tsx +13 -8
- package/src/components/header/HeaderMenuExtra.tsx +59 -43
- package/src/components/header/HeaderStatusArea.tsx +2 -6
- package/src/components/header/MultiAlignmentSelector.tsx +1 -1
- package/src/components/header/ZoomControls.tsx +52 -2
- package/src/components/import/ImportForm.tsx +16 -4
- package/src/components/import/ImportFormExamples.tsx +77 -64
- package/src/components/import/util.ts +2 -2
- package/src/components/minimap/Minimap.tsx +34 -29
- package/src/components/minimap/MinimapSVG.tsx +2 -2
- package/src/components/msa/MSACanvas.tsx +11 -4
- package/src/components/msa/MSACanvasBlock.tsx +10 -7
- package/src/components/msa/MSAMouseoverCanvas.tsx +1 -1
- package/src/components/msa/MSAPanel.tsx +1 -1
- package/src/components/msa/renderBoxFeatureCanvasBlock.ts +8 -9
- package/src/components/msa/renderMSABlock.ts +44 -24
- package/src/components/msa/renderMSAMouseover.ts +4 -4
- package/src/components/tree/TreeBranchMenu.tsx +6 -4
- package/src/components/tree/TreeCanvas.tsx +15 -16
- package/src/components/tree/TreeCanvasBlock.tsx +14 -6
- package/src/components/tree/TreeNodeMenu.tsx +4 -4
- package/src/components/tree/TreePanel.tsx +1 -1
- package/src/components/tree/TreeRuler.tsx +1 -1
- package/src/components/tree/dialogs/TreeNodeInfoDialog.tsx +12 -3
- package/src/components/tree/renderTreeCanvas.ts +32 -12
- package/src/components/util.ts +2 -5
- package/src/ggplotPalettes.ts +1 -1
- package/src/launchInterProScan.ts +13 -15
- package/src/model/DataModel.ts +10 -0
- package/src/model/DialogQueue.ts +1 -2
- package/src/model.ts +355 -112
- package/src/parseGFF.ts +13 -11
- package/src/parseNewick.ts +4 -4
- package/src/parsers/ClustalMSA.ts +3 -3
- package/src/parsers/FastaMSA.ts +5 -5
- package/src/parsers/StockholmMSA.ts +11 -11
- package/src/renderToSvg.tsx +7 -8
- package/src/reparseTree.ts +1 -1
- package/src/rowCoordinateCalculations.test.ts +19 -0
- package/src/rowCoordinateCalculations.ts +26 -0
- package/src/util.ts +2 -4
- package/src/version.ts +1 -1
- package/dist/components/dialogs/InterProScanPanel.js.map +0 -1
- package/dist/components/dialogs/UserProvidedResultPanel.d.ts +0 -7
- package/dist/components/dialogs/UserProvidedResultPanel.js +0 -56
- package/dist/components/dialogs/UserProvidedResultPanel.js.map +0 -1
- package/src/components/dialogs/UserProvidedResultPanel.tsx +0 -119
package/src/colorSchemes.ts
CHANGED
|
@@ -5,6 +5,7 @@ import { transform } from './util'
|
|
|
5
5
|
extend([namesPlugin])
|
|
6
6
|
|
|
7
7
|
const colorSchemes = {
|
|
8
|
+
none: {},
|
|
8
9
|
clustal: {
|
|
9
10
|
G: 'orange',
|
|
10
11
|
P: 'orange',
|
|
@@ -351,12 +352,12 @@ export default transform(colorSchemes, ([key, val]) => [
|
|
|
351
352
|
// should be WLVIMAFCHPY, colprot.xml says e.g. %#ACFHILMVWYPp" which has Y
|
|
352
353
|
export function getClustalXColor(
|
|
353
354
|
stats: Record<string, number>,
|
|
355
|
+
total: number,
|
|
354
356
|
model: { columns: Record<string, string> },
|
|
355
357
|
row: string,
|
|
356
358
|
col: number,
|
|
357
359
|
) {
|
|
358
|
-
const
|
|
359
|
-
const l = model.columns[row][col]
|
|
360
|
+
const l = model.columns[row]![col]!
|
|
360
361
|
const {
|
|
361
362
|
W = 0,
|
|
362
363
|
L = 0,
|
|
@@ -494,16 +495,16 @@ export function getClustalXColor(
|
|
|
494
495
|
// info http://www.jalview.org/help/html/colourSchemes/clustal.html
|
|
495
496
|
// modifications:
|
|
496
497
|
// reference to clustalX source code scheme modifies what the jalview.org
|
|
497
|
-
// scheme says there the jalview.org colorscheme says WLVIMAFCHP but it
|
|
498
|
-
//
|
|
498
|
+
// scheme says there the jalview.org colorscheme says WLVIMAFCHP but it should
|
|
499
|
+
// be WLVIMAFCHPY, colprot.xml says e.g. %#ACFHILMVWYPp" which has Y
|
|
499
500
|
export function getPercentIdentityColor(
|
|
500
501
|
stats: Record<string, number>,
|
|
502
|
+
total: number,
|
|
501
503
|
model: { columns: Record<string, string> },
|
|
502
504
|
row: string,
|
|
503
505
|
col: number,
|
|
504
506
|
) {
|
|
505
|
-
const
|
|
506
|
-
const l = model.columns[row][col]
|
|
507
|
+
const l = model.columns[row]![col]!
|
|
507
508
|
const entries = Object.entries(stats)
|
|
508
509
|
let ent = 0
|
|
509
510
|
let letter = ''
|
|
@@ -7,28 +7,40 @@ import { ErrorMessage } from '@jbrowse/core/ui'
|
|
|
7
7
|
// locals
|
|
8
8
|
import ImportForm from './import/ImportForm'
|
|
9
9
|
import MSAView from './MSAView'
|
|
10
|
-
import { MsaViewModel } from '../model'
|
|
10
|
+
import type { MsaViewModel } from '../model'
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
const Reset = observer(function ({
|
|
13
|
+
model,
|
|
14
|
+
error,
|
|
15
|
+
}: {
|
|
16
|
+
model: MsaViewModel
|
|
17
|
+
error: unknown
|
|
18
|
+
}) {
|
|
13
19
|
return (
|
|
14
20
|
<div>
|
|
15
21
|
<ErrorMessage error={error} />
|
|
16
|
-
<Button
|
|
22
|
+
<Button
|
|
23
|
+
variant="contained"
|
|
24
|
+
color="primary"
|
|
25
|
+
onClick={() => {
|
|
26
|
+
model.reset()
|
|
27
|
+
}}
|
|
28
|
+
>
|
|
17
29
|
Return to import form
|
|
18
30
|
</Button>
|
|
19
31
|
</div>
|
|
20
32
|
)
|
|
21
|
-
}
|
|
33
|
+
})
|
|
22
34
|
|
|
23
35
|
const Loading = observer(function ({ model }: { model: MsaViewModel }) {
|
|
24
|
-
const { isLoading,
|
|
36
|
+
const { isLoading, dataInitialized } = model
|
|
25
37
|
|
|
26
38
|
return (
|
|
27
39
|
<div>
|
|
28
40
|
<ErrorBoundary
|
|
29
41
|
fallbackRender={props => <Reset model={model} error={props.error} />}
|
|
30
42
|
>
|
|
31
|
-
{
|
|
43
|
+
{dataInitialized ? (
|
|
32
44
|
isLoading ? (
|
|
33
45
|
<Typography variant="h4">Loading...</Typography>
|
|
34
46
|
) : (
|
|
@@ -3,55 +3,64 @@ import { observer } from 'mobx-react'
|
|
|
3
3
|
|
|
4
4
|
// locals
|
|
5
5
|
import { HorizontalResizeHandle, VerticalResizeHandle } from './ResizeHandles'
|
|
6
|
-
import { MsaViewModel } from '../model'
|
|
6
|
+
import type { MsaViewModel } from '../model'
|
|
7
7
|
import TreeRuler from './tree/TreeRuler'
|
|
8
8
|
import Header from './header/Header'
|
|
9
9
|
import MSAPanel from './msa/MSAPanel'
|
|
10
10
|
import TreePanel from './tree/TreePanel'
|
|
11
11
|
import Minimap from './minimap/Minimap'
|
|
12
|
+
import VerticalScrollbar from './VerticalScrollbar'
|
|
12
13
|
|
|
13
|
-
|
|
14
|
+
const TopArea = observer(function ({ model }: { model: MsaViewModel }) {
|
|
15
|
+
const { showHorizontalScrollbar } = model
|
|
14
16
|
return (
|
|
15
17
|
<div style={{ display: 'flex' }}>
|
|
16
18
|
<TreeRuler model={model} />
|
|
17
|
-
<Minimap model={model} />
|
|
19
|
+
{showHorizontalScrollbar ? <Minimap model={model} /> : null}
|
|
18
20
|
</div>
|
|
19
21
|
)
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
const MainArea = observer(function ({ model }: { model: MsaViewModel }) {
|
|
25
|
+
const { showVerticalScrollbar } = model
|
|
26
|
+
|
|
22
27
|
return (
|
|
23
28
|
<div style={{ display: 'flex' }}>
|
|
24
29
|
<TreePanel model={model} />
|
|
25
30
|
<VerticalResizeHandle model={model} />
|
|
26
31
|
<MSAPanel model={model} />
|
|
32
|
+
{showVerticalScrollbar ? <VerticalScrollbar model={model} /> : null}
|
|
27
33
|
</div>
|
|
28
34
|
)
|
|
29
|
-
}
|
|
35
|
+
})
|
|
30
36
|
|
|
31
37
|
const View = observer(function ({ model }: { model: MsaViewModel }) {
|
|
32
38
|
return (
|
|
33
39
|
<div style={{ position: 'relative' }}>
|
|
34
40
|
<TopArea model={model} />
|
|
35
|
-
|
|
36
41
|
<MainArea model={model} />
|
|
37
42
|
</div>
|
|
38
43
|
)
|
|
39
44
|
})
|
|
40
45
|
|
|
41
46
|
const MSAView = observer(function ({ model }: { model: MsaViewModel }) {
|
|
42
|
-
const { height, DialogComponent, DialogProps } = model
|
|
47
|
+
const { height, viewInitialized, DialogComponent, DialogProps } = model
|
|
43
48
|
return (
|
|
44
49
|
<div>
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
50
|
+
{viewInitialized ? (
|
|
51
|
+
<>
|
|
52
|
+
<div style={{ height, overflow: 'hidden' }}>
|
|
53
|
+
<Header model={model} />
|
|
54
|
+
<View model={model} />
|
|
55
|
+
</div>
|
|
56
|
+
<HorizontalResizeHandle model={model} />
|
|
57
|
+
|
|
58
|
+
{DialogComponent ? (
|
|
59
|
+
<Suspense fallback={null}>
|
|
60
|
+
<DialogComponent {...DialogProps} />
|
|
61
|
+
</Suspense>
|
|
62
|
+
) : null}
|
|
63
|
+
</>
|
|
55
64
|
) : null}
|
|
56
65
|
</div>
|
|
57
66
|
)
|
|
@@ -2,7 +2,7 @@ import React, { useEffect, useRef, useState } from 'react'
|
|
|
2
2
|
import { observer } from 'mobx-react'
|
|
3
3
|
|
|
4
4
|
// locals
|
|
5
|
-
import { MsaViewModel } from '../model'
|
|
5
|
+
import type { MsaViewModel } from '../model'
|
|
6
6
|
|
|
7
7
|
export const VerticalResizeHandle = observer(function ({
|
|
8
8
|
model,
|
|
@@ -57,12 +57,14 @@ export const VerticalResizeHandle = observer(function ({
|
|
|
57
57
|
return (
|
|
58
58
|
<div>
|
|
59
59
|
<div
|
|
60
|
-
onMouseDown={() =>
|
|
60
|
+
onMouseDown={() => {
|
|
61
|
+
setMouseDragging(true)
|
|
62
|
+
}}
|
|
61
63
|
style={{
|
|
62
64
|
cursor: 'ew-resize',
|
|
63
65
|
height: '100%',
|
|
64
66
|
width: resizeHandleWidth,
|
|
65
|
-
background:
|
|
67
|
+
background: 'rgba(200,200,200)',
|
|
66
68
|
position: 'relative',
|
|
67
69
|
}}
|
|
68
70
|
/>
|
|
@@ -123,12 +125,14 @@ export const HorizontalResizeHandle = observer(function ({
|
|
|
123
125
|
return (
|
|
124
126
|
<div>
|
|
125
127
|
<div
|
|
126
|
-
onMouseDown={() =>
|
|
128
|
+
onMouseDown={() => {
|
|
129
|
+
setMouseDragging(true)
|
|
130
|
+
}}
|
|
127
131
|
style={{
|
|
128
132
|
cursor: 'ns-resize',
|
|
129
133
|
width: '100%',
|
|
130
134
|
height: resizeHandleWidth,
|
|
131
|
-
background:
|
|
135
|
+
background: 'rgba(200,200,200)',
|
|
132
136
|
position: 'relative',
|
|
133
137
|
}}
|
|
134
138
|
/>
|
|
@@ -25,7 +25,7 @@ export default function SequenceTextArea({ str }: { str: [string, string][] }) {
|
|
|
25
25
|
const [showEmpty, setShowEmpty] = useState(false)
|
|
26
26
|
|
|
27
27
|
const disp = str
|
|
28
|
-
.map(([s1, s2]) => [s1, showGaps ? s2 : s2.replaceAll('-', '')])
|
|
28
|
+
.map(([s1, s2]) => [s1, showGaps ? s2 : s2.replaceAll('-', '')] as const)
|
|
29
29
|
.filter(f => (showEmpty ? true : !!f[1]))
|
|
30
30
|
.map(([s1, s2]) => `>${s1}\n${showGaps ? s2 : s2.replaceAll('-', '')}`)
|
|
31
31
|
.join('\n')
|
|
@@ -37,7 +37,9 @@ export default function SequenceTextArea({ str }: { str: [string, string][] }) {
|
|
|
37
37
|
onClick={() => {
|
|
38
38
|
copy(disp)
|
|
39
39
|
setCopied(true)
|
|
40
|
-
setTimeout(() =>
|
|
40
|
+
setTimeout(() => {
|
|
41
|
+
setCopied(false)
|
|
42
|
+
}, 500)
|
|
41
43
|
}}
|
|
42
44
|
>
|
|
43
45
|
{copied ? 'Copied!' : 'Copy to clipboard'}
|
|
@@ -45,12 +47,16 @@ export default function SequenceTextArea({ str }: { str: [string, string][] }) {
|
|
|
45
47
|
<Checkbox2
|
|
46
48
|
label="Show gaps"
|
|
47
49
|
checked={showGaps}
|
|
48
|
-
onChange={() =>
|
|
50
|
+
onChange={() => {
|
|
51
|
+
setShowGaps(!showGaps)
|
|
52
|
+
}}
|
|
49
53
|
/>
|
|
50
54
|
<Checkbox2
|
|
51
55
|
label="Show empty"
|
|
52
56
|
checked={showEmpty}
|
|
53
|
-
onChange={() =>
|
|
57
|
+
onChange={() => {
|
|
58
|
+
setShowEmpty(!showEmpty)
|
|
59
|
+
}}
|
|
54
60
|
/>
|
|
55
61
|
<TextField
|
|
56
62
|
variant="outlined"
|
|
@@ -2,7 +2,7 @@ import React, { useRef, useMemo, useEffect } from 'react'
|
|
|
2
2
|
import { useTheme } from '@mui/material'
|
|
3
3
|
import { observer } from 'mobx-react'
|
|
4
4
|
// locals
|
|
5
|
-
import { MsaViewModel, ITextTrack } from '../model'
|
|
5
|
+
import type { MsaViewModel, ITextTrack } from '../model'
|
|
6
6
|
import { colorContrast } from '../util'
|
|
7
7
|
|
|
8
8
|
const AnnotationBlock = observer(function ({
|
|
@@ -55,9 +55,9 @@ const AnnotationBlock = observer(function ({
|
|
|
55
55
|
|
|
56
56
|
const xStart = Math.max(0, Math.floor(offsetX / colWidth))
|
|
57
57
|
const xEnd = Math.max(0, Math.ceil((offsetX + blockSize) / colWidth))
|
|
58
|
-
const str = data
|
|
58
|
+
const str = data.slice(xStart, xEnd)
|
|
59
59
|
for (let i = 0; str && i < str.length; i++) {
|
|
60
|
-
const letter = str[i]
|
|
60
|
+
const letter = str[i]!
|
|
61
61
|
const color = colorScheme[letter.toUpperCase()]
|
|
62
62
|
if (bgColor) {
|
|
63
63
|
const x = i * colWidth + offsetX - (offsetX % colWidth)
|
package/src/components/Track.tsx
CHANGED
|
@@ -8,7 +8,7 @@ import { makeStyles } from 'tss-react/mui'
|
|
|
8
8
|
import ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown'
|
|
9
9
|
|
|
10
10
|
// locals
|
|
11
|
-
import { MsaViewModel } from '../model'
|
|
11
|
+
import type { MsaViewModel } from '../model'
|
|
12
12
|
|
|
13
13
|
// lazies
|
|
14
14
|
const TrackInfoDialog = lazy(() => import('./dialogs/TrackInfoDialog'))
|
|
@@ -24,7 +24,7 @@ export const TrackLabel = observer(function ({
|
|
|
24
24
|
track,
|
|
25
25
|
}: {
|
|
26
26
|
model: MsaViewModel
|
|
27
|
-
|
|
27
|
+
|
|
28
28
|
track: any
|
|
29
29
|
}) {
|
|
30
30
|
const [anchorEl, setAnchorEl] = useState<HTMLButtonElement>()
|
|
@@ -53,7 +53,9 @@ export const TrackLabel = observer(function ({
|
|
|
53
53
|
width: trackLabelHeight,
|
|
54
54
|
height: trackLabelHeight,
|
|
55
55
|
}}
|
|
56
|
-
onClick={event =>
|
|
56
|
+
onClick={event => {
|
|
57
|
+
setAnchorEl(event.currentTarget)
|
|
58
|
+
}}
|
|
57
59
|
>
|
|
58
60
|
<ArrowDropDownIcon />
|
|
59
61
|
</IconButton>
|
|
@@ -62,7 +64,9 @@ export const TrackLabel = observer(function ({
|
|
|
62
64
|
anchorEl={anchorEl}
|
|
63
65
|
transitionDuration={0}
|
|
64
66
|
open
|
|
65
|
-
onClose={() =>
|
|
67
|
+
onClose={() => {
|
|
68
|
+
setAnchorEl(undefined)
|
|
69
|
+
}}
|
|
66
70
|
>
|
|
67
71
|
<MenuItem
|
|
68
72
|
dense
|
|
@@ -96,7 +100,7 @@ const Track = observer(function ({
|
|
|
96
100
|
track,
|
|
97
101
|
}: {
|
|
98
102
|
model: MsaViewModel
|
|
99
|
-
|
|
103
|
+
|
|
100
104
|
track: any
|
|
101
105
|
}) {
|
|
102
106
|
const { resizeHandleWidth } = model
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { observer } from 'mobx-react'
|
|
2
|
+
import React, { useEffect, useRef, useState } from 'react'
|
|
3
|
+
import type { MsaViewModel } from '../model'
|
|
4
|
+
import { clamp } from '../util'
|
|
5
|
+
|
|
6
|
+
const VerticalScrollbar = observer(({ model }: { model: MsaViewModel }) => {
|
|
7
|
+
const { msaAreaHeight, scrollY, totalHeight } = model
|
|
8
|
+
const [hovered, setHovered] = useState(false)
|
|
9
|
+
const scheduled = useRef(false)
|
|
10
|
+
const [mouseDown, setMouseDown] = useState<{
|
|
11
|
+
clientY: number
|
|
12
|
+
scrollY: number
|
|
13
|
+
}>()
|
|
14
|
+
const fill = 'rgba(66, 119, 127, 0.3)'
|
|
15
|
+
const unit = msaAreaHeight / totalHeight
|
|
16
|
+
const top = -scrollY
|
|
17
|
+
const bottom = top + msaAreaHeight
|
|
18
|
+
const t = top * unit
|
|
19
|
+
const b = bottom * unit
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
function fn(event: MouseEvent) {
|
|
22
|
+
if (mouseDown !== undefined) {
|
|
23
|
+
if (!scheduled.current) {
|
|
24
|
+
scheduled.current = true
|
|
25
|
+
window.requestAnimationFrame(() => {
|
|
26
|
+
model.setScrollY(
|
|
27
|
+
clamp(
|
|
28
|
+
-totalHeight,
|
|
29
|
+
mouseDown.scrollY - (event.clientY - mouseDown.clientY) / unit,
|
|
30
|
+
0,
|
|
31
|
+
),
|
|
32
|
+
)
|
|
33
|
+
scheduled.current = false
|
|
34
|
+
})
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function fn2() {
|
|
39
|
+
setMouseDown(undefined)
|
|
40
|
+
}
|
|
41
|
+
if (mouseDown !== undefined) {
|
|
42
|
+
document.addEventListener('mousemove', fn)
|
|
43
|
+
document.addEventListener('mouseup', fn2)
|
|
44
|
+
return () => {
|
|
45
|
+
document.removeEventListener('mousemove', fn)
|
|
46
|
+
document.removeEventListener('mousemove', fn2)
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}, [model, unit, totalHeight, mouseDown])
|
|
50
|
+
return (
|
|
51
|
+
<div
|
|
52
|
+
style={{
|
|
53
|
+
position: 'relative',
|
|
54
|
+
width: 20,
|
|
55
|
+
height: msaAreaHeight,
|
|
56
|
+
borderLeft: '1px solid #555',
|
|
57
|
+
borderTop: '1px solid #555',
|
|
58
|
+
boxSizing: 'border-box',
|
|
59
|
+
}}
|
|
60
|
+
>
|
|
61
|
+
<div
|
|
62
|
+
style={{
|
|
63
|
+
position: 'absolute',
|
|
64
|
+
top: Math.max(0, t),
|
|
65
|
+
left: 0,
|
|
66
|
+
background: hovered ? 'rgba(66,119,127,0.6)' : fill,
|
|
67
|
+
cursor: 'pointer',
|
|
68
|
+
boxSizing: 'border-box',
|
|
69
|
+
width: 20,
|
|
70
|
+
height: Math.max(b - t, 20),
|
|
71
|
+
zIndex: 100,
|
|
72
|
+
}}
|
|
73
|
+
onMouseOver={() => {
|
|
74
|
+
setHovered(true)
|
|
75
|
+
}}
|
|
76
|
+
onMouseOut={() => {
|
|
77
|
+
setHovered(false)
|
|
78
|
+
}}
|
|
79
|
+
onMouseDown={event => {
|
|
80
|
+
setMouseDown({
|
|
81
|
+
clientY: event.clientY,
|
|
82
|
+
scrollY: model.scrollY,
|
|
83
|
+
})
|
|
84
|
+
}}
|
|
85
|
+
/>
|
|
86
|
+
</div>
|
|
87
|
+
)
|
|
88
|
+
})
|
|
89
|
+
export default VerticalScrollbar
|
|
@@ -5,7 +5,13 @@ import { version } from '../../version'
|
|
|
5
5
|
|
|
6
6
|
export default function AboutDialog({ onClose }: { onClose: () => void }) {
|
|
7
7
|
return (
|
|
8
|
-
<Dialog
|
|
8
|
+
<Dialog
|
|
9
|
+
onClose={() => {
|
|
10
|
+
onClose()
|
|
11
|
+
}}
|
|
12
|
+
open
|
|
13
|
+
title="About this plugin"
|
|
14
|
+
>
|
|
9
15
|
<DialogContent>
|
|
10
16
|
<Typography>
|
|
11
17
|
MSAView {version} (
|
|
@@ -8,11 +8,11 @@ import {
|
|
|
8
8
|
Typography,
|
|
9
9
|
} from '@mui/material'
|
|
10
10
|
import { Dialog, FileSelector } from '@jbrowse/core/ui'
|
|
11
|
-
import { FileLocation } from '@jbrowse/core/util/types'
|
|
11
|
+
import type { FileLocation } from '@jbrowse/core/util/types'
|
|
12
12
|
import { observer } from 'mobx-react'
|
|
13
|
-
import { MsaViewModel } from '../../model'
|
|
13
|
+
import type { MsaViewModel } from '../../model'
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
const AddTrackDialog = observer(function ({
|
|
16
16
|
model,
|
|
17
17
|
onClose,
|
|
18
18
|
open,
|
|
@@ -26,7 +26,13 @@ export default observer(function ({
|
|
|
26
26
|
const [currentOption, setCurrentOption] = useState('')
|
|
27
27
|
|
|
28
28
|
return (
|
|
29
|
-
<Dialog
|
|
29
|
+
<Dialog
|
|
30
|
+
onClose={() => {
|
|
31
|
+
onClose()
|
|
32
|
+
}}
|
|
33
|
+
open={open}
|
|
34
|
+
title="Add track"
|
|
35
|
+
>
|
|
30
36
|
<DialogContent>
|
|
31
37
|
<Typography>
|
|
32
38
|
Open relevant per-alignment tracks e.g. protein domains
|
|
@@ -62,7 +68,9 @@ export default observer(function ({
|
|
|
62
68
|
<Button
|
|
63
69
|
color="secondary"
|
|
64
70
|
variant="contained"
|
|
65
|
-
onClick={() =>
|
|
71
|
+
onClick={() => {
|
|
72
|
+
onClose()
|
|
73
|
+
}}
|
|
66
74
|
>
|
|
67
75
|
Cancel
|
|
68
76
|
</Button>
|
|
@@ -71,3 +79,5 @@ export default observer(function ({
|
|
|
71
79
|
</Dialog>
|
|
72
80
|
)
|
|
73
81
|
})
|
|
82
|
+
|
|
83
|
+
export default AddTrackDialog
|
|
@@ -3,10 +3,10 @@ import { Dialog } from '@jbrowse/core/ui'
|
|
|
3
3
|
import { Tab, Tabs } from '@mui/material'
|
|
4
4
|
|
|
5
5
|
// locals
|
|
6
|
-
import InterProScanPanel from './
|
|
7
|
-
import UserProvidedResultPanel from './
|
|
6
|
+
import InterProScanPanel from './InterProScanDialog'
|
|
7
|
+
import UserProvidedResultPanel from './UserProvidedDomainsDialog'
|
|
8
8
|
import TabPanel from './TabPanel'
|
|
9
|
-
import { MsaViewModel } from '../../model'
|
|
9
|
+
import type { MsaViewModel } from '../../model'
|
|
10
10
|
|
|
11
11
|
export default function LaunchDomainViewDialog({
|
|
12
12
|
handleClose,
|
|
@@ -20,10 +20,17 @@ export default function LaunchDomainViewDialog({
|
|
|
20
20
|
<Dialog
|
|
21
21
|
maxWidth="xl"
|
|
22
22
|
title="Launch protein view"
|
|
23
|
-
onClose={() =>
|
|
23
|
+
onClose={() => {
|
|
24
|
+
handleClose()
|
|
25
|
+
}}
|
|
24
26
|
open
|
|
25
27
|
>
|
|
26
|
-
<Tabs
|
|
28
|
+
<Tabs
|
|
29
|
+
value={choice}
|
|
30
|
+
onChange={(_, val) => {
|
|
31
|
+
setChoice(val)
|
|
32
|
+
}}
|
|
33
|
+
>
|
|
27
34
|
<Tab value={0} label="Automatic lookup" />
|
|
28
35
|
<Tab value={1} label="Manual" />
|
|
29
36
|
</Tabs>
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
useTheme,
|
|
14
14
|
} from '@mui/material'
|
|
15
15
|
// locals
|
|
16
|
-
import { MsaViewModel } from '../../model'
|
|
16
|
+
import type { MsaViewModel } from '../../model'
|
|
17
17
|
import Checkbox2 from '../Checkbox2'
|
|
18
18
|
|
|
19
19
|
export default function ExportSVGDialog({
|
|
@@ -28,7 +28,13 @@ export default function ExportSVGDialog({
|
|
|
28
28
|
const [error, setError] = useState<unknown>()
|
|
29
29
|
const theme = useTheme()
|
|
30
30
|
return (
|
|
31
|
-
<Dialog
|
|
31
|
+
<Dialog
|
|
32
|
+
onClose={() => {
|
|
33
|
+
onClose()
|
|
34
|
+
}}
|
|
35
|
+
open
|
|
36
|
+
title="Export SVG"
|
|
37
|
+
>
|
|
32
38
|
<DialogContent>
|
|
33
39
|
{error ? <ErrorMessage error={error} /> : null}
|
|
34
40
|
<Typography>Settings:</Typography>
|
|
@@ -36,14 +42,18 @@ export default function ExportSVGDialog({
|
|
|
36
42
|
label="Include minimap?"
|
|
37
43
|
disabled={exportType === 'entire'}
|
|
38
44
|
checked={includeMinimap}
|
|
39
|
-
onChange={() =>
|
|
45
|
+
onChange={() => {
|
|
46
|
+
setIncludeMinimap(!includeMinimap)
|
|
47
|
+
}}
|
|
40
48
|
/>
|
|
41
49
|
<div>
|
|
42
50
|
<FormControl>
|
|
43
51
|
<FormLabel>Export type</FormLabel>
|
|
44
52
|
<RadioGroup
|
|
45
53
|
value={exportType}
|
|
46
|
-
onChange={event =>
|
|
54
|
+
onChange={event => {
|
|
55
|
+
setExportType(event.target.value)
|
|
56
|
+
}}
|
|
47
57
|
>
|
|
48
58
|
<FormControlLabel
|
|
49
59
|
value="entire"
|
|
@@ -63,24 +73,33 @@ export default function ExportSVGDialog({
|
|
|
63
73
|
<Button
|
|
64
74
|
variant="contained"
|
|
65
75
|
color="primary"
|
|
66
|
-
onClick={
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
76
|
+
onClick={() => {
|
|
77
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
78
|
+
;(async () => {
|
|
79
|
+
try {
|
|
80
|
+
await model.exportSVG({
|
|
81
|
+
theme,
|
|
82
|
+
includeMinimap:
|
|
83
|
+
exportType === 'entire' ? false : includeMinimap,
|
|
84
|
+
exportType,
|
|
85
|
+
})
|
|
86
|
+
} catch (e) {
|
|
87
|
+
console.error(e)
|
|
88
|
+
setError(e)
|
|
89
|
+
}
|
|
90
|
+
onClose()
|
|
91
|
+
})()
|
|
79
92
|
}}
|
|
80
93
|
>
|
|
81
94
|
Submit
|
|
82
95
|
</Button>
|
|
83
|
-
<Button
|
|
96
|
+
<Button
|
|
97
|
+
variant="contained"
|
|
98
|
+
color="secondary"
|
|
99
|
+
onClick={() => {
|
|
100
|
+
onClose()
|
|
101
|
+
}}
|
|
102
|
+
>
|
|
84
103
|
Cancel
|
|
85
104
|
</Button>
|
|
86
105
|
</DialogActions>
|
|
@@ -4,7 +4,7 @@ import { Dialog } from '@jbrowse/core/ui'
|
|
|
4
4
|
import { Button, DialogContent } from '@mui/material'
|
|
5
5
|
|
|
6
6
|
// locals
|
|
7
|
-
import { MsaViewModel } from '../../model'
|
|
7
|
+
import type { MsaViewModel } from '../../model'
|
|
8
8
|
import { getPalette } from '../../ggplotPalettes'
|
|
9
9
|
|
|
10
10
|
const Toggles = observer(function ({ model }: { model: MsaViewModel }) {
|
|
@@ -35,8 +35,8 @@ const Toggles = observer(function ({ model }: { model: MsaViewModel }) {
|
|
|
35
35
|
})
|
|
36
36
|
|
|
37
37
|
const Table = observer(function ({ model }: { model: MsaViewModel }) {
|
|
38
|
-
const {
|
|
39
|
-
const values = [...
|
|
38
|
+
const { tidyInterProAnnotationTypes, featureFilters } = model
|
|
39
|
+
const values = [...tidyInterProAnnotationTypes.values()]
|
|
40
40
|
const palette = getPalette(values.length - 1)
|
|
41
41
|
return (
|
|
42
42
|
<>
|
|
@@ -44,7 +44,7 @@ const Table = observer(function ({ model }: { model: MsaViewModel }) {
|
|
|
44
44
|
<table>
|
|
45
45
|
<thead>
|
|
46
46
|
<tr>
|
|
47
|
-
<td
|
|
47
|
+
<td />
|
|
48
48
|
<td>accession</td>
|
|
49
49
|
<td>name</td>
|
|
50
50
|
<td>description</td>
|
|
@@ -57,12 +57,12 @@ const Table = observer(function ({ model }: { model: MsaViewModel }) {
|
|
|
57
57
|
<input
|
|
58
58
|
type="checkbox"
|
|
59
59
|
checked={featureFilters.get(accession) ?? false}
|
|
60
|
-
onChange={() =>
|
|
60
|
+
onChange={() => {
|
|
61
61
|
model.setFilter(
|
|
62
62
|
accession,
|
|
63
63
|
!model.featureFilters.get(accession),
|
|
64
64
|
)
|
|
65
|
-
}
|
|
65
|
+
}}
|
|
66
66
|
/>
|
|
67
67
|
</td>
|
|
68
68
|
<td>{accession}</td>
|
|
@@ -75,7 +75,7 @@ const Table = observer(function ({ model }: { model: MsaViewModel }) {
|
|
|
75
75
|
height: 20,
|
|
76
76
|
background: palette[idx] || 'black',
|
|
77
77
|
}}
|
|
78
|
-
|
|
78
|
+
/>
|
|
79
79
|
</td>
|
|
80
80
|
</tr>
|
|
81
81
|
))}
|
|
@@ -94,7 +94,9 @@ const FeatureTypeDialog = observer(function ({
|
|
|
94
94
|
}) {
|
|
95
95
|
return (
|
|
96
96
|
<Dialog
|
|
97
|
-
onClose={() =>
|
|
97
|
+
onClose={() => {
|
|
98
|
+
onClose()
|
|
99
|
+
}}
|
|
98
100
|
open
|
|
99
101
|
title="Feature filters"
|
|
100
102
|
maxWidth="xl"
|