@jbrowse/plugin-alignments 2.1.7 → 2.2.0

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