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