genoverse 3.2.0 → 4.0.0-beta1
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.
- package/.eslintrc.js +93 -162
- package/.github/workflows/test.yml +9 -10
- package/.github/workflows/update-gh-pages.yml +33 -0
- package/LICENSE.TXT +2 -2
- package/README.md +176 -3
- package/{i → assets}/sort_handle.png +0 -0
- package/babel.config.js +19 -0
- package/dist/129.css +334 -0
- package/dist/129.css.map +1 -0
- package/dist/129.genoverse.js +2 -0
- package/dist/129.genoverse.js.map +1 -0
- package/dist/15d98c18221c8bcb2334.ttf +0 -0
- package/dist/166.css +2 -0
- package/dist/166.genoverse.js +1 -0
- package/dist/216.css +20 -0
- package/dist/216.css.map +1 -0
- package/dist/232.css +114 -0
- package/dist/232.css.map +1 -0
- package/dist/232.genoverse.js +2 -0
- package/dist/232.genoverse.js.map +1 -0
- package/dist/2e659e443f3e98569e9f.png +0 -0
- package/dist/394.css +114 -0
- package/dist/394.css.map +1 -0
- package/dist/394.genoverse.js +2 -0
- package/dist/394.genoverse.js.map +1 -0
- package/dist/469.css +24 -0
- package/dist/469.css.map +1 -0
- package/dist/469.genoverse.js +2 -0
- package/dist/469.genoverse.js.map +1 -0
- package/dist/4896d4b04430cc3dfb06.woff2 +0 -0
- package/dist/530.css +39 -0
- package/dist/530.css.map +1 -0
- package/dist/530.genoverse.js +2 -0
- package/dist/530.genoverse.js.map +1 -0
- package/dist/547.css +469 -0
- package/dist/547.css.map +1 -0
- package/dist/547.genoverse.js +1 -0
- package/dist/729.css +315 -0
- package/dist/729.css.map +1 -0
- package/dist/79da213423ac0def2058.ttf +0 -0
- package/dist/804.genoverse.js +2 -0
- package/dist/804.genoverse.js.map +1 -0
- package/dist/842.genoverse.js +2 -0
- package/dist/842.genoverse.js.map +1 -0
- package/dist/893.genoverse.js +2 -0
- package/dist/893.genoverse.js.map +1 -0
- package/dist/949.css +315 -0
- package/dist/949.css.map +1 -0
- package/dist/949.genoverse.js +2 -0
- package/dist/949.genoverse.js.map +1 -0
- package/dist/952.css +315 -0
- package/dist/952.css.map +1 -0
- package/dist/952.genoverse.js +2 -0
- package/dist/952.genoverse.js.map +1 -0
- package/dist/d79c2ec96ab9ff1161a2.woff2 +0 -0
- package/dist/genoverse.js +2 -0
- package/dist/genoverse.js.map +1 -0
- package/index.html +13 -14
- package/jest.config.js +5 -0
- package/jest.setup.js +13 -0
- package/package.json +29 -12
- package/{css → src/css}/controlPanel.css +0 -0
- package/{css → src/css}/fileDrop.css +0 -0
- package/src/css/fontawesome.css +3 -0
- package/{css → src/css}/fullscreen.css +0 -0
- package/{css → src/css}/genoverse.css +1 -1
- package/{css → src/css}/karyotype.css +2 -0
- package/{css → src/css}/resizer.css +0 -0
- package/{css → src/css}/tooltips.css +0 -0
- package/{css → src/css}/trackControls.css +0 -0
- package/src/js/Genoverse.js +1747 -0
- package/{js → src/js}/Track/Controller/Sequence.js +6 -4
- package/src/js/Track/Controller/Stranded.js +83 -0
- package/{js → src/js}/Track/Controller.js +201 -160
- package/src/js/Track/Model/File/BAM.js +47 -0
- package/src/js/Track/Model/File/BED.js +122 -0
- package/src/js/Track/Model/File/GFF.js +42 -0
- package/src/js/Track/Model/File/VCF.js +109 -0
- package/src/js/Track/Model/File/WIG.js +82 -0
- package/src/js/Track/Model/File.js +36 -0
- package/src/js/Track/Model/Gene/Ensembl.js +24 -0
- package/{js → src/js}/Track/Model/Gene.js +3 -1
- package/src/js/Track/Model/Sequence/Ensembl.js +6 -0
- package/{js → src/js}/Track/Model/Sequence/Fasta.js +24 -17
- package/{js → src/js}/Track/Model/Sequence.js +10 -7
- package/{js → src/js}/Track/Model/SequenceVariation.js +17 -11
- package/{js → src/js}/Track/Model/Stranded.js +11 -8
- package/src/js/Track/Model/Transcript/Ensembl.js +73 -0
- package/{js → src/js}/Track/Model/Transcript.js +3 -1
- package/{js → src/js}/Track/Model.js +128 -97
- package/{js → src/js}/Track/View/Gene/Ensembl.js +6 -4
- package/src/js/Track/View/Gene.js +8 -0
- package/{js → src/js}/Track/View/Sequence.js +18 -22
- package/src/js/Track/View/SequenceVariation.js +117 -0
- package/src/js/Track/View/Transcript/Ensembl.js +17 -0
- package/src/js/Track/View/Transcript.js +32 -0
- package/{js → src/js}/Track/View.js +200 -159
- package/{js → src/js}/Track/library/Chromosome.js +18 -13
- package/src/js/Track/library/File/BAM.js +34 -0
- package/src/js/Track/library/File/BED.js +27 -0
- package/src/js/Track/library/File/BIGBED.js +51 -0
- package/src/js/Track/library/File/BIGWIG.js +54 -0
- package/src/js/Track/library/File/GFF.js +10 -0
- package/{js → src/js}/Track/library/File/VCF.js +29 -22
- package/src/js/Track/library/File/WIG.js +8 -0
- package/{js → src/js}/Track/library/File.js +4 -2
- package/src/js/Track/library/Gene.js +44 -0
- package/src/js/Track/library/Graph/Bar.js +263 -0
- package/src/js/Track/library/Graph/Line.js +335 -0
- package/{js → src/js}/Track/library/Graph.js +137 -114
- package/{js → src/js}/Track/library/HighlightRegion.js +118 -93
- package/src/js/Track/library/Legend.js +258 -0
- package/{js → src/js}/Track/library/Scalebar.js +69 -49
- package/{js → src/js}/Track/library/Scaleline.js +29 -27
- package/src/js/Track/library/Static.js +82 -0
- package/{js → src/js}/Track/library/dbSNP.js +47 -50
- package/src/js/Track.js +649 -0
- package/{js → src/js}/genomes/grch37.js +52 -52
- package/{js → src/js}/genomes/grch38.js +52 -52
- package/src/js/lib/BWReader.js +562 -0
- package/src/js/lib/VCFReader.js +296 -0
- package/src/js/lib/dalliance/bam.js +517 -0
- package/src/js/lib/dalliance/bin.js +317 -0
- package/src/js/lib/dalliance/jszlib-inflate.js +2159 -0
- package/src/js/lib/dalliance/lh3utils.js +105 -0
- package/src/js/lib/dalliance/sha1.js +334 -0
- package/src/js/lib/import-tracks.js +42 -0
- package/{js/lib → src/js/lib/jquery-plugins}/jquery.mousehold.js +0 -0
- package/{js/lib → src/js/lib/jquery-plugins}/jquery.mousewheel.js +0 -0
- package/{js/lib → src/js/lib/jquery-plugins}/jquery.tipsy.js +0 -0
- package/src/js/lib/jquery.js +26 -0
- package/src/js/lib/polyfills.js +11 -0
- package/src/js/lib/wrap-functions.js +88 -0
- package/src/js/plugins/controlPanel.js +388 -0
- package/src/js/plugins/fileDrop.js +81 -0
- package/src/js/plugins/focusRegion.js +13 -0
- package/{js → src/js}/plugins/fullscreen.js +18 -14
- package/{js → src/js}/plugins/karyotype.js +51 -45
- package/src/js/plugins/resizer.js +52 -0
- package/{js → src/js}/plugins/tooltips.js +31 -29
- package/src/js/plugins/trackControls.js +159 -0
- package/test/View/render-legends.test.js +1 -1
- package/test/create-and-destroy.test.js +2 -2
- package/test/track-ordering.test.js +3 -2
- package/test/track_config/config-settings.test.js +1 -1
- package/test/utils.js +4 -2
- package/webpack.config.js +103 -34
- package/css/font-awesome.css +0 -3
- package/expanded.html +0 -120
- package/fontawesome/css/fontawesome.min.css +0 -5
- package/fontawesome/css/regular.min.css +0 -5
- package/fontawesome/css/solid.min.css +0 -5
- package/fontawesome/webfonts/fa-brands-400.ttf +0 -0
- package/fontawesome/webfonts/fa-brands-400.woff +0 -0
- package/fontawesome/webfonts/fa-brands-400.woff2 +0 -0
- package/fontawesome/webfonts/fa-regular-400.ttf +0 -0
- package/fontawesome/webfonts/fa-regular-400.woff +0 -0
- package/fontawesome/webfonts/fa-regular-400.woff2 +0 -0
- package/fontawesome/webfonts/fa-solid-900.ttf +0 -0
- package/fontawesome/webfonts/fa-solid-900.woff +0 -0
- package/fontawesome/webfonts/fa-solid-900.woff2 +0 -0
- package/help.pdf +0 -0
- package/index.js +0 -83
- package/js/Genoverse.js +0 -1681
- package/js/Track/Controller/Stranded.js +0 -73
- package/js/Track/Model/File/BAM.js +0 -44
- package/js/Track/Model/File/BED.js +0 -116
- package/js/Track/Model/File/GFF.js +0 -40
- package/js/Track/Model/File/VCF.js +0 -101
- package/js/Track/Model/File/WIG.js +0 -67
- package/js/Track/Model/File.js +0 -36
- package/js/Track/Model/Gene/Ensembl.js +0 -22
- package/js/Track/Model/Sequence/Ensembl.js +0 -4
- package/js/Track/Model/Transcript/Ensembl.js +0 -67
- package/js/Track/View/Gene.js +0 -6
- package/js/Track/View/Sequence/Variation.js +0 -115
- package/js/Track/View/Transcript/Ensembl.js +0 -12
- package/js/Track/View/Transcript.js +0 -28
- package/js/Track/library/File/BAM.js +0 -30
- package/js/Track/library/File/BED.js +0 -24
- package/js/Track/library/File/BIGBED.js +0 -47
- package/js/Track/library/File/BIGWIG.js +0 -52
- package/js/Track/library/File/GFF.js +0 -9
- package/js/Track/library/File/WIG.js +0 -5
- package/js/Track/library/Gene.js +0 -37
- package/js/Track/library/Graph/Bar.js +0 -235
- package/js/Track/library/Graph/Line.js +0 -296
- package/js/Track/library/Legend.js +0 -224
- package/js/Track/library/Static.js +0 -78
- package/js/Track.js +0 -632
- package/js/genoverse.min.js +0 -2
- package/js/genoverse.min.js.map +0 -1
- package/js/lib/BWReader.js +0 -578
- package/js/lib/Base.js +0 -145
- package/js/lib/VCFReader.js +0 -286
- package/js/lib/dalliance/js/bam.js +0 -494
- package/js/lib/dalliance/js/bin.js +0 -185
- package/js/lib/dalliance/js/das.js +0 -749
- package/js/lib/dalliance/js/utils.js +0 -370
- package/js/lib/dalliance-lib.js +0 -3594
- package/js/lib/dalliance-lib.min.js +0 -68
- package/js/lib/jDataView.js +0 -2
- package/js/lib/jParser.js +0 -192
- package/js/lib/jquery-ui.js +0 -8
- package/js/lib/jquery.js +0 -2
- package/js/lib/rtree.js +0 -1
- package/js/plugins/controlPanel.js +0 -395
- package/js/plugins/fileDrop.js +0 -62
- package/js/plugins/focusRegion.js +0 -12
- package/js/plugins/resizer.js +0 -45
- package/js/plugins/trackControls.js +0 -143
- package/utils/expandedTemplate.html +0 -46
- package/utils/git-hooks/post-commit +0 -9
- package/utils/git-hooks/pre-commit +0 -7
- package/utils/git-hooks/setup +0 -6
- 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
|
-
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
var i, j;
|
|
22
|
+
let min = Infinity;
|
|
23
|
+
let max = -Infinity;
|
|
22
24
|
|
|
23
25
|
if (this.prop('type') === 'Line') {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
|
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
|
-
|
|
54
|
-
|
|
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
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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
|
-
|
|
84
|
-
|
|
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
|
-
|
|
97
|
+
const visibleFeatures = this.model.findFeatures(this.browser.chr, this.browser.start, this.browser.end);
|
|
92
98
|
|
|
93
99
|
if (visibleFeatures.length) {
|
|
94
|
-
|
|
95
|
-
|
|
100
|
+
const range = this.prop('range');
|
|
101
|
+
const y = this.yMinMaxFromFeatures(visibleFeatures);
|
|
96
102
|
|
|
97
103
|
if (y.min || y.max) {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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
|
-
|
|
120
|
+
this.setYRange(minY, maxY);
|
|
114
121
|
}
|
|
115
122
|
}
|
|
116
123
|
}
|
|
117
124
|
} else {
|
|
118
|
-
|
|
125
|
+
this.base(...args);
|
|
119
126
|
}
|
|
120
127
|
},
|
|
121
128
|
|
|
122
|
-
makeFirstImage: function () {
|
|
123
|
-
|
|
129
|
+
makeFirstImage: function (...args) {
|
|
130
|
+
const controller = this;
|
|
124
131
|
|
|
125
|
-
return this.base
|
|
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
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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
|
-
|
|
150
|
+
const Model = TrackModel.extend({
|
|
140
151
|
dataBuffer : { start: 1, end: 1 },
|
|
141
|
-
setLabelBuffer :
|
|
142
|
-
sortFeatures : function (features) { return features.sort(
|
|
152
|
+
setLabelBuffer : () => {},
|
|
153
|
+
sortFeatures : function (features) { return features.sort((a, b) => a.start - b.start); },
|
|
143
154
|
});
|
|
144
155
|
|
|
145
|
-
|
|
156
|
+
const View = TrackView.extend({
|
|
146
157
|
featureMargin: {},
|
|
147
158
|
|
|
148
159
|
featureDataSets: function (features) {
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
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
|
-
|
|
155
|
-
|
|
156
|
-
|
|
166
|
+
const sets = features.reduce(
|
|
167
|
+
(acc, feature) => {
|
|
168
|
+
const set = setNames[feature.dataset] ? feature.dataset : '_default';
|
|
157
169
|
|
|
158
|
-
|
|
159
|
-
|
|
170
|
+
acc[set] = acc[set] || [];
|
|
171
|
+
acc[set].push(feature);
|
|
160
172
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
173
|
+
return acc;
|
|
174
|
+
},
|
|
175
|
+
{}
|
|
176
|
+
);
|
|
164
177
|
|
|
165
178
|
return { list: datasets, features: sets };
|
|
166
|
-
}
|
|
179
|
+
},
|
|
167
180
|
});
|
|
168
181
|
|
|
169
|
-
|
|
170
|
-
controller :
|
|
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 :
|
|
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 (
|
|
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
|
|
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
|
-
|
|
237
|
-
|
|
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
|
-
|
|
254
|
+
const scrollContainer = this.prop('scrollContainer');
|
|
241
255
|
|
|
242
|
-
this.yAxisPlaceholder =
|
|
243
|
-
this.yAxisCanvas =
|
|
244
|
-
this.guidelinesCanvas =
|
|
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 =
|
|
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
|
-
|
|
265
|
-
|
|
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
|
-
|
|
284
|
+
|
|
285
|
+
return this.base(...args);
|
|
271
286
|
},
|
|
272
287
|
|
|
273
|
-
enable: function () {
|
|
274
|
-
|
|
275
|
-
|
|
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
|
-
|
|
286
|
-
|
|
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
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
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
|
|
312
|
-
interval
|
|
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(
|
|
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
|
-
|
|
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
|
|
353
|
+
linesContext.fillStyle = axesSettings.scaleLineColor;
|
|
337
354
|
axisContext.fillStyle = axesSettings.axisLabelColor;
|
|
338
355
|
axisContext.textBaseline = 'middle';
|
|
339
356
|
axisContext.textAlign = 'right';
|
|
340
357
|
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
358
|
+
yAxisLabels.forEach(
|
|
359
|
+
(label) => {
|
|
360
|
+
let y = marginTop + (parseFloat(label, 10) - range[0]) * yScale;
|
|
344
361
|
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
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 };
|