@jbrowse/plugin-wiggle 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 (125) hide show
  1. package/dist/BigWigAdapter/configSchema.d.ts +2 -2
  2. package/dist/BigWigAdapter/configSchema.js +12 -1
  3. package/dist/BigWigAdapter/configSchema.js.map +1 -1
  4. package/dist/DensityRenderer/configSchema.js +11 -1
  5. package/dist/DensityRenderer/configSchema.js.map +1 -1
  6. package/dist/LinePlotRenderer/configSchema.js +14 -1
  7. package/dist/LinePlotRenderer/configSchema.js.map +1 -1
  8. package/dist/LinearWiggleDisplay/components/Tooltip.d.ts +1 -1
  9. package/dist/LinearWiggleDisplay/models/configSchema.js +38 -1
  10. package/dist/LinearWiggleDisplay/models/configSchema.js.map +1 -1
  11. package/dist/LinearWiggleDisplay/models/model.d.ts +203 -10
  12. package/dist/LinearWiggleDisplay/models/model.js +588 -408
  13. package/dist/LinearWiggleDisplay/models/model.js.map +1 -1
  14. package/dist/MultiDensityRenderer/configSchema.js +11 -1
  15. package/dist/MultiDensityRenderer/configSchema.js.map +1 -1
  16. package/dist/MultiLineRenderer/configSchema.js +17 -1
  17. package/dist/MultiLineRenderer/configSchema.js.map +1 -1
  18. package/dist/MultiLinearWiggleDisplay/components/Tooltip.d.ts +1 -1
  19. package/dist/MultiLinearWiggleDisplay/models/configSchema.js +38 -1
  20. package/dist/MultiLinearWiggleDisplay/models/configSchema.js.map +1 -1
  21. package/dist/MultiLinearWiggleDisplay/models/model.d.ts +3 -3
  22. package/dist/MultiQuantitativeTrack/configSchema.d.ts +3 -0
  23. package/dist/MultiQuantitativeTrack/configSchema.js +18 -0
  24. package/dist/MultiQuantitativeTrack/configSchema.js.map +1 -0
  25. package/dist/MultiQuantitativeTrack/index.js +2 -2
  26. package/dist/MultiQuantitativeTrack/index.js.map +1 -1
  27. package/dist/MultiRowLineRenderer/configSchema.js +17 -1
  28. package/dist/MultiRowLineRenderer/configSchema.js.map +1 -1
  29. package/dist/MultiRowXYPlotRenderer/configSchema.js +23 -1
  30. package/dist/MultiRowXYPlotRenderer/configSchema.js.map +1 -1
  31. package/dist/MultiWiggleAdapter/configSchema.d.ts +2 -2
  32. package/dist/MultiWiggleAdapter/configSchema.js +14 -1
  33. package/dist/MultiWiggleAdapter/configSchema.js.map +1 -1
  34. package/dist/MultiXYPlotRenderer/configSchema.js +23 -1
  35. package/dist/MultiXYPlotRenderer/configSchema.js.map +1 -1
  36. package/dist/QuantitativeTrack/configSchema.d.ts +3 -0
  37. package/dist/QuantitativeTrack/configSchema.js +18 -0
  38. package/dist/QuantitativeTrack/configSchema.js.map +1 -0
  39. package/dist/QuantitativeTrack/index.js +2 -2
  40. package/dist/QuantitativeTrack/index.js.map +1 -1
  41. package/dist/Tooltip.d.ts +2 -2
  42. package/dist/WiggleBaseRenderer.d.ts +4 -0
  43. package/dist/XYPlotRenderer/configSchema.js +23 -1
  44. package/dist/XYPlotRenderer/configSchema.js.map +1 -1
  45. package/dist/configSchema.d.ts +2 -2
  46. package/dist/configSchema.js +25 -1
  47. package/dist/configSchema.js.map +1 -1
  48. package/dist/drawxy.js +4 -4
  49. package/dist/drawxy.js.map +1 -1
  50. package/dist/index.d.ts +3 -307
  51. package/esm/BigWigAdapter/configSchema.d.ts +2 -2
  52. package/esm/BigWigAdapter/configSchema.js +12 -1
  53. package/esm/BigWigAdapter/configSchema.js.map +1 -1
  54. package/esm/DensityRenderer/configSchema.js +12 -2
  55. package/esm/DensityRenderer/configSchema.js.map +1 -1
  56. package/esm/LinePlotRenderer/configSchema.js +15 -2
  57. package/esm/LinePlotRenderer/configSchema.js.map +1 -1
  58. package/esm/LinearWiggleDisplay/components/Tooltip.d.ts +1 -1
  59. package/esm/LinearWiggleDisplay/models/configSchema.js +38 -1
  60. package/esm/LinearWiggleDisplay/models/configSchema.js.map +1 -1
  61. package/esm/LinearWiggleDisplay/models/model.d.ts +203 -10
  62. package/esm/LinearWiggleDisplay/models/model.js +588 -408
  63. package/esm/LinearWiggleDisplay/models/model.js.map +1 -1
  64. package/esm/MultiDensityRenderer/configSchema.js +12 -2
  65. package/esm/MultiDensityRenderer/configSchema.js.map +1 -1
  66. package/esm/MultiLineRenderer/configSchema.js +18 -2
  67. package/esm/MultiLineRenderer/configSchema.js.map +1 -1
  68. package/esm/MultiLinearWiggleDisplay/components/Tooltip.d.ts +1 -1
  69. package/esm/MultiLinearWiggleDisplay/models/configSchema.js +38 -1
  70. package/esm/MultiLinearWiggleDisplay/models/configSchema.js.map +1 -1
  71. package/esm/MultiLinearWiggleDisplay/models/model.d.ts +3 -3
  72. package/esm/MultiQuantitativeTrack/configSchema.d.ts +3 -0
  73. package/esm/MultiQuantitativeTrack/configSchema.js +16 -0
  74. package/esm/MultiQuantitativeTrack/configSchema.js.map +1 -0
  75. package/esm/MultiQuantitativeTrack/index.js +3 -3
  76. package/esm/MultiQuantitativeTrack/index.js.map +1 -1
  77. package/esm/MultiRowLineRenderer/configSchema.js +18 -2
  78. package/esm/MultiRowLineRenderer/configSchema.js.map +1 -1
  79. package/esm/MultiRowXYPlotRenderer/configSchema.js +24 -2
  80. package/esm/MultiRowXYPlotRenderer/configSchema.js.map +1 -1
  81. package/esm/MultiWiggleAdapter/configSchema.d.ts +2 -2
  82. package/esm/MultiWiggleAdapter/configSchema.js +14 -1
  83. package/esm/MultiWiggleAdapter/configSchema.js.map +1 -1
  84. package/esm/MultiXYPlotRenderer/configSchema.js +24 -2
  85. package/esm/MultiXYPlotRenderer/configSchema.js.map +1 -1
  86. package/esm/QuantitativeTrack/configSchema.d.ts +3 -0
  87. package/esm/QuantitativeTrack/configSchema.js +16 -0
  88. package/esm/QuantitativeTrack/configSchema.js.map +1 -0
  89. package/esm/QuantitativeTrack/index.js +3 -3
  90. package/esm/QuantitativeTrack/index.js.map +1 -1
  91. package/esm/Tooltip.d.ts +2 -2
  92. package/esm/WiggleBaseRenderer.d.ts +4 -0
  93. package/esm/XYPlotRenderer/configSchema.js +24 -2
  94. package/esm/XYPlotRenderer/configSchema.js.map +1 -1
  95. package/esm/configSchema.d.ts +2 -2
  96. package/esm/configSchema.js +25 -1
  97. package/esm/configSchema.js.map +1 -1
  98. package/esm/drawxy.js +4 -4
  99. package/esm/drawxy.js.map +1 -1
  100. package/esm/index.d.ts +3 -307
  101. package/package.json +2 -2
  102. package/src/BigWigAdapter/__snapshots__/BigWigAdapter.test.ts.snap +14 -14
  103. package/src/BigWigAdapter/configSchema.ts +15 -1
  104. package/src/DensityRenderer/__snapshots__/DensityRenderer.test.js.snap +9 -3
  105. package/src/DensityRenderer/configSchema.ts +13 -2
  106. package/src/LinePlotRenderer/configSchema.ts +16 -2
  107. package/src/LinearWiggleDisplay/models/configSchema.ts +40 -2
  108. package/src/LinearWiggleDisplay/models/model.tsx +192 -12
  109. package/src/MultiDensityRenderer/configSchema.ts +13 -2
  110. package/src/MultiLineRenderer/configSchema.ts +18 -3
  111. package/src/MultiLinearWiggleDisplay/models/configSchema.ts +41 -1
  112. package/src/MultiQuantitativeTrack/configSchema.ts +23 -0
  113. package/src/MultiQuantitativeTrack/index.ts +3 -10
  114. package/src/MultiRowLineRenderer/configSchema.ts +19 -2
  115. package/src/MultiRowXYPlotRenderer/configSchema.ts +25 -2
  116. package/src/MultiWiggleAdapter/configSchema.ts +17 -1
  117. package/src/MultiXYPlotRenderer/configSchema.ts +25 -2
  118. package/src/QuantitativeTrack/configSchema.ts +23 -0
  119. package/src/QuantitativeTrack/index.ts +3 -10
  120. package/src/WiggleBaseRenderer.tsx +1 -1
  121. package/src/XYPlotRenderer/__snapshots__/XYPlotRenderer.test.js.snap +9 -3
  122. package/src/XYPlotRenderer/configSchema.ts +25 -2
  123. package/src/__snapshots__/index.test.js.snap +1 -1
  124. package/src/configSchema.ts +26 -1
  125. package/src/drawxy.ts +4 -4
@@ -16,434 +16,614 @@ const rendererTypes = new Map([
16
16
  ['density', 'DensityRenderer'],
17
17
  ['line', 'LinePlotRenderer'],
18
18
  ]);
19
- const stateModelFactory = (pluginManager, configSchema) => types
20
- .compose('LinearWiggleDisplay', BaseLinearDisplay, types.model({
21
- type: types.literal('LinearWiggleDisplay'),
22
- configuration: ConfigurationReference(configSchema),
23
- selectedRendering: types.optional(types.string, ''),
24
- resolution: types.optional(types.number, 1),
25
- fill: types.maybe(types.boolean),
26
- minSize: types.maybe(types.number),
27
- color: types.maybe(types.string),
28
- posColor: types.maybe(types.string),
29
- negColor: types.maybe(types.string),
30
- summaryScoreMode: types.maybe(types.string),
31
- rendererTypeNameState: types.maybe(types.string),
32
- scale: types.maybe(types.string),
33
- autoscale: types.maybe(types.string),
34
- displayCrossHatches: types.maybe(types.boolean),
35
- constraints: types.optional(types.model({
36
- max: types.maybe(types.number),
37
- min: types.maybe(types.number),
38
- }), {}),
39
- }))
40
- .volatile(() => ({
41
- statsReady: false,
42
- message: undefined,
43
- stats: { scoreMin: 0, scoreMax: 50 },
44
- statsFetchInProgress: undefined,
45
- }))
46
- .actions(self => ({
47
- updateStats(stats) {
48
- const { scoreMin, scoreMax } = stats;
49
- const EPSILON = 0.000001;
50
- if (Math.abs(self.stats.scoreMax - scoreMax) > EPSILON ||
51
- Math.abs(self.stats.scoreMin - scoreMin) > EPSILON) {
52
- self.stats = { scoreMin, scoreMax };
19
+ /**
20
+ * #stateModel LinearWiggleDisplay
21
+ * Extends `BaseLinearDisplay`
22
+ */
23
+ function stateModelFactory(pluginManager, configSchema) {
24
+ return types
25
+ .compose('LinearWiggleDisplay', BaseLinearDisplay, types.model({
26
+ /**
27
+ * #property
28
+ */
29
+ type: types.literal('LinearWiggleDisplay'),
30
+ /**
31
+ * #property
32
+ */
33
+ configuration: ConfigurationReference(configSchema),
34
+ /**
35
+ * #property
36
+ */
37
+ selectedRendering: types.optional(types.string, ''),
38
+ /**
39
+ * #property
40
+ */
41
+ resolution: types.optional(types.number, 1),
42
+ /**
43
+ * #property
44
+ */
45
+ fill: types.maybe(types.boolean),
46
+ /**
47
+ * #property
48
+ */
49
+ minSize: types.maybe(types.number),
50
+ /**
51
+ * #property
52
+ */
53
+ color: types.maybe(types.string),
54
+ /**
55
+ * #property
56
+ */
57
+ posColor: types.maybe(types.string),
58
+ /**
59
+ * #property
60
+ */
61
+ negColor: types.maybe(types.string),
62
+ /**
63
+ * #property
64
+ */
65
+ summaryScoreMode: types.maybe(types.string),
66
+ /**
67
+ * #property
68
+ */
69
+ rendererTypeNameState: types.maybe(types.string),
70
+ /**
71
+ * #property
72
+ */
73
+ scale: types.maybe(types.string),
74
+ /**
75
+ * #property
76
+ */
77
+ autoscale: types.maybe(types.string),
78
+ /**
79
+ * #property
80
+ */
81
+ displayCrossHatches: types.maybe(types.boolean),
82
+ /**
83
+ * #property
84
+ */
85
+ constraints: types.optional(types.model({
86
+ max: types.maybe(types.number),
87
+ min: types.maybe(types.number),
88
+ }), {}),
89
+ }))
90
+ .volatile(() => ({
91
+ statsReady: false,
92
+ message: undefined,
93
+ stats: { scoreMin: 0, scoreMax: 50 },
94
+ statsFetchInProgress: undefined,
95
+ }))
96
+ .actions(self => ({
97
+ /**
98
+ * #action
99
+ */
100
+ updateStats(stats) {
101
+ const { scoreMin, scoreMax } = stats;
102
+ const EPSILON = 0.000001;
103
+ if (Math.abs(self.stats.scoreMax - scoreMax) > EPSILON ||
104
+ Math.abs(self.stats.scoreMin - scoreMin) > EPSILON) {
105
+ self.stats = { scoreMin, scoreMax };
106
+ }
53
107
  self.statsReady = true;
54
- }
55
- },
56
- setColor(color) {
57
- self.color = color;
58
- },
59
- setPosColor(color) {
60
- self.posColor = color;
61
- },
62
- setNegColor(color) {
63
- self.negColor = color;
64
- },
65
- setLoading(aborter) {
66
- const { statsFetchInProgress: statsFetch } = self;
67
- if (statsFetch !== undefined && !statsFetch.signal.aborted) {
68
- statsFetch.abort();
69
- }
70
- self.statsFetchInProgress = aborter;
71
- },
72
- // this overrides the BaseLinearDisplayModel to avoid popping up a
73
- // feature detail display, but still sets the feature selection on the
74
- // model so listeners can detect a click
75
- selectFeature(feature) {
76
- const session = getSession(self);
77
- if (isSelectionContainer(session)) {
78
- session.setSelection(feature);
79
- }
80
- },
81
- setResolution(res) {
82
- self.resolution = res;
83
- },
84
- setFill(fill) {
85
- if (fill === 0) {
86
- self.fill = true;
87
- self.minSize = 0;
88
- }
89
- else if (fill === 1) {
90
- self.fill = false;
91
- self.minSize = 1;
92
- }
93
- else if (fill === 2) {
94
- self.fill = false;
95
- self.minSize = 2;
96
- }
97
- },
98
- toggleLogScale() {
99
- if (self.scale !== 'log') {
100
- self.scale = 'log';
101
- }
102
- else {
103
- self.scale = 'linear';
104
- }
105
- },
106
- setScaleType(scale) {
107
- self.scale = scale;
108
- },
109
- setSummaryScoreMode(val) {
110
- self.summaryScoreMode = val;
111
- },
112
- setAutoscale(val) {
113
- self.autoscale = val;
114
- },
115
- setMaxScore(val) {
116
- self.constraints.max = val;
117
- },
118
- setRendererType(val) {
119
- self.rendererTypeNameState = val;
120
- },
121
- setMinScore(val) {
122
- self.constraints.min = val;
123
- },
124
- toggleCrossHatches() {
125
- self.displayCrossHatches = !self.displayCrossHatches;
126
- },
127
- setCrossHatches(cross) {
128
- self.displayCrossHatches = cross;
129
- },
130
- }))
131
- .views(self => ({
132
- get TooltipComponent() {
133
- return Tooltip;
134
- },
135
- get adapterTypeName() {
136
- return self.adapterConfig.type;
137
- },
138
- get rendererTypeNameSimple() {
139
- return self.rendererTypeNameState || getConf(self, 'defaultRendering');
140
- },
141
- get rendererTypeName() {
142
- const name = this.rendererTypeNameSimple;
143
- const rendererType = rendererTypes.get(name);
144
- if (!rendererType) {
145
- throw new Error(`unknown renderer ${name}`);
146
- }
147
- return rendererType;
148
- },
149
- // subclasses can define these, as snpcoverage track does
150
- get filters() {
151
- return undefined;
152
- },
153
- get scaleType() {
154
- return self.scale || getConf(self, 'scaleType');
155
- },
156
- get maxScore() {
157
- var _a;
158
- return (_a = self.constraints.max) !== null && _a !== void 0 ? _a : getConf(self, 'maxScore');
159
- },
160
- get minScore() {
161
- var _a;
162
- return (_a = self.constraints.min) !== null && _a !== void 0 ? _a : getConf(self, 'minScore');
163
- },
164
- }))
165
- .views(self => ({
166
- get rendererConfig() {
167
- const configBlob = getConf(self, ['renderers', self.rendererTypeName]) || {};
168
- const { color, displayCrossHatches, fill, minSize, negColor, posColor, summaryScoreMode, scaleType, } = self;
169
- return self.rendererType.configSchema.create({
170
- ...configBlob,
171
- ...(scaleType ? { scaleType } : {}),
172
- ...(fill !== undefined ? { filled: fill } : {}),
173
- ...(displayCrossHatches !== undefined
174
- ? { displayCrossHatches }
175
- : {}),
176
- ...(summaryScoreMode !== undefined ? { summaryScoreMode } : {}),
177
- ...(color !== undefined ? { color } : {}),
178
- ...(negColor !== undefined ? { negColor } : {}),
179
- ...(posColor !== undefined ? { posColor } : {}),
180
- ...(minSize !== undefined ? { minSize } : {}),
181
- }, getEnv(self));
182
- },
183
- }))
184
- .views(self => {
185
- let oldDomain = [0, 0];
186
- return {
187
- get filled() {
188
- const { fill, rendererConfig: conf } = self;
189
- return fill !== null && fill !== void 0 ? fill : readConfObject(conf, 'filled');
190
108
  },
191
- get summaryScoreModeSetting() {
192
- const { summaryScoreMode, rendererConfig: conf } = self;
193
- return summaryScoreMode !== null && summaryScoreMode !== void 0 ? summaryScoreMode : readConfObject(conf, 'summaryScoreMode');
109
+ /**
110
+ * #action
111
+ */
112
+ setColor(color) {
113
+ self.color = color;
194
114
  },
195
- get domain() {
196
- const { stats, scaleType, minScore, maxScore } = self;
197
- const ret = getNiceDomain({
198
- domain: [stats.scoreMin, stats.scoreMax],
199
- bounds: [minScore, maxScore],
200
- scaleType,
201
- });
202
- // avoid weird scalebar if log value and empty region displayed
203
- if (scaleType === 'log' && ret[1] === Number.MIN_VALUE) {
204
- return [0, Number.MIN_VALUE];
115
+ /**
116
+ * #action
117
+ */
118
+ setPosColor(color) {
119
+ self.posColor = color;
120
+ },
121
+ /**
122
+ * #action
123
+ */
124
+ setNegColor(color) {
125
+ self.negColor = color;
126
+ },
127
+ /**
128
+ * #action
129
+ */
130
+ setLoading(aborter) {
131
+ const { statsFetchInProgress: statsFetch } = self;
132
+ if (statsFetch !== undefined && !statsFetch.signal.aborted) {
133
+ statsFetch.abort();
205
134
  }
206
- // avoid returning a new object if it matches the old value
207
- if (JSON.stringify(oldDomain) !== JSON.stringify(ret)) {
208
- oldDomain = ret;
135
+ self.statsFetchInProgress = aborter;
136
+ },
137
+ /**
138
+ * #action
139
+ * this overrides the BaseLinearDisplayModel to avoid popping up a
140
+ * feature detail display, but still sets the feature selection on the
141
+ * model so listeners can detect a click
142
+ */
143
+ selectFeature(feature) {
144
+ const session = getSession(self);
145
+ if (isSelectionContainer(session)) {
146
+ session.setSelection(feature);
209
147
  }
210
- return oldDomain;
211
148
  },
212
- get needsScalebar() {
213
- return (self.rendererTypeName === 'XYPlotRenderer' ||
214
- self.rendererTypeName === 'LinePlotRenderer');
149
+ /**
150
+ * #action
151
+ */
152
+ setResolution(res) {
153
+ self.resolution = res;
215
154
  },
216
- get scaleOpts() {
217
- return {
218
- domain: this.domain,
219
- stats: self.stats,
220
- autoscaleType: this.autoscaleType,
221
- scaleType: self.scaleType,
222
- inverted: getConf(self, 'inverted'),
223
- };
155
+ /**
156
+ * #action
157
+ */
158
+ setFill(fill) {
159
+ if (fill === 0) {
160
+ self.fill = true;
161
+ self.minSize = 0;
162
+ }
163
+ else if (fill === 1) {
164
+ self.fill = false;
165
+ self.minSize = 1;
166
+ }
167
+ else if (fill === 2) {
168
+ self.fill = false;
169
+ self.minSize = 2;
170
+ }
224
171
  },
225
- get canHaveFill() {
226
- return self.rendererTypeName === 'XYPlotRenderer';
172
+ /**
173
+ * #action
174
+ */
175
+ toggleLogScale() {
176
+ if (self.scale !== 'log') {
177
+ self.scale = 'log';
178
+ }
179
+ else {
180
+ self.scale = 'linear';
181
+ }
227
182
  },
228
- get autoscaleType() {
229
- var _a;
230
- return (_a = self.autoscale) !== null && _a !== void 0 ? _a : getConf(self, 'autoscale');
183
+ /**
184
+ * #action
185
+ */
186
+ setScaleType(scale) {
187
+ self.scale = scale;
231
188
  },
232
- get displayCrossHatchesSetting() {
233
- const { displayCrossHatches: hatches, rendererConfig: conf } = self;
234
- return hatches !== null && hatches !== void 0 ? hatches : readConfObject(conf, 'displayCrossHatches');
189
+ /**
190
+ * #action
191
+ */
192
+ setSummaryScoreMode(val) {
193
+ self.summaryScoreMode = val;
235
194
  },
236
- };
237
- })
238
- .views(self => ({
239
- get ticks() {
240
- const { scaleType, domain, height } = self;
241
- const minimalTicks = getConf(self, 'minimalTicks');
242
- const inverted = getConf(self, 'inverted');
243
- const range = [height - YSCALEBAR_LABEL_OFFSET, YSCALEBAR_LABEL_OFFSET];
244
- const scale = getScale({
245
- scaleType,
246
- domain,
247
- range,
248
- inverted,
249
- });
250
- const ticks = axisPropsFromTickScale(scale, 4);
251
- return height < 100 || minimalTicks
252
- ? { ...ticks, values: domain }
253
- : ticks;
254
- },
255
- get adapterCapabilities() {
256
- return pluginManager.getAdapterType(self.adapterTypeName)
257
- .adapterCapabilities;
258
- },
259
- }))
260
- .views(self => {
261
- const { renderProps: superRenderProps } = self;
262
- return {
263
- renderProps() {
264
- const superProps = superRenderProps();
265
- const { filters, ticks, height, resolution, scaleOpts } = self;
266
- return {
267
- ...superProps,
268
- notReady: superProps.notReady || !self.statsReady,
269
- rpcDriverName: self.rpcDriverName,
270
- displayModel: self,
271
- config: self.rendererConfig,
272
- displayCrossHatches: self.displayCrossHatchesSetting,
273
- scaleOpts,
274
- resolution,
275
- height,
276
- ticks,
277
- filters,
278
- };
195
+ /**
196
+ * #action
197
+ */
198
+ setAutoscale(val) {
199
+ self.autoscale = val;
279
200
  },
280
- get hasResolution() {
281
- return self.adapterCapabilities.includes('hasResolution');
201
+ /**
202
+ * #action
203
+ */
204
+ setMaxScore(val) {
205
+ self.constraints.max = val;
282
206
  },
283
- get hasGlobalStats() {
284
- return self.adapterCapabilities.includes('hasGlobalStats');
207
+ /**
208
+ * #action
209
+ */
210
+ setRendererType(val) {
211
+ self.rendererTypeNameState = val;
285
212
  },
286
- get fillSetting() {
287
- if (self.filled) {
288
- return 0;
289
- }
290
- else if (!self.filled && self.minSize === 1) {
291
- return 1;
292
- }
293
- else {
294
- return 2;
213
+ /**
214
+ * #action
215
+ */
216
+ setMinScore(val) {
217
+ self.constraints.min = val;
218
+ },
219
+ /**
220
+ * #action
221
+ */
222
+ toggleCrossHatches() {
223
+ self.displayCrossHatches = !self.displayCrossHatches;
224
+ },
225
+ /**
226
+ * #action
227
+ */
228
+ setCrossHatches(cross) {
229
+ self.displayCrossHatches = cross;
230
+ },
231
+ }))
232
+ .views(self => ({
233
+ /**
234
+ * #getter
235
+ */
236
+ get TooltipComponent() {
237
+ return Tooltip;
238
+ },
239
+ /**
240
+ * #getter
241
+ */
242
+ get adapterTypeName() {
243
+ return self.adapterConfig.type;
244
+ },
245
+ /**
246
+ * #getter
247
+ */
248
+ get rendererTypeNameSimple() {
249
+ return self.rendererTypeNameState || getConf(self, 'defaultRendering');
250
+ },
251
+ /**
252
+ * #getter
253
+ */
254
+ get rendererTypeName() {
255
+ const name = this.rendererTypeNameSimple;
256
+ const rendererType = rendererTypes.get(name);
257
+ if (!rendererType) {
258
+ throw new Error(`unknown renderer ${name}`);
295
259
  }
260
+ return rendererType;
296
261
  },
297
- };
298
- })
299
- .views(self => {
300
- const { trackMenuItems: superTrackMenuItems } = self;
301
- const hasRenderings = getConf(self, 'defaultRendering');
302
- return {
303
- trackMenuItems() {
304
- return [
305
- ...superTrackMenuItems(),
306
- ...(self.hasResolution
307
- ? [
308
- {
309
- label: 'Resolution',
310
- subMenu: [
311
- {
312
- label: 'Finer resolution',
313
- onClick: () => self.setResolution(self.resolution * 5),
314
- },
315
- {
316
- label: 'Coarser resolution',
317
- onClick: () => self.setResolution(self.resolution / 5),
318
- },
319
- ],
320
- },
321
- {
322
- label: 'Summary score mode',
323
- subMenu: ['min', 'max', 'avg', 'whiskers'].map(elt => ({
324
- label: elt,
325
- type: 'radio',
326
- checked: self.summaryScoreModeSetting === elt,
327
- onClick: () => self.setSummaryScoreMode(elt),
328
- })),
329
- },
330
- ]
331
- : []),
332
- ...(self.canHaveFill
333
- ? [
334
- {
335
- label: 'Fill mode',
336
- subMenu: ['filled', 'no fill', 'no fill w/ emphasis'].map((elt, idx) => ({
337
- label: elt,
338
- type: 'radio',
339
- checked: self.fillSetting === idx,
340
- onClick: () => self.setFill(idx),
341
- })),
342
- },
343
- ]
344
- : []),
345
- {
346
- label: self.scaleType === 'log' ? 'Set linear scale' : 'Set log scale',
347
- onClick: () => self.toggleLogScale(),
348
- },
349
- ...(self.needsScalebar
350
- ? [
351
- {
352
- type: 'checkbox',
353
- label: 'Draw cross hatches',
354
- checked: self.displayCrossHatchesSetting,
355
- onClick: () => self.toggleCrossHatches(),
356
- },
357
- ]
358
- : []),
359
- ...(hasRenderings
360
- ? [
361
- {
362
- label: 'Renderer type',
363
- subMenu: ['xyplot', 'density', 'line'].map(key => ({
364
- label: key,
365
- type: 'radio',
366
- checked: self.rendererTypeNameSimple === key,
367
- onClick: () => self.setRendererType(key),
368
- })),
369
- },
370
- ]
371
- : []),
372
- {
373
- label: 'Autoscale type',
374
- subMenu: [
375
- ['local', 'Local'],
376
- ...(self.hasGlobalStats
377
- ? [
378
- ['global', 'Global'],
379
- ['globalsd', 'Global ± 3σ'],
380
- ]
381
- : []),
382
- ['localsd', 'Local ± 3σ'],
383
- ].map(([val, label]) => ({
384
- label,
385
- type: 'radio',
386
- checked: self.autoscaleType === val,
387
- onClick: () => self.setAutoscale(val),
388
- })),
389
- },
390
- {
391
- label: 'Set min/max score',
392
- onClick: () => {
393
- getSession(self).queueDialog(handleClose => [
394
- SetMinMaxDlg,
395
- { model: self, handleClose },
396
- ]);
397
- },
398
- },
399
- {
400
- label: 'Set color',
401
- onClick: () => {
402
- getSession(self).queueDialog(handleClose => [
403
- SetColorDlg,
404
- { model: self, handleClose },
405
- ]);
406
- },
407
- },
408
- ];
262
+ /**
263
+ * #getter
264
+ * subclasses can define these, as snpcoverage track does
265
+ */
266
+ get filters() {
267
+ return undefined;
268
+ },
269
+ /**
270
+ * #getter
271
+ */
272
+ get scaleType() {
273
+ return self.scale || getConf(self, 'scaleType');
409
274
  },
410
- };
411
- })
412
- .actions(self => {
413
- const { reload: superReload, renderSvg: superRenderSvg } = self;
414
- return {
415
- // re-runs stats and refresh whole display on reload
416
- async reload() {
417
- self.setError();
418
- const aborter = new AbortController();
419
- self.setLoading(aborter);
420
- try {
421
- const stats = await getStats(self, {
422
- signal: aborter.signal,
423
- ...self.renderProps(),
275
+ /**
276
+ * #getter
277
+ */
278
+ get maxScore() {
279
+ var _a;
280
+ return (_a = self.constraints.max) !== null && _a !== void 0 ? _a : getConf(self, 'maxScore');
281
+ },
282
+ /**
283
+ * #getter
284
+ */
285
+ get minScore() {
286
+ var _a;
287
+ return (_a = self.constraints.min) !== null && _a !== void 0 ? _a : getConf(self, 'minScore');
288
+ },
289
+ }))
290
+ .views(self => ({
291
+ /**
292
+ * #getter
293
+ */
294
+ get rendererConfig() {
295
+ const configBlob = getConf(self, ['renderers', self.rendererTypeName]) || {};
296
+ const { color, displayCrossHatches, fill, minSize, negColor, posColor, summaryScoreMode, scaleType, } = self;
297
+ return self.rendererType.configSchema.create({
298
+ ...configBlob,
299
+ ...(scaleType ? { scaleType } : {}),
300
+ ...(fill !== undefined ? { filled: fill } : {}),
301
+ ...(displayCrossHatches !== undefined
302
+ ? { displayCrossHatches }
303
+ : {}),
304
+ ...(summaryScoreMode !== undefined ? { summaryScoreMode } : {}),
305
+ ...(color !== undefined ? { color } : {}),
306
+ ...(negColor !== undefined ? { negColor } : {}),
307
+ ...(posColor !== undefined ? { posColor } : {}),
308
+ ...(minSize !== undefined ? { minSize } : {}),
309
+ }, getEnv(self));
310
+ },
311
+ }))
312
+ .views(self => {
313
+ let oldDomain = [0, 0];
314
+ return {
315
+ /**
316
+ * #getter
317
+ */
318
+ get filled() {
319
+ const { fill, rendererConfig: conf } = self;
320
+ return fill !== null && fill !== void 0 ? fill : readConfObject(conf, 'filled');
321
+ },
322
+ /**
323
+ * #getter
324
+ */
325
+ get summaryScoreModeSetting() {
326
+ const { summaryScoreMode, rendererConfig: conf } = self;
327
+ return summaryScoreMode !== null && summaryScoreMode !== void 0 ? summaryScoreMode : readConfObject(conf, 'summaryScoreMode');
328
+ },
329
+ /**
330
+ * #getter
331
+ */
332
+ get domain() {
333
+ const { stats, scaleType, minScore, maxScore } = self;
334
+ const ret = getNiceDomain({
335
+ domain: [stats.scoreMin, stats.scoreMax],
336
+ bounds: [minScore, maxScore],
337
+ scaleType,
424
338
  });
425
- if (isAlive(self)) {
426
- self.updateStats(stats);
427
- superReload();
339
+ // avoid weird scalebar if log value and empty region displayed
340
+ if (scaleType === 'log' && ret[1] === Number.MIN_VALUE) {
341
+ return [0, Number.MIN_VALUE];
428
342
  }
429
- }
430
- catch (e) {
431
- self.setError(e);
432
- }
433
- },
434
- afterAttach() {
435
- statsAutorun(self);
343
+ // avoid returning a new object if it matches the old value
344
+ if (JSON.stringify(oldDomain) !== JSON.stringify(ret)) {
345
+ oldDomain = ret;
346
+ }
347
+ return oldDomain;
348
+ },
349
+ /**
350
+ * #getter
351
+ */
352
+ get needsScalebar() {
353
+ return (self.rendererTypeName === 'XYPlotRenderer' ||
354
+ self.rendererTypeName === 'LinePlotRenderer');
355
+ },
356
+ /**
357
+ * #getter
358
+ */
359
+ get scaleOpts() {
360
+ return {
361
+ domain: this.domain,
362
+ stats: self.stats,
363
+ autoscaleType: this.autoscaleType,
364
+ scaleType: self.scaleType,
365
+ inverted: getConf(self, 'inverted'),
366
+ };
367
+ },
368
+ /**
369
+ * #getter
370
+ */
371
+ get canHaveFill() {
372
+ return self.rendererTypeName === 'XYPlotRenderer';
373
+ },
374
+ /**
375
+ * #getter
376
+ */
377
+ get autoscaleType() {
378
+ var _a;
379
+ return (_a = self.autoscale) !== null && _a !== void 0 ? _a : getConf(self, 'autoscale');
380
+ },
381
+ /**
382
+ * #getter
383
+ */
384
+ get displayCrossHatchesSetting() {
385
+ const { displayCrossHatches: hatches, rendererConfig: conf } = self;
386
+ return hatches !== null && hatches !== void 0 ? hatches : readConfObject(conf, 'displayCrossHatches');
387
+ },
388
+ };
389
+ })
390
+ .views(self => ({
391
+ /**
392
+ * #getter
393
+ */
394
+ get ticks() {
395
+ const { scaleType, domain, height } = self;
396
+ const minimalTicks = getConf(self, 'minimalTicks');
397
+ const inverted = getConf(self, 'inverted');
398
+ const range = [height - YSCALEBAR_LABEL_OFFSET, YSCALEBAR_LABEL_OFFSET];
399
+ const scale = getScale({
400
+ scaleType,
401
+ domain,
402
+ range,
403
+ inverted,
404
+ });
405
+ const ticks = axisPropsFromTickScale(scale, 4);
406
+ return height < 100 || minimalTicks
407
+ ? { ...ticks, values: domain }
408
+ : ticks;
436
409
  },
437
- async renderSvg(opts) {
438
- await when(() => self.statsReady && !!self.regionCannotBeRenderedText);
439
- const { needsScalebar, stats } = self;
440
- const { offsetPx } = getContainingView(self);
441
- return (React.createElement(React.Fragment, null,
442
- React.createElement("g", { id: "snpcov" }, await superRenderSvg(opts)),
443
- needsScalebar && stats ? (React.createElement("g", { transform: `translate(${Math.max(-offsetPx, 0)})` },
444
- React.createElement(YScaleBar, { model: self, orientation: "left" }))) : null));
410
+ /**
411
+ * #getter
412
+ */
413
+ get adapterCapabilities() {
414
+ const type = self.adapterTypeName;
415
+ return pluginManager.getAdapterType(type).adapterCapabilities;
445
416
  },
446
- };
447
- });
417
+ }))
418
+ .views(self => {
419
+ const { renderProps: superRenderProps } = self;
420
+ return {
421
+ /**
422
+ * #method
423
+ */
424
+ renderProps() {
425
+ const superProps = superRenderProps();
426
+ const { filters, ticks, height, resolution, scaleOpts } = self;
427
+ return {
428
+ ...superProps,
429
+ notReady: superProps.notReady || !self.statsReady,
430
+ rpcDriverName: self.rpcDriverName,
431
+ displayModel: self,
432
+ config: self.rendererConfig,
433
+ displayCrossHatches: self.displayCrossHatchesSetting,
434
+ scaleOpts,
435
+ resolution,
436
+ height,
437
+ ticks,
438
+ filters,
439
+ };
440
+ },
441
+ /**
442
+ * #getter
443
+ */
444
+ get hasResolution() {
445
+ return self.adapterCapabilities.includes('hasResolution');
446
+ },
447
+ /**
448
+ * #getter
449
+ */
450
+ get hasGlobalStats() {
451
+ return self.adapterCapabilities.includes('hasGlobalStats');
452
+ },
453
+ /**
454
+ * #getter
455
+ */
456
+ get fillSetting() {
457
+ if (self.filled) {
458
+ return 0;
459
+ }
460
+ else if (!self.filled && self.minSize === 1) {
461
+ return 1;
462
+ }
463
+ else {
464
+ return 2;
465
+ }
466
+ },
467
+ };
468
+ })
469
+ .views(self => {
470
+ const { trackMenuItems: superTrackMenuItems } = self;
471
+ const hasRenderings = getConf(self, 'defaultRendering');
472
+ return {
473
+ /**
474
+ * #method
475
+ */
476
+ trackMenuItems() {
477
+ return [
478
+ ...superTrackMenuItems(),
479
+ ...(self.hasResolution
480
+ ? [
481
+ {
482
+ label: 'Resolution',
483
+ subMenu: [
484
+ {
485
+ label: 'Finer resolution',
486
+ onClick: () => self.setResolution(self.resolution * 5),
487
+ },
488
+ {
489
+ label: 'Coarser resolution',
490
+ onClick: () => self.setResolution(self.resolution / 5),
491
+ },
492
+ ],
493
+ },
494
+ {
495
+ label: 'Summary score mode',
496
+ subMenu: ['min', 'max', 'avg', 'whiskers'].map(elt => ({
497
+ label: elt,
498
+ type: 'radio',
499
+ checked: self.summaryScoreModeSetting === elt,
500
+ onClick: () => self.setSummaryScoreMode(elt),
501
+ })),
502
+ },
503
+ ]
504
+ : []),
505
+ ...(self.canHaveFill
506
+ ? [
507
+ {
508
+ label: 'Fill mode',
509
+ subMenu: ['filled', 'no fill', 'no fill w/ emphasis'].map((elt, idx) => ({
510
+ label: elt,
511
+ type: 'radio',
512
+ checked: self.fillSetting === idx,
513
+ onClick: () => self.setFill(idx),
514
+ })),
515
+ },
516
+ ]
517
+ : []),
518
+ {
519
+ label: self.scaleType === 'log' ? 'Set linear scale' : 'Set log scale',
520
+ onClick: () => self.toggleLogScale(),
521
+ },
522
+ ...(self.needsScalebar
523
+ ? [
524
+ {
525
+ type: 'checkbox',
526
+ label: 'Draw cross hatches',
527
+ checked: self.displayCrossHatchesSetting,
528
+ onClick: () => self.toggleCrossHatches(),
529
+ },
530
+ ]
531
+ : []),
532
+ ...(hasRenderings
533
+ ? [
534
+ {
535
+ label: 'Renderer type',
536
+ subMenu: ['xyplot', 'density', 'line'].map(key => ({
537
+ label: key,
538
+ type: 'radio',
539
+ checked: self.rendererTypeNameSimple === key,
540
+ onClick: () => self.setRendererType(key),
541
+ })),
542
+ },
543
+ ]
544
+ : []),
545
+ {
546
+ label: 'Autoscale type',
547
+ subMenu: [
548
+ ['local', 'Local'],
549
+ ...(self.hasGlobalStats
550
+ ? [
551
+ ['global', 'Global'],
552
+ ['globalsd', 'Global ± 3σ'],
553
+ ]
554
+ : []),
555
+ ['localsd', 'Local ± 3σ'],
556
+ ].map(([val, label]) => ({
557
+ label,
558
+ type: 'radio',
559
+ checked: self.autoscaleType === val,
560
+ onClick: () => self.setAutoscale(val),
561
+ })),
562
+ },
563
+ {
564
+ label: 'Set min/max score',
565
+ onClick: () => {
566
+ getSession(self).queueDialog(handleClose => [
567
+ SetMinMaxDlg,
568
+ { model: self, handleClose },
569
+ ]);
570
+ },
571
+ },
572
+ {
573
+ label: 'Set color',
574
+ onClick: () => {
575
+ getSession(self).queueDialog(handleClose => [
576
+ SetColorDlg,
577
+ { model: self, handleClose },
578
+ ]);
579
+ },
580
+ },
581
+ ];
582
+ },
583
+ };
584
+ })
585
+ .actions(self => {
586
+ const { reload: superReload, renderSvg: superRenderSvg } = self;
587
+ return {
588
+ /**
589
+ * #action
590
+ * re-runs stats and refresh whole display on reload
591
+ */
592
+ async reload() {
593
+ self.setError();
594
+ const aborter = new AbortController();
595
+ self.setLoading(aborter);
596
+ try {
597
+ const stats = await getStats(self, {
598
+ signal: aborter.signal,
599
+ ...self.renderProps(),
600
+ });
601
+ if (isAlive(self)) {
602
+ self.updateStats(stats);
603
+ superReload();
604
+ }
605
+ }
606
+ catch (e) {
607
+ self.setError(e);
608
+ }
609
+ },
610
+ afterAttach() {
611
+ statsAutorun(self);
612
+ },
613
+ /**
614
+ * #action
615
+ */
616
+ async renderSvg(opts) {
617
+ await when(() => self.statsReady && !!self.regionCannotBeRenderedText);
618
+ const { needsScalebar, stats } = self;
619
+ const { offsetPx } = getContainingView(self);
620
+ return (React.createElement(React.Fragment, null,
621
+ React.createElement("g", { id: "snpcov" }, await superRenderSvg(opts)),
622
+ needsScalebar && stats ? (React.createElement("g", { transform: `translate(${Math.max(-offsetPx, 0)})` },
623
+ React.createElement(YScaleBar, { model: self, orientation: "left" }))) : null));
624
+ },
625
+ };
626
+ });
627
+ }
448
628
  export default stateModelFactory;
449
629
  //# sourceMappingURL=model.js.map