@jbrowse/plugin-linear-genome-view 2.2.1 → 2.3.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 (271) hide show
  1. package/dist/BaseLinearDisplay/components/BaseLinearDisplay.d.ts +2 -1
  2. package/dist/BaseLinearDisplay/components/BaseLinearDisplay.js +4 -2
  3. package/dist/BaseLinearDisplay/components/BaseLinearDisplay.js.map +1 -1
  4. package/dist/BaseLinearDisplay/components/Block.d.ts +1 -1
  5. package/dist/BaseLinearDisplay/components/Block.js +1 -1
  6. package/dist/BaseLinearDisplay/components/Block.js.map +1 -1
  7. package/dist/BaseLinearDisplay/components/BlockMsg.js +3 -2
  8. package/dist/BaseLinearDisplay/components/BlockMsg.js.map +1 -1
  9. package/dist/BaseLinearDisplay/components/LinearBlocks.d.ts +1 -1
  10. package/dist/BaseLinearDisplay/components/LinearBlocks.js +2 -2
  11. package/dist/BaseLinearDisplay/components/LinearBlocks.js.map +1 -1
  12. package/dist/BaseLinearDisplay/{models → components}/TooLargeMessage.d.ts +0 -0
  13. package/dist/BaseLinearDisplay/{models → components}/TooLargeMessage.js +0 -0
  14. package/dist/BaseLinearDisplay/components/TooLargeMessage.js.map +1 -0
  15. package/dist/BaseLinearDisplay/index.d.ts +2 -2
  16. package/dist/BaseLinearDisplay/index.js +4 -3
  17. package/dist/BaseLinearDisplay/index.js.map +1 -1
  18. package/dist/BaseLinearDisplay/models/BaseLinearDisplayModel.d.ts +6 -14
  19. package/dist/BaseLinearDisplay/models/BaseLinearDisplayModel.js +3 -5
  20. package/dist/BaseLinearDisplay/models/BaseLinearDisplayModel.js.map +1 -1
  21. package/dist/BaseLinearDisplay/models/configSchema.d.ts +2 -0
  22. package/dist/BaseLinearDisplay/models/{baseLinearDisplayConfigSchema.js → configSchema.js} +5 -5
  23. package/dist/BaseLinearDisplay/models/configSchema.js.map +1 -0
  24. package/dist/BaseLinearDisplay/models/serverSideRenderedBlock.js +1 -1
  25. package/dist/BaseLinearDisplay/models/serverSideRenderedBlock.js.map +1 -1
  26. package/dist/BaseLinearDisplay/models/util.d.ts +18 -0
  27. package/dist/BaseLinearDisplay/models/util.js +18 -0
  28. package/dist/BaseLinearDisplay/models/util.js.map +1 -0
  29. package/dist/FeatureTrack/index.d.ts +1 -1
  30. package/dist/FeatureTrack/index.js +5 -4
  31. package/dist/FeatureTrack/index.js.map +1 -1
  32. package/dist/LaunchLinearGenomeView/index.d.ts +3 -0
  33. package/dist/LaunchLinearGenomeView/index.js +44 -0
  34. package/dist/LaunchLinearGenomeView/index.js.map +1 -0
  35. package/dist/LinearBareDisplay/index.d.ts +6 -2
  36. package/dist/LinearBareDisplay/index.js +18 -2
  37. package/dist/LinearBareDisplay/index.js.map +1 -1
  38. package/dist/LinearBareDisplay/model.d.ts +1 -1
  39. package/dist/LinearBasicDisplay/components/SetMaxHeight.js +2 -15
  40. package/dist/LinearBasicDisplay/components/SetMaxHeight.js.map +1 -1
  41. package/dist/LinearBasicDisplay/index.d.ts +6 -2
  42. package/dist/LinearBasicDisplay/index.js +21 -4
  43. package/dist/LinearBasicDisplay/index.js.map +1 -1
  44. package/dist/LinearBasicDisplay/model.d.ts +17 -13
  45. package/dist/LinearBasicDisplay/model.js +2 -1
  46. package/dist/LinearBasicDisplay/model.js.map +1 -1
  47. package/dist/LinearGenomeView/components/ExportSvgDialog.js +1 -19
  48. package/dist/LinearGenomeView/components/ExportSvgDialog.js.map +1 -1
  49. package/dist/LinearGenomeView/components/GetSequenceDialog.js +7 -18
  50. package/dist/LinearGenomeView/components/GetSequenceDialog.js.map +1 -1
  51. package/dist/LinearGenomeView/components/Header.js +2 -2
  52. package/dist/LinearGenomeView/components/HelpDialog.js +2 -17
  53. package/dist/LinearGenomeView/components/HelpDialog.js.map +1 -1
  54. package/dist/LinearGenomeView/components/ImportForm.js +15 -10
  55. package/dist/LinearGenomeView/components/ImportForm.js.map +1 -1
  56. package/dist/LinearGenomeView/components/LinearGenomeViewSvg.js +6 -7
  57. package/dist/LinearGenomeView/components/LinearGenomeViewSvg.js.map +1 -1
  58. package/{esm/LinearGenomeView/components/OverviewRubberBand.d.ts → dist/LinearGenomeView/components/OverviewRubberband.d.ts} +2 -2
  59. package/dist/LinearGenomeView/components/{OverviewRubberBand.js → OverviewRubberband.js} +27 -79
  60. package/dist/LinearGenomeView/components/OverviewRubberband.js.map +1 -0
  61. package/dist/LinearGenomeView/components/{OverviewScaleBar.d.ts → OverviewScalebar.d.ts} +2 -2
  62. package/dist/LinearGenomeView/components/{OverviewScaleBar.js → OverviewScalebar.js} +25 -24
  63. package/dist/LinearGenomeView/components/OverviewScalebar.js.map +1 -0
  64. package/dist/LinearGenomeView/components/RefNameAutocomplete.js +1 -1
  65. package/dist/LinearGenomeView/components/RefNameAutocomplete.js.map +1 -1
  66. package/dist/LinearGenomeView/components/{RubberBand.d.ts → Rubberband.d.ts} +2 -2
  67. package/dist/LinearGenomeView/components/Rubberband.js +57 -0
  68. package/dist/LinearGenomeView/components/Rubberband.js.map +1 -0
  69. package/dist/LinearGenomeView/components/RubberbandSpan.d.ts +14 -0
  70. package/dist/LinearGenomeView/components/RubberbandSpan.js +90 -0
  71. package/dist/LinearGenomeView/components/RubberbandSpan.js.map +1 -0
  72. package/dist/LinearGenomeView/components/Ruler.d.ts +2 -18
  73. package/dist/LinearGenomeView/components/Ruler.js +9 -25
  74. package/dist/LinearGenomeView/components/Ruler.js.map +1 -1
  75. package/dist/LinearGenomeView/components/{ScaleBar.d.ts → Scalebar.d.ts} +2 -2
  76. package/dist/LinearGenomeView/components/{ScaleBar.js → Scalebar.js} +11 -11
  77. package/dist/LinearGenomeView/components/{ScaleBar.js.map → Scalebar.js.map} +1 -1
  78. package/dist/LinearGenomeView/components/SearchBox.js +10 -6
  79. package/dist/LinearGenomeView/components/SearchBox.js.map +1 -1
  80. package/dist/LinearGenomeView/components/SearchResultsDialog.js +17 -31
  81. package/dist/LinearGenomeView/components/SearchResultsDialog.js.map +1 -1
  82. package/dist/LinearGenomeView/components/SequenceSearchDialog.js +4 -19
  83. package/dist/LinearGenomeView/components/SequenceSearchDialog.js.map +1 -1
  84. package/dist/LinearGenomeView/components/TrackContainer.js +2 -2
  85. package/dist/LinearGenomeView/components/TrackContainer.js.map +1 -1
  86. package/dist/LinearGenomeView/components/TracksContainer.js +21 -118
  87. package/dist/LinearGenomeView/components/TracksContainer.js.map +1 -1
  88. package/dist/LinearGenomeView/components/VerticalGuide.d.ts +9 -0
  89. package/dist/LinearGenomeView/components/VerticalGuide.js +29 -0
  90. package/dist/LinearGenomeView/components/VerticalGuide.js.map +1 -0
  91. package/dist/LinearGenomeView/components/hooks.d.ts +65 -0
  92. package/dist/LinearGenomeView/components/hooks.js +264 -0
  93. package/dist/LinearGenomeView/components/hooks.js.map +1 -0
  94. package/dist/LinearGenomeView/components/util.d.ts +5 -2
  95. package/dist/LinearGenomeView/components/util.js +7 -6
  96. package/dist/LinearGenomeView/components/util.js.map +1 -1
  97. package/dist/LinearGenomeView/index.d.ts +3 -534
  98. package/dist/LinearGenomeView/index.js +12 -1327
  99. package/dist/LinearGenomeView/index.js.map +1 -1
  100. package/dist/LinearGenomeView/model.d.ts +535 -0
  101. package/dist/LinearGenomeView/model.js +1357 -0
  102. package/dist/LinearGenomeView/model.js.map +1 -0
  103. package/dist/index.d.ts +6 -6
  104. package/dist/index.js +12 -73
  105. package/dist/index.js.map +1 -1
  106. package/esm/BaseLinearDisplay/components/BaseLinearDisplay.d.ts +2 -1
  107. package/esm/BaseLinearDisplay/components/BaseLinearDisplay.js +3 -2
  108. package/esm/BaseLinearDisplay/components/BaseLinearDisplay.js.map +1 -1
  109. package/esm/BaseLinearDisplay/components/Block.d.ts +1 -1
  110. package/esm/BaseLinearDisplay/components/Block.js +1 -1
  111. package/esm/BaseLinearDisplay/components/Block.js.map +1 -1
  112. package/esm/BaseLinearDisplay/components/BlockMsg.js +3 -2
  113. package/esm/BaseLinearDisplay/components/BlockMsg.js.map +1 -1
  114. package/esm/BaseLinearDisplay/components/LinearBlocks.d.ts +1 -1
  115. package/esm/BaseLinearDisplay/components/LinearBlocks.js +2 -2
  116. package/esm/BaseLinearDisplay/components/LinearBlocks.js.map +1 -1
  117. package/esm/BaseLinearDisplay/{models → components}/TooLargeMessage.d.ts +0 -0
  118. package/esm/BaseLinearDisplay/{models → components}/TooLargeMessage.js +0 -0
  119. package/esm/BaseLinearDisplay/components/TooLargeMessage.js.map +1 -0
  120. package/esm/BaseLinearDisplay/index.d.ts +2 -2
  121. package/esm/BaseLinearDisplay/index.js +2 -2
  122. package/esm/BaseLinearDisplay/index.js.map +1 -1
  123. package/esm/BaseLinearDisplay/models/BaseLinearDisplayModel.d.ts +6 -14
  124. package/esm/BaseLinearDisplay/models/BaseLinearDisplayModel.js +3 -5
  125. package/esm/BaseLinearDisplay/models/BaseLinearDisplayModel.js.map +1 -1
  126. package/esm/BaseLinearDisplay/models/configSchema.d.ts +2 -0
  127. package/esm/BaseLinearDisplay/models/{baseLinearDisplayConfigSchema.js → configSchema.js} +5 -4
  128. package/esm/BaseLinearDisplay/models/configSchema.js.map +1 -0
  129. package/esm/BaseLinearDisplay/models/serverSideRenderedBlock.js +1 -1
  130. package/esm/BaseLinearDisplay/models/serverSideRenderedBlock.js.map +1 -1
  131. package/esm/BaseLinearDisplay/models/util.d.ts +18 -0
  132. package/esm/BaseLinearDisplay/models/util.js +14 -0
  133. package/esm/BaseLinearDisplay/models/util.js.map +1 -0
  134. package/esm/FeatureTrack/index.d.ts +1 -1
  135. package/esm/FeatureTrack/index.js +5 -4
  136. package/esm/FeatureTrack/index.js.map +1 -1
  137. package/esm/LaunchLinearGenomeView/index.d.ts +3 -0
  138. package/esm/LaunchLinearGenomeView/index.js +42 -0
  139. package/esm/LaunchLinearGenomeView/index.js.map +1 -0
  140. package/esm/LinearBareDisplay/index.d.ts +6 -2
  141. package/esm/LinearBareDisplay/index.js +19 -2
  142. package/esm/LinearBareDisplay/index.js.map +1 -1
  143. package/esm/LinearBareDisplay/model.d.ts +1 -1
  144. package/esm/LinearBasicDisplay/components/SetMaxHeight.js +3 -13
  145. package/esm/LinearBasicDisplay/components/SetMaxHeight.js.map +1 -1
  146. package/esm/LinearBasicDisplay/index.d.ts +6 -2
  147. package/esm/LinearBasicDisplay/index.js +20 -2
  148. package/esm/LinearBasicDisplay/index.js.map +1 -1
  149. package/esm/LinearBasicDisplay/model.d.ts +17 -13
  150. package/esm/LinearBasicDisplay/model.js +2 -1
  151. package/esm/LinearBasicDisplay/model.js.map +1 -1
  152. package/esm/LinearGenomeView/components/ExportSvgDialog.js +3 -18
  153. package/esm/LinearGenomeView/components/ExportSvgDialog.js.map +1 -1
  154. package/esm/LinearGenomeView/components/GetSequenceDialog.js +8 -19
  155. package/esm/LinearGenomeView/components/GetSequenceDialog.js.map +1 -1
  156. package/esm/LinearGenomeView/components/Header.js +2 -2
  157. package/esm/LinearGenomeView/components/HelpDialog.js +3 -18
  158. package/esm/LinearGenomeView/components/HelpDialog.js.map +1 -1
  159. package/esm/LinearGenomeView/components/ImportForm.js +15 -10
  160. package/esm/LinearGenomeView/components/ImportForm.js.map +1 -1
  161. package/esm/LinearGenomeView/components/LinearGenomeViewSvg.js +4 -5
  162. package/esm/LinearGenomeView/components/LinearGenomeViewSvg.js.map +1 -1
  163. package/{dist/LinearGenomeView/components/OverviewRubberBand.d.ts → esm/LinearGenomeView/components/OverviewRubberband.d.ts} +2 -2
  164. package/esm/LinearGenomeView/components/{OverviewRubberBand.js → OverviewRubberband.js} +25 -80
  165. package/esm/LinearGenomeView/components/OverviewRubberband.js.map +1 -0
  166. package/esm/LinearGenomeView/components/{OverviewScaleBar.d.ts → OverviewScalebar.d.ts} +2 -2
  167. package/esm/LinearGenomeView/components/{OverviewScaleBar.js → OverviewScalebar.js} +25 -24
  168. package/esm/LinearGenomeView/components/OverviewScalebar.js.map +1 -0
  169. package/esm/LinearGenomeView/components/RefNameAutocomplete.js +1 -1
  170. package/esm/LinearGenomeView/components/RefNameAutocomplete.js.map +1 -1
  171. package/esm/LinearGenomeView/components/{RubberBand.d.ts → Rubberband.d.ts} +2 -2
  172. package/esm/LinearGenomeView/components/Rubberband.js +29 -0
  173. package/esm/LinearGenomeView/components/Rubberband.js.map +1 -0
  174. package/esm/LinearGenomeView/components/RubberbandSpan.d.ts +14 -0
  175. package/esm/LinearGenomeView/components/RubberbandSpan.js +65 -0
  176. package/esm/LinearGenomeView/components/RubberbandSpan.js.map +1 -0
  177. package/esm/LinearGenomeView/components/Ruler.d.ts +2 -18
  178. package/esm/LinearGenomeView/components/Ruler.js +6 -22
  179. package/esm/LinearGenomeView/components/Ruler.js.map +1 -1
  180. package/esm/LinearGenomeView/components/{ScaleBar.d.ts → Scalebar.d.ts} +2 -2
  181. package/esm/LinearGenomeView/components/{ScaleBar.js → Scalebar.js} +11 -11
  182. package/esm/LinearGenomeView/components/{ScaleBar.js.map → Scalebar.js.map} +1 -1
  183. package/esm/LinearGenomeView/components/SearchBox.js +10 -6
  184. package/esm/LinearGenomeView/components/SearchBox.js.map +1 -1
  185. package/esm/LinearGenomeView/components/SearchResultsDialog.js +18 -32
  186. package/esm/LinearGenomeView/components/SearchResultsDialog.js.map +1 -1
  187. package/esm/LinearGenomeView/components/SequenceSearchDialog.js +5 -17
  188. package/esm/LinearGenomeView/components/SequenceSearchDialog.js.map +1 -1
  189. package/esm/LinearGenomeView/components/TrackContainer.js +2 -2
  190. package/esm/LinearGenomeView/components/TrackContainer.js.map +1 -1
  191. package/esm/LinearGenomeView/components/TracksContainer.js +22 -119
  192. package/esm/LinearGenomeView/components/TracksContainer.js.map +1 -1
  193. package/esm/LinearGenomeView/components/VerticalGuide.d.ts +9 -0
  194. package/esm/LinearGenomeView/components/VerticalGuide.js +24 -0
  195. package/esm/LinearGenomeView/components/VerticalGuide.js.map +1 -0
  196. package/esm/LinearGenomeView/components/hooks.d.ts +65 -0
  197. package/esm/LinearGenomeView/components/hooks.js +255 -0
  198. package/esm/LinearGenomeView/components/hooks.js.map +1 -0
  199. package/esm/LinearGenomeView/components/util.d.ts +5 -2
  200. package/esm/LinearGenomeView/components/util.js +4 -3
  201. package/esm/LinearGenomeView/components/util.js.map +1 -1
  202. package/esm/LinearGenomeView/index.d.ts +3 -534
  203. package/esm/LinearGenomeView/index.js +10 -1318
  204. package/esm/LinearGenomeView/index.js.map +1 -1
  205. package/esm/LinearGenomeView/model.d.ts +535 -0
  206. package/esm/LinearGenomeView/model.js +1322 -0
  207. package/esm/LinearGenomeView/model.js.map +1 -0
  208. package/esm/index.d.ts +6 -6
  209. package/esm/index.js +12 -74
  210. package/esm/index.js.map +1 -1
  211. package/package.json +5 -6
  212. package/src/BaseLinearDisplay/components/BaseLinearDisplay.tsx +86 -84
  213. package/src/BaseLinearDisplay/components/Block.tsx +15 -11
  214. package/src/BaseLinearDisplay/components/BlockMsg.tsx +9 -9
  215. package/src/BaseLinearDisplay/components/LinearBlocks.tsx +62 -58
  216. package/src/BaseLinearDisplay/{models → components}/TooLargeMessage.tsx +0 -0
  217. package/src/BaseLinearDisplay/index.ts +2 -1
  218. package/src/BaseLinearDisplay/models/BaseLinearDisplayModel.tsx +4 -3
  219. package/src/BaseLinearDisplay/models/{baseLinearDisplayConfigSchema.ts → configSchema.ts} +5 -3
  220. package/src/BaseLinearDisplay/models/serverSideRenderedBlock.ts +1 -1
  221. package/src/BaseLinearDisplay/models/util.ts +24 -0
  222. package/src/FeatureTrack/index.ts +5 -8
  223. package/src/LaunchLinearGenomeView/index.ts +66 -0
  224. package/src/LinearBareDisplay/index.ts +23 -2
  225. package/src/LinearBasicDisplay/components/SetMaxHeight.tsx +3 -28
  226. package/src/LinearBasicDisplay/index.ts +24 -2
  227. package/src/LinearBasicDisplay/model.ts +2 -1
  228. package/src/LinearGenomeView/README.md +2 -1
  229. package/src/LinearGenomeView/components/ExportSvgDialog.tsx +2 -23
  230. package/src/LinearGenomeView/components/GetSequenceDialog.tsx +13 -31
  231. package/src/LinearGenomeView/components/Header.tsx +3 -3
  232. package/src/LinearGenomeView/components/HelpDialog.tsx +8 -34
  233. package/src/LinearGenomeView/components/ImportForm.tsx +13 -9
  234. package/src/LinearGenomeView/components/LinearGenomeView.test.tsx +132 -134
  235. package/src/LinearGenomeView/components/LinearGenomeViewSvg.tsx +4 -5
  236. package/src/LinearGenomeView/components/{OverviewRubberBand.tsx → OverviewRubberband.tsx} +32 -114
  237. package/src/LinearGenomeView/components/{OverviewScaleBar.tsx → OverviewScalebar.tsx} +26 -25
  238. package/src/LinearGenomeView/components/RefNameAutocomplete.tsx +2 -1
  239. package/src/LinearGenomeView/components/Rubberband.tsx +89 -0
  240. package/src/LinearGenomeView/components/RubberbandSpan.tsx +116 -0
  241. package/src/LinearGenomeView/components/Ruler.tsx +11 -28
  242. package/src/LinearGenomeView/components/{ScaleBar.test.tsx → Scalebar.test.tsx} +5 -5
  243. package/src/LinearGenomeView/components/{ScaleBar.tsx → Scalebar.tsx} +11 -11
  244. package/src/LinearGenomeView/components/SearchBox.tsx +8 -6
  245. package/src/LinearGenomeView/components/SearchResultsDialog.tsx +17 -44
  246. package/src/LinearGenomeView/components/SequenceSearchDialog.tsx +4 -30
  247. package/src/LinearGenomeView/components/TrackContainer.tsx +4 -2
  248. package/src/LinearGenomeView/components/TracksContainer.tsx +59 -136
  249. package/src/LinearGenomeView/components/VerticalGuide.tsx +37 -0
  250. package/src/LinearGenomeView/components/__snapshots__/LinearGenomeView.test.tsx.snap +39 -44
  251. package/src/LinearGenomeView/components/hooks.ts +300 -0
  252. package/src/LinearGenomeView/components/util.ts +8 -11
  253. package/src/LinearGenomeView/index.test.ts +6 -7
  254. package/src/LinearGenomeView/index.ts +18 -0
  255. package/src/LinearGenomeView/{index.tsx → model.ts} +7 -4
  256. package/src/index.ts +16 -108
  257. package/dist/BaseLinearDisplay/models/TooLargeMessage.js.map +0 -1
  258. package/dist/BaseLinearDisplay/models/baseLinearDisplayConfigSchema.d.ts +0 -1
  259. package/dist/BaseLinearDisplay/models/baseLinearDisplayConfigSchema.js.map +0 -1
  260. package/dist/LinearGenomeView/components/OverviewRubberBand.js.map +0 -1
  261. package/dist/LinearGenomeView/components/OverviewScaleBar.js.map +0 -1
  262. package/dist/LinearGenomeView/components/RubberBand.js +0 -221
  263. package/dist/LinearGenomeView/components/RubberBand.js.map +0 -1
  264. package/esm/BaseLinearDisplay/models/TooLargeMessage.js.map +0 -1
  265. package/esm/BaseLinearDisplay/models/baseLinearDisplayConfigSchema.d.ts +0 -1
  266. package/esm/BaseLinearDisplay/models/baseLinearDisplayConfigSchema.js.map +0 -1
  267. package/esm/LinearGenomeView/components/OverviewRubberBand.js.map +0 -1
  268. package/esm/LinearGenomeView/components/OverviewScaleBar.js.map +0 -1
  269. package/esm/LinearGenomeView/components/RubberBand.js +0 -196
  270. package/esm/LinearGenomeView/components/RubberBand.js.map +0 -1
  271. package/src/LinearGenomeView/components/RubberBand.tsx +0 -308
@@ -1,196 +0,0 @@
1
- import React, { useRef, useEffect, useState } from 'react';
2
- import { observer } from 'mobx-react';
3
- import { Popover, Tooltip, Typography, alpha } from '@mui/material';
4
- import { makeStyles } from 'tss-react/mui';
5
- import { stringify } from '@jbrowse/core/util';
6
- import { Menu } from '@jbrowse/core/ui';
7
- const useStyles = makeStyles()(theme => {
8
- const { primary, tertiary } = theme.palette;
9
- const background = tertiary
10
- ? alpha(tertiary.main, 0.7)
11
- : alpha(primary.main, 0.7);
12
- return {
13
- rubberBand: {
14
- height: '100%',
15
- background,
16
- position: 'absolute',
17
- zIndex: 10,
18
- textAlign: 'center',
19
- overflow: 'hidden',
20
- },
21
- rubberBandControl: {
22
- cursor: 'crosshair',
23
- width: '100%',
24
- minHeight: 8,
25
- },
26
- rubberBandText: {
27
- color: tertiary ? tertiary.contrastText : primary.contrastText,
28
- },
29
- popover: {
30
- mouseEvents: 'none',
31
- cursor: 'crosshair',
32
- },
33
- paper: {
34
- paddingLeft: theme.spacing(1),
35
- paddingRight: theme.spacing(1),
36
- },
37
- guide: {
38
- pointerEvents: 'none',
39
- height: '100%',
40
- width: 1,
41
- position: 'absolute',
42
- zIndex: 10,
43
- },
44
- };
45
- });
46
- const VerticalGuide = observer(({ model, coordX }) => {
47
- const { classes } = useStyles();
48
- return (React.createElement(Tooltip, { open: true, placement: "top", title: stringify(model.pxToBp(coordX)), arrow: true },
49
- React.createElement("div", { className: classes.guide, style: {
50
- left: coordX,
51
- background: 'red',
52
- } })));
53
- });
54
- function RubberBand({ model, ControlComponent = React.createElement("div", null), }) {
55
- const [startX, setStartX] = useState();
56
- const [currentX, setCurrentX] = useState();
57
- // clientX and clientY used for anchorPosition for menu
58
- // offsetX used for calculations about width of selection
59
- const [anchorPosition, setAnchorPosition] = useState();
60
- const [guideX, setGuideX] = useState();
61
- const controlsRef = useRef(null);
62
- const rubberBandRef = useRef(null);
63
- const { classes } = useStyles();
64
- const mouseDragging = startX !== undefined && anchorPosition === undefined;
65
- const { setOffsets, pxToBp } = model;
66
- useEffect(() => {
67
- function computeOffsets(offsetX) {
68
- if (startX === undefined) {
69
- return;
70
- }
71
- let leftPx = startX;
72
- let rightPx = offsetX;
73
- if (rightPx < leftPx) {
74
- ;
75
- [leftPx, rightPx] = [rightPx, leftPx];
76
- }
77
- const leftOffset = pxToBp(leftPx);
78
- const rightOffset = pxToBp(rightPx);
79
- return { leftOffset, rightOffset };
80
- }
81
- function globalMouseMove(event) {
82
- if (controlsRef.current && mouseDragging) {
83
- const relativeX = event.clientX - controlsRef.current.getBoundingClientRect().left;
84
- setCurrentX(relativeX);
85
- }
86
- }
87
- function globalMouseUp(event) {
88
- if (startX !== undefined && controlsRef.current) {
89
- const { clientX, clientY } = event;
90
- const ref = controlsRef.current;
91
- const offsetX = clientX - ref.getBoundingClientRect().left;
92
- // as stated above, store both clientX/Y and offsetX for different
93
- // purposes
94
- setAnchorPosition({
95
- offsetX,
96
- clientX,
97
- clientY,
98
- });
99
- const args = computeOffsets(offsetX);
100
- if (args) {
101
- const { leftOffset, rightOffset } = args;
102
- setOffsets(leftOffset, rightOffset);
103
- }
104
- setGuideX(undefined);
105
- }
106
- }
107
- if (mouseDragging) {
108
- window.addEventListener('mousemove', globalMouseMove);
109
- window.addEventListener('mouseup', globalMouseUp);
110
- return () => {
111
- window.removeEventListener('mousemove', globalMouseMove);
112
- window.removeEventListener('mouseup', globalMouseUp);
113
- };
114
- }
115
- return () => { };
116
- }, [startX, mouseDragging, anchorPosition, setOffsets, pxToBp]);
117
- useEffect(() => {
118
- if (!mouseDragging &&
119
- currentX !== undefined &&
120
- startX !== undefined &&
121
- Math.abs(currentX - startX) <= 3) {
122
- handleClose();
123
- }
124
- }, [mouseDragging, currentX, startX, model.bpPerPx]);
125
- function mouseDown(event) {
126
- event.preventDefault();
127
- event.stopPropagation();
128
- const relativeX = event.clientX -
129
- event.target.getBoundingClientRect().left;
130
- setStartX(relativeX);
131
- setCurrentX(relativeX);
132
- }
133
- function mouseMove(event) {
134
- const target = event.target;
135
- setGuideX(event.clientX - target.getBoundingClientRect().left);
136
- }
137
- function mouseOut() {
138
- setGuideX(undefined);
139
- model.setOffsets(undefined, undefined);
140
- }
141
- function handleClose() {
142
- setAnchorPosition(undefined);
143
- setStartX(undefined);
144
- setCurrentX(undefined);
145
- }
146
- const open = Boolean(anchorPosition);
147
- function handleMenuItemClick(_, callback) {
148
- callback();
149
- handleClose();
150
- }
151
- if (startX === undefined) {
152
- return (React.createElement(React.Fragment, null,
153
- guideX !== undefined ? (React.createElement(VerticalGuide, { model: model, coordX: guideX })) : null,
154
- React.createElement("div", { "data-testid": "rubberBand_controls", className: classes.rubberBandControl, role: "presentation", ref: controlsRef, onMouseDown: mouseDown, onMouseOut: mouseOut, onMouseMove: mouseMove }, ControlComponent)));
155
- }
156
- /* Calculating Pixels for Mouse Dragging */
157
- const right = anchorPosition ? anchorPosition.offsetX : currentX || 0;
158
- const left = right < startX ? right : startX;
159
- const width = Math.abs(right - startX);
160
- const leftBpOffset = model.pxToBp(left);
161
- const rightBpOffset = model.pxToBp(left + width);
162
- const numOfBpSelected = Math.ceil(width * model.bpPerPx);
163
- return (React.createElement(React.Fragment, null,
164
- rubberBandRef.current ? (React.createElement(React.Fragment, null,
165
- React.createElement(Popover, { className: classes.popover, classes: {
166
- paper: classes.paper,
167
- }, open: true, anchorEl: rubberBandRef.current, anchorOrigin: {
168
- vertical: 'top',
169
- horizontal: 'left',
170
- }, transformOrigin: {
171
- vertical: 'bottom',
172
- horizontal: 'right',
173
- }, keepMounted: true, disableRestoreFocus: true },
174
- React.createElement(Typography, null, stringify(leftBpOffset))),
175
- React.createElement(Popover, { className: classes.popover, classes: {
176
- paper: classes.paper,
177
- }, open: true, anchorEl: rubberBandRef.current, anchorOrigin: {
178
- vertical: 'top',
179
- horizontal: 'right',
180
- }, transformOrigin: {
181
- vertical: 'bottom',
182
- horizontal: 'left',
183
- }, keepMounted: true, disableRestoreFocus: true },
184
- React.createElement(Typography, null, stringify(rightBpOffset))))) : null,
185
- React.createElement("div", { ref: rubberBandRef, className: classes.rubberBand, style: { left, width } },
186
- React.createElement(Typography, { variant: "h6", className: classes.rubberBandText },
187
- numOfBpSelected.toLocaleString('en-US'),
188
- " bp")),
189
- React.createElement("div", { "data-testid": "rubberBand_controls", className: classes.rubberBandControl, role: "presentation", ref: controlsRef, onMouseDown: mouseDown, onMouseOut: mouseOut, onMouseMove: mouseMove }, ControlComponent),
190
- anchorPosition ? (React.createElement(Menu, { anchorReference: "anchorPosition", anchorPosition: {
191
- left: anchorPosition.clientX,
192
- top: anchorPosition.clientY,
193
- }, onMenuItemClick: handleMenuItemClick, open: open, onClose: handleClose, menuItems: model.rubberBandMenuItems() })) : null));
194
- }
195
- export default observer(RubberBand);
196
- //# sourceMappingURL=RubberBand.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RubberBand.js","sourceRoot":"","sources":["../../../src/LinearGenomeView/components/RubberBand.tsx"],"names":[],"mappings":"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"}
@@ -1,308 +0,0 @@
1
- import React, { useRef, useEffect, useState } from 'react'
2
- import { observer } from 'mobx-react'
3
- import { Popover, Tooltip, Typography, alpha } from '@mui/material'
4
- import { makeStyles } from 'tss-react/mui'
5
- import { stringify } from '@jbrowse/core/util'
6
- import { Menu } from '@jbrowse/core/ui'
7
- import { LinearGenomeViewModel } from '..'
8
-
9
- type LGV = LinearGenomeViewModel
10
-
11
- const useStyles = makeStyles()(theme => {
12
- const { primary, tertiary } = theme.palette
13
- const background = tertiary
14
- ? alpha(tertiary.main, 0.7)
15
- : alpha(primary.main, 0.7)
16
- return {
17
- rubberBand: {
18
- height: '100%',
19
- background,
20
- position: 'absolute',
21
- zIndex: 10,
22
- textAlign: 'center',
23
- overflow: 'hidden',
24
- },
25
- rubberBandControl: {
26
- cursor: 'crosshair',
27
- width: '100%',
28
- minHeight: 8,
29
- },
30
- rubberBandText: {
31
- color: tertiary ? tertiary.contrastText : primary.contrastText,
32
- },
33
- popover: {
34
- mouseEvents: 'none',
35
- cursor: 'crosshair',
36
- },
37
- paper: {
38
- paddingLeft: theme.spacing(1),
39
- paddingRight: theme.spacing(1),
40
- },
41
- guide: {
42
- pointerEvents: 'none',
43
- height: '100%',
44
- width: 1,
45
- position: 'absolute',
46
- zIndex: 10,
47
- },
48
- }
49
- })
50
-
51
- const VerticalGuide = observer(
52
- ({ model, coordX }: { model: LGV; coordX: number }) => {
53
- const { classes } = useStyles()
54
- return (
55
- <Tooltip
56
- open
57
- placement="top"
58
- title={stringify(model.pxToBp(coordX))}
59
- arrow
60
- >
61
- <div
62
- className={classes.guide}
63
- style={{
64
- left: coordX,
65
- background: 'red',
66
- }}
67
- />
68
- </Tooltip>
69
- )
70
- },
71
- )
72
-
73
- function RubberBand({
74
- model,
75
- ControlComponent = <div />,
76
- }: {
77
- model: LGV
78
- ControlComponent?: React.ReactElement
79
- }) {
80
- const [startX, setStartX] = useState<number>()
81
- const [currentX, setCurrentX] = useState<number>()
82
-
83
- // clientX and clientY used for anchorPosition for menu
84
- // offsetX used for calculations about width of selection
85
- const [anchorPosition, setAnchorPosition] = useState<{
86
- offsetX: number
87
- clientX: number
88
- clientY: number
89
- }>()
90
- const [guideX, setGuideX] = useState<number>()
91
- const controlsRef = useRef<HTMLDivElement>(null)
92
- const rubberBandRef = useRef(null)
93
- const { classes } = useStyles()
94
- const mouseDragging = startX !== undefined && anchorPosition === undefined
95
-
96
- const { setOffsets, pxToBp } = model
97
-
98
- useEffect(() => {
99
- function computeOffsets(offsetX: number) {
100
- if (startX === undefined) {
101
- return
102
- }
103
- let leftPx = startX
104
- let rightPx = offsetX
105
- if (rightPx < leftPx) {
106
- ;[leftPx, rightPx] = [rightPx, leftPx]
107
- }
108
- const leftOffset = pxToBp(leftPx)
109
- const rightOffset = pxToBp(rightPx)
110
-
111
- return { leftOffset, rightOffset }
112
- }
113
-
114
- function globalMouseMove(event: MouseEvent) {
115
- if (controlsRef.current && mouseDragging) {
116
- const relativeX =
117
- event.clientX - controlsRef.current.getBoundingClientRect().left
118
- setCurrentX(relativeX)
119
- }
120
- }
121
-
122
- function globalMouseUp(event: MouseEvent) {
123
- if (startX !== undefined && controlsRef.current) {
124
- const { clientX, clientY } = event
125
- const ref = controlsRef.current
126
- const offsetX = clientX - ref.getBoundingClientRect().left
127
- // as stated above, store both clientX/Y and offsetX for different
128
- // purposes
129
- setAnchorPosition({
130
- offsetX,
131
- clientX,
132
- clientY,
133
- })
134
- const args = computeOffsets(offsetX)
135
- if (args) {
136
- const { leftOffset, rightOffset } = args
137
- setOffsets(leftOffset, rightOffset)
138
- }
139
- setGuideX(undefined)
140
- }
141
- }
142
- if (mouseDragging) {
143
- window.addEventListener('mousemove', globalMouseMove)
144
- window.addEventListener('mouseup', globalMouseUp)
145
- return () => {
146
- window.removeEventListener('mousemove', globalMouseMove)
147
- window.removeEventListener('mouseup', globalMouseUp)
148
- }
149
- }
150
- return () => {}
151
- }, [startX, mouseDragging, anchorPosition, setOffsets, pxToBp])
152
-
153
- useEffect(() => {
154
- if (
155
- !mouseDragging &&
156
- currentX !== undefined &&
157
- startX !== undefined &&
158
- Math.abs(currentX - startX) <= 3
159
- ) {
160
- handleClose()
161
- }
162
- }, [mouseDragging, currentX, startX, model.bpPerPx])
163
-
164
- function mouseDown(event: React.MouseEvent<HTMLDivElement>) {
165
- event.preventDefault()
166
- event.stopPropagation()
167
- const relativeX =
168
- event.clientX -
169
- (event.target as HTMLDivElement).getBoundingClientRect().left
170
- setStartX(relativeX)
171
- setCurrentX(relativeX)
172
- }
173
-
174
- function mouseMove(event: React.MouseEvent<HTMLDivElement>) {
175
- const target = event.target as HTMLDivElement
176
- setGuideX(event.clientX - target.getBoundingClientRect().left)
177
- }
178
-
179
- function mouseOut() {
180
- setGuideX(undefined)
181
- model.setOffsets(undefined, undefined)
182
- }
183
-
184
- function handleClose() {
185
- setAnchorPosition(undefined)
186
- setStartX(undefined)
187
- setCurrentX(undefined)
188
- }
189
-
190
- const open = Boolean(anchorPosition)
191
-
192
- function handleMenuItemClick(_: unknown, callback: Function) {
193
- callback()
194
- handleClose()
195
- }
196
-
197
- if (startX === undefined) {
198
- return (
199
- <>
200
- {guideX !== undefined ? (
201
- <VerticalGuide model={model} coordX={guideX} />
202
- ) : null}
203
- <div
204
- data-testid="rubberBand_controls"
205
- className={classes.rubberBandControl}
206
- role="presentation"
207
- ref={controlsRef}
208
- onMouseDown={mouseDown}
209
- onMouseOut={mouseOut}
210
- onMouseMove={mouseMove}
211
- >
212
- {ControlComponent}
213
- </div>
214
- </>
215
- )
216
- }
217
-
218
- /* Calculating Pixels for Mouse Dragging */
219
- const right = anchorPosition ? anchorPosition.offsetX : currentX || 0
220
- const left = right < startX ? right : startX
221
- const width = Math.abs(right - startX)
222
- const leftBpOffset = model.pxToBp(left)
223
- const rightBpOffset = model.pxToBp(left + width)
224
- const numOfBpSelected = Math.ceil(width * model.bpPerPx)
225
- return (
226
- <>
227
- {rubberBandRef.current ? (
228
- <>
229
- <Popover
230
- className={classes.popover}
231
- classes={{
232
- paper: classes.paper,
233
- }}
234
- open
235
- anchorEl={rubberBandRef.current}
236
- anchorOrigin={{
237
- vertical: 'top',
238
- horizontal: 'left',
239
- }}
240
- transformOrigin={{
241
- vertical: 'bottom',
242
- horizontal: 'right',
243
- }}
244
- keepMounted
245
- disableRestoreFocus
246
- >
247
- <Typography>{stringify(leftBpOffset)}</Typography>
248
- </Popover>
249
- <Popover
250
- className={classes.popover}
251
- classes={{
252
- paper: classes.paper,
253
- }}
254
- open
255
- anchorEl={rubberBandRef.current}
256
- anchorOrigin={{
257
- vertical: 'top',
258
- horizontal: 'right',
259
- }}
260
- transformOrigin={{
261
- vertical: 'bottom',
262
- horizontal: 'left',
263
- }}
264
- keepMounted
265
- disableRestoreFocus
266
- >
267
- <Typography>{stringify(rightBpOffset)}</Typography>
268
- </Popover>
269
- </>
270
- ) : null}
271
- <div
272
- ref={rubberBandRef}
273
- className={classes.rubberBand}
274
- style={{ left, width }}
275
- >
276
- <Typography variant="h6" className={classes.rubberBandText}>
277
- {numOfBpSelected.toLocaleString('en-US')} bp
278
- </Typography>
279
- </div>
280
- <div
281
- data-testid="rubberBand_controls"
282
- className={classes.rubberBandControl}
283
- role="presentation"
284
- ref={controlsRef}
285
- onMouseDown={mouseDown}
286
- onMouseOut={mouseOut}
287
- onMouseMove={mouseMove}
288
- >
289
- {ControlComponent}
290
- </div>
291
- {anchorPosition ? (
292
- <Menu
293
- anchorReference="anchorPosition"
294
- anchorPosition={{
295
- left: anchorPosition.clientX,
296
- top: anchorPosition.clientY,
297
- }}
298
- onMenuItemClick={handleMenuItemClick}
299
- open={open}
300
- onClose={handleClose}
301
- menuItems={model.rubberBandMenuItems()}
302
- />
303
- ) : null}
304
- </>
305
- )
306
- }
307
-
308
- export default observer(RubberBand)