@jbrowse/plugin-alignments 2.1.7 → 2.2.1

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 (226) hide show
  1. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +12 -13
  2. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js.map +1 -1
  3. package/dist/AlignmentsTrack/index.d.ts +1 -1
  4. package/dist/AlignmentsTrack/index.js +16 -6
  5. package/dist/AlignmentsTrack/index.js.map +1 -1
  6. package/dist/BamAdapter/BamAdapter.d.ts +7 -3
  7. package/dist/BamAdapter/BamAdapter.js +36 -31
  8. package/dist/BamAdapter/BamAdapter.js.map +1 -1
  9. package/dist/BamAdapter/BamSlightlyLazyFeature.js +1 -0
  10. package/dist/BamAdapter/BamSlightlyLazyFeature.js.map +1 -1
  11. package/dist/BamAdapter/MismatchParser.d.ts +2 -2
  12. package/dist/BamAdapter/MismatchParser.js +4 -7
  13. package/dist/BamAdapter/MismatchParser.js.map +1 -1
  14. package/dist/BamAdapter/configSchema.d.ts +2 -2
  15. package/dist/BamAdapter/configSchema.js +27 -2
  16. package/dist/BamAdapter/configSchema.js.map +1 -1
  17. package/dist/BamAdapter/index.js +7 -5
  18. package/dist/BamAdapter/index.js.map +1 -1
  19. package/dist/CramAdapter/CramAdapter.d.ts +13 -7
  20. package/dist/CramAdapter/CramAdapter.js +56 -61
  21. package/dist/CramAdapter/CramAdapter.js.map +1 -1
  22. package/dist/CramAdapter/CramSlightlyLazyFeature.d.ts +15 -23
  23. package/dist/CramAdapter/CramSlightlyLazyFeature.js +10 -217
  24. package/dist/CramAdapter/CramSlightlyLazyFeature.js.map +1 -1
  25. package/dist/CramAdapter/CramTestAdapters.d.ts +1 -1
  26. package/dist/CramAdapter/CramTestAdapters.js +1 -1
  27. package/dist/CramAdapter/CramTestAdapters.js.map +1 -1
  28. package/dist/CramAdapter/configSchema.d.ts +2 -3
  29. package/dist/CramAdapter/configSchema.js +44 -22
  30. package/dist/CramAdapter/configSchema.js.map +1 -1
  31. package/dist/CramAdapter/index.js +7 -5
  32. package/dist/CramAdapter/index.js.map +1 -1
  33. package/dist/CramAdapter/util.d.ts +18 -0
  34. package/dist/CramAdapter/util.js +241 -0
  35. package/dist/CramAdapter/util.js.map +1 -0
  36. package/dist/HtsgetBamAdapter/HtsgetBamAdapter.d.ts +5 -2
  37. package/dist/HtsgetBamAdapter/HtsgetBamAdapter.js +15 -20
  38. package/dist/HtsgetBamAdapter/HtsgetBamAdapter.js.map +1 -1
  39. package/dist/HtsgetBamAdapter/configSchema.d.ts +2 -2
  40. package/dist/HtsgetBamAdapter/configSchema.js +20 -3
  41. package/dist/HtsgetBamAdapter/configSchema.js.map +1 -1
  42. package/dist/LinearAlignmentsDisplay/components/AlignmentsDisplay.js +1 -1
  43. package/dist/LinearAlignmentsDisplay/components/AlignmentsDisplay.js.map +1 -1
  44. package/dist/LinearAlignmentsDisplay/models/configSchema.d.ts +2 -2
  45. package/dist/LinearAlignmentsDisplay/models/configSchema.js +23 -6
  46. package/dist/LinearAlignmentsDisplay/models/configSchema.js.map +1 -1
  47. package/dist/LinearAlignmentsDisplay/models/model.d.ts +77 -10
  48. package/dist/LinearAlignmentsDisplay/models/model.js +102 -9
  49. package/dist/LinearAlignmentsDisplay/models/model.js.map +1 -1
  50. package/dist/LinearPileupDisplay/configSchema.d.ts +4 -4
  51. package/dist/LinearPileupDisplay/configSchema.js +22 -5
  52. package/dist/LinearPileupDisplay/configSchema.js.map +1 -1
  53. package/dist/LinearPileupDisplay/index.d.ts +3 -0
  54. package/dist/LinearPileupDisplay/index.js +3 -0
  55. package/dist/LinearPileupDisplay/index.js.map +1 -1
  56. package/dist/LinearPileupDisplay/model.d.ts +100 -6
  57. package/dist/LinearPileupDisplay/model.js +611 -503
  58. package/dist/LinearPileupDisplay/model.js.map +1 -1
  59. package/dist/LinearSNPCoverageDisplay/components/Tooltip.d.ts +1 -1
  60. package/dist/LinearSNPCoverageDisplay/models/configSchema.js +33 -4
  61. package/dist/LinearSNPCoverageDisplay/models/configSchema.js.map +1 -1
  62. package/dist/LinearSNPCoverageDisplay/models/model.d.ts +87 -4
  63. package/dist/LinearSNPCoverageDisplay/models/model.js +240 -159
  64. package/dist/LinearSNPCoverageDisplay/models/model.js.map +1 -1
  65. package/dist/PileupRPC/rpcMethods.d.ts +1 -1
  66. package/dist/PileupRPC/rpcMethods.js +12 -7
  67. package/dist/PileupRPC/rpcMethods.js.map +1 -1
  68. package/dist/PileupRenderer/PileupLayoutSession.d.ts +1 -1
  69. package/dist/PileupRenderer/PileupRenderer.d.ts +1 -1
  70. package/dist/PileupRenderer/PileupRenderer.js +37 -34
  71. package/dist/PileupRenderer/PileupRenderer.js.map +1 -1
  72. package/dist/PileupRenderer/configSchema.d.ts +2 -2
  73. package/dist/PileupRenderer/configSchema.js +37 -2
  74. package/dist/PileupRenderer/configSchema.js.map +1 -1
  75. package/dist/PileupRenderer/index.js +8 -6
  76. package/dist/PileupRenderer/index.js.map +1 -1
  77. package/dist/SNPCoverageAdapter/configSchema.d.ts +2 -3
  78. package/dist/SNPCoverageAdapter/configSchema.js +15 -4
  79. package/dist/SNPCoverageAdapter/configSchema.js.map +1 -1
  80. package/dist/SNPCoverageAdapter/index.d.ts +1 -2
  81. package/dist/SNPCoverageAdapter/index.js +17 -14
  82. package/dist/SNPCoverageAdapter/index.js.map +1 -1
  83. package/dist/SNPCoverageRenderer/configSchema.d.ts +2 -2
  84. package/dist/SNPCoverageRenderer/configSchema.js +21 -1
  85. package/dist/SNPCoverageRenderer/configSchema.js.map +1 -1
  86. package/dist/SNPCoverageRenderer/index.d.ts +0 -1
  87. package/dist/SNPCoverageRenderer/index.js +1 -4
  88. package/dist/SNPCoverageRenderer/index.js.map +1 -1
  89. package/dist/index.d.ts +3 -2
  90. package/dist/index.js +4 -2
  91. package/dist/index.js.map +1 -1
  92. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +12 -13
  93. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js.map +1 -1
  94. package/esm/AlignmentsTrack/index.d.ts +1 -1
  95. package/esm/AlignmentsTrack/index.js +16 -6
  96. package/esm/AlignmentsTrack/index.js.map +1 -1
  97. package/esm/BamAdapter/BamAdapter.d.ts +7 -3
  98. package/esm/BamAdapter/BamAdapter.js +36 -31
  99. package/esm/BamAdapter/BamAdapter.js.map +1 -1
  100. package/esm/BamAdapter/BamSlightlyLazyFeature.js +1 -0
  101. package/esm/BamAdapter/BamSlightlyLazyFeature.js.map +1 -1
  102. package/esm/BamAdapter/MismatchParser.d.ts +2 -2
  103. package/esm/BamAdapter/MismatchParser.js +4 -7
  104. package/esm/BamAdapter/MismatchParser.js.map +1 -1
  105. package/esm/BamAdapter/configSchema.d.ts +2 -2
  106. package/esm/BamAdapter/configSchema.js +27 -2
  107. package/esm/BamAdapter/configSchema.js.map +1 -1
  108. package/esm/BamAdapter/index.js +7 -5
  109. package/esm/BamAdapter/index.js.map +1 -1
  110. package/esm/CramAdapter/CramAdapter.d.ts +13 -7
  111. package/esm/CramAdapter/CramAdapter.js +56 -61
  112. package/esm/CramAdapter/CramAdapter.js.map +1 -1
  113. package/esm/CramAdapter/CramSlightlyLazyFeature.d.ts +15 -23
  114. package/esm/CramAdapter/CramSlightlyLazyFeature.js +10 -217
  115. package/esm/CramAdapter/CramSlightlyLazyFeature.js.map +1 -1
  116. package/esm/CramAdapter/CramTestAdapters.d.ts +1 -1
  117. package/esm/CramAdapter/CramTestAdapters.js +1 -1
  118. package/esm/CramAdapter/CramTestAdapters.js.map +1 -1
  119. package/esm/CramAdapter/configSchema.d.ts +2 -3
  120. package/esm/CramAdapter/configSchema.js +44 -22
  121. package/esm/CramAdapter/configSchema.js.map +1 -1
  122. package/esm/CramAdapter/index.js +8 -6
  123. package/esm/CramAdapter/index.js.map +1 -1
  124. package/esm/CramAdapter/util.d.ts +18 -0
  125. package/esm/CramAdapter/util.js +236 -0
  126. package/esm/CramAdapter/util.js.map +1 -0
  127. package/esm/HtsgetBamAdapter/HtsgetBamAdapter.d.ts +5 -2
  128. package/esm/HtsgetBamAdapter/HtsgetBamAdapter.js +15 -20
  129. package/esm/HtsgetBamAdapter/HtsgetBamAdapter.js.map +1 -1
  130. package/esm/HtsgetBamAdapter/configSchema.d.ts +2 -2
  131. package/esm/HtsgetBamAdapter/configSchema.js +20 -3
  132. package/esm/HtsgetBamAdapter/configSchema.js.map +1 -1
  133. package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.js +1 -1
  134. package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.js.map +1 -1
  135. package/esm/LinearAlignmentsDisplay/models/configSchema.d.ts +2 -2
  136. package/esm/LinearAlignmentsDisplay/models/configSchema.js +23 -6
  137. package/esm/LinearAlignmentsDisplay/models/configSchema.js.map +1 -1
  138. package/esm/LinearAlignmentsDisplay/models/model.d.ts +77 -10
  139. package/esm/LinearAlignmentsDisplay/models/model.js +102 -9
  140. package/esm/LinearAlignmentsDisplay/models/model.js.map +1 -1
  141. package/esm/LinearPileupDisplay/configSchema.d.ts +4 -4
  142. package/esm/LinearPileupDisplay/configSchema.js +22 -5
  143. package/esm/LinearPileupDisplay/configSchema.js.map +1 -1
  144. package/esm/LinearPileupDisplay/index.d.ts +3 -0
  145. package/esm/LinearPileupDisplay/index.js +1 -0
  146. package/esm/LinearPileupDisplay/index.js.map +1 -1
  147. package/esm/LinearPileupDisplay/model.d.ts +100 -6
  148. package/esm/LinearPileupDisplay/model.js +611 -503
  149. package/esm/LinearPileupDisplay/model.js.map +1 -1
  150. package/esm/LinearSNPCoverageDisplay/components/Tooltip.d.ts +1 -1
  151. package/esm/LinearSNPCoverageDisplay/models/configSchema.js +33 -4
  152. package/esm/LinearSNPCoverageDisplay/models/configSchema.js.map +1 -1
  153. package/esm/LinearSNPCoverageDisplay/models/model.d.ts +87 -4
  154. package/esm/LinearSNPCoverageDisplay/models/model.js +240 -159
  155. package/esm/LinearSNPCoverageDisplay/models/model.js.map +1 -1
  156. package/esm/PileupRPC/rpcMethods.d.ts +1 -1
  157. package/esm/PileupRPC/rpcMethods.js +12 -7
  158. package/esm/PileupRPC/rpcMethods.js.map +1 -1
  159. package/esm/PileupRenderer/PileupLayoutSession.d.ts +1 -1
  160. package/esm/PileupRenderer/PileupRenderer.d.ts +1 -1
  161. package/esm/PileupRenderer/PileupRenderer.js +37 -34
  162. package/esm/PileupRenderer/PileupRenderer.js.map +1 -1
  163. package/esm/PileupRenderer/configSchema.d.ts +2 -2
  164. package/esm/PileupRenderer/configSchema.js +37 -2
  165. package/esm/PileupRenderer/configSchema.js.map +1 -1
  166. package/esm/PileupRenderer/index.js +8 -6
  167. package/esm/PileupRenderer/index.js.map +1 -1
  168. package/esm/SNPCoverageAdapter/configSchema.d.ts +2 -3
  169. package/esm/SNPCoverageAdapter/configSchema.js +15 -4
  170. package/esm/SNPCoverageAdapter/configSchema.js.map +1 -1
  171. package/esm/SNPCoverageAdapter/index.d.ts +1 -2
  172. package/esm/SNPCoverageAdapter/index.js +17 -15
  173. package/esm/SNPCoverageAdapter/index.js.map +1 -1
  174. package/esm/SNPCoverageRenderer/configSchema.d.ts +2 -2
  175. package/esm/SNPCoverageRenderer/configSchema.js +21 -1
  176. package/esm/SNPCoverageRenderer/configSchema.js.map +1 -1
  177. package/esm/SNPCoverageRenderer/index.d.ts +0 -1
  178. package/esm/SNPCoverageRenderer/index.js +1 -3
  179. package/esm/SNPCoverageRenderer/index.js.map +1 -1
  180. package/esm/index.d.ts +3 -2
  181. package/esm/index.js +2 -2
  182. package/esm/index.js.map +1 -1
  183. package/package.json +4 -3
  184. package/src/AlignmentsFeatureDetail/AlignmentsFeatureDetail.tsx +17 -16
  185. package/src/AlignmentsFeatureDetail/__snapshots__/index.test.js.snap +41 -513
  186. package/src/AlignmentsFeatureDetail/index.test.js +6 -4
  187. package/src/AlignmentsTrack/index.ts +18 -12
  188. package/src/BamAdapter/BamAdapter.ts +42 -41
  189. package/src/BamAdapter/BamSlightlyLazyFeature.ts +2 -1
  190. package/src/BamAdapter/MismatchParser.test.ts +21 -12
  191. package/src/BamAdapter/MismatchParser.ts +7 -10
  192. package/src/BamAdapter/__snapshots__/BamAdapter.test.ts.snap +135 -135
  193. package/src/BamAdapter/configSchema.ts +57 -29
  194. package/src/BamAdapter/index.ts +7 -8
  195. package/src/CombinationTest.test.ts +107 -0
  196. package/src/CramAdapter/CramAdapter.test.ts +1 -2
  197. package/src/CramAdapter/CramAdapter.ts +83 -84
  198. package/src/CramAdapter/CramSlightlyLazyFeature.ts +18 -218
  199. package/src/CramAdapter/CramTestAdapters.ts +1 -1
  200. package/src/CramAdapter/__snapshots__/CramAdapter.test.ts.snap +31 -31
  201. package/src/CramAdapter/__snapshots__/util.test.ts.snap +14 -0
  202. package/src/CramAdapter/configSchema.ts +54 -30
  203. package/src/CramAdapter/index.ts +8 -9
  204. package/src/CramAdapter/util.test.ts +26 -0
  205. package/src/CramAdapter/util.ts +251 -0
  206. package/src/HtsgetBamAdapter/HtsgetBamAdapter.ts +14 -21
  207. package/src/HtsgetBamAdapter/configSchema.ts +36 -19
  208. package/src/LinearAlignmentsDisplay/components/AlignmentsDisplay.tsx +3 -1
  209. package/src/LinearAlignmentsDisplay/models/configSchema.ts +23 -10
  210. package/src/LinearAlignmentsDisplay/models/model.tsx +107 -11
  211. package/src/LinearPileupDisplay/configSchema.ts +25 -9
  212. package/src/LinearPileupDisplay/index.ts +5 -0
  213. package/src/LinearPileupDisplay/model.ts +151 -34
  214. package/src/LinearSNPCoverageDisplay/models/configSchema.ts +36 -9
  215. package/src/LinearSNPCoverageDisplay/models/model.ts +83 -4
  216. package/src/PileupRPC/rpcMethods.ts +15 -20
  217. package/src/PileupRenderer/{PileupRenderer.tsx → PileupRenderer.ts} +53 -63
  218. package/src/PileupRenderer/configSchema.ts +39 -2
  219. package/src/PileupRenderer/index.ts +8 -9
  220. package/src/SNPCoverageAdapter/configSchema.ts +21 -12
  221. package/src/SNPCoverageAdapter/index.ts +17 -18
  222. package/src/SNPCoverageRenderer/configSchema.ts +23 -1
  223. package/src/SNPCoverageRenderer/index.ts +1 -8
  224. package/src/__snapshots__/index.test.ts.snap +1 -1
  225. package/src/index.ts +11 -4
  226. package/src/declare.d.ts +0 -1
@@ -55,548 +55,656 @@ const rendererTypes = new Map([
55
55
  ['pileup', 'PileupRenderer'],
56
56
  ['svg', 'SvgFeatureRenderer'],
57
57
  ]);
58
- const stateModelFactory = (configSchema) => mobx_state_tree_1.types
59
- .compose('LinearPileupDisplay', plugin_linear_genome_view_1.BaseLinearDisplay, mobx_state_tree_1.types.model({
60
- type: mobx_state_tree_1.types.literal('LinearPileupDisplay'),
61
- configuration: (0, configuration_1.ConfigurationReference)(configSchema),
62
- showSoftClipping: false,
63
- featureHeight: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.number),
64
- noSpacing: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.boolean),
65
- fadeLikelihood: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.boolean),
66
- trackMaxHeight: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.number),
67
- mismatchAlpha: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.boolean),
68
- sortedBy: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.model({
69
- type: mobx_state_tree_1.types.string,
70
- pos: mobx_state_tree_1.types.number,
71
- tag: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.string),
72
- refName: mobx_state_tree_1.types.string,
73
- assemblyName: mobx_state_tree_1.types.string,
74
- })),
75
- colorBy: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.model({
76
- type: mobx_state_tree_1.types.string,
77
- tag: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.string),
78
- extra: mobx_state_tree_1.types.frozen(),
79
- })),
80
- filterBy: mobx_state_tree_1.types.optional(mobx_state_tree_1.types.model({
81
- flagInclude: mobx_state_tree_1.types.optional(mobx_state_tree_1.types.number, 0),
82
- flagExclude: mobx_state_tree_1.types.optional(mobx_state_tree_1.types.number, 1540),
83
- readName: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.string),
84
- tagFilter: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.model({ tag: mobx_state_tree_1.types.string, value: mobx_state_tree_1.types.string })),
85
- }), {}),
86
- }))
87
- .volatile(() => ({
88
- colorTagMap: mobx_1.observable.map({}),
89
- modificationTagMap: mobx_1.observable.map({}),
90
- featureUnderMouseVolatile: undefined,
91
- ready: false,
92
- }))
93
- .actions(self => ({
94
- setReady(flag) {
95
- self.ready = flag;
96
- },
97
- setMaxHeight(n) {
98
- self.trackMaxHeight = n;
99
- },
100
- setFeatureHeight(n) {
101
- self.featureHeight = n;
102
- },
103
- setNoSpacing(flag) {
104
- self.noSpacing = flag;
105
- },
106
- setColorScheme(colorScheme) {
107
- self.colorTagMap = mobx_1.observable.map({}); // clear existing mapping
108
- self.colorBy = (0, mobx_state_tree_1.cast)(colorScheme);
109
- self.ready = false;
110
- },
111
- updateModificationColorMap(uniqueModifications) {
112
- const colorPalette = ['red', 'blue', 'green', 'orange', 'purple'];
113
- uniqueModifications.forEach(value => {
114
- if (!self.modificationTagMap.has(value)) {
115
- const totalKeys = [...self.modificationTagMap.keys()].length;
116
- const newColor = colorPalette[totalKeys];
117
- self.modificationTagMap.set(value, newColor);
118
- }
119
- });
120
- },
121
- updateColorTagMap(uniqueTag) {
122
- // pale color scheme
123
- // https://cran.r-project.org/web/packages/khroma/vignettes/tol.html
124
- // e.g. "tol_light"
125
- const colorPalette = [
126
- '#BBCCEE',
127
- 'pink',
128
- '#CCDDAA',
129
- '#EEEEBB',
130
- '#FFCCCC',
131
- 'lightblue',
132
- 'lightgreen',
133
- 'tan',
134
- '#CCEEFF',
135
- 'lightsalmon',
136
- ];
137
- uniqueTag.forEach(value => {
138
- if (!self.colorTagMap.has(value)) {
139
- const totalKeys = [...self.colorTagMap.keys()].length;
140
- const newColor = colorPalette[totalKeys];
141
- self.colorTagMap.set(value, newColor);
142
- }
143
- });
144
- },
145
- setFeatureUnderMouse(feat) {
146
- self.featureUnderMouseVolatile = feat;
147
- },
148
- }))
149
- .actions(self => ({
150
- afterAttach() {
151
- (0, mobx_state_tree_1.addDisposer)(self, (0, mobx_1.autorun)(async () => {
152
- try {
153
- const { rpcManager } = (0, util_1.getSession)(self);
154
- const view = (0, util_1.getContainingView)(self);
155
- const { sortedBy, colorBy, parentTrack, adapterConfig, rendererType, } = self;
156
- if (!view.initialized ||
157
- !self.estimatedStatsReady ||
158
- self.regionTooLarge) {
159
- return;
160
- }
161
- const { staticBlocks, bpPerPx } = view;
162
- // continually generate the vc pairing, set and rerender if any
163
- // new values seen
164
- if (colorBy === null || colorBy === void 0 ? void 0 : colorBy.tag) {
165
- self.updateColorTagMap(await (0, shared_1.getUniqueTagValues)(self, colorBy, staticBlocks));
166
- }
167
- if ((colorBy === null || colorBy === void 0 ? void 0 : colorBy.type) === 'modifications') {
168
- const adapter = (0, configuration_1.getConf)(parentTrack, ['adapter']);
169
- self.updateModificationColorMap(await (0, shared_1.getUniqueModificationValues)(self, adapter, colorBy, staticBlocks));
170
- }
171
- if (sortedBy) {
172
- const { pos, refName, assemblyName } = sortedBy;
173
- // render just the sorted region first
174
- // @ts-ignore
175
- await self.rendererType.renderInClient(rpcManager, {
176
- assemblyName,
177
- regions: [
178
- {
179
- start: pos,
180
- end: pos + 1,
181
- refName,
182
- assemblyName,
183
- },
184
- ],
185
- adapterConfig: adapterConfig,
186
- rendererType: rendererType.name,
187
- sessionId: (0, tracks_1.getRpcSessionId)(self),
188
- layoutId: view.id,
189
- timeout: 1000000,
190
- ...self.renderProps(),
191
- });
192
- self.setReady(true);
193
- self.setCurrBpPerPx(bpPerPx);
58
+ /**
59
+ * #stateModel LinearPileupDisplay
60
+ * extends `BaseLinearDisplay`
61
+ */
62
+ function stateModelFactory(configSchema) {
63
+ return mobx_state_tree_1.types
64
+ .compose('LinearPileupDisplay', plugin_linear_genome_view_1.BaseLinearDisplay, mobx_state_tree_1.types.model({
65
+ /**
66
+ * #property
67
+ */
68
+ type: mobx_state_tree_1.types.literal('LinearPileupDisplay'),
69
+ /**
70
+ * #property
71
+ */
72
+ configuration: (0, configuration_1.ConfigurationReference)(configSchema),
73
+ /**
74
+ * #property
75
+ */
76
+ showSoftClipping: false,
77
+ /**
78
+ * #property
79
+ */
80
+ featureHeight: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.number),
81
+ /**
82
+ * #property
83
+ */
84
+ noSpacing: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.boolean),
85
+ /**
86
+ * #property
87
+ */
88
+ fadeLikelihood: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.boolean),
89
+ /**
90
+ * #property
91
+ */
92
+ trackMaxHeight: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.number),
93
+ /**
94
+ * #property
95
+ */
96
+ mismatchAlpha: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.boolean),
97
+ /**
98
+ * #property
99
+ */
100
+ sortedBy: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.model({
101
+ type: mobx_state_tree_1.types.string,
102
+ pos: mobx_state_tree_1.types.number,
103
+ tag: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.string),
104
+ refName: mobx_state_tree_1.types.string,
105
+ assemblyName: mobx_state_tree_1.types.string,
106
+ })),
107
+ /**
108
+ * #property
109
+ */
110
+ colorBy: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.model({
111
+ type: mobx_state_tree_1.types.string,
112
+ tag: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.string),
113
+ extra: mobx_state_tree_1.types.frozen(),
114
+ })),
115
+ /**
116
+ * #property
117
+ */
118
+ filterBy: mobx_state_tree_1.types.optional(mobx_state_tree_1.types.model({
119
+ flagInclude: mobx_state_tree_1.types.optional(mobx_state_tree_1.types.number, 0),
120
+ flagExclude: mobx_state_tree_1.types.optional(mobx_state_tree_1.types.number, 1540),
121
+ readName: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.string),
122
+ tagFilter: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.model({ tag: mobx_state_tree_1.types.string, value: mobx_state_tree_1.types.string })),
123
+ }), {}),
124
+ }))
125
+ .volatile(() => ({
126
+ colorTagMap: mobx_1.observable.map({}),
127
+ modificationTagMap: mobx_1.observable.map({}),
128
+ featureUnderMouseVolatile: undefined,
129
+ currSortBpPerPx: 0,
130
+ ready: false,
131
+ }))
132
+ .actions(self => ({
133
+ /**
134
+ * #action
135
+ */
136
+ setReady(flag) {
137
+ self.ready = flag;
138
+ },
139
+ /**
140
+ * #action
141
+ */
142
+ setCurrSortBpPerPx(n) {
143
+ self.currSortBpPerPx = n;
144
+ },
145
+ /**
146
+ * #action
147
+ */
148
+ setMaxHeight(n) {
149
+ self.trackMaxHeight = n;
150
+ },
151
+ /**
152
+ * #action
153
+ */
154
+ setFeatureHeight(n) {
155
+ self.featureHeight = n;
156
+ },
157
+ /**
158
+ * #action
159
+ */
160
+ setNoSpacing(flag) {
161
+ self.noSpacing = flag;
162
+ },
163
+ /**
164
+ * #action
165
+ */
166
+ setColorScheme(colorScheme) {
167
+ self.colorTagMap = mobx_1.observable.map({}); // clear existing mapping
168
+ self.colorBy = (0, mobx_state_tree_1.cast)(colorScheme);
169
+ self.ready = false;
170
+ },
171
+ /**
172
+ * #action
173
+ */
174
+ updateModificationColorMap(uniqueModifications) {
175
+ const colorPalette = ['red', 'blue', 'green', 'orange', 'purple'];
176
+ uniqueModifications.forEach(value => {
177
+ if (!self.modificationTagMap.has(value)) {
178
+ const totalKeys = [...self.modificationTagMap.keys()].length;
179
+ const newColor = colorPalette[totalKeys];
180
+ self.modificationTagMap.set(value, newColor);
194
181
  }
195
- else {
196
- self.setReady(true);
182
+ });
183
+ },
184
+ /**
185
+ * #action
186
+ */
187
+ updateColorTagMap(uniqueTag) {
188
+ // pale color scheme
189
+ // https://cran.r-project.org/web/packages/khroma/vignettes/tol.html
190
+ // e.g. "tol_light"
191
+ const colorPalette = [
192
+ '#BBCCEE',
193
+ 'pink',
194
+ '#CCDDAA',
195
+ '#EEEEBB',
196
+ '#FFCCCC',
197
+ 'lightblue',
198
+ 'lightgreen',
199
+ 'tan',
200
+ '#CCEEFF',
201
+ 'lightsalmon',
202
+ ];
203
+ uniqueTag.forEach(value => {
204
+ if (!self.colorTagMap.has(value)) {
205
+ const totalKeys = [...self.colorTagMap.keys()].length;
206
+ const newColor = colorPalette[totalKeys];
207
+ self.colorTagMap.set(value, newColor);
197
208
  }
198
- }
199
- catch (e) {
200
- console.error(e);
201
- self.setError(e);
202
- }
203
- }, { delay: 1000 }));
204
- // autorun synchronizes featureUnderMouse with featureIdUnderMouse
205
- (0, mobx_state_tree_1.addDisposer)(self, (0, mobx_1.autorun)(async () => {
206
- var _a;
207
- const session = (0, util_1.getSession)(self);
208
- try {
209
- const featureId = self.featureIdUnderMouse;
210
- if (((_a = self.featureUnderMouse) === null || _a === void 0 ? void 0 : _a.id()) !== featureId) {
211
- if (!featureId) {
212
- self.setFeatureUnderMouse(undefined);
209
+ });
210
+ },
211
+ /**
212
+ * #action
213
+ */
214
+ setFeatureUnderMouse(feat) {
215
+ self.featureUnderMouseVolatile = feat;
216
+ },
217
+ }))
218
+ .actions(self => ({
219
+ afterAttach() {
220
+ (0, mobx_state_tree_1.addDisposer)(self, (0, mobx_1.autorun)(async () => {
221
+ try {
222
+ const { rpcManager } = (0, util_1.getSession)(self);
223
+ const view = (0, util_1.getContainingView)(self);
224
+ const { sortedBy, colorBy, parentTrack, adapterConfig, rendererType, } = self;
225
+ if (!view.initialized ||
226
+ !self.estimatedStatsReady ||
227
+ self.regionTooLarge) {
228
+ return;
213
229
  }
214
- else {
215
- const sessionId = (0, tracks_1.getRpcSessionId)(self);
216
- const view = (0, util_1.getContainingView)(self);
217
- const { feature } = (await session.rpcManager.call(sessionId, 'CoreGetFeatureDetails', {
218
- featureId,
219
- sessionId,
220
- layoutId: view.id,
221
- rendererType: 'PileupRenderer',
222
- }));
223
- // check featureIdUnderMouse is still the same as the
224
- // feature.id that was returned e.g. that the user hasn't
225
- // moused over to a new position during the async operation
226
- // above
230
+ const { staticBlocks, bpPerPx } = view;
231
+ // continually generate the vc pairing, set and rerender if any
232
+ // new values seen
233
+ if (colorBy === null || colorBy === void 0 ? void 0 : colorBy.tag) {
234
+ self.updateColorTagMap(await (0, shared_1.getUniqueTagValues)(self, colorBy, staticBlocks));
235
+ }
236
+ if ((colorBy === null || colorBy === void 0 ? void 0 : colorBy.type) === 'modifications') {
237
+ const adapter = (0, configuration_1.getConf)(parentTrack, ['adapter']);
238
+ self.updateModificationColorMap(await (0, shared_1.getUniqueModificationValues)(self, adapter, colorBy, staticBlocks));
239
+ }
240
+ if (sortedBy) {
241
+ const { pos, refName, assemblyName } = sortedBy;
242
+ // render just the sorted region first
227
243
  // @ts-ignore
228
- if (self.featureIdUnderMouse === feature.uniqueId) {
229
- // @ts-ignore
230
- self.setFeatureUnderMouse(new util_1.SimpleFeature(feature));
231
- }
244
+ await self.rendererType.renderInClient(rpcManager, {
245
+ assemblyName,
246
+ regions: [
247
+ {
248
+ start: pos,
249
+ end: pos + 1,
250
+ refName,
251
+ assemblyName,
252
+ },
253
+ ],
254
+ adapterConfig: adapterConfig,
255
+ rendererType: rendererType.name,
256
+ sessionId: (0, tracks_1.getRpcSessionId)(self),
257
+ layoutId: view.id,
258
+ timeout: 1000000,
259
+ ...self.renderProps(),
260
+ });
261
+ self.setReady(true);
262
+ self.setCurrSortBpPerPx(bpPerPx);
263
+ }
264
+ else {
265
+ self.setReady(true);
232
266
  }
233
267
  }
234
- }
235
- catch (e) {
236
- console.error(e);
237
- session.notify(`${e}`, 'error');
238
- }
239
- }));
240
- },
241
- selectFeature(feature) {
242
- const session = (0, util_1.getSession)(self);
243
- if ((0, util_1.isSessionModelWithWidgets)(session)) {
244
- const featureWidget = session.addWidget('AlignmentsFeatureWidget', 'alignmentFeature', { featureData: feature.toJSON(), view: (0, util_1.getContainingView)(self) });
245
- session.showWidget(featureWidget);
246
- }
247
- session.setSelection(feature);
248
- },
249
- clearSelected() {
250
- self.sortedBy = undefined;
251
- },
252
- // uses copy-to-clipboard and generates notification
253
- copyFeatureToClipboard(feature) {
254
- const { uniqueId, ...rest } = feature.toJSON();
255
- const session = (0, util_1.getSession)(self);
256
- (0, copy_to_clipboard_1.default)(JSON.stringify(rest, null, 4));
257
- session.notify('Copied to clipboard', 'success');
258
- },
259
- toggleSoftClipping() {
260
- self.showSoftClipping = !self.showSoftClipping;
261
- },
262
- toggleMismatchAlpha() {
263
- self.mismatchAlpha = !self.mismatchAlpha;
264
- },
265
- setConfig(configuration) {
266
- self.configuration = configuration;
267
- },
268
- setSortedBy(type, tag) {
269
- const { centerLineInfo } = (0, util_1.getContainingView)(self);
270
- if (!centerLineInfo) {
271
- return;
272
- }
273
- const { refName, assemblyName, offset } = centerLineInfo;
274
- const centerBp = Math.round(offset) + 1;
275
- if (centerBp < 0 || !refName) {
276
- return;
277
- }
278
- self.sortedBy = {
279
- type,
280
- pos: centerBp,
281
- refName,
282
- assemblyName,
283
- tag,
284
- };
285
- self.ready = false;
286
- },
287
- setFilterBy(filter) {
288
- self.filterBy = (0, mobx_state_tree_1.cast)(filter);
289
- },
290
- }))
291
- .actions(self => {
292
- // resets the sort object and refresh whole display on reload
293
- const superReload = self.reload;
294
- return {
295
- reload() {
296
- self.clearSelected();
297
- superReload();
298
- },
299
- };
300
- })
301
- .views(self => ({
302
- get maxHeight() {
303
- const conf = (0, configuration_1.getConf)(self, ['renderers', self.rendererTypeName]) || {};
304
- return self.trackMaxHeight !== undefined
305
- ? self.trackMaxHeight
306
- : conf.maxHeight;
307
- },
308
- get rendererConfig() {
309
- const configBlob = (0, configuration_1.getConf)(self, ['renderers', self.rendererTypeName]) || {};
310
- return self.rendererType.configSchema.create({
311
- ...configBlob,
312
- height: self.featureHeight,
313
- noSpacing: self.noSpacing,
314
- maxHeight: this.maxHeight,
315
- mismatchAlpha: self.mismatchAlpha,
316
- }, (0, util_1.getEnv)(self));
317
- },
318
- get featureHeightSetting() {
319
- return (self.featureHeight || (0, configuration_1.readConfObject)(this.rendererConfig, 'height'));
320
- },
321
- get mismatchAlphaSetting() {
322
- return self.mismatchAlpha !== undefined
323
- ? self.mismatchAlpha
324
- : (0, configuration_1.readConfObject)(this.rendererConfig, 'mismatchAlpha');
325
- },
326
- get featureUnderMouse() {
327
- return self.featureUnderMouseVolatile;
328
- },
329
- }))
330
- .views(self => {
331
- const { trackMenuItems: superTrackMenuItems, renderProps: superRenderProps, } = self;
332
- return {
333
- get rendererTypeName() {
334
- const viewName = (0, configuration_1.getConf)(self, 'defaultRendering');
335
- const rendererType = rendererTypes.get(viewName);
336
- if (!rendererType) {
337
- throw new Error(`unknown alignments view name ${viewName}`);
338
- }
339
- return rendererType;
340
- },
341
- contextMenuItems() {
342
- const feat = self.contextMenuFeature;
343
- const contextMenuItems = feat
344
- ? [
345
- {
346
- label: 'Open feature details',
347
- icon: MenuOpen_1.default,
348
- onClick: () => {
349
- self.clearFeatureSelection();
350
- if (feat) {
351
- self.selectFeature(feat);
352
- }
353
- },
354
- },
355
- {
356
- label: 'Copy info to clipboard',
357
- icon: Icons_1.ContentCopy,
358
- onClick: () => {
359
- if (feat) {
360
- self.copyFeatureToClipboard(feat);
361
- }
362
- },
363
- },
364
- ]
365
- : [];
366
- return contextMenuItems;
367
- },
368
- get DisplayBlurb() {
369
- return LinearPileupDisplayBlurb_1.default;
370
- },
371
- renderProps() {
372
- const view = (0, util_1.getContainingView)(self);
373
- const { colorTagMap, modificationTagMap, sortedBy, colorBy, filterBy, rpcDriverName, currBpPerPx, ready, } = self;
374
- const superProps = superRenderProps();
375
- return {
376
- ...superProps,
377
- notReady: superProps.notReady ||
378
- !ready ||
379
- (sortedBy && currBpPerPx !== view.bpPerPx),
380
- rpcDriverName,
381
- displayModel: self,
382
- sortedBy,
383
- colorBy,
384
- filterBy: JSON.parse(JSON.stringify(filterBy)),
385
- colorTagMap: Object.fromEntries(colorTagMap.toJSON()),
386
- modificationTagMap: Object.fromEntries(modificationTagMap.toJSON()),
387
- showSoftClip: self.showSoftClipping,
388
- config: self.rendererConfig,
389
- async onFeatureClick(_, featureId) {
390
- const session = (0, util_1.getSession)(self);
391
- const { rpcManager } = session;
392
- try {
393
- const f = featureId || self.featureIdUnderMouse;
394
- if (!f) {
395
- self.clearFeatureSelection();
268
+ catch (e) {
269
+ console.error(e);
270
+ self.setError(e);
271
+ }
272
+ }, { delay: 1000 }));
273
+ // autorun synchronizes featureUnderMouse with featureIdUnderMouse
274
+ // asynchronously. this is needed due to how we do not serialize all
275
+ // features from the BAM/CRAM over the rpc
276
+ (0, mobx_state_tree_1.addDisposer)(self, (0, mobx_1.autorun)(async () => {
277
+ var _a;
278
+ const session = (0, util_1.getSession)(self);
279
+ try {
280
+ const featureId = self.featureIdUnderMouse;
281
+ if (((_a = self.featureUnderMouse) === null || _a === void 0 ? void 0 : _a.id()) !== featureId) {
282
+ if (!featureId) {
283
+ self.setFeatureUnderMouse(undefined);
396
284
  }
397
285
  else {
398
286
  const sessionId = (0, tracks_1.getRpcSessionId)(self);
399
- const { feature } = (await rpcManager.call(sessionId, 'CoreGetFeatureDetails', {
400
- featureId: f,
287
+ const view = (0, util_1.getContainingView)(self);
288
+ const { feature } = (await session.rpcManager.call(sessionId, 'CoreGetFeatureDetails', {
289
+ featureId,
401
290
  sessionId,
402
- layoutId: (0, util_1.getContainingView)(self).id,
291
+ layoutId: view.id,
403
292
  rendererType: 'PileupRenderer',
404
293
  }));
405
- if (feature) {
294
+ // check featureIdUnderMouse is still the same as the
295
+ // feature.id that was returned e.g. that the user hasn't
296
+ // moused over to a new position during the async operation
297
+ // above
298
+ // @ts-ignore
299
+ if (self.featureIdUnderMouse === feature.uniqueId) {
406
300
  // @ts-ignore
407
- self.selectFeature(new util_1.SimpleFeature(feature));
301
+ self.setFeatureUnderMouse(new util_1.SimpleFeature(feature));
408
302
  }
409
303
  }
410
304
  }
411
- catch (e) {
412
- console.error(e);
413
- session.notify(`${e}`);
414
- }
415
- },
416
- onClick() {
417
- self.clearFeatureSelection();
418
- },
419
- // similar to click but opens a menu with further options
420
- async onFeatureContextMenu(_, featureId) {
421
- const session = (0, util_1.getSession)(self);
422
- const { rpcManager } = session;
423
- try {
424
- const f = featureId || self.featureIdUnderMouse;
425
- if (!f) {
426
- self.clearFeatureSelection();
427
- }
428
- else {
429
- const sessionId = (0, tracks_1.getRpcSessionId)(self);
430
- const { feature } = (await rpcManager.call(sessionId, 'CoreGetFeatureDetails', {
431
- featureId: f,
432
- sessionId,
433
- layoutId: (0, util_1.getContainingView)(self).id,
434
- rendererType: 'PileupRenderer',
435
- }));
436
- if (feature) {
437
- self.setContextMenuFeature(new util_1.SimpleFeature(feature));
438
- }
439
- }
440
- }
441
- catch (e) {
442
- console.error(e);
443
- session.notify(`${e}`);
444
- }
445
- },
305
+ }
306
+ catch (e) {
307
+ console.error(e);
308
+ session.notify(`${e}`, 'error');
309
+ }
310
+ }));
311
+ },
312
+ /**
313
+ * #action
314
+ */
315
+ selectFeature(feature) {
316
+ const session = (0, util_1.getSession)(self);
317
+ if ((0, util_1.isSessionModelWithWidgets)(session)) {
318
+ const featureWidget = session.addWidget('AlignmentsFeatureWidget', 'alignmentFeature', { featureData: feature.toJSON(), view: (0, util_1.getContainingView)(self) });
319
+ session.showWidget(featureWidget);
320
+ }
321
+ session.setSelection(feature);
322
+ },
323
+ /**
324
+ * #action
325
+ */
326
+ clearSelected() {
327
+ self.sortedBy = undefined;
328
+ },
329
+ /**
330
+ * #action
331
+ * uses copy-to-clipboard and generates notification
332
+ */
333
+ copyFeatureToClipboard(feature) {
334
+ const { uniqueId, ...rest } = feature.toJSON();
335
+ const session = (0, util_1.getSession)(self);
336
+ (0, copy_to_clipboard_1.default)(JSON.stringify(rest, null, 4));
337
+ session.notify('Copied to clipboard', 'success');
338
+ },
339
+ /**
340
+ * #action
341
+ */
342
+ toggleSoftClipping() {
343
+ self.showSoftClipping = !self.showSoftClipping;
344
+ },
345
+ /**
346
+ * #action
347
+ */
348
+ toggleMismatchAlpha() {
349
+ self.mismatchAlpha = !self.mismatchAlpha;
350
+ },
351
+ /**
352
+ * #action
353
+ */
354
+ setConfig(configuration) {
355
+ self.configuration = configuration;
356
+ },
357
+ /**
358
+ * #action
359
+ */
360
+ setSortedBy(type, tag) {
361
+ const { centerLineInfo } = (0, util_1.getContainingView)(self);
362
+ if (!centerLineInfo) {
363
+ return;
364
+ }
365
+ const { refName, assemblyName, offset } = centerLineInfo;
366
+ const centerBp = Math.round(offset) + 1;
367
+ if (centerBp < 0 || !refName) {
368
+ return;
369
+ }
370
+ self.sortedBy = {
371
+ type,
372
+ pos: centerBp,
373
+ refName,
374
+ assemblyName,
375
+ tag,
446
376
  };
377
+ self.ready = false;
447
378
  },
448
- trackMenuItems() {
449
- return [
450
- ...superTrackMenuItems(),
451
- {
452
- label: 'Show soft clipping',
453
- icon: Visibility_1.default,
454
- type: 'checkbox',
455
- checked: self.showSoftClipping,
456
- onClick: () => {
457
- self.toggleSoftClipping();
458
- // if toggling from off to on, will break sort for this track
459
- // so clear it
460
- if (self.showSoftClipping) {
461
- self.clearSelected();
462
- }
463
- },
464
- },
465
- {
466
- label: 'Sort by',
467
- icon: Sort_1.default,
468
- disabled: self.showSoftClipping,
469
- subMenu: [
470
- ...['Start location', 'Read strand', 'Base pair'].map(option => ({
471
- label: option,
472
- onClick: () => self.setSortedBy(option),
473
- })),
379
+ setFilterBy(filter) {
380
+ self.filterBy = (0, mobx_state_tree_1.cast)(filter);
381
+ },
382
+ }))
383
+ .actions(self => {
384
+ // resets the sort object and refresh whole display on reload
385
+ const superReload = self.reload;
386
+ return {
387
+ /**
388
+ * #action
389
+ */
390
+ reload() {
391
+ self.clearSelected();
392
+ superReload();
393
+ },
394
+ };
395
+ })
396
+ .views(self => ({
397
+ /**
398
+ * #getter
399
+ */
400
+ get maxHeight() {
401
+ const conf = (0, configuration_1.getConf)(self, ['renderers', self.rendererTypeName]) || {};
402
+ return self.trackMaxHeight !== undefined
403
+ ? self.trackMaxHeight
404
+ : conf.maxHeight;
405
+ },
406
+ /**
407
+ * #getter
408
+ */
409
+ get rendererConfig() {
410
+ const configBlob = (0, configuration_1.getConf)(self, ['renderers', self.rendererTypeName]) || {};
411
+ return self.rendererType.configSchema.create({
412
+ ...configBlob,
413
+ height: self.featureHeight,
414
+ noSpacing: self.noSpacing,
415
+ maxHeight: this.maxHeight,
416
+ mismatchAlpha: self.mismatchAlpha,
417
+ }, (0, util_1.getEnv)(self));
418
+ },
419
+ /**
420
+ * #getter
421
+ */
422
+ get featureHeightSetting() {
423
+ return (self.featureHeight || (0, configuration_1.readConfObject)(this.rendererConfig, 'height'));
424
+ },
425
+ /**
426
+ * #getter
427
+ */
428
+ get mismatchAlphaSetting() {
429
+ return self.mismatchAlpha !== undefined
430
+ ? self.mismatchAlpha
431
+ : (0, configuration_1.readConfObject)(this.rendererConfig, 'mismatchAlpha');
432
+ },
433
+ /**
434
+ * #getter
435
+ */
436
+ get featureUnderMouse() {
437
+ return self.featureUnderMouseVolatile;
438
+ },
439
+ }))
440
+ .views(self => {
441
+ const { trackMenuItems: superTrackMenuItems, renderProps: superRenderProps, } = self;
442
+ return {
443
+ /**
444
+ * #getter
445
+ */
446
+ get rendererTypeName() {
447
+ const viewName = (0, configuration_1.getConf)(self, 'defaultRendering');
448
+ const rendererType = rendererTypes.get(viewName);
449
+ if (!rendererType) {
450
+ throw new Error(`unknown alignments view name ${viewName}`);
451
+ }
452
+ return rendererType;
453
+ },
454
+ /**
455
+ * #method
456
+ */
457
+ contextMenuItems() {
458
+ const feat = self.contextMenuFeature;
459
+ const contextMenuItems = feat
460
+ ? [
474
461
  {
475
- label: 'Sort by tag...',
462
+ label: 'Open feature details',
463
+ icon: MenuOpen_1.default,
476
464
  onClick: () => {
477
- (0, util_1.getSession)(self).queueDialog(handleClose => [
478
- SortByTagDlg,
479
- { model: self, handleClose },
480
- ]);
465
+ self.clearFeatureSelection();
466
+ if (feat) {
467
+ self.selectFeature(feat);
468
+ }
481
469
  },
482
470
  },
483
471
  {
484
- label: 'Clear sort',
485
- onClick: () => self.clearSelected(),
486
- },
487
- ],
488
- },
489
- {
490
- label: 'Color scheme',
491
- icon: Palette_1.default,
492
- subMenu: [
493
- {
494
- label: 'Normal',
472
+ label: 'Copy info to clipboard',
473
+ icon: Icons_1.ContentCopy,
495
474
  onClick: () => {
496
- self.setColorScheme({ type: 'normal' });
475
+ if (feat) {
476
+ self.copyFeatureToClipboard(feat);
477
+ }
497
478
  },
498
479
  },
499
- {
500
- label: 'Mapping quality',
501
- onClick: () => {
502
- self.setColorScheme({ type: 'mappingQuality' });
503
- },
480
+ ]
481
+ : [];
482
+ return contextMenuItems;
483
+ },
484
+ /**
485
+ * #getter
486
+ */
487
+ get DisplayBlurb() {
488
+ return LinearPileupDisplayBlurb_1.default;
489
+ },
490
+ /**
491
+ * #method
492
+ */
493
+ renderProps() {
494
+ const view = (0, util_1.getContainingView)(self);
495
+ const { colorTagMap, modificationTagMap, sortedBy, colorBy, filterBy, rpcDriverName, currSortBpPerPx, ready, } = self;
496
+ const superProps = superRenderProps();
497
+ return {
498
+ ...superProps,
499
+ notReady: superProps.notReady ||
500
+ !ready ||
501
+ (sortedBy && currSortBpPerPx !== view.bpPerPx),
502
+ rpcDriverName,
503
+ displayModel: self,
504
+ sortedBy,
505
+ colorBy,
506
+ filterBy: JSON.parse(JSON.stringify(filterBy)),
507
+ colorTagMap: Object.fromEntries(colorTagMap.toJSON()),
508
+ modificationTagMap: Object.fromEntries(modificationTagMap.toJSON()),
509
+ showSoftClip: self.showSoftClipping,
510
+ config: self.rendererConfig,
511
+ async onFeatureClick(_, featureId) {
512
+ const session = (0, util_1.getSession)(self);
513
+ const { rpcManager } = session;
514
+ try {
515
+ const f = featureId || self.featureIdUnderMouse;
516
+ if (!f) {
517
+ self.clearFeatureSelection();
518
+ }
519
+ else {
520
+ const sessionId = (0, tracks_1.getRpcSessionId)(self);
521
+ const { feature } = (await rpcManager.call(sessionId, 'CoreGetFeatureDetails', {
522
+ featureId: f,
523
+ sessionId,
524
+ layoutId: (0, util_1.getContainingView)(self).id,
525
+ rendererType: 'PileupRenderer',
526
+ }));
527
+ if (feature) {
528
+ // @ts-ignore
529
+ self.selectFeature(new util_1.SimpleFeature(feature));
530
+ }
531
+ }
532
+ }
533
+ catch (e) {
534
+ console.error(e);
535
+ session.notify(`${e}`);
536
+ }
537
+ },
538
+ onClick() {
539
+ self.clearFeatureSelection();
540
+ },
541
+ // similar to click but opens a menu with further options
542
+ async onFeatureContextMenu(_, featureId) {
543
+ const session = (0, util_1.getSession)(self);
544
+ const { rpcManager } = session;
545
+ try {
546
+ const f = featureId || self.featureIdUnderMouse;
547
+ if (!f) {
548
+ self.clearFeatureSelection();
549
+ }
550
+ else {
551
+ const sessionId = (0, tracks_1.getRpcSessionId)(self);
552
+ const { feature } = (await rpcManager.call(sessionId, 'CoreGetFeatureDetails', {
553
+ featureId: f,
554
+ sessionId,
555
+ layoutId: (0, util_1.getContainingView)(self).id,
556
+ rendererType: 'PileupRenderer',
557
+ }));
558
+ if (feature) {
559
+ self.setContextMenuFeature(new util_1.SimpleFeature(feature));
560
+ }
561
+ }
562
+ }
563
+ catch (e) {
564
+ console.error(e);
565
+ session.notify(`${e}`);
566
+ }
567
+ },
568
+ };
569
+ },
570
+ /**
571
+ * #method
572
+ */
573
+ trackMenuItems() {
574
+ return [
575
+ ...superTrackMenuItems(),
576
+ {
577
+ label: 'Show soft clipping',
578
+ icon: Visibility_1.default,
579
+ type: 'checkbox',
580
+ checked: self.showSoftClipping,
581
+ onClick: () => {
582
+ self.toggleSoftClipping();
583
+ // if toggling from off to on, will break sort for this track
584
+ // so clear it
585
+ if (self.showSoftClipping) {
586
+ self.clearSelected();
587
+ }
504
588
  },
505
- {
506
- label: 'Strand',
507
- onClick: () => {
508
- self.setColorScheme({ type: 'strand' });
589
+ },
590
+ {
591
+ label: 'Sort by',
592
+ icon: Sort_1.default,
593
+ disabled: self.showSoftClipping,
594
+ subMenu: [
595
+ ...['Start location', 'Read strand', 'Base pair'].map(option => ({
596
+ label: option,
597
+ onClick: () => self.setSortedBy(option),
598
+ })),
599
+ {
600
+ label: 'Sort by tag...',
601
+ onClick: () => {
602
+ (0, util_1.getSession)(self).queueDialog(handleClose => [
603
+ SortByTagDlg,
604
+ { model: self, handleClose },
605
+ ]);
606
+ },
509
607
  },
510
- },
511
- {
512
- label: 'Pair orientation',
513
- onClick: () => {
514
- self.setColorScheme({ type: 'pairOrientation' });
608
+ {
609
+ label: 'Clear sort',
610
+ onClick: () => self.clearSelected(),
515
611
  },
516
- },
517
- {
518
- label: 'Per-base quality',
519
- onClick: () => {
520
- self.setColorScheme({ type: 'perBaseQuality' });
612
+ ],
613
+ },
614
+ {
615
+ label: 'Color scheme',
616
+ icon: Palette_1.default,
617
+ subMenu: [
618
+ {
619
+ label: 'Normal',
620
+ onClick: () => self.setColorScheme({ type: 'normal' }),
521
621
  },
522
- },
523
- {
524
- label: 'Per-base lettering',
525
- onClick: () => {
526
- self.setColorScheme({ type: 'perBaseLettering' });
622
+ {
623
+ label: 'Mapping quality',
624
+ onClick: () => self.setColorScheme({ type: 'mappingQuality' }),
527
625
  },
528
- },
529
- {
530
- label: 'Modifications or methylation',
531
- onClick: () => {
532
- (0, util_1.getSession)(self).queueDialog(doneCallback => [
533
- ModificationsDlg,
534
- { model: self, handleClose: doneCallback },
535
- ]);
626
+ {
627
+ label: 'Strand',
628
+ onClick: () => self.setColorScheme({ type: 'strand' }),
536
629
  },
537
- },
538
- {
539
- label: 'Insert size',
540
- onClick: () => {
541
- self.setColorScheme({ type: 'insertSize' });
630
+ {
631
+ label: 'Pair orientation',
632
+ onClick: () => self.setColorScheme({ type: 'pairOrientation' }),
542
633
  },
543
- },
544
- {
545
- label: 'Stranded paired-end',
546
- onClick: () => {
547
- self.setColorScheme({ type: 'reverseTemplate' });
634
+ {
635
+ label: 'Per-base quality',
636
+ onClick: () => self.setColorScheme({ type: 'perBaseQuality' }),
548
637
  },
549
- },
550
- {
551
- label: 'Color by tag...',
552
- onClick: () => {
553
- (0, util_1.getSession)(self).queueDialog(doneCallback => [
554
- ColorByTagDlg,
555
- { model: self, handleClose: doneCallback },
556
- ]);
638
+ {
639
+ label: 'Per-base lettering',
640
+ onClick: () => self.setColorScheme({ type: 'perBaseLettering' }),
557
641
  },
642
+ {
643
+ label: 'Modifications or methylation',
644
+ onClick: () => {
645
+ (0, util_1.getSession)(self).queueDialog(doneCallback => [
646
+ ModificationsDlg,
647
+ { model: self, handleClose: doneCallback },
648
+ ]);
649
+ },
650
+ },
651
+ {
652
+ label: 'Insert size',
653
+ onClick: () => self.setColorScheme({ type: 'insertSize' }),
654
+ },
655
+ {
656
+ label: 'Stranded paired-end',
657
+ onClick: () => self.setColorScheme({ type: 'reverseTemplate' }),
658
+ },
659
+ {
660
+ label: 'Color by tag...',
661
+ onClick: () => {
662
+ (0, util_1.getSession)(self).queueDialog(doneCallback => [
663
+ ColorByTagDlg,
664
+ { model: self, handleClose: doneCallback },
665
+ ]);
666
+ },
667
+ },
668
+ ],
669
+ },
670
+ {
671
+ label: 'Filter by',
672
+ icon: ClearAll_1.default,
673
+ onClick: () => {
674
+ (0, util_1.getSession)(self).queueDialog(doneCallback => [
675
+ FilterByTagDlg,
676
+ { model: self, handleClose: doneCallback },
677
+ ]);
558
678
  },
559
- ],
560
- },
561
- {
562
- label: 'Filter by',
563
- icon: ClearAll_1.default,
564
- onClick: () => {
565
- (0, util_1.getSession)(self).queueDialog(doneCallback => [
566
- FilterByTagDlg,
567
- { model: self, handleClose: doneCallback },
568
- ]);
569
679
  },
570
- },
571
- {
572
- label: 'Set feature height',
573
- onClick: () => {
574
- (0, util_1.getSession)(self).queueDialog(doneCallback => [
575
- SetFeatureHeightDlg,
576
- { model: self, handleClose: doneCallback },
577
- ]);
680
+ {
681
+ label: 'Set feature height',
682
+ onClick: () => {
683
+ (0, util_1.getSession)(self).queueDialog(doneCallback => [
684
+ SetFeatureHeightDlg,
685
+ { model: self, handleClose: doneCallback },
686
+ ]);
687
+ },
578
688
  },
579
- },
580
- {
581
- label: 'Set max height',
582
- onClick: () => {
583
- (0, util_1.getSession)(self).queueDialog(doneCallback => [
584
- SetMaxHeightDlg,
585
- { model: self, handleClose: doneCallback },
586
- ]);
689
+ {
690
+ label: 'Set max height',
691
+ onClick: () => {
692
+ (0, util_1.getSession)(self).queueDialog(doneCallback => [
693
+ SetMaxHeightDlg,
694
+ { model: self, handleClose: doneCallback },
695
+ ]);
696
+ },
587
697
  },
588
- },
589
- {
590
- label: 'Fade mismatches by quality',
591
- type: 'checkbox',
592
- checked: self.mismatchAlphaSetting,
593
- onClick: () => {
594
- self.toggleMismatchAlpha();
698
+ {
699
+ label: 'Fade mismatches by quality',
700
+ type: 'checkbox',
701
+ checked: self.mismatchAlphaSetting,
702
+ onClick: () => self.toggleMismatchAlpha(),
595
703
  },
596
- },
597
- ];
598
- },
599
- };
600
- });
704
+ ];
705
+ },
706
+ };
707
+ });
708
+ }
601
709
  exports.default = stateModelFactory;
602
710
  //# sourceMappingURL=model.js.map