@jbrowse/plugin-circular-view 2.5.0 → 2.6.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 (126) hide show
  1. package/dist/BaseChordDisplay/components/BaseChordDisplay.d.ts +1 -1
  2. package/dist/BaseChordDisplay/components/BaseChordDisplay.js +0 -1
  3. package/dist/BaseChordDisplay/components/DisplayError.d.ts +2 -1
  4. package/dist/BaseChordDisplay/components/DisplayError.js +0 -1
  5. package/dist/BaseChordDisplay/components/Loading.d.ts +2 -1
  6. package/dist/BaseChordDisplay/components/Loading.js +0 -1
  7. package/dist/BaseChordDisplay/index.js +0 -1
  8. package/dist/BaseChordDisplay/models/configSchema.js +0 -1
  9. package/dist/BaseChordDisplay/models/model.d.ts +8 -2
  10. package/dist/BaseChordDisplay/models/model.js +0 -1
  11. package/dist/BaseChordDisplay/models/renderReaction.js +0 -1
  12. package/dist/CircularView/components/CircularView.d.ts +2 -1
  13. package/dist/CircularView/components/CircularView.js +0 -1
  14. package/dist/CircularView/components/Controls.d.ts +2 -1
  15. package/dist/CircularView/components/Controls.js +0 -1
  16. package/dist/CircularView/components/ExportSvgDialog.d.ts +2 -1
  17. package/dist/CircularView/components/ExportSvgDialog.js +0 -1
  18. package/dist/CircularView/components/ImportForm.d.ts +2 -1
  19. package/dist/CircularView/components/ImportForm.js +0 -1
  20. package/dist/CircularView/components/Ruler.d.ts +2 -1
  21. package/dist/CircularView/components/Ruler.js +0 -1
  22. package/dist/CircularView/index.js +0 -1
  23. package/dist/CircularView/models/CircularView.d.ts +1 -3
  24. package/dist/CircularView/models/CircularView.js +30 -7
  25. package/dist/CircularView/models/slices.js +0 -1
  26. package/dist/CircularView/models/viewportVisibleRegion.js +0 -1
  27. package/dist/CircularView/svgcomponents/SVGBackground.d.ts +2 -1
  28. package/dist/CircularView/svgcomponents/SVGBackground.js +0 -1
  29. package/dist/CircularView/svgcomponents/SVGCircularView.js +0 -1
  30. package/dist/LaunchCircularView/index.js +0 -1
  31. package/dist/index.js +0 -1
  32. package/esm/BaseChordDisplay/components/BaseChordDisplay.d.ts +1 -1
  33. package/esm/BaseChordDisplay/components/BaseChordDisplay.js +0 -1
  34. package/esm/BaseChordDisplay/components/DisplayError.d.ts +2 -1
  35. package/esm/BaseChordDisplay/components/DisplayError.js +0 -1
  36. package/esm/BaseChordDisplay/components/Loading.d.ts +2 -1
  37. package/esm/BaseChordDisplay/components/Loading.js +0 -1
  38. package/esm/BaseChordDisplay/index.js +0 -1
  39. package/esm/BaseChordDisplay/models/configSchema.js +0 -1
  40. package/esm/BaseChordDisplay/models/model.d.ts +8 -2
  41. package/esm/BaseChordDisplay/models/model.js +0 -1
  42. package/esm/BaseChordDisplay/models/renderReaction.js +0 -1
  43. package/esm/CircularView/components/CircularView.d.ts +2 -1
  44. package/esm/CircularView/components/CircularView.js +0 -1
  45. package/esm/CircularView/components/Controls.d.ts +2 -1
  46. package/esm/CircularView/components/Controls.js +0 -1
  47. package/esm/CircularView/components/ExportSvgDialog.d.ts +2 -1
  48. package/esm/CircularView/components/ExportSvgDialog.js +0 -1
  49. package/esm/CircularView/components/ImportForm.d.ts +2 -1
  50. package/esm/CircularView/components/ImportForm.js +0 -1
  51. package/esm/CircularView/components/Ruler.d.ts +2 -1
  52. package/esm/CircularView/components/Ruler.js +0 -1
  53. package/esm/CircularView/index.js +0 -1
  54. package/esm/CircularView/models/CircularView.d.ts +1 -3
  55. package/esm/CircularView/models/CircularView.js +6 -6
  56. package/esm/CircularView/models/slices.js +0 -1
  57. package/esm/CircularView/models/viewportVisibleRegion.js +0 -1
  58. package/esm/CircularView/svgcomponents/SVGBackground.d.ts +2 -1
  59. package/esm/CircularView/svgcomponents/SVGBackground.js +0 -1
  60. package/esm/CircularView/svgcomponents/SVGCircularView.js +0 -1
  61. package/esm/LaunchCircularView/index.js +0 -1
  62. package/esm/index.js +0 -1
  63. package/package.json +3 -4
  64. package/dist/BaseChordDisplay/components/BaseChordDisplay.js.map +0 -1
  65. package/dist/BaseChordDisplay/components/DisplayError.js.map +0 -1
  66. package/dist/BaseChordDisplay/components/Loading.js.map +0 -1
  67. package/dist/BaseChordDisplay/index.js.map +0 -1
  68. package/dist/BaseChordDisplay/models/configSchema.js.map +0 -1
  69. package/dist/BaseChordDisplay/models/model.js.map +0 -1
  70. package/dist/BaseChordDisplay/models/renderReaction.js.map +0 -1
  71. package/dist/CircularView/components/CircularView.js.map +0 -1
  72. package/dist/CircularView/components/Controls.js.map +0 -1
  73. package/dist/CircularView/components/ExportSvgDialog.js.map +0 -1
  74. package/dist/CircularView/components/ImportForm.js.map +0 -1
  75. package/dist/CircularView/components/Ruler.js.map +0 -1
  76. package/dist/CircularView/index.js.map +0 -1
  77. package/dist/CircularView/models/CircularView.js.map +0 -1
  78. package/dist/CircularView/models/slices.js.map +0 -1
  79. package/dist/CircularView/models/viewportVisibleRegion.js.map +0 -1
  80. package/dist/CircularView/svgcomponents/SVGBackground.js.map +0 -1
  81. package/dist/CircularView/svgcomponents/SVGCircularView.js.map +0 -1
  82. package/dist/LaunchCircularView/index.js.map +0 -1
  83. package/dist/index.js.map +0 -1
  84. package/esm/BaseChordDisplay/components/BaseChordDisplay.js.map +0 -1
  85. package/esm/BaseChordDisplay/components/DisplayError.js.map +0 -1
  86. package/esm/BaseChordDisplay/components/Loading.js.map +0 -1
  87. package/esm/BaseChordDisplay/index.js.map +0 -1
  88. package/esm/BaseChordDisplay/models/configSchema.js.map +0 -1
  89. package/esm/BaseChordDisplay/models/model.js.map +0 -1
  90. package/esm/BaseChordDisplay/models/renderReaction.js.map +0 -1
  91. package/esm/CircularView/components/CircularView.js.map +0 -1
  92. package/esm/CircularView/components/Controls.js.map +0 -1
  93. package/esm/CircularView/components/ExportSvgDialog.js.map +0 -1
  94. package/esm/CircularView/components/ImportForm.js.map +0 -1
  95. package/esm/CircularView/components/Ruler.js.map +0 -1
  96. package/esm/CircularView/index.js.map +0 -1
  97. package/esm/CircularView/models/CircularView.js.map +0 -1
  98. package/esm/CircularView/models/slices.js.map +0 -1
  99. package/esm/CircularView/models/viewportVisibleRegion.js.map +0 -1
  100. package/esm/CircularView/svgcomponents/SVGBackground.js.map +0 -1
  101. package/esm/CircularView/svgcomponents/SVGCircularView.js.map +0 -1
  102. package/esm/LaunchCircularView/index.js.map +0 -1
  103. package/esm/index.js.map +0 -1
  104. package/src/BaseChordDisplay/components/BaseChordDisplay.tsx +0 -26
  105. package/src/BaseChordDisplay/components/DisplayError.tsx +0 -47
  106. package/src/BaseChordDisplay/components/Loading.tsx +0 -111
  107. package/src/BaseChordDisplay/index.ts +0 -3
  108. package/src/BaseChordDisplay/models/configSchema.ts +0 -30
  109. package/src/BaseChordDisplay/models/model.tsx +0 -314
  110. package/src/BaseChordDisplay/models/renderReaction.ts +0 -75
  111. package/src/CircularView/components/CircularView.tsx +0 -128
  112. package/src/CircularView/components/Controls.tsx +0 -119
  113. package/src/CircularView/components/ExportSvgDialog.tsx +0 -132
  114. package/src/CircularView/components/ImportForm.tsx +0 -68
  115. package/src/CircularView/components/Ruler.tsx +0 -265
  116. package/src/CircularView/index.ts +0 -16
  117. package/src/CircularView/models/CircularView.ts +0 -620
  118. package/src/CircularView/models/__snapshots__/slices.test.js.snap +0 -91
  119. package/src/CircularView/models/slices.test.js +0 -70
  120. package/src/CircularView/models/slices.ts +0 -101
  121. package/src/CircularView/models/viewportVisibleRegion.test.js +0 -168
  122. package/src/CircularView/models/viewportVisibleRegion.ts +0 -272
  123. package/src/CircularView/svgcomponents/SVGBackground.tsx +0 -21
  124. package/src/CircularView/svgcomponents/SVGCircularView.tsx +0 -58
  125. package/src/LaunchCircularView/index.ts +0 -48
  126. package/src/index.ts +0 -43
@@ -1,111 +0,0 @@
1
- import React, { useState, useEffect } from 'react'
2
- import { makeStyles } from 'tss-react/mui'
3
- import { observer } from 'mobx-react'
4
-
5
- const useStyles = makeStyles()(theme => {
6
- const offset = 2
7
- const duration = 1.4
8
-
9
- const { primary, secondary, tertiary, quaternary } = theme.palette
10
- return {
11
- path: {
12
- strokeDasharray: 187,
13
- strokeDashoffset: 50,
14
- animation: `$dash ${duration}s ease-in-out infinite, $colors ${
15
- duration * 4
16
- }s ease-in-out infinite`,
17
- },
18
- '@keyframes colors': {
19
- '0%': {
20
- stroke: primary.light,
21
- },
22
- '25%': {
23
- stroke: secondary.light,
24
- },
25
- '50%': {
26
- stroke: tertiary.light,
27
- },
28
- '75%': {
29
- stroke: quaternary.light,
30
- },
31
- '100%': {
32
- stroke: primary.light,
33
- },
34
- },
35
-
36
- '@keyframes dash': {
37
- '0%': {
38
- strokeDashoffset: offset,
39
- },
40
- '50%': {
41
- strokeDashoffset: offset / 4,
42
- transform: 'rotate(135deg)',
43
- },
44
- '100%': {
45
- strokeDashoffset: offset,
46
- transform: 'rotate(720deg)',
47
- },
48
- },
49
- }
50
- })
51
-
52
- const Loading = observer(function ({
53
- model: {
54
- renderProps: { radius },
55
- },
56
- }: {
57
- model: { renderProps: { radius: number } }
58
- }) {
59
- const { classes } = useStyles()
60
-
61
- // only show the loading message after 400ms to prevent excessive flickering
62
- const [shown, setShown] = useState(false)
63
- useEffect(() => {
64
- const timeout = setTimeout(() => setShown(true), 400)
65
- return () => clearTimeout(timeout)
66
- })
67
-
68
- return !shown ? null : (
69
- <g>
70
- <defs>
71
- <pattern
72
- id="diagonalHatch"
73
- width="10"
74
- height="10"
75
- patternTransform="rotate(45 0 0)"
76
- patternUnits="userSpaceOnUse"
77
- >
78
- <line
79
- x1="0"
80
- y1="0"
81
- x2="0"
82
- y2="10"
83
- style={{ stroke: 'rgba(255,255,255,0.5)', strokeWidth: 10 }}
84
- />
85
- </pattern>
86
- </defs>
87
- <circle cx="0" cy="0" r={radius} fill="#f1f1f1" />
88
- <circle cx="0" cy="0" r={radius} fill="url(#diagonalHatch)" />
89
- <text
90
- x="0"
91
- y="0"
92
- transform="rotate(90 0 0)"
93
- dominantBaseline="middle"
94
- textAnchor="middle"
95
- >
96
- Loading&hellip;
97
- </text>
98
- <circle
99
- className={classes.path}
100
- fill="none"
101
- strokeWidth="4"
102
- strokeLinecap="round"
103
- cx="0"
104
- cy="0"
105
- r="60"
106
- />
107
- </g>
108
- )
109
- })
110
-
111
- export default Loading
@@ -1,3 +0,0 @@
1
- export { default as BaseChordDisplayComponent } from './components/BaseChordDisplay'
2
- export { BaseChordDisplayModel } from './models/model'
3
- export { baseChordDisplayConfig } from './models/configSchema'
@@ -1,30 +0,0 @@
1
- import { ConfigurationSchema } from '@jbrowse/core/configuration'
2
-
3
- /**
4
- * #config BaseChordDisplay
5
- */
6
- function x() {} // eslint-disable-line @typescript-eslint/no-unused-vars
7
-
8
- const baseChordDisplayConfig = ConfigurationSchema(
9
- 'BaseChordDisplay',
10
- {
11
- /**
12
- * #slot
13
- */
14
- onChordClick: {
15
- type: 'boolean',
16
- description:
17
- 'callback that should be run when a chord in the track is clicked',
18
- defaultValue: false,
19
- contextVariable: ['feature', 'track', 'pluginManager'],
20
- },
21
- },
22
- {
23
- /**
24
- * #identifier
25
- */
26
- explicitIdentifier: 'displayId',
27
- },
28
- )
29
-
30
- export { baseChordDisplayConfig }
@@ -1,314 +0,0 @@
1
- import React from 'react'
2
- import clone from 'clone'
3
- import { getParent, isAlive, types } from 'mobx-state-tree'
4
-
5
- // jbrowse
6
- import { ConfigurationReference, getConf } from '@jbrowse/core/configuration'
7
- import { BaseDisplay } from '@jbrowse/core/pluggableElementTypes/models'
8
- import CircularChordRendererType from '@jbrowse/core/pluggableElementTypes/renderers/CircularChordRendererType'
9
- import RendererType from '@jbrowse/core/pluggableElementTypes/renderers/RendererType'
10
- import {
11
- getContainingView,
12
- getSession,
13
- getEnv,
14
- isFeature,
15
- makeAbortableReaction,
16
- AnyReactComponentType,
17
- Feature,
18
- ReactRendering,
19
- } from '@jbrowse/core/util'
20
- import {
21
- getParentRenderProps,
22
- getRpcSessionId,
23
- getTrackAssemblyNames,
24
- } from '@jbrowse/core/util/tracks'
25
-
26
- // locals
27
- import { renderReactionData, renderReactionEffect } from './renderReaction'
28
- import {
29
- CircularViewModel,
30
- ExportSvgOptions,
31
- } from '../../CircularView/models/CircularView'
32
- import { ThemeOptions } from '@mui/material'
33
- import { baseChordDisplayConfig } from './configSchema'
34
-
35
- /**
36
- * #stateModel BaseChordDisplay
37
- * extends `BaseDisplay`
38
- */
39
- function x() {} // eslint-disable-line @typescript-eslint/no-unused-vars
40
-
41
- export const BaseChordDisplayModel = types
42
- .compose(
43
- 'BaseChordDisplay',
44
- BaseDisplay,
45
- types.model({
46
- /**
47
- * #property
48
- */
49
- bezierRadiusRatio: 0.1,
50
- /**
51
- * #property
52
- */
53
- assemblyName: types.maybe(types.string),
54
- /**
55
- * #property
56
- */
57
- configuration: ConfigurationReference(baseChordDisplayConfig),
58
- }),
59
- )
60
- .volatile(() => ({
61
- // NOTE: all this volatile stuff has to be filled in at once
62
- // so that it stays consistent
63
- filled: false,
64
- reactElement: undefined as React.ReactElement | undefined,
65
- data: undefined,
66
- html: undefined as string | undefined,
67
- message: '',
68
- renderingComponent: undefined as undefined | AnyReactComponentType,
69
- refNameMap: undefined as Record<string, string> | undefined,
70
- }))
71
- .actions(self => {
72
- const { pluginManager } = getEnv(self)
73
- const track = self
74
- return {
75
- /**
76
- * #action
77
- */
78
- onChordClick(feature: Feature) {
79
- getConf(self, 'onChordClick', { feature, track, pluginManager })
80
- },
81
- }
82
- })
83
- .views(self => ({
84
- /**
85
- * #getter
86
- */
87
- get blockDefinitions() {
88
- const view = getContainingView(self) as CircularViewModel
89
- const origSlices = view.staticSlices
90
- if (!self.refNameMap) {
91
- return origSlices
92
- }
93
-
94
- const slices = clone(origSlices)
95
-
96
- slices.forEach(slice => {
97
- const regions = slice.region.elided
98
- ? slice.region.regions
99
- : [slice.region]
100
- regions.forEach(region => {
101
- const renamed = self.refNameMap?.[region.refName]
102
- if (renamed && region.refName !== renamed) {
103
- region.refName = renamed
104
- }
105
- })
106
- })
107
- return slices
108
- },
109
-
110
- /**
111
- * #method
112
- */
113
- renderProps() {
114
- const view = getContainingView(self) as CircularViewModel
115
- return {
116
- ...getParentRenderProps(self),
117
- rpcDriverName: self.rpcDriverName,
118
- displayModel: self,
119
- bezierRadius: view.radiusPx * self.bezierRadiusRatio,
120
- radius: view.radiusPx,
121
- blockDefinitions: this.blockDefinitions,
122
- onChordClick: self.onChordClick,
123
- }
124
- },
125
-
126
- /**
127
- * #getter
128
- * the pluggable element type object for this display's
129
- * renderer
130
- */
131
- get rendererType() {
132
- const display = self
133
- const { pluginManager } = getEnv(self)
134
- const ThisRendererType = pluginManager.getRendererType(
135
- self.rendererTypeName,
136
- )
137
- if (!ThisRendererType) {
138
- throw new Error(`renderer "${display.rendererTypeName}" not found`)
139
- }
140
- if (!ThisRendererType.ReactComponent) {
141
- throw new Error(
142
- `renderer ${display.rendererTypeName} has no ReactComponent, it may not be completely implemented yet`,
143
- )
144
- }
145
- return ThisRendererType
146
- },
147
-
148
- /**
149
- * #method
150
- */
151
- isCompatibleWithRenderer(renderer: RendererType) {
152
- return !!(renderer instanceof CircularChordRendererType)
153
- },
154
-
155
- /**
156
- * #getter
157
- * returns a string feature ID if the globally-selected object
158
- * is probably a feature
159
- */
160
- get selectedFeatureId() {
161
- if (!isAlive(self)) {
162
- return undefined
163
- }
164
- const session = getSession(self)
165
- if (!session) {
166
- return undefined
167
- }
168
- const { selection } = session
169
- // does it quack like a feature?
170
- if (isFeature(selection)) {
171
- return selection.id()
172
- }
173
- return undefined
174
- },
175
- }))
176
- .actions(self => ({
177
- /**
178
- * #action
179
- */
180
- renderStarted() {
181
- self.filled = false
182
- self.message = ''
183
- self.reactElement = undefined
184
- self.data = undefined
185
- self.html = undefined
186
- self.error = undefined
187
- self.renderingComponent = undefined
188
- },
189
- /**
190
- * #action
191
- */
192
- renderSuccess({
193
- message,
194
- data,
195
- reactElement,
196
- html,
197
- renderingComponent,
198
- }: {
199
- message: string
200
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
201
- data: any
202
- html: string
203
- reactElement: React.ReactElement
204
- renderingComponent: AnyReactComponentType
205
- }) {
206
- if (message) {
207
- self.filled = false
208
- self.message = message
209
- self.reactElement = undefined
210
- self.data = undefined
211
- self.html = undefined
212
- self.error = undefined
213
- self.renderingComponent = undefined
214
- } else {
215
- self.filled = true
216
- self.message = ''
217
- self.reactElement = reactElement
218
- self.data = data
219
- self.html = html
220
- self.error = undefined
221
- self.renderingComponent = renderingComponent
222
- }
223
- },
224
- /**
225
- * #action
226
- */
227
- renderError(error: unknown) {
228
- console.error(error)
229
- // the rendering failed for some reason
230
- self.filled = false
231
- self.message = ''
232
- self.reactElement = undefined
233
- self.html = undefined
234
- self.data = undefined
235
- self.error = error
236
- self.renderingComponent = undefined
237
- },
238
-
239
- /**
240
- * #action
241
- */
242
- setRefNameMap(refNameMap: Record<string, string>) {
243
- self.refNameMap = refNameMap
244
- },
245
- }))
246
- .actions(self => ({
247
- afterAttach() {
248
- makeAbortableReaction(
249
- self,
250
- renderReactionData,
251
-
252
- // @ts-expect-error
253
- renderReactionEffect,
254
- {
255
- name: `${self.type} ${self.id} rendering`,
256
- // delay: self.renderDelay || 300,
257
- fireImmediately: true,
258
- },
259
- self.renderStarted,
260
- self.renderSuccess,
261
- self.renderError,
262
- )
263
-
264
- makeAbortableReaction(
265
- self,
266
- () => ({
267
- assemblyNames: getTrackAssemblyNames(self.parentTrack),
268
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
269
- adapter: getConf(getParent<any>(self, 2), 'adapter'),
270
- assemblyManager: getSession(self).assemblyManager,
271
- }),
272
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
273
- async ({ assemblyNames, adapter, assemblyManager }: any, signal) => {
274
- return assemblyManager.getRefNameMapForAdapter(
275
- adapter,
276
- assemblyNames[0],
277
- { signal, sessionId: getRpcSessionId(self) },
278
- )
279
- },
280
- {
281
- name: `${self.type} ${self.id} getting refNames`,
282
- fireImmediately: true,
283
- },
284
- () => {},
285
- refNameMap => self.setRefNameMap(refNameMap),
286
- error => {
287
- console.error(error)
288
- self.setError(error)
289
- },
290
- )
291
- },
292
- }))
293
- .views(self => ({
294
- /**
295
- * #method
296
- */
297
- async renderSvg(
298
- opts: ExportSvgOptions & {
299
- theme: ThemeOptions
300
- },
301
- ) {
302
- const data = renderReactionData(self)
303
- const rendering = await renderReactionEffect(
304
- {
305
- ...data,
306
- exportSVG: opts,
307
- theme: opts.theme || data.renderProps.theme,
308
- },
309
- undefined,
310
- self,
311
- )
312
- return <ReactRendering rendering={rendering} />
313
- },
314
- }))
@@ -1,75 +0,0 @@
1
- import clone from 'clone'
2
- import { getRpcSessionId } from '@jbrowse/core/util/tracks'
3
- import { getSession, getContainingView } from '@jbrowse/core/util'
4
-
5
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
6
- export function renderReactionData(self: any) {
7
- const view = getContainingView(self)
8
- const { rendererType } = self
9
- const { rpcManager } = getSession(view)
10
-
11
- return {
12
- rendererType,
13
- rpcManager,
14
- renderProps: self.renderProps(),
15
- renderArgs: {
16
- assemblyName: view.displayedRegions[0]?.assemblyName,
17
- adapterConfig: clone(self.adapterConfig),
18
- rendererType: rendererType.name,
19
- regions: clone(view.displayedRegions),
20
- blockDefinitions: self.blockDefinitions,
21
- sessionId: getRpcSessionId(self),
22
- timeout: 1000000,
23
- },
24
- }
25
- }
26
-
27
- export async function renderReactionEffect(
28
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
29
- props: any,
30
- signal: AbortSignal | undefined,
31
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
32
- self: any,
33
- ) {
34
- if (!props) {
35
- throw new Error('cannot render with no props')
36
- }
37
-
38
- const {
39
- rendererType,
40
- rpcManager,
41
- cannotBeRenderedReason,
42
- renderArgs,
43
- renderProps,
44
- exportSVG,
45
- } = props
46
-
47
- if (cannotBeRenderedReason) {
48
- return { message: cannotBeRenderedReason }
49
- }
50
-
51
- // don't try to render 0 or NaN radius or no regions
52
- if (!renderProps.radius || !renderArgs.regions?.length) {
53
- return { message: 'Skipping render' }
54
- }
55
-
56
- // check renderertype compatibility
57
- if (!self.isCompatibleWithRenderer(rendererType)) {
58
- throw new Error(
59
- `renderer ${rendererType.name} is not compatible with this display type`,
60
- )
61
- }
62
-
63
- const { html, ...data } = await rendererType.renderInClient(rpcManager, {
64
- ...renderArgs,
65
- ...renderProps,
66
- exportSVG,
67
- })
68
-
69
- return {
70
- html,
71
- data,
72
- reactElement: data.reactElement,
73
- renderingComponent: rendererType.ReactComponent,
74
- }
75
- }
@@ -1,128 +0,0 @@
1
- import React from 'react'
2
- import { observer } from 'mobx-react'
3
- import { ResizeHandle } from '@jbrowse/core/ui'
4
- import { assembleLocString } from '@jbrowse/core/util'
5
- import { makeStyles } from 'tss-react/mui'
6
-
7
- // locals
8
- import Ruler from './Ruler'
9
- import Controls from './Controls'
10
- import ImportForm from './ImportForm'
11
- import { CircularViewModel } from '../models/CircularView'
12
-
13
- const dragHandleHeight = 3
14
-
15
- const useStyles = makeStyles()(theme => ({
16
- root: {
17
- position: 'relative',
18
- marginBottom: theme.spacing(1),
19
- overflow: 'hidden',
20
- },
21
- scroller: {
22
- overflow: 'auto',
23
- },
24
- }))
25
-
26
- const Slices = observer(({ model }: { model: CircularViewModel }) => {
27
- return (
28
- <>
29
- {model.staticSlices.map(slice => (
30
- <Ruler
31
- key={assembleLocString(
32
- slice.region.elided ? slice.region.regions[0] : slice.region,
33
- )}
34
- model={model}
35
- slice={slice}
36
- />
37
- ))}
38
- {model.tracks.map(track => {
39
- const display = track.displays[0]
40
- return (
41
- <display.RenderingComponent
42
- key={display.id}
43
- display={display}
44
- view={model}
45
- />
46
- )
47
- })}
48
- </>
49
- )
50
- })
51
-
52
- const CircularView = observer(({ model }: { model: CircularViewModel }) => {
53
- const initialized =
54
- !!model.displayedRegions.length &&
55
- !!model.figureWidth &&
56
- !!model.figureHeight &&
57
- model.initialized
58
-
59
- const showImportForm = !initialized && !model.disableImportForm
60
- const showFigure = initialized && !showImportForm
61
-
62
- return (
63
- <>
64
- {showImportForm || model.error ? (
65
- <ImportForm model={model} />
66
- ) : showFigure ? (
67
- <CircularViewLoaded model={model} />
68
- ) : null}
69
- </>
70
- )
71
- })
72
-
73
- const CircularViewLoaded = observer(function ({
74
- model,
75
- }: {
76
- model: CircularViewModel
77
- }) {
78
- const {
79
- width,
80
- height,
81
- id,
82
- offsetRadians,
83
- centerXY,
84
- figureWidth,
85
- figureHeight,
86
- hideVerticalResizeHandle,
87
- } = model
88
- const { classes } = useStyles()
89
- return (
90
- <div className={classes.root} style={{ width, height }} data-testid={id}>
91
- <div className={classes.scroller} style={{ width, height }}>
92
- <svg
93
- style={{
94
- transform: `rotate(${offsetRadians}rad)`,
95
- transition: 'transform 0.5s',
96
- transformOrigin: centerXY.map(x => `${x}px`).join(' '),
97
- position: 'absolute',
98
- left: 0,
99
- top: 0,
100
- }}
101
- width={figureWidth}
102
- height={figureHeight}
103
- >
104
- <g transform={`translate(${centerXY})`}>
105
- <Slices model={model} />
106
- </g>
107
- </svg>
108
- </div>
109
- <Controls model={model} />
110
- {hideVerticalResizeHandle ? null : (
111
- <ResizeHandle
112
- onDrag={model.resizeHeight}
113
- style={{
114
- height: dragHandleHeight,
115
- position: 'absolute',
116
- bottom: 0,
117
- left: 0,
118
- background: '#ccc',
119
- boxSizing: 'border-box',
120
- borderTop: '1px solid #fafafa',
121
- }}
122
- />
123
- )}
124
- </div>
125
- )
126
- })
127
-
128
- export default CircularView