@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.
Files changed (192) hide show
  1. package/dist/ApolloRefNameAliasAdapter/ApolloRefNameAliasAdapter.d.ts +1 -1
  2. package/dist/ApolloRefNameAliasAdapter/ApolloRefNameAliasAdapter.d.ts.map +1 -1
  3. package/dist/BackendDrivers/BackendDriver.d.ts +29 -4
  4. package/dist/BackendDrivers/BackendDriver.d.ts.map +1 -1
  5. package/dist/BackendDrivers/CollaborationServerDriver.d.ts +3 -1
  6. package/dist/BackendDrivers/CollaborationServerDriver.d.ts.map +1 -1
  7. package/dist/BackendDrivers/LocalDriver/LocalDriver.d.ts +22 -0
  8. package/dist/BackendDrivers/LocalDriver/LocalDriver.d.ts.map +1 -0
  9. package/dist/BackendDrivers/LocalDriver/db.d.ts +4 -0
  10. package/dist/BackendDrivers/LocalDriver/db.d.ts.map +1 -0
  11. package/dist/BackendDrivers/index.d.ts +1 -2
  12. package/dist/BackendDrivers/index.d.ts.map +1 -1
  13. package/dist/ChangeManager.d.ts +3 -3
  14. package/dist/ChangeManager.d.ts.map +1 -1
  15. package/dist/FeatureDetailsWidget/ApolloTranscriptDetailsWidget.d.ts +0 -6
  16. package/dist/FeatureDetailsWidget/ApolloTranscriptDetailsWidget.d.ts.map +1 -1
  17. package/dist/FeatureDetailsWidget/TranscriptWidgetEditLocation.d.ts.map +1 -1
  18. package/dist/FeatureDetailsWidget/model.d.ts +0 -2
  19. package/dist/FeatureDetailsWidget/model.d.ts.map +1 -1
  20. package/dist/LinearApolloDisplay/components/CheckResultWarnings.d.ts.map +1 -1
  21. package/dist/LinearApolloDisplay/components/LinearApolloDisplay.d.ts.map +1 -1
  22. package/dist/LinearApolloDisplay/components/OverlayCanvas.d.ts +7 -0
  23. package/dist/LinearApolloDisplay/components/OverlayCanvas.d.ts.map +1 -0
  24. package/dist/LinearApolloDisplay/components/Tooltip.d.ts +10 -0
  25. package/dist/LinearApolloDisplay/components/Tooltip.d.ts.map +1 -0
  26. package/dist/LinearApolloDisplay/glyphs/BoxGlyph.d.ts +0 -1
  27. package/dist/LinearApolloDisplay/glyphs/BoxGlyph.d.ts.map +1 -1
  28. package/dist/LinearApolloDisplay/glyphs/CDSGlyph.d.ts +3 -0
  29. package/dist/LinearApolloDisplay/glyphs/CDSGlyph.d.ts.map +1 -0
  30. package/dist/LinearApolloDisplay/glyphs/ExonGlyph.d.ts +3 -0
  31. package/dist/LinearApolloDisplay/glyphs/ExonGlyph.d.ts.map +1 -0
  32. package/dist/LinearApolloDisplay/glyphs/GeneGlyph.d.ts.map +1 -1
  33. package/dist/LinearApolloDisplay/glyphs/GenericChildGlyph.d.ts.map +1 -1
  34. package/dist/LinearApolloDisplay/glyphs/Glyph.d.ts +26 -20
  35. package/dist/LinearApolloDisplay/glyphs/Glyph.d.ts.map +1 -1
  36. package/dist/LinearApolloDisplay/glyphs/TranscriptGlyph.d.ts +3 -0
  37. package/dist/LinearApolloDisplay/glyphs/TranscriptGlyph.d.ts.map +1 -0
  38. package/dist/LinearApolloDisplay/glyphs/util.d.ts +13 -0
  39. package/dist/LinearApolloDisplay/glyphs/util.d.ts.map +1 -1
  40. package/dist/LinearApolloDisplay/stateModel/base.d.ts +17 -0
  41. package/dist/LinearApolloDisplay/stateModel/base.d.ts.map +1 -1
  42. package/dist/LinearApolloDisplay/stateModel/index.d.ts +35 -17
  43. package/dist/LinearApolloDisplay/stateModel/index.d.ts.map +1 -1
  44. package/dist/LinearApolloDisplay/stateModel/layouts.d.ts +29 -7
  45. package/dist/LinearApolloDisplay/stateModel/layouts.d.ts.map +1 -1
  46. package/dist/LinearApolloDisplay/stateModel/mouseEvents.d.ts +69 -23
  47. package/dist/LinearApolloDisplay/stateModel/mouseEvents.d.ts.map +1 -1
  48. package/dist/LinearApolloDisplay/stateModel/rendering.d.ts +26 -9
  49. package/dist/LinearApolloDisplay/stateModel/rendering.d.ts.map +1 -1
  50. package/dist/LinearApolloReferenceSequenceDisplay/stateModel/base.d.ts +6 -0
  51. package/dist/LinearApolloReferenceSequenceDisplay/stateModel/base.d.ts.map +1 -1
  52. package/dist/LinearApolloReferenceSequenceDisplay/stateModel/index.d.ts +6 -0
  53. package/dist/LinearApolloReferenceSequenceDisplay/stateModel/index.d.ts.map +1 -1
  54. package/dist/LinearApolloReferenceSequenceDisplay/stateModel/rendering.d.ts +6 -0
  55. package/dist/LinearApolloReferenceSequenceDisplay/stateModel/rendering.d.ts.map +1 -1
  56. package/dist/LinearApolloSixFrameDisplay/components/LinearApolloSixFrameDisplay.d.ts.map +1 -1
  57. package/dist/LinearApolloSixFrameDisplay/glyphs/GeneGlyph.d.ts.map +1 -1
  58. package/dist/LinearApolloSixFrameDisplay/glyphs/Glyph.d.ts +1 -1
  59. package/dist/LinearApolloSixFrameDisplay/glyphs/Glyph.d.ts.map +1 -1
  60. package/dist/LinearApolloSixFrameDisplay/stateModel/layouts.d.ts.map +1 -1
  61. package/dist/LinearApolloSixFrameDisplay/stateModel/rendering.d.ts.map +1 -1
  62. package/dist/OntologyManager/OntologyStore/fulltext.d.ts +1 -1
  63. package/dist/OntologyManager/OntologyStore/fulltext.d.ts.map +1 -1
  64. package/dist/OntologyManager/OntologyStore/index.d.ts +2 -2
  65. package/dist/OntologyManager/OntologyStore/index.d.ts.map +1 -1
  66. package/dist/OntologyManager/OntologyStore/indexeddb-storage.d.ts +1 -1
  67. package/dist/OntologyManager/OntologyStore/indexeddb-storage.d.ts.map +1 -1
  68. package/dist/OntologyManager/OntologyStore/types.d.ts +18 -0
  69. package/dist/OntologyManager/OntologyStore/types.d.ts.map +1 -0
  70. package/dist/TabularEditor/HybridGrid/featureContextMenuItems.d.ts.map +1 -1
  71. package/dist/components/AddChildFeature.d.ts.map +1 -1
  72. package/dist/components/ColorFeature.d.ts +13 -0
  73. package/dist/components/ColorFeature.d.ts.map +1 -0
  74. package/dist/components/CreateApolloAnnotation.d.ts.map +1 -1
  75. package/dist/components/DownloadGFF3.d.ts +4 -1
  76. package/dist/components/DownloadGFF3.d.ts.map +1 -1
  77. package/dist/components/DuplicateTranscript.d.ts.map +1 -1
  78. package/dist/components/ViewChangeLog.d.ts +2 -1
  79. package/dist/components/ViewChangeLog.d.ts.map +1 -1
  80. package/dist/components/ViewCheckResults.d.ts +2 -1
  81. package/dist/components/ViewCheckResults.d.ts.map +1 -1
  82. package/dist/components/index.d.ts +1 -1
  83. package/dist/components/index.d.ts.map +1 -1
  84. package/dist/config.d.ts +4 -0
  85. package/dist/config.d.ts.map +1 -0
  86. package/dist/extensions/annotationFromJBrowseFeature.d.ts.map +1 -1
  87. package/dist/extensions/annotationFromPileup.d.ts.map +1 -1
  88. package/dist/index.d.ts +11 -0
  89. package/dist/index.d.ts.map +1 -0
  90. package/dist/index.esm.js +6325 -5997
  91. package/dist/index.esm.js.map +1 -1
  92. package/dist/jbrowse-plugin-apollo.cjs.development.js +5869 -5541
  93. package/dist/jbrowse-plugin-apollo.cjs.development.js.map +1 -1
  94. package/dist/jbrowse-plugin-apollo.cjs.production.min.js +1 -1
  95. package/dist/jbrowse-plugin-apollo.cjs.production.min.js.map +1 -1
  96. package/dist/jbrowse-plugin-apollo.umd.development.js +16782 -25897
  97. package/dist/jbrowse-plugin-apollo.umd.development.js.map +1 -1
  98. package/dist/jbrowse-plugin-apollo.umd.production.min.js +1 -1
  99. package/dist/jbrowse-plugin-apollo.umd.production.min.js.map +1 -1
  100. package/dist/makeDisplayComponent.d.ts.map +1 -1
  101. package/dist/menus/Icons.d.ts +3 -0
  102. package/dist/menus/Icons.d.ts.map +1 -0
  103. package/dist/menus/topLevelMenu.d.ts.map +1 -1
  104. package/dist/session/changeHandlers.d.ts +9 -0
  105. package/dist/session/changeHandlers.d.ts.map +1 -0
  106. package/dist/util/annotationFeatureUtils.d.ts +2 -1
  107. package/dist/util/annotationFeatureUtils.d.ts.map +1 -1
  108. package/dist/util/glyphUtils.d.ts +3 -3
  109. package/dist/util/glyphUtils.d.ts.map +1 -1
  110. package/dist/util/index.d.ts +0 -1
  111. package/dist/util/index.d.ts.map +1 -1
  112. package/package.json +4 -4
  113. package/src/ApolloInternetAccount/model.ts +68 -4
  114. package/src/ApolloRefNameAliasAdapter/ApolloRefNameAliasAdapter.ts +6 -3
  115. package/src/ApolloTextSearchAdapter/ApolloTextSearchAdapter.ts +1 -1
  116. package/src/BackendDrivers/BackendDriver.ts +36 -3
  117. package/src/BackendDrivers/CollaborationServerDriver.ts +78 -23
  118. package/src/BackendDrivers/LocalDriver/LocalDriver.ts +367 -0
  119. package/src/BackendDrivers/LocalDriver/db.ts +37 -0
  120. package/src/BackendDrivers/index.ts +1 -2
  121. package/src/ChangeManager.ts +27 -25
  122. package/src/FeatureDetailsWidget/ApolloTranscriptDetailsWidget.tsx +1 -1
  123. package/src/FeatureDetailsWidget/TranscriptWidgetEditLocation.tsx +69 -53
  124. package/src/LinearApolloDisplay/components/CheckResultWarnings.tsx +1 -5
  125. package/src/LinearApolloDisplay/components/LinearApolloDisplay.tsx +95 -115
  126. package/src/LinearApolloDisplay/components/OverlayCanvas.tsx +76 -0
  127. package/src/LinearApolloDisplay/components/Tooltip.tsx +42 -0
  128. package/src/LinearApolloDisplay/glyphs/BoxGlyph.ts +60 -302
  129. package/src/LinearApolloDisplay/glyphs/CDSGlyph.ts +145 -0
  130. package/src/LinearApolloDisplay/glyphs/ExonGlyph.ts +212 -0
  131. package/src/LinearApolloDisplay/glyphs/GeneGlyph.ts +65 -999
  132. package/src/LinearApolloDisplay/glyphs/GenericChildGlyph.ts +71 -181
  133. package/src/LinearApolloDisplay/glyphs/Glyph.ts +42 -66
  134. package/src/LinearApolloDisplay/glyphs/TranscriptGlyph.ts +291 -0
  135. package/src/LinearApolloDisplay/glyphs/util.ts +87 -0
  136. package/src/LinearApolloDisplay/stateModel/base.ts +83 -0
  137. package/src/LinearApolloDisplay/stateModel/layouts.ts +198 -138
  138. package/src/LinearApolloDisplay/stateModel/mouseEvents.ts +252 -158
  139. package/src/LinearApolloDisplay/stateModel/rendering.ts +103 -21
  140. package/src/LinearApolloReferenceSequenceDisplay/drawSequenceOverlay.ts +3 -3
  141. package/src/LinearApolloReferenceSequenceDisplay/stateModel/base.ts +20 -2
  142. package/src/LinearApolloSixFrameDisplay/components/LinearApolloSixFrameDisplay.tsx +7 -2
  143. package/src/LinearApolloSixFrameDisplay/glyphs/GeneGlyph.ts +8 -13
  144. package/src/LinearApolloSixFrameDisplay/glyphs/Glyph.ts +1 -1
  145. package/src/LinearApolloSixFrameDisplay/stateModel/layouts.ts +4 -3
  146. package/src/LinearApolloSixFrameDisplay/stateModel/mouseEvents.ts +1 -1
  147. package/src/LinearApolloSixFrameDisplay/stateModel/rendering.ts +2 -1
  148. package/src/OntologyManager/OntologyStore/__snapshots__/index.test.ts.snap +18262 -8519
  149. package/src/OntologyManager/OntologyStore/fulltext.ts +1 -2
  150. package/src/OntologyManager/OntologyStore/index.test.ts +5 -2
  151. package/src/OntologyManager/OntologyStore/index.ts +7 -8
  152. package/src/OntologyManager/OntologyStore/indexeddb-storage.ts +2 -2
  153. package/src/OntologyManager/OntologyStore/types.ts +27 -0
  154. package/src/OntologyManager/index.ts +15 -26
  155. package/src/TabularEditor/HybridGrid/featureContextMenuItems.ts +4 -5
  156. package/src/components/AddChildFeature.tsx +15 -8
  157. package/src/components/ColorFeature.tsx +167 -0
  158. package/src/components/CreateApolloAnnotation.tsx +35 -9
  159. package/src/components/DownloadGFF3.tsx +92 -121
  160. package/src/components/DuplicateTranscript.tsx +10 -0
  161. package/src/components/ViewChangeLog.tsx +123 -83
  162. package/src/components/ViewCheckResults.tsx +15 -73
  163. package/src/components/index.ts +1 -1
  164. package/src/config.ts +37 -19
  165. package/src/extensions/annotationFromJBrowseFeature.test.ts +1 -1
  166. package/src/extensions/annotationFromJBrowseFeature.ts +91 -63
  167. package/src/extensions/annotationFromPileup.ts +40 -40
  168. package/src/index.ts +45 -1
  169. package/src/makeDisplayComponent.tsx +10 -3
  170. package/src/menus/Icons.tsx +49 -0
  171. package/src/menus/topLevelMenu.ts +24 -96
  172. package/src/session/ClientDataStore.ts +16 -17
  173. package/src/session/changeHandlers.ts +261 -0
  174. package/src/session/session.ts +77 -46
  175. package/src/util/annotationFeatureUtils.ts +29 -1
  176. package/src/util/glyphUtils.ts +74 -31
  177. package/src/util/index.ts +0 -1
  178. package/dist/BackendDrivers/DesktopFileDriver.d.ts +0 -160
  179. package/dist/BackendDrivers/DesktopFileDriver.d.ts.map +0 -1
  180. package/dist/BackendDrivers/InMemoryFileDriver.d.ts +0 -162
  181. package/dist/BackendDrivers/InMemoryFileDriver.d.ts.map +0 -1
  182. package/dist/LinearApolloDisplay/glyphs/index.d.ts +0 -4
  183. package/dist/LinearApolloDisplay/glyphs/index.d.ts.map +0 -1
  184. package/dist/components/OpenLocalFile.d.ts +0 -15
  185. package/dist/components/OpenLocalFile.d.ts.map +0 -1
  186. package/dist/util/loadAssemblyIntoClient.d.ts +0 -5
  187. package/dist/util/loadAssemblyIntoClient.d.ts.map +0 -1
  188. package/src/BackendDrivers/DesktopFileDriver.ts +0 -184
  189. package/src/BackendDrivers/InMemoryFileDriver.ts +0 -107
  190. package/src/LinearApolloDisplay/glyphs/index.ts +0 -3
  191. package/src/components/OpenLocalFile.tsx +0 -189
  192. 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
- let row = 0
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
- cursor,
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
- <div
61
- className={classes.canvasContainer}
62
- style={{
63
- width: lgv.dynamicBlocks.totalWidthPx,
64
- height: featuresHeight,
65
- }}
66
- onContextMenu={(event) => {
67
- event.preventDefault()
68
- if (contextMenuItems.length > 0) {
69
- // There's already a context menu open, so close it
70
- setContextMenuItems([])
71
- } else {
72
- const coord: [number, number] = [event.clientX, event.clientY]
73
- setContextCoord(coord)
74
- setContextMenuItems(getContextMenuItems(event))
75
- }
76
- }}
77
- >
78
- {session.isLocked ? (
79
- <div className={classes.locked} data-testid="lock-icon">
80
- <LockIcon />
81
- </div>
82
- ) : null}
83
- {loading ? (
84
- <div className={classes.loading}>
85
- <CircularProgress size="18px" />
86
- </div>
87
- ) : null}
88
- {/* This type is wrong in @jbrowse/core */}
89
- {/* eslint-disable-next-line @typescript-eslint/no-unnecessary-condition */}
90
- {message ? (
91
- <Alert
92
- severity="warning"
93
- classes={{ message: classes.ellipses }}
94
- slotProps={{ root: { className: classes.center } }}
95
- >
96
- <Tooltip title={message}>
97
- <div>{message}</div>
98
- </Tooltip>
99
- </Alert>
100
- ) : (
101
- // Promise.resolve() in these 3 callbacks is to avoid infinite rendering loop
102
- // https://github.com/mobxjs/mobx/issues/3728#issuecomment-1715400931
103
- <>
104
- <canvas
105
- ref={async (node: HTMLCanvasElement) => {
106
- await Promise.resolve()
107
- setCollaboratorCanvas(node)
108
- }}
109
- width={lgv.dynamicBlocks.totalWidthPx}
110
- height={featuresHeight}
111
- className={classes.canvas}
112
- data-testid="collaboratorCanvas"
113
- />
114
- <canvas
115
- ref={async (node: HTMLCanvasElement) => {
116
- await Promise.resolve()
117
- setCanvas(node)
118
- }}
119
- width={lgv.dynamicBlocks.totalWidthPx}
120
- height={featuresHeight}
121
- className={classes.canvas}
122
- data-testid="canvas"
123
- />
124
- <canvas
125
- ref={async (node: HTMLCanvasElement) => {
126
- await Promise.resolve()
127
- setOverlayCanvas(node)
128
- }}
129
- width={lgv.dynamicBlocks.totalWidthPx}
130
- height={featuresHeight}
131
- onMouseMove={onMouseMove}
132
- onMouseLeave={onMouseLeave}
133
- onMouseDown={onMouseDown}
134
- onMouseUp={onMouseUp}
135
- className={classes.canvas}
136
- style={{ cursor: cursor ?? 'default' }}
137
- data-testid="overlayCanvas"
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
- anchorReference="anchorPosition"
157
- anchorPosition={
158
- contextCoord
159
- ? { top: contextCoord[1], left: contextCoord[0] }
160
- : undefined
161
- }
162
- menuItems={contextMenuItems}
163
- />
164
- </>
165
- )}
166
- </div>
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
+ })