react-msaview 9.0.0 → 9.1.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/README.md +19 -10
- package/bundle/index.js +111 -115
- package/bundle/index.js.map +4 -4
- package/dist/blosum62.d.ts +3 -0
- package/dist/blosum62.js +43 -0
- package/dist/blosum62.js.map +1 -0
- package/dist/colorSchemes.js +2 -3
- package/dist/colorSchemes.js.map +1 -1
- package/dist/columnCounts.d.ts +0 -1
- package/dist/columnCounts.js +1 -1
- package/dist/columnCounts.js.map +1 -1
- package/dist/components/Loading.d.ts +3 -2
- package/dist/components/Loading.js +7 -7
- package/dist/components/Loading.js.map +1 -1
- package/dist/components/MSAView.d.ts +3 -2
- package/dist/components/MSAView.js +7 -4
- package/dist/components/MSAView.js.map +1 -1
- package/dist/components/MSAViewer.d.ts +1941 -4
- package/dist/components/MSAViewer.js +144 -201
- package/dist/components/MSAViewer.js.map +1 -1
- package/dist/components/MetadataTable.d.ts +4 -1
- package/dist/components/MetadataTable.js +55 -16
- package/dist/components/MetadataTable.js.map +1 -1
- package/dist/components/ResizeHandles.js +3 -2
- package/dist/components/ResizeHandles.js.map +1 -1
- package/dist/components/Track.js +8 -1
- package/dist/components/Track.js.map +1 -1
- package/dist/components/controls.d.ts +11 -0
- package/dist/components/controls.js +49 -0
- package/dist/components/controls.js.map +1 -0
- package/dist/components/dialogs/AnnotationFileDialog.js +12 -18
- package/dist/components/dialogs/AnnotationFileDialog.js.map +1 -1
- package/dist/components/dialogs/ExportSVGDialog.js +5 -7
- package/dist/components/dialogs/ExportSVGDialog.js.map +1 -1
- package/dist/components/dialogs/FeatureDialog.js +2 -2
- package/dist/components/dialogs/FeatureDialog.js.map +1 -1
- package/dist/components/{header/TreeSettingsMenu.d.ts → dialogs/GapThresholdDialog.d.ts} +3 -2
- package/dist/components/dialogs/GapThresholdDialog.js +15 -0
- package/dist/components/dialogs/GapThresholdDialog.js.map +1 -0
- package/dist/components/{header → dialogs}/GappynessSlider.d.ts +1 -1
- package/dist/components/{header → dialogs}/GappynessSlider.js +3 -10
- package/dist/components/dialogs/GappynessSlider.js.map +1 -0
- package/dist/components/{header → dialogs}/GoToBox.d.ts +4 -2
- package/dist/components/dialogs/GoToBox.js +48 -0
- package/dist/components/dialogs/GoToBox.js.map +1 -0
- package/dist/components/dialogs/GoToDialog.d.ts +6 -0
- package/dist/components/dialogs/GoToDialog.js +10 -0
- package/dist/components/dialogs/GoToDialog.js.map +1 -0
- package/dist/components/dialogs/HelpDialog.d.ts +6 -0
- package/dist/components/dialogs/HelpDialog.js +30 -0
- package/dist/components/dialogs/HelpDialog.js.map +1 -0
- package/dist/components/dialogs/MetadataDialog.js +11 -3
- package/dist/components/dialogs/MetadataDialog.js.map +1 -1
- package/dist/components/dialogs/goTo.d.ts +5 -0
- package/dist/components/{header → dialogs}/goTo.js +1 -1
- package/dist/components/dialogs/goTo.js.map +1 -0
- package/dist/components/dialogs/metadataLabels.d.ts +4 -0
- package/dist/components/dialogs/metadataLabels.js +52 -0
- package/dist/components/dialogs/metadataLabels.js.map +1 -0
- package/dist/components/dialogs/metadataRecord.d.ts +1 -0
- package/dist/components/dialogs/metadataRecord.js +38 -0
- package/dist/components/dialogs/metadataRecord.js.map +1 -0
- package/dist/components/header/Header.d.ts +6 -2
- package/dist/components/header/Header.js +30 -34
- package/dist/components/header/Header.js.map +1 -1
- package/dist/components/header/HiddenColumnsChip.d.ts +6 -0
- package/dist/components/header/HiddenColumnsChip.js +15 -0
- package/dist/components/header/HiddenColumnsChip.js.map +1 -0
- package/dist/components/header/{FileMenu.d.ts → MenuBar.d.ts} +3 -3
- package/dist/components/header/MenuBar.js +33 -0
- package/dist/components/header/MenuBar.js.map +1 -0
- package/dist/components/header/ScrollZoomCheckbox.d.ts +7 -0
- package/dist/components/header/ScrollZoomCheckbox.js +19 -0
- package/dist/components/header/ScrollZoomCheckbox.js.map +1 -0
- package/dist/components/header/ZoomControls.js +12 -48
- package/dist/components/header/ZoomControls.js.map +1 -1
- package/dist/components/header/colorSchemeMenuItems.d.ts +4 -0
- package/dist/components/header/colorSchemeMenuItems.js +106 -0
- package/dist/components/header/colorSchemeMenuItems.js.map +1 -0
- package/dist/components/header/getAnnotationsMenu.d.ts +3 -30
- package/dist/components/header/getAnnotationsMenu.js +48 -54
- package/dist/components/header/getAnnotationsMenu.js.map +1 -1
- package/dist/components/header/menuBarItems.d.ts +11 -0
- package/dist/components/header/menuBarItems.js +277 -0
- package/dist/components/header/menuBarItems.js.map +1 -0
- package/dist/components/import/ImportForm.js +12 -6
- package/dist/components/import/ImportForm.js.map +1 -1
- package/dist/components/import/data/seq2.d.ts +0 -1
- package/dist/components/import/data/seq2.js +0 -17
- package/dist/components/import/data/seq2.js.map +1 -1
- package/dist/components/minimap/Minimap.js +7 -3
- package/dist/components/minimap/Minimap.js.map +1 -1
- package/dist/components/minimap/MinimapSVG.js +2 -1
- package/dist/components/minimap/MinimapSVG.js.map +1 -1
- package/dist/components/minimap/minimapLayout.d.ts +12 -0
- package/dist/components/minimap/minimapLayout.js +20 -0
- package/dist/components/minimap/minimapLayout.js.map +1 -1
- package/dist/components/msa/MSACanvas.js +28 -10
- package/dist/components/msa/MSACanvas.js.map +1 -1
- package/dist/components/msa/MSACanvasBlock.js +17 -16
- package/dist/components/msa/MSACanvasBlock.js.map +1 -1
- package/dist/components/msa/MSAMouseoverCanvas.js +2 -2
- package/dist/components/msa/MSAMouseoverCanvas.js.map +1 -1
- package/dist/components/msa/WheelZoomHint.d.ts +7 -0
- package/dist/components/msa/WheelZoomHint.js +38 -0
- package/dist/components/msa/WheelZoomHint.js.map +1 -0
- package/dist/components/msa/drawFeatureSpans.d.ts +50 -11
- package/dist/components/msa/drawFeatureSpans.js +99 -56
- package/dist/components/msa/drawFeatureSpans.js.map +1 -1
- package/dist/components/msa/msaKeys.js +3 -0
- package/dist/components/msa/msaKeys.js.map +1 -1
- package/dist/components/msa/msaRaster.d.ts +14 -2
- package/dist/components/msa/msaRaster.js +20 -10
- package/dist/components/msa/msaRaster.js.map +1 -1
- package/dist/components/msa/renderBoxFeatureCanvasBlock.d.ts +9 -0
- package/dist/components/msa/renderBoxFeatureCanvasBlock.js +39 -8
- package/dist/components/msa/renderBoxFeatureCanvasBlock.js.map +1 -1
- package/dist/components/msa/renderHighlights.d.ts +2 -5
- package/dist/components/msa/renderHighlights.js +5 -6
- package/dist/components/msa/renderHighlights.js.map +1 -1
- package/dist/components/msa/renderMSABlock.d.ts +6 -1
- package/dist/components/msa/renderMSABlock.js +44 -17
- package/dist/components/msa/renderMSABlock.js.map +1 -1
- package/dist/components/msa/renderMSAMouseover.js +2 -1
- package/dist/components/msa/renderMSAMouseover.js.map +1 -1
- package/dist/components/msa/tileColor.js +7 -0
- package/dist/components/msa/tileColor.js.map +1 -1
- package/dist/components/renderCtx.d.ts +1 -1
- package/dist/components/rowpanels/RowPanelBlock.js +2 -2
- package/dist/components/rowpanels/RowPanelBlock.js.map +1 -1
- package/dist/components/rowpanels/renderFeaturePanel.d.ts +5 -1
- package/dist/components/rowpanels/renderFeaturePanel.js +12 -5
- package/dist/components/rowpanels/renderFeaturePanel.js.map +1 -1
- package/dist/components/settings/MenuItemsForm.d.ts +10 -0
- package/dist/components/settings/MenuItemsForm.js +80 -0
- package/dist/components/settings/MenuItemsForm.js.map +1 -0
- package/dist/components/settings/SettingsPanel.d.ts +12 -0
- package/dist/components/settings/SettingsPanel.js +92 -0
- package/dist/components/settings/SettingsPanel.js.map +1 -0
- package/dist/components/{header/ZoomMenu.d.ts → settings/TrackList.d.ts} +2 -2
- package/dist/components/settings/TrackList.js +55 -0
- package/dist/components/settings/TrackList.js.map +1 -0
- package/dist/components/tracks/TrackBlocks.js +2 -2
- package/dist/components/tracks/TrackBlocks.js.map +1 -1
- package/dist/components/tracks/drawTracks.d.ts +1 -53
- package/dist/components/tracks/drawTracks.js +5 -5
- package/dist/components/tracks/drawTracks.js.map +1 -1
- package/dist/components/tree/CladeLabels.d.ts +1 -1
- package/dist/components/tree/CladeLabels.js +22 -34
- package/dist/components/tree/CladeLabels.js.map +1 -1
- package/dist/components/tree/TreeCanvasBlock.js +2 -2
- package/dist/components/tree/TreeCanvasBlock.js.map +1 -1
- package/dist/components/tree/TreeMenu.js +4 -6
- package/dist/components/tree/TreeMenu.js.map +1 -1
- package/dist/components/tree/TreeOverview.js +2 -2
- package/dist/components/tree/TreeOverview.js.map +1 -1
- package/dist/components/tree/cladeBrackets.d.ts +17 -10
- package/dist/components/tree/cladeBrackets.js +33 -3
- package/dist/components/tree/cladeBrackets.js.map +1 -1
- package/dist/components/tree/renderTreeCanvas.js +2 -8
- package/dist/components/tree/renderTreeCanvas.js.map +1 -1
- package/dist/components/tree/renderTreeOverview.js +4 -11
- package/dist/components/tree/renderTreeOverview.js.map +1 -1
- package/dist/constants.d.ts +4 -1
- package/dist/constants.js +7 -1
- package/dist/constants.js.map +1 -1
- package/dist/darkReader.d.ts +7 -0
- package/dist/darkReader.js +42 -0
- package/dist/darkReader.js.map +1 -0
- package/dist/element.js +25 -53
- package/dist/element.js.map +1 -1
- package/dist/exportLayout.d.ts +39 -0
- package/dist/exportLayout.js +78 -0
- package/dist/exportLayout.js.map +1 -0
- package/dist/featurePanels.d.ts +37 -0
- package/dist/featurePanels.js +187 -0
- package/dist/featurePanels.js.map +1 -0
- package/dist/filehandleLoader.d.ts +41 -0
- package/dist/filehandleLoader.js +99 -0
- package/dist/filehandleLoader.js.map +1 -0
- package/dist/headlessRenderEnv.d.ts +12 -39
- package/dist/headlessRenderEnv.js +18 -12
- package/dist/headlessRenderEnv.js.map +1 -1
- package/dist/hierarchy.d.ts +5 -8
- package/dist/hierarchy.js +5 -79
- package/dist/hierarchy.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/measureTextCanvas.d.ts +7 -0
- package/dist/measureTextCanvas.js +8 -6
- package/dist/measureTextCanvas.js.map +1 -1
- package/dist/model/treeModel.d.ts +6 -2
- package/dist/model/treeModel.js +8 -4
- package/dist/model/treeModel.js.map +1 -1
- package/dist/model.d.ts +180 -76
- package/dist/model.js +358 -618
- package/dist/model.js.map +1 -1
- package/dist/neighborJoining.js +1 -40
- package/dist/neighborJoining.js.map +1 -1
- package/dist/renderToSvg.d.ts +2 -7
- package/dist/renderToSvg.js +33 -133
- package/dist/renderToSvg.js.map +1 -1
- package/dist/rerootTree.d.ts +1 -0
- package/dist/rerootTree.js +7 -6
- package/dist/rerootTree.js.map +1 -1
- package/dist/schemeResidueColor.d.ts +12 -0
- package/dist/schemeResidueColor.js +33 -0
- package/dist/schemeResidueColor.js.map +1 -0
- package/dist/similarityColors.d.ts +11 -0
- package/dist/similarityColors.js +90 -0
- package/dist/similarityColors.js.map +1 -0
- package/dist/svgTestUtil.d.ts +74 -32
- package/dist/treeDisplay.d.ts +37 -0
- package/dist/treeDisplay.js +209 -0
- package/dist/treeDisplay.js.map +1 -0
- package/dist/types.d.ts +6 -3
- package/dist/useWheelScroll.d.ts +3 -1
- package/dist/useWheelScroll.js +36 -17
- package/dist/useWheelScroll.js.map +1 -1
- package/dist/util.d.ts +2 -0
- package/dist/util.js +2 -0
- package/dist/util.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/viewerSnapshot.d.ts +169 -0
- package/dist/viewerSnapshot.js +100 -0
- package/dist/viewerSnapshot.js.map +1 -0
- package/dist/wheelZoom.d.ts +8 -3
- package/dist/wheelZoom.js +44 -32
- package/dist/wheelZoom.js.map +1 -1
- package/dist/zoomSnapshot.d.ts +29 -0
- package/dist/zoomSnapshot.js +47 -0
- package/dist/zoomSnapshot.js.map +1 -0
- package/package.json +11 -11
- package/src/blosum62.ts +45 -0
- package/src/colorSchemes.ts +2 -4
- package/src/columnCounts.ts +1 -1
- package/src/components/Loading.tsx +25 -14
- package/src/components/MSAView.tsx +22 -5
- package/src/components/MSAViewer.tsx +275 -251
- package/src/components/MetadataTable.tsx +83 -26
- package/src/components/ResizeHandles.tsx +9 -2
- package/src/components/Track.tsx +15 -1
- package/src/components/controls.ts +62 -0
- package/src/components/dialogs/AnnotationFileDialog.tsx +16 -21
- package/src/components/dialogs/ExportSVGDialog.tsx +8 -19
- package/src/components/dialogs/FeatureDialog.tsx +2 -5
- package/src/components/dialogs/GapThresholdDialog.tsx +36 -0
- package/src/components/{header → dialogs}/GappynessSlider.tsx +3 -10
- package/src/components/{header → dialogs}/GoToBox.tsx +36 -10
- package/src/components/dialogs/GoToDialog.tsx +30 -0
- package/src/components/dialogs/HelpDialog.tsx +79 -0
- package/src/components/dialogs/MetadataDialog.tsx +32 -4
- package/src/components/{header → dialogs}/goTo.ts +1 -1
- package/src/components/dialogs/metadataLabels.ts +54 -0
- package/src/components/dialogs/metadataRecord.tsx +61 -0
- package/src/components/header/Header.tsx +75 -44
- package/src/components/header/HiddenColumnsChip.tsx +39 -0
- package/src/components/header/MenuBar.tsx +64 -0
- package/src/components/header/ScrollZoomCheckbox.tsx +46 -0
- package/src/components/header/ZoomControls.tsx +23 -74
- package/src/components/header/colorSchemeMenuItems.ts +121 -0
- package/src/components/header/getAnnotationsMenu.ts +52 -56
- package/src/components/header/menuBarItems.ts +357 -0
- package/src/components/import/ImportForm.tsx +19 -7
- package/src/components/import/data/seq2.ts +0 -18
- package/src/components/minimap/Minimap.tsx +11 -3
- package/src/components/minimap/MinimapSVG.tsx +17 -1
- package/src/components/minimap/minimapLayout.ts +27 -0
- package/src/components/msa/MSACanvas.tsx +24 -4
- package/src/components/msa/MSACanvasBlock.tsx +20 -17
- package/src/components/msa/MSAMouseoverCanvas.tsx +2 -2
- package/src/components/msa/WheelZoomHint.tsx +56 -0
- package/src/components/msa/drawFeatureSpans.ts +160 -79
- package/src/components/msa/msaKeys.ts +3 -0
- package/src/components/msa/msaRaster.ts +26 -10
- package/src/components/msa/renderBoxFeatureCanvasBlock.ts +62 -24
- package/src/components/msa/renderHighlights.ts +5 -6
- package/src/components/msa/renderMSABlock.ts +51 -15
- package/src/components/msa/renderMSAMouseover.ts +5 -1
- package/src/components/msa/tileColor.ts +7 -0
- package/src/components/renderCtx.ts +0 -1
- package/src/components/rowpanels/RowPanelBlock.tsx +2 -2
- package/src/components/rowpanels/renderFeaturePanel.ts +26 -7
- package/src/components/settings/MenuItemsForm.tsx +225 -0
- package/src/components/settings/SettingsPanel.tsx +156 -0
- package/src/components/settings/TrackList.tsx +119 -0
- package/src/components/tracks/TrackBlocks.tsx +2 -2
- package/src/components/tracks/drawTracks.ts +5 -5
- package/src/components/tree/CladeLabels.tsx +30 -54
- package/src/components/tree/TreeCanvasBlock.tsx +2 -2
- package/src/components/tree/TreeMenu.tsx +4 -6
- package/src/components/tree/TreeOverview.tsx +2 -2
- package/src/components/tree/cladeBrackets.ts +50 -3
- package/src/components/tree/renderTreeCanvas.ts +2 -13
- package/src/components/tree/renderTreeOverview.ts +7 -14
- package/src/constants.ts +9 -1
- package/src/darkReader.ts +57 -0
- package/src/element.ts +37 -64
- package/src/exportLayout.ts +134 -0
- package/src/featurePanels.ts +269 -0
- package/src/filehandleLoader.ts +136 -0
- package/src/headlessRenderEnv.ts +24 -11
- package/src/hierarchy.ts +5 -88
- package/src/index.ts +9 -5
- package/src/measureTextCanvas.ts +8 -6
- package/src/model/treeModel.ts +9 -3
- package/src/model.ts +452 -807
- package/src/neighborJoining.ts +1 -42
- package/src/renderToSvg.tsx +56 -207
- package/src/rerootTree.ts +7 -6
- package/src/schemeResidueColor.ts +37 -0
- package/src/similarityColors.ts +112 -0
- package/src/treeDisplay.ts +278 -0
- package/src/types.ts +6 -4
- package/src/useWheelScroll.ts +43 -22
- package/src/util.ts +3 -0
- package/src/version.ts +1 -1
- package/src/viewerSnapshot.ts +147 -0
- package/src/wheelZoom.ts +55 -33
- package/src/zoomSnapshot.ts +80 -0
- package/dist/components/header/ColorSchemeMenu.d.ts +0 -12
- package/dist/components/header/ColorSchemeMenu.js +0 -37
- package/dist/components/header/ColorSchemeMenu.js.map +0 -1
- package/dist/components/header/FileMenu.js +0 -66
- package/dist/components/header/FileMenu.js.map +0 -1
- package/dist/components/header/GappynessSlider.js.map +0 -1
- package/dist/components/header/GoToBox.js +0 -31
- package/dist/components/header/GoToBox.js.map +0 -1
- package/dist/components/header/MSASettingsMenu.d.ts +0 -6
- package/dist/components/header/MSASettingsMenu.js +0 -11
- package/dist/components/header/MSASettingsMenu.js.map +0 -1
- package/dist/components/header/ScrollZoomIcons.d.ts +0 -6
- package/dist/components/header/ScrollZoomIcons.js +0 -35
- package/dist/components/header/ScrollZoomIcons.js.map +0 -1
- package/dist/components/header/TreeSettingsMenu.js +0 -42
- package/dist/components/header/TreeSettingsMenu.js.map +0 -1
- package/dist/components/header/ZoomMenu.js +0 -37
- package/dist/components/header/ZoomMenu.js.map +0 -1
- package/dist/components/header/goTo.d.ts +0 -20
- package/dist/components/header/goTo.js.map +0 -1
- package/dist/components/header/settingsMenuItems.d.ts +0 -4
- package/dist/components/header/settingsMenuItems.js +0 -127
- package/dist/components/header/settingsMenuItems.js.map +0 -1
- package/src/components/header/ColorSchemeMenu.tsx +0 -56
- package/src/components/header/FileMenu.tsx +0 -81
- package/src/components/header/MSASettingsMenu.tsx +0 -26
- package/src/components/header/ScrollZoomIcons.tsx +0 -52
- package/src/components/header/TreeSettingsMenu.tsx +0 -60
- package/src/components/header/ZoomMenu.tsx +0 -48
- package/src/components/header/settingsMenuItems.ts +0 -157
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import type { MsaViewModel } from '../../model.ts'
|
|
2
|
+
import type { MenuItem } from '@jbrowse/core/ui/Menu'
|
|
3
|
+
|
|
4
|
+
type Alphabet = 'any' | 'nucleotide' | 'protein'
|
|
5
|
+
|
|
6
|
+
interface SchemeEntry {
|
|
7
|
+
name: string
|
|
8
|
+
label: string
|
|
9
|
+
alphabet: Alphabet
|
|
10
|
+
// shown at the top level for its alphabet, the rest under More schemes
|
|
11
|
+
featured?: boolean
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const schemes: SchemeEntry[] = [
|
|
15
|
+
{ name: 'maeditor', label: 'MAEditor', alphabet: 'protein', featured: true },
|
|
16
|
+
{
|
|
17
|
+
name: 'clustalx_protein',
|
|
18
|
+
label: 'Clustal X',
|
|
19
|
+
alphabet: 'protein',
|
|
20
|
+
featured: true,
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
name: 'clustalx_protein_dynamic',
|
|
24
|
+
label: 'Clustal X, by column conservation',
|
|
25
|
+
alphabet: 'protein',
|
|
26
|
+
featured: true,
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: 'blosum62_dynamic',
|
|
30
|
+
label: 'BLOSUM62 similarity',
|
|
31
|
+
alphabet: 'protein',
|
|
32
|
+
featured: true,
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: 'jalview_hydrophobicity',
|
|
36
|
+
label: 'Hydrophobicity',
|
|
37
|
+
alphabet: 'protein',
|
|
38
|
+
featured: true,
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
name: 'nucleotide',
|
|
42
|
+
label: 'Nucleotide',
|
|
43
|
+
alphabet: 'nucleotide',
|
|
44
|
+
featured: true,
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'rainbow_dna',
|
|
48
|
+
label: 'Rainbow',
|
|
49
|
+
alphabet: 'nucleotide',
|
|
50
|
+
featured: true,
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: 'percent_identity_dynamic',
|
|
54
|
+
label: 'Percent identity',
|
|
55
|
+
alphabet: 'any',
|
|
56
|
+
featured: true,
|
|
57
|
+
},
|
|
58
|
+
{ name: 'none', label: 'None', alphabet: 'any', featured: true },
|
|
59
|
+
{ name: 'clustal', label: 'Clustal', alphabet: 'protein' },
|
|
60
|
+
{ name: 'lesk', label: 'Lesk', alphabet: 'protein' },
|
|
61
|
+
{ name: 'flower', label: 'Flower', alphabet: 'protein' },
|
|
62
|
+
{ name: 'cinema', label: 'Cinema', alphabet: 'protein' },
|
|
63
|
+
{ name: 'jalview_zappo', label: 'Zappo', alphabet: 'protein' },
|
|
64
|
+
{ name: 'jalview_taylor', label: 'Taylor', alphabet: 'protein' },
|
|
65
|
+
{ name: 'jalview_buried', label: 'Buried index', alphabet: 'protein' },
|
|
66
|
+
{ name: 'jalview_prophelix', label: 'Helix propensity', alphabet: 'protein' },
|
|
67
|
+
{
|
|
68
|
+
name: 'jalview_propstrand',
|
|
69
|
+
label: 'Strand propensity',
|
|
70
|
+
alphabet: 'protein',
|
|
71
|
+
},
|
|
72
|
+
{ name: 'jalview_propturn', label: 'Turn propensity', alphabet: 'protein' },
|
|
73
|
+
{ name: 'clustalx_dna', label: 'Clustal X (DNA)', alphabet: 'nucleotide' },
|
|
74
|
+
{ name: 'jbrowse_dna', label: 'JBrowse (DNA)', alphabet: 'nucleotide' },
|
|
75
|
+
]
|
|
76
|
+
|
|
77
|
+
export const catalogedSchemeNames = schemes.map(s => s.name)
|
|
78
|
+
|
|
79
|
+
// While a `customColorScheme` map is set, a checked Custom entry stands for it
|
|
80
|
+
// and no named scheme is checked. Picking a named scheme clears the map. The
|
|
81
|
+
// active scheme always shows at the top level.
|
|
82
|
+
export function colorSchemeMenuItems(model: MsaViewModel): MenuItem[] {
|
|
83
|
+
const { colorSchemeName, customColorScheme, sequenceType } = model
|
|
84
|
+
const alphabet = sequenceType === 'amino' ? 'protein' : 'nucleotide'
|
|
85
|
+
function radio(entry: SchemeEntry) {
|
|
86
|
+
return {
|
|
87
|
+
label: entry.label,
|
|
88
|
+
type: 'radio',
|
|
89
|
+
checked: !customColorScheme && colorSchemeName === entry.name,
|
|
90
|
+
onClick: () => {
|
|
91
|
+
model.setColorSchemeName(entry.name)
|
|
92
|
+
// a scheme picked while the domains fill the cells would color
|
|
93
|
+
// nothing, so the pick hands the cells back to the residues
|
|
94
|
+
if (model.cellFill === 'domain') {
|
|
95
|
+
model.setCellFill('residue')
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
} as const
|
|
99
|
+
}
|
|
100
|
+
const top = (e: SchemeEntry) =>
|
|
101
|
+
(e.featured && (e.alphabet === 'any' || e.alphabet === alphabet)) ||
|
|
102
|
+
(!customColorScheme && e.name === colorSchemeName)
|
|
103
|
+
return [
|
|
104
|
+
...(customColorScheme
|
|
105
|
+
? [
|
|
106
|
+
{
|
|
107
|
+
label: 'Custom',
|
|
108
|
+
type: 'radio',
|
|
109
|
+
checked: true,
|
|
110
|
+
onClick: () => {},
|
|
111
|
+
} as const,
|
|
112
|
+
]
|
|
113
|
+
: []),
|
|
114
|
+
...schemes.filter(top).map(radio),
|
|
115
|
+
{
|
|
116
|
+
label: 'More schemes',
|
|
117
|
+
type: 'subMenu',
|
|
118
|
+
subMenu: schemes.filter(e => !top(e)).map(radio),
|
|
119
|
+
},
|
|
120
|
+
]
|
|
121
|
+
}
|
|
@@ -1,80 +1,76 @@
|
|
|
1
1
|
import { lazy } from 'react'
|
|
2
2
|
|
|
3
|
-
import FilterAlt from '@mui/icons-material/FilterAlt'
|
|
4
|
-
import FolderOpen from '@mui/icons-material/FolderOpen'
|
|
5
|
-
import MenuBook from '@mui/icons-material/MenuBook'
|
|
6
|
-
import Sort from '@mui/icons-material/Sort'
|
|
7
|
-
import Visibility from '@mui/icons-material/Visibility'
|
|
8
|
-
|
|
9
3
|
import type { MsaViewModel } from '../../model.ts'
|
|
4
|
+
import type { MenuItem } from '@jbrowse/core/ui/Menu'
|
|
10
5
|
|
|
11
6
|
const FeatureFilterDialog = lazy(() => import('../dialogs/FeatureDialog.tsx'))
|
|
12
7
|
const AnnotationFileDialog = lazy(
|
|
13
8
|
() => import('../dialogs/AnnotationFileDialog.tsx'),
|
|
14
9
|
)
|
|
15
10
|
|
|
16
|
-
|
|
11
|
+
export function openAnnotationFileItem(model: MsaViewModel): MenuItem {
|
|
12
|
+
return {
|
|
13
|
+
label: 'Open annotation file…',
|
|
14
|
+
onClick: () => {
|
|
15
|
+
model.queueDialog(handleClose => [
|
|
16
|
+
AnnotationFileDialog,
|
|
17
|
+
{ handleClose, model },
|
|
18
|
+
])
|
|
19
|
+
},
|
|
20
|
+
}
|
|
21
|
+
}
|
|
17
22
|
|
|
18
|
-
export function
|
|
19
|
-
const { showDomains, actuallyShowDomains, subFeatureRows
|
|
20
|
-
const noneLoaded = noDomains ? ' (none loaded)' : ''
|
|
23
|
+
export function annotationsSubMenu(model: MsaViewModel): MenuItem[] {
|
|
24
|
+
const { showDomains, actuallyShowDomains, subFeatureRows } = model
|
|
21
25
|
return [
|
|
22
26
|
{
|
|
23
|
-
label: '
|
|
24
|
-
|
|
25
|
-
onClick: () => {
|
|
26
|
-
model.queueDialog(handleClose => [
|
|
27
|
-
AnnotationFileDialog,
|
|
28
|
-
{
|
|
29
|
-
handleClose,
|
|
30
|
-
model,
|
|
31
|
-
},
|
|
32
|
-
])
|
|
33
|
-
},
|
|
34
|
-
},
|
|
35
|
-
// `react-msaview-cli interpro` reads InterPro's precomputed matches in
|
|
36
|
-
// seconds, and `interproscan` covers rows InterPro has not seen; this links
|
|
37
|
-
// the tutorial for both
|
|
38
|
-
{
|
|
39
|
-
label: 'How to get a domain file...',
|
|
40
|
-
icon: MenuBook,
|
|
41
|
-
onClick: () => {
|
|
42
|
-
window.open(domainsTutorial, '_blank', 'noopener,noreferrer')
|
|
43
|
-
},
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
label: `Show annotations${noneLoaded}`,
|
|
47
|
-
disabled: noDomains,
|
|
48
|
-
icon: Visibility,
|
|
27
|
+
label: 'Show annotations',
|
|
28
|
+
type: 'checkbox',
|
|
49
29
|
checked: actuallyShowDomains,
|
|
50
|
-
type: 'checkbox' as const,
|
|
51
30
|
onClick: () => {
|
|
52
31
|
model.setShowDomains(!showDomains)
|
|
53
32
|
},
|
|
54
33
|
},
|
|
55
34
|
{
|
|
56
|
-
label:
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
type: 'checkbox' as const,
|
|
35
|
+
label: 'Sub-row layout',
|
|
36
|
+
type: 'checkbox',
|
|
37
|
+
disabled: !actuallyShowDomains,
|
|
38
|
+
checked: actuallyShowDomains && subFeatureRows,
|
|
61
39
|
onClick: () => {
|
|
62
40
|
model.setSubFeatureRows(!subFeatureRows)
|
|
63
41
|
},
|
|
64
42
|
},
|
|
65
|
-
|
|
66
|
-
label: `Filter annotations${noneLoaded}`,
|
|
67
|
-
icon: FilterAlt,
|
|
68
|
-
disabled: noDomains,
|
|
69
|
-
onClick: () => {
|
|
70
|
-
model.queueDialog(onClose => [
|
|
71
|
-
FeatureFilterDialog,
|
|
72
|
-
{
|
|
73
|
-
onClose,
|
|
74
|
-
model,
|
|
75
|
-
},
|
|
76
|
-
])
|
|
77
|
-
},
|
|
78
|
-
},
|
|
43
|
+
...typeItems(model),
|
|
79
44
|
]
|
|
80
45
|
}
|
|
46
|
+
|
|
47
|
+
// up to this many types list inline, one checkbox each; past it the filter
|
|
48
|
+
// dialog, which searches and counts them, takes over
|
|
49
|
+
const inlineTypes = 12
|
|
50
|
+
|
|
51
|
+
function typeItems(model: MsaViewModel): MenuItem[] {
|
|
52
|
+
const types = [...model.annotationTypes.values()]
|
|
53
|
+
return types.length <= inlineTypes
|
|
54
|
+
? [
|
|
55
|
+
{ type: 'subHeader', label: 'Types' },
|
|
56
|
+
...types.map(({ accession, name }) => ({
|
|
57
|
+
label: name || accession,
|
|
58
|
+
type: 'checkbox' as const,
|
|
59
|
+
checked: !model.featureOff(accession),
|
|
60
|
+
onClick: () => {
|
|
61
|
+
model.setFilter(accession, model.featureOff(accession))
|
|
62
|
+
},
|
|
63
|
+
})),
|
|
64
|
+
]
|
|
65
|
+
: [
|
|
66
|
+
{
|
|
67
|
+
label: 'Filter annotations…',
|
|
68
|
+
onClick: () => {
|
|
69
|
+
model.queueDialog(onClose => [
|
|
70
|
+
FeatureFilterDialog,
|
|
71
|
+
{ onClose, model },
|
|
72
|
+
])
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
]
|
|
76
|
+
}
|
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
import { lazy } from 'react'
|
|
2
|
+
|
|
3
|
+
import { maxNeighborJoiningRows, treeOrders } from '../../constants.ts'
|
|
4
|
+
import { canGoTo } from '../dialogs/GoToBox.tsx'
|
|
5
|
+
import { scrollZoomLabel } from './ScrollZoomCheckbox.tsx'
|
|
6
|
+
import { colorSchemeMenuItems } from './colorSchemeMenuItems.ts'
|
|
7
|
+
import { openAnnotationFileItem } from './getAnnotationsMenu.ts'
|
|
8
|
+
|
|
9
|
+
import type { MsaViewModel } from '../../model.ts'
|
|
10
|
+
import type { TreeOrder } from '../../types.ts'
|
|
11
|
+
import type { ChoiceDisplay } from '../settings/MenuItemsForm.tsx'
|
|
12
|
+
import type { MenuItem } from '@jbrowse/core/ui/Menu'
|
|
13
|
+
|
|
14
|
+
const AboutDialog = lazy(() => import('../dialogs/AboutDialog.tsx'))
|
|
15
|
+
const ExportSVGDialog = lazy(() => import('../dialogs/ExportSVGDialog.tsx'))
|
|
16
|
+
const GapThresholdDialog = lazy(
|
|
17
|
+
() => import('../dialogs/GapThresholdDialog.tsx'),
|
|
18
|
+
)
|
|
19
|
+
const GoToDialog = lazy(() => import('../dialogs/GoToDialog.tsx'))
|
|
20
|
+
const HelpDialog = lazy(() => import('../dialogs/HelpDialog.tsx'))
|
|
21
|
+
const MetadataDialog = lazy(() => import('../dialogs/MetadataDialog.tsx'))
|
|
22
|
+
|
|
23
|
+
const tutorialsUrl = 'https://gmod.org/JBrowseMSA/tutorials/'
|
|
24
|
+
|
|
25
|
+
function radio(label: string, checked: boolean, onClick: () => void) {
|
|
26
|
+
return { label, type: 'radio' as const, checked, onClick }
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function toggle(label: string, checked: boolean, set: (arg: boolean) => void) {
|
|
30
|
+
return {
|
|
31
|
+
label,
|
|
32
|
+
type: 'checkbox' as const,
|
|
33
|
+
checked,
|
|
34
|
+
onClick: () => {
|
|
35
|
+
set(!checked)
|
|
36
|
+
},
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function action(label: string, onClick: () => void, disabled = false) {
|
|
41
|
+
return { label, onClick, disabled }
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function subMenu(label: string, items: MenuItem[], display?: ChoiceDisplay) {
|
|
45
|
+
return { label, type: 'subMenu' as const, subMenu: items, display }
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function when<T>(cond: boolean, items: T[]) {
|
|
49
|
+
return cond ? items : []
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function fileMenuItems(model: MsaViewModel): MenuItem[] {
|
|
53
|
+
return [
|
|
54
|
+
...when(!!model.importForm, [
|
|
55
|
+
action('Open alignment…', () => {
|
|
56
|
+
model.reset()
|
|
57
|
+
}),
|
|
58
|
+
]),
|
|
59
|
+
openAnnotationFileItem(model),
|
|
60
|
+
action('Export as SVG…', () => {
|
|
61
|
+
model.queueDialog(onClose => [ExportSVGDialog, { onClose, model }])
|
|
62
|
+
}),
|
|
63
|
+
...when(!model.tree.noTree, [
|
|
64
|
+
action('Export tree as Newick', () => {
|
|
65
|
+
model.exportNewick()
|
|
66
|
+
}),
|
|
67
|
+
]),
|
|
68
|
+
action('Alignment info…', () => {
|
|
69
|
+
model.queueDialog(onClose => [MetadataDialog, { model, onClose }])
|
|
70
|
+
}),
|
|
71
|
+
]
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function zoomSubMenu(model: MsaViewModel): MenuItem[] {
|
|
75
|
+
return [
|
|
76
|
+
action('Zoom in', () => {
|
|
77
|
+
model.zoomIn()
|
|
78
|
+
}),
|
|
79
|
+
action('Zoom out', () => {
|
|
80
|
+
model.zoomOut()
|
|
81
|
+
}),
|
|
82
|
+
action('Fit to window', () => {
|
|
83
|
+
model.fit()
|
|
84
|
+
}),
|
|
85
|
+
action('Fit width', () => {
|
|
86
|
+
model.fitHorizontally()
|
|
87
|
+
}),
|
|
88
|
+
action('Fit height', () => {
|
|
89
|
+
model.fitVertically()
|
|
90
|
+
}),
|
|
91
|
+
action('Reset zoom', () => {
|
|
92
|
+
model.resetZoom()
|
|
93
|
+
}),
|
|
94
|
+
toggle(scrollZoomLabel, model.scrollZoom, arg => {
|
|
95
|
+
model.setScrollZoom(arg)
|
|
96
|
+
}),
|
|
97
|
+
]
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const gapPresets = [100, 90, 50]
|
|
101
|
+
|
|
102
|
+
export function gapsSubMenu(model: MsaViewModel): MenuItem[] {
|
|
103
|
+
const { hideGaps, allowedGappyness } = model
|
|
104
|
+
const custom = hideGaps && !gapPresets.includes(allowedGappyness)
|
|
105
|
+
return [
|
|
106
|
+
subMenu(
|
|
107
|
+
'Gappy columns',
|
|
108
|
+
[
|
|
109
|
+
radio('Show all columns', !hideGaps, () => {
|
|
110
|
+
model.setHideGaps(false)
|
|
111
|
+
}),
|
|
112
|
+
...gapPresets.map(pct =>
|
|
113
|
+
radio(
|
|
114
|
+
pct === 100 ? 'Hide columns of only gaps' : `Hide ≥${pct}% gaps`,
|
|
115
|
+
hideGaps && allowedGappyness === pct,
|
|
116
|
+
() => {
|
|
117
|
+
model.setHideGaps(true)
|
|
118
|
+
model.setAllowedGappyness(pct)
|
|
119
|
+
},
|
|
120
|
+
),
|
|
121
|
+
),
|
|
122
|
+
{
|
|
123
|
+
...radio(
|
|
124
|
+
custom ? `Hide ≥${allowedGappyness}% gaps…` : 'Custom threshold…',
|
|
125
|
+
custom,
|
|
126
|
+
() => {
|
|
127
|
+
model.setHideGaps(true)
|
|
128
|
+
model.queueDialog(onClose => [
|
|
129
|
+
GapThresholdDialog,
|
|
130
|
+
{ model, onClose },
|
|
131
|
+
])
|
|
132
|
+
},
|
|
133
|
+
),
|
|
134
|
+
keepMenuOpen: false,
|
|
135
|
+
},
|
|
136
|
+
],
|
|
137
|
+
'select',
|
|
138
|
+
),
|
|
139
|
+
]
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const treeOrderLabels: Record<TreeOrder, string> = {
|
|
143
|
+
branchLength: 'By branch length',
|
|
144
|
+
input: 'Input order',
|
|
145
|
+
ladderize: 'Ladderize, small clades first',
|
|
146
|
+
ladderizeReverse: 'Ladderize, large clades first',
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function outgroupLabel(outgroup: string[]) {
|
|
150
|
+
const [first, ...rest] = outgroup
|
|
151
|
+
return rest.length === 0
|
|
152
|
+
? `Outgroup ${first}`
|
|
153
|
+
: `Outgroup ${first} … ${rest.at(-1)}`
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export function treeSubMenu(model: MsaViewModel): MenuItem[] {
|
|
157
|
+
const {
|
|
158
|
+
drawTree,
|
|
159
|
+
showBranchLen,
|
|
160
|
+
labelsAlignRight,
|
|
161
|
+
drawNodeLabels,
|
|
162
|
+
drawLabels,
|
|
163
|
+
treeAreaWidth,
|
|
164
|
+
showTreeOverview,
|
|
165
|
+
showTreeScaleBar,
|
|
166
|
+
treeOrder,
|
|
167
|
+
treeRoot,
|
|
168
|
+
rotated,
|
|
169
|
+
} = model
|
|
170
|
+
return [
|
|
171
|
+
subMenu(
|
|
172
|
+
'Layout',
|
|
173
|
+
[
|
|
174
|
+
radio('Phylogram', drawTree && showBranchLen, () => {
|
|
175
|
+
model.setDrawTree(true)
|
|
176
|
+
model.setShowBranchLen(true)
|
|
177
|
+
}),
|
|
178
|
+
radio('Cladogram', drawTree && !showBranchLen, () => {
|
|
179
|
+
model.setDrawTree(true)
|
|
180
|
+
model.setShowBranchLen(false)
|
|
181
|
+
}),
|
|
182
|
+
radio('Labels only', !drawTree, () => {
|
|
183
|
+
model.setDrawTree(false)
|
|
184
|
+
}),
|
|
185
|
+
],
|
|
186
|
+
'segmented',
|
|
187
|
+
),
|
|
188
|
+
toggle('Tree overview', showTreeOverview, arg => {
|
|
189
|
+
model.setShowTreeOverview(arg)
|
|
190
|
+
}),
|
|
191
|
+
toggle('Scale bar', showTreeScaleBar, arg => {
|
|
192
|
+
model.setShowTreeScaleBar(arg)
|
|
193
|
+
}),
|
|
194
|
+
subMenu(
|
|
195
|
+
'Order',
|
|
196
|
+
[
|
|
197
|
+
...treeOrders.map(order =>
|
|
198
|
+
radio(treeOrderLabels[order], treeOrder === order, () => {
|
|
199
|
+
model.setTreeOrder(order)
|
|
200
|
+
}),
|
|
201
|
+
),
|
|
202
|
+
...when(rotated.length > 0, [
|
|
203
|
+
action('Undo rotations', () => {
|
|
204
|
+
model.clearRotated()
|
|
205
|
+
}),
|
|
206
|
+
]),
|
|
207
|
+
],
|
|
208
|
+
'select',
|
|
209
|
+
),
|
|
210
|
+
subMenu(
|
|
211
|
+
'Root',
|
|
212
|
+
[
|
|
213
|
+
radio('Input root', treeRoot === undefined, () => {
|
|
214
|
+
model.setTreeRoot(undefined)
|
|
215
|
+
}),
|
|
216
|
+
radio('Midpoint', treeRoot === 'midpoint', () => {
|
|
217
|
+
model.setTreeRoot('midpoint')
|
|
218
|
+
}),
|
|
219
|
+
// "Reroot here" in a node's menu sets the outgroup, so this only
|
|
220
|
+
// reports it
|
|
221
|
+
...when(typeof treeRoot === 'object', [
|
|
222
|
+
{
|
|
223
|
+
...radio(
|
|
224
|
+
typeof treeRoot === 'object'
|
|
225
|
+
? outgroupLabel(treeRoot.outgroup)
|
|
226
|
+
: '',
|
|
227
|
+
true,
|
|
228
|
+
() => {},
|
|
229
|
+
),
|
|
230
|
+
disabled: true,
|
|
231
|
+
},
|
|
232
|
+
]),
|
|
233
|
+
],
|
|
234
|
+
'select',
|
|
235
|
+
),
|
|
236
|
+
subMenu('Labels', [
|
|
237
|
+
toggle('Tip labels', drawLabels, arg => {
|
|
238
|
+
model.setDrawLabels(arg)
|
|
239
|
+
}),
|
|
240
|
+
toggle('Internal node labels', drawNodeLabels, arg => {
|
|
241
|
+
model.setDrawNodeLabels(arg)
|
|
242
|
+
}),
|
|
243
|
+
toggle('Align right', labelsAlignRight, arg => {
|
|
244
|
+
model.setLabelsAlignRight(arg)
|
|
245
|
+
}),
|
|
246
|
+
]),
|
|
247
|
+
...when(treeAreaWidth !== undefined, [
|
|
248
|
+
action('Reset tree width', () => {
|
|
249
|
+
model.setTreeAreaWidth(undefined)
|
|
250
|
+
}),
|
|
251
|
+
]),
|
|
252
|
+
]
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
export function viewMenuItems(model: MsaViewModel): MenuItem[] {
|
|
256
|
+
return [
|
|
257
|
+
...when(canGoTo(model), [
|
|
258
|
+
action('Find row or column…', () => {
|
|
259
|
+
model.queueDialog(onClose => [GoToDialog, { model, onClose }])
|
|
260
|
+
}),
|
|
261
|
+
]),
|
|
262
|
+
subMenu('Zoom', zoomSubMenu(model)),
|
|
263
|
+
]
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
export function trackSettingsItems(model: MsaViewModel): MenuItem[] {
|
|
267
|
+
return [
|
|
268
|
+
toggle('Show track values on hover', model.showColumnStats, arg => {
|
|
269
|
+
model.setShowColumnStats(arg)
|
|
270
|
+
}),
|
|
271
|
+
]
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// the settings panel's toggles for how the alignment draws
|
|
275
|
+
export function alignmentSettingsItems(model: MsaViewModel): MenuItem[] {
|
|
276
|
+
return [
|
|
277
|
+
toggle('Show letters', model.drawMsaLetters, arg => {
|
|
278
|
+
model.setDrawMsaLetters(arg)
|
|
279
|
+
}),
|
|
280
|
+
]
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// who colors the cells comes first, since a scheme picked while the domains
|
|
284
|
+
// fill them would otherwise change nothing on screen
|
|
285
|
+
export function colorSettingsItems(model: MsaViewModel): MenuItem[] {
|
|
286
|
+
const { cellFill, filteredAnnotations } = model
|
|
287
|
+
return [
|
|
288
|
+
subMenu(
|
|
289
|
+
'Fill cells with',
|
|
290
|
+
[
|
|
291
|
+
radio('Residues', cellFill === 'residue', () => {
|
|
292
|
+
model.setCellFill('residue')
|
|
293
|
+
}),
|
|
294
|
+
...when(filteredAnnotations.length > 0, [
|
|
295
|
+
radio('Domains', cellFill === 'domain', () => {
|
|
296
|
+
model.setShowDomains(true)
|
|
297
|
+
model.setCellFill('domain')
|
|
298
|
+
}),
|
|
299
|
+
]),
|
|
300
|
+
{
|
|
301
|
+
...radio('Nothing', cellFill === 'none', () => {
|
|
302
|
+
model.setCellFill('none')
|
|
303
|
+
}),
|
|
304
|
+
helpText: 'Color the letters instead',
|
|
305
|
+
},
|
|
306
|
+
],
|
|
307
|
+
'segmented',
|
|
308
|
+
),
|
|
309
|
+
{
|
|
310
|
+
type: 'subHeader',
|
|
311
|
+
label:
|
|
312
|
+
cellFill === 'domain'
|
|
313
|
+
? 'Residue scheme: picking one takes the cells back from the domains'
|
|
314
|
+
: 'Residue scheme',
|
|
315
|
+
},
|
|
316
|
+
...colorSchemeMenuItems(model),
|
|
317
|
+
]
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
function neighborJoiningItem(model: MsaViewModel): MenuItem {
|
|
321
|
+
const rows = model.rowMap.size
|
|
322
|
+
const tooManyRows = rows > maxNeighborJoiningRows
|
|
323
|
+
return action(
|
|
324
|
+
tooManyRows
|
|
325
|
+
? `Build neighbor joining tree (over ${maxNeighborJoiningRows} rows, use FastTree)`
|
|
326
|
+
: model.noTree
|
|
327
|
+
? 'Build neighbor joining tree'
|
|
328
|
+
: 'Replace with neighbor joining tree',
|
|
329
|
+
() => {
|
|
330
|
+
try {
|
|
331
|
+
model.calculateNeighborJoiningTreeFromMSA()
|
|
332
|
+
} catch (e) {
|
|
333
|
+
console.error('Failed to calculate NJ tree:', e)
|
|
334
|
+
model.addWarning(e instanceof Error ? e.message : String(e))
|
|
335
|
+
}
|
|
336
|
+
},
|
|
337
|
+
tooManyRows || rows < 2,
|
|
338
|
+
)
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
export function toolsMenuItems(model: MsaViewModel): MenuItem[] {
|
|
342
|
+
return [neighborJoiningItem(model)]
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
export function helpMenuItems(model: MsaViewModel): MenuItem[] {
|
|
346
|
+
return [
|
|
347
|
+
action('Mouse & keyboard…', () => {
|
|
348
|
+
model.queueDialog(onClose => [HelpDialog, { model, onClose }])
|
|
349
|
+
}),
|
|
350
|
+
action('Tutorials', () => {
|
|
351
|
+
window.open(tutorialsUrl, '_blank', 'noopener,noreferrer')
|
|
352
|
+
}),
|
|
353
|
+
action('About & credits…', () => {
|
|
354
|
+
model.queueDialog(onClose => [AboutDialog, { onClose }])
|
|
355
|
+
}),
|
|
356
|
+
]
|
|
357
|
+
}
|
|
@@ -19,8 +19,8 @@ const ImportForm = observer(function ({ model }: { model: MsaViewModel }) {
|
|
|
19
19
|
const { error } = model
|
|
20
20
|
|
|
21
21
|
return (
|
|
22
|
-
<Container>
|
|
23
|
-
<Box sx={{ width: '50%', [phone]: { width: '100%' } }}>
|
|
22
|
+
<Container sx={{ pt: 2, pb: 3 }}>
|
|
23
|
+
<Box sx={{ width: '50%', mb: 2, [phone]: { width: '100%' } }}>
|
|
24
24
|
{error ? <ErrorMessage error={error} /> : null}
|
|
25
25
|
<Typography>
|
|
26
26
|
Open an MSA file (FASTA, Stockholm, Clustal, A3M or EMF format) and/or
|
|
@@ -45,20 +45,32 @@ const ImportForm = observer(function ({ model }: { model: MsaViewModel }) {
|
|
|
45
45
|
},
|
|
46
46
|
}}
|
|
47
47
|
>
|
|
48
|
-
<
|
|
48
|
+
<Box
|
|
49
|
+
sx={{
|
|
50
|
+
width: 400,
|
|
51
|
+
display: 'flex',
|
|
52
|
+
flexDirection: 'column',
|
|
53
|
+
gap: 1.5,
|
|
54
|
+
[phone]: { width: 'auto' },
|
|
55
|
+
}}
|
|
56
|
+
>
|
|
49
57
|
<div>
|
|
50
58
|
<Typography>MSA file or URL</Typography>
|
|
51
|
-
<FileSelector location={msaFile} setLocation={setMsaFile} />
|
|
59
|
+
<FileSelector inline location={msaFile} setLocation={setMsaFile} />
|
|
52
60
|
</div>
|
|
53
61
|
<div>
|
|
54
62
|
<Typography>Tree file or URL</Typography>
|
|
55
|
-
<FileSelector
|
|
63
|
+
<FileSelector
|
|
64
|
+
inline
|
|
65
|
+
location={treeFile}
|
|
66
|
+
setLocation={setTreeFile}
|
|
67
|
+
/>
|
|
56
68
|
</div>
|
|
57
69
|
<div>
|
|
58
70
|
<Typography>Annotation GFF file or URL (optional)</Typography>
|
|
59
|
-
<FileSelector location={gffFile} setLocation={setGffFile} />
|
|
71
|
+
<FileSelector inline location={gffFile} setLocation={setGffFile} />
|
|
60
72
|
</div>
|
|
61
|
-
</
|
|
73
|
+
</Box>
|
|
62
74
|
<div>
|
|
63
75
|
<Button
|
|
64
76
|
onClick={() => {
|
|
@@ -13,23 +13,5 @@ UniProt/Swiss-Prot|Q7JFM4|IL2_AOTVO MLKPPLPLRSLLFLQLPLLGVGLNPKFLTPSGNEDIG
|
|
|
13
13
|
UniProt/Swiss-Prot|Q29416|IL2_CANFA --------------LFLQLSLLG-------------------------------------
|
|
14
14
|
`
|
|
15
15
|
|
|
16
|
-
export const smallMSAOnly = `CLUSTAL O(1.2.4) multiple sequence alignment
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
sp|P69905|HBA_HUMAN MVLSPADKTNVKAAWGKVGAHAGEYGAEALERMFLSFPTTKTYFPHFDLSHGSAQVKGHG 60
|
|
20
|
-
sp|P01942|HBA_MOUSE MVLSGEDKSNIKAAWGKIGGHGAEYGAEALERMFASFPTTKTYFPHFDVSHGSAQVKGHG 60
|
|
21
|
-
sp|P13786|HBAZ_CAPHI MSLTRTERTIILSLWSKISTQADVIGTETLERLFSCYPQAKTYFPHFDLHSGSAQLRAHG 60
|
|
22
|
-
* *: ::: : : *.*:. :. *:*:***:* .:* :********: ****::.**
|
|
23
|
-
|
|
24
|
-
sp|P69905|HBA_HUMAN KKVADALTNAVAHVDDMPNALSALSDLHAHKLRVDPVNFKLLSHCLLVTLAAHLPAEFTP 120
|
|
25
|
-
sp|P01942|HBA_MOUSE KKVADALASAAGHLDDLPGALSALSDLHAHKLRVDPVNFKLLSHCLLVTLASHHPADFTP 120
|
|
26
|
-
sp|P13786|HBAZ_CAPHI SKVVAAVGDAVKSIDNVTSALSKLSELHAYVLRVDPVNFKFLSHCLLVTLASHFPADFTA 120
|
|
27
|
-
.**. *: .*. :*:: .*** **:***: *********:**********:* **:**
|
|
28
|
-
|
|
29
|
-
sp|P69905|HBA_HUMAN AVHASLDKFLASVSTVLTSKYR 142
|
|
30
|
-
sp|P01942|HBA_MOUSE AVHASLDKFLASVSTVLTSKYR 142
|
|
31
|
-
sp|P13786|HBAZ_CAPHI DAHAAWDKFLSIVSGVLTEKYR 142
|
|
32
|
-
.**: ****: ** ***.***`
|
|
33
|
-
|
|
34
16
|
export const smallTree =
|
|
35
17
|
'(((UniProt/Swiss-Prot|P26898|IL2RA_SHEEP:0.24036,(UniProt/Swiss-Prot|P41690|IL2RA_FELCA:0.17737,(UniProt/Swiss-Prot|P01589|IL2RA_HUMAN:0.03906,UniProt/Swiss-Prot|Q5MNY4|IL2RA_MACMU:0.03787):0.13033):0.04964):0.02189,UniProt/Swiss-Prot|P01590|IL2RA_MOUSE:0.23072):0.06814,(((UniProt/Swiss-Prot|Q95118|IL2RG_BOVIN:0.09600,UniProt/Swiss-Prot|P40321|IL2RG_CANFA:0.09845):0.25333,UniProt/Swiss-Prot|Q29416|IL2_CANFA:-0.35055):0.10231,(UniProt/Swiss-Prot|P26896|IL2RB_RAT:0.33631,UniProt/Swiss-Prot|Q7JFM4|IL2_AOTVO:-0.33631):0.10166):0.01607,(UniProt/Swiss-Prot|Q8BZM1|GLMN_MOUSE:0.32378,UniProt/Swiss-Prot|P36835|IL2_CAPHI:-0.32378):0.09999)'
|