genoverse 3.2.0 → 4.0.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 (217) hide show
  1. package/.eslintrc.js +93 -162
  2. package/.github/workflows/test.yml +9 -10
  3. package/.github/workflows/update-gh-pages.yml +33 -0
  4. package/LICENSE.TXT +2 -2
  5. package/README.md +174 -3
  6. package/{i → assets}/sort_handle.png +0 -0
  7. package/babel.config.js +19 -0
  8. package/dist/129.css +334 -0
  9. package/dist/129.css.map +1 -0
  10. package/dist/129.genoverse.js +2 -0
  11. package/dist/129.genoverse.js.map +1 -0
  12. package/dist/15d98c18221c8bcb2334.ttf +0 -0
  13. package/dist/166.css +2 -0
  14. package/dist/166.genoverse.js +1 -0
  15. package/dist/216.css +20 -0
  16. package/dist/216.css.map +1 -0
  17. package/dist/232.css +114 -0
  18. package/dist/232.css.map +1 -0
  19. package/dist/232.genoverse.js +2 -0
  20. package/dist/232.genoverse.js.map +1 -0
  21. package/dist/2e659e443f3e98569e9f.png +0 -0
  22. package/dist/394.css +114 -0
  23. package/dist/394.css.map +1 -0
  24. package/dist/394.genoverse.js +2 -0
  25. package/dist/394.genoverse.js.map +1 -0
  26. package/dist/469.css +24 -0
  27. package/dist/469.css.map +1 -0
  28. package/dist/469.genoverse.js +2 -0
  29. package/dist/469.genoverse.js.map +1 -0
  30. package/dist/4896d4b04430cc3dfb06.woff2 +0 -0
  31. package/dist/530.css +39 -0
  32. package/dist/530.css.map +1 -0
  33. package/dist/530.genoverse.js +2 -0
  34. package/dist/530.genoverse.js.map +1 -0
  35. package/dist/547.css +469 -0
  36. package/dist/547.css.map +1 -0
  37. package/dist/547.genoverse.js +1 -0
  38. package/dist/729.css +315 -0
  39. package/dist/729.css.map +1 -0
  40. package/dist/79da213423ac0def2058.ttf +0 -0
  41. package/dist/804.genoverse.js +2 -0
  42. package/dist/804.genoverse.js.map +1 -0
  43. package/dist/842.genoverse.js +2 -0
  44. package/dist/842.genoverse.js.map +1 -0
  45. package/dist/893.genoverse.js +2 -0
  46. package/dist/893.genoverse.js.map +1 -0
  47. package/dist/949.css +315 -0
  48. package/dist/949.css.map +1 -0
  49. package/dist/949.genoverse.js +2 -0
  50. package/dist/949.genoverse.js.map +1 -0
  51. package/dist/952.css +315 -0
  52. package/dist/952.css.map +1 -0
  53. package/dist/952.genoverse.js +2 -0
  54. package/dist/952.genoverse.js.map +1 -0
  55. package/dist/d79c2ec96ab9ff1161a2.woff2 +0 -0
  56. package/dist/genoverse.js +2 -0
  57. package/dist/genoverse.js.map +1 -0
  58. package/index.html +13 -14
  59. package/jest.config.js +5 -0
  60. package/jest.setup.js +13 -0
  61. package/package.json +29 -12
  62. package/{css → src/css}/controlPanel.css +0 -0
  63. package/{css → src/css}/fileDrop.css +0 -0
  64. package/src/css/fontawesome.css +3 -0
  65. package/{css → src/css}/fullscreen.css +0 -0
  66. package/{css → src/css}/genoverse.css +1 -1
  67. package/{css → src/css}/karyotype.css +2 -0
  68. package/{css → src/css}/resizer.css +0 -0
  69. package/{css → src/css}/tooltips.css +0 -0
  70. package/{css → src/css}/trackControls.css +0 -0
  71. package/src/js/Genoverse.js +1747 -0
  72. package/{js → src/js}/Track/Controller/Sequence.js +6 -4
  73. package/src/js/Track/Controller/Stranded.js +83 -0
  74. package/{js → src/js}/Track/Controller.js +201 -160
  75. package/src/js/Track/Model/File/BAM.js +47 -0
  76. package/src/js/Track/Model/File/BED.js +122 -0
  77. package/src/js/Track/Model/File/GFF.js +42 -0
  78. package/src/js/Track/Model/File/VCF.js +109 -0
  79. package/src/js/Track/Model/File/WIG.js +82 -0
  80. package/src/js/Track/Model/File.js +36 -0
  81. package/src/js/Track/Model/Gene/Ensembl.js +24 -0
  82. package/{js → src/js}/Track/Model/Gene.js +3 -1
  83. package/src/js/Track/Model/Sequence/Ensembl.js +6 -0
  84. package/{js → src/js}/Track/Model/Sequence/Fasta.js +24 -17
  85. package/{js → src/js}/Track/Model/Sequence.js +10 -7
  86. package/{js → src/js}/Track/Model/SequenceVariation.js +17 -11
  87. package/{js → src/js}/Track/Model/Stranded.js +11 -8
  88. package/src/js/Track/Model/Transcript/Ensembl.js +73 -0
  89. package/{js → src/js}/Track/Model/Transcript.js +3 -1
  90. package/{js → src/js}/Track/Model.js +125 -93
  91. package/{js → src/js}/Track/View/Gene/Ensembl.js +6 -4
  92. package/src/js/Track/View/Gene.js +8 -0
  93. package/{js → src/js}/Track/View/Sequence.js +18 -22
  94. package/src/js/Track/View/SequenceVariation.js +117 -0
  95. package/src/js/Track/View/Transcript/Ensembl.js +17 -0
  96. package/src/js/Track/View/Transcript.js +32 -0
  97. package/{js → src/js}/Track/View.js +200 -159
  98. package/{js → src/js}/Track/library/Chromosome.js +18 -13
  99. package/src/js/Track/library/File/BAM.js +34 -0
  100. package/src/js/Track/library/File/BED.js +27 -0
  101. package/src/js/Track/library/File/BIGBED.js +51 -0
  102. package/src/js/Track/library/File/BIGWIG.js +54 -0
  103. package/src/js/Track/library/File/GFF.js +10 -0
  104. package/{js → src/js}/Track/library/File/VCF.js +29 -22
  105. package/src/js/Track/library/File/WIG.js +8 -0
  106. package/{js → src/js}/Track/library/File.js +4 -2
  107. package/src/js/Track/library/Gene.js +44 -0
  108. package/src/js/Track/library/Graph/Bar.js +263 -0
  109. package/src/js/Track/library/Graph/Line.js +335 -0
  110. package/{js → src/js}/Track/library/Graph.js +137 -114
  111. package/{js → src/js}/Track/library/HighlightRegion.js +118 -93
  112. package/src/js/Track/library/Legend.js +258 -0
  113. package/{js → src/js}/Track/library/Scalebar.js +69 -49
  114. package/{js → src/js}/Track/library/Scaleline.js +29 -27
  115. package/src/js/Track/library/Static.js +82 -0
  116. package/{js → src/js}/Track/library/dbSNP.js +47 -50
  117. package/src/js/Track.js +651 -0
  118. package/{js → src/js}/genomes/grch37.js +52 -52
  119. package/{js → src/js}/genomes/grch38.js +52 -52
  120. package/src/js/lib/BWReader.js +562 -0
  121. package/src/js/lib/VCFReader.js +296 -0
  122. package/src/js/lib/dalliance/bam.js +517 -0
  123. package/src/js/lib/dalliance/bin.js +317 -0
  124. package/src/js/lib/dalliance/jszlib-inflate.js +2159 -0
  125. package/src/js/lib/dalliance/lh3utils.js +105 -0
  126. package/src/js/lib/dalliance/sha1.js +334 -0
  127. package/src/js/lib/import-tracks.js +42 -0
  128. package/{js/lib → src/js/lib/jquery-plugins}/jquery.mousehold.js +0 -0
  129. package/{js/lib → src/js/lib/jquery-plugins}/jquery.mousewheel.js +0 -0
  130. package/{js/lib → src/js/lib/jquery-plugins}/jquery.tipsy.js +0 -0
  131. package/src/js/lib/jquery.js +26 -0
  132. package/src/js/lib/polyfills.js +11 -0
  133. package/src/js/lib/wrap-functions.js +88 -0
  134. package/src/js/plugins/controlPanel.js +388 -0
  135. package/src/js/plugins/fileDrop.js +81 -0
  136. package/src/js/plugins/focusRegion.js +13 -0
  137. package/{js → src/js}/plugins/fullscreen.js +18 -14
  138. package/{js → src/js}/plugins/karyotype.js +51 -45
  139. package/src/js/plugins/resizer.js +52 -0
  140. package/{js → src/js}/plugins/tooltips.js +31 -29
  141. package/src/js/plugins/trackControls.js +159 -0
  142. package/test/View/render-legends.test.js +1 -1
  143. package/test/change-width.test.js +71 -0
  144. package/test/create-and-destroy.test.js +2 -2
  145. package/test/track-ordering.test.js +3 -2
  146. package/test/track_config/config-settings.test.js +1 -1
  147. package/test/utils.js +4 -2
  148. package/webpack.config.js +103 -34
  149. package/css/font-awesome.css +0 -3
  150. package/expanded.html +0 -120
  151. package/fontawesome/css/fontawesome.min.css +0 -5
  152. package/fontawesome/css/regular.min.css +0 -5
  153. package/fontawesome/css/solid.min.css +0 -5
  154. package/fontawesome/webfonts/fa-brands-400.ttf +0 -0
  155. package/fontawesome/webfonts/fa-brands-400.woff +0 -0
  156. package/fontawesome/webfonts/fa-brands-400.woff2 +0 -0
  157. package/fontawesome/webfonts/fa-regular-400.ttf +0 -0
  158. package/fontawesome/webfonts/fa-regular-400.woff +0 -0
  159. package/fontawesome/webfonts/fa-regular-400.woff2 +0 -0
  160. package/fontawesome/webfonts/fa-solid-900.ttf +0 -0
  161. package/fontawesome/webfonts/fa-solid-900.woff +0 -0
  162. package/fontawesome/webfonts/fa-solid-900.woff2 +0 -0
  163. package/help.pdf +0 -0
  164. package/index.js +0 -83
  165. package/js/Genoverse.js +0 -1681
  166. package/js/Track/Controller/Stranded.js +0 -73
  167. package/js/Track/Model/File/BAM.js +0 -44
  168. package/js/Track/Model/File/BED.js +0 -116
  169. package/js/Track/Model/File/GFF.js +0 -40
  170. package/js/Track/Model/File/VCF.js +0 -101
  171. package/js/Track/Model/File/WIG.js +0 -67
  172. package/js/Track/Model/File.js +0 -36
  173. package/js/Track/Model/Gene/Ensembl.js +0 -22
  174. package/js/Track/Model/Sequence/Ensembl.js +0 -4
  175. package/js/Track/Model/Transcript/Ensembl.js +0 -67
  176. package/js/Track/View/Gene.js +0 -6
  177. package/js/Track/View/Sequence/Variation.js +0 -115
  178. package/js/Track/View/Transcript/Ensembl.js +0 -12
  179. package/js/Track/View/Transcript.js +0 -28
  180. package/js/Track/library/File/BAM.js +0 -30
  181. package/js/Track/library/File/BED.js +0 -24
  182. package/js/Track/library/File/BIGBED.js +0 -47
  183. package/js/Track/library/File/BIGWIG.js +0 -52
  184. package/js/Track/library/File/GFF.js +0 -9
  185. package/js/Track/library/File/WIG.js +0 -5
  186. package/js/Track/library/Gene.js +0 -37
  187. package/js/Track/library/Graph/Bar.js +0 -235
  188. package/js/Track/library/Graph/Line.js +0 -296
  189. package/js/Track/library/Legend.js +0 -224
  190. package/js/Track/library/Static.js +0 -78
  191. package/js/Track.js +0 -632
  192. package/js/genoverse.min.js +0 -2
  193. package/js/genoverse.min.js.map +0 -1
  194. package/js/lib/BWReader.js +0 -578
  195. package/js/lib/Base.js +0 -145
  196. package/js/lib/VCFReader.js +0 -286
  197. package/js/lib/dalliance/js/bam.js +0 -494
  198. package/js/lib/dalliance/js/bin.js +0 -185
  199. package/js/lib/dalliance/js/das.js +0 -749
  200. package/js/lib/dalliance/js/utils.js +0 -370
  201. package/js/lib/dalliance-lib.js +0 -3594
  202. package/js/lib/dalliance-lib.min.js +0 -68
  203. package/js/lib/jDataView.js +0 -2
  204. package/js/lib/jParser.js +0 -192
  205. package/js/lib/jquery-ui.js +0 -8
  206. package/js/lib/jquery.js +0 -2
  207. package/js/lib/rtree.js +0 -1
  208. package/js/plugins/controlPanel.js +0 -395
  209. package/js/plugins/fileDrop.js +0 -62
  210. package/js/plugins/focusRegion.js +0 -12
  211. package/js/plugins/resizer.js +0 -45
  212. package/js/plugins/trackControls.js +0 -143
  213. package/utils/expandedTemplate.html +0 -46
  214. package/utils/git-hooks/post-commit +0 -9
  215. package/utils/git-hooks/pre-commit +0 -7
  216. package/utils/git-hooks/setup +0 -6
  217. package/utils/makeExpanded.js +0 -19
@@ -1,6 +1,9 @@
1
1
  // These are abstract classes, implemented by Graph.Bar and Graph.Line. They will not work properly on their own.
2
2
 
3
- Genoverse.Track.Controller.Graph = Genoverse.Track.Controller.extend({
3
+ import Track, { Controller as TrackController, Model as TrackModel, View as TrackView } from '../../Track';
4
+ import Legend from './Legend';
5
+
6
+ const Controller = TrackController.extend({
4
7
  setYRange: function (min, max) {
5
8
  if (this.browser.dragging) {
6
9
  return;
@@ -16,32 +19,35 @@ Genoverse.Track.Controller.Graph = Genoverse.Track.Controller.extend({
16
19
  },
17
20
 
18
21
  yMinMaxFromFeatures: function (features) {
19
- var min = Infinity;
20
- var max = -Infinity;
21
- var i, j;
22
+ let min = Infinity;
23
+ let max = -Infinity;
22
24
 
23
25
  if (this.prop('type') === 'Line') {
24
- for (i = 0; i < features.length; i++) {
25
- for (j = 0; j < features[i].coords.length; j++) {
26
- if (!isNaN(features[i].coords[j][1])) {
27
- min = Math.min(min, features[i].coords[j][1]);
28
- max = Math.max(max, features[i].coords[j][1]);
26
+ features.forEach(
27
+ ({ coords }) => coords.forEach(
28
+ ([ , y ]) => {
29
+ if (!isNaN(y)) {
30
+ min = Math.min(min, y);
31
+ max = Math.max(max, y);
32
+ }
29
33
  }
30
- }
31
- }
34
+ )
35
+ );
32
36
  } else {
33
- for (i = 0; i < features.length; i++) {
34
- if (!isNaN(features[i].height)) {
35
- min = Math.min(min, features[i].height);
36
- max = Math.max(max, features[i].height);
37
+ features.forEach(
38
+ ({ height }) => {
39
+ if (!isNaN(height)) {
40
+ min = Math.min(min, height);
41
+ max = Math.max(max, height);
42
+ }
37
43
  }
38
- }
44
+ );
39
45
  }
40
46
 
41
47
  min = min === Infinity ? 0 : min;
42
48
  max = max === -Infinity ? 0 : max;
43
49
 
44
- return { min: min, max: max };
50
+ return { min, max };
45
51
  },
46
52
 
47
53
  afterSetName: function () {
@@ -50,8 +56,8 @@ Genoverse.Track.Controller.Graph = Genoverse.Track.Controller.extend({
50
56
 
51
57
  visibleFeatureHeight: function () {
52
58
  if (this.prop('rescaleable') === 'auto') {
53
- var yScale = this.track.getYScale();
54
- var y = this.yMinMaxFromFeatures(this.model.findFeatures(this.browser.chr, this.browser.start, this.browser.end));
59
+ const yScale = this.track.getYScale();
60
+ const y = this.yMinMaxFromFeatures(this.model.findFeatures(this.browser.chr, this.browser.start, this.browser.end));
55
61
 
56
62
  return Math.ceil(Math.max(yScale * (y.max - y.min), this.prop('hideEmpty') ? 0 : this.minLabelHeight));
57
63
  }
@@ -59,17 +65,17 @@ Genoverse.Track.Controller.Graph = Genoverse.Track.Controller.extend({
59
65
  return this.prop('height');
60
66
  },
61
67
 
62
- resize: function () {
63
- var prevHeight = this.prop('height');
64
- var rtn = this.base.apply(this, arguments);
65
- var height = this.prop('height');
68
+ resize: function (...args) {
69
+ const prevHeight = this.prop('height');
70
+ const rtn = this.base(...args);
71
+ const height = this.prop('height');
66
72
 
67
73
  if (prevHeight !== height) {
68
74
  if (this.prop('rescaleable') === true) {
69
- var prevRange = this.prop('range');
70
- var maxDP = Math.max.apply(null, prevRange.map(function (r) { return (r.toString().split('.')[1] || '').length; }));
71
- var prevRangeSize = prevRange[1] - prevRange[0];
72
- var rangeChange = Math.ceil((prevRangeSize * (height / prevHeight) - prevRangeSize) / 2);
75
+ const prevRange = this.prop('range');
76
+ const maxDP = Math.max.apply(null, prevRange.map(r => (r.toString().split('.')[1] || '').length));
77
+ const prevRangeSize = prevRange[1] - prevRange[0];
78
+ const rangeChange = Math.ceil((prevRangeSize * (height / prevHeight) - prevRangeSize) / 2);
73
79
 
74
80
  this.setYRange(
75
81
  parseFloat((prevRange[0] - rangeChange).toFixed(maxDP), 10),
@@ -80,25 +86,26 @@ Genoverse.Track.Controller.Graph = Genoverse.Track.Controller.extend({
80
86
  }
81
87
  }
82
88
 
83
- (this.prop('expander') || $()).hide();
84
- (this.prop('resizer') || $()).removeClass('gv-resizer-expander');
89
+ this.prop('expander')?.hide();
90
+ this.prop('resizer')?.removeClass('gv-resizer-expander');
85
91
 
86
92
  return rtn;
87
93
  },
88
94
 
89
- autoResize: function () {
95
+ autoResize: function (...args) {
90
96
  if (this.prop('rescaleable') === 'auto') {
91
- var visibleFeatures = this.model.findFeatures(this.browser.chr, this.browser.start, this.browser.end);
97
+ const visibleFeatures = this.model.findFeatures(this.browser.chr, this.browser.start, this.browser.end);
92
98
 
93
99
  if (visibleFeatures.length) {
94
- var range = this.prop('range');
95
- var y = this.yMinMaxFromFeatures(visibleFeatures);
100
+ const range = this.prop('range');
101
+ const y = this.yMinMaxFromFeatures(visibleFeatures);
96
102
 
97
103
  if (y.min || y.max) {
98
- var maxDP = Math.max.apply(null, range.map(function (r) { return (r.toString().split('.')[1] || '').length; }));
99
- var round = Math.pow(10, maxDP);
100
- var minY = parseFloat((Math.floor(y.min * round) / round).toFixed(maxDP), 10);
101
- var maxY = parseFloat((Math.ceil(y.max * round) / round).toFixed(maxDP), 10);
104
+ const maxDP = Math.max.apply(null, range.map(r => (r.toString().split('.')[1] || '').length));
105
+ const round = 10 ** maxDP;
106
+
107
+ let minY = parseFloat((Math.floor(y.min * round) / round).toFixed(maxDP), 10);
108
+ let maxY = parseFloat((Math.ceil(y.max * round) / round).toFixed(maxDP), 10);
102
109
 
103
110
  if (this.prop('showZeroY')) {
104
111
  minY = Math.min(minY, 0);
@@ -110,19 +117,19 @@ Genoverse.Track.Controller.Graph = Genoverse.Track.Controller.extend({
110
117
  }
111
118
 
112
119
  if (minY !== range[0] || maxY !== range[1]) {
113
- return this.setYRange(minY, maxY);
120
+ this.setYRange(minY, maxY);
114
121
  }
115
122
  }
116
123
  }
117
124
  } else {
118
- return this.base.apply(this, arguments);
125
+ this.base(...args);
119
126
  }
120
127
  },
121
128
 
122
- makeFirstImage: function () {
123
- var controller = this;
129
+ makeFirstImage: function (...args) {
130
+ const controller = this;
124
131
 
125
- return this.base.apply(this, arguments).done(function () {
132
+ return this.base(...args).done(() => {
126
133
  controller.prop('yAxisPlaceholder').hide();
127
134
  controller.prop('offsetContainer')
128
135
  .prepend(controller.prop('guidelinesCanvas'))
@@ -130,44 +137,50 @@ Genoverse.Track.Controller.Graph = Genoverse.Track.Controller.extend({
130
137
  });
131
138
  },
132
139
 
133
- typeWrapper : function (func, args) { return (Genoverse.Track.Controller.Graph[this.prop('type')][func] || Genoverse.Track.Controller.prototype[func]).apply(this, args); },
134
- click : function () { return this.typeWrapper('click', arguments); },
135
- getClickedFeatures : function () { return this.typeWrapper('getClickedFeatures', arguments); },
136
- populateMenu : function () { return this.typeWrapper('populateMenu', arguments); }
140
+ typeWrapper: function (func, ...args) {
141
+ const controllerType = Controller[this.prop('type')] || Controller.prototype; // Controller[this.prop('type')] will only exist if Controller.Bar or Controller.Line have been imported
142
+
143
+ return (controllerType[func] || Controller.prototype[func]).call(this, ...args); // if Controller[this.prop('type')] exists but Controller[this.prop('type')][func] does not, fall back to Controller.prototype[func]
144
+ },
145
+ click : function (...args) { return this.typeWrapper('click', ...args); },
146
+ getClickedFeatures : function (...args) { return this.typeWrapper('getClickedFeatures', ...args); },
147
+ populateMenu : function (...args) { return this.typeWrapper('populateMenu', ...args); },
137
148
  });
138
149
 
139
- Genoverse.Track.Model.Graph = Genoverse.Track.Model.extend({
150
+ const Model = TrackModel.extend({
140
151
  dataBuffer : { start: 1, end: 1 },
141
- setLabelBuffer : $.noop,
142
- sortFeatures : function (features) { return features.sort(function (a, b) { return a.start - b.start; }); }
152
+ setLabelBuffer : () => {},
153
+ sortFeatures : function (features) { return features.sort((a, b) => a.start - b.start); },
143
154
  });
144
155
 
145
- Genoverse.Track.View.Graph = Genoverse.Track.View.extend({
156
+ const View = TrackView.extend({
146
157
  featureMargin: {},
147
158
 
148
159
  featureDataSets: function (features) {
149
- var datasets = this.prop('datasets').concat({ name: '_default' });
150
- var setNames = {};
151
- var sets = {};
152
- var i, set;
160
+ const datasets = this.prop('datasets').concat({ name: '_default' });
161
+ const setNames = datasets.reduce(
162
+ (acc, { name }) => Object.assign(acc, { [name]: true }),
163
+ {}
164
+ );
153
165
 
154
- for (i = 0; i < datasets.length; i++) {
155
- setNames[datasets[i].name] = true;
156
- }
166
+ const sets = features.reduce(
167
+ (acc, feature) => {
168
+ const set = setNames[feature.dataset] ? feature.dataset : '_default';
157
169
 
158
- for (i = 0; i < features.length; i++) {
159
- set = setNames[features[i].dataset] ? features[i].dataset : '_default';
170
+ acc[set] = acc[set] || [];
171
+ acc[set].push(feature);
160
172
 
161
- sets[set] = sets[set] || [];
162
- sets[set].push(features[i]);
163
- }
173
+ return acc;
174
+ },
175
+ {}
176
+ );
164
177
 
165
178
  return { list: datasets, features: sets };
166
- }
179
+ },
167
180
  });
168
181
 
169
- Genoverse.Track.Graph = Genoverse.Track.extend({
170
- controller : Genoverse.Track.Controller.Graph,
182
+ export default Track.extend({
183
+ controller : Controller,
171
184
  margin : 10, // Same as fontHeight - needed to allow axis labels for range[0] and range[1] to be drawn without being cut off by the edge of the image
172
185
  invert : true,
173
186
  yAxisLabels : undefined, // An array of numerical labels for the y-axis. Should not be configured manually if the track is resizable.
@@ -176,7 +189,7 @@ Genoverse.Track.Graph = Genoverse.Track.extend({
176
189
  globalAlpha : 1,
177
190
  axesSettings : { axisColor: 'black', axisLabelColor: 'black', scaleLineColor: '#E5E5E5' },
178
191
  datasets : [],
179
- legend : true,
192
+ legend : Legend,
180
193
  labels : false,
181
194
 
182
195
  /*
@@ -196,11 +209,11 @@ Genoverse.Track.Graph = Genoverse.Track.extend({
196
209
  resizable : true,
197
210
  rescaleableY : 'auto',
198
211
 
199
- setDefaults: function () {
212
+ setDefaults: function (...args) {
200
213
  this.range = this.yRange || [ 0, this.height ];
201
214
  this.rescaleable = this.rescaleableY;
202
215
 
203
- if ($.isPlainObject(this.margin)) {
216
+ if (this.browser.jQuery.isPlainObject(this.margin)) {
204
217
  if (this.invert) {
205
218
  this.marginTop = this.margin.bottom;
206
219
  this.margin = this.margin.top;
@@ -218,7 +231,7 @@ Genoverse.Track.Graph = Genoverse.Track.extend({
218
231
  this.rescaleable = 'auto';
219
232
  }
220
233
 
221
- this.base.apply(this, arguments);
234
+ this.base(...args);
222
235
 
223
236
  if (this.legend && !this.datasets.length) {
224
237
  this.legend = false;
@@ -232,22 +245,23 @@ Genoverse.Track.Graph = Genoverse.Track.extend({
232
245
  return this.base(height, true); // always force show
233
246
  },
234
247
 
235
- setMVC: function () {
236
- var hadController = this.controller instanceof Genoverse.Track.Controller;
237
- var rtn = this.base.apply(this, arguments);
248
+ setMVC: function (...args) {
249
+ const jQuery = this.browser.jQuery;
250
+ const hadController = this.controller instanceof TrackController;
251
+ const rtn = this.base(...args);
238
252
 
239
253
  if (!hadController) {
240
- var scrollContainer = this.prop('scrollContainer');
254
+ const scrollContainer = this.prop('scrollContainer');
241
255
 
242
- this.yAxisPlaceholder = $('<div class="gv-image-container gv-loading">');
243
- this.yAxisCanvas = $('<canvas class="gv-image-container gv-barchart-axis">').attr('width', this.width);
244
- this.guidelinesCanvas = $('<canvas class="gv-image-container gv-barchart-guide">').attr('width', this.width);
256
+ this.yAxisPlaceholder = jQuery('<div class="gv-image-container gv-loading">');
257
+ this.yAxisCanvas = jQuery('<canvas class="gv-image-container gv-barchart-axis">').attr('width', this.width);
258
+ this.guidelinesCanvas = jQuery('<canvas class="gv-image-container gv-barchart-guide">').attr('width', this.width);
245
259
 
246
260
  if (this.disabled) {
247
261
  this.yAxisCanvas.add(this.guidelinesCanvas).attr('height', 0);
248
262
  }
249
263
 
250
- this.offsetContainer = $('<div class="gv-scroll-container-offset">')
264
+ this.offsetContainer = this.browser.jQuery('<div class="gv-scroll-container-offset">')
251
265
  .width(this.width)
252
266
  .insertAfter(scrollContainer)
253
267
  .append(scrollContainer)
@@ -261,18 +275,19 @@ Genoverse.Track.Graph = Genoverse.Track.extend({
261
275
 
262
276
  afterSetMVC: function () {
263
277
  // Never show the control to switch between auto-height and manual resizing, since its behaviour is not the same here as for standard tracks, due to interactions between resizable and rescaleableY.
264
- (this.prop('heightToggler') || $()).addClass('gv-hidden');
265
- (this.prop('resizer') || $()).off('click');
278
+ this.prop('heightToggler')?.addClass('gv-hidden');
279
+ this.prop('resizer')?.off('click');
266
280
  },
267
281
 
268
- reset: function () {
282
+ reset: function (...args) {
269
283
  this.drawAxes();
270
- return this.base.apply(this, arguments);
284
+
285
+ return this.base(...args);
271
286
  },
272
287
 
273
- enable: function () {
274
- var wasDisabled = this.disabled;
275
- var rtn = this.base.apply(this, arguments);
288
+ enable: function (...args) {
289
+ const wasDisabled = this.disabled;
290
+ const rtn = this.base(...args);
276
291
 
277
292
  if (wasDisabled) {
278
293
  this.drawAxes();
@@ -282,8 +297,8 @@ Genoverse.Track.Graph = Genoverse.Track.extend({
282
297
  },
283
298
 
284
299
  getYScale: function () {
285
- var range = this.prop('range');
286
- var yScale = (this.prop('height') - this.prop('margin') - this.prop('marginTop')) / (range[1] - range[0]);
300
+ const range = this.prop('range');
301
+ const yScale = (this.prop('height') - this.prop('margin') - this.prop('marginTop')) / (range[1] - range[0]);
287
302
 
288
303
  return yScale;
289
304
  },
@@ -293,37 +308,39 @@ Genoverse.Track.Graph = Genoverse.Track.extend({
293
308
  return;
294
309
  }
295
310
 
296
- var width = this.width;
297
- var height = this.prop('height');
298
- var invert = this.prop('invert');
299
- var margin = this.prop('margin');
300
- var marginTop = this.prop('marginTop');
301
- var fontHeight = this.prop('fontHeight');
302
- var range = this.prop('range');
303
- var axesSettings = this.prop('axesSettings');
304
- var yAxisLabels = this.prop('yAxisLabels');
305
- var yScale = this.getYScale();
306
- var axisContext = this.prop('yAxisCanvas').attr('height', height)[0].getContext('2d');
307
- var linesContext = this.prop('guidelinesCanvas').attr('height', height)[0].getContext('2d');
308
- var y, n, i, interval, maxDP;
311
+ const width = this.width;
312
+ const height = this.prop('height');
313
+ const invert = this.prop('invert');
314
+ const margin = this.prop('margin');
315
+ const marginTop = this.prop('marginTop');
316
+ const fontHeight = this.prop('fontHeight');
317
+ const range = this.prop('range');
318
+ const axesSettings = this.prop('axesSettings');
319
+ const yScale = this.getYScale();
320
+ const axisContext = this.prop('yAxisCanvas').attr('height', height)[0].getContext('2d');
321
+ const linesContext = this.prop('guidelinesCanvas').attr('height', height)[0].getContext('2d');
322
+
323
+ let yAxisLabels = this.prop('yAxisLabels');
324
+ let maxDP;
309
325
 
310
326
  if (!yAxisLabels) {
311
- n = Math.floor((height - margin - marginTop) / (fontHeight * 2)); // number of labels that can be shown
312
- interval = (range[1] - range[0]) / n; // label incrementor
327
+ const n = Math.floor((height - margin - marginTop) / (fontHeight * 2)); // number of labels that can be shown
328
+ const interval = (range[1] - range[0]) / n; // label incrementor
329
+
313
330
  yAxisLabels = [];
314
331
 
315
332
  if (interval !== Math.round(interval)) { // floats
316
333
  // Strenuously ensure that interval does not contain a floating point error.
317
334
  // Assumes that values in range do not contain floating point errors.
318
- maxDP = Math.max.apply(null, range.map(function (r) { return (r.toString().split('.')[1] || '').length; })) + 1;
335
+ maxDP = Math.max.apply(null, range.map(r => (r.toString().split('.')[1] || '').length)) + 1;
319
336
  }
320
337
 
321
- for (i = 0; i <= n; i++) {
338
+ for (let i = 0; i <= n; i++) {
322
339
  yAxisLabels.push((range[0] + interval * i)[maxDP ? 'toFixed' : 'toString'](maxDP));
323
340
  }
324
341
  }
325
342
 
326
- var axisWidth = Math.max.apply(null, yAxisLabels.map(function (label) { return axisContext.measureText(label).width; })) + 10;
343
+ const axisWidth = Math.max.apply(null, yAxisLabels.map(label => axisContext.measureText(label).width)) + 10;
327
344
 
328
345
  this.prop('offsetContainer').css('marginLeft', axisWidth).width(width - axisWidth);
329
346
  this.prop('scrollContainer').css('marginLeft', -axisWidth);
@@ -333,23 +350,29 @@ Genoverse.Track.Graph = Genoverse.Track.extend({
333
350
  axisContext.fillStyle = axesSettings.axisColor;
334
351
  axisContext.fillRect(axisWidth - 1, invert ? margin : marginTop, 1, height - margin - marginTop); // Vertical line
335
352
 
336
- linesContext.fillStyle = axesSettings.scaleLineColor;
353
+ linesContext.fillStyle = axesSettings.scaleLineColor;
337
354
  axisContext.fillStyle = axesSettings.axisLabelColor;
338
355
  axisContext.textBaseline = 'middle';
339
356
  axisContext.textAlign = 'right';
340
357
 
341
- for (i = 0; i < yAxisLabels.length; i++) {
342
- y = marginTop + (parseFloat(yAxisLabels[i], 10) - range[0]) * yScale;
343
- y = invert ? height - y : y;
358
+ yAxisLabels.forEach(
359
+ (label) => {
360
+ let y = marginTop + (parseFloat(label, 10) - range[0]) * yScale;
344
361
 
345
- linesContext.fillRect(0, y, width, 1); // Horizontal line, indicating the y-position of a numerical value
346
- axisContext.fillRect(axisWidth - 4, y, 4, 1); // Horizontal line, indicating the y-position of a numerical value
347
- axisContext.fillText(yAxisLabels[i], axisWidth - 6, y); // The numerical value for the horizontal line
348
- }
362
+ y = invert ? height - y : y;
363
+
364
+ linesContext.fillRect(0, y, width, 1); // Horizontal line, indicating the y-position of a numerical value
365
+ axisContext.fillRect(axisWidth - 4, y, 4, 1); // Horizontal line, indicating the y-position of a numerical value
366
+ axisContext.fillText(label, axisWidth - 6, y); // The numerical value for the horizontal line
367
+ }
368
+ );
349
369
 
350
370
  // Draw a horizontal line at y = 0
351
- y = (-range[0] * yScale) + marginTop;
371
+ const y = (-range[0] * yScale) + marginTop;
372
+
352
373
  linesContext.fillStyle = axesSettings.axisColor;
353
374
  linesContext.fillRect(0, invert ? height - y : y, width, 1);
354
- }
375
+ },
355
376
  });
377
+
378
+ export { Controller, Model, View };