@apollo-annotation/jbrowse-plugin-apollo 0.3.12 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ApolloRefNameAliasAdapter/ApolloRefNameAliasAdapter.d.ts +1 -1
- package/dist/ApolloRefNameAliasAdapter/ApolloRefNameAliasAdapter.d.ts.map +1 -1
- package/dist/BackendDrivers/BackendDriver.d.ts +29 -4
- package/dist/BackendDrivers/BackendDriver.d.ts.map +1 -1
- package/dist/BackendDrivers/CollaborationServerDriver.d.ts +3 -1
- package/dist/BackendDrivers/CollaborationServerDriver.d.ts.map +1 -1
- package/dist/BackendDrivers/LocalDriver/LocalDriver.d.ts +22 -0
- package/dist/BackendDrivers/LocalDriver/LocalDriver.d.ts.map +1 -0
- package/dist/BackendDrivers/LocalDriver/db.d.ts +4 -0
- package/dist/BackendDrivers/LocalDriver/db.d.ts.map +1 -0
- package/dist/BackendDrivers/index.d.ts +1 -2
- package/dist/BackendDrivers/index.d.ts.map +1 -1
- package/dist/ChangeManager.d.ts +3 -3
- package/dist/ChangeManager.d.ts.map +1 -1
- package/dist/FeatureDetailsWidget/ApolloTranscriptDetailsWidget.d.ts +0 -6
- package/dist/FeatureDetailsWidget/ApolloTranscriptDetailsWidget.d.ts.map +1 -1
- package/dist/FeatureDetailsWidget/TranscriptWidgetEditLocation.d.ts.map +1 -1
- package/dist/FeatureDetailsWidget/model.d.ts +0 -2
- package/dist/FeatureDetailsWidget/model.d.ts.map +1 -1
- package/dist/LinearApolloDisplay/components/CheckResultWarnings.d.ts.map +1 -1
- package/dist/LinearApolloDisplay/components/LinearApolloDisplay.d.ts.map +1 -1
- package/dist/LinearApolloDisplay/components/OverlayCanvas.d.ts +7 -0
- package/dist/LinearApolloDisplay/components/OverlayCanvas.d.ts.map +1 -0
- package/dist/LinearApolloDisplay/components/Tooltip.d.ts +10 -0
- package/dist/LinearApolloDisplay/components/Tooltip.d.ts.map +1 -0
- package/dist/LinearApolloDisplay/glyphs/BoxGlyph.d.ts +0 -1
- package/dist/LinearApolloDisplay/glyphs/BoxGlyph.d.ts.map +1 -1
- package/dist/LinearApolloDisplay/glyphs/CDSGlyph.d.ts +3 -0
- package/dist/LinearApolloDisplay/glyphs/CDSGlyph.d.ts.map +1 -0
- package/dist/LinearApolloDisplay/glyphs/ExonGlyph.d.ts +3 -0
- package/dist/LinearApolloDisplay/glyphs/ExonGlyph.d.ts.map +1 -0
- package/dist/LinearApolloDisplay/glyphs/GeneGlyph.d.ts.map +1 -1
- package/dist/LinearApolloDisplay/glyphs/GenericChildGlyph.d.ts.map +1 -1
- package/dist/LinearApolloDisplay/glyphs/Glyph.d.ts +26 -20
- package/dist/LinearApolloDisplay/glyphs/Glyph.d.ts.map +1 -1
- package/dist/LinearApolloDisplay/glyphs/TranscriptGlyph.d.ts +3 -0
- package/dist/LinearApolloDisplay/glyphs/TranscriptGlyph.d.ts.map +1 -0
- package/dist/LinearApolloDisplay/glyphs/util.d.ts +13 -0
- package/dist/LinearApolloDisplay/glyphs/util.d.ts.map +1 -1
- package/dist/LinearApolloDisplay/stateModel/base.d.ts +17 -0
- package/dist/LinearApolloDisplay/stateModel/base.d.ts.map +1 -1
- package/dist/LinearApolloDisplay/stateModel/index.d.ts +35 -17
- package/dist/LinearApolloDisplay/stateModel/index.d.ts.map +1 -1
- package/dist/LinearApolloDisplay/stateModel/layouts.d.ts +29 -7
- package/dist/LinearApolloDisplay/stateModel/layouts.d.ts.map +1 -1
- package/dist/LinearApolloDisplay/stateModel/mouseEvents.d.ts +69 -23
- package/dist/LinearApolloDisplay/stateModel/mouseEvents.d.ts.map +1 -1
- package/dist/LinearApolloDisplay/stateModel/rendering.d.ts +26 -9
- package/dist/LinearApolloDisplay/stateModel/rendering.d.ts.map +1 -1
- package/dist/LinearApolloReferenceSequenceDisplay/stateModel/base.d.ts +6 -0
- package/dist/LinearApolloReferenceSequenceDisplay/stateModel/base.d.ts.map +1 -1
- package/dist/LinearApolloReferenceSequenceDisplay/stateModel/index.d.ts +6 -0
- package/dist/LinearApolloReferenceSequenceDisplay/stateModel/index.d.ts.map +1 -1
- package/dist/LinearApolloReferenceSequenceDisplay/stateModel/rendering.d.ts +6 -0
- package/dist/LinearApolloReferenceSequenceDisplay/stateModel/rendering.d.ts.map +1 -1
- package/dist/LinearApolloSixFrameDisplay/components/LinearApolloSixFrameDisplay.d.ts.map +1 -1
- package/dist/LinearApolloSixFrameDisplay/glyphs/GeneGlyph.d.ts.map +1 -1
- package/dist/LinearApolloSixFrameDisplay/glyphs/Glyph.d.ts +1 -1
- package/dist/LinearApolloSixFrameDisplay/glyphs/Glyph.d.ts.map +1 -1
- package/dist/LinearApolloSixFrameDisplay/stateModel/layouts.d.ts.map +1 -1
- package/dist/LinearApolloSixFrameDisplay/stateModel/rendering.d.ts.map +1 -1
- package/dist/OntologyManager/OntologyStore/fulltext.d.ts +1 -1
- package/dist/OntologyManager/OntologyStore/fulltext.d.ts.map +1 -1
- package/dist/OntologyManager/OntologyStore/index.d.ts +2 -2
- package/dist/OntologyManager/OntologyStore/index.d.ts.map +1 -1
- package/dist/OntologyManager/OntologyStore/indexeddb-storage.d.ts +1 -1
- package/dist/OntologyManager/OntologyStore/indexeddb-storage.d.ts.map +1 -1
- package/dist/OntologyManager/OntologyStore/types.d.ts +18 -0
- package/dist/OntologyManager/OntologyStore/types.d.ts.map +1 -0
- package/dist/TabularEditor/HybridGrid/featureContextMenuItems.d.ts.map +1 -1
- package/dist/components/AddChildFeature.d.ts.map +1 -1
- package/dist/components/ColorFeature.d.ts +13 -0
- package/dist/components/ColorFeature.d.ts.map +1 -0
- package/dist/components/CreateApolloAnnotation.d.ts.map +1 -1
- package/dist/components/DownloadGFF3.d.ts +4 -1
- package/dist/components/DownloadGFF3.d.ts.map +1 -1
- package/dist/components/DuplicateTranscript.d.ts.map +1 -1
- package/dist/components/ViewChangeLog.d.ts +2 -1
- package/dist/components/ViewChangeLog.d.ts.map +1 -1
- package/dist/components/ViewCheckResults.d.ts +2 -1
- package/dist/components/ViewCheckResults.d.ts.map +1 -1
- package/dist/components/index.d.ts +1 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/extensions/annotationFromJBrowseFeature.d.ts.map +1 -1
- package/dist/extensions/annotationFromPileup.d.ts.map +1 -1
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.esm.js +6325 -5997
- package/dist/index.esm.js.map +1 -1
- package/dist/jbrowse-plugin-apollo.cjs.development.js +5869 -5541
- package/dist/jbrowse-plugin-apollo.cjs.development.js.map +1 -1
- package/dist/jbrowse-plugin-apollo.cjs.production.min.js +1 -1
- package/dist/jbrowse-plugin-apollo.cjs.production.min.js.map +1 -1
- package/dist/jbrowse-plugin-apollo.umd.development.js +16782 -25897
- package/dist/jbrowse-plugin-apollo.umd.development.js.map +1 -1
- package/dist/jbrowse-plugin-apollo.umd.production.min.js +1 -1
- package/dist/jbrowse-plugin-apollo.umd.production.min.js.map +1 -1
- package/dist/makeDisplayComponent.d.ts.map +1 -1
- package/dist/menus/Icons.d.ts +3 -0
- package/dist/menus/Icons.d.ts.map +1 -0
- package/dist/menus/topLevelMenu.d.ts.map +1 -1
- package/dist/session/changeHandlers.d.ts +9 -0
- package/dist/session/changeHandlers.d.ts.map +1 -0
- package/dist/util/annotationFeatureUtils.d.ts +2 -1
- package/dist/util/annotationFeatureUtils.d.ts.map +1 -1
- package/dist/util/glyphUtils.d.ts +3 -3
- package/dist/util/glyphUtils.d.ts.map +1 -1
- package/dist/util/index.d.ts +0 -1
- package/dist/util/index.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/ApolloInternetAccount/model.ts +68 -4
- package/src/ApolloRefNameAliasAdapter/ApolloRefNameAliasAdapter.ts +6 -3
- package/src/ApolloTextSearchAdapter/ApolloTextSearchAdapter.ts +1 -1
- package/src/BackendDrivers/BackendDriver.ts +36 -3
- package/src/BackendDrivers/CollaborationServerDriver.ts +78 -23
- package/src/BackendDrivers/LocalDriver/LocalDriver.ts +367 -0
- package/src/BackendDrivers/LocalDriver/db.ts +37 -0
- package/src/BackendDrivers/index.ts +1 -2
- package/src/ChangeManager.ts +27 -25
- package/src/FeatureDetailsWidget/ApolloTranscriptDetailsWidget.tsx +1 -1
- package/src/FeatureDetailsWidget/TranscriptWidgetEditLocation.tsx +69 -53
- package/src/LinearApolloDisplay/components/CheckResultWarnings.tsx +1 -5
- package/src/LinearApolloDisplay/components/LinearApolloDisplay.tsx +95 -115
- package/src/LinearApolloDisplay/components/OverlayCanvas.tsx +76 -0
- package/src/LinearApolloDisplay/components/Tooltip.tsx +42 -0
- package/src/LinearApolloDisplay/glyphs/BoxGlyph.ts +60 -302
- package/src/LinearApolloDisplay/glyphs/CDSGlyph.ts +145 -0
- package/src/LinearApolloDisplay/glyphs/ExonGlyph.ts +212 -0
- package/src/LinearApolloDisplay/glyphs/GeneGlyph.ts +65 -999
- package/src/LinearApolloDisplay/glyphs/GenericChildGlyph.ts +71 -181
- package/src/LinearApolloDisplay/glyphs/Glyph.ts +42 -66
- package/src/LinearApolloDisplay/glyphs/TranscriptGlyph.ts +291 -0
- package/src/LinearApolloDisplay/glyphs/util.ts +87 -0
- package/src/LinearApolloDisplay/stateModel/base.ts +83 -0
- package/src/LinearApolloDisplay/stateModel/layouts.ts +198 -138
- package/src/LinearApolloDisplay/stateModel/mouseEvents.ts +252 -158
- package/src/LinearApolloDisplay/stateModel/rendering.ts +103 -21
- package/src/LinearApolloReferenceSequenceDisplay/drawSequenceOverlay.ts +3 -3
- package/src/LinearApolloReferenceSequenceDisplay/stateModel/base.ts +20 -2
- package/src/LinearApolloSixFrameDisplay/components/LinearApolloSixFrameDisplay.tsx +7 -2
- package/src/LinearApolloSixFrameDisplay/glyphs/GeneGlyph.ts +8 -13
- package/src/LinearApolloSixFrameDisplay/glyphs/Glyph.ts +1 -1
- package/src/LinearApolloSixFrameDisplay/stateModel/layouts.ts +4 -3
- package/src/LinearApolloSixFrameDisplay/stateModel/mouseEvents.ts +1 -1
- package/src/LinearApolloSixFrameDisplay/stateModel/rendering.ts +2 -1
- package/src/OntologyManager/OntologyStore/__snapshots__/index.test.ts.snap +18262 -8519
- package/src/OntologyManager/OntologyStore/fulltext.ts +1 -2
- package/src/OntologyManager/OntologyStore/index.test.ts +5 -2
- package/src/OntologyManager/OntologyStore/index.ts +7 -8
- package/src/OntologyManager/OntologyStore/indexeddb-storage.ts +2 -2
- package/src/OntologyManager/OntologyStore/types.ts +27 -0
- package/src/OntologyManager/index.ts +15 -26
- package/src/TabularEditor/HybridGrid/featureContextMenuItems.ts +4 -5
- package/src/components/AddChildFeature.tsx +15 -8
- package/src/components/ColorFeature.tsx +167 -0
- package/src/components/CreateApolloAnnotation.tsx +35 -9
- package/src/components/DownloadGFF3.tsx +92 -121
- package/src/components/DuplicateTranscript.tsx +10 -0
- package/src/components/ViewChangeLog.tsx +123 -83
- package/src/components/ViewCheckResults.tsx +15 -73
- package/src/components/index.ts +1 -1
- package/src/config.ts +37 -19
- package/src/extensions/annotationFromJBrowseFeature.test.ts +1 -1
- package/src/extensions/annotationFromJBrowseFeature.ts +91 -63
- package/src/extensions/annotationFromPileup.ts +40 -40
- package/src/index.ts +45 -1
- package/src/makeDisplayComponent.tsx +10 -3
- package/src/menus/Icons.tsx +49 -0
- package/src/menus/topLevelMenu.ts +24 -96
- package/src/session/ClientDataStore.ts +16 -17
- package/src/session/changeHandlers.ts +261 -0
- package/src/session/session.ts +77 -46
- package/src/util/annotationFeatureUtils.ts +29 -1
- package/src/util/glyphUtils.ts +74 -31
- package/src/util/index.ts +0 -1
- package/dist/BackendDrivers/DesktopFileDriver.d.ts +0 -160
- package/dist/BackendDrivers/DesktopFileDriver.d.ts.map +0 -1
- package/dist/BackendDrivers/InMemoryFileDriver.d.ts +0 -162
- package/dist/BackendDrivers/InMemoryFileDriver.d.ts.map +0 -1
- package/dist/LinearApolloDisplay/glyphs/index.d.ts +0 -4
- package/dist/LinearApolloDisplay/glyphs/index.d.ts.map +0 -1
- package/dist/components/OpenLocalFile.d.ts +0 -15
- package/dist/components/OpenLocalFile.d.ts.map +0 -1
- package/dist/util/loadAssemblyIntoClient.d.ts +0 -5
- package/dist/util/loadAssemblyIntoClient.d.ts.map +0 -1
- package/src/BackendDrivers/DesktopFileDriver.ts +0 -184
- package/src/BackendDrivers/InMemoryFileDriver.ts +0 -107
- package/src/LinearApolloDisplay/glyphs/index.ts +0 -3
- package/src/components/OpenLocalFile.tsx +0 -189
- package/src/util/loadAssemblyIntoClient.ts +0 -94
|
@@ -52,11 +52,7 @@ export const CheckResultWarnings = observer(function CheckResultWarnings({
|
|
|
52
52
|
if (!feature) {
|
|
53
53
|
return null
|
|
54
54
|
}
|
|
55
|
-
|
|
56
|
-
const featureLayout = display.getFeatureLayoutPosition(feature)
|
|
57
|
-
if (featureLayout) {
|
|
58
|
-
row = featureLayout.layoutRow + featureLayout.featureRow
|
|
59
|
-
}
|
|
55
|
+
const row = display.getRowForFeature(feature) ?? 0
|
|
60
56
|
const top = row * apolloRowHeight
|
|
61
57
|
const height = apolloRowHeight
|
|
62
58
|
return (
|
|
@@ -14,6 +14,7 @@ import { type Coord, useStyles } from '../../util/displayUtils'
|
|
|
14
14
|
import type { LinearApolloDisplay as LinearApolloDisplayI } from '../stateModel'
|
|
15
15
|
|
|
16
16
|
import { CheckResultWarnings } from './CheckResultWarnings'
|
|
17
|
+
import { OverlayCanvas } from './OverlayCanvas'
|
|
17
18
|
|
|
18
19
|
interface LinearApolloDisplayProps {
|
|
19
20
|
model: LinearApolloDisplayI
|
|
@@ -29,18 +30,12 @@ export const LinearApolloDisplay = observer(function LinearApolloDisplay(
|
|
|
29
30
|
const {
|
|
30
31
|
loading,
|
|
31
32
|
contextMenuItems: getContextMenuItems,
|
|
32
|
-
|
|
33
|
-
featuresHeight,
|
|
33
|
+
featuresHeight: getFeaturesHeight,
|
|
34
34
|
isShown,
|
|
35
|
-
onMouseDown,
|
|
36
|
-
onMouseLeave,
|
|
37
|
-
onMouseMove,
|
|
38
|
-
onMouseUp,
|
|
39
35
|
regionCannotBeRendered,
|
|
40
36
|
session,
|
|
41
37
|
setCanvas,
|
|
42
38
|
setCollaboratorCanvas,
|
|
43
|
-
setOverlayCanvas,
|
|
44
39
|
setTheme,
|
|
45
40
|
} = model
|
|
46
41
|
const { classes } = useStyles()
|
|
@@ -55,115 +50,100 @@ export const LinearApolloDisplay = observer(function LinearApolloDisplay(
|
|
|
55
50
|
if (!isShown) {
|
|
56
51
|
return null
|
|
57
52
|
}
|
|
53
|
+
const featuresHeight = getFeaturesHeight(lgv.assemblyNames[0])
|
|
58
54
|
return (
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
{
|
|
79
|
-
<
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
{loading
|
|
84
|
-
<
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
>
|
|
96
|
-
<
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
)
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
/>
|
|
139
|
-
<CheckResultWarnings display={model} />
|
|
140
|
-
<Menu
|
|
141
|
-
open={contextMenuItems.length > 0}
|
|
142
|
-
onMenuItemClick={(_, callback) => {
|
|
143
|
-
callback()
|
|
144
|
-
setContextMenuItems([])
|
|
145
|
-
}}
|
|
146
|
-
onClose={() => {
|
|
147
|
-
setContextMenuItems([])
|
|
148
|
-
}}
|
|
149
|
-
slotProps={{
|
|
150
|
-
transition: {
|
|
151
|
-
onExit: () => {
|
|
152
|
-
setContextMenuItems([])
|
|
153
|
-
},
|
|
55
|
+
<div
|
|
56
|
+
className={classes.canvasContainer}
|
|
57
|
+
style={{
|
|
58
|
+
width: lgv.dynamicBlocks.totalWidthPx,
|
|
59
|
+
height: featuresHeight,
|
|
60
|
+
}}
|
|
61
|
+
onContextMenu={(event) => {
|
|
62
|
+
event.preventDefault()
|
|
63
|
+
if (contextMenuItems.length > 0) {
|
|
64
|
+
// There's already a context menu open, so close it
|
|
65
|
+
setContextMenuItems([])
|
|
66
|
+
} else {
|
|
67
|
+
const coord: [number, number] = [event.clientX, event.clientY]
|
|
68
|
+
setContextCoord(coord)
|
|
69
|
+
setContextMenuItems(getContextMenuItems(event))
|
|
70
|
+
}
|
|
71
|
+
}}
|
|
72
|
+
>
|
|
73
|
+
{session.isLocked ? (
|
|
74
|
+
<div className={classes.locked} data-testid="lock-icon">
|
|
75
|
+
<LockIcon />
|
|
76
|
+
</div>
|
|
77
|
+
) : null}
|
|
78
|
+
{loading ? (
|
|
79
|
+
<div className={classes.loading}>
|
|
80
|
+
<CircularProgress size="18px" />
|
|
81
|
+
</div>
|
|
82
|
+
) : null}
|
|
83
|
+
{/* This type is wrong in @jbrowse/core */}
|
|
84
|
+
{/* eslint-disable-next-line @typescript-eslint/no-unnecessary-condition */}
|
|
85
|
+
{message ? (
|
|
86
|
+
<Alert
|
|
87
|
+
severity="warning"
|
|
88
|
+
classes={{ message: classes.ellipses }}
|
|
89
|
+
slotProps={{ root: { className: classes.center } }}
|
|
90
|
+
>
|
|
91
|
+
<Tooltip title={message}>
|
|
92
|
+
<div>{message}</div>
|
|
93
|
+
</Tooltip>
|
|
94
|
+
</Alert>
|
|
95
|
+
) : (
|
|
96
|
+
// Promise.resolve() in these 2 callbacks is to avoid infinite rendering loop
|
|
97
|
+
// https://github.com/mobxjs/mobx/issues/3728#issuecomment-1715400931
|
|
98
|
+
<>
|
|
99
|
+
<canvas
|
|
100
|
+
ref={async (node: HTMLCanvasElement) => {
|
|
101
|
+
await Promise.resolve()
|
|
102
|
+
setCollaboratorCanvas(node)
|
|
103
|
+
}}
|
|
104
|
+
width={lgv.dynamicBlocks.totalWidthPx}
|
|
105
|
+
height={featuresHeight}
|
|
106
|
+
className={classes.canvas}
|
|
107
|
+
data-testid="collaboratorCanvas"
|
|
108
|
+
/>
|
|
109
|
+
<canvas
|
|
110
|
+
ref={async (node: HTMLCanvasElement) => {
|
|
111
|
+
await Promise.resolve()
|
|
112
|
+
setCanvas(node)
|
|
113
|
+
}}
|
|
114
|
+
width={lgv.dynamicBlocks.totalWidthPx}
|
|
115
|
+
height={featuresHeight}
|
|
116
|
+
className={classes.canvas}
|
|
117
|
+
data-testid="canvas"
|
|
118
|
+
/>
|
|
119
|
+
<OverlayCanvas model={model} />
|
|
120
|
+
<CheckResultWarnings display={model} />
|
|
121
|
+
<Menu
|
|
122
|
+
open={contextMenuItems.length > 0}
|
|
123
|
+
onMenuItemClick={(_, callback) => {
|
|
124
|
+
callback()
|
|
125
|
+
setContextMenuItems([])
|
|
126
|
+
}}
|
|
127
|
+
onClose={() => {
|
|
128
|
+
setContextMenuItems([])
|
|
129
|
+
}}
|
|
130
|
+
slotProps={{
|
|
131
|
+
transition: {
|
|
132
|
+
onExit: () => {
|
|
133
|
+
setContextMenuItems([])
|
|
154
134
|
},
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
135
|
+
},
|
|
136
|
+
}}
|
|
137
|
+
anchorReference="anchorPosition"
|
|
138
|
+
anchorPosition={
|
|
139
|
+
contextCoord
|
|
140
|
+
? { top: contextCoord[1], left: contextCoord[0] }
|
|
141
|
+
: undefined
|
|
142
|
+
}
|
|
143
|
+
menuItems={contextMenuItems}
|
|
144
|
+
/>
|
|
145
|
+
</>
|
|
146
|
+
)}
|
|
147
|
+
</div>
|
|
168
148
|
)
|
|
169
149
|
})
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/unbound-method */
|
|
2
|
+
|
|
3
|
+
/* eslint-disable @typescript-eslint/no-misused-promises */
|
|
4
|
+
|
|
5
|
+
import { getContainingView } from '@jbrowse/core/util'
|
|
6
|
+
import type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'
|
|
7
|
+
import { observer } from 'mobx-react'
|
|
8
|
+
import React, { useState } from 'react'
|
|
9
|
+
|
|
10
|
+
import { type Coord, useStyles } from '../../util/displayUtils'
|
|
11
|
+
import type { LinearApolloDisplay as LinearApolloDisplayI } from '../stateModel'
|
|
12
|
+
|
|
13
|
+
import { Tooltip as LinearApolloDisplayTooltip } from './Tooltip'
|
|
14
|
+
|
|
15
|
+
interface LinearApolloDisplayProps {
|
|
16
|
+
model: LinearApolloDisplayI
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export const OverlayCanvas = observer(function OverlayCanvas(
|
|
20
|
+
props: LinearApolloDisplayProps,
|
|
21
|
+
) {
|
|
22
|
+
const { model } = props
|
|
23
|
+
const {
|
|
24
|
+
apolloDragging,
|
|
25
|
+
cursor,
|
|
26
|
+
featuresHeight: getFeaturesHeight,
|
|
27
|
+
isShown,
|
|
28
|
+
onMouseDown,
|
|
29
|
+
onMouseLeave,
|
|
30
|
+
onMouseMove,
|
|
31
|
+
onMouseUp,
|
|
32
|
+
session,
|
|
33
|
+
setOverlayCanvas,
|
|
34
|
+
} = model
|
|
35
|
+
const { classes } = useStyles()
|
|
36
|
+
const lgv = getContainingView(model) as unknown as LinearGenomeViewModel
|
|
37
|
+
|
|
38
|
+
const [mouseCoord, setMouseCoord] = useState<Coord>()
|
|
39
|
+
if (!isShown) {
|
|
40
|
+
return null
|
|
41
|
+
}
|
|
42
|
+
const featuresHeight = getFeaturesHeight(lgv.assemblyNames[0])
|
|
43
|
+
// Promise.resolve() in this callback is to avoid infinite rendering loop
|
|
44
|
+
// https://github.com/mobxjs/mobx/issues/3728#issuecomment-1715400931
|
|
45
|
+
return (
|
|
46
|
+
<>
|
|
47
|
+
<canvas
|
|
48
|
+
ref={async (node: HTMLCanvasElement) => {
|
|
49
|
+
await Promise.resolve()
|
|
50
|
+
setOverlayCanvas(node)
|
|
51
|
+
}}
|
|
52
|
+
width={lgv.dynamicBlocks.totalWidthPx}
|
|
53
|
+
height={featuresHeight}
|
|
54
|
+
onMouseMove={(...args) => {
|
|
55
|
+
const [event] = args
|
|
56
|
+
setMouseCoord([event.clientX, event.clientY])
|
|
57
|
+
onMouseMove(...args)
|
|
58
|
+
}}
|
|
59
|
+
onMouseLeave={(...args) => {
|
|
60
|
+
setMouseCoord(undefined)
|
|
61
|
+
onMouseLeave(...args)
|
|
62
|
+
}}
|
|
63
|
+
onMouseDown={onMouseDown}
|
|
64
|
+
onMouseUp={onMouseUp}
|
|
65
|
+
className={classes.canvas}
|
|
66
|
+
style={{ cursor: cursor ?? 'default' }}
|
|
67
|
+
data-testid="overlayCanvas"
|
|
68
|
+
/>
|
|
69
|
+
<LinearApolloDisplayTooltip
|
|
70
|
+
mouseCooordinate={mouseCoord}
|
|
71
|
+
session={session}
|
|
72
|
+
dragging={Boolean(apolloDragging)}
|
|
73
|
+
/>
|
|
74
|
+
</>
|
|
75
|
+
)
|
|
76
|
+
})
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { BaseTooltip } from '@jbrowse/core/ui'
|
|
2
|
+
import { observer } from 'mobx-react'
|
|
3
|
+
import React from 'react'
|
|
4
|
+
|
|
5
|
+
import type { ApolloSessionModel } from '../../session'
|
|
6
|
+
import type { Coord } from '../../util/displayUtils'
|
|
7
|
+
|
|
8
|
+
interface LinearApolloDisplayProps {
|
|
9
|
+
mouseCooordinate: Coord | undefined
|
|
10
|
+
session: ApolloSessionModel
|
|
11
|
+
dragging: boolean
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const Tooltip = observer(function Tooltip(
|
|
15
|
+
props: LinearApolloDisplayProps,
|
|
16
|
+
) {
|
|
17
|
+
const { mouseCooordinate, session, dragging } = props
|
|
18
|
+
const { apolloHoveredFeature } = session
|
|
19
|
+
|
|
20
|
+
if (!(mouseCooordinate && apolloHoveredFeature) || dragging) {
|
|
21
|
+
return
|
|
22
|
+
}
|
|
23
|
+
const [x, y] = mouseCooordinate
|
|
24
|
+
const { feature } = apolloHoveredFeature
|
|
25
|
+
const { attributes, min, max } = feature
|
|
26
|
+
const location = `Loc: ${min + 1}..${max}`
|
|
27
|
+
const featureType = `Type: ${feature.type}`
|
|
28
|
+
const featureName = attributes.get('gff_name')?.find((name) => name !== '')
|
|
29
|
+
return (
|
|
30
|
+
<BaseTooltip clientPoint={{ x, y }} placement="top-start">
|
|
31
|
+
{featureType}
|
|
32
|
+
<br />
|
|
33
|
+
{featureName ? (
|
|
34
|
+
<>
|
|
35
|
+
{featureName}
|
|
36
|
+
<br />
|
|
37
|
+
</>
|
|
38
|
+
) : null}
|
|
39
|
+
{location}
|
|
40
|
+
</BaseTooltip>
|
|
41
|
+
)
|
|
42
|
+
})
|