@jbrowse/plugin-linear-genome-view 2.2.0 → 2.2.2

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 (225) hide show
  1. package/dist/BaseLinearDisplay/components/Tooltip.d.ts +1 -1
  2. package/dist/BaseLinearDisplay/models/BaseLinearDisplayModel.d.ts +3 -3
  3. package/dist/BaseLinearDisplay/models/serverSideRenderedBlock.d.ts +2 -2
  4. package/dist/BaseLinearDisplay/models/serverSideRenderedBlock.js +1 -1
  5. package/dist/BaseLinearDisplay/models/serverSideRenderedBlock.js.map +1 -1
  6. package/dist/BasicTrack/index.d.ts +1 -1
  7. package/dist/BasicTrack/index.js +4 -4
  8. package/dist/BasicTrack/index.js.map +1 -1
  9. package/dist/LaunchLinearGenomeView/index.d.ts +3 -0
  10. package/dist/LaunchLinearGenomeView/index.js +44 -0
  11. package/dist/LaunchLinearGenomeView/index.js.map +1 -0
  12. package/dist/LinearBareDisplay/index.d.ts +6 -2
  13. package/dist/LinearBareDisplay/index.js +17 -2
  14. package/dist/LinearBareDisplay/index.js.map +1 -1
  15. package/dist/LinearBasicDisplay/components/SetMaxHeight.js +2 -15
  16. package/dist/LinearBasicDisplay/components/SetMaxHeight.js.map +1 -1
  17. package/dist/LinearBasicDisplay/index.d.ts +6 -2
  18. package/dist/LinearBasicDisplay/index.js +20 -4
  19. package/dist/LinearBasicDisplay/index.js.map +1 -1
  20. package/dist/LinearBasicDisplay/model.d.ts +21 -14
  21. package/dist/LinearBasicDisplay/model.js +2 -1
  22. package/dist/LinearBasicDisplay/model.js.map +1 -1
  23. package/dist/LinearGenomeView/components/CenterLine.d.ts +1 -1
  24. package/dist/LinearGenomeView/components/ExportSvgDialog.js +1 -19
  25. package/dist/LinearGenomeView/components/ExportSvgDialog.js.map +1 -1
  26. package/dist/LinearGenomeView/components/GetSequenceDialog.d.ts +1 -1
  27. package/dist/LinearGenomeView/components/GetSequenceDialog.js +7 -18
  28. package/dist/LinearGenomeView/components/GetSequenceDialog.js.map +1 -1
  29. package/dist/LinearGenomeView/components/Gridlines.d.ts +1 -1
  30. package/dist/LinearGenomeView/components/Header.d.ts +1 -1
  31. package/dist/LinearGenomeView/components/Header.js +2 -2
  32. package/dist/LinearGenomeView/components/HelpDialog.js +2 -17
  33. package/dist/LinearGenomeView/components/HelpDialog.js.map +1 -1
  34. package/dist/LinearGenomeView/components/ImportForm.d.ts +1 -1
  35. package/dist/LinearGenomeView/components/ImportForm.js +18 -16
  36. package/dist/LinearGenomeView/components/ImportForm.js.map +1 -1
  37. package/dist/LinearGenomeView/components/LinearGenomeView.d.ts +1 -1
  38. package/dist/LinearGenomeView/components/LinearGenomeView.js +1 -3
  39. package/dist/LinearGenomeView/components/LinearGenomeView.js.map +1 -1
  40. package/dist/LinearGenomeView/components/LinearGenomeViewSvg.d.ts +1 -1
  41. package/dist/LinearGenomeView/components/LinearGenomeViewSvg.js +5 -5
  42. package/dist/LinearGenomeView/components/{OverviewRubberBand.d.ts → OverviewRubberband.d.ts} +3 -3
  43. package/dist/LinearGenomeView/components/{OverviewRubberBand.js → OverviewRubberband.js} +27 -79
  44. package/dist/LinearGenomeView/components/OverviewRubberband.js.map +1 -0
  45. package/{esm/LinearGenomeView/components/OverviewScaleBar.d.ts → dist/LinearGenomeView/components/OverviewScalebar.d.ts} +3 -3
  46. package/dist/LinearGenomeView/components/{OverviewScaleBar.js → OverviewScalebar.js} +25 -24
  47. package/dist/LinearGenomeView/components/OverviewScalebar.js.map +1 -0
  48. package/dist/LinearGenomeView/components/RefNameAutocomplete.js +1 -1
  49. package/dist/LinearGenomeView/components/RefNameAutocomplete.js.map +1 -1
  50. package/dist/LinearGenomeView/components/{RubberBand.d.ts → Rubberband.d.ts} +3 -3
  51. package/dist/LinearGenomeView/components/Rubberband.js +57 -0
  52. package/dist/LinearGenomeView/components/Rubberband.js.map +1 -0
  53. package/dist/LinearGenomeView/components/RubberbandSpan.d.ts +14 -0
  54. package/dist/LinearGenomeView/components/RubberbandSpan.js +90 -0
  55. package/dist/LinearGenomeView/components/RubberbandSpan.js.map +1 -0
  56. package/dist/LinearGenomeView/components/{ScaleBar.d.ts → Scalebar.d.ts} +3 -3
  57. package/dist/LinearGenomeView/components/{ScaleBar.js → Scalebar.js} +11 -11
  58. package/dist/LinearGenomeView/components/{ScaleBar.js.map → Scalebar.js.map} +1 -1
  59. package/dist/LinearGenomeView/components/SearchBox.js +6 -6
  60. package/dist/LinearGenomeView/components/SearchBox.js.map +1 -1
  61. package/dist/LinearGenomeView/components/SearchResultsDialog.js +17 -31
  62. package/dist/LinearGenomeView/components/SearchResultsDialog.js.map +1 -1
  63. package/dist/LinearGenomeView/components/SequenceSearchDialog.js +4 -19
  64. package/dist/LinearGenomeView/components/SequenceSearchDialog.js.map +1 -1
  65. package/dist/LinearGenomeView/components/TrackContainer.d.ts +1 -1
  66. package/dist/LinearGenomeView/components/TrackContainer.js +13 -10
  67. package/dist/LinearGenomeView/components/TrackContainer.js.map +1 -1
  68. package/dist/LinearGenomeView/components/TrackLabel.js +9 -1
  69. package/dist/LinearGenomeView/components/TrackLabel.js.map +1 -1
  70. package/dist/LinearGenomeView/components/TracksContainer.d.ts +1 -1
  71. package/dist/LinearGenomeView/components/TracksContainer.js +21 -118
  72. package/dist/LinearGenomeView/components/TracksContainer.js.map +1 -1
  73. package/dist/LinearGenomeView/components/VerticalGuide.d.ts +9 -0
  74. package/dist/LinearGenomeView/components/VerticalGuide.js +29 -0
  75. package/dist/LinearGenomeView/components/VerticalGuide.js.map +1 -0
  76. package/dist/LinearGenomeView/components/hooks.d.ts +65 -0
  77. package/dist/LinearGenomeView/components/hooks.js +264 -0
  78. package/dist/LinearGenomeView/components/hooks.js.map +1 -0
  79. package/dist/LinearGenomeView/components/util.d.ts +5 -2
  80. package/dist/LinearGenomeView/components/util.js +7 -6
  81. package/dist/LinearGenomeView/components/util.js.map +1 -1
  82. package/dist/LinearGenomeView/index.d.ts +3 -453
  83. package/dist/LinearGenomeView/index.js +11 -1247
  84. package/dist/LinearGenomeView/index.js.map +1 -1
  85. package/dist/LinearGenomeView/model.d.ts +535 -0
  86. package/dist/LinearGenomeView/model.js +1357 -0
  87. package/dist/LinearGenomeView/model.js.map +1 -0
  88. package/dist/index.d.ts +20 -8
  89. package/dist/index.js +9 -72
  90. package/dist/index.js.map +1 -1
  91. package/esm/BaseLinearDisplay/components/Tooltip.d.ts +1 -1
  92. package/esm/BaseLinearDisplay/models/BaseLinearDisplayModel.d.ts +3 -3
  93. package/esm/BaseLinearDisplay/models/serverSideRenderedBlock.d.ts +2 -2
  94. package/esm/BaseLinearDisplay/models/serverSideRenderedBlock.js +1 -1
  95. package/esm/BaseLinearDisplay/models/serverSideRenderedBlock.js.map +1 -1
  96. package/esm/BasicTrack/index.d.ts +1 -1
  97. package/esm/BasicTrack/index.js +4 -4
  98. package/esm/BasicTrack/index.js.map +1 -1
  99. package/esm/LaunchLinearGenomeView/index.d.ts +3 -0
  100. package/esm/LaunchLinearGenomeView/index.js +42 -0
  101. package/esm/LaunchLinearGenomeView/index.js.map +1 -0
  102. package/esm/LinearBareDisplay/index.d.ts +6 -2
  103. package/esm/LinearBareDisplay/index.js +18 -2
  104. package/esm/LinearBareDisplay/index.js.map +1 -1
  105. package/esm/LinearBasicDisplay/components/SetMaxHeight.js +3 -13
  106. package/esm/LinearBasicDisplay/components/SetMaxHeight.js.map +1 -1
  107. package/esm/LinearBasicDisplay/index.d.ts +6 -2
  108. package/esm/LinearBasicDisplay/index.js +19 -2
  109. package/esm/LinearBasicDisplay/index.js.map +1 -1
  110. package/esm/LinearBasicDisplay/model.d.ts +21 -14
  111. package/esm/LinearBasicDisplay/model.js +2 -1
  112. package/esm/LinearBasicDisplay/model.js.map +1 -1
  113. package/esm/LinearGenomeView/components/CenterLine.d.ts +1 -1
  114. package/esm/LinearGenomeView/components/ExportSvgDialog.js +3 -18
  115. package/esm/LinearGenomeView/components/ExportSvgDialog.js.map +1 -1
  116. package/esm/LinearGenomeView/components/GetSequenceDialog.d.ts +1 -1
  117. package/esm/LinearGenomeView/components/GetSequenceDialog.js +8 -19
  118. package/esm/LinearGenomeView/components/GetSequenceDialog.js.map +1 -1
  119. package/esm/LinearGenomeView/components/Gridlines.d.ts +1 -1
  120. package/esm/LinearGenomeView/components/Header.d.ts +1 -1
  121. package/esm/LinearGenomeView/components/Header.js +2 -2
  122. package/esm/LinearGenomeView/components/HelpDialog.js +3 -18
  123. package/esm/LinearGenomeView/components/HelpDialog.js.map +1 -1
  124. package/esm/LinearGenomeView/components/ImportForm.d.ts +1 -1
  125. package/esm/LinearGenomeView/components/ImportForm.js +18 -16
  126. package/esm/LinearGenomeView/components/ImportForm.js.map +1 -1
  127. package/esm/LinearGenomeView/components/LinearGenomeView.d.ts +1 -1
  128. package/esm/LinearGenomeView/components/LinearGenomeView.js +2 -4
  129. package/esm/LinearGenomeView/components/LinearGenomeView.js.map +1 -1
  130. package/esm/LinearGenomeView/components/LinearGenomeViewSvg.d.ts +1 -1
  131. package/esm/LinearGenomeView/components/LinearGenomeViewSvg.js +3 -3
  132. package/esm/LinearGenomeView/components/{OverviewRubberBand.d.ts → OverviewRubberband.d.ts} +3 -3
  133. package/esm/LinearGenomeView/components/{OverviewRubberBand.js → OverviewRubberband.js} +25 -80
  134. package/esm/LinearGenomeView/components/OverviewRubberband.js.map +1 -0
  135. package/{dist/LinearGenomeView/components/OverviewScaleBar.d.ts → esm/LinearGenomeView/components/OverviewScalebar.d.ts} +3 -3
  136. package/esm/LinearGenomeView/components/{OverviewScaleBar.js → OverviewScalebar.js} +25 -24
  137. package/esm/LinearGenomeView/components/OverviewScalebar.js.map +1 -0
  138. package/esm/LinearGenomeView/components/RefNameAutocomplete.js +1 -1
  139. package/esm/LinearGenomeView/components/RefNameAutocomplete.js.map +1 -1
  140. package/esm/LinearGenomeView/components/{RubberBand.d.ts → Rubberband.d.ts} +3 -3
  141. package/esm/LinearGenomeView/components/Rubberband.js +29 -0
  142. package/esm/LinearGenomeView/components/Rubberband.js.map +1 -0
  143. package/esm/LinearGenomeView/components/RubberbandSpan.d.ts +14 -0
  144. package/esm/LinearGenomeView/components/RubberbandSpan.js +65 -0
  145. package/esm/LinearGenomeView/components/RubberbandSpan.js.map +1 -0
  146. package/esm/LinearGenomeView/components/{ScaleBar.d.ts → Scalebar.d.ts} +3 -3
  147. package/esm/LinearGenomeView/components/{ScaleBar.js → Scalebar.js} +11 -11
  148. package/esm/LinearGenomeView/components/{ScaleBar.js.map → Scalebar.js.map} +1 -1
  149. package/esm/LinearGenomeView/components/SearchBox.js +6 -6
  150. package/esm/LinearGenomeView/components/SearchBox.js.map +1 -1
  151. package/esm/LinearGenomeView/components/SearchResultsDialog.js +18 -32
  152. package/esm/LinearGenomeView/components/SearchResultsDialog.js.map +1 -1
  153. package/esm/LinearGenomeView/components/SequenceSearchDialog.js +5 -17
  154. package/esm/LinearGenomeView/components/SequenceSearchDialog.js.map +1 -1
  155. package/esm/LinearGenomeView/components/TrackContainer.d.ts +1 -1
  156. package/esm/LinearGenomeView/components/TrackContainer.js +14 -11
  157. package/esm/LinearGenomeView/components/TrackContainer.js.map +1 -1
  158. package/esm/LinearGenomeView/components/TrackLabel.js +9 -1
  159. package/esm/LinearGenomeView/components/TrackLabel.js.map +1 -1
  160. package/esm/LinearGenomeView/components/TracksContainer.d.ts +1 -1
  161. package/esm/LinearGenomeView/components/TracksContainer.js +22 -119
  162. package/esm/LinearGenomeView/components/TracksContainer.js.map +1 -1
  163. package/esm/LinearGenomeView/components/VerticalGuide.d.ts +9 -0
  164. package/esm/LinearGenomeView/components/VerticalGuide.js +24 -0
  165. package/esm/LinearGenomeView/components/VerticalGuide.js.map +1 -0
  166. package/esm/LinearGenomeView/components/hooks.d.ts +65 -0
  167. package/esm/LinearGenomeView/components/hooks.js +255 -0
  168. package/esm/LinearGenomeView/components/hooks.js.map +1 -0
  169. package/esm/LinearGenomeView/components/util.d.ts +5 -2
  170. package/esm/LinearGenomeView/components/util.js +4 -3
  171. package/esm/LinearGenomeView/components/util.js.map +1 -1
  172. package/esm/LinearGenomeView/index.d.ts +3 -453
  173. package/esm/LinearGenomeView/index.js +9 -1238
  174. package/esm/LinearGenomeView/index.js.map +1 -1
  175. package/esm/LinearGenomeView/model.d.ts +535 -0
  176. package/esm/LinearGenomeView/model.js +1322 -0
  177. package/esm/LinearGenomeView/model.js.map +1 -0
  178. package/esm/index.d.ts +20 -8
  179. package/esm/index.js +9 -72
  180. package/esm/index.js.map +1 -1
  181. package/package.json +3 -3
  182. package/src/BaseLinearDisplay/models/serverSideRenderedBlock.ts +1 -1
  183. package/src/BasicTrack/index.ts +4 -8
  184. package/src/LaunchLinearGenomeView/index.ts +66 -0
  185. package/src/LinearBareDisplay/index.ts +21 -2
  186. package/src/LinearBasicDisplay/components/SetMaxHeight.tsx +3 -28
  187. package/src/LinearBasicDisplay/index.ts +23 -2
  188. package/src/LinearBasicDisplay/model.ts +2 -1
  189. package/src/LinearGenomeView/components/ExportSvgDialog.tsx +2 -23
  190. package/src/LinearGenomeView/components/GetSequenceDialog.tsx +13 -31
  191. package/src/LinearGenomeView/components/Header.tsx +3 -3
  192. package/src/LinearGenomeView/components/HelpDialog.tsx +8 -34
  193. package/src/LinearGenomeView/components/ImportForm.tsx +19 -16
  194. package/src/LinearGenomeView/components/LinearGenomeView.tsx +2 -8
  195. package/src/LinearGenomeView/components/LinearGenomeViewSvg.tsx +3 -3
  196. package/src/LinearGenomeView/components/{OverviewRubberBand.tsx → OverviewRubberband.tsx} +32 -114
  197. package/src/LinearGenomeView/components/{OverviewScaleBar.tsx → OverviewScalebar.tsx} +26 -25
  198. package/src/LinearGenomeView/components/RefNameAutocomplete.tsx +2 -1
  199. package/src/LinearGenomeView/components/Rubberband.tsx +89 -0
  200. package/src/LinearGenomeView/components/RubberbandSpan.tsx +116 -0
  201. package/src/LinearGenomeView/components/{ScaleBar.test.tsx → Scalebar.test.tsx} +5 -5
  202. package/src/LinearGenomeView/components/{ScaleBar.tsx → Scalebar.tsx} +11 -11
  203. package/src/LinearGenomeView/components/SearchBox.tsx +6 -6
  204. package/src/LinearGenomeView/components/SearchResultsDialog.tsx +17 -44
  205. package/src/LinearGenomeView/components/SequenceSearchDialog.tsx +4 -30
  206. package/src/LinearGenomeView/components/TrackContainer.tsx +41 -28
  207. package/src/LinearGenomeView/components/TrackLabel.tsx +10 -1
  208. package/src/LinearGenomeView/components/TracksContainer.tsx +59 -136
  209. package/src/LinearGenomeView/components/VerticalGuide.tsx +37 -0
  210. package/src/LinearGenomeView/components/__snapshots__/LinearGenomeView.test.tsx.snap +37 -39
  211. package/src/LinearGenomeView/components/hooks.ts +300 -0
  212. package/src/LinearGenomeView/components/util.ts +8 -11
  213. package/src/LinearGenomeView/index.test.ts +6 -7
  214. package/src/LinearGenomeView/index.ts +17 -0
  215. package/src/LinearGenomeView/{index.tsx → model.ts} +159 -75
  216. package/src/index.ts +13 -108
  217. package/dist/LinearGenomeView/components/OverviewRubberBand.js.map +0 -1
  218. package/dist/LinearGenomeView/components/OverviewScaleBar.js.map +0 -1
  219. package/dist/LinearGenomeView/components/RubberBand.js +0 -221
  220. package/dist/LinearGenomeView/components/RubberBand.js.map +0 -1
  221. package/esm/LinearGenomeView/components/OverviewRubberBand.js.map +0 -1
  222. package/esm/LinearGenomeView/components/OverviewScaleBar.js.map +0 -1
  223. package/esm/LinearGenomeView/components/RubberBand.js +0 -196
  224. package/esm/LinearGenomeView/components/RubberBand.js.map +0 -1
  225. package/src/LinearGenomeView/components/RubberBand.tsx +0 -308
@@ -2,36 +2,24 @@ import React, { useState } from 'react'
2
2
  import {
3
3
  Button,
4
4
  Checkbox,
5
- Dialog,
6
5
  DialogActions,
7
6
  DialogContent,
8
- DialogTitle,
9
- Divider,
10
7
  FormGroup,
11
8
  FormControlLabel,
12
- IconButton,
13
9
  TextField,
14
10
  Typography,
15
11
  } from '@mui/material'
12
+ import { Dialog } from '@jbrowse/core/ui'
16
13
  import { getSnapshot } from 'mobx-state-tree'
17
14
  import { makeStyles } from 'tss-react/mui'
18
15
  import { observer } from 'mobx-react'
19
16
  import { getSession } from '@jbrowse/core/util'
20
17
 
21
- // icons
22
- import CloseIcon from '@mui/icons-material/Close'
23
-
24
- const useStyles = makeStyles()(theme => ({
25
- closeButton: {
26
- position: 'absolute',
27
- right: theme.spacing(1),
28
- top: theme.spacing(1),
29
- color: theme.palette.grey[500],
30
- },
18
+ const useStyles = makeStyles()({
31
19
  dialogContent: {
32
20
  width: '40em',
33
21
  },
34
- }))
22
+ })
35
23
 
36
24
  function SequenceDialog({
37
25
  model,
@@ -55,21 +43,7 @@ function SequenceDialog({
55
43
  }
56
44
 
57
45
  return (
58
- <Dialog maxWidth="xl" open onClose={handleClose}>
59
- <DialogTitle>
60
- Sequence search
61
- {handleClose ? (
62
- <IconButton
63
- className={classes.closeButton}
64
- onClick={() => handleClose()}
65
- size="large"
66
- >
67
- <CloseIcon />
68
- </IconButton>
69
- ) : null}
70
- </DialogTitle>
71
- <Divider />
72
-
46
+ <Dialog maxWidth="xl" open onClose={handleClose} title="Sequence search">
73
47
  <DialogContent className={classes.dialogContent}>
74
48
  <Typography>
75
49
  Supply a sequence to search for. A track will be created with the
@@ -3,9 +3,12 @@ import { Paper } from '@mui/material'
3
3
  import { makeStyles } from 'tss-react/mui'
4
4
  import { observer } from 'mobx-react'
5
5
  import { isAlive } from 'mobx-state-tree'
6
+ import { ErrorBoundary } from 'react-error-boundary'
7
+
8
+ // jbrowse core
6
9
  import { BaseTrackModel } from '@jbrowse/core/pluggableElementTypes/models'
7
10
  import { getConf } from '@jbrowse/core/configuration'
8
- import { ResizeHandle } from '@jbrowse/core/ui'
11
+ import { ResizeHandle, ErrorMessage } from '@jbrowse/core/ui'
9
12
  import { useDebouncedCallback } from '@jbrowse/core/util'
10
13
 
11
14
  // locals
@@ -34,7 +37,7 @@ const useStyles = makeStyles()({
34
37
  zIndex: 3,
35
38
  },
36
39
 
37
- // aligns with block bounderies. check for example the breakpoint split view
40
+ // aligns with block boundaries. check for example the breakpoint split view
38
41
  // demo to see if features align if wanting to change things
39
42
  renderingComponentContainer: {
40
43
  position: 'absolute',
@@ -92,6 +95,7 @@ function TrackContainer({
92
95
  const trackId = getConf(track, 'trackId')
93
96
  const ref = useRef(null)
94
97
  const dimmed = draggingTrackId !== undefined && draggingTrackId !== display.id
98
+ const minimized = track.minimized
95
99
  const debouncedOnDragEnter = useDebouncedCallback(() => {
96
100
  if (isAlive(display) && dimmed) {
97
101
  moveTrack(draggingTrackId, track.id)
@@ -109,36 +113,45 @@ function TrackContainer({
109
113
  return (
110
114
  <Paper className={classes.root} variant="outlined">
111
115
  <TrackContainerLabel model={track} view={model} />
112
- <div
113
- className={classes.trackRenderingContainer}
114
- style={{ height }}
115
- onScroll={event => display.setScrollTop(event.currentTarget.scrollTop)}
116
- onDragEnter={debouncedOnDragEnter}
117
- data-testid={`trackRenderingContainer-${model.id}-${trackId}`}
116
+ <ErrorBoundary
117
+ key={track.id}
118
+ FallbackComponent={({ error }) => <ErrorMessage error={error} />}
118
119
  >
119
120
  <div
120
- ref={ref}
121
- className={classes.renderingComponentContainer}
122
- style={{ transform: `scaleX(${model.scaleFactor})` }}
121
+ className={classes.trackRenderingContainer}
122
+ style={{ height: minimized ? 20 : height }}
123
+ onScroll={evt => display.setScrollTop(evt.currentTarget.scrollTop)}
124
+ onDragEnter={debouncedOnDragEnter}
125
+ data-testid={`trackRenderingContainer-${model.id}-${trackId}`}
123
126
  >
124
- <RenderingComponent
125
- model={display}
126
- onHorizontalScroll={horizontalScroll}
127
- />
128
- </div>
127
+ {!minimized ? (
128
+ <>
129
+ <div
130
+ ref={ref}
131
+ className={classes.renderingComponentContainer}
132
+ style={{ transform: `scaleX(${model.scaleFactor})` }}
133
+ >
134
+ <RenderingComponent
135
+ model={display}
136
+ onHorizontalScroll={horizontalScroll}
137
+ />
138
+ </div>
129
139
 
130
- {DisplayBlurb ? (
131
- <div
132
- style={{
133
- position: 'absolute',
134
- left: 0,
135
- top: display.height - 20,
136
- }}
137
- >
138
- <DisplayBlurb model={display} />
139
- </div>
140
- ) : null}
141
- </div>
140
+ {DisplayBlurb ? (
141
+ <div
142
+ style={{
143
+ position: 'absolute',
144
+ left: 0,
145
+ top: display.height - 20,
146
+ }}
147
+ >
148
+ <DisplayBlurb model={display} />
149
+ </div>
150
+ ) : null}
151
+ </>
152
+ ) : null}
153
+ </div>
154
+ </ErrorBoundary>
142
155
  <div
143
156
  className={classes.overlay}
144
157
  style={{
@@ -18,6 +18,8 @@ import {
18
18
  import MoreVertIcon from '@mui/icons-material/MoreVert'
19
19
  import DragIcon from '@mui/icons-material/DragIndicator'
20
20
  import CloseIcon from '@mui/icons-material/Close'
21
+ import MinimizeIcon from '@mui/icons-material/Minimize'
22
+ import AddIcon from '@mui/icons-material/Add'
21
23
 
22
24
  import { LinearGenomeViewModel } from '..'
23
25
 
@@ -64,6 +66,7 @@ const TrackLabel = React.forwardRef<HTMLDivElement, Props>(
64
66
  const view = getContainingView(track) as LGV
65
67
  const session = getSession(track)
66
68
  const trackConf = track.configuration
69
+ const minimized = track.minimized
67
70
  const trackId = getConf(track, 'trackId')
68
71
  const trackName = getTrackName(trackConf, session)
69
72
 
@@ -73,6 +76,11 @@ const TrackLabel = React.forwardRef<HTMLDivElement, Props>(
73
76
  })
74
77
 
75
78
  const items = [
79
+ {
80
+ label: minimized ? 'Restore track' : 'Minimize track',
81
+ icon: minimized ? AddIcon : MinimizeIcon,
82
+ onClick: () => track.setMinimized(!minimized),
83
+ },
76
84
  ...(session.getTrackActionMenuItems?.(trackConf) || []),
77
85
  ...track.trackMenuItems(),
78
86
  ].sort((a, b) => (b.priority || 0) - (a.priority || 0))
@@ -103,12 +111,13 @@ const TrackLabel = React.forwardRef<HTMLDivElement, Props>(
103
111
  >
104
112
  <CloseIcon fontSize="small" />
105
113
  </IconButton>
114
+
106
115
  <Typography
107
116
  variant="body1"
108
117
  component="span"
109
118
  className={classes.trackName}
110
119
  >
111
- {trackName}
120
+ {trackName + (minimized ? ' (minimized)' : '')}
112
121
  </Typography>
113
122
  <IconButton
114
123
  {...bindTrigger(popupState)}
@@ -1,14 +1,19 @@
1
- import React, { useEffect, useRef, useState } from 'react'
1
+ import React, { useRef } from 'react'
2
2
  import { makeStyles } from 'tss-react/mui'
3
3
  import { observer } from 'mobx-react'
4
- import normalizeWheel from 'normalize-wheel'
4
+ import { Menu } from '@jbrowse/core/ui'
5
5
 
6
- // locals
6
+ // local utils
7
7
  import { LinearGenomeViewModel, SCALE_BAR_HEIGHT } from '..'
8
- import RubberBand from './RubberBand'
9
- import ScaleBar from './ScaleBar'
8
+ import { useSideScroll, useRangeSelect, useWheelScroll } from './hooks'
9
+
10
+ // local components
11
+ import Rubberband from './Rubberband'
12
+ import Scalebar from './Scalebar'
10
13
  import Gridlines from './Gridlines'
11
14
  import CenterLine from './CenterLine'
15
+ import VerticalGuide from './VerticalGuide'
16
+ import RubberbandSpan from './RubberbandSpan'
12
17
 
13
18
  const useStyles = makeStyles()({
14
19
  tracksContainer: {
@@ -22,7 +27,6 @@ const useStyles = makeStyles()({
22
27
  })
23
28
 
24
29
  type LGV = LinearGenomeViewModel
25
- type Timer = ReturnType<typeof setTimeout>
26
30
 
27
31
  function TracksContainer({
28
32
  children,
@@ -32,149 +36,68 @@ function TracksContainer({
32
36
  model: LGV
33
37
  }) {
34
38
  const { classes } = useStyles()
35
- // refs are to store these variables to avoid repeated rerenders associated
36
- // with useState/setState
37
- const delta = useRef(0)
38
- const scheduled = useRef(false)
39
- const timeout = useRef<Timer>()
39
+ const { mouseDown: mouseDown1, mouseUp } = useSideScroll(model)
40
40
  const ref = useRef<HTMLDivElement>(null)
41
- const prevX = useRef<number>(0)
42
-
43
- const [mouseDragging, setMouseDragging] = useState(false)
44
-
45
- useEffect(() => {
46
- let cleanup = () => {}
47
-
48
- function globalMouseMove(event: MouseEvent) {
49
- event.preventDefault()
50
- const currX = event.clientX
51
- const distance = currX - prevX.current
52
- if (distance) {
53
- // use rAF to make it so multiple event handlers aren't fired per-frame
54
- // see https://calendar.perfplanet.com/2013/the-runtime-performance-checklist/
55
- if (!scheduled.current) {
56
- scheduled.current = true
57
- window.requestAnimationFrame(() => {
58
- model.horizontalScroll(-distance)
59
- scheduled.current = false
60
- prevX.current = event.clientX
61
- })
62
- }
63
- }
64
- }
65
-
66
- function globalMouseUp() {
67
- prevX.current = 0
68
- if (mouseDragging) {
69
- setMouseDragging(false)
70
- }
71
- }
72
-
73
- if (mouseDragging) {
74
- window.addEventListener('mousemove', globalMouseMove, true)
75
- window.addEventListener('mouseup', globalMouseUp, true)
76
- cleanup = () => {
77
- window.removeEventListener('mousemove', globalMouseMove, true)
78
- window.removeEventListener('mouseup', globalMouseUp, true)
79
- }
80
- }
81
- return cleanup
82
- }, [model, mouseDragging, prevX])
83
-
84
- function mouseDown(event: React.MouseEvent) {
85
- // check if clicking a draggable element or a resize handle
86
- const target = event.target as HTMLElement
87
- if (target.draggable || target.dataset.resizer) {
88
- return
89
- }
90
-
91
- // otherwise do click and drag scroll
92
- if (event.button === 0) {
93
- prevX.current = event.clientX
94
- setMouseDragging(true)
95
- }
96
- }
97
-
98
- // this local mouseup is used in addition to the global because sometimes
99
- // the global add/remove are not called in time, resulting in issue #533
100
- function mouseUp(event: React.MouseEvent) {
101
- event.preventDefault()
102
- setMouseDragging(false)
103
- }
104
-
105
- function mouseLeave(event: React.MouseEvent) {
106
- event.preventDefault()
107
- }
108
-
109
- useEffect(() => {
110
- const curr = ref.current
111
- // if ctrl is held down, zoom in with y-scroll
112
- // else scroll horizontally with x-scroll
113
- function onWheel(origEvent: WheelEvent) {
114
- const event = normalizeWheel(origEvent)
115
- if (origEvent.ctrlKey === true) {
116
- origEvent.preventDefault()
117
- delta.current += event.pixelY / 500
118
- model.setScaleFactor(
119
- delta.current < 0 ? 1 - delta.current : 1 / (1 + delta.current),
120
- )
121
- if (timeout.current) {
122
- clearTimeout(timeout.current)
123
- }
124
- timeout.current = setTimeout(() => {
125
- model.setScaleFactor(1)
126
- model.zoomTo(
127
- delta.current > 0
128
- ? model.bpPerPx * (1 + delta.current)
129
- : model.bpPerPx / (1 - delta.current),
130
- )
131
- delta.current = 0
132
- }, 300)
133
- } else {
134
- // this is needed to stop the event from triggering "back button
135
- // action" on MacOSX etc. but is a heuristic to avoid preventing the
136
- // inner-track scroll behavior
137
- if (Math.abs(event.pixelX) > Math.abs(2 * event.pixelY)) {
138
- origEvent.preventDefault()
139
- }
140
- delta.current += event.pixelX
141
- if (!scheduled.current) {
142
- // use rAF to make it so multiple event handlers aren't fired per-frame
143
- // see https://calendar.perfplanet.com/2013/the-runtime-performance-checklist/
144
- scheduled.current = true
145
- window.requestAnimationFrame(() => {
146
- model.horizontalScroll(delta.current)
147
- delta.current = 0
148
- scheduled.current = false
149
- })
150
- }
151
- }
152
- }
153
- if (curr) {
154
- curr.addEventListener('wheel', onWheel)
155
- return () => {
156
- curr.removeEventListener('wheel', onWheel)
157
- }
158
- }
159
- return () => {}
160
- }, [model])
41
+ const {
42
+ guideX,
43
+ rubberbandOn,
44
+ leftBpOffset,
45
+ rightBpOffset,
46
+ numOfBpSelected,
47
+ width,
48
+ left,
49
+ anchorPosition,
50
+ handleMenuItemClick,
51
+ open,
52
+ handleClose,
53
+ mouseMove,
54
+ mouseDown: mouseDown2,
55
+ } = useRangeSelect(ref, model, true)
56
+ useWheelScroll(ref, model)
161
57
 
162
58
  return (
163
59
  <div
164
60
  ref={ref}
165
61
  data-testid="trackContainer"
166
62
  className={classes.tracksContainer}
167
- onMouseDown={mouseDown}
63
+ onMouseDown={event => {
64
+ mouseDown1(event)
65
+ mouseDown2(event)
66
+ }}
67
+ onMouseMove={mouseMove}
168
68
  onMouseUp={mouseUp}
169
- onMouseLeave={mouseLeave}
170
69
  >
171
70
  {model.showGridlines ? <Gridlines model={model} /> : null}
172
71
  {model.showCenterLine ? <CenterLine model={model} /> : null}
173
-
174
- <RubberBand
72
+ {guideX !== undefined ? (
73
+ <VerticalGuide model={model} coordX={guideX} />
74
+ ) : rubberbandOn ? (
75
+ <RubberbandSpan
76
+ leftBpOffset={leftBpOffset}
77
+ rightBpOffset={rightBpOffset}
78
+ numOfBpSelected={numOfBpSelected}
79
+ width={width}
80
+ left={left}
81
+ />
82
+ ) : null}
83
+ {anchorPosition ? (
84
+ <Menu
85
+ anchorReference="anchorPosition"
86
+ anchorPosition={{
87
+ left: anchorPosition.clientX,
88
+ top: anchorPosition.clientY,
89
+ }}
90
+ onMenuItemClick={handleMenuItemClick}
91
+ open={open}
92
+ onClose={handleClose}
93
+ menuItems={model.rubberBandMenuItems()}
94
+ />
95
+ ) : null}
96
+
97
+ <Rubberband
175
98
  model={model}
176
99
  ControlComponent={
177
- <ScaleBar
100
+ <Scalebar
178
101
  model={model}
179
102
  style={{ height: SCALE_BAR_HEIGHT, boxSizing: 'border-box' }}
180
103
  />
@@ -0,0 +1,37 @@
1
+ import React from 'react'
2
+ import { Tooltip } from '@mui/material'
3
+ import { makeStyles } from 'tss-react/mui'
4
+ import { observer } from 'mobx-react'
5
+ import { stringify } from '@jbrowse/core/util'
6
+
7
+ // locals
8
+ import { LinearGenomeViewModel } from '..'
9
+
10
+ type LGV = LinearGenomeViewModel
11
+
12
+ const useStyles = makeStyles()({
13
+ guide: {
14
+ pointerEvents: 'none',
15
+ height: '100%',
16
+ width: 1,
17
+ position: 'absolute',
18
+ zIndex: 10,
19
+ },
20
+ })
21
+
22
+ function VerticalGuide({ model, coordX }: { model: LGV; coordX: number }) {
23
+ const { classes } = useStyles()
24
+ return (
25
+ <Tooltip open placement="top" title={stringify(model.pxToBp(coordX))} arrow>
26
+ <div
27
+ className={classes.guide}
28
+ style={{
29
+ left: coordX,
30
+ background: 'red',
31
+ }}
32
+ />
33
+ </Tooltip>
34
+ )
35
+ }
36
+
37
+ export default observer(VerticalGuide)