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,395 +0,0 @@
1
- Genoverse.Plugins.controlPanel = function (pluginConf) {
2
- this.controls = [
3
- // Scroll left/right
4
- {
5
- name : 'Scroll left and right by pressing and holding these buttons',
6
- buttons : [{
7
- name : 'Scroll left',
8
- icon : '<i class="fas fa-chevron-left"></i>',
9
- 'class' : 'gv-scroll-left'
10
- }, {
11
- name : 'Scroll right',
12
- icon : '<i class="fas fa-chevron-right"></i>',
13
- 'class' : 'gv-scroll-right'
14
- }],
15
- init: function (browser) {
16
- var el = $(this);
17
-
18
- el.find('.gv-scroll-left, .gv-scroll-right').on({
19
- mousedown : function () { browser.startDragScroll(); },
20
- mouseup : function () { browser.stopDragScroll(); }
21
- });
22
-
23
- el.find('.gv-scroll-left').mousehold(50, function () {
24
- browser.move(browser.scrollDelta);
25
- });
26
-
27
- el.find('.gv-scroll-right').mousehold(50, function () {
28
- browser.move(-browser.scrollDelta);
29
- });
30
- }
31
- },
32
-
33
- // Zoom in/out
34
- {
35
- name : 'Zoom-in and zoom-out',
36
- buttons : [{
37
- name : 'Zoom in',
38
- icon : '<i class="fas fa-search-plus"></i>',
39
- 'class' : 'gv-zoom-in',
40
- action : function (browser) { browser.zoomIn(); }
41
- }, {
42
- name : 'Zoom out',
43
- icon : '<i class="fas fa-search-minus"></i>',
44
- 'class' : 'gv-zoom-out',
45
- action : function (browser) { browser.zoomOut(); }
46
- }]
47
- },
48
-
49
- // Toogle drag action
50
- {
51
- name : 'Toggle your mouse drag action between scroll left/right and select region',
52
- buttons : [{
53
- name : 'Mouse drag action to scroll the browser left or right',
54
- icon : '<i class="fas fa-arrows-alt-h"></i>',
55
- 'class' : 'gv-drag-scroll',
56
- action : function (browser) {
57
- browser.setDragAction('scroll');
58
- $(this).addClass('gv-active').siblings().removeClass('gv-active');
59
- }
60
- }, {
61
- name : 'Mouse drag action to select a region',
62
- icon : '<i></i>',
63
- 'class' : 'gv-drag-select',
64
- action : function (browser) {
65
- browser.setDragAction('select');
66
- $(this).addClass('gv-active').siblings().removeClass('gv-active');
67
- }
68
- }],
69
- init: function (browser) {
70
- $(this).find('.gv-drag-' + browser.dragAction).addClass('gv-active').siblings().removeClass('gv-active');
71
- }
72
- },
73
-
74
- // Toogle wheel action
75
- {
76
- name : 'Toggle your mouse wheel action between zoom in/out and default page scroll',
77
- buttons : [{
78
- name : 'Mouse wheel action to scroll the page up and down',
79
- icon : '<i class="fas fa-arrows-alt-v"></i>',
80
- 'class' : 'gv-wheel-off',
81
- action : function (browser) {
82
- browser.setWheelAction('off');
83
- $(this).addClass('gv-active').siblings().removeClass('gv-active');
84
- }
85
- }, {
86
- name : 'Mouse wheel to zoom in and out',
87
- icon : '&#177;',
88
- 'class' : 'gv-wheel-zoom',
89
- action : function (browser) {
90
- browser.setWheelAction('zoom');
91
- $(this).addClass('gv-active').siblings().removeClass('gv-active');
92
- }
93
- }],
94
- init: function (browser) {
95
- $(this).find('.gv-wheel-' + browser.wheelAction).addClass('gv-active').siblings().removeClass('gv-active');
96
- }
97
- }
98
- ];
99
-
100
- if (this.saveable) {
101
- this.controls.push({
102
- icon : '<i class="fas fa-undo"></i>',
103
- name : 'Reset tracks and configuration',
104
- action : function (browser) { browser.resetConfig(); }
105
- });
106
- }
107
-
108
- this.on({
109
- beforeInit: function () {
110
- var browser = this;
111
-
112
- if (!this.tracksLibrary) {
113
- this.tracksLibrary = $.grep(this.tracks, function (track) { return track.prototype.name; });
114
- }
115
-
116
- var panel = $(
117
- '<table cellspacing=0 cellpadding=0 class="gv">' +
118
- ' <tr>' +
119
- ' <td class="gv-panel gv-panel-left"></td>' +
120
- ' <td class="gv-canvas-container"></td>' +
121
- ' <td class="gv-panel gv-panel-right"></td>' +
122
- ' </tr>' +
123
- '</table>'
124
- ).appendTo(this.container).find('.gv-panel-right');
125
-
126
- this.controlPanel = panel;
127
- this.superContainer = this.container;
128
- this.container = $('.gv-canvas-container', this.container);
129
-
130
- for (var i = 0; i < browser.controls.length; i++) {
131
- (function (control) {
132
- var buttonSet = $('<div class="gv-button-set">').attr('title', control.name).appendTo(browser.superContainer.find('.gv-panel-right'));
133
- var buttons = control.buttons || [ control ];
134
-
135
- $.each(buttons, function (j, button) {
136
- var el = $('<button>' + button.icon + '</button>').addClass(button.class).attr('title', button.name).appendTo(buttonSet);
137
-
138
- if (button.action) {
139
- el.on('click', function () {
140
- button.action.call(this, browser);
141
- });
142
- }
143
-
144
- if (button.init && button !== control) {
145
- button.init.call(el[0], browser);
146
- }
147
- });
148
-
149
- if (control.init) {
150
- control.init.call(buttonSet, browser);
151
- }
152
- }(browser.controls[i]));
153
- }
154
-
155
- this.superContainer.width(this.width);
156
-
157
- // ESC key to toggle crosshair select to drag mode and close menus
158
- $(document).on('keydown', function (e) {
159
- if (e.keyCode === 27) {
160
- if (panel.find('button.gv-drag-select').hasClass('gv-active')) {
161
- panel.find('button.gv-drag-scroll').trigger('click');
162
- }
163
-
164
- $('.gv-menu .gv-close').trigger('click');
165
- }
166
- });
167
- },
168
-
169
- afterInit: function () {
170
- var browser = this;
171
- var tracksButton = $('<button class="gv-tracks-library-button" title="Tracks menu"><i class="fas fa-bars"></i> Tracks</button>').on('click', function () {
172
- var button = this;
173
-
174
- function getTrackTags(track, tags) {
175
- if (track.constructor && track.constructor.ancestor && track.constructor.ancestor.prototype) {
176
- tags = getTrackTags(track.constructor.ancestor.prototype, tags.concat(track.constructor.ancestor.prototype.tags || []));
177
- }
178
-
179
- return tags;
180
- }
181
-
182
- if ($(this).hasClass('gv-active')) {
183
- $('.gv-menu.gv-tracks-menu .gv-close').trigger('click');
184
- $(this).removeClass('gv-active');
185
- } else {
186
- var menu = $(this).data('menu');
187
-
188
- if (menu) {
189
- menu.show();
190
- } else {
191
- menu = browser.makeMenu({
192
- 'Currently enabled tracks:' : 'Available tracks:',
193
- '<div class="gv-current-tracks"></div>' : '<input placeholder="Search"><div class="gv-available-tracks"></div>'
194
- }).addClass('gv-tracks-menu');
195
-
196
- $('input[placeholder=Search]', menu).on('keyup', function () {
197
- var str = this.value.toLowerCase();
198
-
199
- $('.gv-tracks-library-item', menu).each(function () {
200
- var track = $(this).data('track');
201
- var match = false;
202
-
203
- if (track.name && track.name.toLowerCase().indexOf(str) >= 0) {
204
- match = true;
205
- } else {
206
- var tags = getTrackTags(track, []).concat(track.tags || []);
207
-
208
- for (var i = 0; i < tags.length; i++) {
209
- if (tags[i].toLowerCase().indexOf(str) >= 0) {
210
- match = true;
211
- break;
212
- }
213
- }
214
- }
215
-
216
- $(this)[match ? 'removeClass' : 'addClass']('gv-hide');
217
- });
218
-
219
- $('.gv-tracks-library-category', menu).each(function () {
220
- var visibleTracks = $(this).children('.gv-tracks-library-item:not(.gv-hide)');
221
-
222
- $(this)[visibleTracks.length ? 'removeClass' : 'addClass']('gv-hide');
223
- });
224
- });
225
-
226
- $('.gv-close', menu).on('click', function () {
227
- $(button).removeClass('gv-active');
228
- });
229
-
230
- var availableTracks = $('.gv-available-tracks', menu);
231
- var currentTracks = $('.gv-current-tracks', menu).before('<div class="gv-current-tracks-instructions">Drag and drop to reorder</div>').data({
232
- reload : function () { $(this).empty().data('listTracks')(); },
233
- listTracks : function () {
234
- for (var i = 0; i < browser.tracks.length; i++) {
235
- if (browser.tracks[i].name && !(browser.tracks[i].removable === false && browser.tracks[i].unsortable) && !browser.tracks[i].parentTrack && !browser.tracks[i].lockToTrack) {
236
- (function (track) {
237
- var el = $('<div class="gv-tracks-menu-track">')
238
- .append('<span class="gv-tracks-menu-track-name" title="' + track.name + '">' + track.defaultName + '</span>')
239
- .appendTo(currentTracks)
240
- .data('track', track)
241
- .addClass(track.unsortable ? 'gv-unsortable' : '');
242
-
243
- if (track.removable === false) {
244
- el.prepend('<i class="gv-remove-track gv-menu-button fas fa-circle">');
245
- } else {
246
- el.prepend($('<i class="gv-remove-track gv-menu-button fas fa-times-circle">').on('click', function () { track.remove(); }));
247
- }
248
-
249
- var trackNameEl = el.find('.gv-tracks-menu-track-name').tipsy({ gravity: 'w', trigger: 'manual' }).on('mouseenter', function () {
250
- var tip = $(this).tipsy('show').data('tipsy').$tip;
251
-
252
- if (tip) {
253
- tip.css('zIndex', 1002);
254
- }
255
- }).on('mouseleave', function () {
256
- $(this).tipsy('hide');
257
- });
258
-
259
- if (track.name === track.defaultName) {
260
- trackNameEl.tipsy('disable');
261
- }
262
- }(browser.tracks[i]));
263
- }
264
- }
265
- }
266
- }).sortable({
267
- items : 'div:not(.gv-unsortable)',
268
- cursor : 'move',
269
- axis : 'y',
270
- handle : 'span',
271
- update : $.proxy(browser.updateTrackOrder, browser),
272
- start : function () {
273
- currentTracks.find('.gv-tracks-menu-track-name').each(function () { $(this).tipsy('hide').tipsy('disable'); });
274
- },
275
- stop: function () {
276
- currentTracks.find('.gv-tracks-menu-track-name').each(function () { $(this).tipsy('enable'); });
277
- }
278
- });
279
-
280
- currentTracks.data('listTracks')();
281
-
282
- if (browser.saveable) {
283
- $('<div class="gv-tracks-menu-reset gv-menu-button"><i class="fas fa-undo"></i> Reset tracks and configuration</div>').insertAfter(currentTracks).on('click', function (e) {
284
- e.preventDefault();
285
- browser.resetConfig();
286
- });
287
- }
288
-
289
- if (browser.tracksLibrary && browser.tracksLibrary.length) {
290
- var tracksLibraryCategories = browser.tracksLibrary.filter(function (track) {
291
- return track.prototype.name && track.prototype.removable !== false;
292
- }).reduce(
293
- function (acc, track) {
294
- var categoryName = track.prototype.category || '';
295
-
296
- acc[categoryName] = acc[categoryName] || [];
297
- acc[categoryName].push([ track.prototype.name.toLowerCase(), track ]);
298
-
299
- return acc;
300
- },
301
- {}
302
- );
303
-
304
- var tracksLibraryCategoryOrder = ((pluginConf && pluginConf.tracksLibraryCategoryOrder) || []).reduce(
305
- function (acc, categoryName, i) {
306
- acc[categoryName] = i + 1;
307
- return acc;
308
- },
309
- {}
310
- );
311
-
312
- Object.keys(tracksLibraryCategories).sort(function (a, b) {
313
- return (Boolean(b) - Boolean(a)) || (tracksLibraryCategoryOrder[a] - tracksLibraryCategoryOrder[b]) || a.localeCompare(b);
314
- }).forEach(function (categoryName, i, allCategoryNames) {
315
- var parentEl = (
316
- allCategoryNames.length > 1
317
- ? $('<div class="gv-tracks-library-category">').append(
318
- $('<div class="gv-tracks-library-category-header">').html(categoryName || 'Other')
319
- ).appendTo(availableTracks)
320
- : availableTracks
321
- );
322
-
323
- tracksLibraryCategories[categoryName].sort(function (a, b) {
324
- return a[0].localeCompare(b[0]);
325
- }).forEach(
326
- function (row) {
327
- var track = row[1];
328
-
329
- $('<div class="gv-tracks-library-item">').append(
330
- $('<i class="gv-add-track gv-menu-button fas fa-plus-circle">').on('click', function () {
331
- browser.trackIds = browser.trackIds || {};
332
- browser.trackIds[track.prototype.id] = browser.trackIds[track.prototype.id] || 1;
333
-
334
- browser.addTrack(track.extend({ id: track.prototype.id + (browser.tracksById[track.prototype.id] ? browser.trackIds[track.prototype.id]++ : '') }));
335
- })
336
- ).append('<span>' + track.prototype.name + '</span>').appendTo(parentEl).data('track', track.prototype);
337
- }
338
- );
339
- });
340
- }
341
-
342
- menu.css({ left: '50%', marginLeft: menu.width() / -2 });
343
-
344
- $(this).data('menu', menu);
345
- }
346
-
347
- $(this).addClass('gv-active');
348
- }
349
- });
350
-
351
- this.labelContainer.prepend(
352
- $('<li class="gv-unsortable">').append(
353
- $('<div class="gv-button-set" title="Tracks menu">').append(tracksButton)
354
- )
355
- );
356
- },
357
-
358
- afterAddDomElements: function () {
359
- this.wrapper.after('<div class="gv-powered-by">Powered by <a target="_blank" href="https://wtsi-web.github.io/Genoverse/">Genoverse</a></div>');
360
- this.superContainer.find('.gv-panel-left').append(this.labelContainer);
361
- },
362
-
363
- 'afterAddTracks afterRemoveTracks': function () {
364
- var currentTracks = this.superContainer.find('.gv-tracks-menu .gv-current-tracks');
365
-
366
- if (currentTracks.length) {
367
- currentTracks.data('reload').call(currentTracks);
368
- }
369
- }
370
- });
371
-
372
- this.on({
373
- afterSetName: function (name) {
374
- var track = this.track;
375
-
376
- if (track && track.browser) {
377
- var menu = track.browser.superContainer.find('.gv-tracks-library-button').data('menu');
378
-
379
- if (menu) {
380
- menu.find('.gv-tracks-menu-track').filter(function () {
381
- return $(this).data('track') === track;
382
- }).children('.gv-tracks-menu-track-name').attr('title', name).each(function () {
383
- if (name === track.defaultName) {
384
- $(this).tipsy('hide').tipsy('disable');
385
- } else {
386
- $(this).tipsy('enable');
387
- }
388
- });
389
- }
390
- }
391
- }
392
- }, 'tracks');
393
- };
394
-
395
- Genoverse.Plugins.controlPanel.requires = 'karyotype';
@@ -1,62 +0,0 @@
1
- Genoverse.Plugins.fileDrop = function () {
2
- this.on('afterInit', function () {
3
- var browser = this;
4
- var wrapper = this.wrapper;
5
-
6
- $(window).on('dragenter', function (e) {
7
- var dataTransfer = e.originalEvent.dataTransfer;
8
-
9
- if (dataTransfer && dataTransfer.types && (dataTransfer.types[0] === 'Files' || dataTransfer.types[1] === 'Files' || dataTransfer.types[2] === 'Files') && !$('.gv-file-drop-total-overlay').length) {
10
- var fileDropDiv = $('<div class="gv-file-drop">').appendTo(wrapper);
11
- var totalDropOverlay = $('<div class="gv-file-drop-total-overlay">').prependTo('body');
12
-
13
- var dragleave = function () {
14
- fileDropDiv.remove();
15
- totalDropOverlay.remove();
16
- };
17
-
18
- totalDropOverlay.on('dragenter', function (ev) { ev.preventDefault(); ev.stopPropagation(); });
19
- totalDropOverlay.on('dragover', function (ev) { ev.preventDefault(); ev.stopPropagation(); });
20
- totalDropOverlay.on('dragleave', dragleave);
21
- totalDropOverlay.on('drop', function (ev) {
22
- dragleave();
23
- ev.preventDefault();
24
- ev.stopPropagation();
25
-
26
- // Sort in order to ensure that .bam files are before their .bam.bai files
27
- var files = $.map(ev.originalEvent.dataTransfer.files, function (f) { return f; }).sort(function (a, b) { return a.name.localeCompare(b.name); });
28
-
29
- for (var i = 0; i < files.length; i++) {
30
- var file = files[i];
31
- var parts = file.name.split('.').reverse();
32
- var gz = parts[0] === 'gz';
33
- var ext = parts[gz ? 1 : 0];
34
- var track = Genoverse.Track.File[ext.toUpperCase()];
35
- var indexFile;
36
-
37
- if (typeof track === 'undefined') {
38
- return;
39
- }
40
-
41
- if (track.prototype.indexExt && (files[i + 1] || {}).name === file.name + track.prototype.indexExt) {
42
- indexFile = files[++i];
43
- }
44
-
45
- track = track.extend({
46
- name : file.name,
47
- info : 'Local file `' + file.name + '`, size: ' + file.size + ' bytes',
48
- isLocal : true,
49
- dataFile : file,
50
- indexFile : indexFile,
51
- gz : gz
52
- });
53
-
54
- browser.addTrack(track, browser.tracks.length - 1);
55
- }
56
-
57
- return false;
58
- });
59
- }
60
- });
61
- });
62
- };
@@ -1,12 +0,0 @@
1
- Genoverse.Plugins.focusRegion = function () {
2
- this.controls.push({
3
- icon : '<i class="fas fa-map-marker-alt"></i>',
4
- 'class' : 'gv-button-large',
5
- name : 'Reset focus to ' + (this.focusRegion && this.focusRegion.name ? this.focusRegion.name : this.chr + ':' + this.start + '-' + this.end),
6
- action : function (browser) { browser.moveTo(browser.focusRegion.chr, browser.focusRegion.start, browser.focusRegion.end, true); },
7
- init : function (browser) { browser.focusRegion = browser.focusRegion || { chr: browser.chr, start: browser.start, end: browser.end }; }
8
- });
9
- };
10
-
11
- Genoverse.Plugins.focusRegion.requires = 'controlPanel';
12
- Genoverse.Plugins.focusRegion.noCSS = true;
@@ -1,45 +0,0 @@
1
- Genoverse.Plugins.resizer = function () {
2
- this.on('afterSetMVC', 'tracks', function () {
3
- if (this.prop('resizable') !== true) {
4
- return;
5
- }
6
-
7
- var track = this;
8
- var controller = this.controller;
9
- var resizer = this.prop('resizer');
10
- var height = this.prop('height');
11
-
12
- if (!resizer) {
13
- resizer = this.prop('resizer', $('<div class="gv-resizer gv-static"><div class="gv-handle"></div></div>').appendTo(track.prop('container')).draggable({
14
- axis : 'y',
15
- start : function () { $('body').addClass('gv-dragging'); },
16
- stop : function (e, ui) {
17
- $('body').removeClass('gv-dragging');
18
- controller.resize(track.prop('height') + ui.position.top - ui.originalPosition.top, true);
19
- $(this).css({ top: 'auto', bottom: 0 }); // returns the resizer to the bottom of the container - needed when the track is resized to 0
20
- }
21
- }).on('click', function () {
22
- var h = track.prop('fullVisibleHeight');
23
-
24
- if (h) {
25
- controller.resize(h, true);
26
- }
27
- }));
28
- }
29
-
30
- resizer.css({ width: this.width, left: 0 })[this.prop('autoHeight') ? 'hide' : 'show']();
31
-
32
- if (!this.prop('autoHeight') && height - this.prop('margin') === this.prop('featureHeight')) {
33
- controller.resize(height + resizer.height());
34
- this.prop('initialHeight', this.prop('height'));
35
- }
36
- });
37
-
38
- this.on('afterToggleExpander', 'tracks', function () {
39
- var resizer = this.prop('resizer');
40
-
41
- if (resizer) {
42
- resizer[this.expander && this.expander.is(':visible') ? 'addClass' : 'removeClass']('gv-resizer-expander');
43
- }
44
- });
45
- };
@@ -1,143 +0,0 @@
1
- Genoverse.Plugins.trackControls = function () {
2
- var defaultControls = [
3
- $('<a title="More info" class="fas fa-question-circle">').on('click', function () {
4
- var track = $(this).data('track');
5
- var menu = track.prop('menus').filter('.gv-track-info');
6
-
7
- if (!menu.length) {
8
- var info = track.prop('info');
9
-
10
- menu = { title: track.name };
11
- menu[typeof info === 'function' ? info.call(track) : info || ''] = '';
12
-
13
- menu = track.prop('menus', track.prop('menus').add(track.browser.makeMenu(menu).addClass('gv-track-info')));
14
- }
15
-
16
- menu.show().position({ of: track.prop('container'), at: 'center top', my: 'center top', collision: 'none' });
17
- }),
18
-
19
- $(
20
- '<a class="gv-height-toggle">' +
21
- '<i class="fas fa-sort"></i>' +
22
- '<i class="fas fa-sort-down"></i>' +
23
- '<i class="fas fa-sort-up"></i>' +
24
- '</a>'
25
- ).on({
26
- click: function () {
27
- var track = $(this).data('track');
28
- var height;
29
-
30
- if (track.prop('autoHeight', !track.prop('autoHeight'))) {
31
- track.prop('heightBeforeToggle', track.prop('height'));
32
- height = track.prop('fullVisibleHeight');
33
- } else {
34
- height = track.prop('heightBeforeToggle') || track.prop('initialHeight');
35
- }
36
-
37
- $(this).trigger('toggleState');
38
-
39
- track.controller.resize(height, true);
40
- },
41
- toggleState: function () { // custom event to set title and change the icon
42
- var track = $(this).data('track');
43
- var autoHeight = track.prop('autoHeight');
44
- var resizer = track.prop('resizer');
45
-
46
- this.title = autoHeight ? 'Set track to fixed height' : 'Set track to auto-adjust height';
47
- $(this)[autoHeight ? 'addClass' : 'removeClass']('gv-auto-height');
48
-
49
- if (resizer) {
50
- resizer[autoHeight ? 'hide' : 'show']();
51
- }
52
- }
53
- })
54
- ];
55
-
56
- var remove = $('<a title="Remove track" class="far fa-trash-alt">').on('click', function () {
57
- $(this).data('track').remove();
58
- });
59
-
60
- var toggle = $(
61
- '<a class="gv-track-controls-toggle">' +
62
- '<span><i class="fas fa-angle-double-left"></i><i class="fas fa-cog"></i></span>' +
63
- '<span><i class="fas fa-angle-double-right"></i></span>' +
64
- '</a>'
65
- ).on('click', function () {
66
- $(this).parent().toggleClass('gv-maximized');
67
- });
68
-
69
- this.on({
70
- afterAddDomElements: function () {
71
- var controls = this.prop('controls');
72
-
73
- if (controls === 'off') {
74
- return;
75
- }
76
-
77
- var defaultConfig = this.prop('defaultConfig');
78
- var savedConfig = this.browser.savedConfig ? this.browser.savedConfig[this.prop('id')] || {} : {};
79
- var prop, el, j;
80
-
81
- controls = (controls || []).concat(defaultControls, this.prop('removable') === false ? [] : remove);
82
-
83
- this.trackControls = $('<div class="gv-track-controls">').prependTo(this.container);
84
-
85
- var controlsContainer = $('<div class="gv-track-controls-container">').appendTo(this.trackControls);
86
-
87
- for (var i = 0; i < controls.length; i++) {
88
- if ($.isPlainObject(controls[i]) && controls[i].type) {
89
- el = $('<' + controls[i].type + '>').data('control', controls[i].name);
90
-
91
- if (controls[i].options) {
92
- for (j = 0; j < controls[i].options.length; j++) {
93
- el.append('<option value="' + controls[i].options[j].value + '">' + controls[i].options[j].text + '</option>');
94
- }
95
- }
96
- } else if (typeof controls[i] === 'string') {
97
- el = $(controls[i]);
98
- } else if (typeof controls[i] === 'object' && controls[i].constructor && controls[i] instanceof $) {
99
- el = controls[i].clone(true);
100
- }
101
-
102
- el.data('track', this.track).appendTo(controlsContainer);
103
-
104
- // TODO: other control types
105
- if (el.is('select')) {
106
- prop = el.data('control');
107
-
108
- el.find('option[value=' + (savedConfig[prop] || defaultConfig[prop] || 'all') + ']').attr('selected', true).end().change(function () {
109
- $(this).data('track').setConfig($(this).data('control'), this.value);
110
- });
111
- }
112
- }
113
-
114
- this.prop('heightToggler', controlsContainer.children('.gv-height-toggle').trigger('toggleState'));
115
-
116
- var toggler = toggle.clone(true).data('track', this.track).appendTo(this.trackControls);
117
-
118
- toggler.trigger('click');
119
- this.minLabelHeight = Math.max(this.minLabelHeight, this.trackControls.outerHeight(true) + this.prop('margin'));
120
- toggler.trigger('click');
121
- },
122
- afterResize: function () {
123
- if (this.trackControls) {
124
- this.trackControls[this.prop('height') < this.trackControls.outerHeight(true) ? 'hide' : 'show']();
125
- }
126
- },
127
- afterResetHeight: function () {
128
- var heightToggler = this.prop('heightToggler');
129
-
130
- if (this.prop('resizable') === true && heightToggler) {
131
- heightToggler[this.prop('autoHeight') ? 'addClass' : 'removeClass']('gv-auto-height');
132
- heightToggler.trigger('toggleState');
133
- }
134
- },
135
- afterSetMVC: function () {
136
- var heightToggler = this.prop('heightToggler');
137
-
138
- if (heightToggler) {
139
- heightToggler.trigger('toggleState')[this.prop('resizable') === true ? 'removeClass' : 'addClass']('gv-hide');
140
- }
141
- }
142
- }, 'tracks');
143
- };