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
|
@@ -4,8 +4,10 @@ import { Dialog } from '@jbrowse/core/ui'
|
|
|
4
4
|
import { DialogContent, Typography } from '@mui/material'
|
|
5
5
|
import { observer } from 'mobx-react'
|
|
6
6
|
|
|
7
|
-
import MetadataTable, { isEmpty } from '../MetadataTable.tsx'
|
|
7
|
+
import MetadataTable, { isEmpty, isRecord } from '../MetadataTable.tsx'
|
|
8
8
|
import SequenceTextArea from '../SequenceTextArea.tsx'
|
|
9
|
+
import { gfLabels, monospaceKeys, sectionLabels } from './metadataLabels.ts'
|
|
10
|
+
import { groupGeneral } from './metadataRecord.tsx'
|
|
9
11
|
|
|
10
12
|
import type { MsaViewModel } from '../../model.ts'
|
|
11
13
|
|
|
@@ -16,7 +18,13 @@ const MetadataDialog = observer(function ({
|
|
|
16
18
|
model: MsaViewModel
|
|
17
19
|
onClose: () => void
|
|
18
20
|
}) {
|
|
19
|
-
const
|
|
21
|
+
const entries = Object.entries(model.header).filter(
|
|
22
|
+
([, value]) => value != null && !isEmpty(value),
|
|
23
|
+
)
|
|
24
|
+
const fields = Object.fromEntries(
|
|
25
|
+
entries.filter(([, value]) => !isRecord(value)),
|
|
26
|
+
)
|
|
27
|
+
const sections = entries.filter(([, value]) => isRecord(value))
|
|
20
28
|
return (
|
|
21
29
|
<Dialog
|
|
22
30
|
onClose={() => {
|
|
@@ -27,10 +35,30 @@ const MetadataDialog = observer(function ({
|
|
|
27
35
|
maxWidth="xl"
|
|
28
36
|
>
|
|
29
37
|
<DialogContent>
|
|
30
|
-
{
|
|
38
|
+
{entries.length === 0 ? (
|
|
31
39
|
<Typography>This alignment has no metadata.</Typography>
|
|
32
40
|
) : (
|
|
33
|
-
|
|
41
|
+
<>
|
|
42
|
+
{Object.keys(fields).length > 0 ? (
|
|
43
|
+
<MetadataTable record={fields} />
|
|
44
|
+
) : null}
|
|
45
|
+
{sections.map(([section, value]) => (
|
|
46
|
+
<div key={section}>
|
|
47
|
+
<Typography variant="h6">
|
|
48
|
+
{sectionLabels[section] ?? section}
|
|
49
|
+
</Typography>
|
|
50
|
+
{section === 'General' ? (
|
|
51
|
+
<MetadataTable
|
|
52
|
+
record={groupGeneral(value)}
|
|
53
|
+
labels={gfLabels}
|
|
54
|
+
monospaceKeys={monospaceKeys}
|
|
55
|
+
/>
|
|
56
|
+
) : (
|
|
57
|
+
<MetadataTable record={value as Record<string, unknown>} />
|
|
58
|
+
)}
|
|
59
|
+
</div>
|
|
60
|
+
))}
|
|
61
|
+
</>
|
|
34
62
|
)}
|
|
35
63
|
<Typography variant="h6">Sequences</Typography>
|
|
36
64
|
<SequenceTextArea str={model.rows} />
|
|
@@ -21,7 +21,7 @@ export function rowNameSuggestions(names: string[], input: string, limit = 50) {
|
|
|
21
21
|
* column the ruler numbers N, or residue N of a row written `name:N`. A name
|
|
22
22
|
* is tried whole first, so a row called `chr1:100` stays reachable.
|
|
23
23
|
*/
|
|
24
|
-
|
|
24
|
+
function resolveGoTo(model: MsaViewModel, text: string) {
|
|
25
25
|
const query = text.trim()
|
|
26
26
|
const row = model.rowNamesSet.get(query)
|
|
27
27
|
if (row !== undefined) {
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export const sectionLabels: Record<string, string> = {
|
|
2
|
+
General: 'Alignment',
|
|
3
|
+
Accessions: 'Row accessions',
|
|
4
|
+
Dbxref: 'Row cross-references',
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export const gfLabels: Record<string, string> = {
|
|
8
|
+
ID: 'Identifier',
|
|
9
|
+
AC: 'Accession',
|
|
10
|
+
DE: 'Description',
|
|
11
|
+
AU: 'Authors',
|
|
12
|
+
SE: 'Source of seed',
|
|
13
|
+
SS: 'Source of structure',
|
|
14
|
+
BM: 'Build method',
|
|
15
|
+
SM: 'Search method',
|
|
16
|
+
GA: 'Gathering threshold',
|
|
17
|
+
TC: 'Trusted cutoff',
|
|
18
|
+
NC: 'Noise cutoff',
|
|
19
|
+
TP: 'Family type',
|
|
20
|
+
CL: 'Clan',
|
|
21
|
+
MB: 'Clan members',
|
|
22
|
+
PI: 'Previous identifiers',
|
|
23
|
+
DR: 'Database references',
|
|
24
|
+
CC: 'Comment',
|
|
25
|
+
WK: 'Wikipedia',
|
|
26
|
+
NE: 'Pfam family nested in this one',
|
|
27
|
+
NL: 'Nesting location',
|
|
28
|
+
NH: 'Tree (Newick)',
|
|
29
|
+
SQ: 'Number of sequences',
|
|
30
|
+
RC: 'Reference comment',
|
|
31
|
+
RN: 'Reference number',
|
|
32
|
+
RM: 'PubMed ID',
|
|
33
|
+
RT: 'Reference title',
|
|
34
|
+
RA: 'Reference authors',
|
|
35
|
+
RL: 'Reference journal',
|
|
36
|
+
CB: 'Curation: build',
|
|
37
|
+
DC: 'Database comment',
|
|
38
|
+
DW: 'Database web link',
|
|
39
|
+
OS: 'Organism',
|
|
40
|
+
OC: 'Organism classification',
|
|
41
|
+
AM: 'Alignment method',
|
|
42
|
+
FT: 'Feature',
|
|
43
|
+
SO: 'Sequence Ontology term',
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export const referenceFieldLabels: Record<string, string> = {
|
|
47
|
+
RT: 'Title',
|
|
48
|
+
RA: 'Authors',
|
|
49
|
+
RL: 'Journal',
|
|
50
|
+
RM: 'PubMed',
|
|
51
|
+
RC: 'Comment',
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export const monospaceKeys = new Set(['NH'])
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
|
|
3
|
+
import { referenceFieldLabels } from './metadataLabels.ts'
|
|
4
|
+
|
|
5
|
+
const referenceTags = ['RM', 'RT', 'RA', 'RL', 'RC'] as const
|
|
6
|
+
|
|
7
|
+
function pubmed(id: string) {
|
|
8
|
+
return /^\d+$/.test(id) ? (
|
|
9
|
+
<a
|
|
10
|
+
href={`https://pubmed.ncbi.nlm.nih.gov/${id}/`}
|
|
11
|
+
target="_blank"
|
|
12
|
+
rel="noreferrer"
|
|
13
|
+
>
|
|
14
|
+
{id}
|
|
15
|
+
</a>
|
|
16
|
+
) : (
|
|
17
|
+
id
|
|
18
|
+
)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function groupReferences(general: Record<string, unknown>) {
|
|
22
|
+
const numbers = general.RN
|
|
23
|
+
if (!Array.isArray(numbers) || numbers.length === 0) {
|
|
24
|
+
return general
|
|
25
|
+
}
|
|
26
|
+
const present = referenceTags.filter(tag => general[tag] != null)
|
|
27
|
+
const aligned = present.every(tag => {
|
|
28
|
+
const values = general[tag]
|
|
29
|
+
return Array.isArray(values) && values.length === numbers.length
|
|
30
|
+
})
|
|
31
|
+
if (!aligned) {
|
|
32
|
+
return general
|
|
33
|
+
}
|
|
34
|
+
const rest = Object.fromEntries(
|
|
35
|
+
Object.entries(general).filter(
|
|
36
|
+
([tag]) =>
|
|
37
|
+
tag !== 'RN' && !(referenceTags as readonly string[]).includes(tag),
|
|
38
|
+
),
|
|
39
|
+
)
|
|
40
|
+
const references = Object.fromEntries(
|
|
41
|
+
numbers.map((number: string, i) => [
|
|
42
|
+
number,
|
|
43
|
+
Object.fromEntries(
|
|
44
|
+
present.map(tag => {
|
|
45
|
+
const value = (general[tag] as string[])[i]!
|
|
46
|
+
return [
|
|
47
|
+
referenceFieldLabels[tag],
|
|
48
|
+
tag === 'RM' ? pubmed(value) : value,
|
|
49
|
+
]
|
|
50
|
+
}),
|
|
51
|
+
),
|
|
52
|
+
]),
|
|
53
|
+
)
|
|
54
|
+
return { ...rest, References: references }
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function groupGeneral(general: unknown) {
|
|
58
|
+
return general && typeof general === 'object'
|
|
59
|
+
? groupReferences(general as Record<string, unknown>)
|
|
60
|
+
: {}
|
|
61
|
+
}
|
|
@@ -1,30 +1,33 @@
|
|
|
1
|
-
import React, {
|
|
1
|
+
import React, { useEffect } from 'react'
|
|
2
2
|
|
|
3
3
|
import useMeasure from '@jbrowse/core/util/useMeasure'
|
|
4
|
-
import
|
|
5
|
-
import { IconButton, Tooltip } from '@mui/material'
|
|
4
|
+
import Tune from '@mui/icons-material/Tune'
|
|
5
|
+
import { AppBar, Button, IconButton, Toolbar, Tooltip } from '@mui/material'
|
|
6
6
|
import { observer } from 'mobx-react'
|
|
7
7
|
|
|
8
8
|
import StatusMessage from '../StatusMessage.tsx'
|
|
9
|
-
import ColorSchemeMenu from './ColorSchemeMenu.tsx'
|
|
10
|
-
import FileMenu from './FileMenu.tsx'
|
|
11
|
-
import GappynessSlider from './GappynessSlider.tsx'
|
|
12
|
-
import GoToBox from './GoToBox.tsx'
|
|
13
9
|
import HeaderInfoArea from './HeaderInfoArea.tsx'
|
|
10
|
+
import HiddenColumnsChip from './HiddenColumnsChip.tsx'
|
|
14
11
|
import LoadWarnings from './LoadWarnings.tsx'
|
|
15
|
-
import
|
|
12
|
+
import MenuBar from './MenuBar.tsx'
|
|
16
13
|
import MultiAlignmentSelector from './MultiAlignmentSelector.tsx'
|
|
14
|
+
import ScrollZoomCheckbox from './ScrollZoomCheckbox.tsx'
|
|
17
15
|
import SelectionMenu from './SelectionMenu.tsx'
|
|
18
|
-
import TreeSettingsMenu from './TreeSettingsMenu.tsx'
|
|
19
16
|
import UnshareableDataWarning from './UnshareableDataWarning.tsx'
|
|
20
17
|
import ZoomControls from './ZoomControls.tsx'
|
|
21
|
-
import ZoomMenu from './ZoomMenu.tsx'
|
|
22
18
|
|
|
23
19
|
import type { MsaViewModel } from '../../model.ts'
|
|
24
20
|
|
|
25
|
-
|
|
21
|
+
export interface ToolbarSlots {
|
|
22
|
+
toolbarStart?: React.ReactNode
|
|
23
|
+
toolbarEnd?: React.ReactNode
|
|
24
|
+
}
|
|
26
25
|
|
|
27
|
-
const Header = observer(function ({
|
|
26
|
+
const Header = observer(function ({
|
|
27
|
+
model,
|
|
28
|
+
toolbarStart,
|
|
29
|
+
toolbarEnd,
|
|
30
|
+
}: { model: MsaViewModel } & ToolbarSlots) {
|
|
28
31
|
const [ref, { height }] = useMeasure()
|
|
29
32
|
useEffect(() => {
|
|
30
33
|
model.setHeaderHeight(height ?? 0)
|
|
@@ -36,38 +39,66 @@ const Header = observer(function ({ model }: { model: MsaViewModel }) {
|
|
|
36
39
|
[model],
|
|
37
40
|
)
|
|
38
41
|
return (
|
|
39
|
-
<
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
<
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
<
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
42
|
+
<AppBar
|
|
43
|
+
ref={ref}
|
|
44
|
+
position="static"
|
|
45
|
+
color="default"
|
|
46
|
+
elevation={0}
|
|
47
|
+
sx={{ borderBottom: 1, borderColor: 'divider' }}
|
|
48
|
+
>
|
|
49
|
+
<Toolbar
|
|
50
|
+
variant="dense"
|
|
51
|
+
disableGutters
|
|
52
|
+
sx={{ minHeight: 40, flexWrap: 'wrap', px: 0.5 }}
|
|
53
|
+
>
|
|
54
|
+
{toolbarStart}
|
|
55
|
+
<MenuBar model={model} />
|
|
56
|
+
{model.embeddedMode ? (
|
|
57
|
+
<Tooltip title="Settings">
|
|
58
|
+
<IconButton
|
|
59
|
+
data-testid="settings_button"
|
|
60
|
+
aria-label="Settings"
|
|
61
|
+
color={model.settingsOpen ? 'primary' : 'inherit'}
|
|
62
|
+
onClick={() => {
|
|
63
|
+
model.setSettingsOpen(!model.settingsOpen)
|
|
64
|
+
}}
|
|
65
|
+
>
|
|
66
|
+
<Tune />
|
|
67
|
+
</IconButton>
|
|
68
|
+
</Tooltip>
|
|
69
|
+
) : (
|
|
70
|
+
<Button
|
|
71
|
+
data-testid="settings_button"
|
|
72
|
+
size="small"
|
|
73
|
+
startIcon={<Tune />}
|
|
74
|
+
color={model.settingsOpen ? 'primary' : 'inherit'}
|
|
75
|
+
variant={model.settingsOpen ? 'outlined' : 'text'}
|
|
76
|
+
onClick={() => {
|
|
77
|
+
model.setSettingsOpen(!model.settingsOpen)
|
|
78
|
+
}}
|
|
79
|
+
sx={{ mx: 0.5, flexShrink: 0 }}
|
|
80
|
+
>
|
|
81
|
+
Settings
|
|
82
|
+
</Button>
|
|
83
|
+
)}
|
|
84
|
+
<ZoomControls model={model} />
|
|
85
|
+
<ScrollZoomCheckbox model={model} />
|
|
86
|
+
<HiddenColumnsChip model={model} />
|
|
87
|
+
<div style={{ paddingLeft: 20, margin: 'auto' }}>
|
|
88
|
+
<MultiAlignmentSelector model={model} />
|
|
89
|
+
</div>
|
|
90
|
+
{/* zero flex-basis, so what appears here on a selection or a hover
|
|
91
|
+
shrinks into the header's spare width and never wraps it */}
|
|
92
|
+
<div style={{ flex: '1 1 0', minWidth: 0, display: 'flex' }}>
|
|
93
|
+
<SelectionMenu model={model} />
|
|
94
|
+
<HeaderInfoArea model={model} />
|
|
95
|
+
</div>
|
|
96
|
+
<LoadWarnings model={model} />
|
|
97
|
+
<UnshareableDataWarning model={model} />
|
|
98
|
+
<StatusMessage model={model} variant="header" />
|
|
99
|
+
{toolbarEnd}
|
|
100
|
+
</Toolbar>
|
|
101
|
+
</AppBar>
|
|
71
102
|
)
|
|
72
103
|
})
|
|
73
104
|
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import React, { lazy } from 'react'
|
|
2
|
+
|
|
3
|
+
import { Chip, Tooltip } from '@mui/material'
|
|
4
|
+
import { observer } from 'mobx-react'
|
|
5
|
+
|
|
6
|
+
import type { MsaViewModel } from '../../model.ts'
|
|
7
|
+
|
|
8
|
+
const GapThresholdDialog = lazy(
|
|
9
|
+
() => import('../dialogs/GapThresholdDialog.tsx'),
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
const HiddenColumnsChip = observer(function ({
|
|
13
|
+
model,
|
|
14
|
+
}: {
|
|
15
|
+
model: MsaViewModel
|
|
16
|
+
}) {
|
|
17
|
+
const n = model.blanks.length
|
|
18
|
+
return n > 0 ? (
|
|
19
|
+
<Tooltip
|
|
20
|
+
title={`Hiding columns with ≥${model.allowedGappyness}% gaps. Click to change the threshold, × to show every column`}
|
|
21
|
+
>
|
|
22
|
+
<Chip
|
|
23
|
+
data-testid="hidden_columns_chip"
|
|
24
|
+
size="small"
|
|
25
|
+
variant="outlined"
|
|
26
|
+
label={`${n.toLocaleString('en-US')} gappy column${n === 1 ? '' : 's'} hidden`}
|
|
27
|
+
style={{ margin: 'auto 8px', flexShrink: 0 }}
|
|
28
|
+
onClick={() => {
|
|
29
|
+
model.queueDialog(onClose => [GapThresholdDialog, { model, onClose }])
|
|
30
|
+
}}
|
|
31
|
+
onDelete={() => {
|
|
32
|
+
model.setHideGaps(false)
|
|
33
|
+
}}
|
|
34
|
+
/>
|
|
35
|
+
</Tooltip>
|
|
36
|
+
) : null
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
export default HiddenColumnsChip
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
|
|
3
|
+
import CascadingMenuButton from '@jbrowse/core/ui/CascadingMenuButton'
|
|
4
|
+
import Build from '@mui/icons-material/Build'
|
|
5
|
+
import Help from '@mui/icons-material/Help'
|
|
6
|
+
import InsertDriveFile from '@mui/icons-material/InsertDriveFile'
|
|
7
|
+
import Visibility from '@mui/icons-material/Visibility'
|
|
8
|
+
import { Tooltip } from '@mui/material'
|
|
9
|
+
import { observer } from 'mobx-react'
|
|
10
|
+
|
|
11
|
+
import {
|
|
12
|
+
fileMenuItems,
|
|
13
|
+
helpMenuItems,
|
|
14
|
+
toolsMenuItems,
|
|
15
|
+
viewMenuItems,
|
|
16
|
+
} from './menuBarItems.ts'
|
|
17
|
+
|
|
18
|
+
import type { MsaViewModel } from '../../model.ts'
|
|
19
|
+
import type { MenuItem } from '@jbrowse/core/ui/Menu'
|
|
20
|
+
import type { SxProps, Theme } from '@mui/material'
|
|
21
|
+
|
|
22
|
+
// CascadingMenuButton renders an IconButton on every core a host may ship, so
|
|
23
|
+
// these styles give it the look of a small text Button
|
|
24
|
+
const menuButtonSx: SxProps<Theme> = {
|
|
25
|
+
borderRadius: 1,
|
|
26
|
+
typography: 'button',
|
|
27
|
+
color: 'text.primary',
|
|
28
|
+
px: 1,
|
|
29
|
+
py: 0.5,
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const menus: [string, (model: MsaViewModel) => MenuItem[], React.ReactNode][] =
|
|
33
|
+
[
|
|
34
|
+
['File', fileMenuItems, <InsertDriveFile key="file" />],
|
|
35
|
+
['View', viewMenuItems, <Visibility key="view" />],
|
|
36
|
+
['Tools', toolsMenuItems, <Build key="tools" />],
|
|
37
|
+
['Help', helpMenuItems, <Help key="help" />],
|
|
38
|
+
]
|
|
39
|
+
|
|
40
|
+
const MenuBar = observer(function ({ model }: { model: MsaViewModel }) {
|
|
41
|
+
const { embeddedMode } = model
|
|
42
|
+
return menus.map(([name, items, icon]) => {
|
|
43
|
+
const button = (
|
|
44
|
+
<CascadingMenuButton
|
|
45
|
+
key={name}
|
|
46
|
+
data-testid={`${name.toLowerCase()}_menu`}
|
|
47
|
+
aria-label={name}
|
|
48
|
+
menuItems={items(model)}
|
|
49
|
+
sx={menuButtonSx}
|
|
50
|
+
>
|
|
51
|
+
{embeddedMode ? icon : name}
|
|
52
|
+
</CascadingMenuButton>
|
|
53
|
+
)
|
|
54
|
+
return embeddedMode ? (
|
|
55
|
+
<Tooltip key={name} title={name}>
|
|
56
|
+
{button}
|
|
57
|
+
</Tooltip>
|
|
58
|
+
) : (
|
|
59
|
+
button
|
|
60
|
+
)
|
|
61
|
+
})
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
export default MenuBar
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
|
|
3
|
+
import { Checkbox, FormControlLabel, Tooltip } from '@mui/material'
|
|
4
|
+
import { observer } from 'mobx-react'
|
|
5
|
+
|
|
6
|
+
import type { MsaViewModel } from '../../model.ts'
|
|
7
|
+
|
|
8
|
+
// the label and the control jbrowse-components' ScrollZoomToggle uses, kept
|
|
9
|
+
// local because a host's older core lacks that export
|
|
10
|
+
export const scrollZoomLabel = 'Zoom on scroll'
|
|
11
|
+
|
|
12
|
+
const scrollZoomHelp =
|
|
13
|
+
'The mouse wheel zooms the alignment instead of scrolling it; shift+scroll still scrolls. ctrl+scroll (⌘+scroll on a Mac) zooms either way.'
|
|
14
|
+
|
|
15
|
+
const ScrollZoomCheckbox = observer(function ({
|
|
16
|
+
model,
|
|
17
|
+
}: {
|
|
18
|
+
model: MsaViewModel
|
|
19
|
+
}) {
|
|
20
|
+
return (
|
|
21
|
+
<Tooltip title={scrollZoomHelp} describeChild>
|
|
22
|
+
<FormControlLabel
|
|
23
|
+
data-testid="scroll-zoom-toggle"
|
|
24
|
+
style={{
|
|
25
|
+
marginLeft: 4,
|
|
26
|
+
marginRight: model.embeddedMode ? 0 : 8,
|
|
27
|
+
whiteSpace: 'nowrap',
|
|
28
|
+
}}
|
|
29
|
+
control={
|
|
30
|
+
<Checkbox
|
|
31
|
+
size="small"
|
|
32
|
+
checked={model.scrollZoom}
|
|
33
|
+
onChange={() => {
|
|
34
|
+
model.setScrollZoom(!model.scrollZoom)
|
|
35
|
+
}}
|
|
36
|
+
style={{ padding: 6 }}
|
|
37
|
+
/>
|
|
38
|
+
}
|
|
39
|
+
label={model.embeddedMode ? '' : scrollZoomLabel}
|
|
40
|
+
slotProps={{ typography: { variant: 'body2' } }}
|
|
41
|
+
/>
|
|
42
|
+
</Tooltip>
|
|
43
|
+
)
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
export default ScrollZoomCheckbox
|
|
@@ -1,67 +1,19 @@
|
|
|
1
1
|
import React from 'react'
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import FitScreen from '@mui/icons-material/FitScreen'
|
|
4
|
+
import RestartAlt from '@mui/icons-material/RestartAlt'
|
|
4
5
|
import ZoomIn from '@mui/icons-material/ZoomIn'
|
|
5
6
|
import ZoomOut from '@mui/icons-material/ZoomOut'
|
|
6
7
|
import { IconButton, Tooltip } from '@mui/material'
|
|
7
8
|
import { observer } from 'mobx-react'
|
|
8
9
|
|
|
9
|
-
import {
|
|
10
|
-
MouseScroll,
|
|
11
|
-
MouseZoomBoth,
|
|
12
|
-
MouseZoomHorizontal,
|
|
13
|
-
MouseZoomVertical,
|
|
14
|
-
} from './ScrollZoomIcons.tsx'
|
|
15
|
-
|
|
16
|
-
import type { ScrollZoomAxis } from '../../constants.ts'
|
|
17
10
|
import type { MsaViewModel } from '../../model.ts'
|
|
18
11
|
|
|
19
|
-
interface WheelMode {
|
|
20
|
-
label: string
|
|
21
|
-
// undefined is the wheel scrolling the alignment, which is the default
|
|
22
|
-
axis?: ScrollZoomAxis
|
|
23
|
-
Icon: typeof MouseScroll
|
|
24
|
-
helpText?: string
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const scrollMode: WheelMode = {
|
|
28
|
-
label: 'Scrolls the alignment',
|
|
29
|
-
Icon: MouseScroll,
|
|
30
|
-
helpText: 'Ctrl+wheel zooms both axes at the cursor.',
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const wheelModes: WheelMode[] = [
|
|
34
|
-
scrollMode,
|
|
35
|
-
{
|
|
36
|
-
label: 'Zooms both axes',
|
|
37
|
-
axis: 'both',
|
|
38
|
-
Icon: MouseZoomBoth,
|
|
39
|
-
helpText: 'Hold shift to pan while the wheel zooms.',
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
label: 'Zooms columns only',
|
|
43
|
-
axis: 'horizontal',
|
|
44
|
-
Icon: MouseZoomHorizontal,
|
|
45
|
-
helpText:
|
|
46
|
-
'Holds the row height, so the labels and letters stay at their size while the alignment compresses.',
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
label: 'Zooms rows only',
|
|
50
|
-
axis: 'vertical',
|
|
51
|
-
Icon: MouseZoomVertical,
|
|
52
|
-
helpText:
|
|
53
|
-
'Holds the column width, so the alignment stays as wide while the rows grow or shrink.',
|
|
54
|
-
},
|
|
55
|
-
]
|
|
56
|
-
|
|
57
12
|
const ZoomControls = observer(function ZoomControls({
|
|
58
13
|
model,
|
|
59
14
|
}: {
|
|
60
15
|
model: MsaViewModel
|
|
61
16
|
}) {
|
|
62
|
-
const { scrollZoom, scrollZoomAxis } = model
|
|
63
|
-
const activeAxis = scrollZoom ? scrollZoomAxis : undefined
|
|
64
|
-
const current = wheelModes.find(m => m.axis === activeAxis) ?? scrollMode
|
|
65
17
|
return (
|
|
66
18
|
<>
|
|
67
19
|
<Tooltip title="Zoom in">
|
|
@@ -84,31 +36,28 @@ const ZoomControls = observer(function ZoomControls({
|
|
|
84
36
|
<ZoomOut />
|
|
85
37
|
</IconButton>
|
|
86
38
|
</Tooltip>
|
|
87
|
-
<
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
]}
|
|
108
|
-
>
|
|
109
|
-
<current.Icon />
|
|
110
|
-
</CascadingMenuButton>
|
|
39
|
+
<Tooltip title="Fit the whole alignment in the window">
|
|
40
|
+
<IconButton
|
|
41
|
+
aria-label="Fit to window"
|
|
42
|
+
onClick={() => {
|
|
43
|
+
model.fit()
|
|
44
|
+
}}
|
|
45
|
+
>
|
|
46
|
+
<FitScreen />
|
|
47
|
+
</IconButton>
|
|
48
|
+
</Tooltip>
|
|
49
|
+
<Tooltip title="Reset zoom to the default cell size (0)">
|
|
50
|
+
<IconButton
|
|
51
|
+
aria-label="Reset zoom"
|
|
52
|
+
onClick={() => {
|
|
53
|
+
model.resetZoom()
|
|
54
|
+
}}
|
|
55
|
+
>
|
|
56
|
+
<RestartAlt />
|
|
57
|
+
</IconButton>
|
|
58
|
+
</Tooltip>
|
|
111
59
|
</>
|
|
112
60
|
)
|
|
113
61
|
})
|
|
62
|
+
|
|
114
63
|
export default ZoomControls
|